react-id-card-generator 1.0.7 → 1.0.8

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.
@@ -77,6 +77,7 @@ const IDCardDesigner = ({ initialTemplate, onSave, onCancel, className = '', sty
77
77
  fontWeight: type === 'label' ? 'bold' : 'normal',
78
78
  color: '#000000',
79
79
  textAlign: 'left',
80
+ backgroundColor: 'transparent',
80
81
  },
81
82
  zIndex: template.fields.length + 1,
82
83
  staticText: type === 'label' ? 'Static Label' : '',
@@ -275,7 +276,7 @@ const IDCardDesigner = ({ initialTemplate, onSave, onCancel, className = '', sty
275
276
  removeField(field.id);
276
277
  if (field.id === selectedFieldId)
277
278
  setSelectedFieldId(null);
278
- }, children: "\u00D7" })] }, field.id)))] })] }), jsxRuntime.jsxs("div", { className: "designer-sidebar right-sidebar", children: [jsxRuntime.jsx("h3", { children: "Field Properties" }), selectedField ? (jsxRuntime.jsxs("div", { className: "field-properties", children: [jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Field Key" }), jsxRuntime.jsx("input", { type: "text", value: selectedField.fieldKey, onChange: (e) => handleFieldPropertyUpdate('fieldKey', e.target.value) })] }), selectedField.type !== 'label' && (jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Label" }), jsxRuntime.jsx("input", { type: "text", value: selectedField.label || '', onChange: (e) => handleFieldPropertyUpdate('label', e.target.value) })] })), selectedField.type === 'label' && (jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Static Text" }), jsxRuntime.jsx("input", { type: "text", value: selectedField.staticText || '', onChange: (e) => handleFieldPropertyUpdate('staticText', e.target.value) })] })), selectedField.type === 'qrcode' && (jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "QR Code Data Fields" }), jsxRuntime.jsx("small", { className: "hint", children: "Select which fields to encode in the QR code:" }), jsxRuntime.jsx("div", { style: { marginTop: '8px', maxHeight: '150px', overflowY: 'auto', border: '1px solid #ddd', borderRadius: '4px', padding: '8px' }, children: template.fields
279
+ }, children: "\u00D7" })] }, field.id)))] })] }), jsxRuntime.jsxs("div", { className: "designer-sidebar right-sidebar", children: [jsxRuntime.jsx("h3", { children: "Field Properties" }), selectedField ? (jsxRuntime.jsxs("div", { className: "field-properties", children: [jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Field Key" }), jsxRuntime.jsx("input", { type: "text", value: selectedField.fieldKey, onChange: (e) => handleFieldPropertyUpdate('fieldKey', e.target.value) })] }), selectedField.type !== 'label' && (jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Label" }), jsxRuntime.jsx("input", { type: "text", value: selectedField.label || '', onChange: (e) => handleFieldPropertyUpdate('label', e.target.value) })] })), selectedField.type === 'text' && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("div", { style: { border: '1px solid #eee', borderRadius: 4, marginBottom: 12, padding: 8 }, children: [jsxRuntime.jsx("strong", { style: { fontSize: '1em', display: 'block', marginBottom: 6 }, children: "Label Style" }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Label Position" }), jsxRuntime.jsxs("select", { value: selectedField.style?.labelPosition || 'top', onChange: (e) => handleFieldPropertyUpdate('style.labelPosition', e.target.value), children: [jsxRuntime.jsx("option", { value: "top", children: "Top" }), jsxRuntime.jsx("option", { value: "left", children: "Left (Side)" })] })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Label Vertical Align" }), jsxRuntime.jsxs("select", { value: selectedField.style?.labelVerticalAlign || 'top', onChange: (e) => handleFieldPropertyUpdate('style.labelVerticalAlign', e.target.value), children: [jsxRuntime.jsx("option", { value: "top", children: "Top" }), jsxRuntime.jsx("option", { value: "middle", children: "Middle" }), jsxRuntime.jsx("option", { value: "bottom", children: "Bottom" })] })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Label Font Size" }), jsxRuntime.jsx("input", { type: "text", value: selectedField.style?.labelFontSize || '0.75em', onChange: (e) => handleFieldPropertyUpdate('style.labelFontSize', e.target.value) })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Label Font Weight" }), jsxRuntime.jsxs("select", { value: selectedField.style?.labelFontWeight || 'normal', onChange: (e) => handleFieldPropertyUpdate('style.labelFontWeight', e.target.value), children: [jsxRuntime.jsx("option", { value: "normal", children: "Normal" }), jsxRuntime.jsx("option", { value: "bold", children: "Bold" }), jsxRuntime.jsx("option", { value: "100", children: "100" }), jsxRuntime.jsx("option", { value: "200", children: "200" }), jsxRuntime.jsx("option", { value: "300", children: "300" }), jsxRuntime.jsx("option", { value: "400", children: "400" }), jsxRuntime.jsx("option", { value: "500", children: "500" }), jsxRuntime.jsx("option", { value: "600", children: "600" }), jsxRuntime.jsx("option", { value: "700", children: "700" }), jsxRuntime.jsx("option", { value: "800", children: "800" }), jsxRuntime.jsx("option", { value: "900", children: "900" })] })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Label Color" }), jsxRuntime.jsx("input", { type: "color", value: selectedField.style?.labelColor || '#666666', onChange: (e) => handleFieldPropertyUpdate('style.labelColor', e.target.value) })] })] }), jsxRuntime.jsxs("div", { style: { border: '1px solid #eee', borderRadius: 4, marginBottom: 12, padding: 8 }, children: [jsxRuntime.jsx("strong", { style: { fontSize: '1em', display: 'block', marginBottom: 6 }, children: "Text Style" }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Font Size" }), jsxRuntime.jsx("input", { type: "text", value: selectedField.style?.fontSize || '12px', onChange: (e) => handleFieldPropertyUpdate('style.fontSize', e.target.value) })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Font Weight" }), jsxRuntime.jsxs("select", { value: selectedField.style?.fontWeight || 'normal', onChange: (e) => handleFieldPropertyUpdate('style.fontWeight', e.target.value), children: [jsxRuntime.jsx("option", { value: "normal", children: "Normal" }), jsxRuntime.jsx("option", { value: "bold", children: "Bold" }), jsxRuntime.jsx("option", { value: "100", children: "100" }), jsxRuntime.jsx("option", { value: "200", children: "200" }), jsxRuntime.jsx("option", { value: "300", children: "300" }), jsxRuntime.jsx("option", { value: "400", children: "400" }), jsxRuntime.jsx("option", { value: "500", children: "500" }), jsxRuntime.jsx("option", { value: "600", children: "600" }), jsxRuntime.jsx("option", { value: "700", children: "700" }), jsxRuntime.jsx("option", { value: "800", children: "800" }), jsxRuntime.jsx("option", { value: "900", children: "900" })] })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Text Color" }), jsxRuntime.jsx("input", { type: "color", value: selectedField.style?.color || '#000000', onChange: (e) => handleFieldPropertyUpdate('style.color', e.target.value) })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Text Align" }), jsxRuntime.jsxs("select", { value: selectedField.style?.textAlign || 'left', onChange: (e) => handleFieldPropertyUpdate('style.textAlign', e.target.value), children: [jsxRuntime.jsx("option", { value: "left", children: "Left" }), jsxRuntime.jsx("option", { value: "center", children: "Center" }), jsxRuntime.jsx("option", { value: "right", children: "Right" })] })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Text Transform" }), jsxRuntime.jsxs("select", { value: selectedField.style?.textTransform || 'none', onChange: (e) => handleFieldPropertyUpdate('style.textTransform', e.target.value), children: [jsxRuntime.jsx("option", { value: "none", children: "None" }), jsxRuntime.jsx("option", { value: "uppercase", children: "UPPERCASE" }), jsxRuntime.jsx("option", { value: "lowercase", children: "lowercase" }), jsxRuntime.jsx("option", { value: "capitalize", children: "Capitalize" })] })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Vertical Align" }), jsxRuntime.jsxs("select", { value: selectedField.style?.verticalAlign || 'top', onChange: (e) => handleFieldPropertyUpdate('style.verticalAlign', e.target.value), children: [jsxRuntime.jsx("option", { value: "top", children: "Top" }), jsxRuntime.jsx("option", { value: "middle", children: "Middle" }), jsxRuntime.jsx("option", { value: "bottom", children: "Bottom" })] })] })] })] })), selectedField.type === 'label' && (jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Static Text" }), jsxRuntime.jsx("input", { type: "text", value: selectedField.staticText || '', onChange: (e) => handleFieldPropertyUpdate('staticText', e.target.value) })] })), selectedField.type === 'qrcode' && (jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "QR Code Data Fields" }), jsxRuntime.jsx("small", { className: "hint", children: "Select which fields to encode in the QR code:" }), jsxRuntime.jsx("div", { style: { marginTop: '8px', maxHeight: '150px', overflowY: 'auto', border: '1px solid #ddd', borderRadius: '4px', padding: '8px' }, children: template.fields
279
280
  .filter(f => f.type !== 'qrcode' && f.type !== 'label')
280
281
  .map((field) => (jsxRuntime.jsxs("label", { style: { display: 'block', marginBottom: '6px', cursor: 'pointer' }, children: [jsxRuntime.jsx("input", { type: "checkbox", checked: selectedField.qrFields?.includes(field.fieldKey) || false, onChange: (e) => {
281
282
  const currentFields = selectedField.qrFields || [];
@@ -283,7 +284,7 @@ const IDCardDesigner = ({ initialTemplate, onSave, onCancel, className = '', sty
283
284
  ? [...currentFields, field.fieldKey]
284
285
  : currentFields.filter(f => f !== field.fieldKey);
285
286
  handleFieldPropertyUpdate('qrFields', newFields);
286
- }, style: { marginRight: '6px' } }), field.label || field.fieldKey] }, field.fieldKey))) })] })), jsxRuntime.jsx("h4", { children: "Style" }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Font Size" }), jsxRuntime.jsx("input", { type: "text", value: selectedField.style?.fontSize || '12px', onChange: (e) => handleFieldPropertyUpdate('style.fontSize', e.target.value) })] }), selectedField.type === 'text' && (jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Vertical Align" }), jsxRuntime.jsxs("select", { value: selectedField.style?.verticalAlign || 'top', onChange: (e) => handleFieldPropertyUpdate('style.verticalAlign', e.target.value), children: [jsxRuntime.jsx("option", { value: "top", children: "Top" }), jsxRuntime.jsx("option", { value: "middle", children: "Middle" }), jsxRuntime.jsx("option", { value: "bottom", children: "Bottom" })] })] })), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Font Weight" }), jsxRuntime.jsxs("select", { value: selectedField.style?.fontWeight || 'normal', onChange: (e) => handleFieldPropertyUpdate('style.fontWeight', e.target.value), children: [jsxRuntime.jsx("option", { value: "normal", children: "Normal" }), jsxRuntime.jsx("option", { value: "bold", children: "Bold" }), jsxRuntime.jsx("option", { value: "100", children: "100" }), jsxRuntime.jsx("option", { value: "200", children: "200" }), jsxRuntime.jsx("option", { value: "300", children: "300" }), jsxRuntime.jsx("option", { value: "400", children: "400" }), jsxRuntime.jsx("option", { value: "500", children: "500" }), jsxRuntime.jsx("option", { value: "600", children: "600" }), jsxRuntime.jsx("option", { value: "700", children: "700" }), jsxRuntime.jsx("option", { value: "800", children: "800" }), jsxRuntime.jsx("option", { value: "900", children: "900" })] })] }), selectedField.type === 'image' && (jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Border Radius" }), jsxRuntime.jsx("input", { type: "text", placeholder: "e.g. 50% or 8px", value: selectedField.style?.borderRadius || '', onChange: (e) => handleFieldPropertyUpdate('style.borderRadius', e.target.value) }), jsxRuntime.jsxs("small", { className: "hint", children: ["Use ", jsxRuntime.jsx("b", { children: "50%" }), " for a circle, ", jsxRuntime.jsx("b", { children: "8px" }), " for rounded corners, etc."] })] })), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Text Color" }), jsxRuntime.jsx("input", { type: "color", value: selectedField.style?.color || '#000000', onChange: (e) => handleFieldPropertyUpdate('style.color', e.target.value) })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Text Align" }), jsxRuntime.jsxs("select", { value: selectedField.style?.textAlign || 'left', onChange: (e) => handleFieldPropertyUpdate('style.textAlign', e.target.value), children: [jsxRuntime.jsx("option", { value: "left", children: "Left" }), jsxRuntime.jsx("option", { value: "center", children: "Center" }), jsxRuntime.jsx("option", { value: "right", children: "Right" })] })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Text Transform" }), jsxRuntime.jsxs("select", { value: selectedField.style?.textTransform || 'none', onChange: (e) => handleFieldPropertyUpdate('style.textTransform', e.target.value), children: [jsxRuntime.jsx("option", { value: "none", children: "None" }), jsxRuntime.jsx("option", { value: "uppercase", children: "UPPERCASE" }), jsxRuntime.jsx("option", { value: "lowercase", children: "lowercase" }), jsxRuntime.jsx("option", { value: "capitalize", children: "Capitalize" })] })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Background Color" }), jsxRuntime.jsx("input", { type: "color", value: selectedField.style?.backgroundColor || '#ffffff', onChange: (e) => handleFieldPropertyUpdate('style.backgroundColor', e.target.value) })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Side" }), jsxRuntime.jsxs("select", { value: selectedField.side, onChange: (e) => handleFieldPropertyUpdate('side', e.target.value), children: [jsxRuntime.jsx("option", { value: "front", children: "Front" }), template.sides === 'double' && jsxRuntime.jsx("option", { value: "back", children: "Back" })] })] }), jsxRuntime.jsx("button", { className: "btn btn-danger", onClick: handleDeleteField, children: "Delete Field" })] })) : (jsxRuntime.jsx("p", { className: "no-selection", children: "Select a field to edit its properties" })), jsxRuntime.jsx("h3", { children: "Sample Data" }), jsxRuntime.jsxs("div", { className: "sample-data", children: [jsxRuntime.jsx("p", { className: "hint", children: "Edit sample data to preview:" }), Object.entries(sampleData).map(([key, value]) => (jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: key }), jsxRuntime.jsx("input", { type: "text", value: String(value), onChange: (e) => setSampleData((prev) => ({ ...prev, [key]: e.target.value })) })] }, key))), jsxRuntime.jsx("button", { className: "btn btn-outline btn-sm", onClick: () => setSampleData((prev) => ({ ...prev, [`custom_${Date.now()}`]: '' })), children: "+ Add Field" })] }), validationErrors.length > 0 && (jsxRuntime.jsxs("div", { className: "validation-errors", children: [jsxRuntime.jsx("h4", { children: "\u26A0\uFE0F Validation Issues" }), jsxRuntime.jsx("ul", { children: validationErrors.map((error, index) => (jsxRuntime.jsx("li", { children: error }, index))) })] }))] })] })] }));
287
+ }, style: { marginRight: '6px' } }), field.label || field.fieldKey] }, field.fieldKey))) })] })), selectedField.type === 'image' && (jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Border Radius" }), jsxRuntime.jsx("input", { type: "text", placeholder: "e.g. 50% or 8px", value: selectedField.style?.borderRadius || '', onChange: (e) => handleFieldPropertyUpdate('style.borderRadius', e.target.value) }), jsxRuntime.jsxs("small", { className: "hint", children: ["Use ", jsxRuntime.jsx("b", { children: "50%" }), " for a circle, ", jsxRuntime.jsx("b", { children: "8px" }), " for rounded corners, etc."] })] })), selectedField.type !== 'text' && jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("h4", { children: "Style" }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Font Size" }), jsxRuntime.jsx("input", { type: "text", value: selectedField.style?.fontSize || '12px', onChange: (e) => handleFieldPropertyUpdate('style.fontSize', e.target.value) })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Font Weight" }), jsxRuntime.jsxs("select", { value: selectedField.style?.fontWeight || 'normal', onChange: (e) => handleFieldPropertyUpdate('style.fontWeight', e.target.value), children: [jsxRuntime.jsx("option", { value: "normal", children: "Normal" }), jsxRuntime.jsx("option", { value: "bold", children: "Bold" }), jsxRuntime.jsx("option", { value: "100", children: "100" }), jsxRuntime.jsx("option", { value: "200", children: "200" }), jsxRuntime.jsx("option", { value: "300", children: "300" }), jsxRuntime.jsx("option", { value: "400", children: "400" }), jsxRuntime.jsx("option", { value: "500", children: "500" }), jsxRuntime.jsx("option", { value: "600", children: "600" }), jsxRuntime.jsx("option", { value: "700", children: "700" }), jsxRuntime.jsx("option", { value: "800", children: "800" }), jsxRuntime.jsx("option", { value: "900", children: "900" })] })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Text Color" }), jsxRuntime.jsx("input", { type: "color", value: selectedField.style?.color || '#000000', onChange: (e) => handleFieldPropertyUpdate('style.color', e.target.value) })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Text Align" }), jsxRuntime.jsxs("select", { value: selectedField.style?.textAlign || 'left', onChange: (e) => handleFieldPropertyUpdate('style.textAlign', e.target.value), children: [jsxRuntime.jsx("option", { value: "left", children: "Left" }), jsxRuntime.jsx("option", { value: "center", children: "Center" }), jsxRuntime.jsx("option", { value: "right", children: "Right" })] })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Text Transform" }), jsxRuntime.jsxs("select", { value: selectedField.style?.textTransform || 'none', onChange: (e) => handleFieldPropertyUpdate('style.textTransform', e.target.value), children: [jsxRuntime.jsx("option", { value: "none", children: "None" }), jsxRuntime.jsx("option", { value: "uppercase", children: "UPPERCASE" }), jsxRuntime.jsx("option", { value: "lowercase", children: "lowercase" }), jsxRuntime.jsx("option", { value: "capitalize", children: "Capitalize" })] })] })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Background Color" }), jsxRuntime.jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 8 }, children: [jsxRuntime.jsx("input", { type: "checkbox", id: "transparent-bg-checkbox", checked: selectedField.style?.backgroundColor === 'transparent', onChange: e => handleFieldPropertyUpdate('style.backgroundColor', e.target.checked ? 'transparent' : '#ffffff') }), jsxRuntime.jsx("label", { htmlFor: "transparent-bg-checkbox", style: { margin: 0, fontWeight: 400, fontSize: '0.95em' }, children: "Transparent" }), selectedField.style?.backgroundColor !== 'transparent' && (jsxRuntime.jsx("input", { type: "color", value: selectedField.style?.backgroundColor || '#ffffff', onChange: e => handleFieldPropertyUpdate('style.backgroundColor', e.target.value) }))] })] }), jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: "Side" }), jsxRuntime.jsxs("select", { value: selectedField.side, onChange: (e) => handleFieldPropertyUpdate('side', e.target.value), children: [jsxRuntime.jsx("option", { value: "front", children: "Front" }), template.sides === 'double' && jsxRuntime.jsx("option", { value: "back", children: "Back" })] })] }), jsxRuntime.jsx("button", { className: "btn btn-danger", onClick: handleDeleteField, children: "Delete Field" })] })) : (jsxRuntime.jsx("p", { className: "no-selection", children: "Select a field to edit its properties" })), jsxRuntime.jsx("h3", { children: "Sample Data" }), jsxRuntime.jsxs("div", { className: "sample-data", children: [jsxRuntime.jsx("p", { className: "hint", children: "Edit sample data to preview:" }), Object.entries(sampleData).map(([key, value]) => (jsxRuntime.jsxs("div", { className: "property-group", children: [jsxRuntime.jsx("label", { children: key }), jsxRuntime.jsx("input", { type: "text", value: String(value), onChange: (e) => setSampleData((prev) => ({ ...prev, [key]: e.target.value })) })] }, key))), jsxRuntime.jsx("button", { className: "btn btn-outline btn-sm", onClick: () => setSampleData((prev) => ({ ...prev, [`custom_${Date.now()}`]: '' })), children: "+ Add Field" })] }), validationErrors.length > 0 && (jsxRuntime.jsxs("div", { className: "validation-errors", children: [jsxRuntime.jsx("h4", { children: "\u26A0\uFE0F Validation Issues" }), jsxRuntime.jsx("ul", { children: validationErrors.map((error, index) => (jsxRuntime.jsx("li", { children: error }, index))) })] }))] })] })] }));
287
288
  };
