@magicfeedback/popup-sdk 1.8.5 → 1.9.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.
@@ -535,7 +535,9 @@ var style_default = `/**
535
535
  * repintar\xEDa su web.
536
536
  * 4. El grupo .magicfeedback-radio se cualifica como div.magicfeedback-radio (la clase acaba
537
537
  * tambi\xE9n en el <input> del boolean).
538
- * 5. Al final, un bloque de reglas propias del popup (fuente en los controles y padding del
538
+ * 5. Todo :hover va dentro de @media (hover: hover): en t\xE1ctil WebKit deja el hover pegado
539
+ * en el \xFAltimo punto tocado y la opci\xF3n de la p\xE1gina siguiente parec\xEDa seleccionada.
540
+ * 6. Al final, un bloque de reglas propias del popup (fuente en los controles y padding del
539
541
  * radio nativo).
540
542
  *
541
543
  * Las variables --mf-* se dejan en :root a prop\xF3sito: el modal del priority-list se portea a
@@ -773,9 +775,11 @@ var style_default = `/**
773
775
  text-underline-offset: 2px;
774
776
  }
775
777
 
776
- .magicfeedback-info-message a:hover,
777
- .magicfeedback-start-message a:hover {
778
- color: var(--mf-primary-hover);
778
+ @media (hover: hover) {
779
+ .magicfeedback-info-message a:hover,
780
+ .magicfeedback-start-message a:hover {
781
+ color: var(--mf-primary-hover);
782
+ }
779
783
  }
780
784
 
781
785
  .magicfeedback-info-message ul,
@@ -1001,10 +1005,12 @@ div.magicfeedback-radio {
1001
1005
  transition: var(--mf-transition-fast);
1002
1006
  }
1003
1007
 
1004
- .magicfeedback-checkbox-container:hover,
1005
- .magicfeedback-radio-container:hover {
1006
- background-color: var(--mf-bg-hover);
1007
- border-color: var(--mf-primary);
1008
+ @media (hover: hover) {
1009
+ .magicfeedback-checkbox-container:hover,
1010
+ .magicfeedback-radio-container:hover {
1011
+ background-color: var(--mf-bg-hover);
1012
+ border-color: var(--mf-primary);
1013
+ }
1008
1014
  }
1009
1015
 
1010
1016
  .magicfeedback-checkbox-container:has(input:checked),
@@ -1071,9 +1077,11 @@ div.magicfeedback-radio {
1071
1077
  height: inherit;
1072
1078
  }
1073
1079
 
1074
- .magicfeedback-boolean-option label:hover {
1075
- background-color: var(--mf-bg-hover);
1076
- border-color: var(--mf-primary);
1080
+ @media (hover: hover) {
1081
+ .magicfeedback-boolean-option label:hover {
1082
+ background-color: var(--mf-bg-hover);
1083
+ border-color: var(--mf-primary);
1084
+ }
1077
1085
  }
1078
1086
 
1079
1087
  .magicfeedback-boolean-option input[type="radio"]:checked + label {
@@ -1144,9 +1152,11 @@ div.magicfeedback-radio {
1144
1152
  border: 2px solid transparent;
1145
1153
  }
1146
1154
 
1147
- .magicfeedback-rating-option-label-container img:hover {
1148
- transform: scale(1.1);
1149
- border-color: var(--mf-primary);
1155
+ @media (hover: hover) {
1156
+ .magicfeedback-rating-option-label-container img:hover {
1157
+ transform: scale(1.1);
1158
+ border-color: var(--mf-primary);
1159
+ }
1150
1160
  }
1151
1161
 
1152
1162
  .magicfeedback-rating-option-label-container input[type="radio"]:checked + img {
@@ -1298,9 +1308,11 @@ div.magicfeedback-radio {
1298
1308
  font-size: 0.8rem;
1299
1309
  }
1300
1310
 
1301
- .magicfeedback-rating-number-option-row .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value,
1302
- .magicfeedback-rating-number-option-row-reverse .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value {
1303
- background: var(--mf-primary-light);
1311
+ @media (hover: hover) {
1312
+ .magicfeedback-rating-number-option-row .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value,
1313
+ .magicfeedback-rating-number-option-row-reverse .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value {
1314
+ background: var(--mf-primary-light);
1315
+ }
1304
1316
  }
1305
1317
 
1306
1318
  .magicfeedback-rating-number-option-row .magicfeedback-rating-number-option-label-container input[type="radio"]:checked + .magicfeedback-rating-number-value,
@@ -1337,8 +1349,10 @@ div.magicfeedback-radio {
1337
1349
  font-size: var(--mf-font-size-sm);
1338
1350
  }
1339
1351
 
1340
- .magicfeedback-rating-number-option--extra .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value {
1341
- background: var(--mf-primary-light);
1352
+ @media (hover: hover) {
1353
+ .magicfeedback-rating-number-option--extra .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value {
1354
+ background: var(--mf-primary-light);
1355
+ }
1342
1356
  }
1343
1357
 
1344
1358
  .magicfeedback-rating-number-option--extra .magicfeedback-rating-number-option-label-container input[type="radio"]:checked + .magicfeedback-rating-number-value {
@@ -1371,9 +1385,11 @@ div.magicfeedback-radio {
1371
1385
  color: var(--mf-primary);
1372
1386
  }
1373
1387
 
1374
- .magicfeedback-rating-number-option-column .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value,
1375
- .magicfeedback-rating-number-option-column-reverse .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value {
1376
- background: var(--mf-primary-light);
1388
+ @media (hover: hover) {
1389
+ .magicfeedback-rating-number-option-column .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value,
1390
+ .magicfeedback-rating-number-option-column-reverse .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value {
1391
+ background: var(--mf-primary-light);
1392
+ }
1377
1393
  }
1378
1394
 
1379
1395
  .magicfeedback-rating-number-option-column .magicfeedback-rating-number-option-label-container input[type="radio"]:checked + .magicfeedback-rating-number-value,
@@ -1427,10 +1443,12 @@ div.magicfeedback-radio {
1427
1443
  transition: var(--mf-transition-fast);
1428
1444
  }
1429
1445
 
1430
- .magicfeedback-rating-star-option:not(:checked) > .rating__star:hover,
1431
- .magicfeedback-rating-star-option:not(:checked) > .rating__star:hover ~ span {
1432
- color: #fbbf24;
1433
- transform: scale(1.1);
1446
+ @media (hover: hover) {
1447
+ .magicfeedback-rating-star-option:not(:checked) > .rating__star:hover,
1448
+ .magicfeedback-rating-star-option:not(:checked) > .rating__star:hover ~ span {
1449
+ color: #fbbf24;
1450
+ transform: scale(1.1);
1451
+ }
1434
1452
  }
1435
1453
 
1436
1454
  .magicfeedback-rating-star-selected {
@@ -1471,9 +1489,11 @@ div.magicfeedback-radio {
1471
1489
  transition: var(--mf-transition-fast);
1472
1490
  }
1473
1491
 
1474
- .magicfeedback-image-option-label-container:hover img {
1475
- border-color: var(--mf-primary);
1476
- box-shadow: var(--mf-shadow-md);
1492
+ @media (hover: hover) {
1493
+ .magicfeedback-image-option-label-container:hover img {
1494
+ border-color: var(--mf-primary);
1495
+ box-shadow: var(--mf-shadow-md);
1496
+ }
1477
1497
  }
1478
1498
 
1479
1499
  .magicfeedback-image-option-label-container input:checked + img {
@@ -1514,9 +1534,11 @@ div.magicfeedback-radio {
1514
1534
  background-color: var(--mf-bg-secondary);
1515
1535
  }
1516
1536
 
1517
- .magicfeedback-multi-question-matrix-row-tr:hover {
1518
- background-color: var(--mf-bg-hover);
1519
- box-shadow: var(--mf-shadow-sm);
1537
+ @media (hover: hover) {
1538
+ .magicfeedback-multi-question-matrix-row-tr:hover {
1539
+ background-color: var(--mf-bg-hover);
1540
+ box-shadow: var(--mf-shadow-sm);
1541
+ }
1520
1542
  }
1521
1543
 
1522
1544
  .magicfeedback-multi-question-matrix-table td {
@@ -1552,9 +1574,11 @@ div.magicfeedback-radio {
1552
1574
  transition: var(--mf-transition-fast);
1553
1575
  }
1554
1576
 
1555
- .magicfeedback-priority-list-item:hover {
1556
- box-shadow: var(--mf-shadow-sm);
1557
- border-color: var(--mf-primary);
1577
+ @media (hover: hover) {
1578
+ .magicfeedback-priority-list-item:hover {
1579
+ box-shadow: var(--mf-shadow-sm);
1580
+ border-color: var(--mf-primary);
1581
+ }
1558
1582
  }
1559
1583
 
1560
1584
  .magicfeedback-priority-list-item-label {
@@ -1575,10 +1599,12 @@ div.magicfeedback-radio {
1575
1599
  user-select: none;
1576
1600
  }
1577
1601
 
1578
- .magicfeedback-priority-list-arrow-up:hover,
1579
- .magicfeedback-priority-list-arrow-down:hover {
1580
- color: var(--mf-primary);
1581
- transform: scale(1.2);
1602
+ @media (hover: hover) {
1603
+ .magicfeedback-priority-list-arrow-up:hover,
1604
+ .magicfeedback-priority-list-arrow-down:hover {
1605
+ color: var(--mf-primary);
1606
+ transform: scale(1.2);
1607
+ }
1582
1608
  }
1583
1609
 
1584
1610
  /* ========================================
@@ -1685,10 +1711,12 @@ div.magicfeedback-radio {
1685
1711
  box-shadow: var(--mf-shadow-md);
1686
1712
  }
1687
1713
 
1688
- .magicfeedback-submit:hover {
1689
- background-color: var(--mf-primary-hover);
1690
- box-shadow: var(--mf-shadow-lg);
1691
- transform: translateY(-2px);
1714
+ @media (hover: hover) {
1715
+ .magicfeedback-submit:hover {
1716
+ background-color: var(--mf-primary-hover);
1717
+ box-shadow: var(--mf-shadow-lg);
1718
+ transform: translateY(-2px);
1719
+ }
1692
1720
  }
1693
1721
 
1694
1722
  .magicfeedback-submit:active {
@@ -1714,9 +1742,11 @@ div.magicfeedback-radio {
1714
1742
  transition: var(--mf-transition-fast);
1715
1743
  }
1716
1744
 
1717
- .magicfeedback-back:hover {
1718
- border-color: var(--mf-primary);
1719
- background-color: var(--mf-bg-hover);
1745
+ @media (hover: hover) {
1746
+ .magicfeedback-back:hover {
1747
+ border-color: var(--mf-primary);
1748
+ background-color: var(--mf-bg-hover);
1749
+ }
1720
1750
  }
1721
1751
 
1722
1752
  /* ========================================
@@ -1736,8 +1766,10 @@ div.magicfeedback-radio {
1736
1766
  transition: var(--mf-transition-fast);
1737
1767
  }
1738
1768
 
1739
- .magicfeedback-skip-container:hover {
1740
- color: var(--mf-primary);
1769
+ @media (hover: hover) {
1770
+ .magicfeedback-skip-container:hover {
1771
+ color: var(--mf-primary);
1772
+ }
1741
1773
  }
1742
1774
 
1743
1775
  .magicfeedback-skip-container input[type="checkbox"] {
@@ -1878,9 +1910,11 @@ div.magicfeedback-radio {
1878
1910
  box-shadow: var(--mf-shadow-sm);
1879
1911
  }
1880
1912
 
1881
- .magicfeedback-button:hover {
1882
- background: var(--mf-bg-hover);
1883
- border-color: var(--mf-primary);
1913
+ @media (hover: hover) {
1914
+ .magicfeedback-button:hover {
1915
+ background: var(--mf-bg-hover);
1916
+ border-color: var(--mf-primary);
1917
+ }
1884
1918
  }
1885
1919
 
1886
1920
  .magicfeedback-button:active {
@@ -1894,8 +1928,10 @@ div.magicfeedback-radio {
1894
1928
  box-shadow: var(--mf-shadow-md);
1895
1929
  }
1896
1930
 
1897
- .magicfeedback-button-primary:hover {
1898
- background: var(--mf-primary-hover);
1931
+ @media (hover: hover) {
1932
+ .magicfeedback-button-primary:hover {
1933
+ background: var(--mf-primary-hover);
1934
+ }
1899
1935
  }
1900
1936
 
1901
1937
  .magicfeedback-button-primary:active {
@@ -1921,8 +1957,10 @@ div.magicfeedback-radio {
1921
1957
  box-shadow: var(--mf-shadow-md);
1922
1958
  }
1923
1959
 
1924
- .magicfeedback-start-message-button:hover {
1925
- background: var(--mf-primary-hover);
1960
+ @media (hover: hover) {
1961
+ .magicfeedback-start-message-button:hover {
1962
+ background: var(--mf-primary-hover);
1963
+ }
1926
1964
  }
1927
1965
 
1928
1966
  /* ========================================
@@ -2058,12 +2096,18 @@ div.magicfeedback-radio {
2058
2096
  color: #666;
2059
2097
  }
2060
2098
 
2061
- .magicfeedback-modal-close:hover,
2062
2099
  .magicfeedback-modal-close:focus {
2063
2100
  color: #000;
2064
2101
  outline: none;
2065
2102
  }
2066
2103
 
2104
+ @media (hover: hover) {
2105
+ .magicfeedback-modal-close:hover {
2106
+ color: #000;
2107
+ outline: none;
2108
+ }
2109
+ }
2110
+
2067
2111
  /* ========================================
2068
2112
  FILE / IMAGE UPLOAD
2069
2113
  ======================================== */
