@archbase/components 3.0.23 → 4.0.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 (168) hide show
  1. package/dist/buttons/ArchbaseSpeedDial.d.ts +59 -0
  2. package/dist/buttons/index.d.ts +2 -0
  3. package/dist/charts/ArchbaseArcGauge.d.ts +55 -0
  4. package/dist/charts/ArchbaseGantt.d.ts +70 -0
  5. package/dist/charts/ArchbaseLinearGauge.d.ts +55 -0
  6. package/dist/charts/ArchbaseResourceTimeline.d.ts +61 -0
  7. package/dist/charts/ArchbaseSparkline.d.ts +45 -0
  8. package/dist/charts/index.d.ts +10 -0
  9. package/dist/containers/ArchbaseExpansionPanel.d.ts +60 -0
  10. package/dist/containers/ArchbaseFloatingPanel.d.ts +91 -0
  11. package/dist/containers/index.d.ts +4 -0
  12. package/dist/datagrid/export/ArchbaseDataGridExcelExport.d.ts +67 -0
  13. package/dist/datagrid/export/index.d.ts +2 -0
  14. package/dist/datagrid/index.d.ts +1 -0
  15. package/dist/display/ArchbaseAnimationWrapper.d.ts +73 -0
  16. package/dist/display/ArchbaseBarcodeGenerator.d.ts +50 -0
  17. package/dist/display/ArchbaseCarousel.d.ts +100 -0
  18. package/dist/display/ArchbaseCodeViewer.d.ts +63 -0
  19. package/dist/display/ArchbaseDiffViewer.d.ts +41 -0
  20. package/dist/display/ArchbaseJsonTree.d.ts +34 -0
  21. package/dist/display/ArchbaseLightbox.d.ts +89 -0
  22. package/dist/display/ArchbaseMarquee.d.ts +46 -0
  23. package/dist/display/ArchbasePhotoAlbum.d.ts +58 -0
  24. package/dist/display/ArchbaseQRCode.d.ts +44 -0
  25. package/dist/display/ArchbaseTooltipRich.d.ts +82 -0
  26. package/dist/display/ArchbaseVirtualList.d.ts +116 -0
  27. package/dist/display/index.d.ts +24 -0
  28. package/dist/editors/ArchbaseAIPromptInput.d.ts +69 -0
  29. package/dist/editors/ArchbaseAsyncMultiSelect.d.ts +1 -1
  30. package/dist/editors/ArchbaseAsyncSelect.d.ts +1 -1
  31. package/dist/editors/ArchbaseBarcodeScanner.d.ts +63 -0
  32. package/dist/editors/ArchbaseCepInput.d.ts +26 -0
  33. package/dist/editors/ArchbaseColorGradientPicker.d.ts +80 -0
  34. package/dist/editors/ArchbaseCpfCnpjInput.d.ts +21 -0
  35. package/dist/editors/ArchbaseCurrencyInput.d.ts +25 -0
  36. package/dist/editors/ArchbaseDualListbox.d.ts +61 -0
  37. package/dist/editors/ArchbaseInPlaceEditor.d.ts +67 -0
  38. package/dist/editors/ArchbaseLightGrid.d.ts +56 -0
  39. package/dist/editors/ArchbaseMentionInput.d.ts +75 -0
  40. package/dist/editors/ArchbaseMultiEmail.d.ts +53 -0
  41. package/dist/editors/ArchbaseMultiViewCalendar.d.ts +47 -0
  42. package/dist/editors/ArchbaseNumberStepper.d.ts +66 -0
  43. package/dist/editors/ArchbaseOTPInput.d.ts +27 -0
  44. package/dist/editors/ArchbasePhoneInput.d.ts +52 -0
  45. package/dist/editors/ArchbaseRangeSlider.d.ts +22 -0
  46. package/dist/editors/ArchbaseSignaturePad.d.ts +60 -0
  47. package/dist/editors/ArchbaseSpeechToTextInput.d.ts +106 -0
  48. package/dist/editors/ArchbaseSpreadsheet.d.ts +56 -0
  49. package/dist/editors/ArchbaseTagInput.d.ts +55 -0
  50. package/dist/editors/index.d.ts +40 -0
  51. package/dist/feedback/ArchbaseChunkProgressBar.d.ts +35 -0
  52. package/dist/feedback/ArchbaseRipple.d.ts +43 -0
  53. package/dist/feedback/ArchbaseSkeleton.d.ts +115 -0
  54. package/dist/feedback/index.d.ts +6 -0
  55. package/dist/filters/ArchbaseColumnSelector.d.ts +38 -0
  56. package/dist/filters/index.d.ts +2 -0
  57. package/dist/forms/ArchbaseFieldArray.d.ts +80 -0
  58. package/dist/forms/ArchbaseFormWizard.d.ts +73 -0
  59. package/dist/forms/ArchbaseStepper.d.ts +51 -0
  60. package/dist/forms/index.d.ts +8 -0
  61. package/dist/forms/useArchbaseFormWizard.d.ts +74 -0
  62. package/dist/hooks/index.d.ts +2 -0
  63. package/dist/hooks/useArchbaseConfirm.d.ts +59 -0
  64. package/dist/image/editor/index.d.ts +43 -4
  65. package/dist/image/index.d.ts +1 -0
  66. package/dist/index.css +1 -1
  67. package/dist/index.d.ts +1 -0
  68. package/dist/index.js +22510 -13820
  69. package/dist/list/ArchbaseTreeList.d.ts +76 -0
  70. package/dist/list/index.d.ts +2 -0
  71. package/dist/navigation/ArchbaseActionSheet.d.ts +70 -0
  72. package/dist/navigation/ArchbaseAppBar.d.ts +63 -0
  73. package/dist/navigation/ArchbaseBottomNavigation.d.ts +61 -0
  74. package/dist/navigation/ArchbaseContextMenu.d.ts +76 -0
  75. package/dist/navigation/ArchbaseKeyboardShortcuts.d.ts +85 -0
  76. package/dist/navigation/ArchbaseSpotlight.d.ts +69 -0
  77. package/dist/navigation/index.d.ts +12 -0
  78. package/dist/notification/ArchbaseNotificationCenter.d.ts +56 -0
  79. package/dist/notification/index.d.ts +2 -0
  80. package/dist/onboarding/ArchbaseOnboardingTour.d.ts +27 -76
  81. package/dist/viewers/ArchbaseDocViewer.d.ts +40 -0
  82. package/dist/viewers/ArchbasePdfBuilder.d.ts +53 -0
  83. package/dist/viewers/ArchbaseXmlViewer.d.ts +36 -0
  84. package/dist/viewers/index.d.ts +6 -0
  85. package/package.json +41 -18
  86. package/src/buttons/ArchbaseSpeedDial.tsx +282 -0
  87. package/src/buttons/index.ts +3 -0
  88. package/src/charts/ArchbaseArcGauge.tsx +325 -0
  89. package/src/charts/ArchbaseGantt.tsx +494 -0
  90. package/src/charts/ArchbaseLinearGauge.tsx +288 -0
  91. package/src/charts/ArchbaseResourceTimeline.tsx +433 -0
  92. package/src/charts/ArchbaseSparkline.tsx +193 -0
  93. package/src/charts/index.ts +20 -1
  94. package/src/containers/ArchbaseExpansionPanel.tsx +208 -0
  95. package/src/containers/ArchbaseFloatingPanel.tsx +448 -0
  96. package/src/containers/index.ts +17 -0
  97. package/src/datagrid/components/pagination/grid-pagination.tsx +2 -2
  98. package/src/datagrid/export/ArchbaseDataGridExcelExport.tsx +293 -0
  99. package/src/datagrid/export/index.ts +8 -0
  100. package/src/datagrid/index.tsx +2 -0
  101. package/src/display/ArchbaseAnimationWrapper.tsx +272 -0
  102. package/src/display/ArchbaseBarcodeGenerator.tsx +303 -0
  103. package/src/display/ArchbaseCarousel.tsx +679 -0
  104. package/src/display/ArchbaseCodeViewer.tsx +271 -0
  105. package/src/display/ArchbaseDiffViewer.tsx +108 -0
  106. package/src/display/ArchbaseJsonTree.tsx +150 -0
  107. package/src/display/ArchbaseLightbox.tsx +279 -0
  108. package/src/display/ArchbaseMarquee.tsx +268 -0
  109. package/src/display/ArchbasePhotoAlbum.tsx +415 -0
  110. package/src/display/ArchbaseQRCode.tsx +137 -0
  111. package/src/display/ArchbaseTooltipRich.tsx +317 -0
  112. package/src/display/ArchbaseVirtualList.tsx +618 -0
  113. package/src/display/index.ts +94 -1
  114. package/src/editors/ArchbaseAIPromptInput.tsx +432 -0
  115. package/src/editors/ArchbaseBarcodeScanner.tsx +570 -0
  116. package/src/editors/ArchbaseCepInput.tsx +173 -0
  117. package/src/editors/ArchbaseColorGradientPicker.tsx +460 -0
  118. package/src/editors/ArchbaseCpfCnpjInput.tsx +193 -0
  119. package/src/editors/ArchbaseCurrencyInput.tsx +100 -0
  120. package/src/editors/ArchbaseDualListbox.tsx +671 -0
  121. package/src/editors/ArchbaseInPlaceEditor.tsx +406 -0
  122. package/src/editors/ArchbaseLightGrid.tsx +538 -0
  123. package/src/editors/ArchbaseMentionInput.tsx +384 -0
  124. package/src/editors/ArchbaseMultiEmail.tsx +367 -0
  125. package/src/editors/ArchbaseMultiViewCalendar.tsx +439 -0
  126. package/src/editors/ArchbaseNumberStepper.tsx +219 -0
  127. package/src/editors/ArchbaseOTPInput.tsx +133 -0
  128. package/src/editors/ArchbaseOperationHoursEditor.tsx +1 -1
  129. package/src/editors/ArchbasePhoneInput.tsx +355 -0
  130. package/src/editors/ArchbaseRangeSlider.tsx +109 -0
  131. package/src/editors/ArchbaseSignaturePad.tsx +425 -0
  132. package/src/editors/ArchbaseSpeechToTextInput.tsx +444 -0
  133. package/src/editors/ArchbaseSpreadsheet.tsx +388 -0
  134. package/src/editors/ArchbaseTagInput.tsx +326 -0
  135. package/src/editors/index.tsx +92 -0
  136. package/src/feedback/ArchbaseChunkProgressBar.tsx +156 -0
  137. package/src/feedback/ArchbaseRipple.tsx +278 -0
  138. package/src/feedback/ArchbaseSkeleton.tsx +419 -0
  139. package/src/feedback/index.ts +22 -1
  140. package/src/filters/ArchbaseColumnSelector.tsx +268 -0
  141. package/src/filters/index.ts +2 -0
  142. package/src/forms/ArchbaseFieldArray.tsx +305 -0
  143. package/src/forms/ArchbaseFormWizard.tsx +284 -0
  144. package/src/forms/ArchbaseStepper.tsx +137 -0
  145. package/src/forms/index.ts +24 -2
  146. package/src/forms/useArchbaseFormWizard.ts +283 -0
  147. package/src/hooks/index.ts +12 -0
  148. package/src/hooks/useArchbaseConfirm.ts +293 -0
  149. package/src/image/editor/functions/image-processing.ts +5 -0
  150. package/src/image/editor/index.tsx +305 -391
  151. package/src/image/index.ts +1 -0
  152. package/src/index.ts +3 -0
  153. package/src/list/ArchbaseTreeList.tsx +422 -0
  154. package/src/list/index.ts +3 -0
  155. package/src/navigation/ArchbaseActionSheet.tsx +301 -0
  156. package/src/navigation/ArchbaseAppBar.tsx +233 -0
  157. package/src/navigation/ArchbaseBottomNavigation.tsx +243 -0
  158. package/src/navigation/ArchbaseContextMenu.tsx +298 -0
  159. package/src/navigation/ArchbaseKeyboardShortcuts.tsx +472 -0
  160. package/src/navigation/ArchbaseSpotlight.tsx +483 -0
  161. package/src/navigation/index.ts +48 -1
  162. package/src/notification/ArchbaseNotificationCenter.tsx +502 -0
  163. package/src/notification/index.ts +2 -0
  164. package/src/onboarding/ArchbaseOnboardingTour.tsx +229 -102
  165. package/src/viewers/ArchbaseDocViewer.tsx +584 -0
  166. package/src/viewers/ArchbasePdfBuilder.tsx +291 -0
  167. package/src/viewers/ArchbaseXmlViewer.tsx +142 -0
  168. package/src/viewers/index.ts +12 -0
