.cbx{
    --cbx-ink: var(--ink);
    --cbx-mut: var(--muted);
    --cbx-line: var(--rule-soft);
    --cbx-bg: var(--page);
    --cbx-card: var(--card);
    --cbx-ind: var(--blue);
    --cbx-soft: var(--wash);
    --cbx-deep: var(--ink);
    --cbx-good: #059669;
    --cbx-bad: #dc2626;
    --cbx-font-body: var(--sans);
    --cbx-font-head: var(--sans);
    --cbx-h1: 4.5rem;
    --cbx-h2: 2.5rem;
    --cbx-maxw: 1120px;
    color: var(--cbx-ink);
    background: var(--cbx-bg);
    font-family: var(--cbx-font-body);
    line-height: 1.55;
    font-weight: 400;
    text-align: left;
  }
.cbx *{
    box-sizing: border-box;
  }
.cbx h1,.cbx h2,.cbx h3{
    font-family: var(--cbx-font-head);
  }
.cbx b,.cbx strong{
    font-weight: 700;
  }
.cbx i,.cbx em{
    font-style: italic;
  }
.cbx a{
    color: var(--cbx-ind);
    text-decoration: underline;
  }
.cbx .wrap{
    max-width: var(--cbx-maxw);
    margin: 0 auto;
    padding: 0 22px;
  }
.cbx header.hero{
    background: var(--page);
    padding: 64px 0 40px;
    text-align: center;
  }
.cbx header .cbx-tag{
    font-size: 1.05rem;
    color: var(--text);
    margin-bottom: 10px;
  }
.cbx header h1{
    font-size: clamp(2.6rem, 6vw, var(--cbx-h1));
    line-height: 0.92;
    margin: 2px auto 20px;
    letter-spacing: -0.02em;
    font-weight: 500;
    max-width: 20ch;
  }
.cbx header .dek{
    max-width: 760px;
    margin: 0 auto;
    font-size: 1.05rem;
    color: var(--text);
  }
.cbx h2{
    font-size: var(--cbx-h2);
    margin: 8px 0 10px;
    letter-spacing: -0.015em;
    font-weight: 500;
    line-height: 1.1;
  }
.cbx h2 .n{
    color: var(--cbx-ind);
    margin-right: 10px;
    font-variant-numeric: tabular-nums;
  }
.cbx h3{
    font-size: 1.4rem;
    margin: 26px 0 8px;
    font-weight: 500;
    line-height: 1.2;
    letter-spacing: -0.01em;
  }
.cbx section{
    padding: 34px 0;
    border-bottom: 1px solid var(--cbx-line);
  }
.cbx .lead{
    color: var(--text);
    margin: 0 0 14px;
    font-size: 1.05rem;
  }
.cbx p{
    font-size: 1rem;
    line-height: 1.55;
    color: var(--text);
    margin: 0 0 12px;
  }
.cbx code{
    background: var(--cbx-soft);
    color: var(--cbx-ind);
    padding: 1px 5px;
    border-radius: 0;
    font-family: ui-monospace, Menlo, monospace;
    font-size: 0.88em;
  }
.cbx .card{
    background: var(--cbx-card);
    border: 1px solid var(--cbx-line);
    border-radius: 0;
    padding: 18px;
    margin: 14px 0;
  }
.cbx details.card > summary{
    cursor: pointer;
    list-style: none;
    font-size: 1rem;
    color: var(--ink);
  }
.cbx details.card > summary::-webkit-details-marker{
    display: none;
  }
.cbx details.card > summary:after{
    content: '+';
    float: right;
    color: var(--cbx-mut);
    font-weight: 700;
  }
.cbx details.card[open] > summary:after{
    content: '-';
  }
.cbx details.card[open] > summary{
    margin-bottom: 12px;
  }
.cbx .grid2{
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 16px;
  }
.cbx .grid2 > *{
    min-width: 0;
  }
.cbx svg{
    max-width: 100%;
  }
.cbx svg text{
    font-family: var(--cbx-font-body);
  }
.cbx .cap{
    color: var(--cbx-mut);
    font-size: 12.5px;
    margin-top: 8px;
  }
.cbx table{
    border-collapse: collapse;
    width: 100%;
    font-size: 12.5px;
  }
.cbx th,.cbx td{
    border-bottom: 1px solid var(--cbx-line);
    padding: 6px 9px;
    text-align: right;
    white-space: nowrap;
  }
