react-id-card-generator 1.0.17 → 1.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/IDCardDesigner.js +19 -44
- package/dist/cjs/components/IDCardDesigner.js.map +1 -1
- package/dist/cjs/components/IDCardGenerator.js +18 -9
- package/dist/cjs/components/IDCardGenerator.js.map +1 -1
- package/dist/cjs/components/IDCardPreview.js +18 -10
- package/dist/cjs/components/IDCardPreview.js.map +1 -1
- package/dist/cjs/core/exportUtils.js +17 -20
- package/dist/cjs/core/exportUtils.js.map +1 -1
- package/dist/cjs/core/qrUtils.js +76 -12
- package/dist/cjs/core/qrUtils.js.map +1 -1
- package/dist/cjs/utils/styleUtils.js +1 -1
- package/dist/cjs/utils/styleUtils.js.map +1 -1
- package/dist/esm/components/IDCardDesigner.js +19 -44
- package/dist/esm/components/IDCardDesigner.js.map +1 -1
- package/dist/esm/components/IDCardGenerator.js +19 -10
- package/dist/esm/components/IDCardGenerator.js.map +1 -1
- package/dist/esm/components/IDCardPreview.js +19 -11
- package/dist/esm/components/IDCardPreview.js.map +1 -1
- package/dist/esm/core/exportUtils.js +18 -21
- package/dist/esm/core/exportUtils.js.map +1 -1
- package/dist/esm/core/qrUtils.js +75 -13
- package/dist/esm/core/qrUtils.js.map +1 -1
- package/dist/esm/utils/styleUtils.js +1 -1
- package/dist/esm/utils/styleUtils.js.map +1 -1
- package/dist/types/core/qrUtils.d.ts +2 -0
- package/package.json +4 -4
- package/dist/cjs/_virtual/index.js +0 -6
- package/dist/cjs/_virtual/index.js.map +0 -1
- package/dist/cjs/_virtual/make-built-in.js +0 -6
- package/dist/cjs/_virtual/make-built-in.js.map +0 -1
- package/dist/cjs/_virtual/new-promise-capability.js +0 -6
- package/dist/cjs/_virtual/new-promise-capability.js.map +0 -1
- package/dist/cjs/_virtual/object-define-properties.js +0 -6
- package/dist/cjs/_virtual/object-define-properties.js.map +0 -1
- package/dist/cjs/_virtual/object-define-property.js +0 -6
- package/dist/cjs/_virtual/object-define-property.js.map +0 -1
- package/dist/cjs/_virtual/object-get-own-property-descriptor.js +0 -6
- package/dist/cjs/_virtual/object-get-own-property-descriptor.js.map +0 -1
- package/dist/cjs/_virtual/object-get-own-property-names.js +0 -6
- package/dist/cjs/_virtual/object-get-own-property-names.js.map +0 -1
- package/dist/cjs/_virtual/object-get-own-property-symbols.js +0 -6
- package/dist/cjs/_virtual/object-get-own-property-symbols.js.map +0 -1
- package/dist/cjs/_virtual/object-property-is-enumerable.js +0 -6
- package/dist/cjs/_virtual/object-property-is-enumerable.js.map +0 -1
- package/dist/cjs/_virtual/performance-now.js +0 -6
- package/dist/cjs/_virtual/performance-now.js.map +0 -1
- package/dist/cjs/_virtual/shared-store.js +0 -6
- package/dist/cjs/_virtual/shared-store.js.map +0 -1
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js +0 -30
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js.map +0 -1
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/defineProperty.js +0 -15
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/defineProperty.js.map +0 -1
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +0 -17
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/toPrimitive.js.map +0 -1
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +0 -12
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js.map +0 -1
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/typeof.js +0 -14
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/typeof.js.map +0 -1
- package/dist/cjs/node_modules/canvg/lib/index.es.js +0 -6645
- package/dist/cjs/node_modules/canvg/lib/index.es.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/a-callable.js +0 -18
- package/dist/cjs/node_modules/core-js/internals/a-callable.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/a-constructor.js +0 -18
- package/dist/cjs/node_modules/core-js/internals/a-constructor.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/a-possible-prototype.js +0 -16
- package/dist/cjs/node_modules/core-js/internals/a-possible-prototype.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/add-to-unscopables.js +0 -30
- package/dist/cjs/node_modules/core-js/internals/add-to-unscopables.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/advance-string-index.js +0 -14
- package/dist/cjs/node_modules/core-js/internals/advance-string-index.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/an-instance.js +0 -15
- package/dist/cjs/node_modules/core-js/internals/an-instance.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/an-object.js +0 -17
- package/dist/cjs/node_modules/core-js/internals/an-object.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/array-includes.js +0 -39
- package/dist/cjs/node_modules/core-js/internals/array-includes.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/array-method-is-strict.js +0 -16
- package/dist/cjs/node_modules/core-js/internals/array-method-is-strict.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/array-reduce.js +0 -51
- package/dist/cjs/node_modules/core-js/internals/array-reduce.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/array-slice.js +0 -10
- package/dist/cjs/node_modules/core-js/internals/array-slice.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/check-correctness-of-iteration.js +0 -49
- package/dist/cjs/node_modules/core-js/internals/check-correctness-of-iteration.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/classof-raw.js +0 -15
- package/dist/cjs/node_modules/core-js/internals/classof-raw.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/classof.js +0 -39
- package/dist/cjs/node_modules/core-js/internals/classof.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/copy-constructor-properties.js +0 -28
- package/dist/cjs/node_modules/core-js/internals/copy-constructor-properties.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/correct-is-regexp-logic.js +0 -22
- package/dist/cjs/node_modules/core-js/internals/correct-is-regexp-logic.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/correct-prototype-getter.js +0 -15
- package/dist/cjs/node_modules/core-js/internals/correct-prototype-getter.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/create-iter-result-object.js +0 -10
- package/dist/cjs/node_modules/core-js/internals/create-iter-result-object.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/create-non-enumerable-property.js +0 -20
- package/dist/cjs/node_modules/core-js/internals/create-non-enumerable-property.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/create-property-descriptor.js +0 -13
- package/dist/cjs/node_modules/core-js/internals/create-property-descriptor.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/define-built-in-accessor.js +0 -17
- package/dist/cjs/node_modules/core-js/internals/define-built-in-accessor.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/define-built-in.js +0 -38
- package/dist/cjs/node_modules/core-js/internals/define-built-in.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/define-global-property.js +0 -19
- package/dist/cjs/node_modules/core-js/internals/define-global-property.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/descriptors.js +0 -14
- package/dist/cjs/node_modules/core-js/internals/descriptors.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/document-create-element.js +0 -18
- package/dist/cjs/node_modules/core-js/internals/document-create-element.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/dom-iterables.js +0 -40
- package/dist/cjs/node_modules/core-js/internals/dom-iterables.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/dom-token-list-prototype.js +0 -14
- package/dist/cjs/node_modules/core-js/internals/dom-token-list-prototype.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/enum-bug-keys.js +0 -15
- package/dist/cjs/node_modules/core-js/internals/enum-bug-keys.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/environment-is-ios-pebble.js +0 -10
- package/dist/cjs/node_modules/core-js/internals/environment-is-ios-pebble.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/environment-is-ios.js +0 -11
- package/dist/cjs/node_modules/core-js/internals/environment-is-ios.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/environment-is-node.js +0 -10
- package/dist/cjs/node_modules/core-js/internals/environment-is-node.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/environment-is-webos-webkit.js +0 -10
- package/dist/cjs/node_modules/core-js/internals/environment-is-webos-webkit.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/environment-user-agent.js +0 -13
- package/dist/cjs/node_modules/core-js/internals/environment-user-agent.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/environment-v8-version.js +0 -35
- package/dist/cjs/node_modules/core-js/internals/environment-v8-version.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/environment.js +0 -29
- package/dist/cjs/node_modules/core-js/internals/environment.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/export.js +0 -68
- package/dist/cjs/node_modules/core-js/internals/export.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/fails.js +0 -12
- package/dist/cjs/node_modules/core-js/internals/fails.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js +0 -90
- package/dist/cjs/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/function-apply.js +0 -17
- package/dist/cjs/node_modules/core-js/internals/function-apply.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/function-bind-context.js +0 -22
- package/dist/cjs/node_modules/core-js/internals/function-bind-context.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/function-bind-native.js +0 -15
- package/dist/cjs/node_modules/core-js/internals/function-bind-native.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/function-call.js +0 -14
- package/dist/cjs/node_modules/core-js/internals/function-call.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/function-name.js +0 -24
- package/dist/cjs/node_modules/core-js/internals/function-name.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/function-uncurry-this-accessor.js +0 -17
- package/dist/cjs/node_modules/core-js/internals/function-uncurry-this-accessor.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/function-uncurry-this-clause.js +0 -17
- package/dist/cjs/node_modules/core-js/internals/function-uncurry-this-clause.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/function-uncurry-this.js +0 -19
- package/dist/cjs/node_modules/core-js/internals/function-uncurry-this.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/get-built-in.js +0 -18
- package/dist/cjs/node_modules/core-js/internals/get-built-in.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/get-iterator-method.js +0 -24
- package/dist/cjs/node_modules/core-js/internals/get-iterator-method.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/get-iterator.js +0 -24
- package/dist/cjs/node_modules/core-js/internals/get-iterator.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/get-method.js +0 -17
- package/dist/cjs/node_modules/core-js/internals/get-method.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/get-substitution.js +0 -53
- package/dist/cjs/node_modules/core-js/internals/get-substitution.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/global-this.js +0 -22
- package/dist/cjs/node_modules/core-js/internals/global-this.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/has-own-property.js +0 -19
- package/dist/cjs/node_modules/core-js/internals/has-own-property.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/hidden-keys.js +0 -6
- package/dist/cjs/node_modules/core-js/internals/hidden-keys.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/host-report-errors.js +0 -11
- package/dist/cjs/node_modules/core-js/internals/host-report-errors.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/html.js +0 -10
- package/dist/cjs/node_modules/core-js/internals/html.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/ie8-dom-define.js +0 -20
- package/dist/cjs/node_modules/core-js/internals/ie8-dom-define.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/indexed-object.js +0 -24
- package/dist/cjs/node_modules/core-js/internals/indexed-object.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/inspect-source.js +0 -23
- package/dist/cjs/node_modules/core-js/internals/inspect-source.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/internal-state.js +0 -84
- package/dist/cjs/node_modules/core-js/internals/internal-state.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/is-array-iterator-method.js +0 -18
- package/dist/cjs/node_modules/core-js/internals/is-array-iterator-method.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/is-array.js +0 -15
- package/dist/cjs/node_modules/core-js/internals/is-array.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/is-callable.js +0 -16
- package/dist/cjs/node_modules/core-js/internals/is-callable.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/is-constructor.js +0 -63
- package/dist/cjs/node_modules/core-js/internals/is-constructor.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/is-forced.js +0 -30
- package/dist/cjs/node_modules/core-js/internals/is-forced.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/is-null-or-undefined.js +0 -10
- package/dist/cjs/node_modules/core-js/internals/is-null-or-undefined.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/is-object.js +0 -12
- package/dist/cjs/node_modules/core-js/internals/is-object.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/is-possible-prototype.js +0 -12
- package/dist/cjs/node_modules/core-js/internals/is-possible-prototype.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/is-regexp.js +0 -21
- package/dist/cjs/node_modules/core-js/internals/is-regexp.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/is-symbol.js +0 -23
- package/dist/cjs/node_modules/core-js/internals/is-symbol.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/iterate.js +0 -84
- package/dist/cjs/node_modules/core-js/internals/iterate.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/iterator-close.js +0 -32
- package/dist/cjs/node_modules/core-js/internals/iterator-close.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/iterator-create-constructor.js +0 -26
- package/dist/cjs/node_modules/core-js/internals/iterator-create-constructor.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/iterator-define.js +0 -118
- package/dist/cjs/node_modules/core-js/internals/iterator-define.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/iterators-core.js +0 -58
- package/dist/cjs/node_modules/core-js/internals/iterators-core.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/iterators.js +0 -6
- package/dist/cjs/node_modules/core-js/internals/iterators.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/length-of-array-like.js +0 -14
- package/dist/cjs/node_modules/core-js/internals/length-of-array-like.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/make-built-in.js +0 -71
- package/dist/cjs/node_modules/core-js/internals/make-built-in.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/math-trunc.js +0 -15
- package/dist/cjs/node_modules/core-js/internals/math-trunc.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/microtask.js +0 -93
- package/dist/cjs/node_modules/core-js/internals/microtask.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/new-promise-capability.js +0 -28
- package/dist/cjs/node_modules/core-js/internals/new-promise-capability.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/not-a-regexp.js +0 -16
- package/dist/cjs/node_modules/core-js/internals/not-a-regexp.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/object-create.js +0 -98
- package/dist/cjs/node_modules/core-js/internals/object-create.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/object-define-properties.js +0 -34
- package/dist/cjs/node_modules/core-js/internals/object-define-properties.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/object-define-property.js +0 -55
- package/dist/cjs/node_modules/core-js/internals/object-define-property.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/object-get-own-property-descriptor.js +0 -38
- package/dist/cjs/node_modules/core-js/internals/object-get-own-property-descriptor.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/object-get-own-property-names.js +0 -20
- package/dist/cjs/node_modules/core-js/internals/object-get-own-property-names.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/object-get-own-property-symbols.js +0 -9
- package/dist/cjs/node_modules/core-js/internals/object-get-own-property-symbols.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/object-get-prototype-of.js +0 -32
- package/dist/cjs/node_modules/core-js/internals/object-get-prototype-of.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/object-is-prototype-of.js +0 -10
- package/dist/cjs/node_modules/core-js/internals/object-is-prototype-of.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/object-keys-internal.js +0 -31
- package/dist/cjs/node_modules/core-js/internals/object-keys-internal.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/object-keys.js +0 -17
- package/dist/cjs/node_modules/core-js/internals/object-keys.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/object-property-is-enumerable.js +0 -20
- package/dist/cjs/node_modules/core-js/internals/object-property-is-enumerable.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/object-set-prototype-of.js +0 -38
- package/dist/cjs/node_modules/core-js/internals/object-set-prototype-of.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/ordinary-to-primitive.js +0 -24
- package/dist/cjs/node_modules/core-js/internals/ordinary-to-primitive.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/own-keys.js +0 -27
- package/dist/cjs/node_modules/core-js/internals/own-keys.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/path.js +0 -10
- package/dist/cjs/node_modules/core-js/internals/path.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/perform.js +0 -12
- package/dist/cjs/node_modules/core-js/internals/perform.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/promise-constructor-detection.js +0 -57
- package/dist/cjs/node_modules/core-js/internals/promise-constructor-detection.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/promise-native-constructor.js +0 -10
- package/dist/cjs/node_modules/core-js/internals/promise-native-constructor.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/promise-resolve.js +0 -22
- package/dist/cjs/node_modules/core-js/internals/promise-resolve.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/promise-statics-incorrect-iteration.js +0 -16
- package/dist/cjs/node_modules/core-js/internals/promise-statics-incorrect-iteration.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/queue.js +0 -29
- package/dist/cjs/node_modules/core-js/internals/queue.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/regexp-exec-abstract.js +0 -31
- package/dist/cjs/node_modules/core-js/internals/regexp-exec-abstract.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/regexp-exec.js +0 -132
- package/dist/cjs/node_modules/core-js/internals/regexp-exec.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/regexp-flags-detection.js +0 -54
- package/dist/cjs/node_modules/core-js/internals/regexp-flags-detection.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/regexp-flags.js +0 -24
- package/dist/cjs/node_modules/core-js/internals/regexp-flags.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/regexp-get-flags.js +0 -26
- package/dist/cjs/node_modules/core-js/internals/regexp-get-flags.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/regexp-sticky-helpers.js +0 -37
- package/dist/cjs/node_modules/core-js/internals/regexp-sticky-helpers.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/regexp-unsupported-dot-all.js +0 -18
- package/dist/cjs/node_modules/core-js/internals/regexp-unsupported-dot-all.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/regexp-unsupported-ncg.js +0 -19
- package/dist/cjs/node_modules/core-js/internals/regexp-unsupported-ncg.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/require-object-coercible.js +0 -17
- package/dist/cjs/node_modules/core-js/internals/require-object-coercible.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/safe-get-built-in.js +0 -20
- package/dist/cjs/node_modules/core-js/internals/safe-get-built-in.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/set-species.js +0 -27
- package/dist/cjs/node_modules/core-js/internals/set-species.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/set-to-string-tag.js +0 -22
- package/dist/cjs/node_modules/core-js/internals/set-to-string-tag.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/shared-key.js +0 -16
- package/dist/cjs/node_modules/core-js/internals/shared-key.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/shared-store.js +0 -24
- package/dist/cjs/node_modules/core-js/internals/shared-store.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/shared.js +0 -12
- package/dist/cjs/node_modules/core-js/internals/shared.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/species-constructor.js +0 -24
- package/dist/cjs/node_modules/core-js/internals/species-constructor.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/string-multibyte.js +0 -43
- package/dist/cjs/node_modules/core-js/internals/string-multibyte.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/string-trim-forced.js +0 -24
- package/dist/cjs/node_modules/core-js/internals/string-trim-forced.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/string-trim.js +0 -34
- package/dist/cjs/node_modules/core-js/internals/string-trim.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/symbol-constructor-detection.js +0 -27
- package/dist/cjs/node_modules/core-js/internals/symbol-constructor-detection.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/task.js +0 -132
- package/dist/cjs/node_modules/core-js/internals/task.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/to-absolute-index.js +0 -19
- package/dist/cjs/node_modules/core-js/internals/to-absolute-index.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/to-indexed-object.js +0 -15
- package/dist/cjs/node_modules/core-js/internals/to-indexed-object.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/to-integer-or-infinity.js +0 -16
- package/dist/cjs/node_modules/core-js/internals/to-integer-or-infinity.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/to-length.js +0 -17
- package/dist/cjs/node_modules/core-js/internals/to-length.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/to-object.js +0 -16
- package/dist/cjs/node_modules/core-js/internals/to-object.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/to-primitive.js +0 -37
- package/dist/cjs/node_modules/core-js/internals/to-primitive.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/to-property-key.js +0 -17
- package/dist/cjs/node_modules/core-js/internals/to-property-key.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/to-string-tag-support.js +0 -15
- package/dist/cjs/node_modules/core-js/internals/to-string-tag-support.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/to-string.js +0 -15
- package/dist/cjs/node_modules/core-js/internals/to-string.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/try-to-string.js +0 -14
- package/dist/cjs/node_modules/core-js/internals/try-to-string.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/uid.js +0 -16
- package/dist/cjs/node_modules/core-js/internals/uid.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/use-symbol-as-uid.js +0 -13
- package/dist/cjs/node_modules/core-js/internals/use-symbol-as-uid.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/v8-prototype-define-bug.js +0 -20
- package/dist/cjs/node_modules/core-js/internals/v8-prototype-define-bug.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/validate-arguments-length.js +0 -11
- package/dist/cjs/node_modules/core-js/internals/validate-arguments-length.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/weak-map-basic-detection.js +0 -14
- package/dist/cjs/node_modules/core-js/internals/weak-map-basic-detection.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/well-known-symbol.js +0 -30
- package/dist/cjs/node_modules/core-js/internals/well-known-symbol.js.map +0 -1
- package/dist/cjs/node_modules/core-js/internals/whitespaces.js +0 -8
- package/dist/cjs/node_modules/core-js/internals/whitespaces.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.array.index-of.js +0 -30
- package/dist/cjs/node_modules/core-js/modules/es.array.index-of.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.array.iterator.js +0 -75
- package/dist/cjs/node_modules/core-js/modules/es.array.iterator.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.array.reduce.js +0 -28
- package/dist/cjs/node_modules/core-js/modules/es.array.reduce.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.array.reverse.js +0 -25
- package/dist/cjs/node_modules/core-js/modules/es.array.reverse.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.promise.all.js +0 -50
- package/dist/cjs/node_modules/core-js/modules/es.promise.all.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.promise.catch.js +0 -34
- package/dist/cjs/node_modules/core-js/modules/es.promise.catch.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.promise.constructor.js +0 -319
- package/dist/cjs/node_modules/core-js/modules/es.promise.constructor.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.promise.race.js +0 -37
- package/dist/cjs/node_modules/core-js/modules/es.promise.race.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.promise.reject.js +0 -22
- package/dist/cjs/node_modules/core-js/modules/es.promise.reject.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.promise.resolve.js +0 -23
- package/dist/cjs/node_modules/core-js/modules/es.promise.resolve.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.regexp.exec.js +0 -14
- package/dist/cjs/node_modules/core-js/modules/es.regexp.exec.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.regexp.to-string.js +0 -35
- package/dist/cjs/node_modules/core-js/modules/es.regexp.to-string.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.string.ends-with.js +0 -45
- package/dist/cjs/node_modules/core-js/modules/es.string.ends-with.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.string.includes.js +0 -30
- package/dist/cjs/node_modules/core-js/modules/es.string.includes.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.string.match.js +0 -69
- package/dist/cjs/node_modules/core-js/modules/es.string.match.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.string.replace.js +0 -165
- package/dist/cjs/node_modules/core-js/modules/es.string.replace.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.string.split.js +0 -128
- package/dist/cjs/node_modules/core-js/modules/es.string.split.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.string.starts-with.js +0 -43
- package/dist/cjs/node_modules/core-js/modules/es.string.starts-with.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/es.string.trim.js +0 -18
- package/dist/cjs/node_modules/core-js/modules/es.string.trim.js.map +0 -1
- package/dist/cjs/node_modules/core-js/modules/web.dom-collections.iterator.js +0 -47
- package/dist/cjs/node_modules/core-js/modules/web.dom-collections.iterator.js.map +0 -1
- package/dist/cjs/node_modules/dompurify/dist/purify.es.js +0 -1533
- package/dist/cjs/node_modules/dompurify/dist/purify.es.js.map +0 -1
- package/dist/cjs/node_modules/fflate/esm/browser.js +0 -807
- package/dist/cjs/node_modules/fflate/esm/browser.js.map +0 -1
- package/dist/cjs/node_modules/html2canvas/dist/html2canvas.esm.js +0 -7824
- package/dist/cjs/node_modules/html2canvas/dist/html2canvas.esm.js.map +0 -1
- package/dist/cjs/node_modules/jspdf/dist/jspdf.es.min.js +0 -358
- package/dist/cjs/node_modules/jspdf/dist/jspdf.es.min.js.map +0 -1
- package/dist/cjs/node_modules/performance-now/lib/performance-now.js +0 -46
- package/dist/cjs/node_modules/performance-now/lib/performance-now.js.map +0 -1
- package/dist/cjs/node_modules/raf/index.js +0 -87
- package/dist/cjs/node_modules/raf/index.js.map +0 -1
- package/dist/cjs/node_modules/rgbcolor/index.js +0 -311
- package/dist/cjs/node_modules/rgbcolor/index.js.map +0 -1
- package/dist/cjs/node_modules/stackblur-canvas/dist/stackblur-es.js +0 -384
- package/dist/cjs/node_modules/stackblur-canvas/dist/stackblur-es.js.map +0 -1
- package/dist/cjs/node_modules/svg-pathdata/lib/SVGPathData.module.js +0 -23
- package/dist/cjs/node_modules/svg-pathdata/lib/SVGPathData.module.js.map +0 -1
- package/dist/esm/_virtual/index.js +0 -4
- package/dist/esm/_virtual/index.js.map +0 -1
- package/dist/esm/_virtual/make-built-in.js +0 -4
- package/dist/esm/_virtual/make-built-in.js.map +0 -1
- package/dist/esm/_virtual/new-promise-capability.js +0 -4
- package/dist/esm/_virtual/new-promise-capability.js.map +0 -1
- package/dist/esm/_virtual/object-define-properties.js +0 -4
- package/dist/esm/_virtual/object-define-properties.js.map +0 -1
- package/dist/esm/_virtual/object-define-property.js +0 -4
- package/dist/esm/_virtual/object-define-property.js.map +0 -1
- package/dist/esm/_virtual/object-get-own-property-descriptor.js +0 -4
- package/dist/esm/_virtual/object-get-own-property-descriptor.js.map +0 -1
- package/dist/esm/_virtual/object-get-own-property-names.js +0 -4
- package/dist/esm/_virtual/object-get-own-property-names.js.map +0 -1
- package/dist/esm/_virtual/object-get-own-property-symbols.js +0 -4
- package/dist/esm/_virtual/object-get-own-property-symbols.js.map +0 -1
- package/dist/esm/_virtual/object-property-is-enumerable.js +0 -4
- package/dist/esm/_virtual/object-property-is-enumerable.js.map +0 -1
- package/dist/esm/_virtual/performance-now.js +0 -4
- package/dist/esm/_virtual/performance-now.js.map +0 -1
- package/dist/esm/_virtual/shared-store.js +0 -4
- package/dist/esm/_virtual/shared-store.js.map +0 -1
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js +0 -28
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js.map +0 -1
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/defineProperty.js +0 -13
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/defineProperty.js.map +0 -1
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +0 -15
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/toPrimitive.js.map +0 -1
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +0 -10
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js.map +0 -1
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/typeof.js +0 -12
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/typeof.js.map +0 -1
- package/dist/esm/node_modules/canvg/lib/index.es.js +0 -6556
- package/dist/esm/node_modules/canvg/lib/index.es.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/a-callable.js +0 -16
- package/dist/esm/node_modules/core-js/internals/a-callable.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/a-constructor.js +0 -16
- package/dist/esm/node_modules/core-js/internals/a-constructor.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/a-possible-prototype.js +0 -14
- package/dist/esm/node_modules/core-js/internals/a-possible-prototype.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/add-to-unscopables.js +0 -28
- package/dist/esm/node_modules/core-js/internals/add-to-unscopables.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/advance-string-index.js +0 -12
- package/dist/esm/node_modules/core-js/internals/advance-string-index.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/an-instance.js +0 -13
- package/dist/esm/node_modules/core-js/internals/an-instance.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/an-object.js +0 -15
- package/dist/esm/node_modules/core-js/internals/an-object.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/array-includes.js +0 -37
- package/dist/esm/node_modules/core-js/internals/array-includes.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/array-method-is-strict.js +0 -14
- package/dist/esm/node_modules/core-js/internals/array-method-is-strict.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/array-reduce.js +0 -49
- package/dist/esm/node_modules/core-js/internals/array-reduce.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/array-slice.js +0 -8
- package/dist/esm/node_modules/core-js/internals/array-slice.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/check-correctness-of-iteration.js +0 -47
- package/dist/esm/node_modules/core-js/internals/check-correctness-of-iteration.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/classof-raw.js +0 -13
- package/dist/esm/node_modules/core-js/internals/classof-raw.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/classof.js +0 -37
- package/dist/esm/node_modules/core-js/internals/classof.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/copy-constructor-properties.js +0 -26
- package/dist/esm/node_modules/core-js/internals/copy-constructor-properties.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/correct-is-regexp-logic.js +0 -20
- package/dist/esm/node_modules/core-js/internals/correct-is-regexp-logic.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/correct-prototype-getter.js +0 -13
- package/dist/esm/node_modules/core-js/internals/correct-prototype-getter.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/create-iter-result-object.js +0 -8
- package/dist/esm/node_modules/core-js/internals/create-iter-result-object.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/create-non-enumerable-property.js +0 -18
- package/dist/esm/node_modules/core-js/internals/create-non-enumerable-property.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/create-property-descriptor.js +0 -11
- package/dist/esm/node_modules/core-js/internals/create-property-descriptor.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/define-built-in-accessor.js +0 -15
- package/dist/esm/node_modules/core-js/internals/define-built-in-accessor.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/define-built-in.js +0 -36
- package/dist/esm/node_modules/core-js/internals/define-built-in.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/define-global-property.js +0 -17
- package/dist/esm/node_modules/core-js/internals/define-global-property.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/descriptors.js +0 -12
- package/dist/esm/node_modules/core-js/internals/descriptors.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/document-create-element.js +0 -16
- package/dist/esm/node_modules/core-js/internals/document-create-element.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/dom-iterables.js +0 -38
- package/dist/esm/node_modules/core-js/internals/dom-iterables.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/dom-token-list-prototype.js +0 -12
- package/dist/esm/node_modules/core-js/internals/dom-token-list-prototype.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/enum-bug-keys.js +0 -13
- package/dist/esm/node_modules/core-js/internals/enum-bug-keys.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/environment-is-ios-pebble.js +0 -8
- package/dist/esm/node_modules/core-js/internals/environment-is-ios-pebble.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/environment-is-ios.js +0 -9
- package/dist/esm/node_modules/core-js/internals/environment-is-ios.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/environment-is-node.js +0 -8
- package/dist/esm/node_modules/core-js/internals/environment-is-node.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/environment-is-webos-webkit.js +0 -8
- package/dist/esm/node_modules/core-js/internals/environment-is-webos-webkit.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/environment-user-agent.js +0 -11
- package/dist/esm/node_modules/core-js/internals/environment-user-agent.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/environment-v8-version.js +0 -33
- package/dist/esm/node_modules/core-js/internals/environment-v8-version.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/environment.js +0 -27
- package/dist/esm/node_modules/core-js/internals/environment.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/export.js +0 -66
- package/dist/esm/node_modules/core-js/internals/export.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/fails.js +0 -10
- package/dist/esm/node_modules/core-js/internals/fails.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js +0 -88
- package/dist/esm/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/function-apply.js +0 -15
- package/dist/esm/node_modules/core-js/internals/function-apply.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/function-bind-context.js +0 -20
- package/dist/esm/node_modules/core-js/internals/function-bind-context.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/function-bind-native.js +0 -13
- package/dist/esm/node_modules/core-js/internals/function-bind-native.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/function-call.js +0 -12
- package/dist/esm/node_modules/core-js/internals/function-call.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/function-name.js +0 -22
- package/dist/esm/node_modules/core-js/internals/function-name.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/function-uncurry-this-accessor.js +0 -15
- package/dist/esm/node_modules/core-js/internals/function-uncurry-this-accessor.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/function-uncurry-this-clause.js +0 -15
- package/dist/esm/node_modules/core-js/internals/function-uncurry-this-clause.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/function-uncurry-this.js +0 -17
- package/dist/esm/node_modules/core-js/internals/function-uncurry-this.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/get-built-in.js +0 -16
- package/dist/esm/node_modules/core-js/internals/get-built-in.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/get-iterator-method.js +0 -22
- package/dist/esm/node_modules/core-js/internals/get-iterator-method.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/get-iterator.js +0 -22
- package/dist/esm/node_modules/core-js/internals/get-iterator.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/get-method.js +0 -15
- package/dist/esm/node_modules/core-js/internals/get-method.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/get-substitution.js +0 -51
- package/dist/esm/node_modules/core-js/internals/get-substitution.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/global-this.js +0 -20
- package/dist/esm/node_modules/core-js/internals/global-this.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/has-own-property.js +0 -17
- package/dist/esm/node_modules/core-js/internals/has-own-property.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/hidden-keys.js +0 -4
- package/dist/esm/node_modules/core-js/internals/hidden-keys.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/host-report-errors.js +0 -9
- package/dist/esm/node_modules/core-js/internals/host-report-errors.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/html.js +0 -8
- package/dist/esm/node_modules/core-js/internals/html.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/ie8-dom-define.js +0 -18
- package/dist/esm/node_modules/core-js/internals/ie8-dom-define.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/indexed-object.js +0 -22
- package/dist/esm/node_modules/core-js/internals/indexed-object.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/inspect-source.js +0 -21
- package/dist/esm/node_modules/core-js/internals/inspect-source.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/internal-state.js +0 -82
- package/dist/esm/node_modules/core-js/internals/internal-state.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/is-array-iterator-method.js +0 -16
- package/dist/esm/node_modules/core-js/internals/is-array-iterator-method.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/is-array.js +0 -13
- package/dist/esm/node_modules/core-js/internals/is-array.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/is-callable.js +0 -14
- package/dist/esm/node_modules/core-js/internals/is-callable.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/is-constructor.js +0 -61
- package/dist/esm/node_modules/core-js/internals/is-constructor.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/is-forced.js +0 -28
- package/dist/esm/node_modules/core-js/internals/is-forced.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/is-null-or-undefined.js +0 -8
- package/dist/esm/node_modules/core-js/internals/is-null-or-undefined.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/is-object.js +0 -10
- package/dist/esm/node_modules/core-js/internals/is-object.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/is-possible-prototype.js +0 -10
- package/dist/esm/node_modules/core-js/internals/is-possible-prototype.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/is-regexp.js +0 -19
- package/dist/esm/node_modules/core-js/internals/is-regexp.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/is-symbol.js +0 -21
- package/dist/esm/node_modules/core-js/internals/is-symbol.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/iterate.js +0 -82
- package/dist/esm/node_modules/core-js/internals/iterate.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/iterator-close.js +0 -30
- package/dist/esm/node_modules/core-js/internals/iterator-close.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/iterator-create-constructor.js +0 -24
- package/dist/esm/node_modules/core-js/internals/iterator-create-constructor.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/iterator-define.js +0 -116
- package/dist/esm/node_modules/core-js/internals/iterator-define.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/iterators-core.js +0 -56
- package/dist/esm/node_modules/core-js/internals/iterators-core.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/iterators.js +0 -4
- package/dist/esm/node_modules/core-js/internals/iterators.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/length-of-array-like.js +0 -12
- package/dist/esm/node_modules/core-js/internals/length-of-array-like.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/make-built-in.js +0 -69
- package/dist/esm/node_modules/core-js/internals/make-built-in.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/math-trunc.js +0 -13
- package/dist/esm/node_modules/core-js/internals/math-trunc.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/microtask.js +0 -91
- package/dist/esm/node_modules/core-js/internals/microtask.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/new-promise-capability.js +0 -26
- package/dist/esm/node_modules/core-js/internals/new-promise-capability.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/not-a-regexp.js +0 -14
- package/dist/esm/node_modules/core-js/internals/not-a-regexp.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/object-create.js +0 -96
- package/dist/esm/node_modules/core-js/internals/object-create.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/object-define-properties.js +0 -32
- package/dist/esm/node_modules/core-js/internals/object-define-properties.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/object-define-property.js +0 -53
- package/dist/esm/node_modules/core-js/internals/object-define-property.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/object-get-own-property-descriptor.js +0 -36
- package/dist/esm/node_modules/core-js/internals/object-get-own-property-descriptor.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/object-get-own-property-names.js +0 -18
- package/dist/esm/node_modules/core-js/internals/object-get-own-property-names.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/object-get-own-property-symbols.js +0 -7
- package/dist/esm/node_modules/core-js/internals/object-get-own-property-symbols.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/object-get-prototype-of.js +0 -30
- package/dist/esm/node_modules/core-js/internals/object-get-prototype-of.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/object-is-prototype-of.js +0 -8
- package/dist/esm/node_modules/core-js/internals/object-is-prototype-of.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/object-keys-internal.js +0 -29
- package/dist/esm/node_modules/core-js/internals/object-keys-internal.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/object-keys.js +0 -15
- package/dist/esm/node_modules/core-js/internals/object-keys.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/object-property-is-enumerable.js +0 -18
- package/dist/esm/node_modules/core-js/internals/object-property-is-enumerable.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/object-set-prototype-of.js +0 -36
- package/dist/esm/node_modules/core-js/internals/object-set-prototype-of.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/ordinary-to-primitive.js +0 -22
- package/dist/esm/node_modules/core-js/internals/ordinary-to-primitive.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/own-keys.js +0 -25
- package/dist/esm/node_modules/core-js/internals/own-keys.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/path.js +0 -8
- package/dist/esm/node_modules/core-js/internals/path.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/perform.js +0 -10
- package/dist/esm/node_modules/core-js/internals/perform.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/promise-constructor-detection.js +0 -55
- package/dist/esm/node_modules/core-js/internals/promise-constructor-detection.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/promise-native-constructor.js +0 -8
- package/dist/esm/node_modules/core-js/internals/promise-native-constructor.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/promise-resolve.js +0 -20
- package/dist/esm/node_modules/core-js/internals/promise-resolve.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/promise-statics-incorrect-iteration.js +0 -14
- package/dist/esm/node_modules/core-js/internals/promise-statics-incorrect-iteration.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/queue.js +0 -27
- package/dist/esm/node_modules/core-js/internals/queue.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/regexp-exec-abstract.js +0 -29
- package/dist/esm/node_modules/core-js/internals/regexp-exec-abstract.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/regexp-exec.js +0 -130
- package/dist/esm/node_modules/core-js/internals/regexp-exec.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/regexp-flags-detection.js +0 -52
- package/dist/esm/node_modules/core-js/internals/regexp-flags-detection.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/regexp-flags.js +0 -22
- package/dist/esm/node_modules/core-js/internals/regexp-flags.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/regexp-get-flags.js +0 -24
- package/dist/esm/node_modules/core-js/internals/regexp-get-flags.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/regexp-sticky-helpers.js +0 -35
- package/dist/esm/node_modules/core-js/internals/regexp-sticky-helpers.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/regexp-unsupported-dot-all.js +0 -16
- package/dist/esm/node_modules/core-js/internals/regexp-unsupported-dot-all.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/regexp-unsupported-ncg.js +0 -17
- package/dist/esm/node_modules/core-js/internals/regexp-unsupported-ncg.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/require-object-coercible.js +0 -15
- package/dist/esm/node_modules/core-js/internals/require-object-coercible.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/safe-get-built-in.js +0 -18
- package/dist/esm/node_modules/core-js/internals/safe-get-built-in.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/set-species.js +0 -25
- package/dist/esm/node_modules/core-js/internals/set-species.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/set-to-string-tag.js +0 -20
- package/dist/esm/node_modules/core-js/internals/set-to-string-tag.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/shared-key.js +0 -14
- package/dist/esm/node_modules/core-js/internals/shared-key.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/shared-store.js +0 -22
- package/dist/esm/node_modules/core-js/internals/shared-store.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/shared.js +0 -10
- package/dist/esm/node_modules/core-js/internals/shared.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/species-constructor.js +0 -22
- package/dist/esm/node_modules/core-js/internals/species-constructor.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/string-multibyte.js +0 -41
- package/dist/esm/node_modules/core-js/internals/string-multibyte.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/string-trim-forced.js +0 -22
- package/dist/esm/node_modules/core-js/internals/string-trim-forced.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/string-trim.js +0 -32
- package/dist/esm/node_modules/core-js/internals/string-trim.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/symbol-constructor-detection.js +0 -25
- package/dist/esm/node_modules/core-js/internals/symbol-constructor-detection.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/task.js +0 -130
- package/dist/esm/node_modules/core-js/internals/task.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/to-absolute-index.js +0 -17
- package/dist/esm/node_modules/core-js/internals/to-absolute-index.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/to-indexed-object.js +0 -13
- package/dist/esm/node_modules/core-js/internals/to-indexed-object.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/to-integer-or-infinity.js +0 -14
- package/dist/esm/node_modules/core-js/internals/to-integer-or-infinity.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/to-length.js +0 -15
- package/dist/esm/node_modules/core-js/internals/to-length.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/to-object.js +0 -14
- package/dist/esm/node_modules/core-js/internals/to-object.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/to-primitive.js +0 -35
- package/dist/esm/node_modules/core-js/internals/to-primitive.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/to-property-key.js +0 -15
- package/dist/esm/node_modules/core-js/internals/to-property-key.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/to-string-tag-support.js +0 -13
- package/dist/esm/node_modules/core-js/internals/to-string-tag-support.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/to-string.js +0 -13
- package/dist/esm/node_modules/core-js/internals/to-string.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/try-to-string.js +0 -12
- package/dist/esm/node_modules/core-js/internals/try-to-string.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/uid.js +0 -14
- package/dist/esm/node_modules/core-js/internals/uid.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/use-symbol-as-uid.js +0 -11
- package/dist/esm/node_modules/core-js/internals/use-symbol-as-uid.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/v8-prototype-define-bug.js +0 -18
- package/dist/esm/node_modules/core-js/internals/v8-prototype-define-bug.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/validate-arguments-length.js +0 -9
- package/dist/esm/node_modules/core-js/internals/validate-arguments-length.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/weak-map-basic-detection.js +0 -12
- package/dist/esm/node_modules/core-js/internals/weak-map-basic-detection.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/well-known-symbol.js +0 -28
- package/dist/esm/node_modules/core-js/internals/well-known-symbol.js.map +0 -1
- package/dist/esm/node_modules/core-js/internals/whitespaces.js +0 -6
- package/dist/esm/node_modules/core-js/internals/whitespaces.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.array.index-of.js +0 -28
- package/dist/esm/node_modules/core-js/modules/es.array.index-of.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.array.iterator.js +0 -73
- package/dist/esm/node_modules/core-js/modules/es.array.iterator.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.array.reduce.js +0 -26
- package/dist/esm/node_modules/core-js/modules/es.array.reduce.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.array.reverse.js +0 -23
- package/dist/esm/node_modules/core-js/modules/es.array.reverse.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.promise.all.js +0 -48
- package/dist/esm/node_modules/core-js/modules/es.promise.all.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.promise.catch.js +0 -32
- package/dist/esm/node_modules/core-js/modules/es.promise.catch.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.promise.constructor.js +0 -317
- package/dist/esm/node_modules/core-js/modules/es.promise.constructor.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.promise.race.js +0 -35
- package/dist/esm/node_modules/core-js/modules/es.promise.race.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.promise.reject.js +0 -20
- package/dist/esm/node_modules/core-js/modules/es.promise.reject.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.promise.resolve.js +0 -21
- package/dist/esm/node_modules/core-js/modules/es.promise.resolve.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.regexp.exec.js +0 -12
- package/dist/esm/node_modules/core-js/modules/es.regexp.exec.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.regexp.to-string.js +0 -33
- package/dist/esm/node_modules/core-js/modules/es.regexp.to-string.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.string.ends-with.js +0 -43
- package/dist/esm/node_modules/core-js/modules/es.string.ends-with.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.string.includes.js +0 -28
- package/dist/esm/node_modules/core-js/modules/es.string.includes.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.string.match.js +0 -67
- package/dist/esm/node_modules/core-js/modules/es.string.match.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.string.replace.js +0 -163
- package/dist/esm/node_modules/core-js/modules/es.string.replace.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.string.split.js +0 -126
- package/dist/esm/node_modules/core-js/modules/es.string.split.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.string.starts-with.js +0 -41
- package/dist/esm/node_modules/core-js/modules/es.string.starts-with.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/es.string.trim.js +0 -16
- package/dist/esm/node_modules/core-js/modules/es.string.trim.js.map +0 -1
- package/dist/esm/node_modules/core-js/modules/web.dom-collections.iterator.js +0 -45
- package/dist/esm/node_modules/core-js/modules/web.dom-collections.iterator.js.map +0 -1
- package/dist/esm/node_modules/dompurify/dist/purify.es.js +0 -1531
- package/dist/esm/node_modules/dompurify/dist/purify.es.js.map +0 -1
- package/dist/esm/node_modules/fflate/esm/browser.js +0 -804
- package/dist/esm/node_modules/fflate/esm/browser.js.map +0 -1
- package/dist/esm/node_modules/html2canvas/dist/html2canvas.esm.js +0 -7822
- package/dist/esm/node_modules/html2canvas/dist/html2canvas.esm.js.map +0 -1
- package/dist/esm/node_modules/jspdf/dist/jspdf.es.min.js +0 -337
- package/dist/esm/node_modules/jspdf/dist/jspdf.es.min.js.map +0 -1
- package/dist/esm/node_modules/performance-now/lib/performance-now.js +0 -44
- package/dist/esm/node_modules/performance-now/lib/performance-now.js.map +0 -1
- package/dist/esm/node_modules/raf/index.js +0 -85
- package/dist/esm/node_modules/raf/index.js.map +0 -1
- package/dist/esm/node_modules/rgbcolor/index.js +0 -309
- package/dist/esm/node_modules/rgbcolor/index.js.map +0 -1
- package/dist/esm/node_modules/stackblur-canvas/dist/stackblur-es.js +0 -380
- package/dist/esm/node_modules/stackblur-canvas/dist/stackblur-es.js.map +0 -1
- package/dist/esm/node_modules/svg-pathdata/lib/SVGPathData.module.js +0 -18
- package/dist/esm/node_modules/svg-pathdata/lib/SVGPathData.module.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IDCardGenerator.js","sources":["../../../src/components/IDCardGenerator.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\r\nimport type { IDCardGeneratorProps, FieldMapping, IDCardData, IDCardTemplate } from '../types';\r\nimport { fieldStyleToCSS, positionToStyle } from '../utils/styleUtils';\r\nimport { generateQrCodeFromFields } from '../core/qrUtils';\r\n\r\n/**\r\n * IDCardGenerator - Renders a completed ID card\r\n * \r\n * Takes a template and user data, then renders the filled card.\r\n * This is the component used to display actual ID cards for individual users.\r\n * \r\n * Example:\r\n * ```tsx\r\n * <IDCardGenerator \r\n * template={myTemplate}\r\n * data={{ name: 'John Doe', photo: '...' }}\r\n * side=\"front\"\r\n * />\r\n * ```\r\n */\r\nexport const IDCardGenerator: React.FC<IDCardGeneratorProps> = ({\r\n template,\r\n data,\r\n side = 'front',\r\n scale = 1,\r\n className = '',\r\n style = {},\r\n onFieldClick,\r\n editable = false,\r\n}: IDCardGeneratorProps) => {\r\n // Get fields for the current side only\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 a single field\r\n const renderField = (field: FieldMapping) => {\r\n const posStyle = positionToStyle(field.position);\r\n let fieldStyle = fieldStyleToCSS(field.style);\r\n \r\n // Determine flex direction and alignment for text fields\r\n let flexDirection: 'column' | 'row' = 'column';\r\n if (field.type === 'text' && field.style?.labelPosition === 'left') flexDirection = 'row';\r\n\r\n // Map verticalAlign and textAlign to flex properties\r\n let justifyContent: 'flex-start' | 'center' | 'flex-end' = 'flex-start';\r\n let alignItems: 'flex-start' | 'center' | 'flex-end' | undefined = 'flex-start';\r\n if (field.type === 'text') {\r\n const textAlign = field.style?.textTextAlign || field.style?.textAlign || 'left';\r\n const verticalAlign = field.style?.verticalAlign || 'top';\r\n \r\n if (flexDirection === 'column') {\r\n // For column: verticalAlign controls justifyContent (vertical), textAlign controls alignItems (horizontal)\r\n if (verticalAlign === 'middle') justifyContent = 'center';\r\n else if (verticalAlign === 'bottom') justifyContent = 'flex-end';\r\n else justifyContent = 'flex-start';\r\n \r\n if (textAlign === 'center') alignItems = 'center';\r\n else if (textAlign === 'right') alignItems = 'flex-end';\r\n else alignItems = 'flex-start';\r\n } else {\r\n // For row: don't set alignItems on container if individual alignments are specified\r\n // Let labelAlignSelf and textAlignSelf handle it\r\n if (field.style?.labelVerticalAlign || field.style?.textVerticalAlign) {\r\n alignItems = undefined;\r\n } else {\r\n // Fall back to general verticalAlign if individual ones aren't specified\r\n if (verticalAlign === 'middle') alignItems = 'center';\r\n else if (verticalAlign === 'bottom') alignItems = 'flex-end';\r\n else alignItems = 'flex-start';\r\n }\r\n }\r\n }\r\n\r\n // Remove fontSize for label fields so text field font size does not affect them\r\n if (field.type === 'label' && fieldStyle.fontSize) {\r\n const { fontSize, ...rest } = fieldStyle;\r\n fieldStyle = rest;\r\n }\r\n\r\n // Remove textTransform from container for text and label fields - applied directly to spans\r\n if ((field.type === 'text' || field.type === 'label') && fieldStyle.textTransform) {\r\n const { textTransform, ...rest } = fieldStyle;\r\n fieldStyle = rest;\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 ? 'pointer' : 'default',\r\n display: field.type === 'text' ? 'flex' : undefined,\r\n flexDirection: field.type === 'text' ? flexDirection : undefined,\r\n justifyContent: field.type === 'text' ? justifyContent : undefined,\r\n alignItems: field.type === 'text' ? alignItems : undefined,\r\n };\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n if (onFieldClick) {\r\n e.stopPropagation();\r\n onFieldClick(field);\r\n }\r\n };\r\n\r\n const value = getFieldValue(field, data);\r\n\r\n switch (field.type) {\r\n case 'text': {\r\n // Label style properties\r\n let labelFontSize = field.style?.labelFontSize;\r\n if (!labelFontSize || labelFontSize === '0.75em') {\r\n labelFontSize = '12px';\r\n } else if (!labelFontSize.endsWith('px')) {\r\n const num = parseFloat(labelFontSize);\r\n if (!isNaN(num)) labelFontSize = num + 'px';\r\n else labelFontSize = '12px';\r\n }\r\n const labelFontWeight = field.style?.labelFontWeight || 'normal';\r\n const labelColor = field.style?.labelColor || '#666666';\r\n const labelTextTransform = field.style?.labelTextTransform || 'none';\r\n const labelTextAlign = field.style?.labelTextAlign || 'left';\r\n \r\n // Text/value style properties (separate from label)\r\n const textFontSize = field.style?.textFontSize || field.style?.fontSize || '1em';\r\n const textFontWeight = field.style?.textFontWeight || field.style?.fontWeight || 'normal';\r\n const textColor = field.style?.textColor || field.style?.color || '#000000';\r\n const textTextTransform = field.style?.textTransform || 'none';\r\n const textTextAlign = field.style?.textTextAlign || field.style?.textAlign || 'left';\r\n \r\n // For row layout (label on left), use individual span alignment\r\n if (field.style?.labelPosition === 'left') {\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 \r\n let textAlignSelf: React.CSSProperties['alignSelf'] = 'flex-start';\r\n if (field.style?.textVerticalAlign === 'middle') textAlignSelf = 'center';\r\n else if (field.style?.textVerticalAlign === 'bottom') textAlignSelf = 'flex-end';\r\n \r\n const labelStyle: React.CSSProperties = { \r\n fontSize: labelFontSize, \r\n fontWeight: labelFontWeight, \r\n color: labelColor, \r\n opacity: 0.7, \r\n marginRight: 8, \r\n alignSelf: labelAlignSelf, \r\n whiteSpace: 'nowrap', \r\n textTransform: labelTextTransform \r\n };\r\n \r\n const textStyle: React.CSSProperties = { \r\n textTransform: textTextTransform, \r\n fontSize: textFontSize, \r\n fontWeight: textFontWeight, \r\n color: textColor, \r\n alignSelf: textAlignSelf\r\n };\r\n \r\n return (\r\n <div\r\n key={field.id}\r\n id={field.id}\r\n style={combinedStyle}\r\n onClick={handleClick}\r\n className=\"idcard-field idcard-field-text\"\r\n >\r\n {field.label && (\r\n <span className=\"idcard-field-label\" style={labelStyle}>\r\n {field.label}\r\n </span>\r\n )}\r\n <span style={{ width: '100%', textAlign: textTextAlign }}>\r\n <span className=\"idcard-field-value\" style={textStyle}>{String(value || field.placeholder || '')}</span>\r\n </span>\r\n </div>\r\n );\r\n } else {\r\n // For column layout (label on top), let container alignment handle positioning\r\n const labelStyle: React.CSSProperties = { \r\n fontSize: labelFontSize, \r\n fontWeight: labelFontWeight, \r\n color: labelColor, \r\n opacity: 0.7, \r\n textTransform: labelTextTransform,\r\n width: '100%',\r\n textAlign: labelTextAlign\r\n };\r\n \r\n const textStyle: React.CSSProperties = { \r\n textTransform: textTextTransform, \r\n fontSize: textFontSize, \r\n fontWeight: textFontWeight, \r\n color: textColor,\r\n width: '100%',\r\n textAlign: textTextAlign\r\n };\r\n \r\n return (\r\n <div\r\n key={field.id}\r\n id={field.id}\r\n style={combinedStyle}\r\n onClick={handleClick}\r\n className=\"idcard-field idcard-field-text\"\r\n >\r\n {field.label && (\r\n <span className=\"idcard-field-label\" style={labelStyle}>\r\n {field.label}\r\n </span>\r\n )}\r\n <span className=\"idcard-field-value\" style={textStyle}>{String(value || field.placeholder || '')}</span>\r\n </div>\r\n );\r\n }\r\n }\r\n\r\n case 'label': {\r\n const labelTextTransform = field.style?.labelTextTransform || 'none';\r\n return (\r\n <div\r\n key={field.id}\r\n id={field.id}\r\n style={combinedStyle}\r\n onClick={handleClick}\r\n className=\"idcard-field idcard-field-label\"\r\n >\r\n <span style={{ textTransform: labelTextTransform }}>{field.staticText || field.label || ''}</span>\r\n </div>\r\n );\r\n }\r\n\r\n case 'image':\r\n return (\r\n <div\r\n key={field.id}\r\n id={field.id}\r\n style={combinedStyle}\r\n onClick={handleClick}\r\n >\r\n {value ? (\r\n <img\r\n src={String(value)}\r\n alt={field.label || 'Image'}\r\n style={{\r\n width: '100%',\r\n display: 'block',\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 }}\r\n >\r\n {field.label || 'Photo'}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n case 'qrcode':\r\n const qrDataUrl = field.qrFields\r\n ? generateQrCodeFromFields(data, field.qrFields, Math.min(field.position.width, field.position.height) * 2)\r\n : '';\r\n\r\n return (\r\n <div\r\n key={field.id}\r\n id={field.id}\r\n style={{\r\n ...combinedStyle,\r\n backgroundColor: '#fff',\r\n }}\r\n onClick={handleClick}\r\n className=\"idcard-field idcard-field-qrcode\"\r\n >\r\n {qrDataUrl ? (\r\n <img\r\n src={qrDataUrl}\r\n alt=\"QR Code\"\r\n style={{ width: '100%', height: '100%' }}\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 }}\r\n >\r\n QR Code\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n // Card container style\r\n const cardStyle: React.CSSProperties = {\r\n width: Math.round(template.cardSize.width),\r\n height: Math.round(template.cardSize.height),\r\n position: 'relative',\r\n overflow: 'hidden',\r\n backgroundColor: '#fff',\r\n ...style,\r\n };\r\n\r\n return (\r\n <div\r\n id={side === 'front' ? 'idcardfront' : 'idcardback'}\r\n className={`idcard-container idcard-${side} ${className}`}\r\n style={cardStyle}\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: `${Math.round(template.cardSize.width)}px`,\r\n height: `${Math.round(template.cardSize.height)}px`,\r\n zIndex: 0,\r\n }}\r\n />\r\n )}\r\n\r\n {/* Fields */}\r\n {fieldsToRender.map(renderField)}\r\n </div>\r\n );\r\n};\r\n\r\n/**\r\n * Get field value from data based on field configuration\r\n */\r\nfunction getFieldValue(field: FieldMapping, data: IDCardData): string | number | undefined {\r\n if (field.type === 'label') {\r\n return field.staticText;\r\n }\r\n\r\n const value = data[field.fieldKey];\r\n\r\n // Handle array values (like department)\r\n if (Array.isArray(value)) {\r\n return value[0];\r\n }\r\n\r\n return value as string | number | undefined;\r\n}\r\n\r\n"],"names":["useMemo","positionToStyle","fieldStyleToCSS","_jsxs","_jsx","generateQrCodeFromFields"],"mappings":";;;;;;;AAKA;;;;;;;;;;;;;;AAcG;AACI,MAAM,eAAe,GAAmC,CAAC,EAC9D,QAAQ,EACR,IAAI,EACJ,IAAI,GAAG,OAAO,EACd,KAAK,GAAG,CAAC,EACT,SAAS,GAAG,EAAE,EACd,KAAK,GAAG,EAAE,EACV,YAAY,EACZ,QAAQ,GAAG,KAAK,GACK,KAAI;;AAEzB,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,WAAW,GAAG,CAAC,KAAmB,KAAI;QAC1C,MAAM,QAAQ,GAAGC,0BAAe,CAAC,KAAK,CAAC,QAAQ,CAAC;QAChD,IAAI,UAAU,GAAGC,0BAAe,CAAC,KAAK,CAAC,KAAK,CAAC;;QAG7C,IAAI,aAAa,GAAqB,QAAQ;AAC9C,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,aAAa,KAAK,MAAM;YAAE,aAAa,GAAG,KAAK;;QAGzF,IAAI,cAAc,GAAyC,YAAY;QACvE,IAAI,UAAU,GAAqD,YAAY;AAC/E,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;AACzB,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE,SAAS,IAAI,MAAM;YAChF,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,aAAa,IAAI,KAAK;AAEzD,YAAA,IAAI,aAAa,KAAK,QAAQ,EAAE;;gBAE9B,IAAI,aAAa,KAAK,QAAQ;oBAAE,cAAc,GAAG,QAAQ;qBACpD,IAAI,aAAa,KAAK,QAAQ;oBAAE,cAAc,GAAG,UAAU;;oBAC3D,cAAc,GAAG,YAAY;gBAElC,IAAI,SAAS,KAAK,QAAQ;oBAAE,UAAU,GAAG,QAAQ;qBAC5C,IAAI,SAAS,KAAK,OAAO;oBAAE,UAAU,GAAG,UAAU;;oBAClD,UAAU,GAAG,YAAY;YAChC;iBAAO;;;AAGL,gBAAA,IAAI,KAAK,CAAC,KAAK,EAAE,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE,iBAAiB,EAAE;oBACrE,UAAU,GAAG,SAAS;gBACxB;qBAAO;;oBAEL,IAAI,aAAa,KAAK,QAAQ;wBAAE,UAAU,GAAG,QAAQ;yBAChD,IAAI,aAAa,KAAK,QAAQ;wBAAE,UAAU,GAAG,UAAU;;wBACvD,UAAU,GAAG,YAAY;gBAChC;YACF;QACF;;QAGA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE;YACjD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,UAAU;YACxC,UAAU,GAAG,IAAI;QACnB;;AAGA,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,KAAK,UAAU,CAAC,aAAa,EAAE;YACjF,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,GAAG,UAAU;YAC7C,UAAU,GAAG,IAAI;QACnB;AAEA,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,SAAS,GAAG,SAAS;AACxC,YAAA,OAAO,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG,MAAM,GAAG,SAAS;AACnD,YAAA,aAAa,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG,aAAa,GAAG,SAAS;AAChE,YAAA,cAAc,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG,cAAc,GAAG,SAAS;AAClE,YAAA,UAAU,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG,UAAU,GAAG,SAAS;SAC3D;AAED,QAAA,MAAM,WAAW,GAAG,CAAC,CAAmB,KAAI;YAC1C,IAAI,YAAY,EAAE;gBAChB,CAAC,CAAC,eAAe,EAAE;gBACnB,YAAY,CAAC,KAAK,CAAC;YACrB;AACF,QAAA,CAAC;QAED,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC;AAExC,QAAA,QAAQ,KAAK,CAAC,IAAI;YAChB,KAAK,MAAM,EAAE;;AAEX,gBAAA,IAAI,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,aAAa;AAC9C,gBAAA,IAAI,CAAC,aAAa,IAAI,aAAa,KAAK,QAAQ,EAAE;oBAChD,aAAa,GAAG,MAAM;gBACxB;qBAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACxC,oBAAA,MAAM,GAAG,GAAG,UAAU,CAAC,aAAa,CAAC;AACrC,oBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAAE,wBAAA,aAAa,GAAG,GAAG,GAAG,IAAI;;wBACtC,aAAa,GAAG,MAAM;gBAC7B;gBACA,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,EAAE,eAAe,IAAI,QAAQ;gBAChE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,UAAU,IAAI,SAAS;gBACvD,MAAM,kBAAkB,GAAG,KAAK,CAAC,KAAK,EAAE,kBAAkB,IAAI,MAAM;gBACpE,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,EAAE,cAAc,IAAI,MAAM;;AAG5D,gBAAA,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE,QAAQ,IAAI,KAAK;AAChF,gBAAA,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,EAAE,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE,UAAU,IAAI,QAAQ;AACzF,gBAAA,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE,KAAK,IAAI,SAAS;gBAC3E,MAAM,iBAAiB,GAAG,KAAK,CAAC,KAAK,EAAE,aAAa,IAAI,MAAM;AAC9D,gBAAA,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE,SAAS,IAAI,MAAM;;gBAGpF,IAAI,KAAK,CAAC,KAAK,EAAE,aAAa,KAAK,MAAM,EAAE;oBACzC,IAAI,cAAc,GAAqC,YAAY;AACnE,oBAAA,IAAI,KAAK,CAAC,KAAK,EAAE,kBAAkB,KAAK,QAAQ;wBAAE,cAAc,GAAG,QAAQ;AACtE,yBAAA,IAAI,KAAK,CAAC,KAAK,EAAE,kBAAkB,KAAK,QAAQ;wBAAE,cAAc,GAAG,UAAU;oBAElF,IAAI,aAAa,GAAqC,YAAY;AAClE,oBAAA,IAAI,KAAK,CAAC,KAAK,EAAE,iBAAiB,KAAK,QAAQ;wBAAE,aAAa,GAAG,QAAQ;AACpE,yBAAA,IAAI,KAAK,CAAC,KAAK,EAAE,iBAAiB,KAAK,QAAQ;wBAAE,aAAa,GAAG,UAAU;AAEhF,oBAAA,MAAM,UAAU,GAAwB;AACtC,wBAAA,QAAQ,EAAE,aAAa;AACvB,wBAAA,UAAU,EAAE,eAAe;AAC3B,wBAAA,KAAK,EAAE,UAAU;AACjB,wBAAA,OAAO,EAAE,GAAG;AACZ,wBAAA,WAAW,EAAE,CAAC;AACd,wBAAA,SAAS,EAAE,cAAc;AACzB,wBAAA,UAAU,EAAE,QAAQ;AACpB,wBAAA,aAAa,EAAE;qBAChB;AAED,oBAAA,MAAM,SAAS,GAAwB;AACrC,wBAAA,aAAa,EAAE,iBAAiB;AAChC,wBAAA,QAAQ,EAAE,YAAY;AACtB,wBAAA,UAAU,EAAE,cAAc;AAC1B,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,SAAS,EAAE;qBACZ;AAED,oBAAA,QACEC,eAAA,CAAA,KAAA,EAAA,EAEE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,WAAW,EACpB,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAAA,CAEzC,KAAK,CAAC,KAAK,KACVC,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,UAAU,EAAA,QAAA,EACnD,KAAK,CAAC,KAAK,GACP,CACR,EACDA,cAAA,CAAA,MAAA,EAAA,EAAM,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,YACtDA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,SAAS,EAAA,QAAA,EAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,EAAA,CAAQ,GACnG,CAAA,EAAA,EAbF,KAAK,CAAC,EAAE,CAcT;gBAEV;qBAAO;;AAEL,oBAAA,MAAM,UAAU,GAAwB;AACtC,wBAAA,QAAQ,EAAE,aAAa;AACvB,wBAAA,UAAU,EAAE,eAAe;AAC3B,wBAAA,KAAK,EAAE,UAAU;AACjB,wBAAA,OAAO,EAAE,GAAG;AACZ,wBAAA,aAAa,EAAE,kBAAkB;AACjC,wBAAA,KAAK,EAAE,MAAM;AACb,wBAAA,SAAS,EAAE;qBACZ;AAED,oBAAA,MAAM,SAAS,GAAwB;AACrC,wBAAA,aAAa,EAAE,iBAAiB;AAChC,wBAAA,QAAQ,EAAE,YAAY;AACtB,wBAAA,UAAU,EAAE,cAAc;AAC1B,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,KAAK,EAAE,MAAM;AACb,wBAAA,SAAS,EAAE;qBACZ;AAED,oBAAA,QACED,eAAA,CAAA,KAAA,EAAA,EAEE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,WAAW,EACpB,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAAA,CAEzC,KAAK,CAAC,KAAK,KACVC,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,UAAU,EAAA,QAAA,EACnD,KAAK,CAAC,KAAK,EAAA,CACP,CACR,EACDA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,SAAS,EAAA,QAAA,EAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,EAAA,CAAQ,CAAA,EAAA,EAXnG,KAAK,CAAC,EAAE,CAYT;gBAEV;YACF;YAEA,KAAK,OAAO,EAAE;gBACZ,MAAM,kBAAkB,GAAG,KAAK,CAAC,KAAK,EAAE,kBAAkB,IAAI,MAAM;gBACpE,QACEA,wBAEE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,WAAW,EACpB,SAAS,EAAC,iCAAiC,YAE3CA,cAAA,CAAA,MAAA,EAAA,EAAM,KAAK,EAAE,EAAE,aAAa,EAAE,kBAAkB,EAAE,YAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,EAAA,CAAQ,EAAA,EAN7F,KAAK,CAAC,EAAE,CAOT;YAEV;AAEA,YAAA,KAAK,OAAO;AACV,gBAAA,QACEA,cAAA,CAAA,KAAA,EAAA,EAEE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,WAAW,EAAA,QAAA,EAEnB,KAAK,IACJA,wBACE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAClB,GAAG,EAAE,KAAK,CAAC,KAAK,IAAI,OAAO,EAC3B,KAAK,EAAE;AACL,4BAAA,KAAK,EAAE,MAAM;AACb,4BAAA,OAAO,EAAE,OAAO;AACjB,yBAAA,EAAA,CACD,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;AACd,yBAAA,EAAA,QAAA,EAEA,KAAK,CAAC,KAAK,IAAI,OAAO,EAAA,CACnB,CACP,EAAA,EA7BI,KAAK,CAAC,EAAE,CA8BT;AAGV,YAAA,KAAK,QAAQ;AACX,gBAAA,MAAM,SAAS,GAAG,KAAK,CAAC;sBACpBC,gCAAwB,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;sBACxG,EAAE;gBAEN,QACED,wBAEE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,KAAK,EAAE;AACL,wBAAA,GAAG,aAAa;AAChB,wBAAA,eAAe,EAAE,MAAM;AACxB,qBAAA,EACD,OAAO,EAAE,WAAW,EACpB,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAE3C,SAAS,IACRA,cAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,SAAS,EACd,GAAG,EAAC,SAAS,EACb,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAA,CACxC,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;AACd,yBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,CAGG,CACP,EAAA,EA9BI,KAAK,CAAC,EAAE,CA+BT;AAGV,YAAA;AACE,gBAAA,OAAO,IAAI;;AAEjB,IAAA,CAAC;;AAGD,IAAA,MAAM,SAAS,GAAwB;QACrC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC1C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC5C,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,eAAe,EAAE,MAAM;AACvB,QAAA,GAAG,KAAK;KACT;AAED,IAAA,QACED,eAAA,CAAA,KAAA,EAAA,EACE,EAAE,EAAE,IAAI,KAAK,OAAO,GAAG,aAAa,GAAG,YAAY,EACnD,SAAS,EAAE,2BAA2B,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,EACzD,KAAK,EAAE,SAAS,aAGf,eAAe,KACdC,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,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA,EAAA,CAAI;AACjD,oBAAA,MAAM,EAAE,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA,EAAA,CAAI;AACnD,oBAAA,MAAM,EAAE,CAAC;iBACV,EAAA,CACD,CACH,EAGA,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA,EAAA,CAC5B;AAEV;AAEA;;AAEG;AACH,SAAS,aAAa,CAAC,KAAmB,EAAE,IAAgB,EAAA;AAC1D,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;QAC1B,OAAO,KAAK,CAAC,UAAU;IACzB;IAEA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;;AAGlC,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,QAAA,OAAO,KAAK,CAAC,CAAC,CAAC;IACjB;AAEA,IAAA,OAAO,KAAoC;AAC7C;;;;"}
|
|
1
|
+
{"version":3,"file":"IDCardGenerator.js","sources":["../../../src/components/IDCardGenerator.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport type { IDCardGeneratorProps, FieldMapping, IDCardData, IDCardTemplate } from '../types';\nimport { fieldStyleToCSS, positionToStyle } from '../utils/styleUtils';\nimport { generateQrCodeFromFields, getQrCodeSize } from '../core/qrUtils';\n\r\n/**\r\n * IDCardGenerator - Renders a completed ID card\r\n * \r\n * Takes a template and user data, then renders the filled card.\r\n * This is the component used to display actual ID cards for individual users.\r\n * \r\n * Example:\r\n * ```tsx\r\n * <IDCardGenerator \r\n * template={myTemplate}\r\n * data={{ name: 'John Doe', photo: '...' }}\r\n * side=\"front\"\r\n * />\r\n * ```\r\n */\r\nexport const IDCardGenerator: React.FC<IDCardGeneratorProps> = ({\r\n template,\r\n data,\r\n side = 'front',\r\n scale = 1,\r\n className = '',\r\n style = {},\r\n onFieldClick,\r\n editable = false,\r\n}: IDCardGeneratorProps) => {\r\n // Get fields for the current side only\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 a single field\r\n const renderField = (field: FieldMapping) => {\r\n const posStyle = positionToStyle(field.position);\r\n let fieldStyle = fieldStyleToCSS(field.style);\r\n \r\n // Determine flex direction and alignment for text fields\r\n let flexDirection: 'column' | 'row' = 'column';\r\n if (field.type === 'text' && field.style?.labelPosition === 'left') flexDirection = 'row';\r\n\r\n // Map verticalAlign and textAlign to flex properties\r\n let justifyContent: 'flex-start' | 'center' | 'flex-end' = 'flex-start';\r\n let alignItems: 'flex-start' | 'center' | 'flex-end' | undefined = 'flex-start';\r\n if (field.type === 'text') {\r\n const textAlign = field.style?.textTextAlign || field.style?.textAlign || 'left';\r\n const verticalAlign = field.style?.verticalAlign || 'top';\r\n \r\n if (flexDirection === 'column') {\r\n // For column: verticalAlign controls justifyContent (vertical), textAlign controls alignItems (horizontal)\r\n if (verticalAlign === 'middle') justifyContent = 'center';\r\n else if (verticalAlign === 'bottom') justifyContent = 'flex-end';\r\n else justifyContent = 'flex-start';\r\n \r\n if (textAlign === 'center') alignItems = 'center';\r\n else if (textAlign === 'right') alignItems = 'flex-end';\r\n else alignItems = 'flex-start';\r\n } else {\r\n // For row: don't set alignItems on container if individual alignments are specified\r\n // Let labelAlignSelf and textAlignSelf handle it\r\n if (field.style?.labelVerticalAlign || field.style?.textVerticalAlign) {\r\n alignItems = undefined;\r\n } else {\r\n // Fall back to general verticalAlign if individual ones aren't specified\r\n if (verticalAlign === 'middle') alignItems = 'center';\r\n else if (verticalAlign === 'bottom') alignItems = 'flex-end';\r\n else alignItems = 'flex-start';\r\n }\r\n }\r\n }\r\n\r\n // Remove fontSize for label fields so text field font size does not affect them\r\n if (field.type === 'label' && fieldStyle.fontSize) {\r\n const { fontSize, ...rest } = fieldStyle;\r\n fieldStyle = rest;\r\n }\r\n\r\n // Remove textTransform from container for text and label fields - applied directly to spans\r\n if ((field.type === 'text' || field.type === 'label') && fieldStyle.textTransform) {\r\n const { textTransform, ...rest } = fieldStyle;\r\n fieldStyle = rest;\r\n }\r\n\r\n const combinedStyle: React.CSSProperties = {\n ...posStyle,\n ...fieldStyle,\n backgroundColor: field.type === 'qrcode' ? 'transparent' : fieldStyle.backgroundColor,\n zIndex: field.zIndex || 1,\n boxSizing: 'border-box',\n overflow: 'hidden',\n cursor: editable ? 'pointer' : 'default',\n display: field.type === 'text' || field.type === 'qrcode' ? 'flex' : undefined,\n flexDirection: field.type === 'text' ? flexDirection : undefined,\n justifyContent: field.type === 'text' ? justifyContent : field.type === 'qrcode' ? 'center' : undefined,\n alignItems: field.type === 'text' ? alignItems : field.type === 'qrcode' ? 'center' : undefined,\n };\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n if (onFieldClick) {\r\n e.stopPropagation();\r\n onFieldClick(field);\r\n }\r\n };\r\n\r\n const value = getFieldValue(field, data);\r\n\r\n switch (field.type) {\r\n case 'text': {\r\n // Label style properties\r\n let labelFontSize = field.style?.labelFontSize;\r\n if (!labelFontSize || labelFontSize === '0.75em') {\r\n labelFontSize = '12px';\r\n } else if (!labelFontSize.endsWith('px')) {\r\n const num = parseFloat(labelFontSize);\r\n if (!isNaN(num)) labelFontSize = num + 'px';\r\n else labelFontSize = '12px';\r\n }\r\n const labelFontWeight = field.style?.labelFontWeight || 'normal';\r\n const labelColor = field.style?.labelColor || '#666666';\r\n const labelTextTransform = field.style?.labelTextTransform || 'none';\r\n const labelTextAlign = field.style?.labelTextAlign || 'left';\r\n \r\n // Text/value style properties (separate from label)\r\n const textFontSize = field.style?.textFontSize || field.style?.fontSize || '1em';\r\n const textFontWeight = field.style?.textFontWeight || field.style?.fontWeight || 'normal';\r\n const textColor = field.style?.textColor || field.style?.color || '#000000';\r\n const textTextTransform = field.style?.textTransform || 'none';\r\n const textTextAlign = field.style?.textTextAlign || field.style?.textAlign || 'left';\r\n \r\n // For row layout (label on left), use individual span alignment\r\n if (field.style?.labelPosition === 'left') {\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 \r\n let textAlignSelf: React.CSSProperties['alignSelf'] = 'flex-start';\r\n if (field.style?.textVerticalAlign === 'middle') textAlignSelf = 'center';\r\n else if (field.style?.textVerticalAlign === 'bottom') textAlignSelf = 'flex-end';\r\n \r\n const labelStyle: React.CSSProperties = { \r\n fontSize: labelFontSize, \r\n fontWeight: labelFontWeight, \r\n color: labelColor, \r\n opacity: 0.7, \r\n marginRight: 8, \r\n alignSelf: labelAlignSelf, \r\n whiteSpace: 'nowrap', \r\n textTransform: labelTextTransform \r\n };\r\n \r\n const textStyle: React.CSSProperties = { \r\n textTransform: textTextTransform, \r\n fontSize: textFontSize, \r\n fontWeight: textFontWeight, \r\n color: textColor, \r\n alignSelf: textAlignSelf\r\n };\r\n \r\n return (\r\n <div\r\n key={field.id}\r\n id={field.id}\r\n style={combinedStyle}\r\n onClick={handleClick}\r\n className=\"idcard-field idcard-field-text\"\r\n >\r\n {field.label && (\r\n <span className=\"idcard-field-label\" style={labelStyle}>\r\n {field.label}\r\n </span>\r\n )}\r\n <span style={{ width: '100%', textAlign: textTextAlign }}>\r\n <span className=\"idcard-field-value\" style={textStyle}>{String(value || field.placeholder || '')}</span>\r\n </span>\r\n </div>\r\n );\r\n } else {\r\n // For column layout (label on top), let container alignment handle positioning\r\n const labelStyle: React.CSSProperties = { \r\n fontSize: labelFontSize, \r\n fontWeight: labelFontWeight, \r\n color: labelColor, \r\n opacity: 0.7, \r\n textTransform: labelTextTransform,\r\n width: '100%',\r\n textAlign: labelTextAlign\r\n };\r\n \r\n const textStyle: React.CSSProperties = { \r\n textTransform: textTextTransform, \r\n fontSize: textFontSize, \r\n fontWeight: textFontWeight, \r\n color: textColor,\r\n width: '100%',\r\n textAlign: textTextAlign\r\n };\r\n \r\n return (\r\n <div\r\n key={field.id}\r\n id={field.id}\r\n style={combinedStyle}\r\n onClick={handleClick}\r\n className=\"idcard-field idcard-field-text\"\r\n >\r\n {field.label && (\r\n <span className=\"idcard-field-label\" style={labelStyle}>\r\n {field.label}\r\n </span>\r\n )}\r\n <span className=\"idcard-field-value\" style={textStyle}>{String(value || field.placeholder || '')}</span>\r\n </div>\r\n );\r\n }\r\n }\r\n\r\n case 'label': {\r\n const labelTextTransform = field.style?.labelTextTransform || 'none';\r\n return (\r\n <div\r\n key={field.id}\r\n id={field.id}\r\n style={combinedStyle}\r\n onClick={handleClick}\r\n className=\"idcard-field idcard-field-label\"\r\n >\r\n <span style={{ textTransform: labelTextTransform }}>{field.staticText || field.label || ''}</span>\r\n </div>\r\n );\r\n }\r\n\r\n case 'image':\r\n return (\r\n <div\r\n key={field.id}\r\n id={field.id}\r\n style={combinedStyle}\r\n onClick={handleClick}\r\n >\r\n {value ? (\r\n <img\r\n src={String(value)}\r\n alt={field.label || 'Image'}\r\n style={{\r\n width: '100%',\r\n display: 'block',\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 }}\r\n >\r\n {field.label || 'Photo'}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\n case 'qrcode':\n const qrSize = getQrCodeSize(field.position.width, field.position.height);\n const qrDataUrl = field.qrFields?.length\n ? generateQrCodeFromFields(\n data,\n field.qrFields,\n qrSize\n )\n : '';\n\n return (\n <div\n key={field.id}\n id={field.id}\n style={combinedStyle}\n onClick={handleClick}\n className=\"idcard-field idcard-field-qrcode\"\n >\n {qrDataUrl ? (\n <img\n src={qrDataUrl}\n alt=\"QR Code\"\n data-qr-code-image=\"true\"\n style={{\n width: `${qrSize}px`,\n height: `${qrSize}px`,\n display: 'block',\n backgroundColor: 'transparent',\n objectFit: 'contain',\n objectPosition: 'center',\n maxWidth: '100%',\n maxHeight: '100%',\n flexShrink: 0,\n }}\n />\n ) : (\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 }}\r\n >\r\n QR Code\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n // Card container style\r\n const cardStyle: React.CSSProperties = {\r\n width: Math.round(template.cardSize.width),\r\n height: Math.round(template.cardSize.height),\r\n position: 'relative',\r\n overflow: 'hidden',\r\n backgroundColor: '#fff',\r\n ...style,\r\n };\r\n\r\n return (\r\n <div\r\n id={side === 'front' ? 'idcardfront' : 'idcardback'}\r\n className={`idcard-container idcard-${side} ${className}`}\r\n style={cardStyle}\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: `${Math.round(template.cardSize.width)}px`,\r\n height: `${Math.round(template.cardSize.height)}px`,\r\n zIndex: 0,\r\n }}\r\n />\r\n )}\r\n\r\n {/* Fields */}\r\n {fieldsToRender.map(renderField)}\r\n </div>\r\n );\r\n};\r\n\r\n/**\r\n * Get field value from data based on field configuration\r\n */\r\nfunction getFieldValue(field: FieldMapping, data: IDCardData): string | number | undefined {\r\n if (field.type === 'label') {\r\n return field.staticText;\r\n }\r\n\r\n const value = data[field.fieldKey];\r\n\r\n // Handle array values (like department)\r\n if (Array.isArray(value)) {\r\n return value[0];\r\n }\r\n\r\n return value as string | number | undefined;\r\n}\r\n\r\n"],"names":["useMemo","positionToStyle","fieldStyleToCSS","_jsxs","_jsx","getQrCodeSize","generateQrCodeFromFields"],"mappings":"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"}
|
|
@@ -103,16 +103,17 @@ const IDCardPreview = ({ template, data, side, scale = 1, showGrid = false, onFi
|
|
|
103
103
|
const combinedStyle = {
|
|
104
104
|
...posStyle,
|
|
105
105
|
...fieldStyle,
|
|
106
|
+
backgroundColor: field.type === 'qrcode' ? 'transparent' : fieldStyle.backgroundColor,
|
|
106
107
|
zIndex: field.zIndex || 1,
|
|
107
108
|
boxSizing: 'border-box',
|
|
108
109
|
overflow: 'hidden',
|
|
109
110
|
cursor: editable ? 'move' : 'default',
|
|
110
111
|
outline: isSelected ? '2px solid #2196F3' : 'none',
|
|
111
112
|
outlineOffset: '1px',
|
|
112
|
-
display: field.type === 'text' ? 'flex' : undefined,
|
|
113
|
+
display: field.type === 'text' || field.type === 'qrcode' ? 'flex' : undefined,
|
|
113
114
|
flexDirection: field.type === 'text' ? flexDirection : undefined,
|
|
114
|
-
justifyContent: field.type === 'text' ? justifyContent : undefined,
|
|
115
|
-
alignItems: field.type === 'text' ? alignItems : undefined,
|
|
115
|
+
justifyContent: field.type === 'text' ? justifyContent : field.type === 'qrcode' ? 'center' : undefined,
|
|
116
|
+
alignItems: field.type === 'text' ? alignItems : field.type === 'qrcode' ? 'center' : undefined,
|
|
116
117
|
};
|
|
117
118
|
const handleClick = (e) => {
|
|
118
119
|
e.stopPropagation();
|
|
@@ -218,15 +219,22 @@ const IDCardPreview = ({ template, data, side, scale = 1, showGrid = false, onFi
|
|
|
218
219
|
flexDirection: 'column',
|
|
219
220
|
}, children: [jsxRuntime.jsx("span", { children: "\uD83D\uDCF7" }), jsxRuntime.jsx("span", { children: field.label || 'Photo' })] }));
|
|
220
221
|
case 'qrcode':
|
|
221
|
-
|
|
222
|
-
const
|
|
223
|
-
const qrHeight = Math.max(32, Math.round(field.position.height));
|
|
224
|
-
// Always generate QR code at the field's current size for smooth scaling
|
|
225
|
-
const qrSize = Math.max(qrWidth, qrHeight);
|
|
226
|
-
const qrDataUrl = field.qrFields
|
|
222
|
+
const qrSize = qrUtils.getQrCodeSize(field.position.width, field.position.height);
|
|
223
|
+
const qrDataUrl = field.qrFields?.length
|
|
227
224
|
? qrUtils.generateQrCodeFromFields(data, field.qrFields, qrSize)
|
|
228
225
|
: '';
|
|
229
|
-
return qrDataUrl ? (jsxRuntime.jsx("img", { src: qrDataUrl, alt: "QR Code",
|
|
226
|
+
return qrDataUrl ? (jsxRuntime.jsx("img", { src: qrDataUrl, alt: "QR Code", "data-qr-code-image": "true", style: {
|
|
227
|
+
width: `${qrSize}px`,
|
|
228
|
+
height: `${qrSize}px`,
|
|
229
|
+
display: 'block',
|
|
230
|
+
pointerEvents: 'none',
|
|
231
|
+
backgroundColor: 'transparent',
|
|
232
|
+
objectFit: 'contain',
|
|
233
|
+
objectPosition: 'center',
|
|
234
|
+
maxWidth: '100%',
|
|
235
|
+
maxHeight: '100%',
|
|
236
|
+
flexShrink: 0,
|
|
237
|
+
} })) : (jsxRuntime.jsx("div", { style: {
|
|
230
238
|
width: '100%',
|
|
231
239
|
height: '100%',
|
|
232
240
|
backgroundColor: '#f0f0f0',
|
|
@@ -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 let fieldStyle = fieldStyleToCSS(field.style);\r\n const isSelected = field.id === selectedFieldId;\r\n\r\n // Determine flex direction and alignment for text fields\r\n let flexDirection: 'column' | 'row' = 'column';\r\n if (field.type === 'text' && field.style?.labelPosition === 'left') flexDirection = 'row';\r\n\r\n // Map verticalAlign and textAlign to flex properties\r\n let justifyContent: 'flex-start' | 'center' | 'flex-end' = 'flex-start';\r\n let alignItems: 'flex-start' | 'center' | 'flex-end' = 'flex-start';\r\n if (field.type === 'text') {\r\n const textAlign = field.style?.textTextAlign || field.style?.textAlign || 'left';\r\n const verticalAlign = field.style?.verticalAlign || 'top';\r\n \r\n if (flexDirection === 'column') {\r\n // For column: verticalAlign controls justifyContent (vertical), textAlign controls alignItems (horizontal)\r\n if (verticalAlign === 'middle') justifyContent = 'center';\r\n else if (verticalAlign === 'bottom') justifyContent = 'flex-end';\r\n else justifyContent = 'flex-start';\r\n \r\n if (textAlign === 'center') alignItems = 'center';\r\n else if (textAlign === 'right') alignItems = 'flex-end';\r\n else alignItems = 'flex-start';\r\n } else {\r\n // For row: verticalAlign controls alignItems (vertical)\r\n if (verticalAlign === 'middle') alignItems = 'center';\r\n else if (verticalAlign === 'bottom') alignItems = 'flex-end';\r\n else alignItems = 'flex-start';\r\n // justifyContent can be left as default for row\r\n }\r\n }\r\n\r\n // Remove fontSize for label fields so text field font size does not affect them\r\n if (field.type === 'label' && fieldStyle.fontSize) {\r\n const { fontSize, ...rest } = fieldStyle;\r\n fieldStyle = rest;\r\n }\r\n\r\n // Remove textTransform from container for text and label fields - applied directly to spans\r\n if ((field.type === 'text' || field.type === 'label') && fieldStyle.textTransform) {\r\n const { textTransform, ...rest } = fieldStyle;\r\n fieldStyle = rest;\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' ? justifyContent : undefined,\r\n alignItems: field.type === 'text' ? alignItems : 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\r\n switch (field.type) {\r\n case 'text': {\r\n // Label style properties\r\n // Always use px for label font size, default 12px\r\n let labelFontSize = field.style?.labelFontSize;\r\n if (!labelFontSize || labelFontSize === '0.75em') {\r\n labelFontSize = '12px';\r\n } else if (!labelFontSize.endsWith('px')) {\r\n const num = parseFloat(labelFontSize);\r\n if (!isNaN(num)) labelFontSize = num + 'px';\r\n else labelFontSize = '12px';\r\n }\r\n const labelFontWeight = field.style?.labelFontWeight || 'normal';\r\n const labelColor = field.style?.labelColor || '#666666';\r\n const labelTextTransform = field.style?.labelTextTransform || 'none';\r\n const labelTextAlign = field.style?.labelTextAlign || 'left';\r\n \r\n // Text/value style properties (separate from label)\r\n const textFontSize = field.style?.textFontSize || field.style?.fontSize || '1em';\r\n const textFontWeight = field.style?.textFontWeight || field.style?.fontWeight || 'normal';\r\n const textColor = field.style?.textColor || field.style?.color || '#000000';\r\n const textTextTransform = field.style?.textTransform || 'none';\r\n const textTextAlign = field.style?.textTextAlign || field.style?.textAlign || 'left';\r\n \r\n // For row layout (label on left), use individual span alignment\r\n if (field.style?.labelPosition === 'left') {\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 \r\n let textAlignSelf: React.CSSProperties['alignSelf'] = 'flex-start';\r\n if (field.style?.textVerticalAlign === 'middle') textAlignSelf = 'center';\r\n else if (field.style?.textVerticalAlign === 'bottom') textAlignSelf = 'flex-end';\r\n \r\n const labelStyle: React.CSSProperties = { \r\n fontSize: labelFontSize, \r\n fontWeight: labelFontWeight, \r\n color: labelColor, \r\n opacity: 0.7, \r\n marginRight: 8, \r\n alignSelf: labelAlignSelf, \r\n whiteSpace: 'nowrap', \r\n textTransform: labelTextTransform \r\n };\r\n \r\n const textStyle: React.CSSProperties = { \r\n textTransform: textTextTransform, \r\n fontSize: textFontSize, \r\n fontWeight: textFontWeight, \r\n color: textColor, \r\n alignSelf: textAlignSelf\r\n };\r\n \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 style={{ width: '100%', textAlign: textTextAlign }}>\r\n <span style={textStyle}>{String(value || field.placeholder || field.fieldKey)}</span>\r\n </span>\r\n </>\r\n );\r\n } else {\r\n // For column layout (label on top), let container alignment handle positioning\r\n const labelStyle: React.CSSProperties = { \r\n fontSize: labelFontSize, \r\n fontWeight: labelFontWeight, \r\n color: labelColor, \r\n opacity: 0.7, \r\n textTransform: labelTextTransform,\r\n width: '100%',\r\n textAlign: labelTextAlign\r\n };\r\n \r\n const textStyle: React.CSSProperties = { \r\n textTransform: textTextTransform, \r\n fontSize: textFontSize, \r\n fontWeight: textFontWeight, \r\n color: textColor,\r\n width: '100%',\r\n textAlign: textTextAlign\r\n };\r\n \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 style={textStyle}>{String(value || field.placeholder || field.fieldKey)}</span>\r\n </>\r\n );\r\n }\r\n }\r\n\r\n case 'label': {\r\n const labelTextTransform = field.style?.labelTextTransform || 'none';\r\n return <span style={{ textTransform: labelTextTransform }}>{field.staticText || field.label || 'Label'}</span>;\r\n }\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 display: 'block',\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 // Use the field's rendered width/height (in px) for QR code size\r\n const qrWidth = Math.max(32, Math.round(field.position.width));\r\n const qrHeight = Math.max(32, Math.round(field.position.height));\r\n // Always generate QR code at the field's current size for smooth scaling\r\n const qrSize = Math.max(qrWidth, qrHeight);\r\n const qrDataUrl = field.qrFields\r\n ? generateQrCodeFromFields(data, field.qrFields, qrSize)\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%', display: 'block', pointerEvents: 'none' }}\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: Math.round(template.cardSize.width),\r\n height: Math.round(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 };\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: `${Math.round(template.cardSize.width)}px`,\r\n height: `${Math.round(template.cardSize.height)}px`,\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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"}
|
|
1
|
+
{"version":3,"file":"IDCardPreview.js","sources":["../../../src/components/IDCardPreview.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport type { IDCardPreviewProps, FieldMapping } from '../types';\nimport { fieldStyleToCSS, positionToStyle } from '../utils/styleUtils';\nimport { generateQrCodeFromFields, getQrCodeSize } from '../core/qrUtils';\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 let fieldStyle = fieldStyleToCSS(field.style);\r\n const isSelected = field.id === selectedFieldId;\r\n\r\n // Determine flex direction and alignment for text fields\r\n let flexDirection: 'column' | 'row' = 'column';\r\n if (field.type === 'text' && field.style?.labelPosition === 'left') flexDirection = 'row';\r\n\r\n // Map verticalAlign and textAlign to flex properties\r\n let justifyContent: 'flex-start' | 'center' | 'flex-end' = 'flex-start';\r\n let alignItems: 'flex-start' | 'center' | 'flex-end' = 'flex-start';\r\n if (field.type === 'text') {\r\n const textAlign = field.style?.textTextAlign || field.style?.textAlign || 'left';\r\n const verticalAlign = field.style?.verticalAlign || 'top';\r\n \r\n if (flexDirection === 'column') {\r\n // For column: verticalAlign controls justifyContent (vertical), textAlign controls alignItems (horizontal)\r\n if (verticalAlign === 'middle') justifyContent = 'center';\r\n else if (verticalAlign === 'bottom') justifyContent = 'flex-end';\r\n else justifyContent = 'flex-start';\r\n \r\n if (textAlign === 'center') alignItems = 'center';\r\n else if (textAlign === 'right') alignItems = 'flex-end';\r\n else alignItems = 'flex-start';\r\n } else {\r\n // For row: verticalAlign controls alignItems (vertical)\r\n if (verticalAlign === 'middle') alignItems = 'center';\r\n else if (verticalAlign === 'bottom') alignItems = 'flex-end';\r\n else alignItems = 'flex-start';\r\n // justifyContent can be left as default for row\r\n }\r\n }\r\n\r\n // Remove fontSize for label fields so text field font size does not affect them\r\n if (field.type === 'label' && fieldStyle.fontSize) {\r\n const { fontSize, ...rest } = fieldStyle;\r\n fieldStyle = rest;\r\n }\r\n\r\n // Remove textTransform from container for text and label fields - applied directly to spans\r\n if ((field.type === 'text' || field.type === 'label') && fieldStyle.textTransform) {\r\n const { textTransform, ...rest } = fieldStyle;\r\n fieldStyle = rest;\r\n }\r\n\r\n const combinedStyle: React.CSSProperties = {\n ...posStyle,\n ...fieldStyle,\n backgroundColor: field.type === 'qrcode' ? 'transparent' : fieldStyle.backgroundColor,\n zIndex: field.zIndex || 1,\n boxSizing: 'border-box',\n overflow: 'hidden',\n cursor: editable ? 'move' : 'default',\n outline: isSelected ? '2px solid #2196F3' : 'none',\n outlineOffset: '1px',\n display: field.type === 'text' || field.type === 'qrcode' ? 'flex' : undefined,\n flexDirection: field.type === 'text' ? flexDirection : undefined,\n justifyContent: field.type === 'text' ? justifyContent : field.type === 'qrcode' ? 'center' : undefined,\n alignItems: field.type === 'text' ? alignItems : field.type === 'qrcode' ? 'center' : undefined,\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\r\n switch (field.type) {\r\n case 'text': {\r\n // Label style properties\r\n // Always use px for label font size, default 12px\r\n let labelFontSize = field.style?.labelFontSize;\r\n if (!labelFontSize || labelFontSize === '0.75em') {\r\n labelFontSize = '12px';\r\n } else if (!labelFontSize.endsWith('px')) {\r\n const num = parseFloat(labelFontSize);\r\n if (!isNaN(num)) labelFontSize = num + 'px';\r\n else labelFontSize = '12px';\r\n }\r\n const labelFontWeight = field.style?.labelFontWeight || 'normal';\r\n const labelColor = field.style?.labelColor || '#666666';\r\n const labelTextTransform = field.style?.labelTextTransform || 'none';\r\n const labelTextAlign = field.style?.labelTextAlign || 'left';\r\n \r\n // Text/value style properties (separate from label)\r\n const textFontSize = field.style?.textFontSize || field.style?.fontSize || '1em';\r\n const textFontWeight = field.style?.textFontWeight || field.style?.fontWeight || 'normal';\r\n const textColor = field.style?.textColor || field.style?.color || '#000000';\r\n const textTextTransform = field.style?.textTransform || 'none';\r\n const textTextAlign = field.style?.textTextAlign || field.style?.textAlign || 'left';\r\n \r\n // For row layout (label on left), use individual span alignment\r\n if (field.style?.labelPosition === 'left') {\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 \r\n let textAlignSelf: React.CSSProperties['alignSelf'] = 'flex-start';\r\n if (field.style?.textVerticalAlign === 'middle') textAlignSelf = 'center';\r\n else if (field.style?.textVerticalAlign === 'bottom') textAlignSelf = 'flex-end';\r\n \r\n const labelStyle: React.CSSProperties = { \r\n fontSize: labelFontSize, \r\n fontWeight: labelFontWeight, \r\n color: labelColor, \r\n opacity: 0.7, \r\n marginRight: 8, \r\n alignSelf: labelAlignSelf, \r\n whiteSpace: 'nowrap', \r\n textTransform: labelTextTransform \r\n };\r\n \r\n const textStyle: React.CSSProperties = { \r\n textTransform: textTextTransform, \r\n fontSize: textFontSize, \r\n fontWeight: textFontWeight, \r\n color: textColor, \r\n alignSelf: textAlignSelf\r\n };\r\n \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 style={{ width: '100%', textAlign: textTextAlign }}>\r\n <span style={textStyle}>{String(value || field.placeholder || field.fieldKey)}</span>\r\n </span>\r\n </>\r\n );\r\n } else {\r\n // For column layout (label on top), let container alignment handle positioning\r\n const labelStyle: React.CSSProperties = { \r\n fontSize: labelFontSize, \r\n fontWeight: labelFontWeight, \r\n color: labelColor, \r\n opacity: 0.7, \r\n textTransform: labelTextTransform,\r\n width: '100%',\r\n textAlign: labelTextAlign\r\n };\r\n \r\n const textStyle: React.CSSProperties = { \r\n textTransform: textTextTransform, \r\n fontSize: textFontSize, \r\n fontWeight: textFontWeight, \r\n color: textColor,\r\n width: '100%',\r\n textAlign: textTextAlign\r\n };\r\n \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 style={textStyle}>{String(value || field.placeholder || field.fieldKey)}</span>\r\n </>\r\n );\r\n }\r\n }\r\n\r\n case 'label': {\r\n const labelTextTransform = field.style?.labelTextTransform || 'none';\r\n return <span style={{ textTransform: labelTextTransform }}>{field.staticText || field.label || 'Label'}</span>;\r\n }\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 display: 'block',\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\n case 'qrcode':\n const qrSize = getQrCodeSize(field.position.width, field.position.height);\n const qrDataUrl = field.qrFields?.length\n ? generateQrCodeFromFields(data, field.qrFields, qrSize)\n : '';\n\r\n return qrDataUrl ? (\r\n <img\n src={qrDataUrl}\n alt=\"QR Code\"\n data-qr-code-image=\"true\"\n style={{\n width: `${qrSize}px`,\n height: `${qrSize}px`,\n display: 'block',\n pointerEvents: 'none',\n backgroundColor: 'transparent',\n objectFit: 'contain',\n objectPosition: 'center',\n maxWidth: '100%',\n maxHeight: '100%',\n flexShrink: 0,\n }}\n />\n ) : (\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: Math.round(template.cardSize.width),\r\n height: Math.round(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 };\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: `${Math.round(template.cardSize.width)}px`,\r\n height: `${Math.round(template.cardSize.height)}px`,\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","getQrCodeSize","generateQrCodeFromFields"],"mappings":"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"}
|
|
@@ -15,6 +15,21 @@ const defaultCanvasOptions = {
|
|
|
15
15
|
backgroundColor: '#ffffff', // White background to prevent black screen
|
|
16
16
|
foreignObjectRendering: false, // Disable foreign object rendering for better compatibility
|
|
17
17
|
};
|
|
18
|
+
function refreshQrCodeForExport(qrElementId, data, qrFields, scale) {
|
|
19
|
+
if (!qrElementId || !data || !qrFields || qrFields.length === 0) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const qrElement = document.getElementById(qrElementId);
|
|
23
|
+
const qrRect = qrElement?.getBoundingClientRect();
|
|
24
|
+
const qrSize = qrRect
|
|
25
|
+
? qrUtils.getQrCodeSize(qrRect.width, qrRect.height, scale)
|
|
26
|
+
: qrUtils.getQrCodeSize(0, 0, scale);
|
|
27
|
+
const qrData = qrUtils.getQrCodeDataFromFields(data, qrFields);
|
|
28
|
+
if (Object.keys(qrData).length === 0) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
qrUtils.setQrCodeOnElement(qrElementId, qrData, qrSize);
|
|
32
|
+
}
|
|
18
33
|
/**
|
|
19
34
|
* Capture a DOM element as a high-resolution canvas
|
|
20
35
|
* Uses html2canvas to convert the element to an image
|
|
@@ -61,16 +76,7 @@ async function captureElement(elementId, scale = 2) {
|
|
|
61
76
|
async function downloadIDCardAsPDF(options) {
|
|
62
77
|
try {
|
|
63
78
|
const { frontElementId = 'idcardfront', backElementId, filename = 'ID_Card', data, qrElementId, qrFields, scale = 10, } = options;
|
|
64
|
-
|
|
65
|
-
if (qrElementId && data && qrFields && qrFields.length > 0) {
|
|
66
|
-
const qrData = {};
|
|
67
|
-
for (const field of qrFields) {
|
|
68
|
-
if (data[field] !== undefined) {
|
|
69
|
-
qrData[field] = data[field];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
qrUtils.setQrCodeOnElement(qrElementId, qrData, 200);
|
|
73
|
-
}
|
|
79
|
+
refreshQrCodeForExport(qrElementId, data, qrFields, scale);
|
|
74
80
|
// Wait for QR code and any images to fully render
|
|
75
81
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
76
82
|
const pages = [];
|
|
@@ -128,16 +134,7 @@ async function downloadIDCardAsPDF(options) {
|
|
|
128
134
|
async function downloadIDCardAsImage(options) {
|
|
129
135
|
try {
|
|
130
136
|
const { frontElementId = 'idcardfront', filename = 'ID_Card', data, qrElementId, qrFields, format = 'png', scale = 2, quality = 1.0, } = options;
|
|
131
|
-
|
|
132
|
-
if (qrElementId && data && qrFields && qrFields.length > 0) {
|
|
133
|
-
const qrData = {};
|
|
134
|
-
for (const field of qrFields) {
|
|
135
|
-
if (data[field] !== undefined) {
|
|
136
|
-
qrData[field] = data[field];
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
qrUtils.setQrCodeOnElement(qrElementId, qrData, 200);
|
|
140
|
-
}
|
|
137
|
+
refreshQrCodeForExport(qrElementId, data, qrFields, scale);
|
|
141
138
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
142
139
|
const capture = await captureElement(frontElementId, scale);
|
|
143
140
|
if (!capture) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exportUtils.js","sources":["../../../src/core/exportUtils.ts"],"sourcesContent":["import html2canvas from 'html2canvas';\r\nimport jsPDF from 'jspdf';\r\nimport type { ExportOptions, ExportResult, IDCardData } from '../types';\r\nimport { setQrCodeOnElement } from './qrUtils';\r\n\r\ninterface DownloadIDCardOptions {\r\n frontElementId?: string;\r\n backElementId?: string;\r\n filename?: string;\r\n data?: IDCardData;\r\n qrElementId?: string;\r\n qrFields?: string[];\r\n format?: 'pdf' | 'png' | 'jpeg';\r\n scale?: number; // Canvas scale for quality (higher = better, but slower)\r\n quality?: number; // JPEG quality (0-1)\r\n}\r\n\r\n// High-quality canvas rendering defaults\r\nconst defaultCanvasOptions = {\r\n scale: 2, // 2x resolution for good quality without precision issues\r\n imageTimeout: 15000,\r\n letterRendering: true,\r\n logging: false,\r\n useCORS: true, // Allow cross-origin images\r\n allowTaint: true, // Allow cross-origin images to taint canvas\r\n backgroundColor: '#ffffff', // White background to prevent black screen\r\n foreignObjectRendering: false, // Disable foreign object rendering for better compatibility\r\n};\r\n\r\n/**\r\n * Capture a DOM element as a high-resolution canvas\r\n * Uses html2canvas to convert the element to an image\r\n * Captures the element directly as rendered on screen to preserve exact positioning\r\n * @returns Canvas and the original element, or null if not found\r\n */\r\nasync function captureElement(\r\n elementId: string,\r\n scale = 2\r\n): Promise<{ canvas: HTMLCanvasElement; element: HTMLElement } | null> {\r\n const element = document.getElementById(elementId);\r\n if (!element) return null;\r\n\r\n // Get actual rendered dimensions\r\n const rect = element.getBoundingClientRect();\r\n \r\n // Wait for images to load\r\n const images = element.querySelectorAll('img');\r\n await Promise.all(\r\n Array.from(images).map(\r\n (img) =>\r\n new Promise<void>((resolve) => {\r\n if (img.complete) {\r\n resolve();\r\n } else {\r\n img.onload = () => resolve();\r\n img.onerror = () => resolve();\r\n }\r\n })\r\n )\r\n );\r\n \r\n // Small delay to ensure styles are applied\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n \r\n // Capture the element directly as it appears on screen\r\n // This preserves all styling exactly as rendered\r\n const canvas = await html2canvas(element, {\r\n ...defaultCanvasOptions,\r\n scale,\r\n width: rect.width,\r\n height: rect.height,\r\n windowWidth: element.scrollWidth,\r\n windowHeight: element.scrollHeight,\r\n });\r\n\r\n return { canvas, element };\r\n}\r\n\r\n/**\r\n * Download ID card(s) as a PDF file\r\n * Captures DOM elements and converts them to a multi-page PDF\r\n * @param options - Configuration for PDF export\r\n * @returns Export result with success status and any errors\r\n */\r\nexport async function downloadIDCardAsPDF(\r\n options: DownloadIDCardOptions\r\n): Promise<ExportResult> {\r\n try {\r\n const {\r\n frontElementId = 'idcardfront',\r\n backElementId,\r\n filename = 'ID_Card',\r\n data,\r\n qrElementId,\r\n qrFields,\r\n scale = 10,\r\n } = options;\r\n\r\n // Generate QR code if configured\r\n if (qrElementId && data && qrFields && qrFields.length > 0) {\r\n const qrData: Record<string, unknown> = {};\r\n for (const field of qrFields) {\r\n if (data[field] !== undefined) {\r\n qrData[field] = data[field];\r\n }\r\n }\r\n setQrCodeOnElement(qrElementId, qrData, 200);\r\n }\r\n\r\n // Wait for QR code and any images to fully render\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n\r\n const pages: { canvas: HTMLCanvasElement; element: HTMLElement }[] = [];\r\n\r\n // Capture front\r\n const frontCapture = await captureElement(frontElementId, scale);\r\n if (frontCapture) pages.push(frontCapture);\r\n\r\n // Capture back if exists\r\n if (backElementId) {\r\n const backCapture = await captureElement(backElementId, scale);\r\n if (backCapture) pages.push(backCapture);\r\n }\r\n\r\n if (pages.length === 0) {\r\n return { success: false, error: 'No elements found to capture' };\r\n }\r\n\r\n let pdf: jsPDF | undefined;\r\n\r\n for (let i = 0; i < pages.length; i++) {\r\n const { canvas, element } = pages[i];\r\n const imgData = canvas.toDataURL('image/jpeg', 1.0);\r\n\r\n // Use getBoundingClientRect for accurate dimensions\r\n const rect = element.getBoundingClientRect();\r\n const pdfWidth = rect.width; // Convert px to mm\r\n const pdfHeight = rect.height;\r\n\r\n const orientation = pdfWidth >= pdfHeight ? 'landscape' : 'portrait';\r\n\r\n if (i === 0) {\r\n pdf = new jsPDF({\r\n unit: 'mm',\r\n format: [pdfWidth, pdfHeight],\r\n orientation,\r\n });\r\n } else {\r\n pdf!.addPage([pdfWidth, pdfHeight], orientation);\r\n }\r\n\r\n pdf!.addImage(imgData, 'JPEG', 0, 0, pdfWidth, pdfHeight);\r\n }\r\n\r\n if (pdf) {\r\n const blob = pdf.output('blob');\r\n pdf.save(`${filename}.pdf`);\r\n return { success: true, blob };\r\n }\r\n\r\n return { success: false, error: 'Failed to generate PDF' };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : 'Unknown error',\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Download ID card as image (PNG or JPEG)\r\n */\r\nexport async function downloadIDCardAsImage(\r\n options: DownloadIDCardOptions\r\n): Promise<ExportResult> {\r\n try {\r\n const {\r\n frontElementId = 'idcardfront',\r\n filename = 'ID_Card',\r\n data,\r\n qrElementId,\r\n qrFields,\r\n format = 'png',\r\n scale = 2,\r\n quality = 1.0,\r\n } = options;\r\n\r\n // Generate QR code if needed\r\n if (qrElementId && data && qrFields && qrFields.length > 0) {\r\n const qrData: Record<string, unknown> = {};\r\n for (const field of qrFields) {\r\n if (data[field] !== undefined) {\r\n qrData[field] = data[field];\r\n }\r\n }\r\n setQrCodeOnElement(qrElementId, qrData, 200);\r\n }\r\n\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n\r\n const capture = await captureElement(frontElementId, scale);\r\n if (!capture) {\r\n return { success: false, error: 'Element not found' };\r\n }\r\n\r\n const mimeType = format === 'jpeg' ? 'image/jpeg' : 'image/png';\r\n const dataUrl = capture.canvas.toDataURL(mimeType, quality);\r\n\r\n // Trigger download\r\n const link = document.createElement('a');\r\n link.download = `${filename}.${format}`;\r\n link.href = dataUrl;\r\n link.click();\r\n\r\n return { success: true, dataUrl };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : 'Unknown error',\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Export ID card with unified options\r\n */\r\nexport async function exportIDCard(\r\n options: ExportOptions & {\r\n frontElementId?: string;\r\n backElementId?: string;\r\n data?: IDCardData;\r\n qrElementId?: string;\r\n qrFields?: string[];\r\n }\r\n): Promise<ExportResult> {\r\n const { format, ...rest } = options;\r\n\r\n if (format === 'pdf') {\r\n return downloadIDCardAsPDF(rest);\r\n } else {\r\n return downloadIDCardAsImage({ ...rest, format });\r\n }\r\n}"],"names":["setQrCodeOnElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"exportUtils.js","sources":["../../../src/core/exportUtils.ts"],"sourcesContent":["import html2canvas from 'html2canvas';\nimport jsPDF from 'jspdf';\nimport type { ExportOptions, ExportResult, IDCardData } from '../types';\nimport { getQrCodeDataFromFields, getQrCodeSize, setQrCodeOnElement } from './qrUtils';\n\r\ninterface DownloadIDCardOptions {\r\n frontElementId?: string;\r\n backElementId?: string;\r\n filename?: string;\r\n data?: IDCardData;\r\n qrElementId?: string;\r\n qrFields?: string[];\r\n format?: 'pdf' | 'png' | 'jpeg';\r\n scale?: number; // Canvas scale for quality (higher = better, but slower)\r\n quality?: number; // JPEG quality (0-1)\r\n}\r\n\r\n// High-quality canvas rendering defaults\r\nconst defaultCanvasOptions = {\n scale: 2, // 2x resolution for good quality without precision issues\r\n imageTimeout: 15000,\r\n letterRendering: true,\r\n logging: false,\r\n useCORS: true, // Allow cross-origin images\r\n allowTaint: true, // Allow cross-origin images to taint canvas\r\n backgroundColor: '#ffffff', // White background to prevent black screen\r\n foreignObjectRendering: false, // Disable foreign object rendering for better compatibility\n};\n\nfunction refreshQrCodeForExport(\n qrElementId: string | undefined,\n data: IDCardData | undefined,\n qrFields: string[] | undefined,\n scale: number\n): void {\n if (!qrElementId || !data || !qrFields || qrFields.length === 0) {\n return;\n }\n\n const qrElement = document.getElementById(qrElementId);\n const qrRect = qrElement?.getBoundingClientRect();\n const qrSize = qrRect\n ? getQrCodeSize(qrRect.width, qrRect.height, scale)\n : getQrCodeSize(0, 0, scale);\n const qrData = getQrCodeDataFromFields(data, qrFields);\n\n if (Object.keys(qrData).length === 0) {\n return;\n }\n\n setQrCodeOnElement(\n qrElementId,\n qrData,\n qrSize\n );\n}\n\r\n/**\r\n * Capture a DOM element as a high-resolution canvas\r\n * Uses html2canvas to convert the element to an image\r\n * Captures the element directly as rendered on screen to preserve exact positioning\r\n * @returns Canvas and the original element, or null if not found\r\n */\r\nasync function captureElement(\r\n elementId: string,\r\n scale = 2\r\n): Promise<{ canvas: HTMLCanvasElement; element: HTMLElement } | null> {\r\n const element = document.getElementById(elementId);\r\n if (!element) return null;\r\n\r\n // Get actual rendered dimensions\r\n const rect = element.getBoundingClientRect();\r\n \r\n // Wait for images to load\r\n const images = element.querySelectorAll('img');\r\n await Promise.all(\r\n Array.from(images).map(\r\n (img) =>\r\n new Promise<void>((resolve) => {\r\n if (img.complete) {\r\n resolve();\r\n } else {\r\n img.onload = () => resolve();\r\n img.onerror = () => resolve();\r\n }\r\n })\r\n )\r\n );\r\n \r\n // Small delay to ensure styles are applied\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n \r\n // Capture the element directly as it appears on screen\r\n // This preserves all styling exactly as rendered\r\n const canvas = await html2canvas(element, {\r\n ...defaultCanvasOptions,\r\n scale,\r\n width: rect.width,\r\n height: rect.height,\r\n windowWidth: element.scrollWidth,\r\n windowHeight: element.scrollHeight,\r\n });\r\n\r\n return { canvas, element };\r\n}\r\n\r\n/**\r\n * Download ID card(s) as a PDF file\r\n * Captures DOM elements and converts them to a multi-page PDF\r\n * @param options - Configuration for PDF export\r\n * @returns Export result with success status and any errors\r\n */\r\nexport async function downloadIDCardAsPDF(\r\n options: DownloadIDCardOptions\r\n): Promise<ExportResult> {\r\n try {\r\n const {\r\n frontElementId = 'idcardfront',\r\n backElementId,\r\n filename = 'ID_Card',\r\n data,\r\n qrElementId,\r\n qrFields,\r\n scale = 10,\r\n } = options;\r\n\r\n refreshQrCodeForExport(qrElementId, data, qrFields, scale);\n\r\n // Wait for QR code and any images to fully render\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n\r\n const pages: { canvas: HTMLCanvasElement; element: HTMLElement }[] = [];\r\n\r\n // Capture front\r\n const frontCapture = await captureElement(frontElementId, scale);\r\n if (frontCapture) pages.push(frontCapture);\r\n\r\n // Capture back if exists\r\n if (backElementId) {\r\n const backCapture = await captureElement(backElementId, scale);\r\n if (backCapture) pages.push(backCapture);\r\n }\r\n\r\n if (pages.length === 0) {\r\n return { success: false, error: 'No elements found to capture' };\r\n }\r\n\r\n let pdf: jsPDF | undefined;\r\n\r\n for (let i = 0; i < pages.length; i++) {\r\n const { canvas, element } = pages[i];\r\n const imgData = canvas.toDataURL('image/jpeg', 1.0);\r\n\r\n // Use getBoundingClientRect for accurate dimensions\r\n const rect = element.getBoundingClientRect();\r\n const pdfWidth = rect.width; // Convert px to mm\r\n const pdfHeight = rect.height;\r\n\r\n const orientation = pdfWidth >= pdfHeight ? 'landscape' : 'portrait';\r\n\r\n if (i === 0) {\r\n pdf = new jsPDF({\r\n unit: 'mm',\r\n format: [pdfWidth, pdfHeight],\r\n orientation,\r\n });\r\n } else {\r\n pdf!.addPage([pdfWidth, pdfHeight], orientation);\r\n }\r\n\r\n pdf!.addImage(imgData, 'JPEG', 0, 0, pdfWidth, pdfHeight);\r\n }\r\n\r\n if (pdf) {\r\n const blob = pdf.output('blob');\r\n pdf.save(`${filename}.pdf`);\r\n return { success: true, blob };\r\n }\r\n\r\n return { success: false, error: 'Failed to generate PDF' };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : 'Unknown error',\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Download ID card as image (PNG or JPEG)\r\n */\r\nexport async function downloadIDCardAsImage(\r\n options: DownloadIDCardOptions\r\n): Promise<ExportResult> {\r\n try {\r\n const {\r\n frontElementId = 'idcardfront',\r\n filename = 'ID_Card',\r\n data,\r\n qrElementId,\r\n qrFields,\r\n format = 'png',\r\n scale = 2,\r\n quality = 1.0,\r\n } = options;\r\n\r\n refreshQrCodeForExport(qrElementId, data, qrFields, scale);\n\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n\r\n const capture = await captureElement(frontElementId, scale);\r\n if (!capture) {\r\n return { success: false, error: 'Element not found' };\r\n }\r\n\r\n const mimeType = format === 'jpeg' ? 'image/jpeg' : 'image/png';\r\n const dataUrl = capture.canvas.toDataURL(mimeType, quality);\r\n\r\n // Trigger download\r\n const link = document.createElement('a');\r\n link.download = `${filename}.${format}`;\r\n link.href = dataUrl;\r\n link.click();\r\n\r\n return { success: true, dataUrl };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : 'Unknown error',\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Export ID card with unified options\r\n */\r\nexport async function exportIDCard(\r\n options: ExportOptions & {\r\n frontElementId?: string;\r\n backElementId?: string;\r\n data?: IDCardData;\r\n qrElementId?: string;\r\n qrFields?: string[];\r\n }\r\n): Promise<ExportResult> {\r\n const { format, ...rest } = options;\r\n\r\n if (format === 'pdf') {\r\n return downloadIDCardAsPDF(rest);\r\n } else {\r\n return downloadIDCardAsImage({ ...rest, format });\r\n }\r\n}\n"],"names":["getQrCodeSize","getQrCodeDataFromFields","setQrCodeOnElement"],"mappings":"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"}
|
package/dist/cjs/core/qrUtils.js
CHANGED
|
@@ -2,6 +2,54 @@
|
|
|
2
2
|
|
|
3
3
|
var qrious = require('../_virtual/qrious.js');
|
|
4
4
|
|
|
5
|
+
const DEFAULT_QR_SIZE = 200;
|
|
6
|
+
const MIN_QR_SIZE = 32;
|
|
7
|
+
function normalizeQrScale(scale = 1) {
|
|
8
|
+
return Number.isFinite(scale) && scale > 0 ? scale : 1;
|
|
9
|
+
}
|
|
10
|
+
function resolveQrTargetElement(elementId, container) {
|
|
11
|
+
if (container instanceof HTMLElement) {
|
|
12
|
+
if (container.id === elementId) {
|
|
13
|
+
return container;
|
|
14
|
+
}
|
|
15
|
+
return container.querySelector(`#${elementId}`);
|
|
16
|
+
}
|
|
17
|
+
return container.getElementById(elementId);
|
|
18
|
+
}
|
|
19
|
+
function resolveQrImageElement(targetElement) {
|
|
20
|
+
if (!targetElement) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
if (targetElement instanceof HTMLImageElement) {
|
|
24
|
+
return targetElement;
|
|
25
|
+
}
|
|
26
|
+
return targetElement.querySelector('img[data-qr-code-image="true"], img');
|
|
27
|
+
}
|
|
28
|
+
function hasQrFieldValue(value) {
|
|
29
|
+
if (value === undefined) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
if (typeof value === 'string') {
|
|
33
|
+
return value.trim().length > 0;
|
|
34
|
+
}
|
|
35
|
+
if (Array.isArray(value)) {
|
|
36
|
+
return value.some((item) => String(item).trim().length > 0);
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
function getQrCodeSize(width, height = width, scale = 1) {
|
|
41
|
+
const normalizedWidth = Number.isFinite(width) ? width : 0;
|
|
42
|
+
const normalizedHeight = Number.isFinite(height) ? height : 0;
|
|
43
|
+
const hasWidth = normalizedWidth > 0;
|
|
44
|
+
const hasHeight = normalizedHeight > 0;
|
|
45
|
+
const baseSize = hasWidth && hasHeight
|
|
46
|
+
? Math.min(normalizedWidth, normalizedHeight)
|
|
47
|
+
: Math.max(normalizedWidth, normalizedHeight);
|
|
48
|
+
if (baseSize <= 0) {
|
|
49
|
+
return Math.max(MIN_QR_SIZE, Math.round(DEFAULT_QR_SIZE * normalizeQrScale(scale)));
|
|
50
|
+
}
|
|
51
|
+
return Math.max(MIN_QR_SIZE, Math.round(baseSize * normalizeQrScale(scale)));
|
|
52
|
+
}
|
|
5
53
|
/**
|
|
6
54
|
* Generate a QR code as a base64 data URL
|
|
7
55
|
* @param data - Data to encode in the QR code (will be JSON stringified)
|
|
@@ -9,14 +57,16 @@ var qrious = require('../_virtual/qrious.js');
|
|
|
9
57
|
* @param options - Customization options (error correction level, colors, etc.)
|
|
10
58
|
* @returns Base64 PNG data URL
|
|
11
59
|
*/
|
|
12
|
-
function generateQrCodeDataURL(data, size =
|
|
60
|
+
function generateQrCodeDataURL(data, size = DEFAULT_QR_SIZE, options) {
|
|
61
|
+
const background = options?.background ?? 'transparent';
|
|
62
|
+
const isTransparentBackground = background === 'transparent';
|
|
13
63
|
const qr = new qrious({
|
|
14
64
|
value: JSON.stringify(data),
|
|
15
65
|
size,
|
|
16
66
|
level: options?.level || 'H', // High error correction by default
|
|
17
67
|
padding: options?.padding ?? 0,
|
|
18
|
-
background
|
|
19
|
-
backgroundAlpha: 1,
|
|
68
|
+
background,
|
|
69
|
+
backgroundAlpha: isTransparentBackground ? 0 : 1,
|
|
20
70
|
foreground: options?.foreground || 'black',
|
|
21
71
|
foregroundAlpha: 1,
|
|
22
72
|
});
|
|
@@ -30,29 +80,41 @@ function generateQrCodeDataURL(data, size = 200, options) {
|
|
|
30
80
|
* @param size - QR code size in pixels
|
|
31
81
|
* @returns Base64 PNG data URL
|
|
32
82
|
*/
|
|
33
|
-
function generateQrCodeFromFields(data, fields, size =
|
|
34
|
-
|
|
83
|
+
function generateQrCodeFromFields(data, fields, size = DEFAULT_QR_SIZE) {
|
|
84
|
+
const qrData = getQrCodeDataFromFields(data, fields);
|
|
85
|
+
if (Object.keys(qrData).length === 0) {
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
return generateQrCodeDataURL(qrData, size);
|
|
89
|
+
}
|
|
90
|
+
function getQrCodeDataFromFields(data, fields) {
|
|
91
|
+
// Build object with only the specified fields that actually contain data
|
|
35
92
|
const qrData = {};
|
|
36
93
|
for (const field of fields) {
|
|
37
|
-
|
|
38
|
-
|
|
94
|
+
const value = data[field];
|
|
95
|
+
if (hasQrFieldValue(value)) {
|
|
96
|
+
qrData[field] = value;
|
|
39
97
|
}
|
|
40
98
|
}
|
|
41
|
-
return
|
|
99
|
+
return qrData;
|
|
42
100
|
}
|
|
43
101
|
/**
|
|
44
102
|
* Set QR code image src on a DOM element
|
|
45
103
|
*/
|
|
46
|
-
function setQrCodeOnElement(elementId, data, size =
|
|
104
|
+
function setQrCodeOnElement(elementId, data, size = DEFAULT_QR_SIZE, container = document) {
|
|
47
105
|
const qrDataURL = generateQrCodeDataURL(data, size);
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
: container.querySelector(`#${elementId}`));
|
|
106
|
+
const targetElement = resolveQrTargetElement(elementId, container);
|
|
107
|
+
const imgTag = resolveQrImageElement(targetElement);
|
|
51
108
|
if (imgTag) {
|
|
52
109
|
imgTag.setAttribute('src', qrDataURL);
|
|
110
|
+
imgTag.setAttribute('data-qr-code-image', 'true');
|
|
53
111
|
imgTag.style.display = 'block';
|
|
54
112
|
imgTag.style.opacity = '1';
|
|
55
113
|
imgTag.style.visibility = 'visible';
|
|
114
|
+
imgTag.style.backgroundColor = 'transparent';
|
|
115
|
+
if (targetElement) {
|
|
116
|
+
targetElement.style.backgroundColor = 'transparent';
|
|
117
|
+
}
|
|
56
118
|
return true;
|
|
57
119
|
}
|
|
58
120
|
return false;
|
|
@@ -60,5 +122,7 @@ function setQrCodeOnElement(elementId, data, size = 200, container = document) {
|
|
|
60
122
|
|
|
61
123
|
exports.generateQrCodeDataURL = generateQrCodeDataURL;
|
|
62
124
|
exports.generateQrCodeFromFields = generateQrCodeFromFields;
|
|
125
|
+
exports.getQrCodeDataFromFields = getQrCodeDataFromFields;
|
|
126
|
+
exports.getQrCodeSize = getQrCodeSize;
|
|
63
127
|
exports.setQrCodeOnElement = setQrCodeOnElement;
|
|
64
128
|
//# sourceMappingURL=qrUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qrUtils.js","sources":["../../../src/core/qrUtils.ts"],"sourcesContent":["import QRious from 'qrious';\
|
|
1
|
+
{"version":3,"file":"qrUtils.js","sources":["../../../src/core/qrUtils.ts"],"sourcesContent":["import QRious from 'qrious';\nimport type { IDCardData } from '../types';\n\nconst DEFAULT_QR_SIZE = 200;\nconst MIN_QR_SIZE = 32;\n\nfunction normalizeQrScale(scale = 1): number {\n return Number.isFinite(scale) && scale > 0 ? scale : 1;\n}\n\nfunction resolveQrTargetElement(\n elementId: string,\n container: Document | HTMLElement\n): HTMLElement | null {\n if (container instanceof HTMLElement) {\n if (container.id === elementId) {\n return container;\n }\n\n return container.querySelector<HTMLElement>(`#${elementId}`);\n }\n\n return container.getElementById(elementId);\n}\n\nfunction resolveQrImageElement(targetElement: HTMLElement | null): HTMLImageElement | null {\n if (!targetElement) {\n return null;\n }\n\n if (targetElement instanceof HTMLImageElement) {\n return targetElement;\n }\n\n return targetElement.querySelector<HTMLImageElement>('img[data-qr-code-image=\"true\"], img');\n}\n\nfunction hasQrFieldValue(value: IDCardData[string]): boolean {\n if (value === undefined) {\n return false;\n }\n\n if (typeof value === 'string') {\n return value.trim().length > 0;\n }\n\n if (Array.isArray(value)) {\n return value.some((item) => String(item).trim().length > 0);\n }\n\n return true;\n}\n\nexport function getQrCodeSize(\n width: number,\n height = width,\n scale = 1\n): number {\n const normalizedWidth = Number.isFinite(width) ? width : 0;\n const normalizedHeight = Number.isFinite(height) ? height : 0;\n const hasWidth = normalizedWidth > 0;\n const hasHeight = normalizedHeight > 0;\n const baseSize = hasWidth && hasHeight\n ? Math.min(normalizedWidth, normalizedHeight)\n : Math.max(normalizedWidth, normalizedHeight);\n\n if (baseSize <= 0) {\n return Math.max(MIN_QR_SIZE, Math.round(DEFAULT_QR_SIZE * normalizeQrScale(scale)));\n }\n\n return Math.max(MIN_QR_SIZE, Math.round(baseSize * normalizeQrScale(scale)));\n}\n\n/**\n * Generate a QR code as a base64 data URL\n * @param data - Data to encode in the QR code (will be JSON stringified)\n * @param size - QR code size in pixels\n * @param options - Customization options (error correction level, colors, etc.)\r\n * @returns Base64 PNG data URL\r\n */\r\nexport function generateQrCodeDataURL(\n data: Record<string, unknown>,\n size = DEFAULT_QR_SIZE,\n options?: {\n level?: 'L' | 'M' | 'Q' | 'H'; // Error correction level\n padding?: number;\n background?: string;\n foreground?: string;\n }\n): string {\n const background = options?.background ?? 'transparent';\n const isTransparentBackground = background === 'transparent';\n const qr = new (QRious as any)({\n value: JSON.stringify(data),\n size,\n level: options?.level || 'H', // High error correction by default\n padding: options?.padding ?? 0,\n background,\n backgroundAlpha: isTransparentBackground ? 0 : 1,\n foreground: options?.foreground || 'black',\n foregroundAlpha: 1,\n });\n return qr.toDataURL('image/png');\n}\n\r\n/**\r\n * Generate QR code from specific fields in the card data\r\n * Only includes fields that exist in the data object\r\n * @param data - Full card data object\r\n * @param fields - Array of field keys to include in QR code\r\n * @param size - QR code size in pixels\r\n * @returns Base64 PNG data URL\r\n */\r\nexport function generateQrCodeFromFields(\n data: IDCardData,\n fields: string[],\n size = DEFAULT_QR_SIZE\n): string {\n const qrData = getQrCodeDataFromFields(data, fields);\n if (Object.keys(qrData).length === 0) {\n return '';\n }\n\n return generateQrCodeDataURL(qrData, size);\n}\n\nexport function getQrCodeDataFromFields(\n data: IDCardData,\n fields: string[]\n): Record<string, unknown> {\n // Build object with only the specified fields that actually contain data\n const qrData: Record<string, unknown> = {};\n\n for (const field of fields) {\n const value = data[field];\n if (hasQrFieldValue(value)) {\n qrData[field] = value;\n }\n }\n\n return qrData;\n}\n\r\n/**\r\n * Set QR code image src on a DOM element\r\n */\r\nexport function setQrCodeOnElement(\n elementId: string,\n data: Record<string, unknown>,\n size = DEFAULT_QR_SIZE,\n container: Document | HTMLElement = document\n): boolean {\n const qrDataURL = generateQrCodeDataURL(data, size);\n const targetElement = resolveQrTargetElement(elementId, container);\n const imgTag = resolveQrImageElement(targetElement);\n\n if (imgTag) {\n imgTag.setAttribute('src', qrDataURL);\n imgTag.setAttribute('data-qr-code-image', 'true');\n imgTag.style.display = 'block';\n imgTag.style.opacity = '1';\n imgTag.style.visibility = 'visible';\n imgTag.style.backgroundColor = 'transparent';\n if (targetElement) {\n targetElement.style.backgroundColor = 'transparent';\n }\n return true;\n }\n return false;\n}\n"],"names":["QRious"],"mappings":";;;;AAGA,MAAM,eAAe,GAAG,GAAG;AAC3B,MAAM,WAAW,GAAG,EAAE;AAEtB,SAAS,gBAAgB,CAAC,KAAK,GAAG,CAAC,EAAA;AACjC,IAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC;AACxD;AAEA,SAAS,sBAAsB,CAC7B,SAAiB,EACjB,SAAiC,EAAA;AAEjC,IAAA,IAAI,SAAS,YAAY,WAAW,EAAE;AACpC,QAAA,IAAI,SAAS,CAAC,EAAE,KAAK,SAAS,EAAE;AAC9B,YAAA,OAAO,SAAS;QAClB;QAEA,OAAO,SAAS,CAAC,aAAa,CAAc,IAAI,SAAS,CAAA,CAAE,CAAC;IAC9D;AAEA,IAAA,OAAO,SAAS,CAAC,cAAc,CAAC,SAAS,CAAC;AAC5C;AAEA,SAAS,qBAAqB,CAAC,aAAiC,EAAA;IAC9D,IAAI,CAAC,aAAa,EAAE;AAClB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,aAAa,YAAY,gBAAgB,EAAE;AAC7C,QAAA,OAAO,aAAa;IACtB;AAEA,IAAA,OAAO,aAAa,CAAC,aAAa,CAAmB,qCAAqC,CAAC;AAC7F;AAEA,SAAS,eAAe,CAAC,KAAyB,EAAA;AAChD,IAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC7B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;IAChC;AAEA,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACxB,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7D;AAEA,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,aAAa,CAC3B,KAAa,EACb,MAAM,GAAG,KAAK,EACd,KAAK,GAAG,CAAC,EAAA;AAET,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;AAC1D,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC;AAC7D,IAAA,MAAM,QAAQ,GAAG,eAAe,GAAG,CAAC;AACpC,IAAA,MAAM,SAAS,GAAG,gBAAgB,GAAG,CAAC;AACtC,IAAA,MAAM,QAAQ,GAAG,QAAQ,IAAI;UACzB,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,gBAAgB;UAC1C,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,gBAAgB,CAAC;AAE/C,IAAA,IAAI,QAAQ,IAAI,CAAC,EAAE;AACjB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACrF;AAEA,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E;AAEA;;;;;;AAMG;AACG,SAAU,qBAAqB,CACnC,IAA6B,EAC7B,IAAI,GAAG,eAAe,EACtB,OAKC,EAAA;AAED,IAAA,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,aAAa;AACvD,IAAA,MAAM,uBAAuB,GAAG,UAAU,KAAK,aAAa;AAC5D,IAAA,MAAM,EAAE,GAAG,IAAKA,MAAc,CAAC;AAC7B,QAAA,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC3B,IAAI;AACJ,QAAA,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG;AAC5B,QAAA,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC;QAC9B,UAAU;QACV,eAAe,EAAE,uBAAuB,GAAG,CAAC,GAAG,CAAC;AAChD,QAAA,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,OAAO;AAC1C,QAAA,eAAe,EAAE,CAAC;AACnB,KAAA,CAAC;AACF,IAAA,OAAO,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC;AAClC;AAEA;;;;;;;AAOG;AACG,SAAU,wBAAwB,CACtC,IAAgB,EAChB,MAAgB,EAChB,IAAI,GAAG,eAAe,EAAA;IAEtB,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC;IACpD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AACpC,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,OAAO,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC;AAC5C;AAEM,SAAU,uBAAuB,CACrC,IAAgB,EAChB,MAAgB,EAAA;;IAGhB,MAAM,MAAM,GAA4B,EAAE;AAE1C,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE;AAC1B,YAAA,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK;QACvB;IACF;AAEA,IAAA,OAAO,MAAM;AACf;AAEA;;AAEG;AACG,SAAU,kBAAkB,CAChC,SAAiB,EACjB,IAA6B,EAC7B,IAAI,GAAG,eAAe,EACtB,SAAA,GAAoC,QAAQ,EAAA;IAE5C,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC;IACnD,MAAM,aAAa,GAAG,sBAAsB,CAAC,SAAS,EAAE,SAAS,CAAC;AAClE,IAAA,MAAM,MAAM,GAAG,qBAAqB,CAAC,aAAa,CAAC;IAEnD,IAAI,MAAM,EAAE;AACV,QAAA,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC;AACrC,QAAA,MAAM,CAAC,YAAY,CAAC,oBAAoB,EAAE,MAAM,CAAC;AACjD,QAAA,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO;AAC9B,QAAA,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC1B,QAAA,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS;AACnC,QAAA,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,aAAa;QAC5C,IAAI,aAAa,EAAE;AACjB,YAAA,aAAa,CAAC,KAAK,CAAC,eAAe,GAAG,aAAa;QACrD;AACA,QAAA,OAAO,IAAI;IACb;AACA,IAAA,OAAO,KAAK;AACd;;;;;;;;"}
|