@neofaceid/web-sdk 1.28.2 → 1.30.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.
@@ -4342,21 +4342,209 @@ object({
4342
4342
  task_id: string().optional(),
4343
4343
  status: string().optional()
4344
4344
  });
4345
+ const BLUE = {
4346
+ 400: "#00B0F8",
4347
+ 500: "#0091F6",
4348
+ 700: "#0059C4"
4349
+ };
4350
+ const GOLD = {
4351
+ 500: "#F1BE00"
4352
+ };
4353
+ const INK = {
4354
+ 25: "#F7F9FC",
4355
+ 50: "#F1F5FA",
4356
+ 100: "#E6ECF4",
4357
+ 300: "#AFBDCE",
4358
+ 400: "#8496AD",
4359
+ 500: "#617489",
4360
+ 600: "#48586B",
4361
+ 800: "#1E2B3C",
4362
+ 900: "#111C2B",
4363
+ 950: "#0A1320"
4364
+ };
4365
+ const LIGHT_TOKENS = {
4366
+ ground: INK[25],
4367
+ surface: "#FFFFFF",
4368
+ surfaceMuted: INK[50],
4369
+ line: INK[100],
4370
+ text: INK[950],
4371
+ textMuted: INK[600],
4372
+ textSubtle: INK[500],
4373
+ action: BLUE[700],
4374
+ actionText: "#FFFFFF",
4375
+ accent: GOLD[500],
4376
+ overlay: "rgba(10,19,32,.55)",
4377
+ focusRing: BLUE[700]
4378
+ };
4379
+ const DARK_TOKENS = {
4380
+ ground: INK[950],
4381
+ surface: INK[900],
4382
+ surfaceMuted: INK[800],
4383
+ line: "#22334D",
4384
+ text: "#EEF3F9",
4385
+ textMuted: INK[300],
4386
+ textSubtle: INK[400],
4387
+ action: BLUE[500],
4388
+ actionText: "#FFFFFF",
4389
+ accent: GOLD[500],
4390
+ overlay: "rgba(10,19,32,.72)",
4391
+ focusRing: BLUE[400]
4392
+ };
4393
+ function contrastRatio(hexA, hexB) {
4394
+ const lumA = luminance(hexA);
4395
+ const lumB = luminance(hexB);
4396
+ const [hi, lo] = lumA > lumB ? [lumA, lumB] : [lumB, lumA];
4397
+ return (hi + 0.05) / (lo + 0.05);
4398
+ }
4399
+ function luminance(hex) {
4400
+ const [r, g, b] = parseHex(hex).map((v) => {
4401
+ const s = v / 255;
4402
+ return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;
4403
+ });
4404
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
4405
+ }
4406
+ function parseHex(hex) {
4407
+ let h = hex.trim().replace("#", "");
4408
+ if (h.length === 3) h = h.split("").map((c) => c + c).join("");
4409
+ if (!/^[0-9a-fA-F]{6}$/.test(h)) return [0, 0, 0];
4410
+ return [
4411
+ parseInt(h.slice(0, 2), 16),
4412
+ parseInt(h.slice(2, 4), 16),
4413
+ parseInt(h.slice(4, 6), 16)
4414
+ ];
4415
+ }
4416
+ const ALLOWED_RADIUS = [8, 16, 24];
4417
+ function resolveTheme(options = {}) {
4418
+ const mode = resolveMode(options.theme);
4419
+ const tokens = mode === "dark" ? { ...DARK_TOKENS } : { ...LIGHT_TOKENS };
4420
+ let radius = 16;
4421
+ if (options.radius !== void 0) {
4422
+ if (ALLOWED_RADIUS.includes(options.radius)) {
4423
+ radius = options.radius;
4424
+ } else {
4425
+ console.warn(
4426
+ `[NeoFaceID SDK] radius ${options.radius} inválido — permitidos: 8, 16, 24. Usando 16.`
4427
+ );
4428
+ }
4429
+ }
4430
+ let accent = tokens.action;
4431
+ let accentFellBack = false;
4432
+ if (options.accent) {
4433
+ const ratio = contrastRatio(options.accent, "#FFFFFF");
4434
+ if (ratio >= 4.5) {
4435
+ accent = options.accent;
4436
+ } else {
4437
+ accentFellBack = true;
4438
+ console.warn(
4439
+ `[NeoFaceID SDK] accent ${options.accent} reprova AA vs branco (${ratio.toFixed(2)}:1). Usando ${BLUE[700]}.`
4440
+ );
4441
+ accent = BLUE[700];
4442
+ }
4443
+ }
4444
+ return { mode, tokens: { ...tokens, action: accent }, radius, accent, accentFellBack };
4445
+ }
4446
+ function resolveMode(theme) {
4447
+ if (theme === "dark") return "dark";
4448
+ if (theme === "light") return "light";
4449
+ if (typeof window !== "undefined" && typeof window.matchMedia === "function") {
4450
+ if (window.matchMedia("(prefers-color-scheme: dark)").matches) return "dark";
4451
+ }
4452
+ return "light";
4453
+ }
4454
+ const CSS_VAR = {
4455
+ ground: "--nfid-ground",
4456
+ surface: "--nfid-surface",
4457
+ surfaceMuted: "--nfid-surface-muted",
4458
+ line: "--nfid-line",
4459
+ text: "--nfid-text",
4460
+ textMuted: "--nfid-text-muted",
4461
+ textSubtle: "--nfid-text-subtle",
4462
+ action: "--nfid-action",
4463
+ actionText: "--nfid-action-text",
4464
+ accent: "--nfid-accent",
4465
+ overlay: "--nfid-overlay",
4466
+ focusRing: "--nfid-focus-ring",
4467
+ radius: "--nfid-radius"
4468
+ };
4469
+ const INJECTED_STYLE_ID = "neofaceid-focus-frame-tokens";
4470
+ function injectThemeStyles$1(options = {}) {
4471
+ const resolved = resolveTheme(options);
4472
+ if (typeof document === "undefined") return resolved;
4473
+ const css = buildRootCss(resolved);
4474
+ const existing = document.getElementById(INJECTED_STYLE_ID);
4475
+ if (existing) {
4476
+ if (existing.textContent !== css) existing.textContent = css;
4477
+ return resolved;
4478
+ }
4479
+ const style = document.createElement("style");
4480
+ style.id = INJECTED_STYLE_ID;
4481
+ style.textContent = css;
4482
+ document.head.appendChild(style);
4483
+ return resolved;
4484
+ }
4485
+ function buildRootCss(theme) {
4486
+ const t = theme.tokens;
4487
+ return `.neofaceid-root {
4488
+ ${CSS_VAR.ground}: ${t.ground};
4489
+ ${CSS_VAR.surface}: ${t.surface};
4490
+ ${CSS_VAR.surfaceMuted}: ${t.surfaceMuted};
4491
+ ${CSS_VAR.line}: ${t.line};
4492
+ ${CSS_VAR.text}: ${t.text};
4493
+ ${CSS_VAR.textMuted}: ${t.textMuted};
4494
+ ${CSS_VAR.textSubtle}: ${t.textSubtle};
4495
+ ${CSS_VAR.action}: ${t.action};
4496
+ ${CSS_VAR.actionText}: ${t.actionText};
4497
+ ${CSS_VAR.accent}: ${t.accent};
4498
+ ${CSS_VAR.overlay}: ${t.overlay};
4499
+ ${CSS_VAR.focusRing}: ${t.focusRing};
4500
+ ${CSS_VAR.radius}: ${theme.radius}px;
4501
+ color: var(${CSS_VAR.text});
4502
+ font-family: inherit;
4503
+ }
4504
+ .neofaceid-root :focus-visible {
4505
+ outline: 2px solid var(${CSS_VAR.focusRing});
4506
+ outline-offset: 2px;
4507
+ }`;
4508
+ }
4509
+ function injectScopedStyles$1(id, css) {
4510
+ if (typeof document === "undefined") return;
4511
+ const existing = document.getElementById(id);
4512
+ if (existing) {
4513
+ if (existing.textContent !== css) existing.textContent = css;
4514
+ return;
4515
+ }
4516
+ const style = document.createElement("style");
4517
+ style.id = id;
4518
+ style.textContent = css;
4519
+ document.head.appendChild(style);
4520
+ }
4345
4521
  const __vite_import_meta_env__ = {};