.cbx th:first-child,.cbx td:first-child{
    text-align: left;
  }
.cbx th{
    background: var(--cbx-bg);
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    color: var(--cbx-mut);
  }
.cbx tr:hover td{
    background: var(--cbx-bg);
  }
.cbx .scroll{
    overflow-x: auto;
  }
.cbx .note{
    background: color-mix(in srgb, var(--ok) 9%, var(--card));
    border: 1px solid color-mix(in srgb, var(--ok) 32%, var(--card));
    border-radius: 0;
    padding: 13px 16px;
    font-size: 13.5px;
    color: var(--ok);
    margin: 14px 0;
  }
.cbx .note.amber{
    background: color-mix(in srgb, #f59e0b 10%, var(--card));
    border-color: color-mix(in srgb, #f59e0b 38%, var(--card));
    color: var(--cbx-amber);
  }
.cbx .note.blue{
    background: var(--wash);
    border-color: var(--blue-100);
    color: var(--blue);
  }
.cbx .tier{
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 8px 14px;
    margin: 40px 0 6px;
    padding-bottom: 9px;
    border-bottom: 2px solid var(--cbx-line);
  }
.cbx .tier .tb{
    font-size: 12.5px;
    font-weight: 800;
    letter-spacing: 0.07em;
    color: var(--card);
    padding: 5px 12px;
    border-radius: 0;
    white-space: nowrap;
  }
.cbx .tier .td{
    font-size: 14px;
    color: var(--cbx-mut);
  }
.cbx .tier.t1 .tb{
    background: var(--blue);
  }
.cbx .tier.t2 .tb{
    background: var(--cbx-amber);
  }
.cbx .tier.t3 .tb{
    background: var(--ok);
  }
.cbx #iv-tip{
    position: absolute;
    display: none;
    pointer-events: none;
    z-index: 20;
    background: var(--cbx-card);
    border: 1px solid var(--cbx-line);
    border-radius: 0;
    box-shadow: 0 8px 28px rgba(0, 0, 0, 0.14);
    padding: 11px 13px;
    min-width: 198px;
  }
.cbx .kpis{
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: 12px;
    margin: 10px 0;
  }
.cbx .kpi{
    background: var(--cbx-card);
    border: 1px solid var(--cbx-line);
    border-radius: 0;
    padding: 16px;
  }
.cbx .kpi .v{
    font-size: 26px;
    font-weight: 700;
    letter-spacing: -0.5px;
    font-family: var(--cbx-font-head);
  }
.cbx .kpi .l{
    font-size: 12px;
    color: var(--cbx-mut);
    margin-top: 2px;
  }
.cbx .legend{
    display: flex;
    gap: 14px;
    flex-wrap: wrap;
    font-size: 12px;
    color: var(--cbx-mut);
    margin: 8px 0 2px;
  }
.cbx .legend span{
    display: inline-flex;
    align-items: center;
    gap: 5px;
  }
.cbx .legend .sw{
    width: 11px;
    height: 11px;
    border-radius: 0;
    display: inline-block;
  }
.cbx .flowcard{
    background: var(--card);
    border: 1px solid var(--cbx-line);
    border-radius: 0;
    padding: 16px;
    margin: 18px 0;
  }
.cbx .flowtitle{
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    margin: 0 0 10px;
  }
.cbx .flowtitle h3{
    margin: 0;
    font-size: 1.18rem;
  }
.cbx .flowtitle span{
    font-size: 12px;
    color: var(--cbx-mut);
  }
.cbx .flowbox{
    fill: var(--card);
    stroke: var(--rule);
    stroke-width: 1.2;
  }
.cbx .flowbox.agent{
    fill: var(--wash);
    stroke: var(--blue-100);
  }
.cbx .flowbox.adapter{
    fill: color-mix(in srgb, #f59e0b 10%, var(--card));
    stroke: color-mix(in srgb, #f59e0b 38%, var(--card));
  }
.cbx .flowbox.engine{
    fill: color-mix(in srgb, var(--ok) 9%, var(--card));
    stroke: color-mix(in srgb, var(--ok) 32%, var(--card));
  }
.cbx .flowbox.native{
    fill: var(--page);
    stroke: var(--rule);
  }
.cbx .flowbox.schema{
    fill: color-mix(in srgb, #a855f7 8%, var(--card));
    stroke: color-mix(in srgb, #a855f7 35%, var(--card));
  }
.cbx .flowlabel{
    font-size: 13px;
    font-weight: 700;
    fill: var(--ink);
  }
.cbx .flowsub{
    font-size: 10.8px;
    fill: var(--text);
  }
.cbx .flowarrow{
    stroke: var(--text);
    stroke-width: 1.6;
    fill: none;
    marker-end: url(#arrow);
  }
.cbx .flowarrow.blue{
    stroke: var(--blue);
  }
.cbx .flowarrow.amber{
    stroke: var(--cbx-amber);
  }
.cbx .flowbadge{
    font-size: 10px;
    font-weight: 700;
    fill: var(--blue);
  }
.cbx .flowmini{
    font-size: 10px;
    fill: var(--muted);
  }
.cbx .pill{
    display: inline-block;
    padding: 1px 8px;
    border-radius: 0;
    font-size: 11px;
    font-weight: 600;
  }
.cbx ul{
    margin: 0 0 12px;
    padding-left: 22px;
  }
.cbx li{
    margin: 4px 0;
    line-height: 1.5;
    font-size: 1rem;
    color: var(--text);
  }
.cbx footer{
    padding: 28px 0;
    color: var(--cbx-mut);
    font-size: 12.5px;
  }
@media (max-width: 900px){.cbx .grid2{
      grid-template-columns: minmax(0, 1fr);
    }

  }
@media (max-width: 767px){.cbx{
      --cbx-h2: 1.9rem;
    }
.cbx .wrap{
      padding: 0 16px;
    }
.cbx p,.cbx li{
      font-size: 0.9rem;
    }
.cbx section{
      padding: 24px 0;
    }

  }


/* ---- site skin ---- */
.cbx{--cbx-ink:var(--ink);--cbx-mut:var(--muted);--cbx-line:var(--rule-soft);--cbx-bg:var(--page);--cbx-card:var(--card);--cbx-ind:var(--blue);--cbx-soft:var(--wash);--cbx-deep:var(--ink);--cbx-good:var(--ok);--cbx-bad:var(--cbx-bad);--cbx-font-body:var(--sans);--cbx-font-head:var(--sans);--cbx-amber:#b45309;--cbx-bad:#c62828;background:transparent;color:var(--text);font-family:var(--sans)}
.iso[data-theme="dark"] .cbx{--cbx-amber:#f5a524;--cbx-bad:#f87171}
.cbx [fill="#000" i]{fill:var(--ink)}.cbx [stroke="#000" i]{stroke:var(--ink)}.cbx [fill="#000000" i]{fill:var(--ink)}.cbx [stroke="#000000" i]{stroke:var(--ink)}.cbx [fill="#111827" i]{fill:var(--ink)}.cbx [stroke="#111827" i]{stroke:var(--ink)}.cbx [fill="#0f172a" i]{fill:var(--ink)}.cbx [stroke="#0f172a" i]{stroke:var(--ink)}.cbx [fill="#222d53" i]{fill:var(--ink)}.cbx [stroke="#222d53" i]{stroke:var(--ink)}.cbx [fill="#1b2333" i]{fill:var(--ink)}.cbx [stroke="#1b2333" i]{stroke:var(--ink)}.cbx [fill="#334155" i]{fill:var(--text)}.cbx [stroke="#334155" i]{stroke:var(--text)}.cbx [fill="#475569" i]{fill:var(--text)}.cbx [stroke="#475569" i]{stroke:var(--text)}.cbx [fill="#4b5563" i]{fill:var(--text)}.cbx [stroke="#4b5563" i]{stroke:var(--text)}.cbx [fill="#374151" i]{fill:var(--text)}.cbx [stroke="#374151" i]{stroke:var(--text)}.cbx [fill="#687193" i]{fill:var(--muted)}.cbx [stroke="#687193" i]{stroke:var(--muted)}.cbx [fill="#64748b" i]{fill:var(--muted)}.cbx [stroke="#64748b" i]{stroke:var(--muted)}.cbx [fill="#94a3b8" i]{fill:var(--muted)}.cbx [stroke="#94a3b8" i]{stroke:var(--muted)}.cbx [fill="#98a2b3" i]{fill:var(--muted)}.cbx [stroke="#98a2b3" i]{stroke:var(--muted)}.cbx [fill="#a5abc2" i]{fill:var(--muted)}.cbx [stroke="#a5abc2" i]{stroke:var(--muted)}.cbx [fill="#cbd5e1" i]{fill:var(--rule)}.cbx [stroke="#cbd5e1" i]{stroke:var(--rule)}.cbx [fill="#d7dbe8" i]{fill:var(--rule)}.cbx [stroke="#d7dbe8" i]{stroke:var(--rule)}.cbx [fill="#dbe1e8" i]{fill:var(--rule)}.cbx [stroke="#dbe1e8" i]{stroke:var(--rule)}.cbx [fill="#dbe3ef" i]{fill:var(--rule)}.cbx [stroke="#dbe3ef" i]{stroke:var(--rule)}.cbx [fill="#e6e8e7" i]{fill:var(--rule-soft)}.cbx [stroke="#e6e8e7" i]{stroke:var(--rule-soft)}.cbx [fill="#e2e8f0" i]{fill:var(--rule-soft)}.cbx [stroke="#e2e8f0" i]{stroke:var(--rule-soft)}.cbx [fill="#e2e5ef" i]{fill:var(--rule-soft)}.cbx [stroke="#e2e5ef" i]{stroke:var(--rule-soft)}.cbx [fill="#eef0f4" i]{fill:var(--rule-soft)}.cbx [stroke="#eef0f4" i]{stroke:var(--rule-soft)}.cbx :is(rect,circle,path,polygon,line,polyline,ellipse)[fill="#fff" i]{fill:var(--card)}.cbx [stroke="#fff" i]{stroke:var(--card)}.cbx :is(rect,circle,path,polygon,line,polyline,ellipse)[fill="#ffffff" i]{fill:var(--card)}.cbx [stroke="#ffffff" i]{stroke:var(--card)}.cbx [fill="#f7f8fc" i]{fill:var(--page)}.cbx [stroke="#f7f8fc" i]{stroke:var(--page)}.cbx [fill="#f8fafc" i]{fill:var(--page)}.cbx [stroke="#f8fafc" i]{stroke:var(--page)}.cbx [fill="#fafbff" i]{fill:var(--page)}.cbx [stroke="#fafbff" i]{stroke:var(--page)}.cbx [fill="#f0f2f7" i]{fill:var(--page)}.cbx [stroke="#f0f2f7" i]{stroke:var(--page)}.cbx [fill="#f1f2f9" i]{fill:var(--wash)}.cbx [stroke="#f1f2f9" i]{stroke:var(--wash)}.cbx [fill="#f1f5f9" i]{fill:var(--wash)}.cbx [stroke="#f1f5f9" i]{stroke:var(--wash)}.cbx [fill="#eef2ff" i]{fill:var(--wash)}.cbx [stroke="#eef2ff" i]{stroke:var(--wash)}.cbx [fill="#f4f7ff" i]{fill:var(--wash)}.cbx [stroke="#f4f7ff" i]{stroke:var(--wash)}.cbx [fill="#eff5ff" i]{fill:var(--wash)}.cbx [stroke="#eff5ff" i]{stroke:var(--wash)}.cbx [fill="#052699" i]{fill:var(--blue)}.cbx [stroke="#052699" i]{stroke:var(--blue)}.cbx [fill="#0d45d8" i]{fill:var(--blue)}.cbx [stroke="#0d45d8" i]{stroke:var(--blue)}.cbx [fill="#1e40af" i]{fill:var(--blue)}.cbx [stroke="#1e40af" i]{stroke:var(--blue)}.cbx [fill="#4f46e5" i]{fill:var(--blue)}.cbx [stroke="#4f46e5" i]{stroke:var(--blue)}.cbx [fill="#3730a3" i]{fill:var(--blue)}.cbx [stroke="#3730a3" i]{stroke:var(--blue)}.cbx [fill="#bfdbfe" i]{fill:var(--blue-100)}.cbx [stroke="#bfdbfe" i]{stroke:var(--blue-100)}.cbx [fill="#c7d2fe" i]{fill:var(--blue-100)}.cbx [stroke="#c7d2fe" i]{stroke:var(--blue-100)}.cbx [fill="#e0e7ff" i]{fill:var(--blue-100)}.cbx [stroke="#e0e7ff" i]{stroke:var(--blue-100)}.cbx [fill="#b8c7ff" i]{fill:var(--blue-100)}.cbx [stroke="#b8c7ff" i]{stroke:var(--blue-100)}.cbx [fill="#a5b4fc" i]{fill:var(--blue-100)}.cbx [stroke="#a5b4fc" i]{stroke:var(--blue-100)}.cbx [fill="#047857" i]{fill:var(--ok)}.cbx [stroke="#047857" i]{stroke:var(--ok)}.cbx [fill="#166534" i]{fill:var(--ok)}.cbx [stroke="#166534" i]{stroke:var(--ok)}.cbx [fill="#ecfdf5" i]{fill:color-mix(in srgb, var(--ok) 9%, var(--card))}.cbx [stroke="#ecfdf5" i]{stroke:color-mix(in srgb, var(--ok) 9%, var(--card))}.cbx [fill="#f0fdf4" i]{fill:color-mix(in srgb, var(--ok) 9%, var(--card))}.cbx [stroke="#f0fdf4" i]{stroke:color-mix(in srgb, var(--ok) 9%, var(--card))}.cbx [fill="#f0fdf7" i]{fill:color-mix(in srgb, var(--ok) 9%, var(--card))}.cbx [stroke="#f0fdf7" i]{stroke:color-mix(in srgb, var(--ok) 9%, var(--card))}.cbx [fill="#a7f3d0" i]{fill:color-mix(in srgb, var(--ok) 32%, var(--card))}.cbx [stroke="#a7f3d0" i]{stroke:color-mix(in srgb, var(--ok) 32%, var(--card))}.cbx [fill="#bbf7d0" i]{fill:color-mix(in srgb, var(--ok) 32%, var(--card))}.cbx [stroke="#bbf7d0" i]{stroke:color-mix(in srgb, var(--ok) 32%, var(--card))}.cbx [fill="#9ee6bd" i]{fill:color-mix(in srgb, var(--ok) 32%, var(--card))}.cbx [stroke="#9ee6bd" i]{stroke:color-mix(in srgb, var(--ok) 32%, var(--card))}.cbx [fill="#92400e" i]{fill:var(--cbx-amber)}.cbx [stroke="#92400e" i]{stroke:var(--cbx-amber)}.cbx [fill="#b45309" i]{fill:var(--cbx-amber)}.cbx [stroke="#b45309" i]{stroke:var(--cbx-amber)}.cbx [fill="#fffbeb" i]{fill:color-mix(in srgb, #f59e0b 10%, var(--card))}.cbx [stroke="#fffbeb" i]{stroke:color-mix(in srgb, #f59e0b 10%, var(--card))}.cbx [fill="#fff8ed" i]{fill:color-mix(in srgb, #f59e0b 10%, var(--card))}.cbx [stroke="#fff8ed" i]{stroke:color-mix(in srgb, #f59e0b 10%, var(--card))}.cbx [fill="#fde68a" i]{fill:color-mix(in srgb, #f59e0b 38%, var(--card))}.cbx [stroke="#fde68a" i]{stroke:color-mix(in srgb, #f59e0b 38%, var(--card))}.cbx [fill="#f2c27b" i]{fill:color-mix(in srgb, #f59e0b 38%, var(--card))}.cbx [stroke="#f2c27b" i]{stroke:color-mix(in srgb, #f59e0b 38%, var(--card))}.cbx [fill="#fdf3f3" i]{fill:color-mix(in srgb, var(--cbx-bad) 7%, var(--card))}.cbx [stroke="#fdf3f3" i]{stroke:color-mix(in srgb, var(--cbx-bad) 7%, var(--card))}.cbx [fill="#f4cccc" i]{fill:color-mix(in srgb, var(--cbx-bad) 30%, var(--card))}.cbx [stroke="#f4cccc" i]{stroke:color-mix(in srgb, var(--cbx-bad) 30%, var(--card))}.cbx [fill="#faf5ff" i]{fill:color-mix(in srgb, #a855f7 8%, var(--card))}.cbx [stroke="#faf5ff" i]{stroke:color-mix(in srgb, #a855f7 8%, var(--card))}.cbx [fill="#d8b4fe" i]{fill:color-mix(in srgb, #a855f7 35%, var(--card))}.cbx [stroke="#d8b4fe" i]{stroke:color-mix(in srgb, #a855f7 35%, var(--card))}
