{"id":3575,"date":"2026-09-13T00:34:00","date_gmt":"2026-09-13T00:34:00","guid":{"rendered":"https:\/\/jiris.ca\/?page_id=3575"},"modified":"2026-09-13T00:35:11","modified_gmt":"2026-09-13T00:35:11","slug":"fiche-poser-des-limites-saines","status":"publish","type":"page","link":"https:\/\/jiris.ca\/en\/fiche-poser-des-limites-saines\/","title":{"rendered":"Fiche-Poser des limites saines"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3575\" class=\"elementor elementor-3575\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6e89b5e9 e-flex e-con-boxed e-con e-parent\" data-id=\"6e89b5e9\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-d02bb27 e-con-full e-flex e-con e-child\" data-id=\"d02bb27\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2b562688 elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"2b562688\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;,&quot;_animation_delay&quot;:200}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\"> Poser des limites saines<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-98aeed2 e-flex e-con-boxed e-con e-parent\" data-id=\"98aeed2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-50e53c9 elementor-widget elementor-widget-html\" data-id=\"50e53c9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Poser des limites saines \u2014 Outil d'accompagnement JIRIS<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,500;0,9..144,600;0,9..144,700;1,9..144,400&family=Work+Sans:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n<style>\n  :root {\n    --bg: #F4F2F8;\n    --surface: #FFFFFF;\n    --surface-soft: #FAF8FE;\n    --ink: #2A2438;\n    --muted: #756E8C;\n    --divider: #E1DCEC;\n    --primary: #453876;\n    --primary-light: #6D5AA0;\n    --primary-soft: #ECE8F8;\n    --primary-shadow: rgba(69, 56, 118, 0.14);\n    --accent: #2F8F5B;\n    --accent-soft: #E6F5EE;\n    --accent-shadow: rgba(47, 143, 91, 0.16);\n    --warm: #D97706;\n    --warm-soft: #FEF3C7;\n    --warm-border: #FDE68A;\n    --danger: #DC2626;\n    --danger-soft: #FEF2F2;\n    --danger-border: #FCA5A5;\n    --radius: 18px;\n    --radius-sm: 12px;\n    --transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n  }\n\n  * { box-sizing: border-box; margin: 0; padding: 0; }\n\n  body {\n    background: var(--bg);\n    color: var(--ink);\n    font-family: \"Work Sans\", sans-serif;\n    line-height: 1.6;\n    -webkit-font-smoothing: antialiased;\n    min-height: 100vh;\n    background-image:\n      radial-gradient(circle at 15% 0%, rgba(109, 90, 160, 0.08) 0%, transparent 45%),\n      radial-gradient(circle at 85% 100%, rgba(47, 143, 91, 0.06) 0%, transparent 45%);\n    background-attachment: fixed;\n  }\n\n  .wrap {\n    max-width: 780px;\n    margin: 0 auto;\n    padding: 40px 20px 80px;\n  }\n\n  \/* ===== HERO ===== *\/\n  .hero {\n    text-align: center;\n    margin-bottom: 32px;\n  }\n\n  .hero-frame {\n    width: 72px;\n    height: 72px;\n    margin: 0 auto 20px;\n    border-radius: 22px;\n    background: linear-gradient(135deg, var(--primary-soft), var(--accent-soft));\n    border: 1.5px solid var(--divider);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 34px;\n    box-shadow: 0 12px 32px var(--primary-shadow);\n    animation: float 4s ease-in-out infinite;\n  }\n\n  @keyframes float {\n    0%, 100% { transform: translateY(0); }\n    50% { transform: translateY(-6px); }\n  }\n\n  .hero h1 {\n    font-family: \"Fraunces\", serif;\n    font-weight: 600;\n    font-size: clamp(28px, 5.5vw, 40px);\n    color: var(--primary);\n    margin-bottom: 10px;\n    letter-spacing: -0.02em;\n  }\n\n  .hero .subtitle {\n    font-family: \"Fraunces\", serif;\n    font-style: italic;\n    color: var(--muted);\n    font-size: 17px;\n    max-width: 620px;\n    margin: 0 auto;\n  }\n\n  \/* ===== INTRO CARD ===== *\/\n  .intro-card {\n    background: var(--surface);\n    border-radius: var(--radius);\n    padding: 30px 32px;\n    margin-bottom: 32px;\n    box-shadow: 0 10px 30px rgba(42, 36, 56, 0.06);\n    border: 1px solid var(--divider);\n    border-left: 5px solid var(--primary);\n  }\n\n  .intro-card h2 {\n    font-family: \"Fraunces\", serif;\n    font-weight: 600;\n    font-size: 20px;\n    color: var(--primary);\n    margin-bottom: 14px;\n  }\n\n  .intro-card p {\n    font-size: 15.5px;\n    color: var(--ink);\n    margin-bottom: 12px;\n    line-height: 1.7;\n  }\n\n  .intro-card p:last-child { margin-bottom: 0; }\n  .intro-card strong { color: var(--primary); font-weight: 600; }\n\n  .intro-note {\n    margin-top: 18px;\n    padding: 14px 18px;\n    background: var(--primary-soft);\n    border-left: 4px solid var(--primary);\n    border-radius: 0 10px 10px 0;\n    font-size: 14px;\n    color: var(--primary);\n    line-height: 1.6;\n  }\n\n  .intro-note strong { color: var(--primary); }\n\n  \/* ===== AVERTISSEMENT ===== *\/\n  .warning-card {\n    background: var(--warm-soft);\n    border: 1.5px solid var(--warm-border);\n    border-radius: var(--radius-sm);\n    padding: 20px 22px;\n    margin-bottom: 22px;\n    display: flex;\n    gap: 14px;\n    align-items: flex-start;\n  }\n\n  .warning-card .warning-icon {\n    font-size: 24px;\n    line-height: 1;\n    flex-shrink: 0;\n    margin-top: 2px;\n  }\n\n  .warning-card .warning-content h3 {\n    font-family: \"Fraunces\", serif;\n    font-weight: 600;\n    font-size: 16px;\n    color: #92400E;\n    margin-bottom: 8px;\n  }\n\n  .warning-card .warning-content p {\n    font-size: 14px;\n    color: #78350F;\n    line-height: 1.6;\n    margin-bottom: 6px;\n  }\n\n  .warning-card .warning-content p:last-child { margin-bottom: 0; }\n\n  .warning-card strong {\n    color: #78350F;\n    font-weight: 700;\n  }\n\n  \/* ===== AVIS DE COMPL\u00c9TION ===== *\/\n  .completed-notice {\n    background: var(--accent-soft);\n    border-left: 4px solid var(--accent);\n    border-radius: 0 10px 10px 0;\n    padding: 16px 20px;\n    margin-bottom: 18px;\n    display: flex;\n    gap: 14px;\n    align-items: flex-start;\n  }\n  .completed-notice .completed-icon {\n    font-size: 22px;\n    line-height: 1;\n    flex-shrink: 0;\n    margin-top: 2px;\n  }\n  .completed-notice .completed-text { flex: 1; }\n  .completed-notice .completed-text strong {\n    display: block;\n    color: var(--accent);\n    font-family: \"Fraunces\", serif;\n    font-weight: 600;\n    font-size: 15px;\n    margin-bottom: 6px;\n  }\n  .completed-notice .completed-text p {\n    font-size: 14px;\n    color: var(--ink);\n    line-height: 1.6;\n    margin: 0;\n  }\n\n  .restart-hint {\n    text-align: center;\n    font-size: 13px;\n    color: var(--muted);\n    font-style: italic;\n    margin-top: 16px;\n    line-height: 1.6;\n  }\n\n  \/* ===== PROGRESSION ===== *\/\n  .progress-wrapper {\n    margin-bottom: 28px;\n  }\n\n  .progress-text {\n    display: flex;\n    justify-content: space-between;\n    font-size: 13.5px;\n    font-weight: 600;\n    color: var(--muted);\n    margin-bottom: 8px;\n    letter-spacing: 0.02em;\n  }\n\n  .progress-bar {\n    width: 100%;\n    height: 8px;\n    background: var(--primary-soft);\n    border-radius: 99px;\n    overflow: hidden;\n  }\n\n  .progress-fill {\n    height: 100%;\n    background: linear-gradient(90deg, var(--primary), var(--accent));\n    border-radius: 99px;\n    transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);\n    width: 0%;\n  }\n\n  \/* ===== \u00c9TAPE ===== *\/\n  .step {\n    display: none;\n    background: var(--surface);\n    border-radius: var(--radius);\n    padding: 34px 32px;\n    margin-bottom: 24px;\n    box-shadow: 0 10px 30px rgba(42, 36, 56, 0.06);\n    border: 1px solid var(--divider);\n    animation: fadeInUp 0.4s ease;\n  }\n\n  .step.active { display: block; }\n\n  @keyframes fadeInUp {\n    from { opacity: 0; transform: translateY(12px); }\n    to { opacity: 1; transform: translateY(0); }\n  }\n\n  .step-badge {\n    display: inline-block;\n    padding: 5px 14px;\n    background: var(--primary-soft);\n    color: var(--primary);\n    border-radius: 99px;\n    font-size: 11.5px;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: 0.08em;\n    margin-bottom: 14px;\n  }\n\n  .step-title {\n    font-family: \"Fraunces\", serif;\n    font-weight: 600;\n    font-size: 24px;\n    color: var(--primary);\n    margin-bottom: 8px;\n    line-height: 1.3;\n    display: flex;\n    align-items: center;\n    gap: 10px;\n  }\n\n  .step-title .step-emoji {\n    font-size: 26px;\n    line-height: 1;\n  }\n\n  .step-hint {\n    font-size: 14.5px;\n    color: var(--muted);\n    margin-bottom: 22px;\n    font-style: italic;\n    line-height: 1.6;\n  }\n\n  .field-group {\n    margin-bottom: 18px;\n  }\n\n  .field-label {\n    display: block;\n    font-size: 14.5px;\n    font-weight: 600;\n    color: var(--ink);\n    margin-bottom: 8px;\n    line-height: 1.5;\n  }\n\n  .field-label .field-example {\n    display: block;\n    font-weight: 400;\n    font-style: italic;\n    font-size: 13px;\n    color: var(--muted);\n    margin-top: 4px;\n  }\n\n  textarea,\n  input[type=\"text\"] {\n    width: 100%;\n    border: 1.5px solid var(--divider);\n    background: var(--surface);\n    border-radius: 12px;\n    padding: 14px 16px;\n    font-family: \"Work Sans\", sans-serif;\n    font-size: 15px;\n    color: var(--ink);\n    transition: all var(--transition);\n    resize: vertical;\n    line-height: 1.6;\n    min-height: 90px;\n  }\n\n  input[type=\"text\"] { min-height: auto; }\n\n  textarea:focus,\n  input[type=\"text\"]:focus {\n    outline: none;\n    border-color: var(--primary-light);\n    box-shadow: 0 0 0 4px rgba(69, 56, 118, 0.08);\n  }\n\n  textarea::placeholder,\n  input::placeholder {\n    color: var(--muted);\n    opacity: 0.7;\n  }\n\n  .helper-text {\n    font-size: 13px;\n    color: var(--muted);\n    margin-top: 8px;\n    line-height: 1.6;\n    font-style: italic;\n  }\n\n  .guided-list {\n    display: flex;\n    flex-direction: column;\n    gap: 12px;\n    margin-bottom: 18px;\n  }\n\n  .guided-item {\n    background: var(--surface-soft);\n    border: 1.5px solid var(--divider);\n    border-radius: var(--radius-sm);\n    padding: 14px 18px;\n    transition: all var(--transition);\n  }\n\n  .guided-item:focus-within {\n    border-color: var(--primary);\n    background: var(--surface);\n    box-shadow: 0 0 0 4px rgba(69, 56, 118, 0.06);\n  }\n\n  .guided-item .item-label {\n    font-size: 13.5px;\n    font-weight: 600;\n    color: var(--primary);\n    margin-bottom: 8px;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n  }\n\n  .guided-item .item-num {\n    display: inline-flex;\n    width: 22px;\n    height: 22px;\n    border-radius: 50%;\n    background: var(--primary-soft);\n    color: var(--primary);\n    align-items: center;\n    justify-content: center;\n    font-size: 11px;\n    font-weight: 700;\n    flex-shrink: 0;\n  }\n\n  .guided-item textarea {\n    min-height: 64px;\n    padding: 10px 14px;\n    font-size: 14.5px;\n    border: 1px solid var(--divider);\n    background: var(--surface);\n  }\n\n  \/* ===== DEUX COLONNES ===== *\/\n  .control-grid {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 16px;\n    margin-bottom: 8px;\n  }\n\n  .control-box {\n    background: var(--surface-soft);\n    border: 1.5px solid var(--divider);\n    border-radius: var(--radius-sm);\n    padding: 16px 18px;\n    transition: all var(--transition);\n  }\n\n  .control-box:focus-within {\n    border-color: var(--primary);\n    background: var(--surface);\n    box-shadow: 0 0 0 4px rgba(69, 56, 118, 0.06);\n  }\n\n  .control-box.facts {\n    border-left: 4px solid var(--accent);\n  }\n\n  .control-box.fears {\n    border-left: 4px solid var(--warm);\n  }\n\n  .control-box .control-header {\n    font-size: 13.5px;\n    font-weight: 700;\n    margin-bottom: 10px;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    line-height: 1.4;\n  }\n\n  .control-box.facts .control-header { color: var(--accent); }\n  .control-box.fears .control-header { color: var(--warm); }\n\n  .control-box .control-icon {\n    font-size: 16px;\n    line-height: 1;\n  }\n\n  .control-box textarea {\n    min-height: 120px;\n    font-size: 14.5px;\n    padding: 12px 14px;\n    border: 1px solid var(--divider);\n    background: var(--surface);\n  }\n\n  .control-box .control-help {\n    font-size: 12px;\n    color: var(--muted);\n    font-style: italic;\n    margin-top: 8px;\n    line-height: 1.5;\n  }\n\n  @media (max-width: 640px) {\n    .control-grid {\n      grid-template-columns: 1fr;\n    }\n  }\n\n  \/* ===== CHIPS ===== *\/\n  .chips-row {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n    margin-bottom: 14px;\n  }\n\n  .chip {\n    padding: 8px 16px;\n    background: var(--surface);\n    border: 1.5px solid var(--divider);\n    border-radius: 99px;\n    font-size: 13.5px;\n    font-weight: 500;\n    color: var(--ink);\n    cursor: pointer;\n    transition: all var(--transition);\n    font-family: inherit;\n  }\n\n  .chip:hover {\n    border-color: var(--primary);\n    color: var(--primary);\n    background: var(--primary-soft);\n  }\n\n  .chip.selected {\n    background: var(--primary);\n    border-color: var(--primary);\n    color: #FFFFFF;\n  }\n\n  \/* ===== GRILLE MULTI-S\u00c9LECTION ===== *\/\n  .multi-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n    gap: 10px;\n    margin-bottom: 8px;\n  }\n\n  .multi-chip {\n    padding: 12px 16px;\n    background: var(--surface-soft);\n    border: 1.5px solid var(--divider);\n    border-radius: var(--radius-sm);\n    font-size: 13.5px;\n    font-weight: 500;\n    color: var(--ink);\n    cursor: pointer;\n    transition: all var(--transition);\n    text-align: left;\n    font-family: inherit;\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    line-height: 1.4;\n  }\n\n  .multi-chip::before {\n    content: \"\";\n    width: 18px;\n    height: 18px;\n    border-radius: 5px;\n    border: 1.5px solid var(--divider);\n    background: var(--surface);\n    flex-shrink: 0;\n    transition: all var(--transition);\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n  }\n\n  .multi-chip:hover {\n    border-color: var(--primary);\n    background: var(--primary-soft);\n  }\n\n  .multi-chip.selected {\n    border-color: var(--primary);\n    background: var(--primary-soft);\n    color: var(--primary);\n    font-weight: 600;\n  }\n\n  .multi-chip.selected::before {\n    background: var(--primary);\n    border-color: var(--primary);\n    content: \"\u2713\";\n    color: #FFFFFF;\n    font-size: 12px;\n    font-weight: 700;\n  }\n\n  \/* ===== INFO ENCADR\u00c9 ===== *\/\n  .info-callout {\n    background: var(--accent-soft);\n    border-left: 4px solid var(--accent);\n    border-radius: 0 12px 12px 0;\n    padding: 16px 20px;\n    margin: 16px 0;\n    font-size: 14px;\n    color: var(--ink);\n    line-height: 1.65;\n  }\n\n  .info-callout strong {\n    color: var(--accent);\n    font-weight: 700;\n  }\n\n  .info-emphasis {\n    background: var(--primary-soft);\n    border-left: 4px solid var(--primary);\n    border-radius: 0 12px 12px 0;\n    padding: 16px 20px;\n    margin: 16px 0;\n    font-size: 14px;\n    color: var(--ink);\n    line-height: 1.65;\n  }\n\n  .info-emphasis strong {\n    color: var(--primary);\n    font-weight: 700;\n  }\n\n  \/* ===== BOUTONS ===== *\/\n  .btn-group {\n    display: flex;\n    gap: 12px;\n    flex-wrap: wrap;\n    margin-top: 26px;\n    justify-content: space-between;\n  }\n\n  .btn {\n    padding: 14px 28px;\n    border: none;\n    border-radius: var(--radius-sm);\n    font-family: \"Work Sans\", sans-serif;\n    font-weight: 600;\n    font-size: 15px;\n    cursor: pointer;\n    transition: all var(--transition);\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    gap: 8px;\n    white-space: nowrap;\n  }\n\n  .btn-primary {\n    background: var(--primary);\n    color: #FFFFFF;\n    box-shadow: 0 6px 20px var(--primary-shadow);\n  }\n\n  .btn-primary:hover {\n    background: var(--primary-light);\n    transform: translateY(-2px);\n    box-shadow: 0 10px 28px var(--primary-shadow);\n  }\n\n  .btn-accent {\n    background: var(--accent);\n    color: #FFFFFF;\n    box-shadow: 0 6px 20px var(--accent-shadow);\n  }\n\n  .btn-accent:hover {\n    background: #27794d;\n    transform: translateY(-2px);\n    box-shadow: 0 10px 28px var(--accent-shadow);\n  }\n\n  .btn-secondary {\n    background: var(--surface);\n    color: var(--ink);\n    border: 1.5px solid var(--divider);\n  }\n\n  .btn-secondary:hover {\n    background: var(--primary-soft);\n    border-color: var(--primary);\n    color: var(--primary);\n  }\n\n  \/* ===== R\u00c9SUM\u00c9 ===== *\/\n  .summary-section {\n    background: var(--surface);\n    border-radius: var(--radius);\n    padding: 34px 32px;\n    margin-bottom: 24px;\n    box-shadow: 0 16px 40px rgba(42, 36, 56, 0.08);\n    border: 1px solid var(--divider);\n    border-top: 5px solid var(--accent);\n    display: none;\n  }\n\n  .summary-section.active { display: block; animation: fadeInUp 0.5s ease; }\n\n  .summary-hero {\n    text-align: center;\n    margin-bottom: 28px;\n    padding-bottom: 24px;\n    border-bottom: 1px dashed var(--divider);\n  }\n\n  .summary-hero .summary-emoji {\n    font-size: 44px;\n    line-height: 1;\n    margin-bottom: 12px;\n  }\n\n  .summary-hero h2 {\n    font-family: \"Fraunces\", serif;\n    font-weight: 600;\n    font-size: 26px;\n    color: var(--primary);\n    margin-bottom: 10px;\n  }\n\n  .summary-hero p {\n    font-size: 15px;\n    color: var(--muted);\n    font-style: italic;\n    max-width: 520px;\n    margin: 0 auto;\n  }\n\n  .summary-block {\n    margin-bottom: 22px;\n    padding-bottom: 22px;\n    border-bottom: 1px solid var(--divider);\n  }\n\n  .summary-block:last-child {\n    border-bottom: none;\n    padding-bottom: 0;\n    margin-bottom: 0;\n  }\n\n  .summary-block h3 {\n    font-family: \"Fraunces\", serif;\n    font-weight: 600;\n    font-size: 17px;\n    color: var(--primary);\n    margin-bottom: 10px;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n  }\n\n  .summary-block p {\n    font-size: 15px;\n    color: var(--ink);\n    line-height: 1.7;\n    white-space: pre-wrap;\n  }\n\n  .summary-block ul {\n    list-style: none;\n    padding-left: 0;\n  }\n\n  .summary-block ul li {\n    position: relative;\n    padding-left: 22px;\n    font-size: 14.5px;\n    color: var(--ink);\n    line-height: 1.65;\n    margin-bottom: 8px;\n  }\n\n  .summary-block ul li::before {\n    content: \"\u2726\";\n    position: absolute;\n    left: 0;\n    color: var(--accent);\n    font-size: 13px;\n    top: 1px;\n  }\n\n  .summary-control-grid {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 14px;\n    margin-top: 8px;\n  }\n\n  .summary-control-box {\n    padding: 14px 16px;\n    border-radius: 10px;\n    border: 1px solid var(--divider);\n    font-size: 14.5px;\n    line-height: 1.65;\n  }\n\n  .summary-control-box.facts {\n    background: var(--accent-soft);\n    border-left: 4px solid var(--accent);\n  }\n\n  .summary-control-box.fears {\n    background: var(--warm-soft);\n    border-left: 4px solid var(--warm);\n  }\n\n  .summary-control-box .summary-control-label {\n    font-weight: 700;\n    font-size: 12.5px;\n    text-transform: uppercase;\n    letter-spacing: 0.05em;\n    margin-bottom: 6px;\n    display: block;\n  }\n\n  .summary-control-box.facts .summary-control-label { color: var(--accent); }\n  .summary-control-box.fears .summary-control-label { color: #92400E; }\n\n  @media (max-width: 640px) {\n    .summary-control-grid {\n      grid-template-columns: 1fr;\n    }\n  }\n\n  .summary-resources {\n    background: var(--accent-soft);\n    border-left: 4px solid var(--accent);\n    border-radius: 0 10px 10px 0;\n    padding: 16px 20px;\n    margin-top: 10px;\n    font-size: 14.5px;\n    color: var(--ink);\n    line-height: 1.7;\n  }\n\n  .summary-resources strong {\n    color: var(--accent);\n    display: block;\n    margin-bottom: 6px;\n  }\n\n  .summary-actions {\n    display: flex;\n    gap: 12px;\n    flex-wrap: wrap;\n    justify-content: center;\n    margin-top: 26px;\n    padding-top: 24px;\n    border-top: 1px solid var(--divider);\n  }\n\n  \/* ===== FOOTER ===== *\/\n  .footer {\n    text-align: center;\n    margin-top: 56px;\n    padding-top: 28px;\n    border-top: 1px solid var(--divider);\n    color: var(--muted);\n    font-size: 13px;\n    line-height: 1.7;\n  }\n\n  .footer strong {\n    color: var(--primary);\n    font-weight: 600;\n  }\n\n  \/* ===== RESPONSIVE ===== *\/\n  @media (max-width: 640px) {\n    .wrap { padding: 28px 16px 60px; }\n    .step { padding: 24px 20px; }\n    .intro-card { padding: 22px 20px; }\n    .summary-section { padding: 24px 20px; }\n    .step-title { font-size: 20px; }\n    .step-title .step-emoji { font-size: 22px; }\n    .btn-group { flex-direction: column-reverse; }\n    .btn-group .btn { width: 100%; }\n    .summary-actions { flex-direction: column; }\n    .summary-actions .btn { width: 100%; }\n    .warning-card { padding: 16px 16px; flex-direction: column; gap: 10px; }\n    .completed-notice { padding: 14px 16px; flex-direction: column; gap: 10px; }\n    .multi-grid { grid-template-columns: 1fr; }\n  }\n\n  @media (prefers-reduced-motion: reduce) {\n    *, *::before, *::after {\n      animation-duration: 0.01ms !important;\n      transition-duration: 0.01ms !important;\n    }\n  }\n\n  @media print {\n    body { background: white; }\n    .wrap { padding: 0; }\n    .hero-frame, .btn, .intro-note, .footer, .progress-wrapper, .restart-hint { display: none !important; }\n    .summary-section { box-shadow: none; border: 1px solid #ccc; page-break-inside: avoid; }\n    .step { display: none !important; }\n  }\n<\/style>\n<\/head>\n<body>\n\n<div class=\"wrap\">\n\n  <!-- HERO -->\n  <header class=\"hero\">\n    <div class=\"hero-frame\">\ud83d\udee1\ufe0f<\/div>\n    <h1>Poser des limites saines<\/h1>\n    <p class=\"subtitle\">Un outil d'accompagnement pour apprendre \u00e0 dire non sans se trahir, se respecter, et pr\u00e9server le lien avec les autres.<\/p>\n  <\/header>\n\n  <!-- INTRO -->\n  <div class=\"intro-card\" id=\"introCard\">\n    <h2>Avant de commencer<\/h2>\n\n    <!-- AVERTISSEMENT -->\n    <div class=\"warning-card\">\n      <div class=\"warning-icon\">\u26a0\ufe0f<\/div>\n      <div class=\"warning-content\">\n        <h3>Poser une limite n'est pas rejeter l'autre<\/h3>\n        <p>Une limite saine dit quelque chose de <strong>vous<\/strong> (\u00ab je ne peux pas \u00bb, \u00ab je ne veux pas \u00bb, \u00ab j'ai besoin de \u00bb), pas quelque chose contre l'autre. Elle vise \u00e0 <strong>prot\u00e9ger la relation<\/strong> et votre int\u00e9grit\u00e9 \u2014 pas \u00e0 punir ou dominer.<\/p>\n        <p>Cet outil ne remplace pas un accompagnement professionnel. Si vous vivez une situation de <strong>violence, de contr\u00f4le, de chantage affectif ou de harc\u00e8lement<\/strong>, il est essentiel d'en parler \u00e0 une ressource sp\u00e9cialis\u00e9e : <strong>811<\/strong> (Info-Social, 24\/7, Qu\u00e9bec), <strong>1 800 363-9010<\/strong> (SOS violence conjugale), ou <strong>911<\/strong> en cas d'urgence.<\/p>\n      <\/div>\n    <\/div>\n\n    <p>Dire oui \u00e0 tout, ce n'est pas \u00eatre gentil\u00b7le \u2014 c'est souvent <strong>s'oublier<\/strong>. Beaucoup de personnes qui ont du mal \u00e0 poser des limites ont appris, souvent t\u00f4t, que dire non \u00e9tait risqu\u00e9, \u00e9go\u00efste, ou dangereux. Le prix \u00e0 payer : \u00e9puisement, ressentiment, perte de soi.<\/p>\n    <p>Cet outil vous propose d'explorer <strong>les situations o\u00f9 vous dites oui malgr\u00e9 vous<\/strong>, ce qui se passe \u00e0 l'int\u00e9rieur, les croyances qui bloquent, vos besoins profonds, des formulations possibles, et un premier pas concret vers un \u00ab non \u00bb bienveillant.<\/p>\n    <p><strong>Il ne s'agit pas de devenir dur\u00b7e<\/strong>, mais d'apprendre \u00e0 <em>\u00eatre vrai\u00b7e<\/em>. Poser une limite, c'est aussi une forme de respect \u2014 envers soi et envers l'autre.<\/p>\n    <p><em>Compl\u00e8te le quiz \u00ab Assertivit\u00e9 \u00bb.<\/em><\/p>\n    <div class=\"intro-note\">\n      <strong>\u23f1\ufe0f Dur\u00e9e estim\u00e9e :<\/strong> 20 \u00e0 30 minutes. Prenez le temps qu'il vous faut. Vos r\u00e9ponses sont enregistr\u00e9es automatiquement dans votre navigateur et restent confidentielles.\n    <\/div>\n\n    <!-- AVIS DE COMPL\u00c9TION -->\n    <div class=\"completed-notice\" id=\"completedNotice\" style=\"display: none;\">\n      <div class=\"completed-icon\">\u2705<\/div>\n      <div class=\"completed-text\">\n        <strong>Vous avez termin\u00e9 cette exploration.<\/strong>\n        <p>Votre synth\u00e8se est pr\u00eate. Vous pouvez la revoir ou recommencer une nouvelle exploration.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"btn-group\" style=\"justify-content: flex-start;\">\n      <button class=\"btn btn-primary\" id=\"startBtn\" type=\"button\">Commencer \u2192<\/button>\n      <button class=\"btn btn-accent\" id=\"reviewBtn\" type=\"button\" style=\"display: none;\">\u2728 Revoir ma synth\u00e8se<\/button>\n      <button class=\"btn btn-secondary\" id=\"resetBtn\" type=\"button\">R\u00e9initialiser<\/button>\n    <\/div>\n  <\/div>\n\n  <!-- PROGRESSION -->\n  <div class=\"progress-wrapper\" id=\"progressWrapper\" style=\"display: none;\">\n    <div class=\"progress-text\">\n      <span id=\"progressLabel\">\u00c9tape 1 sur 6<\/span>\n      <span id=\"progressPercent\">0%<\/span>\n    <\/div>\n    <div class=\"progress-bar\">\n      <div class=\"progress-fill\" id=\"progressFill\"><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- ===== \u00c9TAPE 1 ===== -->\n  <section class=\"step\" id=\"step1\" data-step=\"1\">\n    <span class=\"step-badge\">\u00c9tape 1 \u00b7 Reconna\u00eetre<\/span>\n    <h2 class=\"step-title\"><span class=\"step-emoji\">\ud83d\udd0e<\/span> Les situations o\u00f9 je dis oui malgr\u00e9 moi<\/h2>\n    <p class=\"step-hint\">Commen\u00e7ons par rep\u00e9rer les contextes o\u00f9 votre \u00ab oui \u00bb vous co\u00fbte. Sans se juger \u2014 juste pour voir clairement de quoi on parle.<\/p>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\">\n        Dans quelles situations avez-vous le plus de mal \u00e0 poser une limite ?\n        <span class=\"field-example\">Cochez tout ce qui r\u00e9sonne.<\/span>\n      <\/label>\n      <div class=\"multi-grid\" id=\"situationsGrid\"><\/div>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"recentSituation\">\n        D\u00e9crivez une situation r\u00e9cente o\u00f9 vous avez dit oui alors que vous vouliez dire non :\n        <span class=\"field-example\">Quelques lignes suffisent. Qui, quoi, quand \u2014 et ce que vous auriez voulu r\u00e9pondre.<\/span>\n      <\/label>\n      <textarea id=\"recentSituation\" placeholder=\"La derni\u00e8re fois o\u00f9\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"withWhom\">\n        Avec qui est-ce le plus difficile ?\n        <span class=\"field-example\">Ex. : \u00ab Mon\/ma conjoint\u00b7e \u00bb, \u00ab Ma m\u00e8re \u00bb, \u00ab Mon patron \u00bb, \u00ab Mes ami\u00b7es \u00bb, \u00ab Mes enfants \u00bb, \u00ab Des inconnus \u00bb.<\/span>\n      <\/label>\n      <textarea id=\"withWhom\" placeholder=\"Avec\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\">Sur une \u00e9chelle de 0 \u00e0 10, \u00e0 quel point avez-vous de la difficult\u00e9 \u00e0 dire non en g\u00e9n\u00e9ral ?<\/label>\n      <div class=\"chips-row\" id=\"difficultyChips\"><\/div>\n      <div class=\"helper-text\">0 = j'y arrive facilement \u00b7 10 = c'est extr\u00eamement difficile. Aucun jugement.<\/div>\n    <\/div>\n\n    <div class=\"btn-group\">\n      <button class=\"btn btn-secondary\" type=\"button\" data-action=\"intro\">\u2190 Retour<\/button>\n      <button class=\"btn btn-primary\" type=\"button\" data-action=\"step\" data-target=\"2\">Continuer \u2192<\/button>\n    <\/div>\n  <\/section>\n\n  <!-- ===== \u00c9TAPE 2 ===== -->\n  <section class=\"step\" id=\"step2\" data-step=\"2\">\n    <span class=\"step-badge\">\u00c9tape 2 \u00b7 Explorer<\/span>\n    <h2 class=\"step-title\"><span class=\"step-emoji\">\ud83d\udcad<\/span> Ce qui se passe en dedans<\/h2>\n    <p class=\"step-hint\">Quand on dit oui malgr\u00e9 soi, il se passe quelque chose \u00e0 l'int\u00e9rieur \u2014 une tension, une peur, un r\u00e9flexe. Observer ce m\u00e9canisme, c'est d\u00e9j\u00e0 commencer \u00e0 le desserrer.<\/p>\n\n    <div class=\"info-callout\">\n      <strong>\ud83d\udca1 Ce qui se joue souvent<\/strong><br>\n      Dire oui alors qu'on veut dire non g\u00e9n\u00e8re souvent un <strong>conflit int\u00e9rieur<\/strong> : d'un c\u00f4t\u00e9 l'envie de faire plaisir, d'\u00e9viter le conflit, de rester aim\u00e9\u00b7e ; de l'autre, la fatigue, le ressentiment, la sensation de s'oublier. Rep\u00e9rer ce conflit permet de sortir du pilote automatique.\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\">\n        Que ressentez-vous au moment o\u00f9 vous dites oui alors que vous voulez dire non ?\n        <span class=\"field-example\">Cochez tout ce qui r\u00e9sonne, puis compl\u00e9tez.<\/span>\n      <\/label>\n      <div class=\"multi-grid\" id=\"feelingsGrid\"><\/div>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"bodyReaction\">\n        Comment votre corps r\u00e9agit-il dans ces moments ?\n        <span class=\"field-example\">Ex. : gorge serr\u00e9e, ventre nou\u00e9, respiration courte, chaleur, envie de dispara\u00eetre, tremblement.<\/span>\n      <\/label>\n      <textarea id=\"bodyReaction\" placeholder=\"Dans mon corps\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"afterFeeling\">\n        Que ressentez-vous <em>apr\u00e8s<\/em> avoir dit oui malgr\u00e9 vous ?\n        <span class=\"field-example\">Ex. : \u00ab Je rumine \u00bb, \u00ab Je m'en veux \u00bb, \u00ab Je me sens pi\u00e9g\u00e9\u00b7e \u00bb, \u00ab Je ressens du ressentiment envers l'autre \u00bb, \u00ab Je me sens vide \u00bb.<\/span>\n      <\/label>\n      <textarea id=\"afterFeeling\" placeholder=\"Apr\u00e8s, je ressens\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"innerVoice\">\n        Y a-t-il une voix int\u00e9rieure \u2014 la v\u00f4tre ou celle d'une figure pass\u00e9e \u2014 qui vous dit de dire oui ?\n        <span class=\"field-example\">Ex. : \u00ab Tu exag\u00e8res \u00bb, \u00ab Tu vas d\u00e9cevoir \u00bb, \u00ab Ce n'est rien, fais-le \u00bb, \u00ab Si tu refuses, tu es \u00e9go\u00efste \u00bb.<\/span>\n      <\/label>\n      <textarea id=\"innerVoice\" placeholder=\"Cette voix qui me dit\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"btn-group\">\n      <button class=\"btn btn-secondary\" type=\"button\" data-action=\"step\" data-target=\"1\">\u2190 Pr\u00e9c\u00e9dent<\/button>\n      <button class=\"btn btn-primary\" type=\"button\" data-action=\"step\" data-target=\"3\">Continuer \u2192<\/button>\n    <\/div>\n  <\/section>\n\n  <!-- ===== \u00c9TAPE 3 ===== -->\n  <section class=\"step\" id=\"step3\" data-step=\"3\">\n    <span class=\"step-badge\">\u00c9tape 3 \u00b7 Distinguer<\/span>\n    <h2 class=\"step-title\"><span class=\"step-emoji\">\ud83d\udd0d<\/span> Faits et croyances<\/h2>\n    <p class=\"step-hint\">Dire non active souvent des croyances profondes \u2014 rarement conscientes. Les distinguer des faits permet de ne pas se laisser gouverner par elles.<\/p>\n\n    <div class=\"control-grid\">\n      <div class=\"control-box facts\">\n        <div class=\"control-header\">\n          <span class=\"control-icon\">\u2705<\/span>\n          <span>Ce que je sais (faits)<\/span>\n        <\/div>\n        <textarea id=\"facts\" placeholder=\"Ce qui se passerait r\u00e9ellement si je disais non : ce que je sais de l'autre, de la situation, de mes capacit\u00e9s\u2026\"><\/textarea>\n        <div class=\"control-help\">Ce qui est observable, v\u00e9rifiable.<\/div>\n      <\/div>\n\n      <div class=\"control-box fears\">\n        <div class=\"control-header\">\n          <span class=\"control-icon\">\ud83d\udcad<\/span>\n          <span>Ce que je crains (croyances)<\/span>\n        <\/div>\n        <textarea id=\"fears\" placeholder=\"Ex. : \u00ab On ne m'aimera plus \u00bb, \u00ab Je vais perdre ma place \u00bb, \u00ab Je serai exclu\u00b7e \u00bb, \u00ab L'autre va s'effondrer \u00bb\u2026\"><\/textarea>\n        <div class=\"control-help\">Ce qui est anticip\u00e9, imagin\u00e9, redout\u00e9.<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"field-group\" style=\"margin-top: 18px;\">\n      <label class=\"field-label\" for=\"learnedBeliefs\">\n        Quelles croyances avez-vous apprises sur le fait de dire non ?\n        <span class=\"field-example\">Ex. : \u00ab Dire non, c'est \u00e9go\u00efste \u00bb, \u00ab Une personne gentille ne refuse rien \u00bb, \u00ab Si je pose une limite, on va me rejeter \u00bb, \u00ab Un bon enfant dit oui \u00e0 ses parents \u00bb.<\/span>\n      <\/label>\n      <textarea id=\"learnedBeliefs\" placeholder=\"Ce qu'on m'a appris ou ce que je crois\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"reconsider\">\n        Y a-t-il une croyance que vous aimeriez commencer \u00e0 nuancer ?\n        <span class=\"field-example\">Ex. : \u00ab Peut-\u00eatre que dire non ne me fait pas perdre l'autre \u00bb, \u00ab Poser une limite peut aussi prot\u00e9ger la relation \u00bb.<\/span>\n      <\/label>\n      <textarea id=\"reconsider\" placeholder=\"Une croyance que je voudrais nuancer\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"btn-group\">\n      <button class=\"btn btn-secondary\" type=\"button\" data-action=\"step\" data-target=\"2\">\u2190 Pr\u00e9c\u00e9dent<\/button>\n      <button class=\"btn btn-primary\" type=\"button\" data-action=\"step\" data-target=\"4\">Continuer \u2192<\/button>\n    <\/div>\n  <\/section>\n\n  <!-- ===== \u00c9TAPE 4 ===== -->\n  <section class=\"step\" id=\"step4\" data-step=\"4\">\n    <span class=\"step-badge\">\u00c9tape 4 \u00b7 Besoins<\/span>\n    <h2 class=\"step-title\"><span class=\"step-emoji\">\ud83c\udf31<\/span> Mes besoins<\/h2>\n    <p class=\"step-hint\">Derri\u00e8re la difficult\u00e9 \u00e0 dire non, il y a souvent des besoins tr\u00e8s l\u00e9gitimes \u2014 de s\u00e9curit\u00e9, d'appartenance, de paix. Nommer ces besoins permet de poser des limites <em>au service<\/em> de ce qui compte, pas <em>contre<\/em> l'autre.<\/p>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\">\n        De quoi avez-vous besoin, pour vous, dans ces situations ?\n        <span class=\"field-example\">Cochez tout ce qui r\u00e9sonne.<\/span>\n      <\/label>\n      <div class=\"chips-row\" id=\"needsChips\"><\/div>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"needText\">\n        Ce besoin, formul\u00e9 plus pr\u00e9cis\u00e9ment :\n      <\/label>\n      <textarea id=\"needText\" placeholder=\"J'aurais besoin de\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"protection\">\n        Qu'est-ce que poser une limite vous permettrait de <strong>prot\u00e9ger<\/strong> ?\n        <span class=\"field-example\">Ex. : \u00ab Mon \u00e9nergie \u00bb, \u00ab Ma sant\u00e9 \u00bb, \u00ab Mon temps \u00bb, \u00ab Ma famille \u00bb, \u00ab Ma dignit\u00e9 \u00bb, \u00ab La qualit\u00e9 de mes relations \u00bb.<\/span>\n      <\/label>\n      <textarea id=\"protection\" placeholder=\"Ce que je veux prot\u00e9ger\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"btn-group\">\n      <button class=\"btn btn-secondary\" type=\"button\" data-action=\"step\" data-target=\"3\">\u2190 Pr\u00e9c\u00e9dent<\/button>\n      <button class=\"btn btn-primary\" type=\"button\" data-action=\"step\" data-target=\"5\">Continuer \u2192<\/button>\n    <\/div>\n  <\/section>\n\n  <!-- ===== \u00c9TAPE 5 ===== -->\n  <section class=\"step\" id=\"step5\" data-step=\"5\">\n    <span class=\"step-badge\">\u00c9tape 5 \u00b7 Ressources<\/span>\n    <h2 class=\"step-title\"><span class=\"step-emoji\">\ud83d\udcac<\/span> Formulations possibles<\/h2>\n    <p class=\"step-hint\">Savoir ce qu'on veut dire, c'est bien. Savoir <em>comment<\/em> le dire, c'est souvent ce qui fait la diff\u00e9rence. Voici des pistes concr\u00e8tes \u2014 \u00e0 adapter \u00e0 votre voix.<\/p>\n\n    <div class=\"info-emphasis\">\n      <strong>\ud83d\udd11 Principe cl\u00e9<\/strong><br>\n      Une limite saine est <strong>courte, claire, et centr\u00e9e sur soi<\/strong>. On dit ce qu'on ressent, ce qu'on peut, ce qu'on a besoin \u2014 pas ce que l'autre devrait faire. Pas besoin de se justifier longuement : trop de justification ouvre la porte \u00e0 la n\u00e9gociation.\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\">\n        Parmi ces formulations, lesquelles pourriez-vous essayer ?\n        <span class=\"field-example\">Cochez celles qui vous semblent accessibles \u2014 vous n'avez pas \u00e0 toutes les utiliser.<\/span>\n      <\/label>\n      <div class=\"multi-grid\" id=\"formulationsGrid\"><\/div>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"ownFormulation\">\n        Comment pourriez-vous formuler un \u00ab non \u00bb avec vos propres mots ?\n        <span class=\"field-example\">Ex. : \u00ab Je ne peux pas cette fois \u2014 j'ai besoin de souffler \u00bb, \u00ab Je comprends que tu en aies besoin, mais je ne suis pas disponible \u00bb, \u00ab Non, mais merci d'avoir pens\u00e9 \u00e0 moi \u00bb, \u00ab J'ai besoin d'un moment pour te r\u00e9pondre \u00bb.<\/span>\n      <\/label>\n      <textarea id=\"ownFormulation\" placeholder=\"Ma formulation possible\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"ifInsists\">\n        Comment pourriez-vous r\u00e9agir si l'autre insiste ou se f\u00e2che ?\n        <span class=\"field-example\">Ex. : \u00ab Je r\u00e9p\u00e8te simplement ma limite sans me justifier \u00bb, \u00ab Je propose de reparler plus tard \u00bb, \u00ab Je me retire sans claquer la porte \u00bb, \u00ab Je me rappelle que je ne suis pas responsable de sa r\u00e9action \u00bb.<\/span>\n      <\/label>\n      <textarea id=\"ifInsists\" placeholder=\"S'il ou elle insiste, je pourrais\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"selfCare\">\n        De quoi auriez-vous besoin <strong>de vous-m\u00eame<\/strong> pour tenir cette limite ?\n        <span class=\"field-example\">Ex. : \u00ab De me rappeler que poser une limite est l\u00e9gitime \u00bb, \u00ab De me donner le droit de d\u00e9cevoir \u00bb, \u00ab De me prot\u00e9ger des r\u00e9actions de l'autre \u00bb, \u00ab De me r\u00e9p\u00e9ter ma phrase cl\u00e9 \u00bb.<\/span>\n      <\/label>\n      <textarea id=\"selfCare\" placeholder=\"De moi-m\u00eame, j'aurais besoin de\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"btn-group\">\n      <button class=\"btn btn-secondary\" type=\"button\" data-action=\"step\" data-target=\"4\">\u2190 Pr\u00e9c\u00e9dent<\/button>\n      <button class=\"btn btn-primary\" type=\"button\" data-action=\"step\" data-target=\"6\">Continuer \u2192<\/button>\n    <\/div>\n  <\/section>\n\n  <!-- ===== \u00c9TAPE 6 ===== -->\n  <section class=\"step\" id=\"step6\" data-step=\"6\">\n    <span class=\"step-badge\">\u00c9tape 6 \u00b7 Agir<\/span>\n    <h2 class=\"step-title\"><span class=\"step-emoji\">\ud83d\udc63<\/span> Premier pas d'un \u00ab non \u00bb bienveillant<\/h2>\n    <p class=\"step-hint\">Pas besoin de tout changer d'un coup. Un petit \u00ab non \u00bb ma\u00eetris\u00e9 vaut mille grands plans. Choisissez une situation <strong>\u00e0 faible enjeu<\/strong> pour commencer \u2014 c'est l\u00e0 qu'on apprend.<\/p>\n\n    <div class=\"info-emphasis\">\n      <strong>\ud83d\udca1 La r\u00e8gle du \u00ab non \u00bb d'entra\u00eenement<\/strong><br>\n      Choisissez une situation o\u00f9 le risque est <strong>faible<\/strong> : refuser une sollicitation mineure, un petit service, une invitation sans cons\u00e9quence. L'objectif n'est pas de convaincre l'autre \u2014 c'est de <em>s'entendre soi-m\u00eame dire non<\/em>, sans se trahir.\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"firstStep\">\n        Quel serait votre premier pas vers un \u00ab non \u00bb bienveillant ?\n        <span class=\"field-example\">Ex. : \u00ab Refuser une invitation \u00e0 laquelle je ne veux pas aller \u00bb, \u00ab Dire que je ne suis pas disponible pour une t\u00e2che \u00bb, \u00ab R\u00e9pondre \"laisse-moi y penser\" au lieu de dire oui tout de suite \u00bb, \u00ab Demander un d\u00e9lai avant de m'engager \u00bb.<\/span>\n      <\/label>\n      <textarea id=\"firstStep\" placeholder=\"Mon premier pas serait\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"whenStep\">\n        Quand pourriez-vous le faire ?\n        <span class=\"field-example\">Un moment pr\u00e9cis, dans un d\u00e9lai r\u00e9aliste.<\/span>\n      <\/label>\n      <input type=\"text\" id=\"whenStep\" placeholder=\"Ex. : la prochaine fois, cette semaine, dans les 3 prochains jours\u2026\">\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"supportStep\">\n        De qui ou de quoi auriez-vous besoin pour vous y tenir ?\n        <span class=\"field-example\">Optionnel \u2014 mais souvent utile.<\/span>\n      <\/label>\n      <textarea id=\"supportStep\" placeholder=\"Pour m'aider \u00e0 faire ce premier pas, je pourrais\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\" for=\"ifItGoesWrong\">\n        Comment prendrez-vous soin de vous si l'autre r\u00e9agit mal ?\n        <span class=\"field-example\">Ex. : \u00ab Je me rappellerai que sa r\u00e9action ne m'appartient pas \u00bb, \u00ab Je m'isolerai un moment pour respirer \u00bb, \u00ab Je parlerai \u00e0 une personne de confiance \u00bb, \u00ab Je me dirai : j'ai le droit \u00bb.<\/span>\n      <\/label>\n      <textarea id=\"ifItGoesWrong\" placeholder=\"Si \u00e7a se passe mal, je pourrais\u2026\"><\/textarea>\n    <\/div>\n\n    <div class=\"field-group\">\n      <label class=\"field-label\">\n        Apr\u00e8s ce travail, quelle est votre difficult\u00e9 \u00e0 dire non <em>maintenant<\/em> ?\n      <\/label>\n      <div class=\"chips-row\" id=\"difficultyChipsAfter\"><\/div>\n      <div class=\"helper-text\">Aucun jugement. Simplement observer, m\u00eame un l\u00e9ger changement.<\/div>\n    <\/div>\n\n    <div class=\"btn-group\">\n      <button class=\"btn btn-secondary\" type=\"button\" data-action=\"step\" data-target=\"5\">\u2190 Pr\u00e9c\u00e9dent<\/button>\n      <button class=\"btn btn-accent\" type=\"button\" data-action=\"summary\">Voir ma synth\u00e8se \ud83d\udee1\ufe0f<\/button>\n    <\/div>\n  <\/section>\n\n  <!-- ===== R\u00c9SUM\u00c9 ===== -->\n  <section class=\"summary-section\" id=\"summarySection\">\n    <div class=\"summary-hero\">\n      <div class=\"summary-emoji\">\ud83c\udf3f<\/div>\n      <h2>Votre synth\u00e8se<\/h2>\n      <p>Voici ce que vous avez mis en ordre. Ce document vous appartient \u2014 vous pouvez le relire, l'imprimer, en parler \u00e0 un professionnel ou \u00e0 une personne de confiance.<\/p>\n    <\/div>\n\n    <div id=\"summaryContent\"><\/div>\n\n    <div class=\"summary-resources\">\n      <strong>\ud83e\udded Ressources \u00e0 garder sous la main<\/strong>\n      \u2022 <strong>811 (Info-Social)<\/strong> \u2014 Soutien psychosocial 24\/7 (Qu\u00e9bec)<br>\n      \u2022 <strong>1 800 363-9010<\/strong> \u2014 SOS violence conjugale (24\/7, gratuit, confidentiel)<br>\n      \u2022 <strong>911<\/strong> \u2014 En cas de danger imm\u00e9diat<br>\n      \u2022 <strong>Votre m\u00e9decin de famille<\/strong> ou <strong>CLSC<\/strong> \u2014 Pour un accompagnement suivi<br>\n      \u2022 <strong>Psychologue ou travailleur\u00b7se social\u00b7e<\/strong> \u2014 Pour un soutien plus approfondi<br>\n      \u2022 <strong>Programme d'aide aux employ\u00e9s (PAE)<\/strong> \u2014 Si vous \u00eates en emploi<br>\n      \u2022 <strong>Organismes communautaires<\/strong> \u2014 Soutien et \u00e9coute dans votre r\u00e9gion\n    <\/div>\n\n    <div class=\"summary-actions\">\n      <button class=\"btn btn-primary\" id=\"printBtn\" type=\"button\">\ud83d\udda8\ufe0f Imprimer<\/button>\n      <button class=\"btn btn-secondary\" id=\"downloadBtn\" type=\"button\">\ud83d\udce5 T\u00e9l\u00e9charger<\/button>\n      <button class=\"btn btn-secondary\" id=\"restartBtn\" type=\"button\">\ud83d\udd04 Nouvelle exploration<\/button>\n    <\/div>\n    <p class=\"restart-hint\">Envie de refaire l'exercice ? Vos r\u00e9ponses actuelles seront effac\u00e9es \u2014 pensez \u00e0 imprimer ou t\u00e9l\u00e9charger votre synth\u00e8se avant.<\/p>\n  <\/section>\n\n  <!-- FOOTER -->\n  <footer class=\"footer\">\n    <p>\ud83d\udee1\ufe0f <strong>Outil d'accompagnement JIRIS<\/strong> \u2014 Justice \u00b7 Inclusion \u00b7 R\u00e9int\u00e9gration \u00b7 Innovation Sociale<\/p>\n    <p style=\"margin-top: 8px; opacity: 0.8;\">Cet outil ne pose aucun diagnostic et ne remplace pas un accompagnement professionnel. Vos r\u00e9ponses restent dans votre navigateur.<\/p>\n  <\/footer>\n\n<\/div>\n\n<script>\n(function () {\n  \"use strict\";\n\n  const STORAGE_KEY = 'jiris-limites-outil';\n  const TOTAL_STEPS = 6;\n\n  const state = {\n    currentStep: 0,\n    situations: [],\n    recentSituation: '',\n    withWhom: '',\n    difficultyBefore: null,\n    feelings: [],\n    bodyReaction: '',\n    afterFeeling: '',\n    innerVoice: '',\n    facts: '',\n    fears: '',\n    learnedBeliefs: '',\n    reconsider: '',\n    needs: [],\n    needText: '',\n    protection: '',\n    formulations: [],\n    ownFormulation: '',\n    ifInsists: '',\n    selfCare: '',\n    firstStep: '',\n    whenStep: '',\n    supportStep: '',\n    ifItGoesWrong: '',\n    difficultyAfter: null,\n    completed: false\n  };\n\n  const DIFFICULTY_LEVELS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n\n  const SITUATIONS_LIST = [\n    'Une demande d\\'aide ou de service',\n    'Une invitation \u00e0 un \u00e9v\u00e9nement auquel je ne veux pas aller',\n    'Une t\u00e2che au travail qui d\u00e9passe mes limites',\n    'Une demande d\\'un membre de ma famille',\n    'Une demande de mon\u00b7ma conjoint\u00b7e',\n    'Une demande d\\'un\u00b7e ami\u00b7e',\n    'Une sollicitation d\\'un\u00b7e inconnu\u00b7e',\n    'Une situation o\u00f9 l\\'on me manque de respect',\n    'Un engagement \u00e0 long terme',\n    'Une demande d\\'argent ou de pr\u00eat',\n    'Une t\u00e2che m\u00e9nag\u00e8re ou familiale qu\\'on m\\'impose',\n    'Un projet qui ne vient pas de moi',\n    'Une discussion que je ne veux pas avoir',\n    'Une relation qui m\\'\u00e9puise'\n  ];\n\n  const FEELINGS_LIST = [\n    'Une peur de d\u00e9cevoir',\n    'Une peur du conflit',\n    'Une peur d\\'\u00eatre abandonn\u00e9\u00b7e',\n    'Une peur d\\'\u00eatre jug\u00e9\u00b7e',\n    'De la culpabilit\u00e9',\n    'Un sentiment d\\'obligation',\n    'Un automatisme, comme un r\u00e9flexe',\n    'Un sentiment d\\'impuissance',\n    'Une tristesse ou un d\u00e9couragement',\n    'Une col\u00e8re rentr\u00e9e',\n    'Une fatigue d\\'avance',\n    'Un sentiment d\\'\u00eatre pi\u00e9g\u00e9\u00b7e'\n  ];\n\n  const NEEDS_LIST = [\n    'Du respect pour mes limites',\n    'Du temps pour moi',\n    'De l\\'\u00e9nergie pr\u00e9serv\u00e9e',\n    'Me sentir en s\u00e9curit\u00e9 dans la relation',\n    '\u00catre libre de mes choix',\n    'Me sentir l\u00e9gitime \u00e0 dire non',\n    '\u00catre \u00e9cout\u00e9\u00b7e dans mon refus',\n    'De la r\u00e9ciprocit\u00e9 dans les \u00e9changes',\n    'De la tranquillit\u00e9',\n    'Ma dignit\u00e9',\n    'Des relations vraies, pas oblig\u00e9es',\n    'Le droit de changer d\\'avis',\n    'Ne pas \u00eatre \u00e9cras\u00e9\u00b7e par les attentes',\n    'Le droit de d\u00e9cevoir sans perdre l\\'autre'\n  ];\n\n  const FORMULATIONS_LIST = [\n    'Merci d\\'avoir pens\u00e9 \u00e0 moi, mais je ne peux pas cette fois',\n    'Non, je ne suis pas disponible',\n    'Je comprends ta demande, mais je ne vais pas pouvoir',\n    'J\\'ai besoin de temps avant de te r\u00e9pondre',\n    'Je ne me sens pas \u00e0 l\\'aise avec cette demande',\n    'Ce n\\'est pas quelque chose que je peux faire en ce moment',\n    'Je pr\u00e9f\u00e8re te le dire honn\u00eatement : je ne le sens pas',\n    'J\\'ai besoin de pr\u00e9server du temps pour moi',\n    'Je ne peux pas m\\'engager l\u00e0-dedans',\n    'Je vais d\u00e9cliner cette fois',\n    'Non merci, mais je te remercie de me l\\'avoir propos\u00e9',\n    'Je suis d\u00e9sol\u00e9\u00b7e, ce n\\'est pas possible pour moi',\n    'Je pr\u00e9f\u00e8re ne pas le faire, et j\\'esp\u00e8re que tu le comprendras',\n    'Ma r\u00e9ponse est non, et je te la donne avec respect'\n  ];\n\n  const introCard = document.getElementById('introCard');\n  const progressWrapper = document.getElementById('progressWrapper');\n  const progressLabel = document.getElementById('progressLabel');\n  const progressPercent = document.getElementById('progressPercent');\n  const progressFill = document.getElementById('progressFill');\n  const summarySection = document.getElementById('summarySection');\n  const summaryContent = document.getElementById('summaryContent');\n\n  function renderDifficultyChips(containerId, keyName) {\n    const container = document.getElementById(containerId);\n    if (!container) return;\n    container.innerHTML = '';\n    DIFFICULTY_LEVELS.forEach(n => {\n      const btn = document.createElement('button');\n      btn.type = 'button';\n      btn.className = 'chip';\n      btn.textContent = n;\n      if (state[keyName] === n) btn.classList.add('selected');\n      btn.addEventListener('click', () => {\n        state[keyName] = n;\n        container.querySelectorAll('.chip').forEach(c => c.classList.remove('selected'));\n        btn.classList.add('selected');\n        saveState();\n      });\n      container.appendChild(btn);\n    });\n  }\n\n  function renderMultiGrid(containerId, keyName, list) {\n    const container = document.getElementById(containerId);\n    if (!container) return;\n    container.innerHTML = '';\n    list.forEach(item => {\n      const btn = document.createElement('button');\n      btn.type = 'button';\n      btn.className = 'multi-chip';\n      btn.textContent = item;\n      if (state[keyName].includes(item)) btn.classList.add('selected');\n      btn.addEventListener('click', () => {\n        const idx = state[keyName].indexOf(item);\n        if (idx >= 0) {\n          state[keyName].splice(idx, 1);\n          btn.classList.remove('selected');\n        } else {\n          state[keyName].push(item);\n          btn.classList.add('selected');\n        }\n        saveState();\n      });\n      container.appendChild(btn);\n    });\n  }\n\n  function renderChipsRow(containerId, keyName, list) {\n    const container = document.getElementById(containerId);\n    if (!container) return;\n    container.innerHTML = '';\n    list.forEach(item => {\n      const btn = document.createElement('button');\n      btn.type = 'button';\n      btn.className = 'chip';\n      btn.textContent = item;\n      if (state[keyName].includes(item)) btn.classList.add('selected');\n      btn.addEventListener('click', () => {\n        const idx = state[keyName].indexOf(item);\n        if (idx >= 0) {\n          state[keyName].splice(idx, 1);\n          btn.classList.remove('selected');\n        } else {\n          state[keyName].push(item);\n          btn.classList.add('selected');\n        }\n        saveState();\n      });\n      container.appendChild(btn);\n    });\n  }\n\n  function saveState() {\n    try {\n      localStorage.setItem(STORAGE_KEY, JSON.stringify(state));\n    } catch (e) {\n      console.warn('Sauvegarde impossible :', e);\n    }\n  }\n\n  function loadState() {\n    try {\n      const raw = localStorage.getItem(STORAGE_KEY);\n      if (!raw) return false;\n      const saved = JSON.parse(raw);\n      Object.keys(state).forEach(k => {\n        if (saved[k] !== undefined) state[k] = saved[k];\n      });\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  function bindInputs() {\n    const bind = (id, key) => {\n      const el = document.getElementById(id);\n      if (!el) return;\n      el.addEventListener('input', e => {\n        state[key] = e.target.value;\n        saveState();\n      });\n    };\n    bind('recentSituation', 'recentSituation');\n    bind('withWhom', 'withWhom');\n    bind('bodyReaction', 'bodyReaction');\n    bind('afterFeeling', 'afterFeeling');\n    bind('innerVoice', 'innerVoice');\n    bind('facts', 'facts');\n    bind('fears', 'fears');\n    bind('learnedBeliefs', 'learnedBeliefs');\n    bind('reconsider', 'reconsider');\n    bind('needText', 'needText');\n    bind('protection', 'protection');\n    bind('ownFormulation', 'ownFormulation');\n    bind('ifInsists', 'ifInsists');\n    bind('selfCare', 'selfCare');\n    bind('firstStep', 'firstStep');\n    bind('whenStep', 'whenStep');\n    bind('supportStep', 'supportStep');\n    bind('ifItGoesWrong', 'ifItGoesWrong');\n  }\n\n  function fillInputs() {\n    const fill = (id, val) => {\n      const el = document.getElementById(id);\n      if (el) el.value = val || '';\n    };\n    fill('recentSituation', state.recentSituation);\n    fill('withWhom', state.withWhom);\n    fill('bodyReaction', state.bodyReaction);\n    fill('afterFeeling', state.afterFeeling);\n    fill('innerVoice', state.innerVoice);\n    fill('facts', state.facts);\n    fill('fears', state.fears);\n    fill('learnedBeliefs', state.learnedBeliefs);\n    fill('reconsider', state.reconsider);\n    fill('needText', state.needText);\n    fill('protection', state.protection);\n    fill('ownFormulation', state.ownFormulation);\n    fill('ifInsists', state.ifInsists);\n    fill('selfCare', state.selfCare);\n    fill('firstStep', state.firstStep);\n    fill('whenStep', state.whenStep);\n    fill('supportStep', state.supportStep);\n    fill('ifItGoesWrong', state.ifItGoesWrong);\n  }\n\n  function goToIntro() {\n    state.currentStep = 0;\n    introCard.style.display = 'block';\n    progressWrapper.style.display = 'none';\n    summarySection.classList.remove('active');\n    document.querySelectorAll('.step').forEach(s => s.classList.remove('active'));\n    updateIntroForCompleted();\n    window.scrollTo({ top: 0, behavior: 'smooth' });\n    saveState();\n  }\n\n  function goToStep(n) {\n    if (n < 1 || n > TOTAL_STEPS) return;\n    state.currentStep = n;\n    introCard.style.display = 'none';\n    progressWrapper.style.display = 'block';\n    summarySection.classList.remove('active');\n    document.querySelectorAll('.step').forEach(s => s.classList.remove('active'));\n    const target = document.getElementById('step' + n);\n    if (target) target.classList.add('active');\n    updateProgress();\n    window.scrollTo({ top: 0, behavior: 'smooth' });\n    saveState();\n  }\n\n  function updateProgress() {\n    const pct = Math.round((state.currentStep \/ TOTAL_STEPS) * 100);\n    progressLabel.textContent = '\u00c9tape ' + state.currentStep + ' sur ' + TOTAL_STEPS;\n    progressPercent.textContent = pct + '%';\n    progressFill.style.width = pct + '%';\n  }\n\n  function escapeHtml(s) {\n    const div = document.createElement('div');\n    div.textContent = s || '';\n    return div.innerHTML;\n  }\n\n  function buildSummaryHtml() {\n    const blocks = [];\n\n    if (state.situations.length > 0 || state.recentSituation || state.withWhom || state.difficultyBefore !== null) {\n      let inner = '';\n      if (state.situations.length > 0) {\n        inner += '<p><strong>Situations difficiles :<\/strong><\/p>';\n        inner += '<ul>' + state.situations.map(s => '<li>' + escapeHtml(s) + '<\/li>').join('') + '<\/ul>';\n      }\n      if (state.recentSituation) {\n        inner += '<p style=\"margin-top: 12px;\"><strong>Situation r\u00e9cente :<\/strong><br>' + escapeHtml(state.recentSituation) + '<\/p>';\n      }\n      if (state.withWhom) {\n        inner += '<p style=\"margin-top: 10px;\"><strong>Avec qui :<\/strong> ' + escapeHtml(state.withWhom) + '<\/p>';\n      }\n      if (state.difficultyBefore !== null) {\n        inner += '<p style=\"margin-top: 10px; font-size: 14px; color: var(--muted);\">Difficult\u00e9 \u00e0 dire non au d\u00e9part : <strong style=\"color: var(--primary);\">' + state.difficultyBefore + '\/10<\/strong><\/p>';\n      }\n      blocks.push(\n        '<div class=\"summary-block\">' +\n        '<h3>\ud83d\udd0e Les situations o\u00f9 je dis oui malgr\u00e9 moi<\/h3>' +\n        inner +\n        '<\/div>'\n      );\n    }\n\n    if (state.feelings.length > 0 || state.bodyReaction || state.afterFeeling || state.innerVoice) {\n      let inner = '';\n      if (state.feelings.length > 0) {\n        inner += '<p><strong>Ce que je ressens :<\/strong><\/p>';\n        inner += '<ul>' + state.feelings.map(f => '<li>' + escapeHtml(f) + '<\/li>').join('') + '<\/ul>';\n      }\n      if (state.bodyReaction) {\n        inner += '<p style=\"margin-top: 12px;\"><strong>Dans mon corps :<\/strong><br>' + escapeHtml(state.bodyReaction) + '<\/p>';\n      }\n      if (state.afterFeeling) {\n        inner += '<p style=\"margin-top: 10px;\"><strong>Apr\u00e8s avoir dit oui :<\/strong><br>' + escapeHtml(state.afterFeeling) + '<\/p>';\n      }\n      if (state.innerVoice) {\n        inner += '<p style=\"margin-top: 10px;\"><strong>Cette voix qui me dit de dire oui :<\/strong><br>' + escapeHtml(state.innerVoice) + '<\/p>';\n      }\n      blocks.push(\n        '<div class=\"summary-block\">' +\n        '<h3>\ud83d\udcad Ce qui se passe en dedans<\/h3>' +\n        inner +\n        '<\/div>'\n      );\n    }\n\n    if (state.facts || state.fears || state.learnedBeliefs || state.reconsider) {\n      let inner = '<div class=\"summary-control-grid\">';\n      if (state.facts) {\n        inner += '<div class=\"summary-control-box facts\">' +\n          '<span class=\"summary-control-label\">\u2705 Faits<\/span>' +\n          escapeHtml(state.facts) +\n          '<\/div>';\n      }\n      if (state.fears) {\n        inner += '<div class=\"summary-control-box fears\">' +\n          '<span class=\"summary-control-label\">\ud83d\udcad Craintes \/ croyances<\/span>' +\n          escapeHtml(state.fears) +\n          '<\/div>';\n      }\n      inner += '<\/div>';\n      if (state.learnedBeliefs) {\n        inner += '<p style=\"margin-top: 14px;\"><strong>Croyances apprises sur le \u00ab non \u00bb :<\/strong><br>' + escapeHtml(state.learnedBeliefs) + '<\/p>';\n      }\n      if (state.reconsider) {\n        inner += '<p style=\"margin-top: 10px;\"><strong>Croyance \u00e0 nuancer :<\/strong><br>' + escapeHtml(state.reconsider) + '<\/p>';\n      }\n      blocks.push(\n        '<div class=\"summary-block\">' +\n        '<h3>\ud83d\udd0d Faits et croyances<\/h3>' +\n        inner +\n        '<\/div>'\n      );\n    }\n\n    if (state.needs.length > 0 || state.needText || state.protection) {\n      let inner = '';\n      if (state.needs.length > 0) {\n        inner += '<ul>' + state.needs.map(n => '<li>' + escapeHtml(n) + '<\/li>').join('') + '<\/ul>';\n      }\n      if (state.needText) {\n        inner += '<p style=\"margin-top: 10px;\">' + escapeHtml(state.needText) + '<\/p>';\n      }\n      if (state.protection) {\n        inner += '<p style=\"margin-top: 12px;\"><strong>Ce que je veux prot\u00e9ger :<\/strong><br>' + escapeHtml(state.protection) + '<\/p>';\n      }\n      blocks.push(\n        '<div class=\"summary-block\">' +\n        '<h3>\ud83c\udf31 Mes besoins<\/h3>' +\n        inner +\n        '<\/div>'\n      );\n    }\n\n    if (state.formulations.length > 0 || state.ownFormulation || state.ifInsists || state.selfCare) {\n      let inner = '';\n      if (state.formulations.length > 0) {\n        inner += '<p><strong>Formulations possibles :<\/strong><\/p>';\n        inner += '<ul>' + state.formulations.map(f => '<li>' + escapeHtml(f) + '<\/li>').join('') + '<\/ul>';\n      }\n      if (state.ownFormulation) {\n        inner += '<p style=\"margin-top: 12px;\"><strong>Ma formulation :<\/strong><br>' + escapeHtml(state.ownFormulation) + '<\/p>';\n      }\n      if (state.ifInsists) {\n        inner += '<p style=\"margin-top: 10px;\"><strong>Si l\\'autre insiste :<\/strong><br>' + escapeHtml(state.ifInsists) + '<\/p>';\n      }\n      if (state.selfCare) {\n        inner += '<p style=\"margin-top: 10px;\"><strong>De moi-m\u00eame :<\/strong><br>' + escapeHtml(state.selfCare) + '<\/p>';\n      }\n      blocks.push(\n        '<div class=\"summary-block\">' +\n        '<h3>\ud83d\udcac Formulations possibles<\/h3>' +\n        inner +\n        '<\/div>'\n      );\n    }\n\n    if (state.firstStep || state.whenStep || state.supportStep || state.ifItGoesWrong) {\n      let inner = '';\n      if (state.firstStep) inner += '<p><strong>Mon premier pas :<\/strong><br>' + escapeHtml(state.firstStep) + '<\/p>';\n      if (state.whenStep) inner += '<p style=\"margin-top: 10px;\"><strong>Quand :<\/strong> ' + escapeHtml(state.whenStep) + '<\/p>';\n      if (state.supportStep) inner += '<p style=\"margin-top: 10px;\"><strong>Soutien pr\u00e9vu :<\/strong> ' + escapeHtml(state.supportStep) + '<\/p>';\n      if (state.ifItGoesWrong) inner += '<p style=\"margin-top: 10px;\"><strong>Si l\\'autre r\u00e9agit mal :<\/strong><br>' + escapeHtml(state.ifItGoesWrong) + '<\/p>';\n      blocks.push(\n        '<div class=\"summary-block\">' +\n        '<h3>\ud83d\udc63 Premier pas d\\'un \u00ab non \u00bb bienveillant<\/h3>' +\n        inner +\n        '<\/div>'\n      );\n    }\n\n    if (state.difficultyBefore !== null && state.difficultyAfter !== null) {\n      const diff = state.difficultyBefore - state.difficultyAfter;\n      let evoText = '';\n      if (diff > 0) evoText = 'Votre difficult\u00e9 \u00e0 dire non a <strong style=\"color: var(--accent);\">diminu\u00e9 de ' + diff + ' point' + (diff > 1 ? 's' : '') + '<\/strong> apr\u00e8s ce travail. C\\'est un beau pas.';\n      else if (diff === 0) evoText = 'Votre difficult\u00e9 est rest\u00e9e <strong>stable<\/strong>. Simplement avoir pris ce temps compte d\u00e9j\u00e0.';\n      else evoText = 'Votre difficult\u00e9 a <strong>augment\u00e9<\/strong> de ' + Math.abs(diff) + ' point' + (Math.abs(diff) > 1 ? 's' : '') + '. Mettre des mots sur ce qui bloque peut raviver la tension \u2014 c\\'est humain. Allez-y en douceur.';\n\n      blocks.push(\n        '<div class=\"summary-block\">' +\n        '<h3>\ud83d\udcca \u00c9volution de la difficult\u00e9 \u00e0 dire non<\/h3>' +\n        '<p>Avant : <strong>' + state.difficultyBefore + '\/10<\/strong> \u00b7 Apr\u00e8s : <strong>' + state.difficultyAfter + '\/10<\/strong><\/p>' +\n        '<p style=\"margin-top: 8px;\">' + evoText + '<\/p>' +\n        '<\/div>'\n      );\n    }\n\n    if (blocks.length === 0) {\n      return '<p style=\"text-align: center; color: var(--muted); font-style: italic;\">Vous n\\'avez encore rien not\u00e9. Revenez en arri\u00e8re pour compl\u00e9ter quelques \u00e9tapes \u2014 \u00e0 votre rythme.<\/p>';\n    }\n\n    return blocks.join('');\n  }\n\n  function showSummary() {\n    state.completed = true;\n    summaryContent.innerHTML = buildSummaryHtml();\n    document.querySelectorAll('.step').forEach(s => s.classList.remove('active'));\n    summarySection.classList.add('active');\n    progressWrapper.style.display = 'none';\n    progressLabel.textContent = 'Synth\u00e8se';\n    progressPercent.textContent = '100%';\n    progressFill.style.width = '100%';\n    window.scrollTo({ top: 0, behavior: 'smooth' });\n    saveState();\n  }\n\n  function printSummary() {\n    try {\n      if (typeof window.print === 'function') {\n        window.print();\n      } else {\n        throw new Error('window.print non disponible');\n      }\n    } catch (err) {\n      console.warn('Impression non disponible :', err);\n      alert('L\\'impression n\\'est pas disponible dans cet environnement.\\n\\nVous pouvez utiliser la fonction \"T\u00e9l\u00e9charger\" pour sauvegarder votre synth\u00e8se.');\n    }\n  }\n\n  function buildPlainTextSummary() {\n    let t = '\ud83d\udee1\ufe0f POSER DES LIMITES SAINES\\n';\n    t += '================================================\\n';\n    t += 'Outil JIRIS \u2014 Justice \u00b7 Inclusion \u00b7 R\u00e9int\u00e9gration \u00b7 Innovation Sociale\\n';\n    t += 'Compl\u00e8te le quiz \u00ab Assertivit\u00e9 \u00bb.\\n\\n';\n\n    t += '\u26a0\ufe0f RAPPEL\\n';\n    t += 'Poser une limite n\\'est pas rejeter l\\'autre.\\n';\n    t += 'En cas de violence, contr\u00f4le ou chantage : 811 Info-Social \u00b7 1 800 363-9010 SOS violence conjugale \u00b7 911\\n\\n';\n\n    if (state.situations.length > 0 || state.recentSituation || state.withWhom || state.difficultyBefore !== null) {\n      t += '\ud83d\udd0e LES SITUATIONS O\u00d9 JE DIS OUI MALGR\u00c9 MOI\\n';\n      state.situations.forEach((s, i) => t += (i + 1) + '. ' + s + '\\n');\n      if (state.recentSituation) t += 'Situation r\u00e9cente : ' + state.recentSituation + '\\n';\n      if (state.withWhom) t += 'Avec qui : ' + state.withWhom + '\\n';\n      if (state.difficultyBefore !== null) t += 'Difficult\u00e9 \u00e0 dire non : ' + state.difficultyBefore + '\/10\\n';\n      t += '\\n';\n    }\n\n    if (state.feelings.length > 0 || state.bodyReaction || state.afterFeeling || state.innerVoice) {\n      t += '\ud83d\udcad CE QUI SE PASSE EN DEDANS\\n';\n      state.feelings.forEach((f, i) => t += (i + 1) + '. ' + f + '\\n');\n      if (state.bodyReaction) t += 'Dans mon corps : ' + state.bodyReaction + '\\n';\n      if (state.afterFeeling) t += 'Apr\u00e8s avoir dit oui : ' + state.afterFeeling + '\\n';\n      if (state.innerVoice) t += 'Cette voix : ' + state.innerVoice + '\\n';\n      t += '\\n';\n    }\n\n    if (state.facts || state.fears || state.learnedBeliefs || state.reconsider) {\n      t += '\ud83d\udd0d FAITS ET CROYANCES\\n';\n      if (state.facts) t += 'Faits : ' + state.facts + '\\n';\n      if (state.fears) t += 'Craintes \/ croyances : ' + state.fears + '\\n';\n      if (state.learnedBeliefs) t += 'Croyances apprises : ' + state.learnedBeliefs + '\\n';\n      if (state.reconsider) t += 'Croyance \u00e0 nuancer : ' + state.reconsider + '\\n';\n      t += '\\n';\n    }\n\n    if (state.needs.length > 0 || state.needText || state.protection) {\n      t += '\ud83c\udf31 MES BESOINS\\n';\n      if (state.needs.length > 0) t += 'Besoins identifi\u00e9s : ' + state.needs.join(', ') + '\\n';\n      if (state.needText) t += state.needText + '\\n';\n      if (state.protection) t += 'Ce que je veux prot\u00e9ger : ' + state.protection + '\\n';\n      t += '\\n';\n    }\n\n    if (state.formulations.length > 0 || state.ownFormulation || state.ifInsists || state.selfCare) {\n      t += '\ud83d\udcac FORMULATIONS POSSIBLES\\n';\n      state.formulations.forEach((f, i) => t += (i + 1) + '. ' + f + '\\n');\n      if (state.ownFormulation) t += 'Ma formulation : ' + state.ownFormulation + '\\n';\n      if (state.ifInsists) t += 'Si l\\'autre insiste : ' + state.ifInsists + '\\n';\n      if (state.selfCare) t += 'De moi-m\u00eame : ' + state.selfCare + '\\n';\n      t += '\\n';\n    }\n\n    if (state.firstStep || state.whenStep || state.supportStep || state.ifItGoesWrong) {\n      t += '\ud83d\udc63 PREMIER PAS D\\'UN \u00ab NON \u00bb BIENVEILLANT\\n';\n      if (state.firstStep) t += 'Mon premier pas : ' + state.firstStep + '\\n';\n      if (state.whenStep) t += 'Quand : ' + state.whenStep + '\\n';\n      if (state.supportStep) t += 'Soutien pr\u00e9vu : ' + state.supportStep + '\\n';\n      if (state.ifItGoesWrong) t += 'Si l\\'autre r\u00e9agit mal : ' + state.ifItGoesWrong + '\\n';\n      t += '\\n';\n    }\n\n    if (state.difficultyBefore !== null && state.difficultyAfter !== null) {\n      t += '\ud83d\udcca \u00c9VOLUTION DE LA DIFFICULT\u00c9 \u00c0 DIRE NON\\n';\n      t += 'Avant : ' + state.difficultyBefore + '\/10 \u00b7 Apr\u00e8s : ' + state.difficultyAfter + '\/10\\n\\n';\n    }\n\n    t += '================================================\\n';\n    t += 'G\u00e9n\u00e9r\u00e9 le ' + new Date().toLocaleDateString('fr-CA', { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' }) + '\\n';\n    t += 'Cet outil ne pose aucun diagnostic et ne remplace pas un accompagnement professionnel.';\n\n    return t;\n  }\n\n  function downloadSummary() {\n    const text = buildPlainTextSummary();\n    const filename = 'limites-saines-jiris-' + new Date().toISOString().slice(0, 10) + '.txt';\n\n    try {\n      const blob = new Blob([text], { type: 'text\/plain;charset=utf-8' });\n      const url = URL.createObjectURL(blob);\n      const a = document.createElement('a');\n      a.href = url;\n      a.download = filename;\n      a.style.display = 'none';\n      document.body.appendChild(a);\n      a.click();\n      setTimeout(() => {\n        document.body.removeChild(a);\n        URL.revokeObjectURL(url);\n      }, 500);\n      console.log('\u2705 T\u00e9l\u00e9chargement lanc\u00e9 via Blob');\n      return;\n    } catch (err1) {\n      console.warn('M\u00e9thode Blob \u00e9chou\u00e9e :', err1);\n    }\n\n    try {\n      const dataUri = 'data:text\/plain;charset=utf-8,' + encodeURIComponent(text);\n      const a = document.createElement('a');\n      a.href = dataUri;\n      a.download = filename;\n      a.style.display = 'none';\n      document.body.appendChild(a);\n      a.click();\n      setTimeout(() => document.body.removeChild(a), 500);\n      console.log('\u2705 T\u00e9l\u00e9chargement lanc\u00e9 via data URI');\n      return;\n    } catch (err2) {\n      console.warn('M\u00e9thode data URI \u00e9chou\u00e9e :', err2);\n    }\n\n    try {\n      const blob = new Blob([text], { type: 'text\/plain;charset=utf-8' });\n      const url = URL.createObjectURL(blob);\n      const newWindow = window.open(url, '_blank');\n      if (!newWindow) throw new Error('Popup bloqu\u00e9e');\n      console.log('\u2705 Ouverture dans un nouvel onglet');\n      return;\n    } catch (err3) {\n      console.warn('Ouverture nouvel onglet \u00e9chou\u00e9e :', err3);\n    }\n\n    alert('Le t\u00e9l\u00e9chargement automatique n\\'est pas disponible dans cet environnement.\\n\\nLe texte de votre synth\u00e8se va s\\'afficher dans une nouvelle fen\u00eatre.');\n    const w = window.open('', '_blank');\n    if (w) {\n      w.document.write('<pre style=\"font-family: monospace; white-space: pre-wrap; padding: 20px; line-height: 1.5;\">' + escapeHtml(text) + '<\/pre>');\n      w.document.title = 'Synth\u00e8se \u2014 Poser des limites saines';\n    }\n  }\n\n  function restart() {\n    if (!confirm('Effacer toutes vos r\u00e9ponses et recommencer ?')) return;\n    try { localStorage.removeItem(STORAGE_KEY); } catch (e) {}\n    Object.keys(state).forEach(k => {\n      if (k === 'situations' || k === 'feelings' || k === 'needs' || k === 'formulations') state[k] = [];\n      else if (k === 'difficultyBefore' || k === 'difficultyAfter') state[k] = null;\n      else if (k === 'completed') state[k] = false;\n      else if (k === 'currentStep') state[k] = 0;\n      else state[k] = '';\n    });\n    saveState();\n    location.reload();\n  }\n\n  function updateIntroForCompleted() {\n    const notice = document.getElementById('completedNotice');\n    const startBtn = document.getElementById('startBtn');\n    const reviewBtn = document.getElementById('reviewBtn');\n    const resetBtn = document.getElementById('resetBtn');\n\n    if (state.completed) {\n      if (notice) notice.style.display = 'flex';\n      if (startBtn) startBtn.style.display = 'none';\n      if (reviewBtn) reviewBtn.style.display = 'inline-flex';\n      if (resetBtn) resetBtn.textContent = '\ud83d\udd04 Recommencer une nouvelle exploration';\n    } else {\n      if (notice) notice.style.display = 'none';\n      if (startBtn) startBtn.style.display = 'inline-flex';\n      if (reviewBtn) reviewBtn.style.display = 'none';\n      if (resetBtn) resetBtn.textContent = 'R\u00e9initialiser';\n    }\n  }\n\n  function init() {\n    const hasSaved = loadState();\n    fillInputs();\n    bindInputs();\n\n    renderDifficultyChips('difficultyChips', 'difficultyBefore');\n    renderDifficultyChips('difficultyChipsAfter', 'difficultyAfter');\n    renderMultiGrid('situationsGrid', 'situations', SITUATIONS_LIST);\n    renderMultiGrid('feelingsGrid', 'feelings', FEELINGS_LIST);\n    renderMultiGrid('formulationsGrid', 'formulations', FORMULATIONS_LIST);\n    renderChipsRow('needsChips', 'needs', NEEDS_LIST);\n\n    const printBtn = document.getElementById('printBtn');\n    const downloadBtn = document.getElementById('downloadBtn');\n    const restartBtn = document.getElementById('restartBtn');\n    const reviewBtn = document.getElementById('reviewBtn');\n\n    if (printBtn) {\n      printBtn.addEventListener('click', function (e) {\n        e.preventDefault();\n        printSummary();\n      });\n    }\n    if (downloadBtn) {\n      downloadBtn.addEventListener('click', function (e) {\n        e.preventDefault();\n        downloadSummary();\n      });\n    }\n    if (restartBtn) {\n      restartBtn.addEventListener('click', function (e) {\n        e.preventDefault();\n        restart();\n      });\n    }\n    if (reviewBtn) {\n      reviewBtn.addEventListener('click', function (e) {\n        e.preventDefault();\n        showSummary();\n      });\n    }\n\n    const startBtn = document.getElementById('startBtn');\n    const resetBtn = document.getElementById('resetBtn');\n    if (startBtn) {\n      startBtn.addEventListener('click', function () {\n        if (hasSaved && state.currentStep > 0 && state.currentStep <= TOTAL_STEPS) {\n          goToStep(state.currentStep);\n        } else {\n          goToStep(1);\n        }\n      });\n    }\n    if (resetBtn) {\n      resetBtn.addEventListener('click', restart);\n    }\n\n    document.querySelectorAll('[data-action]').forEach(btn => {\n      btn.addEventListener('click', function () {\n        const action = this.dataset.action;\n        const target = this.dataset.target;\n        if (action === 'intro') goToIntro();\n        else if (action === 'step') goToStep(parseInt(target, 10));\n        else if (action === 'summary') showSummary();\n      });\n    });\n\n    if (state.completed) {\n      updateIntroForCompleted();\n    } else if (hasSaved && state.currentStep > 0 && state.currentStep <= TOTAL_STEPS && startBtn) {\n      startBtn.textContent = 'Reprendre o\u00f9 j\\'en \u00e9tais \u2192';\n    }\n\n    console.log('\u2705 Outil \u00ab Poser des limites saines \u00bb initialis\u00e9');\n  }\n\n  window.jirisLimites = {\n    state,\n    goToStep,\n    showSummary,\n    printSummary,\n    downloadSummary,\n    restart\n  };\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n<\/script>\n\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Poser des limites saines Poser des limites saines \u2014 Outil d&rsquo;accompagnement JIRIS \ud83d\udee1\ufe0f Poser des limites saines Un outil d&rsquo;accompagnement pour apprendre \u00e0 dire non sans se trahir, se respecter, et pr\u00e9server le lien avec les autres. Avant de commencer \u26a0\ufe0f Poser une limite n&rsquo;est pas rejeter l&rsquo;autre Une limite saine dit quelque chose de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"iawp_total_views":0,"footnotes":""},"class_list":["post-3575","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/jiris.ca\/en\/wp-json\/wp\/v2\/pages\/3575","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jiris.ca\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/jiris.ca\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/jiris.ca\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jiris.ca\/en\/wp-json\/wp\/v2\/comments?post=3575"}],"version-history":[{"count":4,"href":"https:\/\/jiris.ca\/en\/wp-json\/wp\/v2\/pages\/3575\/revisions"}],"predecessor-version":[{"id":3579,"href":"https:\/\/jiris.ca\/en\/wp-json\/wp\/v2\/pages\/3575\/revisions\/3579"}],"wp:attachment":[{"href":"https:\/\/jiris.ca\/en\/wp-json\/wp\/v2\/media?parent=3575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}