@neofaceid/web-sdk 1.28.1 → 1.29.0

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.
@@ -5966,6 +5966,182 @@ const api = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty(
5966
5966
  validateToken,
5967
5967
  videoToBase64
5968
5968
  }, Symbol.toStringTag, { value: "Module" }));
5969
+ const BLUE = {
5970
+ 400: "#00B0F8",
5971
+ 500: "#0091F6",
5972
+ 700: "#0059C4"
5973
+ };
5974
+ const GOLD = {
5975
+ 500: "#F1BE00"
5976
+ };
5977
+ const INK = {
5978
+ 25: "#F7F9FC",
5979
+ 50: "#F1F5FA",
5980
+ 100: "#E6ECF4",
5981
+ 300: "#AFBDCE",
5982
+ 400: "#8496AD",
5983
+ 500: "#617489",
5984
+ 600: "#48586B",
5985
+ 800: "#1E2B3C",
5986
+ 900: "#111C2B",
5987
+ 950: "#0A1320"
5988
+ };
5989
+ const LIGHT_TOKENS = {
5990
+ ground: INK[25],
5991
+ surface: "#FFFFFF",
5992
+ surfaceMuted: INK[50],
5993
+ line: INK[100],
5994
+ text: INK[950],
5995
+ textMuted: INK[600],
5996
+ textSubtle: INK[500],
5997
+ action: BLUE[700],
5998
+ actionText: "#FFFFFF",
5999
+ accent: GOLD[500],
6000
+ overlay: "rgba(10,19,32,.55)",
6001
+ focusRing: BLUE[700]
6002
+ };
6003
+ const DARK_TOKENS = {
6004
+ ground: INK[950],
6005
+ surface: INK[900],
6006
+ surfaceMuted: INK[800],
6007
+ line: "#22334D",
6008
+ text: "#EEF3F9",
6009
+ textMuted: INK[300],
6010
+ textSubtle: INK[400],
6011
+ action: BLUE[500],
6012
+ actionText: "#FFFFFF",
6013
+ accent: GOLD[500],
6014
+ overlay: "rgba(10,19,32,.72)",
6015
+ focusRing: BLUE[400]
6016
+ };
6017
+ function contrastRatio(hexA, hexB) {
6018
+ const lumA = luminance(hexA);
6019
+ const lumB = luminance(hexB);
6020
+ const [hi, lo] = lumA > lumB ? [lumA, lumB] : [lumB, lumA];
6021
+ return (hi + 0.05) / (lo + 0.05);
6022
+ }
6023
+ function luminance(hex) {
6024
+ const [r, g, b] = parseHex(hex).map((v) => {
6025
+ const s = v / 255;
6026
+ return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;
6027
+ });
6028
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
6029
+ }
6030
+ function parseHex(hex) {
6031
+ let h = hex.trim().replace("#", "");
6032
+ if (h.length === 3) h = h.split("").map((c) => c + c).join("");
6033
+ if (!/^[0-9a-fA-F]{6}$/.test(h)) return [0, 0, 0];
6034
+ return [
6035
+ parseInt(h.slice(0, 2), 16),
6036
+ parseInt(h.slice(2, 4), 16),
6037
+ parseInt(h.slice(4, 6), 16)
6038
+ ];
6039
+ }
6040
+ const ALLOWED_RADIUS = [8, 16, 24];
6041
+ function resolveTheme(options = {}) {
6042
+ const mode = resolveMode(options.theme);
6043
+ const tokens = mode === "dark" ? { ...DARK_TOKENS } : { ...LIGHT_TOKENS };
6044
+ let radius = 16;
6045
+ if (options.radius !== void 0) {
6046
+ if (ALLOWED_RADIUS.includes(options.radius)) {
6047
+ radius = options.radius;
6048
+ } else {
6049
+ console.warn(
6050
+ `[NeoFaceID SDK] radius ${options.radius} inválido — permitidos: 8, 16, 24. Usando 16.`
6051
+ );
6052
+ }
6053
+ }
6054
+ let accent = tokens.action;
6055
+ let accentFellBack = false;
6056
+ if (options.accent) {
6057
+ const ratio = contrastRatio(options.accent, "#FFFFFF");
6058
+ if (ratio >= 4.5) {
6059
+ accent = options.accent;
6060
+ } else {
6061
+ accentFellBack = true;
6062
+ console.warn(
6063
+ `[NeoFaceID SDK] accent ${options.accent} reprova AA vs branco (${ratio.toFixed(2)}:1). Usando ${BLUE[700]}.`
6064
+ );
6065
+ accent = BLUE[700];
6066
+ }
6067
+ }
6068
+ return { mode, tokens: { ...tokens, action: accent }, radius, accent, accentFellBack };
6069
+ }
6070
+ function resolveMode(theme) {
6071
+ if (theme === "dark") return "dark";
6072
+ if (theme === "light") return "light";
6073
+ if (typeof window !== "undefined" && typeof window.matchMedia === "function") {
6074
+ if (window.matchMedia("(prefers-color-scheme: dark)").matches) return "dark";
6075
+ }
6076
+ return "light";
6077
+ }
6078
+ const CSS_VAR = {
6079
+ ground: "--nfid-ground",
6080
+ surface: "--nfid-surface",
6081
+ surfaceMuted: "--nfid-surface-muted",
6082
+ line: "--nfid-line",
6083
+ text: "--nfid-text",
6084
+ textMuted: "--nfid-text-muted",
6085
+ textSubtle: "--nfid-text-subtle",
6086
+ action: "--nfid-action",
6087
+ actionText: "--nfid-action-text",
6088
+ accent: "--nfid-accent",
6089
+ overlay: "--nfid-overlay",
6090
+ focusRing: "--nfid-focus-ring",
6091
+ radius: "--nfid-radius"
6092
+ };
6093
+ const INJECTED_STYLE_ID = "neofaceid-focus-frame-tokens";
6094
+ function injectThemeStyles$1(options = {}) {
6095
+ const resolved = resolveTheme(options);
6096
+ if (typeof document === "undefined") return resolved;
6097
+ const css = buildRootCss(resolved);
6098
+ const existing = document.getElementById(INJECTED_STYLE_ID);
6099
+ if (existing) {
6100
+ if (existing.textContent !== css) existing.textContent = css;
6101
+ return resolved;
6102
+ }
6103
+ const style = document.createElement("style");
6104
+ style.id = INJECTED_STYLE_ID;
6105
+ style.textContent = css;
6106
+ document.head.appendChild(style);
6107
+ return resolved;
6108
+ }
6109
+ function buildRootCss(theme) {
6110
+ const t = theme.tokens;
6111
+ return `.neofaceid-root {
6112
+ ${CSS_VAR.ground}: ${t.ground};
6113
+ ${CSS_VAR.surface}: ${t.surface};
6114
+ ${CSS_VAR.surfaceMuted}: ${t.surfaceMuted};
6115
+ ${CSS_VAR.line}: ${t.line};
6116
+ ${CSS_VAR.text}: ${t.text};
6117
+ ${CSS_VAR.textMuted}: ${t.textMuted};
6118
+ ${CSS_VAR.textSubtle}: ${t.textSubtle};
6119
+ ${CSS_VAR.action}: ${t.action};
6120
+ ${CSS_VAR.actionText}: ${t.actionText};
6121
+ ${CSS_VAR.accent}: ${t.accent};
6122
+ ${CSS_VAR.overlay}: ${t.overlay};
6123
+ ${CSS_VAR.focusRing}: ${t.focusRing};
6124
+ ${CSS_VAR.radius}: ${theme.radius}px;
6125
+ color: var(${CSS_VAR.text});
6126
+ font-family: inherit;
6127
+ }
6128
+ .neofaceid-root :focus-visible {
6129
+ outline: 2px solid var(${CSS_VAR.focusRing});
6130
+ outline-offset: 2px;
6131
+ }`;
6132
+ }
6133
+ function injectScopedStyles$1(id, css) {
6134
+ if (typeof document === "undefined") return;
6135
+ const existing = document.getElementById(id);
6136
+ if (existing) {
6137
+ if (existing.textContent !== css) existing.textContent = css;
6138
+ return;
6139
+ }
6140
+ const style = document.createElement("style");
6141
+ style.id = id;
6142
+ style.textContent = css;
6143
+ document.head.appendChild(style);
6144
+ }
5969
6145
  const modalReducer$1 = (state, action) => {
5970
6146
  switch (action.type) {
5971
6147
  case "PERMISSION_GRANTED":
@@ -6042,7 +6218,7 @@ const styles = {
6042
6218
  padding: "12px 24px",
6043
6219
  borderRadius: "24px",
6044
6220
  border: "none",
6045
- backgroundColor: "#007AFF",
6221
+ backgroundColor: "#0059C4",
6046
6222
  color: "white",
6047
6223
  fontSize: "16px",
6048
6224
  fontWeight: "bold",
@@ -6156,6 +6332,9 @@ function FaceCaptureModal({
6156
6332
  };
6157
6333
  detectFaces();
6158
6334
  };
6335
+ useEffect(() => {
6336
+ injectThemeStyles$1();
6337
+ }, []);
6159
6338
  useEffect(() => {
6160
6339
  const loadModels = async () => {
6161
6340
  try {
@@ -6243,7 +6422,7 @@ function FaceCaptureModal({
6243
6422
  dispatch({ type: "RESET" });
6244
6423
  setLivenessAttempts(0);
6245
6424
  };
6246
- return /* @__PURE__ */ jsxs("div", { style: styles.overlay, children: [
6425
+ return /* @__PURE__ */ jsxs("div", { className: "neofaceid-root", style: styles.overlay, children: [
6247
6426
  /* @__PURE__ */ jsx("style", { children: keyframes }),
6248
6427
  /* @__PURE__ */ jsx("style", { children: mediaStyles }),
6249
6428
  /* @__PURE__ */ jsxs("div", { style: styles.modal, className: "modal", children: [
@@ -6308,9 +6487,10 @@ class ForgotPasswordModal {
6308
6487
  }
6309
6488
  open() {
6310
6489
  if (this.modalElement) return;
6490
+ injectThemeStyles$1();
6311
6491
  this.addStyles();
6312
6492
  this.modalElement = document.createElement("div");
6313
- this.modalElement.className = "neoface-forgot-modal";
6493
+ this.modalElement.className = "neofaceid-root neoface-forgot-modal";
6314
6494
  this.renderEmailForm();
6315
6495
  document.body.appendChild(this.modalElement);
6316
6496
  }
@@ -6327,10 +6507,10 @@ class ForgotPasswordModal {
6327
6507
  <div class="neoface-forgot-content">
6328
6508
  <div class="neoface-forgot-icon">
6329
6509
  <svg viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
6330
- <circle cx="32" cy="32" r="28" stroke="#7c3aed" stroke-width="3" fill="none"/>
6331
- <rect x="22" y="28" width="20" height="16" rx="3" stroke="#7c3aed" stroke-width="2.5" fill="none"/>
6332
- <path d="M26 28v-4a6 6 0 0 1 12 0v4" stroke="#7c3aed" stroke-width="2.5" stroke-linecap="round"/>
6333
- <circle cx="32" cy="36" r="2" fill="#7c3aed"/>
6510
+ <circle cx="32" cy="32" r="28" stroke="#0059C4" stroke-width="3" fill="none"/>
6511
+ <rect x="22" y="28" width="20" height="16" rx="3" stroke="#0059C4" stroke-width="2.5" fill="none"/>
6512
+ <path d="M26 28v-4a6 6 0 0 1 12 0v4" stroke="#0059C4" stroke-width="2.5" stroke-linecap="round"/>
6513
+ <circle cx="32" cy="36" r="2" fill="#0059C4"/>
6334
6514
  </svg>
6335
6515
  </div>
6336
6516
 
@@ -6376,8 +6556,8 @@ class ForgotPasswordModal {
6376
6556
  content.innerHTML = `
6377
6557
  <div class="neoface-forgot-success-icon">
6378
6558
  <svg viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
6379
- <circle cx="32" cy="32" r="28" stroke="#10b981" stroke-width="3" fill="none"/>
6380
- <path d="M20 32 L28 40 L44 24" stroke="#10b981" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
6559
+ <circle cx="32" cy="32" r="28" stroke="#0E9F6E" stroke-width="3" fill="none"/>
6560
+ <path d="M20 32 L28 40 L44 24" stroke="#0E9F6E" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
6381
6561
  </svg>
6382
6562
  </div>
6383
6563
 
@@ -6429,9 +6609,7 @@ class ForgotPasswordModal {
6429
6609
  addStyles() {
6430
6610
  const styleId = "neoface-forgot-password-modal-styles";
6431
6611
  if (document.getElementById(styleId)) return;
6432
- const style = document.createElement("style");
6433
- style.id = styleId;
6434
- style.textContent = `
6612
+ injectScopedStyles$1(styleId, `
6435
6613
  .neoface-forgot-modal {
6436
6614
  position: fixed;
6437
6615
  top: 0;
@@ -6439,7 +6617,7 @@ class ForgotPasswordModal {
6439
6617
  width: 100%;
6440
6618
  height: 100%;
6441
6619
  z-index: 10003;
6442
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
6620
+ font-family: inherit;
6443
6621
  }
6444
6622
 
6445
6623
  .neoface-forgot-overlay {
@@ -6465,7 +6643,7 @@ class ForgotPasswordModal {
6465
6643
  }
6466
6644
 
6467
6645
  .neoface-forgot-content {
6468
- background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
6646
+ background: linear-gradient(135deg, #0A1320 0%, #111C2B 100%);
6469
6647
  border-radius: 20px;
6470
6648
  padding: 32px;
6471
6649
  max-width: 400px;
@@ -6545,8 +6723,8 @@ class ForgotPasswordModal {
6545
6723
 
6546
6724
  .neoface-forgot-input:focus {
6547
6725
  outline: none;
6548
- border-color: #7c3aed;
6549
- box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.2);
6726
+ border-color: #0059C4;
6727
+ box-shadow: 0 0 0 3px rgba(0, 89, 196, 0.2);
6550
6728
  background: rgba(255, 255, 255, 0.12);
6551
6729
  }
6552
6730
 
@@ -6555,19 +6733,19 @@ class ForgotPasswordModal {
6555
6733
  padding: 14px 24px;
6556
6734
  border-radius: 12px;
6557
6735
  border: none;
6558
- background: linear-gradient(135deg, #7c3aed 0%, #6d28d9 100%);
6736
+ background: linear-gradient(135deg, #0059C4 0%, #00449A 100%);
6559
6737
  color: white;
6560
6738
  font-size: 16px;
6561
6739
  font-weight: 600;
6562
6740
  cursor: pointer;
6563
6741
  transition: all 0.2s;
6564
- box-shadow: 0 4px 16px rgba(124, 58, 237, 0.3);
6742
+ box-shadow: 0 4px 16px rgba(0, 89, 196, 0.3);
6565
6743
  font-family: inherit;
6566
6744
  }
6567
6745
 
6568
6746
  .neoface-forgot-btn-primary:hover:not(:disabled) {
6569
6747
  transform: translateY(-2px);
6570
- box-shadow: 0 8px 24px rgba(124, 58, 237, 0.4);
6748
+ box-shadow: 0 8px 24px rgba(0, 89, 196, 0.4);
6571
6749
  }
6572
6750
 
6573
6751
  .neoface-forgot-btn-primary:disabled {
@@ -6626,8 +6804,7 @@ class ForgotPasswordModal {
6626
6804
  font-size: 20px;
6627
6805
  }
6628
6806
  }
6629
- `;
6630
- document.head.appendChild(style);
6807
+ `);
6631
6808
  }
6632
6809
  }
6633
6810
  const modalReducer = (state, action) => {
@@ -6750,6 +6927,9 @@ function BiometricRegistrationModal({
6750
6927
  "ok"
6751
6928
  );
6752
6929
  const [cameraReady, setCameraReady] = useState(false);
6930
+ useEffect(() => {
6931
+ injectThemeStyles$1();
6932
+ }, []);
6753
6933
  useEffect(() => {
6754
6934
  if (state.status === "liveness") {
6755
6935
  const newStep = state.step;
@@ -7546,7 +7726,7 @@ function BiometricRegistrationModal({
7546
7726
  }
7547
7727
 
7548
7728
  .modal-content {
7549
- background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
7729
+ background: linear-gradient(135deg, #0A1320 0%, #111C2B 100%);
7550
7730
  border-radius: 24px;
7551
7731
  width: 100%;
7552
7732
  max-width: 420px;
@@ -7596,7 +7776,7 @@ function BiometricRegistrationModal({
7596
7776
 
7597
7777
  .icon-wrapper {
7598
7778
  display: inline-block;
7599
- color: #7c3aed;
7779
+ color: #0059C4;
7600
7780
  margin-bottom: 24px;
7601
7781
  }
7602
7782
 
@@ -7617,7 +7797,7 @@ function BiometricRegistrationModal({
7617
7797
  font-size: 28px;
7618
7798
  font-weight: 700;
7619
7799
  margin: 0 0 12px 0;
7620
- background: linear-gradient(135deg, #7c3aed 0%, #a78bfa 100%);
7800
+ background: linear-gradient(135deg, #0059C4 0%, #a78bfa 100%);
7621
7801
  -webkit-background-clip: text;
7622
7802
  -webkit-text-fill-color: transparent;
7623
7803
  background-clip: text;
@@ -7662,7 +7842,7 @@ function BiometricRegistrationModal({
7662
7842
 
7663
7843
  .req-icon.success {
7664
7844
  background: rgba(16, 185, 129, 0.15);
7665
- color: #10b981;
7845
+ color: #0E9F6E;
7666
7846
  border: 1.5px solid rgba(16, 185, 129, 0.3);
7667
7847
  }
7668
7848
 
@@ -7671,18 +7851,18 @@ function BiometricRegistrationModal({
7671
7851
  padding: 16px 32px;
7672
7852
  border-radius: 12px;
7673
7853
  border: none;
7674
- background: linear-gradient(135deg, #7c3aed 0%, #6d28d9 100%);
7854
+ background: linear-gradient(135deg, #0059C4 0%, #00449A 100%);
7675
7855
  color: white;
7676
7856
  font-size: 16px;
7677
7857
  font-weight: 600;
7678
7858
  cursor: pointer;
7679
7859
  transition: all 0.3s;
7680
- box-shadow: 0 4px 16px rgba(124, 58, 237, 0.3);
7860
+ box-shadow: 0 4px 16px rgba(0, 89, 196, 0.3);
7681
7861
  }
7682
7862
 
7683
7863
  .primary-button:hover {
7684
7864
  transform: translateY(-2px);
7685
- box-shadow: 0 8px 24px rgba(124, 58, 237, 0.4);
7865
+ box-shadow: 0 8px 24px rgba(0, 89, 196, 0.4);
7686
7866
  }
7687
7867
 
7688
7868
  .primary-button:active {
@@ -7708,7 +7888,7 @@ function BiometricRegistrationModal({
7708
7888
 
7709
7889
  .brand-name {
7710
7890
  font-weight: 600;
7711
- font-family: 'SF Pro Display', -apple-system, system-ui, sans-serif;
7891
+ font-family: inherit;
7712
7892
  color: #ffffff;
7713
7893
  letter-spacing: 0.3px;
7714
7894
  }
@@ -7757,7 +7937,7 @@ function BiometricRegistrationModal({
7757
7937
  overflow: hidden;
7758
7938
  position: relative;
7759
7939
  /* Removida transição 'all' para evitar salto de zoom no início */
7760
- box-shadow: 0 0 0 4px rgba(124, 58, 237, 0.3);
7940
+ box-shadow: 0 0 0 4px rgba(0, 89, 196, 0.3);
7761
7941
  background: #000;
7762
7942
  }
7763
7943
 
@@ -7856,7 +8036,7 @@ function BiometricRegistrationModal({
7856
8036
 
7857
8037
  .progress-fill {
7858
8038
  height: 100%;
7859
- background: linear-gradient(90deg, #7c3aed 0%, #10b981 100%);
8039
+ background: linear-gradient(90deg, #0059C4 0%, #0E9F6E 100%);
7860
8040
  border-radius: 2px;
7861
8041
  transition: width 0.05s linear;
7862
8042
  }
@@ -7922,8 +8102,8 @@ function BiometricRegistrationModal({
7922
8102
  .spinner {
7923
8103
  position: absolute;
7924
8104
  inset: 0;
7925
- border: 4px solid rgba(124, 58, 237, 0.2);
7926
- border-top-color: #7c3aed;
8105
+ border: 4px solid rgba(0, 89, 196, 0.2);
8106
+ border-top-color: #0059C4;
7927
8107
  border-radius: 50%;
7928
8108
  animation: spin 1s linear infinite;
7929
8109
  }
@@ -7931,7 +8111,7 @@ function BiometricRegistrationModal({
7931
8111
  .spinner-ring {
7932
8112
  position: absolute;
7933
8113
  inset: -10px;
7934
- border: 2px solid rgba(124, 58, 237, 0.1);
8114
+ border: 2px solid rgba(0, 89, 196, 0.1);
7935
8115
  border-radius: 50%;
7936
8116
  animation: pulseSpinner 2s ease-in-out infinite;
7937
8117
  }
@@ -7967,7 +8147,7 @@ function BiometricRegistrationModal({
7967
8147
  }
7968
8148
 
7969
8149
  .success-icon {
7970
- color: #10b981;
8150
+ color: #0E9F6E;
7971
8151
  animation: scaleIn 0.6s ease-out;
7972
8152
  }
7973
8153
 
@@ -8049,12 +8229,12 @@ function BiometricRegistrationModal({
8049
8229
  }
8050
8230
 
8051
8231
  .profile-main-icon {
8052
- background: rgba(124, 58, 237, 0.1);
8053
- color: #7c3aed;
8232
+ background: rgba(0, 89, 196, 0.1);
8233
+ color: #0059C4;
8054
8234
  padding: 20px;
8055
8235
  border-radius: 50%;
8056
- border: 2px solid rgba(124, 58, 237, 0.2);
8057
- box-shadow: 0 0 30px rgba(124, 58, 237, 0.2);
8236
+ border: 2px solid rgba(0, 89, 196, 0.2);
8237
+ box-shadow: 0 0 30px rgba(0, 89, 196, 0.2);
8058
8238
  }
8059
8239
 
8060
8240
  .profile-main-icon svg {
@@ -8066,10 +8246,10 @@ function BiometricRegistrationModal({
8066
8246
  position: absolute;
8067
8247
  bottom: -4px;
8068
8248
  right: -4px;
8069
- background: #10b981;
8249
+ background: #0E9F6E;
8070
8250
  border-radius: 50%;
8071
8251
  padding: 4px;
8072
- border: 3px solid #16213e;
8252
+ border: 3px solid #111C2B;
8073
8253
  width: 24px;
8074
8254
  height: 24px;
8075
8255
  display: flex;
@@ -8127,7 +8307,7 @@ function BiometricRegistrationModal({
8127
8307
  }
8128
8308
  }
8129
8309
  ` }),
8130
- /* @__PURE__ */ jsx("div", { className: "modal-overlay", children: /* @__PURE__ */ jsxs("div", { className: "modal-content", children: [
8310
+ /* @__PURE__ */ jsx("div", { className: "neofaceid-root modal-overlay", children: /* @__PURE__ */ jsxs("div", { className: "modal-content", children: [
8131
8311
  /* @__PURE__ */ jsx("button", { type: "button", className: "close-button", onClick: onClose, children: "×" }),
8132
8312
  state.status === "liveness" && renderLivenessDetection(),
8133
8313
  state.status === "camera-loading" && renderCameraLoading(),
@@ -8238,18 +8418,18 @@ function ConsentModalComponent({
8238
8418
  }
8239
8419
  .neofaceid-consent-overlay {
8240
8420
  position: fixed; inset: 0;
8241
- background: rgba(10, 19, 32, 0.55);
8421
+ background: var(--nfid-overlay);
8242
8422
  backdrop-filter: blur(3px);
8243
8423
  -webkit-backdrop-filter: blur(3px);
8244
8424
  display: flex; align-items: center; justify-content: center;
8245
8425
  z-index: 10001; padding: 20px;
8246
8426
  animation: neofaceidConsentFadeIn 200ms ease-out;
8247
8427
  font-family: inherit;
8248
- color: #0A1320;
8428
+ color: var(--nfid-text);
8249
8429
  }
8250
8430
  .neofaceid-consent-modal {
8251
- background: #FFFFFF;
8252
- border-radius: 16px;
8431
+ background: var(--nfid-surface);
8432
+ border-radius: var(--nfid-radius, 16px);
8253
8433
  padding: 28px;
8254
8434
  max-width: 440px;
8255
8435
  width: 100%;
@@ -8266,7 +8446,7 @@ function ConsentModalComponent({
8266
8446
  .neofaceid-consent-appname {
8267
8447
  font-size: 17px;
8268
8448
  font-weight: 700;
8269
- color: #0A1320;
8449
+ color: var(--nfid-text);
8270
8450
  line-height: 1.2;
8271
8451
  }
8272
8452
  .neofaceid-consent-brand-caption {
@@ -8274,19 +8454,19 @@ function ConsentModalComponent({
8274
8454
  font-weight: 700;
8275
8455
  letter-spacing: 0.09em;
8276
8456
  text-transform: uppercase;
8277
- color: #617489;
8457
+ color: var(--nfid-text-subtle);
8278
8458
  }
8279
8459
  .neofaceid-consent-title {
8280
8460
  font-size: 22px;
8281
8461
  font-weight: 700;
8282
- color: #0A1320;
8462
+ color: var(--nfid-text);
8283
8463
  margin: 0 0 8px;
8284
8464
  line-height: 1.25;
8285
8465
  letter-spacing: -0.015em;
8286
8466
  }
8287
8467
  .neofaceid-consent-duration {
8288
8468
  font-size: 14px;
8289
- color: #48586B;
8469
+ color: var(--nfid-text-muted);
8290
8470
  margin: 0 0 20px;
8291
8471
  line-height: 1.5;
8292
8472
  }
@@ -8303,30 +8483,30 @@ function ConsentModalComponent({
8303
8483
  }
8304
8484
  .neofaceid-consent-bullet-icon {
8305
8485
  flex-shrink: 0;
8306
- color: #0059C4;
8486
+ color: var(--nfid-action);
8307
8487
  margin-top: 2px;
8308
8488
  }
8309
8489
  .neofaceid-consent-bullet-title {
8310
8490
  font-size: 14px;
8311
8491
  font-weight: 600;
8312
- color: #0A1320;
8492
+ color: var(--nfid-text);
8313
8493
  margin: 0 0 2px;
8314
8494
  line-height: 1.35;
8315
8495
  }
8316
8496
  .neofaceid-consent-bullet-body {
8317
8497
  font-size: 13px;
8318
- color: #48586B;
8498
+ color: var(--nfid-text-muted);
8319
8499
  margin: 0;
8320
8500
  line-height: 1.45;
8321
8501
  }
8322
8502
  .neofaceid-consent-link {
8323
8503
  display: inline-block;
8324
8504
  font-size: 13px;
8325
- color: #0059C4;
8505
+ color: var(--nfid-action);
8326
8506
  text-decoration: underline;
8327
8507
  margin-bottom: 20px;
8328
8508
  }
8329
- .neofaceid-consent-link:hover { color: #00449A; }
8509
+ .neofaceid-consent-link:hover { opacity: 0.85; }
8330
8510
  .neofaceid-consent-actions {
8331
8511
  display: flex;
8332
8512
  flex-direction: column;
@@ -8335,7 +8515,7 @@ function ConsentModalComponent({
8335
8515
  .neofaceid-consent-button {
8336
8516
  min-height: 44px;
8337
8517
  padding: 12px 20px;
8338
- border-radius: 16px;
8518
+ border-radius: var(--nfid-radius, 16px);
8339
8519
  border: none;
8340
8520
  font-size: 15px;
8341
8521
  font-weight: 600;
@@ -8344,32 +8524,32 @@ function ConsentModalComponent({
8344
8524
  font-family: inherit;
8345
8525
  }
8346
8526
  .neofaceid-consent-button-primary {
8347
- background: #0059C4;
8348
- color: #FFFFFF;
8527
+ background: var(--nfid-action);
8528
+ color: var(--nfid-action-text);
8349
8529
  }
8350
- .neofaceid-consent-button-primary:hover { background: #00449A; }
8530
+ .neofaceid-consent-button-primary:hover { opacity: 0.92; }
8351
8531
  .neofaceid-consent-button-primary:focus-visible {
8352
- outline: 2px solid #0059C4;
8532
+ outline: 2px solid var(--nfid-focus-ring);
8353
8533
  outline-offset: 2px;
8354
8534
  }
8355
8535
  .neofaceid-consent-button-ghost {
8356
8536
  background: transparent;
8357
- color: #334255;
8537
+ color: var(--nfid-text-muted);
8358
8538
  }
8359
- .neofaceid-consent-button-ghost:hover { background: #F1F5FA; }
8539
+ .neofaceid-consent-button-ghost:hover { background: var(--nfid-surface-muted); }
8360
8540
  .neofaceid-consent-footer {
8361
8541
  display: flex;
8362
8542
  justify-content: center;
8363
8543
  margin-top: 20px;
8364
8544
  padding-top: 16px;
8365
- border-top: 1px solid #E6ECF4;
8545
+ border-top: 1px solid var(--nfid-line);
8366
8546
  }
8367
8547
  .neofaceid-consent-seal {
8368
8548
  font-size: 11px;
8369
8549
  font-weight: 700;
8370
8550
  letter-spacing: 0.09em;
8371
8551
  text-transform: uppercase;
8372
- color: #617489;
8552
+ color: var(--nfid-text-subtle);
8373
8553
  }
8374
8554
  @media (max-width: 640px) {
8375
8555
  .neofaceid-consent-modal { padding: 22px; border-radius: 16px; }
@@ -8380,7 +8560,7 @@ function ConsentModalComponent({
8380
8560
  .neofaceid-consent-modal { animation: none; }
8381
8561
  }
8382
8562
  ` }),
8383
- /* @__PURE__ */ jsx("div", { className: "neofaceid-consent-overlay", role: "dialog", "aria-modal": "true", "aria-labelledby": "neofaceid-consent-title", children: /* @__PURE__ */ jsxs("div", { className: "neofaceid-consent-modal", children: [
8563
+ /* @__PURE__ */ jsx("div", { className: "neofaceid-root neofaceid-consent-overlay", role: "dialog", "aria-modal": "true", "aria-labelledby": "neofaceid-consent-title", children: /* @__PURE__ */ jsxs("div", { className: "neofaceid-consent-modal", children: [
8384
8564
  /* @__PURE__ */ jsxs("div", { className: "neofaceid-consent-header", children: [
8385
8565
  /* @__PURE__ */ jsx("span", { className: "neofaceid-consent-appname", children: appName }),
8386
8566
  /* @__PURE__ */ jsx("span", { className: "neofaceid-consent-brand-caption", children: "NeoFaceID" })
@@ -8455,6 +8635,7 @@ class ConsentModal {
8455
8635
  }
8456
8636
  show(props) {
8457
8637
  if (this.container) return;
8638
+ injectThemeStyles$1();
8458
8639
  this.container = document.createElement("div");
8459
8640
  this.container.id = "neofaceid-consent-modal-container";
8460
8641
  document.body.appendChild(this.container);
@@ -8554,7 +8735,7 @@ class BiometricCaptureModal {
8554
8735
  */
8555
8736
  async createModal() {
8556
8737
  this.modal = document.createElement("div");
8557
- this.modal.className = "neofaceid-biometric-modal";
8738
+ this.modal.className = "neofaceid-root neofaceid-biometric-modal";
8558
8739
  const title = this.options.title || this.getDefaultTitle();
8559
8740
  const subtitle = this.options.subtitle || this.getDefaultSubtitle();
8560
8741
  this.modal.innerHTML = `
@@ -8587,6 +8768,7 @@ class BiometricCaptureModal {
8587
8768
  </div>
8588
8769
  </div>
8589
8770
  `;
8771
+ injectThemeStyles$1();
8590
8772
  this.addStyles();
8591
8773
  this.addEventListeners();
8592
8774
  document.body.appendChild(this.modal);
@@ -8783,9 +8965,7 @@ class BiometricCaptureModal {
8783
8965
  if (existingStyles) {
8784
8966
  existingStyles.remove();
8785
8967
  }
8786
- const style = document.createElement("style");
8787
- style.id = styleId;
8788
- style.textContent = `
8968
+ injectScopedStyles$1(styleId, `
8789
8969
  .neofaceid-biometric-modal {
8790
8970
  position: fixed;
8791
8971
  top: 0;
@@ -8793,7 +8973,7 @@ class BiometricCaptureModal {
8793
8973
  width: 100%;
8794
8974
  height: 100%;
8795
8975
  z-index: 10000;
8796
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
8976
+ font-family: inherit;
8797
8977
  }
8798
8978
 
8799
8979
  .neofaceid-modal-overlay {
@@ -8901,7 +9081,7 @@ class BiometricCaptureModal {
8901
9081
  .neofaceid-frame {
8902
9082
  width: 200px;
8903
9083
  height: 200px;
8904
- border: 3px solid #4CAF50;
9084
+ border: 3px solid #0E9F6E;
8905
9085
  border-radius: 50%;
8906
9086
  box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.3);
8907
9087
  animation: pulse 2s infinite;
@@ -8967,7 +9147,7 @@ class BiometricCaptureModal {
8967
9147
  }
8968
9148
 
8969
9149
  .neofaceid-capture-btn {
8970
- background: #4CAF50;
9150
+ background: #0E9F6E;
8971
9151
  color: white;
8972
9152
  }
8973
9153
 
@@ -9002,8 +9182,7 @@ class BiometricCaptureModal {
9002
9182
  height: 150px;
9003
9183
  }
9004
9184
  }
9005
- `;
9006
- document.head.appendChild(style);
9185
+ `);
9007
9186
  }
9008
9187
  }
9009
9188
  class BiometricStatusOverlay {
@@ -9058,7 +9237,7 @@ class BiometricStatusOverlay {
9058
9237
  z-index: 10000;
9059
9238
  pointer-events: none;
9060
9239
  animation: neofaceid-fadeIn 0.3s ease-out;
9061
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
9240
+ font-family: inherit;
9062
9241
  }
9063
9242
 
9064
9243
  .neofaceid-overlay-container.fade-out {
@@ -9088,11 +9267,11 @@ class BiometricStatusOverlay {
9088
9267
  height: 80px;
9089
9268
  object-fit: contain;
9090
9269
  transition: all 0.5s ease;
9091
- filter: drop-shadow(0 4px 12px rgba(124, 58, 237, 0.3));
9270
+ filter: drop-shadow(0 4px 12px rgba(0, 89, 196, 0.3));
9092
9271
  }
9093
9272
 
9094
9273
  /* Cores por estado */
9095
- .neofaceid-state-preparing .neofaceid-logo { filter: drop-shadow(0 0 15px rgba(124, 58, 237, 0.4)); }
9274
+ .neofaceid-state-preparing .neofaceid-logo { filter: drop-shadow(0 0 15px rgba(0, 89, 196, 0.4)); }
9096
9275
  .neofaceid-state-detecting .neofaceid-logo { filter: hue-rotate(180deg) drop-shadow(0 0 15px rgba(59, 130, 246, 0.6)); }
9097
9276
  .neofaceid-state-waiting-for-face .neofaceid-logo { filter: hue-rotate(30deg) drop-shadow(0 0 15px rgba(251, 146, 60, 0.6)); }
9098
9277
  .neofaceid-state-capturing .neofaceid-logo { filter: hue-rotate(45deg) drop-shadow(0 0 15px rgba(245, 158, 11, 0.6)); }
@@ -9150,7 +9329,7 @@ class BiometricStatusOverlay {
9150
9329
  .neofaceid-success-icon {
9151
9330
  width: 80px;
9152
9331
  height: 80px;
9153
- color: #10b981;
9332
+ color: #0E9F6E;
9154
9333
  animation: neofaceid-scaleIn 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
9155
9334
  }
9156
9335
 
@@ -9300,142 +9479,132 @@ function FallbackPromptComponent({
9300
9479
  .neofaceid-fallback-overlay {
9301
9480
  position: fixed;
9302
9481
  inset: 0;
9303
- background: rgba(0, 0, 0, 0.6);
9304
- backdrop-filter: blur(8px);
9482
+ background: var(--nfid-overlay);
9483
+ backdrop-filter: blur(3px);
9484
+ -webkit-backdrop-filter: blur(3px);
9305
9485
  display: flex;
9306
9486
  align-items: center;
9307
9487
  justify-content: center;
9308
9488
  z-index: 10001;
9309
9489
  padding: 20px;
9310
9490
  animation: fadeIn 0.3s ease-out;
9491
+ font-family: inherit;
9311
9492
  }
9312
9493
 
9313
9494
  .neofaceid-fallback-prompt {
9314
- background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
9315
- border-radius: 20px;
9316
- padding: 32px;
9495
+ background: var(--nfid-surface);
9496
+ border-radius: var(--nfid-radius, 16px);
9497
+ padding: 28px;
9317
9498
  max-width: 400px;
9318
9499
  width: 100%;
9319
- box-shadow: 0 24px 48px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.1);
9320
- animation: slideUp 0.4s ease-out;
9500
+ box-shadow: 0 1px 3px rgba(10, 19, 32, 0.08);
9501
+ animation: slideUp 0.32s cubic-bezier(.2,0,0,1);
9321
9502
  text-align: center;
9503
+ box-sizing: border-box;
9322
9504
  }
9323
9505
 
9506
+ /* Falha de captura é atenção (dourado), nunca crítico (vermelho). */
9324
9507
  .neofaceid-fallback-icon {
9325
- width: 64px;
9326
- height: 64px;
9508
+ width: 56px;
9509
+ height: 56px;
9327
9510
  margin: 0 auto 20px;
9328
- color: #ef4444;
9329
- animation: scaleIn 0.4s ease-out;
9330
- }
9331
-
9332
- @keyframes scaleIn {
9333
- 0% {
9334
- transform: scale(0);
9335
- opacity: 0;
9336
- }
9337
- 50% {
9338
- transform: scale(1.1);
9339
- }
9340
- 100% {
9341
- transform: scale(1);
9342
- opacity: 1;
9343
- }
9511
+ color: #F1BE00;
9344
9512
  }
9345
9513
 
9346
9514
  .neofaceid-fallback-title {
9347
- font-size: 22px;
9515
+ font-size: 20px;
9348
9516
  font-weight: 700;
9349
- color: white;
9350
- margin: 0 0 12px 0;
9517
+ color: var(--nfid-text);
9518
+ margin: 0 0 8px 0;
9519
+ line-height: 1.25;
9351
9520
  }
9352
9521
 
9353
9522
  .neofaceid-fallback-message {
9354
- font-size: 15px;
9355
- color: rgba(255, 255, 255, 0.7);
9356
- margin: 0 0 28px 0;
9523
+ font-size: 14px;
9524
+ color: var(--nfid-text-muted);
9525
+ margin: 0 0 24px 0;
9357
9526
  line-height: 1.5;
9358
9527
  }
9359
9528
 
9360
9529
  .neofaceid-fallback-actions {
9361
9530
  display: flex;
9362
9531
  flex-direction: column;
9363
- gap: 12px;
9532
+ gap: 10px;
9364
9533
  }
9365
9534
 
9366
9535
  .neofaceid-fallback-button {
9367
- padding: 14px 24px;
9368
- border-radius: 12px;
9536
+ min-height: 44px;
9537
+ padding: 12px 20px;
9538
+ border-radius: var(--nfid-radius, 16px);
9369
9539
  border: none;
9370
- font-size: 16px;
9540
+ font-size: 15px;
9371
9541
  font-weight: 600;
9372
9542
  cursor: pointer;
9373
- transition: all 0.2s;
9374
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
9543
+ transition: background 120ms ease-out;
9544
+ font-family: inherit;
9375
9545
  }
9376
9546
 
9377
9547
  .neofaceid-fallback-button-primary {
9378
- background: linear-gradient(135deg, #7c3aed 0%, #6d28d9 100%);
9379
- color: white;
9380
- box-shadow: 0 4px 16px rgba(124, 58, 237, 0.3);
9548
+ background: var(--nfid-action);
9549
+ color: var(--nfid-action-text);
9381
9550
  }
9382
-
9383
- .neofaceid-fallback-button-primary:hover {
9384
- transform: translateY(-2px);
9385
- box-shadow: 0 8px 24px rgba(124, 58, 237, 0.4);
9386
- }
9387
-
9388
- .neofaceid-fallback-button-primary:active {
9389
- transform: translateY(0);
9551
+ .neofaceid-fallback-button-primary:hover { opacity: 0.92; }
9552
+ .neofaceid-fallback-button-primary:focus-visible {
9553
+ outline: 2px solid var(--nfid-focus-ring);
9554
+ outline-offset: 2px;
9390
9555
  }
9391
9556
 
9392
9557
  .neofaceid-fallback-button-secondary {
9393
- background: rgba(255, 255, 255, 0.1);
9394
- color: white;
9395
- border: 1px solid rgba(255, 255, 255, 0.2);
9396
- }
9397
-
9398
- .neofaceid-fallback-button-secondary:hover {
9399
- background: rgba(255, 255, 255, 0.15);
9400
- border-color: rgba(255, 255, 255, 0.3);
9558
+ background: var(--nfid-surface-muted);
9559
+ color: var(--nfid-text);
9560
+ border: 1px solid var(--nfid-line);
9401
9561
  }
9562
+ .neofaceid-fallback-button-secondary:hover { opacity: 0.9; }
9402
9563
 
9403
9564
  .neofaceid-fallback-button-ghost {
9404
9565
  background: transparent;
9405
- color: rgba(255, 255, 255, 0.7);
9566
+ color: var(--nfid-text-muted);
9567
+ min-height: 44px;
9406
9568
  padding: 10px;
9407
9569
  }
9408
-
9409
9570
  .neofaceid-fallback-button-ghost:hover {
9410
- color: white;
9411
- background: rgba(255, 255, 255, 0.05);
9571
+ background: var(--nfid-surface-muted);
9412
9572
  }
9413
9573
 
9414
9574
  @media (max-width: 640px) {
9415
9575
  .neofaceid-fallback-prompt {
9416
- padding: 24px;
9417
- border-radius: 16px;
9576
+ padding: 22px;
9418
9577
  }
9419
-
9420
9578
  .neofaceid-fallback-title {
9421
- font-size: 20px;
9579
+ font-size: 18px;
9422
9580
  }
9423
9581
  }
9424
9582
  ` }),
9425
- /* @__PURE__ */ jsx("div", { className: "neofaceid-fallback-overlay", children: /* @__PURE__ */ jsxs("div", { className: "neofaceid-fallback-prompt", children: [
9426
- /* @__PURE__ */ jsx("div", { className: "neofaceid-fallback-icon", children: /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 64 64", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
9427
- /* @__PURE__ */ jsx("circle", { cx: "32", cy: "32", r: "30", stroke: "currentColor", strokeWidth: "3", fill: "none" }),
9583
+ /* @__PURE__ */ jsx("div", { className: "neofaceid-root neofaceid-fallback-overlay", role: "dialog", "aria-modal": "true", children: /* @__PURE__ */ jsxs("div", { className: "neofaceid-fallback-prompt", children: [
9584
+ /* @__PURE__ */ jsx("div", { className: "neofaceid-fallback-icon", "aria-hidden": "true", children: /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 64 64", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
9585
+ /* @__PURE__ */ jsx(
9586
+ "path",
9587
+ {
9588
+ d: "M32 8 L58 54 H6 Z",
9589
+ stroke: "currentColor",
9590
+ strokeWidth: "3",
9591
+ strokeLinecap: "round",
9592
+ strokeLinejoin: "round",
9593
+ fill: "none"
9594
+ }
9595
+ ),
9428
9596
  /* @__PURE__ */ jsx(
9429
9597
  "path",
9430
9598
  {
9431
- d: "M20 20 L44 44 M44 20 L20 44",
9599
+ d: "M32 26 V38",
9432
9600
  stroke: "currentColor",
9433
9601
  strokeWidth: "3",
9434
9602
  strokeLinecap: "round"
9435
9603
  }
9436
- )
9604
+ ),
9605
+ /* @__PURE__ */ jsx("circle", { cx: "32", cy: "45", r: "2", fill: "currentColor" })
9437
9606
  ] }) }),
9438
- /* @__PURE__ */ jsx("h3", { className: "neofaceid-fallback-title", children: "Não foi possível reconhecer" }),
9607
+ /* @__PURE__ */ jsx("h3", { className: "neofaceid-fallback-title", children: "Vamos tentar de outro jeito" }),
9439
9608
  /* @__PURE__ */ jsx("p", { className: "neofaceid-fallback-message", children: (error == null ? void 0 : error.getFriendlyMessage()) || "Não conseguimos reconhecer sua face. Tente novamente ou use email e senha." }),
9440
9609
  /* @__PURE__ */ jsxs("div", { className: "neofaceid-fallback-actions", children: [
9441
9610
  /* @__PURE__ */ jsx(
@@ -9490,6 +9659,7 @@ class FallbackPrompt {
9490
9659
  if (this.container) {
9491
9660
  return;
9492
9661
  }
9662
+ injectThemeStyles$1();
9493
9663
  this.container = document.createElement("div");
9494
9664
  this.container.id = "neofaceid-fallback-prompt";
9495
9665
  document.body.appendChild(this.container);
@@ -9563,9 +9733,10 @@ class EmailPasswordModal {
9563
9733
  }
9564
9734
  }
9565
9735
  createModal() {
9736
+ injectThemeStyles$1();
9566
9737
  this.addStyles();
9567
9738
  this.modalElement = document.createElement("div");
9568
- this.modalElement.className = "neoface-email-password-modal";
9739
+ this.modalElement.className = "neofaceid-root neoface-email-password-modal";
9569
9740
  this.modalElement.innerHTML = `
9570
9741
  <div class="neoface-email-modal-overlay">
9571
9742
  <div class="neoface-email-modal-content">
@@ -9601,9 +9772,7 @@ class EmailPasswordModal {
9601
9772
  if (existingStyles) {
9602
9773
  return;
9603
9774
  }
9604
- const style = document.createElement("style");
9605
- style.id = styleId;
9606
- style.textContent = `
9775
+ injectScopedStyles$1(styleId, `
9607
9776
  .neoface-email-password-modal {
9608
9777
  position: fixed;
9609
9778
  top: 0;
@@ -9611,7 +9780,7 @@ class EmailPasswordModal {
9611
9780
  width: 100%;
9612
9781
  height: 100%;
9613
9782
  z-index: 10002;
9614
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
9783
+ font-family: inherit;
9615
9784
  }
9616
9785
 
9617
9786
  .neoface-email-modal-overlay {
@@ -9643,7 +9812,7 @@ class EmailPasswordModal {
9643
9812
  }
9644
9813
 
9645
9814
  .neoface-email-modal-content {
9646
- background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
9815
+ background: linear-gradient(135deg, #0A1320 0%, #111C2B 100%);
9647
9816
  border-radius: 20px;
9648
9817
  padding: 32px;
9649
9818
  max-width: 400px;
@@ -9694,8 +9863,8 @@ class EmailPasswordModal {
9694
9863
 
9695
9864
  .neoface-email-modal-content input:focus {
9696
9865
  outline: none;
9697
- border-color: #7c3aed;
9698
- box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.2);
9866
+ border-color: #0059C4;
9867
+ box-shadow: 0 0 0 3px rgba(0, 89, 196, 0.2);
9699
9868
  background: rgba(255, 255, 255, 0.15);
9700
9869
  }
9701
9870
 
@@ -9704,19 +9873,19 @@ class EmailPasswordModal {
9704
9873
  padding: 14px 24px;
9705
9874
  border-radius: 12px;
9706
9875
  border: none;
9707
- background: linear-gradient(135deg, #7c3aed 0%, #6d28d9 100%);
9876
+ background: linear-gradient(135deg, #0059C4 0%, #00449A 100%);
9708
9877
  color: white;
9709
9878
  font-size: 16px;
9710
9879
  font-weight: 600;
9711
9880
  cursor: pointer;
9712
9881
  transition: all 0.2s;
9713
- box-shadow: 0 4px 16px rgba(124, 58, 237, 0.3);
9882
+ box-shadow: 0 4px 16px rgba(0, 89, 196, 0.3);
9714
9883
  font-family: inherit;
9715
9884
  }
9716
9885
 
9717
9886
  .neoface-email-submit-btn:hover {
9718
9887
  transform: translateY(-2px);
9719
- box-shadow: 0 8px 24px rgba(124, 58, 237, 0.4);
9888
+ box-shadow: 0 8px 24px rgba(0, 89, 196, 0.4);
9720
9889
  }
9721
9890
 
9722
9891
  .neoface-email-submit-btn:active {
@@ -9768,7 +9937,7 @@ class EmailPasswordModal {
9768
9937
 
9769
9938
  .neoface-email-brand-name {
9770
9939
  font-weight: 600;
9771
- font-family: 'SF Pro Display', -apple-system, system-ui, sans-serif;
9940
+ font-family: inherit;
9772
9941
  color: #ffffff;
9773
9942
  letter-spacing: 0.3px;
9774
9943
  }
@@ -9795,8 +9964,7 @@ class EmailPasswordModal {
9795
9964
  font-size: 20px;
9796
9965
  }
9797
9966
  }
9798
- `;
9799
- document.head.appendChild(style);
9967
+ `);
9800
9968
  }
9801
9969
  async handleSubmit(event) {
9802
9970
  event.preventDefault();
@@ -10640,8 +10808,8 @@ const biometricDetection = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.
10640
10808
  initializeBiometricDetection,
10641
10809
  isAdvancedDetectionAvailable
10642
10810
  }, Symbol.toStringTag, { value: "Module" }));
10643
- const VERSION = "1.28.1";
10644
- const RELEASE_DATE = "2026-09-01";
10811
+ const VERSION = "1.29.0";
10812
+ const RELEASE_DATE = "2026-09-02";
10645
10813
  let cachedSession = null;
10646
10814
  function getCachedCaptureSession() {
10647
10815
  return cachedSession;
@@ -10956,27 +11124,30 @@ class OnboardingCaptureModal {
10956
11124
  </div>
10957
11125
  </div>
10958
11126
  `;
10959
- const style = document.createElement("style");
10960
- style.textContent = `
10961
- .neofaceid-modal-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.6); display:flex; align-items:center; justify-content:center; z-index: 9999; }
10962
- .neofaceid-modal { background:#fff; border-radius:12px; width: 92%; max-width: 640px; box-shadow: 0 20px 60px rgba(0,0,0,0.3); overflow:hidden; }
10963
- .neofaceid-modal-header { padding: 16px 20px; border-bottom: 1px solid #eee; display:flex; align-items:center; justify-content:space-between; }
10964
- .neofaceid-title { margin:0; font-size: 20px; color:#333; }
10965
- .neofaceid-close-btn { background:none; border:none; font-size:24px; cursor:pointer; color:#666; }
10966
- .neofaceid-modal-body { padding: 16px 20px; }
10967
- .neofaceid-subtitle { margin: 0 0 12px 0; color:#666; }
10968
- .neofaceid-camera-container { position: relative; background:#000; border-radius:8px; overflow:hidden; aspect-ratio: 4/3; margin-bottom: 12px; }
10969
- .neofaceid-video { width:100%; height:100%; object-fit: cover; }
10970
- .neofaceid-canvas { position:absolute; top:0; left:0; }
10971
- .neofaceid-overlay { position:absolute; inset:0; display:flex; align-items:center; justify-content:center; }
10972
- .neofaceid-frame { width: 200px; height: 200px; border: 3px solid #4CAF50; border-radius: 50%; box-shadow: 0 0 0 2px rgba(76,175,80,0.3); }
10973
- .neofaceid-countdown { position:absolute; top:16px; right:16px; background: rgba(0,0,0,0.7); color:#fff; width: 48px; height:48px; display:flex; align-items:center; justify-content:center; border-radius:50%; }
10974
- .neofaceid-modal-footer { padding: 16px 20px; border-top: 1px solid #eee; display:flex; gap: 8px; justify-content:flex-end; }
10975
- .neofaceid-cancel-btn { background:#f5f5f5; color:#666; border:none; border-radius:6px; padding:10px 18px; cursor:pointer; }
10976
- .neofaceid-capture-btn { background:#4CAF50; color:#fff; border:none; border-radius:6px; padding:10px 18px; cursor:pointer; }
10977
- .neofaceid-capture-btn:disabled { background:#ccc; cursor:not-allowed; }
10978
- `;
10979
- document.head.appendChild(style);
11127
+ injectThemeStyles();
11128
+ injectScopedStyles(
11129
+ "neofaceid-onboarding-capture-styles",
11130
+ `
11131
+ .neofaceid-root .neofaceid-modal-overlay { position: fixed; inset: 0; background: var(--nfid-overlay); display:flex; align-items:center; justify-content:center; z-index: 9999; }
11132
+ .neofaceid-root .neofaceid-modal { background: var(--nfid-surface); border-radius: var(--nfid-radius, 16px); width: 92%; max-width: 640px; box-shadow: 0 1px 3px rgba(10,19,32,.08); overflow:hidden; }
11133
+ .neofaceid-root .neofaceid-modal-header { padding: 16px 20px; border-bottom: 1px solid var(--nfid-line); display:flex; align-items:center; justify-content:space-between; }
11134
+ .neofaceid-root .neofaceid-title { margin:0; font-size: 20px; color: var(--nfid-text); }
11135
+ .neofaceid-root .neofaceid-close-btn { background:none; border:none; font-size:24px; cursor:pointer; color: var(--nfid-text-muted); min-width: 44px; min-height: 44px; }
11136
+ .neofaceid-root .neofaceid-modal-body { padding: 16px 20px; }
11137
+ .neofaceid-root .neofaceid-subtitle { margin: 0 0 12px 0; color: var(--nfid-text-muted); }
11138
+ .neofaceid-root .neofaceid-camera-container { position: relative; background:#000; border-radius:8px; overflow:hidden; aspect-ratio: 4/3; margin-bottom: 12px; }
11139
+ .neofaceid-root .neofaceid-video { width:100%; height:100%; object-fit: cover; }
11140
+ .neofaceid-root .neofaceid-canvas { position:absolute; top:0; left:0; }
11141
+ .neofaceid-root .neofaceid-overlay { position:absolute; inset:0; display:flex; align-items:center; justify-content:center; }
11142
+ .neofaceid-root .neofaceid-frame { width: 200px; height: 200px; border: 3px solid #0E9F6E; border-radius: 50%; box-shadow: 0 0 0 2px rgba(14,159,110,0.3); }
11143
+ .neofaceid-root .neofaceid-countdown { position:absolute; top:16px; right:16px; background: rgba(0,0,0,0.7); color:#fff; width: 48px; height:48px; display:flex; align-items:center; justify-content:center; border-radius:50%; }
11144
+ .neofaceid-root .neofaceid-modal-footer { padding: 16px 20px; border-top: 1px solid var(--nfid-line); display:flex; gap: 8px; justify-content:flex-end; }
11145
+ .neofaceid-root .neofaceid-cancel-btn { background: var(--nfid-surface-muted); color: var(--nfid-text-muted); border:none; border-radius:8px; padding:10px 18px; cursor:pointer; min-height: 44px; }
11146
+ .neofaceid-root .neofaceid-capture-btn { background: var(--nfid-action); color: var(--nfid-action-text); border:none; border-radius:8px; padding:10px 18px; cursor:pointer; min-height: 44px; }
11147
+ .neofaceid-root .neofaceid-capture-btn:disabled { background: var(--nfid-line); cursor:not-allowed; }
11148
+ `
11149
+ );
11150
+ overlay.classList.add("neofaceid-root");
10980
11151
  document.body.appendChild(overlay);
10981
11152
  this.overlay = overlay;
10982
11153
  this.video = this.overlay.querySelector(".neofaceid-video");
@@ -11691,12 +11862,9 @@ class DocumentCaptureModal {
11691
11862
  <div class="neoface-doc-content"></div>
11692
11863
  </div>
11693
11864
  `;
11694
- if (!document.getElementById("neoface-doc-styles-v2")) {
11695
- const style = document.createElement("style");
11696
- style.id = "neoface-doc-styles-v2";
11697
- style.textContent = this.getStyles();
11698
- document.head.appendChild(style);
11699
- }
11865
+ injectThemeStyles$1();
11866
+ injectScopedStyles$1("neoface-doc-styles-v2", this.getStyles());
11867
+ overlay.classList.add("neofaceid-root");
11700
11868
  document.body.appendChild(overlay);
11701
11869
  this.overlay = overlay;
11702
11870
  }
@@ -12181,12 +12349,12 @@ class DocumentCaptureModal {
12181
12349
  align-items: center;
12182
12350
  justify-content: center;
12183
12351
  z-index: 10000;
12184
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
12352
+ font-family: inherit;
12185
12353
  padding: 16px;
12186
12354
  }
12187
12355
 
12188
12356
  .neoface-doc-modal {
12189
- background: linear-gradient(145deg, #1a1a2e 0%, #16213e 100%);
12357
+ background: linear-gradient(145deg, #0A1320 0%, #111C2B 100%);
12190
12358
  border-radius: 24px;
12191
12359
  width: 100%;
12192
12360
  max-width: 520px;
@@ -12228,7 +12396,7 @@ class DocumentCaptureModal {
12228
12396
  }
12229
12397
 
12230
12398
  .neoface-doc-step-badge {
12231
- background: linear-gradient(135deg, #00c8ff, #0099cc);
12399
+ background: linear-gradient(135deg, #0091F6, #0099cc);
12232
12400
  color: #fff;
12233
12401
  font-size: 12px;
12234
12402
  font-weight: 600;
@@ -12293,7 +12461,7 @@ class DocumentCaptureModal {
12293
12461
  height: 44px;
12294
12462
  background: rgba(0, 200, 255, 0.15);
12295
12463
  border-radius: 12px;
12296
- color: #00c8ff;
12464
+ color: #0091F6;
12297
12465
  }
12298
12466
 
12299
12467
  .neoface-doc-select-icon svg {
@@ -12314,7 +12482,7 @@ class DocumentCaptureModal {
12314
12482
  }
12315
12483
 
12316
12484
  .neoface-doc-select-option:hover .neoface-doc-select-arrow {
12317
- color: #00c8ff;
12485
+ color: #0091F6;
12318
12486
  transform: translateX(4px);
12319
12487
  }
12320
12488
 
@@ -12341,7 +12509,7 @@ class DocumentCaptureModal {
12341
12509
  }
12342
12510
 
12343
12511
  .neoface-doc-tip-icon {
12344
- color: #00c8ff;
12512
+ color: #0091F6;
12345
12513
  flex-shrink: 0;
12346
12514
  }
12347
12515
 
@@ -12386,7 +12554,7 @@ class DocumentCaptureModal {
12386
12554
  position: absolute;
12387
12555
  width: 28px;
12388
12556
  height: 28px;
12389
- border-color: #00c8ff;
12557
+ border-color: #0091F6;
12390
12558
  border-style: solid;
12391
12559
  }
12392
12560
 
@@ -12401,7 +12569,7 @@ class DocumentCaptureModal {
12401
12569
  left: 50%;
12402
12570
  transform: translateX(-50%);
12403
12571
  background: rgba(0, 0, 0, 0.7);
12404
- color: #00c8ff;
12572
+ color: #0091F6;
12405
12573
  font-size: 12px;
12406
12574
  font-weight: 500;
12407
12575
  padding: 6px 14px;
@@ -12422,7 +12590,7 @@ class DocumentCaptureModal {
12422
12590
  width: 48px;
12423
12591
  height: 48px;
12424
12592
  border: 4px solid rgba(255, 255, 255, 0.2);
12425
- border-top-color: #00c8ff;
12593
+ border-top-color: #0091F6;
12426
12594
  border-radius: 50%;
12427
12595
  animation: neoface-doc-spin 0.8s linear infinite;
12428
12596
  }
@@ -12493,7 +12661,7 @@ class DocumentCaptureModal {
12493
12661
  }
12494
12662
 
12495
12663
  .neoface-doc-preview-hint svg {
12496
- color: #00c8ff;
12664
+ color: #0091F6;
12497
12665
  flex-shrink: 0;
12498
12666
  }
12499
12667
 
@@ -12520,7 +12688,7 @@ class DocumentCaptureModal {
12520
12688
  }
12521
12689
 
12522
12690
  .neoface-doc-btn-primary {
12523
- background: linear-gradient(135deg, #00c8ff 0%, #0099cc 100%);
12691
+ background: linear-gradient(135deg, #0091F6 0%, #0099cc 100%);
12524
12692
  color: #fff;
12525
12693
  }
12526
12694
 
@@ -12530,7 +12698,7 @@ class DocumentCaptureModal {
12530
12698
  }
12531
12699
 
12532
12700
  .neoface-doc-btn-success {
12533
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
12701
+ background: linear-gradient(135deg, #0E9F6E 0%, #059669 100%);
12534
12702
  color: #fff;
12535
12703
  }
12536
12704
 
@@ -12578,7 +12746,7 @@ class DocumentCaptureModal {
12578
12746
  .neoface-doc-brand-name {
12579
12747
  font-size: 13px;
12580
12748
  font-weight: 700;
12581
- color: #00c8ff;
12749
+ color: #0091F6;
12582
12750
  letter-spacing: 1px;
12583
12751
  }
12584
12752