UI Customization
SDK provides extensive customization options through CSS variables, allowing you to match your application's design system.
General Styling
You can set provided CSS variables in your stylesheet to customize the SDK's appearance:
:root {
/* Colors */
--modal-background-color: rgba(255, 255, 255, 0.8);
--modal-text-color: #1e293b;
/* Border Styles */
--modal-border-radius: 8px;
/* Font Settings */
--modal-text-font-family: 'Your-Font-Family', sans-serif;
--modal-text-font-size: 24px;
}
Available Customization Options
- Blur Modal
- Document Modal
- Check Capture Modal
- LCD Modal
- Wrong Side Modal
- Credit Card Scanner
- Control Buttons (Capture, Torch, Submit)
- Cropped Image
- Check Images
- Crop Layout Overlay
- File Upload
- Stitching Button
- Long Receipt Preview
- AnyDoc Page Controls
- Spinner

Text in the blur modal is customizable through the blurModalMessage.
:root {
/* Container Styles */
--blur-modal-background-color: white;
--blur-modal-border-radius: 8px;
--blur-modal-padding: 20px;
--blur-modal-width: 300px;
--blur-modal-max-width: 300px;
/* Text Styles */
--blur-modal-text-color: #1e293b;
--blur-modal-text-font-family: 'NB International Pro', sans-serif;
--blur-modal-text-font-size: 17px;
/* Button Styles */
--blur-modal-button-width: 100%;
--blur-modal-button-padding: 12px;
--blur-modal-button-border-radius: 4px;
--blur-modal-button-font-family: 'DIN Pro', sans-serif;
--blur-modal-button-font-size: 14px;
--blur-modal-button-font-weight: 700;
/* Primary Button (Retake) */
--blur-modal-primary-button-background: #00AA00;
--blur-modal-primary-button-color: white;
/* Secondary Button (Submit Anyway) */
--blur-modal-secondary-button-background: transparent;
--blur-modal-secondary-button-border: 1px solid #333;
--blur-modal-secondary-button-color: #333;
}
Global Modal Positioning
:root {
/* Modal Positioning (applies to all modals) */
--modal-border-radius: 8px;
--modal-z-index: 1000;
--modal-width: 300px;
--modal-height: 250px; /* Auto-adjusts for enforced modes */
--modal-top: 50%;
--modal-left: 50%;
--modal-transform: translate(-50%, -50%);
}

Text in the document modal is customizable through the documentModalMessage.
:root {
/* Container Styles */
--document-modal-background-color: white;
--document-modal-border-radius: 8px;
--document-modal-padding: 20px;
--document-modal-width: 300px;
--document-modal-max-width: 300px;
/* Text Styles */
--document-modal-text-color: #1e293b;
--document-modal-text-font-family: 'NB International Pro', sans-serif;
--document-modal-text-font-size: 17px;
/* Button Styles */
--document-modal-button-width: 100%;
--document-modal-button-padding: 12px;
--document-modal-button-border-radius: 4px;
--document-modal-button-font-family: 'DIN Pro', sans-serif;
--document-modal-button-font-size: 14px;
--document-modal-button-font-weight: 700;
/* Primary Button (Retake) */
--document-modal-primary-button-background: #00AA00;
--document-modal-primary-button-color: white;
/* Secondary Button (Submit Anyway) */
--document-modal-secondary-button-background: transparent;
--document-modal-secondary-button-border: 1px solid #333;
--document-modal-secondary-button-color: #333;
}
Global Modal Positioning
:root {
/* Modal Positioning (applies to all modals) */
--modal-border-radius: 8px;
--modal-z-index: 1000;
--modal-width: 300px;
--modal-height: 250px; /* Auto-adjusts for enforced modes */
--modal-top: 50%;
--modal-left: 50%;
--modal-transform: translate(-50%, -50%);
}

