{"id":1069,"date":"2026-05-30T15:02:34","date_gmt":"2026-05-30T19:02:34","guid":{"rendered":"https:\/\/www.nvlopmedia.ca\/?page_id=1069"},"modified":"2026-06-06T18:09:13","modified_gmt":"2026-06-06T22:09:13","slug":"1069-2","status":"publish","type":"page","link":"https:\/\/www.nvlopmedia.ca\/?page_id=1069","title":{"rendered":""},"content":{"rendered":"\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<style data-wp-block-html=\"css\">\n\/* =========================================================\n   SOLARIS \u2014 \u00c9largissement pleine largeur centr\u00e9\n   Page ID : 1069\n========================================================= *\/\n\n\/* On \u00e9vite que le th\u00e8me coupe le bloc Solaris *\/\nbody.page-id-1069 .td-main-content-wrap,\nbody.page-id-1069 .td-container,\nbody.page-id-1069 .td-pb-row,\nbody.page-id-1069 .td-ss-main-content,\nbody.page-id-1069 .td-pb-span8,\nbody.page-id-1069 .td-pb-span12 {\n  overflow: visible !important;\n}\n\n\/* Masquer la sidebar uniquement sur Solaris *\/\nbody.page-id-1069 .td-pb-span4,\nbody.page-id-1069 aside,\nbody.page-id-1069 .td-sidebar {\n  display: none !important;\n}\n\n\/* Forcer la colonne principale en pleine largeur *\/\nbody.page-id-1069 .td-ss-main-content,\nbody.page-id-1069 .td-pb-span8,\nbody.page-id-1069 .td-pb-span12 {\n  width: 100% !important;\n  max-width: none !important;\n  float: none !important;\n}\n\n\/* Bloc g\u00e9n\u00e9ral Solaris : pleine largeur de fen\u00eatre *\/\nbody.page-id-1069 .article-nvlopmedia {\n  position: relative !important;\n  left: 50% !important;\n  right: 50% !important;\n  width: 100vw !important;\n  max-width: 100vw !important;\n  margin-left: -50vw !important;\n  margin-right: -50vw !important;\n  padding-left: 24px !important;\n  padding-right: 24px !important;\n  box-sizing: border-box !important;\n}\n\n\/* Contenu interne Solaris : largeur confortable et centr\u00e9e *\/\nbody.page-id-1069 .article-nvlopmedia .solaris-tool,\nbody.page-id-1069 .article-nvlopmedia .solaris-wrapper,\nbody.page-id-1069 .article-nvlopmedia .solaris-container {\n  max-width: 1280px !important;\n  width: 100% !important;\n  margin-left: auto !important;\n  margin-right: auto !important;\n  box-sizing: border-box !important;\n}\n\n\n\/* =========================================================\n   SOLARIS \u2014 Masquer le titre WordPress \/ fil d\u2019Ariane\n========================================================= *\/\n\nbody.page-id-1069 .entry-title,\nbody.page-id-1069 .td-post-header,\nbody.page-id-1069 .td-crumb-container,\nbody.page-id-1069 .td-breadcrumbs,\nbody.page-id-1069 .td-page-header {\n  display: none !important;\n}\n\n\n\/* =========================================================\n   SOLARIS \u2014 R\u00e9duire l\u2019espace vertical au-dessus de l\u2019outil\n========================================================= *\/\n\nbody.page-id-1069 .td-main-content-wrap,\nbody.page-id-1069 .td-container,\nbody.page-id-1069 .td-pb-row,\nbody.page-id-1069 .td-ss-main-content {\n  padding-top: 0 !important;\n  margin-top: 0 !important;\n}\n\nbody.page-id-1069 .article-nvlopmedia {\n  margin-top: 20px !important;\n}\n\n\/* =========================================================\n   SOLARIS \u2014 R\u00e9duction de la bande blanche sous le menu\n   Page ID : 1069\n========================================================= *\/\n\n\/* Supprime les marges\/paddings r\u00e9siduels du th\u00e8me au-dessus de Solaris *\/\nbody.page-id-1069 .td-main-content-wrap,\nbody.page-id-1069 .td-main-page-wrap,\nbody.page-id-1069 .td-container-wrap,\nbody.page-id-1069 .td-container,\nbody.page-id-1069 .td-pb-row,\nbody.page-id-1069 .td-ss-main-content,\nbody.page-id-1069 .td-page-content {\n  padding-top: 0 !important;\n  margin-top: 0 !important;\n}\n\n\/* Remonte l\u00e9g\u00e8rement le bloc Solaris *\/\nbody.page-id-1069 .article-nvlopmedia {\n  margin-top: -10px !important;\n}\n\n\/* =========================================================\n   SOLARIS \u2014 Titre principal en blanc\n   Page ID : 1069\n========================================================= *\/\n\nbody.page-id-1069 .article-nvlopmedia .solaris-hero h1,\nbody.page-id-1069 .article-nvlopmedia .solaris-header h1,\nbody.page-id-1069 .article-nvlopmedia .solaris-tool h1,\nbody.page-id-1069 .article-nvlopmedia h1 {\n  color: #ffffff !important;\n}\n\nbody.page-id-1069 .article-nvlopmedia .solaris-hero p,\nbody.page-id-1069 .article-nvlopmedia .solaris-header p,\nbody.page-id-1069 .article-nvlopmedia .solaris-tool p {\n  color: #f3f6fb !important;\n}\n\nbody.page-id-1069 .article-nvlopmedia .solaris-kicker,\nbody.page-id-1069 .article-nvlopmedia .solaris-version {\n  color: #ffd76a !important;\n}\n\n\/* =========================================================\n   SOLARIS \u2014 Titre principal H2 en blanc\n   Page ID : 1069\n========================================================= *\/\n\nbody.page-id-1069 .article-nvlopmedia .solaris-hero h2,\nbody.page-id-1069 .article-nvlopmedia .solaris-header h2,\nbody.page-id-1069 .article-nvlopmedia .solaris-tool h2,\nbody.page-id-1069 .article-nvlopmedia h2 {\n  color: #ffffff !important;\n}\nbody.page-id-1069 .article-nvlopmedia h2 {\n  color: #ffffff !important;\n  text-shadow: 0 2px 8px rgba(0, 0, 0, 0.45) !important;\n}\n\n:root{\n  --solaris-ink:#1f2937;\n  --solaris-muted:#64748b;\n  --solaris-border:#dbe3ea;\n  --solaris-bg:#f6f8fb;\n  --solaris-card:#ffffff;\n  --solaris-accent:#f7b733;\n  --solaris-accent-dark:#cf7c00;\n  --solaris-deep:#102033;\n  --solaris-green:#e7f5ea;\n  --solaris-yellow:#fff4c2;\n  --solaris-orange:#ffe0c7;\n  --solaris-red:#ffd2d2;\n  --solaris-blue:#e8f3ff;\n}\n.article-nvlopmedia .solaris-app,\n.solaris-app{\n  font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n  color: var(--solaris-ink);\n  background: linear-gradient(135deg, #fff 0%, var(--solaris-bg) 100%);\n  border: 1px solid var(--solaris-border);\n  border-radius: 24px;\n  overflow: hidden;\n  box-shadow: 0 18px 45px rgba(15, 23, 42, .10);\n  max-width: 1160px;\n  margin: 28px auto;\n}\n.solaris-hero{\n  background:\n    radial-gradient(circle at 15% 10%, rgba(247,183,51,.35), transparent 30%),\n    linear-gradient(135deg, #142238 0%, #20324b 55%, #111827 100%);\n  color: white;\n  padding: 34px 32px;\n}\n.solaris-eyebrow{\n  letter-spacing: .16em;\n  text-transform: uppercase;\n  font-weight: 700;\n  font-size: .78rem;\n  color: #ffd77c;\n  margin-bottom: 8px;\n}\n.solaris-hero h2{\n  margin: 0 0 10px;\n  font-size: clamp(1.65rem, 3vw, 2.65rem);\n  line-height: 1.1;\n}\n.solaris-hero p{\n  margin: 0;\n  max-width: 860px;\n  color: #dbeafe;\n  font-size: 1.02rem;\n}\n.solaris-body{\n  display: grid;\n  grid-template-columns: minmax(300px, 440px) 1fr;\n  gap: 22px;\n  padding: 24px;\n}\n.solaris-panel{\n  background: var(--solaris-card);\n  border: 1px solid var(--solaris-border);\n  border-radius: 20px;\n  padding: 20px;\n  box-shadow: 0 8px 22px rgba(15, 23, 42, .06);\n}\n.solaris-panel h3{\n  margin: 0 0 14px;\n  font-size: 1.12rem;\n  color: var(--solaris-deep);\n}\n.solaris-grid{\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 14px;\n}\n.solaris-field{\n  margin-bottom: 14px;\n}\n.solaris-field label{\n  display: block;\n  font-weight: 700;\n  font-size: .88rem;\n  margin-bottom: 6px;\n}\n.solaris-field small{\n  display: block;\n  color: var(--solaris-muted);\n  margin-top: 5px;\n  line-height: 1.35;\n}\n.solaris-field input,\n.solaris-field select{\n  width: 100%;\n  box-sizing: border-box;\n  border: 1px solid #cbd5e1;\n  border-radius: 12px;\n  padding: 11px 12px;\n  font-size: 1rem;\n  background: #fff;\n}\n.solaris-field input:focus,\n.solaris-field select:focus{\n  outline: 3px solid rgba(247,183,51,.28);\n  border-color: var(--solaris-accent-dark);\n}\n.solaris-optional{\n  margin-top: 18px;\n  padding: 15px;\n  border: 1px dashed #cbd5e1;\n  border-radius: 16px;\n  background: #f8fafc;\n}\n.solaris-optional h4{\n  margin: 0 0 12px;\n  font-size: .98rem;\n  color: var(--solaris-deep);\n}\n.solaris-actions{\n  display: flex;\n  gap: 10px;\n  flex-wrap: wrap;\n  margin-top: 8px;\n}\n.solaris-btn{\n  border: 0;\n  border-radius: 999px;\n  padding: 11px 18px;\n  font-weight: 800;\n  cursor: pointer;\n}\n.solaris-btn-primary{\n  background: linear-gradient(135deg, #f7b733, #ff8f00);\n  color: #111827;\n}\n.solaris-btn-secondary{\n  background: #e5e7eb;\n  color: #111827;\n}\n.solaris-results{\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  gap: 14px;\n}\n.solaris-card{\n  border: 1px solid var(--solaris-border);\n  border-radius: 18px;\n  padding: 16px;\n  background: #fff;\n}\n.solaris-card h4{\n  margin: 0 0 8px;\n  font-size: .98rem;\n}\n.solaris-temp{\n  font-size: 2rem;\n  font-weight: 900;\n  letter-spacing: -.03em;\n}\n.solaris-unit{\n  font-size: .9rem;\n  color: var(--solaris-muted);\n}\n.solaris-metric{\n  display: flex;\n  justify-content: space-between;\n  border-top: 1px solid #eef2f7;\n  padding-top: 8px;\n  margin-top: 8px;\n  font-size: .92rem;\n}\n.solaris-verdict{\n  margin-top: 16px;\n  border-radius: 20px;\n  padding: 18px;\n  border: 1px solid var(--solaris-border);\n}\n.solaris-verdict.low{ background: var(--solaris-green); }\n.solaris-verdict.moderate{ background: var(--solaris-yellow); }\n.solaris-verdict.high{ background: var(--solaris-orange); }\n.solaris-verdict.critical{ background: var(--solaris-red); }\n.solaris-verdict.empty{ background: #f8fafc; color: var(--solaris-muted); }\n.solaris-verdict h3{\n  margin: 0 0 8px;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n.solaris-verdict p{\n  margin: 8px 0;\n  line-height: 1.55;\n}\n.solaris-verdict ul{\n  margin: 10px 0 0 20px;\n  padding: 0;\n}\n.solaris-verdict li{\n  margin: 6px 0;\n}\n.solaris-coolroof{\n  margin-top: 12px;\n  padding: 12px 14px;\n  background: var(--solaris-blue);\n  border: 1px solid #bfdbfe;\n  border-radius: 14px;\n  line-height: 1.45;\n}\n.solaris-note{\n  margin-top: 16px;\n  color: var(--solaris-muted);\n  font-size: .86rem;\n  line-height: 1.45;\n}\n.solaris-error{\n  display: none;\n  margin: 10px 0 0;\n  padding: 10px 12px;\n  border-radius: 12px;\n  background: #fee2e2;\n  color: #991b1b;\n  font-weight: 700;\n}\n\n.solaris-footer{\n  margin-top: 22px;\n  padding: 18px 20px;\n  border: 1px solid var(--solaris-border);\n  border-radius: 18px;\n  background: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%);\n  color: var(--solaris-muted);\n  font-size: .86rem;\n  line-height: 1.55;\n}\n.solaris-footer strong{\n  color: var(--solaris-deep);\n}\n.solaris-footer p{\n  margin: 8px 0 0;\n}\n.solaris-footer p:first-child{\n  margin-top: 0;\n}\n\n@media (max-width: 920px){\n  .solaris-body{ grid-template-columns: 1fr; }\n  .solaris-results{ grid-template-columns: 1fr; }\n  .solaris-grid{ grid-template-columns: 1fr; }\n}\n\/* =========================================================\n   SOLARIS 1.1 \u2014 Bouton et rapport imprimable PDF\n========================================================= *\/\n\n.solaris-btn-print{\n  background: linear-gradient(135deg, #102033, #1f3a5a);\n  color: #ffffff;\n}\n\n.solaris-print-report{\n  display: none;\n}\n\n@page{\n  size: Letter portrait;\n  margin: 0.45in;\n}\n\n@media print{\n  html,\n  body{\n    background: #ffffff !important;\n  }\n\n  body *{\n    visibility: hidden !important;\n  }\n\n  .solaris-print-report,\n  .solaris-print-report *{\n    visibility: visible !important;\n  }\n\n  .solaris-print-report{\n    display: block !important;\n    position: absolute !important;\n    left: 0 !important;\n    top: 0 !important;\n    width: 100% !important;\n    max-width: 100% !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    color: #111827 !important;\n    background: #ffffff !important;\n    font-family: Arial, Helvetica, sans-serif !important;\n  }\n\n  .solaris-report-page{\n    width: 100% !important;\n    box-sizing: border-box !important;\n    font-size: 9.2pt !important;\n    line-height: 1.28 !important;\n  }\n\n  .solaris-report-header{\n    display: flex !important;\n    justify-content: space-between !important;\n    align-items: flex-start !important;\n    gap: 18px !important;\n    padding-bottom: 10px !important;\n    border-bottom: 3px solid #102033 !important;\n    margin-bottom: 12px !important;\n  }\n\n  .solaris-report-eyebrow{\n    color: #cf7c00 !important;\n    font-size: 8pt !important;\n    font-weight: 700 !important;\n    letter-spacing: 0.14em !important;\n    text-transform: uppercase !important;\n    margin-bottom: 4px !important;\n  }\n\n  .solaris-report-header h1{\n    margin: 0 0 4px !important;\n    font-size: 17pt !important;\n    line-height: 1.08 !important;\n    color: #102033 !important;\n  }\n\n  .solaris-report-header p{\n    margin: 0 !important;\n    font-size: 8.5pt !important;\n    color: #475569 !important;\n  }\n\n  .solaris-report-brand{\n    min-width: 145px !important;\n    padding: 8px 10px !important;\n    border-radius: 10px !important;\n    background: #102033 !important;\n    color: #ffffff !important;\n    text-align: right !important;\n    font-weight: 800 !important;\n    font-size: 10pt !important;\n  }\n\n  .solaris-report-brand span{\n    color: #f7b733 !important;\n    font-size: 8pt !important;\n    letter-spacing: 0.08em !important;\n  }\n\n  .solaris-report-summary{\n    display: grid !important;\n    grid-template-columns: 1fr 1fr 1.35fr !important;\n    gap: 8px !important;\n    margin-bottom: 12px !important;\n  }\n\n  .solaris-report-summary > div,\n  .solaris-report-box,\n  .solaris-report-verdict,\n  .solaris-report-assumptions{\n    border: 1px solid #d1d5db !important;\n    border-radius: 9px !important;\n    padding: 8px 10px !important;\n    background: #ffffff !important;\n    box-sizing: border-box !important;\n  }\n\n  .solaris-report-summary strong,\n  .solaris-report-summary span{\n    display: block !important;\n  }\n\n  .solaris-report-summary strong{\n    font-size: 7.8pt !important;\n    color: #475569 !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.04em !important;\n    margin-bottom: 3px !important;\n  }\n\n  .solaris-report-summary span{\n    font-size: 10pt !important;\n    color: #111827 !important;\n    font-weight: 700 !important;\n  }\n\n  .solaris-report-grid-two{\n    display: grid !important;\n    grid-template-columns: 0.95fr 1.05fr !important;\n    gap: 10px !important;\n    margin-bottom: 10px !important;\n  }\n\n  .solaris-report-box h2,\n  .solaris-report-verdict h2{\n    margin: 0 0 6px !important;\n    font-size: 12pt !important;\n    color: #102033 !important;\n  }\n\n  .solaris-report-box table{\n    width: 100% !important;\n    border-collapse: collapse !important;\n    font-size: 8.8pt !important;\n  }\n\n  .solaris-report-box th,\n  .solaris-report-box td{\n    padding: 5px 4px !important;\n    border-bottom: 1px solid #e5e7eb !important;\n    vertical-align: top !important;\n  }\n\n  .solaris-report-box th{\n    text-align: left !important;\n    color: #475569 !important;\n    font-weight: 700 !important;\n  }\n\n  .solaris-report-box td{\n    text-align: right !important;\n    color: #111827 !important;\n    font-weight: 700 !important;\n  }\n\n  .solaris-report-verdict{\n    margin-bottom: 10px !important;\n  }\n\n  .solaris-report-verdict.low{ background: #e7f5ea !important; }\n  .solaris-report-verdict.moderate{ background: #fff4c2 !important; }\n  .solaris-report-verdict.high{ background: #ffe0c7 !important; }\n  .solaris-report-verdict.critical{ background: #ffd2d2 !important; }\n\n  .solaris-report-verdict p{\n    margin: 0 0 6px !important;\n  }\n\n  .solaris-report-verdict ul{\n    margin: 5px 0 0 16px !important;\n    padding: 0 !important;\n  }\n\n  .solaris-report-verdict li{\n    margin: 3px 0 !important;\n  }\n\n  .solaris-report-coolroof{\n    margin-top: 7px !important;\n    padding: 7px 9px !important;\n    border: 1px solid #bfdbfe !important;\n    border-radius: 8px !important;\n    background: #e8f3ff !important;\n  }\n\n  .solaris-report-assumptions{\n    font-size: 8pt !important;\n    color: #374151 !important;\n    background: #f8fafc !important;\n    margin-bottom: 9px !important;\n  }\n\n  .solaris-report-footer{\n    padding-top: 8px !important;\n    border-top: 1px solid #cbd5e1 !important;\n    color: #475569 !important;\n    font-size: 7.7pt !important;\n    line-height: 1.35 !important;\n  }\n}\n<\/style>\n\n<script data-wp-block-html=\"js\">\nconst Solaris = (() => {\n  const CONDITIONS = [\n    { key: \"faibles\", label: \"Vents Faibles\", hc: 5 },\n    { key: \"moyens\", label: \"Vents Moyens\", hc: 12 },\n    { key: \"forts\", label: \"Vents Forts\", hc: 30 }\n  ];\n\n  const COOL_ROOF_LIMITS = {\n    lowRoof: { label: \"toiture faible pente \u2264 2:12\", initialSri: 82, agedSri: 64 },\n    steepRoof: { label: \"toiture forte pente > 2:12\", initialSri: 39, agedSri: 32 }\n  };\n\n  let lastReport = null;\n\n  const SELECT_LABELS = {\n    orientation: {\n      general: \"Non sp\u00e9cifi\u00e9e\",\n      north: \"Fa\u00e7ade nord\",\n      east: \"Fa\u00e7ade est\",\n      south: \"Fa\u00e7ade sud\",\n      west: \"Fa\u00e7ade ouest\",\n      southwest: \"Fa\u00e7ade sud-ouest\",\n      lowRoof: \"Toiture faible pente \u2264 2:12\",\n      steepRoof: \"Toiture forte pente > 2:12\"\n    },\n    panelType: {\n      general: \"Non sp\u00e9cifi\u00e9\",\n      flat: \"Panneau plat \/ cassette lisse\",\n      ribbed: \"Panneau nervur\u00e9 ou profil\u00e9\",\n      standingSeam: \"Panneau \u00e0 joint debout\",\n      insulated: \"Panneau m\u00e9tallique isol\u00e9 (PMI)\",\n      longSheet: \"Longue t\u00f4le continue\"\n    },\n    movementFreedom: {\n      general: \"Non sp\u00e9cifi\u00e9e\",\n      free: \"Libre \/ joints bien d\u00e9gag\u00e9s\",\n      partial: \"Partiellement restreinte\",\n      restricted: \"Fortement restreinte\"\n    }\n  };\n\n  function readNumber(id){\n    return Number(document.getElementById(id).value);\n  }\n\n  function escapeHTML(value){\n    return String(value ?? \"\").replace(\/[&<>\"']\/g, function(char){\n      return {\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",\"\\\"\":\"&quot;\",\"\\'\":\"&#039;\"}[char];\n    });\n  }\n\n  function getSelectText(id){\n    const el = document.getElementById(id);\n    if (!el || el.selectedIndex < 0) return \"\";\n    return el.options[el.selectedIndex].text;\n  }\n\n  function validate(tsr, e){\n    if (!Number.isFinite(tsr) || tsr < 0 || tsr > 1) {\n      return \"Le TSR doit \u00eatre une valeur num\u00e9rique comprise entre 0 et 1.\";\n    }\n    if (!Number.isFinite(e) || e <= 0 || e > 1) {\n      return \"L\u2019\u00e9missivit\u00e9 doit \u00eatre une valeur num\u00e9rique sup\u00e9rieure \u00e0 0 et inf\u00e9rieure ou \u00e9gale \u00e0 1.\";\n    }\n    return \"\";\n  }\n\n  function calculateOne(tsr, e, hc){\n    const a = 1 - tsr;\n    const comp1 = (1066.07 * a) - (31.98 * e);\n    const comp2 = (6.78 * e) + hc;\n    const comp3 = (890.94 * Math.pow(a, 2)) + (2153.8 * a * e);\n    const comp4 = Math.pow((6.78 * e) + hc, 2);\n    const xi = ((a - 0.029 * e) * (8.797 + hc)) \/ ((9.52 * e) + hc);\n    const sri = 123.97 - (141.35 * xi) + (9.655 * Math.pow(xi, 2));\n    const tempK = 309.07 + (comp1 \/ comp2) - (comp3 \/ comp4);\n    const tempC = tempK - 273.15;\n    const tempF = (1.8 * tempC) + 32;\n    return { hc, a, xi, sri, tempK, tempC, tempF };\n  }\n\n  function baseBand(tempC, sri, tsr){\n    if (tempC >= 75 || sri < 20 || tsr < 0.20) return \"critical\";\n    if (tempC >= 65 || sri < 35 || tsr < 0.35) return \"high\";\n    if (tempC >= 55 || sri < 60 || tsr < 0.55) return \"moderate\";\n    return \"low\";\n  }\n\n  function scoreContext(orientation, panelType, movementFreedom){\n    let score = 0;\n    if ([\"west\", \"southwest\"].includes(orientation)) score += 2;\n    if ([\"south\", \"lowRoof\", \"steepRoof\"].includes(orientation)) score += 1;\n    if ([\"flat\", \"insulated\", \"longSheet\"].includes(panelType)) score += 2;\n    if ([\"standingSeam\"].includes(panelType)) score += 1;\n    if (panelType === \"ribbed\") score -= 1;\n    if (movementFreedom === \"partial\") score += 1;\n    if (movementFreedom === \"restricted\") score += 3;\n    if (movementFreedom === \"free\") score -= 1;\n    return score;\n  }\n\n  function adjustBand(band, contextScore){\n    const levels = [\"low\", \"moderate\", \"high\", \"critical\"];\n    let idx = levels.indexOf(band);\n    if (contextScore >= 4) idx += 1;\n    if (contextScore <= -1) idx -= 1;\n    idx = Math.max(0, Math.min(levels.length - 1, idx));\n    return levels[idx];\n  }\n\n  function coolRoofMessage(ref, orientation){\n    const limit = COOL_ROOF_LIMITS[orientation];\n    if (!limit) {\n      if (ref.sri >= 82) {\n        return \"F\u00e9licitations : le SRI calcul\u00e9 est tr\u00e8s \u00e9lev\u00e9. Pour une application de toiture faible pente, cette valeur serait compatible avec les seuils initiaux g\u00e9n\u00e9ralement associ\u00e9s aux toitures \u00e0 haute r\u00e9flectance. Pour une fa\u00e7ade verticale, cette mention demeure informative seulement.\";\n      }\n      if (ref.sri >= 39) {\n        return \"Bon choix solaire : le SRI calcul\u00e9 atteint un niveau g\u00e9n\u00e9ralement favorable pour des applications de toiture forte pente. Pour une fa\u00e7ade verticale, cette mention demeure informative seulement.\";\n      }\n      return \"\";\n    }\n\n    if (ref.sri >= limit.initialSri) {\n      return `F\u00e9licitations : le SRI calcul\u00e9 d\u2019environ ${ref.sri.toFixed(0)} atteint le seuil initial de ${limit.initialSri} g\u00e9n\u00e9ralement utilis\u00e9 pour une ${limit.label}. Le produit peut donc \u00eatre pr\u00e9sent\u00e9 comme un excellent candidat de type Cool Roof, sous r\u00e9serve des exigences officielles du projet et des donn\u00e9es certifi\u00e9es du fabricant.`;\n    }\n    if (ref.sri >= limit.agedSri) {\n      return `Bonne performance solaire : le SRI calcul\u00e9 d\u2019environ ${ref.sri.toFixed(0)} atteint le rep\u00e8re \u00e2g\u00e9 de ${limit.agedSri} g\u00e9n\u00e9ralement utilis\u00e9 pour une ${limit.label}. Pour une vraie conformit\u00e9 Cool Roof, v\u00e9rifier les valeurs initiales et vieillies certifi\u00e9es du fabricant.`;\n    }\n    return \"\";\n  }\n\n  function contextBullets(orientation, panelType, movementFreedom){\n    const bullets = [];\n    const orientationText = {\n      north: \"Orientation nord : l\u2019exposition solaire directe est g\u00e9n\u00e9ralement moins p\u00e9nalisante, mais les reflets locaux et les conditions r\u00e9elles du site doivent rester consid\u00e9r\u00e9s.\",\n      east: \"Orientation est : surveiller les gains solaires du matin, surtout sur les finis fonc\u00e9s et lustr\u00e9s.\",\n      south: \"Orientation sud : pr\u00e9voir une attention accrue \u00e0 la dilatation thermique, aux joints et aux fa\u00e7ades tr\u00e8s expos\u00e9es.\",\n      west: \"Orientation ouest : exposition souvent critique en apr\u00e8s-midi; les reflets rasants peuvent accentuer visuellement le gondolage.\",\n      southwest: \"Orientation sud-ouest : combinaison particuli\u00e8rement sensible pour les couleurs fonc\u00e9es, les panneaux plats et les longues t\u00f4les.\",\n      lowRoof: \"Toiture faible pente : v\u00e9rifier les seuils Cool Roof applicables, les donn\u00e9es vieillies du fini et la conformit\u00e9 au programme vis\u00e9.\",\n      steepRoof: \"Toiture forte pente : le seuil SRI est g\u00e9n\u00e9ralement moins exigeant qu\u2019en faible pente, mais les exigences du projet doivent \u00eatre confirm\u00e9es.\"\n    };\n    const panelText = {\n      flat: \"Panneau plat ou cassette lisse : sensibilit\u00e9 accrue aux ondulations visibles et aux reflets de surface.\",\n      ribbed: \"Panneau nervur\u00e9 : la g\u00e9om\u00e9trie raidie aide g\u00e9n\u00e9ralement \u00e0 r\u00e9duire la perception du gondolage.\",\n      standingSeam: \"Panneau \u00e0 joint debout : porter attention \u00e0 la longueur des feuilles, au coulissement des attaches et aux joints d\u2019extr\u00e9mit\u00e9.\",\n      insulated: \"Panneau m\u00e9tallique isol\u00e9 : surveiller le voilement thermique de la peau ext\u00e9rieure lorsque la dilatation est contrainte par l\u2019\u00e2me isolante.\",\n      longSheet: \"Longue t\u00f4le continue : pr\u00e9voir des d\u00e9tails permettant les mouvements cumul\u00e9s de dilatation et de contraction.\"\n    };\n    const movementText = {\n      free: \"Libert\u00e9 de mouvement favorable : maintenir les trous oblongs, d\u00e9gagements et joints de dilatation pr\u00e9vus aux d\u00e9tails.\",\n      partial: \"Mouvement partiellement restreint : v\u00e9rifier les jeux aux fixations, aux extr\u00e9mit\u00e9s, aux coins d\u2019ouvertures et aux jonctions.\",\n      restricted: \"Mouvement fortement restreint : risque accru de voilement ou de flambage local; revoir les ancrages rigides et les zones de blocage.\"\n    };\n    if (orientationText[orientation]) bullets.push(orientationText[orientation]);\n    if (panelText[panelType]) bullets.push(panelText[panelType]);\n    if (movementText[movementFreedom]) bullets.push(movementText[movementFreedom]);\n    return bullets;\n  }\n\n  function verdictContent(band, ref, colorName, paintType, context){\n    const temp = ref.tempC.toFixed(1);\n    const sri = ref.sri.toFixed(0);\n    const absorption = (ref.a * 100).toFixed(0);\n    const finish = paintType || \"fini non sp\u00e9cifi\u00e9\";\n    const color = colorName || \"couleur s\u00e9lectionn\u00e9e\";\n\n    const base = {\n      low: {\n        title: \"Verdict : sollicitation thermique g\u00e9n\u00e9ralement faible\",\n        text: `Pour la couleur ${color} (${finish}), la temp\u00e9rature de surface estim\u00e9e de r\u00e9f\u00e9rence est d\u2019environ ${temp} \u00b0C, avec un SRI d\u2019environ ${sri}. L\u2019absorption solaire est d\u2019environ ${absorption} %. Le risque thermique est g\u00e9n\u00e9ralement favorable, sous r\u00e9serve d\u2019une sous-structure conforme et de joints correctement d\u00e9taill\u00e9s.`,\n        points: [\n          \"Conserver les tol\u00e9rances usuelles de plan\u00e9it\u00e9 de la structure de support.\",\n          \"Pr\u00e9voir les d\u00e9gagements normaux aux joints et aux extr\u00e9mit\u00e9s de panneaux.\",\n          \"V\u00e9rifier tout de m\u00eame les panneaux tr\u00e8s larges, tr\u00e8s plats ou \u00e0 fini tr\u00e8s lustr\u00e9.\"\n        ]\n      },\n      moderate: {\n        title: \"Verdict : sollicitation thermique mod\u00e9r\u00e9e \u00e0 surveiller\",\n        text: `Pour la couleur ${color} (${finish}), la temp\u00e9rature de surface estim\u00e9e de r\u00e9f\u00e9rence est d\u2019environ ${temp} \u00b0C, avec un SRI d\u2019environ ${sri}. L\u2019absorption solaire est d\u2019environ ${absorption} %. Le comportement demeure g\u00e9n\u00e9ralement ma\u00eetrisable, mais les d\u00e9tails de fixation et les tol\u00e9rances de support deviennent importants.`,\n        points: [\n          \"Porter attention aux fa\u00e7ades sud, sud-ouest et ouest, ainsi qu\u2019aux zones de r\u00e9flexion solaire.\",\n          \"Limiter les grandes largeurs libres de t\u00f4les minces et privil\u00e9gier des profils plus rigides lorsque l\u2019apparence est critique.\",\n          \"\u00c9viter les fixations qui bloquent la dilatation thermique, surtout aux extr\u00e9mit\u00e9s et aux jonctions.\"\n        ]\n      },\n      high: {\n        title: \"Verdict : sollicitation thermique \u00e9lev\u00e9e\",\n        text: `Pour la couleur ${color} (${finish}), la temp\u00e9rature de surface estim\u00e9e de r\u00e9f\u00e9rence est d\u2019environ ${temp} \u00b0C, avec un SRI d\u2019environ ${sri}. L\u2019absorption solaire est d\u2019environ ${absorption} %. Cette combinaison peut accentuer le gondolage, r\u00e9v\u00e9ler les contraintes r\u00e9siduelles de la bobine et augmenter le risque de voilement si la dilatation est restreinte.`,\n        points: [\n          \"Exiger une v\u00e9rification soign\u00e9e des tol\u00e9rances de structure, de la plan\u00e9it\u00e9 des supports et de la cambrure admissible.\",\n          \"Pr\u00e9voir trous oblongs, d\u00e9gagements p\u00e9riph\u00e9riques et joints permettant les mouvements thermiques.\",\n          \"\u00catre prudent avec les panneaux isol\u00e9s, les panneaux plats de grand format et les couleurs fonc\u00e9es sur fa\u00e7ades tr\u00e8s expos\u00e9es.\"\n        ]\n      },\n      critical: {\n        title: \"Verdict : sollicitation thermique tr\u00e8s \u00e9lev\u00e9e\",\n        text: `Pour la couleur ${color} (${finish}), la temp\u00e9rature de surface estim\u00e9e de r\u00e9f\u00e9rence est d\u2019environ ${temp} \u00b0C, avec un SRI d\u2019environ ${sri}. L\u2019absorption solaire est d\u2019environ ${absorption} %. Cette condition est d\u00e9favorable pour les t\u00f4les minces tr\u00e8s plates, les panneaux \u00e0 dilatation restreinte et les zones de d\u00e9coupes ou d\u2019ancrages rigides.`,\n        points: [\n          \"R\u00e9aliser une revue technique d\u00e9taill\u00e9e des joints, des fixations, des d\u00e9gagements et des mouvements thermiques anticip\u00e9s.\",\n          \"\u00c9viter de bloquer la t\u00f4le entre deux points d\u2019ancrage rigides; risque accru de flambage local aux ouvertures et aux d\u00e9coupes.\",\n          \"Consid\u00e9rer une couleur \u00e0 TSR plus \u00e9lev\u00e9, une g\u00e9om\u00e9trie plus raidie, une \u00e9paisseur accrue ou un mock-up visuel avant approbation finale.\"\n        ]\n      }\n    };\n\n    const selected = base[band];\n    selected.points = [...selected.points, ...contextBullets(context.orientation, context.panelType, context.movementFreedom)];\n    selected.coolRoof = coolRoofMessage(ref, context.orientation);\n    return selected;\n  }\n\n  function renderBlank(){\n    const container = document.getElementById(\"solarisResults\");\n    container.innerHTML = CONDITIONS.map(r => `\n      <div class=\"solaris-card\">\n        <h4>${r.label}<br><span class=\"solaris-unit\">hc = ${r.hc} W\/m\u00b2K<\/span><\/h4>\n        <div class=\"solaris-temp\">0.0 \u00b0C<\/div>\n        <div class=\"solaris-unit\">0.0 K \u00b7 0.0 \u00b0F<\/div>\n        <div class=\"solaris-metric\"><span>SRI<\/span><strong>0.0<\/strong><\/div>\n        <div class=\"solaris-metric\"><span>Absorption<\/span><strong>0 %<\/strong><\/div>\n      <\/div>\n    `).join(\"\");\n    const verdict = document.getElementById(\"solarisVerdict\");\n    verdict.className = \"solaris-verdict empty\";\n    verdict.innerHTML = \"<h3>Verdict en attente<\/h3><p>Entrez les valeurs de TSR et d\u2019\u00e9missivit\u00e9, puis cliquez sur Calculer pour obtenir l\u2019interpr\u00e9tation technique.<\/p>\";\n  }\n\n  function renderResults(results){\n    const container = document.getElementById(\"solarisResults\");\n    container.innerHTML = results.map(r => `\n      <div class=\"solaris-card\">\n        <h4>${r.label}<br><span class=\"solaris-unit\">hc = ${r.hc} W\/m\u00b2K<\/span><\/h4>\n        <div class=\"solaris-temp\">${r.tempC.toFixed(1)} \u00b0C<\/div>\n        <div class=\"solaris-unit\">${r.tempK.toFixed(1)} K \u00b7 ${r.tempF.toFixed(1)} \u00b0F<\/div>\n        <div class=\"solaris-metric\"><span>SRI<\/span><strong>${r.sri.toFixed(1)}<\/strong><\/div>\n        <div class=\"solaris-metric\"><span>Absorption<\/span><strong>${(r.a * 100).toFixed(0)} %<\/strong><\/div>\n      <\/div>\n    `).join(\"\");\n  }\n\n  function renderVerdict(content, band){\n    const verdict = document.getElementById(\"solarisVerdict\");\n    verdict.className = \"solaris-verdict \" + band;\n    verdict.innerHTML = `\n      <h3>${content.title}<\/h3>\n      <p>${content.text}<\/p>\n      <ul>${content.points.map(p => `<li>${p}<\/li>`).join(\"\")}<\/ul>\n      ${content.coolRoof ? `<div class=\"solaris-coolroof\"><strong>Cool Roof \/ haute r\u00e9flectance :<\/strong> ${content.coolRoof}<br><small>Note : ENERGY STAR pour les produits de toiture a \u00e9t\u00e9 retir\u00e9 comme certification active; utiliser les donn\u00e9es certifi\u00e9es du fabricant et les exigences du projet.<\/small><\/div>` : \"\"}\n    `;\n  }\n\n  function renderPrintReport(data){\n    const report = document.getElementById(\"solarisPrintReport\");\n    if (!report || !data) return;\n\n    const dateText = data.generatedAt.toLocaleDateString(\"fr-CA\", { year:\"numeric\", month:\"long\", day:\"2-digit\" });\n    const timeText = data.generatedAt.toLocaleTimeString(\"fr-CA\", { hour:\"2-digit\", minute:\"2-digit\" });\n    const inputs = data.inputs;\n    const verdict = data.verdict;\n    const ref = data.ref;\n    const points = (verdict.points || []).slice(0, 6);\n\n    report.innerHTML = `\n      <div class=\"solaris-report-page\">\n        <header class=\"solaris-report-header\">\n          <div>\n            <div class=\"solaris-report-eyebrow\">Solaris 1.1 \u2014 Rapport de r\u00e9sultats<\/div>\n            <h1>Temp\u00e9rature de surface des t\u00f4les m\u00e9talliques pr\u00e9peintes<\/h1>\n            <p>Rapport pr\u00e9liminaire g\u00e9n\u00e9r\u00e9 le ${escapeHTML(dateText)} \u00e0 ${escapeHTML(timeText)}<\/p>\n          <\/div>\n          <div class=\"solaris-report-brand\">Sphenix Mperia<br><span>NVLOPMEDIA<\/span><\/div>\n        <\/header>\n\n        <section class=\"solaris-report-summary\">\n          <div>\n            <strong>Couleur \/ fini<\/strong>\n            <span>${escapeHTML(inputs.colorName || \"Non sp\u00e9cifi\u00e9\")} ${inputs.paintType ? \"(\" + escapeHTML(inputs.paintType) + \")\" : \"\"}<\/span>\n          <\/div>\n          <div>\n            <strong>Condition de r\u00e9f\u00e9rence<\/strong>\n            <span>${escapeHTML(inputs.referenceWindText)}<\/span>\n          <\/div>\n          <div>\n            <strong>R\u00e9sultat de r\u00e9f\u00e9rence<\/strong>\n            <span>${ref.tempC.toFixed(1)} \u00b0C \u00b7 SRI ${ref.sri.toFixed(1)} \u00b7 absorption ${(ref.a * 100).toFixed(0)} %<\/span>\n          <\/div>\n        <\/section>\n\n        <section class=\"solaris-report-grid-two\">\n          <div class=\"solaris-report-box\">\n            <h2>Donn\u00e9es d\u2019entr\u00e9e<\/h2>\n            <table>\n              <tbody>\n                <tr><th>Type de peinture<\/th><td>${escapeHTML(inputs.paintType || \"Non sp\u00e9cifi\u00e9\")}<\/td><\/tr>\n                <tr><th>Nom de couleur<\/th><td>${escapeHTML(inputs.colorName || \"Non sp\u00e9cifi\u00e9\")}<\/td><\/tr>\n                <tr><th>TSR<\/th><td>${inputs.tsr.toFixed(2)}<\/td><\/tr>\n                <tr><th>\u00c9missivit\u00e9 \u03b5<\/th><td>${inputs.emissivity.toFixed(2)}<\/td><\/tr>\n                <tr><th>Orientation \/ exposition<\/th><td>${escapeHTML(inputs.orientationText)}<\/td><\/tr>\n                <tr><th>Type de panneau<\/th><td>${escapeHTML(inputs.panelTypeText)}<\/td><\/tr>\n                <tr><th>Libert\u00e9 de mouvement<\/th><td>${escapeHTML(inputs.movementFreedomText)}<\/td><\/tr>\n              <\/tbody>\n            <\/table>\n          <\/div>\n\n          <div class=\"solaris-report-box\">\n            <h2>R\u00e9sultats Solaris<\/h2>\n            <table>\n              <thead>\n                <tr><th>Condition<\/th><th>hc<\/th><th>Temp.<\/th><th>SRI<\/th><th>Abs.<\/th><\/tr>\n              <\/thead>\n              <tbody>\n                ${data.results.map(r => `\n                  <tr>\n                    <td>${escapeHTML(r.label)}<\/td>\n                    <td>${r.hc}<\/td>\n                    <td>${r.tempC.toFixed(1)} \u00b0C<\/td>\n                    <td>${r.sri.toFixed(1)}<\/td>\n                    <td>${(r.a * 100).toFixed(0)} %<\/td>\n                  <\/tr>\n                `).join(\"\")}\n              <\/tbody>\n            <\/table>\n          <\/div>\n        <\/section>\n\n        <section class=\"solaris-report-verdict ${escapeHTML(data.band)}\">\n          <h2>${escapeHTML(verdict.title)}<\/h2>\n          <p>${escapeHTML(verdict.text)}<\/p>\n          <ul>${points.map(p => `<li>${escapeHTML(p)}<\/li>`).join(\"\")}<\/ul>\n          ${verdict.coolRoof ? `<div class=\"solaris-report-coolroof\"><strong>Cool Roof \/ haute r\u00e9flectance :<\/strong> ${escapeHTML(verdict.coolRoof)}<\/div>` : \"\"}\n        <\/section>\n\n        <section class=\"solaris-report-assumptions\">\n          <strong>Hypoth\u00e8ses standards :<\/strong> flux solaire 1000 W\/m\u00b2, temp\u00e9rature d\u2019air ambiant 310 K, temp\u00e9rature ambiante du ciel 300 K, conduction thermique non consid\u00e9r\u00e9e. Les r\u00e9sultats fournis par Solaris sont des estimations pr\u00e9liminaires bas\u00e9es sur les param\u00e8tres saisis par l\u2019utilisateur et sur des hypoth\u00e8ses thermiques simplifi\u00e9es.\n        <\/section>\n\n        <footer class=\"solaris-report-footer\">\n          <strong>Solaris 1.1 \u2014 Outil d\u00e9velopp\u00e9 par Sphenix Mperia \/ NVLOPMEDIA.<\/strong><br>\n          \u00a9 2026 Sphenix Mperia. Tous droits r\u00e9serv\u00e9s. Ce rapport ne remplace pas une analyse compl\u00e8te de conception, une validation du fabricant, ni le jugement professionnel d\u2019un ing\u00e9nieur ou sp\u00e9cialiste de l\u2019enveloppe du b\u00e2timent.\n        <\/footer>\n      <\/div>\n    `;\n  }\n\n  function printReport(){\n    if (!lastReport) {\n      const ok = calculate();\n      if (!ok) return;\n    }\n    renderPrintReport(lastReport);\n    window.setTimeout(function(){ window.print(); }, 100);\n  }\n\n  function calculate(){\n    const tsr = readNumber(\"tsr\");\n    const e = readNumber(\"emissivity\");\n    const error = validate(tsr, e);\n    const errorBox = document.getElementById(\"solarisError\");\n    if (error) {\n      errorBox.style.display = \"block\";\n      errorBox.textContent = error;\n      return false;\n    }\n    errorBox.style.display = \"none\";\n\n    const paintType = document.getElementById(\"paintType\").value;\n    const colorName = document.getElementById(\"colorName\").value.trim();\n    const refHc = Number(document.getElementById(\"referenceWind\").value);\n    const context = {\n      orientation: document.getElementById(\"orientation\").value,\n      panelType: document.getElementById(\"panelType\").value,\n      movementFreedom: document.getElementById(\"movementFreedom\").value\n    };\n\n    const results = CONDITIONS.map(c => ({...c, ...calculateOne(tsr, e, c.hc)}));\n    const ref = results.find(r => r.hc === refHc) || results[1];\n    const unadjustedBand = baseBand(ref.tempC, ref.sri, tsr);\n    const contextScore = scoreContext(context.orientation, context.panelType, context.movementFreedom);\n    const band = adjustBand(unadjustedBand, contextScore);\n    const verdict = verdictContent(band, ref, colorName, paintType, context);\n\n    renderResults(results);\n    renderVerdict(verdict, band);\n\n    lastReport = {\n      generatedAt: new Date(),\n      inputs: {\n        paintType,\n        colorName,\n        tsr,\n        emissivity: e,\n        referenceWind: refHc,\n        referenceWindText: getSelectText(\"referenceWind\"),\n        orientation: context.orientation,\n        orientationText: SELECT_LABELS.orientation[context.orientation] || getSelectText(\"orientation\"),\n        panelType: context.panelType,\n        panelTypeText: SELECT_LABELS.panelType[context.panelType] || getSelectText(\"panelType\"),\n        movementFreedom: context.movementFreedom,\n        movementFreedomText: SELECT_LABELS.movementFreedom[context.movementFreedom] || getSelectText(\"movementFreedom\")\n      },\n      results,\n      ref,\n      band,\n      verdict\n    };\n    renderPrintReport(lastReport);\n    return true;\n  }\n\n  function reset(){\n    document.getElementById(\"paintType\").value = \"\";\n    document.getElementById(\"colorName\").value = \"\";\n    document.getElementById(\"tsr\").value = \"\";\n    document.getElementById(\"emissivity\").value = \"\";\n    document.getElementById(\"referenceWind\").value = \"12\";\n    document.getElementById(\"orientation\").value = \"general\";\n    document.getElementById(\"panelType\").value = \"general\";\n    document.getElementById(\"movementFreedom\").value = \"general\";\n    const errorBox = document.getElementById(\"solarisError\");\n    errorBox.style.display = \"none\";\n    errorBox.textContent = \"\";\n    lastReport = null;\n    const report = document.getElementById(\"solarisPrintReport\");\n    if (report) report.innerHTML = \"\";\n    renderBlank();\n  }\n\n  return { calculate, reset, renderBlank, printReport };\n})();\n\ndocument.addEventListener(\"DOMContentLoaded\", Solaris.renderBlank);\n<\/script>\n\n<article class=\"article-nvlopmedia\">\n<section class=\"solaris-app\" id=\"solarisApp\">\n  <div class=\"solaris-hero\">\n    <div class=\"solaris-eyebrow\">Solaris 1.1<\/div>\n    <h2>Calculatrice de temp\u00e9rature de surface des t\u00f4les m\u00e9talliques pr\u00e9peintes<\/h2>\n    <p>Estimez la temp\u00e9rature maximale de surface et l\u2019indice SRI d\u2019un panneau m\u00e9tallique selon les param\u00e8tres solaires du fini : TSR, \u00e9missivit\u00e9, convection thermique et contexte d\u2019exposition.<\/p>\n  <\/div>\n\n  <div class=\"solaris-body\">\n    <div class=\"solaris-panel\">\n      <h3>Donn\u00e9es d\u2019entr\u00e9e<\/h3>\n\n      <div class=\"solaris-field\">\n        <label for=\"paintType\">Type de peinture<\/label>\n        <select id=\"paintType\">\n          <option value=\"\">S\u00e9lectionner&#8230;<\/option>\n          <option>PVDF<\/option>\n          <option>SMP<\/option>\n          <option>Polyester silicon\u00e9<\/option>\n          <option>Autres<\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"solaris-field\">\n        <label for=\"colorName\">Nom de couleur<\/label>\n        <input id=\"colorName\" type=\"text\" placeholder=\"Ex. Rouge colonial, Fusain, Blanc r\u00e9gal...\">\n      <\/div>\n\n      <div class=\"solaris-grid\">\n        <div class=\"solaris-field\">\n          <label for=\"tsr\">TSR<\/label>\n          <input id=\"tsr\" type=\"number\" step=\"0.01\" min=\"0\" max=\"1\" placeholder=\"Ex. 0.25\">\n          <small>Reflectance solaire totale, entre 0 et 1.<\/small>\n        <\/div>\n\n        <div class=\"solaris-field\">\n          <label for=\"emissivity\">\u00c9missivit\u00e9 \u03b5<\/label>\n          <input id=\"emissivity\" type=\"number\" step=\"0.01\" min=\"0\" max=\"1\" placeholder=\"Ex. 0.87\">\n          <small>\u00c9missivit\u00e9 thermique du fini, entre 0 et 1.<\/small>\n        <\/div>\n      <\/div>\n\n      <div class=\"solaris-field\">\n        <label for=\"referenceWind\">Condition de r\u00e9f\u00e9rence pour le verdict<\/label>\n        <select id=\"referenceWind\">\n          <option value=\"12\" selected=\"\">Conditions \u00e9oliennes moyennes \u2014 hc = 12 W\/m\u00b2K<\/option>\n          <option value=\"5\">Conditions \u00e9oliennes faibles \u2014 hc = 5 W\/m\u00b2K<\/option>\n          <option value=\"30\">Conditions \u00e9oliennes fortes \u2014 hc = 30 W\/m\u00b2K<\/option>\n        <\/select>\n        <small>Les trois conditions sont calcul\u00e9es. Le verdict utilise la condition choisie ici.<\/small>\n      <\/div>\n\n      <div class=\"solaris-optional\">\n        <h4>Param\u00e8tres contextuels optionnels \u2014 Solaris 1.1<\/h4>\n\n        <div class=\"solaris-field\">\n          <label for=\"orientation\">Orientation \/ exposition<\/label>\n          <select id=\"orientation\">\n            <option value=\"general\">Non sp\u00e9cifi\u00e9e<\/option>\n            <option value=\"north\">Fa\u00e7ade nord<\/option>\n            <option value=\"east\">Fa\u00e7ade est<\/option>\n            <option value=\"south\">Fa\u00e7ade sud<\/option>\n            <option value=\"west\">Fa\u00e7ade ouest<\/option>\n            <option value=\"southwest\">Fa\u00e7ade sud-ouest<\/option>\n            <option value=\"lowRoof\">Toiture faible pente \u2264 2:12<\/option>\n            <option value=\"steepRoof\">Toiture forte pente &gt; 2:12<\/option>\n          <\/select>\n          <small>Permet d\u2019ajuster le commentaire technique et l\u2019\u00e9valuation Cool Roof lorsqu\u2019il s\u2019agit d\u2019une toiture.<\/small>\n        <\/div>\n\n        <div class=\"solaris-field\">\n          <label for=\"panelType\">Type de panneau<\/label>\n          <select id=\"panelType\">\n            <option value=\"general\">Non sp\u00e9cifi\u00e9<\/option>\n            <option value=\"flat\">Panneau plat \/ cassette lisse<\/option>\n            <option value=\"ribbed\">Panneau nervur\u00e9 ou profil\u00e9<\/option>\n            <option value=\"standingSeam\">Panneau \u00e0 joint debout<\/option>\n            <option value=\"insulated\">Panneau m\u00e9tallique isol\u00e9 (PMI)<\/option>\n            <option value=\"longSheet\">Longue t\u00f4le continue<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"solaris-field\">\n          <label for=\"movementFreedom\">Libert\u00e9 de mouvement thermique<\/label>\n          <select id=\"movementFreedom\">\n            <option value=\"general\">Non sp\u00e9cifi\u00e9e<\/option>\n            <option value=\"free\">Libre \/ joints bien d\u00e9gag\u00e9s<\/option>\n            <option value=\"partial\">Partiellement restreinte<\/option>\n            <option value=\"restricted\">Fortement restreinte<\/option>\n          <\/select>\n        <\/div>\n      <\/div>\n\n      <div class=\"solaris-actions\">\n        <button class=\"solaris-btn solaris-btn-primary\" type=\"button\" onclick=\"Solaris.calculate()\">Calculer<\/button>\n        <button class=\"solaris-btn solaris-btn-secondary\" type=\"button\" onclick=\"Solaris.reset()\">R\u00e9initialiser<\/button>\n        <button class=\"solaris-btn solaris-btn-print\" type=\"button\" onclick=\"Solaris.printReport()\">Imprimer le rapport<\/button>\n      <\/div>\n\n      <div class=\"solaris-error\" id=\"solarisError\"><\/div>\n\n      <div class=\"solaris-note\">\n        Hypoth\u00e8ses standards : flux solaire 1000 W\/m\u00b2, temp\u00e9rature d\u2019air ambiant 310 K, temp\u00e9rature ambiante du ciel 300 K, conduction thermique non consid\u00e9r\u00e9e.\n      <\/div>\n    <\/div>\n\n    <div class=\"solaris-panel\">\n      <h3>R\u00e9sultats Solaris<\/h3>\n      <div class=\"solaris-results\" id=\"solarisResults\"><\/div>\n      <div id=\"solarisVerdict\" class=\"solaris-verdict empty\"><\/div>\n      <div class=\"solaris-note\">\n        Cet outil fournit une estimation pr\u00e9liminaire d\u2019aide \u00e0 la conception. Il ne remplace pas une analyse compl\u00e8te du syst\u00e8me de fa\u00e7ade, des tol\u00e9rances de support, des fixations, des joints de dilatation et des conditions r\u00e9elles d\u2019exposition. La mention ENERGY STAR pour les produits de toiture n\u2019est plus une certification active; toute r\u00e9f\u00e9rence \u00e0 ENERGY STAR dans cet outil doit \u00eatre comprise comme un rep\u00e8re historique de performance solaire.\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <footer class=\"solaris-footer\" aria-label=\"Mention de droit d\u2019auteur et avertissement technique\">\n    <p><strong>Solaris 1.1 \u2014 Outil d\u00e9velopp\u00e9 par Sphenix Mperia \/ NVLOPMEDIA.<\/strong><\/p>\n    <p><strong>\u00a9 2026 Sphenix Mperia. Tous droits r\u00e9serv\u00e9s.<\/strong> Cet outil est offert gratuitement \u00e0 des fins informatives, p\u00e9dagogiques et pr\u00e9liminaires. Les calculs sont bas\u00e9s sur les sp\u00e9cifications et directives de la norme ASTM E1980-24.Toute reproduction, redistribution, modification, extraction du code, republication ou int\u00e9gration commerciale non autoris\u00e9e est interdite.<\/p>\n    <p><strong>Avertissement technique :<\/strong> les r\u00e9sultats fournis par Solaris sont des estimations bas\u00e9es sur les param\u00e8tres saisis par l\u2019utilisateur et sur des hypoth\u00e8ses thermiques simplifi\u00e9es. Ils ne remplacent pas une analyse compl\u00e8te de conception, une validation du fabricant, ni le jugement professionnel d\u2019un ing\u00e9nieur ou d\u2019un sp\u00e9cialiste de l\u2019enveloppe du b\u00e2timent. L\u2019utilisateur demeure responsable de v\u00e9rifier les donn\u00e9es de produit, les conditions r\u00e9elles d\u2019exposition, les tol\u00e9rances de support, les fixations, les joints de dilatation et les exigences applicables au projet.<\/p>\n  <\/footer>\n\n<\/section>\n  <section id=\"solarisPrintReport\" class=\"solaris-print-report\" aria-hidden=\"true\"><\/section>\n<\/article>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Solaris 1.1 Calculatrice de temp\u00e9rature de surface des t\u00f4les m\u00e9talliques pr\u00e9peintes Estimez la temp\u00e9rature maximale de surface et l\u2019indice SRI d\u2019un panneau m\u00e9tallique selon les param\u00e8tres solaires du fini : TSR, \u00e9missivit\u00e9, convection thermique et contexte d\u2019exposition. Donn\u00e9es d\u2019entr\u00e9e Type de peinture S\u00e9lectionner&#8230;PVDFSMPPolyester silicon\u00e9Autres Nom de couleur TSR Reflectance solaire totale, entre 0 et 1. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1069","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.nvlopmedia.ca\/index.php?rest_route=\/wp\/v2\/pages\/1069","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nvlopmedia.ca\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.nvlopmedia.ca\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.nvlopmedia.ca\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nvlopmedia.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1069"}],"version-history":[{"count":21,"href":"https:\/\/www.nvlopmedia.ca\/index.php?rest_route=\/wp\/v2\/pages\/1069\/revisions"}],"predecessor-version":[{"id":1220,"href":"https:\/\/www.nvlopmedia.ca\/index.php?rest_route=\/wp\/v2\/pages\/1069\/revisions\/1220"}],"wp:attachment":[{"href":"https:\/\/www.nvlopmedia.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1069"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}