4346
4522
  const ENVIRONMENT_URLS = {
4347
4523
  development: "http://localhost:8000",
4348
4524
  sandbox: "https://sandbox-core.neofaceid.com",
4349
4525
  production: "https://core.neofaceid.com.br"
4350
4526
  };
4351
- let globalConfig = {
4352
- baseUrl: ENVIRONMENT_URLS.sandbox,
4353
- // Default para sandbox
4354
- applicationToken: null,
4355
- environment: "sandbox",
4356
- initialized: false
4357
- };
4527
+ const DEFAULT_LOCALE = "pt-BR";
4528
+ const DEFAULT_RADIUS = 16;
4529
+ const DEFAULT_THEME = "light";
4530
+ const ALLOWED_RADII = [8, 16, 24];
4531
+ function makeDefaultConfig() {
4532
+ return {
4533
+ baseUrl: ENVIRONMENT_URLS.sandbox,
4534
+ applicationToken: null,
4535
+ environment: "sandbox",
4536
+ initialized: false,
4537
+ appName: null,
4538
+ accent: null,
4539
+ radius: DEFAULT_RADIUS,
4540
+ theme: DEFAULT_THEME,
4541
+ locale: DEFAULT_LOCALE,
4542
+ resolvedTheme: null
4543
+ };
4544
+ }
4545
+ let globalConfig = makeDefaultConfig();
4358
4546
  function init(options = {}) {
4359
- const { environment, baseUrl, applicationToken } = options;
4547
+ const { environment, baseUrl, applicationToken, appName, accent, radius, theme, locale } = options;
4360
4548
  if (baseUrl) {
4361
4549
  globalConfig.baseUrl = baseUrl;
4362
4550
  globalConfig.environment = "custom";
@@ -4383,9 +4571,40 @@ function init(options = {}) {
4383
4571
  "[NeoFaceID SDK] applicationToken vazio em init() — 401 esperado em chamadas autenticadas."
4384
4572
  );
4385
4573
  }
4574
+ if (appName && appName.trim()) {
4575
+ globalConfig.appName = appName.trim();
4576
+ } else if (appName !== void 0) {
4577
+ console.warn(
4578
+ '[NeoFaceID SDK] init({ appName }) vazio — modais cairão para o fallback "sua aplicação".'
4579
+ );
4580
+ }
4581
+ if (radius !== void 0) {
4582
+ if (ALLOWED_RADII.includes(radius)) {
4583
+ globalConfig.radius = radius;
4584
+ } else {
4585
+ console.warn(
4586
+ `[NeoFaceID SDK] radius ${radius} inválido em init() — permitidos: 8, 16, 24. Usando 16.`
4587
+ );
4588
+ globalConfig.radius = DEFAULT_RADIUS;
4589
+ }
4590
+ }
4591
+ if (theme) globalConfig.theme = theme;
4592
+ if (locale) globalConfig.locale = locale;
4593
+ if (accent !== void 0) globalConfig.accent = accent;
4594
+ const resolved = resolveTheme({
4595
+ accent: globalConfig.accent ?? void 0,
4596
+ radius: globalConfig.radius,
4597
+ theme: globalConfig.theme
4598
+ });
4599
+ globalConfig.resolvedTheme = resolved;
4600
+ injectThemeStyles$1({
4601
+ accent: globalConfig.accent ?? void 0,
4602
+ radius: globalConfig.radius,
4603
+ theme: globalConfig.theme
4604
+ });
4386
4605
  globalConfig.initialized = true;
4387
4606
  console.log(
4388
- `[NeoFaceID SDK] Inicializado - Ambiente: ${globalConfig.environment}, URL: ${globalConfig.baseUrl}`
4607
+ `[NeoFaceID SDK] Inicializado — Ambiente: ${globalConfig.environment}, URL: ${globalConfig.baseUrl}, appName: ${globalConfig.appName ?? "(vazio)"}, theme: ${resolved.mode}, radius: ${globalConfig.radius}`
4389
4608
  );
4390
4609
  }
