react-id-card-generator 1.0.22 → 1.1.1

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 (47) hide show
  1. package/README.md +33 -12
  2. package/dist/cjs/components/IDCardDesigner.js +170 -13
  3. package/dist/cjs/components/IDCardDesigner.js.map +1 -1
  4. package/dist/cjs/components/IDCardGenerator.js +11 -1
  5. package/dist/cjs/components/IDCardGenerator.js.map +1 -1
  6. package/dist/cjs/components/IDCardPreview.js +6 -0
  7. package/dist/cjs/components/IDCardPreview.js.map +1 -1
  8. package/dist/cjs/components/IDCardTable.js +74 -0
  9. package/dist/cjs/components/IDCardTable.js.map +1 -0
  10. package/dist/cjs/index.js +4 -0
  11. package/dist/cjs/index.js.map +1 -1
  12. package/dist/cjs/node_modules/qrious/dist/qrious.js +1 -1
  13. package/dist/cjs/storage/templateStorage.js +2 -2
  14. package/dist/cjs/storage/templateStorage.js.map +1 -1
  15. package/dist/cjs/styles.css +1 -1
  16. package/dist/cjs/utils/styleUtils.js +3 -0
  17. package/dist/cjs/utils/styleUtils.js.map +1 -1
  18. package/dist/cjs/utils/tableUtils.js +106 -0
  19. package/dist/cjs/utils/tableUtils.js.map +1 -0
  20. package/dist/cjs/utils/validators.js +33 -10
  21. package/dist/cjs/utils/validators.js.map +1 -1
  22. package/dist/esm/components/IDCardDesigner.js +170 -13
  23. package/dist/esm/components/IDCardDesigner.js.map +1 -1
  24. package/dist/esm/components/IDCardGenerator.js +11 -1
  25. package/dist/esm/components/IDCardGenerator.js.map +1 -1
  26. package/dist/esm/components/IDCardPreview.js +6 -0
  27. package/dist/esm/components/IDCardPreview.js.map +1 -1
  28. package/dist/esm/components/IDCardTable.js +72 -0
  29. package/dist/esm/components/IDCardTable.js.map +1 -0
  30. package/dist/esm/index.js +1 -0
  31. package/dist/esm/index.js.map +1 -1
  32. package/dist/esm/node_modules/qrious/dist/qrious.js +1 -1
  33. package/dist/esm/storage/templateStorage.js +2 -2
  34. package/dist/esm/storage/templateStorage.js.map +1 -1
  35. package/dist/esm/styles.css +1 -1
  36. package/dist/esm/utils/styleUtils.js +3 -0
  37. package/dist/esm/utils/styleUtils.js.map +1 -1
  38. package/dist/esm/utils/tableUtils.js +96 -0
  39. package/dist/esm/utils/tableUtils.js.map +1 -0
  40. package/dist/esm/utils/validators.js +33 -10
  41. package/dist/esm/utils/validators.js.map +1 -1
  42. package/dist/index.d.ts +43 -4
  43. package/dist/types/components/IDCardTable.d.ts +8 -0
  44. package/dist/types/index.d.ts +2 -1
  45. package/dist/types/types/index.d.ts +37 -2
  46. package/dist/types/utils/tableUtils.d.ts +10 -0
  47. package/package.json +2 -2
