@pdfme/ui 2.2.0 → 3.0.0-beta.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.
Files changed (94) hide show
  1. package/README.md +33 -35
  2. package/__mocks__/form-render.js +7 -0
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.LICENSE.txt +42 -4
  5. package/dist/index.js.map +1 -1
  6. package/dist/types/Designer.d.ts +3 -0
  7. package/dist/types/builtInPropPanel.d.ts +3 -0
  8. package/dist/types/builtInRenderer.d.ts +3 -0
  9. package/dist/types/class.d.ts +18 -38
  10. package/dist/types/components/CtlBar/Pager.d.ts +3 -2
  11. package/dist/types/components/CtlBar/Zoom.d.ts +3 -2
  12. package/dist/types/components/CtlBar/index.d.ts +3 -2
  13. package/dist/types/components/Designer/{Main → Canvas}/Guides.d.ts +2 -2
  14. package/dist/types/components/Designer/Canvas/Mask.d.ts +4 -0
  15. package/dist/types/components/Designer/Canvas/Moveable.d.ts +37 -0
  16. package/dist/types/components/Designer/{Main → Canvas}/Selecto.d.ts +2 -1
  17. package/dist/types/components/Designer/{Main → Canvas}/index.d.ts +3 -6
  18. package/dist/types/components/Designer/Sidebar/DetailView/AlignWidget.d.ts +4 -0
  19. package/dist/types/components/Designer/Sidebar/DetailView/WidgetRenderer.d.ts +7 -0
  20. package/dist/types/components/Designer/Sidebar/DetailView/index.d.ts +5 -4
  21. package/dist/types/components/Designer/Sidebar/ListView/SelectableSortableContainer.d.ts +3 -2
  22. package/dist/types/components/Designer/Sidebar/ListView/SelectableSortableItem.d.ts +1 -1
  23. package/dist/types/components/Designer/Sidebar/ListView/index.d.ts +3 -2
  24. package/dist/types/components/Designer/Sidebar/index.d.ts +3 -23
  25. package/dist/types/components/Designer/index.d.ts +6 -107
  26. package/dist/types/components/Divider.d.ts +2 -1
  27. package/dist/types/components/ErrorScreen.d.ts +7 -0
  28. package/dist/types/components/Paper.d.ts +3 -2
  29. package/dist/types/components/Preview.d.ts +10 -2
  30. package/dist/types/components/Renderer.d.ts +10 -0
  31. package/dist/types/components/Root.d.ts +1 -1
  32. package/dist/types/components/Spinner.d.ts +2 -1
  33. package/dist/types/components/UnitPager.d.ts +3 -2
  34. package/dist/types/constants.d.ts +3 -3
  35. package/dist/types/contexts.d.ts +4 -1
  36. package/dist/types/helper.d.ts +4 -46
  37. package/dist/types/hooks.d.ts +2 -2
  38. package/dist/types/i18n.d.ts +4 -2
  39. package/dist/types/index.d.ts +1 -4
  40. package/dist/types/types.d.ts +25 -0
  41. package/package.json +19 -8
  42. package/src/Designer.tsx +69 -21
  43. package/src/Form.tsx +18 -14
  44. package/src/Viewer.tsx +6 -2
  45. package/src/builtInPropPanel.ts +5 -0
  46. package/src/builtInRenderer.ts +5 -0
  47. package/src/class.ts +25 -2
  48. package/src/components/CtlBar/index.tsx +4 -7
  49. package/src/components/Designer/{Main → Canvas}/Guides.tsx +2 -2
  50. package/src/components/Designer/{Main → Canvas}/Moveable.tsx +23 -19
  51. package/src/components/Designer/{Main → Canvas}/index.tsx +77 -30
  52. package/src/components/Designer/Sidebar/DetailView/AlignWidget.tsx +182 -0
  53. package/src/components/Designer/Sidebar/DetailView/WidgetRenderer.tsx +28 -0
  54. package/src/components/Designer/Sidebar/DetailView/index.tsx +153 -22
  55. package/src/components/Designer/Sidebar/ListView/Item.tsx +1 -1
  56. package/src/components/Designer/Sidebar/ListView/SelectableSortableContainer.tsx +6 -6
  57. package/src/components/Designer/Sidebar/ListView/index.tsx +1 -4
  58. package/src/components/Designer/Sidebar/index.tsx +26 -60
  59. package/src/components/Designer/index.tsx +53 -32
  60. package/src/components/{Error.tsx → ErrorScreen.tsx} +2 -2
  61. package/src/components/Paper.tsx +35 -9
  62. package/src/components/Preview.tsx +48 -50
  63. package/src/components/Renderer.tsx +90 -0
  64. package/src/components/Root.tsx +5 -1
  65. package/src/constants.ts +4 -4
  66. package/src/contexts.ts +7 -0
  67. package/src/helper.ts +19 -122
  68. package/src/hooks.ts +6 -5
  69. package/src/i18n.ts +48 -11
  70. package/src/index.ts +1 -76
  71. package/src/types.ts +36 -0
  72. package/tsconfig.json +2 -1
  73. package/webpack.config.js +6 -1
  74. package/dist/types/components/Designer/Main/Mask.d.ts +0 -3
  75. package/dist/types/components/Designer/Main/Moveable.d.ts +0 -31
  76. package/dist/types/components/Designer/Sidebar/DetailView/ExampleInputEditor.d.ts +0 -6
  77. package/dist/types/components/Designer/Sidebar/DetailView/PositionAndSizeEditor.d.ts +0 -6
  78. package/dist/types/components/Designer/Sidebar/DetailView/TextPropEditor.d.ts +0 -6
  79. package/dist/types/components/Designer/Sidebar/DetailView/TypeAndKeyEditor.d.ts +0 -6
  80. package/dist/types/components/Error.d.ts +0 -6
  81. package/dist/types/components/Schemas/BarcodeSchema.d.ts +0 -15
  82. package/dist/types/components/Schemas/ImageSchema.d.ts +0 -15
  83. package/dist/types/components/Schemas/SchemaUI.d.ts +0 -15
  84. package/dist/types/components/Schemas/TextSchema.d.ts +0 -28
  85. package/src/components/Designer/Sidebar/DetailView/ExampleInputEditor.tsx +0 -85
  86. package/src/components/Designer/Sidebar/DetailView/PositionAndSizeEditor.tsx +0 -275
  87. package/src/components/Designer/Sidebar/DetailView/TextPropEditor.tsx +0 -357
  88. package/src/components/Designer/Sidebar/DetailView/TypeAndKeyEditor.tsx +0 -87
  89. package/src/components/Schemas/BarcodeSchema.tsx +0 -124
  90. package/src/components/Schemas/ImageSchema.tsx +0 -87
  91. package/src/components/Schemas/SchemaUI.tsx +0 -62
  92. package/src/components/Schemas/TextSchema.tsx +0 -175
  93. /package/src/components/Designer/{Main → Canvas}/Mask.tsx +0 -0
  94. /package/src/components/Designer/{Main → Canvas}/Selecto.tsx +0 -0