288
289
 
289
290
  exports.IDCardDesigner = IDCardDesigner;
@@ -1 +1 @@
1
- {"version":3,"file":"IDCardDesigner.js","sources":["../../../src/components/IDCardDesigner.tsx"],"sourcesContent":["import React, { useState, useCallback, useRef, useEffect } from 'react';\r\nimport type {\r\n IDCardDesignerProps,\r\n FieldMapping,\r\n FieldType,\r\n CardOrientation,\r\n CardSides,\r\n IDCardData,\r\n} from '../types';\r\nimport { useIDCardTemplate } from '../hooks/useIDCardTemplate';\r\nimport { deepCleanUndefined } from '../utils/deepCleanUndefined';\r\nimport { IDCardPreview } from './IDCardPreview';\r\nimport { generateId, imageFileToBase64 } from '../storage/templateStorage';\r\nimport './IDCardDesigner.css';\r\n\r\n// Available field types in the designer\r\nconst defaultFieldTypes: { type: FieldType; label: string; icon: string }[] = [\r\n { type: 'text', label: 'Text Field', icon: '📝' },\r\n { type: 'label', label: 'Static Label', icon: '🏷️' },\r\n { type: 'image', label: 'Image/Photo', icon: '🖼️' },\r\n { type: 'qrcode', label: 'QR Code', icon: '📱' },\r\n];\r\n\r\n/**\r\n * IDCardDesigner - Visual drag-and-drop template builder\r\n * \r\n * Allows users to:\r\n * - Add and position fields on the card\r\n * - Upload background images\r\n * - Configure field styles (fonts, colors, etc.)\r\n * - Choose card orientation and sides\r\n * - Preview the card with sample data\r\n */\r\n\r\n/**\r\n * IDCardDesigner - Visual drag-and-drop ID card template builder\r\n */\r\nexport const IDCardDesigner: React.FC<IDCardDesignerProps> = ({\r\n initialTemplate,\r\n onSave,\r\n onCancel,\r\n className = '',\r\n style = {},\r\n}) => {\r\n const {\r\n template,\r\n updateField,\r\n addField,\r\n removeField,\r\n setBackground,\r\n setCardSize,\r\n setOrientation,\r\n setSides,\r\n isValid,\r\n validationErrors,\r\n } = useIDCardTemplate(initialTemplate);\r\n\r\n const [activeSide, setActiveSide] = useState<'front' | 'back'>('front');\r\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\r\n const [showGrid, setShowGrid] = useState(true);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [isResizing, setIsResizing] = useState(false);\r\n const [templateName, setTemplateName] = useState(template.name);\r\n\r\n const previewContainerRef = useRef<HTMLDivElement>(null);\r\n const dragStartRef = useRef({ x: 0, y: 0, fieldX: 0, fieldY: 0 });\r\n const resizeStartRef = useRef({\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n fieldX: 0,\r\n fieldY: 0,\r\n handle: '',\r\n });\r\n\r\n // Sample data for preview\r\n const [sampleData, setSampleData] = useState<IDCardData>({\r\n name: 'John Doe',\r\n idno: 'ID12345',\r\n department: 'Computer Science',\r\n designation: 'Student',\r\n dob: '01-01-2000',\r\n bloodgroup: 'O+',\r\n phoneno: '9876543210',\r\n address: 'Sample Address',\r\n });\r\n\r\n // Get selected field\r\n const selectedField = template.fields.find((f) => f.id === selectedFieldId);\r\n\r\n // Handle field selection\r\n const handleFieldSelect = useCallback((field: FieldMapping | null) => {\r\n setSelectedFieldId(field?.id || null);\r\n }, []);\r\n\r\n // Handle adding new field\r\n const handleAddField = useCallback(\r\n (type: FieldType) => {\r\n const newField: FieldMapping = {\r\n id: generateId('field'),\r\n fieldKey: `field_${Date.now()}`,\r\n label: type === 'label' ? 'Label' : '',\r\n type,\r\n side: activeSide,\r\n position: { x: 50, y: 50, width: 100, height: 30 },\r\n style: {\r\n fontSize: type === 'label' ? '10px' : '12px',\r\n fontWeight: type === 'label' ? 'bold' : 'normal',\r\n color: '#000000',\r\n textAlign: 'left',\r\n },\r\n zIndex: template.fields.length + 1,\r\n staticText: type === 'label' ? 'Static Label' : '',\r\n ...(type === 'qrcode' ? { qrFields: [] } : {}),\r\n };\r\n\r\n // Adjust default sizes based on type\r\n if (type === 'image') {\r\n newField.position = { x: 50, y: 50, width: 80, height: 100 };\r\n } else if (type === 'qrcode') {\r\n newField.position = { x: 50, y: 50, width: 80, height: 80 };\r\n }\r\n\r\n addField(newField);\r\n setSelectedFieldId(newField.id);\r\n },\r\n [activeSide, addField, template.fields.length]\r\n );\r\n\r\n // Handle background upload\r\n const handleBackgroundUpload = useCallback(\r\n async (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const file = e.target.files?.[0];\r\n if (!file) return;\r\n\r\n try {\r\n const base64 = await imageFileToBase64(file);\r\n setBackground(activeSide, base64);\r\n } catch (error) {\r\n console.error('Failed to load background:', error);\r\n }\r\n },\r\n [activeSide, setBackground]\r\n );\r\n\r\n // Handle orientation change\r\n const handleOrientationChange = useCallback(\r\n (orientation: CardOrientation) => {\r\n setOrientation(orientation);\r\n // Update card size based on orientation\r\n const baseWidth = 340;\r\n const baseHeight = 215;\r\n if (orientation === 'portrait') {\r\n setCardSize({ width: baseHeight, height: baseWidth, unit: 'px' });\r\n } else {\r\n setCardSize({ width: baseWidth, height: baseHeight, unit: 'px' });\r\n }\r\n },\r\n [setOrientation, setCardSize]\r\n );\r\n\r\n // Handle sides change\r\n const handleSidesChange = useCallback(\r\n (sides: CardSides) => {\r\n setSides(sides);\r\n if (sides === 'single' && activeSide === 'back') {\r\n setActiveSide('front');\r\n }\r\n },\r\n [setSides, activeSide]\r\n );\r\n\r\n // Drag and drop handling\r\n const handleMouseDown = useCallback(\r\n (e: React.MouseEvent) => {\r\n if (!selectedField || !previewContainerRef.current) return;\r\n\r\n const target = e.target as HTMLElement;\r\n\r\n // Check if clicking on resize handle\r\n if (target.classList.contains('resize-handle')) {\r\n const handle = target.dataset.handle || '';\r\n setIsResizing(true);\r\n resizeStartRef.current = {\r\n x: e.clientX,\r\n y: e.clientY,\r\n width: selectedField.position.width,\r\n height: selectedField.position.height,\r\n fieldX: selectedField.position.x,\r\n fieldY: selectedField.position.y,\r\n handle,\r\n };\r\n return;\r\n }\r\n\r\n // Check if clicking on field (for dragging)\r\n if (target.closest('.preview-field')) {\r\n setIsDragging(true);\r\n dragStartRef.current = {\r\n x: e.clientX,\r\n y: e.clientY,\r\n fieldX: selectedField.position.x,\r\n fieldY: selectedField.position.y,\r\n };\r\n }\r\n },\r\n [selectedField]\r\n );\r\n\r\n // Handle mouse move for dragging/resizing\r\n useEffect(() => {\r\n const handleMouseMove = (e: MouseEvent) => {\r\n if (!selectedField) return;\r\n\r\n if (isDragging) {\r\n const deltaX = e.clientX - dragStartRef.current.x;\r\n const deltaY = e.clientY - dragStartRef.current.y;\r\n\r\n const newX = Math.max(0, Math.min(\r\n template.cardSize.width - selectedField.position.width,\r\n dragStartRef.current.fieldX + deltaX\r\n ));\r\n const newY = Math.max(0, Math.min(\r\n template.cardSize.height - selectedField.position.height,\r\n dragStartRef.current.fieldY + deltaY\r\n ));\r\n\r\n updateField(selectedField.id, {\r\n position: { ...selectedField.position, x: newX, y: newY },\r\n });\r\n }\r\n\r\n if (isResizing) {\r\n const { handle, x, y, width, height, fieldX, fieldY } = resizeStartRef.current;\r\n const deltaX = e.clientX - x;\r\n const deltaY = e.clientY - y;\r\n\r\n let newWidth = width;\r\n let newHeight = height;\r\n let newX = fieldX;\r\n let newY = fieldY;\r\n\r\n if (handle.includes('e')) {\r\n newWidth = Math.max(20, width + deltaX);\r\n }\r\n if (handle.includes('w')) {\r\n newWidth = Math.max(20, width - deltaX);\r\n newX = Math.max(0, fieldX + deltaX);\r\n }\r\n if (handle.includes('s')) {\r\n newHeight = Math.max(20, height + deltaY);\r\n }\r\n if (handle.includes('n')) {\r\n newHeight = Math.max(20, height - deltaY);\r\n newY = Math.max(0, fieldY + deltaY);\r\n }\r\n\r\n updateField(selectedField.id, {\r\n position: { x: newX, y: newY, width: newWidth, height: newHeight },\r\n });\r\n }\r\n };\r\n\r\n const handleMouseUp = () => {\r\n setIsDragging(false);\r\n setIsResizing(false);\r\n };\r\n\r\n if (isDragging || isResizing) {\r\n document.addEventListener('mousemove', handleMouseMove);\r\n document.addEventListener('mouseup', handleMouseUp);\r\n }\r\n\r\n return () => {\r\n document.removeEventListener('mousemove', handleMouseMove);\r\n document.removeEventListener('mouseup', handleMouseUp);\r\n };\r\n }, [isDragging, isResizing, selectedField, updateField, template.cardSize]);\r\n\r\n // Handle field property update\r\n const handleFieldPropertyUpdate = useCallback(\r\n (property: string, value: unknown) => {\r\n if (!selectedField) return;\r\n\r\n if (property.startsWith('style.')) {\r\n const styleKey = property.replace('style.', '');\r\n updateField(selectedField.id, {\r\n style: { ...selectedField.style, [styleKey]: value },\r\n });\r\n } else if (property.startsWith('position.')) {\r\n const posKey = property.replace('position.', '') as keyof typeof selectedField.position;\r\n updateField(selectedField.id, {\r\n position: { ...selectedField.position, [posKey]: Number(value) },\r\n });\r\n } else {\r\n // Only allow qrFields property on QR code fields\r\n if (property === 'qrFields') {\r\n if (selectedField.type === 'qrcode') {\r\n updateField(selectedField.id, { qrFields: value as string[] });\r\n } else {\r\n // do nothing if not a qrcode field\r\n }\r\n } else {\r\n updateField(selectedField.id, { [property]: value });\r\n }\r\n }\r\n },\r\n [selectedField, updateField]\r\n );\r\n\r\n // Handle save\r\n const handleSave = useCallback(() => {\r\n const updatedTemplate = {\r\n ...template,\r\n name: templateName,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n const cleanedTemplate = deepCleanUndefined(updatedTemplate);\r\n onSave(cleanedTemplate);\r\n }, [template, templateName, onSave]);\r\n\r\n // Handle delete field\r\n const handleDeleteField = useCallback(() => {\r\n if (selectedFieldId) {\r\n removeField(selectedFieldId);\r\n setSelectedFieldId(null);\r\n }\r\n }, [selectedFieldId, removeField]);\r\n\r\n // Keyboard shortcuts\r\n useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Delete' && selectedFieldId) {\r\n handleDeleteField();\r\n }\r\n if (e.key === 'Escape') {\r\n setSelectedFieldId(null);\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handleKeyDown);\r\n return () => document.removeEventListener('keydown', handleKeyDown);\r\n }, [selectedFieldId, handleDeleteField]);\r\n\r\n return (\r\n <div className={`idcard-designer ${className}`} style={style}>\r\n {/* Header */}\r\n <div className=\"designer-header\">\r\n <input\r\n type=\"text\"\r\n value={templateName}\r\n onChange={(e) => setTemplateName(e.target.value)}\r\n className=\"template-name-input\"\r\n placeholder=\"Template Name\"\r\n />\r\n <div className=\"header-actions\">\r\n {onCancel && (\r\n <button onClick={onCancel} className=\"btn btn-secondary\">\r\n Cancel\r\n </button>\r\n )}\r\n <button onClick={handleSave} className=\"btn btn-primary\" disabled={!isValid}>\r\n Save Template\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"designer-body\">\r\n {/* Left Sidebar - Field Types */}\r\n <div className=\"designer-sidebar left-sidebar\">\r\n <h3>Add Fields</h3>\r\n <div className=\"field-types\">\r\n {defaultFieldTypes.map((fieldType) => (\r\n <button\r\n key={fieldType.type}\r\n onClick={() => handleAddField(fieldType.type)}\r\n className=\"field-type-btn\"\r\n >\r\n <span className=\"field-icon\">{fieldType.icon}</span>\r\n <span className=\"field-label\">{fieldType.label}</span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n <h3>Card Settings</h3>\r\n <div className=\"card-settings\">\r\n <div className=\"setting-group\">\r\n <label>Orientation</label>\r\n <div className=\"btn-group\">\r\n <button\r\n className={`btn ${template.orientation === 'landscape' ? 'active' : ''}`}\r\n onClick={() => handleOrientationChange('landscape')}\r\n >\r\n Landscape\r\n </button>\r\n <button\r\n className={`btn ${template.orientation === 'portrait' ? 'active' : ''}`}\r\n onClick={() => handleOrientationChange('portrait')}\r\n >\r\n Portrait\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"setting-group\">\r\n <label>Card Sides</label>\r\n <div className=\"btn-group\">\r\n <button\r\n className={`btn ${template.sides === 'single' ? 'active' : ''}`}\r\n onClick={() => handleSidesChange('single')}\r\n >\r\n Single\r\n </button>\r\n <button\r\n className={`btn ${template.sides === 'double' ? 'active' : ''}`}\r\n onClick={() => handleSidesChange('double')}\r\n >\r\n Double\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"setting-group\">\r\n <label>Card Size (px)</label>\r\n <div className=\"size-inputs\">\r\n <input\r\n type=\"number\"\r\n value={template.cardSize.width}\r\n onChange={(e) =>\r\n setCardSize({ ...template.cardSize, width: Number(e.target.value) })\r\n }\r\n placeholder=\"Width\"\r\n />\r\n <span>×</span>\r\n <input\r\n type=\"number\"\r\n value={template.cardSize.height}\r\n onChange={(e) =>\r\n setCardSize({ ...template.cardSize, height: Number(e.target.value) })\r\n }\r\n placeholder=\"Height\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <h3>Background</h3>\r\n <div className=\"background-upload\">\r\n <input\r\n type=\"file\"\r\n accept=\"image/*\"\r\n onChange={handleBackgroundUpload}\r\n id=\"bg-upload\"\r\n className=\"file-input\"\r\n />\r\n <label htmlFor=\"bg-upload\" className=\"btn btn-outline\">\r\n Upload {activeSide} Background\r\n </label>\r\n {template.backgrounds[activeSide] && (\r\n <button\r\n className=\"btn btn-danger btn-sm\"\r\n onClick={() => setBackground(activeSide, '')}\r\n >\r\n Remove\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Center - Preview */}\r\n <div className=\"designer-preview\">\r\n {/* Side tabs */}\r\n <div className=\"side-tabs\">\r\n <button\r\n className={`tab ${activeSide === 'front' ? 'active' : ''}`}\r\n onClick={() => setActiveSide('front')}\r\n >\r\n Front\r\n </button>\r\n {template.sides === 'double' && (\r\n <button\r\n className={`tab ${activeSide === 'back' ? 'active' : ''}`}\r\n onClick={() => setActiveSide('back')}\r\n >\r\n Back\r\n </button>\r\n )}\r\n <label className=\"grid-toggle\">\r\n <input\r\n type=\"checkbox\"\r\n checked={showGrid}\r\n onChange={(e) => setShowGrid(e.target.checked)}\r\n />\r\n Show Grid\r\n </label>\r\n </div>\r\n\r\n {/* Preview container */}\r\n <div\r\n ref={previewContainerRef}\r\n className=\"preview-wrapper\"\r\n onMouseDown={handleMouseDown}\r\n >\r\n <IDCardPreview\r\n template={template}\r\n data={sampleData}\r\n side={activeSide}\r\n showGrid={showGrid}\r\n onFieldSelect={handleFieldSelect}\r\n selectedFieldId={selectedFieldId}\r\n editable={true}\r\n />\r\n </div>\r\n\r\n {/* Field list */}\r\n <div className=\"fields-list\">\r\n <h4>Fields on {activeSide} side:</h4>\r\n {template.fields\r\n .filter((f) => f.side === activeSide)\r\n .map((field) => (\r\n <div\r\n key={field.id}\r\n className={`field-item ${field.id === selectedFieldId ? 'selected' : ''}`}\r\n onClick={() => setSelectedFieldId(field.id)}\r\n >\r\n <span className=\"field-type-icon\">\r\n {defaultFieldTypes.find((t) => t.type === field.type)?.icon}\r\n </span>\r\n <span className=\"field-key\">{field.fieldKey}</span>\r\n <button\r\n className=\"delete-btn\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n removeField(field.id);\r\n if (field.id === selectedFieldId) setSelectedFieldId(null);\r\n }}\r\n >\r\n ×\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Right Sidebar - Field Properties */}\r\n <div className=\"designer-sidebar right-sidebar\">\r\n <h3>Field Properties</h3>\r\n {selectedField ? (\r\n <div className=\"field-properties\">\r\n <div className=\"property-group\">\r\n <label>Field Key</label>\r\n <input\r\n type=\"text\"\r\n value={selectedField.fieldKey}\r\n onChange={(e) => handleFieldPropertyUpdate('fieldKey', e.target.value)}\r\n />\r\n </div>\r\n\r\n {selectedField.type !== 'label' && (\r\n <div className=\"property-group\">\r\n <label>Label</label>\r\n <input\r\n type=\"text\"\r\n value={selectedField.label || ''}\r\n onChange={(e) => handleFieldPropertyUpdate('label', e.target.value)}\r\n />\r\n </div>\r\n )}\r\n\r\n {selectedField.type === 'label' && (\r\n <div className=\"property-group\">\r\n <label>Static Text</label>\r\n <input\r\n type=\"text\"\r\n value={selectedField.staticText || ''}\r\n onChange={(e) => handleFieldPropertyUpdate('staticText', e.target.value)}\r\n />\r\n </div>\r\n )}\r\n\r\n {selectedField.type === 'qrcode' && (\r\n <div className=\"property-group\">\r\n <label>QR Code Data Fields</label>\r\n <small className=\"hint\">Select which fields to encode in the QR code:</small>\r\n <div style={{ marginTop: '8px', maxHeight: '150px', overflowY: 'auto', border: '1px solid #ddd', borderRadius: '4px', padding: '8px' }}>\r\n {template.fields\r\n .filter(f => f.type !== 'qrcode' && f.type !== 'label')\r\n .map((field) => (\r\n <label key={field.fieldKey} style={{ display: 'block', marginBottom: '6px', cursor: 'pointer' }}>\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedField.qrFields?.includes(field.fieldKey) || false}\r\n onChange={(e) => {\r\n const currentFields = selectedField.qrFields || [];\r\n const newFields = e.target.checked\r\n ? [...currentFields, field.fieldKey]\r\n : currentFields.filter(f => f !== field.fieldKey);\r\n handleFieldPropertyUpdate('qrFields', newFields);\r\n }}\r\n style={{ marginRight: '6px' }}\r\n />\r\n {field.label || field.fieldKey}\r\n </label>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n <h4>Style</h4>\r\n\r\n <div className=\"property-group\">\r\n <label>Font Size</label>\r\n <input\r\n type=\"text\"\r\n value={selectedField.style?.fontSize || '12px'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.fontSize', e.target.value)}\r\n />\r\n </div>\r\n\r\n {/* Vertical Align for text fields */}\r\n {selectedField.type === 'text' && (\r\n <div className=\"property-group\">\r\n <label>Vertical Align</label>\r\n <select\r\n value={selectedField.style?.verticalAlign || 'top'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.verticalAlign', e.target.value)}\r\n >\r\n <option value=\"top\">Top</option>\r\n <option value=\"middle\">Middle</option>\r\n <option value=\"bottom\">Bottom</option>\r\n </select>\r\n </div>\r\n )}\r\n\r\n <div className=\"property-group\">\r\n <label>Font Weight</label>\r\n <select\r\n value={selectedField.style?.fontWeight || 'normal'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.fontWeight', e.target.value)}\r\n >\r\n <option value=\"normal\">Normal</option>\r\n <option value=\"bold\">Bold</option>\r\n <option value=\"100\">100</option>\r\n <option value=\"200\">200</option>\r\n <option value=\"300\">300</option>\r\n <option value=\"400\">400</option>\r\n <option value=\"500\">500</option>\r\n <option value=\"600\">600</option>\r\n <option value=\"700\">700</option>\r\n <option value=\"800\">800</option>\r\n <option value=\"900\">900</option>\r\n </select>\r\n </div>\r\n\r\n {/* Border Radius for image fields */}\r\n {selectedField.type === 'image' && (\r\n <div className=\"property-group\">\r\n <label>Border Radius</label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"e.g. 50% or 8px\"\r\n value={selectedField.style?.borderRadius || ''}\r\n onChange={(e) => handleFieldPropertyUpdate('style.borderRadius', e.target.value)}\r\n />\r\n <small className=\"hint\">Use <b>50%</b> for a circle, <b>8px</b> for rounded corners, etc.</small>\r\n </div>\r\n )}\r\n\r\n <div className=\"property-group\">\r\n <label>Text Color</label>\r\n <input\r\n type=\"color\"\r\n value={selectedField.style?.color || '#000000'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.color', e.target.value)}\r\n />\r\n </div>\r\n\r\n <div className=\"property-group\">\r\n <label>Text Align</label>\r\n <select\r\n value={selectedField.style?.textAlign || 'left'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.textAlign', e.target.value)}\r\n >\r\n <option value=\"left\">Left</option>\r\n <option value=\"center\">Center</option>\r\n <option value=\"right\">Right</option>\r\n </select>\r\n </div>\r\n\r\n <div className=\"property-group\">\r\n <label>Text Transform</label>\r\n <select\r\n value={selectedField.style?.textTransform || 'none'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.textTransform', e.target.value)}\r\n >\r\n <option value=\"none\">None</option>\r\n <option value=\"uppercase\">UPPERCASE</option>\r\n <option value=\"lowercase\">lowercase</option>\r\n <option value=\"capitalize\">Capitalize</option>\r\n </select>\r\n </div>\r\n\r\n <div className=\"property-group\">\r\n <label>Background Color</label>\r\n <input\r\n type=\"color\"\r\n value={selectedField.style?.backgroundColor || '#ffffff'}\r\n onChange={(e) =>\r\n handleFieldPropertyUpdate('style.backgroundColor', e.target.value)\r\n }\r\n />\r\n </div>\r\n\r\n <div className=\"property-group\">\r\n <label>Side</label>\r\n <select\r\n value={selectedField.side}\r\n onChange={(e) =>\r\n handleFieldPropertyUpdate('side', e.target.value as 'front' | 'back')\r\n }\r\n >\r\n <option value=\"front\">Front</option>\r\n {template.sides === 'double' && <option value=\"back\">Back</option>}\r\n </select>\r\n </div>\r\n\r\n <button className=\"btn btn-danger\" onClick={handleDeleteField}>\r\n Delete Field\r\n </button>\r\n </div>\r\n ) : (\r\n <p className=\"no-selection\">Select a field to edit its properties</p>\r\n )}\r\n\r\n <h3>Sample Data</h3>\r\n <div className=\"sample-data\">\r\n <p className=\"hint\">Edit sample data to preview:</p>\r\n {Object.entries(sampleData).map(([key, value]) => (\r\n <div key={key} className=\"property-group\">\r\n <label>{key}</label>\r\n <input\r\n type=\"text\"\r\n value={String(value)}\r\n onChange={(e) =>\r\n setSampleData((prev) => ({ ...prev, [key]: e.target.value }))\r\n }\r\n />\r\n </div>\r\n ))}\r\n <button\r\n className=\"btn btn-outline btn-sm\"\r\n onClick={() =>\r\n setSampleData((prev) => ({ ...prev, [`custom_${Date.now()}`]: '' }))\r\n }\r\n >\r\n + Add Field\r\n </button>\r\n </div>\r\n\r\n {/* Validation errors */}\r\n {validationErrors.length > 0 && (\r\n <div className=\"validation-errors\">\r\n <h4>⚠️ Validation Issues</h4>\r\n <ul>\r\n {validationErrors.map((error, index) => (\r\n <li key={index}>{error}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n\r\n"],"names":["useIDCardTemplate","useState","useRef","useCallback","generateId","imageFileToBase64","useEffect","deepCleanUndefined","_jsxs","_jsx","IDCardPreview"],"mappings":"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"}
1
+ {"version":3,"file":"IDCardDesigner.js","sources":["../../../src/components/IDCardDesigner.tsx"],"sourcesContent":["import React, { useState, useCallback, useRef, useEffect } from 'react';\r\nimport type {\r\n IDCardDesignerProps,\r\n FieldMapping,\r\n FieldType,\r\n CardOrientation,\r\n CardSides,\r\n IDCardData,\r\n} from '../types';\r\nimport { useIDCardTemplate } from '../hooks/useIDCardTemplate';\r\nimport { deepCleanUndefined } from '../utils/deepCleanUndefined';\r\nimport { IDCardPreview } from './IDCardPreview';\r\nimport { generateId, imageFileToBase64 } from '../storage/templateStorage';\r\nimport './IDCardDesigner.css';\r\n\r\n// Available field types in the designer\r\nconst defaultFieldTypes: { type: FieldType; label: string; icon: string }[] = [\r\n { type: 'text', label: 'Text Field', icon: '📝' },\r\n { type: 'label', label: 'Static Label', icon: '🏷️' },\r\n { type: 'image', label: 'Image/Photo', icon: '🖼️' },\r\n { type: 'qrcode', label: 'QR Code', icon: '📱' },\r\n];\r\n\r\n/**\r\n * IDCardDesigner - Visual drag-and-drop template builder\r\n * \r\n * Allows users to:\r\n * - Add and position fields on the card\r\n * - Upload background images\r\n * - Configure field styles (fonts, colors, etc.)\r\n * - Choose card orientation and sides\r\n * - Preview the card with sample data\r\n */\r\n\r\n/**\r\n * IDCardDesigner - Visual drag-and-drop ID card template builder\r\n */\r\nexport const IDCardDesigner: React.FC<IDCardDesignerProps> = ({\r\n initialTemplate,\r\n onSave,\r\n onCancel,\r\n className = '',\r\n style = {},\r\n}) => {\r\n const {\r\n template,\r\n updateField,\r\n addField,\r\n removeField,\r\n setBackground,\r\n setCardSize,\r\n setOrientation,\r\n setSides,\r\n isValid,\r\n validationErrors,\r\n } = useIDCardTemplate(initialTemplate);\r\n\r\n const [activeSide, setActiveSide] = useState<'front' | 'back'>('front');\r\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\r\n const [showGrid, setShowGrid] = useState(true);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [isResizing, setIsResizing] = useState(false);\r\n const [templateName, setTemplateName] = useState(template.name);\r\n\r\n const previewContainerRef = useRef<HTMLDivElement>(null);\r\n const dragStartRef = useRef({ x: 0, y: 0, fieldX: 0, fieldY: 0 });\r\n const resizeStartRef = useRef({\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n fieldX: 0,\r\n fieldY: 0,\r\n handle: '',\r\n });\r\n\r\n // Sample data for preview\r\n const [sampleData, setSampleData] = useState<IDCardData>({\r\n name: 'John Doe',\r\n idno: 'ID12345',\r\n department: 'Computer Science',\r\n designation: 'Student',\r\n dob: '01-01-2000',\r\n bloodgroup: 'O+',\r\n phoneno: '9876543210',\r\n address: 'Sample Address',\r\n });\r\n\r\n // Get selected field\r\n const selectedField = template.fields.find((f) => f.id === selectedFieldId);\r\n\r\n // Handle field selection\r\n const handleFieldSelect = useCallback((field: FieldMapping | null) => {\r\n setSelectedFieldId(field?.id || null);\r\n }, []);\r\n\r\n // Handle adding new field\r\n const handleAddField = useCallback(\r\n (type: FieldType) => {\r\n const newField: FieldMapping = {\r\n id: generateId('field'),\r\n fieldKey: `field_${Date.now()}`,\r\n label: type === 'label' ? 'Label' : '',\r\n type,\r\n side: activeSide,\r\n position: { x: 50, y: 50, width: 100, height: 30 },\r\n style: {\r\n fontSize: type === 'label' ? '10px' : '12px',\r\n fontWeight: type === 'label' ? 'bold' : 'normal',\r\n color: '#000000',\r\n textAlign: 'left',\r\n backgroundColor: 'transparent',\r\n },\r\n zIndex: template.fields.length + 1,\r\n staticText: type === 'label' ? 'Static Label' : '',\r\n ...(type === 'qrcode' ? { qrFields: [] } : {}),\r\n };\r\n\r\n // Adjust default sizes based on type\r\n if (type === 'image') {\r\n newField.position = { x: 50, y: 50, width: 80, height: 100 };\r\n } else if (type === 'qrcode') {\r\n newField.position = { x: 50, y: 50, width: 80, height: 80 };\r\n }\r\n\r\n addField(newField);\r\n setSelectedFieldId(newField.id);\r\n },\r\n [activeSide, addField, template.fields.length]\r\n );\r\n\r\n // Handle background upload\r\n const handleBackgroundUpload = useCallback(\r\n async (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const file = e.target.files?.[0];\r\n if (!file) return;\r\n\r\n try {\r\n const base64 = await imageFileToBase64(file);\r\n setBackground(activeSide, base64);\r\n } catch (error) {\r\n console.error('Failed to load background:', error);\r\n }\r\n },\r\n [activeSide, setBackground]\r\n );\r\n\r\n // Handle orientation change\r\n const handleOrientationChange = useCallback(\r\n (orientation: CardOrientation) => {\r\n setOrientation(orientation);\r\n // Update card size based on orientation\r\n const baseWidth = 340;\r\n const baseHeight = 215;\r\n if (orientation === 'portrait') {\r\n setCardSize({ width: baseHeight, height: baseWidth, unit: 'px' });\r\n } else {\r\n setCardSize({ width: baseWidth, height: baseHeight, unit: 'px' });\r\n }\r\n },\r\n [setOrientation, setCardSize]\r\n );\r\n\r\n // Handle sides change\r\n const handleSidesChange = useCallback(\r\n (sides: CardSides) => {\r\n setSides(sides);\r\n if (sides === 'single' && activeSide === 'back') {\r\n setActiveSide('front');\r\n }\r\n },\r\n [setSides, activeSide]\r\n );\r\n\r\n // Drag and drop handling\r\n const handleMouseDown = useCallback(\r\n (e: React.MouseEvent) => {\r\n if (!selectedField || !previewContainerRef.current) return;\r\n\r\n const target = e.target as HTMLElement;\r\n\r\n // Check if clicking on resize handle\r\n if (target.classList.contains('resize-handle')) {\r\n const handle = target.dataset.handle || '';\r\n setIsResizing(true);\r\n resizeStartRef.current = {\r\n x: e.clientX,\r\n y: e.clientY,\r\n width: selectedField.position.width,\r\n height: selectedField.position.height,\r\n fieldX: selectedField.position.x,\r\n fieldY: selectedField.position.y,\r\n handle,\r\n };\r\n return;\r\n }\r\n\r\n // Check if clicking on field (for dragging)\r\n if (target.closest('.preview-field')) {\r\n setIsDragging(true);\r\n dragStartRef.current = {\r\n x: e.clientX,\r\n y: e.clientY,\r\n fieldX: selectedField.position.x,\r\n fieldY: selectedField.position.y,\r\n };\r\n }\r\n },\r\n [selectedField]\r\n );\r\n\r\n // Handle mouse move for dragging/resizing\r\n useEffect(() => {\r\n const handleMouseMove = (e: MouseEvent) => {\r\n if (!selectedField) return;\r\n\r\n if (isDragging) {\r\n const deltaX = e.clientX - dragStartRef.current.x;\r\n const deltaY = e.clientY - dragStartRef.current.y;\r\n\r\n const newX = Math.max(0, Math.min(\r\n template.cardSize.width - selectedField.position.width,\r\n dragStartRef.current.fieldX + deltaX\r\n ));\r\n const newY = Math.max(0, Math.min(\r\n template.cardSize.height - selectedField.position.height,\r\n dragStartRef.current.fieldY + deltaY\r\n ));\r\n\r\n updateField(selectedField.id, {\r\n position: { ...selectedField.position, x: newX, y: newY },\r\n });\r\n }\r\n\r\n if (isResizing) {\r\n const { handle, x, y, width, height, fieldX, fieldY } = resizeStartRef.current;\r\n const deltaX = e.clientX - x;\r\n const deltaY = e.clientY - y;\r\n\r\n let newWidth = width;\r\n let newHeight = height;\r\n let newX = fieldX;\r\n let newY = fieldY;\r\n\r\n if (handle.includes('e')) {\r\n newWidth = Math.max(20, width + deltaX);\r\n }\r\n if (handle.includes('w')) {\r\n newWidth = Math.max(20, width - deltaX);\r\n newX = Math.max(0, fieldX + deltaX);\r\n }\r\n if (handle.includes('s')) {\r\n newHeight = Math.max(20, height + deltaY);\r\n }\r\n if (handle.includes('n')) {\r\n newHeight = Math.max(20, height - deltaY);\r\n newY = Math.max(0, fieldY + deltaY);\r\n }\r\n\r\n updateField(selectedField.id, {\r\n position: { x: newX, y: newY, width: newWidth, height: newHeight },\r\n });\r\n }\r\n };\r\n\r\n const handleMouseUp = () => {\r\n setIsDragging(false);\r\n setIsResizing(false);\r\n };\r\n\r\n if (isDragging || isResizing) {\r\n document.addEventListener('mousemove', handleMouseMove);\r\n document.addEventListener('mouseup', handleMouseUp);\r\n }\r\n\r\n return () => {\r\n document.removeEventListener('mousemove', handleMouseMove);\r\n document.removeEventListener('mouseup', handleMouseUp);\r\n };\r\n }, [isDragging, isResizing, selectedField, updateField, template.cardSize]);\r\n\r\n // Handle field property update\r\n const handleFieldPropertyUpdate = useCallback(\r\n (property: string, value: unknown) => {\r\n if (!selectedField) return;\r\n\r\n if (property.startsWith('style.')) {\r\n const styleKey = property.replace('style.', '');\r\n updateField(selectedField.id, {\r\n style: { ...selectedField.style, [styleKey]: value },\r\n });\r\n } else if (property.startsWith('position.')) {\r\n const posKey = property.replace('position.', '') as keyof typeof selectedField.position;\r\n updateField(selectedField.id, {\r\n position: { ...selectedField.position, [posKey]: Number(value) },\r\n });\r\n } else {\r\n // Only allow qrFields property on QR code fields\r\n if (property === 'qrFields') {\r\n if (selectedField.type === 'qrcode') {\r\n updateField(selectedField.id, { qrFields: value as string[] });\r\n } else {\r\n // do nothing if not a qrcode field\r\n }\r\n } else {\r\n updateField(selectedField.id, { [property]: value });\r\n }\r\n }\r\n },\r\n [selectedField, updateField]\r\n );\r\n\r\n // Handle save\r\n const handleSave = useCallback(() => {\r\n const updatedTemplate = {\r\n ...template,\r\n name: templateName,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n const cleanedTemplate = deepCleanUndefined(updatedTemplate);\r\n onSave(cleanedTemplate);\r\n }, [template, templateName, onSave]);\r\n\r\n // Handle delete field\r\n const handleDeleteField = useCallback(() => {\r\n if (selectedFieldId) {\r\n removeField(selectedFieldId);\r\n setSelectedFieldId(null);\r\n }\r\n }, [selectedFieldId, removeField]);\r\n\r\n // Keyboard shortcuts\r\n useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Delete' && selectedFieldId) {\r\n handleDeleteField();\r\n }\r\n if (e.key === 'Escape') {\r\n setSelectedFieldId(null);\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handleKeyDown);\r\n return () => document.removeEventListener('keydown', handleKeyDown);\r\n }, [selectedFieldId, handleDeleteField]);\r\n\r\n return (\r\n <div className={`idcard-designer ${className}`} style={style}>\r\n {/* Header */}\r\n <div className=\"designer-header\">\r\n <input\r\n type=\"text\"\r\n value={templateName}\r\n onChange={(e) => setTemplateName(e.target.value)}\r\n className=\"template-name-input\"\r\n placeholder=\"Template Name\"\r\n />\r\n <div className=\"header-actions\">\r\n {onCancel && (\r\n <button onClick={onCancel} className=\"btn btn-secondary\">\r\n Cancel\r\n </button>\r\n )}\r\n <button onClick={handleSave} className=\"btn btn-primary\" disabled={!isValid}>\r\n Save Template\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"designer-body\">\r\n {/* Left Sidebar - Field Types */}\r\n <div className=\"designer-sidebar left-sidebar\">\r\n <h3>Add Fields</h3>\r\n <div className=\"field-types\">\r\n {defaultFieldTypes.map((fieldType) => (\r\n <button\r\n key={fieldType.type}\r\n onClick={() => handleAddField(fieldType.type)}\r\n className=\"field-type-btn\"\r\n >\r\n <span className=\"field-icon\">{fieldType.icon}</span>\r\n <span className=\"field-label\">{fieldType.label}</span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n <h3>Card Settings</h3>\r\n <div className=\"card-settings\">\r\n <div className=\"setting-group\">\r\n <label>Orientation</label>\r\n <div className=\"btn-group\">\r\n <button\r\n className={`btn ${template.orientation === 'landscape' ? 'active' : ''}`}\r\n onClick={() => handleOrientationChange('landscape')}\r\n >\r\n Landscape\r\n </button>\r\n <button\r\n className={`btn ${template.orientation === 'portrait' ? 'active' : ''}`}\r\n onClick={() => handleOrientationChange('portrait')}\r\n >\r\n Portrait\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"setting-group\">\r\n <label>Card Sides</label>\r\n <div className=\"btn-group\">\r\n <button\r\n className={`btn ${template.sides === 'single' ? 'active' : ''}`}\r\n onClick={() => handleSidesChange('single')}\r\n >\r\n Single\r\n </button>\r\n <button\r\n className={`btn ${template.sides === 'double' ? 'active' : ''}`}\r\n onClick={() => handleSidesChange('double')}\r\n >\r\n Double\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"setting-group\">\r\n <label>Card Size (px)</label>\r\n <div className=\"size-inputs\">\r\n <input\r\n type=\"number\"\r\n value={template.cardSize.width}\r\n onChange={(e) =>\r\n setCardSize({ ...template.cardSize, width: Number(e.target.value) })\r\n }\r\n placeholder=\"Width\"\r\n />\r\n <span>×</span>\r\n <input\r\n type=\"number\"\r\n value={template.cardSize.height}\r\n onChange={(e) =>\r\n setCardSize({ ...template.cardSize, height: Number(e.target.value) })\r\n }\r\n placeholder=\"Height\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <h3>Background</h3>\r\n <div className=\"background-upload\">\r\n <input\r\n type=\"file\"\r\n accept=\"image/*\"\r\n onChange={handleBackgroundUpload}\r\n id=\"bg-upload\"\r\n className=\"file-input\"\r\n />\r\n <label htmlFor=\"bg-upload\" className=\"btn btn-outline\">\r\n Upload {activeSide} Background\r\n </label>\r\n {template.backgrounds[activeSide] && (\r\n <button\r\n className=\"btn btn-danger btn-sm\"\r\n onClick={() => setBackground(activeSide, '')}\r\n >\r\n Remove\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Center - Preview */}\r\n <div className=\"designer-preview\">\r\n {/* Side tabs */}\r\n <div className=\"side-tabs\">\r\n <button\r\n className={`tab ${activeSide === 'front' ? 'active' : ''}`}\r\n onClick={() => setActiveSide('front')}\r\n >\r\n Front\r\n </button>\r\n {template.sides === 'double' && (\r\n <button\r\n className={`tab ${activeSide === 'back' ? 'active' : ''}`}\r\n onClick={() => setActiveSide('back')}\r\n >\r\n Back\r\n </button>\r\n )}\r\n <label className=\"grid-toggle\">\r\n <input\r\n type=\"checkbox\"\r\n checked={showGrid}\r\n onChange={(e) => setShowGrid(e.target.checked)}\r\n />\r\n Show Grid\r\n </label>\r\n </div>\r\n\r\n {/* Preview container */}\r\n <div\r\n ref={previewContainerRef}\r\n className=\"preview-wrapper\"\r\n onMouseDown={handleMouseDown}\r\n >\r\n <IDCardPreview\r\n template={template}\r\n data={sampleData}\r\n side={activeSide}\r\n showGrid={showGrid}\r\n onFieldSelect={handleFieldSelect}\r\n selectedFieldId={selectedFieldId}\r\n editable={true}\r\n />\r\n </div>\r\n\r\n {/* Field list */}\r\n <div className=\"fields-list\">\r\n <h4>Fields on {activeSide} side:</h4>\r\n {template.fields\r\n .filter((f) => f.side === activeSide)\r\n .map((field) => (\r\n <div\r\n key={field.id}\r\n className={`field-item ${field.id === selectedFieldId ? 'selected' : ''}`}\r\n onClick={() => setSelectedFieldId(field.id)}\r\n >\r\n <span className=\"field-type-icon\">\r\n {defaultFieldTypes.find((t) => t.type === field.type)?.icon}\r\n </span>\r\n <span className=\"field-key\">{field.fieldKey}</span>\r\n <button\r\n className=\"delete-btn\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n removeField(field.id);\r\n if (field.id === selectedFieldId) setSelectedFieldId(null);\r\n }}\r\n >\r\n ×\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Right Sidebar - Field Properties */}\r\n <div className=\"designer-sidebar right-sidebar\">\r\n <h3>Field Properties</h3>\r\n {selectedField ? (\r\n <div className=\"field-properties\">\r\n <div className=\"property-group\">\r\n <label>Field Key</label>\r\n <input\r\n type=\"text\"\r\n value={selectedField.fieldKey}\r\n onChange={(e) => handleFieldPropertyUpdate('fieldKey', e.target.value)}\r\n />\r\n </div>\r\n\r\n {selectedField.type !== 'label' && (\r\n <div className=\"property-group\">\r\n <label>Label</label>\r\n <input\r\n type=\"text\"\r\n value={selectedField.label || ''}\r\n onChange={(e) => handleFieldPropertyUpdate('label', e.target.value)}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Vertical Align for text fields */}\r\n {selectedField.type === 'text' && (\r\n <>\r\n <div style={{ border: '1px solid #eee', borderRadius: 4, marginBottom: 12, padding: 8 }}>\r\n <strong style={{ fontSize: '1em', display: 'block', marginBottom: 6 }}>Label Style</strong>\r\n <div className=\"property-group\">\r\n <label>Label Position</label>\r\n <select\r\n value={selectedField.style?.labelPosition || 'top'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.labelPosition', e.target.value)}\r\n >\r\n <option value=\"top\">Top</option>\r\n <option value=\"left\">Left (Side)</option>\r\n </select>\r\n </div>\r\n <div className=\"property-group\">\r\n <label>Label Vertical Align</label>\r\n <select\r\n value={selectedField.style?.labelVerticalAlign || 'top'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.labelVerticalAlign', e.target.value)}\r\n >\r\n <option value=\"top\">Top</option>\r\n <option value=\"middle\">Middle</option>\r\n <option value=\"bottom\">Bottom</option>\r\n </select>\r\n </div>\r\n <div className=\"property-group\">\r\n <label>Label Font Size</label>\r\n <input\r\n type=\"text\"\r\n value={selectedField.style?.labelFontSize || '0.75em'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.labelFontSize', e.target.value)}\r\n />\r\n </div>\r\n <div className=\"property-group\">\r\n <label>Label Font Weight</label>\r\n <select\r\n value={selectedField.style?.labelFontWeight || 'normal'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.labelFontWeight', e.target.value)}\r\n >\r\n <option value=\"normal\">Normal</option>\r\n <option value=\"bold\">Bold</option>\r\n <option value=\"100\">100</option>\r\n <option value=\"200\">200</option>\r\n <option value=\"300\">300</option>\r\n <option value=\"400\">400</option>\r\n <option value=\"500\">500</option>\r\n <option value=\"600\">600</option>\r\n <option value=\"700\">700</option>\r\n <option value=\"800\">800</option>\r\n <option value=\"900\">900</option>\r\n </select>\r\n </div>\r\n <div className=\"property-group\">\r\n <label>Label Color</label>\r\n <input\r\n type=\"color\"\r\n value={selectedField.style?.labelColor || '#666666'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.labelColor', e.target.value)}\r\n />\r\n </div>\r\n </div>\r\n <div style={{ border: '1px solid #eee', borderRadius: 4, marginBottom: 12, padding: 8 }}>\r\n <strong style={{ fontSize: '1em', display: 'block', marginBottom: 6 }}>Text Style</strong>\r\n <div className=\"property-group\">\r\n <label>Font Size</label>\r\n <input\r\n type=\"text\"\r\n value={selectedField.style?.fontSize || '12px'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.fontSize', e.target.value)}\r\n />\r\n </div>\r\n <div className=\"property-group\">\r\n <label>Font Weight</label>\r\n <select\r\n value={selectedField.style?.fontWeight || 'normal'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.fontWeight', e.target.value)}\r\n >\r\n <option value=\"normal\">Normal</option>\r\n <option value=\"bold\">Bold</option>\r\n <option value=\"100\">100</option>\r\n <option value=\"200\">200</option>\r\n <option value=\"300\">300</option>\r\n <option value=\"400\">400</option>\r\n <option value=\"500\">500</option>\r\n <option value=\"600\">600</option>\r\n <option value=\"700\">700</option>\r\n <option value=\"800\">800</option>\r\n <option value=\"900\">900</option>\r\n </select>\r\n </div>\r\n <div className=\"property-group\">\r\n <label>Text Color</label>\r\n <input\r\n type=\"color\"\r\n value={selectedField.style?.color || '#000000'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.color', e.target.value)}\r\n />\r\n </div>\r\n <div className=\"property-group\">\r\n <label>Text Align</label>\r\n <select\r\n value={selectedField.style?.textAlign || 'left'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.textAlign', e.target.value)}\r\n >\r\n <option value=\"left\">Left</option>\r\n <option value=\"center\">Center</option>\r\n <option value=\"right\">Right</option>\r\n </select>\r\n </div>\r\n <div className=\"property-group\">\r\n <label>Text Transform</label>\r\n <select\r\n value={selectedField.style?.textTransform || 'none'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.textTransform', e.target.value)}\r\n >\r\n <option value=\"none\">None</option>\r\n <option value=\"uppercase\">UPPERCASE</option>\r\n <option value=\"lowercase\">lowercase</option>\r\n <option value=\"capitalize\">Capitalize</option>\r\n </select>\r\n </div>\r\n <div className=\"property-group\">\r\n <label>Vertical Align</label>\r\n <select\r\n value={selectedField.style?.verticalAlign || 'top'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.verticalAlign', e.target.value)}\r\n >\r\n <option value=\"top\">Top</option>\r\n <option value=\"middle\">Middle</option>\r\n <option value=\"bottom\">Bottom</option>\r\n </select>\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n\r\n {selectedField.type === 'label' && (\r\n <div className=\"property-group\">\r\n <label>Static Text</label>\r\n <input\r\n type=\"text\"\r\n value={selectedField.staticText || ''}\r\n onChange={(e) => handleFieldPropertyUpdate('staticText', e.target.value)}\r\n />\r\n </div>\r\n )}\r\n\r\n {selectedField.type === 'qrcode' && (\r\n <div className=\"property-group\">\r\n <label>QR Code Data Fields</label>\r\n <small className=\"hint\">Select which fields to encode in the QR code:</small>\r\n <div style={{ marginTop: '8px', maxHeight: '150px', overflowY: 'auto', border: '1px solid #ddd', borderRadius: '4px', padding: '8px' }}>\r\n {template.fields\r\n .filter(f => f.type !== 'qrcode' && f.type !== 'label')\r\n .map((field) => (\r\n <label key={field.fieldKey} style={{ display: 'block', marginBottom: '6px', cursor: 'pointer' }}>\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedField.qrFields?.includes(field.fieldKey) || false}\r\n onChange={(e) => {\r\n const currentFields = selectedField.qrFields || [];\r\n const newFields = e.target.checked\r\n ? [...currentFields, field.fieldKey]\r\n : currentFields.filter(f => f !== field.fieldKey);\r\n handleFieldPropertyUpdate('qrFields', newFields);\r\n }}\r\n style={{ marginRight: '6px' }}\r\n />\r\n {field.label || field.fieldKey}\r\n </label>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Border Radius for image fields */}\r\n {selectedField.type === 'image' && (\r\n <div className=\"property-group\">\r\n <label>Border Radius</label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"e.g. 50% or 8px\"\r\n value={selectedField.style?.borderRadius || ''}\r\n onChange={(e) => handleFieldPropertyUpdate('style.borderRadius', e.target.value)}\r\n />\r\n <small className=\"hint\">Use <b>50%</b> for a circle, <b>8px</b> for rounded corners, etc.</small>\r\n </div>\r\n )}\r\n\r\n {/* Only show these style controls for non-text fields */}\r\n {selectedField.type !== 'text' && <>\r\n <h4>Style</h4>\r\n <div className=\"property-group\">\r\n <label>Font Size</label>\r\n <input\r\n type=\"text\"\r\n value={selectedField.style?.fontSize || '12px'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.fontSize', e.target.value)}\r\n />\r\n </div>\r\n <div className=\"property-group\">\r\n <label>Font Weight</label>\r\n <select\r\n value={selectedField.style?.fontWeight || 'normal'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.fontWeight', e.target.value)}\r\n >\r\n <option value=\"normal\">Normal</option>\r\n <option value=\"bold\">Bold</option>\r\n <option value=\"100\">100</option>\r\n <option value=\"200\">200</option>\r\n <option value=\"300\">300</option>\r\n <option value=\"400\">400</option>\r\n <option value=\"500\">500</option>\r\n <option value=\"600\">600</option>\r\n <option value=\"700\">700</option>\r\n <option value=\"800\">800</option>\r\n <option value=\"900\">900</option>\r\n </select>\r\n </div>\r\n <div className=\"property-group\">\r\n <label>Text Color</label>\r\n <input\r\n type=\"color\"\r\n value={selectedField.style?.color || '#000000'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.color', e.target.value)}\r\n />\r\n </div>\r\n <div className=\"property-group\">\r\n <label>Text Align</label>\r\n <select\r\n value={selectedField.style?.textAlign || 'left'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.textAlign', e.target.value)}\r\n >\r\n <option value=\"left\">Left</option>\r\n <option value=\"center\">Center</option>\r\n <option value=\"right\">Right</option>\r\n </select>\r\n </div>\r\n <div className=\"property-group\">\r\n <label>Text Transform</label>\r\n <select\r\n value={selectedField.style?.textTransform || 'none'}\r\n onChange={(e) => handleFieldPropertyUpdate('style.textTransform', e.target.value)}\r\n >\r\n <option value=\"none\">None</option>\r\n <option value=\"uppercase\">UPPERCASE</option>\r\n <option value=\"lowercase\">lowercase</option>\r\n <option value=\"capitalize\">Capitalize</option>\r\n </select>\r\n </div>\r\n </>}\r\n <div className=\"property-group\">\r\n <label>Background Color</label>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\r\n <input\r\n type=\"checkbox\"\r\n id=\"transparent-bg-checkbox\"\r\n checked={selectedField.style?.backgroundColor === 'transparent'}\r\n onChange={e => handleFieldPropertyUpdate('style.backgroundColor', e.target.checked ? 'transparent' : '#ffffff')}\r\n />\r\n <label htmlFor=\"transparent-bg-checkbox\" style={{ margin: 0, fontWeight: 400, fontSize: '0.95em' }}>Transparent</label>\r\n {selectedField.style?.backgroundColor !== 'transparent' && (\r\n <input\r\n type=\"color\"\r\n value={selectedField.style?.backgroundColor || '#ffffff'}\r\n onChange={e => handleFieldPropertyUpdate('style.backgroundColor', e.target.value)}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"property-group\">\r\n <label>Side</label>\r\n <select\r\n value={selectedField.side}\r\n onChange={(e) =>\r\n handleFieldPropertyUpdate('side', e.target.value as 'front' | 'back')\r\n }\r\n >\r\n <option value=\"front\">Front</option>\r\n {template.sides === 'double' && <option value=\"back\">Back</option>}\r\n </select>\r\n </div>\r\n\r\n <button className=\"btn btn-danger\" onClick={handleDeleteField}>\r\n Delete Field\r\n </button>\r\n </div>\r\n ) : (\r\n <p className=\"no-selection\">Select a field to edit its properties</p>\r\n )}\r\n\r\n <h3>Sample Data</h3>\r\n <div className=\"sample-data\">\r\n <p className=\"hint\">Edit sample data to preview:</p>\r\n {Object.entries(sampleData).map(([key, value]) => (\r\n <div key={key} className=\"property-group\">\r\n <label>{key}</label>\r\n <input\r\n type=\"text\"\r\n value={String(value)}\r\n onChange={(e) =>\r\n setSampleData((prev) => ({ ...prev, [key]: e.target.value }))\r\n }\r\n />\r\n </div>\r\n ))}\r\n <button\r\n className=\"btn btn-outline btn-sm\"\r\n onClick={() =>\r\n setSampleData((prev) => ({ ...prev, [`custom_${Date.now()}`]: '' }))\r\n }\r\n >\r\n + Add Field\r\n </button>\r\n </div>\r\n\r\n {/* Validation errors */}\r\n {validationErrors.length > 0 && (\r\n <div className=\"validation-errors\">\r\n <h4>⚠️ Validation Issues</h4>\r\n <ul>\r\n {validationErrors.map((error, index) => (\r\n <li key={index}>{error}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n\r\n"],"names":["useIDCardTemplate","useState","useRef","useCallback","generateId","imageFileToBase64","useEffect","deepCleanUndefined","_jsxs","_jsx","IDCardPreview","_Fragment"],"mappings":"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"}
@@ -54,6 +54,17 @@ const IDCardPreview = ({ template, data, side, scale = 1, showGrid = false, onFi
54
54
  const posStyle = styleUtils.positionToStyle(field.position);
55
55
  const fieldStyle = styleUtils.fieldStyleToCSS(field.style);
56
56
  const isSelected = field.id === selectedFieldId;
57
+ // Determine vertical alignment and label position for text fields
58
+ let verticalJustify = 'flex-start';
59
+ let flexDirection = 'column';
60
+ if (field.type === 'text') {
61
+ if (field.style?.verticalAlign === 'middle')
62
+ verticalJustify = 'center';
63
+ else if (field.style?.verticalAlign === 'bottom')
64
+ verticalJustify = 'flex-end';
65
+ if (field.style?.labelPosition === 'left')
66
+ flexDirection = 'row';
67
+ }
57
68
  const combinedStyle = {
58
69
  ...posStyle,
59
70
  ...fieldStyle,
@@ -63,6 +74,9 @@ const IDCardPreview = ({ template, data, side, scale = 1, showGrid = false, onFi
63
74
  cursor: editable ? 'move' : 'default',
64
75
  outline: isSelected ? '2px solid #2196F3' : 'none',
65
76
  outlineOffset: '1px',
77
+ display: field.type === 'text' ? 'flex' : undefined,
78
+ flexDirection: field.type === 'text' ? flexDirection : undefined,
79
+ justifyContent: field.type === 'text' ? verticalJustify : undefined,
66
80
  };
67
81
  const handleClick = (e) => {
68
82
  e.stopPropagation();
@@ -71,8 +85,21 @@ const IDCardPreview = ({ template, data, side, scale = 1, showGrid = false, onFi
71
85
  const value = data[field.fieldKey];
72
86
  const content = (() => {
73
87
  switch (field.type) {
74
- case 'text':
75
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [field.label && (jsxRuntime.jsx("span", { style: { fontSize: '0.75em', display: 'block', opacity: 0.7 }, children: field.label })), jsxRuntime.jsx("span", { children: String(value || field.placeholder || field.fieldKey) })] }));
88
+ case 'text': {
89
+ // Determine label vertical alignment
90
+ let labelAlignSelf = 'flex-start';
91
+ if (field.style?.labelVerticalAlign === 'middle')
92
+ labelAlignSelf = 'center';
93
+ else if (field.style?.labelVerticalAlign === 'bottom')
94
+ labelAlignSelf = 'flex-end';
95
+ const labelFontSize = field.style?.labelFontSize || '0.75em';
96
+ const labelFontWeight = field.style?.labelFontWeight || 'normal';
97
+ const labelColor = field.style?.labelColor || '#666666';
98
+ const labelStyle = field.style?.labelPosition === 'left'
99
+ ? { fontSize: labelFontSize, fontWeight: labelFontWeight, color: labelColor, opacity: 0.7, marginRight: 8, alignSelf: labelAlignSelf, whiteSpace: 'nowrap' }
100
+ : { fontSize: labelFontSize, fontWeight: labelFontWeight, color: labelColor, display: 'block', opacity: 0.7, alignSelf: labelAlignSelf };
101
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [field.label && (jsxRuntime.jsx("span", { style: labelStyle, children: field.label })), jsxRuntime.jsx("span", { children: String(value || field.placeholder || field.fieldKey) })] }));
102
+ }
76
103
  case 'label':
77
104
  return jsxRuntime.jsx("span", { children: field.staticText || field.label || 'Label' });
78
105
  case 'image':
@@ -1 +1 @@
1
- {"version":3,"file":"IDCardPreview.js","sources":["../../../src/components/IDCardPreview.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\r\nimport type { IDCardPreviewProps, FieldMapping } from '../types';\r\nimport { fieldStyleToCSS, positionToStyle } from '../utils/styleUtils';\r\nimport { generateQrCodeFromFields } from '../core/qrUtils';\r\n\r\n/**\r\n * IDCardPreview - Interactive card preview component\r\n * \r\n * Renders an ID card with:\r\n * - Field selection and highlighting\r\n * - Resize handles for selected fields\r\n * - Grid overlay for alignment\r\n * - Dynamic field rendering based on type\r\n * \r\n * Used inside the designer for visual editing\r\n */\r\nexport const IDCardPreview: React.FC<IDCardPreviewProps> = ({\r\n template,\r\n data,\r\n side,\r\n scale = 1,\r\n showGrid = false,\r\n onFieldSelect,\r\n selectedFieldId,\r\n editable = true,\r\n onFieldUpdate,\r\n}: IDCardPreviewProps) => {\r\n // Get only fields that belong to the current side\r\n const fieldsToRender = useMemo(() => {\r\n return template.fields.filter((field: FieldMapping) => field.side === side);\r\n }, [template.fields, side]);\r\n\r\n // Get background for current side\r\n const backgroundImage = side === 'front' ? template.backgrounds.front : template.backgrounds.back;\r\n\r\n // Render resize handles for selected field\r\n const renderResizeHandles = (field: FieldMapping) => {\r\n if (field.id !== selectedFieldId || !editable) return null;\r\n\r\n const handles = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\r\n const handleStyle: React.CSSProperties = {\r\n position: 'absolute',\r\n width: '8px',\r\n height: '8px',\r\n backgroundColor: '#2196F3',\r\n border: '1px solid #fff',\r\n borderRadius: '2px',\r\n zIndex: 1000,\r\n };\r\n\r\n const positions: Record<string, React.CSSProperties> = {\r\n n: { top: '-4px', left: '50%', transform: 'translateX(-50%)', cursor: 'n-resize' },\r\n s: { bottom: '-4px', left: '50%', transform: 'translateX(-50%)', cursor: 's-resize' },\r\n e: { right: '-4px', top: '50%', transform: 'translateY(-50%)', cursor: 'e-resize' },\r\n w: { left: '-4px', top: '50%', transform: 'translateY(-50%)', cursor: 'w-resize' },\r\n ne: { top: '-4px', right: '-4px', cursor: 'ne-resize' },\r\n nw: { top: '-4px', left: '-4px', cursor: 'nw-resize' },\r\n se: { bottom: '-4px', right: '-4px', cursor: 'se-resize' },\r\n sw: { bottom: '-4px', left: '-4px', cursor: 'sw-resize' },\r\n };\r\n\r\n return handles.map((handle) => (\r\n <div\r\n key={handle}\r\n className={`resize-handle resize-handle-${handle}`}\r\n style={{ ...handleStyle, ...positions[handle] }}\r\n data-handle={handle}\r\n />\r\n ));\r\n };\r\n\r\n // Render a single field\r\n const renderField = (field: FieldMapping) => {\r\n const posStyle = positionToStyle(field.position);\r\n const fieldStyle = fieldStyleToCSS(field.style);\r\n const isSelected = field.id === selectedFieldId;\r\n\r\n const combinedStyle: React.CSSProperties = {\r\n ...posStyle,\r\n ...fieldStyle,\r\n zIndex: field.zIndex || 1,\r\n boxSizing: 'border-box',\r\n overflow: 'hidden',\r\n cursor: editable ? 'move' : 'default',\r\n outline: isSelected ? '2px solid #2196F3' : 'none',\r\n outlineOffset: '1px',\r\n };\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n onFieldSelect?.(field);\r\n };\r\n\r\n const value = data[field.fieldKey];\r\n\r\n const content = (() => {\r\n switch (field.type) {\r\n case 'text':\r\n return (\r\n <>\r\n {field.label && (\r\n <span style={{ fontSize: '0.75em', display: 'block', opacity: 0.7 }}>\r\n {field.label}\r\n </span>\r\n )}\r\n <span>{String(value || field.placeholder || field.fieldKey)}</span>\r\n </>\r\n );\r\n\r\n case 'label':\r\n return <span>{field.staticText || field.label || 'Label'}</span>;\r\n\r\n case 'image':\r\n return value ? (\r\n <img\r\n src={String(value)}\r\n alt={field.label || 'Image'}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'cover',\r\n objectPosition: 'center top',\r\n }}\r\n />\r\n ) : (\r\n <div\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n backgroundColor: '#e0e0e0',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '10px',\r\n color: '#666',\r\n flexDirection: 'column',\r\n }}\r\n >\r\n <span>📷</span>\r\n <span>{field.label || 'Photo'}</span>\r\n </div>\r\n );\r\n\r\n case 'qrcode':\r\n const qrDataUrl = field.qrFields\r\n ? generateQrCodeFromFields(data, field.qrFields, 200)\r\n : '';\r\n\r\n return qrDataUrl ? (\r\n <img\r\n src={qrDataUrl}\r\n alt=\"QR Code\"\r\n style={{ width: '100%', height: '100%', objectFit: 'contain' }}\r\n />\r\n ) : (\r\n <div\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n backgroundColor: '#f0f0f0',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '10px',\r\n color: '#666',\r\n border: '1px dashed #ccc',\r\n }}\r\n >\r\n QR Code\r\n </div>\r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n })();\r\n\r\n return (\r\n <div\r\n key={field.id}\r\n id={`preview-${field.id}`}\r\n style={combinedStyle}\r\n onClick={handleClick}\r\n className={`preview-field preview-field-${field.type} ${isSelected ? 'selected' : ''}`}\r\n >\r\n {content}\r\n {renderResizeHandles(field)}\r\n </div>\r\n );\r\n };\r\n\r\n // Card container style\r\n const cardStyle: React.CSSProperties = {\r\n width: template.cardSize.width,\r\n height: template.cardSize.height,\r\n position: 'relative',\r\n overflow: 'hidden',\r\n backgroundColor: backgroundImage ? 'transparent' : '#f5f5f5',\r\n border: '1px solid #ddd',\r\n transform: `scale(${scale})`,\r\n transformOrigin: 'top left',\r\n };\r\n\r\n // Grid overlay style\r\n const gridStyle: React.CSSProperties = {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%',\r\n height: '100%',\r\n backgroundImage: showGrid\r\n ? 'linear-gradient(to right, rgba(0,0,0,0.05) 1px, transparent 1px), linear-gradient(to bottom, rgba(0,0,0,0.05) 1px, transparent 1px)'\r\n : 'none',\r\n backgroundSize: '10px 10px',\r\n pointerEvents: 'none',\r\n zIndex: 999,\r\n };\r\n\r\n const handleContainerClick = () => {\r\n onFieldSelect?.(null);\r\n };\r\n\r\n return (\r\n <div\r\n className=\"idcard-preview-container\"\r\n style={cardStyle}\r\n onClick={handleContainerClick}\r\n >\r\n {/* Background */}\r\n {backgroundImage && (\r\n <img\r\n src={backgroundImage}\r\n alt={`${side} background`}\r\n style={{\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'cover',\r\n zIndex: 0,\r\n pointerEvents: 'none',\r\n }}\r\n />\r\n )}\r\n\r\n {/* Fields */}\r\n {fieldsToRender.map(renderField)}\r\n\r\n {/* Grid overlay */}\r\n {showGrid && <div style={gridStyle} />}\r\n\r\n {/* Empty state */}\r\n {!backgroundImage && fieldsToRender.length === 0 && (\r\n <div\r\n style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n textAlign: 'center',\r\n color: '#999',\r\n fontSize: '14px',\r\n }}\r\n >\r\n <p>Upload a background image</p>\r\n <p>and add fields to get started</p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n"],"names":["useMemo","_jsx","positionToStyle","fieldStyleToCSS","_jsxs","generateQrCodeFromFields"],"mappings":";;;;;;;AAKA;;;;;;;;;;AAUG;AACI,MAAM,aAAa,GAAiC,CAAC,EAC1D,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,KAAK,GAAG,CAAC,EACT,QAAQ,GAAG,KAAK,EAChB,aAAa,EACb,eAAe,EACf,QAAQ,GAAG,IAAI,EACf,aAAa,GACM,KAAI;;AAEvB,IAAA,MAAM,cAAc,GAAGA,aAAO,CAAC,MAAK;AAClC,QAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAmB,KAAK,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;IAC7E,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;;IAG3B,MAAM,eAAe,GAAG,IAAI,KAAK,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI;;AAGjG,IAAA,MAAM,mBAAmB,GAAG,CAAC,KAAmB,KAAI;AAClD,QAAA,IAAI,KAAK,CAAC,EAAE,KAAK,eAAe,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI;AAE1D,QAAA,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AAC5D,QAAA,MAAM,WAAW,GAAwB;AACvC,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,eAAe,EAAE,SAAS;AAC1B,YAAA,MAAM,EAAE,gBAAgB;AACxB,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,MAAM,EAAE,IAAI;SACb;AAED,QAAA,MAAM,SAAS,GAAwC;AACrD,YAAA,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE;AAClF,YAAA,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE;AACrF,YAAA,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE;AACnF,YAAA,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE;AAClF,YAAA,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE;AACvD,YAAA,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE;AACtD,YAAA,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE;AAC1D,YAAA,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE;SAC1D;AAED,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,MACxBC,wBAEE,SAAS,EAAE,CAAA,4BAAA,EAA+B,MAAM,EAAE,EAClD,KAAK,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,EAAA,aAAA,EAClC,MAAM,EAAA,EAHd,MAAM,CAIX,CACH,CAAC;AACJ,IAAA,CAAC;;AAGD,IAAA,MAAM,WAAW,GAAG,CAAC,KAAmB,KAAI;QAC1C,MAAM,QAAQ,GAAGC,0BAAe,CAAC,KAAK,CAAC,QAAQ,CAAC;QAChD,MAAM,UAAU,GAAGC,0BAAe,CAAC,KAAK,CAAC,KAAK,CAAC;AAC/C,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,KAAK,eAAe;AAE/C,QAAA,MAAM,aAAa,GAAwB;AACzC,YAAA,GAAG,QAAQ;AACX,YAAA,GAAG,UAAU;AACb,YAAA,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC;AACzB,YAAA,SAAS,EAAE,YAAY;AACvB,YAAA,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS;YACrC,OAAO,EAAE,UAAU,GAAG,mBAAmB,GAAG,MAAM;AAClD,YAAA,aAAa,EAAE,KAAK;SACrB;AAED,QAAA,MAAM,WAAW,GAAG,CAAC,CAAmB,KAAI;YAC1C,CAAC,CAAC,eAAe,EAAE;AACnB,YAAA,aAAa,GAAG,KAAK,CAAC;AACxB,QAAA,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AAElC,QAAA,MAAM,OAAO,GAAG,CAAC,MAAK;AACpB,YAAA,QAAQ,KAAK,CAAC,IAAI;AAChB,gBAAA,KAAK,MAAM;oBACT,QACEC,kDACG,KAAK,CAAC,KAAK,KACVH,yBAAM,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,YAChE,KAAK,CAAC,KAAK,EAAA,CACP,CACR,EACDA,cAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAO,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAA,CAAQ,CAAA,EAAA,CAClE;AAGP,gBAAA,KAAK,OAAO;oBACV,OAAOA,cAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAO,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,IAAI,OAAO,EAAA,CAAQ;AAElE,gBAAA,KAAK,OAAO;oBACV,OAAO,KAAK,IACVA,cAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAClB,GAAG,EAAE,KAAK,CAAC,KAAK,IAAI,OAAO,EAC3B,KAAK,EAAE;AACL,4BAAA,KAAK,EAAE,MAAM;AACb,4BAAA,MAAM,EAAE,MAAM;AACd,4BAAA,SAAS,EAAE,OAAO;AAClB,4BAAA,cAAc,EAAE,YAAY;AAC7B,yBAAA,EAAA,CACD,KAEFG,eAAA,CAAA,KAAA,EAAA,EACE,KAAK,EAAE;AACL,4BAAA,KAAK,EAAE,MAAM;AACb,4BAAA,MAAM,EAAE,MAAM;AACd,4BAAA,eAAe,EAAE,SAAS;AAC1B,4BAAA,OAAO,EAAE,MAAM;AACf,4BAAA,UAAU,EAAE,QAAQ;AACpB,4BAAA,cAAc,EAAE,QAAQ;AACxB,4BAAA,QAAQ,EAAE,MAAM;AAChB,4BAAA,KAAK,EAAE,MAAM;AACb,4BAAA,aAAa,EAAE,QAAQ;yBACxB,EAAA,QAAA,EAAA,CAEDH,cAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,cAAA,EAAA,CAAe,EACfA,cAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAO,KAAK,CAAC,KAAK,IAAI,OAAO,EAAA,CAAQ,CAAA,EAAA,CACjC,CACP;AAEH,gBAAA,KAAK,QAAQ;AACX,oBAAA,MAAM,SAAS,GAAG,KAAK,CAAC;0BACpBI,gCAAwB,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG;0BAClD,EAAE;AAEN,oBAAA,OAAO,SAAS,IACdJ,wBACE,GAAG,EAAE,SAAS,EACd,GAAG,EAAC,SAAS,EACb,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAA,CAC9D,KAEFA,cAAA,CAAA,KAAA,EAAA,EACE,KAAK,EAAE;AACL,4BAAA,KAAK,EAAE,MAAM;AACb,4BAAA,MAAM,EAAE,MAAM;AACd,4BAAA,eAAe,EAAE,SAAS;AAC1B,4BAAA,OAAO,EAAE,MAAM;AACf,4BAAA,UAAU,EAAE,QAAQ;AACpB,4BAAA,cAAc,EAAE,QAAQ;AACxB,4BAAA,QAAQ,EAAE,MAAM;AAChB,4BAAA,KAAK,EAAE,MAAM;AACb,4BAAA,MAAM,EAAE,iBAAiB;AAC1B,yBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,CAGG,CACP;AAEH,gBAAA;AACE,oBAAA,OAAO,IAAI;;QAEjB,CAAC,GAAG;QAEJ,QACEG,yBAEE,EAAE,EAAE,WAAW,KAAK,CAAC,EAAE,CAAA,CAAE,EACzB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,CAAA,4BAAA,EAA+B,KAAK,CAAC,IAAI,IAAI,UAAU,GAAG,UAAU,GAAG,EAAE,CAAA,CAAE,EAAA,QAAA,EAAA,CAErF,OAAO,EACP,mBAAmB,CAAC,KAAK,CAAC,CAAA,EAAA,EAPtB,KAAK,CAAC,EAAE,CAQT;AAEV,IAAA,CAAC;;AAGD,IAAA,MAAM,SAAS,GAAwB;AACrC,QAAA,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK;AAC9B,QAAA,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM;AAChC,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,QAAQ,EAAE,QAAQ;QAClB,eAAe,EAAE,eAAe,GAAG,aAAa,GAAG,SAAS;AAC5D,QAAA,MAAM,EAAE,gBAAgB;QACxB,SAAS,EAAE,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA,CAAG;AAC5B,QAAA,eAAe,EAAE,UAAU;KAC5B;;AAGD,IAAA,MAAM,SAAS,GAAwB;AACrC,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,GAAG,EAAE,CAAC;AACN,QAAA,IAAI,EAAE,CAAC;AACP,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,eAAe,EAAE;AACf,cAAE;AACF,cAAE,MAAM;AACV,QAAA,cAAc,EAAE,WAAW;AAC3B,QAAA,aAAa,EAAE,MAAM;AACrB,QAAA,MAAM,EAAE,GAAG;KACZ;IAED,MAAM,oBAAoB,GAAG,MAAK;AAChC,QAAA,aAAa,GAAG,IAAI,CAAC;AACvB,IAAA,CAAC;AAED,IAAA,QACEA,eAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,0BAA0B,EACpC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,oBAAoB,EAAA,QAAA,EAAA,CAG5B,eAAe,KACdH,cAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,CAAA,EAAG,IAAI,CAAA,WAAA,CAAa,EACzB,KAAK,EAAE;AACL,oBAAA,QAAQ,EAAE,UAAU;AACpB,oBAAA,GAAG,EAAE,CAAC;AACN,oBAAA,IAAI,EAAE,CAAC;AACP,oBAAA,KAAK,EAAE,MAAM;AACb,oBAAA,MAAM,EAAE,MAAM;AACd,oBAAA,SAAS,EAAE,OAAO;AAClB,oBAAA,MAAM,EAAE,CAAC;AACT,oBAAA,aAAa,EAAE,MAAM;AACtB,iBAAA,EAAA,CACD,CACH,EAGA,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,EAG/B,QAAQ,IAAIA,cAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,SAAS,EAAA,CAAI,EAGrC,CAAC,eAAe,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,KAC9CG,eAAA,CAAA,KAAA,EAAA,EACE,KAAK,EAAE;AACL,oBAAA,QAAQ,EAAE,UAAU;AACpB,oBAAA,GAAG,EAAE,KAAK;AACV,oBAAA,IAAI,EAAE,KAAK;AACX,oBAAA,SAAS,EAAE,uBAAuB;AAClC,oBAAA,SAAS,EAAE,QAAQ;AACnB,oBAAA,KAAK,EAAE,MAAM;AACb,oBAAA,QAAQ,EAAE,MAAM;AACjB,iBAAA,EAAA,QAAA,EAAA,CAEDH,8DAAgC,EAChCA,cAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,CAAoC,IAChC,CACP,CAAA,EAAA,CACG;AAEV;;;;"}
1
+ {"version":3,"file":"IDCardPreview.js","sources":["../../../src/components/IDCardPreview.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\r\nimport type { IDCardPreviewProps, FieldMapping } from '../types';\r\nimport { fieldStyleToCSS, positionToStyle } from '../utils/styleUtils';\r\nimport { generateQrCodeFromFields } from '../core/qrUtils';\r\n\r\n/**\r\n * IDCardPreview - Interactive card preview component\r\n * \r\n * Renders an ID card with:\r\n * - Field selection and highlighting\r\n * - Resize handles for selected fields\r\n * - Grid overlay for alignment\r\n * - Dynamic field rendering based on type\r\n * \r\n * Used inside the designer for visual editing\r\n */\r\nexport const IDCardPreview: React.FC<IDCardPreviewProps> = ({\r\n template,\r\n data,\r\n side,\r\n scale = 1,\r\n showGrid = false,\r\n onFieldSelect,\r\n selectedFieldId,\r\n editable = true,\r\n onFieldUpdate,\r\n}: IDCardPreviewProps) => {\r\n // Get only fields that belong to the current side\r\n const fieldsToRender = useMemo(() => {\r\n return template.fields.filter((field: FieldMapping) => field.side === side);\r\n }, [template.fields, side]);\r\n\r\n // Get background for current side\r\n const backgroundImage = side === 'front' ? template.backgrounds.front : template.backgrounds.back;\r\n\r\n // Render resize handles for selected field\r\n const renderResizeHandles = (field: FieldMapping) => {\r\n if (field.id !== selectedFieldId || !editable) return null;\r\n\r\n const handles = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\r\n const handleStyle: React.CSSProperties = {\r\n position: 'absolute',\r\n width: '8px',\r\n height: '8px',\r\n backgroundColor: '#2196F3',\r\n border: '1px solid #fff',\r\n borderRadius: '2px',\r\n zIndex: 1000,\r\n };\r\n\r\n const positions: Record<string, React.CSSProperties> = {\r\n n: { top: '-4px', left: '50%', transform: 'translateX(-50%)', cursor: 'n-resize' },\r\n s: { bottom: '-4px', left: '50%', transform: 'translateX(-50%)', cursor: 's-resize' },\r\n e: { right: '-4px', top: '50%', transform: 'translateY(-50%)', cursor: 'e-resize' },\r\n w: { left: '-4px', top: '50%', transform: 'translateY(-50%)', cursor: 'w-resize' },\r\n ne: { top: '-4px', right: '-4px', cursor: 'ne-resize' },\r\n nw: { top: '-4px', left: '-4px', cursor: 'nw-resize' },\r\n se: { bottom: '-4px', right: '-4px', cursor: 'se-resize' },\r\n sw: { bottom: '-4px', left: '-4px', cursor: 'sw-resize' },\r\n };\r\n\r\n return handles.map((handle) => (\r\n <div\r\n key={handle}\r\n className={`resize-handle resize-handle-${handle}`}\r\n style={{ ...handleStyle, ...positions[handle] }}\r\n data-handle={handle}\r\n />\r\n ));\r\n };\r\n\r\n // Render a single field\r\n const renderField = (field: FieldMapping) => {\r\n const posStyle = positionToStyle(field.position);\r\n const fieldStyle = fieldStyleToCSS(field.style);\r\n const isSelected = field.id === selectedFieldId;\r\n\r\n // Determine vertical alignment and label position for text fields\r\n let verticalJustify: 'flex-start' | 'center' | 'flex-end' = 'flex-start';\r\n let flexDirection: 'column' | 'row' = 'column';\r\n if (field.type === 'text') {\r\n if (field.style?.verticalAlign === 'middle') verticalJustify = 'center';\r\n else if (field.style?.verticalAlign === 'bottom') verticalJustify = 'flex-end';\r\n if (field.style?.labelPosition === 'left') flexDirection = 'row';\r\n }\r\n\r\n const combinedStyle: React.CSSProperties = {\r\n ...posStyle,\r\n ...fieldStyle,\r\n zIndex: field.zIndex || 1,\r\n boxSizing: 'border-box',\r\n overflow: 'hidden',\r\n cursor: editable ? 'move' : 'default',\r\n outline: isSelected ? '2px solid #2196F3' : 'none',\r\n outlineOffset: '1px',\r\n display: field.type === 'text' ? 'flex' : undefined,\r\n flexDirection: field.type === 'text' ? flexDirection : undefined,\r\n justifyContent: field.type === 'text' ? verticalJustify : undefined,\r\n };\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n onFieldSelect?.(field);\r\n };\r\n\r\n const value = data[field.fieldKey];\r\n\r\n const content = (() => {\r\n switch (field.type) {\r\n case 'text': {\r\n // Determine label vertical alignment\r\n let labelAlignSelf: React.CSSProperties['alignSelf'] = 'flex-start';\r\n if (field.style?.labelVerticalAlign === 'middle') labelAlignSelf = 'center';\r\n else if (field.style?.labelVerticalAlign === 'bottom') labelAlignSelf = 'flex-end';\r\n const labelFontSize = field.style?.labelFontSize || '0.75em';\r\n const labelFontWeight = field.style?.labelFontWeight || 'normal';\r\n const labelColor = field.style?.labelColor || '#666666';\r\n const labelStyle: React.CSSProperties = field.style?.labelPosition === 'left'\r\n ? { fontSize: labelFontSize, fontWeight: labelFontWeight, color: labelColor, opacity: 0.7, marginRight: 8, alignSelf: labelAlignSelf, whiteSpace: 'nowrap' }\r\n : { fontSize: labelFontSize, fontWeight: labelFontWeight, color: labelColor, display: 'block', opacity: 0.7, alignSelf: labelAlignSelf };\r\n return (\r\n <>\r\n {field.label && (\r\n <span style={labelStyle}>\r\n {field.label}\r\n </span>\r\n )}\r\n <span>{String(value || field.placeholder || field.fieldKey)}</span>\r\n </>\r\n );\r\n }\r\n\r\n case 'label':\r\n return <span>{field.staticText || field.label || 'Label'}</span>;\r\n\r\n case 'image':\r\n return value ? (\r\n <img\r\n src={String(value)}\r\n alt={field.label || 'Image'}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'cover',\r\n objectPosition: 'center top',\r\n }}\r\n />\r\n ) : (\r\n <div\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n backgroundColor: '#e0e0e0',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '10px',\r\n color: '#666',\r\n flexDirection: 'column',\r\n }}\r\n >\r\n <span>📷</span>\r\n <span>{field.label || 'Photo'}</span>\r\n </div>\r\n );\r\n\r\n case 'qrcode':\r\n const qrDataUrl = field.qrFields\r\n ? generateQrCodeFromFields(data, field.qrFields, 200)\r\n : '';\r\n\r\n return qrDataUrl ? (\r\n <img\r\n src={qrDataUrl}\r\n alt=\"QR Code\"\r\n style={{ width: '100%', height: '100%', objectFit: 'contain' }}\r\n />\r\n ) : (\r\n <div\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n backgroundColor: '#f0f0f0',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '10px',\r\n color: '#666',\r\n border: '1px dashed #ccc',\r\n }}\r\n >\r\n QR Code\r\n </div>\r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n })();\r\n\r\n return (\r\n <div\r\n key={field.id}\r\n id={`preview-${field.id}`}\r\n style={combinedStyle}\r\n onClick={handleClick}\r\n className={`preview-field preview-field-${field.type} ${isSelected ? 'selected' : ''}`}\r\n >\r\n {content}\r\n {renderResizeHandles(field)}\r\n </div>\r\n );\r\n };\r\n\r\n // Card container style\r\n const cardStyle: React.CSSProperties = {\r\n width: template.cardSize.width,\r\n height: template.cardSize.height,\r\n position: 'relative',\r\n overflow: 'hidden',\r\n backgroundColor: backgroundImage ? 'transparent' : '#f5f5f5',\r\n border: '1px solid #ddd',\r\n transform: `scale(${scale})`,\r\n transformOrigin: 'top left',\r\n };\r\n\r\n // Grid overlay style\r\n const gridStyle: React.CSSProperties = {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%',\r\n height: '100%',\r\n backgroundImage: showGrid\r\n ? 'linear-gradient(to right, rgba(0,0,0,0.05) 1px, transparent 1px), linear-gradient(to bottom, rgba(0,0,0,0.05) 1px, transparent 1px)'\r\n : 'none',\r\n backgroundSize: '10px 10px',\r\n pointerEvents: 'none',\r\n zIndex: 999,\r\n };\r\n\r\n const handleContainerClick = () => {\r\n onFieldSelect?.(null);\r\n };\r\n\r\n return (\r\n <div\r\n className=\"idcard-preview-container\"\r\n style={cardStyle}\r\n onClick={handleContainerClick}\r\n >\r\n {/* Background */}\r\n {backgroundImage && (\r\n <img\r\n src={backgroundImage}\r\n alt={`${side} background`}\r\n style={{\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'cover',\r\n zIndex: 0,\r\n pointerEvents: 'none',\r\n }}\r\n />\r\n )}\r\n\r\n {/* Fields */}\r\n {fieldsToRender.map(renderField)}\r\n\r\n {/* Grid overlay */}\r\n {showGrid && <div style={gridStyle} />}\r\n\r\n {/* Empty state */}\r\n {!backgroundImage && fieldsToRender.length === 0 && (\r\n <div\r\n style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n textAlign: 'center',\r\n color: '#999',\r\n fontSize: '14px',\r\n }}\r\n >\r\n <p>Upload a background image</p>\r\n <p>and add fields to get started</p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n"],"names":["useMemo","_jsx","positionToStyle","fieldStyleToCSS","_jsxs","_Fragment","generateQrCodeFromFields"],"mappings":"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"}
@@ -27,7 +27,7 @@ function toReactStyle(styleObj) {
27
27
  function fieldStyleToCSS(style) {
28
28
  if (!style)
29
29
  return {};
30
- const css = {
30
+ return {
31
31
  fontSize: style.fontSize,
32
32
  fontWeight: style.fontWeight,
33
33
  fontFamily: style.fontFamily,
@@ -40,24 +40,8 @@ function fieldStyleToCSS(style) {
40
40
  border: style.border,
41
41
  lineHeight: style.lineHeight,
42
42
  letterSpacing: style.letterSpacing,
43
+ // verticalAlign is handled in the preview component for flex
43
44
  };
44
- // Add vertical alignment for text fields
45
- if (style.verticalAlign) {
46
- if (style.verticalAlign === 'top') {
47
- css.display = 'flex';
48
- css.alignItems = 'flex-start';
49
- }
50
- else if (style.verticalAlign === 'middle') {
51
- css.display = 'flex';
52
- css.alignItems = 'center';
53
- }
54
- else if (style.verticalAlign === 'bottom') {
55
- css.display = 'flex';
56
- css.alignItems = 'flex-end';
57
- }
58
- css.height = '100%';
59
- }
60
- return css;
61
45
  }
62
46
  /**
63
47
  * Merge multiple style objects