{"id":5325,"date":"2026-09-30T17:25:06","date_gmt":"2026-09-30T15:25:06","guid":{"rendered":"https:\/\/achiral.it\/?page_id=5325"},"modified":"2026-10-12T09:58:50","modified_gmt":"2026-10-12T07:58:50","slug":"ecosystem","status":"publish","type":"page","link":"https:\/\/achiral.it\/en\/ecosystem\/","title":{"rendered":"Ecosystem"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"5325\" class=\"elementor elementor-5325\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6eb6169 e-con-full e-flex e-con e-parent\" data-id=\"6eb6169\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-647fdad elementor-widget elementor-widget-html\" data-id=\"647fdad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- aChiral Ecosystem Navigator: file generato da tools\/build-wordpress.js, non modificarlo a mano -->\n<style>\n#achiral-navigator {\n    --ach-sticky-top: 120px;\n    --site-blue: #3971FF;\n    --site-blue-hover: #235AE6;\n    --site-blue-tint: rgba(57, 113, 255, 0.06);\n    --site-blue-border: rgba(57, 113, 255, 0.35);\n    --site-navy: #21316D;\n    --site-navy-tint: rgba(33, 49, 109, 0.06);\n    --site-navy-border: rgba(33, 49, 109, 0.20);\n    --site-text: #2E2E2E;\n    --site-text-muted: #54595F;\n    --site-text-faint: #808080;\n    --site-bg: #F4F5FA;\n    --site-hero-bg: #DDE7F2;          \n    --site-surface: #FFFFFF;\n    --site-border: #E2E8F0;\n    --site-border-strong: #CBD5E1;\n    --site-danger: #D93F3F;\n    --site-danger-tint: rgba(217, 63, 63, 0.10);\n    --site-mint: #10B981;\n    --ach-mint-tint: rgba(16, 185, 129, 0.08);\n    --ach-mint-border: rgba(16, 185, 129, 0.25);\n    --ach-teal-text: #0D8273;\n    --site-radius-sm: 6px;\n    --site-radius: 12px;\n    --site-radius-card: 16px;\n    --site-radius-pill: 30px;\n    --site-shadow-sm: 0 2px 8px rgba(33, 49, 109, 0.04);\n    --site-shadow-overlay: 0 12px 32px rgba(33, 49, 109, 0.16);\n    --site-focus-ring: 0 0 0 3px rgba(57, 113, 255, 0.35);\n    --font-main: 'Poppins', 'Poppins Fallback', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n    --space-4: 4px;\n    --space-8: 8px;\n    --space-12: 12px;\n    --space-16: 16px;\n    --space-20: 20px;\n    --space-24: 24px;\n    --space-32: 32px;\n    --space-40: 40px;\n    --space-48: 48px;\n}\n\n\n@font-face {\n    font-family: \"Poppins Fallback\";\n    src: local(\"Arial\"), local(\"ArialMT\");\n    size-adjust: 112.16%;\n    ascent-override: 93.62%;\n    descent-override: 31.21%;\n    line-gap-override: 8.92%;\n}\nhtml:not([lang^=\"en\"]) #achiral-navigator .ach-pre--en,\nhtml[lang^=\"en\"] #achiral-navigator .ach-pre--it {\n    display: none;\n}\n#achiral-navigator *,\n#achiral-navigator *::before,\n#achiral-navigator *::after {\n    box-sizing: border-box;\n    margin: 0;\n    padding: 0;\n}\n#achiral-navigator [hidden] {\n    display: none !important;\n}\n#achiral-navigator :where(button, input, textarea) {\n    font: inherit;\n    color: inherit;\n}\n#achiral-navigator button {\n    background: none;\n    border: 0;\n    border-radius: 0;\n    text-transform: none;\n    box-shadow: none;\n}\n#achiral-navigator :where(h1, h2, h3, p, label) {\n    font-family: inherit;\n    letter-spacing: normal;\n    text-transform: none;\n}\n#achiral-navigator .ach-ico {\n    display: inline-block;\n    height: 1em;\n    vertical-align: -0.125em;\n    background-color: currentColor;\n    -webkit-mask: var(--ach-ico) no-repeat center \/ contain;\n    mask: var(--ach-ico) no-repeat center \/ contain;\n    -webkit-print-color-adjust: exact;\n    print-color-adjust: exact;\n}\n#achiral-navigator .ach-ico--arrow-left { width: 0.875em; --ach-ico: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 448 512'%3E%3Cpath d='M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.2 288 416 288c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0L214.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z'\/%3E%3C\/svg%3E\"); }\n#achiral-navigator .ach-ico--arrow-right { width: 0.875em; --ach-ico: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 448 512'%3E%3Cpath d='M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z'\/%3E%3C\/svg%3E\"); }\n#achiral-navigator .ach-ico--check-circle { width: 1em; --ach-ico: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 512 512'%3E%3Cpath d='M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM369 209L241 337c-9.4 9.4-24.6 9.4-33.9 0l-64-64c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L335 175c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z'\/%3E%3C\/svg%3E\"); }\n#achiral-navigator .ach-ico--check { width: 0.875em; --ach-ico: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 448 512'%3E%3Cpath d='M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z'\/%3E%3C\/svg%3E\"); }\n#achiral-navigator .ach-ico--chevron-down { width: 1em; --ach-ico: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 512 512'%3E%3Cpath d='M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z'\/%3E%3C\/svg%3E\"); }\n#achiral-navigator .ach-ico--chevron-up { width: 1em; --ach-ico: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 512 512'%3E%3Cpath d='M233.4 105.4c12.5-12.5 32.8-12.5 45.3 0l192 192c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L256 173.3 86.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l192-192z'\/%3E%3C\/svg%3E\"); }\n#achiral-navigator .ach-ico--exclamation-circle { width: 1em; --ach-ico: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 512 512'%3E%3Cpath d='M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zm0-384c13.3 0 24 10.7 24 24V264c0 13.3-10.7 24-24 24s-24-10.7-24-24V152c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z'\/%3E%3C\/svg%3E\"); }\n#achiral-navigator .ach-ico--info-circle { width: 1em; --ach-ico: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 512 512'%3E%3Cpath d='M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z'\/%3E%3C\/svg%3E\"); }\n#achiral-navigator .ach-ico--list-check { width: 1em; --ach-ico: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 512 512'%3E%3Cpath d='M152.1 38.2c9.9 8.9 10.7 24 1.8 33.9l-72 80c-4.4 4.9-10.6 7.8-17.2 7.9s-12.9-2.4-17.6-7L7 113C-2.3 103.6-2.3 88.4 7 79s24.6-9.4 33.9 0l22.1 22.1 55.1-61.2c8.9-9.9 24-10.7 33.9-1.8zm0 160c9.9 8.9 10.7 24 1.8 33.9l-72 80c-4.4 4.9-10.6 7.8-17.2 7.9s-12.9-2.4-17.6-7L7 273c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.1 22.1 55.1-61.2c8.9-9.9 24-10.7 33.9-1.8zM224 96c0-17.7 14.3-32 32-32H480c17.7 0 32 14.3 32 32s-14.3 32-32 32H256c-17.7 0-32-14.3-32-32zm0 160c0-17.7 14.3-32 32-32H480c17.7 0 32 14.3 32 32s-14.3 32-32 32H256c-17.7 0-32-14.3-32-32zM160 416c0-17.7 14.3-32 32-32H480c17.7 0 32 14.3 32 32s-14.3 32-32 32H192c-17.7 0-32-14.3-32-32zM48 368a48 48 0 1 1 0 96 48 48 0 1 1 0-96z'\/%3E%3C\/svg%3E\"); }\n#achiral-navigator .ach-ico--minus { width: 0.875em; --ach-ico: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 448 512'%3E%3Cpath d='M432 256c0 17.7-14.3 32-32 32L48 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l352 0c17.7 0 32 14.3 32 32z'\/%3E%3C\/svg%3E\"); }\n#achiral-navigator .ach-ico--plus { width: 0.875em; --ach-ico: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 448 512'%3E%3Cpath d='M256 80c0-17.7-14.3-32-32-32s-32 14.3-32 32V224H48c-17.7 0-32 14.3-32 32s14.3 32 32 32H192V432c0 17.7 14.3 32 32 32s32-14.3 32-32V288H400c17.7 0 32-14.3 32-32s-14.3-32-32-32H256V80z'\/%3E%3C\/svg%3E\"); }\n#achiral-navigator .ach-ico--search { width: 1em; --ach-ico: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 512 512'%3E%3Cpath d='M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z'\/%3E%3C\/svg%3E\"); }\n#achiral-navigator .ach-ico--times { width: 0.75em; --ach-ico: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 384 512'%3E%3Cpath d='M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z'\/%3E%3C\/svg%3E\"); }\n#achiral-navigator :focus-visible {\n    outline: none;\n    box-shadow: var(--site-focus-ring);\n}\n#achiral-navigator .ach-sr-only {\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: 0;\n}\n#achiral-navigator {\n    width: var(--ach-vw, 100vw);\n    max-width: none;\n    margin-inline: calc(50% - var(--ach-vw, 100vw) \/ 2);\n    font-family: var(--font-main);\n    background-color: var(--site-bg);\n    color: var(--site-text);\n    font-size: 15px;\n    line-height: 1.6;\n    -webkit-font-smoothing: antialiased;\n    overflow-x: clip;\n}\n#achiral-navigator .ach-macro-card,\n#achiral-navigator .ach-explore-banner,\n#achiral-navigator .ach-srv-card {\n    appearance: none;\n    font: inherit;\n    color: inherit;\n    text-align: left;\n    width: 100%;\n}\n#achiral-navigator .ach-radio-dot i,\n#achiral-navigator .ach-srv-check i {\n    opacity: 0;\n    transform: scale(0.5);\n    transition: all 0.2s ease;\n}\n#achiral-navigator .is-selected > .ach-radio-dot i,\n#achiral-navigator .ach-srv-card.is-checked .ach-srv-check i {\n    opacity: 1;\n    transform: none;\n}\n#achiral-navigator .ach-stepper-wrap {\n    padding: var(--space-48) 0 14px;\n    margin-bottom: 56px;\n}\n#achiral-navigator .ach-stepper {\n    max-width: 900px;\n    margin: 0 auto;\n    display: grid;\n    grid-template-columns: repeat(4, 1fr);\n    position: relative;\n    padding: 0 var(--space-24);\n    list-style: none;\n}\n#achiral-navigator .ach-stepper-track {\n    position: absolute;\n    top: 18px;\n    left: calc(var(--space-24) + (100% - 2 * var(--space-24)) \/ 8);\n    right: calc(var(--space-24) + (100% - 2 * var(--space-24)) \/ 8);\n    height: 2px;\n    background: var(--site-border);\n    z-index: 1;\n}\n#achiral-navigator .ach-stepper-progress {\n    height: 100%;\n    background: var(--site-blue);\n    width: 0%;\n    transition: width 0.35s cubic-bezier(0.16, 1, 0.3, 1);\n}\n#achiral-navigator .ach-step-btn {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    position: relative;\n    z-index: 2;\n    cursor: pointer;\n    text-align: center;\n    background: none;\n    border: none;\n    gap: 8px;\n    width: 100%;\n    border-radius: var(--site-radius);\n    padding: 0 4px 2px;\n}\n#achiral-navigator .ach-step-btn:disabled {\n    cursor: not-allowed;\n}\n#achiral-navigator .ach-step-num {\n    width: 36px;\n    height: 36px;\n    border-radius: 50%;\n    background: var(--site-surface);\n    border: 2px solid var(--site-border-strong);\n    color: var(--site-text-faint);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-weight: 600;\n    font-size: 13px;\n    transition: all 0.25s ease;\n}\n#achiral-navigator .ach-step-text {\n    font-size: 13px;\n    font-weight: 500;\n    color: var(--site-text-muted);\n    transition: color 0.2s ease;\n}\n#achiral-navigator .ach-step-btn:not(:disabled):not(.is-active):hover .ach-step-num {\n    border-color: var(--site-blue);\n    color: var(--site-blue);\n}\n#achiral-navigator .ach-step-btn:disabled .ach-step-text {\n    color: var(--site-text-faint);\n}\n#achiral-navigator .ach-step-btn.is-active .ach-step-num {\n    border-color: var(--site-blue);\n    background: var(--site-blue);\n    color: #FFFFFF;\n}\n#achiral-navigator .ach-step-btn.is-active .ach-step-text {\n    color: var(--site-blue);\n    font-weight: 600;\n}\n#achiral-navigator .ach-step-btn.is-done .ach-step-num {\n    border-color: var(--site-blue);\n    color: var(--site-blue);\n}\n#achiral-navigator .ach-step-btn.is-done .ach-step-text {\n    color: var(--site-navy);\n}\n#achiral-navigator .ach-content-container {\n    max-width: 1200px;\n    margin: 0 auto;\n    padding: 0 32px 64px;\n}\n#achiral-navigator .ach-view-step {\n    display: none;\n    animation: fadeIn 0.25s ease forwards;\n}\n#achiral-navigator .ach-view-step.is-visible {\n    display: block;\n}\n@keyframes fadeIn {\n    from { opacity: 0; transform: translateY(6px); }\n    to { opacity: 1; transform: translateY(0); }\n}\n#achiral-navigator .ach-intro {\n    background: var(--site-hero-bg);\n    padding: 56px 32px;\n    text-align: center;\n    color: var(--site-navy);\n}\n#achiral-navigator .ach-intro__inner {\n    max-width: 720px;\n    margin: 0 auto;\n}\n#achiral-navigator .ach-intro__label {\n    display: block;\n    font-size: 13px;\n    font-weight: 600;\n    letter-spacing: 0.02em;\n    text-transform: uppercase;\n    margin-bottom: var(--space-24);\n}\n#achiral-navigator .ach-intro__title {\n    font-size: 38px;\n    font-weight: 600;\n    line-height: 1.25;\n    letter-spacing: -0.01em;\n    color: var(--site-navy);\n    margin: 0 0 var(--space-16);\n}\n#achiral-navigator .ach-intro__title strong {\n    font-weight: inherit;\n}\n#achiral-navigator .ach-intro__lead {\n    font-size: 15.5px;\n    line-height: 1.6;\n    margin: 0;\n}\n#achiral-navigator .ach-section-header {\n    text-align: center;\n    margin-bottom: 40px;\n    padding: 40px 32px;\n    background: var(--site-hero-bg);\n    border-radius: var(--site-radius-card);\n}\n#achiral-navigator .ach-tag-label {\n    font-size: 13px;\n    font-weight: 600;\n    letter-spacing: 0.04em;\n    text-transform: uppercase;\n    color: var(--site-blue);\n    margin-bottom: 10px;\n    display: block;\n}\n#achiral-navigator .ach-header-back {\n    margin-top: 16px;\n}\n#achiral-navigator .ach-h1,\n#achiral-navigator .ach-h2 {\n    color: var(--site-navy);\n    letter-spacing: -0.02em;\n    margin-bottom: 12px;\n}\n#achiral-navigator .ach-h1 {\n    font-size: 38px;\n    font-weight: 400;\n    line-height: 1.25;\n}\n#achiral-navigator .ach-h2 {\n    font-size: 34px;\n    font-weight: 400;\n    line-height: 1.25;\n}\n#achiral-navigator .ach-h1 strong,\n#achiral-navigator .ach-h2 strong {\n    font-weight: 700;\n}\n#achiral-navigator .ach-h1:focus,\n#achiral-navigator .ach-h2:focus {\n    box-shadow: none;\n}\n#achiral-navigator .ach-h1 span,\n#achiral-navigator .ach-h2 span {\n    color: inherit;\n}\n#achiral-navigator .ach-lead-text {\n    font-size: 15.5px;\n    color: var(--site-text-muted);\n    max-width: 720px;\n    margin: 0 auto;\n    line-height: 1.7;\n}\n#achiral-navigator .ach-lead-text strong {\n    color: var(--site-navy);\n    font-weight: 600;\n}\n#achiral-navigator .ach-btn {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    gap: 8px;\n    padding: 13px 28px;\n    border-radius: 12px;\n    font-weight: 600;\n    font-size: 15px;\n    cursor: pointer;\n    transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);\n    text-decoration: none;\n    line-height: 1.2;\n    letter-spacing: -0.01em;\n    white-space: nowrap;\n}\n#achiral-navigator .ach-btn--primary {\n    background-color: var(--site-blue);\n    color: #FFFFFF;\n    border: 2px solid var(--site-blue);\n}\n#achiral-navigator .ach-btn--primary:hover:not(:disabled) {\n    background-color: var(--site-blue-hover);\n    border-color: var(--site-blue-hover);\n}\n#achiral-navigator .ach-btn--secondary {\n    background-color: transparent;\n    color: var(--site-blue);\n    border: 1.5px solid var(--site-blue);\n}\n#achiral-navigator .ach-btn--secondary:hover:not(:disabled) {\n    background-color: var(--site-blue);\n    color: #FFFFFF;\n}\n#achiral-navigator .ach-btn--ghost {\n    background: transparent;\n    color: var(--site-navy);\n    border: 2px solid transparent;\n}\n#achiral-navigator .ach-btn--ghost:hover:not(:disabled) {\n    color: var(--site-blue);\n    background: var(--site-blue-tint);\n}\n#achiral-navigator .ach-btn--sm {\n    padding: 8px 16px;\n    font-size: 13px;\n    border-radius: 10px;\n}\n#achiral-navigator .ach-btn:disabled {\n    opacity: 0.45;\n    cursor: not-allowed;\n    box-shadow: none;\n}\n#achiral-navigator .ach-link-btn {\n    background: none;\n    border: none;\n    color: var(--site-blue);\n    font-size: 13px;\n    font-weight: 600;\n    cursor: pointer;\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n    padding: 4px 2px;\n    border-radius: 4px;\n}\n#achiral-navigator .ach-link-btn:hover {\n    color: var(--site-blue-hover);\n    text-decoration: underline;\n}\n#achiral-navigator .ach-actionbar {\n    position: sticky;\n    bottom: 16px;\n    z-index: 20;\n    margin-top: 40px;\n    background: var(--site-surface);\n    border: 1px solid var(--site-border);\n    border-radius: var(--site-radius-card);\n    box-shadow: 0 -1px 0 var(--site-border), 0 4px 16px rgba(33, 49, 109, 0.06);\n    padding: 16px 18px 16px 24px;\n    display: flex;\n    align-items: center;\n    gap: 16px;\n}\n#achiral-navigator .ach-actionbar__info {\n    flex: 1;\n    min-width: 0;\n    font-size: 14px;\n    color: var(--site-text-muted);\n    line-height: 1.45;\n}\n#achiral-navigator .ach-actionbar__info strong {\n    color: var(--site-navy);\n    font-weight: 600;\n}\n#achiral-navigator .ach-actionbar__info i {\n    color: var(--site-blue);\n    margin-right: 6px;\n}\n#achiral-navigator .ach-actionbar__arrow {\n    color: var(--site-text-faint);\n    margin: 0 6px;\n}\n#achiral-navigator .ach-actionbar__actions {\n    display: flex;\n    gap: 10px;\n    flex-shrink: 0;\n}\n#achiral-navigator .ach-actionbar .ach-btn {\n    padding: 11px 22px;\n}\n#achiral-navigator .ach-macro-grid {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 28px;\n    margin-bottom: 40px;\n}\n#achiral-navigator .ach-macro-card {\n    background: var(--site-surface);\n    border: 1.5px solid var(--site-border);\n    border-radius: var(--site-radius-card);\n    padding: 24px 22px 20px;\n    cursor: pointer;\n    transition: border-color 0.25s ease, transform 0.25s ease, box-shadow 0.25s ease, background 0.25s ease;\n    display: flex;\n    flex-direction: column;\n    position: relative;\n}\n#achiral-navigator .ach-macro-card:hover {\n    border-color: var(--site-blue);\n}\n#achiral-navigator .ach-macro-card.is-selected {\n    border-color: var(--site-blue);\n    background: var(--site-blue-tint);\n    box-shadow: 0 0 0 1px var(--site-blue);\n}\n#achiral-navigator .ach-radio-dot {\n    position: absolute;\n    top: 16px;\n    right: 16px;\n    width: 22px;\n    height: 22px;\n    border-radius: 50%;\n    border: 2px solid var(--site-border-strong);\n    background: var(--site-surface);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    color: #FFFFFF;\n    font-size: 10px;\n    transition: all 0.2s ease;\n}\n#achiral-navigator .is-selected > .ach-radio-dot {\n    background: var(--site-blue);\n    border-color: var(--site-blue);\n}\n#achiral-navigator .ach-macro-card__icon {\n    width: 48px;\n    height: 48px;\n    border-radius: 14px;\n    background: var(--site-navy-tint);\n    color: var(--site-navy);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    margin-bottom: 18px;\n    flex-shrink: 0;\n    transition: all 0.25s ease;\n}\n#achiral-navigator .ach-macro-card__icon svg {\n    width: 24px;\n    height: 24px;\n    display: block;\n}\n#achiral-navigator .ach-macro-card:hover .ach-macro-card__icon {\n    background: rgba(57, 113, 255, 0.12);\n    color: var(--site-blue);\n}\n#achiral-navigator .ach-macro-card.is-selected .ach-macro-card__icon {\n    background: var(--site-blue);\n    color: #FFFFFF;\n}\n#achiral-navigator .ach-macro-card__title {\n    display: block;\n    font-size: 17px;\n    font-weight: 600;\n    color: var(--site-navy);\n    line-height: 1.3;\n    margin-bottom: 2px;\n    padding-right: 24px;\n}\n#achiral-navigator .ach-macro-card__subtitle {\n    display: block;\n    font-size: 12px;\n    font-weight: 500;\n    color: var(--site-blue);\n    line-height: 1.35;\n    margin-bottom: 14px;\n}\n#achiral-navigator .ach-macro-card__desc {\n    display: block;\n    font-size: 12.5px;\n    color: var(--site-text-muted);\n    line-height: 1.6;\n    margin-bottom: 16px;\n    display: -webkit-box;\n    -webkit-line-clamp: 3;\n    -webkit-box-orient: vertical;\n    overflow: hidden;\n}\n#achiral-navigator .ach-macro-card__includes {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 6px;\n    margin-bottom: 20px;\n}\n#achiral-navigator .ach-include-chip {\n    font-size: 10.5px;\n    background: #F1F5F9;\n    color: var(--site-text-muted);\n    padding: 3px 8px;\n    border-radius: var(--site-radius-sm);\n    border: 1px solid var(--site-border);\n    font-weight: 500;\n}\n#achiral-navigator .ach-macro-card__tag {\n    margin-top: auto;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    padding-top: 14px;\n    border-top: 1px solid var(--site-border);\n    font-size: 12.5px;\n    font-weight: 600;\n    color: var(--site-navy);\n}\n#achiral-navigator .ach-macro-card__tag i {\n    color: var(--site-blue);\n}\n#achiral-navigator .ach-macro-card.is-selected .ach-macro-card__tag {\n    color: var(--site-blue);\n}\n#achiral-navigator .ach-or {\n    display: flex;\n    align-items: center;\n    gap: 16px;\n    color: var(--site-text-faint);\n    font-size: 12px;\n    font-weight: 600;\n    text-transform: uppercase;\n    letter-spacing: 0.08em;\n    margin: 16px 0 28px;\n}\n#achiral-navigator .ach-or::before,\n#achiral-navigator .ach-or::after {\n    content: \"\";\n    flex: 1;\n    height: 1px;\n    background: var(--site-border-strong);\n}\n#achiral-navigator .ach-explore-banner {\n    position: relative;\n    background: var(--site-surface);\n    border: 1.5px dashed var(--site-border-strong);\n    border-radius: var(--site-radius-card);\n    padding: 26px 72px 26px 28px;\n    display: flex;\n    align-items: center;\n    gap: 18px;\n    cursor: pointer;\n    transition: all 0.25s ease;\n}\n#achiral-navigator .ach-explore-banner:hover {\n    border-color: var(--site-blue);\n    background: var(--site-blue-tint);\n}\n#achiral-navigator .ach-explore-banner.is-selected {\n    border-color: var(--site-blue);\n    border-style: solid;\n    background: var(--site-blue-tint);\n    box-shadow: 0 0 0 1px var(--site-blue);\n}\n#achiral-navigator .ach-explore-banner .ach-radio-dot {\n    top: 50%;\n    right: 24px;\n    margin-top: -11px;\n}\n#achiral-navigator .ach-explore-title {\n    display: block;\n    font-size: 15px;\n    font-weight: 600;\n    color: var(--site-navy);\n}\n#achiral-navigator .ach-explore-desc {\n    display: block;\n    font-size: 13px;\n    color: var(--site-text-muted);\n}\n#achiral-navigator .ach-s2-layout {\n    display: grid;\n    grid-template-columns: minmax(0, 1fr) 320px;\n    gap: 40px;\n    align-items: start;\n}\n#achiral-navigator .ach-controls-bar {\n    margin-bottom: 24px;\n    display: flex;\n    flex-wrap: wrap;\n    align-items: center;\n    justify-content: space-between;\n    gap: 12px;\n}\n#achiral-navigator .ach-tab-filters {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n}\n#achiral-navigator .ach-tab-btn {\n    padding: 7px 12px 7px 16px;\n    border-radius: var(--site-radius-pill);\n    font-size: 13px;\n    font-weight: 500;\n    cursor: pointer;\n    border: 1px solid var(--site-border);\n    background: var(--site-surface);\n    color: var(--site-text-muted);\n    transition: all 0.2s ease;\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n}\n#achiral-navigator .ach-tab-btn:hover {\n    border-color: var(--site-blue);\n    color: var(--site-navy);\n}\n#achiral-navigator .ach-tab-btn.is-active {\n    background: var(--site-navy);\n    color: #FFFFFF;\n    border-color: var(--site-navy);\n}\n#achiral-navigator .ach-tab-count {\n    font-size: 11px;\n    font-weight: 600;\n    background: var(--site-bg);\n    color: var(--site-text-muted);\n    border-radius: 10px;\n    padding: 1px 8px;\n}\n#achiral-navigator .ach-tab-btn.is-active .ach-tab-count {\n    background: rgba(255, 255, 255, 0.18);\n    color: #FFFFFF;\n}\n#achiral-navigator .ach-controls-right {\n    display: flex;\n    align-items: center;\n    flex-wrap: wrap;\n    gap: 18px;\n    width: 100%;\n}\n#achiral-navigator .ach-controls-right .ach-search-wrap {\n    flex: 1;\n    min-width: 220px;\n}\n#achiral-navigator .ach-link-btn--muted {\n    color: var(--site-text-muted);\n}\n#achiral-navigator .ach-search-wrap {\n    position: relative;\n}\n#achiral-navigator .ach-search-input {\n    padding: 9px 36px 9px 38px;\n    border-radius: var(--site-radius-pill);\n    border: 1.5px solid var(--site-border);\n    font-size: 13.5px;\n    width: 100%;\n    background: var(--site-surface);\n    font-family: var(--font-main);\n    background: var(--site-surface) url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 512 512' fill='%23707B8E'%3E%3Cpath d='M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0s208 93.1 208 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z'\/%3E%3C\/svg%3E\") no-repeat 14px center \/ 14px 14px;\n    color: var(--site-text);\n    outline: none;\n    transition: all 0.2s ease;\n    -webkit-appearance: none;\n    appearance: none;\n}\n#achiral-navigator .ach-search-input::-webkit-search-cancel-button {\n    display: none;\n}\n#achiral-navigator .ach-search-input:focus {\n    border-color: var(--site-blue);\n    box-shadow: 0 0 0 3px rgba(57, 113, 255, 0.15);\n}\n#achiral-navigator .ach-search-clear {\n    position: absolute;\n    right: 8px;\n    top: 50%;\n    transform: translateY(-50%);\n    width: 24px;\n    height: 24px;\n    border-radius: 50%;\n    border: none;\n    background: var(--site-bg);\n    color: var(--site-text-muted);\n    cursor: pointer;\n    font-size: 11px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n#achiral-navigator .ach-search-clear:hover {\n    background: var(--site-border);\n    color: var(--site-navy);\n}\n#achiral-navigator .ach-hint {\n    display: flex;\n    align-items: center;\n    gap: 14px;\n    background: var(--site-surface);\n    border: 1px solid var(--site-border);\n    border-radius: var(--site-radius);\n    padding: 16px 18px 16px 22px;\n    margin-bottom: 40px;\n    font-size: 13.5px;\n    color: var(--site-text);\n}\n#achiral-navigator .ach-hint > i {\n    color: var(--site-blue);\n    font-size: 16px;\n}\n#achiral-navigator .ach-hint__text {\n    flex: 1;\n}\n#achiral-navigator .ach-hint__text strong {\n    color: var(--site-navy);\n}\n#achiral-navigator .ach-srv-group {\n    margin-bottom: 22px;\n}\n#achiral-navigator .ach-srv-group__toggle {\n    display: flex;\n    align-items: flex-start;\n    gap: 12px;\n    background: none;\n    border: none;\n    padding: 0;\n    text-align: left;\n    font: inherit;\n    cursor: pointer;\n}\n#achiral-navigator .ach-srv-group__toggle > i {\n    margin-top: 4px;\n    font-size: 12px;\n    color: var(--site-blue);\n    transition: transform 0.2s ease;\n}\n#achiral-navigator .ach-srv-group.is-collapsed .ach-srv-group__toggle > i {\n    transform: rotate(-90deg);\n}\n#achiral-navigator .ach-srv-group.is-collapsed .ach-srv-group__head {\n    margin-bottom: 0;\n}\n#achiral-navigator .ach-srv-group__head {\n    display: flex;\n    align-items: flex-end;\n    justify-content: space-between;\n    gap: 12px;\n    align-items: center;\n    margin-bottom: 10px;\n    padding-bottom: 8px;\n    border-bottom: 1px solid var(--site-border);\n}\n#achiral-navigator .ach-srv-group__title {\n    display: block;\n    font-size: 17px;\n    font-weight: 600;\n    color: var(--site-navy);\n    line-height: 1.3;\n}\n#achiral-navigator .ach-srv-group__desc {\n    display: block;\n    font-size: 12.5px;\n    color: var(--site-text-muted);\n}\n#achiral-navigator .ach-srv-group__meta {\n    display: flex;\n    align-items: center;\n    gap: 0;\n    font-size: 12.5px;\n    color: var(--site-text-muted);\n    white-space: nowrap;\n}\n#achiral-navigator .ach-srv-group__meta strong {\n    color: var(--site-navy);\n}\n#achiral-navigator .ach-srv-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n    gap: 8px;\n}\n#achiral-navigator .ach-srv-card {\n    background: var(--site-surface);\n    border: 1.5px solid var(--site-border);\n    border-radius: var(--site-radius);\n    padding: 10px 12px;\n    min-height: 58px;\n    text-align: left;\n    font: inherit;\n    cursor: pointer;\n    transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    user-select: none;\n}\n#achiral-navigator .ach-srv-card:hover {\n    border-color: var(--site-blue);\n}\n#achiral-navigator .ach-srv-card.is-recommended {\n    border-style: dashed;\n    border-color: var(--site-blue-border);\n}\n#achiral-navigator .ach-srv-card.is-checked {\n    border-style: solid;\n    border-color: var(--site-blue);\n    background: var(--site-blue-tint);\n}\n#achiral-navigator .ach-srv-check {\n    width: 22px;\n    height: 22px;\n    border-radius: 6px;\n    border: 2px solid var(--site-border-strong);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 11px;\n    color: #FFFFFF;\n    flex-shrink: 0;\n    background: var(--site-surface);\n    transition: all 0.2s ease;\n}\n#achiral-navigator .ach-srv-card.is-checked .ach-srv-check {\n    background: var(--site-blue);\n    border-color: var(--site-blue);\n}\n#achiral-navigator .ach-srv-body {\n    flex: 1;\n    min-width: 0;\n    display: block;\n}\n#achiral-navigator .ach-srv-header {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    margin-bottom: 8px;\n    min-height: 18px;\n}\n#achiral-navigator .ach-srv-norm {\n    font-size: 11px;\n    font-weight: 500;\n    color: var(--site-text-faint);\n}\n#achiral-navigator .ach-rec-badge {\n    display: inline-block;\n    margin-top: 4px;\n    line-height: 1.4;\n    font-size: 10.5px;\n    font-weight: 600;\n    color: var(--site-blue);\n    background: rgba(57, 113, 255, 0.08);\n    padding: 2px 8px;\n    border-radius: 4px;\n    white-space: nowrap;\n}\n#achiral-navigator .ach-srv-title {\n    display: block;\n    font-weight: 600;\n    font-size: 14px;\n    color: var(--site-navy);\n    line-height: 1.35;\n}\n#achiral-navigator .ach-srv-term {\n    display: block;\n    margin-top: 2px;\n    font-size: 11.5px;\n    line-height: 1.35;\n    color: var(--site-text-faint);\n}\n#achiral-navigator .ach-srv-card.is-checked .ach-srv-term {\n    color: var(--site-text-muted);\n}\n#achiral-navigator .ach-srv-desc {\n    display: block;\n    font-size: 12.5px;\n    color: var(--site-text-muted);\n    line-height: 1.45;\n}\n#achiral-navigator .ach-srv-pfms {\n    display: flex;\n    flex-wrap: wrap;\n    align-items: center;\n    gap: 4px 10px;\n    margin-top: 14px;\n    padding-top: 12px;\n    border-top: 1px dashed var(--site-border);\n    font-size: 11.5px;\n    color: var(--site-text-muted);\n}\n#achiral-navigator .ach-srv-pfms__lbl {\n    font-size: 10.5px;\n    font-weight: 600;\n    color: var(--site-text-faint);\n}\n#achiral-navigator .ach-pfm-mini {\n    display: inline-flex;\n    align-items: center;\n    gap: 5px;\n    font-weight: 500;\n    color: color-mix(in srgb, var(--pfm-color) 75%, #000000);\n}\n#achiral-navigator .ach-pfm-mini i {\n    background: var(--pfm-color);\n}\n#achiral-navigator .ach-pfm-mini i,\n#achiral-navigator .ach-dot {\n    width: 8px;\n    height: 8px;\n    border-radius: 50%;\n    display: inline-block;\n    flex-shrink: 0;\n}\n#achiral-navigator .ach-empty {\n    text-align: center;\n    padding: 40px 24px;\n    background: var(--site-surface);\n    border: 1px dashed var(--site-border-strong);\n    border-radius: var(--site-radius-card);\n    color: var(--site-text-muted);\n}\n#achiral-navigator .ach-empty > i {\n    font-size: 22px;\n    color: var(--site-text-faint);\n    margin-bottom: 10px;\n}\n#achiral-navigator .ach-empty p {\n    margin-bottom: 16px;\n}\n#achiral-navigator .ach-live {\n    position: sticky;\n    top: var(--ach-sticky-top);\n    background: var(--site-surface);\n    border: 1px solid var(--site-border);\n    border-radius: var(--site-radius-card);\n    padding: 24px;\n    display: flex;\n    flex-direction: column;\n    gap: 20px;\n}\n#achiral-navigator .ach-live__title {\n    font-size: 16px;\n    font-weight: 600;\n    color: var(--site-navy);\n    line-height: 1.3;\n    margin-top: 2px;\n}\n#achiral-navigator .ach-live__stats {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 8px;\n}\n#achiral-navigator .ach-live__stat {\n    background: var(--site-bg);\n    border-radius: 10px;\n    padding: 10px 6px;\n    text-align: center;\n}\n#achiral-navigator .ach-live__stat b {\n    display: block;\n    font-size: 20px;\n    color: var(--site-navy);\n    font-weight: 700;\n    line-height: 1.15;\n}\n#achiral-navigator .ach-live__stat span {\n    font-size: 11px;\n    color: var(--site-text-muted);\n}\n#achiral-navigator .ach-live__list {\n    display: flex;\n    flex-direction: column;\n    gap: 8px;\n}\n#achiral-navigator .ach-live__pfm {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    padding: 10px 12px;\n    border: 1px solid color-mix(in srgb, var(--pfm-color) 30%, #FFFFFF);\n    border-radius: 10px;\n    font-size: 13px;\n    background: color-mix(in srgb, var(--pfm-color) 6%, #FFFFFF);\n}\n#achiral-navigator .ach-live__pfm.is-new {\n    animation: fadeIn 0.25s ease;\n}\n#achiral-navigator .ach-live__pfm .ach-dot {\n    width: 10px;\n    height: 10px;\n}\n#achiral-navigator .ach-live__name {\n    font-weight: 600;\n    color: var(--site-navy);\n    flex: 1;\n    min-width: 0;\n    line-height: 1.3;\n}\n#achiral-navigator .ach-live__role {\n    display: block;\n    font-size: 11px;\n    color: color-mix(in srgb, var(--pfm-color) 75%, #000000);\n    font-weight: 400;\n}\n#achiral-navigator .ach-live__empty {\n    font-size: 13px;\n    color: var(--site-text-muted);\n    text-align: center;\n    padding: 18px 12px;\n    background: var(--site-bg);\n    border-radius: 10px;\n    border: 1px dashed var(--site-border-strong);\n}\n#achiral-navigator .ach-mini-tier {\n    font-size: 10px;\n    font-weight: 600;\n    padding: 2px 8px;\n    border-radius: var(--site-radius-pill);\n    white-space: nowrap;\n}\n#achiral-navigator .ach-mini-tier--core {\n    background: var(--site-navy-tint);\n    color: var(--site-navy);\n    border: 1px solid var(--site-navy-border);\n}\n#achiral-navigator .ach-mini-tier--opt {\n    background: var(--site-bg);\n    color: var(--site-text-muted);\n    border: 1px solid var(--site-border-strong);\n}\n#achiral-navigator .ach-live__more {\n    font-size: 12px;\n    color: var(--site-text-muted);\n    padding: 6px 2px 0;\n}\n#achiral-navigator .ach-mini-tier--supp {\n    background: rgba(68, 184, 173, 0.15);\n    color: var(--ach-teal-text);\n    border: 1px solid rgba(68, 184, 173, 0.40);\n}\n#achiral-navigator .ach-results-layout {\n    display: grid;\n    grid-template-columns: minmax(0, 1.85fr) minmax(0, 1.15fr);\n    gap: 40px;\n    align-items: start;\n}\n#achiral-navigator .ach-sec-title {\n    font-size: 20px;\n    font-weight: 600;\n    color: var(--site-navy);\n    line-height: 1.3;\n    margin: var(--space-40) 0 var(--space-16);\n}\n#achiral-navigator .ach-sec-title:first-child {\n    margin-top: 0;\n}\n#achiral-navigator .ach-sec-title small {\n    display: block;\n    margin-top: 2px;\n    font-size: 13px;\n    font-weight: 500;\n    color: var(--site-text-muted);\n}\n#achiral-navigator .ach-optional {\n    margin-top: 24px;\n}\n#achiral-navigator .ach-optional__toggle {\n    width: 100%;\n    justify-content: center;\n    border-style: dashed;\n}\n#achiral-navigator .ach-optional__note {\n    font-size: 13px;\n    color: var(--site-text-muted);\n    margin: 16px 0 12px;\n}\n#achiral-navigator .ach-platform-action {\n    margin-top: 12px;\n    align-self: flex-start;\n}\n#achiral-navigator .ach-platforms-list {\n    display: flex;\n    flex-direction: column;\n    gap: var(--space-24);\n}\n#achiral-navigator .ach-platform-card {\n    background: var(--site-surface);\n    border: 1px solid var(--site-border);\n    border-radius: var(--site-radius-card);\n    padding: var(--space-24);\n    display: flex;\n    flex-direction: column;\n    gap: var(--space-8);\n    transition: all 0.25s ease;\n}\n#achiral-navigator .ach-platform-card:hover {\n}\n#achiral-navigator .ach-platform-top {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: var(--space-16);\n}\n#achiral-navigator .ach-platform-name {\n    font-size: 20px;\n    font-weight: 700;\n    color: var(--site-navy);\n    letter-spacing: -0.01em;\n    display: inline-flex;\n    align-items: center;\n    gap: 10px;\n}\n#achiral-navigator .ach-platform-role {\n    font-size: 13px;\n    font-weight: 600;\n    color: color-mix(in srgb, var(--pfm-color) 75%, #000000);\n}\n#achiral-navigator .ach-platform-narrative {\n    font-size: 14px;\n    color: var(--site-text-muted);\n    line-height: 1.55;\n}\n#achiral-navigator .ach-platform-trigger {\n    font-size: 12.5px;\n    background: transparent;\n    border-radius: var(--site-radius-sm);\n    color: var(--site-text-muted);\n    margin-top: 8px;\n}\n#achiral-navigator .ach-platform-trigger summary {\n    cursor: pointer;\n    list-style: none;\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n    color: var(--site-blue);\n    font-weight: 500;\n}\n#achiral-navigator .ach-platform-trigger summary::-webkit-details-marker { display: none; }\n#achiral-navigator .ach-platform-trigger summary::after {\n    content: \"\";\n    width: 10px;\n    height: 10px;\n    background-color: currentColor;\n    -webkit-mask: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 512 512'%3E%3Cpath d='M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z'\/%3E%3C\/svg%3E\") no-repeat center \/ contain;\n    mask: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 512 512'%3E%3Cpath d='M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z'\/%3E%3C\/svg%3E\") no-repeat center \/ contain;\n    transition: transform 0.2s ease;\n}\n#achiral-navigator .ach-platform-trigger[open] summary::after {\n    transform: rotate(180deg);\n}\n#achiral-navigator .ach-platform-trigger[open] .ach-trigger-chips {\n    margin-top: 10px;\n}\n#achiral-navigator .ach-platform-trigger strong {\n    color: var(--site-navy);\n    font-weight: 600;\n}\n#achiral-navigator .ach-trigger-chips {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n    margin-top: 10px;\n}\n#achiral-navigator .ach-trigger-chip {\n    font-size: 12px;\n    padding: 4px 10px;\n    border-radius: var(--site-radius-sm);\n    background: color-mix(in srgb, var(--pfm-color) 12%, #FFFFFF);\n    border: 1px solid color-mix(in srgb, var(--pfm-color) 40%, #FFFFFF);\n    color: var(--site-navy);\n    font-weight: 500;\n}\n#achiral-navigator .ach-summary-panel {\n    background: var(--site-surface);\n    border: 1px solid var(--site-border);\n    border-radius: var(--site-radius-card);\n    padding: var(--space-32);\n    display: flex;\n    flex-direction: column;\n    gap: var(--space-32);\n    position: sticky;\n    top: var(--ach-sticky-top);\n    margin-top: calc(20px * 1.3 + var(--space-20));\n}\n#achiral-navigator .ach-panel-block h3 {\n    font-size: 16px;\n    font-weight: 600;\n    color: var(--site-navy);\n    margin-bottom: var(--space-16);\n}\n#achiral-navigator .ach-panel-block__desc {\n    font-size: 13px;\n    color: var(--site-text-muted);\n    line-height: 1.5;\n    margin: -8px 0 var(--space-16);\n}\n#achiral-navigator .ach-flows {\n    display: flex;\n    flex-direction: column;\n    gap: var(--space-12);\n}\n#achiral-navigator .ach-flow {\n    background: color-mix(in srgb, var(--pfm-color) 5%, #FFFFFF);\n    border: 1px solid color-mix(in srgb, var(--pfm-color) 25%, #FFFFFF);\n    border-radius: var(--site-radius);\n    padding: 14px 16px;\n}\n#achiral-navigator .ach-flow__path {\n    display: flex;\n    flex-wrap: wrap;\n    align-items: center;\n    gap: 8px;\n    margin-bottom: 10px;\n}\n#achiral-navigator .ach-flow-pill {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n    font-size: 12px;\n    font-weight: 600;\n    color: color-mix(in srgb, var(--pfm-color) 75%, #000000);\n    background: var(--site-surface);\n    border: 1px solid color-mix(in srgb, var(--pfm-color) 45%, #FFFFFF);\n    border-radius: var(--site-radius-pill);\n    padding: 3px 10px;\n}\n#achiral-navigator .ach-flow-pill i {\n    width: 8px;\n    height: 8px;\n    border-radius: 50%;\n    background: var(--pfm-color);\n}\n#achiral-navigator .ach-flow__arrow {\n    font-size: 11px;\n    color: var(--site-text-faint);\n}\n#achiral-navigator .ach-flow__scope {\n    font-size: 11.5px;\n    color: var(--site-text-faint);\n}\n#achiral-navigator .ach-flow__title {\n    font-size: 13.5px;\n    font-weight: 600;\n    color: var(--site-navy);\n    margin-bottom: 4px;\n}\n#achiral-navigator .ach-flow__text {\n    font-size: 13px;\n    color: var(--site-text-muted);\n    line-height: 1.6;\n}\n#achiral-navigator .ach-flow__text strong {\n    color: var(--site-navy);\n    font-weight: 600;\n}\n#achiral-navigator .ach-flow-empty {\n    font-size: 13px;\n    color: var(--site-text-muted);\n}\n#achiral-navigator .ach-comp-badge {\n    display: inline-block;\n    font-size: 11.5px;\n    font-weight: 500;\n    background: var(--site-navy-tint);\n    color: var(--site-navy);\n    padding: 4px 10px;\n    border-radius: var(--site-radius-sm);\n    margin: 3px;\n    border: 1px solid var(--site-navy-border);\n}\n#achiral-navigator .ach-comp-badge i {\n    font-size: 10px;\n    margin-right: 5px;\n    opacity: 0.85;\n}\n#achiral-navigator .ach-step4-grid {\n    display: grid;\n    grid-template-columns: 1fr 1.3fr;\n    gap: 40px;\n}\n#achiral-navigator .ach-spec-sheet,\n#achiral-navigator .ach-contact-form-card {\n    background: var(--site-surface);\n    border: 1px solid var(--site-border);\n    border-radius: var(--site-radius-card);\n    padding: var(--space-40);\n}\n#achiral-navigator .ach-spec-sheet__head {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 12px;\n    margin-bottom: var(--space-24);\n    border-bottom: 1px solid var(--site-border);\n    padding-bottom: var(--space-12);\n}\n#achiral-navigator .ach-spec-sheet h3 {\n    font-size: 20px;\n    font-weight: 600;\n    color: var(--site-navy);\n}\n#achiral-navigator .ach-spec-row {\n    margin-bottom: var(--space-24);\n}\n#achiral-navigator .ach-spec-label {\n    font-size: 11px;\n    color: var(--site-text-faint);\n    font-weight: 600;\n    margin-bottom: 4px;\n}\n#achiral-navigator .ach-spec-val {\n    font-weight: 600;\n    font-size: 16px;\n    color: var(--site-navy);\n}\n#achiral-navigator .ach-spec-chips {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n    margin-top: 8px;\n}\n#achiral-navigator .ach-chip-toggle {\n    padding: 4px 10px;\n    border: 1px dashed var(--site-blue-border);\n    border-radius: var(--site-radius-sm);\n    line-height: 1.35;\n    background: transparent;\n    color: var(--site-blue);\n    font: inherit;\n    font-size: 12px;\n    font-weight: 600;\n    cursor: pointer;\n}\n#achiral-navigator .ach-chip-toggle:hover {\n    border-color: var(--site-blue);\n}\n#achiral-navigator .ach-spec-chip {\n    font-size: 12px;\n    line-height: 1.35;\n    padding: 4px 10px;\n    border-radius: var(--site-radius-sm);\n    background: var(--site-bg);\n    color: var(--site-navy);\n    border: 1px solid var(--site-border);\n    font-weight: 500;\n    overflow-wrap: break-word;\n}\n#achiral-navigator .ach-spec-chip--pfm {\n    background: color-mix(in srgb, var(--pfm-color) 10%, #FFFFFF);\n    border-color: color-mix(in srgb, var(--pfm-color) 40%, #FFFFFF);\n    font-weight: 600;\n}\n#achiral-navigator .ach-spec-chip--comp {\n    background: var(--ach-mint-tint);\n    color: #146B6B;\n    border-color: var(--ach-mint-border);\n    font-weight: 600;\n}\n#achiral-navigator .ach-spec-actions {\n    margin-top: var(--space-24);\n    display: flex;\n    flex-wrap: wrap;\n    gap: var(--space-8);\n}\n#achiral-navigator .ach-contact-form-card h3 {\n    font-size: 22px;\n    font-weight: 600;\n    color: var(--site-navy);\n    margin-bottom: 6px;\n}\n#achiral-navigator .ach-cobalt-frame {\n    display: block;\n    width: 100%;\n    min-height: 760px;\n    border: 0;\n    overflow: hidden;\n    overflow-anchor: none;\n    margin-top: var(--space-16);\n}\n#achiral-navigator .ach-toast-msg {\n    position: fixed;\n    left: 0;\n    right: 0;\n    bottom: 24px;\n    width: fit-content;\n    max-width: calc(100vw - 32px);\n    margin: 0 auto;\n    background: var(--site-navy);\n    color: #FFFFFF;\n    padding: 8px 16px;\n    border-radius: var(--site-radius-pill);\n    box-shadow: var(--site-shadow-overlay);\n    font-size: 13px;\n    font-weight: 500;\n    display: none;\n    align-items: center;\n    gap: 8px;\n    z-index: 10000;\n    animation: slideInToast 0.25s ease;\n}\n#achiral-navigator .ach-toast-msg.is-visible {\n    display: flex;\n}\n#achiral-navigator .ach-toast-msg i {\n    font-size: 14px;\n}\n@keyframes slideInToast {\n    from { transform: translateY(100%); opacity: 0; }\n    to { transform: translateY(0); opacity: 1; }\n}\n@media (max-width: 1100px) {\n    #achiral-navigator .ach-macro-grid {\n        grid-template-columns: repeat(2, 1fr);\n        gap: 16px;\n    }\n}\n@media (max-width: 1024px) {\n    #achiral-navigator .ach-s2-layout {\n        grid-template-columns: 1fr;\n    }\n    #achiral-navigator .ach-live {\n        display: none;\n    }\n    #achiral-navigator .ach-results-layout {\n        grid-template-columns: minmax(0, 1fr);\n    }\n    #achiral-navigator .ach-summary-panel {\n        position: static;\n        margin-top: 0;\n    }\n}\n@media (max-width: 900px) {\n    #achiral-navigator .ach-intro {\n        padding: var(--space-32) 16px var(--space-24);\n    }\n    #achiral-navigator .ach-step4-grid {\n        grid-template-columns: 1fr;\n    }\n}\n@media (max-width: 720px) {\n    #achiral-navigator .ach-content-container {\n        padding: 0 16px 40px;\n    }\n    #achiral-navigator .ach-stepper-wrap {\n        padding: var(--space-32) 0 10px;\n        margin-bottom: 28px;\n    }\n    #achiral-navigator .ach-stepper {\n        padding: 0 16px;\n    }\n    #achiral-navigator .ach-stepper-track {\n        left: calc(16px + (100% - 32px) \/ 8);\n        right: calc(16px + (100% - 32px) \/ 8);\n    }\n    #achiral-navigator .ach-step-text {\n        font-size: 11px;\n    }\n    #achiral-navigator .ach-step-btn:not(.is-active) .ach-step-text {\n        display: none;\n    }\n    #achiral-navigator .ach-h1 {\n        font-size: 28px;\n    }\n    #achiral-navigator .ach-h2 {\n        font-size: 25px;\n    }\n    #achiral-navigator .ach-lead-text {\n        font-size: 14.5px;\n    }\n    #achiral-navigator .ach-intro {\n        padding: 40px 16px;\n    }\n    #achiral-navigator .ach-intro__title {\n        font-size: 28px;\n    }\n    #achiral-navigator .ach-section-header {\n        margin-bottom: 24px;\n        padding: 24px 16px;\n    }\n    #achiral-navigator .ach-macro-grid {\n        grid-template-columns: 1fr;\n    }\n    #achiral-navigator .ach-explore-banner {\n        padding: 16px 56px 16px 16px;\n    }\n    #achiral-navigator .ach-controls-bar,\n#achiral-navigator .ach-controls-right {\n        flex-direction: column;\n        align-items: stretch;\n    }\n    #achiral-navigator .ach-search-input {\n        width: 100%;\n    }\n    #achiral-navigator .ach-hint {\n        flex-direction: column;\n        align-items: flex-start;\n    }\n    #achiral-navigator .ach-srv-group__head {\n        flex-direction: column;\n        align-items: flex-start;\n    }\n    #achiral-navigator .ach-srv-grid {\n        grid-template-columns: 1fr;\n    }\n    #achiral-navigator .ach-platform-top {\n        flex-direction: column;\n        align-items: flex-start;\n        gap: 6px;\n    }\n    #achiral-navigator .ach-spec-sheet,\n#achiral-navigator .ach-contact-form-card {\n        padding: 20px;\n    }\n    #achiral-navigator .ach-actionbar {\n        flex-wrap: wrap;\n        padding: 12px;\n        gap: 10px;\n    }\n    #achiral-navigator .ach-actionbar__info {\n        flex-basis: 100%;\n        order: -1;\n        font-size: 13px;\n    }\n    #achiral-navigator .ach-actionbar__actions {\n        flex: 1;\n    }\n    #achiral-navigator .ach-actionbar__actions .ach-btn {\n        flex: 1;\n        padding: 11px 14px;\n    }\n    #achiral-navigator .ach-hide-sm {\n        display: none;\n    }\n}\n@media (prefers-reduced-motion: reduce) {\n    #achiral-navigator *,\n#achiral-navigator *::before,\n#achiral-navigator *::after {\n        animation-duration: 0.01ms !important;\n        transition-duration: 0.01ms !important;\n    }\n}\n#achiral-navigator .ach-platform-name::before {\n    content: \"\";\n    width: 10px;\n    height: 10px;\n    border-radius: 50%;\n    background: var(--pfm-color, var(--site-blue));\n    flex-shrink: 0;\n}\n#achiral-navigator .ach-print-report {\n    display: none;\n}\n@media print {\n    #achiral-navigator { width: auto; margin-inline: 0; }\n    @page {\n        size: A4 portrait;\n        margin: 16mm 16mm 20mm;\n        @bottom-left {\n            content: \"We4 Healthcare S.r.l. \u00b7 aChiral \u00b7 info@achiral.it \u00b7 achiral.it\";\n            font-family: 'Poppins', sans-serif;\n            font-size: 8pt;\n            color: #808080;\n            vertical-align: top;\n            padding-top: 6mm;\n        }\n        @bottom-right {\n            font-family: 'Poppins', sans-serif;\n            font-size: 8pt;\n            color: #808080;\n            vertical-align: top;\n            padding-top: 6mm;\n        }\n    }\n    body *:not(:has(#achPrintReport)):not(#achPrintReport, #achPrintReport *) {\n        display: none !important;\n    }\n    body *:has(#achPrintReport) {\n        margin: 0 !important;\n        padding: 0 !important;\n        border: 0 !important;\n        box-shadow: none !important;\n        background: none !important;\n    }\n    html,\nbody {\n        background: #FFFFFF !important;\n        color: #2E2E2E;\n        font-size: 10pt;\n        line-height: 1.55;\n        -webkit-print-color-adjust: exact;\n        print-color-adjust: exact;\n    }\n    #achiral-navigator .ach-stepper-wrap,\n#achiral-navigator .ach-view-step,\n#achiral-navigator .ach-toast-msg {\n        display: none !important;\n    }\n    #achiral-navigator .ach-content-container {\n        padding: 0;\n    }\n    #achiral-navigator .ach-print-report {\n        display: block;\n    }\n    #achiral-navigator .ach-print-report p {\n        margin: 0;\n    }\n    #achiral-navigator .ach-pr-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        padding-bottom: 14pt;\n        border-bottom: 1.5pt solid var(--site-navy);\n        margin-bottom: 16pt;\n    }\n    #achiral-navigator .ach-pr-logo {\n        height: 28pt;\n        width: auto;\n    }\n    #achiral-navigator .ach-pr-header__meta {\n        text-align: right;\n        font-size: 9pt;\n        color: var(--site-text-muted);\n    }\n    #achiral-navigator .ach-pr-header__title {\n        font-size: 10.5pt;\n        font-weight: 600;\n        color: var(--site-navy);\n    }\n    #achiral-navigator .ach-pr-intro {\n        margin-bottom: 20pt;\n    }\n    #achiral-navigator .ach-pr-label {\n        font-size: 8.5pt;\n        font-weight: 600;\n        color: var(--site-text-faint);\n        margin-bottom: 4pt;\n    }\n    #achiral-navigator .ach-pr-h1 {\n        font-size: 20pt;\n        font-weight: 700;\n        color: var(--site-navy);\n        line-height: 1.2;\n        margin-bottom: 8pt;\n    }\n    #achiral-navigator .ach-pr-h1 span {\n        display: block;\n        font-size: 11pt;\n        font-weight: 500;\n        color: var(--site-text-muted);\n        margin-top: 3pt;\n    }\n    #achiral-navigator .ach-pr-intro > p {\n        color: var(--site-text-muted);\n        max-width: 150mm;\n    }\n    #achiral-navigator .ach-pr-kpis {\n        display: grid;\n        grid-template-columns: repeat(4, 1fr);\n        gap: 10pt;\n        margin-top: 16pt;\n    }\n    #achiral-navigator .ach-pr-kpis div {\n        background: var(--site-bg);\n        border-radius: 8pt;\n        padding: 8pt 10pt;\n    }\n    #achiral-navigator .ach-pr-kpis b {\n        display: block;\n        font-size: 16pt;\n        font-weight: 700;\n        color: var(--site-navy);\n        line-height: 1.1;\n    }\n    #achiral-navigator .ach-pr-kpis span {\n        font-size: 8.5pt;\n        color: var(--site-text-muted);\n    }\n    #achiral-navigator .ach-pr-label--comp {\n        margin-top: 12pt;\n        margin-bottom: 6pt;\n    }\n    #achiral-navigator .ach-pr-keep {\n        break-inside: avoid;\n    }\n    #achiral-navigator .ach-pr-link {\n        display: block;\n        margin-top: 6pt;\n        font-size: 8pt;\n        color: var(--site-text-muted);\n        word-break: break-all;\n    }\n    #achiral-navigator .ach-pr-table td b {\n        color: var(--site-navy);\n        font-weight: 600;\n    }\n    #achiral-navigator .ach-pr-section {\n        margin-bottom: 14pt;\n    }\n    #achiral-navigator .ach-pr-h2 {\n        display: flex;\n        align-items: center;\n        gap: 8pt;\n        font-size: 13pt;\n        font-weight: 600;\n        color: var(--site-navy);\n        padding-bottom: 5pt;\n        border-bottom: 1pt solid var(--site-border);\n        margin-bottom: 7pt;\n        break-after: avoid;\n    }\n    #achiral-navigator .ach-pr-num {\n        width: 18pt;\n        height: 18pt;\n        border-radius: 50%;\n        background: var(--site-navy);\n        color: #FFFFFF;\n        font-size: 9pt;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n    }\n    #achiral-navigator .ach-pr-lead {\n        font-size: 9.5pt;\n        color: var(--site-text-muted);\n        margin-bottom: 8pt !important;\n        break-after: avoid;\n    }\n    #achiral-navigator .ach-pr-lead strong {\n        color: var(--site-navy);\n    }\n    #achiral-navigator .ach-pr-h3 {\n        font-size: 11.5pt;\n        font-weight: 600;\n        color: var(--site-navy);\n        margin: 4pt 0 10pt;\n        break-after: avoid;\n    }\n    #achiral-navigator .ach-pr-h3 span {\n        font-size: 9pt;\n        font-weight: 400;\n        color: var(--site-text-faint);\n        margin-left: 4pt;\n    }\n    #achiral-navigator .ach-pr-group + .ach-pr-group {\n        margin-top: 12pt;\n    }\n    #achiral-navigator .ach-pr-dot {\n        width: 7pt;\n        height: 7pt;\n        border-radius: 50%;\n        background: var(--pfm-color);\n        display: inline-block;\n        flex-shrink: 0;\n    }\n    #achiral-navigator .ach-pr-pfm {\n        border: 1pt solid var(--site-border);\n        border-radius: 8pt;\n        padding: 8pt 11pt;\n        margin-bottom: 6pt;\n        break-inside: avoid;\n    }\n    #achiral-navigator .ach-pr-pfm__head {\n        display: flex;\n        align-items: center;\n        gap: 7pt;\n        margin-bottom: 3pt;\n    }\n    #achiral-navigator .ach-pr-pfm__name {\n        font-size: 11pt;\n        font-weight: 700;\n        color: var(--site-navy);\n    }\n    #achiral-navigator .ach-pr-pfm__role {\n        font-size: 9pt;\n        font-weight: 500;\n        color: var(--site-text-faint);\n    }\n    #achiral-navigator .ach-pr-pfm__desc {\n        font-size: 9pt;\n        color: var(--site-text-muted);\n        margin-bottom: 4pt !important;\n    }\n    #achiral-navigator .ach-pr-pfm__for {\n        font-size: 8.5pt;\n        color: var(--site-text-muted);\n    }\n    #achiral-navigator .ach-pr-pfm__for b {\n        color: var(--site-navy);\n        font-weight: 600;\n    }\n    #achiral-navigator .ach-pr-flows {\n        display: grid;\n        grid-template-columns: 1fr 1fr;\n        gap: 8pt;\n    }\n    #achiral-navigator .ach-pr-flow {\n        border: 1pt solid var(--site-border);\n        border-radius: 8pt;\n        padding: 8pt 11pt;\n        break-inside: avoid;\n    }\n    #achiral-navigator .ach-pr-flow__path {\n        font-size: 8.5pt;\n        font-weight: 600;\n        color: var(--site-text-faint);\n        margin-bottom: 4pt;\n    }\n    #achiral-navigator .ach-pr-flow__title {\n        font-size: 10pt;\n        font-weight: 600;\n        color: var(--site-navy);\n        margin-bottom: 3pt;\n    }\n    #achiral-navigator .ach-pr-flow__text {\n        font-size: 8.5pt;\n        color: var(--site-text-muted);\n        line-height: 1.45;\n    }\n    #achiral-navigator .ach-pr-flow__text strong {\n        color: var(--site-navy);\n        font-weight: 600;\n    }\n    #achiral-navigator .ach-pr-table {\n        width: 100%;\n        border-collapse: collapse;\n        font-size: 9pt;\n    }\n    #achiral-navigator .ach-pr-table th {\n        text-align: left;\n        font-size: 8.5pt;\n        font-weight: 600;\n        color: var(--site-text-faint);\n        padding: 0 8pt 6pt 0;\n        border-bottom: 1pt solid var(--site-border-strong);\n    }\n    #achiral-navigator .ach-pr-table td {\n        padding: 5pt 8pt 5pt 0;\n        border-bottom: 0.75pt solid var(--site-border);\n        vertical-align: top;\n        color: var(--site-text-muted);\n    }\n    #achiral-navigator .ach-pr-table td strong {\n        color: var(--site-navy);\n        font-weight: 600;\n    }\n    #achiral-navigator .ach-pr-table td:first-child {\n        width: 34%;\n    }\n    #achiral-navigator .ach-pr-table td:last-child {\n        width: 30%;\n    }\n    #achiral-navigator .ach-pr-table tr {\n        break-inside: avoid;\n    }\n    #achiral-navigator .ach-pr-table__cat td {\n        padding-top: 9pt;\n        font-size: 9.5pt;\n        font-weight: 600;\n        color: var(--site-navy);\n        border-bottom: none;\n    }\n    #achiral-navigator .ach-pr-comp {\n        display: flex;\n        flex-wrap: wrap;\n        gap: 5pt;\n    }\n    #achiral-navigator .ach-pr-comp span {\n        font-size: 8.5pt;\n        font-weight: 500;\n        color: var(--site-navy);\n        border: 0.75pt solid var(--site-border-strong);\n        border-radius: 4pt;\n        padding: 2pt 8pt;\n    }\n    #achiral-navigator .ach-pr-next {\n        border: 1pt solid var(--site-border-strong);\n        border-radius: 8pt;\n        padding: 7pt 11pt;\n        font-size: 9pt;\n        color: var(--site-text);\n        break-inside: avoid;\n    }\n    #achiral-navigator .ach-pr-next strong {\n        color: var(--site-navy);\n        font-size: 9pt;\n    }\n    #achiral-navigator .ach-pr-note {\n        font-style: normal;\n        font-size: 8.5pt;\n        color: var(--site-text-faint);\n    }\n}\n#achiral-navigator .ach-extra-req {\n    margin-top: 12px;\n    font-size: 12.5px;\n    color: var(--site-text-muted);\n}\n#achiral-navigator .ach-extra-req__list {\n    display: flex;\n    flex-direction: column;\n    gap: 6px;\n    margin-top: 6px;\n}\n#achiral-navigator .ach-extra-req__item {\n    display: flex;\n    align-items: flex-start;\n    gap: 8px;\n    width: 100%;\n    padding: 8px 10px;\n    text-align: left;\n    font: inherit;\n    color: var(--site-navy);\n    background: var(--site-surface);\n    border: 1px dashed var(--site-border-strong);\n    border-radius: var(--site-radius-sm);\n    cursor: pointer;\n}\n#achiral-navigator .ach-extra-req__item:hover,\n#achiral-navigator .ach-extra-req__item:focus-visible {\n    border-color: var(--site-blue);\n    background: var(--site-blue-tint);\n}\n#achiral-navigator .ach-extra-req__item i {\n    margin-top: 3px;\n    color: var(--site-blue);\n}\n#achiral-navigator .ach-extra-req__item small {\n    display: block;\n    color: var(--site-text-muted);\n    font-size: 11.5px;\n}\n#achiral-navigator .ach-sum-pfms {\n    display: flex;\n    flex-direction: column;\n    gap: 10px;\n    margin-top: 8px;\n}\n#achiral-navigator .ach-sum-pfm {\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n    gap: 4px;\n}\n#achiral-navigator .ach-sum-pfm__reqs {\n    display: -webkit-box;\n    -webkit-box-orient: vertical;\n    -webkit-line-clamp: 2;\n    overflow: hidden;\n    font-size: 12px;\n    line-height: 1.45;\n    color: var(--site-text-muted);\n    padding-left: 10px;\n}\n<\/style>\n<div id=\"achiral-navigator\" data-no-translation>\n\n        <section class=\"ach-intro\" aria-labelledby=\"achIntroTitle\">\n        <div class=\"ach-intro__inner\">\n            <span class=\"ach-intro__label\" data-i18n=\"intro.eyebrow\"><span class=\"ach-pre ach-pre--it\">Configuratore dell'ecosistema<\/span><span class=\"ach-pre ach-pre--en\">Ecosystem configurator<\/span><\/span>\n            <h2 class=\"ach-intro__title\" id=\"achIntroTitle\" data-i18n=\"intro.title\"><span class=\"ach-pre ach-pre--it\">Costruisci il tuo <strong>ecosistema aChiral<\/strong><\/span><span class=\"ach-pre ach-pre--en\">Build your <strong>aChiral ecosystem<\/strong><\/span><\/h2>\n            <p class=\"ach-intro__lead\" data-i18n=\"intro.lead\"><span class=\"ach-pre ach-pre--it\">aChiral \u00e8 un ecosistema modulare di piattaforme per la ricerca clinica e la sanit\u00e0: rispondi a poche domande sulla tua organizzazione e sui dati che gestisci, e ti mostriamo quali piattaforme ti servono, come dialogano tra loro e quali normative coprono.<\/span><span class=\"ach-pre ach-pre--en\">aChiral is a modular ecosystem of platforms for clinical research and healthcare: answer a few questions about your organisation and the data you handle, and we show you which platforms you need, how they work together and which regulations they cover.<\/span><\/p>\n        <\/div>\n    <\/section>\n\n    <nav class=\"ach-stepper-wrap\" data-i18n-aria-label=\"nav.label\">\n        <div class=\"ach-stepper\">\n            <div class=\"ach-stepper-track\" aria-hidden=\"true\">\n                <div class=\"ach-stepper-progress\" id=\"stepperProgress\"><\/div>\n            <\/div>\n            <button type=\"button\" class=\"ach-step-btn is-active\" id=\"stepIndicator1\" data-step=\"1\">\n                <span class=\"ach-step-num\">01<\/span>\n                <span class=\"ach-step-text\" data-i18n=\"nav.step1\"><span class=\"ach-pre ach-pre--it\">Profilo<\/span><span class=\"ach-pre ach-pre--en\">Profile<\/span><\/span>\n            <\/button>\n            <button type=\"button\" class=\"ach-step-btn\" id=\"stepIndicator2\" data-step=\"2\" disabled>\n                <span class=\"ach-step-num\">02<\/span>\n                <span class=\"ach-step-text\" data-i18n=\"nav.step2\"><span class=\"ach-pre ach-pre--it\">Requisiti<\/span><span class=\"ach-pre ach-pre--en\">Requirements<\/span><\/span>\n            <\/button>\n            <button type=\"button\" class=\"ach-step-btn\" id=\"stepIndicator3\" data-step=\"3\" disabled>\n                <span class=\"ach-step-num\">03<\/span>\n                <span class=\"ach-step-text\" data-i18n=\"nav.step3\"><span class=\"ach-pre ach-pre--it\">Piattaforme aChiral<\/span><span class=\"ach-pre ach-pre--en\">aChiral platforms<\/span><\/span>\n            <\/button>\n            <button type=\"button\" class=\"ach-step-btn\" id=\"stepIndicator4\" data-step=\"4\" disabled>\n                <span class=\"ach-step-num\">04<\/span>\n                <span class=\"ach-step-text\" data-i18n=\"nav.step4\"><span class=\"ach-pre ach-pre--it\">Riepilogo & Contatto<\/span><span class=\"ach-pre ach-pre--en\">Summary & Contact<\/span><\/span>\n            <\/button>\n        <\/div>\n    <\/nav>\n\n    <div class=\"ach-content-container\">\n\n                <section class=\"ach-view-step is-visible\" id=\"stepView1\" aria-labelledby=\"step1Title\">\n            <header class=\"ach-section-header\">\n                <span class=\"ach-tag-label\" data-i18n=\"step1.eyebrow\"><span class=\"ach-pre ach-pre--it\">Passo 1 di 4 \u00b7 Profilo<\/span><span class=\"ach-pre ach-pre--en\">Step 1 of 4 \u00b7 Profile<\/span><\/span>\n                <h1 class=\"ach-h1\" id=\"step1Title\" tabindex=\"-1\" data-i18n=\"step1.title\"><span class=\"ach-pre ach-pre--it\">Che tipo di <strong>organizzazione<\/strong> sei?<\/span><span class=\"ach-pre ach-pre--en\">What kind of <strong>organisation<\/strong> are you?<\/span><\/h1>\n                <p class=\"ach-lead-text\" data-i18n=\"step1.lead\"><span class=\"ach-pre ach-pre--it\">Scegli il profilo pi\u00f9 vicino alla tua realt\u00e0: ti prepariamo una selezione iniziale di requisiti, che potrai cambiare al passo successivo.<\/span><span class=\"ach-pre ach-pre--en\">Pick the profile closest to yours: we prepare a starting selection of requirements that you can change in the next step.<\/span><\/p>\n            <\/header>\n\n            <div class=\"ach-macro-grid\" id=\"macroGrid\"><\/div>\n\n            <div class=\"ach-or\" data-i18n=\"step1.or\"><span class=\"ach-pre ach-pre--it\">oppure<\/span><span class=\"ach-pre ach-pre--en\">or<\/span><\/div>\n\n            <button type=\"button\" class=\"ach-explore-banner\" id=\"exploreBanner\" aria-pressed=\"false\">\n                <span>\n                    <span class=\"ach-explore-title\" data-i18n=\"step1.noProfile\"><span class=\"ach-pre ach-pre--it\">Nessun profilo<\/span><span class=\"ach-pre ach-pre--en\">No profile<\/span><\/span>\n                    <span class=\"ach-explore-desc\" data-i18n=\"step1.noProfileDesc\"><span class=\"ach-pre ach-pre--it\">Parti da zero e scegli tu i requisiti.<\/span><span class=\"ach-pre ach-pre--en\">Start from scratch and choose the requirements yourself.<\/span><\/span>\n                <\/span>\n                <span class=\"ach-radio-dot\" aria-hidden=\"true\"><i class=\"ach-ico ach-ico--check\"><\/i><\/span>\n            <\/button>\n\n            <div class=\"ach-actionbar\">\n                <div class=\"ach-actionbar__info\" id=\"s1Info\" aria-live=\"polite\"><\/div>\n                <div class=\"ach-actionbar__actions\">\n                    <button type=\"button\" class=\"ach-btn ach-btn--primary\" id=\"btnStep1Next\" disabled>\n                        <span data-i18n=\"step1.next\"><span class=\"ach-pre ach-pre--it\">Continua<\/span><span class=\"ach-pre ach-pre--en\">Continue<\/span><\/span> <i class=\"ach-ico ach-ico--arrow-right\" aria-hidden=\"true\"><\/i>\n                    <\/button>\n                <\/div>\n            <\/div>\n        <\/section>\n\n                <section class=\"ach-view-step\" id=\"stepView2\" aria-labelledby=\"step2Title\">\n            <header class=\"ach-section-header\">\n                <span class=\"ach-tag-label\" data-i18n=\"step2.eyebrow\"><span class=\"ach-pre ach-pre--it\">Passo 2 di 4 \u00b7 Requisiti<\/span><span class=\"ach-pre ach-pre--en\">Step 2 of 4 \u00b7 Requirements<\/span><\/span>\n                <h2 class=\"ach-h2\" id=\"step2Title\" tabindex=\"-1\" data-i18n=\"step2.title\"><span class=\"ach-pre ach-pre--it\">Cosa deve <strong>gestire<\/strong> il progetto?<\/span><span class=\"ach-pre ach-pre--en\">What does the project need to <strong>manage<\/strong>?<\/span><\/h2>\n                <p class=\"ach-lead-text\" id=\"step2Subtitle\"><\/p>\n            <\/header>\n\n            <div class=\"ach-s2-layout\">\n                <div>\n                    <div class=\"ach-controls-bar\">\n                        <div class=\"ach-controls-right\">\n                            <div class=\"ach-search-wrap\">\n                                <label for=\"serviceSearch\" class=\"ach-sr-only\" data-i18n=\"step2.searchLabel\"><span class=\"ach-pre ach-pre--it\">Cerca un requisito<\/span><span class=\"ach-pre ach-pre--en\">Search a requirement<\/span><\/label>\n                                <input type=\"search\" class=\"ach-search-input\" id=\"serviceSearch\" autocomplete=\"off\" data-i18n-placeholder=\"step2.searchPlaceholder\">\n                                <button type=\"button\" class=\"ach-search-clear\" id=\"btnSearchClear\" data-i18n-aria-label=\"step2.searchClear\" hidden><i class=\"ach-ico ach-ico--times\" aria-hidden=\"true\"><\/i><\/button>\n                            <\/div>\n                            <button type=\"button\" class=\"ach-link-btn\" id=\"recHint\" hidden><\/button>\n                            <button type=\"button\" class=\"ach-link-btn ach-link-btn--muted\" id=\"btnClearAllSrv\" data-i18n=\"step2.clearAll\"><span class=\"ach-pre ach-pre--it\">Azzera selezione<\/span><span class=\"ach-pre ach-pre--en\">Clear selection<\/span><\/button>\n                        <\/div>\n                    <\/div>\n\n                    <div id=\"servicesGrid\"><\/div>\n                <\/div>\n\n                <aside class=\"ach-live\" data-i18n-aria-label=\"step2.previewLabel\">\n                    <div class=\"ach-live__title\" data-i18n=\"step2.previewTitle\"><span class=\"ach-pre ach-pre--it\">Anteprima piattaforme<\/span><span class=\"ach-pre ach-pre--en\">Platform preview<\/span><\/div>\n                    <div class=\"ach-live__list\" id=\"livePfmList\" aria-live=\"polite\"><\/div>\n                <\/aside>\n            <\/div>\n\n            <div class=\"ach-actionbar\">\n                <button type=\"button\" class=\"ach-btn ach-btn--ghost\" id=\"btnStep2Prev\">\n                    <i class=\"ach-ico ach-ico--arrow-left\" aria-hidden=\"true\"><\/i> <span class=\"ach-hide-sm\" data-i18n=\"step2.prev\"><span class=\"ach-pre ach-pre--it\">Cambia profilo<\/span><span class=\"ach-pre ach-pre--en\">Change profile<\/span><\/span>\n                <\/button>\n                <div class=\"ach-actionbar__info\" id=\"s2Info\" aria-live=\"polite\"><\/div>\n                <div class=\"ach-actionbar__actions\">\n                    <button type=\"button\" class=\"ach-btn ach-btn--primary\" id=\"btnStep2Next\">\n                        <span data-i18n=\"step2.next\"><span class=\"ach-pre ach-pre--it\">Vedi piattaforme<\/span><span class=\"ach-pre ach-pre--en\">See platforms<\/span><\/span> <i class=\"ach-ico ach-ico--arrow-right\" aria-hidden=\"true\"><\/i>\n                    <\/button>\n                <\/div>\n            <\/div>\n        <\/section>\n\n                <section class=\"ach-view-step\" id=\"stepView3\" aria-labelledby=\"step3Title\">\n            <header class=\"ach-section-header\">\n                <span class=\"ach-tag-label\" data-i18n=\"step3.eyebrow\"><span class=\"ach-pre ach-pre--it\">Passo 3 di 4 \u00b7 Piattaforme<\/span><span class=\"ach-pre ach-pre--en\">Step 3 of 4 \u00b7 Platforms<\/span><\/span>\n                <h2 class=\"ach-h2\" id=\"step3Title\" tabindex=\"-1\" data-i18n=\"step3.title\"><span class=\"ach-pre ach-pre--it\">Le <strong>piattaforme<\/strong> che ti servono<\/span><span class=\"ach-pre ach-pre--en\">The <strong>platforms<\/strong> you need<\/span><\/h2>\n                <p class=\"ach-lead-text\" id=\"step3Subtitle\"><\/p>\n            <\/header>\n\n            <div class=\"ach-results-layout\">\n                <div id=\"platformsResultsContainer\"><\/div>\n\n                <div class=\"ach-summary-panel\">\n                    <div class=\"ach-panel-block\">\n                        <h3 data-i18n=\"step3.flowsTitle\"><span class=\"ach-pre ach-pre--it\">Come si collegano<\/span><span class=\"ach-pre ach-pre--en\">How they connect<\/span><\/h3>\n                        <p class=\"ach-panel-block__desc\" data-i18n=\"step3.flowsLead\"><span class=\"ach-pre ach-pre--it\">Le piattaforme non lavorano da sole: ecco come si passano i dati tra loro.<\/span><span class=\"ach-pre ach-pre--en\">The platforms do not work alone: this is how they exchange data.<\/span><\/p>\n                        <div class=\"ach-flows\" id=\"flowNarrativeText\"><\/div>\n                    <\/div>\n                    <div class=\"ach-panel-block\">\n                        <h3 data-i18n=\"step3.complianceTitle\"><span class=\"ach-pre ach-pre--it\">Normative coperte<\/span><span class=\"ach-pre ach-pre--en\">Regulations covered<\/span><\/h3>\n                        <p class=\"ach-panel-block__desc\" data-i18n=\"step3.complianceLead\"><span class=\"ach-pre ach-pre--it\">Standard che questa configurazione ti aiuta a rispettare.<\/span><span class=\"ach-pre ach-pre--en\">Standards this configuration helps you comply with.<\/span><\/p>\n                        <div id=\"complianceGrid\"><\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"ach-actionbar\">\n                <button type=\"button\" class=\"ach-btn ach-btn--ghost\" id=\"btnStep3Prev\">\n                    <i class=\"ach-ico ach-ico--arrow-left\" aria-hidden=\"true\"><\/i> <span class=\"ach-hide-sm\" data-i18n=\"step3.prev\"><span class=\"ach-pre ach-pre--it\">Modifica requisiti<\/span><span class=\"ach-pre ach-pre--en\">Edit requirements<\/span><\/span>\n                <\/button>\n                <div class=\"ach-actionbar__info\" id=\"s3Info\"><\/div>\n                <div class=\"ach-actionbar__actions\">\n                    <button type=\"button\" class=\"ach-btn ach-btn--primary\" id=\"btnStep3Next\">\n                        <span data-i18n=\"step3.next\"><span class=\"ach-pre ach-pre--it\">Richiedi configurazione<\/span><span class=\"ach-pre ach-pre--en\">Request configuration<\/span><\/span> <i class=\"ach-ico ach-ico--arrow-right\" aria-hidden=\"true\"><\/i>\n                    <\/button>\n                <\/div>\n            <\/div>\n        <\/section>\n\n                <section class=\"ach-view-step\" id=\"stepView4\" aria-labelledby=\"step4Title\">\n            <header class=\"ach-section-header\">\n                <span class=\"ach-tag-label\" data-i18n=\"step4.eyebrow\"><span class=\"ach-pre ach-pre--it\">Passo 4 di 4 \u00b7 Riepilogo<\/span><span class=\"ach-pre ach-pre--en\">Step 4 of 4 \u00b7 Summary<\/span><\/span>\n                <h2 class=\"ach-h2\" id=\"step4Title\" tabindex=\"-1\" data-i18n=\"step4.title\"><span class=\"ach-pre ach-pre--it\">Riepilogo e <strong>richiesta<\/strong><\/span><span class=\"ach-pre ach-pre--en\">Summary and <strong>request<\/strong><\/span><\/h2>\n                <p class=\"ach-lead-text\" data-i18n=\"step4.lead\"><span class=\"ach-pre ach-pre--it\">Controlla la configurazione e inviala: un solution engineer ti ricontatta entro un giorno lavorativo. Non \u00e8 un ordine n\u00e9 un impegno.<\/span><span class=\"ach-pre ach-pre--en\">Check the configuration and send it: a solution engineer will get back to you within one business day. It is neither an order nor a commitment.<\/span><\/p>\n                <div class=\"ach-header-back\">\n                    <button type=\"button\" class=\"ach-link-btn\" id=\"btnStep4Prev\">\n                        <i class=\"ach-ico ach-ico--arrow-left\" aria-hidden=\"true\"><\/i> <span data-i18n=\"step4.back\"><span class=\"ach-pre ach-pre--it\">Torna alle piattaforme<\/span><span class=\"ach-pre ach-pre--en\">Back to platforms<\/span><\/span>\n                    <\/button>\n                <\/div>\n            <\/header>\n\n            <div class=\"ach-step4-grid\">\n                <div class=\"ach-spec-sheet\">\n                    <div class=\"ach-spec-sheet__head\">\n                        <h3 data-i18n=\"step4.summaryTitle\"><span class=\"ach-pre ach-pre--it\">La tua configurazione<\/span><span class=\"ach-pre ach-pre--en\">Your configuration<\/span><\/h3>\n                        <button type=\"button\" class=\"ach-link-btn\" id=\"btnEditServices\" data-i18n=\"step4.edit\"><span class=\"ach-pre ach-pre--it\">Modifica<\/span><span class=\"ach-pre ach-pre--en\">Edit<\/span><\/button>\n                    <\/div>\n                    <div class=\"ach-spec-row\">\n                        <div class=\"ach-spec-label\" data-i18n=\"step4.profile\"><span class=\"ach-pre ach-pre--it\">Profilo selezionato<\/span><span class=\"ach-pre ach-pre--en\">Selected profile<\/span><\/div>\n                        <div class=\"ach-spec-val\" id=\"sumEntity\"><\/div>\n                    <\/div>\n                    <div class=\"ach-spec-row\">\n                        <div class=\"ach-spec-label\" data-i18n=\"step4.platforms\"><span class=\"ach-pre ach-pre--it\">Piattaforme raccomandate<\/span><span class=\"ach-pre ach-pre--en\">Recommended platforms<\/span><\/div>\n                        <div class=\"ach-sum-pfms\" id=\"sumPlatforms\"><\/div>\n                    <\/div>\n                    <div class=\"ach-spec-row\">\n                        <div class=\"ach-spec-label\" data-i18n=\"step4.requirements\"><span class=\"ach-pre ach-pre--it\">Requisiti selezionati<\/span><span class=\"ach-pre ach-pre--en\">Selected requirements<\/span><\/div>\n                        <div class=\"ach-spec-chips\" id=\"sumServices\"><\/div>\n                    <\/div>\n                    <div class=\"ach-spec-row\">\n                        <div class=\"ach-spec-label\" data-i18n=\"step4.compliance\"><span class=\"ach-pre ach-pre--it\">Quadro normativo<\/span><span class=\"ach-pre ach-pre--en\">Regulatory framework<\/span><\/div>\n                        <div class=\"ach-spec-chips\" id=\"sumCompliance\"><\/div>\n                    <\/div>\n                    <div class=\"ach-spec-actions\">\n                        <button type=\"button\" class=\"ach-btn ach-btn--secondary ach-btn--sm\" id=\"btnCopyReport\" data-i18n=\"step4.copy\"><span class=\"ach-pre ach-pre--it\">Copia testo<\/span><span class=\"ach-pre ach-pre--en\">Copy text<\/span><\/button>\n                        <button type=\"button\" class=\"ach-btn ach-btn--secondary ach-btn--sm\" id=\"btnPrintReport\" data-i18n=\"step4.print\"><span class=\"ach-pre ach-pre--it\">Stampa \/ PDF<\/span><span class=\"ach-pre ach-pre--en\">Print \/ PDF<\/span><\/button>\n                    <\/div>\n                <\/div>\n\n                <div class=\"ach-contact-form-card\">\n                    <h3 data-i18n=\"step4.formTitle\"><span class=\"ach-pre ach-pre--it\">Richiedi una proposta<\/span><span class=\"ach-pre ach-pre--en\">Request a proposal<\/span><\/h3>\n                                        <iframe class=\"ach-cobalt-frame\" id=\"cobaltFrame\" loading=\"lazy\" data-i18n-title=\"step4.formTitle\"><\/iframe>\n                <\/div>\n            <\/div>\n\n        <\/section>\n    <\/div>\n\n    <div class=\"ach-toast-msg\" id=\"achToast\" role=\"status\" aria-live=\"polite\">\n        <i class=\"ach-ico ach-ico--check-circle\" id=\"toastIcon\" aria-hidden=\"true\"><\/i>\n        <span id=\"toastText\"><\/span>\n    <\/div>\n\n        <div class=\"ach-print-report\" id=\"achPrintReport\" aria-hidden=\"true\"><\/div>\n<\/div>\n<script>\n(function () {\n'use strict';\n\/* ==========================================================================\n   aChiral Navigator \u2014 Dati dell'ecosistema\n   MACRO_ENTITIES: profili organizzativi (Passo 1)\n   PLATFORMS_DATA: piattaforme aChiral\n   ITEMS_DATA: requisiti\/servizi e mappatura verso le piattaforme\n   DATA_FLOWS: collegamenti tra piattaforme (Passo 3 e PDF)\n   ========================================================================== *\/\n\nconst MACRO_ENTITIES = [\n  {\n    \"id\": \"cro\",\n    \"name\": {\"it\": \"CRO\", \"en\": \"CRO\"},\n    \"subtitle\": {\"it\": \"Clinical Research Organization\", \"en\": \"Clinical Research Organization\"},\n    \"includes\": [\n      \"CRO Full-Service\",\n      \"Specialty CRO\",\n      \"Monitor ARO\"\n    ],\n    \"desc\": {\"it\": \"Conduzione e monitoraggio operativo di trial clinici end-to-end per sponsor esterni, con piena conformit\u00e0 GCP, FDA ed EMA.\", \"en\": \"End-to-end operational conduct and monitoring of clinical trials for external sponsors, fully compliant with GCP, FDA and EMA.\"},\n    \"scope\": \"Trial end-to-end\",\n    \"reqCount\": 12,\n    \"iconSvg\": \"<svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.35\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\\\"\/><rect width=\\\"8\\\" height=\\\"4\\\" x=\\\"8\\\" y=\\\"2\\\" rx=\\\"1\\\" ry=\\\"1\\\"\/><path d=\\\"m9 14 2 2 4-4\\\"\/><\/svg>\",\n    \"items\": [\n      \"rct-patient\",\n      \"dct-patient\",\n      \"econsent\",\n      \"sdv\",\n      \"signature\",\n      \"gcp\",\n      \"cfr11\",\n      \"annex11\",\n      \"alcoa\",\n      \"moni-remote\",\n      \"reminders\",\n      \"identity\"\n    ],\n    \"coreItems\": [\n      \"rct-patient\",\n      \"econsent\",\n      \"sdv\",\n      \"gcp\",\n      \"moni-remote\"\n    ]\n  },\n  {\n    \"id\": \"sponsor\",\n    \"name\": {\"it\": \"Sponsor Pharma \/ Biotech\", \"en\": \"Pharma \/ Biotech Sponsor\"},\n    \"subtitle\": {\"it\": \"Aziende Farmaceutiche & Biotech\", \"en\": \"Pharmaceutical & Biotech Companies\"},\n    \"includes\": [\n      \"Sponsor Pharma\",\n      \"Biotech\",\n      \"Sviluppo Terapeutico\"\n    ],\n    \"desc\": {\"it\": \"Conduzione di trial registrativi e post-market sul proprio composto con visibilit\u00e0 completa operativa, finanziaria e regolatoria.\", \"en\": \"Registration and post-market trials on your own compound with full operational, financial and regulatory visibility.\"},\n    \"scope\": \"Trial + Post-market\",\n    \"reqCount\": 13,\n    \"iconSvg\": \"<svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.35\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"m10.5 20.5 10-10a4.95 4.95 0 1 0-7-7l-10 10a4.95 4.95 0 1 0 7 7Z\\\"\/><path d=\\\"m8.5 8.5 7 7\\\"\/><\/svg>\",\n    \"items\": [\n      \"rct-patient\",\n      \"rwd-patient\",\n      \"dct-patient\",\n      \"epro\",\n      \"econsent\",\n      \"sdv\",\n      \"signature\",\n      \"gcp\",\n      \"cfr11\",\n      \"annex11\",\n      \"alcoa\",\n      \"moni-remote\",\n      \"identity\"\n    ],\n    \"coreItems\": [\n      \"rct-patient\",\n      \"econsent\",\n      \"gcp\",\n      \"sdv\",\n      \"cfr11\"\n    ]\n  },\n  {\n    \"id\": \"medtech\",\n    \"name\": {\"it\": \"MedTech & SaMD\", \"en\": \"MedTech & SaMD\"},\n    \"subtitle\": {\"it\": \"Fabbricanti Dispositivi Medici & IoMT\", \"en\": \"Medical Device & IoMT Manufacturers\"},\n    \"includes\": [\n      \"Medical Device\",\n      \"SaMD\",\n      \"Sensori IoMT\"\n    ],\n    \"desc\": {\"it\": \"Marcatura CE MDR 2017\/745 \/ IVDR, gestione del ciclo di vita software IEC 62304, sorveglianza clinica post-market (PMCF) e telemetria smart.\", \"en\": \"CE marking under MDR 2017\/745 \/ IVDR, IEC 62304 software lifecycle, post-market clinical follow-up (PMCF) and smart telemetry.\"},\n    \"scope\": \"MDR \u00b7 IVDR\",\n    \"reqCount\": 10,\n    \"iconSvg\": \"<svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.35\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect width=\\\"14\\\" height=\\\"14\\\" x=\\\"5\\\" y=\\\"5\\\" rx=\\\"2.5\\\"\/><rect width=\\\"6\\\" height=\\\"6\\\" x=\\\"9\\\" y=\\\"9\\\" rx=\\\"1.5\\\"\/><path d=\\\"M15 2v3\\\"\/><path d=\\\"M15 19v3\\\"\/><path d=\\\"M2 15h3\\\"\/><path d=\\\"M2 9h3\\\"\/><path d=\\\"M19 15h3\\\"\/><path d=\\\"M19 9h3\\\"\/><path d=\\\"M9 2v3\\\"\/><path d=\\\"M9 19v3\\\"\/><\/svg>\",\n    \"items\": [\n      \"rwd-patient\",\n      \"wearable\",\n      \"signature\",\n      \"iso13485\",\n      \"annex11\",\n      \"cfr11\",\n      \"alcoa\",\n      \"gdpr\",\n      \"incident\",\n      \"identity\"\n    ],\n    \"coreItems\": [\n      \"rwd-patient\",\n      \"wearable\",\n      \"iso13485\",\n      \"gdpr\"\n    ]\n  },\n  {\n    \"id\": \"hospital\",\n    \"name\": {\"it\": \"Ospedali & Cliniche\", \"en\": \"Hospitals & Clinics\"},\n    \"subtitle\": {\"it\": \"Strutture Sanitarie, Cliniche & ASL\", \"en\": \"Healthcare Facilities, Clinics & Local Health Units\"},\n    \"includes\": [\n      \"Ospedali\",\n      \"Cliniche Private\",\n      \"ASL \/ Territorio\"\n    ],\n    \"desc\": {\"it\": \"Cartella clinica longitudinale (EHR\/FHIR), telemedicina specialistica, presa in carico di cronicit\u00e0 e continuit\u00e0 assistenziale.\", \"en\": \"Longitudinal health records (EHR\/FHIR), specialist telemedicine, chronic care management and continuity of care.\"},\n    \"scope\": \"Cura + Telehealth\",\n    \"reqCount\": 10,\n    \"iconSvg\": \"<svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.35\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\\\"\/><\/svg>\",\n    \"items\": [\n      \"chronic-patient\",\n      \"ehr\",\n      \"teleconsult\",\n      \"lab\",\n      \"wearable\",\n      \"econsent\",\n      \"signature\",\n      \"gdpr\",\n      \"hipaa\",\n      \"identity\"\n    ],\n    \"coreItems\": [\n      \"chronic-patient\",\n      \"ehr\",\n      \"teleconsult\",\n      \"gdpr\"\n    ]\n  },\n  {\n    \"id\": \"publichealth\",\n    \"name\": {\"it\": \"Sistema Sanitario Pubblico\", \"en\": \"Public Health System\"},\n    \"subtitle\": {\"it\": \"ASL, Regioni & Programmi PNRR\", \"en\": \"Local Health Units, Regions & PNRR Programmes\"},\n    \"includes\": [\n      \"ASL\",\n      \"Regioni\",\n      \"Programmi PNRR\"\n    ],\n    \"desc\": {\"it\": \"Digitalizzazione territoriale, telemedicina di popolazione e continuit\u00e0 assistenziale tra ospedale e territorio.\", \"en\": \"Territorial digitalisation, population telehealth and continuity of care between hospital and community.\"},\n    \"scope\": \"PNRR \u00b7 Sanit\u00e0 digitale\",\n    \"reqCount\": 9,\n    \"iconSvg\": \"<svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.35\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><line x1=\\\"3\\\" x2=\\\"21\\\" y1=\\\"22\\\" y2=\\\"22\\\"\/><line x1=\\\"6\\\" x2=\\\"6\\\" y1=\\\"18\\\" y2=\\\"11\\\"\/><line x1=\\\"10\\\" x2=\\\"10\\\" y1=\\\"18\\\" y2=\\\"11\\\"\/><line x1=\\\"14\\\" x2=\\\"14\\\" y1=\\\"18\\\" y2=\\\"11\\\"\/><line x1=\\\"18\\\" x2=\\\"18\\\" y1=\\\"18\\\" y2=\\\"11\\\"\/><polygon points=\\\"12 2 20 7 4 7\\\"\/><\/svg>\",\n    \"items\": [\n      \"chronic-patient\",\n      \"ehr\",\n      \"teleconsult\",\n      \"wearable\",\n      \"gdpr\",\n      \"education\",\n      \"reminders\",\n      \"signature\",\n      \"identity\"\n    ],\n    \"coreItems\": [\n      \"chronic-patient\",\n      \"ehr\",\n      \"teleconsult\",\n      \"gdpr\"\n    ]\n  },\n  {\n    \"id\": \"academic\",\n    \"name\": {\"it\": \"Ricerca Accademica & IRCCS\", \"en\": \"Academic Research & IRCCS\"},\n    \"subtitle\": {\"it\": \"Universit\u00e0 & Istituti di Ricerca\", \"en\": \"Universities & Research Institutes\"},\n    \"includes\": [\n      \"Universit\u00e0\",\n      \"IRCCS\",\n      \"Laboratori\"\n    ],\n    \"desc\": {\"it\": \"Conduzione di ricerca scientifica indipendente, registri osservazionali e studi accademici conformi a GCP, GDPR e ALCOA+.\", \"en\": \"Independent scientific research, observational registries and academic studies compliant with GCP, GDPR and ALCOA+.\"},\n    \"scope\": \"Ricerca Accademica\",\n    \"reqCount\": 9,\n    \"iconSvg\": \"<svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.35\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M22 10v6\\\"\/><path d=\\\"M2 10l10-5 10 5-10 5z\\\"\/><path d=\\\"M6 12v5c3 3 9 3 12 0v-5\\\"\/><\/svg>\",\n    \"items\": [\n      \"obs-patient\",\n      \"rwd-patient\",\n      \"epro\",\n      \"econsent\",\n      \"ehr\",\n      \"gcp\",\n      \"gdpr\",\n      \"alcoa\",\n      \"identity\"\n    ],\n    \"coreItems\": [\n      \"obs-patient\",\n      \"econsent\",\n      \"gcp\",\n      \"gdpr\"\n    ]\n  },\n  {\n    \"id\": \"pi\",\n    \"name\": {\"it\": \"Principal Investigator (PI)\", \"en\": \"Principal Investigator (PI)\"},\n    \"subtitle\": {\"it\": \"Sperimentatori Principali & Capo-gruppo\", \"en\": \"Principal Investigators & Group Leads\"},\n    \"includes\": [\n      \"Sperimentatori\",\n      \"Capo-gruppo\",\n      \"KOL Clinici\"\n    ],\n    \"desc\": {\"it\": \"Direzione autonoma di studi monocentrici o multicentrici, dall'arruolamento dei pazienti alla gestione delle cartelle e del report finale.\", \"en\": \"Autonomous direction of single- or multi-centre studies, from patient enrolment to record management and the final report.\"},\n    \"scope\": \"Studio Singolo\",\n    \"reqCount\": 10,\n    \"iconSvg\": \"<svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.35\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M6 18h8\\\"\/><path d=\\\"M3 22h18\\\"\/><path d=\\\"M14 22a7 7 0 1 0 0-14h-1\\\"\/><path d=\\\"M9 14h2\\\"\/><path d=\\\"M9 12a2 2 0 0 1-2-2V6h6v4a2 2 0 0 1-2 2Z\\\"\/><path d=\\\"M12 6V3a1 1 0 0 0-1-1H9a1 1 0 0 0-1 1v3\\\"\/><\/svg>\",\n    \"items\": [\n      \"obs-patient\",\n      \"rct-patient\",\n      \"epro\",\n      \"econsent\",\n      \"ehr\",\n      \"signature\",\n      \"sdv\",\n      \"gcp\",\n      \"alcoa\",\n      \"identity\"\n    ],\n    \"coreItems\": [\n      \"rct-patient\",\n      \"econsent\",\n      \"ehr\",\n      \"gcp\"\n    ]\n  },\n  {\n    \"id\": \"foundation\",\n    \"name\": {\"it\": \"Fondazioni di Ricerca\", \"en\": \"Research Foundations\"},\n    \"subtitle\": {\"it\": \"Non-Profit & Patient Advocacy\", \"en\": \"Non-Profit & Patient Advocacy\"},\n    \"includes\": [\n      \"Fondazioni ETS\",\n      \"Patient Advocacy\",\n      \"Grant-Funded\"\n    ],\n    \"desc\": {\"it\": \"Finanziamento di studi, registri di patologia e malattie rare, supporto continuo alla patient community e percorsi di educazione.\", \"en\": \"Study funding, disease and rare-disease registries, ongoing patient community support and education pathways.\"},\n    \"scope\": \"Registri + Advocacy\",\n    \"reqCount\": 11,\n    \"iconSvg\": \"<svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.35\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><circle cx=\\\"12\\\" cy=\\\"8\\\" r=\\\"6\\\"\/><path d=\\\"M15.477 12.89 17 22l-5-3-5 3 1.523-9.11\\\"\/><\/svg>\",\n    \"items\": [\n      \"obs-patient\",\n      \"chronic-patient\",\n      \"rwd-patient\",\n      \"epro\",\n      \"econsent\",\n      \"gcp\",\n      \"gdpr\",\n      \"alcoa\",\n      \"education\",\n      \"reimbursement\",\n      \"identity\"\n    ],\n    \"coreItems\": [\n      \"obs-patient\",\n      \"econsent\",\n      \"gdpr\",\n      \"education\",\n      \"reimbursement\"\n    ]\n  },\n  {\n    \"id\": \"studygroup\",\n    \"name\": {\"it\": \"Gruppi di Studio & IIT\", \"en\": \"Study Groups & IIT\"},\n    \"subtitle\": {\"it\": \"Collaborazioni Inter-centro & IIT\", \"en\": \"Inter-centre Collaborations & IIT\"},\n    \"includes\": [\n      \"Consorzi Clinici\",\n      \"Societ\u00e0 Scientifiche\",\n      \"Reti IIT\"\n    ],\n    \"desc\": {\"it\": \"Collaborazioni inter-centro e trial investigator-initiated (IIT) cooperativi condotti da clinici indipendenti senza sponsor commerciali.\", \"en\": \"Inter-centre collaborations and cooperative investigator-initiated trials (IIT) run by independent clinicians without commercial sponsors.\"},\n    \"scope\": \"IIT Collaborativo\",\n    \"reqCount\": 10,\n    \"iconSvg\": \"<svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.35\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\\\"\/><circle cx=\\\"9\\\" cy=\\\"7\\\" r=\\\"4\\\"\/><path d=\\\"M22 21v-2a4 4 0 0 0-3-3.87\\\"\/><path d=\\\"M16 3.13a4 4 0 0 1 0 7.75\\\"\/><\/svg>\",\n    \"items\": [\n      \"obs-patient\",\n      \"rct-patient\",\n      \"epro\",\n      \"econsent\",\n      \"signature\",\n      \"gcp\",\n      \"gdpr\",\n      \"alcoa\",\n      \"moni-remote\",\n      \"identity\"\n    ],\n    \"coreItems\": [\n      \"rct-patient\",\n      \"econsent\",\n      \"gcp\",\n      \"moni-remote\"\n    ]\n  }\n];\nconst PLATFORMS_DATA = {\n  \"capture\": {\n    \"name\": \"aChiral Capture\",\n    \"role\": \"EDC \u00b7 ePRO \u00b7 eCOA\",\n    \"color\": \"#44B8AD\",\n    \"narrative\": {\n      \"it\": \"la raccolta dati clinica (eCRF, ePRO, eConsent) con form builder no-code, randomizzazione, query management e audit trail ALCOA+\",\n      \"en\": \"clinical data capture (eCRF, ePRO, eConsent) with no-code form builder, randomisation, query management and ALCOA+ audit trail\"\n    }\n  },\n  \"carbon\": {\n    \"name\": \"aChiral Carbon\",\n    \"role\": \"CTMS \u00b7 Operations\",\n    \"color\": \"#006772\",\n    \"narrative\": {\n      \"it\": \"l'orchestrazione operativa del trial \u2014 siti, budget, milestone, contratti, documentazione regolatoria, comunicazioni con comitati etici\",\n      \"en\": \"trial operational orchestration \u2014 sites, budgets, milestones, contracts, regulatory documentation, ethics committee communications\"\n    }\n  },\n  \"connect\": {\n    \"name\": \"aChiral Connect\",\n    \"role\": \"HMS \u00b7 Telehealth\",\n    \"color\": \"#304D93\",\n    \"narrative\": {\n      \"it\": \"la cartella clinica elettronica longitudinale, i teleconsulti con documentazione SOAP firmabile, prescrizioni e lab\",\n      \"en\": \"the longitudinal electronic health record, teleconsultations with signable SOAP documentation, prescriptions and lab\"\n    }\n  },\n  \"compact\": {\n    \"name\": \"aChiral Compact\",\n    \"role\": \"mHealth \u00b7 iOS & Android\",\n    \"color\": \"#2C3E4A\",\n    \"narrative\": {\n      \"it\": \"l'estensione mobile per medici e pazienti, con wearable sync, push notification, ePRO da casa e partecipazione ai trial decentralizzati\",\n      \"en\": \"the mobile extension for clinicians and patients, with wearable sync, push notifications, at-home ePRO and decentralised trial participation\"\n    }\n  },\n  \"content\": {\n    \"name\": \"aChiral Content\",\n    \"role\": \"Patient Engagement\",\n    \"color\": \"#548DAF\",\n    \"narrative\": {\n      \"it\": \"l'educazione paziente personalizzata per area terapeutica, con contenuti multimediali, focus group virtuali e metriche di engagement\",\n      \"en\": \"personalised patient education by therapeutic area, with multimedia content, virtual focus groups and engagement metrics\"\n    }\n  },\n  \"cryptex\": {\n    \"name\": \"aChiral Cryptex\",\n    \"role\": \"Pseudonymisation\",\n    \"color\": \"#4A956A\",\n    \"narrative\": {\n      \"it\": \"la pseudonimizzazione trasversale delle comunicazioni email (GDPR Art. 25) e la raccolta incident pseudonimizzati\",\n      \"en\": \"cross-cutting pseudonymisation of email communications (GDPR Art. 25) and pseudonymised incident collection\"\n    }\n  },\n  \"cobalt\": {\n    \"name\": \"aChiral Cobalt\",\n    \"role\": \"eQMS \u00b7 DMS \u00b7 eTMF \u00b7 eISF\",\n    \"color\": \"#2600AB\",\n    \"narrative\": {\n      \"it\": \"il sistema qualit\u00e0 completo \u2014 documenti controllati, firme 21 CFR Part 11, CAPA, training, audit, GDPR ROPA\/DSAR, ciclo di vita software IEC 62304\",\n      \"en\": \"the complete quality system \u2014 controlled documents, 21 CFR Part 11 signatures, CAPA, training, audit, GDPR ROPA\/DSAR, IEC 62304 software lifecycle\"\n    }\n  },\n  \"clear\": {\n    \"name\": \"aChiral Clear\",\n    \"role\": \"Remote Site Monitoring\",\n    \"color\": \"#6464D8\",\n    \"narrative\": {\n      \"it\": \"il monitoraggio remoto dei siti con SDV a distanza, sincronizzazione real-time con Carbon, offline scan e audit trail mobile\",\n      \"en\": \"remote site monitoring with remote SDV, real-time sync with Carbon, offline scanning and mobile audit trail\"\n    }\n  },\n  \"chronos\": {\n    \"name\": \"aChiral Chronos\",\n    \"role\": \"Scheduling \u00b7 Follow-up\",\n    \"color\": \"#01B5D8\",\n    \"narrative\": {\n      \"it\": \"la gestione time-sensitive di visite e follow-up \u2014 reminder a tre livelli, tracking IMAP, portale paziente per rimborsi, finanziamento per-visit\",\n      \"en\": \"time-sensitive visit and follow-up management \u2014 three-tier reminders, IMAP tracking, patient portal for reimbursements, per-visit funding\"\n    }\n  },\n  \"covalent\": {\n    \"name\": \"aChiral Covalent\",\n    \"role\": \"IAM \u00b7 Provisioning\",\n    \"color\": \"#6798E8\",\n    \"narrative\": {\n      \"it\": \"l'identit\u00e0 federata Keycloak, il provisioning di email\/storage\/accesso fisico e la verifica di compliance 21 CFR Part 11 per le firme digitali\",\n      \"en\": \"federated Keycloak identity, email\/storage\/physical-access provisioning and 21 CFR Part 11 compliance verification for digital signatures\"\n    }\n  }\n};\nconst ITEMS_DATA = [\n  {\n    \"id\": \"obs-patient\",\n    \"category\": \"patient\",\n    \"labelNormal\": {\n      \"it\": \"Paziente \u2014 studio osservazionale\",\n      \"en\": \"Patient \u2014 observational study\"\n    },\n    \"labelTech\": {\n      \"it\": \"Soggetto \u00b7 Studio non-interventistico\",\n      \"en\": \"Subject \u00b7 Non-interventional study\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Paziente \\\"osservato\\\" senza modifica delle cure.\",\n        \"en\": \"Patient observed without care modification.\"\n      },\n      \"tech\": {\n        \"it\": \"ICH-GCP E6(R3) \u00a71.43 \u00b7 Real-World Evidence\",\n        \"en\": \"ICH-GCP E6(R3) \u00a71.43 \u00b7 Real-World Evidence\"\n      }\n    },\n    \"primary\": [\n      \"capture\",\n      \"chronos\"\n    ],\n    \"secondary\": [\n      \"connect\"\n    ],\n    \"compliance\": [\n      \"ICH-GCP E6(R3)\",\n      \"GDPR\",\n      \"ALCOA+\"\n    ]\n  },\n  {\n    \"id\": \"rct-patient\",\n    \"category\": \"patient\",\n    \"labelNormal\": {\n      \"it\": \"Paziente \u2014 trial randomizzato\",\n      \"en\": \"Patient \u2014 randomised trial\"\n    },\n    \"labelTech\": {\n      \"it\": \"Soggetto RCT \u00b7 ICH-GCP E6(R3)\",\n      \"en\": \"RCT Subject \u00b7 ICH-GCP E6(R3)\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Paziente assegnato a un braccio di trattamento.\",\n        \"en\": \"Patient allocated to a treatment arm.\"\n      },\n      \"tech\": {\n        \"it\": \"Allocation Concealment \u00b7 Blinding \u00b7 SDV \u00b7 Annex 11\",\n        \"en\": \"Allocation Concealment \u00b7 Blinding \u00b7 SDV \u00b7 Annex 11\"\n      }\n    },\n    \"primary\": [\n      \"capture\",\n      \"carbon\",\n      \"clear\"\n    ],\n    \"secondary\": [\n      \"chronos\",\n      \"cobalt\"\n    ],\n    \"compliance\": [\n      \"ICH-GCP E6(R3)\",\n      \"Annex 11\",\n      \"21 CFR Part 11\",\n      \"ALCOA+\",\n      \"ISO 14155\"\n    ]\n  },\n  {\n    \"id\": \"rwd-patient\",\n    \"category\": \"patient\",\n    \"labelNormal\": {\n      \"it\": \"Paziente \u2014 real-world data\",\n      \"en\": \"Patient \u2014 real-world data\"\n    },\n    \"labelTech\": {\n      \"it\": \"Soggetto RWD\/RWE \u00b7 Post-Market\",\n      \"en\": \"RWD\/RWE Subject \u00b7 Post-Market\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Paziente monitorato nella vita quotidiana.\",\n        \"en\": \"Patient monitored in daily life.\"\n      },\n      \"tech\": {\n        \"it\": \"RWE generation \u00b7 PMCF \u00b7 Post-market surveillance\",\n        \"en\": \"RWE generation \u00b7 PMCF \u00b7 Post-market surveillance\"\n      }\n    },\n    \"primary\": [\n      \"connect\",\n      \"compact\"\n    ],\n    \"secondary\": [\n      \"chronos\"\n    ],\n    \"compliance\": [\n      \"GDPR\",\n      \"MDR PMCF\",\n      \"IEC 62304\",\n      \"ISO 14155\"\n    ]\n  },\n  {\n    \"id\": \"chronic-patient\",\n    \"category\": \"patient\",\n    \"labelNormal\": {\n      \"it\": \"Paziente con patologia cronica\",\n      \"en\": \"Patient \u2014 chronic condition\"\n    },\n    \"labelTech\": {\n      \"it\": \"Chronic Care \u00b7 Disease Management\",\n      \"en\": \"Chronic Care \u00b7 Disease Management\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Paziente in programma di cura continuativa.\",\n        \"en\": \"Patient on continuous care pathway.\"\n      },\n      \"tech\": {\n        \"it\": \"Longitudinal care pathway \u00b7 Adherence monitoring\",\n        \"en\": \"Longitudinal care pathway \u00b7 Adherence monitoring\"\n      }\n    },\n    \"primary\": [\n      \"connect\",\n      \"compact\"\n    ],\n    \"secondary\": [\n      \"content\",\n      \"chronos\"\n    ],\n    \"compliance\": [\n      \"GDPR\",\n      \"HIPAA\",\n      \"ALCOA+\"\n    ]\n  },\n  {\n    \"id\": \"dct-patient\",\n    \"category\": \"patient\",\n    \"labelNormal\": {\n      \"it\": \"Paziente \u2014 trial decentralizzato\",\n      \"en\": \"Patient \u2014 decentralised trial\"\n    },\n    \"labelTech\": {\n      \"it\": \"DCT Subject \u00b7 Remote Enrolment\",\n      \"en\": \"DCT Subject \u00b7 Remote Enrolment\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Trial che \\\"va\\\" dal paziente, non viceversa.\",\n        \"en\": \"The trial goes to the patient, not vice-versa.\"\n      },\n      \"tech\": {\n        \"it\": \"DCT \u00b7 Hybrid Trial \u00b7 Remote Consent \u00b7 ePRO-driven\",\n        \"en\": \"DCT \u00b7 Hybrid Trial \u00b7 Remote Consent \u00b7 ePRO-driven\"\n      }\n    },\n    \"primary\": [\n      \"compact\",\n      \"capture\",\n      \"chronos\"\n    ],\n    \"secondary\": [\n      \"cryptex\",\n      \"clear\"\n    ],\n    \"compliance\": [\n      \"ICH-GCP E6(R3)\",\n      \"GDPR\",\n      \"21 CFR Part 11\",\n      \"FDA DCT Guidance 2023\"\n    ]\n  },\n  {\n    \"id\": \"epro\",\n    \"category\": \"data\",\n    \"labelNormal\": {\n      \"it\": \"Sintomi riferiti dal paziente\",\n      \"en\": \"Patient-reported symptoms\"\n    },\n    \"labelTech\": {\n      \"it\": \"ePRO \/ eCOA \u00b7 PROM strumentati\",\n      \"en\": \"ePRO \/ eCOA \u00b7 Instrumented PROMs\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Diario sintomi, QoL, aderenza.\",\n        \"en\": \"Symptom diary, QoL, adherence.\"\n      },\n      \"tech\": {\n        \"it\": \"Electronic Patient-Reported Outcomes \u00b7 COA\",\n        \"en\": \"Electronic Patient-Reported Outcomes \u00b7 COA\"\n      }\n    },\n    \"primary\": [\n      \"capture\",\n      \"compact\"\n    ],\n    \"secondary\": [],\n    \"compliance\": [\n      \"ICH-GCP E6(R3)\",\n      \"21 CFR Part 11\",\n      \"ALCOA+\",\n      \"GDPR\"\n    ]\n  },\n  {\n    \"id\": \"econsent\",\n    \"category\": \"data\",\n    \"labelNormal\": {\n      \"it\": \"Consenso informato elettronico\",\n      \"en\": \"Electronic informed consent\"\n    },\n    \"labelTech\": {\n      \"it\": \"eConsent \u00b7 21 CFR Part 11 \/ CIE-SPID\",\n      \"en\": \"eConsent \u00b7 21 CFR Part 11 \/ CIE-SPID\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Firma digitale del consenso.\",\n        \"en\": \"Digital signing of consent.\"\n      },\n      \"tech\": {\n        \"it\": \"Digital signatures \u00b7 Identity proofing \u00b7 Audit trail\",\n        \"en\": \"Digital signatures \u00b7 Identity proofing \u00b7 Audit trail\"\n      }\n    },\n    \"primary\": [\n      \"capture\",\n      \"covalent\"\n    ],\n    \"secondary\": [\n      \"connect\"\n    ],\n    \"compliance\": [\n      \"21 CFR Part 11\",\n      \"GDPR\",\n      \"ICH-GCP E6(R3)\",\n      \"eIDAS\",\n      \"CIE \/ SPID\"\n    ]\n  },\n  {\n    \"id\": \"ehr\",\n    \"category\": \"data\",\n    \"labelNormal\": {\n      \"it\": \"Cartella clinica elettronica\",\n      \"en\": \"Electronic Health Record\"\n    },\n    \"labelTech\": {\n      \"it\": \"EHR \u00b7 Longitudinal Patient Record\",\n      \"en\": \"EHR \u00b7 Longitudinal Patient Record\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Storia clinica completa del paziente.\",\n        \"en\": \"Full clinical history of the patient.\"\n      },\n      \"tech\": {\n        \"it\": \"SOAP \u00b7 ICD-10 \u00b7 Allergies \u00b7 Vitals \u00b7 FHIR R4\",\n        \"en\": \"SOAP \u00b7 ICD-10 \u00b7 Allergies \u00b7 Vitals \u00b7 FHIR R4\"\n      }\n    },\n    \"primary\": [\n      \"connect\"\n    ],\n    \"secondary\": [\n      \"compact\"\n    ],\n    \"compliance\": [\n      \"HL7 FHIR R4\",\n      \"GDPR\",\n      \"HIPAA\",\n      \"ISO 27799\"\n    ]\n  },\n  {\n    \"id\": \"wearable\",\n    \"category\": \"data\",\n    \"labelNormal\": {\n      \"it\": \"Dati da wearable e smart device\",\n      \"en\": \"Wearable and smart-device data\"\n    },\n    \"labelTech\": {\n      \"it\": \"IoMT \u00b7 Continuous Biosignal Capture\",\n      \"en\": \"IoMT \u00b7 Continuous Biosignal Capture\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Battito, pressione, glicemia \u2014 continui.\",\n        \"en\": \"Heart rate, BP, glucose \u2014 continuous.\"\n      },\n      \"tech\": {\n        \"it\": \"IoMT \u00b7 HealthKit \u00b7 Google Fit \u00b7 Cardiometabolic\",\n        \"en\": \"IoMT \u00b7 HealthKit \u00b7 Google Fit \u00b7 Cardiometabolic\"\n      }\n    },\n    \"primary\": [\n      \"compact\",\n      \"connect\"\n    ],\n    \"secondary\": [],\n    \"compliance\": [\n      \"MDR \u00b7 IEC 62304\",\n      \"GDPR\",\n      \"HIPAA\",\n      \"ISO 13485\"\n    ]\n  },\n  {\n    \"id\": \"sdv\",\n    \"category\": \"data\",\n    \"labelNormal\": {\n      \"it\": \"Verifica del dato sorgente\",\n      \"en\": \"Source data verification\"\n    },\n    \"labelTech\": {\n      \"it\": \"rSDV \u00b7 Source Data Verification Remota\",\n      \"en\": \"rSDV \u00b7 Remote Source Data Verification\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Il controllo qualit\u00e0 del CRA.\",\n        \"en\": \"CRA quality control.\"\n      },\n      \"tech\": {\n        \"it\": \"Remote SDV \u00b7 Monitoring visit \u00b7 Query management\",\n        \"en\": \"Remote SDV \u00b7 Monitoring visit \u00b7 Query management\"\n      }\n    },\n    \"primary\": [\n      \"clear\",\n      \"capture\"\n    ],\n    \"secondary\": [\n      \"carbon\"\n    ],\n    \"compliance\": [\n      \"ICH-GCP E6(R3)\",\n      \"21 CFR Part 11\",\n      \"ALCOA+\",\n      \"Annex 11\"\n    ]\n  },\n  {\n    \"id\": \"lab\",\n    \"category\": \"data\",\n    \"labelNormal\": {\n      \"it\": \"Risultati di laboratorio\",\n      \"en\": \"Laboratory results\"\n    },\n    \"labelTech\": {\n      \"it\": \"Lab results \u00b7 DiagnosticReport (FHIR)\",\n      \"en\": \"Lab results \u00b7 DiagnosticReport (FHIR)\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Esami del sangue, imaging, referti.\",\n        \"en\": \"Blood tests, imaging, reports.\"\n      },\n      \"tech\": {\n        \"it\": \"LIMS integration \u00b7 HL7 ORU^R01 \u00b7 DiagnosticReport\",\n        \"en\": \"LIMS integration \u00b7 HL7 ORU^R01 \u00b7 DiagnosticReport\"\n      }\n    },\n    \"primary\": [\n      \"connect\",\n      \"capture\"\n    ],\n    \"secondary\": [],\n    \"compliance\": [\n      \"HL7 FHIR R4\",\n      \"GDPR\",\n      \"HIPAA\",\n      \"21 CFR Part 11\"\n    ]\n  },\n  {\n    \"id\": \"teleconsult\",\n    \"category\": \"data\",\n    \"labelNormal\": {\n      \"it\": \"Videoconsulto medico-paziente\",\n      \"en\": \"Doctor-patient video consultation\"\n    },\n    \"labelTech\": {\n      \"it\": \"Teleconsultation \u00b7 WebRTC \u00b7 LiveKit\",\n      \"en\": \"Teleconsultation \u00b7 WebRTC \u00b7 LiveKit\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"La visita in videochiamata.\",\n        \"en\": \"The visit via video call.\"\n      },\n      \"tech\": {\n        \"it\": \"WebRTC \u00b7 LiveKit \u00b7 Recording \u00b7 SOAP documentation\",\n        \"en\": \"WebRTC \u00b7 LiveKit \u00b7 Recording \u00b7 SOAP documentation\"\n      }\n    },\n    \"primary\": [\n      \"connect\",\n      \"compact\"\n    ],\n    \"secondary\": [],\n    \"compliance\": [\n      \"GDPR\",\n      \"HIPAA\",\n      \"ISO 27001\",\n      \"eHealth EU Framework\"\n    ]\n  },\n  {\n    \"id\": \"signature\",\n    \"category\": \"data\",\n    \"labelNormal\": {\n      \"it\": \"Documenti firmati digitalmente\",\n      \"en\": \"Digitally signed documents\"\n    },\n    \"labelTech\": {\n      \"it\": \"Advanced E-Signatures \u00b7 21 CFR Part 11\",\n      \"en\": \"Advanced E-Signatures \u00b7 21 CFR Part 11\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Firme con valore legale, tracciate.\",\n        \"en\": \"Legally valid, tracked signatures.\"\n      },\n      \"tech\": {\n        \"it\": \"Signature envelopes \u00b7 Sequential signing \u00b7 PIN + biometric\",\n        \"en\": \"Signature envelopes \u00b7 Sequential signing \u00b7 PIN + biometric\"\n      }\n    },\n    \"primary\": [\n      \"covalent\",\n      \"cobalt\"\n    ],\n    \"secondary\": [\n      \"capture\"\n    ],\n    \"compliance\": [\n      \"21 CFR Part 11\",\n      \"eIDAS\",\n      \"GDPR\",\n      \"Annex 11\"\n    ]\n  },\n  {\n    \"id\": \"gdpr\",\n    \"category\": \"reg\",\n    \"labelNormal\": {\n      \"it\": \"Privacy dei dati personali\",\n      \"en\": \"Personal data privacy\"\n    },\n    \"labelTech\": {\n      \"it\": \"GDPR \u00b7 EU Reg. 2016\/679\",\n      \"en\": \"GDPR \u00b7 EU Reg. 2016\/679\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Il paziente ha diritti sui suoi dati.\",\n        \"en\": \"The patient has rights over their data.\"\n      },\n      \"tech\": {\n        \"it\": \"Art. 25 PbD \u00b7 Art. 30 ROPA \u00b7 Art. 32 \u00b7 Art. 33 Breach\",\n        \"en\": \"Art. 25 PbD \u00b7 Art. 30 ROPA \u00b7 Art. 32 \u00b7 Art. 33 Breach\"\n      }\n    },\n    \"primary\": [\n      \"cryptex\",\n      \"cobalt\"\n    ],\n    \"secondary\": [\n      \"covalent\"\n    ],\n    \"compliance\": [\n      \"GDPR\",\n      \"ALCOA+\",\n      \"ISO 27701\",\n      \"ePrivacy\"\n    ]\n  },\n  {\n    \"id\": \"hipaa\",\n    \"category\": \"reg\",\n    \"labelNormal\": {\n      \"it\": \"Protezione dati sanitari USA\",\n      \"en\": \"US health data protection\"\n    },\n    \"labelTech\": {\n      \"it\": \"HIPAA \u00b7 Privacy & Security Rules\",\n      \"en\": \"HIPAA \u00b7 Privacy & Security Rules\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Il \\\"GDPR\\\" americano per i dati sanitari.\",\n        \"en\": \"The US counterpart to GDPR for health data.\"\n      },\n      \"tech\": {\n        \"it\": \"Privacy Rule \u00b7 Security Rule \u00b7 Breach Notification Rule\",\n        \"en\": \"Privacy Rule \u00b7 Security Rule \u00b7 Breach Notification Rule\"\n      }\n    },\n    \"primary\": [\n      \"cryptex\",\n      \"cobalt\"\n    ],\n    \"secondary\": [\n      \"covalent\"\n    ],\n    \"compliance\": [\n      \"HIPAA\",\n      \"GDPR\",\n      \"SOC 2\",\n      \"ISO 27001\"\n    ]\n  },\n  {\n    \"id\": \"cfr11\",\n    \"category\": \"reg\",\n    \"labelNormal\": {\n      \"it\": \"Firme elettroniche \\\"da FDA\\\"\",\n      \"en\": \"FDA-grade electronic signatures\"\n    },\n    \"labelTech\": {\n      \"it\": \"21 CFR Part 11 \u00b7 Electronic Records & Signatures\",\n      \"en\": \"21 CFR Part 11 \u00b7 Electronic Records & Signatures\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Standard FDA per record e firme elettroniche.\",\n        \"en\": \"FDA standard for electronic records and signatures.\"\n      },\n      \"tech\": {\n        \"it\": \"Electronic records \u00b7 Closed\/Open systems \u00b7 Audit trail\",\n        \"en\": \"Electronic records \u00b7 Closed\/Open systems \u00b7 Audit trail\"\n      }\n    },\n    \"primary\": [\n      \"covalent\",\n      \"cobalt\"\n    ],\n    \"secondary\": [\n      \"capture\"\n    ],\n    \"compliance\": [\n      \"21 CFR Part 11\",\n      \"Annex 11\",\n      \"ALCOA+\",\n      \"ICH-GCP E6(R3)\"\n    ]\n  },\n  {\n    \"id\": \"annex11\",\n    \"category\": \"reg\",\n    \"labelNormal\": {\n      \"it\": \"Sistemi computerizzati in GMP\",\n      \"en\": \"Computerised systems in GMP\"\n    },\n    \"labelTech\": {\n      \"it\": \"EU GMP Annex 11 \u00b7 Computerised Systems\",\n      \"en\": \"EU GMP Annex 11 \u00b7 Computerised Systems\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Regole UE per software farmaceutico.\",\n        \"en\": \"EU rules for pharmaceutical software.\"\n      },\n      \"tech\": {\n        \"it\": \"Risk-based CSV \u00b7 Change control \u00b7 Periodic review\",\n        \"en\": \"Risk-based CSV \u00b7 Change control \u00b7 Periodic review\"\n      }\n    },\n    \"primary\": [\n      \"cobalt\"\n    ],\n    \"secondary\": [\n      \"capture\",\n      \"carbon\"\n    ],\n    \"compliance\": [\n      \"EU GMP Annex 11\",\n      \"GAMP 5\",\n      \"ALCOA+\"\n    ]\n  },\n  {\n    \"id\": \"gcp\",\n    \"category\": \"reg\",\n    \"labelNormal\": {\n      \"it\": \"Buone pratiche cliniche\",\n      \"en\": \"Good Clinical Practice\"\n    },\n    \"labelTech\": {\n      \"it\": \"ICH-GCP E6(R3)\",\n      \"en\": \"ICH-GCP E6(R3)\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Lo standard globale dei trial clinici.\",\n        \"en\": \"The global clinical trial standard.\"\n      },\n      \"tech\": {\n        \"it\": \"Sponsor \u00b7 Investigator \u00b7 IRB\/EC \u00b7 Essential Documents \u00b7 KPI\",\n        \"en\": \"Sponsor \u00b7 Investigator \u00b7 IRB\/EC \u00b7 Essential Documents \u00b7 KPI\"\n      }\n    },\n    \"primary\": [\n      \"capture\",\n      \"carbon\",\n      \"cobalt\"\n    ],\n    \"secondary\": [\n      \"clear\",\n      \"chronos\"\n    ],\n    \"compliance\": [\n      \"ICH-GCP E6(R3)\",\n      \"21 CFR Part 11\",\n      \"EU CTR 536\/2014\",\n      \"ISO 14155\"\n    ]\n  },\n  {\n    \"id\": \"iso13485\",\n    \"category\": \"reg\",\n    \"labelNormal\": {\n      \"it\": \"Qualit\u00e0 dispositivi medici \/ SaMD\",\n      \"en\": \"Medical device \/ SaMD quality\"\n    },\n    \"labelTech\": {\n      \"it\": \"ISO 13485 + IEC 62304 \u00b7 SaMD\",\n      \"en\": \"ISO 13485 + IEC 62304 \u00b7 SaMD\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Se il software \u00e8 dispositivo medico.\",\n        \"en\": \"When software is a medical device.\"\n      },\n      \"tech\": {\n        \"it\": \"QMS for MD \u00b7 Software Lifecycle \u00b7 Risk \u00b7 SaMD\",\n        \"en\": \"QMS for MD \u00b7 Software Lifecycle \u00b7 Risk \u00b7 SaMD\"\n      }\n    },\n    \"primary\": [\n      \"cobalt\"\n    ],\n    \"secondary\": [],\n    \"compliance\": [\n      \"ISO 13485\",\n      \"IEC 62304\",\n      \"IEC 82304-1\",\n      \"ISO 14971\",\n      \"MDR \u00b7 IVDR\"\n    ]\n  },\n  {\n    \"id\": \"alcoa\",\n    \"category\": \"reg\",\n    \"labelNormal\": {\n      \"it\": \"Integrit\u00e0 dei dati\",\n      \"en\": \"Data integrity\"\n    },\n    \"labelTech\": {\n      \"it\": \"ALCOA+ Data Integrity\",\n      \"en\": \"ALCOA+ Data Integrity\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Dati veri, attribuibili, completi.\",\n        \"en\": \"True, attributable, complete data.\"\n      },\n      \"tech\": {\n        \"it\": \"Attributable \u00b7 Legible \u00b7 Contemporaneous \u00b7 Original \u00b7 Accurate +\",\n        \"en\": \"Attributable \u00b7 Legible \u00b7 Contemporaneous \u00b7 Original \u00b7 Accurate +\"\n      }\n    },\n    \"primary\": [\n      \"capture\",\n      \"cobalt\"\n    ],\n    \"secondary\": [\n      \"chronos\"\n    ],\n    \"compliance\": [\n      \"ALCOA+\",\n      \"21 CFR Part 11\",\n      \"Annex 11\",\n      \"ICH-GCP E6(R3)\"\n    ]\n  },\n  {\n    \"id\": \"education\",\n    \"category\": \"eng\",\n    \"labelNormal\": {\n      \"it\": \"Educazione sanitaria del paziente\",\n      \"en\": \"Patient health education\"\n    },\n    \"labelTech\": {\n      \"it\": \"Patient Literacy \u00b7 Adherence Content\",\n      \"en\": \"Patient Literacy \u00b7 Adherence Content\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Capire la malattia aiuta a curarla.\",\n        \"en\": \"Understanding the condition aids treatment.\"\n      },\n      \"tech\": {\n        \"it\": \"Structured educational path \u00b7 Health literacy\",\n        \"en\": \"Structured educational path \u00b7 Health literacy\"\n      }\n    },\n    \"primary\": [\n      \"content\"\n    ],\n    \"secondary\": [\n      \"compact\"\n    ],\n    \"compliance\": [\n      \"GDPR\",\n      \"HIPAA\",\n      \"WCAG 2.1 AA\"\n    ]\n  },\n  {\n    \"id\": \"reminders\",\n    \"category\": \"eng\",\n    \"labelNormal\": {\n      \"it\": \"Promemoria per le visite\",\n      \"en\": \"Visit reminders\"\n    },\n    \"labelTech\": {\n      \"it\": \"Multi-tier Reminder Engine \u00b7 ALCOA+\",\n      \"en\": \"Multi-tier Reminder Engine \u00b7 ALCOA+\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Tre avvisi prima della visita.\",\n        \"en\": \"Three alerts before the visit.\"\n      },\n      \"tech\": {\n        \"it\": \"15d \u00b7 7d \u00b7 day-of \u00b7 overdue escalation \u00b7 IMAP tracking\",\n        \"en\": \"15d \u00b7 7d \u00b7 day-of \u00b7 overdue escalation \u00b7 IMAP tracking\"\n      }\n    },\n    \"primary\": [\n      \"chronos\"\n    ],\n    \"secondary\": [\n      \"compact\",\n      \"cryptex\"\n    ],\n    \"compliance\": [\n      \"GDPR\",\n      \"ALCOA+\",\n      \"ICH-GCP E6(R3)\"\n    ]\n  },\n  {\n    \"id\": \"reimbursement\",\n    \"category\": \"eng\",\n    \"labelNormal\": {\n      \"it\": \"Rimborsi spese paziente\",\n      \"en\": \"Patient expense reimbursement\"\n    },\n    \"labelTech\": {\n      \"it\": \"Patient Reimbursement Workflow\",\n      \"en\": \"Patient Reimbursement Workflow\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Il paziente spende. Il sistema rimborsa.\",\n        \"en\": \"The patient spends. The system reimburses.\"\n      },\n      \"tech\": {\n        \"it\": \"Per-visit pricing \u00b7 Multi-currency \u00b7 Receipt upload\",\n        \"en\": \"Per-visit pricing \u00b7 Multi-currency \u00b7 Receipt upload\"\n      }\n    },\n    \"primary\": [\n      \"chronos\"\n    ],\n    \"secondary\": [\n      \"carbon\"\n    ],\n    \"compliance\": [\n      \"GDPR\",\n      \"ALCOA+\",\n      \"ICH-GCP E6(R3)\"\n    ]\n  },\n  {\n    \"id\": \"incident\",\n    \"category\": \"eng\",\n    \"labelNormal\": {\n      \"it\": \"Segnalazione bug e incidenti\",\n      \"en\": \"Bug and incident reporting\"\n    },\n    \"labelTech\": {\n      \"it\": \"Cumulative Incident Reporting \u00b7 Pseudonymised\",\n      \"en\": \"Cumulative Incident Reporting \u00b7 Pseudonymised\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Segnalare un problema, in sicurezza.\",\n        \"en\": \"Report an issue, securely.\"\n      },\n      \"tech\": {\n        \"it\": \"Offline queue \u00b7 Telemetry \u00b7 Pseudonymised ticket\",\n        \"en\": \"Offline queue \u00b7 Telemetry \u00b7 Pseudonymised ticket\"\n      }\n    },\n    \"primary\": [\n      \"cryptex\"\n    ],\n    \"secondary\": [\n      \"compact\"\n    ],\n    \"compliance\": [\n      \"GDPR Art. 25\",\n      \"HIPAA\",\n      \"ISO 27001\"\n    ]\n  },\n  {\n    \"id\": \"moni-remote\",\n    \"category\": \"eng\",\n    \"labelNormal\": {\n      \"it\": \"Monitoraggio remoto del sito\",\n      \"en\": \"Remote site monitoring\"\n    },\n    \"labelTech\": {\n      \"it\": \"Remote Site Monitoring \u00b7 Carbon Sync\",\n      \"en\": \"Remote Site Monitoring \u00b7 Carbon Sync\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Il CRA controlla il centro senza volare.\",\n        \"en\": \"The CRA monitors the site without traveling.\"\n      },\n      \"tech\": {\n        \"it\": \"Real-time sync \u00b7 Task scheduling \u00b7 Time-boxed sharing\",\n        \"en\": \"Real-time sync \u00b7 Task scheduling \u00b7 Time-boxed sharing\"\n      }\n    },\n    \"primary\": [\n      \"clear\",\n      \"carbon\"\n    ],\n    \"secondary\": [],\n    \"compliance\": [\n      \"ICH-GCP E6(R3)\",\n      \"21 CFR Part 11\",\n      \"ALCOA+\"\n    ]\n  },\n  {\n    \"id\": \"identity\",\n    \"category\": \"eng\",\n    \"labelNormal\": {\n      \"it\": \"Identit\u00e0 e accessi utente\",\n      \"en\": \"User identity and access\"\n    },\n    \"labelTech\": {\n      \"it\": \"IAM \u00b7 Keycloak \u00b7 SPID\/CIE \u00b7 Biometric\",\n      \"en\": \"IAM \u00b7 Keycloak \u00b7 SPID\/CIE \u00b7 Biometric\"\n    },\n    \"subtitle\": {\n      \"normal\": {\n        \"it\": \"Chi entra, con cosa, quando, dove.\",\n        \"en\": \"Who logs in, with what, when, where.\"\n      },\n      \"tech\": {\n        \"it\": \"Keycloak \u00b7 Organization-scoped RBAC \u00b7 MFA \u00b7 PIN \u00b7 Biometric\",\n        \"en\": \"Keycloak \u00b7 Organization-scoped RBAC \u00b7 MFA \u00b7 PIN \u00b7 Biometric\"\n      }\n    },\n    \"primary\": [\n      \"covalent\"\n    ],\n    \"secondary\": [\n      \"cryptex\"\n    ],\n    \"compliance\": [\n      \"eIDAS\",\n      \"GDPR\",\n      \"NIS2\",\n      \"ISO 27001\"\n    ]\n  }\n];\n\n\/* Collegamenti tra piattaforme: mostrati quando tutte le piattaforme in `path` sono nello stack.\n   `path` con due elementi = flusso da \u2192 a; con un elemento = servizio trasversale. *\/\nconst DATA_FLOWS = [\n  {\n    \"path\": [\"capture\", \"carbon\"],\n    \"title\": {\"it\": \"Dati clinici \u2192 gestione dello studio\", \"en\": \"Clinical data \u2192 study management\"},\n    \"text\": {\"it\": \"I dati clinici (eCRF, ePRO, eConsent) raccolti con <strong>aChiral Capture<\/strong> alimentano direttamente <strong>aChiral Carbon<\/strong> per l'orchestrazione operativa dei centri e il controllo dei milestone di studio.\", \"en\": \"Clinical data (eCRF, ePRO, eConsent) captured with <strong>aChiral Capture<\/strong> feeds straight into <strong>aChiral Carbon<\/strong> for site operations and study milestone tracking.\"}\n  },\n  {\n    \"path\": [\"capture\", \"clear\"],\n    \"title\": {\"it\": \"Verifica remota del dato\", \"en\": \"Remote data verification\"},\n    \"text\": {\"it\": \"<strong>aChiral Clear<\/strong> accede in tempo reale ai form di <strong>Capture<\/strong> per la verifica remota del dato sorgente (rSDV) con flag di audit trail.\", \"en\": \"<strong>aChiral Clear<\/strong> reads <strong>Capture<\/strong> forms in real time for remote source data verification (rSDV) with audit trail flags.\"}\n  },\n  {\n    \"path\": [\"connect\", \"compact\"],\n    \"title\": {\"it\": \"Cartella clinica sullo smartphone\", \"en\": \"Health record on the smartphone\"},\n    \"text\": {\"it\": \"<strong>aChiral Compact<\/strong> estende la cartella EHR di <strong>Connect<\/strong> sullo smartphone del paziente con wearable sync, teleconsulti crittografati ed ePRO da remoto.\", \"en\": \"<strong>aChiral Compact<\/strong> brings the <strong>Connect<\/strong> EHR to the patient's smartphone with wearable sync, encrypted teleconsultations and remote ePRO.\"}\n  },\n  {\n    \"path\": [\"connect\", \"capture\"],\n    \"title\": {\"it\": \"Niente doppio inserimento\", \"en\": \"No double data entry\"},\n    \"text\": {\"it\": \"I dati longitudinali di <strong>Connect<\/strong> precompilano i parametri di baseline su <strong>Capture<\/strong>, eliminando il doppio inserimento.\", \"en\": \"Longitudinal data from <strong>Connect<\/strong> pre-fills baseline parameters in <strong>Capture<\/strong>, eliminating double data entry.\"}\n  },\n  {\n    \"path\": [\"chronos\", \"compact\"],\n    \"title\": {\"it\": \"Promemoria al paziente\", \"en\": \"Patient reminders\"},\n    \"text\": {\"it\": \"<strong>aChiral Chronos<\/strong> genera promemoria scadenze multilivello e notifica i pazienti su <strong>Compact<\/strong> gestendo i rimborsi spesa.\", \"en\": \"<strong>aChiral Chronos<\/strong> generates multi-level deadline reminders and notifies patients on <strong>Compact<\/strong>, handling expense reimbursements.\"}\n  },\n  {\n    \"path\": [\"covalent\"],\n    \"title\": {\"it\": \"Accessi e firme per tutte le piattaforme\", \"en\": \"Access and signatures for every platform\"},\n    \"text\": {\"it\": \"<strong>aChiral Covalent<\/strong> garantisce identit\u00e0 federata Keycloak (SSO, SPID\/CIE) e validit\u00e0 21 CFR Part 11 su tutte le firme elettroniche.\", \"en\": \"<strong>aChiral Covalent<\/strong> provides Keycloak federated identity (SSO, SPID\/CIE) and 21 CFR Part 11 validity for all electronic signatures.\"}\n  },\n  {\n    \"path\": [\"cobalt\"],\n    \"title\": {\"it\": \"Archivio qualit\u00e0 centrale\", \"en\": \"Central quality archive\"},\n    \"text\": {\"it\": \"<strong>aChiral Cobalt<\/strong> funge da archivio eQMS\/eTMF centrale, controllando SOP, registri CAPA e ciclo di vita software IEC 62304.\", \"en\": \"<strong>aChiral Cobalt<\/strong> acts as the central eQMS\/eTMF archive, controlling SOPs, CAPA records and the IEC 62304 software lifecycle.\"}\n  },\n  {\n    \"path\": [\"cryptex\"],\n    \"title\": {\"it\": \"Privacy trasversale\", \"en\": \"Cross-cutting privacy\"},\n    \"text\": {\"it\": \"<strong>aChiral Cryptex<\/strong> pseudonimizza in modo trasparente comunicazioni e segnalazioni conformemente al GDPR Art. 25.\", \"en\": \"<strong>aChiral Cryptex<\/strong> transparently pseudonymises communications and reports in line with GDPR Art. 25.\"}\n  }\n];\n\n\/* ==========================================================================\n   aChiral Navigator \u2014 Lingua attiva e testi dell'interfaccia (IT \/ EN)\n   La lingua segue quella della pagina WordPress: TranslatePress imposta\n   <html lang=\"en-...\"> e il prefisso \/en\/ nell'URL. ?lang=en forza l'inglese.\n   ========================================================================== *\/\n\nconst LANG = detectLanguage();\n\nfunction detectLanguage() {\n    const forced = new URLSearchParams(window.location.search).get('lang');\n    const pageLang = typeof document !== 'undefined' ? document.documentElement.lang : '';\n    const fromPath = \/^\\\/en(\\\/|$)\/.test(window.location.pathname || '') ? 'en' : '';\n    const code = (forced || pageLang || fromPath || 'it').slice(0, 2).toLowerCase();\n    return code === 'en' ? 'en' : 'it';\n}\n\n\/* I valori { one, many } sono plurali: t(key, { n }) sceglie la forma giusta *\/\nconst STRINGS = {\n    it: {\n        'unit.requirements': { one: '{n} requisito', many: '{n} requisiti' },\n        'unit.neededPlatforms': { one: '{n} piattaforma necessaria', many: '{n} piattaforme necessarie' },\n        'nav.label': 'Passi del configuratore',\n        'nav.step1': 'Profilo',\n        'nav.step2': 'Requisiti',\n        'nav.step3': 'Piattaforme aChiral',\n        'nav.step4': 'Riepilogo & Contatto',\n\n        'intro.eyebrow': 'Configuratore dell\\'ecosistema',\n        'intro.title': 'Costruisci il tuo <strong>ecosistema aChiral<\/strong>',\n        'intro.lead': 'aChiral \u00e8 un ecosistema modulare di piattaforme per la ricerca clinica e la sanit\u00e0: rispondi a poche domande sulla tua organizzazione e sui dati che gestisci, e ti mostriamo quali piattaforme ti servono, come dialogano tra loro e quali normative coprono.',\n        'step1.eyebrow': 'Passo 1 di 4 \u00b7 Profilo',\n        'step1.title': 'Che tipo di <strong>organizzazione<\/strong> sei?',\n        'step1.lead': 'Scegli il profilo pi\u00f9 vicino alla tua realt\u00e0: ti prepariamo una selezione iniziale di requisiti, che potrai cambiare al passo successivo.',\n        'step1.or': 'oppure',\n        'step1.noProfile': 'Nessun profilo',\n        'step1.noProfileDesc': 'Parti da zero e scegli tu i requisiti.',\n        'step1.ready': { one: '{n} requisito pronto', many: '{n} requisiti pronti' },\n        'step1.infoFree': '<strong>Nessun profilo<\/strong>, sceglierai tu i requisiti',\n        'step1.infoProfile': { one: '<strong>{name}<\/strong>, {n} requisito selezionato', many: '<strong>{name}<\/strong>, {n} requisiti selezionati' },\n        'step1.infoEmpty': 'Scegli un profilo per continuare.',\n        'step1.next': 'Continua',\n\n        'step2.eyebrow': 'Passo 2 di 4 \u00b7 Requisiti',\n        'step2.title': 'Cosa deve <strong>gestire<\/strong> il progetto?',\n        'step2.leadProfile': { one: 'Per il profilo <strong>{name}<\/strong> abbiamo gi\u00e0 selezionato {n} requisito: aggiungi o togli quelli che ti servono.', many: 'Per il profilo <strong>{name}<\/strong> abbiamo gi\u00e0 selezionato {n} requisiti: aggiungi o togli quelli che ti servono.' },\n        'step2.leadFree': 'Seleziona quello che il progetto deve gestire: tipi di paziente, dati da raccogliere, normative da rispettare.',\n        'step2.searchLabel': 'Cerca un requisito',\n        'step2.searchPlaceholder': 'Cerca requisito, norma, dato\u2026',\n        'step2.searchClear': 'Cancella ricerca',\n        'step2.addRecommended': { one: 'Aggiungi {n} consigliato', many: 'Aggiungi {n} consigliati' },\n        'step2.clearAll': 'Azzera selezione',\n        'step2.recommended': 'Consigliato',\n        'step2.groupCount': '{n} selezionati su {total}',\n        'step2.noResults': 'Nessun requisito corrisponde a \u201c{q}\u201d.',\n        'step2.resetFilters': 'Azzera ricerca',\n        'step2.previewLabel': 'Anteprima delle piattaforme',\n        'step2.previewTitle': 'Anteprima piattaforme',\n        'step2.previewEmpty': 'Nessun requisito selezionato.',\n        'step2.previewMore': { one: '+ {n} piattaforma facoltativa al passo 3', many: '+ {n} piattaforme facoltative al passo 3' },\n        'step2.infoEmpty': 'Seleziona almeno un requisito.',\n        'step2.prev': 'Cambia profilo',\n        'step2.next': 'Vedi piattaforme',\n\n        'step3.eyebrow': 'Passo 3 di 4 \u00b7 Piattaforme',\n        'step3.title': 'Le <strong>piattaforme<\/strong> che ti servono',\n        'step3.lead': { one: 'Per il tuo requisito partiamo dalle piattaforme core; sotto trovi quelle che completano la copertura e, in fondo, altre compatibili.', many: 'Per i tuoi {n} requisiti partiamo dalle piattaforme core; sotto trovi quelle che completano la copertura e, in fondo, altre compatibili.' },\n        'step3.empty': 'Nessuna piattaforma trovata: seleziona almeno un requisito al passo 2.',\n        'step3.servesFor': 'Serve per',\n        'step3.strengthens': 'Rafforza',\n        'step3.showOptional': { one: 'Mostra {n} altra piattaforma compatibile', many: 'Mostra {n} altre piattaforme compatibili' },\n        'step3.hideOptional': { one: 'Nascondi {n} altra piattaforma compatibile', many: 'Nascondi {n} altre piattaforme compatibili' },\n        'step3.optionalNote': 'Non sono necessarie per i requisiti scelti, ma li rafforzano e possono coprire altri requisiti. Scegli i requisiti in pi\u00f9 che ti servono: la piattaforma entra nella configurazione insieme a loro.',\n        'step3.extraPrimary': 'Requisiti in pi\u00f9 che copre',\n        'step3.extraSecondary': 'Contribuisce anche a',\n        'step3.addPlatformOnly': 'Aggiungi solo la piattaforma',\n        'step3.remove': 'Rimuovi',\n        'step3.flowsTitle': 'Come si collegano',\n        'step3.flowsLead': 'Le piattaforme non lavorano da sole: ecco come si passano i dati tra loro.',\n        'step3.flowsEmpty': 'Le piattaforme selezionate lavorano in modo indipendente: non ci sono scambi di dati da segnalare.',\n        'step3.flowWholeStack': 'su tutto lo stack',\n        'step3.flowTo': 'verso',\n        'step3.complianceTitle': 'Normative coperte',\n        'step3.complianceLead': 'Standard che questa configurazione ti aiuta a rispettare.',\n        'step3.info': { one: '<strong>{n} piattaforma nella configurazione<\/strong> \u00b7 {c} normative', many: '<strong>{n} piattaforme nella configurazione<\/strong> \u00b7 {c} normative' },\n        'step3.prev': 'Modifica requisiti',\n        'step3.next': 'Richiedi configurazione',\n\n        'step4.eyebrow': 'Passo 4 di 4 \u00b7 Riepilogo',\n        'step4.title': 'Riepilogo e <strong>richiesta<\/strong>',\n        'step4.lead': 'Controlla la configurazione e inviala: un solution engineer ti ricontatta entro un giorno lavorativo. Non \u00e8 un ordine n\u00e9 un impegno.',\n        'step4.back': 'Torna alle piattaforme',\n        'step4.summaryTitle': 'La tua configurazione',\n        'step4.edit': 'Modifica',\n        'step4.profile': 'Profilo selezionato',\n        'step4.platforms': 'Piattaforme raccomandate',\n        'step4.requirements': 'Requisiti selezionati',\n        'step4.compliance': 'Quadro normativo',\n        'step4.showMore': { one: '+{n} altro', many: '+{n} altri' },\n        'step4.showLess': 'Mostra meno',\n        'step4.copy': 'Copia testo',\n        'step4.print': 'Stampa \/ PDF',\n        'step4.formTitle': 'Richiedi una proposta',\n        'step4.freeConfig': 'Configurazione libera',\n\n        'tier.core.label': 'Core',\n        'tier.core.title': 'Il tuo punto di partenza',\n        'tier.core.note': 'le piattaforme indispensabili',\n        'tier.complement.label': 'Completamento',\n        'tier.complement.title': 'Da aggiungere per coprire tutto',\n        'tier.complement.note': 'gestiscono i requisiti che le piattaforme core non coprono',\n        'tier.added.label': 'Aggiunta',\n        'tier.added.title': 'Aggiunte da te',\n        'tier.added.note': 'piattaforme facoltative che hai incluso nella configurazione',\n        'tier.optional.label': 'Facoltativa',\n        'tier.optional.title': 'Potresti aggiungere in seguito',\n        'tier.optional.note': 'non indispensabili: rafforzano requisiti gi\u00e0 coperti',\n\n        'cat.patient': 'Pazienti & Arruolamento',\n        'cat.data': 'Dati Clinici & Documenti',\n        'cat.reg': 'Normative & Qualit\u00e0',\n        'cat.eng': 'Engagement & Operativit\u00e0',\n\n        'toast.needProfile': 'Seleziona prima un profilo.',\n        'toast.needRequirement': 'Seleziona almeno un requisito per proseguire.',\n        'toast.profileChanged': 'Profilo cambiato: requisiti aggiornati per {name}.',\n        'toast.profileRemoved': 'Profilo rimosso: sceglierai tu i requisiti.',\n        'toast.recommendedAdded': { one: '{n} requisito consigliato aggiunto.', many: '{n} requisiti consigliati aggiunti.' },\n        'toast.cleared': 'Selezione azzerata.',\n        'toast.requirementAdded': 'Requisito aggiunto con {name}.',\n        'toast.platformAdded': '{name} aggiunta alla configurazione.',\n        'toast.copied': 'Scheda copiata negli appunti.',\n        'toast.copyFailed': 'Copia non riuscita: usa \u00abStampa \/ PDF\u00bb.',\n\n        'print.title': \"Configurazione dell'ecosistema aChiral\",\n        'print.profile': 'Profilo',\n        'print.intro': 'Questa scheda riassume i requisiti che hai scelto nel configuratore, le piattaforme aChiral che servono per gestirli, i collegamenti tra loro e le normative coperte.',\n        'print.kpiRequirements': { one: 'requisito scelto', many: 'requisiti scelti' },\n        'print.kpiPlatforms': { one: 'piattaforma inclusa', many: 'piattaforme incluse' },\n        'print.kpiFlows': { one: 'flusso dati', many: 'flussi dati' },\n        'print.kpiCompliance': { one: 'normativa coperta', many: 'normative coperte' },\n        'print.complianceLabel': 'Normative che questa configurazione ti aiuta a rispettare',\n        'print.reqTitle': 'I requisiti che hai scelto',\n        'print.reqLead': 'Cosa deve gestire il progetto, raggruppato per categoria, con le piattaforme della configurazione che lo gestiscono (in grassetto quella principale).',\n        'print.colRequirement': 'Requisito',\n        'print.colBrief': 'In breve',\n        'print.colManagedBy': 'Gestito da',\n        'print.pfmTitle': 'Le piattaforme della configurazione',\n        'print.pfmLeadCore': 'Si parte dalle piattaforme <strong>core<\/strong>',\n        'print.pfmLeadComplement': '; quelle di <strong>completamento<\/strong> servono per i requisiti che le core non coprono',\n        'print.pfmLeadAdded': '; quelle <strong>aggiunte da te<\/strong> rafforzano requisiti gi\u00e0 coperti',\n        'print.pfmLeadEnd': '. Sotto ciascuna i requisiti collegati, utili per capire quali moduli attivare: in grassetto quelli che gestisce direttamente.',\n        'print.linked': 'Requisiti collegati:',\n        'print.flowsTitle': 'Come si collegano',\n        'print.flowsEmpty': 'Le piattaforme selezionate lavorano in modo indipendente.',\n        'print.nextTitle': 'Prossimo passo:',\n        'print.nextText': 'Invia questa configurazione dal configuratore su achiral.it\/ecosystem o scrivi a info@achiral.it: un solution engineer ti ricontatta entro un giorno lavorativo con una proposta o per una demo.',\n        'print.disclaimer': 'Documento preliminare, non vincolante.',\n        'print.page': 'Pagina',\n        'print.of': 'di',\n        'print.reopen': 'Riapri questa configurazione: {url}',\n\n        'text.title': 'aChiral Ecosystem Navigator \u2014 Configurazione del progetto',\n        'text.profile': 'Profilo',\n        'text.date': 'Data',\n        'text.requirements': 'Requisiti selezionati',\n        'text.platforms': 'Piattaforme della configurazione',\n        'text.linked': 'Requisiti collegati',\n        'text.compliance': 'Normative coperte',\n        'text.footer': 'Generato con aChiral Navigator (https:\/\/achiral.it\/ecosystem\/)'\n    },\n\n    en: {\n        'unit.requirements': { one: '{n} requirement', many: '{n} requirements' },\n        'unit.neededPlatforms': { one: '{n} platform needed', many: '{n} platforms needed' },\n        'nav.label': 'Configurator steps',\n        'nav.step1': 'Profile',\n        'nav.step2': 'Requirements',\n        'nav.step3': 'aChiral platforms',\n        'nav.step4': 'Summary & Contact',\n\n        'intro.eyebrow': 'Ecosystem configurator',\n        'intro.title': 'Build your <strong>aChiral ecosystem<\/strong>',\n        'intro.lead': 'aChiral is a modular ecosystem of platforms for clinical research and healthcare: answer a few questions about your organisation and the data you handle, and we show you which platforms you need, how they work together and which regulations they cover.',\n        'step1.eyebrow': 'Step 1 of 4 \u00b7 Profile',\n        'step1.title': 'What kind of <strong>organisation<\/strong> are you?',\n        'step1.lead': 'Pick the profile closest to yours: we prepare a starting selection of requirements that you can change in the next step.',\n        'step1.or': 'or',\n        'step1.noProfile': 'No profile',\n        'step1.noProfileDesc': 'Start from scratch and choose the requirements yourself.',\n        'step1.ready': { one: '{n} requirement ready', many: '{n} requirements ready' },\n        'step1.infoFree': '<strong>No profile<\/strong>, you will choose the requirements',\n        'step1.infoProfile': { one: '<strong>{name}<\/strong>, {n} requirement selected', many: '<strong>{name}<\/strong>, {n} requirements selected' },\n        'step1.infoEmpty': 'Choose a profile to continue.',\n        'step1.next': 'Continue',\n\n        'step2.eyebrow': 'Step 2 of 4 \u00b7 Requirements',\n        'step2.title': 'What does the project need to <strong>manage<\/strong>?',\n        'step2.leadProfile': { one: 'For the <strong>{name}<\/strong> profile we have already selected {n} requirement: add or remove what you need.', many: 'For the <strong>{name}<\/strong> profile we have already selected {n} requirements: add or remove what you need.' },\n        'step2.leadFree': 'Select what the project needs to manage: patient types, data to collect, regulations to comply with.',\n        'step2.searchLabel': 'Search a requirement',\n        'step2.searchPlaceholder': 'Search requirement, regulation, data\u2026',\n        'step2.searchClear': 'Clear search',\n        'step2.addRecommended': { one: 'Add {n} recommended', many: 'Add {n} recommended' },\n        'step2.clearAll': 'Clear selection',\n        'step2.recommended': 'Recommended',\n        'step2.groupCount': '{n} selected out of {total}',\n        'step2.noResults': 'No requirement matches \u201c{q}\u201d.',\n        'step2.resetFilters': 'Clear search',\n        'step2.previewLabel': 'Platform preview',\n        'step2.previewTitle': 'Platform preview',\n        'step2.previewEmpty': 'No requirement selected.',\n        'step2.previewMore': { one: '+ {n} optional platform in step 3', many: '+ {n} optional platforms in step 3' },\n        'step2.infoEmpty': 'Select at least one requirement.',\n        'step2.prev': 'Change profile',\n        'step2.next': 'See platforms',\n\n        'step3.eyebrow': 'Step 3 of 4 \u00b7 Platforms',\n        'step3.title': 'The <strong>platforms<\/strong> you need',\n        'step3.lead': { one: 'For your requirement we start from the core platforms; below you find those that complete the coverage and, at the bottom, other compatible ones.', many: 'For your {n} requirements we start from the core platforms; below you find those that complete the coverage and, at the bottom, other compatible ones.' },\n        'step3.empty': 'No platform found: select at least one requirement in step 2.',\n        'step3.servesFor': 'Covers',\n        'step3.strengthens': 'Strengthens',\n        'step3.showOptional': { one: 'Show {n} more compatible platform', many: 'Show {n} more compatible platforms' },\n        'step3.hideOptional': { one: 'Hide {n} compatible platform', many: 'Hide {n} compatible platforms' },\n        'step3.optionalNote': 'They are not needed for the chosen requirements, but they strengthen them and can cover further requirements. Pick the extra requirements you need: the platform joins the configuration with them.',\n        'step3.extraPrimary': 'Extra requirements it covers',\n        'step3.extraSecondary': 'Also contributes to',\n        'step3.addPlatformOnly': 'Add the platform only',\n        'step3.remove': 'Remove',\n        'step3.flowsTitle': 'How they connect',\n        'step3.flowsLead': 'The platforms do not work alone: this is how they exchange data.',\n        'step3.flowsEmpty': 'The selected platforms work independently: there are no data exchanges to report.',\n        'step3.flowWholeStack': 'across the whole stack',\n        'step3.flowTo': 'to',\n        'step3.complianceTitle': 'Regulations covered',\n        'step3.complianceLead': 'Standards this configuration helps you comply with.',\n        'step3.info': { one: '<strong>{n} platform in the configuration<\/strong> \u00b7 {c} regulations', many: '<strong>{n} platforms in the configuration<\/strong> \u00b7 {c} regulations' },\n        'step3.prev': 'Edit requirements',\n        'step3.next': 'Request configuration',\n\n        'step4.eyebrow': 'Step 4 of 4 \u00b7 Summary',\n        'step4.title': 'Summary and <strong>request<\/strong>',\n        'step4.lead': 'Check the configuration and send it: a solution engineer will get back to you within one business day. It is neither an order nor a commitment.',\n        'step4.back': 'Back to platforms',\n        'step4.summaryTitle': 'Your configuration',\n        'step4.edit': 'Edit',\n        'step4.profile': 'Selected profile',\n        'step4.platforms': 'Recommended platforms',\n        'step4.requirements': 'Selected requirements',\n        'step4.compliance': 'Regulatory framework',\n        'step4.showMore': { one: '+{n} more', many: '+{n} more' },\n        'step4.showLess': 'Show less',\n        'step4.copy': 'Copy text',\n        'step4.print': 'Print \/ PDF',\n        'step4.formTitle': 'Request a proposal',\n        'step4.freeConfig': 'Free configuration',\n\n        'tier.core.label': 'Core',\n        'tier.core.title': 'Your starting point',\n        'tier.core.note': 'the essential platforms',\n        'tier.complement.label': 'Completion',\n        'tier.complement.title': 'Add to cover everything',\n        'tier.complement.note': 'they handle the requirements the core platforms do not cover',\n        'tier.added.label': 'Added',\n        'tier.added.title': 'Added by you',\n        'tier.added.note': 'optional platforms you included in the configuration',\n        'tier.optional.label': 'Optional',\n        'tier.optional.title': 'You could add later',\n        'tier.optional.note': 'not essential: they strengthen requirements already covered',\n\n        'cat.patient': 'Patients & Enrolment',\n        'cat.data': 'Clinical Data & Documents',\n        'cat.reg': 'Regulations & Quality',\n        'cat.eng': 'Engagement & Operations',\n\n        'toast.needProfile': 'Select a profile first.',\n        'toast.needRequirement': 'Select at least one requirement to continue.',\n        'toast.profileChanged': 'Profile changed: requirements updated for {name}.',\n        'toast.profileRemoved': 'Profile removed: you will choose the requirements.',\n        'toast.recommendedAdded': { one: '{n} recommended requirement added.', many: '{n} recommended requirements added.' },\n        'toast.cleared': 'Selection cleared.',\n        'toast.requirementAdded': 'Requirement added with {name}.',\n        'toast.platformAdded': '{name} added to the configuration.',\n        'toast.copied': 'Summary copied to the clipboard.',\n        'toast.copyFailed': 'Copy failed: use \u201cPrint \/ PDF\u201d.',\n\n        'print.title': 'aChiral ecosystem configuration',\n        'print.profile': 'Profile',\n        'print.intro': 'This sheet summarises the requirements you chose in the configurator, the aChiral platforms needed to manage them, how they connect and the regulations covered.',\n        'print.kpiRequirements': { one: 'requirement chosen', many: 'requirements chosen' },\n        'print.kpiPlatforms': { one: 'platform included', many: 'platforms included' },\n        'print.kpiFlows': { one: 'data flow', many: 'data flows' },\n        'print.kpiCompliance': { one: 'regulation covered', many: 'regulations covered' },\n        'print.complianceLabel': 'Regulations this configuration helps you comply with',\n        'print.reqTitle': 'The requirements you chose',\n        'print.reqLead': 'What the project needs to manage, grouped by category, with the configuration platforms that handle it (the main one in bold).',\n        'print.colRequirement': 'Requirement',\n        'print.colBrief': 'In short',\n        'print.colManagedBy': 'Handled by',\n        'print.pfmTitle': 'The configuration platforms',\n        'print.pfmLeadCore': 'We start from the <strong>core<\/strong> platforms',\n        'print.pfmLeadComplement': '; the <strong>completion<\/strong> platforms cover what the core ones do not',\n        'print.pfmLeadAdded': '; those <strong>added by you<\/strong> strengthen requirements already covered',\n        'print.pfmLeadEnd': '. Under each one, the linked requirements, useful to decide which modules to activate: in bold those it handles directly.',\n        'print.linked': 'Linked requirements:',\n        'print.flowsTitle': 'How they connect',\n        'print.flowsEmpty': 'The selected platforms work independently.',\n        'print.nextTitle': 'Next step:',\n        'print.nextText': 'Send this configuration from the configurator at achiral.it\/ecosystem or write to info@achiral.it: a solution engineer will get back to you within one business day with a proposal or a demo.',\n        'print.disclaimer': 'Preliminary, non-binding document.',\n        'print.page': 'Page',\n        'print.of': 'of',\n        'print.reopen': 'Reopen this configuration: {url}',\n\n        'text.title': 'aChiral Ecosystem Navigator \u2014 Project configuration',\n        'text.profile': 'Profile',\n        'text.date': 'Date',\n        'text.requirements': 'Selected requirements',\n        'text.platforms': 'Configuration platforms',\n        'text.linked': 'Linked requirements',\n        'text.compliance': 'Regulations covered',\n        'text.footer': 'Generated with aChiral Navigator (https:\/\/achiral.it\/ecosystem\/)'\n    }\n};\n\n\/* Testo tradotto; {nome} viene sostituito dai valori in vars *\/\nfunction t(key, vars = {}) {\n    let value = STRINGS[LANG][key] ?? STRINGS.it[key] ?? key;\n    if (typeof value === 'object') value = vars.n === 1 ? value.one : value.many;\n    return value.replace(\/\\{(\\w+)\\}\/g, (match, name) => (name in vars ? vars[name] : match));\n}\n\n\/* Valore nella lingua attiva di un campo dati { it, en } (le stringhe semplici passano invariate) *\/\nfunction L(value) {\n    return value && typeof value === 'object' ? (value[LANG] || value.it) : value;\n}\n\n\/* Traduce il markup statico: data-i18n (contenuto) e data-i18n-<attributo> *\/\nfunction translateStaticText(root) {\n    \/* Testi gi\u00e0 scritti dal build (prefillStaticText): se il CSS mostra gi\u00e0 la lingua giusta si toglie\n       solo l'altra, senza ridisegnare il testo visibile (altrimenti conterebbe come un nuovo LCP) *\/\n    const shownLang = \/^en\/i.test(document.documentElement.lang) ? 'en' : 'it';\n    root.querySelectorAll('[data-i18n]').forEach(el => {\n        if (LANG === shownLang && el.querySelector(`:scope > .ach-pre--${LANG}`)) {\n            el.querySelectorAll(`:scope > .ach-pre:not(.ach-pre--${LANG})`).forEach(span => span.remove());\n            return;\n        }\n        el.innerHTML = t(el.dataset.i18n);\n    });\n    ['placeholder', 'aria-label', 'title'].forEach(attr => {\n        root.querySelectorAll(`[data-i18n-${attr}]`).forEach(el => {\n            el.setAttribute(attr, t(el.getAttribute(`data-i18n-${attr}`)));\n        });\n    });\n}\n\n\/* ==========================================================================\n   aChiral Navigator \u2014 Logica del wizard (richiede js\/data.js e js\/i18n.js)\n   ========================================================================== *\/\n\n\/* ============ METADATI UI ============ *\/\nconst CAT_ORDER = ['patient', 'data', 'reg', 'eng'];\n\/* Livelli delle piattaforme: testi in i18n.js (tier.<nome>.label\/title\/note) *\/\nconst TIER_CSS = { core: 'core', complement: 'supp', added: 'supp', optional: 'opt' };\nconst tierText = (tier, part) => t(`tier.${tier}.${part}`);\nconst TIER_ORDER = ['core', 'complement', 'added', 'optional'];\n\n\/* Logo della scheda PDF: file gi\u00e0 pubblicato su achiral.it, funziona sia in locale sia su WordPress *\/\nconst LOGO_URL = 'https:\/\/achiral.it\/wp-content\/uploads\/2022\/11\/aChiral_logo-768x199.png';\nconst PREFERS_REDUCED_MOTION = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n\/* Wizard State *\/\nconst wizard = {\n    currentStep: 1,\n    selectedMacroId: null,      \/* Nessun profilo pre-selezionato: la scelta \u00e8 esplicita *\/\n    isExplorationMode: false,\n    selectedServices: [],\n    addedPlatforms: [],         \/* Piattaforme facoltative incluse a mano al passo 3 *\/\n    showOptional: false,\n    collapsedCats: [],          \/* Categorie chiuse al passo 2 *\/\n    filterCat: 'all',\n    searchQuery: '',\n    expandedChips: []           \/* Elenchi del riepilogo (passo 4) aperti per intero *\/\n};\n\n\/* ============ HELPERS ============ *\/\nfunction getProfile() {\n    if (wizard.isExplorationMode) return null;\n    return MACRO_ENTITIES.find(m => m.id === wizard.selectedMacroId) || null;\n}\n\nfunction getProfileDefaults(m) {\n    return m ? [...(m.coreItems || m.items)] : [];\n}\n\nfunction hasProfile() {\n    return wizard.isExplorationMode || !!getProfile();\n}\n\nfunction isSelected(id) {\n    return wizard.selectedServices.includes(id);\n}\n\n\nfunction shortName(pid) {\n    return PLATFORMS_DATA[pid].name.replace(\/^aChiral\\s+\/, '');\n}\n\n\n\/* Passo massimo raggiungibile con lo stato attuale *\/\nfunction maxReachableStep() {\n    if (!hasProfile()) return 1;\n    if (wizard.selectedServices.length === 0) return 2;\n    return 4;\n}\n\n\/* Niente `s` e `p`: in WordPress sono la ricerca e l'id articolo, e la pagina diventerebbe\n   \"risultati di ricerca\" o 404 invece del configuratore *\/\nconst STATE_PARAMS = ['step', 'macro', 'mode', 'req', 'pfm'];\n\n\/* Aggiunge a `params` lo stato del wizard *\/\nfunction writeStateParams(params) {\n    STATE_PARAMS.forEach(k => params.delete(k));\n    if (wizard.currentStep > 1) params.set('step', wizard.currentStep);\n    if (wizard.isExplorationMode) params.set('mode', 'all');\n    else if (wizard.selectedMacroId) params.set('macro', wizard.selectedMacroId);\n    if (wizard.selectedServices.length) params.set('req', wizard.selectedServices.join(','));\n    if (wizard.addedPlatforms.length) params.set('pfm', wizard.addedPlatforms.join(','));\n    return params;\n}\n\n\/* Link che riapre la configurazione: solo pagina e stato, senza parametri estranei\n   (anteprima WordPress, UTM\u2026); page_id resta per i permalink non \"belli\" *\/\nfunction configurationLink() {\n    if (!\/^https?:\/.test(window.location.protocol)) return '';\n    const params = new URLSearchParams();\n    const pageId = new URLSearchParams(window.location.search).get('page_id');\n    if (pageId) params.set('page_id', pageId);\n    writeStateParams(params);\n    if (wizard.currentStep === 4) params.set('print', '1');\n    \/* Virgole in chiaro: il link resta leggibile nel CRM (sono valide in una query) *\/\n    const qs = params.toString().replace(\/%2C\/gi, ',');\n    return window.location.origin + window.location.pathname + (qs ? '?' + qs : '');\n}\n\nfunction syncUrl() {\n    try {\n        const qs = writeStateParams(new URLSearchParams(window.location.search)).toString();\n        history.replaceState(null, '', window.location.pathname + (qs ? '?' + qs : '') + window.location.hash);\n    } catch (e) { \/* ambienti sandbox senza history *\/ }\n}\n\nfunction onSelectionChanged() {\n    refreshStepper();\n    syncUrl();\n}\n\n\/* ============ STEP NAVIGATION ============ *\/\nfunction refreshStepper() {\n    const maxStep = maxReachableStep();\n    for (let i = 1; i <= 4; i++) {\n        const ind = document.getElementById('stepIndicator' + i);\n        const isActive = i === wizard.currentStep;\n        const isDone = i < wizard.currentStep;\n        ind.classList.toggle('is-active', isActive);\n        ind.classList.toggle('is-done', isDone);\n        ind.disabled = i > maxStep;\n        if (isActive) ind.setAttribute('aria-current', 'step');\n        else ind.removeAttribute('aria-current');\n        ind.querySelector('.ach-step-num').innerHTML = isDone ? '<i class=\"ach-ico ach-ico--check\" aria-hidden=\"true\"><\/i>' : '0' + i;\n    }\n    document.getElementById('stepperProgress').style.width = ((wizard.currentStep - 1) \/ 3 * 100) + '%';\n}\n\n\/* Altezza di ci\u00f2 che resta fisso in alto sulla pagina WordPress: header sticky di Elementor\n   e barra admin (solo per chi \u00e8 loggato). In sviluppo non c'\u00e8 nessuno dei due: 0 *\/\nfunction stickyHeaderHeight() {\n    \/* Elementor pu\u00f2 avere pi\u00f9 header sticky (desktop e mobile): conta quello visibile *\/\n    const headers = document.querySelectorAll('.elementor-location-header [data-settings*=\"sticky\"]');\n    const header = Math.max(0, ...Array.from(headers, el => el.offsetHeight));\n    const adminBar = document.getElementById('wpadminbar');\n    return header + (adminBar ? adminBar.offsetHeight : 0);\n}\n\nfunction goToStep(step, opts = {}) {\n    if (step < 1 || step > 4) return;\n    const maxStep = maxReachableStep();\n    if (step > maxStep) {\n        showToast(t(maxStep === 1 ? 'toast.needProfile' : 'toast.needRequirement'), 'warn');\n        return;\n    }\n    wizard.currentStep = step;\n\n    for (let i = 1; i <= 4; i++) {\n        document.getElementById('stepView' + i).classList.toggle('is-visible', i === step);\n    }\n    refreshStepper();\n\n    if (step === 1) renderMacroGrid();\n    else if (step === 2) renderStep2();\n    else if (step === 3) renderStep3Results();\n    else if (step === 4) renderStep4Summary();\n\n    syncUrl();\n    if (step === 4) renderCobaltForm();\n\n    if (!opts.initial) {\n        \/* La pagina riparte dallo stepper, sotto l'header sticky del sito: l'introduzione resta sopra *\/\n        const stepper = document.querySelector('#achiral-navigator .ach-stepper-wrap');\n        const top = stepper.getBoundingClientRect().top + window.scrollY - stickyHeaderHeight();\n        window.scrollTo({ top: Math.max(0, top), behavior: PREFERS_REDUCED_MOTION ? 'auto' : 'smooth' });\n        const heading = document.querySelector('#stepView' + step + ' .ach-h1, #stepView' + step + ' .ach-h2');\n        if (heading) heading.focus({ preventScroll: true });\n    }\n}\n\n\/* Compute Platform Stack Algorithm *\/\nfunction computeStack() {\n    const selected = wizard.selectedServices.map(id => ITEMS_DATA.find(s => s.id === id)).filter(Boolean);\n    const ranked = rankPlatforms(selected);\n\n    \/* Core = al massimo 2 piattaforme (docs\/adr\/0001-core-al-massimo-due.md), fissate\n       sulla selezione iniziale del profilo (docs\/adr\/0002-core-stabili.md). *\/\n    const coreIds = new Set(resolveCorePlatforms(selected));\n    const fills = pickComplementPlatforms(selected, ranked, coreIds);\n    ranked.forEach(p => {\n        p.tier = coreIds.has(p.id) ? 'core' : fills.has(p.id) ? 'complement'\n            : wizard.addedPlatforms.includes(p.id) ? 'added' : 'optional';\n        p.fills = fills.get(p.id) || [];\n    });\n    ranked.sort((a, b) => TIER_ORDER.indexOf(a.tier) - TIER_ORDER.indexOf(b.tier));\n\n    const compSet = new Set();\n    selected.forEach(s => (s.compliance || []).forEach(c => compSet.add(c)));\n\n    return {\n        services: selected,\n        ranked,\n        compliance: [...compSet]\n    };\n}\n\nfunction rankPlatforms(items) {\n    const pmap = new Map();\n\n    items.forEach(s => {\n        (s.primary || []).forEach(pid => {\n            if (!pmap.has(pid)) pmap.set(pid, { id: pid, score: 0, primary_hits: 0, secondary_hits: 0, items: [] });\n            const e = pmap.get(pid);\n            e.score += 2;\n            e.primary_hits += 1;\n            if (!e.items.includes(s.id)) e.items.push(s.id);\n        });\n        (s.secondary || []).forEach(pid => {\n            if (!pmap.has(pid)) pmap.set(pid, { id: pid, score: 0, primary_hits: 0, secondary_hits: 0, items: [] });\n            const e = pmap.get(pid);\n            e.score += 1;\n            e.secondary_hits += 1;\n            if (!e.items.includes(s.id)) e.items.push(s.id);\n        });\n    });\n\n    const ranked = [...pmap.values()].filter(p => p.primary_hits >= 1 || p.secondary_hits >= 2);\n    ranked.sort((a, b) => b.score - a.score || b.primary_hits - a.primary_hits);\n    return ranked;\n}\n\n\/* La pi\u00f9 rilevante e, se serve, quella che copre in modo primario pi\u00f9 requisiti rimasti scoperti *\/\nfunction pickCorePlatforms(items) {\n    const candidates = rankPlatforms(items).filter(p => p.primary_hits >= 1);\n    if (!candidates.length) return [];\n    const first = candidates[0];\n    const uncovered = items.filter(s => !(s.primary || []).includes(first.id));\n    let second = null;\n    let secondHits = 0;\n    candidates.slice(1).forEach(p => {\n        const hits = uncovered.filter(s => (s.primary || []).includes(p.id)).length;\n        if (hits > secondHits) { second = p; secondHits = hits; }\n    });\n    return second ? [first.id, second.id] : [first.id];\n}\n\n\/* Completamento: le piattaforme minime per coprire in modo primario i requisiti lasciati scoperti dalle Core.\n   Restituisce id piattaforma \u2192 requisiti che copre. *\/\nfunction pickComplementPlatforms(selected, ranked, coreIds) {\n    const fills = new Map();\n    let uncovered = selected.filter(s => !(s.primary || []).some(pid => coreIds.has(pid)));\n    while (uncovered.length) {\n        let best = null;\n        let bestItems = [];\n        ranked.forEach(p => {\n            if (coreIds.has(p.id) || fills.has(p.id)) return;\n            const covered = uncovered.filter(s => (s.primary || []).includes(p.id));\n            if (covered.length > bestItems.length) { best = p; bestItems = covered; }\n        });\n        if (!best) break;\n        fills.set(best.id, bestItems.map(s => s.id));\n        uncovered = uncovered.filter(s => !bestItems.includes(s));\n    }\n    return fills;\n}\n\n\/* Le Core nascono dalla selezione iniziale; una Core viene sostituita solo se non copre pi\u00f9 alcun requisito *\/\nfunction resolveCorePlatforms(selected) {\n    const profile = getProfile();\n    const base = profile ? getProfileDefaults(profile).map(id => ITEMS_DATA.find(s => s.id === id)).filter(Boolean) : selected;\n    const initial = pickCorePlatforms(base);\n    const kept = initial.filter(pid => selected.some(s => (s.primary || []).includes(pid)));\n    if (kept.length === initial.length) return kept;\n    pickCorePlatforms(selected).forEach(pid => {\n        if (kept.length < initial.length && !kept.includes(pid)) kept.push(pid);\n    });\n    return kept;\n}\n\n\/* Le piattaforme che fanno parte della configurazione: tutte tranne le facoltative non aggiunte *\/\nfunction includedPlatforms(ranked) {\n    return ranked.filter(p => p.tier !== 'optional');\n}\n\n\/* Solo i flussi tra piattaforme incluse (Core e Completamento): le facoltative non sono ancora scelte *\/\nfunction getDataFlows(ranked) {\n    const ids = new Set(includedPlatforms(ranked).map(p => p.id));\n    return DATA_FLOWS.filter(f => f.path.every(pid => ids.has(pid)));\n}\n\nfunction renderFlowCards(ranked) {\n    const flows = getDataFlows(ranked);\n    if (!flows.length) {\n        return `<p class=\"ach-flow-empty\">${t('step3.flowsEmpty')}<\/p>`;\n    }\n    const pill = pid => `<span class=\"ach-flow-pill\" style=\"--pfm-color:${PLATFORMS_DATA[pid].color}\"><i aria-hidden=\"true\"><\/i>${shortName(pid)}<\/span>`;\n    return flows.map(f => `\n        <div class=\"ach-flow\" style=\"--pfm-color:${PLATFORMS_DATA[f.path[0]].color}\">\n            <div class=\"ach-flow__path\">\n                 ${f.path.map(pill).join(`<i class=\"ach-ico ach-ico--arrow-right ach-flow__arrow\" aria-label=\"${t('step3.flowTo')}\"><\/i>`)}\n                ${f.path.length === 1 ? `<span class=\"ach-flow__scope\">${t('step3.flowWholeStack')}<\/span>` : ''}\n            <\/div>\n            <div class=\"ach-flow__title\">${L(f.title)}<\/div>\n            <p class=\"ach-flow__text\">${L(f.text)}<\/p>\n        <\/div>\n    `).join('');\n}\n\n\/* ============ PASSO 1: PROFILO ============ *\/\nfunction renderMacroGrid() {\n    const container = document.getElementById('macroGrid');\n    container.innerHTML = MACRO_ENTITIES.map(m => {\n        const isSel = !wizard.isExplorationMode && wizard.selectedMacroId === m.id;\n        const core = getProfileDefaults(m).length;\n        return `\n            <button type=\"button\" class=\"ach-macro-card${isSel ? ' is-selected' : ''}\" data-id=\"${m.id}\" aria-pressed=\"${isSel}\">\n                <span class=\"ach-radio-dot\" aria-hidden=\"true\"><i class=\"ach-ico ach-ico--check\"><\/i><\/span>\n                <span class=\"ach-macro-card__icon\" aria-hidden=\"true\">${m.iconSvg}<\/span>\n                <span class=\"ach-macro-card__title\">${L(m.name)}<\/span>\n                <span class=\"ach-macro-card__subtitle\">${L(m.subtitle)}<\/span>\n                <span class=\"ach-macro-card__desc\">${L(m.desc)}<\/span>\n                <span class=\"ach-macro-card__tag\"><i class=\"ach-ico ach-ico--list-check\" aria-hidden=\"true\"><\/i> ${t('step1.ready', { n: core })}<\/span>\n            <\/button>\n        `;\n    }).join('');\n\n    const banner = document.getElementById('exploreBanner');\n    banner.classList.toggle('is-selected', wizard.isExplorationMode);\n    banner.setAttribute('aria-pressed', wizard.isExplorationMode);\n\n    updateStep1Bar();\n}\n\nfunction updateStep1Bar() {\n    const info = document.getElementById('s1Info');\n    const p = getProfile();\n    const n = wizard.selectedServices.length;\n    if (wizard.isExplorationMode) {\n        info.innerHTML = t('step1.infoFree');\n    } else if (p) {\n        info.innerHTML = t('step1.infoProfile', { name: L(p.name), n });\n    } else {\n        info.innerHTML = t('step1.infoEmpty');\n    }\n    document.getElementById('btnStep1Next').disabled = !hasProfile();\n}\n\nfunction selectMacro(id) {\n    const m = MACRO_ENTITIES.find(x => x.id === id);\n    if (!m) return;\n    const changed = wizard.isExplorationMode || wizard.selectedMacroId !== id;\n    if (changed || wizard.selectedServices.length === 0) {\n        const hadChoice = hasProfile();\n        wizard.isExplorationMode = false;\n        wizard.selectedMacroId = id;\n        wizard.selectedServices = getProfileDefaults(m);\n        wizard.addedPlatforms = [];\n        if (hadChoice) showToast(t('toast.profileChanged', { name: L(m.name) }), 'info');\n    }\n    renderMacroGrid();\n    onSelectionChanged();\n}\n\nfunction selectExploration() {\n    if (!wizard.isExplorationMode) {\n        const hadChoice = hasProfile();\n        wizard.isExplorationMode = true;\n        wizard.selectedMacroId = null;\n        wizard.selectedServices = [];\n        wizard.addedPlatforms = [];\n        if (hadChoice) showToast(t('toast.profileRemoved'), 'info');\n    }\n    renderMacroGrid();\n    onSelectionChanged();\n}\n\n\/* ============ PASSO 2: REQUISITI ============ *\/\nfunction renderStep2() {\n    renderStep2Subtitle();\n    renderRecHint();\n    renderServicesGrid();\n    renderLivePanel();\n}\n\nfunction renderStep2Subtitle() {\n    const el = document.getElementById('step2Subtitle');\n    const p = getProfile();\n    if (p) {\n        const core = getProfileDefaults(p).length;\n        el.innerHTML = t('step2.leadProfile', { name: L(p.name), n: core });\n    } else {\n        el.textContent = t('step2.leadFree');\n    }\n}\n\n\/* Link \"Aggiungi N consigliati\" accanto alla ricerca *\/\nfunction renderRecHint() {\n    const el = document.getElementById('recHint');\n    const p = getProfile();\n    const missing = p ? p.items.filter(id => !isSelected(id)) : [];\n    el.hidden = !missing.length;\n    el.innerHTML = `<i class=\"ach-ico ach-ico--plus\" aria-hidden=\"true\"><\/i> ${t('step2.addRecommended', { n: missing.length })}`;\n}\n\nfunction getFilteredItems() {\n    const q = wizard.searchQuery.trim().toLowerCase();\n    return ITEMS_DATA.filter(s => {\n        if (wizard.filterCat !== 'all' && s.category !== wizard.filterCat) return false;\n        if (!q) return true;\n        const text = [\n            L(s.labelNormal), L(s.labelTech), L(s.subtitle.normal), L(s.subtitle.tech),\n            (s.compliance || []).join(' '),\n            (s.primary || []).map(pid => PLATFORMS_DATA[pid].name).join(' ')\n        ].join(' ').toLowerCase();\n        return text.includes(q);\n    });\n}\n\n\/* Riga compatta: casella, nome e dicitura regolatoria; la frase breve compare al passaggio del mouse *\/\nfunction renderServiceCard(s, recIds) {\n    const isChecked = isSelected(s.id);\n    const isRec = recIds.includes(s.id);\n    return `\n        <button type=\"button\" role=\"checkbox\" aria-checked=\"${isChecked}\" class=\"ach-srv-card${isChecked ? ' is-checked' : ''}${isRec ? ' is-recommended' : ''}\" data-id=\"${s.id}\" title=\"${escapeHtml(L(s.subtitle.normal))}\">\n            <span class=\"ach-srv-check\" aria-hidden=\"true\"><i class=\"ach-ico ach-ico--check\"><\/i><\/span>\n            <span class=\"ach-srv-body\">\n                <span class=\"ach-srv-title\">${escapeHtml(L(s.labelNormal))}<\/span>\n                <span class=\"ach-srv-term\">${escapeHtml(L(s.labelTech))}<\/span>\n                ${isRec ? `<span class=\"ach-rec-badge\">${t('step2.recommended')}<\/span>` : ''}\n                <span class=\"ach-sr-only\">, ${escapeHtml(L(s.subtitle.normal))}<\/span>\n            <\/span>\n        <\/button>\n    `;\n}\n\nfunction renderServicesGrid() {\n    const container = document.getElementById('servicesGrid');\n    const filtered = getFilteredItems();\n\n    if (filtered.length === 0) {\n        container.innerHTML = `\n            <div class=\"ach-empty\">\n                <i class=\"ach-ico ach-ico--search\" aria-hidden=\"true\"><\/i>\n                <p>${t('step2.noResults', { q: escapeHtml(wizard.searchQuery.trim()) })}<\/p>\n                <button type=\"button\" class=\"ach-btn ach-btn--secondary ach-btn--sm\" data-action=\"reset-filters\">${t('step2.resetFilters')}<\/button>\n            <\/div>\n        `;\n        return;\n    }\n\n    const p = getProfile();\n    const recIds = p ? p.items : [];\n\n    container.innerHTML = CAT_ORDER.filter(cat => filtered.some(s => s.category === cat)).map(cat => {\n        \/* I consigliati in cima al gruppo; l'ordine non dipende dalla selezione, cos\u00ec le card non si spostano *\/\n        const rank = s => (recIds.includes(s.id) ? 0 : 1);\n        const items = filtered.filter(s => s.category === cat).sort((a, b) => rank(a) - rank(b));\n        const collapsed = wizard.collapsedCats.includes(cat);\n        const selCount = items.filter(s => isSelected(s.id)).length;\n        return `\n            <section class=\"ach-srv-group${collapsed ? ' is-collapsed' : ''}\" aria-labelledby=\"grp-${cat}\">\n                <div class=\"ach-srv-group__head\">\n                    <button type=\"button\" class=\"ach-srv-group__toggle\" data-action=\"toggle-collapse\" data-cat=\"${cat}\" aria-expanded=\"${!collapsed}\" aria-controls=\"grid-${cat}\">\n                        <i class=\"ach-ico ach-ico--chevron-down\" aria-hidden=\"true\"><\/i>\n                        <span class=\"ach-srv-group__title\" id=\"grp-${cat}\">${t('cat.' + cat)}<\/span>\n                    <\/button>\n                    <span class=\"ach-srv-group__meta\" data-cat=\"${cat}\" aria-label=\"${t('step2.groupCount', { n: selCount, total: items.length })}\"><strong>${selCount}<\/strong>\/${items.length}<\/span>\n                <\/div>\n                <div class=\"ach-srv-grid\" id=\"grid-${cat}\" ${collapsed ? 'hidden' : ''}>${items.map(s => renderServiceCard(s, recIds)).join('')}<\/div>\n            <\/section>\n        `;\n    }).join('');\n}\n\n\/* Chiave dell'anteprima: si ridisegna solo se cambiano le piattaforme, non a ogni requisito *\/\nlet livePanelKey = null;\nlet livePanelOrder = [];\n\nfunction renderLivePanel() {\n    const { services, ranked, compliance } = computeStack();\n\n    const needed = ranked.filter(p => p.tier !== 'optional');\n    const optionalCount = ranked.length - needed.length;\n\n    \/* Si ridisegna solo quando entra o esce una piattaforma (o cambia livello); l'ordine resta\n       quello gi\u00e0 mostrato e solo le nuove compaiono con l'animazione *\/\n    const key = needed.map(p => p.id + ':' + p.tier).sort().join(',') + '|' + optionalCount + '|' + LANG;\n    if (key !== livePanelKey) {\n        livePanelKey = key;\n        const prev = livePanelOrder;\n        const pos = id => (prev.includes(id) ? prev.indexOf(id) : prev.length);\n        needed.sort((a, b) => TIER_ORDER.indexOf(a.tier) - TIER_ORDER.indexOf(b.tier) || pos(a.id) - pos(b.id));\n        livePanelOrder = needed.map(p => p.id);\n        document.getElementById('livePfmList').innerHTML = needed.length\n            ? needed.map(p => {\n                const pfm = PLATFORMS_DATA[p.id];\n                return `\n                    <div class=\"ach-live__pfm${prev.includes(p.id) ? '' : ' is-new'}\" style=\"--pfm-color:${pfm.color}\">\n                        <span class=\"ach-dot\" style=\"background:${pfm.color}\" aria-hidden=\"true\"><\/span>\n                        <span class=\"ach-live__name\">${shortName(p.id)}<span class=\"ach-live__role\">${pfm.role}<\/span><\/span>\n                        <span class=\"ach-mini-tier ach-mini-tier--${TIER_CSS[p.tier]}\">${tierText(p.tier, 'label')}<\/span>\n                    <\/div>\n                `;\n            }).join('') + (optionalCount ? `<div class=\"ach-live__more\">${t('step2.previewMore', { n: optionalCount })}<\/div>` : '')\n            : `<div class=\"ach-live__empty\">${t('step2.previewEmpty')}<\/div>`;\n    }\n\n    const n = services.length;\n    document.getElementById('s2Info').innerHTML = n\n        ? `<strong>${t('unit.requirements', { n })}<\/strong><span class=\"ach-actionbar__arrow\" aria-hidden=\"true\">\u2192<\/span><strong>${t('unit.neededPlatforms', { n: needed.length })}<\/strong>`\n        : t('step2.infoEmpty');\n\n    document.getElementById('btnStep2Next').disabled = n === 0;\n}\n\nfunction refreshStep2(focusId) {\n    renderStep2();\n    onSelectionChanged();\n    if (focusId) {\n        const el = document.querySelector('#servicesGrid [data-id=\"' + focusId + '\"]');\n        if (el) el.focus({ preventScroll: true });\n    }\n}\n\n\/* Aggiorna solo la card cliccata e i contatori: la griglia non viene ridisegnata e nulla si sposta *\/\nfunction toggleService(id) {\n    if (isSelected(id)) wizard.selectedServices = wizard.selectedServices.filter(x => x !== id);\n    else wizard.selectedServices.push(id);\n    const card = document.querySelector('#servicesGrid [data-id=\"' + id + '\"]');\n    if (!card) return refreshStep2(id);\n    const checked = isSelected(id);\n    card.classList.toggle('is-checked', checked);\n    card.setAttribute('aria-checked', checked);\n    const item = ITEMS_DATA.find(s => s.id === id);\n    const meta = document.querySelector('#servicesGrid .ach-srv-group__meta[data-cat=\"' + item.category + '\"]');\n    if (meta) {\n        const ids = [...document.querySelectorAll('#grid-' + item.category + ' .ach-srv-card')].map(c => c.dataset.id);\n        const selCount = ids.filter(isSelected).length;\n        meta.innerHTML = `<strong>${selCount}<\/strong>\/${ids.length}`;\n        meta.setAttribute('aria-label', t('step2.groupCount', { n: selCount, total: ids.length }));\n    }\n    renderRecHint();\n    renderLivePanel();\n    onSelectionChanged();\n}\n\nfunction addRecommended() {\n    const p = getProfile();\n    if (!p) return;\n    const missing = p.items.filter(id => !isSelected(id));\n    wizard.selectedServices.push(...missing);\n    refreshStep2();\n    showToast(t('toast.recommendedAdded', { n: missing.length }));\n}\n\nfunction setSearch(value) {\n    wizard.searchQuery = value;\n    const input = document.getElementById('serviceSearch');\n    if (input.value !== value) input.value = value;\n    document.getElementById('btnSearchClear').hidden = !value;\n    renderServicesGrid();\n}\n\n\/* ============ PASSO 3: PIATTAFORME ============ *\/\nfunction renderStep3Results() {\n    const container = document.getElementById('platformsResultsContainer');\n    const { services, ranked, compliance } = computeStack();\n\n    document.getElementById('step3Subtitle').textContent = t('step3.lead', { n: services.length });\n    document.getElementById('s3Info').innerHTML = t('step3.info', { n: includedPlatforms(ranked).length, c: compliance.length });\n\n    if (ranked.length === 0) {\n        container.innerHTML = `<div class=\"ach-empty\">${t('step3.empty')}<\/div>`;\n        document.getElementById('flowNarrativeText').innerHTML = '';\n        document.getElementById('complianceGrid').innerHTML = '';\n        return;\n    }\n\n    function renderBlock(tier) {\n        const list = ranked.filter(pl => pl.tier === tier);\n        if (list.length === 0) return '';\n        const cardsHtml = list.map(pl => {\n            const pfm = PLATFORMS_DATA[pl.id];\n            const chips = pl.items.map(iid => ITEMS_DATA.find(x => x.id === iid)).filter(Boolean)\n                .map(s => `<span class=\"ach-trigger-chip\">${escapeHtml(L(s.labelNormal))}<\/span>`)\n                .join('');\n\n            return `\n                <article class=\"ach-platform-card\" style=\"--pfm-color:${pfm.color}\">\n                    <div class=\"ach-platform-top\">\n                        <h3 class=\"ach-platform-name\">${pfm.name}<\/h3>\n                    <\/div>\n                    <div class=\"ach-platform-role\">${pfm.role}<\/div>\n                    <p class=\"ach-platform-narrative\">${escapeHtml(capitalize(L(pfm.narrative)))}.<\/p>\n                    <details class=\"ach-platform-trigger\">\n                        <summary>${t(pl.tier === 'optional' || pl.tier === 'added' ? 'step3.strengthens' : 'step3.servesFor')} <strong>${t('unit.requirements', { n: pl.items.length })}<\/strong><\/summary>\n                        <div class=\"ach-trigger-chips\">${chips}<\/div>\n                    <\/details>\n                    ${pl.tier === 'optional' || pl.tier === 'added' ? renderExtraRequirements(pl) : ''}\n                    ${pl.tier === 'optional' && !renderExtraRequirements(pl) ? `<button type=\"button\" class=\"ach-btn ach-btn--secondary ach-btn--sm ach-platform-action\" data-add-pfm=\"${pl.id}\"><i class=\"ach-ico ach-ico--plus\" aria-hidden=\"true\"><\/i> ${t('step3.addPlatformOnly')}<\/button>` : ''}\n                    ${pl.tier === 'added' ? `<button type=\"button\" class=\"ach-btn ach-btn--ghost ach-btn--sm ach-platform-action\" data-remove-pfm=\"${pl.id}\"><i class=\"ach-ico ach-ico--minus\" aria-hidden=\"true\"><\/i> ${t('step3.remove')}<\/button>` : ''}\n                <\/article>\n            `;\n        }).join('');\n\n        if (tier === 'optional') {\n            const open = wizard.showOptional;\n            return `\n                <div class=\"ach-optional\">\n                    <button type=\"button\" class=\"ach-btn ach-btn--ghost ach-optional__toggle\" id=\"btnToggleOptional\" aria-expanded=\"${open}\" aria-controls=\"optionalList\">\n                        <i class=\"ach-ico ach-ico--${open ? 'chevron-up' : 'plus'}\" aria-hidden=\"true\"><\/i>\n                        ${t(open ? 'step3.hideOptional' : 'step3.showOptional', { n: list.length })}\n                    <\/button>\n                    <div id=\"optionalList\" ${open ? '' : 'hidden'}>\n                        <p class=\"ach-optional__note\">${t('step3.optionalNote')}<\/p>\n                        <div class=\"ach-platforms-list\">${cardsHtml}<\/div>\n                    <\/div>\n                <\/div>\n            `;\n        }\n        return `\n            <h3 class=\"ach-sec-title\">${tierText(tier, 'title')} <small>${tierText(tier, 'note')}<\/small><\/h3>\n            <div class=\"ach-platforms-list\">${cardsHtml}<\/div>\n        `;\n    }\n\n    container.innerHTML = TIER_ORDER.map(renderBlock).join('');\n\n    document.getElementById('flowNarrativeText').innerHTML = renderFlowCards(ranked);\n    document.getElementById('complianceGrid').innerHTML = compliance\n        .map(c => '<span class=\"ach-comp-badge\">' + escapeHtml(c) + '<\/span>')\n        .join('');\n}\n\n\/* Requisiti non ancora scelti collegati alla piattaforma (in modo primario o di supporto):\n   sceglierne uno lo registra nella configurazione e include anche la piattaforma *\/\nfunction renderExtraRequirements(pl) {\n    const free = ITEMS_DATA.filter(s => !isSelected(s.id));\n    const groups = [\n        [t('step3.extraPrimary'), free.filter(s => (s.primary || []).includes(pl.id))],\n        [t('step3.extraSecondary'), free.filter(s => (s.secondary || []).includes(pl.id))]\n    ].filter(([, list]) => list.length);\n    return groups.map(([title, list]) => `\n        <div class=\"ach-extra-req\">\n            <strong>${title}<\/strong>\n            <div class=\"ach-extra-req__list\">\n                ${list.map(s => `\n                    <button type=\"button\" class=\"ach-extra-req__item\" data-add-req=\"${s.id}\" data-pfm=\"${pl.id}\">\n                        <i class=\"ach-ico ach-ico--plus\" aria-hidden=\"true\"><\/i>\n                        <span>${escapeHtml(L(s.labelNormal))}<small>${escapeHtml(L(s.subtitle.normal))}<\/small><\/span>\n                    <\/button>\n                `).join('')}\n            <\/div>\n        <\/div>\n    `).join('');\n}\n\n\/* Tutti i requisiti selezionati collegati a una piattaforma: servono per capire quali moduli attivare *\/\nfunction platformRequirementNames(pl) {\n    return pl.items.map(iid => ITEMS_DATA.find(x => x.id === iid)).filter(Boolean).map(s => L(s.labelNormal));\n}\n\n\/* ============ PASSO 4: RIEPILOGO ============ *\/\nfunction profileTitleWithSub() {\n    const p = getProfile();\n    return p ? `${L(p.name)} (${L(p.subtitle)})` : t('step4.freeConfig');\n}\n\nfunction renderStep4Summary() {\n    const { services, ranked, compliance } = computeStack();\n\n    document.getElementById('sumEntity').textContent = profileTitleWithSub();\n\n    document.getElementById('sumPlatforms').innerHTML = includedPlatforms(ranked).map(p => {\n        const pfm = PLATFORMS_DATA[p.id];\n        return `\n            <div class=\"ach-sum-pfm\" style=\"--pfm-color:${pfm.color}\">\n                <span class=\"ach-spec-chip ach-spec-chip--pfm\">${pfm.name} \u00b7 ${tierText(p.tier, 'label')}<\/span>\n                <span class=\"ach-sum-pfm__reqs\" title=\"${escapeHtml(platformRequirementNames(p).join(', '))}\">${platformRequirementNames(p).map(escapeHtml).join(', ')}<\/span>\n            <\/div>\n        `;\n    }).join('');\n\n    renderChipList('sumServices', services.map(s => `<span class=\"ach-spec-chip\">${escapeHtml(L(s.labelNormal))}<\/span>`));\n    renderChipList('sumCompliance', compliance.map(c => `<span class=\"ach-spec-chip ach-spec-chip--comp\">${escapeHtml(c)}<\/span>`));\n\n    renderPrintReport();\n}\n\n\/* Elenco di chip del riepilogo: oltre SUM_CHIP_LIMIT si mostra \"+N altri\", cos\u00ec la scheda\n   non si allunga troppo quando i requisiti sono tanti *\/\nconst SUM_CHIP_LIMIT = 6;\nfunction renderChipList(id, chips) {\n    const open = wizard.expandedChips.includes(id);\n    const hidden = chips.length - SUM_CHIP_LIMIT;\n    const shown = open || hidden <= 0 ? chips : chips.slice(0, SUM_CHIP_LIMIT);\n    const toggle = hidden > 0\n        ? `<button type=\"button\" class=\"ach-chip-toggle\" data-action=\"toggle-chips\" data-list=\"${id}\" aria-expanded=\"${open}\">${open ? t('step4.showLess') : t('step4.showMore', { n: hidden })}<\/button>`\n        : '';\n    document.getElementById(id).innerHTML = shown.join('') + toggle;\n}\n\n\/* ============ UTILIT\u00c0 ============ *\/\nfunction escapeHtml(str) {\n    if (!str) return '';\n    return String(str)\n        .replace(\/&\/g, '&amp;')\n        .replace(\/<\/g, '&lt;')\n        .replace(\/>\/g, '&gt;')\n        .replace(\/\"\/g, '&quot;')\n        .replace(\/'\/g, '&#039;');\n}\n\nfunction capitalize(str) {\n    return str ? str.charAt(0).toUpperCase() + str.slice(1) : '';\n}\n\n\/* ============ DOCUMENTO DI STAMPA (PDF) ============ *\/\n\/* Numero di pagina nella lingua attiva. Una pagina con nome (@page ach-en) su un\n   elemento interno forzava un salto pagina e lasciava la prima pagina bianca *\/\nfunction setPrintPageFooter() {\n    let style = document.getElementById('achPrintPageStyle');\n    if (!style) {\n        style = document.createElement('style');\n        style.id = 'achPrintPageStyle';\n        document.head.appendChild(style);\n    }\n    style.textContent = `@media print { @page { @bottom-right { content: \"${t('print.page')} \" counter(page) \" ${t('print.of')} \" counter(pages); } } }`;\n}\n\nfunction renderPrintReport() {\n    const container = document.getElementById('achPrintReport');\n    if (!container) return;\n    setPrintPageFooter();\n\n    const { services, ranked, compliance } = computeStack();\n    const p = getProfile();\n    const dateStr = new Date().toLocaleDateString(LANG === 'en' ? 'en-GB' : 'it-IT', { day: 'numeric', month: 'long', year: 'numeric' });\n    const byTier = tier => ranked.filter(pl => pl.tier === tier);\n    const included = includedPlatforms(ranked);\n    const flows = getDataFlows(ranked);\n    const shareUrl = \/^https?:\/.test(window.location.protocol) ? window.location.href : '';\n\n    const pfmBlock = pl => {\n        const pfm = PLATFORMS_DATA[pl.id];\n        const chips = pl.items.map(iid => ITEMS_DATA.find(x => x.id === iid)).filter(Boolean)\n            .map(s => (s.primary || []).includes(pl.id) ? `<b>${escapeHtml(L(s.labelNormal))}<\/b>` : escapeHtml(L(s.labelNormal)))\n            .join(', ');\n        return `\n            <div class=\"ach-pr-pfm\" style=\"--pfm-color:${pfm.color}\">\n                <div class=\"ach-pr-pfm__head\">\n                    <span class=\"ach-pr-dot\"><\/span>\n                    <span class=\"ach-pr-pfm__name\">${escapeHtml(pfm.name)}<\/span>\n                    <span class=\"ach-pr-pfm__role\">${escapeHtml(pfm.role)}<\/span>\n                <\/div>\n                <p class=\"ach-pr-pfm__desc\">${escapeHtml(capitalize(L(pfm.narrative)))}.<\/p>\n                <p class=\"ach-pr-pfm__for\"><strong>${t('print.linked')}<\/strong> ${chips}<\/p>\n            <\/div>\n        `;\n    };\n\n    \/* Titolo del gruppo e prima card restano insieme; `lead` (titolo di sezione) si aggancia al primo gruppo *\/\n    const pfmGroup = (tier, lead = '') => {\n        const list = byTier(tier);\n        if (!list.length) return '';\n        return `\n            <div class=\"ach-pr-group\">\n                <div class=\"ach-pr-keep\">\n                    ${lead}\n                    <h3 class=\"ach-pr-h3\">${tierText(tier, 'title')} <span>${tierText(tier, 'note')}<\/span><\/h3>\n                    ${pfmBlock(list[0])}\n                <\/div>\n                ${list.slice(1).map(pfmBlock).join('')}\n            <\/div>\n        `;\n    };\n\n    const pfmIntro = `\n        <h2 class=\"ach-pr-h2\"><span class=\"ach-pr-num\">2<\/span>${t('print.pfmTitle')}<\/h2>\n        <p class=\"ach-pr-lead\">${t('print.pfmLeadCore')}${byTier('complement').length ? t('print.pfmLeadComplement') : ''}${byTier('added').length ? t('print.pfmLeadAdded') : ''}${t('print.pfmLeadEnd')}<\/p>`;\n\n    const flowsHtml = flows.length ? flows.map(f => `\n        <div class=\"ach-pr-flow\">\n            <div class=\"ach-pr-flow__path\">\n                ${f.path.map(pid => escapeHtml(shortName(pid))).join(' \u2192 ')}${f.path.length === 1 ? ' \u00b7 ' + t('step3.flowWholeStack') : ''}\n            <\/div>\n            <div class=\"ach-pr-flow__title\">${L(f.title)}<\/div>\n            <p class=\"ach-pr-flow__text\">${L(f.text)}<\/p>\n        <\/div>\n    `).join('') : `<p class=\"ach-pr-muted\">${t('print.flowsEmpty')}<\/p>`;\n\n    const reqRows = CAT_ORDER.map(cat => {\n        const list = services.filter(s => s.category === cat);\n        if (!list.length) return '';\n        return `\n            <tr class=\"ach-pr-table__cat\"><td colspan=\"3\">${t('cat.' + cat)}<\/td><\/tr>\n            ${list.map(s => `\n                <tr>\n                    <td><strong>${escapeHtml(L(s.labelNormal))}<\/strong><\/td>\n                    <td>${escapeHtml(L(s.subtitle.normal))}<\/td>\n                    <td>${included.filter(pl => pl.items.includes(s.id))\n                        .map(pl => (s.primary || []).includes(pl.id) ? `<b>${escapeHtml(shortName(pl.id))}<\/b>` : escapeHtml(shortName(pl.id)))\n                        .join(', ')}<\/td>\n                <\/tr>\n            `).join('')}\n        `;\n    }).join('');\n\n    container.innerHTML = `\n        <header class=\"ach-pr-header\">\n            <img decoding=\"async\" class=\"ach-pr-logo\" src=\"${LOGO_URL}\" alt=\"aChiral\">\n            <div class=\"ach-pr-header__meta\">\n                <div class=\"ach-pr-header__title\">${t('print.title')}<\/div>\n                <div>${dateStr}<\/div>\n            <\/div>\n        <\/header>\n\n        <section class=\"ach-pr-intro\">\n            <div class=\"ach-pr-label\">${t('print.profile')}<\/div>\n            <h1 class=\"ach-pr-h1\">${escapeHtml(p ? L(p.name) : t('step4.freeConfig'))}${p ? ` <span>${escapeHtml(L(p.subtitle))}<\/span>` : ''}<\/h1>\n            <p>${t('print.intro')}<\/p>\n            <div class=\"ach-pr-kpis\">\n                <div><b>${services.length}<\/b><span>${t('print.kpiRequirements', { n: services.length })}<\/span><\/div>\n                <div><b>${included.length}<\/b><span>${t('print.kpiPlatforms', { n: included.length })}<\/span><\/div>\n                <div><b>${flows.length}<\/b><span>${t('print.kpiFlows', { n: flows.length })}<\/span><\/div>\n                <div><b>${compliance.length}<\/b><span>${t('print.kpiCompliance', { n: compliance.length })}<\/span><\/div>\n            <\/div>\n            <div class=\"ach-pr-label ach-pr-label--comp\">${t('print.complianceLabel')}<\/div>\n            <div class=\"ach-pr-comp\">${compliance.map(c => `<span>${escapeHtml(c)}<\/span>`).join('')}<\/div>\n        <\/section>\n\n        <section class=\"ach-pr-section\">\n            <h2 class=\"ach-pr-h2\"><span class=\"ach-pr-num\">1<\/span>${t('print.reqTitle')}<\/h2>\n            <p class=\"ach-pr-lead\">${t('print.reqLead')}<\/p>\n            <table class=\"ach-pr-table\">\n                <thead><tr><th>${t('print.colRequirement')}<\/th><th>${t('print.colBrief')}<\/th><th>${t('print.colManagedBy')}<\/th><\/tr><\/thead>\n                <tbody>${reqRows}<\/tbody>\n            <\/table>\n        <\/section>\n\n        <section class=\"ach-pr-section\">\n            ${TIER_ORDER.filter(tier => tier !== 'optional' && byTier(tier).length).map((tier, i) => pfmGroup(tier, i === 0 ? pfmIntro : '')).join('')}\n        <\/section>\n\n        <section class=\"ach-pr-section ach-pr-keep\">\n            <h2 class=\"ach-pr-h2\"><span class=\"ach-pr-num\">3<\/span>${t('print.flowsTitle')}<\/h2>\n            <p class=\"ach-pr-lead\">${t('step3.flowsLead')}<\/p>\n            <div class=\"ach-pr-flows\">${flowsHtml}<\/div>\n        <\/section>\n\n        <section class=\"ach-pr-next\">\n            <strong>${t('print.nextTitle')}<\/strong>\n            ${t('print.nextText')} <em class=\"ach-pr-note\">${t('print.disclaimer')}<\/em>\n            ${shareUrl ? `<span class=\"ach-pr-link\">${t('print.reopen', { url: escapeHtml(shareUrl) })}<\/span>` : ''}\n        <\/section>\n    `;\n}\n\n\/* ============ COPIA SCHEDA ============ *\/\nfunction buildSummaryText() {\n    const { services, ranked, compliance } = computeStack();\n    const included = includedPlatforms(ranked);\n    const lines = [\n        `# ${t('text.title')}`,\n        `${t('text.profile')}: ${profileTitleWithSub()}`,\n        `${t('text.date')}: ${new Date().toLocaleDateString(LANG === 'en' ? 'en-GB' : 'it-IT')}`,\n        '',\n        `## ${t('text.requirements')} (${services.length})`,\n        ...services.map(s => `- ${L(s.labelNormal)} (${L(s.labelTech)})`),\n        '',\n        `## ${t('text.platforms')} (${included.length})`\n    ];\n    included.forEach(p => {\n        const pfm = PLATFORMS_DATA[p.id];\n        lines.push(`- ${pfm.name} [${tierText(p.tier, 'label').toUpperCase()}] \u00b7 ${pfm.role}: ${L(pfm.narrative)}`);\n        lines.push(`  ${t('text.linked')}: ${platformRequirementNames(p).join(', ')}`);\n    });\n    lines.push('', `## ${t('text.compliance')}`, compliance.join(', '), '', t('text.footer'));\n    return lines.join('\\n') + '\\n';\n}\n\nfunction copySummary() {\n    const text = buildSummaryText();\n    const done = () => showToast(t('toast.copied'));\n    const fallback = () => {\n        const ta = document.createElement('textarea');\n        ta.value = text;\n        ta.setAttribute('readonly', '');\n        ta.style.position = 'fixed';\n        ta.style.opacity = '0';\n        document.body.appendChild(ta);\n        ta.select();\n        try {\n            document.execCommand('copy');\n            done();\n        } catch (e) {\n            showToast(t('toast.copyFailed'), 'warn');\n        }\n        ta.remove();\n    };\n    if (navigator.clipboard && window.isSecureContext) {\n        navigator.clipboard.writeText(text).then(done, fallback);\n    } else {\n        fallback();\n    }\n}\n\n\/* ============ TOAST ============ *\/\nconst TOAST_ICONS = {\n    success: { cls: 'ach-ico ach-ico--check-circle', color: 'var(--site-mint)' },\n    info: { cls: 'ach-ico ach-ico--info-circle', color: '#8FB0FF' },\n    warn: { cls: 'ach-ico ach-ico--exclamation-circle', color: '#FFC857' }\n};\nlet toastTimer = null;\n\nfunction showToast(msg, type = 'success') {\n    const toast = document.getElementById('achToast');\n    const icon = document.getElementById('toastIcon');\n    const conf = TOAST_ICONS[type] || TOAST_ICONS.success;\n    icon.className = conf.cls;\n    icon.style.color = conf.color;\n    document.getElementById('toastText').textContent = msg;\n    toast.classList.remove('is-visible');\n    void toast.offsetWidth; \/* riavvia l'animazione *\/\n    toast.classList.add('is-visible');\n    clearTimeout(toastTimer);\n    toastTimer = setTimeout(() => toast.classList.remove('is-visible'), 3200);\n}\n\n\/* ============ FORM CONTATTO (aChiral Cobalt) ============ *\/\n\/* Un modulo Cobalt per lingua: se manca quello italiano si usa l'inglese *\/\nconst COBALT_BASE = 'https:\/\/cobalt.achiral.it';\nconst COBALT_FORMS = {\n    it: 'ct_Dzpj6KcWS97qWY1qGlvF8BhudtBAAmbdBpA-e7Z36cI',\n    en: 'ct_-9WPphzlH4-Ah3A2u5o7ZMebDNYJuF02euMZqy9NFLI'\n};\nfunction cobaltToken() {\n    return COBALT_FORMS[LANG] || COBALT_FORMS.en;\n}\n\n\/* Il CRM mostra ogni campo nascosto \"hidden_utm\" come una riga e toglie gli a capo:\n   il riepilogo \u00e8 diviso in un campo per parametro UTM (utm_source resta a Cobalt per il canale).\n   Testi in italiano, per il team aChiral. *\/\nconst COBALT_FIELDS = {\n    utm_campaign: () => {\n        const p = getProfile();\n        return `${p ? p.name.it : 'Configurazione libera'} \u00b7 ${LANG.toUpperCase()}`;\n    },\n    utm_content: () => includedPlatforms(computeStack().ranked)\n        .map(pl => `${PLATFORMS_DATA[pl.id].name} (${STRINGS.it['tier.' + pl.tier + '.label']})`).join('; '),\n    utm_term: () => computeStack().services.map(s => s.labelNormal.it).join('; '),\n    utm_medium: configurationLink\n};\n\nfunction cobaltFrameUrl() {\n    const url = new URL(`${COBALT_BASE}\/f\/${cobaltToken()}\/frame`);\n    Object.entries(COBALT_FIELDS).forEach(([param, value]) => {\n        const v = value();\n        if (v) url.searchParams.set(param, v);\n    });\n    return url.href;\n}\n\n\/* Aggiorna il modulo solo se la configurazione \u00e8 cambiata, per non ricaricarlo a vuoto *\/\nfunction renderCobaltForm() {\n    const frame = document.getElementById('cobaltFrame');\n    const src = cobaltFrameUrl();\n    if (frame.src !== src) {\n        frame.style.height = '';\n        frame.src = src;\n    }\n}\n\n\/* Il modulo comunica la sua altezza: l'iframe si adatta senza barra di scorrimento *\/\nfunction bindCobaltResize() {\n    window.addEventListener('message', e => {\n        const d = e.data;\n        if (e.origin !== COBALT_BASE || !d || d.type !== 'achiral-cta-height' || d.token !== cobaltToken()) return;\n        \/* L'altezza pu\u00f2 solo crescere: se il modulo si accorcia per un attimo l'iframe non sobbalza *\/\n        const frame = document.getElementById('cobaltFrame');\n        const h = Math.ceil(d.height) + 24;\n        if (h > (parseInt(frame.style.height, 10) || 0)) frame.style.height = h + 'px';\n    });\n}\n\n\/* Stampa solo dopo che il logo \u00e8 caricato, altrimenti il PDF esce senza *\/\nfunction printReport() {\n    renderPrintReport();\n    const logo = document.querySelector('#achPrintReport .ach-pr-logo');\n    if (!logo || logo.complete) {\n        window.print();\n        return;\n    }\n    logo.addEventListener('load', () => window.print(), { once: true });\n    logo.addEventListener('error', () => window.print(), { once: true });\n}\n\n\/* ============ INITIALIZATION ============ *\/\nfunction bindEvents() {\n    \/\/ Stepper\n    document.querySelectorAll('.ach-step-btn').forEach(item => {\n        item.addEventListener('click', () => goToStep(parseInt(item.dataset.step, 10)));\n    });\n\n    \/\/ Passo 1\n    document.getElementById('macroGrid').addEventListener('click', e => {\n        const card = e.target.closest('.ach-macro-card');\n        if (card) selectMacro(card.dataset.id);\n    });\n    document.getElementById('exploreBanner').addEventListener('click', selectExploration);\n    document.getElementById('btnStep1Next').addEventListener('click', () => goToStep(2));\n\n    \/\/ Passo 2\n    document.getElementById('servicesGrid').addEventListener('click', e => {\n        const actionEl = e.target.closest('[data-action]');\n        if (actionEl) {\n            if (actionEl.dataset.action === 'toggle-collapse') {\n                const cat = actionEl.dataset.cat;\n                wizard.collapsedCats = wizard.collapsedCats.includes(cat)\n                    ? wizard.collapsedCats.filter(c => c !== cat)\n                    : [...wizard.collapsedCats, cat];\n                renderServicesGrid();\n                document.querySelector(`[data-action=\"toggle-collapse\"][data-cat=\"${cat}\"]`).focus({ preventScroll: true });\n            }\n            if (actionEl.dataset.action === 'reset-filters') {\n                wizard.filterCat = 'all';\n                setSearch('');\n            }\n            return;\n        }\n        const card = e.target.closest('.ach-srv-card');\n        if (card) toggleService(card.dataset.id);\n    });\n\n    document.getElementById('recHint').addEventListener('click', addRecommended);\n\n    const search = document.getElementById('serviceSearch');\n    search.addEventListener('input', e => setSearch(e.target.value));\n    search.addEventListener('keydown', e => {\n        if (e.key === 'Escape' && search.value) {\n            e.preventDefault();\n            setSearch('');\n        }\n    });\n    document.getElementById('btnSearchClear').addEventListener('click', () => {\n        setSearch('');\n        search.focus();\n    });\n\n    document.getElementById('btnClearAllSrv').addEventListener('click', () => {\n        if (!wizard.selectedServices.length) return;\n        wizard.selectedServices = [];\n        refreshStep2();\n        showToast(t('toast.cleared'), 'info');\n    });\n\n    document.getElementById('btnStep2Prev').addEventListener('click', () => goToStep(1));\n    document.getElementById('btnStep2Next').addEventListener('click', () => goToStep(3));\n\n    \/\/ Passo 3\n    document.getElementById('btnStep3Prev').addEventListener('click', () => goToStep(2));\n    document.getElementById('platformsResultsContainer').addEventListener('click', e => {\n        const toggle = e.target.closest('#btnToggleOptional');\n        const add = e.target.closest('[data-add-pfm]');\n        const remove = e.target.closest('[data-remove-pfm]');\n        const addReq = e.target.closest('[data-add-req]');\n        if (addReq) {\n            const pid = addReq.dataset.pfm;\n            wizard.selectedServices.push(addReq.dataset.addReq);\n            if (!wizard.addedPlatforms.includes(pid)) wizard.addedPlatforms.push(pid);\n            showToast(t('toast.requirementAdded', { name: PLATFORMS_DATA[pid].name }));\n        } else if (toggle) {\n            wizard.showOptional = !wizard.showOptional;\n        } else if (add) {\n            wizard.addedPlatforms.push(add.dataset.addPfm);\n            showToast(t('toast.platformAdded', { name: PLATFORMS_DATA[add.dataset.addPfm].name }));\n        } else if (remove) {\n            wizard.addedPlatforms = wizard.addedPlatforms.filter(pid => pid !== remove.dataset.removePfm);\n        } else return;\n        renderStep3Results();\n        onSelectionChanged();\n        if (toggle) document.getElementById('btnToggleOptional').focus({ preventScroll: true });\n    });\n    document.getElementById('btnStep3Next').addEventListener('click', () => goToStep(4));\n\n    \/\/ Passo 4\n    document.getElementById('btnStep4Prev').addEventListener('click', () => goToStep(3));\n    document.getElementById('btnEditServices').addEventListener('click', () => goToStep(2));\n    document.querySelector('#stepView4 .ach-spec-sheet').addEventListener('click', e => {\n        const btn = e.target.closest('[data-action=\"toggle-chips\"]');\n        if (!btn) return;\n        const id = btn.dataset.list;\n        wizard.expandedChips = wizard.expandedChips.includes(id)\n            ? wizard.expandedChips.filter(x => x !== id)\n            : [...wizard.expandedChips, id];\n        renderStep4Summary();\n        document.querySelector(`[data-action=\"toggle-chips\"][data-list=\"${id}\"]`).focus({ preventScroll: true });\n    });\n    document.getElementById('btnCopyReport').addEventListener('click', copySummary);\n    document.getElementById('btnPrintReport').addEventListener('click', printReport);\n    window.addEventListener('beforeprint', renderPrintReport);\n\n    bindCobaltResize();\n}\n\n\/* Ripristina lo stato dai parametri URL (?step=&macro=|mode=all&req=id1,id2&pfm=\u2026) *\/\nfunction restoreFromUrl() {\n    const params = new URLSearchParams(window.location.search);\n    const step = parseInt(params.get('step'), 10) || 1;\n\n    if (params.get('mode') === 'all') {\n        wizard.isExplorationMode = true;\n        if (!params.has('req') && step > 1) wizard.selectedServices = ITEMS_DATA.map(s => s.id);\n    } else {\n        const m = MACRO_ENTITIES.find(x => x.id === params.get('macro')) || (step > 1 ? MACRO_ENTITIES.find(x => x.id === 'cro') : null);\n        if (m) {\n            wizard.selectedMacroId = m.id;\n            wizard.selectedServices = getProfileDefaults(m);\n        }\n    }\n\n    if (params.has('req') && hasProfile()) {\n        const valid = params.get('req').split(',').filter(id => ITEMS_DATA.some(s => s.id === id));\n        wizard.selectedServices = [...new Set(valid)];\n    }\n    if (params.has('pfm')) {\n        wizard.addedPlatforms = params.get('pfm').split(',').filter(pid => PLATFORMS_DATA[pid]);\n    }\n\n    return Math.min(Math.max(step, 1), maxReachableStep());\n}\n\nfunction initApp() {\n    const root = document.getElementById('achiral-navigator');\n    root.lang = LANG;\n    translateStaticText(root);\n    fitFullWidth(root);\n    bindEvents();\n    goToStep(restoreFromUrl(), { initial: true });\n    openPrintFromUrl();\n}\n\n\/* Il contenitore della pagina WordPress ha un padding: il configuratore si allarga\n   alla finestra (clientWidth esclude la scrollbar, 100vw no e farebbe scorrere in orizzontale) *\/\nfunction fitFullWidth(root) {\n    const fit = () => root.style.setProperty('--ach-vw', document.documentElement.clientWidth + 'px');\n    fit();\n    window.addEventListener('resize', fit);\n}\n\n\/* ?print=1 (link del lead in Cobalt): apre subito la scheda PDF della configurazione.\n   La scheda \u00e8 gi\u00e0 pronta nella pagina anche per chi genera il PDF senza finestra di stampa\n   (browser headless lato server). Il parametro si toglie per non ristampare a ogni ricarica. *\/\nfunction openPrintFromUrl() {\n    const params = new URLSearchParams(window.location.search);\n    if (params.get('print') !== '1') return;\n    params.delete('print');\n    const qs = params.toString();\n    try { history.replaceState(null, '', window.location.pathname + (qs ? '?' + qs : '') + window.location.hash); } catch (e) { \/* sandbox *\/ }\n    if (wizard.currentStep !== 4) return;\n    renderPrintReport();\n    const go = () => setTimeout(printReport, 300);\n    if (document.readyState === 'complete') go();\n    else window.addEventListener('load', go, { once: true });\n}\n\n\/* Nei test (Node) non c'\u00e8 la pagina: si caricano solo dati e logica *\/\nif (typeof document !== 'undefined') initApp();\n})();\n<\/script>\n\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>Configuratore dell&#8217;ecosistemaEcosystem configurator Costruisci il tuo ecosistema aChiralBuild your aChiral ecosystem aChiral \u00e8 un ecosistema modulare di piattaforme per la ricerca clinica e la sanit\u00e0: rispondi a poche domande sulla tua organizzazione e sui dati che gestisci, e ti mostriamo quali piattaforme ti servono, come dialogano tra loro e quali normative coprono.aChiral is a modular [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-5325","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Ecosystem - aChiral<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/achiral.it\/en\/ecosystem\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ecosystem - aChiral\" \/>\n<meta property=\"og:description\" content=\"Configuratore dell&#8217;ecosistemaEcosystem configurator Costruisci il tuo ecosistema aChiralBuild your aChiral ecosystem aChiral \u00e8 un ecosistema modulare di piattaforme per la ricerca clinica e la sanit\u00e0: rispondi a poche domande sulla tua organizzazione e sui dati che gestisci, e ti mostriamo quali piattaforme ti servono, come dialogano tra loro e quali normative coprono.aChiral is a modular [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/achiral.it\/en\/ecosystem\/\" \/>\n<meta property=\"og:site_name\" content=\"aChiral\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-12T07:58:50+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/achiral.it\\\/ecosystem\\\/\",\"url\":\"https:\\\/\\\/achiral.it\\\/ecosystem\\\/\",\"name\":\"Ecosystem - aChiral\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/achiral.it\\\/en\\\/#website\"},\"datePublished\":\"2026-09-30T15:25:06+00:00\",\"dateModified\":\"2026-10-12T07:58:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/achiral.it\\\/ecosystem\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/achiral.it\\\/ecosystem\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/achiral.it\\\/ecosystem\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/achiral.it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ecosystem\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/achiral.it\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/achiral.it\\\/en\\\/\",\"name\":\"aChiral\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/achiral.it\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/achiral.it\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/achiral.it\\\/en\\\/#organization\",\"name\":\"aChiral\",\"url\":\"https:\\\/\\\/achiral.it\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/achiral.it\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/achiral.it\\\/wp-content\\\/uploads\\\/2022\\\/11\\\/aChiral_logo.png\",\"contentUrl\":\"https:\\\/\\\/achiral.it\\\/wp-content\\\/uploads\\\/2022\\\/11\\\/aChiral_logo.png\",\"width\":4934,\"height\":1280,\"caption\":\"aChiral\"},\"image\":{\"@id\":\"https:\\\/\\\/achiral.it\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ecosystem - aChiral","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/achiral.it\/en\/ecosystem\/","og_locale":"en_GB","og_type":"article","og_title":"Ecosystem - aChiral","og_description":"Configuratore dell&#8217;ecosistemaEcosystem configurator Costruisci il tuo ecosistema aChiralBuild your aChiral ecosystem aChiral \u00e8 un ecosistema modulare di piattaforme per la ricerca clinica e la sanit\u00e0: rispondi a poche domande sulla tua organizzazione e sui dati che gestisci, e ti mostriamo quali piattaforme ti servono, come dialogano tra loro e quali normative coprono.aChiral is a modular [&hellip;]","og_url":"https:\/\/achiral.it\/en\/ecosystem\/","og_site_name":"aChiral","article_modified_time":"2026-10-12T07:58:50+00:00","twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/achiral.it\/ecosystem\/","url":"https:\/\/achiral.it\/ecosystem\/","name":"Ecosystem - aChiral","isPartOf":{"@id":"https:\/\/achiral.it\/en\/#website"},"datePublished":"2026-09-30T15:25:06+00:00","dateModified":"2026-10-12T07:58:50+00:00","breadcrumb":{"@id":"https:\/\/achiral.it\/ecosystem\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/achiral.it\/ecosystem\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/achiral.it\/ecosystem\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/achiral.it\/"},{"@type":"ListItem","position":2,"name":"Ecosystem"}]},{"@type":"WebSite","@id":"https:\/\/achiral.it\/en\/#website","url":"https:\/\/achiral.it\/en\/","name":"aChiral","description":"","publisher":{"@id":"https:\/\/achiral.it\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/achiral.it\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/achiral.it\/en\/#organization","name":"aChiral","url":"https:\/\/achiral.it\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/achiral.it\/en\/#\/schema\/logo\/image\/","url":"https:\/\/achiral.it\/wp-content\/uploads\/2022\/11\/aChiral_logo.png","contentUrl":"https:\/\/achiral.it\/wp-content\/uploads\/2022\/11\/aChiral_logo.png","width":4934,"height":1280,"caption":"aChiral"},"image":{"@id":"https:\/\/achiral.it\/en\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/achiral.it\/en\/wp-json\/wp\/v2\/pages\/5325","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/achiral.it\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/achiral.it\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/achiral.it\/en\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/achiral.it\/en\/wp-json\/wp\/v2\/comments?post=5325"}],"version-history":[{"count":65,"href":"https:\/\/achiral.it\/en\/wp-json\/wp\/v2\/pages\/5325\/revisions"}],"predecessor-version":[{"id":5398,"href":"https:\/\/achiral.it\/en\/wp-json\/wp\/v2\/pages\/5325\/revisions\/5398"}],"wp:attachment":[{"href":"https:\/\/achiral.it\/en\/wp-json\/wp\/v2\/media?parent=5325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}