@@ -0,0 +1,106 @@
1
+ 'use strict';
2
+
3
+ const DEFAULT_TABLE_ROW_COUNT = 5;
4
+ const DEFAULT_TABLE_COLUMN_COUNT = 5;
5
+ function createDefaultTableColumns(count = DEFAULT_TABLE_COLUMN_COUNT) {
6
+ return Array.from({ length: Math.max(1, count) }, (_, index) => ({
7
+ id: `column_${index + 1}`,
8
+ header: `Header ${index + 1}`,
9
+ fieldKey: `column${index + 1}`,
10
+ width: 1,
11
+ align: 'left',
12
+ }));
13
+ }
14
+ function createDefaultTableConfig() {
15
+ return {
16
+ rowCount: DEFAULT_TABLE_ROW_COUNT,
17
+ columns: createDefaultTableColumns(DEFAULT_TABLE_COLUMN_COUNT),
18
+ showHeader: true,
19
+ zebraRows: false,
20
+ style: {
21
+ borderColor: '#000000',
22
+ borderWidth: 1,
23
+ headerBackgroundColor: '#f0f0f0',
24
+ headerTextColor: '#000000',
25
+ headerFontSize: '10px',
26
+ headerFontWeight: 'bold',
27
+ bodyTextColor: '#000000',
28
+ bodyFontSize: '10px',
29
+ bodyFontWeight: 'normal',
30
+ cellPadding: '2px 4px',
31
+ zebraBackgroundColor: '#f7f7f7',
32
+ },
33
+ };
34
+ }
35
+ function resizeTableColumns(columns, count) {
36
+ const safeCount = Math.max(1, Math.floor(count || 1));
37
+ const existing = columns || [];
38
+ return Array.from({ length: safeCount }, (_, index) => {
39
+ const current = existing[index];
40
+ if (current) {
41
+ return {
42
+ ...current,
43
+ id: current.id || `column_${index + 1}`,
44
+ header: current.header ?? `Header ${index + 1}`,
45
+ fieldKey: current.fieldKey || `column${index + 1}`,
46
+ width: current.width && current.width > 0 ? current.width : 1,
47
+ align: current.align || 'left',
48
+ };
49
+ }
50
+ return createDefaultTableColumns(safeCount)[index];
51
+ });
52
+ }
53
+ function normalizeTableConfig(table) {
54
+ const defaults = createDefaultTableConfig();
55
+ const columns = resizeTableColumns(table?.columns?.length ? table.columns : defaults.columns, table?.columns?.length || DEFAULT_TABLE_COLUMN_COUNT);
56
+ return {
57
+ ...defaults,
58
+ ...table,
59
+ rowCount: Math.max(1, Math.floor(table?.rowCount || defaults.rowCount)),
60
+ columns,
61
+ showHeader: table?.showHeader ?? defaults.showHeader,
62
+ zebraRows: table?.zebraRows ?? defaults.zebraRows,
63
+ rowHeight: typeof table?.rowHeight === 'number' && table.rowHeight > 0
64
+ ? table.rowHeight
65
+ : undefined,
66
+ style: {
67
+ ...defaults.style,
68
+ ...table?.style,
69
+ borderWidth: typeof table?.style?.borderWidth === 'number' && table.style.borderWidth >= 0
70
+ ? table.style.borderWidth
71
+ : defaults.style?.borderWidth,
72
+ },
73
+ };
74
+ }
75
+ function coerceTableRows(value) {
76
+ if (!Array.isArray(value))
77
+ return [];
78
+ return value
79
+ .filter((row) => Boolean(row) && typeof row === 'object' && !Array.isArray(row))
80
+ .map((row) => ({ ...row }));
81
+ }
82
+ function getRenderedTableRows(data, fieldKey, table) {
83
+ const rows = coerceTableRows(data[fieldKey]);
84
+ const renderedRowCount = Math.max(table.rowCount, rows.length);
85
+ return Array.from({ length: renderedRowCount }, (_, index) => rows[index] || {});
86
+ }
87
+ function createSampleTableRows(tableConfig) {
88
+ const table = normalizeTableConfig(tableConfig);
89
+ return Array.from({ length: table.rowCount }, (_, rowIndex) => {
90
+ return table.columns.reduce((row, column) => {
91
+ row[column.fieldKey] = `${column.header} ${rowIndex + 1}`;
92
+ return row;
93
+ }, {});
94
+ });
95
+ }
96
+
97
+ exports.DEFAULT_TABLE_COLUMN_COUNT = DEFAULT_TABLE_COLUMN_COUNT;
98
+ exports.DEFAULT_TABLE_ROW_COUNT = DEFAULT_TABLE_ROW_COUNT;
99
+ exports.coerceTableRows = coerceTableRows;
100
+ exports.createDefaultTableColumns = createDefaultTableColumns;
101
+ exports.createDefaultTableConfig = createDefaultTableConfig;
102
+ exports.createSampleTableRows = createSampleTableRows;
103
+ exports.getRenderedTableRows = getRenderedTableRows;
104
+ exports.normalizeTableConfig = normalizeTableConfig;
105
+ exports.resizeTableColumns = resizeTableColumns;
106
+ //# sourceMappingURL=tableUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableUtils.js","sources":["../../../src/utils/tableUtils.ts"],"sourcesContent":["import type { IDCardData, TableColumn, TableConfig, TableRowData } from '../types';\n\nexport const DEFAULT_TABLE_ROW_COUNT = 5;\nexport const DEFAULT_TABLE_COLUMN_COUNT = 5;\n\nexport function createDefaultTableColumns(count = DEFAULT_TABLE_COLUMN_COUNT): TableColumn[] {\n return Array.from({ length: Math.max(1, count) }, (_, index) => ({\n id: `column_${index + 1}`,\n header: `Header ${index + 1}`,\n fieldKey: `column${index + 1}`,\n width: 1,\n align: 'left',\n }));\n}\n\nexport function createDefaultTableConfig(): TableConfig {\n return {\n rowCount: DEFAULT_TABLE_ROW_COUNT,\n columns: createDefaultTableColumns(DEFAULT_TABLE_COLUMN_COUNT),\n showHeader: true,\n zebraRows: false,\n style: {\n borderColor: '#000000',\n borderWidth: 1,\n headerBackgroundColor: '#f0f0f0',\n headerTextColor: '#000000',\n headerFontSize: '10px',\n headerFontWeight: 'bold',\n bodyTextColor: '#000000',\n bodyFontSize: '10px',\n bodyFontWeight: 'normal',\n cellPadding: '2px 4px',\n zebraBackgroundColor: '#f7f7f7',\n },\n };\n}\n\nexport function resizeTableColumns(\n columns: TableColumn[] | undefined,\n count: number\n): TableColumn[] {\n const safeCount = Math.max(1, Math.floor(count || 1));\n const existing = columns || [];\n\n return Array.from({ length: safeCount }, (_, index) => {\n const current = existing[index];\n if (current) {\n return {\n ...current,\n id: current.id || `column_${index + 1}`,\n header: current.header ?? `Header ${index + 1}`,\n fieldKey: current.fieldKey || `column${index + 1}`,\n width: current.width && current.width > 0 ? current.width : 1,\n align: current.align || 'left',\n };\n }\n\n return createDefaultTableColumns(safeCount)[index];\n });\n}\n\nexport function normalizeTableConfig(table?: TableConfig): TableConfig {\n const defaults = createDefaultTableConfig();\n const columns = resizeTableColumns(\n table?.columns?.length ? table.columns : defaults.columns,\n table?.columns?.length || DEFAULT_TABLE_COLUMN_COUNT\n );\n\n return {\n ...defaults,\n ...table,\n rowCount: Math.max(1, Math.floor(table?.rowCount || defaults.rowCount)),\n columns,\n showHeader: table?.showHeader ?? defaults.showHeader,\n zebraRows: table?.zebraRows ?? defaults.zebraRows,\n rowHeight:\n typeof table?.rowHeight === 'number' && table.rowHeight > 0\n ? table.rowHeight\n : undefined,\n style: {\n ...defaults.style,\n ...table?.style,\n borderWidth:\n typeof table?.style?.borderWidth === 'number' && table.style.borderWidth >= 0\n ? table.style.borderWidth\n : defaults.style?.borderWidth,\n },\n };\n}\n\nexport function coerceTableRows(value: IDCardData[string]): TableRowData[] {\n if (!Array.isArray(value)) return [];\n\n return value\n .filter((row): row is TableRowData => Boolean(row) && typeof row === 'object' && !Array.isArray(row))\n .map((row) => ({ ...row }));\n}\n\nexport function getRenderedTableRows(data: IDCardData, fieldKey: string, table: TableConfig): TableRowData[] {\n const rows = coerceTableRows(data[fieldKey]);\n const renderedRowCount = Math.max(table.rowCount, rows.length);\n\n return Array.from({ length: renderedRowCount }, (_, index) => rows[index] || {});\n}\n\nexport function createSampleTableRows(tableConfig?: TableConfig): TableRowData[] {\n const table = normalizeTableConfig(tableConfig);\n\n return Array.from({ length: table.rowCount }, (_, rowIndex) => {\n return table.columns.reduce<TableRowData>((row, column) => {\n row[column.fieldKey] = `${column.header} ${rowIndex + 1}`;\n return row;\n }, {});\n });\n}\n"],"names":[],"mappings":"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"}
@@ -27,16 +27,7 @@ function validateTemplate(template) {
27
27
  errors.push({ field: 'cardSize.height', message: 'Card height must be positive' });
28
28
  }