Text in the check capture modal is customizable through the checkEnforcedModalMessage and checkOptionalModalMessage.
:root {
/* Container Styles */
--check-modal-background-color: white;
--check-modal-border-radius: 8px;
--check-modal-padding: 20px;
--check-modal-width: 300px;
--check-modal-max-width: 300px;
/* Text Styles */
--check-modal-text-color: #1e293b;
--check-modal-text-font-family: 'NB International Pro', sans-serif;
--check-modal-text-font-size: 17px;
/* Button Styles */
--check-modal-button-width: 100%;
--check-modal-button-padding: 12px;
--check-modal-button-border-radius: 4px;
--check-modal-button-font-family: 'DIN Pro', sans-serif;
--check-modal-button-font-size: 14px;
--check-modal-button-font-weight: 700;
/* Primary Button (Continue/Yes) */
--check-modal-primary-button-background: #00AA00;
--check-modal-primary-button-color: white;
/* Secondary Button (No) */
--check-modal-secondary-button-background: transparent;
--check-modal-secondary-button-border: 1px solid #333;
--check-modal-secondary-button-color: #333;
}
Global Modal Positioning
:root {
/* Modal Positioning (applies to all modals) */
--modal-border-radius: 8px;
--modal-z-index: 1000;
--modal-width: 300px;
--modal-height: 250px; /* Auto-adjusts for enforced modes */
--modal-top: 50%;
--modal-left: 50%;
--modal-transform: translate(-50%, -50%);
}
Text in the LCD modal is customizable through the lcdModalMessage.
:root {
/* Container Styles */
--lcd-modal-background-color: white;
--lcd-modal-border-radius: 16px;
--lcd-modal-padding: 24px 28px;
--lcd-modal-max-width: 300px;
/* Text Styles */
--lcd-modal-text-color: #1e293b;
--lcd-modal-text-font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
--lcd-modal-text-font-size: 17px;
/* Button Styles */
--lcd-modal-button-padding: 14px 24px;
--lcd-modal-button-border-radius: 25px;
--lcd-modal-button-font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
--lcd-modal-button-font-size: 14px;
--lcd-modal-button-font-weight: 700;
/* Primary Button (Retake) */
--lcd-modal-primary-button-background: #00AA00;
--lcd-modal-primary-button-color: white;
/* Secondary Button (Submit Anyway) */
--lcd-modal-secondary-button-background: transparent;
--lcd-modal-secondary-button-border: 1px solid #333;
--lcd-modal-secondary-button-color: #333;
}
Global Modal Positioning
:root {
--modal-z-index: 1000;
}
Text in the wrong side modal is customizable through the wrongSideFrontMessage and wrongSideBackMessage.
:root {
/* Container Styles */
--wrong-side-modal-background-color: white;
--wrong-side-modal-border-radius: 16px;
--wrong-side-modal-padding: 24px 28px;
--wrong-side-modal-width: 300px;
--wrong-side-modal-max-width: 300px;
/* Text Styles */
--wrong-side-modal-text-color: #1e293b;
--wrong-side-modal-text-font-size: 17px;
--wrong-side-modal-text-font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
/* Button Styles */
--wrong-side-modal-button-width: 100%;
--wrong-side-modal-button-padding: 14px 24px;
--wrong-side-modal-button-border-radius: 25px;
--wrong-side-modal-button-font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
--wrong-side-modal-button-font-size: 14px;
--wrong-side-modal-button-font-weight: 700;
/* Primary Button (Retake) */
--wrong-side-modal-primary-button-background: #00AA00;
--wrong-side-modal-primary-button-color: white;
}
Global Modal Positioning
:root {
--modal-border-radius: 8px;
--modal-z-index: 1000;
--modal-width: 300px;
--modal-height: auto;
--modal-top: 50%;
--modal-left: 50%;
--modal-transform: translate(-50%, -50%);
}

:root {
/* Overlay Settings */
--card-overlay-max-width: 500px;
--card-overlay-height: 100%;
--card-overlay-z-index: 150;
/* Card Outline */
--card-outline-width: 400px;
--card-outline-height: 250px;
--card-outline-border-width: 8px;
--card-outline-border-color: white;
--card-outline-border-radius: 12px;
/* Text Display */
--card-text-color: white;
--card-number-font-size: 24px;
--card-number-margin: 90px 0 10px 40px;
--card-info-margin-left: 20px;
--card-info-font-weight: bold;
/* Flip Message */
--flip-message-width: 300px;
--flip-message-font-size: 25px;
}

