{"id":1361,"date":"2026-05-05T18:37:03","date_gmt":"2026-05-05T18:37:03","guid":{"rendered":"https:\/\/mednologyapps.com\/?page_id=1361"},"modified":"2026-05-05T18:42:27","modified_gmt":"2026-05-05T18:42:27","slug":"asistencia","status":"publish","type":"page","link":"https:\/\/mednologyapps.com\/index.php\/asistencia\/","title":{"rendered":"ASISTENCIA"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1361\" class=\"elementor elementor-1361\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6ca546e e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"6ca546e\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-77f855a e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-child\" data-id=\"77f855a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0ff6abe elementor-widget elementor-widget-html\" data-id=\"0ff6abe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"nfc-attendance-widget\" id=\"nfcAttendanceWidget\">\r\n  <div class=\"nfc-bg-orb nfc-orb-1\"><\/div>\r\n  <div class=\"nfc-bg-orb nfc-orb-2\"><\/div>\r\n\r\n  <div class=\"nfc-card\">\r\n    <div class=\"nfc-top\">\r\n      <div class=\"nfc-brand\">\r\n        <div class=\"nfc-brand-icon\">\r\n          <span>\u2713<\/span>\r\n        <\/div>\r\n        <div>\r\n          <p class=\"nfc-eyebrow\">Control NFC<\/p>\r\n          <h2>Registro de asistencia<\/h2>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"nfc-live-badge\">\r\n        <span><\/span>\r\n        Activo\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"nfc-hero\">\r\n      <div class=\"nfc-scan\">\r\n        <div class=\"nfc-ring nfc-ring-1\"><\/div>\r\n        <div class=\"nfc-ring nfc-ring-2\"><\/div>\r\n        <div class=\"nfc-phone\">\r\n          <div class=\"nfc-phone-top\"><\/div>\r\n          <div class=\"nfc-phone-icon\">\ud83d\udce1<\/div>\r\n          <div class=\"nfc-phone-line\"><\/div>\r\n          <div class=\"nfc-phone-line short\"><\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"nfc-message\">\r\n        <span class=\"nfc-status-pill\" id=\"nfcStatusPill\">Esperando NFC<\/span>\r\n        <h3 id=\"nfcMainTitle\">Escanea tu llavero<\/h3>\r\n        <p id=\"nfcSubtitle\">\r\n          Al abrir esta p\u00e1gina desde el tag NFC, se marcar\u00e1 la asistencia autom\u00e1ticamente.\r\n        <\/p>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"nfc-info-grid\">\r\n      <div class=\"nfc-info-box\">\r\n        <span>C\u00f3digo NFC<\/span>\r\n        <strong id=\"nfcTagValue\">Sin c\u00f3digo<\/strong>\r\n      <\/div>\r\n\r\n      <div class=\"nfc-info-box\">\r\n        <span>Hora de registro<\/span>\r\n        <strong id=\"nfcTimeValue\">--<\/strong>\r\n      <\/div>\r\n\r\n      <div class=\"nfc-info-box\">\r\n        <span>Estado<\/span>\r\n        <strong id=\"nfcStateValue\">Pendiente<\/strong>\r\n      <\/div>\r\n\r\n      <div class=\"nfc-info-box\">\r\n        <span>Dispositivo<\/span>\r\n        <strong id=\"nfcDeviceValue\">--<\/strong>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"nfc-success\" id=\"nfcSuccessBox\">\r\n      <div>\r\n        <strong>Asistencia marcada correctamente<\/strong>\r\n        <span>El registro qued\u00f3 guardado en este dispositivo.<\/span>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"nfc-manual-test\">\r\n      <label>Probar manualmente<\/label>\r\n      <div class=\"nfc-test-row\">\r\n        <input type=\"text\" id=\"nfcManualTag\" placeholder=\"Ejemplo: LLAVERO001\">\r\n        <button type=\"button\" id=\"nfcManualBtn\">Probar<\/button>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"nfc-actions\">\r\n      <button type=\"button\" class=\"nfc-btn primary\" id=\"nfcMarkAgainBtn\">\r\n        Marcar asistencia\r\n      <\/button>\r\n\r\n      <button type=\"button\" class=\"nfc-btn secondary\" id=\"nfcExportBtn\">\r\n        Exportar CSV\r\n      <\/button>\r\n\r\n      <button type=\"button\" class=\"nfc-btn ghost\" id=\"nfcClearBtn\">\r\n        Limpiar\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <div class=\"nfc-history\">\r\n      <div class=\"nfc-history-head\">\r\n        <h4>\u00daltimos registros<\/h4>\r\n        <span id=\"nfcCounter\">0 registros<\/span>\r\n      <\/div>\r\n\r\n      <div class=\"nfc-history-list\" id=\"nfcHistoryList\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"nfc-note\">\r\n      Link para grabar en NFC Tools:\r\n      <br>\r\n      <code>https:\/\/tudominio.com\/asistencia-nfc\/?tag=LLAVERO001<\/code>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n  .nfc-attendance-widget {\r\n    --nfc-bg: #07111f;\r\n    --nfc-card: rgba(13, 24, 42, 0.82);\r\n    --nfc-card-strong: rgba(255, 255, 255, 0.09);\r\n    --nfc-text: #f6f8fb;\r\n    --nfc-muted: #aab8ca;\r\n    --nfc-border: rgba(255, 255, 255, 0.13);\r\n    --nfc-primary: #00e1ff;\r\n    --nfc-primary-dark: #009fd8;\r\n    --nfc-purple: #6c5ce7;\r\n    --nfc-green: #26df8f;\r\n    --nfc-red: #ff6b6b;\r\n\r\n    width: 100%;\r\n    max-width: 760px;\r\n    margin: 0 auto;\r\n    position: relative;\r\n    isolation: isolate;\r\n    font-family: Inter, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\r\n    color: var(--nfc-text);\r\n  }\r\n\r\n  .nfc-attendance-widget * {\r\n    box-sizing: border-box;\r\n  }\r\n\r\n  .nfc-bg-orb {\r\n    position: absolute;\r\n    border-radius: 999px;\r\n    filter: blur(35px);\r\n    opacity: 0.75;\r\n    z-index: -1;\r\n    pointer-events: none;\r\n  }\r\n\r\n  .nfc-orb-1 {\r\n    width: 220px;\r\n    height: 220px;\r\n    background: rgba(0, 225, 255, 0.28);\r\n    top: -60px;\r\n    left: -60px;\r\n  }\r\n\r\n  .nfc-orb-2 {\r\n    width: 260px;\r\n    height: 260px;\r\n    background: rgba(108, 92, 231, 0.32);\r\n    right: -70px;\r\n    bottom: -70px;\r\n  }\r\n\r\n  .nfc-card {\r\n    position: relative;\r\n    overflow: hidden;\r\n    padding: 30px;\r\n    border-radius: 34px;\r\n    background:\r\n      linear-gradient(145deg, rgba(255,255,255,0.10), rgba(255,255,255,0.03)),\r\n      radial-gradient(circle at top left, rgba(0,225,255,0.16), transparent 34%),\r\n      radial-gradient(circle at bottom right, rgba(108,92,231,0.20), transparent 34%),\r\n      var(--nfc-card);\r\n    border: 1px solid var(--nfc-border);\r\n    box-shadow:\r\n      0 28px 90px rgba(0, 0, 0, 0.38),\r\n      inset 0 1px 0 rgba(255,255,255,0.10);\r\n    backdrop-filter: blur(18px);\r\n  }\r\n\r\n  .nfc-card::before {\r\n    content: \"\";\r\n    position: absolute;\r\n    inset: 0;\r\n    background-image:\r\n      linear-gradient(rgba(255,255,255,0.045) 1px, transparent 1px),\r\n      linear-gradient(90deg, rgba(255,255,255,0.045) 1px, transparent 1px);\r\n    background-size: 34px 34px;\r\n    mask-image: linear-gradient(to bottom, rgba(0,0,0,.6), transparent 65%);\r\n    pointer-events: none;\r\n  }\r\n\r\n  .nfc-top,\r\n  .nfc-hero,\r\n  .nfc-info-grid,\r\n  .nfc-success,\r\n  .nfc-manual-test,\r\n  .nfc-actions,\r\n  .nfc-history,\r\n  .nfc-note {\r\n    position: relative;\r\n    z-index: 1;\r\n  }\r\n\r\n  .nfc-top {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    gap: 18px;\r\n    align-items: center;\r\n    margin-bottom: 28px;\r\n  }\r\n\r\n  .nfc-brand {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 14px;\r\n  }\r\n\r\n  .nfc-brand-icon {\r\n    width: 54px;\r\n    height: 54px;\r\n    border-radius: 19px;\r\n    display: grid;\r\n    place-items: center;\r\n    background: linear-gradient(135deg, var(--nfc-primary), var(--nfc-purple));\r\n    box-shadow: 0 14px 38px rgba(0, 225, 255, 0.22);\r\n  }\r\n\r\n  .nfc-brand-icon span {\r\n    color: #06101d;\r\n    font-size: 26px;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .nfc-eyebrow {\r\n    margin: 0 0 3px;\r\n    font-size: 12px;\r\n    color: var(--nfc-primary);\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.16em;\r\n    font-weight: 800;\r\n  }\r\n\r\n  .nfc-brand h2 {\r\n    margin: 0;\r\n    font-size: clamp(24px, 4vw, 34px);\r\n    letter-spacing: -0.055em;\r\n    line-height: 1;\r\n    color: var(--nfc-text);\r\n  }\r\n\r\n  .nfc-live-badge {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n    padding: 9px 13px;\r\n    border-radius: 999px;\r\n    background: rgba(38, 223, 143, 0.10);\r\n    border: 1px solid rgba(38, 223, 143, 0.28);\r\n    color: #b8ffd9;\r\n    font-size: 13px;\r\n    font-weight: 800;\r\n    white-space: nowrap;\r\n  }\r\n\r\n  .nfc-live-badge span {\r\n    width: 8px;\r\n    height: 8px;\r\n    border-radius: 999px;\r\n    background: var(--nfc-green);\r\n    box-shadow: 0 0 0 7px rgba(38, 223, 143, 0.14);\r\n  }\r\n\r\n  .nfc-hero {\r\n    display: grid;\r\n    grid-template-columns: 220px 1fr;\r\n    gap: 24px;\r\n    align-items: center;\r\n    padding: 22px;\r\n    border-radius: 28px;\r\n    background: rgba(0, 0, 0, 0.16);\r\n    border: 1px solid rgba(255,255,255,0.10);\r\n    margin-bottom: 18px;\r\n  }\r\n\r\n  .nfc-scan {\r\n    min-height: 210px;\r\n    display: grid;\r\n    place-items: center;\r\n    position: relative;\r\n  }\r\n\r\n  .nfc-ring {\r\n    position: absolute;\r\n    border-radius: 999px;\r\n    border: 1px solid rgba(0, 225, 255, 0.35);\r\n    animation: nfcPulse 2.4s ease-out infinite;\r\n  }\r\n\r\n  .nfc-ring-1 {\r\n    width: 155px;\r\n    height: 155px;\r\n  }\r\n\r\n  .nfc-ring-2 {\r\n    width: 190px;\r\n    height: 190px;\r\n    animation-delay: .55s;\r\n  }\r\n\r\n  @keyframes nfcPulse {\r\n    0% {\r\n      transform: scale(.75);\r\n      opacity: .9;\r\n    }\r\n\r\n    100% {\r\n      transform: scale(1.18);\r\n      opacity: 0;\r\n    }\r\n  }\r\n\r\n  .nfc-phone {\r\n    width: 105px;\r\n    height: 170px;\r\n    border-radius: 28px;\r\n    background:\r\n      linear-gradient(160deg, rgba(255,255,255,.22), rgba(255,255,255,.04)),\r\n      rgba(255, 255, 255, 0.08);\r\n    border: 1px solid rgba(255,255,255,0.20);\r\n    box-shadow:\r\n      0 22px 50px rgba(0,0,0,0.35),\r\n      inset 0 1px 0 rgba(255,255,255,0.18);\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: center;\r\n    padding: 14px 12px;\r\n    position: relative;\r\n    overflow: hidden;\r\n  }\r\n\r\n  .nfc-phone::after {\r\n    content: \"\";\r\n    position: absolute;\r\n    width: 160%;\r\n    height: 24px;\r\n    background: rgba(0, 225, 255, 0.20);\r\n    top: -30px;\r\n    transform: rotate(-22deg);\r\n    animation: nfcSweep 2.1s ease-in-out infinite;\r\n  }\r\n\r\n  @keyframes nfcSweep {\r\n    0% {\r\n      top: -35px;\r\n    }\r\n\r\n    55% {\r\n      top: 185px;\r\n    }\r\n\r\n    100% {\r\n      top: 185px;\r\n    }\r\n  }\r\n\r\n  .nfc-phone-top {\r\n    width: 36px;\r\n    height: 5px;\r\n    border-radius: 999px;\r\n    background: rgba(255,255,255,.25);\r\n    margin-bottom: 28px;\r\n  }\r\n\r\n  .nfc-phone-icon {\r\n    font-size: 38px;\r\n    margin-bottom: 24px;\r\n    position: relative;\r\n    z-index: 2;\r\n  }\r\n\r\n  .nfc-phone-line {\r\n    width: 58px;\r\n    height: 8px;\r\n    border-radius: 999px;\r\n    background: rgba(255,255,255,.20);\r\n    margin-bottom: 8px;\r\n  }\r\n\r\n  .nfc-phone-line.short {\r\n    width: 38px;\r\n  }\r\n\r\n  .nfc-message {\r\n    min-width: 0;\r\n  }\r\n\r\n  .nfc-status-pill {\r\n    display: inline-flex;\r\n    margin-bottom: 12px;\r\n    padding: 8px 12px;\r\n    border-radius: 999px;\r\n    background: rgba(0, 225, 255, 0.10);\r\n    border: 1px solid rgba(0, 225, 255, 0.22);\r\n    color: #a8f6ff;\r\n    font-size: 12px;\r\n    font-weight: 900;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.12em;\r\n  }\r\n\r\n  .nfc-message h3 {\r\n    margin: 0;\r\n    font-size: clamp(28px, 5vw, 46px);\r\n    letter-spacing: -0.07em;\r\n    line-height: .95;\r\n    color: var(--nfc-text);\r\n  }\r\n\r\n  .nfc-message p {\r\n    margin: 14px 0 0;\r\n    color: var(--nfc-muted);\r\n    font-size: 15px;\r\n    line-height: 1.55;\r\n    max-width: 410px;\r\n  }\r\n\r\n  .nfc-info-grid {\r\n    display: grid;\r\n    grid-template-columns: repeat(4, 1fr);\r\n    gap: 10px;\r\n    margin-bottom: 14px;\r\n  }\r\n\r\n  .nfc-info-box {\r\n    padding: 14px;\r\n    border-radius: 20px;\r\n    background: rgba(255,255,255,0.065);\r\n    border: 1px solid rgba(255,255,255,0.10);\r\n    min-width: 0;\r\n  }\r\n\r\n  .nfc-info-box span {\r\n    display: block;\r\n    color: var(--nfc-muted);\r\n    font-size: 11px;\r\n    font-weight: 700;\r\n    margin-bottom: 7px;\r\n  }\r\n\r\n  .nfc-info-box strong {\r\n    display: block;\r\n    color: var(--nfc-text);\r\n    font-size: 13px;\r\n    line-height: 1.25;\r\n    overflow-wrap: anywhere;\r\n  }\r\n\r\n  .nfc-success {\r\n    display: none;\r\n    padding: 14px 15px;\r\n    border-radius: 20px;\r\n    background: linear-gradient(135deg, rgba(38,223,143,.95), rgba(130,255,194,.95));\r\n    color: #06101d;\r\n    margin-bottom: 14px;\r\n  }\r\n\r\n  .nfc-success strong,\r\n  .nfc-success span {\r\n    display: block;\r\n  }\r\n\r\n  .nfc-success strong {\r\n    font-size: 15px;\r\n    margin-bottom: 2px;\r\n  }\r\n\r\n  .nfc-success span {\r\n    font-size: 12px;\r\n    opacity: .75;\r\n    font-weight: 700;\r\n  }\r\n\r\n  .nfc-manual-test {\r\n    padding: 15px;\r\n    border-radius: 22px;\r\n    background: rgba(0,0,0,0.16);\r\n    border: 1px solid rgba(255,255,255,0.10);\r\n    margin-bottom: 12px;\r\n  }\r\n\r\n  .nfc-manual-test label {\r\n    display: block;\r\n    color: var(--nfc-muted);\r\n    font-size: 12px;\r\n    font-weight: 800;\r\n    margin-bottom: 8px;\r\n  }\r\n\r\n  .nfc-test-row {\r\n    display: grid;\r\n    grid-template-columns: 1fr auto;\r\n    gap: 8px;\r\n  }\r\n\r\n  .nfc-test-row input {\r\n    width: 100%;\r\n    min-width: 0;\r\n    border: 1px solid rgba(255,255,255,0.13);\r\n    background: rgba(255,255,255,0.06);\r\n    color: var(--nfc-text);\r\n    border-radius: 16px;\r\n    padding: 13px 14px;\r\n    font-size: 14px;\r\n    outline: none;\r\n  }\r\n\r\n  .nfc-test-row input::placeholder {\r\n    color: rgba(255,255,255,.42);\r\n  }\r\n\r\n  .nfc-test-row button,\r\n  .nfc-btn {\r\n    border: 0;\r\n    cursor: pointer;\r\n    font-family: inherit;\r\n    font-weight: 900;\r\n    border-radius: 16px;\r\n    transition: transform .2s ease, opacity .2s ease, border-color .2s ease;\r\n  }\r\n\r\n  .nfc-test-row button {\r\n    padding: 0 17px;\r\n    color: #06101d;\r\n    background: linear-gradient(135deg, var(--nfc-primary), #93f4ff);\r\n  }\r\n\r\n  .nfc-btn:hover,\r\n  .nfc-test-row button:hover {\r\n    transform: translateY(-1px);\r\n  }\r\n\r\n  .nfc-actions {\r\n    display: grid;\r\n    grid-template-columns: 1.2fr .9fr .7fr;\r\n    gap: 10px;\r\n    margin-bottom: 18px;\r\n  }\r\n\r\n  .nfc-btn {\r\n    padding: 14px 13px;\r\n    font-size: 13px;\r\n  }\r\n\r\n  .nfc-btn.primary {\r\n    color: #06101d;\r\n    background: linear-gradient(135deg, var(--nfc-primary), #7ef4ff);\r\n    box-shadow: 0 12px 28px rgba(0,225,255,0.15);\r\n  }\r\n\r\n  .nfc-btn.secondary {\r\n    color: var(--nfc-text);\r\n    background: rgba(255,255,255,0.075);\r\n    border: 1px solid rgba(255,255,255,0.13);\r\n  }\r\n\r\n  .nfc-btn.ghost {\r\n    color: #ffd0d0;\r\n    background: rgba(255,107,107,0.10);\r\n    border: 1px solid rgba(255,107,107,0.22);\r\n  }\r\n\r\n  .nfc-history {\r\n    padding-top: 16px;\r\n    border-top: 1px solid rgba(255,255,255,0.11);\r\n  }\r\n\r\n  .nfc-history-head {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    gap: 12px;\r\n    margin-bottom: 10px;\r\n  }\r\n\r\n  .nfc-history-head h4 {\r\n    margin: 0;\r\n    color: var(--nfc-text);\r\n    font-size: 15px;\r\n    letter-spacing: -0.02em;\r\n  }\r\n\r\n  .nfc-history-head span {\r\n    color: var(--nfc-muted);\r\n    font-size: 12px;\r\n    font-weight: 700;\r\n  }\r\n\r\n  .nfc-history-list {\r\n    display: grid;\r\n    gap: 8px;\r\n    max-height: 240px;\r\n    overflow: auto;\r\n    padding-right: 4px;\r\n  }\r\n\r\n  .nfc-history-item {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    gap: 14px;\r\n    padding: 12px 13px;\r\n    border-radius: 17px;\r\n    background: rgba(255,255,255,0.055);\r\n    border: 1px solid rgba(255,255,255,0.09);\r\n  }\r\n\r\n  .nfc-history-item strong {\r\n    display: block;\r\n    color: var(--nfc-text);\r\n    font-size: 13px;\r\n    margin-bottom: 3px;\r\n    overflow-wrap: anywhere;\r\n  }\r\n\r\n  .nfc-history-item span {\r\n    color: var(--nfc-muted);\r\n    font-size: 12px;\r\n  }\r\n\r\n  .nfc-history-time {\r\n    text-align: right;\r\n    min-width: 112px;\r\n  }\r\n\r\n  .nfc-empty {\r\n    padding: 14px;\r\n    border-radius: 17px;\r\n    border: 1px dashed rgba(255,255,255,0.18);\r\n    color: var(--nfc-muted);\r\n    font-size: 13px;\r\n    text-align: center;\r\n  }\r\n\r\n  .nfc-note {\r\n    margin-top: 16px;\r\n    color: var(--nfc-muted);\r\n    font-size: 12px;\r\n    line-height: 1.45;\r\n    text-align: center;\r\n  }\r\n\r\n  .nfc-note code {\r\n    display: inline-block;\r\n    margin-top: 5px;\r\n    color: #d9fbff;\r\n    background: rgba(0,0,0,0.22);\r\n    border: 1px solid rgba(255,255,255,0.10);\r\n    border-radius: 10px;\r\n    padding: 5px 7px;\r\n    max-width: 100%;\r\n    overflow-wrap: anywhere;\r\n  }\r\n\r\n  @media (max-width: 720px) {\r\n    .nfc-card {\r\n      padding: 20px;\r\n      border-radius: 28px;\r\n    }\r\n\r\n    .nfc-top {\r\n      align-items: flex-start;\r\n      margin-bottom: 18px;\r\n    }\r\n\r\n    .nfc-brand-icon {\r\n      width: 48px;\r\n      height: 48px;\r\n      border-radius: 17px;\r\n    }\r\n\r\n    .nfc-brand h2 {\r\n      font-size: 24px;\r\n    }\r\n\r\n    .nfc-live-badge {\r\n      font-size: 12px;\r\n      padding: 8px 11px;\r\n    }\r\n\r\n    .nfc-hero {\r\n      grid-template-columns: 1fr;\r\n      text-align: center;\r\n      padding: 18px;\r\n    }\r\n\r\n    .nfc-scan {\r\n      min-height: 185px;\r\n    }\r\n\r\n    .nfc-message p {\r\n      margin-left: auto;\r\n      margin-right: auto;\r\n    }\r\n\r\n    .nfc-info-grid {\r\n      grid-template-columns: repeat(2, 1fr);\r\n    }\r\n\r\n    .nfc-actions {\r\n      grid-template-columns: 1fr;\r\n    }\r\n  }\r\n\r\n  @media (max-width: 420px) {\r\n    .nfc-attendance-widget {\r\n      max-width: 100%;\r\n    }\r\n\r\n    .nfc-card {\r\n      padding: 17px;\r\n      border-radius: 24px;\r\n    }\r\n\r\n    .nfc-brand {\r\n      gap: 10px;\r\n    }\r\n\r\n    .nfc-brand h2 {\r\n      font-size: 21px;\r\n    }\r\n\r\n    .nfc-eyebrow {\r\n      font-size: 10px;\r\n    }\r\n\r\n    .nfc-live-badge {\r\n      display: none;\r\n    }\r\n\r\n    .nfc-info-grid {\r\n      grid-template-columns: 1fr;\r\n    }\r\n\r\n    .nfc-test-row {\r\n      grid-template-columns: 1fr;\r\n    }\r\n\r\n    .nfc-test-row button {\r\n      padding: 13px 17px;\r\n    }\r\n\r\n    .nfc-history-item {\r\n      flex-direction: column;\r\n      gap: 4px;\r\n    }\r\n\r\n    .nfc-history-time {\r\n      text-align: left;\r\n      min-width: 0;\r\n    }\r\n  }\r\n<\/style>\r\n\r\n<script>\r\n  (function () {\r\n    const widget = document.getElementById(\"nfcAttendanceWidget\");\r\n    if (!widget) return;\r\n\r\n    const STORAGE_KEY = \"elementor_nfc_attendance_history_v2\";\r\n\r\n    const el = {\r\n      statusPill: document.getElementById(\"nfcStatusPill\"),\r\n      mainTitle: document.getElementById(\"nfcMainTitle\"),\r\n      subtitle: document.getElementById(\"nfcSubtitle\"),\r\n      tagValue: document.getElementById(\"nfcTagValue\"),\r\n      timeValue: document.getElementById(\"nfcTimeValue\"),\r\n      stateValue: document.getElementById(\"nfcStateValue\"),\r\n      deviceValue: document.getElementById(\"nfcDeviceValue\"),\r\n      successBox: document.getElementById(\"nfcSuccessBox\"),\r\n      manualTag: document.getElementById(\"nfcManualTag\"),\r\n      manualBtn: document.getElementById(\"nfcManualBtn\"),\r\n      markAgainBtn: document.getElementById(\"nfcMarkAgainBtn\"),\r\n      exportBtn: document.getElementById(\"nfcExportBtn\"),\r\n      clearBtn: document.getElementById(\"nfcClearBtn\"),\r\n      historyList: document.getElementById(\"nfcHistoryList\"),\r\n      counter: document.getElementById(\"nfcCounter\")\r\n    };\r\n\r\n    function getParam(name) {\r\n      const url = new URL(window.location.href);\r\n      return url.searchParams.get(name);\r\n    }\r\n\r\n    function getDeviceLabel() {\r\n      const ua = navigator.userAgent || \"\";\r\n\r\n      if (\/iPhone|Android.+Mobile\/i.test(ua)) return \"Celular\";\r\n      if (\/iPad|Tablet\/i.test(ua)) return \"Tablet\";\r\n\r\n      return \"Desktop\";\r\n    }\r\n\r\n    function nowText() {\r\n      return new Date().toLocaleString(\"es-PE\", {\r\n        dateStyle: \"medium\",\r\n        timeStyle: \"short\"\r\n      });\r\n    }\r\n\r\n    function getHistory() {\r\n      try {\r\n        return JSON.parse(localStorage.getItem(STORAGE_KEY) || \"[]\");\r\n      } catch (error) {\r\n        return [];\r\n      }\r\n    }\r\n\r\n    function saveHistory(history) {\r\n      localStorage.setItem(STORAGE_KEY, JSON.stringify(history));\r\n    }\r\n\r\n    function escapeHTML(text) {\r\n      return String(text).replace(\/[&<>\"']\/g, function (match) {\r\n        return {\r\n          \"&\": \"&amp;\",\r\n          \"<\": \"&lt;\",\r\n          \">\": \"&gt;\",\r\n          '\"': \"&quot;\",\r\n          \"'\": \"&#039;\"\r\n        }[match];\r\n      });\r\n    }\r\n\r\n    function setWaitingState() {\r\n      el.tagValue.textContent = \"Sin c\u00f3digo\";\r\n      el.timeValue.textContent = \"--\";\r\n      el.stateValue.textContent = \"Pendiente\";\r\n      el.deviceValue.textContent = getDeviceLabel();\r\n      el.statusPill.textContent = \"Esperando NFC\";\r\n      el.mainTitle.textContent = \"Escanea tu llavero\";\r\n      el.subtitle.textContent = \"Al abrir esta p\u00e1gina desde el tag NFC, se marcar\u00e1 la asistencia autom\u00e1ticamente.\";\r\n      el.successBox.style.display = \"none\";\r\n    }\r\n\r\n    function checkin(tag) {\r\n      const cleanTag = String(tag || \"\").trim();\r\n\r\n      if (!cleanTag) {\r\n        setWaitingState();\r\n        renderHistory();\r\n        return;\r\n      }\r\n\r\n      const readableDate = nowText();\r\n      const device = getDeviceLabel();\r\n\r\n      const record = {\r\n        tag: cleanTag,\r\n        date: new Date().toISOString(),\r\n        readableDate: readableDate,\r\n        device: device\r\n      };\r\n\r\n      const history = getHistory();\r\n      history.unshift(record);\r\n      saveHistory(history.slice(0, 100));\r\n\r\n      el.tagValue.textContent = cleanTag;\r\n      el.timeValue.textContent = readableDate;\r\n      el.stateValue.textContent = \"Registrado\";\r\n      el.deviceValue.textContent = device;\r\n      el.statusPill.textContent = \"Asistencia marcada\";\r\n      el.mainTitle.textContent = \"\u00a1Bienvenido!\";\r\n      el.subtitle.textContent = \"Tu asistencia fue registrada correctamente con el llavero NFC.\";\r\n      el.successBox.style.display = \"block\";\r\n\r\n      if (navigator.vibrate) {\r\n        navigator.vibrate([80, 45, 80]);\r\n      }\r\n\r\n      renderHistory();\r\n    }\r\n\r\n    function renderHistory() {\r\n      const history = getHistory();\r\n      el.counter.textContent = history.length === 1 ? \"1 registro\" : history.length + \" registros\";\r\n\r\n      if (!history.length) {\r\n        el.historyList.innerHTML = '<div class=\"nfc-empty\">A\u00fan no hay registros en este dispositivo.<\/div>';\r\n        return;\r\n      }\r\n\r\n      el.historyList.innerHTML = history.map(function (item) {\r\n        return `\r\n          <div class=\"nfc-history-item\">\r\n            <div>\r\n              <strong>${escapeHTML(item.tag)}<\/strong>\r\n              <span>${escapeHTML(item.device || \"Dispositivo\")}<\/span>\r\n            <\/div>\r\n            <span class=\"nfc-history-time\">${escapeHTML(item.readableDate)}<\/span>\r\n          <\/div>\r\n        `;\r\n      }).join(\"\");\r\n    }\r\n\r\n    function manualCheckin() {\r\n      const tag = el.manualTag.value || \"LLAVERO001\";\r\n      const url = new URL(window.location.href);\r\n      url.searchParams.set(\"tag\", tag);\r\n      window.history.replaceState({}, \"\", url.toString());\r\n      checkin(tag);\r\n    }\r\n\r\n    function markAgain() {\r\n      const currentTag = getParam(\"tag\") || el.manualTag.value || \"LLAVERO001\";\r\n      checkin(currentTag);\r\n    }\r\n\r\n    function exportCSV() {\r\n      const history = getHistory();\r\n\r\n      if (!history.length) {\r\n        alert(\"No hay registros para exportar.\");\r\n        return;\r\n      }\r\n\r\n      const header = [\"codigo_nfc\", \"fecha_iso\", \"fecha_legible\", \"dispositivo\"];\r\n\r\n      const rows = history.map(function (item) {\r\n        return [\r\n          item.tag,\r\n          item.date,\r\n          item.readableDate,\r\n          item.device || \"\"\r\n        ];\r\n      });\r\n\r\n      const csv = [header].concat(rows).map(function (row) {\r\n        return row.map(function (value) {\r\n          return '\"' + String(value).replaceAll('\"', '\"\"') + '\"';\r\n        }).join(\",\");\r\n      }).join(\"\\n\");\r\n\r\n      const blob = new Blob([csv], {\r\n        type: \"text\/csv;charset=utf-8\"\r\n      });\r\n\r\n      const url = URL.createObjectURL(blob);\r\n      const link = document.createElement(\"a\");\r\n\r\n      link.href = url;\r\n      link.download = \"asistencia-nfc.csv\";\r\n      document.body.appendChild(link);\r\n      link.click();\r\n      document.body.removeChild(link);\r\n\r\n      URL.revokeObjectURL(url);\r\n    }\r\n\r\n    function clearHistory() {\r\n      const confirmDelete = confirm(\"\u00bfSeguro que quieres limpiar el historial de asistencia de este dispositivo?\");\r\n\r\n      if (!confirmDelete) return;\r\n\r\n      localStorage.removeItem(STORAGE_KEY);\r\n      setWaitingState();\r\n      renderHistory();\r\n    }\r\n\r\n    el.manualBtn.addEventListener(\"click\", manualCheckin);\r\n    el.markAgainBtn.addEventListener(\"click\", markAgain);\r\n    el.exportBtn.addEventListener(\"click\", exportCSV);\r\n    el.clearBtn.addEventListener(\"click\", clearHistory);\r\n\r\n    checkin(getParam(\"tag\"));\r\n  })();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u2713 Control NFC Registro de asistencia Activo \ud83d\udce1 Esperando NFC Escanea tu llavero Al abrir esta p\u00e1gina desde el tag NFC, se marcar\u00e1 la asistencia autom\u00e1ticamente. C\u00f3digo NFC Sin c\u00f3digo Hora de registro &#8212; Estado Pendiente Dispositivo &#8212; Asistencia marcada correctamente El registro qued\u00f3 guardado en este dispositivo. Probar manualmente Probar Marcar asistencia Exportar CSV Limpiar \u00daltimos registros 0 registros Link para grabar en NFC Tools: https:\/\/tudominio.com\/asistencia-nfc\/?tag=LLAVERO001<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-1361","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/mednologyapps.com\/index.php\/wp-json\/wp\/v2\/pages\/1361","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mednologyapps.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mednologyapps.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mednologyapps.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mednologyapps.com\/index.php\/wp-json\/wp\/v2\/comments?post=1361"}],"version-history":[{"count":7,"href":"https:\/\/mednologyapps.com\/index.php\/wp-json\/wp\/v2\/pages\/1361\/revisions"}],"predecessor-version":[{"id":1368,"href":"https:\/\/mednologyapps.com\/index.php\/wp-json\/wp\/v2\/pages\/1361\/revisions\/1368"}],"wp:attachment":[{"href":"https:\/\/mednologyapps.com\/index.php\/wp-json\/wp\/v2\/media?parent=1361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}