29
29
  }
30
- // Validate backgrounds
31
- if (!template.backgrounds?.front && template.sides === 'single') {
32
- errors.push({ field: 'backgrounds.front', message: 'Front background is required' });
33
- }
34
- if (template.sides === 'double' && !template.backgrounds?.back) {
35
- errors.push({
36
- field: 'backgrounds.back',
37
- message: 'Back background is required for double-sided cards',
38
- });
39
- }
30
+ // Backgrounds are optional; blank card sides render with the default card background.
40
31
  // Validate fields
41
32
  if (!template.fields || template.fields.length === 0) {
42
33
  errors.push({ field: 'fields', message: 'At least one field is required' });
@@ -108,6 +99,38 @@ function validateField(field, index) {
108
99
  message: 'Label fields require static text',
109
100
  });
110
101
  }
102
+ if (field.type === 'table') {
103
+ if (!field.table) {
104
+ errors.push({
105
+ field: `${prefix}.table`,
106
+ message: 'Table fields require table configuration',
107
+ });
108
+ }
109
+ else {
110
+ if (!field.table.rowCount || field.table.rowCount <= 0) {
111
+ errors.push({
112
+ field: `${prefix}.table.rowCount`,
113
+ message: 'Table row count must be positive',
114
+ });
115
+ }
116
+ if (!field.table.columns || field.table.columns.length === 0) {
117
+ errors.push({
118
+ field: `${prefix}.table.columns`,
119
+ message: 'Table fields require at least one column',
120
+ });
121
+ }
122
+ else {
123
+ field.table.columns.forEach((column, columnIndex) => {
124
+ if (!column.fieldKey) {
125
+ errors.push({
126
+ field: `${prefix}.table.columns[${columnIndex}].fieldKey`,
127
+ message: 'Table columns require field keys',
128
+ });
129
+ }
130
+ });
131
+ }
132
+ }
133
+ }
111
134
  return errors;