@@ -0,0 +1,367 @@
1
+ /**
2
+ * ArchbaseMultiEmail — wrapper para react-multi-email integrado ao DataSource (v1/v2).
3
+ * Permite entrada de multiplos e-mails com validacao, exibidos como badges (pills).
4
+ * @status stable
5
+ */
6
+ import { Badge, CloseButton, Group, Input, MantineSize, useMantineColorScheme, useMantineTheme } from '@mantine/core';
7
+ import { useForceUpdate } from '@mantine/hooks';
8
+ import type { CSSProperties, FocusEventHandler } from 'react';
9
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
10
+ import type { DataSourceEvent, IArchbaseDataSourceBase } from '@archbase/data';
11
+ import { DataSourceEventNames, useArchbaseDidUpdate, useArchbaseV1V2Compatibility } from '@archbase/data';
12
+ import { useValidationErrors } from '@archbase/core';
13
+ import { ReactMultiEmail } from 'react-multi-email';
14
+ import 'react-multi-email/dist/style.css';
15
+
16
+ export interface ArchbaseMultiEmailProps<T, ID> {
17
+ /** Fonte de dados onde sera atribuido o valor (V1 ou V2) */
18
+ dataSource?: IArchbaseDataSourceBase<T>;
19
+ /** Campo onde devera ser atribuido o valor na fonte de dados */
20
+ dataField?: string;
21
+ /** Valor controlado (array de emails) */
22
+ value?: string[];
23
+ /** Valor padrao nao controlado */
24
+ defaultValue?: string[];
25
+ /** Delimitador para converter string do datasource em array (padrao ';') */
26
+ delimiter?: string;
27
+ /** Titulo do campo */
28
+ label?: string;
29
+ /** Descricao do campo */
30
+ description?: string;
31
+ /** Ultimo erro ocorrido */
32
+ error?: string;
33
+ /** Texto de sugestao */
34
+ placeholder?: string;
35
+ /** Indicador se o preenchimento e obrigatorio */
36
+ required?: boolean;
37
+ /** Indicador se o campo esta desabilitado */
38
+ disabled?: boolean;
39
+ /** Indicador se o campo e somente leitura */
40
+ readOnly?: boolean;
41
+ /** Numero maximo de emails permitidos */
42
+ max?: number;
43
+ /** Funcao customizada de validacao de email */
44
+ validateEmail?: (email: string) => boolean;
45
+ /** Evento quando o valor e alterado */
46
+ onChangeValue?: (emails: string[]) => void;
47
+ /** Evento quando o campo recebe o foco */
48
+ onFocusEnter?: FocusEventHandler<HTMLInputElement> | undefined;
49
+ /** Evento quando o foco sai do campo */
50
+ onFocusExit?: FocusEventHandler<HTMLInputElement> | undefined;
51
+ /** Referencia para o componente interno */
52
+ innerRef?: React.RefObject<HTMLDivElement> | undefined;
53
+ /** Estilo do componente */
54
+ style?: CSSProperties;
55
+ /** Classe CSS */
56
+ className?: string;
57
+ /** Largura do componente */
58
+ width?: string | number;
59
+ /** Tamanho do componente */
60
+ size?: MantineSize;
61
+ }
62
+
63
+ export function ArchbaseMultiEmail<T, ID>({
64
+ dataSource,
65
+ dataField,
66
+ value,
67
+ defaultValue,
68
+ delimiter = ';',
69
+ label,
70
+ description,
71
+ error,
72
+ placeholder,
73
+ required,
74
+ disabled = false,
75
+ readOnly = false,
76
+ max,
77
+ validateEmail,
78
+ onChangeValue,
79
+ onFocusEnter,
80
+ onFocusExit,
81
+ innerRef,
82
+ style,
83
+ className,
84
+ width,
85
+ size,
86
+ }: ArchbaseMultiEmailProps<T, ID>) {
87
+ // Hook de compatibilidade V1/V2
88
+ const v1v2Compatibility = useArchbaseV1V2Compatibility<string[]>(
89
+ 'ArchbaseMultiEmail',
90
+ dataSource,
91
+ dataField,
92
+ defaultValue ?? value ?? [],
93
+ );
94
+
95
+ const theme = useMantineTheme();
96
+ const { colorScheme } = useMantineColorScheme();
97
+ const forceUpdate = useForceUpdate();
98
+ const [internalError, setInternalError] = useState<string | undefined>(error);
99
+
100
+ // Contexto de validacao (opcional)
101
+ const validationContext = useValidationErrors();
102
+ const fieldKey = `${dataField}`;
103
+ const contextError = validationContext?.getError(fieldKey);
104
+
105
+ // Estado local dos emails
106
+ const [emails, setEmails] = useState<string[]>(defaultValue ?? value ?? []);
107
+
108
+ // Atualizar erro se prop mudar
109
+ useEffect(() => {
110
+ if (error !== undefined && error !== internalError) {
111
+ setInternalError(error);
112
+ }
113
+ }, [error]);
114
+
115
+ /**
116
+ * Converte o valor vindo do datasource para string[].
117
+ * Se for string, faz split pelo delimitador; se for array, usa diretamente.
118
+ */
119
+ const parseFieldValue = (fieldValue: any): string[] => {
120
+ if (!fieldValue) return [];
121
+ if (Array.isArray(fieldValue)) return fieldValue;
122
+ if (typeof fieldValue === 'string') {
123
+ return fieldValue
124
+ .split(delimiter)
125
+ .map((e) => e.trim())
126
+ .filter((e) => e.length > 0);
127
+ }
128
+ return [];
129
+ };
130
+
131
+ /**
132
+ * Converte string[] para o formato de armazenamento no datasource.
133
+ * Se o campo original era string, junta com delimitador.
134
+ */
135
+ const serializeValue = (emailList: string[]): any => {
136
+ if (dataSource && dataField) {
137
+ const currentFieldValue = dataSource.getFieldValue(dataField);
138
+ if (typeof currentFieldValue === 'string' || currentFieldValue === null || currentFieldValue === undefined) {
139
+ return emailList.join(delimiter);
140
+ }
141
+ }
142
+ return emailList;
143
+ };
144
+
145
+ const loadDataSourceFieldValue = () => {
146
+ let initialValue: string[] = defaultValue ?? value ?? [];
147
+
148
+ if (dataSource && dataField) {
149
+ const fieldValue = dataSource.getFieldValue(dataField);
150
+ initialValue = parseFieldValue(fieldValue);
151
+ }
152
+
153
+ setEmails(initialValue);
154
+ };
155
+
156
+ const fieldChangedListener = useCallback(() => {
157
+ loadDataSourceFieldValue();
158
+ }, []);
159
+
160
+ const dataSourceEvent = useCallback(
161
+ (event: DataSourceEvent<T>) => {
162
+ if (dataSource && dataField) {
163
+ if (
164
+ event.type === DataSourceEventNames.dataChanged ||
165
+ event.type === DataSourceEventNames.recordChanged ||
166
+ event.type === DataSourceEventNames.afterScroll ||
167
+ event.type === DataSourceEventNames.afterCancel ||
168
+ event.type === DataSourceEventNames.afterEdit
169
+ ) {
170
+ loadDataSourceFieldValue();
171
+ if (!v1v2Compatibility.isDataSourceV2) {
172
+ forceUpdate();
173
+ }
174
+ }
175
+
176
+ if (event.type === DataSourceEventNames.onFieldError && event.fieldName === dataField) {
177
+ setInternalError(event.error);
178
+ validationContext?.setError(fieldKey, event.error);
179
+ }
180
+ }
181
+ },
182
+ [v1v2Compatibility.isDataSourceV2, validationContext, fieldKey],
183
+ );
184
+
185
+ // Ref para manter callback sempre atualizado
186
+ const dataSourceEventRef = useRef(dataSourceEvent);
187
+ useEffect(() => {
188
+ dataSourceEventRef.current = dataSourceEvent;
189
+ }, [dataSourceEvent]);
190
+
191
+ // Wrapper estavel que delega para ref
192
+ const stableDataSourceEvent = useCallback((event: DataSourceEvent<T>) => {
193
+ dataSourceEventRef.current(event);
194
+ }, []);
195
+
196
+ // Registrar listeners com cleanup
197
+ useEffect(() => {
198
+ loadDataSourceFieldValue();
199
+ if (dataSource && dataField) {
200
+ const hasFieldListener = typeof (dataSource as any).addFieldChangeListener === 'function';
201
+ dataSource.addListener(stableDataSourceEvent);
202
+ if (hasFieldListener) {
203
+ (dataSource as any).addFieldChangeListener(dataField, fieldChangedListener);
204
+ }
205
+
206
+ return () => {
207
+ dataSource.removeListener(stableDataSourceEvent);
208
+ if (hasFieldListener) {
209
+ (dataSource as any).removeFieldChangeListener(dataField, fieldChangedListener);
210
+ }
211
+ };
212
+ }
213
+ }, [dataSource, dataField, stableDataSourceEvent, fieldChangedListener]);
214
+
215
+ useArchbaseDidUpdate(() => {
216
+ loadDataSourceFieldValue();
217
+ }, []);
218
+
219
+ // Sincronizar com prop value quando nao ha datasource
220
+ useEffect(() => {
221
+ if (!dataSource && value !== undefined) {
222
+ setEmails(value);
223
+ }
224
+ }, [value, dataSource]);
225
+
226
+ const isReadOnly = (): boolean => {
227
+ let tmpReadOnly = readOnly;
228
+ if (dataSource && !readOnly) {
229
+ tmpReadOnly = dataSource.isBrowsing();
230
+ }
231
+ return tmpReadOnly;
232
+ };
233
+
234
+ const handleChange = (newEmails: string[]) => {
235
+ // Limpa erro ao editar
236
+ const hasError = internalError || contextError;
237
+ if (hasError) {
238
+ setInternalError(undefined);
239
+ validationContext?.clearError(fieldKey);
240
+ }
241
+
242
+ // Aplicar limite max
243
+ const limitedEmails = max ? newEmails.slice(0, max) : newEmails;
244
+
245
+ setEmails(limitedEmails);
246
+
247
+ // Persistir no datasource
248
+ if (dataSource && !dataSource.isBrowsing() && dataField) {
249
+ const serialized = serializeValue(limitedEmails);
250
+ if (dataSource.getFieldValue(dataField) !== serialized) {
251
+ v1v2Compatibility.handleValueChange(limitedEmails);
252
+ dataSource.setFieldValue(dataField, serialized);
253
+ }
254
+ }
255
+
256
+ if (onChangeValue) {
257
+ onChangeValue(limitedEmails);
258
+ }
259
+ };
260
+
261
+ const handleRemoveEmail = (index: number) => {
262
+ if (isReadOnly() || disabled) return;
263
+ const newEmails = [...emails];
264
+ newEmails.splice(index, 1);
265
+ handleChange(newEmails);
266
+ };
267
+
268
+ const displayError = internalError || contextError;
269
+ const isDark = colorScheme === 'dark';
270
+
271
+ return (
272
+ <Input.Wrapper
273
+ label={label}
274
+ description={description}
275
+ error={displayError}
276
+ required={required}
277
+ style={{ width, ...style }}
278
+ className={className}
279
+ size={size}
280
+ >
281
+ <div
282
+ ref={innerRef}
283
+ style={{
284
+ border: `1px solid ${
285
+ displayError
286
+ ? theme.colors.red[isDark ? 4 : 6]
287
+ : isDark
288
+ ? theme.colors.dark[4]
289
+ : theme.colors.gray[4]
290
+ }`,
291
+ borderRadius: theme.radius.sm,
292
+ padding: '6px 8px',
293
+ minHeight: 36,
294
+ backgroundColor: disabled
295
+ ? isDark
296
+ ? theme.colors.dark[6]
297
+ : theme.colors.gray[1]
298
+ : isDark
299
+ ? theme.colors.dark[6]
300
+ : theme.white,
301
+ opacity: disabled ? 0.6 : 1,
302
+ cursor: disabled || isReadOnly() ? 'not-allowed' : undefined,
303
+ }}
304
+ >
305
+ {isReadOnly() || disabled ? (
306
+ <Group gap={4} style={{ flexWrap: 'wrap' }}>
307
+ {emails.length === 0 && (
308
+ <span
309
+ style={{
310
+ color: isDark ? theme.colors.dark[3] : theme.colors.gray[5],
311
+ fontSize: theme.fontSizes[size ?? 'sm'],
312
+ }}
313
+ >
314
+ {placeholder}
315
+ </span>
316
+ )}
317
+ {emails.map((email, index) => (
318
+ <Badge
319
+ key={`${email}-${index}`}
320
+ variant={isDark ? 'light' : 'outline'}
321
+ size={size ?? 'sm'}
322
+ style={{ textTransform: 'none' }}
323
+ >
324
+ {email}
325
+ </Badge>
326
+ ))}
327
+ </Group>
328
+ ) : (
329
+ <ReactMultiEmail
330
+ placeholder={placeholder}
331
+ emails={emails}
332
+ onChange={handleChange}
333
+ validateEmail={validateEmail}
334
+ onFocus={onFocusEnter as any}
335
+ onBlur={onFocusExit as any}
336
+ style={{
337
+ border: 'none',
338
+ padding: 0,
339
+ minHeight: 'auto',
340
+ backgroundColor: 'transparent',
341
+ }}
342
+ getLabel={(email, index, removeEmail) => (
343
+ <Badge
344
+ key={`${email}-${index}`}
345
+ variant={isDark ? 'light' : 'outline'}
346
+ size={size ?? 'sm'}
347
+ style={{ textTransform: 'none', marginRight: 4, marginBottom: 2 }}
348
+ rightSection={
349
+ <CloseButton
350
+ size="xs"
351
+ variant="transparent"
352
+ onClick={() => removeEmail(index)}
353
+ tabIndex={-1}
354
+ />
355
+ }
356
+ >
357
+ {email}
358
+ </Badge>
359
+ )}
360
+ />
361
+ )}
362
+ </div>
363
+ </Input.Wrapper>
364
+ );
365
+ }
366
+
367
+ ArchbaseMultiEmail.displayName = 'ArchbaseMultiEmail';