/* Sentinel v2 - fx.css: the few rules fx.js needs around its canvases (the light and the orb, the owner's two effects).
   Ported from libraries.dev by Jakub Antalik, MIT License: border-beam (the light) and thinking-orbs (the orb); the notices are in
   v2/fx.LICENSE.txt and THIRD-PARTY.md.

   .sfx-beam        the light's two canvases at the end of the host (fx.js sets their offsets, sizes and blend): the glow
                    (.sfx-beam-soft) and over it the 1 px edge. z-index auto: they paint over the host's own content, blended into
                    it, and under anything positioned that follows; the host gets no stacking context. Decorative: no pointer
                    events. 0 x 0 before the first measure, so they never push the layout.
   .sfx-beam-pos    put only on a host that is position: static, so the canvases can be placed against it
   .sfx-orb         the orb's canvas (fx.js sets its size); on the text's middle, never shrinks in a flex row
   .sfx-orb-inline  a host <span> in running text; .sfx-orb-chip a quiet status pill: orb + words
   .sfx-sheen       a label read while the work goes on: a soft light passes over its words

   Always moving, as fx.js: nothing here reads the operating system's motion setting (the owner, 2026-10-15). A printed page gets no
   canvas (it would print one frozen frame). */

.sfx-beam-pos {
  position: relative;
}

.sfx-beam {
  position: absolute;
  display: block;
  left: 0;
  top: 0;
  width: 0;
  height: 0;
  z-index: auto;
  margin: 0;
  padding: 0;
  border: 0;
  max-width: none;
  max-height: none;
  min-width: 0;
  min-height: 0;
  pointer-events: none;
  user-select: none;
  contain: strict;
}

@media print {
  .sfx-beam {
    display: none;
  }
}

.sfx-orb {
  display: inline-block;
  vertical-align: middle;
  flex: none;
}

.sfx-orb-inline {
  display: inline-flex;
  vertical-align: -0.22em;
  margin-right: 0.45em;
  line-height: 0;
}
/* the canvas as a block, so the box's baseline is its bottom edge (an inline canvas would set it mid-orb) */
.sfx-orb-inline .sfx-orb {
  display: block;
}

.sfx-orb-chip {
  display: inline-flex;
  align-items: center;
  gap: var(--space-6, 6px);
  height: 26px;
  padding: 0 var(--space-12, 12px) 0 var(--space-6, 6px);
  border-radius: var(--radius-pill, 999px);
  background: var(--surface-card, #fff);
  box-shadow: inset 0 0 0 1px var(--line-2, #e6e0d2);
  color: var(--ink-2, #4a515e);
  font-size: var(--fs-label, 12px);
  line-height: var(--lh-label, 16px);
  white-space: nowrap;
}

.sfx-sheen {
  color: var(--ink-2, #4a515e);
  background-image: linear-gradient(90deg,
    var(--ink-3, #59626e) 0%, var(--ink-3, #59626e) 41%,
    var(--ink-1, #1a2330) 50%,
    var(--ink-3, #59626e) 59%, var(--ink-3, #59626e) 100%);
  background-size: 300% 100%;
  background-repeat: no-repeat;
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  /* 96 steps: the light moves 30 times a second - as smooth to the eye, a third of the repaints */
  animation: sfx-sheen 3.2s steps(96) infinite;
}
.sfx-sheen::selection {
  -webkit-text-fill-color: var(--selection-ink, currentColor);
}
/* off screen or not displayed (the module's IntersectionObserver sets it; SentinelFx.orb.sheen / scan register a
   label): the light holds still where nobody sees it, and moves again when seen */
.sfx-sheen[data-sfx-rest] {
  animation-play-state: paused;
}

@keyframes sfx-sheen {
  from { background-position: 100% 0; }
  to { background-position: 0% 0; }
}