4391
4610
  function getBaseUrl() {
@@ -4406,6 +4625,25 @@ function isInitialized() {
4406
4625
  function getConfig() {
4407
4626
  return { ...globalConfig };
4408
4627
  }
4628
+ function getAppName() {
4629
+ return globalConfig.appName;
4630
+ }
4631
+ function getAccent() {
4632
+ return globalConfig.accent;
4633
+ }
4634
+ function getRadius() {
4635
+ return globalConfig.radius;
4636
+ }
4637
+ function getTheme() {
4638
+ return globalConfig.theme;
4639
+ }
4640
+ function getResolvedThemeMode() {
4641
+ var _a2;
4642
+ return ((_a2 = globalConfig.resolvedTheme) == null ? void 0 : _a2.mode) ?? (globalConfig.theme === "dark" ? "dark" : "light");
4643
+ }
4644
+ function getLocale() {
4645
+ return globalConfig.locale;
4646
+ }
4409
4647
  const getApiBaseUrl = () => getBaseUrl();
4410
4648
  const REQUEST_TIMEOUT = 1e4;
4411
4649
  const ensureSecureContext = () => {
@@ -6042,7 +6280,7 @@ const styles = {
6042
6280
  padding: "12px 24px",
6043
6281
  borderRadius: "24px",
6044
6282
  border: "none",
6045
- backgroundColor: "#007AFF",
6283
+ backgroundColor: "#0059C4",
6046
6284
  color: "white",
6047
6285
  fontSize: "16px",
6048
6286
  fontWeight: "bold",
@@ -6156,6 +6394,9 @@ function FaceCaptureModal({
6156
6394
  };
6157
6395
  detectFaces();
6158
6396
  };
6397
+ useEffect(() => {
6398
+ injectThemeStyles$1();
6399
+ }, []);
6159
6400
  useEffect(() => {
6160
6401
  const loadModels = async () => {
6161
6402
  try {
@@ -6243,7 +6484,7 @@ function FaceCaptureModal({
6243
6484
  dispatch({ type: "RESET" });
6244
6485
  setLivenessAttempts(0);
6245
6486
  };
6246
- return /* @__PURE__ */ jsxs("div", { style: styles.overlay, children: [
6487
+ return /* @__PURE__ */ jsxs("div", { className: "neofaceid-root", style: styles.overlay, children: [
6247
6488
  /* @__PURE__ */ jsx("style", { children: keyframes }),
6248
6489
  /* @__PURE__ */ jsx("style", { children: mediaStyles }),
6249
6490
  /* @__PURE__ */ jsxs("div", { style: styles.modal, className: "modal", children: [
@@ -6308,9 +6549,10 @@ class ForgotPasswordModal {
6308
6549
  }
6309
6550
  open() {
6310
6551
  if (this.modalElement) return;
6552
+ injectThemeStyles$1();
6311
6553
  this.addStyles();
6312
6554
  this.modalElement = document.createElement("div");
6313
- this.modalElement.className = "neoface-forgot-modal";
6555
+ this.modalElement.className = "neofaceid-root neoface-forgot-modal";
6314
6556
  this.renderEmailForm();
6315
6557
  document.body.appendChild(this.modalElement);
6316
6558
  }
@@ -6327,10 +6569,10 @@ class ForgotPasswordModal {
6327
6569
  <div class="neoface-forgot-content">
6328
6570
  <div class="neoface-forgot-icon">
6329
6571
  <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"/>
6572
+ <circle cx="32" cy="32" r="28" stroke="#0059C4" stroke-width="3" fill="none"/>
6573
+ <rect x="22" y="28" width="20" height="16" rx="3" stroke="#0059C4" stroke-width="2.5" fill="none"/>
6574
+ <path d="M26 28v-4a6 6 0 0 1 12 0v4" stroke="#0059C4" stroke-width="2.5" stroke-linecap="round"/>
6575
+ <circle cx="32" cy="36" r="2" fill="#0059C4"/>
6334
6576
  </svg>
6335
6577
  </div>
6336
6578
 
@@ -6376,8 +6618,8 @@ class ForgotPasswordModal {
6376
6618
  content.innerHTML = `
6377
6619
  <div class="neoface-forgot-success-icon">
6378
6620
  <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"/>
6621
+ <circle cx="32" cy="32" r="28" stroke="#0E9F6E" stroke-width="3" fill="none"/>
6622
+ <path d="M20 32 L28 40 L44 24" stroke="#0E9F6E" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
6381
6623
  </svg>
6382
6624
  </div>
6383
6625
 
@@ -6429,9 +6671,7 @@ class ForgotPasswordModal {
6429
6671
  addStyles() {
6430
6672
  const styleId = "neoface-forgot-password-modal-styles";
6431
6673
  if (document.getElementById(styleId)) return;
6432
- const style = document.createElement("style");
6433
- style.id = styleId;
6434
- style.textContent = `
6674
+ injectScopedStyles$1(styleId, `
6435
6675
  .neoface-forgot-modal {
6436
6676
  position: fixed;
6437
6677
  top: 0;
@@ -6439,7 +6679,7 @@ class ForgotPasswordModal {
6439
6679
  width: 100%;
6440
6680
  height: 100%;
6441
6681
  z-index: 10003;
6442
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
6682
+ font-family: inherit;
6443
6683
  }
6444
6684
 
6445
6685
  .neoface-forgot-overlay {
@@ -6465,7 +6705,7 @@ class ForgotPasswordModal {
6465
6705
  }
6466
6706
 
6467
6707
  .neoface-forgot-content {
6468
- background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
6708
+ background: linear-gradient(135deg, #0A1320 0%, #111C2B 100%);
6469
6709
  border-radius: 20px;
6470
6710
  padding: 32px;
6471
6711
  max-width: 400px;
@@ -6545,8 +6785,8 @@ class ForgotPasswordModal {
6545
6785
 
6546
6786
  .neoface-forgot-input:focus {
6547
6787
  outline: none;
6548
- border-color: #7c3aed;
6549
- box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.2);
6788
+ border-color: #0059C4;
6789
+ box-shadow: 0 0 0 3px rgba(0, 89, 196, 0.2);
6550
6790
  background: rgba(255, 255, 255, 0.12);
6551
6791
  }
6552
6792
 
@@ -6555,19 +6795,19 @@ class ForgotPasswordModal {
6555
6795
  padding: 14px 24px;
6556
6796
  border-radius: 12px;
6557
6797
  border: none;
6558
- background: linear-gradient(135deg, #7c3aed 0%, #6d28d9 100%);
6798
+ background: linear-gradient(135deg, #0059C4 0%, #00449A 100%);
6559
6799
  color: white;
6560
6800
  font-size: 16px;
6561
6801
  font-weight: 600;
6562
6802
  cursor: pointer;
6563
6803
  transition: all 0.2s;
6564
- box-shadow: 0 4px 16px rgba(124, 58, 237, 0.3);
6804
+ box-shadow: 0 4px 16px rgba(0, 89, 196, 0.3);
6565
6805
  font-family: inherit;
6566
6806
  }
6567
6807
 
6568
6808
  .neoface-forgot-btn-primary:hover:not(:disabled) {
6569
6809
  transform: translateY(-2px);
6570
- box-shadow: 0 8px 24px rgba(124, 58, 237, 0.4);
6810
+ box-shadow: 0 8px 24px rgba(0, 89, 196, 0.4);
6571
6811
  }
6572
6812
 
6573
6813
  .neoface-forgot-btn-primary:disabled {
@@ -6626,8 +6866,7 @@ class ForgotPasswordModal {
6626
6866
  font-size: 20px;
6627
6867
  }
6628
6868
  }
6629
- `;
6630
- document.head.appendChild(style);
6869
+ `);
6631
6870
  }
6632
6871
  }
6633
6872
  const modalReducer = (state, action) => {
@@ -6750,6 +6989,9 @@ function BiometricRegistrationModal({
6750
6989
  "ok"
6751
6990
  );
6752
6991
  const [cameraReady, setCameraReady] = useState(false);
6992
+ useEffect(() => {
6993
+ injectThemeStyles$1();
6994
+ }, []);
6753
6995
  useEffect(() => {
6754
6996
  if (state.status === "liveness") {
6755
6997
  const newStep = state.step;
@@ -7546,7 +7788,7 @@ function BiometricRegistrationModal({
7546
7788
  }
7547
7789
 
7548
7790
  .modal-content {
7549
- background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
7791
+ background: linear-gradient(135deg, #0A1320 0%, #111C2B 100%);
7550
7792
  border-radius: 24px;
7551
7793
  width: 100%;
7552
7794
  max-width: 420px;
@@ -7596,7 +7838,7 @@ function BiometricRegistrationModal({
7596
7838
 
7597
7839
  .icon-wrapper {
7598
7840
  display: inline-block;
7599
- color: #7c3aed;
7841
+ color: #0059C4;
7600
7842
  margin-bottom: 24px;
7601
7843
  }
7602
7844
 
@@ -7617,7 +7859,7 @@ function BiometricRegistrationModal({
7617
7859
  font-size: 28px;
7618
7860
  font-weight: 700;
7619
7861
  margin: 0 0 12px 0;
7620
- background: linear-gradient(135deg, #7c3aed 0%, #a78bfa 100%);
7862
+ background: linear-gradient(135deg, #0059C4 0%, #a78bfa 100%);
7621
7863
  -webkit-background-clip: text;
7622
7864
  -webkit-text-fill-color: transparent;
7623
7865
  background-clip: text;
@@ -7662,7 +7904,7 @@ function BiometricRegistrationModal({
7662
7904
 
7663
7905
  .req-icon.success {
7664
7906
  background: rgba(16, 185, 129, 0.15);
7665
- color: #10b981;
7907
+ color: #0E9F6E;
7666
7908
  border: 1.5px solid rgba(16, 185, 129, 0.3);
7667
7909
  }
7668
7910
 
@@ -7671,18 +7913,18 @@ function BiometricRegistrationModal({
7671
7913
  padding: 16px 32px;
7672
7914
  border-radius: 12px;
7673
7915
  border: none;
7674
- background: linear-gradient(135deg, #7c3aed 0%, #6d28d9 100%);
7916
+ background: linear-gradient(135deg, #0059C4 0%, #00449A 100%);
7675
7917
  color: white;
7676
7918
  font-size: 16px;
7677
7919
  font-weight: 600;
7678
7920
  cursor: pointer;
7679
7921
  transition: all 0.3s;
7680
- box-shadow: 0 4px 16px rgba(124, 58, 237, 0.3);
7922
+ box-shadow: 0 4px 16px rgba(0, 89, 196, 0.3);
7681
7923
  }
7682
7924
 
7683
7925
  .primary-button:hover {
7684
7926
  transform: translateY(-2px);
7685
- box-shadow: 0 8px 24px rgba(124, 58, 237, 0.4);
7927
+ box-shadow: 0 8px 24px rgba(0, 89, 196, 0.4);
7686
7928
  }
7687
7929
 
7688
7930
  .primary-button:active {
@@ -7708,7 +7950,7 @@ function BiometricRegistrationModal({
7708
7950
 
7709
7951
  .brand-name {
7710
7952
  font-weight: 600;
7711
- font-family: 'SF Pro Display', -apple-system, system-ui, sans-serif;
7953
+ font-family: inherit;
7712
7954
  color: #ffffff;
7713
7955
  letter-spacing: 0.3px;
7714
7956
  }
@@ -7757,7 +7999,7 @@ function BiometricRegistrationModal({
7757
7999
  overflow: hidden;
7758
8000
  position: relative;
7759
8001
  /* 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);
8002
+ box-shadow: 0 0 0 4px rgba(0, 89, 196, 0.3);
7761
8003
  background: #000;
7762
8004
  }
7763
8005
 
@@ -7856,7 +8098,7 @@ function BiometricRegistrationModal({
7856
8098
 
7857
8099
  .progress-fill {
7858
8100
  height: 100%;
7859
- background: linear-gradient(90deg, #7c3aed 0%, #10b981 100%);
8101
+ background: linear-gradient(90deg, #0059C4 0%, #0E9F6E 100%);
7860
8102
  border-radius: 2px;
7861
8103
  transition: width 0.05s linear;
7862
8104
  }
@@ -7922,8 +8164,8 @@ function BiometricRegistrationModal({
7922
8164
  .spinner {
7923
8165
  position: absolute;
7924
8166
  inset: 0;
7925
- border: 4px solid rgba(124, 58, 237, 0.2);
7926
- border-top-color: #7c3aed;
8167
+ border: 4px solid rgba(0, 89, 196, 0.2);
8168
+ border-top-color: #0059C4;
7927
8169
  border-radius: 50%;
7928
8170
  animation: spin 1s linear infinite;
7929
8171
  }
@@ -7931,7 +8173,7 @@ function BiometricRegistrationModal({
7931
8173
  .spinner-ring {
7932
8174
  position: absolute;
7933
8175
  inset: -10px;
7934
- border: 2px solid rgba(124, 58, 237, 0.1);
8176
+ border: 2px solid rgba(0, 89, 196, 0.1);
7935
8177
  border-radius: 50%;
7936
8178
  animation: pulseSpinner 2s ease-in-out infinite;
7937
8179
  }
@@ -7967,7 +8209,7 @@ function BiometricRegistrationModal({
7967
8209
  }
7968
8210
 
7969
8211
  .success-icon {
7970
- color: #10b981;
8212
+ color: #0E9F6E;
7971
8213
  animation: scaleIn 0.6s ease-out;
7972
8214
  }
7973
8215
 
@@ -8049,12 +8291,12 @@ function BiometricRegistrationModal({
8049
8291
  }
8050
8292
 
8051
8293
  .profile-main-icon {
8052
- background: rgba(124, 58, 237, 0.1);
8053
- color: #7c3aed;
8294
+ background: rgba(0, 89, 196, 0.1);
8295
+ color: #0059C4;
8054
8296
  padding: 20px;
8055
8297
  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);
8298
+ border: 2px solid rgba(0, 89, 196, 0.2);
8299
+ box-shadow: 0 0 30px rgba(0, 89, 196, 0.2);
8058
8300
  }
8059
8301
 
8060
8302
  .profile-main-icon svg {
@@ -8066,10 +8308,10 @@ function BiometricRegistrationModal({
8066
8308
  position: absolute;
8067
8309
  bottom: -4px;
8068
8310
  right: -4px;
8069
- background: #10b981;
8311
+ background: #0E9F6E;
8070
8312
  border-radius: 50%;
8071
8313
  padding: 4px;
8072
- border: 3px solid #16213e;
8314
+ border: 3px solid #111C2B;
8073
8315
  width: 24px;
8074
8316
  height: 24px;
8075
8317
  display: flex;
@@ -8127,7 +8369,7 @@ function BiometricRegistrationModal({
8127
8369
  }
8128
8370
  }
8129
8371
  ` }),
8130
- /* @__PURE__ */ jsx("div", { className: "modal-overlay", children: /* @__PURE__ */ jsxs("div", { className: "modal-content", children: [
8372
+ /* @__PURE__ */ jsx("div", { className: "neofaceid-root modal-overlay", children: /* @__PURE__ */ jsxs("div", { className: "modal-content", children: [
8131
8373
  /* @__PURE__ */ jsx("button", { type: "button", className: "close-button", onClick: onClose, children: "×" }),
8132
8374
  state.status === "liveness" && renderLivenessDetection(),
8133
8375
  state.status === "camera-loading" && renderCameraLoading(),
@@ -8238,18 +8480,18 @@ function ConsentModalComponent({
8238
8480
  }
8239
8481
  .neofaceid-consent-overlay {
8240
8482
  position: fixed; inset: 0;
8241
- background: rgba(10, 19, 32, 0.55);
8483
+ background: var(--nfid-overlay);
8242
8484
  backdrop-filter: blur(3px);
8243
8485
  -webkit-backdrop-filter: blur(3px);
8244
8486
  display: flex; align-items: center; justify-content: center;
8245
8487
  z-index: 10001; padding: 20px;
8246
8488
  animation: neofaceidConsentFadeIn 200ms ease-out;
8247
8489
  font-family: inherit;
8248
- color: #0A1320;
8490
+ color: var(--nfid-text);
8249
8491
  }
8250
8492
  .neofaceid-consent-modal {
8251
- background: #FFFFFF;
8252
- border-radius: 16px;
8493
+ background: var(--nfid-surface);
8494
+ border-radius: var(--nfid-radius, 16px);
8253
8495
  padding: 28px;
8254
8496
  max-width: 440px;
8255
8497
  width: 100%;
@@ -8266,7 +8508,7 @@ function ConsentModalComponent({
8266
8508
  .neofaceid-consent-appname {
8267
8509
  font-size: 17px;
8268
8510
  font-weight: 700;
8269
- color: #0A1320;
8511
+ color: var(--nfid-text);
8270
8512
  line-height: 1.2;
8271
8513
  }
8272
8514
  .neofaceid-consent-brand-caption {
@@ -8274,19 +8516,19 @@ function ConsentModalComponent({
8274
8516
  font-weight: 700;
8275
8517
  letter-spacing: 0.09em;
8276
8518
  text-transform: uppercase;
8277
- color: #617489;
8519
+ color: var(--nfid-text-subtle);
8278
8520
  }
8279
8521
  .neofaceid-consent-title {
8280
8522
  font-size: 22px;
8281
8523
  font-weight: 700;
8282
- color: #0A1320;
8524
+ color: var(--nfid-text);
8283
8525
  margin: 0 0 8px;
8284
8526
  line-height: 1.25;
8285
8527
  letter-spacing: -0.015em;
8286
8528
  }
8287
8529
  .neofaceid-consent-duration {
8288
8530
  font-size: 14px;
8289
- color: #48586B;
8531
+ color: var(--nfid-text-muted);
8290
8532
  margin: 0 0 20px;
8291
8533
  line-height: 1.5;
8292
8534
  }
@@ -8303,30 +8545,30 @@ function ConsentModalComponent({
8303
8545
  }
8304
8546
  .neofaceid-consent-bullet-icon {
8305
8547
  flex-shrink: 0;
8306
- color: #0059C4;
8548
+ color: var(--nfid-action);
8307
8549
  margin-top: 2px;
8308
8550
  }
8309
8551
  .neofaceid-consent-bullet-title {
8310
8552
  font-size: 14px;
8311
8553
  font-weight: 600;
8312
- color: #0A1320;
8554
+ color: var(--nfid-text);
8313
8555
  margin: 0 0 2px;
8314
8556
  line-height: 1.35;
8315
8557
  }
8316
8558
  .neofaceid-consent-bullet-body {
8317
8559
  font-size: 13px;
8318
- color: #48586B;
8560
+ color: var(--nfid-text-muted);
8319
8561
  margin: 0;
8320
8562
  line-height: 1.45;
8321
8563
  }
8322
8564
  .neofaceid-consent-link {
8323
8565
  display: inline-block;
8324
8566
  font-size: 13px;
8325
- color: #0059C4;
8567
+ color: var(--nfid-action);
8326
8568
  text-decoration: underline;
8327
8569
  margin-bottom: 20px;
8328
8570
  }
8329
- .neofaceid-consent-link:hover { color: #00449A; }
8571
+ .neofaceid-consent-link:hover { opacity: 0.85; }
8330
8572
  .neofaceid-consent-actions {
8331
8573
  display: flex;
8332
8574
  flex-direction: column;
@@ -8335,7 +8577,7 @@ function ConsentModalComponent({
8335
8577
  .neofaceid-consent-button {
8336
8578
  min-height: 44px;
8337
8579
  padding: 12px 20px;
8338
- border-radius: 16px;
8580
+ border-radius: var(--nfid-radius, 16px);
8339
8581
  border: none;
8340
8582
  font-size: 15px;
8341
8583
  font-weight: 600;
@@ -8344,32 +8586,32 @@ function ConsentModalComponent({
8344
8586
  font-family: inherit;
8345
8587
  }
8346
8588
  .neofaceid-consent-button-primary {
8347
- background: #0059C4;
8348
- color: #FFFFFF;
8589
+ background: var(--nfid-action);
8590
+ color: var(--nfid-action-text);
8349
8591
  }
8350
- .neofaceid-consent-button-primary:hover { background: #00449A; }
8592
+ .neofaceid-consent-button-primary:hover { opacity: 0.92; }
8351
8593
  .neofaceid-consent-button-primary:focus-visible {
8352
- outline: 2px solid #0059C4;
8594
+ outline: 2px solid var(--nfid-focus-ring);
8353
8595
  outline-offset: 2px;
8354
8596
  }
8355
8597
  .neofaceid-consent-button-ghost {
8356
8598
  background: transparent;
8357
- color: #334255;
8599
+ color: var(--nfid-text-muted);
8358
8600
  }
8359
- .neofaceid-consent-button-ghost:hover { background: #F1F5FA; }
8601
+ .neofaceid-consent-button-ghost:hover { background: var(--nfid-surface-muted); }
8360
8602
  .neofaceid-consent-footer {
8361
8603
  display: flex;
8362
8604
  justify-content: center;
8363
8605
  margin-top: 20px;
8364
8606
  padding-top: 16px;
8365
- border-top: 1px solid #E6ECF4;
8607
+ border-top: 1px solid var(--nfid-line);
8366
8608
  }
8367
8609
  .neofaceid-consent-seal {
8368
8610
  font-size: 11px;
8369
8611
  font-weight: 700;
8370
8612
  letter-spacing: 0.09em;
8371
8613
  text-transform: uppercase;
8372
- color: #617489;
8614
+ color: var(--nfid-text-subtle);
8373
8615
  }
8374
8616
  @media (max-width: 640px) {
8375
8617
  .neofaceid-consent-modal { padding: 22px; border-radius: 16px; }
@@ -8380,7 +8622,7 @@ function ConsentModalComponent({
8380
8622
  .neofaceid-consent-modal { animation: none; }
8381
8623
  }
8382
8624
  ` }),
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: [
8625
+ /* @__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
8626
  /* @__PURE__ */ jsxs("div", { className: "neofaceid-consent-header", children: [
8385
8627
  /* @__PURE__ */ jsx("span", { className: "neofaceid-consent-appname", children: appName }),
8386
8628
  /* @__PURE__ */ jsx("span", { className: "neofaceid-consent-brand-caption", children: "NeoFaceID" })
@@ -8455,6 +8697,7 @@ class ConsentModal {
8455
8697
  }
8456
8698
  show(props) {
8457
8699
  if (this.container) return;
8700
+ injectThemeStyles$1();
8458
8701
  this.container = document.createElement("div");
8459
8702
  this.container.id = "neofaceid-consent-modal-container";
8460
8703
  document.body.appendChild(this.container);
@@ -8487,10 +8730,11 @@ class ConsentModal {
8487
8730
  }
8488
8731
  const DEFAULT_APP_NAME = "sua aplicação";
8489
8732
  function requestConsent(info = {}) {
8490
- const appName = info.appName ?? DEFAULT_APP_NAME;
8491
- if (!info.appName) {
8733
+ const globalAppName = getAppName();
8734
+ const appName = info.appName ?? globalAppName ?? DEFAULT_APP_NAME;
8735
+ if (!info.appName && !globalAppName) {
8492
8736
  console.warn(
8493
- '[NeoFaceID SDK] requestConsent chamado sem appName — usando fallback "sua aplicação". Passe o nome do integrador via NeoFaceSDK.init({ appName }).'
8737
+ '[NeoFaceID SDK] requestConsent sem appName — usando fallback "sua aplicação". Passe via NeoFaceSDK.init({ appName }) ou opts do caller.'
8494
8738
  );
8495
8739
  }
8496
8740
  const flow = info.flow ?? "verification";
@@ -8554,7 +8798,7 @@ class BiometricCaptureModal {
8554
8798
  */
8555
8799
  async createModal() {
8556
8800
  this.modal = document.createElement("div");
8557
- this.modal.className = "neofaceid-biometric-modal";
8801
+ this.modal.className = "neofaceid-root neofaceid-biometric-modal";
8558
8802
  const title = this.options.title || this.getDefaultTitle();
8559
8803
  const subtitle = this.options.subtitle || this.getDefaultSubtitle();
8560
8804
  this.modal.innerHTML = `
@@ -8587,6 +8831,7 @@ class BiometricCaptureModal {
8587
8831
  </div>
8588
8832
  </div>
8589
8833
  `;
8834
+ injectThemeStyles$1();
8590
8835
  this.addStyles();
8591
8836
  this.addEventListeners();
8592
8837
  document.body.appendChild(this.modal);
@@ -8783,9 +9028,7 @@ class BiometricCaptureModal {
8783
9028
  if (existingStyles) {
8784
9029
  existingStyles.remove();
8785
9030
  }
8786
- const style = document.createElement("style");
8787
- style.id = styleId;
8788
- style.textContent = `
9031
+ injectScopedStyles$1(styleId, `
8789
9032
  .neofaceid-biometric-modal {
8790
9033
  position: fixed;
8791
9034
  top: 0;
@@ -8793,7 +9036,7 @@ class BiometricCaptureModal {
8793
9036
  width: 100%;
8794
9037
  height: 100%;
8795
9038
  z-index: 10000;
8796
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
9039
+ font-family: inherit;
8797
9040
  }
8798
9041
 
8799
9042
  .neofaceid-modal-overlay {
@@ -8901,7 +9144,7 @@ class BiometricCaptureModal {
8901
9144
  .neofaceid-frame {
8902
9145
  width: 200px;
8903
9146
  height: 200px;
8904
- border: 3px solid #4CAF50;
9147
+ border: 3px solid #0E9F6E;
8905
9148
  border-radius: 50%;
8906
9149
  box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.3);
8907
9150
  animation: pulse 2s infinite;
@@ -8967,7 +9210,7 @@ class BiometricCaptureModal {
8967
9210
  }
8968
9211
 
8969
9212
  .neofaceid-capture-btn {
8970
- background: #4CAF50;
9213
+ background: #0E9F6E;
8971
9214
  color: white;
8972
9215
  }
8973
9216
 
@@ -9002,8 +9245,7 @@ class BiometricCaptureModal {
9002
9245
  height: 150px;
9003
9246
  }
9004
9247
  }
9005
- `;
9006
- document.head.appendChild(style);
9248
+ `);
9007
9249
  }
9008
9250
  }
9009
9251
  class BiometricStatusOverlay {
@@ -9058,7 +9300,7 @@ class BiometricStatusOverlay {
9058
9300
  z-index: 10000;
9059
9301
  pointer-events: none;
9060
9302
  animation: neofaceid-fadeIn 0.3s ease-out;
9061
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
9303
+ font-family: inherit;
9062
9304
  }
9063
9305
 
9064
9306
  .neofaceid-overlay-container.fade-out {
@@ -9088,11 +9330,11 @@ class BiometricStatusOverlay {
9088
9330
  height: 80px;
9089
9331
  object-fit: contain;
9090
9332
  transition: all 0.5s ease;
9091
- filter: drop-shadow(0 4px 12px rgba(124, 58, 237, 0.3));
9333
+ filter: drop-shadow(0 4px 12px rgba(0, 89, 196, 0.3));
9092
9334
  }
9093
9335
 
9094
9336
  /* Cores por estado */
9095
- .neofaceid-state-preparing .neofaceid-logo { filter: drop-shadow(0 0 15px rgba(124, 58, 237, 0.4)); }
9337
+ .neofaceid-state-preparing .neofaceid-logo { filter: drop-shadow(0 0 15px rgba(0, 89, 196, 0.4)); }
9096
9338
  .neofaceid-state-detecting .neofaceid-logo { filter: hue-rotate(180deg) drop-shadow(0 0 15px rgba(59, 130, 246, 0.6)); }
9097
9339
  .neofaceid-state-waiting-for-face .neofaceid-logo { filter: hue-rotate(30deg) drop-shadow(0 0 15px rgba(251, 146, 60, 0.6)); }
9098
9340
  .neofaceid-state-capturing .neofaceid-logo { filter: hue-rotate(45deg) drop-shadow(0 0 15px rgba(245, 158, 11, 0.6)); }
@@ -9150,7 +9392,7 @@ class BiometricStatusOverlay {
9150
9392
  .neofaceid-success-icon {
9151
9393
  width: 80px;
9152
9394
  height: 80px;
9153
- color: #10b981;
9395
+ color: #0E9F6E;
9154
9396
  animation: neofaceid-scaleIn 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
9155
9397
  }
9156
9398
 
@@ -9300,142 +9542,132 @@ function FallbackPromptComponent({
9300
9542
  .neofaceid-fallback-overlay {
9301
9543
  position: fixed;
9302
9544
  inset: 0;
9303
- background: rgba(0, 0, 0, 0.6);
9304
- backdrop-filter: blur(8px);
9545
+ background: var(--nfid-overlay);
9546
+ backdrop-filter: blur(3px);
9547
+ -webkit-backdrop-filter: blur(3px);
9305
9548
  display: flex;
9306
9549
  align-items: center;
9307
9550
  justify-content: center;
9308
9551
  z-index: 10001;
9309
9552
  padding: 20px;
9310
9553
  animation: fadeIn 0.3s ease-out;
9554
+ font-family: inherit;
9311
9555
  }
9312
9556
 
9313
9557
  .neofaceid-fallback-prompt {
9314
- background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
9315
- border-radius: 20px;
9316
- padding: 32px;
9558
+ background: var(--nfid-surface);
9559
+ border-radius: var(--nfid-radius, 16px);
9560
+ padding: 28px;
9317
9561
  max-width: 400px;
9318
9562
  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;
9563
+ box-shadow: 0 1px 3px rgba(10, 19, 32, 0.08);
9564
+ animation: slideUp 0.32s cubic-bezier(.2,0,0,1);
9321
9565
  text-align: center;
9566
+ box-sizing: border-box;
9322
9567
  }
9323
9568
 
9569
+ /* Falha de captura é atenção (dourado), nunca crítico (vermelho). */
9324
9570
  .neofaceid-fallback-icon {
9325
- width: 64px;
9326
- height: 64px;
9571
+ width: 56px;
9572
+ height: 56px;
9327
9573
  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
- }
9574
+ color: #F1BE00;
9344
9575
  }
9345
9576
 
9346
9577
  .neofaceid-fallback-title {
9347
- font-size: 22px;
9578
+ font-size: 20px;
9348
9579
  font-weight: 700;
9349
- color: white;
9350
- margin: 0 0 12px 0;
9580
+ color: var(--nfid-text);
9581
+ margin: 0 0 8px 0;
9582
+ line-height: 1.25;
9351
9583
  }
9352
9584
 
9353
9585
  .neofaceid-fallback-message {
9354
- font-size: 15px;
9355
- color: rgba(255, 255, 255, 0.7);
9356
- margin: 0 0 28px 0;
9586
+ font-size: 14px;
9587
+ color: var(--nfid-text-muted);
9588
+ margin: 0 0 24px 0;
9357
9589
  line-height: 1.5;
9358
9590
  }
9359
9591
 
9360
9592
  .neofaceid-fallback-actions {
9361
9593
  display: flex;
9362
9594
  flex-direction: column;
9363
- gap: 12px;
9595
+ gap: 10px;
9364
9596
  }
9365
9597
 
9366
9598
  .neofaceid-fallback-button {
9367
- padding: 14px 24px;
9368
- border-radius: 12px;
9599
+ min-height: 44px;
9600
+ padding: 12px 20px;
9601
+ border-radius: var(--nfid-radius, 16px);
9369
9602
  border: none;
9370
- font-size: 16px;
9603
+ font-size: 15px;
9371
9604
  font-weight: 600;
9372
9605
  cursor: pointer;
9373
- transition: all 0.2s;
9374
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
9606
+ transition: background 120ms ease-out;
9607
+ font-family: inherit;
9375
9608
  }
9376
9609
 
9377
9610
  .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);
9381
- }
9382
-
9383
- .neofaceid-fallback-button-primary:hover {
9384
- transform: translateY(-2px);
9385
- box-shadow: 0 8px 24px rgba(124, 58, 237, 0.4);
9611
+ background: var(--nfid-action);
9612
+ color: var(--nfid-action-text);
9386
9613
  }
9387
-
9388
- .neofaceid-fallback-button-primary:active {
9389
- transform: translateY(0);
9614
+ .neofaceid-fallback-button-primary:hover { opacity: 0.92; }
9615
+ .neofaceid-fallback-button-primary:focus-visible {
9616
+ outline: 2px solid var(--nfid-focus-ring);
9617
+ outline-offset: 2px;
9390
9618
  }
9391
9619
 
9392
9620
  .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);
9621
+ background: var(--nfid-surface-muted);
9622
+ color: var(--nfid-text);
9623
+ border: 1px solid var(--nfid-line);
9401
9624
  }
9625
+ .neofaceid-fallback-button-secondary:hover { opacity: 0.9; }
9402
9626
 
9403
9627
  .neofaceid-fallback-button-ghost {
9404
9628
  background: transparent;
9405
- color: rgba(255, 255, 255, 0.7);
9629
+ color: var(--nfid-text-muted);
9630
+ min-height: 44px;
9406
9631
  padding: 10px;
9407
9632
  }
9408
-
9409
9633
  .neofaceid-fallback-button-ghost:hover {
9410
- color: white;
9411
- background: rgba(255, 255, 255, 0.05);
9634
+ background: var(--nfid-surface-muted);
9412
9635
  }
9413
9636
 
9414
9637
  @media (max-width: 640px) {
9415
9638
  .neofaceid-fallback-prompt {
9416
- padding: 24px;
9417
- border-radius: 16px;
9639
+ padding: 22px;
9418
9640
  }
9419
-
9420
9641
  .neofaceid-fallback-title {
9421
- font-size: 20px;
9642
+ font-size: 18px;
9422
9643
  }
9423
9644
  }
9424
9645
  ` }),
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" }),
9646
+ /* @__PURE__ */ jsx("div", { className: "neofaceid-root neofaceid-fallback-overlay", role: "dialog", "aria-modal": "true", children: /* @__PURE__ */ jsxs("div", { className: "neofaceid-fallback-prompt", children: [
9647
+ /* @__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: [
9428
9648
  /* @__PURE__ */ jsx(
9429
9649
  "path",
9430
9650
  {
9431
- d: "M20 20 L44 44 M44 20 L20 44",
9651
+ d: "M32 8 L58 54 H6 Z",
9652
+ stroke: "currentColor",
9653
+ strokeWidth: "3",
9654
+ strokeLinecap: "round",
9655
+ strokeLinejoin: "round",
9656
+ fill: "none"
9657
+ }
9658
+ ),
9659
+ /* @__PURE__ */ jsx(
9660
+ "path",
9661
+ {
9662
+ d: "M32 26 V38",
9432
9663
  stroke: "currentColor",
9433
9664
  strokeWidth: "3",
9434
9665
  strokeLinecap: "round"
9435
9666
  }
9436
- )
9667
+ ),
9668
+ /* @__PURE__ */ jsx("circle", { cx: "32", cy: "45", r: "2", fill: "currentColor" })
9437
9669
  ] }) }),
9438
- /* @__PURE__ */ jsx("h3", { className: "neofaceid-fallback-title", children: "Não foi possível reconhecer" }),
9670
+ /* @__PURE__ */ jsx("h3", { className: "neofaceid-fallback-title", children: "Vamos tentar de outro jeito" }),
9439
9671
  /* @__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
9672
  /* @__PURE__ */ jsxs("div", { className: "neofaceid-fallback-actions", children: [
9441
9673
  /* @__PURE__ */ jsx(
@@ -9490,6 +9722,7 @@ class FallbackPrompt {
9490
9722
  if (this.container) {
9491
9723
  return;
9492
9724
  }
9725
+ injectThemeStyles$1();
9493
9726
  this.container = document.createElement("div");
9494
9727
  this.container.id = "neofaceid-fallback-prompt";
9495
9728
  document.body.appendChild(this.container);
@@ -9563,9 +9796,10 @@ class EmailPasswordModal {
9563
9796
  }
9564
9797
  }
9565
9798
  createModal() {
9799
+ injectThemeStyles$1();
9566
9800
  this.addStyles();
9567
9801
  this.modalElement = document.createElement("div");
9568
- this.modalElement.className = "neoface-email-password-modal";
9802
+ this.modalElement.className = "neofaceid-root neoface-email-password-modal";
9569
9803
  this.modalElement.innerHTML = `
9570
9804
  <div class="neoface-email-modal-overlay">
9571
9805
  <div class="neoface-email-modal-content">
@@ -9601,9 +9835,7 @@ class EmailPasswordModal {
9601
9835
  if (existingStyles) {
9602
9836
  return;
9603
9837
  }
9604
- const style = document.createElement("style");
9605
- style.id = styleId;
9606
- style.textContent = `
9838
+ injectScopedStyles$1(styleId, `
9607
9839
  .neoface-email-password-modal {
9608
9840
  position: fixed;
9609
9841
  top: 0;
@@ -9611,7 +9843,7 @@ class EmailPasswordModal {
9611
9843
  width: 100%;
9612
9844
  height: 100%;
9613
9845
  z-index: 10002;
9614
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
9846
+ font-family: inherit;
9615
9847
  }
9616
9848
 
9617
9849
  .neoface-email-modal-overlay {
@@ -9643,7 +9875,7 @@ class EmailPasswordModal {
9643
9875
  }
9644
9876
 
9645
9877
  .neoface-email-modal-content {
9646
- background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
9878
+ background: linear-gradient(135deg, #0A1320 0%, #111C2B 100%);
9647
9879
  border-radius: 20px;
9648
9880
  padding: 32px;
9649
9881
  max-width: 400px;
@@ -9694,8 +9926,8 @@ class EmailPasswordModal {
9694
9926
 
9695
9927
  .neoface-email-modal-content input:focus {
9696
9928
  outline: none;
9697
- border-color: #7c3aed;
9698
- box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.2);
9929
+ border-color: #0059C4;
9930
+ box-shadow: 0 0 0 3px rgba(0, 89, 196, 0.2);
9699
9931
  background: rgba(255, 255, 255, 0.15);
9700
9932
  }
9701
9933
 
@@ -9704,19 +9936,19 @@ class EmailPasswordModal {
9704
9936
  padding: 14px 24px;
9705
9937
  border-radius: 12px;
9706
9938
  border: none;
9707
- background: linear-gradient(135deg, #7c3aed 0%, #6d28d9 100%);
9939
+ background: linear-gradient(135deg, #0059C4 0%, #00449A 100%);
9708
9940
  color: white;
9709
9941
  font-size: 16px;
9710
9942
  font-weight: 600;
9711
9943
  cursor: pointer;
9712
9944
  transition: all 0.2s;
9713
- box-shadow: 0 4px 16px rgba(124, 58, 237, 0.3);
9945
+ box-shadow: 0 4px 16px rgba(0, 89, 196, 0.3);
9714
9946
  font-family: inherit;
9715
9947
  }
9716
9948
 
9717
9949
  .neoface-email-submit-btn:hover {
9718
9950
  transform: translateY(-2px);
9719
- box-shadow: 0 8px 24px rgba(124, 58, 237, 0.4);
9951
+ box-shadow: 0 8px 24px rgba(0, 89, 196, 0.4);
9720
9952
  }
9721
9953
 
9722
9954
  .neoface-email-submit-btn:active {
@@ -9768,7 +10000,7 @@ class EmailPasswordModal {
9768
10000
 
9769
10001
  .neoface-email-brand-name {
9770
10002
  font-weight: 600;
9771
- font-family: 'SF Pro Display', -apple-system, system-ui, sans-serif;
10003
+ font-family: inherit;
9772
10004
  color: #ffffff;
9773
10005
  letter-spacing: 0.3px;
9774
10006
  }
@@ -9795,8 +10027,7 @@ class EmailPasswordModal {
9795
10027
  font-size: 20px;
9796
10028
  }
9797
10029
  }
9798
- `;
9799
- document.head.appendChild(style);
10030
+ `);
9800
10031
  }
9801
10032
  async handleSubmit(event) {
9802
10033
  event.preventDefault();
@@ -10640,8 +10871,8 @@ const biometricDetection = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.
10640
10871
  initializeBiometricDetection,
10641
10872
  isAdvancedDetectionAvailable
10642
10873
  }, Symbol.toStringTag, { value: "Module" }));
10643
- const VERSION = "1.28.2";
10644
- const RELEASE_DATE = "2026-09-01";
10874
+ const VERSION = "1.30.0";
10875
+ const RELEASE_DATE = "2026-09-02";
10645
10876
  let cachedSession = null;
10646
10877
  function getCachedCaptureSession() {
10647
10878
  return cachedSession;
@@ -10956,27 +11187,30 @@ class OnboardingCaptureModal {
10956
11187
  </div>
10957
11188
  </div>
10958
11189
  `;
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);
11190
+ injectThemeStyles();
11191
+ injectScopedStyles(
11192
+ "neofaceid-onboarding-capture-styles",
11193
+ `
11194
+ .neofaceid-root .neofaceid-modal-overlay { position: fixed; inset: 0; background: var(--nfid-overlay); display:flex; align-items:center; justify-content:center; z-index: 9999; }
11195
+ .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; }
11196
+ .neofaceid-root .neofaceid-modal-header { padding: 16px 20px; border-bottom: 1px solid var(--nfid-line); display:flex; align-items:center; justify-content:space-between; }
11197
+ .neofaceid-root .neofaceid-title { margin:0; font-size: 20px; color: var(--nfid-text); }
11198
+ .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; }
11199
+ .neofaceid-root .neofaceid-modal-body { padding: 16px 20px; }
11200
+ .neofaceid-root .neofaceid-subtitle { margin: 0 0 12px 0; color: var(--nfid-text-muted); }
11201
+ .neofaceid-root .neofaceid-camera-container { position: relative; background:#000; border-radius:8px; overflow:hidden; aspect-ratio: 4/3; margin-bottom: 12px; }
11202
+ .neofaceid-root .neofaceid-video { width:100%; height:100%; object-fit: cover; }
11203
+ .neofaceid-root .neofaceid-canvas { position:absolute; top:0; left:0; }
11204
+ .neofaceid-root .neofaceid-overlay { position:absolute; inset:0; display:flex; align-items:center; justify-content:center; }
11205
+ .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); }
11206
+ .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%; }
11207
+ .neofaceid-root .neofaceid-modal-footer { padding: 16px 20px; border-top: 1px solid var(--nfid-line); display:flex; gap: 8px; justify-content:flex-end; }
11208
+ .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; }
11209
+ .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; }
11210
+ .neofaceid-root .neofaceid-capture-btn:disabled { background: var(--nfid-line); cursor:not-allowed; }
11211
+ `
11212
+ );
11213
+ overlay.classList.add("neofaceid-root");
10980
11214
  document.body.appendChild(overlay);
10981
11215
  this.overlay = overlay;
10982
11216
  this.video = this.overlay.querySelector(".neofaceid-video");
@@ -11691,12 +11925,9 @@ class DocumentCaptureModal {
11691
11925
  <div class="neoface-doc-content"></div>
11692
11926
  </div>
11693
11927
  `;
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
- }
11928
+ injectThemeStyles$1();
11929
+ injectScopedStyles$1("neoface-doc-styles-v2", this.getStyles());
11930
+ overlay.classList.add("neofaceid-root");
11700
11931
  document.body.appendChild(overlay);
11701
11932
  this.overlay = overlay;
11702
11933
  }
@@ -12181,12 +12412,12 @@ class DocumentCaptureModal {
12181
12412
  align-items: center;
12182
12413
  justify-content: center;
12183
12414
  z-index: 10000;
12184
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
12415
+ font-family: inherit;
12185
12416
  padding: 16px;
12186
12417
  }
12187
12418
 
12188
12419
  .neoface-doc-modal {
12189
- background: linear-gradient(145deg, #1a1a2e 0%, #16213e 100%);
12420
+ background: linear-gradient(145deg, #0A1320 0%, #111C2B 100%);
12190
12421
  border-radius: 24px;
12191
12422
  width: 100%;
12192
12423
  max-width: 520px;
@@ -12228,7 +12459,7 @@ class DocumentCaptureModal {
12228
12459
  }
12229
12460
 
12230
12461
  .neoface-doc-step-badge {
12231
- background: linear-gradient(135deg, #00c8ff, #0099cc);
12462
+ background: linear-gradient(135deg, #0091F6, #0099cc);
12232
12463
  color: #fff;
12233
12464
  font-size: 12px;
12234
12465
  font-weight: 600;
@@ -12293,7 +12524,7 @@ class DocumentCaptureModal {
12293
12524
  height: 44px;
12294
12525
  background: rgba(0, 200, 255, 0.15);
12295
12526
  border-radius: 12px;
12296
- color: #00c8ff;
12527
+ color: #0091F6;
12297
12528
  }
12298
12529
 
12299
12530
  .neoface-doc-select-icon svg {
@@ -12314,7 +12545,7 @@ class DocumentCaptureModal {
12314
12545
  }
12315
12546
 
12316
12547
  .neoface-doc-select-option:hover .neoface-doc-select-arrow {
12317
- color: #00c8ff;
12548
+ color: #0091F6;
12318
12549
  transform: translateX(4px);
12319
12550
  }
12320
12551
 
@@ -12341,7 +12572,7 @@ class DocumentCaptureModal {
12341
12572
  }
12342
12573
 
12343
12574
  .neoface-doc-tip-icon {
12344
- color: #00c8ff;
12575
+ color: #0091F6;
12345
12576
  flex-shrink: 0;
12346
12577
  }
12347
12578
 
@@ -12386,7 +12617,7 @@ class DocumentCaptureModal {
12386
12617
  position: absolute;
12387
12618
  width: 28px;
12388
12619
  height: 28px;
12389
- border-color: #00c8ff;
12620
+ border-color: #0091F6;
12390
12621
  border-style: solid;
12391
12622
  }
12392
12623
 
@@ -12401,7 +12632,7 @@ class DocumentCaptureModal {
12401
12632
  left: 50%;
12402
12633
  transform: translateX(-50%);
12403
12634
  background: rgba(0, 0, 0, 0.7);
12404
- color: #00c8ff;
12635
+ color: #0091F6;
12405
12636
  font-size: 12px;
12406
12637
  font-weight: 500;
12407
12638
  padding: 6px 14px;
@@ -12422,7 +12653,7 @@ class DocumentCaptureModal {
12422
12653
  width: 48px;
12423
12654
  height: 48px;
12424
12655
  border: 4px solid rgba(255, 255, 255, 0.2);
12425
- border-top-color: #00c8ff;
12656
+ border-top-color: #0091F6;
12426
12657
  border-radius: 50%;
12427
12658
  animation: neoface-doc-spin 0.8s linear infinite;
12428
12659
  }
@@ -12493,7 +12724,7 @@ class DocumentCaptureModal {
12493
12724
  }
12494
12725
 
12495
12726
  .neoface-doc-preview-hint svg {
12496
- color: #00c8ff;
12727
+ color: #0091F6;
12497
12728
  flex-shrink: 0;
12498
12729
  }
12499
12730
 
@@ -12520,7 +12751,7 @@ class DocumentCaptureModal {
12520
12751
  }
12521
12752
 
12522
12753
  .neoface-doc-btn-primary {
12523
- background: linear-gradient(135deg, #00c8ff 0%, #0099cc 100%);
12754
+ background: linear-gradient(135deg, #0091F6 0%, #0099cc 100%);
12524
12755
  color: #fff;
12525
12756
  }
12526
12757
 
@@ -12530,7 +12761,7 @@ class DocumentCaptureModal {
12530
12761
  }
12531
12762
 
12532
12763
  .neoface-doc-btn-success {
12533
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
12764
+ background: linear-gradient(135deg, #0E9F6E 0%, #059669 100%);
12534
12765
  color: #fff;
12535
12766
  }
12536
12767
 
@@ -12578,7 +12809,7 @@ class DocumentCaptureModal {
12578
12809
  .neoface-doc-brand-name {
12579
12810
  font-size: 13px;
12580
12811
  font-weight: 700;
12581
- color: #00c8ff;
12812
+ color: #0091F6;
12582
12813
  letter-spacing: 1px;
12583
12814
  }
12584
12815
 
@@ -12763,11 +12994,17 @@ export {
12763
12994
  completeOnboardingWithData,
12764
12995
  confirmPasswordReset,
12765
12996
  detectBiometricType,
12997
+ getAccent,
12998
+ getAppName,
12766
12999
  getApplicationToken,
12767
13000
  getBaseUrl,
12768
13001
  getCachedCaptureSession,
12769
13002
  getConfig,
12770
13003
  getEnvironment,
13004
+ getLocale,
13005
+ getRadius,
13006
+ getResolvedThemeMode,
13007
+ getTheme,
12771
13008
  identifyPerson,
12772
13009
  identifyPersonAsync,
12773
13010
  init,