@@ -2107,9 +2151,11 @@ div.magicfeedback-radio {
2107
2151
  transition: var(--mf-transition);
2108
2152
  }
2109
2153
 
2110
- .magicfeedback-upload-dropzone:hover {
2111
- border-color: var(--mf-primary);
2112
- background-color: var(--mf-bg-hover);
2154
+ @media (hover: hover) {
2155
+ .magicfeedback-upload-dropzone:hover {
2156
+ border-color: var(--mf-primary);
2157
+ background-color: var(--mf-bg-hover);
2158
+ }
2113
2159
  }
2114
2160
 
2115
2161
  .magicfeedback-upload-dropzone:focus-within {
@@ -2247,13 +2293,20 @@ div.magicfeedback-radio {
2247
2293
  transition: var(--mf-transition-fast);
2248
2294
  }
2249
2295
 
2250
- .magicfeedback-upload-remove:hover,
2251
2296
  .magicfeedback-upload-remove:focus-visible {
2252
2297
  color: var(--mf-error);
2253
2298
  background-color: var(--mf-primary-light);
2254
2299
  outline: none;
2255
2300
  }
2256
2301
 
2302
+ @media (hover: hover) {
2303
+ .magicfeedback-upload-remove:hover {
2304
+ color: var(--mf-error);
2305
+ background-color: var(--mf-primary-light);
2306
+ outline: none;
2307
+ }
2308
+ }
2309
+
2257
2310
  .magicfeedback-upload-remove svg {
2258
2311
  width: 16px;
2259
2312
  height: 16px;
@@ -2386,4 +2439,4 @@ export {
2386
2439
  sdkWarn,
2387
2440
  sdkError
2388
2441
  };
2389
- //# sourceMappingURL=chunk-AV2TTQXB.mjs.map
2442
+ //# sourceMappingURL=chunk-MTV7T4OW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tracking/tracking-manager.ts","../src/ui/font.ts","../src/i18n/labels.ts","../src/ui/reveal.ts","../src/ui/surveyPalette.ts","../src/ui/busy.ts","../src/assets/style.css","../src/util/logger.ts"],"sourcesContent":["/**\n * Identidad + sesión para el tracking de navegación (Fase 1).\n * Implementa el \"Contrato común Web+KMP\".\n *\n * Modelo: el SDK gestiona el `user_id` (persistente). El `session_id` es propiedad\n * del BACKEND: llega en la respuesta de `POST /sdk/popups` y se cachea; el backend\n * cose sesiones por `user_id` + ventana. El SDK NO genera ni expira sesiones.\n *\n * Sin dependencias de DOM: recibe el storage y (opcionalmente) el reloj y el\n * generador de uuid por inyección. El binding a `localStorage` vive en `createDefaultStorage`.\n */\n\n/** Store clave/valor mínimo (espejo conceptual del `KeyValueStorage` de KMP). */\nexport interface KeyValueStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\n/** Impl en memoria — usada en tests y como fallback sin `localStorage`. */\nexport class InMemoryStorage implements KeyValueStorage {\n private map = new Map<string, string>();\n getItem(key: string): string | null {\n return this.map.has(key) ? (this.map.get(key) as string) : null;\n }\n setItem(key: string, value: string): void {\n this.map.set(key, value);\n }\n removeItem(key: string): void {\n this.map.delete(key);\n }\n}\n\n/** Storage por defecto en Web: `localStorage` si está disponible, si no in-memory. */\nexport function createDefaultStorage(): KeyValueStorage {\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n const ls = window.localStorage;\n const probe = '__deepdots_probe__';\n ls.setItem(probe, '1');\n ls.removeItem(probe);\n return {\n getItem: (k) => ls.getItem(k),\n setItem: (k, v) => ls.setItem(k, v),\n removeItem: (k) => ls.removeItem(k),\n };\n }\n } catch {\n // cae a in-memory\n }\n return new InMemoryStorage();\n}\n\n/** Claves de storage — namespace `deepdots.*`. Solo identidad (la sesión no se persiste). */\nexport const STORAGE_KEYS = {\n userId: 'deepdots.user_id',\n firstSeen: 'deepdots.user.first_seen',\n contactAttributes: 'deepdots.contact.attributes',\n} as const;\n\n/** Par clave/valor con el formato `NativeAnswer` que espera `@magicfeedback/native`. */\nexport interface IdentityAnswer {\n key: string;\n value: string[];\n}\n\n/**\n * Construye el `profile` y el `metadata` de identidad para inyectar en el survey\n * (`magicfeedback.form(appId, publicKey, profile, metadata)`), según el contrato §5.\n * `session_id` solo se incluye si el backend ya lo proveyó.\n */\nexport function buildSurveyIdentity(\n userId: string | null,\n sessionId: string | null,\n miniService: string | null = null,\n analyticsFeedbackSessionId: string | null = null,\n): { profile: IdentityAnswer[]; metadata: IdentityAnswer[] } {\n const profile: IdentityAnswer[] = userId ? [{ key: 'external-user-id', value: [userId] }] : [];\n const metadata: IdentityAnswer[] = [];\n if (sessionId) metadata.push({ key: 'session_id', value: [sessionId] });\n if (userId) metadata.push({ key: 'user_id', value: [userId] });\n if (miniService) metadata.push({ key: 'mini_service', value: [miniService] });\n if (analyticsFeedbackSessionId) metadata.push({ key: 'deepdots_analytics_feedback_session_id', value: [analyticsFeedbackSessionId] });\n return { profile, metadata };\n}\n\nexport interface TrackingManagerOptions {\n storage: KeyValueStorage;\n /** Id provisto por el cliente; si existe se usa y NO se persiste. */\n clientUserId?: string;\n /** Reloj inyectable (default `Date.now`). */\n now?: () => number;\n /** Generador de uuid inyectable (default uuid v4). */\n uuid?: () => string;\n /** Estado inicial del tracking (default `true`). */\n enabled?: boolean;\n}\n\nfunction defaultUuid(): string {\n const g = (typeof globalThis !== 'undefined' ? globalThis : {}) as {\n crypto?: { randomUUID?: () => string; getRandomValues?: (a: Uint8Array) => Uint8Array };\n };\n if (g.crypto?.randomUUID) return g.crypto.randomUUID();\n const bytes = new Uint8Array(16);\n if (g.crypto?.getRandomValues) {\n g.crypto.getRandomValues(bytes);\n } else {\n for (let i = 0; i < 16; i++) bytes[i] = Math.floor(Math.random() * 256);\n }\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0'));\n return `${hex.slice(0, 4).join('')}-${hex.slice(4, 6).join('')}-${hex\n .slice(6, 8)\n .join('')}-${hex.slice(8, 10).join('')}-${hex.slice(10, 16).join('')}`;\n}\n\nexport class TrackingManager {\n private storage: KeyValueStorage;\n private clientUserId?: string;\n private now: () => number;\n private uuid: () => string;\n private enabled: boolean;\n\n /** session_id cacheado, provisto por el backend (no se genera ni se persiste). */\n private sessionId: string | null = null;\n private userWasJustCreated = false;\n\n constructor(options: TrackingManagerOptions) {\n this.storage = options.storage;\n this.clientUserId = options.clientUserId;\n this.now = options.now ?? (() => Date.now());\n this.uuid = options.uuid ?? defaultUuid;\n this.enabled = options.enabled ?? true;\n }\n\n isTrackingEnabled(): boolean {\n return this.enabled;\n }\n\n setTrackingEnabled(enabled: boolean): void {\n this.enabled = enabled;\n }\n\n /** Resuelve el user_id según la regla: cliente > persistido > generar+persistir. */\n getUserId(): string | null {\n if (!this.enabled) return null;\n if (this.clientUserId) return this.clientUserId;\n\n const persisted = this.storage.getItem(STORAGE_KEYS.userId);\n if (persisted) return persisted;\n\n const id = this.uuid();\n this.storage.setItem(STORAGE_KEYS.userId, id);\n this.storage.setItem(STORAGE_KEYS.firstSeen, String(this.now()));\n this.userWasJustCreated = true;\n return id;\n }\n\n /** `true` solo en la primera sesión tras crear el user_id propio del SDK. */\n isNewUser(): boolean {\n return this.userWasJustCreated;\n }\n\n /** session_id actual provisto por el backend, o null si aún no llegó. */\n getSessionId(): string | null {\n if (!this.enabled) return null;\n return this.sessionId;\n }\n\n /** Cachea el session_id devuelto por el backend (respuesta de POST /sdk/popups). */\n setSessionId(sessionId: string | null): void {\n if (!this.enabled) return;\n this.sessionId = sessionId;\n }\n}\n","/**\n * Helpers puros (sin DOM) para la fuente personalizable del popup/survey.\n * Espejo exacto en KMP: `ui/Font.kt`. Cualquier cambio aquí se replica allí.\n */\n\nconst FORMAT_BY_EXT: Record<string, string> = {\n woff2: 'woff2',\n woff: 'woff',\n ttf: 'truetype',\n otf: 'opentype',\n};\n\n/** Deriva el `format()` del `@font-face` a partir de la extensión de la URL. */\nexport function fontFormatFromUrl(url: string): string | undefined {\n const clean = url.split('?')[0].split('#')[0];\n const ext = clean.slice(clean.lastIndexOf('.') + 1).toLowerCase();\n return FORMAT_BY_EXT[ext];\n}\n\n// family/url provienen de la API y se interpolan en CSS y en el <style> del HTML del WebView.\n// Saneamos para evitar romper el string/rule (CSS injection) o cerrar </style> (script injection).\nfunction sanitizeFamily(family: string): string {\n return family.replace(/[^A-Za-z0-9 ._-]/g, '').trim();\n}\n\nfunction isSafeFontUrl(url: string): boolean {\n // Solo http(s)/data y sin caracteres que rompan url(\"...\") o el <style>:\n // comillas, <>, backslash, y cualquier whitespace o carácter de control.\n if (!/^(https?:|data:)/i.test(url)) return false;\n // eslint-disable-next-line no-control-regex\n return !/[\\x00-\\x20\"<>\\\\]/.test(url);\n}\n\n/** Valor a aplicar en `font-family`: nombre custom + fallback de sistema. */\nexport function buildFontFamilyValue(family: string): string {\n const safe = sanitizeFamily(family);\n return `\"${safe}\", -apple-system, system-ui, sans-serif`;\n}\n\n/** CSS del `@font-face`. Devuelve \"\" si no hay url (o no es segura). */\nexport function buildFontFaceCss(family: string, url?: string): string {\n if (!url || !isSafeFontUrl(url)) return '';\n const safe = sanitizeFamily(family);\n const fmt = fontFormatFromUrl(url);\n const src = fmt ? `url(\"${url}\") format(\"${fmt}\")` : `url(\"${url}\")`;\n return `@font-face{font-family:\"${safe}\";src:${src};font-display:swap;}`;\n}\n","import type { PopupActions } from '../types';\n\n/**\n * Textos que pinta el SDK alrededor del survey (botones del footer, barra de progreso,\n * aria-labels y avisos de error). NO son textos del survey: las preguntas, placeholders y\n * opciones las localiza `@magicfeedback/native` con `formData.lang[0]`, el idioma configurado\n * en la integración. Este módulo existe para que el chrome del popup hable ese mismo idioma\n * en lugar de quedarse siempre en inglés.\n *\n * Espejo del `i18n/DefaultLabels.kt` del SDK nativo (KMP): mismos locales y mismas reglas de\n * resolución, para que las tres rutas (popup DOM web, WebView de RN y Compose) digan lo mismo.\n */\n\n/** Locales con traducción propia. Cualquier otro idioma cae a `en`. */\nexport type PopupLocale =\n | 'en' | 'es' | 'da' | 'no' | 'sv' | 'fi' | 'de' | 'fr' | 'pt' | 'ar' | 'bn' | 'zh-CN';\n\nexport interface PopupLabels {\n /** Acción principal: enviar la respuesta. */\n accept: string;\n /** Acción de descarte. */\n decline: string;\n /** Botón de la pantalla de bienvenida. */\n start: string;\n /** Botón de la pantalla final. */\n complete: string;\n /** Volver a la pregunta anterior. */\n back: string;\n /** Sustantivo del contador de progreso (\"Question\" en `Question 2 of 5`). */\n question: string;\n /** Separador del contador de progreso (\"of\" en `Question 2 of 5`). */\n of: string;\n /** Distintivo de las preguntas de seguimiento dinámicas. */\n followUp: string;\n /** aria-label del botón de cerrar. */\n closeAria: string;\n /** aria-label del spinner mientras carga el survey. */\n loadingAria: string;\n /** Aviso al intentar avanzar con una pregunta obligatoria sin responder. */\n errorRequired: string;\n /** Aviso cuando el envío falla. */\n errorSubmit: string;\n}\n\nconst EN: PopupLabels = {\n accept: 'Send',\n decline: 'Cancel',\n start: 'Start survey',\n complete: 'Complete survey',\n back: 'Back',\n question: 'Question',\n of: 'of',\n followUp: 'Follow-up',\n closeAria: 'Close popup',\n loadingAria: 'Loading survey',\n errorRequired: 'Please answer the required question to continue.',\n errorSubmit: 'An error occurred while submitting. Please try again or close the popup.',\n};\n\nconst ES: PopupLabels = {\n accept: 'Enviar',\n decline: 'Cancelar',\n start: 'Empezar encuesta',\n complete: 'Completar encuesta',\n back: 'Atrás',\n question: 'Pregunta',\n of: 'de',\n followUp: 'Seguimiento',\n closeAria: 'Cerrar ventana emergente',\n loadingAria: 'Cargando encuesta',\n errorRequired: 'Responde la pregunta obligatoria para continuar.',\n errorSubmit: 'Se produjo un error al enviar. Inténtalo de nuevo o cierra la ventana.',\n};\n\nconst DA: PopupLabels = {\n accept: 'Send',\n decline: 'Annuller',\n start: 'Start undersøgelse',\n complete: 'Afslut undersøgelse',\n back: 'Tilbage',\n question: 'Spørgsmål',\n of: 'af',\n followUp: 'Opfølgning',\n closeAria: 'Luk pop op',\n loadingAria: 'Indlæser undersøgelse',\n errorRequired: 'Besvar venligst det obligatoriske spørgsmål for at fortsætte.',\n errorSubmit: 'Der opstod en fejl under afsendelsen. Prøv igen, eller luk pop op-vinduet.',\n};\n\nconst NO: PopupLabels = {\n accept: 'Send',\n decline: 'Avbryt',\n start: 'Start undersøkelse',\n complete: 'Fullfør undersøkelse',\n back: 'Tilbake',\n question: 'Spørsmål',\n of: 'av',\n followUp: 'Oppfølging',\n closeAria: 'Lukk popup',\n loadingAria: 'Laster undersøkelse',\n errorRequired: 'Svar på det obligatoriske spørsmålet for å fortsette.',\n errorSubmit: 'Det oppstod en feil under innsendingen. Prøv igjen, eller lukk popupen.',\n};\n\nconst SV: PopupLabels = {\n accept: 'Skicka',\n decline: 'Avbryt',\n start: 'Starta undersökning',\n complete: 'Slutför undersökning',\n back: 'Tillbaka',\n question: 'Fråga',\n of: 'av',\n followUp: 'Uppföljning',\n closeAria: 'Stäng popup',\n loadingAria: 'Laddar undersökning',\n errorRequired: 'Svara på den obligatoriska frågan för att fortsätta.',\n errorSubmit: 'Ett fel uppstod vid inskickningen. Försök igen eller stäng popupen.',\n};\n\nconst FI: PopupLabels = {\n accept: 'Lähetä',\n decline: 'Peruuta',\n start: 'Aloita kysely',\n complete: 'Viimeistele kysely',\n back: 'Takaisin',\n question: 'Kysymys',\n of: '/',\n followUp: 'Jatkokysymys',\n closeAria: 'Sulje ponnahdusikkuna',\n loadingAria: 'Ladataan kyselyä',\n errorRequired: 'Vastaa pakolliseen kysymykseen jatkaaksesi.',\n errorSubmit: 'Lähetyksessä tapahtui virhe. Yritä uudelleen tai sulje ponnahdusikkuna.',\n};\n\nconst DE: PopupLabels = {\n accept: 'Senden',\n decline: 'Abbrechen',\n start: 'Umfrage starten',\n complete: 'Umfrage abschließen',\n back: 'Zurück',\n question: 'Frage',\n of: 'von',\n followUp: 'Folgefrage',\n closeAria: 'Popup schließen',\n loadingAria: 'Umfrage wird geladen',\n errorRequired: 'Bitte beantworte die Pflichtfrage, um fortzufahren.',\n errorSubmit: 'Beim Senden ist ein Fehler aufgetreten. Versuche es erneut oder schließe das Popup.',\n};\n\nconst FR: PopupLabels = {\n accept: 'Envoyer',\n decline: 'Annuler',\n start: \"Commencer l'enquête\",\n complete: \"Terminer l'enquête\",\n back: 'Retour',\n question: 'Question',\n of: 'sur',\n followUp: 'Question complémentaire',\n closeAria: 'Fermer la fenêtre',\n loadingAria: \"Chargement de l'enquête\",\n errorRequired: 'Veuillez répondre à la question obligatoire pour continuer.',\n errorSubmit: \"Une erreur s'est produite lors de l'envoi. Réessayez ou fermez la fenêtre.\",\n};\n\nconst PT: PopupLabels = {\n accept: 'Enviar',\n decline: 'Cancelar',\n start: 'Iniciar questionário',\n complete: 'Concluir questionário',\n back: 'Voltar',\n question: 'Pergunta',\n of: 'de',\n followUp: 'Seguimento',\n closeAria: 'Fechar janela',\n loadingAria: 'A carregar questionário',\n errorRequired: 'Responda à pergunta obrigatória para continuar.',\n errorSubmit: 'Ocorreu um erro ao enviar. Tente novamente ou feche a janela.',\n};\n\n// ⚠️ Árabe: el texto es RTL pero el chrome del popup sigue maquetado LTR (ver nota en el\n// README). Traducir ya es mejor que dejarlo en inglés; la dirección es una decisión aparte.\nconst AR: PopupLabels = {\n accept: 'إرسال',\n decline: 'إلغاء',\n start: 'ابدأ الاستبيان',\n complete: 'إنهاء الاستبيان',\n back: 'رجوع',\n question: 'سؤال',\n of: 'من',\n followUp: 'سؤال متابعة',\n closeAria: 'إغلاق النافذة المنبثقة',\n loadingAria: 'جارٍ تحميل الاستبيان',\n errorRequired: 'يرجى الإجابة على السؤال المطلوب للمتابعة.',\n errorSubmit: 'حدث خطأ أثناء الإرسال. يرجى المحاولة مرة أخرى أو إغلاق النافذة.',\n};\n\nconst BN: PopupLabels = {\n accept: 'পাঠান',\n decline: 'বাতিল',\n start: 'জরিপ শুরু করুন',\n complete: 'জরিপ সম্পূর্ণ করুন',\n back: 'পিছনে',\n question: 'প্রশ্ন',\n of: '/',\n followUp: 'ফলো-আপ',\n closeAria: 'পপআপ বন্ধ করুন',\n loadingAria: 'জরিপ লোড হচ্ছে',\n errorRequired: 'চালিয়ে যেতে আবশ্যক প্রশ্নের উত্তর দিন।',\n errorSubmit: 'জমা দেওয়ার সময় একটি ত্রুটি ঘটেছে। আবার চেষ্টা করুন বা পপআপ বন্ধ করুন।',\n};\n\nconst ZH_CN: PopupLabels = {\n accept: '发送',\n decline: '取消',\n start: '开始问卷',\n complete: '完成问卷',\n back: '返回',\n question: '问题',\n of: '/',\n followUp: '追问',\n closeAria: '关闭弹窗',\n loadingAria: '正在加载问卷',\n errorRequired: '请回答必答题后继续。',\n errorSubmit: '提交时出错。请重试或关闭弹窗。',\n};\n\n/** Tabla completa de traducciones, indexada por locale. */\nexport const LABELS: Record<PopupLocale, PopupLabels> = {\n en: EN,\n es: ES,\n da: DA,\n no: NO,\n sv: SV,\n fi: FI,\n de: DE,\n fr: FR,\n pt: PT,\n ar: AR,\n bn: BN,\n 'zh-CN': ZH_CN,\n};\n\n/** Locales con traducción propia del SDK. */\nexport const SUPPORTED_LANGUAGES: PopupLocale[] = [\n // Los 11 idiomas que la plataforma ofrece para un survey, más zh-CN (que el SDK nativo ya\n // traía). Si la plataforma añade uno nuevo, hay que añadirlo aquí o el chrome saldrá en\n // inglés bajo un survey traducido.\n 'en', 'es', 'da', 'no', 'sv', 'fi', 'de', 'fr', 'pt', 'ar', 'bn', 'zh-CN',\n];\n\n/**\n * Normaliza un tag BCP-47 al locale con traducción. Reglas (idénticas a KMP):\n * - el prefijo de idioma manda, sin importar región ni caja (`da`, `da-DK`, `da_DK` → `da`);\n * - las variantes noruegas (`nb`, `nn`) colapsan en `no`;\n * - las variantes chinas (`zh`, `zh-Hans`, `zh-CN`, `zh-TW`) colapsan en `zh-CN`;\n * - `pt-BR` y `pt-PT` comparten juego, igual que `de-AT`/`de-CH` o `fr-CA`;\n * - cualquier otra cosa, incluido un valor no-string del backend, cae a `en`.\n */\nexport function resolveLocale(lang?: string | null): PopupLocale {\n if (typeof lang !== 'string') return 'en';\n const normalized = lang.trim().toLowerCase().replace(/_/g, '-');\n if (!normalized) return 'en';\n if (normalized === 'zh' || normalized.startsWith('zh-')) return 'zh-CN';\n const primary = normalized.split('-')[0];\n switch (primary) {\n case 'en': return 'en';\n case 'es': return 'es';\n case 'da': return 'da';\n case 'no':\n case 'nb':\n case 'nn': return 'no';\n case 'sv': return 'sv';\n case 'fi': return 'fi';\n case 'de': return 'de';\n case 'fr': return 'fr';\n case 'pt': return 'pt';\n case 'ar': return 'ar';\n case 'bn': return 'bn';\n default: return 'en';\n }\n}\n\n/**\n * Locales que se escriben de derecha a izquierda. Espejo de `RTL_LANGUAGES` de\n * `@magicfeedback/native` (2.2.22), que estampa `dir=\"rtl\"` en el contenedor del survey para\n * esos idiomas: el chrome del popup tiene que voltear con él o media tarjeta queda mirando a\n * un lado y media al otro.\n */\nexport const RTL_LOCALES: PopupLocale[] = ['ar'];\n\n/** Si el chrome debe pintarse de derecha a izquierda para `lang`. */\nexport function isRtlLanguage(lang?: string | null): boolean {\n return RTL_LOCALES.includes(resolveLocale(lang));\n}\n\n/** Valor del atributo `dir` del chrome para `lang`. Siempre explícito: nunca se hereda del host. */\nexport function directionFor(lang?: string | null): 'rtl' | 'ltr' {\n return isRtlLanguage(lang) ? 'rtl' : 'ltr';\n}\n\n/** Textos del chrome del popup para `lang`. Cae a inglés si el idioma no está soportado. */\nexport function getLabels(lang?: string | null): PopupLabels {\n return LABELS[resolveLocale(lang)];\n}\n\n/** Etiquetas de los cuatro botones del footer, ya resueltas. */\nexport interface ResolvedActionLabels {\n accept: string;\n decline: string;\n start: string;\n complete: string;\n back: string;\n}\n\n/**\n * Resuelve las etiquetas de los botones con la prioridad acordada: lo que configure la\n * plataforma por popup (`actions.*.label`) gana siempre; si falta o viene en blanco, se usa\n * la traducción del SDK para `lang`.\n */\nexport function resolveActionLabels(actions: PopupActions | undefined, lang?: string | null): ResolvedActionLabels {\n const labels = getLabels(lang);\n const pick = (value: string | undefined, fallback: string): string => {\n const trimmed = typeof value === 'string' ? value.trim() : '';\n return trimmed ? value as string : fallback;\n };\n return {\n accept: pick(actions?.accept?.label, labels.accept),\n decline: pick(actions?.decline?.label, labels.decline),\n start: pick(actions?.start?.label, labels.start),\n complete: pick(actions?.complete?.label, labels.complete),\n back: pick(actions?.back?.label, labels.back),\n };\n}\n\n/**\n * Fuente JavaScript del resolutor de locale, para incrustar en el HTML del WebView (React\n * Native): allí el idioma del survey solo se conoce ya dentro del WebView, así que la\n * normalización tiene que viajar con el HTML. Es un espejo literal de `resolveLocale`, y\n * `labels.test.ts` compara las dos implementaciones contra la misma batería de tags para que\n * no se separen en silencio.\n */\nexport const RESOLVE_LOCALE_JS = `function ddResolveLocale(lang){\n if(typeof lang!=='string') return 'en';\n var n=lang.trim().toLowerCase().replace(/_/g,'-');\n if(!n) return 'en';\n if(n==='zh'||n.indexOf('zh-')===0) return 'zh-CN';\n var p=n.split('-')[0];\n if(p==='en') return 'en';\n if(p==='es') return 'es';\n if(p==='da') return 'da';\n if(p==='no'||p==='nb'||p==='nn') return 'no';\n if(p==='sv') return 'sv';\n if(p==='fi') return 'fi';\n if(p==='de') return 'de';\n if(p==='fr') return 'fr';\n if(p==='pt') return 'pt';\n if(p==='ar') return 'ar';\n if(p==='bn') return 'bn';\n return 'en';\n}`;\n","/**\n * Apertura diferida del popup: el chrome se monta invisible y se enseña cuando el survey ya\n * está pintado, en vez de enseñar un spinner girando mientras se espera.\n *\n * Vive en su propio módulo porque lo comparten las dos rutas de render y `renderPopup` arrastra\n * `@magicfeedback/native`: importar la constante desde allí metería el survey entero en el bundle\n * de React Native. La ruta del WebView (`surveyHtml`) hornea el valor en el HTML y lleva su\n * propio espejo del algoritmo en ES5, porque ese código corre dentro del WebView.\n */\n\n/**\n * Techo de la espera. Pasado este tiempo el popup se abre igualmente (con spinner, el\n * comportamiento de siempre), para que una red mala retrase la apertura pero nunca la impida.\n *\n * 1200 ms sale de medir contra producción: el `GET .../info` del survey tarda unos 250 ms de\n * mediana desde Europa, pero con el servicio frío se han visto 775 ms. El techo tiene que quedar\n * por encima de esa cola: si cayera justo encima, el popup se abriría con el spinner para\n * quitarlo 30 ms después, que es peor que cualquiera de las dos opciones.\n */\nexport const REVEAL_TIMEOUT_MS = 1200;\n\n/**\n * Llama a `reveal` cuando no queden imágenes por llegar dentro de `root`, o ya mismo si no hay\n * ninguna pendiente. Las imágenes (los emojis del rating son SVG, y el logo del survey) llegan\n * DESPUÉS de que el formulario esté montado: sin esperarlas, el popup aparece y se rellena\n * delante del usuario. Quien llama debe mantener su propio techo de tiempo para las que no\n * lleguen nunca.\n */\nexport function revealWhenPainted(root: ParentNode, reveal: () => void): void {\n const pending = Array.from(root.querySelectorAll('img')).filter((img) => !img.complete);\n if (!pending.length) {\n reveal();\n return;\n }\n let left = pending.length;\n const onSettled = () => {\n left -= 1;\n if (left <= 0) reveal();\n };\n pending.forEach((img) => {\n img.addEventListener('load', onSettled, { once: true });\n img.addEventListener('error', onSettled, { once: true });\n });\n}\n","/**\n * Color de marca dentro del survey.\n *\n * El survey pinta sus controles (chips del rating, bordes, foco, selección) con `--mf-primary`,\n * que `@magicfeedback/native` rellena desde `formData.style.primaryColor`. Las integraciones\n * configuran `buttonPrimaryColor` para el botón, pero muchas dejan `primaryColor` vacío, así que\n * el popup acababa mezclando un botón con el color de la marca y unos controles con el `#5d7bad`\n * por defecto del paquete.\n *\n * Aquí se rellena ese hueco: sin `primaryColor`, se usa `buttonPrimaryColor`. Cuando la\n * integración sí define `primaryColor`, ese manda y el SDK no interviene.\n */\n\n/** Estilo del survey, tal y como llega en `formData.style`. */\nexport interface SurveyPaletteStyle {\n primaryColor?: string;\n buttonPrimaryColor?: string;\n}\n\n/**\n * Solo hex. El estilo viene de la API y se interpola en CSS, así que cualquier otra cosa\n * (`red; background: url(...)`, `var(--x)`, …) se descarta en vez de colarse en la hoja.\n */\nconst HEX_COLOR = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\n\n/** Color que debe usar el survey, o null para dejar el del paquete. */\nexport function resolveSurveyPrimaryColor(style?: SurveyPaletteStyle | null): string | null {\n for (const candidate of [style?.primaryColor, style?.buttonPrimaryColor]) {\n const value = (candidate ?? '').trim();\n if (HEX_COLOR.test(value)) return value;\n }\n return null;\n}\n\n/**\n * Las cinco variables que `applyPrimaryColor` del Surveys SDK escribe en el contenedor. Las\n * derivadas hay que redeclararlas y no solo cambiar `--mf-primary`: un `color-mix` escrito en\n * `:root` ya se resolvió allí contra el color por defecto, y heredaría ese valor ya calculado.\n */\nexport function surveyPrimaryVars(color: string): Array<[string, string]> {\n return [\n ['--mf-primary', color],\n ['--mf-primary-hover', `color-mix(in srgb, ${color} 85%, black)`],\n ['--mf-primary-light', `color-mix(in srgb, ${color} 15%, white)`],\n ['--mf-primary-border', `color-mix(in srgb, ${color} 35%, transparent)`],\n ['--mf-border-focus', color],\n ];\n}\n\n/** Pinta el color de marca del survey en `el`. No-op si no hay color utilizable. */\nexport function applySurveyPrimaryColor(el: HTMLElement, style?: SurveyPaletteStyle | null): void {\n const color = resolveSurveyPrimaryColor(style);\n if (!color) return;\n for (const [name, value] of surveyPrimaryVars(color)) {\n el.style.setProperty(name, value);\n }\n}\n\n/**\n * Espejo ES5 de lo anterior, para el JS que corre DENTRO del WebView (React Native y KMP), que no\n * comparte módulos con el bundle. `surveyPalette.test.ts` evalúa este texto y compara el\n * resultado con el del módulo, para que las dos implementaciones no se separen.\n */\nexport const PRIMARY_COLOR_JS = `\nfunction ddResolveSurveyPrimaryColor(style){\n var hex=/^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\n var candidates=[style&&style.primaryColor, style&&style.buttonPrimaryColor];\n for(var i=0;i<candidates.length;i++){\n var value=(candidates[i]||'').trim();\n if(hex.test(value)){ return value; }\n }\n return null;\n}\nfunction ddApplySurveyPrimaryColor(el, style){\n var color=ddResolveSurveyPrimaryColor(style);\n if(!color||!el){ return; }\n el.style.setProperty('--mf-primary', color);\n el.style.setProperty('--mf-primary-hover', 'color-mix(in srgb, '+color+' 85%, black)');\n el.style.setProperty('--mf-primary-light', 'color-mix(in srgb, '+color+' 15%, white)');\n el.style.setProperty('--mf-primary-border', 'color-mix(in srgb, '+color+' 35%, transparent)');\n el.style.setProperty('--mf-border-focus', color);\n}`;\n","/**\n * Bloqueo del survey mientras carga.\n *\n * El spinner de las transiciones entre páginas no tapa nada (es un círculo de 28px en posición\n * absoluta) y `setLoading(true)` solo ocultaba el footer y deshabilitaba SUS botones, así que el\n * contenido del survey seguía respondiendo: el usuario podía cambiar de opción mientras se\n * enviaba la página. Ese cambio ya no viajaba con ella, porque la respuesta se había mandado, de\n * modo que creía haber corregido su respuesta y no era así.\n *\n * Se bloquea el contenedor entero en vez de deshabilitar campo por campo: el survey lo pinta\n * `@magicfeedback/native` y su marcado cambia con cada tipo de pregunta.\n */\n\n/** Marca (o suelta) el contenedor del survey como ocupado. No-op sin elemento. */\nexport function setSurveyBusy(el: HTMLElement | null | undefined, busy: boolean): void {\n if (!el) return;\n // Cadena vacía al soltar, no 'auto': así el CSS del host sigue mandando sobre el elemento.\n el.style.pointerEvents = busy ? 'none' : '';\n el.setAttribute('aria-busy', busy ? 'true' : 'false');\n // `inert` lo saca además del tab order y del lector de pantalla. No está en WebViews\n // antiguos, donde `pointer-events` ya cubre el caso del vídeo del cliente.\n if ('inert' in el) {\n (el as HTMLElement & { inert?: boolean }).inert = busy;\n }\n}\n\n/**\n * Espejo ES5 para el JS que corre DENTRO del WebView (React Native y KMP), que no comparte\n * módulos con el bundle. `busy.test.ts` lo evalúa y compara su efecto con el del módulo, para\n * que las dos implementaciones no se separen.\n */\nexport const BUSY_JS = `\nfunction ddSetSurveyBusy(el, busy){\n if(!el){ return; }\n el.style.pointerEvents = busy ? 'none' : '';\n el.setAttribute('aria-busy', busy ? 'true' : 'false');\n if('inert' in el){ el.inert = busy; }\n}`;\n","/**\n * NO EDITAR A MANO — generado por scripts/vendor-survey-css.mjs\n *\n * Copia de @magicfeedback/native@2.2.22 → dist/styles/magicfeedback-default.css\n * (la hoja canónica del paquete, la que apunta su campo \"style\"), con estos cambios locales:\n *\n * 1. Sin el @import de Google Fonts (Nunito): no queremos una petición externa desde la\n * página del host, y la tipografía la decide el popup.\n * 2. .magicfeedback-container hereda la fuente del popup (var(--deepdots-font, inherit)).\n * 3. Los selectores desnudos (h2, p, input, textarea, select, ::placeholder, .error) van\n * acotados a .deepdots-popup: este CSS se inyecta en el <head> del host y sin acotar\n * repintaría su web.\n * 4. El grupo .magicfeedback-radio se cualifica como div.magicfeedback-radio (la clase acaba\n * también en el <input> del boolean).\n * 5. Todo :hover va dentro de @media (hover: hover): en táctil WebKit deja el hover pegado\n * en el último punto tocado y la opción de la página siguiente parecía seleccionada.\n * 6. Al final, un bloque de reglas propias del popup (fuente en los controles y padding del\n * radio nativo).\n *\n * Las variables --mf-* se dejan en :root a propósito: el modal del priority-list se portea a\n * <body>, fuera de .deepdots-popup, y ahí las necesita.\n *\n * Para subir de versión: npm i @magicfeedback/native@<v> && node scripts/vendor-survey-css.mjs\n */\n\n/**\n * @magicfeedback/native - Default Styles\n * Clean, minimal, and elegant survey rendering\n */\n\n/* @import de Google Fonts (Nunito) eliminado al vendorizar: la fuente la pone el popup. */\n\n/* ========================================\n CSS VARIABLES - Design SYSTEM\n ======================================== */\n:root {\n /* Colors - Minimal Pastel */\n /* --mf-primary is the one source of truth for brand/accent color —\n every token below derives from it via color-mix() (or references\n it directly) so changing this single value, here or via a\n per-integration override, keeps hover/light/border states in\n sync automatically instead of going stale independently. Scoped\n to genuinely interactive/accent surfaces (buttons, selected\n chips, focus rings) — general body text stays on its own neutral\n scale below, not tied to the brand color. */\n --mf-primary: #5d7bad;\n --mf-primary-hover: color-mix(in srgb, var(--mf-primary) 85%, black);\n --mf-primary-light: color-mix(in srgb, var(--mf-primary) 15%, white);\n /* a translucent tint — mixed with transparent (opacity), not white,\n so it reads as a soft shadow of the brand color rather than a\n pastel of it. */\n --mf-primary-border: color-mix(in srgb, var(--mf-primary) 35%, transparent);\n\n --mf-text-primary: #1E293B;\n --mf-text-secondary: #475569;\n --mf-text-muted: #94A3B8;\n\n --mf-bg-primary: #F8FAFC;\n --mf-bg-secondary: #FFFFFF;\n --mf-bg-hover: #EEF2F6;\n\n --mf-border: #E2E8F0;\n --mf-border-focus: var(--mf-primary);\n\n --mf-success: #16A34A;\n --mf-error: #EF4444;\n --mf-warning: #F59E0B;\n\n --mf-surface: #FFFFFF;\n --mf-surface-alt: #F1F5F9;\n --mf-accent: #38BDF8;\n\n /* Spacing */\n --mf-space-xs: 0.25rem;\n --mf-space-sm: 0.5rem;\n --mf-space-md: 0.75rem;\n --mf-space-lg: 1rem;\n --mf-space-xl: 1.5rem;\n\n /* Border Radius */\n --mf-radius-sm: 0.5rem;\n --mf-radius-md: 0.75rem;\n --mf-radius-lg: 1.25rem;\n --mf-radius-full: 9999px;\n\n /* Shadows */\n --mf-shadow-sm: 0 1px 2px 0 rgba(15, 23, 42, 0.06);\n --mf-shadow-md: 0 8px 20px rgba(15, 23, 42, 0.08);\n --mf-shadow-lg: 0 16px 30px rgba(15, 23, 42, 0.12);\n --mf-shadow-focus: 0 0 0 3px rgba(30, 41, 59, 0.15);\n --mf-shadow-card: 0 18px 40px rgba(15, 23, 42, 0.08);\n\n /* Typography */\n --mf-font-sans: \"Nunito\", \"Quicksand\", \"Avenir Next\", \"Trebuchet MS\", sans-serif;\n --mf-font-size-sm: 0.875rem;\n --mf-font-size-base: 1rem;\n --mf-font-size-lg: 1.125rem;\n --mf-font-size-xl: 1.25rem;\n --mf-line-height: 1.6;\n\n /* Font Weights */\n --mf-font-weight-normal: 400;\n --mf-font-weight-medium: 500;\n --mf-font-weight-semibold: 600;\n --mf-font-weight-bold: 700;\n --mf-font-weight-extrabold: 800;\n\n /* Transitions */\n --mf-transition: all 0.2s ease;\n --mf-transition-fast: all 0.15s ease;\n}\n\n/* ========================================\n ANIMATIONS\n ======================================== */\n@keyframes mf-fade-in {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes mf-slide-in {\n from {\n opacity: 0;\n transform: translateX(-16px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n@keyframes mf-scale-in {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n@keyframes mf-pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.8;\n }\n}\n\n/* ========================================\n BASE CONTAINER\n ======================================== */\n.magicfeedback-container {\n /* Local: hereda la fuente del popup; --deepdots-font viene de PopupStyle.font. */\n font-family: var(--deepdots-font, inherit);\n color: var(--mf-text-primary);\n line-height: var(--mf-line-height);\n animation: mf-fade-in 0.4s ease-out;\n border-radius: var(--mf-radius-lg);\n}\n\n/* ========================================\n MESSAGES\n ======================================== */\n.magicfeedback-success-message,\n.magicfeedback-info-message,\n.magicfeedback-start-message {\n padding: var(--mf-space-lg);\n margin: var(--mf-space-lg) 0;\n animation: mf-scale-in 0.3s ease-out;\n}\n\n/* .magicfeedback-info-message/-start-message are set via innerHTML (see\n renderInfoPage.ts / questions.service.ts's renderStartMessage) — whatever\n rich text a survey author writes lands here as real HTML, not just the\n <p>/<img> pair this used to style. Covering the rest of what a rich-text\n editor commonly outputs (headings, lists, links, emphasis, quotes, code,\n rules) keeps that content on the same type scale and palette as the rest\n of the widget instead of falling back to unstyled browser defaults. */\n.magicfeedback-success-message > :first-child,\n.magicfeedback-info-message > :first-child,\n.magicfeedback-start-message > :first-child {\n margin-top: 0;\n}\n\n.magicfeedback-success-message > :last-child,\n.magicfeedback-info-message > :last-child,\n.magicfeedback-start-message > :last-child {\n margin-bottom: 0;\n}\n\n.magicfeedback-success-message p,\n.magicfeedback-info-message p,\n.magicfeedback-start-message p {\n font-size: var(--mf-font-size-base);\n color: var(--mf-text-secondary);\n margin: 0 0 var(--mf-space-md);\n line-height: var(--mf-line-height);\n}\n\n.magicfeedback-info-message h1,\n.magicfeedback-info-message h2,\n.magicfeedback-info-message h3,\n.magicfeedback-info-message h4,\n.magicfeedback-info-message h5,\n.magicfeedback-info-message h6,\n.magicfeedback-start-message h1,\n.magicfeedback-start-message h2,\n.magicfeedback-start-message h3,\n.magicfeedback-start-message h4,\n.magicfeedback-start-message h5,\n.magicfeedback-start-message h6 {\n color: var(--mf-text-primary);\n font-weight: var(--mf-font-weight-bold);\n line-height: 1.3;\n margin: var(--mf-space-lg) 0 var(--mf-space-sm);\n text-align: start;\n}\n\n.magicfeedback-info-message h1, .magicfeedback-start-message h1 { font-size: var(--mf-font-size-xl); }\n.magicfeedback-info-message h2, .magicfeedback-start-message h2 { font-size: var(--mf-font-size-lg); }\n.magicfeedback-info-message h3,\n.magicfeedback-info-message h4,\n.magicfeedback-info-message h5,\n.magicfeedback-info-message h6,\n.magicfeedback-start-message h3,\n.magicfeedback-start-message h4,\n.magicfeedback-start-message h5,\n.magicfeedback-start-message h6 { font-size: var(--mf-font-size-base); }\n\n.magicfeedback-info-message strong,\n.magicfeedback-info-message b,\n.magicfeedback-start-message strong,\n.magicfeedback-start-message b {\n font-weight: var(--mf-font-weight-bold);\n color: var(--mf-text-primary);\n}\n\n.magicfeedback-info-message a,\n.magicfeedback-start-message a {\n color: var(--mf-primary);\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n\n@media (hover: hover) {\n .magicfeedback-info-message a:hover,\n .magicfeedback-start-message a:hover {\n color: var(--mf-primary-hover);\n }\n}\n\n.magicfeedback-info-message ul,\n.magicfeedback-info-message ol,\n.magicfeedback-start-message ul,\n.magicfeedback-start-message ol {\n margin: 0 0 var(--mf-space-md);\n padding-inline-start: var(--mf-space-xl);\n color: var(--mf-text-secondary);\n line-height: var(--mf-line-height);\n}\n\n.magicfeedback-info-message li + li,\n.magicfeedback-start-message li + li {\n margin-top: var(--mf-space-xs);\n}\n\n.magicfeedback-info-message blockquote,\n.magicfeedback-start-message blockquote {\n margin: 0 0 var(--mf-space-md);\n padding: var(--mf-space-sm) var(--mf-space-md);\n border-inline-start: 3px solid var(--mf-primary-border);\n color: var(--mf-text-secondary);\n font-style: italic;\n}\n\n.magicfeedback-info-message code,\n.magicfeedback-start-message code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 0.9em;\n background: var(--mf-bg-hover);\n padding: 0.15em 0.4em;\n border-radius: var(--mf-radius-sm);\n}\n\n.magicfeedback-info-message pre,\n.magicfeedback-start-message pre {\n margin: 0 0 var(--mf-space-md);\n padding: var(--mf-space-md);\n background: var(--mf-bg-hover);\n border-radius: var(--mf-radius-md);\n overflow-x: auto;\n}\n\n.magicfeedback-info-message pre code,\n.magicfeedback-start-message pre code {\n background: none;\n padding: 0;\n}\n\n.magicfeedback-info-message hr,\n.magicfeedback-start-message hr {\n border: none;\n border-top: 1px solid var(--mf-border);\n margin: var(--mf-space-lg) 0;\n}\n\n.magicfeedback-success-message img,\n.magicfeedback-info-message img,\n.magicfeedback-start-message img {\n max-width: 100%;\n height: auto;\n margin: var(--mf-space-lg) auto;\n display: block;\n border-radius: var(--mf-radius-md);\n}\n\n.magicfeedback-image {\n max-height: 400px;\n height: auto;\n max-width: 100%;\n margin: var(--mf-space-lg) auto;\n display: block;\n border-radius: var(--mf-radius-md);\n}\n\n/* ========================================\n FORM STRUCTURE\n ======================================== */\n.magicfeedback-form {\n display: flex;\n flex-direction: column;\n gap: var(--mf-space-lg);\n padding: clamp(16px, 2.5vw, 28px);\n}\n\n.magicfeedback-questions {\n display: flex;\n flex-direction: column;\n gap: var(--mf-space-xl);\n width: 100%;\n}\n\n.magicfeedback-div {\n display: flex;\n flex-direction: column;\n gap: var(--mf-space-sm);\n animation: mf-slide-in 0.3s ease-out;\n background: var(--mf-bg-secondary);\n border-radius: var(--mf-radius-md);\n}\n\n/* ========================================\n LABELS & TYPOGRAPHY\n ======================================== */\n.magicfeedback-label {\n font-size: var(--mf-font-size-lg);\n font-weight: var(--mf-font-weight-bold);\n color: var(--mf-text-primary);\n line-height: var(--mf-line-height);\n text-align: start;\n letter-spacing: -0.01em;\n}\n\n.magicfeedback-sublabel {\n font-size: var(--mf-font-size-base);\n font-weight: var(--mf-font-weight-normal);\n color: var(--mf-text-secondary);\n margin-bottom: var(--mf-space-sm);\n}\n\n.deepdots-popup h2 {\n font-size: var(--mf-font-size-xl);\n font-weight: 600;\n color: var(--mf-text-primary);\n margin: 0 0 var(--mf-space-xl) 0;\n text-align: center;\n letter-spacing: -0.01em;\n}\n\n.deepdots-popup p {\n margin: 0;\n font-size: var(--mf-font-size-sm);\n color: var(--mf-text-secondary);\n}\n\n/* ========================================\n FORM INPUTS\n ======================================== */\n.deepdots-popup input[type=\"date\"],\n.deepdots-popup input[type=\"text\"],\n.deepdots-popup input[type=\"number\"],\n.deepdots-popup input[type=\"email\"],\n.deepdots-popup input[type=\"password\"],\n.deepdots-popup textarea,\n.deepdots-popup select {\n padding: 0.75rem 0.9rem;\n font-size: var(--mf-font-size-base);\n font-family: inherit;\n color: var(--mf-text-primary);\n background-color: var(--mf-surface);\n border: 2px solid var(--mf-border);\n border-radius: var(--mf-radius-md);\n outline: none;\n transition: var(--mf-transition);\n -webkit-appearance: none;\n appearance: none;\n box-shadow: var(--mf-shadow-sm);\n}\n\n.deepdots-popup textarea {\n min-height: 100px;\n resize: vertical;\n}\n\n.deepdots-popup input::placeholder,\n.deepdots-popup textarea::placeholder {\n color: var(--mf-text-muted);\n}\n\n/* Remove number input spinners */\n.deepdots-popup input::-webkit-outer-spin-button,\n.deepdots-popup input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.deepdots-popup input[type=\"number\"] {\n /* -moz-appearance: textfield; removed for lint compatibility */\n}\n\n/* Custom Select Arrow */\n.deepdots-popup select {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M6 9L1 4h10z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right var(--mf-space-md) center;\n padding-inline-end: var(--mf-space-xl);\n}\n\n/* Error State */\n.deepdots-popup input.error,\n.deepdots-popup select.error,\n.deepdots-popup textarea.error {\n border-color: var(--mf-error);\n}\n\n.magicfeedback-error {\n margin-top: var(--mf-space-xs);\n font-size: var(--mf-font-size-sm);\n color: var(--mf-error);\n}\n\n/* ========================================\n CHECKBOX & RADIO OPTIONS\n ======================================== */\n.magicfeedback-checkbox,\ndiv.magicfeedback-radio {\n display: flex;\n flex-direction: column;\n gap: var(--mf-space-sm);\n width: 100%;\n}\n\n.magicfeedback-checkbox-container,\n.magicfeedback-radio-container {\n display: flex;\n align-items: center;\n gap: var(--mf-space-sm);\n padding: var(--mf-space-md);\n border: 1.5px solid var(--mf-border);\n border-radius: var(--mf-radius-md);\n cursor: pointer;\n transition: var(--mf-transition-fast);\n}\n\n@media (hover: hover) {\n .magicfeedback-checkbox-container:hover,\n .magicfeedback-radio-container:hover {\n background-color: var(--mf-bg-hover);\n border-color: var(--mf-primary);\n }\n}\n\n.magicfeedback-checkbox-container:has(input:checked),\n.magicfeedback-radio-container:has(input:checked) {\n background-color: var(--mf-primary-light);\n border-color: var(--mf-primary);\n}\n\n.magicfeedback-checkbox input[type=\"checkbox\"],\n.magicfeedback-radio-container input[type=\"radio\"] {\n width: 18px;\n height: 18px;\n margin: 0;\n cursor: pointer;\n flex-shrink: 0;\n accent-color: var(--mf-primary);\n}\n\n.magicfeedback-checkbox label,\n.magicfeedback-radio-container label {\n font-size: var(--mf-font-size-base);\n text-align: start;\n color: var(--mf-text-primary);\n cursor: pointer;\n margin: 0;\n flex: 1;\n}\n\n/* ========================================\n BOOLEAN OPTIONS\n ======================================== */\n.magicfeedback-boolean-container {\n display: flex;\n gap: var(--mf-space-md);\n width: 100%;\n}\n\n.magicfeedback-boolean-option {\n flex: 1;\n position: relative;\n}\n\n.magicfeedback-boolean-option input[type=\"radio\"] {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.magicfeedback-boolean-option label {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--mf-space-md);\n font-size: var(--mf-font-size-base);\n font-weight: 500;\n color: var(--mf-text-secondary);\n border: 1.5px solid var(--mf-border);\n border-radius: var(--mf-radius-md);\n cursor: pointer;\n transition: var(--mf-transition-fast);\n margin: 0;\n width: -webkit-fill-available;\n height: inherit;\n}\n\n@media (hover: hover) {\n .magicfeedback-boolean-option label:hover {\n background-color: var(--mf-bg-hover);\n border-color: var(--mf-primary);\n }\n}\n\n.magicfeedback-boolean-option input[type=\"radio\"]:checked + label {\n color: var(--mf-primary);\n background-color: var(--mf-primary-light);\n border-color: var(--mf-primary);\n font-weight: 600;\n}\n\n/* ========================================\n RATING SYSTEMS\n ======================================== */\n.magicfeedback-rating,\n.magicfeedback-rating-number,\n.magicfeedback-rating-star {\n width: 100%;\n}\n\n.magicfeedback-rating-container,\n.magicfeedback-rating-number-container,\n.magicfeedback-rating-star-container {\n display: flex;\n flex-wrap: wrap;\n gap: var(--mf-space-sm);\n justify-content: center;\n align-items: center;\n padding: var(--mf-space-md) 0;\n list-style: none;\n margin: 0;\n}\n\n/* Caption line below the row — min on one side, max on the other (swapped\n for order: \"rtl\") — same simple, non-responsive pattern as the\n rating-number row caption. Used by rating-star and rating-emoji. */\n.magicfeedback-rating-placeholder {\n display: flex;\n justify-content: space-between;\n gap: var(--mf-space-md);\n width: 100%;\n margin-top: var(--mf-space-sm);\n font-size: var(--mf-font-size-sm);\n font-weight: var(--mf-font-weight-semibold);\n color: var(--mf-text-secondary);\n}\n\n.magicfeedback-rating-placeholder-value {\n overflow-wrap: anywhere;\n}\n\n.magicfeedback-rating-placeholder-value:last-child {\n text-align: end;\n}\n\n/* Rating with Images */\n.magicfeedback-rating-option-label-container input[type=\"radio\"] {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.magicfeedback-rating-option-label-container img {\n width: 56px;\n height: 56px;\n cursor: pointer;\n transition: var(--mf-transition-fast);\n border-radius: var(--mf-radius-full);\n border: 2px solid transparent;\n}\n\n@media (hover: hover) {\n .magicfeedback-rating-option-label-container img:hover {\n transform: scale(1.1);\n border-color: var(--mf-primary);\n }\n}\n\n.magicfeedback-rating-option-label-container input[type=\"radio\"]:checked + img {\n border-color: var(--mf-primary);\n box-shadow: 0 0 0 3px var(--mf-primary-light);\n}\n\n.magicfeedback-rating-option-label-container label {\n display: block;\n text-align: center;\n font-size: var(--mf-font-size-sm);\n color: var(--mf-text-secondary);\n margin-top: var(--mf-space-xs);\n cursor: pointer;\n}\n\n/* Rating Numbers — each option is its own outlined chip in the survey's\n primary color, with a gap between them. Row and column use the same\n chip; column additionally has room to show each option's own text\n plainly next to its number. */\n\n/* Every size here is width:100%/flex:1 combined with the chip's own\n padding and border. Without border-box, the browser's default\n content-box adds that padding/border on TOP of the declared size, so\n the chip quietly overflows past its flex slot — reading as \"not quite\n full width\" or, worse, pushing into the next chip. */\n.magicfeedback-rating-number-container,\n.magicfeedback-rating-number-option,\n.magicfeedback-rating-number-option-label-container,\n.magicfeedback-rating-number-value {\n box-sizing: border-box;\n}\n\n/* The shared rating-container rule (above, reused by star rating) sets\n align-items:center for its row-of-chips layout — in a stacked column\n that still nudges a 100%-wide chip inward instead of a true 0 offset.\n Force stretch so every chip fills the exact same width, flush on\n both sides. */\n.magicfeedback-rating-number-container-column,\n.magicfeedback-rating-number-container-column-reverse {\n align-items: stretch;\n}\n\n/* Caption line below the row — the single place min/max labels live\n for row mode, shared by mobile and desktop. */\n.magicfeedback-rating-number-scale-labels {\n display: flex;\n justify-content: space-between;\n gap: var(--mf-space-md);\n margin-top: var(--mf-space-sm);\n font-size: var(--mf-font-size-sm);\n font-weight: var(--mf-font-weight-semibold);\n color: var(--mf-text-secondary);\n}\n\n.magicfeedback-rating-number-scale-label {\n overflow-wrap: anywhere;\n}\n\n.magicfeedback-rating-number-scale-label:last-child {\n text-align: end;\n}\n\n/* Column, no per-option text: each row is its own separated chip, so\n the min/max labels bookend the stack from outside it — one line\n above the first chip, one below the last. Margin goes on whichever\n side actually faces the list — the \"before\" label (always the first\n child) gets space below it, the \"after\" one (always right after the\n container, extra option row or not) gets space above it — so both\n sit the same distance from the chips regardless of which one it is. */\n.magicfeedback-rating-number-scale-label-block {\n font-size: var(--mf-font-size-sm);\n font-weight: var(--mf-font-weight-semibold);\n color: var(--mf-text-secondary);\n text-align: center;\n}\n\n.magicfeedback-rating-number-scale-label-block:first-child {\n margin-bottom: var(--mf-space-sm);\n}\n\n.magicfeedback-rating-number-container + .magicfeedback-rating-number-scale-label-block {\n margin-top: var(--mf-space-sm);\n}\n\n.magicfeedback-rating-number-option {\n display: flex;\n}\n\n.magicfeedback-rating-number-option-label-container {\n position: relative;\n width: 100%;\n display: flex;\n cursor: pointer;\n}\n\n.magicfeedback-rating-number-option-label-container input[type=\"radio\"] {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.magicfeedback-rating-number-value {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n transition: var(--mf-transition-fast);\n color: var(--mf-text-secondary);\n font-weight: var(--mf-font-weight-semibold);\n}\n\n/* Row: individual outlined chips in the survey's own primary color —\n var(--mf-primary) so whatever brand color a given survey sets carries\n through automatically, no color hardcoded here. */\n.magicfeedback-rating-number-container-row,\n.magicfeedback-rating-number-container-row-reverse {\n flex-wrap: nowrap;\n gap: var(--mf-space-sm);\n}\n\n.magicfeedback-rating-number-option-row,\n.magicfeedback-rating-number-option-row-reverse {\n flex: 1 1 0;\n min-width: 0;\n}\n\n.magicfeedback-rating-number-option-row .magicfeedback-rating-number-value,\n.magicfeedback-rating-number-option-row-reverse .magicfeedback-rating-number-value {\n min-height: 56px;\n padding: var(--mf-space-sm);\n border: 2px solid var(--mf-primary-border);\n border-radius: var(--mf-radius-md);\n background: var(--mf-bg-secondary);\n color: var(--mf-primary);\n font-size: var(--mf-font-size-lg);\n font-weight: var(--mf-font-weight-bold);\n}\n\n/* More than 6 options (e.g. a 0-10 NPS scale): still one row, never\n wraps — but scaled down on purpose, so it reads as a compact chip\n rather than the same 56px button stretched thin. */\n.magicfeedback-rating-number-container-row--dense .magicfeedback-rating-number-option-row .magicfeedback-rating-number-value,\n.magicfeedback-rating-number-container-row--dense .magicfeedback-rating-number-option-row-reverse .magicfeedback-rating-number-value {\n min-height: 36px;\n padding: var(--mf-space-xs);\n border-radius: var(--mf-radius-sm);\n font-size: 0.8rem;\n}\n\n@media (hover: hover) {\n .magicfeedback-rating-number-option-row .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value,\n .magicfeedback-rating-number-option-row-reverse .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value {\n background: var(--mf-primary-light);\n }\n}\n\n.magicfeedback-rating-number-option-row .magicfeedback-rating-number-option-label-container input[type=\"radio\"]:checked + .magicfeedback-rating-number-value,\n.magicfeedback-rating-number-option-row-reverse .magicfeedback-rating-number-option-label-container input[type=\"radio\"]:checked + .magicfeedback-rating-number-value {\n color: #fff;\n background-color: var(--mf-primary);\n box-shadow: var(--mf-shadow-md);\n}\n\n/* Extra option: always its own row below the scale, and styled like every\n other chip now — \"doesn't apply\" is still not a point on the 1..N\n continuum, but it no longer needs a different border style to say so. */\n.magicfeedback-rating-number-extra-row {\n display: flex;\n justify-content: center;\n margin-top: var(--mf-space-sm);\n}\n\n.magicfeedback-rating-number-option--extra {\n flex: 0 1 auto;\n}\n\n.magicfeedback-rating-number-option--extra .magicfeedback-rating-number-option-label-container {\n width: auto;\n}\n\n.magicfeedback-rating-number-option--extra .magicfeedback-rating-number-value {\n min-height: 36px;\n padding: 0 var(--mf-space-md);\n border: 2px solid var(--mf-primary-border);\n border-radius: var(--mf-radius-md);\n background: var(--mf-bg-secondary);\n color: var(--mf-primary);\n font-size: var(--mf-font-size-sm);\n}\n\n@media (hover: hover) {\n .magicfeedback-rating-number-option--extra .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value {\n background: var(--mf-primary-light);\n }\n}\n\n.magicfeedback-rating-number-option--extra .magicfeedback-rating-number-option-label-container input[type=\"radio\"]:checked + .magicfeedback-rating-number-value {\n color: #fff;\n background-color: var(--mf-primary);\n box-shadow: var(--mf-shadow-md);\n}\n\n/* Column: the same separated chips as row, just stacked — each option is\n its own outlined chip with a gap between them, not one shared box. */\n.magicfeedback-rating-number-container-column,\n.magicfeedback-rating-number-container-column-reverse {\n gap: var(--mf-space-sm);\n}\n\n.magicfeedback-rating-number-option-column,\n.magicfeedback-rating-number-option-column-reverse {\n width: 100%;\n}\n\n.magicfeedback-rating-number-option-column .magicfeedback-rating-number-value,\n.magicfeedback-rating-number-option-column-reverse .magicfeedback-rating-number-value {\n justify-content: flex-start;\n gap: var(--mf-space-sm);\n min-height: 48px;\n padding: var(--mf-space-sm) var(--mf-space-md);\n border: 2px solid var(--mf-primary-border);\n border-radius: var(--mf-radius-md);\n background: var(--mf-bg-secondary);\n color: var(--mf-primary);\n}\n\n@media (hover: hover) {\n .magicfeedback-rating-number-option-column .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value,\n .magicfeedback-rating-number-option-column-reverse .magicfeedback-rating-number-option-label-container:hover .magicfeedback-rating-number-value {\n background: var(--mf-primary-light);\n }\n}\n\n.magicfeedback-rating-number-option-column .magicfeedback-rating-number-option-label-container input[type=\"radio\"]:checked + .magicfeedback-rating-number-value,\n.magicfeedback-rating-number-option-column-reverse .magicfeedback-rating-number-option-label-container input[type=\"radio\"]:checked + .magicfeedback-rating-number-value {\n color: #fff;\n background-color: var(--mf-primary);\n box-shadow: var(--mf-shadow-md);\n}\n\n.magicfeedback-rating-number-value-num {\n font-weight: var(--mf-font-weight-bold);\n}\n\n/* Column with per-option text: a min-width so \"1\"..\"9\" and \"10\" line up,\n with the label text starting at the same x. Skipped entirely when the\n column has no per-option text at all (--bare below) — with nothing to\n align against, the same left-shift bug from row mode would resurface. */\n.magicfeedback-rating-number-container-column:not(.magicfeedback-rating-number-container-column--bare) .magicfeedback-rating-number-value-num,\n.magicfeedback-rating-number-container-column-reverse:not(.magicfeedback-rating-number-container-column--bare) .magicfeedback-rating-number-value-num {\n flex: none;\n min-width: 1.4em;\n}\n\n/* Column, no per-option text at all (only min/max, or nothing): a bare\n numbered list has nothing to left-align against, so center each\n number instead of stranding it on the left with blank space beside it. */\n.magicfeedback-rating-number-container-column--bare .magicfeedback-rating-number-value {\n justify-content: center;\n}\n\n.magicfeedback-rating-number-value-label {\n font-weight: var(--mf-font-weight-medium);\n}\n\n.magicfeedback-rating-number-option-column .magicfeedback-rating-number-option-label-container input[type=\"radio\"]:checked + .magicfeedback-rating-number-value,\n.magicfeedback-rating-number-option-column-reverse .magicfeedback-rating-number-option-label-container input[type=\"radio\"]:checked + .magicfeedback-rating-number-value {\n color: #fff;\n background-color: var(--mf-primary);\n}\n\n/* Star Rating */\n.magicfeedback-rating-star-container {\n justify-content: center;\n}\n\n.magicfeedback-rating-star-option:not(:checked) > .rating__star {\n font-size: 40px;\n color: var(--mf-border);\n cursor: pointer;\n margin: 0 var(--mf-space-xs);\n transition: var(--mf-transition-fast);\n}\n\n@media (hover: hover) {\n .magicfeedback-rating-star-option:not(:checked) > .rating__star:hover,\n .magicfeedback-rating-star-option:not(:checked) > .rating__star:hover ~ span {\n color: #fbbf24;\n transform: scale(1.1);\n }\n}\n\n.magicfeedback-rating-star-selected {\n color: #fbbf24 !important;\n}\n\n/* ========================================\n MULTIPLE CHOICE WITH IMAGES\n ======================================== */\n.magicfeedback-multiple-choice-image-option {\n display: flex;\n border-radius: var(--mf-radius-md);\n overflow: hidden;\n transition: var(--mf-transition-fast);\n}\n\n.magicfeedback-image-option-label-container {\n cursor: pointer;\n border-radius: var(--mf-radius-md);\n overflow: hidden;\n transition: var(--mf-transition-fast);\n}\n\n.magicfeedback-image-option-label-container input[type=\"radio\"],\n.magicfeedback-image-option-label-container input[type=\"checkbox\"] {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.magicfeedback-image-option-label-container img {\n width: 100%;\n height: auto;\n display: block;\n border: 2px solid var(--mf-border);\n border-radius: var(--mf-radius-md);\n transition: var(--mf-transition-fast);\n}\n\n@media (hover: hover) {\n .magicfeedback-image-option-label-container:hover img {\n border-color: var(--mf-primary);\n box-shadow: var(--mf-shadow-md);\n }\n}\n\n.magicfeedback-image-option-label-container input:checked + img {\n border-color: var(--mf-primary);\n box-shadow: 0 0 0 3px var(--mf-primary-light);\n}\n\n/* ========================================\n MATRIX QUESTIONS\n ======================================== */\n.magicfeedback-multi-question-matrix-container {\n width: 100%;\n overflow-x: auto;\n border-radius: var(--mf-radius-md);\n}\n\n.magicfeedback-multi-question-matrix-table {\n width: 100%;\n border-collapse: separate;\n border-spacing: 0 var(--mf-space-xs);\n}\n\n.magicfeedback-multi-question-matrix-table th {\n padding: var(--mf-space-md);\n text-align: center;\n font-size: var(--mf-font-size-sm);\n font-weight: 500;\n color: var(--mf-text-secondary);\n}\n\n.magicfeedback-multi-question-matrix-row-tr {\n background-color: var(--mf-bg-primary);\n border-radius: var(--mf-radius-md);\n transition: var(--mf-transition-fast);\n}\n\n.magicfeedback-multi-question-matrix-row-tr:nth-child(even) {\n background-color: var(--mf-bg-secondary);\n}\n\n@media (hover: hover) {\n .magicfeedback-multi-question-matrix-row-tr:hover {\n background-color: var(--mf-bg-hover);\n box-shadow: var(--mf-shadow-sm);\n }\n}\n\n.magicfeedback-multi-question-matrix-table td {\n padding: var(--mf-space-md);\n text-align: center;\n}\n\n.magicfeedback-multi-question-matrix-label {\n text-align: start;\n font-size: var(--mf-font-size-base);\n color: var(--mf-text-primary);\n}\n\n.magicfeedback-multi-question-matrix-table input[type=\"radio\"] {\n width: 20px;\n height: 20px;\n cursor: pointer;\n accent-color: var(--mf-primary);\n}\n\n/* ========================================\n PRIORITY LIST\n ======================================== */\n.magicfeedback-priority-list-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--mf-space-md);\n margin: var(--mf-space-sm) 0;\n background-color: var(--mf-bg-primary);\n border: 1.5px solid var(--mf-border);\n border-radius: var(--mf-radius-md);\n transition: var(--mf-transition-fast);\n}\n\n@media (hover: hover) {\n .magicfeedback-priority-list-item:hover {\n box-shadow: var(--mf-shadow-sm);\n border-color: var(--mf-primary);\n }\n}\n\n.magicfeedback-priority-list-item-label {\n flex: 1;\n font-size: var(--mf-font-size-base);\n text-align: start;\n color: var(--mf-text-primary);\n margin: 0;\n}\n\n.magicfeedback-priority-list-arrow-up,\n.magicfeedback-priority-list-arrow-down {\n padding: var(--mf-space-xs);\n font-size: var(--mf-font-size-lg);\n color: var(--mf-text-secondary);\n cursor: pointer;\n transition: var(--mf-transition-fast);\n user-select: none;\n}\n\n@media (hover: hover) {\n .magicfeedback-priority-list-arrow-up:hover,\n .magicfeedback-priority-list-arrow-down:hover {\n color: var(--mf-primary);\n transform: scale(1.2);\n }\n}\n\n/* ========================================\n POINT SYSTEM\n ======================================== */\n.magicfeedback-point-system-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--mf-space-md);\n margin: var(--mf-space-sm) 0;\n background-color: var(--mf-bg-primary);\n border: 1.5px solid var(--mf-border);\n border-radius: var(--mf-radius-md);\n min-height: 45px;\n}\n\n.magicfeedback-point-system-item label {\n flex: 1;\n font-size: var(--mf-font-size-base);\n color: var(--mf-text-primary);\n margin: 0;\n}\n\n.magicfeedback-point-system-input-container {\n display: flex;\n align-items: center;\n gap: var(--mf-space-sm);\n}\n\n.magicfeedback-point-system-item input {\n width: 80px;\n min-width: 80px;\n padding: var(--mf-space-sm);\n text-align: center;\n font-size: var(--mf-font-size-base);\n border: 1.5px solid var(--mf-border);\n border-radius: var(--mf-radius-md);\n margin: 0;\n}\n\n.magicfeedback-point-system-total {\n display: flex;\n justify-content: flex-end;\n margin-top: var(--mf-space-md);\n font-size: var(--mf-font-size-base);\n font-weight: 600;\n color: var(--mf-text-primary);\n}\n\n/* ========================================\n CONSENT\n ======================================== */\n.magicfeedback-consent-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--mf-space-sm);\n padding: var(--mf-space-md);\n background-color: var(--mf-bg-secondary);\n border-radius: var(--mf-radius-md);\n margin: var(--mf-space-md) 0;\n}\n\n.magicfeedback-consent-container input[type=\"checkbox\"] {\n margin-top: 2px;\n flex-shrink: 0;\n accent-color: var(--mf-primary);\n}\n\n.magicfeedback-consent-container label {\n flex: 1;\n font-size: var(--mf-font-size-sm);\n text-align: start;\n color: var(--mf-text-secondary);\n line-height: var(--mf-line-height);\n cursor: pointer;\n margin-bottom: 0;\n}\n\n/* ========================================\n ACTION BUTTONS\n ======================================== */\n.magicfeedback-action-container {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mf-space-md);\n margin-top: var(--mf-space-xl);\n padding-top: var(--mf-space-lg);\n border-top: 1px solid var(--mf-border);\n}\n\n.magicfeedback-submit {\n padding: 0.8rem 1.6rem;\n font-size: var(--mf-font-size-base);\n font-weight: 800;\n color: #FFFFFF;\n background-color: var(--mf-primary);\n border: 2px solid var(--mf-primary);\n border-radius: var(--mf-radius-full);\n cursor: pointer;\n transition: var(--mf-transition-fast);\n box-shadow: var(--mf-shadow-md);\n}\n\n@media (hover: hover) {\n .magicfeedback-submit:hover {\n background-color: var(--mf-primary-hover);\n box-shadow: var(--mf-shadow-lg);\n transform: translateY(-2px);\n }\n}\n\n.magicfeedback-submit:active {\n transform: translateY(0);\n box-shadow: var(--mf-shadow-sm);\n}\n\n.magicfeedback-submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none;\n}\n\n.magicfeedback-back {\n padding: 0.65rem 1rem;\n font-size: var(--mf-font-size-base);\n font-weight: 700;\n color: var(--mf-primary);\n background-color: var(--mf-bg-secondary);\n border: 2px solid var(--mf-border);\n border-radius: var(--mf-radius-full);\n cursor: pointer;\n transition: var(--mf-transition-fast);\n}\n\n@media (hover: hover) {\n .magicfeedback-back:hover {\n border-color: var(--mf-primary);\n background-color: var(--mf-bg-hover);\n }\n}\n\n/* ========================================\n SKIP & COUNTER\n ======================================== */\n.magicfeedback-skip-container {\n display: flex;\n align-items: center;\n gap: var(--mf-space-xs);\n padding: 0;\n margin: 0;\n font-size: var(--mf-font-size-sm);\n color: var(--mf-text-muted);\n background: transparent;\n border: none;\n cursor: pointer;\n transition: var(--mf-transition-fast);\n}\n\n@media (hover: hover) {\n .magicfeedback-skip-container:hover {\n color: var(--mf-primary);\n }\n}\n\n.magicfeedback-skip-container input[type=\"checkbox\"] {\n margin: 0;\n cursor: pointer;\n accent-color: var(--mf-primary);\n}\n\n.magicfeedback-counter {\n display: flex;\n justify-content: flex-end;\n margin-top: var(--mf-space-md);\n font-size: var(--mf-font-size-sm);\n color: var(--mf-text-muted);\n}\n\n/* ========================================\n MODAL STYLES\n ======================================== */\n/* Modal backdrop */\n.magicfeedback-modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(0,0,0,0.4);\n display: none; /* toggled to flex when open */\n align-items: center;\n justify-content: center;\n z-index: 9999;\n}\n\n/* Modal container */\n.magicfeedback-modal {\n background: #fff;\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0,0,0,0.2);\n max-width: 520px;\n width: 90%;\n max-height: 80vh;\n /* Flex column so the options list scrolls while the actions footer\n (counter + confirm button) stays pinned and always visible. */\n display: flex;\n flex-direction: column;\n overflow: hidden;\n padding: 16px;\n position: relative;\n /* Portalled to document.body (see renderPriorityList.ts) to escape the\n host page's overflow/z-index — so it never inherits\n .magicfeedback-container's neutral text color and instead inherits\n whatever color the host page's own <body> happens to set. Needs its\n own explicit baseline rather than relying on that inheritance. */\n color: var(--mf-text-primary);\n}\n\n/* Modal actions */\n.magicfeedback-modal-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 12px;\n flex-shrink: 0;\n}\n\n.magicfeedback-modal-counter {\n margin-inline-end: auto;\n display: flex;\n align-items: center;\n font-size: 14px;\n color: var(--mf-text-secondary);\n}\n\n/* Modal list */\n.magicfeedback-modal-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n /* Scrollable area; footer stays fixed below it. */\n flex: 1 1 auto;\n overflow-y: auto;\n min-height: 0;\n}\n\n.magicfeedback-modal-row {\n display: flex;\n align-items: center;\n gap: 10px;\n cursor: pointer;\n}\n\n/* Priority list header */\n.magicfeedback-priority-list-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.magicfeedback-priority-list-reorder {\n margin-top: 8px;\n}\n\n.magicfeedback-priority-list-list {\n padding: 0;\n list-style: none;\n}\n\n.magicfeedback-priority-list-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin: 5px 0;\n}\n\n.magicfeedback-priority-list-item-label {\n font-size: 15px;\n}\n\n.magicfeedback-priority-list-arrows {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n/* Buttons */\n.magicfeedback-button {\n appearance: none;\n border: 2px solid var(--mf-border);\n border-radius: var(--mf-radius-full);\n background: var(--mf-bg-secondary);\n color: var(--mf-text-primary);\n padding: 0.6rem 1rem;\n font-size: 14px;\n font-weight: 700;\n cursor: pointer;\n box-shadow: var(--mf-shadow-sm);\n}\n\n@media (hover: hover) {\n .magicfeedback-button:hover {\n background: var(--mf-bg-hover);\n border-color: var(--mf-primary);\n }\n}\n\n.magicfeedback-button:active {\n transform: translateY(1px);\n}\n\n.magicfeedback-button-primary {\n border-color: var(--mf-primary);\n background: var(--mf-primary);\n color: #fff;\n box-shadow: var(--mf-shadow-md);\n}\n\n@media (hover: hover) {\n .magicfeedback-button-primary:hover {\n background: var(--mf-primary-hover);\n }\n}\n\n.magicfeedback-button-primary:active {\n background: var(--mf-primary-hover);\n}\n\n/* Warning flash */\n.magicfeedback-warning {\n color: #C70039;\n}\n\n/* Start message button */\n.magicfeedback-start-message-button {\n appearance: none;\n border: 2px solid var(--mf-primary);\n border-radius: var(--mf-radius-full);\n background: var(--mf-primary);\n color: #fff;\n padding: 0.8rem 1.4rem;\n font-size: 15px;\n font-weight: 800;\n cursor: pointer;\n box-shadow: var(--mf-shadow-md);\n}\n\n@media (hover: hover) {\n .magicfeedback-start-message-button:hover {\n background: var(--mf-primary-hover);\n }\n}\n\n/* ========================================\n RESPONSIVE DESIGN\n ======================================== */\n@media (max-width: 768px) {\n :root {\n --mf-space-lg: 1.25rem;\n --mf-space-xl: 1.5rem;\n }\n\n .magicfeedback-container {\n padding: 12px;\n border-radius: var(--mf-radius-md);\n }\n\n .magicfeedback-form {\n padding: 14px;\n border-radius: var(--mf-radius-md);\n }\n\n .magicfeedback-div {\n padding: 12px;\n gap: var(--mf-space-lg)\n }\n\n .magicfeedback-label {\n font-size: var(--mf-font-size-base);\n }\n\n .deepdots-popup input[type=\"date\"],\n .deepdots-popup input[type=\"text\"],\n .deepdots-popup input[type=\"number\"],\n .deepdots-popup input[type=\"email\"],\n .deepdots-popup input[type=\"password\"],\n .deepdots-popup textarea,\n .deepdots-popup select {\n padding: 0.85rem 0.95rem;\n font-size: 1rem;\n min-height: 46px;\n }\n\n /*\n .magicfeedback-radio-container,\n .magicfeedback-checkbox-container,\n .magicfeedback-boolean-container,\n .magicfeedback-consent-container {\n width: 100%;\n }\n */\n\n .magicfeedback-radio-container,\n .magicfeedback-checkbox-container {\n padding: 10px 12px;\n border-radius: var(--mf-radius-md);\n border: 1px solid var(--mf-border);\n gap: 10px;\n }\n\n .magicfeedback-rating-container,\n .magicfeedback-rating-number-container,\n .magicfeedback-rating-star-container {\n gap: 10px;\n }\n\n .magicfeedback-boolean-container {\n flex-direction: column;\n gap: 10px;\n }\n\n .magicfeedback-rating-number-container-row,\n .magicfeedback-rating-number-container-row-reverse {\n gap: 6px;\n }\n\n .magicfeedback-rating-number-option-row .magicfeedback-rating-number-value,\n .magicfeedback-rating-number-option-row-reverse .magicfeedback-rating-number-value {\n min-height: 44px;\n padding: var(--mf-space-xs);\n font-size: 0.9rem;\n }\n\n .magicfeedback-action-container {\n flex-direction: column-reverse;\n }\n\n .magicfeedback-submit,\n .magicfeedback-back {\n width: 100%;\n text-align: center;\n min-height: 48px;\n }\n}\n\n/* ========================================\n ACCESSIBILITY\n ======================================== */\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n\n/* ========================================\n UTILITY CLASSES\n ======================================== */\n.magicfeedback-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n.magicfeedback-modal-close {\n position: absolute;\n top: 8px;\n inset-inline-end: 8px;\n background: transparent;\n border: none;\n font-size: 20px;\n line-height: 1;\n cursor: pointer;\n color: #666;\n}\n\n.magicfeedback-modal-close:focus {\n color: #000;\n outline: none;\n}\n\n@media (hover: hover) {\n .magicfeedback-modal-close:hover {\n color: #000;\n outline: none;\n }\n}\n\n/* ========================================\n FILE / IMAGE UPLOAD\n ======================================== */\n.magicfeedback-upload {\n display: flex;\n flex-direction: column;\n gap: var(--mf-space-md);\n width: 100%;\n margin: 10px 0;\n}\n\n/* The native input is an invisible, focusable overlay covering the dropzone. */\n.magicfeedback-upload-native {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n padding: 0;\n opacity: 0;\n cursor: pointer;\n z-index: 2;\n}\n\n.magicfeedback-upload-dropzone {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--mf-space-sm);\n box-sizing: border-box;\n width: 100%;\n min-height: 150px;\n padding: var(--mf-space-xl);\n text-align: center;\n border: 2px dashed var(--mf-border);\n border-radius: var(--mf-radius-md);\n background-color: var(--mf-surface-alt);\n cursor: pointer;\n transition: var(--mf-transition);\n}\n\n@media (hover: hover) {\n .magicfeedback-upload-dropzone:hover {\n border-color: var(--mf-primary);\n background-color: var(--mf-bg-hover);\n }\n}\n\n.magicfeedback-upload-dropzone:focus-within {\n border-color: var(--mf-primary);\n box-shadow: var(--mf-shadow-focus);\n}\n\n.magicfeedback-upload-dropzone.is-dragover {\n border-color: var(--mf-primary);\n border-style: solid;\n background-color: var(--mf-primary-light);\n box-shadow: var(--mf-shadow-focus);\n}\n\n.magicfeedback-upload-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 46px;\n height: 46px;\n color: var(--mf-primary);\n background-color: var(--mf-surface);\n border-radius: var(--mf-radius-full);\n box-shadow: var(--mf-shadow-sm);\n pointer-events: none;\n}\n\n.magicfeedback-upload-icon svg {\n width: 24px;\n height: 24px;\n}\n\n.magicfeedback-upload-cta {\n font-family: inherit;\n font-weight: var(--mf-font-weight-semibold);\n font-size: var(--mf-font-size-base);\n color: var(--mf-text-primary);\n pointer-events: none;\n}\n\n.magicfeedback-upload-hint {\n font-family: inherit;\n font-size: var(--mf-font-size-sm);\n color: var(--mf-text-muted);\n pointer-events: none;\n}\n\n.magicfeedback-upload-list {\n display: flex;\n flex-direction: column;\n gap: var(--mf-space-sm);\n width: 100%;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.magicfeedback-upload-list:empty {\n display: none;\n}\n\n.magicfeedback-upload-file-item {\n display: flex;\n align-items: center;\n gap: var(--mf-space-md);\n padding: var(--mf-space-sm) var(--mf-space-md);\n background-color: var(--mf-surface);\n border: 1px solid var(--mf-border);\n border-radius: var(--mf-radius-sm);\n box-shadow: var(--mf-shadow-sm);\n animation: mf-scale-in 0.2s ease-out;\n}\n\n.magicfeedback-upload-thumb {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n overflow: hidden;\n color: var(--mf-text-secondary);\n background-color: var(--mf-surface-alt);\n border-radius: var(--mf-radius-sm);\n}\n\n.magicfeedback-upload-thumb img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.magicfeedback-upload-thumb svg {\n width: 20px;\n height: 20px;\n}\n\n.magicfeedback-upload-file-info {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-width: 0;\n text-align: start;\n}\n\n.magicfeedback-upload-file-name {\n font-family: inherit;\n font-size: var(--mf-font-size-sm);\n font-weight: var(--mf-font-weight-semibold);\n color: var(--mf-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.magicfeedback-upload-file-size {\n font-family: inherit;\n font-size: 0.75rem;\n color: var(--mf-text-muted);\n}\n\n.magicfeedback-upload-remove {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n padding: 0;\n color: var(--mf-text-muted);\n background-color: transparent;\n border: none;\n border-radius: var(--mf-radius-full);\n cursor: pointer;\n transition: var(--mf-transition-fast);\n}\n\n.magicfeedback-upload-remove:focus-visible {\n color: var(--mf-error);\n background-color: var(--mf-primary-light);\n outline: none;\n}\n\n@media (hover: hover) {\n .magicfeedback-upload-remove:hover {\n color: var(--mf-error);\n background-color: var(--mf-primary-light);\n outline: none;\n }\n}\n\n.magicfeedback-upload-remove svg {\n width: 16px;\n height: 16px;\n}\n\n.magicfeedback-upload-error {\n display: none;\n font-family: inherit;\n font-size: var(--mf-font-size-sm);\n color: var(--mf-error);\n}\n\n.magicfeedback-upload-error.is-visible {\n display: block;\n}\n\n/* ========================================\n RTL (Arabic)\n ========================================\n The SDK stamps dir=\"rtl\" (and .magicfeedback-rtl) on the survey container\n for right-to-left languages. Everything else in this stylesheet uses logical\n properties (text-align: start, padding-inline-*, inset-inline-*), so it\n mirrors on its own; only the handful of rules that cannot be expressed\n logically live here.\n\n Rules are scoped to [dir=\"rtl\"] inside our own subtree so a host page that is\n itself RTL, or one that embeds an Arabic survey in an LTR page, both render\n correctly. */\n\n/* background-position has no logical form: move the select caret to the\n left edge, opposite the padding that inset-inline-end already mirrored. */\n[dir=\"rtl\"] select {\n background-position: left var(--mf-space-md) center;\n}\n\n/* Emails, URLs, numbers, dates and phone numbers are latin/numeric content\n even in an Arabic survey: keep their own direction LTR so punctuation\n (@, ., +, /) lands where the user expects, but align them to the start of\n the RTL line so they still read as part of the form. */\n[dir=\"rtl\"] input[type=\"email\"],\n[dir=\"rtl\"] input[type=\"url\"],\n[dir=\"rtl\"] input[type=\"number\"],\n[dir=\"rtl\"] input[type=\"tel\"],\n[dir=\"rtl\"] input[type=\"date\"],\n[dir=\"rtl\"] input[type=\"time\"] {\n direction: ltr;\n text-align: right;\n}\n\n/* Mirror of mf-slide-in: questions enter from the reading edge. */\n@keyframes mf-slide-in-rtl {\n from {\n opacity: 0;\n transform: translateX(16px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n[dir=\"rtl\"] .magicfeedback-div {\n animation-name: mf-slide-in-rtl;\n}\n\n/* ========================================\n LOCAL — reglas del popup, no vienen del paquete\n ======================================== */\n\n/* Los controles de formulario no heredan font-family: cuando el popup trae fuente propia\n (clase deepdots-has-font), se les fuerza la del contenedor. */\n.deepdots-popup.deepdots-has-font button,\n.deepdots-popup.deepdots-has-font input,\n.deepdots-popup.deepdots-has-font textarea,\n.deepdots-popup.deepdots-has-font select {\n font-family: var(--deepdots-font, inherit);\n}\n\n/* WebKit sí aplica el padding al radio nativo: con padding el control se dibuja enorme (se vio\n en iOS, WebView de RN y Safari, no en Chrome). El paquete ya no lo pone, pero la regla es\n barata y evita que vuelva. */\n.deepdots-popup input[type=\"radio\"] {\n padding: 0;\n}\n","import type { DeepdotsLogger } from '../types';\n\n/**\n * Logger de módulo compartido: el core lo fija en init() con el logger inyectado\n * por el host (o `console` por defecto), y los módulos que no reciben `this`\n * (renderPopup, renderers) enrutan por aquí. `warn`/`error` caen a `log` si el\n * logger del host no los provee (solo `log` es obligatorio en DeepdotsLogger).\n */\nlet active: DeepdotsLogger = console;\n\nexport function setLogger(logger: DeepdotsLogger | undefined): void {\n active = logger ?? console;\n}\n\nexport function sdkLog(...args: unknown[]): void {\n active.log(...args);\n}\n\nexport function sdkWarn(...args: unknown[]): void {\n (active.warn ?? active.log)(...args);\n}\n\nexport function sdkError(...args: unknown[]): void {\n (active.error ?? active.log)(...args);\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQA,IAAI,SAAyB;AAEtB,SAAS,UAAU,QAA0C;AAClE,WAAS,UAAU;AACrB;AAEO,SAAS,UAAU,MAAuB;AAC/C,SAAO,IAAI,GAAG,IAAI;AACpB;AAEO,SAAS,WAAW,MAAuB;AAChD,GAAC,OAAO,QAAQ,OAAO,KAAK,GAAG,IAAI;AACrC;AAEO,SAAS,YAAY,MAAuB;AACjD,GAAC,OAAO,SAAS,OAAO,KAAK,GAAG,IAAI;AACtC;","names":[]}