@@ -1,357 +0,0 @@
1
- import React, { useContext } from 'react';
2
- import {
3
- SchemaForUI,
4
- getFallbackFontName,
5
- DEFAULT_FONT_SIZE,
6
- DEFAULT_LINE_HEIGHT,
7
- DEFAULT_CHARACTER_SPACING,
8
- DEFAULT_FONT_COLOR,
9
- VERTICAL_ALIGN_TOP,
10
- VERTICAL_ALIGN_MIDDLE,
11
- VERTICAL_ALIGN_BOTTOM,
12
- DEFAULT_VERTICAL_ALIGNMENT,
13
- DYNAMIC_FIT_VERTICAL,
14
- DYNAMIC_FIT_HORIZONTAL,
15
- DEFAULT_DYNAMIC_FIT,
16
- } from '@pdfme/common';
17
- import { FontContext } from '../../../../contexts';
18
- import { SidebarProps } from '..';
19
- import { XMarkIcon } from '@heroicons/react/24/outline';
20
-
21
- const inputStyle = {
22
- width: '90%',
23
- color: '#333',
24
- background: 'none',
25
- borderRadius: 2,
26
- border: '1px solid #767676',
27
- };
28
- const selectStyle = inputStyle;
29
-
30
- const NumberInputSet = (props: {
31
- width: string;
32
- label: string;
33
- value: number;
34
- step?: number;
35
- minNumber?: number;
36
- maxNumber?: number;
37
- disabled?: boolean;
38
- style?: object;
39
- onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
40
- }) => {
41
- const { label, step, value, width, minNumber, maxNumber, disabled, style, onChange } = props;
42
- const formattedLabel = label.replace(/\s/g, '');
43
-
44
- return (
45
- <div style={{ width }}>
46
- <label htmlFor={`input-${formattedLabel}`}>{label}</label>
47
- <input
48
- id={`input-${formattedLabel}`}
49
- name={`input-${formattedLabel}`}
50
- style={{ ...inputStyle, ...style }}
51
- onChange={onChange}
52
- value={isNaN(value) ? '' : value}
53
- type="number"
54
- step={step ?? 1}
55
- disabled={disabled}
56
- {...(minNumber && { min: minNumber })}
57
- {...(maxNumber && { max: maxNumber })}
58
- />
59
- </div>
60
- );
61
- };
62
-
63
- const ColorInputSet = (props: {
64
- label: string;
65
- value: string;
66
- onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
67
- onClear: () => void;
68
- }) => {
69
- const { label, value, onChange, onClear } = props;
70
- const formattedLabel = label.replace(/\s/g, '');
71
-
72
- return (
73
- <div style={{ width: '45%' }}>
74
- <label htmlFor={`input-${formattedLabel}`}>{label}</label>
75
- <div style={{ display: 'flex' }}>
76
- <input
77
- id={`input-${formattedLabel}`}
78
- name={`input-${formattedLabel}`}
79
- onChange={onChange}
80
- value={value || '#ffffff'}
81
- type="color"
82
- style={inputStyle}
83
- />
84
- <button
85
- onClick={onClear}
86
- style={{
87
- display: 'flex',
88
- alignItems: 'center',
89
- justifyContent: 'center',
90
- background: 'none',
91
- borderRadius: 2,
92
- border: '1px solid #767676',
93
- cursor: 'pointer',
94
- }}
95
- >
96
- <XMarkIcon width={10} height={10} />
97
- </button>
98
- </div>
99
- </div>
100
- );
101
- };
102
-
103
- const SelectSet = (props: {
104
- label: string;
105
- value: string;
106
- options: string[];
107
- width?: string;
108
- onChange: (e: React.ChangeEvent<HTMLSelectElement>) => void;
109
- }) => {
110
- const { label, value, options, width, onChange } = props;
111
- const formattedLabel = label.replace(/\s/g, '');
112
-
113
- return (
114
- <div style={{ width: width ?? '45%' }}>
115
- <label htmlFor={`select-${formattedLabel}`}>{label}:</label>
116
- <select
117
- id={`select-${formattedLabel}`}
118
- name={`select-${formattedLabel}`}
119
- style={selectStyle}
120
- onChange={onChange}
121
- value={value}
122
- >
123
- {options.map((o) => (
124
- <option key={o} value={o}>
125
- {o}
126
- </option>
127
- ))}
128
- </select>
129
- </div>
130
- );
131
- };
132
-
133
- const CheckboxSet = (props: {
134
- width: string;
135
- label: string;
136
- onChange: React.ChangeEventHandler<HTMLInputElement>;
137
- checked: boolean | undefined;
138
- }) => {
139
- const { width, label, onChange, checked } = props;
140
-
141
- return (
142
- <label
143
- style={{
144
- display: 'flex',
145
- alignItems: 'center',
146
- gap: '5px',
147
- width: `${width}`,
148
- }}
149
- >
150
- <input type="checkbox" checked={checked} onChange={onChange} />
151
- {label}
152
- </label>
153
- );
154
- };
155
-
156
- const TextPropEditor = (
157
- props: Pick<SidebarProps, 'changeSchemas'> & { activeSchema: SchemaForUI }
158
- ) => {
159
- const { changeSchemas, activeSchema } = props;
160
- const alignments = ['left', 'center', 'right'];
161
- const verticalAlignments = [VERTICAL_ALIGN_TOP, VERTICAL_ALIGN_MIDDLE, VERTICAL_ALIGN_BOTTOM];
162
- const dynamicFits = [DYNAMIC_FIT_HORIZONTAL, DYNAMIC_FIT_VERTICAL];
163
- const font = useContext(FontContext);
164
- const fallbackFontName = getFallbackFontName(font);
165
-
166
- if (activeSchema.type !== 'text') return <></>;
167
-
168
- return (
169
- <section style={{ fontSize: '0.7rem' }}>
170
- <div
171
- style={{
172
- display: 'flex',
173
- alignItems: 'center',
174
- justifyContent: 'space-between',
175
- marginBottom: '0.25rem',
176
- }}
177
- >
178
- <SelectSet
179
- label={'FontName'}
180
- value={activeSchema.fontName ?? fallbackFontName}
181
- options={Object.keys(font)}
182
- onChange={(e) => {
183
- changeSchemas([{ key: 'fontName', value: e.target.value, schemaId: activeSchema.id }]);
184
- }}
185
- />
186
-
187
- <SelectSet
188
- label={'Horizontal Align'}
189
- value={activeSchema.alignment ?? 'left'}
190
- options={alignments}
191
- onChange={(e) =>
192
- changeSchemas([{ key: 'alignment', value: e.target.value, schemaId: activeSchema.id }])
193
- }
194
- />
195
-
196
- <SelectSet
197
- label={'Vertical Align'}
198
- value={activeSchema.verticalAlignment ?? DEFAULT_VERTICAL_ALIGNMENT}
199
- options={verticalAlignments}
200
- onChange={(e) => {
201
- changeSchemas([{ key: 'verticalAlignment', value: e.target.value, schemaId: activeSchema.id }]);
202
- }}
203
- />
204
- </div>
205
- <div
206
- style={{
207
- display: 'flex',
208
- alignItems: 'center',
209
- justifyContent: 'space-between',
210
- marginBottom: '0.25rem',
211
- }}
212
- >
213
- <NumberInputSet
214
- width="30%"
215
- label={'FontSize(pt)'}
216
- value={activeSchema.dynamicFontSize ? NaN : (activeSchema.fontSize ?? DEFAULT_FONT_SIZE)}
217
- style={activeSchema.dynamicFontSize ? { background: '#ccc', cursor: 'not-allowed' } : {}}
218
- disabled={!!activeSchema.dynamicFontSize}
219
- onChange={(e) => {
220
- changeSchemas([{ key: 'fontSize', value: Number(e.target.value), schemaId: activeSchema.id }])
221
- }}
222
- />
223
- <NumberInputSet
224
- width="30%"
225
- label={'LineHeight(em)'}
226
- step={0.1}
227
- value={activeSchema.lineHeight ?? DEFAULT_LINE_HEIGHT}
228
- onChange={(e) =>
229
- changeSchemas([
230
- { key: 'lineHeight', value: Number(e.target.value), schemaId: activeSchema.id },
231
- ])
232
- }
233
- />
234
-
235
- <NumberInputSet
236
- width="40%"
237
- label={'CharacterSpacing(pt)'}
238
- step={0.1}
239
- value={activeSchema.characterSpacing ?? DEFAULT_CHARACTER_SPACING}
240
- onChange={async (e) => {
241
- const currentCharacterSpacing = Number(e.target.value);
242
- changeSchemas([
243
- { key: 'characterSpacing', value: currentCharacterSpacing, schemaId: activeSchema.id, },
244
- ]);
245
- }}
246
- />
247
- </div>
248
- <div
249
- style={{
250
- display: 'flex',
251
- alignItems: 'center',
252
- justifyContent: 'space-between',
253
- flexWrap: 'wrap',
254
- marginBottom: '0.25rem',
255
- }}
256
- >
257
- <CheckboxSet
258
- width="100%"
259
- label="Use dynamic font size"
260
- checked={Boolean(activeSchema.dynamicFontSize)}
261
- onChange={(e) => {
262
- changeSchemas([
263
- {
264
- key: 'dynamicFontSize', value: e.target.checked ? {
265
- min: activeSchema.fontSize || DEFAULT_FONT_SIZE,
266
- max: activeSchema.fontSize || DEFAULT_FONT_SIZE,
267
- } : undefined, schemaId: activeSchema.id,
268
- },
269
- ]);
270
- }}
271
- />
272
-
273
- {activeSchema.dynamicFontSize && (
274
- <>
275
- <NumberInputSet
276
- width="30%"
277
- label={'FontSize Min(pt)'}
278
- value={activeSchema.dynamicFontSize.min ?? Number(activeSchema.fontSize)}
279
- minNumber={0}
280
- style={
281
- activeSchema.dynamicFontSize &&
282
- activeSchema.dynamicFontSize.max < activeSchema.dynamicFontSize.min
283
- ? { background: 'rgb(200 0 0 / 30%)' }
284
- : {}
285
- }
286
- onChange={(e) => {
287
- changeSchemas([{ key: 'dynamicFontSize.min', value: Number(e.target.value), schemaId: activeSchema.id }])
288
- }}
289
- />
290
-
291
- <NumberInputSet
292
- width="30%"
293
- label={'FontSize Max(pt)'}
294
- value={activeSchema.dynamicFontSize.max ?? Number(activeSchema.fontSize)}
295
- minNumber={0}
296
- style={
297
- activeSchema.dynamicFontSize &&
298
- activeSchema.dynamicFontSize.max < activeSchema.dynamicFontSize.min
299
- ? { background: 'rgb(200 0 0 / 30%)' }
300
- : {}
301
- }
302
- onChange={(e) => {
303
- changeSchemas([{ key: 'dynamicFontSize.max', value: Number(e.target.value), schemaId: activeSchema.id }])
304
- }}
305
- />
306
-
307
- <SelectSet
308
- width="40%"
309
- label={'Fit'}
310
- value={activeSchema.dynamicFontSize.fit ?? DEFAULT_DYNAMIC_FIT}
311
- options={dynamicFits}
312
- onChange={(e) => {
313
- changeSchemas([{ key: 'dynamicFontSize.fit', value: e.target.value, schemaId: activeSchema.id }])
314
- }}
315
- />
316
- </>
317
- )}
318
- </div>
319
- <div
320
- style={{
321
- marginBottom: '0.25rem',
322
- display: 'flex',
323
- alignItems: 'center',
324
- justifyContent: 'space-between',
325
- }}
326
- >
327
- <ColorInputSet
328
- label={'FontColor'}
329
- value={activeSchema.fontColor ?? '#000000'}
330
- onChange={(e) =>
331
- changeSchemas([{ key: 'fontColor', value: e.target.value, schemaId: activeSchema.id }])
332
- }
333
- onClear={() =>
334
- changeSchemas([
335
- { key: 'fontColor', value: DEFAULT_FONT_COLOR, schemaId: activeSchema.id },
336
- ])
337
- }
338
- />
339
-
340
- <ColorInputSet
341
- label={'Background'}
342
- value={activeSchema.backgroundColor ?? '#ffffff'}
343
- onChange={(e) =>
344
- changeSchemas([
345
- { key: 'backgroundColor', value: e.target.value, schemaId: activeSchema.id },
346
- ])
347
- }
348
- onClear={() =>
349
- changeSchemas([{ key: 'backgroundColor', value: '', schemaId: activeSchema.id }])
350
- }
351
- />
352
- </div>
353
- </section>
354
- );
355
- };
356
-
357
- export default TextPropEditor;
@@ -1,87 +0,0 @@
1
- import React, { useContext, useRef, useCallback } from 'react';
2
- import { schemaTypes, SchemaForUI } from '@pdfme/common';
3
- import { SidebarProps } from '../index';
4
- import { I18nContext } from '../../../../contexts';
5
-
6
- const ErrorLabel = ({ isError, msg }: { isError: boolean; msg: string }) => (
7
- <span
8
- style={{ color: isError ? '#ffa19b' : 'inherit', fontWeight: isError ? 'bold' : 'inherit' }}
9
- >
10
- {msg}
11
- </span>
12
- );
13
-
14
- const TypeAndKeyEditor = (
15
- props: Pick<SidebarProps, 'schemas' | 'changeSchemas'> & { activeSchema: SchemaForUI }
16
- ) => {
17
- const { changeSchemas, activeSchema, schemas } = props;
18
- const i18n = useContext(I18nContext);
19
-
20
- const inputRef = useRef<HTMLInputElement>(null);
21
-
22
- const getHasSameKey = useCallback(() => {
23
- const schemaKeys = schemas.map((s) => s.key);
24
- const index = schemaKeys.indexOf(activeSchema.key);
25
- if (index > -1) {
26
- schemaKeys.splice(index, 1);
27
- }
28
-
29
- return schemaKeys.includes(activeSchema.key);
30
- }, [schemas, activeSchema]);
31
-
32
- const blankKey = !activeSchema.key;
33
- const hasSameKey = getHasSameKey();
34
-
35
- return (
36
- <div style={{ display: 'flex', alignItems: 'center' }}>
37
- <div>
38
- <label style={{ marginBottom: 0 }}>{i18n('type')}</label>
39
- <select
40
- style={{
41
- width: '100%',
42
- border: '1px solid #767676',
43
- borderRadius: 2,
44
- color: '#333',
45
- background: 'none',
46
- }}
47
- onChange={(e) =>
48
- changeSchemas([{ key: 'type', value: e.target.value, schemaId: activeSchema.id }])
49
- }
50
- value={activeSchema.type}
51
- >
52
- {schemaTypes.map((t) => (
53
- <option key={t} value={t}>
54
- {t}
55
- </option>
56
- ))}
57
- </select>
58
- </div>
59
- <div>
60
- <label style={{ marginBottom: 0 }}>
61
- {i18n('fieldName')}
62
- <u style={{ fontSize: '0.7rem' }}>
63
- (<ErrorLabel msg={i18n('require')} isError={blankKey} />+
64
- <ErrorLabel msg={i18n('uniq')} isError={hasSameKey} />)
65
- </u>
66
- </label>
67
-
68
- <input
69
- ref={inputRef}
70
- onChange={(e) =>
71
- changeSchemas([{ key: 'key', value: e.target.value, schemaId: activeSchema.id }])
72
- }
73
- style={{
74
- width: '100%',
75
- border: '1px solid #767676',
76
- borderRadius: 2,
77
- color: '#333',
78
- background: hasSameKey || blankKey ? '#ffa19b' : 'none',
79
- }}
80
- value={activeSchema.key}
81
- />
82
- </div>
83
- </div>
84
- );
85
- };
86
-
87
- export default TypeAndKeyEditor;
@@ -1,124 +0,0 @@
1
- import React, { forwardRef, Ref } from 'react';
2
- import { validateBarcodeInput, BarCodeType, BarcodeSchema, } from '@pdfme/common';
3
- import { ZOOM } from '../../constants';
4
- import { SchemaUIProps } from './SchemaUI';
5
-
6
- const barcodeExampleImageObj: { [K in BarCodeType]: string } = {
7
- qrcode:
8
- 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AQMAAACyIsh+AAAABlBMVEVHcEwAAACfKoRRAAAAAXRSTlMAQObYZgAAAUBJREFUaN7t2UEOxCAIBVASD9Aj9eoeqQdowqiAYhsbTGb5u2gm9s2GIFBLrNdNnI+biI72y5YzAURBJpJlOstCuXVaLoAdUMOaLcCiWrwl/AD7QKJclwH+AUYNANgFtv0lyudFq/oA8A3mljQKwaJnAazAdKW6kpiWF8Aa2H7XRmSpmrQvZYAwGJteM7fV1drmr8QAO6A8c7Mms85KvSUBxIDkaw2r2/Ityu2fBBAHdavrwK75KkmrhQAgDFojv/qs1Da9gMQAcdCe+VlTIt8neYAoGNv/8Yr+rg8An0A6j9ykOWlfstETIAjcjO4z198AQsC/TlpsNXMB9sA4Cpbz4Es7Vc9qgCjox27a5pM73ZjP5QDCQFPVzt74FWqACJDYajVNGvQMEAfTJzOhbDVgrg8An+DxGXd8o9A2DxADPwiEPe8Jo46KAAAAAElFTkSuQmCC',
9
- japanpost:
10
- 'data:image/png;base64,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',
11
- ean13:
12
- 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAg0AAAGBBAMAAAAXrJ+ZAAAAG1BMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABp4cHsAAAACHRSTlMAgeljyj4bqDBh0ogAAAqiSURBVHja7drPd9PGFsBxK45llqHwgpctDUHLUErxElJKvHQTQr00lD6yDDTN85I4NtGf/SR5ZnTvzEj5ddrzzjtfL3ISZ3Rn9NGdn3anc5XXnbx4fTG/Ve+Ub9jfvsgi5h+2XF3ElOvIIkGUhitkvDtBvbKRqnLzRl2urcqml2zKP+QQ+/E3OwQV4YADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjj8Xzv8Q6//ySpxwAEHHHDAAYd4lb8/2N36tHNJo9L7e2Nd5N2rv+SfOkp68sq+ZKn0gaznV1tkp8Hhnbu2V8d7der+/+Sz1/De8929Z1NZ4ZOTrU8/ee3cuzeN3OVv1SJrPm532M/zbVWil+VzUaMXZS2vX6JUP1+KEJktcRZ3SLPcxjsS8Vy1P5R/LQREt4r4vYgwqy7YrN/5WIX4bhrc5Y8m+sW0zaFblDhXDsPinboJfpShaPdGfdEkvxCSrsQi7vChvnYg4tlq983F9ROcrd557d4wl81dQxMT4nv/Ltdd9O02h5l9avWTlXcYRJHP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',
13
- ean8: 'data:image/png;base64,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',
14
- code39:
15
- 'data:image/png;base64,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',
16
- code128:
17
- 'data:image/png;base64,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',
18
- nw7: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAt8AAAGUBAMAAAAfU1PFAAAAGFBMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAABoAtTLAAAAB3RSTlMAJebEnUtzc/SoGAAACbRJREFUeNrt28FT20YYxmHLtszVgRBfCYT4SoDUVwgkvpo0DFfapPWVyIb99ytZkk2C3neNM53pTH86pJnKK+0+2v1295PSCuGu1Qrlkf9tcfz0t5/+qE7UJR7/8fQqT4rd/VjWlXjyY3mVu+Y6P7no8y/lWrlGUxvuATjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444P8HcA4ODg4ODg4ODo7nHLt9e/rFZmWTF+VhLq5PJdGysaKmsG9vrEWR23f3Dyb+F6+GIbwxVfgcDmUNvuqy6bDaEGTy/jszedNRWXZmGiau2wv1IQr3Rq69veMQTvvuym+85ziEPf9EysrpGuhmJ+NF2YfGk+1lw/d03VTd07qsbtw0HDX+/63lfcOt7ghz1aRRvEWZHSD55e9jT6Q4XpvzmS/a3PLOst1qz5uE0NdPuTxcPziLPOhm8KmpczGctcYgBFu2bpR4XquKZ6cnuhcXbpm+dnZ6LLpLcnFSHMe6h/d0xOiGbFH6vaz3jepo1X1PTpqfVjF23oxUe4uzRYsyCz6znpk9n4/ALO8IL0V3aCVDC/6+7BQmqm2rKxe3vtfgD37iSc2YXNZOtPeq1foiarW9GDc7zaNnEF7nc+b1BzW26po333g1wl6X0WFPDbFDGVJ+P6+ilhljIxkuZRReB3zbPuVyaM6aR0bV3rPmIHlY/ue+EXyvatKdvm07fB+Fvo3xk/J392rGTCT4sg17ptm6Owy1WScy8eSNjvwgr9X35qd89hjvybi51Q+rLtN2985/NJVjejHwskp23lzrcBYFbzc3LdbBe+a6MfBucI2qYuHZs8G7FXRzOKrL9Nzwy69/40Z8XThpHoDj/HQU3Oh0zJTeNvWOgU/1c1zdud/cA490OFvedthUuAZP3aw4DrdbbiHeXd2isYfnu4so+Jbu4WNTt6mplxs0ZQ88ioCP5WL6Qff/5W1HTdFuLfD8UXVc5TurWzR1iGTSioNP5STSdTBDExVylivbfbN+dBVzZILRTnP/H9QtGTfVbRVS5jZE2xm/vbrFJBLmTZw+ko9C72BTd9liu5j9ZrpvbMocyLXsMK9TT2xOttYC3zagxd4idfFu69fBe3ICy8/M+5uE8Gp//lZHlIPj0798J1DL9Lxzz4aiyssY7kJKOjQhoxub9JYBfiwHeAx8KkNascue3T5v2fZDXuDQpX90Tm3xi4nNix2KYnMzow3C/PLy8mToNj6LJaNbiA9+GTzvMd8dmwoqo6LaqTiZXFxeDGWaqN5jn5tF+Nw/TJlpnOgV63Jrn7lQducsH4FPNwTPB5icwJIPujOli2lr7DaUn9XEN47mNNzmd1H6neoFh3rQLsHv3XbrqPjj7N/r4WOb1HjxRWX8Oos+6PM8arWdX/N9f/dPvflJTZoxH5GZ7OK56cf+7rfmOXWd5NWCcWAWvI96+Nkm4Dsule66aRnCfbTqNaeBeuV0moxMLHswO9Bwu6N6ac/l8AdhVqY/TQdepCvcLuIXe3g6jO6xxRJuEcIj4M0bvuWM2JZdbaBb3FmEk6nq4p9NKr2yejXUMSVfP+3v7w/NAswv9aPgUxkNf4odDTXrx8Gb16p1aimVeVA9XPNLzsuO0hwIq5dYmeuc2zqm1G+q5uuswzcA7+q18qM6zHSaKLrivFVLLz0A1DK6ftBV8kp0wuTb8cGo+WQNnuiEdze6jlmCjzYBn0a32Kp6W+HhOj9Cdt234Ecud6NcbReZuemhvu6eDb96nd2Ovhpsxyrvqp/GA4rOvK2xqBXDLhoGu3pIPxodEzNXTzac7/KB83d+6N67ms/1Q9HgnTU6uMwt+1e9TmUrDn7/CyFU7prWAK/exZg5pO4MJi5p8EHsRZiO4at3+mYbLCoVHZUmP7oGWv6Y93xZPTqqN3fmHVi6fOMzez74NJqVbqnXk8m3y/y4COHyoy4qlgPd2KhcpkA3CqHq1cWjfHiIDEnzhiCphrTJ3WnwkXt9vXoqZifsVykj9aI1q+CzSEZOPyzzTYx6dbHGsrC+qtl41XnMsXsmGvx2jYjiXjhZcLV3r5d2MkM10COvnhC35Z31S5MK/Iv+0if1b4jr2WuyuMvZJuB/vJDfN6b7n/ILpyM7sbpN7IVMWkzDbLL4lubo2eD5oC9S9KneLY7N/nVeZmelVT0jupcrxVL99KtJ+Rnw+nPNxsVhsSR9c+JzaxK8d3FsvinrFF98fdDzrcvWbRdlL3ROu6ffCsaTV2us+aqvF102fw3wB7MH0B/PGnD3leiqzm+ftUH9cfOtu/GsFQN/p8G/x7ZGdYLMsCSyCmOXIK4/V7Zhfjgzj9J8U+y/+L1xX2W99NW6cZzl8d5YVqPjxqWdX+ajd+a64VT1/lfVZ5MnjbUvvsMOB+d+CXMok2Kzj67O+bX1d+8dm2X/UrxKOtdldTAoPhM9/eQ+J9ite9vENnv3yu8VWxseu9dXG5ZMrmP/0MD+K4Z+rF79jcty/HeOfwDgBtP8vd4ErwAAAABJRU5ErkJggg==',
19
- itf14:
20
- 'data:image/png;base64,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',
21
- upca: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAiEAAAGBBAMAAABCzXzHAAAAG1BMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABp4cHsAAAACHRSTlMAZYI/6MobpgcQHGEAAAl4SURBVHja7drLcxrHFsBhEGLkJY7vTVgqVYnFEpfihKXvjR8sVRXHZsl1UKyl49gxSyMhMX925tHd031ODwNjaZP7a1dZEhw4Pd/0Gzqd/cq9NCufzW/Vf6Z8NlHFH+bZ4GVbQjruTTsuJHiFSOnHpebP6k39xz53vqzE0gYOty9Se6W3JuLXWbwVIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggiiCCCCCKIIIIIIogggggi/y8id1L2qV67gggiiCCCCCKI/NNEku9fj8WrkhP/keSrj8/ef+0//7+Tl6+/ndeE+NmSj7/a8mf57Fv3QJg1TKlr5ae8a5Ef0vS5eNUivfLqtszj1w+rR94Wa8j/zuMhfrbDtCpl+LR64KY2pa5VkPKORbrZHyvRRGbpZfXXqKz/emAfODBX9J94iJ9t6Ikc22y2XNamVLUKU96xyFLULSv91Lth7hrcQ+4yx9EQP9uFB/CuuHLvgU1dSl2rMOXdipynWmRpql+USX7zX+b/GYBe/opneev/ORriZ+u9fDot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',
22
- upce: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUUAAAGBBAMAAAADI77MAAAAGFBMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAABoAtTLAAAAB3RSTlMAgipazeqqIjjTawAABk9JREFUeNrt2E13mzgUgGHA2N66H1O2NEnrLem04236FW8n7WnZutPMeFs7dvT3B4NAukLC6aSn53TOq02CLeDx1ZV0IYrCbapU/Vc17Zv+zPxnvjVfqK75LmC6OPf4vjbtrv7TjP1bYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSIESNGjBgxYsSI8X9q/GkNI0aMGH9J4+mT95ePZJfk8WVuH55ff7K6PH3XNtEr/iquoLu8/RHG5/WucCW6vFLqT3M0WtddPrbHpdlqttZJa2WJx12X2f2Nsb7UR6vHqDremKOl7vKX+bZtGytySq3M0aLrcnF/Y3ex3I6IffeWqPa6i2W8NSdNlCp8xvvHsQ7KuwPjQ9chFRGqe+wvSx2Sqr381LRSxHGu9tZNMqWaTlf3z8cqb26rn/+HUrtu0EphrJJh/7DJ0Y280ELk41p8namb757XJ7nfuNAjlJnBrjB7+4blrmgzIBeTv7RHNxHT7A7G5EQ3fdG4GszPuc+41Ji4y/jDJHqzsOeMPvGZSLj6+Eak40xM8u2wMS5lTjfHt3nfmHRJVjaFbR2uXbRwx7VJzJUTxpmdjiLKR41TM/HagTy0N31j3MWmHZy4noo+o/k9bRhlAoozjhpTaTxk/eV1NyvsvpMuPeb6Hmk9gj6jCXUtXoowJnI9r3LoiDG51htRE/+x2hf1flL0jONuOrf/xfUyGDBasyIVi6OVz63x293mddJ8kDVr31rfwu477W6Utsvb44dRFBrrlY0QqLEz6cu7GtNGUDYBTHXG2X3nnWUiTvYZY3twnTBWcRCH0SG9Hr24g3FRJ0WiIxTr+9p9jSUWgfAZ5/bas5YTqIrD1jEe2tujxmp1WNVrxkaP1c5jvLmrsbrazl4N1VcZ4wuPsUWGjWlz20nrKFXPmNnGYtAolux6dbvK7XQU63tXiLw5YtRLVtoOw7KJ1H8zjkp7kkydymxhxbhuZ2pfd9kNG9t9YWx2kHsY12KS6KpzZdLxcJ3nt6J6P32sS7Ow8ZmeK1NjLNwBNMbRsPGVkmvN0+vSqihHTUGRiS27OetmsAZb6pJw2i692ZBxOI6x6lVmNjttTl46EydK1t3P8LauLp4b4yzqjaAVx1nYWE2BvecHtmcvmiFbivLMO5fcxXETHTWKOIaNz8zTTCS27H1kV3h9o/zlnt314juNwbEeOc9k7qqu09FjjNx10/0F+Y8yZqb49O6Oqf7rMXo+stNxEx03Lu5inPiS0a4y2vrWa9yGjfOu8Bg2bgKPnhvxbPXBfxM9kpnaPTi0Ul09KNxJOWDMuuXMWh89xlu5cXqMVbR2eSjnv1l1vrWxBGq0XpCLvrHoR9vUuKHabKJCsWifHtaWUd4jGZoziXkiH5v9umccW88K+4BxHlw/2t12YRvzYM3Zn3IbU/50dU8eXOitUXeNmTt+vbMnFvHKLZaKgWm9dbmJ5xWBqfuWYme1jWvfs00ryO3n+VJ9OHHTcR9Ox9QYR10dvvON1lb+0zeWobqg2md2w4vh2WBNMTbzKdHxHvvisdSb/lgmtzQGpkxP4BpjNbgVTq3uugDKfPfSa9/haTkPGJUbnd8+F+3L1dmQ8bx0Hsx6i8qF/dat6D8Bm9cFly9O/3auJo3d2lfocdl/eXR+rXoC6wF8dP5kqdTgbl25VuIB6fWT0lvKJeJ96xFjQ4iV/xw7jqP+O1TfGK7Eaw+lAhvaWRujPArmY9du5AebXnJfyNfh+2LYOHOfPgIVcSZednfDsHU7mLi9bIOU9yrmlTDuBomV0f7+6fvwCUmVBc2bWjEjzTCM/mnbF/3JH/WzzOvebz7rBuMQld3XfPiFcuqshacvBjp7vkyGL3/6u/d6udXh5Phb7zz6ddq/Dfnb7iZBOsMAAAAASUVORK5CYII=',
23
- gs1datamatrix: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANoAAADYCAYAAACN1f3QAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9btSIVQTuICGaoTnZRKY61CkWoEGqFVh1MLv2CJg1Jiouj4Fpw8GOx6uDirKuDqyAIfoC4ujgpukiJ/0sKLWI8OO7Hu3uPu3eAv1FhqtkVB1TNMtLJhJDNrQrBV/RgEAGMISYxU58TxRQ8x9c9fHy9i/Is73N/jn4lbzLAJxDHmW5YxBvEsU1L57xPHGYlSSE+J5406ILEj1yXXX7jXHTYzzPDRiY9TxwmFoodLHcwKxkq8QxxRFE1yvdnXVY4b3FWKzXWuid/YSivrSxzneYokljEEkQIkFFDGRVYiNKqkWIiTfsJD/+I4xfJJZOrDEaOBVShQnL84H/wu1uzMD3lJoUSQPeLbX+MA8FdoFm37e9j226eAIFn4Epr+6sNYPaT9HpbixwBA9vAxXVbk/eAyx1g+EmXDMmRAjT9hQLwfkbflAOGboG+Nbe31j5OH4AMdZW6AQ4OgYkiZa97vLu3s7d/z7T6+wGyunLA/6T1MgAAAAlwSFlzAAAN1wAADdcBQiibeAAAA29JREFUeNrt3VtqLSEURVEN1f8umwYcAiXZYe3oGN+XemZSwvHqHGOs8c588W8qj9X9eDfd69vjudcffA3gzwkNhAZCA4QGQgOhAUIDoQGfno1/W/5recB0bS2u74R73ZqN4osGho4gNEBoIDQQGiA0EBrwaecH63nA/a7CY3X/b/uJZzdD72t2v1dfNDB0BKEBQgOhgdAAoYHQAKFBxFN8vNX8fhOzL1IzSDq/s+6bXFjKAAwdAaGB0EBogNBAaIDQQGhwhjkyMwO6z5b479fW3QnrqFgzBAwdQWiA0EBogNBAaCA0QGjQ3xM677roGVff6wmzam56r9YMAUNHEBogNBAaCA0QGggNEBrkVK8Zkpq10HkNitTMi8SMlHXIMym/Pl80MHQEoQFCA6GB0AChgdAAoUHEc8h9zAPO2X1tkc73mnhn1gwBQ0cQGiA0EBogNBAaCA34pZ2lDBI/Cqd+xK28tuv+235jljIAQ0dAaCA0QGggNBAaIDQQGtxlZymDN7+qpzalGM3Pm7iHzteWer6WMgBDR0BoIDRAaCA0EBogNBAa3GVnZsgJsyUqZ66cMLshdW3rgOvbeg++aGDoCEIDhAZCA6EBQgOhAUKDiJ3dZN4e7xZ2k+lzbYldh6wZAoaOIDRAaCA0QGggNBAaIDTo7wmdNzUzILFmRPdZEKPxeTs/O2uGgKEjCA0QGggNEBoIDYQGCA36S+0m031tkcS9njCDJHVt7Wet+KKBoSMIDRAaCA2EBggNhAYIDSJ2dpOpnC3RfSeWhMSOKH9x3sR7bf/35IsGQgOhAUIDoYHQAKGB0IBPOz9Yp64vIbHJxQnPpPv7j92DLxoYOoLQAKGB0EBogNBAaIDQICK1ycVq/lxm4T1UzyBJnXc2fq+JZ7LVgy8aGDqC0AChgdBAaIDQQGiA0CDiKT7eOuS5lM8MKJSY8TEueq9vn8nWsXzRwNARhAYIDYQGQgOEBkIDhAYR1TNDUrt/pHZ2uclNuw5ZMwQMHQGhgdBAaIDQQGiA0EBocIY5an/x776eReK8K/huu15f6tpm6m/JFw0MHUFogNBAaCA0QGggNEBoELGzZkj5DhuNnbCbTOfznrB2izVDwNARhAYIDYQGCA2EBkIDfql6KQPgszFfNDB0BKEBQgOhgdAAoYHQAKFBxjdAx3fMRvuQ1QAAAABJRU5ErkJggg==',
24
- };
25
-
26
- const SampleBarcode = ({ schema }: { schema: BarcodeSchema }) => (
27
- <img
28
- style={{
29
- width: schema.width * ZOOM,
30
- height: schema.height * ZOOM,
31
- position: 'absolute',
32
- borderRadius: 0,
33
- opacity: 0.5,
34
- }}
35
- src={barcodeExampleImageObj[schema.type]}
36
- />
37
- );
38
-
39
- const ErrorBarcode = () => (
40
- <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%' }}>
41
- <span
42
- style={{
43
- color: 'white',
44
- background: 'red',
45
- padding: '0.25rem',
46
- fontSize: '12pt',
47
- fontWeight: 'bold',
48
- borderRadius: 2,
49
- }}
50
- >
51
- ERROR
52
- </span>
53
- </div>
54
- );
55
-
56
- const BarcodePreview = (props: { schema: BarcodeSchema; value: string }) => {
57
- const { schema, value } = props;
58
-
59
- if (value.length === 0) {
60
- return null;
61
- }
62
-
63
- return validateBarcodeInput(schema.type as BarCodeType, value) ? (
64
- <SampleBarcode schema={schema} />
65
- ) : (
66
- <ErrorBarcode />
67
- );
68
- };
69
- type Props = SchemaUIProps & { schema: BarcodeSchema };
70
-
71
- const BarcodeSchemaUI = (
72
- { schema, editable, placeholder, tabIndex, onChange, onStopEditing }: Props,
73
- ref: Ref<HTMLInputElement>
74
- ) => {
75
- const value = schema.data;
76
-
77
- const style: React.CSSProperties = {
78
- textAlign: 'center',
79
- position: 'absolute',
80
- zIndex: 2,
81
- fontSize: '1rem',
82
- color: '#000',
83
- height: Number(schema.height) * ZOOM,
84
- width: Number(schema.width) * ZOOM,
85
- backgroundColor: editable || value ? 'rgb(242 244 255 / 75%)' : 'none',
86
- border: 'none',
87
- display: 'flex',
88
- alignItems: 'center',
89
- justifyContent: 'center',
90
- overflow: 'auto',
91
- };
92
-
93
- return (
94
- <div
95
- style={{
96
- width: '100%',
97
- height: '100%',
98
- display: 'flex',
99
- alignItems: 'center',
100
- justifyContent: 'center',
101
- fontFamily: "'Open Sans', sans-serif",
102
- }}
103
- >
104
- {editable ? (
105
- <input
106
- ref={ref}
107
- tabIndex={tabIndex}
108
- placeholder={placeholder}
109
- style={style}
110
- value={value}
111
- onChange={(e) => onChange(e.target.value)}
112
- onBlur={onStopEditing}
113
- />
114
- ) : (
115
- <div style={style}>
116
- <span>{value}</span>
117
- </div>
118
- )}
119
- <BarcodePreview value={value} schema={schema} />
120
- </div>
121
- );
122
- };
123
-
124
- export default forwardRef<HTMLInputElement, Props>(BarcodeSchemaUI);