112
135
  }
113
136
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"validators.js","sources":["../../../src/utils/validators.ts"],"sourcesContent":["import type { IDCardTemplate, FieldMapping, CardSize } from '../types';\r\n\r\nexport interface ValidationError {\r\n field: string;\r\n message: string;\r\n}\r\n\r\n/**\r\n * Validate a complete ID card template\r\n * Checks for required fields, valid dimensions, and proper field configuration\r\n * @param template - The template to validate\r\n * @returns Array of validation errors (empty if valid)\r\n */\r\nexport function validateTemplate(template: IDCardTemplate): ValidationError[] {\r\n const errors: ValidationError[] = [];\r\n\r\n // Check required metadata\r\n if (!template.id) {\r\n errors.push({ field: 'id', message: 'Template ID is required' });\r\n }\r\n\r\n if (!template.name) {\r\n errors.push({ field: 'name', message: 'Template name is required' });\r\n }\r\n\r\n // Validate card dimensions\r\n if (!template.cardSize) {\r\n errors.push({ field: 'cardSize', message: 'Card size is required' });\r\n } else {\r\n if (template.cardSize.width <= 0) {\r\n errors.push({ field: 'cardSize.width', message: 'Card width must be positive' });\r\n }\r\n if (template.cardSize.height <= 0) {\r\n errors.push({ field: 'cardSize.height', message: 'Card height must be positive' });\r\n }\r\n }\r\n\r\n // Validate backgrounds\r\n if (!template.backgrounds?.front && template.sides === 'single') {\r\n errors.push({ field: 'backgrounds.front', message: 'Front background is required' });\r\n }\r\n\r\n if (template.sides === 'double' && !template.backgrounds?.back) {\r\n errors.push({\r\n field: 'backgrounds.back',\r\n message: 'Back background is required for double-sided cards',\r\n });\r\n }\r\n\r\n // Validate fields\r\n if (!template.fields || template.fields.length === 0) {\r\n errors.push({ field: 'fields', message: 'At least one field is required' });\r\n } else {\r\n template.fields.forEach((field, index) => {\r\n const fieldErrors = validateField(field, index);\r\n errors.push(...fieldErrors);\r\n });\r\n }\r\n\r\n // Ensure no duplicate field IDs (would cause rendering issues)\r\n const fieldIds = template.fields?.map((f) => f.id) || [];\r\n const duplicateIds = fieldIds.filter((id, index) => fieldIds.indexOf(id) !== index);\r\n if (duplicateIds.length > 0) {\r\n errors.push({\r\n field: 'fields',\r\n message: `Duplicate field IDs: ${[...new Set(duplicateIds)].join(', ')}`,\r\n });\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n/**\r\n * Validate a single field's configuration\r\n * @param field - The field to validate\r\n * @param index - Field index (for error messages)\r\n * @returns Array of validation errors\r\n */\r\nexport function validateField(field: FieldMapping, index: number): ValidationError[] {\r\n const errors: ValidationError[] = [];\r\n const prefix = `fields[${index}]`;\r\n\r\n if (!field.id) {\r\n errors.push({ field: `${prefix}.id`, message: 'Field ID is required' });\r\n }\r\n\r\n if (!field.fieldKey) {\r\n errors.push({ field: `${prefix}.fieldKey`, message: 'Field key is required' });\r\n }\r\n\r\n if (!field.type) {\r\n errors.push({ field: `${prefix}.type`, message: 'Field type is required' });\r\n }\r\n\r\n if (!field.side) {\r\n errors.push({ field: `${prefix}.side`, message: 'Field side is required' });\r\n }\r\n\r\n if (!field.position) {\r\n errors.push({ field: `${prefix}.position`, message: 'Field position is required' });\r\n } else {\r\n if (field.position.x < 0) {\r\n errors.push({ field: `${prefix}.position.x`, message: 'X position cannot be negative' });\r\n }\r\n if (field.position.y < 0) {\r\n errors.push({ field: `${prefix}.position.y`, message: 'Y position cannot be negative' });\r\n }\r\n if (field.position.width <= 0) {\r\n errors.push({ field: `${prefix}.position.width`, message: 'Width must be positive' });\r\n }\r\n if (field.position.height <= 0) {\r\n errors.push({ field: `${prefix}.position.height`, message: 'Height must be positive' });\r\n }\r\n }\r\n\r\n\r\n\r\n if (field.type === 'qrcode' && (!field.qrFields || field.qrFields.length === 0)) {\r\n errors.push({\r\n field: `${prefix}.qrFields`,\r\n message: 'QR code fields require at least one data field',\r\n });\r\n }\r\n\r\n if (field.type === 'label' && !field.staticText && !field.label) {\r\n errors.push({\r\n field: `${prefix}.staticText`,\r\n message: 'Label fields require static text',\r\n });\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n/**\r\n * Validate card size against standard dimensions\r\n */\r\nexport function validateCardSize(size: CardSize): boolean {\r\n const standardSizes = {\r\n 'CR80': { width: 85.6, height: 53.98, unit: 'mm' },\r\n 'CR79': { width: 83.9, height: 51.0, unit: 'mm' },\r\n 'CR100': { width: 98.0, height: 67.0, unit: 'mm' },\r\n };\r\n\r\n // Just ensure dimensions are reasonable\r\n if (size.unit === 'mm') {\r\n return size.width >= 30 && size.width <= 200 && size.height >= 30 && size.height <= 200;\r\n }\r\n if (size.unit === 'px') {\r\n return size.width >= 100 && size.width <= 2000 && size.height >= 100 && size.height <= 2000;\r\n }\r\n if (size.unit === 'in') {\r\n return size.width >= 1 && size.width <= 10 && size.height >= 1 && size.height <= 10;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Check if a field is within card bounds\r\n */\r\nexport function isFieldInBounds(\r\n field: FieldMapping,\r\n cardSize: CardSize\r\n): boolean {\r\n const { x, y, width, height } = field.position;\r\n return (\r\n x >= 0 &&\r\n y >= 0 &&\r\n x + width <= cardSize.width &&\r\n y + height <= cardSize.height\r\n );\r\n}\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validators.js","sources":["../../../src/utils/validators.ts"],"sourcesContent":["import type { IDCardTemplate, FieldMapping, CardSize } from '../types';\r\n\r\nexport interface ValidationError {\r\n field: string;\r\n message: string;\r\n}\r\n\r\n/**\r\n * Validate a complete ID card template\r\n * Checks for required fields, valid dimensions, and proper field configuration\r\n * @param template - The template to validate\r\n * @returns Array of validation errors (empty if valid)\r\n */\r\nexport function validateTemplate(template: IDCardTemplate): ValidationError[] {\r\n const errors: ValidationError[] = [];\r\n\r\n // Check required metadata\r\n if (!template.id) {\r\n errors.push({ field: 'id', message: 'Template ID is required' });\r\n }\r\n\r\n if (!template.name) {\r\n errors.push({ field: 'name', message: 'Template name is required' });\r\n }\r\n\r\n // Validate card dimensions\r\n if (!template.cardSize) {\r\n errors.push({ field: 'cardSize', message: 'Card size is required' });\r\n } else {\r\n if (template.cardSize.width <= 0) {\r\n errors.push({ field: 'cardSize.width', message: 'Card width must be positive' });\r\n }\r\n if (template.cardSize.height <= 0) {\r\n errors.push({ field: 'cardSize.height', message: 'Card height must be positive' });\r\n }\r\n }\r\n\r\n // Backgrounds are optional; blank card sides render with the default card background.\n\r\n // Validate fields\r\n if (!template.fields || template.fields.length === 0) {\r\n errors.push({ field: 'fields', message: 'At least one field is required' });\r\n } else {\r\n template.fields.forEach((field, index) => {\r\n const fieldErrors = validateField(field, index);\r\n errors.push(...fieldErrors);\r\n });\r\n }\r\n\r\n // Ensure no duplicate field IDs (would cause rendering issues)\r\n const fieldIds = template.fields?.map((f) => f.id) || [];\r\n const duplicateIds = fieldIds.filter((id, index) => fieldIds.indexOf(id) !== index);\r\n if (duplicateIds.length > 0) {\r\n errors.push({\r\n field: 'fields',\r\n message: `Duplicate field IDs: ${[...new Set(duplicateIds)].join(', ')}`,\r\n });\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n/**\r\n * Validate a single field's configuration\r\n * @param field - The field to validate\r\n * @param index - Field index (for error messages)\r\n * @returns Array of validation errors\r\n */\r\nexport function validateField(field: FieldMapping, index: number): ValidationError[] {\r\n const errors: ValidationError[] = [];\r\n const prefix = `fields[${index}]`;\r\n\r\n if (!field.id) {\r\n errors.push({ field: `${prefix}.id`, message: 'Field ID is required' });\r\n }\r\n\r\n if (!field.fieldKey) {\r\n errors.push({ field: `${prefix}.fieldKey`, message: 'Field key is required' });\r\n }\r\n\r\n if (!field.type) {\r\n errors.push({ field: `${prefix}.type`, message: 'Field type is required' });\r\n }\r\n\r\n if (!field.side) {\r\n errors.push({ field: `${prefix}.side`, message: 'Field side is required' });\r\n }\r\n\r\n if (!field.position) {\r\n errors.push({ field: `${prefix}.position`, message: 'Field position is required' });\r\n } else {\r\n if (field.position.x < 0) {\r\n errors.push({ field: `${prefix}.position.x`, message: 'X position cannot be negative' });\r\n }\r\n if (field.position.y < 0) {\r\n errors.push({ field: `${prefix}.position.y`, message: 'Y position cannot be negative' });\r\n }\r\n if (field.position.width <= 0) {\r\n errors.push({ field: `${prefix}.position.width`, message: 'Width must be positive' });\r\n }\r\n if (field.position.height <= 0) {\r\n errors.push({ field: `${prefix}.position.height`, message: 'Height must be positive' });\r\n }\r\n }\r\n\r\n\r\n\r\n if (field.type === 'qrcode' && (!field.qrFields || field.qrFields.length === 0)) {\r\n errors.push({\r\n field: `${prefix}.qrFields`,\r\n message: 'QR code fields require at least one data field',\r\n });\r\n }\r\n\r\n if (field.type === 'label' && !field.staticText && !field.label) {\n errors.push({\n field: `${prefix}.staticText`,\n message: 'Label fields require static text',\n });\n }\n\n if (field.type === 'table') {\n if (!field.table) {\n errors.push({\n field: `${prefix}.table`,\n message: 'Table fields require table configuration',\n });\n } else {\n if (!field.table.rowCount || field.table.rowCount <= 0) {\n errors.push({\n field: `${prefix}.table.rowCount`,\n message: 'Table row count must be positive',\n });\n }\n\n if (!field.table.columns || field.table.columns.length === 0) {\n errors.push({\n field: `${prefix}.table.columns`,\n message: 'Table fields require at least one column',\n });\n } else {\n field.table.columns.forEach((column, columnIndex) => {\n if (!column.fieldKey) {\n errors.push({\n field: `${prefix}.table.columns[${columnIndex}].fieldKey`,\n message: 'Table columns require field keys',\n });\n }\n });\n }\n }\n }\n\n return errors;\n}\n\r\n/**\r\n * Validate card size against standard dimensions\r\n */\r\nexport function validateCardSize(size: CardSize): boolean {\r\n const standardSizes = {\r\n 'CR80': { width: 85.6, height: 53.98, unit: 'mm' },\r\n 'CR79': { width: 83.9, height: 51.0, unit: 'mm' },\r\n 'CR100': { width: 98.0, height: 67.0, unit: 'mm' },\r\n };\r\n\r\n // Just ensure dimensions are reasonable\r\n if (size.unit === 'mm') {\r\n return size.width >= 30 && size.width <= 200 && size.height >= 30 && size.height <= 200;\r\n }\r\n if (size.unit === 'px') {\r\n return size.width >= 100 && size.width <= 2000 && size.height >= 100 && size.height <= 2000;\r\n }\r\n if (size.unit === 'in') {\r\n return size.width >= 1 && size.width <= 10 && size.height >= 1 && size.height <= 10;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Check if a field is within card bounds\r\n */\r\nexport function isFieldInBounds(\r\n field: FieldMapping,\r\n cardSize: CardSize\r\n): boolean {\r\n const { x, y, width, height } = field.position;\r\n return (\r\n x >= 0 &&\r\n y >= 0 &&\r\n x + width <= cardSize.width &&\r\n y + height <= cardSize.height\r\n );\r\n}\r\n"],"names":[],"mappings":"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"}