:root {
/* Capture Button */
--capture-button-background-color: transparent;
--capture-button-hover-background-color: rgba(255, 255, 255, 0.5);
--capture-button-active-background-color: rgba(255, 0, 0, 0.5);
/* Torch Button */
--torch-button-background-color: rgba(107, 114, 128, 0.5);
--torch-button-hover-background-color: rgba(75, 85, 99, 0.8);
/* Submit Button */
--submit-button-background-color: #4CAF50;
--submit-button-color: white;
--submit-button-border-radius: 5px;
--submit-button-font-size: 16px;
}

:root {
/* Basic Positioning */
--cropped-image-position: absolute;
--cropped-image-width: 100%;
--cropped-image-height: auto;
--cropped-image-max-width: 350px;
--cropped-image-max-height: 100%;
--cropped-image-z-index: 130;
/* Border Styles */
--cropped-image-border-width: 3px;
--cropped-image-border-color-error: red;
--cropped-image-border-color-success: #00AA00;
--cropped-image-border-radius: 10px;
--cropped-image-border-radius-rectangle: 5px;
--cropped-image-border-hidden: none;
--cropped-image-border-radius-hidden: 0;
/* Mobile Portrait */
--cropped-image-mobile-width: 370px;
--cropped-image-mobile-height: 95vh;
--cropped-image-mobile-max-width: 350px;
--cropped-image-mobile-position: fixed;
/* Mobile Landscape */
--cropped-image-mobile-landscape-width: 170px;
--cropped-image-mobile-landscape-height: 85vh;
--cropped-image-mobile-landscape-max-width: 200px;
/* Desktop */
--cropped-image-desktop-width: 100%;
--cropped-image-desktop-height: 95%;
--cropped-image-desktop-max-width: 370px;
--cropped-image-desktop-position: absolute;
/* Square Display (Bottle Caps) */
--cropped-image-square-size: 350px; /* Auto-calculated based on screen size */
--cropped-image-square-position: fixed;
--cropped-image-square-top: 50%;
--cropped-image-square-left: 50%;
--cropped-image-square-transform: translate(-50%, -50%);
/* Rectangle Display (Code Strips) */
--cropped-image-rectangle-width: 500px; /* Auto-calculated based on aspect ratio */
--cropped-image-rectangle-height: 300px; /* Auto-calculated based on aspect ratio */
--cropped-image-rectangle-max-width: 500px;
--cropped-image-rectangle-max-height: 60vh;
--cropped-image-rectangle-position: fixed;
--cropped-image-rectangle-top: 50%;
--cropped-image-rectangle-left: 50%;
--cropped-image-rectangle-transform: translate(-50%, -50%);
/* Common Display Properties */
--cropped-image-object-fit: contain;
--cropped-image-display: block;
--cropped-image-margin: auto;
}
:root {
/* Container Layout */
--check-images-container-display: flex;
--check-images-container-flex-direction: column;
--check-images-container-justify-content: center;
--check-images-container-align-items: center;
--check-images-container-width: 100%;
--check-images-container-height: 100%;
--check-images-container-overflow: auto;
/* Container Orientation Modes */
--check-images-container-flex-direction-portrait: row;
--check-images-container-flex-direction-landscape: column;
/* Image Sizing - Portrait Mode */
--check-images-max-width-portrait: 48%;
--check-images-max-height-portrait: 96%;
/* Image Sizing - Landscape Mode */
--check-images-max-width-landscape: 96%;
--check-images-max-height-landscape: 48%;
/* Image Display Properties */
--check-images-object-fit: contain;
--check-images-margin: 1%;
/* Hidden State */
--check-images-container-display-hidden: none;
}
The crop layout overlay appears in manual capture mode for checks when the detected aspect ratio falls outside acceptable limits. Configure the behavior via Check Processing settings.
:root {
/* Overlay Rectangle Styles */
--crop-layout-border-color: #54C08B;
--crop-layout-stroke-width: 2px;
--crop-layout-corner-radius: 0px;
--crop-layout-overlay-opacity: 0.6;
/* Overlay Position & Size */
--crop-layout-guide-top: 40%;
--crop-layout-guide-left: 50%;
--crop-layout-guide-width-scale: 0.90;
--crop-layout-guide-max-height-scale: 0.70;
/* Tip Text Styling */
--crop-layout-tip-font-family: 'Arial, sans-serif';
--crop-layout-tip-font-size: 16px;
--crop-layout-tip-font-weight: bold;
--crop-layout-tip-color: white;
--crop-layout-tip-text-shadow: 0 1px 2px rgba(0,0,0,0.8);
--crop-layout-tip-offset: 35%;
}
You can customize the instructional text shown with the overlay using the cropLayoutTipMessage configuration option, and control its position with cropLayoutTipPosition (options: "top", "bottom", "left", "right").
Text in the file upload zone is customizable through the dropZoneText. Button texts are customizable through cropButtonText, resetButtonText, and submitButtonText.
:root {
/* Container Layout */
--file-upload-width: 100%;
--file-upload-height: 100%;
--file-upload-display: flex;
--file-upload-flex-direction: column;
--file-upload-justify-content: flex-end;
--file-upload-align-items: center;
--file-upload-background-color: rgba(0, 0, 0, 0.5);
/* Image Preview */
--file-upload-image-container-height: calc(100% - 120px);
--file-upload-image-container-top: unset;
--file-upload-image-preview-max-width: 500px;
--file-upload-image-preview-max-height: 80vh;
--file-upload-image-preview-object-fit: contain;
--file-upload-image-preview-border-radius: 10px;
/* Bottom Container */
--file-upload-bottom-container-height: 50px;
--file-upload-bottom-container-background-color: none;
/* Upload Drop Zone */
--file-upload-upload-zone-position: absolute;
--file-upload-upload-zone-bottom: 5vh;
--file-upload-upload-zone-width: 500px;
--file-upload-upload-zone-max-width: 500px;
--file-upload-upload-zone-height: 100px;
--file-upload-upload-zone-border: 2px dashed #ccc;
--file-upload-upload-zone-border-radius: 5px;
--file-upload-upload-zone-background-color: rgba(255, 255, 255, 0.8);
--file-upload-upload-zone-color: black;
--file-upload-upload-zone-font-family: sans-serif;
--file-upload-upload-zone-border-color: #ccc;
--file-upload-upload-zone-border-color-active: #000;
/* Action Buttons (Crop, Reset, Submit) */
--file-upload-button-padding: 10px 20px;
--file-upload-button-background-color: #4CAF50;
--file-upload-button-color: white;
--file-upload-button-border-radius: 5px;
--file-upload-button-font-family: sans-serif;
--file-upload-button-font-size: 16px;
--file-upload-button-gap: 20px;
--file-upload-button-width: 100px;
}
The stitching button appears when using lensFlavor: 'long_document' and replaces the standard capture button.
:root {
/* Button Position */
--stitching-button-position: absolute;
--stitching-button-bottom: 50px;
--stitching-button-left: 50%;
--stitching-button-transform: translateX(-50%);
--stitching-button-z-index: 200;
/* Button Appearance */
--stitching-button-width: 64px;
--stitching-button-height: 64px;
--stitching-button-border-radius: 50%;
--stitching-button-border: 3px solid white;
--stitching-button-background-color: transparent;
--stitching-button-cursor: pointer;
--stitching-button-transition: background-color 0.3s ease;
--stitching-button-padding: 0;
--stitching-button-outline: none;
--stitching-button-pointer-events: auto;
/* Button States */
--stitching-button-hover-background-color: rgba(255, 255, 255, 0.5);
--stitching-button-active-background-color: rgba(255, 0, 0, 0.5);
}
The preview panel appears when enableLongReceiptPreview is enabled with lensFlavor: 'long_document'.
:root {
--preview-position: absolute;
--preview-top: 0;
--preview-left: 0;
--preview-width: 100px;
--preview-height: 100%;
--preview-border-radius: 0;
--preview-z-index: 150;
--preview-overflow-y: auto;
--preview-border: none;
}
Page controls appear when using lensFlavor: 'anydocs'. Includes a gallery viewer, page navigation arrows, add page and submit buttons, and an optional flip message.
:root {
/* Gallery */
--anydoc-gallery-z-index: 200;
--anydoc-gallery-image-max-width: 100%;
--anydoc-gallery-object-fit: contain;
--anydoc-gallery-image-border-radius: 8px;
--anydoc-gallery-arrow-size: 40px;
--anydoc-gallery-arrow-font-size: 20px;
--anydoc-gallery-arrow-background: rgba(0, 0, 0, 0.5);
--anydoc-gallery-arrow-color: white;
--anydoc-gallery-arrow-border-radius: 50%;
--anydoc-gallery-indicator-color: white;
--anydoc-gallery-indicator-font-size: 14px;
--anydoc-gallery-indicator-font-family: sans-serif;
--anydoc-gallery-indicator-text-shadow: 0 1px 2px rgba(0,0,0,0.8);
/* Controls Position */
--anydoc-controls-position: absolute;
--anydoc-controls-bottom: 20px;
--anydoc-controls-left: 50%;
--anydoc-controls-transform: translateX(-50%);
--anydoc-controls-z-index: 200;
--anydoc-controls-gap: 10px;
/* Controls Position - Mobile Landscape */
--anydoc-controls-mobile-landscape-position: fixed;
--anydoc-controls-mobile-landscape-bottom: auto;
--anydoc-controls-mobile-landscape-right: 20px;
--anydoc-controls-mobile-landscape-left: auto;
--anydoc-controls-mobile-landscape-top: 50%;
--anydoc-controls-mobile-landscape-transform: translateY(-50%);
--anydoc-controls-mobile-landscape-z-index: 200;
/* Add Page Button */
--anydoc-button-gap: 10px;
--anydoc-add-button-padding: 12px 24px;
--anydoc-add-button-background-color: rgba(107, 114, 128, 0.5);
--anydoc-add-button-color: white;
--anydoc-add-button-border-radius: 25px;
--anydoc-add-button-font-size: 14px;
--anydoc-add-button-font-family: system-ui, sans-serif;
--anydoc-add-button-font-weight: 700;
--anydoc-add-button-box-shadow: none;
/* Submit Button */
--anydoc-submit-button-padding: 12px 24px;
--anydoc-submit-button-background-color: #00AA00;
--anydoc-submit-button-color: white;
--anydoc-submit-button-border-radius: 25px;
--anydoc-submit-button-font-size: 14px;
--anydoc-submit-button-font-family: system-ui, sans-serif;
--anydoc-submit-button-font-weight: 700;
--anydoc-submit-button-box-shadow: none;
/* Flip Message Modal */
--anydoc-flip-top: 50%;
--anydoc-flip-z-index: 300;
--anydoc-flip-background-color: white;
--anydoc-flip-border-radius: 16px;
--anydoc-flip-padding: 24px 28px;
--anydoc-flip-max-width: 300px;
--anydoc-flip-width: 300px;
--anydoc-flip-text-color: #1e293b;
--anydoc-flip-text-font-family: system-ui, sans-serif;
--anydoc-flip-text-font-size: 17px;
--anydoc-flip-button-width: 100%;
--anydoc-flip-button-padding: 14px 24px;
--anydoc-flip-button-border-radius: 25px;
--anydoc-flip-button-background-color: #00AA00;
--anydoc-flip-button-color: white;
--anydoc-flip-button-font-weight: 700;
--anydoc-flip-button-font-family: system-ui, sans-serif;
--anydoc-flip-button-font-size: 14px;
}

:root {
/* Overlay Styles */
--spinner-overlay-background-color: rgba(0, 0, 0, 0.7);
--spinner-overlay-z-index: 9999;
/* Spinner Styles */
--spinner-size: 40px;
--spinner-border-width: 4px;
--spinner-border-color: #f3f3f3;
--spinner-primary-color: #4CAF50;
--spinner-animation-duration: 1s;
/* Text Styles */
--spinner-text-color: #4CAF50;
--spinner-text-size: 16px;
--spinner-text-margin: 20px;
--spinner-font-family: 'Arial', sans-serif;
}