/* ==========================================================================
   Orbit Skin · REUSABLE PRIMITIVES LAYER
   --------------------------------------------------------------------------
   A non-destructive "translation layer" that maps the app's LEGACY class
   names (Bootstrap / DataTables / egk-*) onto the Orbit design-system tokens
   defined in assets/user-defined/design-system/ds.css.

   • Defines NO new design values — every property is var(--ds-*) from ds.css,
     so ds.css stays the single source of truth for the look.
   • Scoped under `.ds-skin`. Today that class sits on the Orbit dashboard
     wrapper. To roll the new look out app-wide later, put `class="ds-skin"`
     on <body> in _Layout (behind a setting) — these primitives then apply
     everywhere, screen by screen, reversibly.
   • Follows the app's light/dark `data-theme` automatically (ds.css redefines
     --ds-* under [data-theme="dark"]).

   Neumorphic recipe (per ds.css): raised element bg == canvas, NO border,
   relief = --ds-shadow-neu (layered drop shadow + inset white top edge).

   Covered primitives:
     base · cards(.egk-panel) · panel head/title · tabs(.nav-tabs) ·
     tables + DataTables chrome · forms · buttons · dropdowns ·
     karne KPI rows · misc text · scrollbars · search/typeahead (.cari-ara)
   ========================================================================== */

/* ==========================================================================
   0. BASE / CANVAS  (applies to the scope root — a wrapper now, <body> later)
   ========================================================================== */
.ds-skin {
  font-family: var(--ds-font-body);
  font-size: var(--ds-text-body-sm);
  line-height: var(--ds-lh-normal);
  color: var(--ds-text-1);
  background: var(--ds-surface-page);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}
.ds-skin a { color: inherit; }
.ds-skin h1, .ds-skin h2, .ds-skin h3,
.ds-skin h4, .ds-skin h5, .ds-skin h6 {
  font-family: var(--ds-font-heading);
  color: var(--ds-text-1);
}
.ds-skin hr { border-color: var(--ds-border-hairline); }

/* ==========================================================================
   1. CARD  (.egk-panel) — the signature raised neumorphic surface
   ========================================================================== */
.ds-skin .egk-panel {
  background: var(--ds-surface);
  background-image: var(--ds-gradient-raise);
  border: none;
  border-top: none;                 /* kill the production theme-color top rule */
  border-radius: var(--ds-radius-card);
  box-shadow: var(--ds-shadow-neu);
  padding: var(--ds-card-pad);
  margin-bottom: var(--ds-gap);
  transition: box-shadow var(--ds-duration-base) var(--ds-ease-spring),
              transform var(--ds-duration-moderate) var(--ds-ease-spring);
}
.ds-skin .egk-panel:hover { box-shadow: var(--ds-shadow-neu-hover); }

.ds-skin .collapse,
.ds-skin .collapse.in { background: transparent; }

/* ==========================================================================
   2. PANEL HEADING / TITLE
   ========================================================================== */
.ds-skin .panel-heading:not(.nav-tabs) {
  padding: 0 0 var(--ds-space-4) !important;
  margin: 0;
  border: none;
  background: transparent;
  box-shadow: none;
}
.ds-skin .panel-heading .panel-title,
.ds-skin .panel-title {
  font-family: var(--ds-font-heading) !important;
  font-size: var(--ds-text-h5) !important;
  font-weight: var(--ds-fw-semibold) !important;
  letter-spacing: var(--ds-ls-h5);
  color: var(--ds-text-1) !important;
  padding: 0 !important;
  margin: 0 !important;
  line-height: var(--ds-lh-snug);
}
/* section/title icons carry the brand hue (contrast-clamped for pale tenants) */
.ds-skin .panel-heading i,
.ds-skin .panel-heading svg { color: var(--theme-color-ink, var(--theme-color)) !important; }

/* ==========================================================================
   3. TABS  (.nav-tabs / .line-slide-tab)  → contained neumorphic pill
      A raised pill that HUGS its tabs (content-width, never full-width); the
      active tab is marked by a full-width square underline pinned to the
      pill's bottom edge.  Mirrors ds .ds-tabs / the orbAI pricing toggle.
   ========================================================================== */
.ds-skin .nav-tabs {
  display: inline-flex;
  flex-wrap: wrap;
  align-items: stretch;
  align-self: flex-start;          /* don't stretch inside a column-flex parent (.line-slide-tab) */
  width: fit-content;              /* hug the tabs — never span the panel width */
  max-width: 100%;
  gap: var(--ds-space-1);
  border: none !important;
  border-radius: var(--ds-radius-pill);
  padding: 0 var(--ds-space-2);    /* no vertical padding → tab fills pill height, underline reaches the bottom */
  margin: 0 0 var(--ds-space-4) 0;
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu);
}
.ds-skin .nav.nav-tabs { margin-bottom: var(--ds-space-4); }
.ds-skin .nav-tabs.panel-heading { margin-bottom: var(--ds-space-4); }

.ds-skin .nav-tabs > li { display: inline-flex; margin: 0 !important; float: none; }

.ds-skin .nav-tabs > li > a {
  position: relative;
  display: inline-flex;
  align-items: center;
  border: none !important;
  margin: 0 !important;
  background: transparent;
  color: var(--ds-text-2);
  border-radius: 0;
  padding: var(--ds-space-3) var(--ds-space-4);   /* taller buttons */
  font-size: var(--ds-text-body-sm);
  font-weight: var(--ds-fw-medium);
  line-height: 1.2;
  white-space: nowrap;
  cursor: pointer;
  transition: var(--ds-transition-base);
}
.ds-skin .nav-tabs > li > a:hover,
.ds-skin .nav-tabs > li > a:focus {
  background: transparent;
  color: var(--ds-text-1);
  border: none !important;
}
.ds-skin .nav-tabs > li.active > a,
.ds-skin .nav-tabs > li.active > a:hover,
.ds-skin .nav-tabs > li.active > a:focus,
.ds-skin .line-slide-tab .nav-tabs > li.active > a {
  background: transparent;
  color: var(--ds-text-1);
  box-shadow: none;
  border: none !important;
  border-bottom: none !important;
}
/* active marker: full-width square underline flush with the pill's bottom edge */
.ds-skin .nav-tabs > li.active > a::after {
  content: "";
  position: absolute;
  left: var(--ds-space-4);
  right: var(--ds-space-4);
  bottom: 0;
  height: 2px;
  background: var(--ds-ink);
  border-radius: 0;
}

/* neutralise the production line-slide underline animation (we draw our own marker) */
.ds-skin .line-slide-tab .nav-tabs > li:after,
.ds-skin .line-slide-tab .nav-tabs > li.active:after,
.ds-skin .line-slide-tab .nav-tabs > li:hover:after { display: none !important; }

.ds-skin .tab-content { padding-top: var(--ds-space-1); }
.ds-skin .tab-pane { overflow: visible !important; }

/* ==========================================================================
   4. TABLES  +  DataTables generated controls
   ========================================================================== */
.ds-skin .table-responsive { border: none; }

.ds-skin table.dataTable,
.ds-skin table.table {
  width: 100% !important;
  border-collapse: separate;
  border-spacing: 0;
  background: transparent;
  margin: var(--ds-space-2) 0;
  color: var(--ds-text-1);
}
.ds-skin table.dataTable thead th,
.ds-skin table.table thead th {
  border: none !important;
  border-bottom: var(--ds-bw-hairline) solid var(--ds-border-subtle) !important;
  padding: var(--ds-space-2) var(--ds-space-3) !important;
  font-family: var(--ds-font-body);
  font-size: var(--ds-text-caption);
  font-weight: var(--ds-fw-semibold);
  letter-spacing: var(--ds-ls-eyebrow);
  text-transform: uppercase;
  color: var(--ds-text-3);
  background: transparent;
}
.ds-skin table.dataTable tbody td,
.ds-skin table.table tbody td {
  border: none !important;
  border-bottom: var(--ds-bw-hairline) solid var(--ds-border-hairline) !important;
  padding: var(--ds-space-2-5) var(--ds-space-3) !important;
  font-family: var(--ds-font-body);              /* Inter — matches the header; cells were inheriting production Poppins */
  font-size: var(--ds-text-body-sm);
  font-variant-numeric: tabular-nums;            /* even-width, aligned figures for the money columns */
  color: var(--ds-text-1);
  background: transparent;
  vertical-align: middle;
}
.ds-skin table.dataTable tbody tr:hover td,
.ds-skin table.table.table-hover tbody tr:hover td { background: var(--ds-accent-subtle); }
/* selected row → same quiet accent tint as hover. customize paints tr.selected solid
   theme-green with WHITE text, and its `tr.selected > td:hover` re-solidifies single
   cells — keep the ink readable and the per-cell hover on the row tint. */
.ds-skin table.dataTable tbody tr.selected td { background: var(--ds-accent-subtle); color: var(--ds-text-1) !important; }
.ds-skin table.dataTable tbody tr.selected > td:hover { background: var(--ds-accent-subtle) !important; }
.ds-skin table.dataTable tfoot th,
.ds-skin table.table tfoot th {
  border: none !important;
  border-top: var(--ds-bw-thin) solid var(--ds-border-subtle) !important;
  padding: var(--ds-space-2-5) var(--ds-space-3) !important;
  font-family: var(--ds-font-body);              /* Inter — keep the totals row consistent with the cells */
  font-size: var(--ds-text-body-sm) !important;
  font-variant-numeric: tabular-nums;
  font-weight: var(--ds-fw-semibold);
  color: var(--ds-text-1);
}

.ds-skin .dataTables_wrapper { padding: 0; font-size: var(--ds-text-body-sm); color: var(--ds-text-2); }
.ds-skin .dataTables_wrapper .dataTables_length,
.ds-skin .dataTables_wrapper .dataTables_filter,
.ds-skin .dataTables_wrapper .dataTables_info,
.ds-skin .dataTables_wrapper .dataTables_paginate {
  margin-bottom: var(--ds-space-3);
  color: var(--ds-text-2);
}
.ds-skin .dataTables_wrapper .dataTables_filter input,
.ds-skin .dataTables_wrapper .dataTables_length select {
  background: var(--ds-surface) !important;
  border: none !important;
  border-radius: var(--ds-radius-pill) !important;
  box-shadow: var(--ds-shadow-neu-sm) !important;
  padding: var(--ds-space-1-5) var(--ds-space-4) !important;
  margin-left: var(--ds-space-2);
  color: var(--ds-text-1) !important;
  outline: none;
}
.ds-skin .dataTables_wrapper .dataTables_length select {
  border-radius: var(--ds-radius-md) !important;
  padding-right: var(--ds-space-5) !important;
}
.ds-skin .dataTables_wrapper .dataTables_paginate .paginate_button {
  border: none !important;
  background: var(--ds-surface) !important;
  box-shadow: var(--ds-shadow-neu-sm);
  border-radius: var(--ds-radius-md) !important;
  margin: 0 var(--ds-space-1);
  padding: var(--ds-space-1) var(--ds-space-3) !important;
  color: var(--ds-text-2) !important;
  transition: var(--ds-transition-base);
}
.ds-skin .dataTables_wrapper .dataTables_paginate .paginate_button:hover {
  background: var(--ds-surface) !important;
  color: var(--ds-text-1) !important;
  transform: var(--ds-lift-hover);
  box-shadow: var(--ds-shadow-neu-hover);
}
.ds-skin .dataTables_wrapper .dataTables_paginate .paginate_button.current,
.ds-skin .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
  background: var(--ds-accent) !important;
  color: var(--ds-accent-fg) !important;
  box-shadow: var(--ds-shadow-dark-button);
}
.ds-skin .dataTables_wrapper .dataTables_paginate .paginate_button.disabled,
.ds-skin .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover {
  background: transparent !important;
  box-shadow: none;
  color: var(--ds-ink-disabled) !important;
  transform: none;
}

/* ==========================================================================
   5. FORMS  (.form-control / .input-sm)  → raised neumorphic field
   ========================================================================== */
.ds-skin .form-control,
.ds-skin .input-sm,
.ds-skin select.form-control,
.ds-skin textarea.form-control {
  height: auto;
  background: var(--ds-surface) !important;
  border: none !important;
  border-radius: var(--ds-radius-md) !important;
  box-shadow: var(--ds-shadow-neu-sm) !important;
  padding: var(--ds-space-2) var(--ds-space-3) !important;
  font-family: var(--ds-font-body);   /* beat customize `* { font-family: Poppins }` */
  font-size: var(--ds-text-body-sm);
  color: var(--ds-text-1) !important;
  transition: var(--ds-transition-base);
}
.ds-skin .form-control::placeholder { color: var(--ds-text-3); }
.ds-skin .form-control:focus,
.ds-skin .input-sm:focus {
  border: none !important;
  box-shadow: var(--ds-shadow-neu-sm), 0 0 0 3px var(--orbit-ring) !important;
  outline: none;
}

/* <input type="color"> (Settings tenant colour, MainPage blok form) — as a full-width
   §5/§17 field it renders as a control-height slab of the picked colour. Constrain it
   to a compact swatch: the colour shows through a rounded well inside the neu field. */
.ds-skin input[type="color"] {
  width: 96px !important;
  flex: 0 0 auto;
  padding: var(--ds-space-1-5) !important;
  cursor: pointer;
}
.ds-skin input[type="color"]::-webkit-color-swatch-wrapper { padding: 0; }
.ds-skin input[type="color"]::-webkit-color-swatch {
  border: none;
  border-radius: var(--ds-radius-sm);
}

/* ==========================================================================
   6. BUTTONS  (.btn / .egk-btn / .btn-default / outline / primary)
   ========================================================================== */
.ds-skin .btn,
.ds-skin .egk-btn,
.ds-skin .btn-default,
.ds-skin .egk-btn-outline-primary {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--ds-space-2);
  background: var(--ds-surface) !important;
  color: var(--ds-text-1) !important;
  border: none !important;
  border-radius: var(--ds-radius-btn) !important;
  box-shadow: var(--ds-shadow-neu-sm);
  padding: var(--ds-space-2) var(--ds-space-4);
  font-family: var(--ds-font-body);   /* beat customize `* { font-family: Poppins }` */
  font-size: var(--ds-text-body-sm);
  font-weight: var(--ds-fw-medium);
  line-height: 1.2;
  transition: var(--ds-transition-base);
}
.ds-skin .btn:hover,
.ds-skin .egk-btn:hover,
.ds-skin .btn-default:hover,
.ds-skin .egk-btn-outline-primary:hover {
  animation: none !important;        /* drop the production "gelatine" wobble */
  transform: var(--ds-lift-hover);
  box-shadow: var(--ds-shadow-neu-hover);
  color: var(--ds-text-1) !important;
  background: var(--ds-surface) !important;
}
.ds-skin .btn:active,
.ds-skin .egk-btn:active,
.ds-skin .btn-default:active {
  transform: translateY(0);
  box-shadow: var(--ds-shadow-neu-pressed) !important;
}
.ds-skin .btn i,
.ds-skin .egk-btn i { color: var(--ds-text-2); }

/* primary / accent → solid dark fill */
.ds-skin .egk-btn-primary,
.ds-skin .btn-primary {
  background: var(--ds-accent) !important;
  color: var(--ds-accent-fg) !important;
  box-shadow: var(--ds-shadow-dark-button) !important;
}
.ds-skin .egk-btn-primary:hover,
.ds-skin .btn-primary:hover {
  background: var(--ds-accent) !important;
  color: var(--ds-accent-fg) !important;
  transform: var(--ds-lift-hover);
}
.ds-skin .egk-btn-primary:active,
.ds-skin .btn-primary:active {
  transform: translateY(1px) scale(0.985);
  box-shadow: var(--ds-shadow-dark-pressed) !important;
}
.ds-skin .egk-btn-primary i,
.ds-skin .btn-primary i { color: var(--ds-accent-fg); }

/* semantic OUTLINE buttons (.egk-btn-outline-{success,danger,warning,info,primary})
   — common in action columns (approve / reject / print / edit …). They all carry
   .egk-btn, so the §6 base already gives them the neutral raised surface; this just
   restores the GLYPH's semantic hue (the base rule above greys every .egk-btn i).
   Matches the navbar policy: a quiet neumorphic surface, meaning carried by the
   coloured glyph. Surface stays neutral; only the icon (and its hover) takes the
   hue, so the soft-UI look holds while approve/reject stay readable at a glance. */
.ds-skin .egk-btn-outline-success i { color: var(--ds-success) !important; }
.ds-skin .egk-btn-outline-danger i  { color: var(--ds-error) !important; }
.ds-skin .egk-btn-outline-warning i { color: var(--ds-warning) !important; }
.ds-skin .egk-btn-outline-info i    { color: var(--ds-state-info-icon) !important; }
.ds-skin .egk-btn-outline-primary i { color: var(--theme-color-ink, var(--theme-color)) !important; }

/* action-column groups: each .egk-btn is now its own raised tile, so the legacy
   FUSED .egk-btn-group (flush, squared inner corners — egk-buttons.css) reads
   cramped. Space the tiles out and restore each one's full radius (the !important
   beats the legacy :first/:last/:not(:last-child) radius rules at equal specificity). */
.ds-skin .egk-btn-group { gap: var(--ds-space-2); }
.ds-skin .egk-btn-group .egk-btn { border-radius: var(--ds-radius-btn) !important; }

/* inline date-range mini-table buttons */
.ds-skin .table-range td { padding: 2px; }
.ds-skin .table-range input { margin: 0; }

/* ==========================================================================
   7. DROPDOWN / "more" menu  (e.g. "Şube seçin")
   ========================================================================== */
.ds-skin .more-btn {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-1);
  padding: var(--ds-space-1) var(--ds-space-3);
  border-radius: var(--ds-radius-pill);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-sm);
  color: var(--ds-text-1);
  font-size: var(--ds-text-body-sm);
  font-weight: var(--ds-fw-medium);
  text-decoration: none;
}
.ds-skin .more-btn:hover { color: var(--ds-text-1); text-decoration: none; }

.ds-skin .dropdown-menu {
  background: var(--ds-surface-raised) !important;
  border: none !important;
  border-radius: var(--ds-radius-lg) !important;
  box-shadow: var(--ds-shadow-neu) !important;
  padding: var(--ds-space-1) !important;
}
.ds-skin .dropdown-menu > li > a,
.ds-skin .dropdown-menu > li > span {
  display: block;
  padding: var(--ds-space-2) var(--ds-space-3);
  border-radius: var(--ds-radius-sm);
  color: var(--ds-text-1);
  font-size: var(--ds-text-body-sm);
  cursor: pointer;
}
.ds-skin .dropdown-menu > li > a:hover,
.ds-skin .dropdown-menu > li > span:hover { background: var(--ds-accent-subtle); }
.ds-skin .dropdown-menu.dropdown-arrow:before { background: var(--ds-surface-raised) !important; }

/* ==========================================================================
   8. KARNE KPI ROWS  (.egk-content-* / .egk-collapse-* / label-value rows)
   ========================================================================== */
/* sections-not-cards: drop the legacy .egk-content card (customize.css — white
   panel + light shadow + theme-color top rule + radius) so the header / filters /
   table sit directly on the Orbit canvas, like the dashboard. Each DataTable keeps
   its OWN raised surface (§12), which becomes the page's "section". Wins over the
   light `.egk-content` and the dark `[data-theme="dark"] .egk-content` (loaded
   earlier) by specificity / source order. */
.ds-skin .egk-content {
  background: transparent;
  box-shadow: none;
  border: none;
  border-radius: 0;
  padding: 0;
}

.ds-skin .egk-content-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0;                 /* was 0 0 space-3 — caption→filter gap now comes from the form margin (standard rhythm) */
  margin: 0;
  border-bottom: none;        /* dividers removed: this one rule drew BOTH the cari-card and the Sipariş-header divider */
}
/* the create CTA → our primary fill (the §6 .egk-btn-primary tokens), pinned to the §17
   control height. Skinned by POSITION, not a class swap: the CRUD pages carry
   .egk-btn-outline-primary on BOTH the create button and the row-edit buttons, but only
   the create button sits in .egk-content-header — the row buttons live in the table, so
   they stay neutral tiles. */
.ds-skin .egk-content-header .egk-btn {
  height: var(--orbit-control-h);   /* match the search box + §17 controls (52px); §6 already flex-centers the label */
  background: var(--ds-accent) !important;
  color: var(--ds-accent-fg) !important;
  box-shadow: var(--ds-shadow-dark-button) !important;
}
.ds-skin .egk-content-header .egk-btn:hover {
  background: var(--ds-accent) !important;
  color: var(--ds-accent-fg) !important;
  transform: var(--ds-lift-hover);
}
.ds-skin .egk-content-header .egk-btn i {
  color: var(--ds-accent-fg) !important;
}
/* header TOGGLE buttons (Filtreler/Grafik — .egk-collapse-button on ~15 report/CRUD
   pages) → DS secondary (ds.css .ds-btn--secondary: raised neu tile), NOT a second
   accent CTA. One header = one green action (create); toggles stay neutral, glyph
   carries the theme ink like the StockList toolbar icons. */
.ds-skin .egk-content-header .egk-btn.egk-collapse-button {
  background: var(--ds-surface) !important;
  color: var(--ds-text-1) !important;
  box-shadow: var(--ds-shadow-neu-sm) !important;
}
.ds-skin .egk-content-header .egk-btn.egk-collapse-button:hover {
  background: var(--ds-surface) !important;
  color: var(--ds-text-1) !important;
  box-shadow: var(--ds-shadow-neu) !important;
  transform: var(--ds-lift-hover);
}
.ds-skin .egk-content-header .egk-btn.egk-collapse-button:active {
  box-shadow: var(--ds-shadow-neu-pressed) !important;
  transform: translateY(0);
}
.ds-skin .egk-content-header .egk-btn.egk-collapse-button i {
  color: var(--theme-color-ink, var(--theme-color)) !important;
}
/* while its panel is open, the toggle reads pressed-in (carved) */
.ds-skin .egk-content-header:has(+ .egk-collapse-menu.active) .egk-btn.egk-collapse-button {
  box-shadow: var(--ds-shadow-neu-inset) !important;
}
/* caption — mirror the dashboard caption BADGE (§16a): a self-contained raised
   neumorphic pill wrapping a leading domed icon disc + the Inter title. The glyph
   is supplied in markup (<span class="egk-content-title-mark"><i …></i></span>) so
   each page picks a relevant icon; pages without the span just show a text pill. */
.ds-skin .egk-content-title {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2-5);
  padding: var(--ds-space-3) var(--ds-space-6);   /* match .ds-badge--2xl; the disc's negative margin sets the left inset */
  border-radius: var(--ds-radius-pill);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu);
  font-family: var(--ds-font-caption);       /* caption knob (default Inter); matches the dashboard caption */
  font-weight: var(--ds-fw-semibold);
  font-size: var(--ds-text-h6);
  letter-spacing: var(--ds-ls-h5);
  color: var(--ds-text-1);
}
/* customize.css ships `* { font-family: Poppins }` (universal selector) — a DIRECT
   rule on EVERY element, so it defeats inheritance: the title's child <span> would
   render Poppins, not the caption font set on the parent. Re-assert it on the spans
   (the icon's <i> keeps its Font Awesome face via its own .fa-* rule). This
   `*`-beats-inheritance trap is why the skin must set font-family per component
   rather than rely on the .ds-skin root. */
.ds-skin .egk-content-title > span { font-family: var(--ds-font-caption); }
/* kill the legacy theme-color underline bar (customize .egk-content-title::before)
   — the badge IS the caption now, no separate accent rule. */
.ds-skin .egk-content-title::before { display: none; }
.ds-skin .egk-content-title-mark {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 1.9em;                                   /* match .ds-badge__disc (em-scaled) */
  height: 1.9em;
  margin: -0.4em 0.05em -0.4em -0.55em;           /* same negative margins as .ds-badge__disc: proper left inset, no height inflation */
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-circle);
  font-size: 0.92em;
  line-height: 1;
}
.ds-skin .egk-content-title-mark i {
  font-size: 1em;
  color: var(--theme-color-ink, var(--theme-color));
}
.ds-skin .egk-collapse-button { cursor: pointer; }
.ds-skin .egk-collapse-menu { padding-top: 0; }
/* The legacy collapse nav clips with overflow:hidden (it drives the Filtreler
   height animation), which ALSO clips the enhanced Onay-Durumu dropdown's OPEN menu
   — the menu floats below the filter row, outside the nav's box. Let the nav overflow
   ONLY while a select is actually open, so the collapse/expand animation (no dropdown
   open) keeps overflow:hidden and stays clean. The menu carries z-index
   --ds-z-dropdown (100), so once it escapes it lands above the table surface. */
.ds-skin .egk-collapse-menu.active:has(.ds-select-menu.orbit-select.is-open) {
  overflow: visible;
}
/* SECTION rhythm = --orbit-section-gap between stacked content blocks. Doubled from
   the base --ds-gap (24→48px) on user request — the caption / filter / table and the
   top cari search were reading too tight. One knob tunes all the page-section gaps:
     · search → caption ....... .CariSearch > .cari-ara bottom margin (below)
     · caption → filter ....... .form-egk-form-label top margin
     · filter → table ......... .form-egk-form-label bottom margin (table top = 0, §12)
   (With a cari SELECTED, the Cari-Bilgileri card sits between search and caption and
   keeps its own --ds-gap below it; only the search→card gap takes the doubled value.) */
.ds-skin { --orbit-section-gap: calc(var(--ds-gap) * 2); }
.ds-skin .egk-form { margin: 0; }
.ds-skin .CariSearch > .cari-ara { margin-bottom: var(--orbit-section-gap); }
.ds-skin .form-egk-form-label {
  margin: var(--orbit-section-gap) 0;
  justify-content: flex-start;          /* even gaps instead of the legacy space-between */
  gap: var(--ds-space-8);               /* 32px between filter fields (horizontal + wrapped rows) */
}
/* Filter fields are dashboard-style .cari-ara search boxes. Lay them out as even
   columns; widths recomputed so N fields + (N-1) gaps fit exactly. Below 1201px
   they stack full-width (legacy .cari-ara is width:100%). */
.ds-skin .form-egk-form-label > .cari-ara { width: 100%; margin-bottom: 0; }
/* a .cari-ara may sit inside a plain WRAPPER div when the page toggles it by id with
   display:block (CheckAndBillReport's Çek/Senet search swap — block would break the
   box's own flex layout). Give the wrapper the column width; the box inside fills it.
   The inner box also needs the legacy margin-bottom:24px reset (the rule above only
   reaches DIRECT children) — without it the wrapper runs 70px tall and the row's
   default align-items:stretch drags every sibling box up to that height. */
.ds-skin .form-egk-form-label > div:has(> .cari-ara) { width: 100%; }
.ds-skin .form-egk-form-label > div > .cari-ara { margin-bottom: 0; }
@media (min-width: 1201px) {
  .ds-skin .form-egk-form-label.column-3 > .cari-ara,
  .ds-skin .form-egk-form-label.column-3 > div:has(> .cari-ara) { width: calc((100% - 2 * var(--ds-space-8)) / 3); }
  .ds-skin .form-egk-form-label.column-4 > .cari-ara,
  .ds-skin .form-egk-form-label.column-4 > div:has(> .cari-ara) { width: calc((100% - 3 * var(--ds-space-8)) / 4); }
  .ds-skin .form-egk-form-label.column-5 > .cari-ara,
  .ds-skin .form-egk-form-label.column-5 > div:has(> .cari-ara) { width: calc((100% - 4 * var(--ds-space-8)) / 5); }

  /* DENSE report filter panels keep the labeled .egk-form-input grid (labels carry
     real meaning next to eight "-TÜMÜ-" dropdowns). Same width recompute as the
     .cari-ara rows above: customize's legacy `100%/N - 20px` was sized for
     space-between and NO gap, so with the skin's 32px gap only N-1 fit per row →
     the lopsided "3 in a column-4 row" wrap. Scoped to .egk-collapse-menu so the
     approved CRUD-modal form layout is untouched. */
  .ds-skin .egk-collapse-menu .form-egk-form-label.column-3 > .egk-form-input { width: calc((100% - 2 * var(--ds-space-8)) / 3); }
  .ds-skin .egk-collapse-menu .form-egk-form-label.column-4 > .egk-form-input { width: calc((100% - 3 * var(--ds-space-8)) / 4); }
  .ds-skin .egk-collapse-menu .form-egk-form-label.column-5 > .egk-form-input { width: calc((100% - 4 * var(--ds-space-8)) / 5); }
}
/* native <select> inside a .cari-ara search box → drop the OS arrow and paint the
   DS chevron on the right (matches §14's branch select). §11 sets
   `background: transparent !important`, so the image needs !important + the extra
   `select` specificity (0,3,1 > 0,3,0) to win for background-image only. */
.ds-skin .cari-ara select.txt-aranacak-ifade {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  cursor: pointer;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-opacity='.55' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important;
  background-position: right var(--ds-space-4) center !important;
}
[data-theme="dark"] .ds-skin .cari-ara select.txt-aranacak-ifade {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-opacity='.6' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") !important;
}

.ds-skin .egk-collapse-menu .d-flex.justify-content-between {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--ds-space-3);
  padding: var(--ds-space-2) 0;
  border-bottom: var(--ds-bw-hairline) solid var(--ds-border-hairline);
}
.ds-skin .egk-collapse-menu .d-flex.justify-content-between:last-child { border-bottom: none; }
.ds-skin .egk-collapse-menu .d-flex span:first-child { color: var(--ds-text-2); font-size: var(--ds-text-body-sm); }
.ds-skin .egk-collapse-menu .d-flex span:last-child {
  color: var(--ds-text-1);
  font-weight: var(--ds-fw-semibold);
  font-variant-numeric: tabular-nums;
}

/* ==========================================================================
   9. MISC TEXT / UTILITIES
   ========================================================================== */
.ds-skin .font-sub-total { font-size: var(--ds-text-body-sm) !important; font-weight: var(--ds-fw-semibold); color: var(--ds-text-1); }
.ds-skin .gray { color: var(--ds-text-3) !important; }
.ds-skin canvas { max-width: 100%; }

/* ==========================================================================
   10. SCROLLBARS in scrollable areas
   ========================================================================== */
.ds-skin .table-responsive::-webkit-scrollbar { height: 10px; width: 10px; }
.ds-skin .table-responsive::-webkit-scrollbar-track { background: transparent; }
.ds-skin .table-responsive::-webkit-scrollbar-thumb { background: var(--ds-border-default); border-radius: var(--ds-radius-pill); }

/* ==========================================================================
   11. SEARCH / TYPEAHEAD  (.cari-ara family + jQuery-UI results)
   --------------------------------------------------------------------------
   Legacy markup:  .cari-ara > [ .btn-ikon  .txt-aranacak-ifade  .btn-temizle ]
   The CONTAINER becomes the raised neumorphic field; the input sits flat &
   transparent inside it; the search glyph is the one domed-disc accent;
   the clear (×) stays a quiet ghost. Maps onto ds.css tokens only.
   ========================================================================== */
.ds-skin .cari-ara {
  position: relative;
  display: flex;
  align-items: center;
  background: var(--ds-surface);
  border: none;                                  /* kill the theme-color left rule */
  border-radius: var(--ds-radius-md);
  box-shadow: var(--ds-shadow-neu-sm);
  overflow: visible;
  transition: box-shadow var(--ds-duration-base) var(--ds-ease-spring);
}
.ds-skin .cari-ara:focus-within {
  box-shadow: var(--ds-shadow-neu-sm), 0 0 0 3px var(--orbit-ring);
}

/* the field itself — flat & transparent; the container carries the relief */
.ds-skin .cari-ara .txt-aranacak-ifade {
  width: 100%;
  height: 48px;
  background: transparent !important;
  border: none !important;
  box-shadow: none !important;
  outline: none;
  padding: var(--ds-space-2) 44px var(--ds-space-2) 48px;   /* clear disc (L) + × (R) */
  font-size: var(--ds-text-body-sm);
  color: var(--ds-text-1) !important;
  border-radius: var(--ds-radius-md);
}
.ds-skin .cari-ara .txt-aranacak-ifade::placeholder { color: var(--ds-text-3); }

/* search glyph → raised domed disc (the single relief accent of the field) */
.ds-skin .cari-ara .btn-ikon {
  position: absolute;
  left: var(--ds-space-2);
  top: 50%;
  transform: translateY(-50%);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  padding: 0;
  border: none;
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface) !important;
  box-shadow: var(--ds-shadow-neu-circle);
  color: var(--theme-color-ink, var(--theme-color));   /* brand glyph on the domed disc */
  pointer-events: none;                           /* decorative, as in production */
  z-index: 2;
}

/* clear (×) → quiet ghost target (monochrome, no production red) */
.ds-skin .cari-ara .btn-temizle {
  position: absolute;
  right: var(--ds-space-2);
  top: 50%;
  transform: translateY(-50%);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  padding: 0;
  border: none;
  border-radius: var(--ds-radius-full);
  background: transparent !important;
  color: var(--ds-text-3) !important;
  cursor: pointer;
  transition: var(--ds-transition-base);
  z-index: 2;
}
.ds-skin .cari-ara .btn-temizle:hover {
  background: var(--ds-accent-subtle) !important;
  color: var(--ds-text-1) !important;
}

/* jQuery-UI autocomplete results → the DS dropdown menu. There is no DS
   autocomplete component, so this borrows the closest family member — the
   .ds-dropdown__menu / .ds-dropdown__item recipe (raised popover surface,
   card radius, e4 float, padded track, quiet surface-hover rows) that
   orbit-select.js listboxes already use app-wide, so both popups read as one
   component. The <ul> is appended to <body> — OUTSIDE every .ds-skin wrapper —
   so it gates on the .orbit-autocomplete marker the _Layout hook adds on
   `autocompleteopen` (§19's marker pattern promoted app-wide like the §24
   modal hook; opt-out = .no-orbit-skin on the input). The marker class also
   out-specifies customize.css's .ui-autocomplete skin (white bg / dark
   #2f3547); customize's max-height:400px!important + overflow-y:auto are
   kept — long cari lists need the scroll. */
.ui-autocomplete.orbit-autocomplete {
  padding: var(--ds-space-1) !important;
  margin-top: var(--ds-space-2) !important;
  border: none !important;
  border-radius: var(--ds-radius-card) !important;
  background: var(--ds-surface-raised) !important;
  box-shadow: var(--ds-shadow-e4) !important;
  font-family: var(--ds-font-body);
  animation: orbit-autocomplete-in var(--ds-duration-fast) var(--ds-ease-out);
}
@keyframes orbit-autocomplete-in {
  from { opacity: 0; transform: translateY(-6px); }
  to   { opacity: 1; transform: none; }
}
.ui-autocomplete.orbit-autocomplete .ui-menu-item { border: none !important; }
.ui-autocomplete.orbit-autocomplete .ui-menu-item-wrapper {
  padding: var(--ds-space-2) var(--ds-space-3) !important;
  border: none !important;
  border-radius: var(--ds-radius-sm) !important;
  font-size: var(--ds-text-body-sm) !important;
  color: var(--ds-text-1) !important;
  /* customize forces nowrap + hides x-overflow — add the ellipsis so long
     cari/stok names truncate with a hint instead of clipping mid-glyph */
  overflow: hidden;
  text-overflow: ellipsis;
  transition: var(--ds-transition-color);
}
/* hover / keyboard focus → .ds-dropdown__item:hover (surface on raised), not
   an accent fill; margin:0 kills jQuery-UI's -1px active-state nudge */
.ui-autocomplete.orbit-autocomplete .ui-menu-item-wrapper.ui-state-active,
.ui-autocomplete.orbit-autocomplete .ui-menu-item-wrapper.ui-state-focus {
  background: var(--ds-surface) !important;
  color: var(--ds-text-1) !important;
  border: none !important;
  margin: 0 !important;
}
/* scrollbar → §10's slim thumb, repeated because the body-appended menu never
   sits inside a .ds-skin scope */
.ui-autocomplete.orbit-autocomplete::-webkit-scrollbar { width: 10px; }
.ui-autocomplete.orbit-autocomplete::-webkit-scrollbar-track { background: transparent; }
.ui-autocomplete.orbit-autocomplete::-webkit-scrollbar-thumb { background: var(--ds-border-default); border-radius: var(--ds-radius-pill); }

/* ==========================================================================
   12. DATA GRID SURFACE  (.dataTables_wrapper) → match ds .ds-table-wrap
   --------------------------------------------------------------------------
   Each dashboard grid becomes its own rounded, raised surface (toolbar +
   table + paging contained), instead of loose rows sitting on the panel.
   The inner table rows keep the §4 treatment (transparent, hairline rules).
   ========================================================================== */
.ds-skin .dataTables_wrapper {
  background: var(--ds-surface);
  border-radius: var(--ds-radius-lg);
  box-shadow: var(--ds-shadow-neu-sm);
  padding: var(--ds-space-3) var(--ds-space-4) var(--ds-space-2);
  margin-top: 0;   /* gap to the filter above comes from .form-egk-form-label's margin (standard rhythm) */
}

/* ==========================================================================
   13. CUSTOM PAGER  (.paginate-button — hyphen class, the app's own pager;
       NOTE: distinct from DataTables' .paginate_button underscore in §4)
   ========================================================================== */
.ds-skin .dataTables_paginate {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--ds-space-1);
}
.ds-skin .paginate-button {
  width: 32px;
  height: 32px;
  line-height: 1;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: none !important;
  border-radius: var(--ds-radius-full) !important;
  background: var(--ds-surface) !important;
  box-shadow: var(--ds-shadow-neu-sm);
  color: var(--ds-text-2) !important;
  font-size: var(--ds-text-body-sm);
  text-decoration: none;
  cursor: pointer;
  transition: var(--ds-transition-base);
}
.ds-skin .paginate-button:hover {
  background: var(--ds-surface) !important;
  color: var(--ds-text-1) !important;
  transform: var(--ds-lift-hover);
  box-shadow: var(--ds-shadow-neu-hover);
}
.ds-skin .paginate-button.current,
.ds-skin .paginate-button.current:hover {
  background: var(--ds-accent) !important;
  color: var(--ds-accent-fg) !important;
  box-shadow: var(--ds-shadow-dark-button);
  transform: none;
}
.ds-skin .paginate-button.disabled,
.ds-skin .paginate-button.disabled:hover {
  background: transparent !important;
  box-shadow: none;
  color: var(--ds-ink-disabled) !important;
  transform: none;
  cursor: default;
}
.ds-skin .view-pager .ellipsis { color: var(--ds-text-3); padding: 0 var(--ds-space-1); }
.ds-skin .view-pager .dataTables_info { color: var(--ds-text-3); font-size: var(--ds-text-caption); }

/* ==========================================================================
   14. CUSTOM SELECT  (.custom-select-wrapper — bespoke select w/ hidden native)
   ========================================================================== */
.ds-skin .custom-select-trigger {
  height: auto;
  min-height: 40px;
  background: var(--ds-surface) !important;
  border: none !important;
  border-radius: var(--ds-radius-md) !important;
  box-shadow: var(--ds-shadow-neu-sm) !important;
  padding: var(--ds-space-2) var(--ds-space-6) var(--ds-space-2) var(--ds-space-3) !important;
  color: var(--ds-text-1);
  font-size: var(--ds-text-body-sm);
}
/* When the custom-select lives INSIDE a .cari-ara field (the company picker in
   CompanySelect.cshtml), the .cari-ara is already the raised field — so flatten
   the trigger (no box-in-a-box / no second relief), and pad its left so the
   selected text clears the absolute icon disc instead of sitting under it. */
.ds-skin .cari-ara .custom-select-trigger {
  background: transparent !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  min-height: 46px !important;
  padding: var(--ds-space-2) var(--ds-space-6) var(--ds-space-2) 48px !important;
  display: flex !important;
  align-items: center !important;
}
/* drop the production 24px margin under the company field (it leaves an empty
   band below the field whose soft shadow reads as a phantom container) */
.ds-skin .cari-ara.cari-typeahead:has(.egk-btn-primary) { margin-bottom: 0 !important; }
.ds-skin .custom-options {
  background: var(--ds-surface-raised) !important;
  border: none !important;
  border-radius: var(--ds-radius-lg) !important;
  box-shadow: var(--ds-shadow-neu) !important;
  padding: var(--ds-space-1) !important;
  margin-top: var(--ds-space-1);
}
.ds-skin .custom-option {
  border-radius: var(--ds-radius-sm);
  padding: var(--ds-space-2) var(--ds-space-3) !important;
  color: var(--ds-text-1);
}
.ds-skin .custom-option:hover,
.ds-skin .custom-option.selection {
  background: var(--ds-accent-subtle) !important;
  color: var(--ds-text-1) !important;
}

/* native <select class="egk-single-input"> (e.g. Ciro branch picker) →
   mirror the canonical .ds-select (ds.css:980) so the dashboard picker reads
   IDENTICAL to the component. A bare <select> is a replaced element and can't
   host the component's .ds-select-wrap::after chevron, so the ▾ is painted as a
   background-image instead — same colour (--ds-text-2) and same right offset
   (--ds-space-4) as the component glyph. radius-btn == radius-md and
   shadow-neu == shadow-neu-sm (aliases), so those already matched; the real
   alignment here is the 12px vertical padding, the canonical right gutter
   (space-4 + 22px), and the rgba(0,0,0,.14) focus ring. */
.ds-skin select.egk-single-input {
  height: auto;
  background-color: var(--ds-surface) !important;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-opacity='.55' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important;
  background-position: right var(--ds-space-4) center !important;
  border: 1px solid transparent !important;
  border-radius: var(--ds-radius-btn) !important;
  box-shadow: var(--ds-shadow-neu) !important;
  padding: var(--ds-space-3) calc(var(--ds-space-4) + 22px) var(--ds-space-3) var(--ds-space-4) !important;
  color: var(--ds-text-1) !important;
  font-size: var(--ds-text-body-sm);
  -webkit-appearance: none !important;
  -moz-appearance: none !important;
  appearance: none !important;
}
.ds-skin select.egk-single-input:focus {
  outline: none;
  box-shadow: var(--ds-shadow-neu), 0 0 0 3px var(--orbit-ring) !important;   /* brand ring (§18); was rgba(0,0,0,.14) */
}
[data-theme="dark"] .ds-skin select.egk-single-input {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-opacity='.6' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") !important;
}

/* Progressive enhancement (orbit-select.js): the native <select> open popup is
   OS-rendered and unstyleable, so the script upgrades it into the DS custom
   listbox (.ds-select-menu). The native element is KEPT (still populated, still
   fires onchange) but hidden; the generated .orbit-select wrapper carries the
   visible UI. min-width covers the case where the native width measured 0
   (control sat inside a hidden tab pane when enhanced). */
.ds-skin select.orbit-select__native {
  position: absolute !important;
  width: 1px !important; height: 1px !important;
  padding: 0 !important; margin: 0 !important;
  opacity: 0 !important; pointer-events: none !important;
  overflow: hidden !important; clip: rect(0 0 0 0) !important;
}
.ds-skin .ds-select-menu.orbit-select { min-width: 200px; }
/* long lists (many şube / many companies) stay usable */
.ds-skin .ds-dropdown.orbit-select .ds-dropdown__menu { max-height: 320px; overflow-y: auto; }

/* Row-level selects inside data tables (Interviews "Durum" quick-status): compact
   the trigger to row scale and narrow the 200px floor (the page JS clears the
   inline min-width orbit-select.js measures so this floor applies). Closed menus
   are dropped from layout — same phantom-scroll fix as the §24 modal rule: a
   closed .ds-dropdown__menu is only visibility:hidden (ds.css), still laid out
   below its trigger, and with one select per row the last rows' menus inflate
   the page's scroll height. The §24 keyframe recreates the open fade. */
.ds-skin table .ds-select-menu.orbit-select { min-width: 150px; }
/* Trigger reads as a BADGE-with-chevron: pill radius, badge scale (13px / ~30px tall),
   quiet neu-sm relief — so it sits level with the ds-badge chips in adjacent columns.
   (These unlayered rules out-rank ds.css's layered focus/open shadows, so the open
   ring is restated below.) */
.ds-skin table .ds-select-menu__trigger {
  height: 30px;              /* badge scale — §14's height:var(--orbit-control-h) (field
                                ladder, ~52px) also matches this element; out-specify it */
  padding: 0 var(--ds-space-3);
  font-size: 13px;
  font-weight: var(--ds-fw-medium);
  border-radius: var(--ds-radius-full);
  box-shadow: var(--ds-shadow-neu-sm);
}
.ds-skin table .ds-select-menu.is-open .ds-select-menu__trigger,
.ds-skin table .ds-select-menu__trigger:focus-visible {
  box-shadow: var(--ds-shadow-neu-sm), 0 0 0 3px rgba(0, 0, 0, 0.10);
}
[data-theme="dark"] .ds-skin table .ds-select-menu.is-open .ds-select-menu__trigger,
[data-theme="dark"] .ds-skin table .ds-select-menu__trigger:focus-visible {
  box-shadow: var(--ds-shadow-neu-sm), 0 0 0 3px rgba(255, 255, 255, 0.14);
}
/* Status tint — the page JS mirrors the native select's value onto the wrap as
   .st-<ActivityStatus>. Same state tokens as ds-badge, so the DURUM control and
   the badges around it read as one palette.
   1=Planlandı(info) 2=Tamamlandı(success) 3=İptal(muted) 4=Takip Gerekli(warning) */
.ds-skin table .ds-select-menu.st-1 .ds-select-menu__trigger { background: var(--ds-state-info-bg);    color: var(--ds-state-info-text); }
.ds-skin table .ds-select-menu.st-2 .ds-select-menu__trigger { background: var(--ds-state-success-bg); color: var(--ds-state-success-text); }
.ds-skin table .ds-select-menu.st-3 .ds-select-menu__trigger { background: var(--ds-surface);          color: var(--ds-text-2); }
.ds-skin table .ds-select-menu.st-4 .ds-select-menu__trigger { background: var(--ds-state-warning-bg); color: var(--ds-state-warning-text); }
.ds-skin table .ds-select-menu[class*="st-"] .ds-select-menu__chevron { color: inherit; opacity: 0.65; }
.ds-skin table .ds-dropdown__menu { display: none; }
.ds-skin table .ds-dropdown.is-open .ds-dropdown__menu {
  display: block;
  animation: orbit-modal-menu-in var(--ds-duration-fast) var(--ds-ease-out);
}

/* ---- Company picker (Home/CompanySelect) swapped to .ds-select-menu ----
   orbit-select.js strips the legacy custom-select UI and builds the DS listbox
   inside the existing .cari-ara field. Flatten that field's relief (the dropdown
   trigger carries its own), drop the now-redundant chart disc, and let the
   dropdown fill the row beside the "Şirket Değiştir" submit button. */
.ds-skin .cari-ara.cari-typeahead:has(.ds-select-menu.orbit-select) {
  background: transparent;
  box-shadow: none;
  border-radius: 0;
  gap: var(--ds-space-2);
}
.ds-skin .cari-ara.cari-typeahead:has(.ds-select-menu.orbit-select):focus-within { box-shadow: none; }
.ds-skin .cari-ara.cari-typeahead:has(.ds-select-menu.orbit-select) .btn-ikon { display: none; }

/* Filter select — a PLAIN .cari-ara search box (no .cari-typeahead, no submit
   button) enhanced to the DS listbox: unlike the company picker above, KEEP §11's
   raised field + leading disc and just flatten the orbit-select trigger so the
   .cari-ara stays the visible field (padded past the 48px disc). The OPEN menu is
   the styled DS listbox instead of the native OS popup. */
.ds-skin .cari-ara:not(.cari-typeahead) .ds-select-menu.orbit-select { flex: 1; min-width: 0; }
.ds-skin .cari-ara:not(.cari-typeahead) .ds-select-menu__trigger {
  height: var(--orbit-control-h);
  padding: 0 var(--ds-space-4) 0 48px;   /* clear the leading disc */
  background: transparent;
  box-shadow: none;
}
.ds-skin .cari-ara:not(.cari-typeahead) .ds-select-menu__trigger:focus-visible,
.ds-skin .cari-ara:not(.cari-typeahead) .ds-select-menu.is-open .ds-select-menu__trigger {
  box-shadow: none;   /* the .cari-ara carries the focus-within ring (§11) */
}
.ds-skin .cari-ara .custom-select-wrapper { flex: 1; min-width: 0; }
/* match the submit button to the shared control height so the row lines up */
.ds-skin .cari-ara:has(.ds-select-menu.orbit-select) .egk-btn-primary {
  height: var(--orbit-control-h);
  display: inline-flex;
  align-items: center;
  flex-shrink: 0;
}

/* when a select is dropped into a tab bar (Ciro "Tümü" + branch picker),
   flatten the sunken track so the raised select doesn't sit in a well, and
   group "Tümü" + the şube dropdown together on the LEFT (was space-between,
   which spread them awkwardly across the panel width). */
.ds-skin .nav-tabs:has(select.egk-single-input) {
  display: flex;
  width: 100%;
  justify-content: flex-start;
  align-items: center;
  gap: var(--ds-space-3);
  background: transparent !important;
  box-shadow: none !important;
  padding: 0 !important;
}
/* "Tümü" → DS outline button (.ds-btn--outline: surface + inset relief, quiet);
   the legacy <button class="btn btn-default active"> has no DS class, so mirror
   the component here. Height matches the shared control height (§17). */
.ds-skin .nav-tabs:has(select.egk-single-input) > button {
  height: var(--orbit-control-h);
  display: inline-flex;
  align-items: center;
  flex-shrink: 0;
  padding: 0 var(--ds-space-5) !important;
  background: var(--ds-surface) !important;
  color: var(--ds-text-2) !important;
  border: none !important;
  border-radius: var(--ds-radius-btn) !important;
  box-shadow: var(--ds-shadow-neu-inset) !important;
  font-size: var(--ds-text-body-sm);
  font-weight: var(--ds-fw-medium);
  line-height: 1;
  transition: var(--ds-transition-base);
}
.ds-skin .nav-tabs:has(select.egk-single-input) > button:hover { color: var(--ds-text-1) !important; }
.ds-skin .nav-tabs:has(select.egk-single-input) > button:active,
.ds-skin .nav-tabs:has(select.egk-single-input) > button.active { box-shadow: var(--ds-shadow-neu-pressed) !important; color: var(--ds-text-1) !important; }

/* ==========================================================================
   15. DATATABLES TOOLBAR BUTTONS  (.dt-button — "Aktar" export / "Görünüm" colvis)
   The DataTables Buttons extension renders flat buttons with the production
   green text; restyle them as quiet raised neumorphic buttons (icon + caret
   inherit the text colour, so no production green leaks).
   NOTE: the OPEN menu (.dt-button-collection) is appended to <body>, so — like
   the jQuery-UI autocomplete (§11) — its rules stay dormant until .ds-skin is
   on <body> (global rollout).
   ========================================================================== */
.ds-skin .dt-button {
  background: var(--ds-surface) !important;
  color: var(--ds-text-2) !important;
  border: none !important;
  border-radius: var(--ds-radius-md) !important;
  box-shadow: var(--ds-shadow-neu-sm) !important;
  padding: var(--ds-space-2) var(--ds-space-3) !important;
  margin-left: var(--ds-space-2) !important;
  font-family: var(--ds-font-body);   /* beat customize `* { font-family: Poppins }` */
  font-size: var(--ds-text-body-sm);
  font-weight: var(--ds-fw-medium);
  transition: var(--ds-transition-base);
}
.ds-skin .dt-button span,
.ds-skin .dt-button i { color: inherit !important; }
.ds-skin .dt-button:hover {
  color: var(--ds-text-1) !important;
  box-shadow: var(--ds-shadow-neu) !important;
  transform: translateY(-1px);
}
.ds-skin .dt-button:active {
  box-shadow: var(--ds-shadow-neu-inset) !important;
  transform: translateY(0);
}

/* ==========================================================================
   16. REPORT CAPTION BADGE  +  SWITCH FILTER TABS   (ds .ds-badge / .ds-tabs--switch)
   --------------------------------------------------------------------------
   Applies two new ds.css primitives to the dashboard, CSS-only / non-destructive
   (the report partials are SHARED with the classic Index, so nothing in markup
   is touched — these rules are scoped to .ds-skin and only override §3):

   (a) A single-tab .panel-heading is a pure TITLE, not a tab → render it as a
       tall surface "caption badge" with a domed icon disc (ds .ds-badge--2xl +
       .ds-badge__disc).  Multi-tab captions (e.g. Ciro/Tahsilat) are real view
       toggles → left on the §3 underline pill.  Type-B <h3 .panel-title> captions
       already render as headings (see §2) → left as-is.
   (b) In-content FILTER bars (.nav-tabs WITHOUT .panel-heading — Gün/Hafta/Ay,
       "En İyi 10/30/50", price ranges) → the switch look: an inset well whose
       active option pops out as a raised surface badge (ds .ds-tabs--switch).
   ========================================================================== */

/* ---- (a) caption badge: single-tab title pill + domed icon disc ---- */
.ds-skin ul.nav-tabs.panel-heading:has(> li:only-child) {
  position: relative;                /* anchor the brand glyph (::after) over the disc */
  align-items: center;
  gap: 0;
  padding: var(--ds-space-1-5) var(--ds-space-5) var(--ds-space-1-5) var(--ds-space-2);
}
/* domed surface disc — relief only; the glyph is the tinted ::after layer below */
.ds-skin ul.nav-tabs.panel-heading:has(> li:only-child)::before {
  content: "";
  flex-shrink: 0;
  width: 34px;
  height: 34px;
  margin-right: var(--ds-space-2-5);
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-circle);
}
/* report glyph → brand hue (contrast-clamped --theme-color-ink so a pale tenant
   colour stays legible). A mask lets CSS tint the SVG shape; centred over the
   disc from its geometry: padding-left (space-2) + half the §17 32px disc. */
.ds-skin ul.nav-tabs.panel-heading:has(> li:only-child)::after {
  content: "";
  position: absolute;
  left: calc(var(--ds-space-2) + 16px);
  top: 50%;
  transform: translate(-50%, -50%);
  width: 17px;
  height: 17px;
  background-color: var(--theme-color-ink, var(--theme-color));
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='%23000'%3E%3Crect x='3' y='13' width='4' height='8' rx='1'/%3E%3Crect x='10' y='8' width='4' height='13' rx='1'/%3E%3Crect x='17' y='4' width='4' height='17' rx='1'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='%23000'%3E%3Crect x='3' y='13' width='4' height='8' rx='1'/%3E%3Crect x='10' y='8' width='4' height='13' rx='1'/%3E%3Crect x='17' y='4' width='4' height='17' rx='1'/%3E%3C/svg%3E") center / contain no-repeat;
  pointer-events: none;
}
.ds-skin ul.nav-tabs.panel-heading:has(> li:only-child) > li > a {
  padding: var(--ds-space-1) var(--ds-space-1) var(--ds-space-1) 0;
  font-family: var(--ds-font-caption);   /* caption knob (default Inter); heading face (Satoshi) read too heavy/tight here */
  font-size: var(--ds-text-h6);
  font-weight: var(--ds-fw-semibold);
  letter-spacing: var(--ds-ls-h5);
  color: var(--ds-text-1);
}
/* it's a title, not a tab — drop the §3 underline marker */
.ds-skin ul.nav-tabs.panel-heading:has(> li:only-child) > li.active > a::after { display: none; }

/* ---- (b) → switch (inset well, active = raised surface badge): in-content FILTER
        bars (.nav-tabs WITHOUT .panel-heading) AND multi-tab CAPTIONS (panel-heading
        with 2+ tabs = a real view toggle, e.g. Ciro/Tahsilat, Satışlar/Siparişler).
        Single-tab captions (the badge above) and the group-range branch picker
        (a <div>, flattened by §14) are excluded.  The multi-tab caption selectors
        carry `.line-slide-tab` so the active rule out-ranks §3's
        `.line-slide-tab .nav-tabs > li.active > a` (else the active tab would stay
        transparent instead of popping out as a badge). ---- */
.ds-skin .nav-tabs:not(.panel-heading),
.ds-skin .line-slide-tab ul.nav-tabs.panel-heading:has(> li + li) {
  gap: var(--ds-space-1);
  padding: var(--ds-space-1);            /* inner frame so the active badge floats in the well */
  background: var(--ds-surface-sunken);
  box-shadow: var(--ds-shadow-neu-inset);
}
.ds-skin .nav-tabs:not(.panel-heading) > li > a,
.ds-skin .line-slide-tab ul.nav-tabs.panel-heading:has(> li + li) > li > a {
  border-radius: var(--ds-radius-pill);
  padding: var(--ds-space-2) var(--ds-space-4);
}
.ds-skin .nav-tabs:not(.panel-heading) > li.active > a,
.ds-skin .nav-tabs:not(.panel-heading) > li.active > a:hover,
.ds-skin .nav-tabs:not(.panel-heading) > li.active > a:focus,
.ds-skin .line-slide-tab ul.nav-tabs.panel-heading:has(> li + li) > li.active > a,
.ds-skin .line-slide-tab ul.nav-tabs.panel-heading:has(> li + li) > li.active > a:hover,
.ds-skin .line-slide-tab ul.nav-tabs.panel-heading:has(> li + li) > li.active > a:focus {
  background: var(--ds-surface);
  color: var(--ds-text-1);
  box-shadow: var(--ds-shadow-neu-sm);
}
/* the raised badge replaces the underline marker */
.ds-skin .nav-tabs:not(.panel-heading) > li.active > a::after,
.ds-skin .line-slide-tab ul.nav-tabs.panel-heading:has(> li + li) > li.active > a::after { display: none; }

/* ==========================================================================
   17. UNIFIED CONTROL HEIGHT
   --------------------------------------------------------------------------
   One shared height for every interactive control so the report header reads
   as a single tidy row (the branch dropdown previously sat ~5px taller than
   the tabs next to it, which read as "fat"). Target = the caption badge height
   minus 2px. Re-tune the whole set by editing --orbit-control-h alone.
   Covered: caption badge (§16a) · pill tabs (§3) · switch tabs (§16b) ·
   dropdown trigger (.ds-select-menu, via orbit-select.js) · native branch
   select fallback (§14) · form inputs (§5) · search field (§11).
   Box-sizing is border-box (Bootstrap), so `height` already includes padding.
   ========================================================================== */
.ds-skin { --orbit-control-h: 46px; }   /* shared control height (was 52px) — one knob lifts every control below */

/* all tab bars are .nav-tabs → one rule lifts the short ones (pill, switch) */
.ds-skin .nav-tabs { min-height: var(--orbit-control-h); }

/* caption badge: pin to the shared height + shrink the disc 34→32 so the badge
   lands 2px thinner than before (was ~46px) instead of staying the tallest */
.ds-skin ul.nav-tabs.panel-heading:has(> li:only-child) {
  min-height: var(--orbit-control-h);
  height: var(--orbit-control-h);
}
.ds-skin ul.nav-tabs.panel-heading:has(> li:only-child)::before {
  width: 32px; height: 32px;
}

/* dropdown — the DS custom listbox trigger (orbit-select.js) */
.ds-skin .ds-select-menu__trigger {
  height: var(--orbit-control-h);
  padding-top: 0; padding-bottom: 0;
}

/* native branch select (no-JS fallback / before enhancement) */
.ds-skin select.egk-single-input {
  height: var(--orbit-control-h) !important;
  padding-top: 0 !important; padding-bottom: 0 !important;
}

/* form inputs / selects (not textareas — they grow vertically) */
.ds-skin input.form-control,
.ds-skin select.form-control,
.ds-skin .input-sm {
  height: var(--orbit-control-h) !important;
}

/* search field (.cari-ara) — was 48px */
.ds-skin .cari-ara .txt-aranacak-ifade { height: var(--orbit-control-h); }

/* ==========================================================================
   18. ACCENT POLICY — "brand-led"  (user choice 2026-06-23)
   --------------------------------------------------------------------------
   In the monochrome neumorphic system the single colour knob is --ds-accent
   (ink/black by default). "Brand-led" re-points it at the per-tenant
   --theme-color so the hue marks every primary/active moment — and ALSO flips
   the one state marker that ds.css carries with --ds-ink (the active tab
   underline). Everything else (depth, structure, body text) stays ink.

   ▶ GLOBAL (rollout step 2): the accent tokens are defined on :root, NOT on a
   wrapper. This is the ONE consolidated definition — it replaces the former
   per-scope copies (orbit-skin §18 on .ds-skin AND orbit-navbar §0 on
   .orbit-nav), which were identical. orbit-skin.css now loads app-wide, so
   every Orbit scope (.ds / .ds-skin / .orbit-nav) plus any ds.css component
   inherits these from :root. It stays INERT on legacy pages: nothing there
   reads --ds-accent, so re-pointing it on :root has no visual effect until an
   Orbit wrapper is present. Being UNLAYERED, this :root block out-ranks the
   layered ds.css :root / [data-theme="dark"] token defaults regardless of order.

   Re-pointing the accent tokens here cascades automatically into the rules that
   already read them:
     · primary CTA fill ........ §6  .egk-btn-primary / .btn-primary
     · active page ............. §13 .paginate-button.current
     · row hover / selection ... §4  table:hover / tr.selected (--ds-accent-subtle)
     · dropdown hover, focus rings, search focus ... §7 / §5 / §11
     · navbar CTA / open / glass-adjacent states ... orbit-navbar.css

   --theme-color-fg / --theme-color-ink are the contrast-safe siblings derived
   per-tenant by orbit-accent.js (text-on-fill, and a visible thin-mark hue).
   Fallbacks keep it sane if that script is absent. KPI up/down deltas stay
   SEMANTIC green/red (set in the partials) — never the brand hue.
   Switch-style active tabs (§16b) keep their raised-surface DEPTH marker (a
   strong active cue already); only the underline-style tabs take the hue.

   --orbit-accent-soft vs --ds-accent-subtle — kept as TWO distinct roles (not
   merged, by design):
     · --ds-accent-subtle  = translucent hover/selection WASH (mixes with
       transparent so the surface/zebra underneath shows through).
     · --orbit-accent-soft = OPAQUE gentle brand FILL for a selected/active
       block (tuned to the DS alert backgrounds, ~8% hue over the surface;
       16% in dark). Used by the navbar open state and, since the brand-wash
       pass (live-tuned 2026-08-05), by the carved wells: Tier-2 caption chips
       (§22), the stock-row qty inset and the no-image tile (§20). Reusable
       app-wide.
   ========================================================================== */
:root {
  --ds-accent: var(--theme-color);
  --ds-accent-fg: var(--theme-color-fg, #ffffff);
  --ds-accent-subtle: color-mix(in srgb, var(--theme-color) 12%, transparent);
  /* focus ring — kept separate from --ds-accent-subtle (the wash) so it can be
     harder/more visible than hover/selection without strengthening those */
  --orbit-ring: color-mix(in srgb, var(--theme-color) 16%, transparent);
  /* THE reusable opaque "subtle theme colour" fill (see header note) */
  --orbit-accent-soft: color-mix(in srgb, var(--theme-color) 8%, var(--ds-surface));
}
[data-theme="dark"] {
  --ds-accent-subtle: color-mix(in srgb, var(--theme-color) 22%, transparent);
  --orbit-ring: color-mix(in srgb, var(--theme-color) 26%, transparent);
  /* dark alert bg ≈ hue @ 16% over the canvas */
  --orbit-accent-soft: color-mix(in srgb, var(--theme-color) 16%, var(--ds-surface));
}

/* active tab underline (§3 marker) → the brand hue, contrast-clamped so a pale
   tenant colour stays visible as a 2px mark on the canvas */
.ds-skin .nav-tabs > li.active > a::after {
  background: var(--theme-color-ink, var(--theme-color));
}

/* (polish 1) the DS select dropdown trigger hard-codes a GRAY focus/open ring
   (rgba(0,0,0,.14)) in ds.css — re-route it through the accent so it reads brand,
   matching the search/form fields (§11/§5). Covers focus AND the open state. */
.ds-skin .ds-select-menu__trigger:focus-visible,
.ds-skin .ds-select-menu.is-open .ds-select-menu__trigger {
  box-shadow: var(--ds-shadow-neu), 0 0 0 3px var(--orbit-ring);
}

/* (polish 2) kill the black UA focus outline that flashed on the just-clicked
   active switch/pill tab. Pointer selection (:focus, not :focus-visible) shows
   nothing; keyboard navigation keeps a branded, visible ring. Order matters —
   :focus-visible must follow :focus to win when both match. */
.ds-skin .nav-tabs > li > a:focus { outline: none; }
.ds-skin .nav-tabs > li > a:focus-visible {
  outline: 2px solid var(--ds-accent);
  outline-offset: 2px;
}

/* ==========================================================================
   19. jQuery UI DATEPICKER  →  DS calendar look   (.orbit-datepicker marker)
   --------------------------------------------------------------------------
   The Başlangıç/Bitiş Tarihi fields use jQuery UI's datepicker, whose popup
   (#ui-datepicker-div) is appended to <body> — OUTSIDE the .ds-skin scope (the
   same escape noted for the autocomplete in §11). So instead of scoping under
   .ds-skin, these rules gate on a MARKER class added to the widget in
   OrderApprovePartial's init (beforeShow → inst.dpDiv.addClass('orbit-datepicker')).
   Any datepicker WITHOUT the marker (other app pages) is untouched. Tokens live
   on :root, so var(--ds-*) resolve fine on the body-appended popup, and dark mode
   + the brand accent apply for free. Mirrors the ds.css calendar (.ds-cal): raised
   popover surface, domed circle nav, ghost→ink day discs, today-dot.

   IMPORTANT — customize.css already FULLY skins this datepicker for a DARK panel
   (the "Datepicker" block: bg #2B323B, white text, gray chevrons) with several
   `!important`s. We are RE-skinning it LIGHT, so every override below must both
   out-specify customize (the `.orbit-datepicker` prefix adds a class) AND carry
   `!important` exactly where customize does — the day text colour
   (.ui-state-default{color:#fff!important}), the yellow today highlight, and the
   brand "selected" fill. Keep the nav buttons' inherited `position:relative` (from
   customize) so the absolute chevron ::after centres in the circle. Modern-Chrome
   only (matches the skin).
   ========================================================================== */

/* popover surface — mirrors .ds-datepicker__panel / .ds-cal--inline */
.orbit-datepicker.ui-datepicker {
  width: auto;
  padding: var(--ds-space-4);
  margin-top: var(--ds-space-1);
  background: var(--ds-surface-raised);
  border: none;
  border-radius: var(--ds-radius-card);
  box-shadow: var(--ds-shadow-e4);
  font-family: var(--ds-font-body);
  font-size: var(--ds-text-body-sm);
}

/* header → flex row [prev] [title] [next]  (DOM order is prev, next, title; flex
   ignores customize's floats and `order` rearranges to nav | title | nav) */
.orbit-datepicker .ui-datepicker-header {
  display: flex;
  align-items: center;
  gap: var(--ds-space-2);
  height: auto;
  margin: 0 0 var(--ds-space-3);
  padding: 0;
  background: transparent;
  border: none;
}
.orbit-datepicker .ui-datepicker-title {
  order: 1;
  flex: 1;
  margin: 0;
  line-height: 1.2;
  text-align: center;
}
/* title text spans (customize paints these white) */
.orbit-datepicker .ui-datepicker-month,
.orbit-datepicker .ui-datepicker-year {
  color: var(--ds-text-1);
  font-family: var(--ds-font-heading);
  font-size: var(--ds-text-h6);
  font-weight: var(--ds-fw-medium);
  letter-spacing: var(--ds-ls-h5);
}

/* prev / next → domed circle buttons (mirror .ds-cal__nav). Keep customize's
   position:relative + cursor; restyle the circle, kill the sprite glyph, and
   redraw a centred CSS chevron (customize's was gray on the dark panel). */
.orbit-datepicker .ui-datepicker-prev,
.orbit-datepicker .ui-datepicker-next {
  flex-shrink: 0;
  width: 32px; height: 32px;
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-circle);
  text-indent: 0;
  overflow: visible;
  transition: var(--ds-transition-base);
}
.orbit-datepicker .ui-datepicker-prev { order: 0; }
.orbit-datepicker .ui-datepicker-next { order: 2; }
.orbit-datepicker .ui-datepicker-prev:hover,
.orbit-datepicker .ui-datepicker-next:hover {
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-hover);
  transform: var(--ds-lift-hover);
}
.orbit-datepicker .ui-datepicker-prev:active,
.orbit-datepicker .ui-datepicker-next:active {
  box-shadow: var(--ds-shadow-neu-pressed);
  transform: none;
}
.orbit-datepicker .ui-datepicker-prev .ui-icon,
.orbit-datepicker .ui-datepicker-next .ui-icon { display: none; }   /* hide the sprite + hidden text */
/* CSS chevron, centred in the circle (fully overrides customize's :after) */
.orbit-datepicker .ui-datepicker-prev::after,
.orbit-datepicker .ui-datepicker-next::after {
  content: "";
  position: absolute;
  top: 50%; left: 50%;
  width: 7px; height: 7px;
  margin: 0;
  border: solid var(--ds-text-1);
  pointer-events: none;
}
.orbit-datepicker .ui-datepicker-prev::after { border-width: 0 0 2px 2px; transform: translate(-40%, -50%) rotate(45deg); }   /* "<" */
.orbit-datepicker .ui-datepicker-next::after { border-width: 2px 2px 0 0; transform: translate(-60%, -50%) rotate(45deg); }   /* ">" */

/* weekday header row (customize colours the inner <span>, so override the span) */
.orbit-datepicker table.ui-datepicker-calendar {
  width: 100%;
  margin: 0;
  border-collapse: collapse;
}
.orbit-datepicker .ui-datepicker-calendar thead th { border: none; }
.orbit-datepicker .ui-datepicker-calendar thead th span {
  color: var(--ds-text-3);
  font-size: 11px;
  font-weight: var(--ds-fw-medium);
  text-transform: uppercase;
  letter-spacing: var(--ds-ls-eyebrow);
}

/* day cells — each day == a ghost button with a hover/selected disc (.ds-cal__day) */
.orbit-datepicker .ui-datepicker-calendar td {
  padding: 1px;
  border: none;
  text-align: center;
  background: transparent;
}
.orbit-datepicker .ui-datepicker-calendar td a,
.orbit-datepicker .ui-datepicker-calendar td span {
  position: relative;
  isolation: isolate;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px; height: 38px;
  margin: 0 auto;
  padding: 0;
  border: none;
  border-radius: var(--ds-radius-full);
  background: transparent;
  color: var(--ds-text-1) !important;          /* beat customize .ui-state-default { color:#fff !important } */
  font-size: var(--ds-text-body-sm);
  font-variant-numeric: tabular-nums;
  line-height: 1;
  text-decoration: none;
}
.orbit-datepicker .ui-datepicker-calendar td a {
  cursor: pointer;
  transition: color var(--ds-duration-fast) var(--ds-ease-out);
}
.orbit-datepicker .ui-datepicker-calendar td a::before {
  content: "";
  position: absolute; inset: 0; margin: auto;
  width: 34px; height: 34px; z-index: -1;
  border-radius: var(--ds-radius-full);
  background: transparent;
  transition: background var(--ds-duration-fast) var(--ds-ease-out),
              box-shadow var(--ds-duration-base) var(--ds-ease-spring);
}
.orbit-datepicker .ui-datepicker-calendar td a:hover::before { background: var(--ds-accent-subtle); }
/* other-month / disabled days → muted (jQuery UI renders these as <span>) */
.orbit-datepicker .ui-datepicker-other-month span,
.orbit-datepicker .ui-datepicker-unselectable span { color: var(--ds-ink-disabled) !important; }

/* today — the underline-DOT motif (matches .ds-cal__day--today; ink, not the
   customize yellow highlight) */
.orbit-datepicker .ui-datepicker-calendar td a.ui-state-highlight {
  background: transparent !important;          /* beat customize #fffa90 !important */
  color: var(--ds-text-1) !important;          /* beat customize #777620 !important */
}
.orbit-datepicker .ui-datepicker-today a::after {
  content: "";
  position: absolute; left: 50%; bottom: 4px; transform: translateX(-50%);
  width: 4px; height: 4px; border-radius: var(--ds-radius-full);
  background: var(--ds-ink);
}
/* selected (.ui-state-active) — the established active fill: ink disc + dark shadow */
.orbit-datepicker .ui-datepicker-calendar td a.ui-state-active {
  background: transparent !important;          /* beat customize background: var(--theme-color) !important */
  color: var(--ds-on-ink) !important;
}
.orbit-datepicker .ui-datepicker-calendar td a.ui-state-active::before {
  background: var(--ds-ink);
  box-shadow: var(--ds-shadow-dark-button);
}
.orbit-datepicker .ui-datepicker-today a.ui-state-active::after { background: var(--ds-on-ink); }

/* ==========================================================================
   20. STOCK LIST  (/stok-listesi-tum/stok-listesi — AppUser/Cari StockList)
   --------------------------------------------------------------------------
   The catalog page: a two-column .row (filter sidebar + product grid). Product
   cards (.urun-row) come from ERP/ListePaged.cshtml via AJAX (styled by
   urun-listesi.css); the toolbar, noUiSlider price slider, custom pagination
   and filter checkboxes are page-specific widgets NOT covered by §0-19. All
   rules are SCOPED to the stock-list custom classes, so they can't reach any
   other .ds-skin page. Some legacy rules use IDs (e.g. `.stok-listesi-filters
   #ddlSort` = 1,1,0), so these add `.ds-skin` to out-rank them (1,2,0).
   ========================================================================== */

/* ---- product card → raised neumorphic surface (was white #fff + flat shadow,
        urun-listesi.css §.urun-row). Wins via the extra .ds-skin class. ---- */
.ds-skin .urun-row {
  background: var(--ds-surface) !important;
  border: none !important;
  border-radius: var(--ds-radius-lg) !important;
  box-shadow: var(--ds-shadow-neu-sm) !important;
  transition: box-shadow var(--ds-duration-base) var(--ds-ease-spring),
              transform var(--ds-duration-moderate) var(--ds-ease-spring);
}
.ds-skin .urun-row:hover { box-shadow: var(--ds-shadow-neu-hover) !important; }
/* soften the hard #f0f0f0 column dividers (list view) to the DS hairline */
.ds-skin .urun-row > .stok-adet,
.ds-skin .urun-row > .urun-fiyat,
.ds-skin .urun-row > .sepete-ekle { border-left-color: var(--ds-border-hairline) !important; }
.ds-skin .urun-row .stok-kodu { color: var(--ds-text-3); }

/* ---- PRODUCT CARD POLISH — the metadata tags, the stock-quantity figure and the
        package-ratio chip now use the real DS BADGE component directly in the markup
        (ERP/ListePaged.cshtml): ds-badge--surface --sm for the code tags + ratio
        chip, ds-badge--success / --error / --warning for the stock state. No skin
        override is needed for those — the component carries the look. We only widen
        the tag row's gap (the legacy .egk-label sat at a 2px gap). ---- */
.ds-skin .ozellik-tablosu-tip2 { gap: var(--ds-space-1-5); margin-top: var(--ds-space-1); }

/* ---- STOCK BADGES (.stock-amount = on-hand qty · .paket-icerik = pack ratio):
        a leading FA glyph, centered icon+figure, and vertical breathing. The badges
        are real ds-badge (inline-flex + gap + align-items:center) and stretch to the
        column width, so the ::before glyph drops in as a centered leading icon and
        justify-content:center pulls the icon+figure to the middle (they read left-
        aligned today). The glyph is CONSTANT per badge type → presentational, so it
        lives in CSS, not the 13 stock-level Razor branches in ListePaged.cshtml. ---- */
.ds-skin .urun-row > .stok-adet { min-width: 140px; }      /* widen so figure+icon stay on one line (was 110px) */
.ds-skin .stok-adet { gap: var(--ds-space-2); }            /* breathe between the two stacked badges */
.ds-skin .stok-adet .stock-amount,
.ds-skin .stok-adet .paket-icerik {
  justify-content: center;                                 /* centre icon + figure as a group */
  white-space: nowrap;                                     /* the leading icon must not push the figure onto a 2nd line */
  font-variant-numeric: tabular-nums;
}
.ds-skin .stok-adet .stock-amount { padding: var(--ds-space-2) var(--ds-space-3); }      /* taller than the default badge */
.ds-skin .stok-adet .paket-icerik { padding: var(--ds-space-1-5) var(--ds-space-2-5); }  /* taller than --sm */

/* leading glyphs — FA6 Pro Light via ::before (it's a flex item, so the badge's gap
   + align-items:center place and centre it for free). dolly = on-hand stock; open
   box = package content. Skip the blocked-stock state (a status, not a quantity). */
.ds-skin .stok-adet .stock-amount:not(.stokta-var-yok)::before,
.ds-skin .stok-adet .paket-icerik::before {
  font-family: "Font Awesome 6 Pro";
  font-weight: 300;
  font-style: normal;
  line-height: 1;
  -webkit-font-smoothing: antialiased;
  opacity: .85;
}
.ds-skin .stok-adet .stock-amount:not(.stokta-var-yok)::before { content: "\f472"; }            /* fa-dolly */
.ds-skin .stok-adet .paket-icerik::before { content: "\f49e"; font-size: .95em; }               /* fa-box-open */

/* price block (table.fiyat-tablosu = label | value | unit) → 3 tidy columns:
   muted labels, tabular figures, the buyer's "Size Özel Fiyat" emphasised. */
.ds-skin .urun-fiyat .fiyat-tablosu td { padding: 1px 6px !important; vertical-align: baseline; font-variant-numeric: tabular-nums; }
.ds-skin .urun-fiyat .fiyat-tablosu td:first-child { color: var(--ds-text-3); }
.ds-skin .urun-fiyat .size-ozel-fiyat { color: var(--ds-text-1); font-weight: var(--ds-fw-semibold); }
.ds-skin .urun-fiyat .kdv { color: var(--ds-text-3); }

/* the add-to-cart is the single brand action → full radius (was .rounded-bottom,
   top corners square — read as a clipped strip). */
.ds-skin .sepete-ekle .egk-btn-primary.rounded-bottom { border-radius: var(--ds-radius-btn) !important; }

/* collapse the announcement carousel (.Duyuru1) when it has NO slides — it
   otherwise renders as a ~300px white void above the list. Reappears
   automatically when a tenant actually has banner images. */
.ds-skin .Duyuru1:not(:has(img)) { display: none !important; }

/* ---- toolbar (.stok-listesi-filters): search field + sort select. The legacy
        rules carry IDs, so we add .ds-skin to win (1,2,0 > 1,1,0). ---- */
.ds-skin .stok-listesi-filters #searchInput {
  background: var(--ds-surface) !important;
  border: none !important;
  border-radius: var(--ds-radius-md) !important;
  box-shadow: var(--ds-shadow-neu-sm) !important;
  height: var(--orbit-control-h) !important;
  padding: 0 44px 0 48px !important;   /* clear the leading disc (L) + the × (R) — matches .cari-ara §11 */
  color: var(--ds-text-1) !important;
}
.ds-skin .stok-listesi-filters #searchInput:focus {
  box-shadow: var(--ds-shadow-neu-sm), 0 0 0 3px var(--orbit-ring) !important;
  outline: none;
}
/* magnifier → raised domed disc on the LEFT (mirrors .cari-ara .btn-ikon §11), so
   the stok search reads identically to the cari search box. Stays clickable — the
   cari disc is decorative (pointer-events:none); this one may trigger search — so
   no pointer-events reset. */
.ds-skin .stok-listesi-filters #input-groups-btn {
  position: absolute;
  left: var(--ds-space-2);
  right: auto !important;
  top: 50% !important;
  transform: translateY(-50%);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px !important;
  padding: 0 !important;
  border: none !important;
  border-radius: var(--ds-radius-full) !important;
  background: var(--ds-surface) !important;
  box-shadow: var(--ds-shadow-neu-circle) !important;
  color: var(--theme-color-ink, var(--theme-color)) !important;   /* brand glyph on the disc */
}
.ds-skin .stok-listesi-filters #input-groups-btn i { color: inherit !important; }
/* clear (×) → right-edge quiet ghost (was production red at right:54px, tucked left
   of the old right-side magnifier). Mirrors .cari-ara .btn-temizle §11. */
.ds-skin .stok-listesi-filters .clear-search {
  right: var(--ds-space-2) !important;
  left: auto;
  top: 50% !important;
  transform: translateY(-50%);
}
.ds-skin .stok-listesi-filters .clear-search i { color: var(--ds-text-3) !important; }
.ds-skin .stok-listesi-filters #ddlSort {
  background-color: var(--ds-surface) !important;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-opacity='.55' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important;
  background-position: right var(--ds-space-4) center !important;
  border: none !important;
  border-radius: var(--ds-radius-md) !important;
  box-shadow: var(--ds-shadow-neu-sm) !important;
  height: var(--orbit-control-h) !important;
  padding: 0 calc(var(--ds-space-4) + 22px) 0 var(--ds-space-4) !important;
  color: var(--ds-text-1) !important;
  -webkit-appearance: none !important; -moz-appearance: none !important; appearance: none !important;
}
[data-theme="dark"] .ds-skin .stok-listesi-filters #ddlSort {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-opacity='.6' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") !important;
}

/* the three icon actions (barcode / hide-price / grid-view) now use the real DS
   component: <button class="ds-btn ds-btn--secondary ds-btn--icon">. Size them to
   the shared control height so they line up with the search field + sort select.
   On the <1200px column layout the legacy rule stretches them full-width, so we
   drop the square aspect-ratio there. */
.ds-skin .stok-listesi-filters .ds-btn--icon {
  flex: 0 0 auto;
  width: var(--orbit-control-h);
  height: var(--orbit-control-h);
}
@media (max-width: 1200px) {
  .ds-skin .stok-listesi-filters .ds-btn--icon { width: 100%; aspect-ratio: auto; }
}
/* their glyphs carry the brand ink — the DS default (.ds-btn--secondary { color:
   var(--ds-text-1) }) is near-black. Matches the search disc + the navbar medallions. */
.ds-skin .stok-listesi-filters .ds-btn--icon i,
.ds-skin .stok-listesi-filters .ds-btn--icon svg {
  color: var(--theme-color-ink, var(--theme-color)) !important;
}

/* ---- custom pagination (.pagination-button / .pagination-number, NOT the
        §13 .paginate-button) → neu circles; active page = brand fill ---- */
.ds-skin .pagination-button,
.ds-skin .pagination-number {
  background: var(--ds-surface) !important;
  border: none !important;
  box-shadow: var(--ds-shadow-neu-sm) !important;
  color: var(--ds-text-2) !important;
  border-radius: var(--ds-radius-full) !important;
  transition: var(--ds-transition-base);
}
.ds-skin .pagination-button:hover,
.ds-skin .pagination-number:hover {
  color: var(--ds-text-1) !important;
  box-shadow: var(--ds-shadow-neu-hover) !important;
  transform: var(--ds-lift-hover);
}
.ds-skin .pagination-number.active {
  background: var(--ds-accent) !important;
  color: var(--ds-accent-fg) !important;
  box-shadow: var(--ds-shadow-dark-button) !important;
}

/* ---- quantity stepper input → flat neu field (the +/- chevrons stay absolute) ---- */
.ds-skin .quantityContainer input {
  background: var(--ds-surface) !important;
  border: none !important;
  border-radius: var(--ds-radius-md) !important;
  box-shadow: var(--ds-shadow-neu-sm) !important;
  color: var(--ds-text-1) !important;
}
.ds-skin .quantityContainer #qtyDecrease,
.ds-skin .quantityContainer #qtyIncrease { color: var(--ds-text-2); }
/* breathe between the stepper field and the add-to-cart button — both are now
   fully-rounded neu controls (input §20 above, button §20 .rounded-bottom), so they
   read as two separate controls rather than one clipped stack. (customize.css sets
   `#sepet-butonu { margin:auto }`; this overrides just the top.) */
.ds-skin .quantityContainer #sepet-butonu { margin-top: var(--ds-space-2-5); }

/* ---- noUiSlider price range → brand-filled range + neu-circle handle.
        Appearance only (no width/offset changes) so the drag geometry holds. ---- */
.ds-skin #stockslider .noUi-connect { background: var(--ds-accent) !important; }
.ds-skin #stockslider .noUi-handle {
  background: var(--ds-surface) !important;
  border: none !important;
  border-radius: var(--ds-radius-full) !important;
  box-shadow: var(--ds-shadow-neu-circle) !important;
  cursor: pointer;
}
.ds-skin #stockslider .noUi-handle::before,
.ds-skin #stockslider .noUi-handle::after { display: none !important; }

/* ---- filter checkbox + "Stoktakileri Göster" toggle → brand accent when checked ---- */
.ds-skin .checkbox-filter-wrapper input[type="checkbox"]:checked ~ .checkbox-square {
  background: var(--ds-accent) !important;
  border-color: var(--ds-accent) !important;
}
.ds-skin input:checked + input + .chkSliderSettings { background: var(--ds-accent) !important; }

/* ---- FILTER CARDS — each category (Marka, Ürün Grubu, Tip…) is now its OWN card:
        StockListPaged.js renders `.egk-panel.filtre-card`, and the cshtml dropped the
        outer "Stok Filtrele" card + caption. The card title is an inset chip with the
        shared fa-filter disc — it falls out of §22 Tier-2 automatically (the wrapper is
        now .egk-panel, no longer .panel-default), so no caption CSS is needed here.
        The slider / Stoktakileri / Temizle controls live in their own .filtre-kontrol-
        karti card. ---- */
.ds-skin .filtre-card { padding: var(--ds-space-4); }       /* compact — the sidebar stacks several */
.ds-skin .filtre-card:hover { box-shadow: var(--ds-shadow-neu); }   /* no hover-lift: a column of cards lifting on every mouseover reads jittery */

/* category search field → a compact CARVED search slot: an inset well (vs §5's raised
   field — these are secondary, one per card) with a leading magnifier and a muted
   placeholder, so it reads as "type to filter", not a big pale box. Equal specificity
   to §5 but later in source + !important → wins. Margin gives the caption→search and
   search→list breathing room the user flagged. */
.ds-skin .filtre-ara {
  height: 38px !important;
  background-color: var(--ds-surface) !important;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-opacity='.42' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='M21 21l-4.1-4.1'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important;
  background-position: left var(--ds-space-3) center !important;
  background-size: 15px 15px !important;
  border: none !important;
  border-radius: var(--ds-radius-md) !important;
  box-shadow: var(--ds-shadow-neu-inset) !important;
  padding: 0 var(--ds-space-3) 0 calc(var(--ds-space-3) + 22px) !important;   /* room for the leading magnifier */
  margin: var(--ds-space-3) 0 var(--ds-space-4) !important;                   /* gap below the caption + above the checkbox list */
  font-size: var(--ds-text-body-sm) !important;
  color: var(--ds-text-1) !important;
}
.ds-skin .filtre-ara::placeholder { color: var(--ds-text-3); opacity: 1; }
.ds-skin .filtre-ara:focus {
  box-shadow: var(--ds-shadow-neu-inset), 0 0 0 3px var(--orbit-ring) !important;
  outline: none;
}
[data-theme="dark"] .ds-skin .filtre-ara {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-opacity='.5' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='M21 21l-4.1-4.1'/%3E%3C/svg%3E") !important;
}

/* ---- PRICE / OPTIONS CARD (.filtre-kontrol-karti — the price range, Stoktakileri
        toggle and Temizle). The figure was shown THREE times (number inputs + slider
        tooltips + pips); collapse to one source of truth (the inputs), carve the track,
        and turn the basic toggle into a DS switch. ---- */

/* Min / Max number fields → neu field, drop the native spin buttons, centred figure.
   Labels → muted eyebrow (were heavy black). */
.ds-skin .filtre-kontrol-karti .form-label {
  font-size: var(--ds-text-caption);
  font-weight: var(--ds-fw-semibold);
  letter-spacing: var(--ds-ls-eyebrow);
  text-transform: uppercase;
  color: var(--ds-text-3);
  margin-bottom: var(--ds-space-1-5);
}
.ds-skin .filtre-kontrol-karti input[type="number"] {
  border-radius: var(--ds-radius-md) !important;   /* beat the inline legacy radius */
  text-align: center;
  font-variant-numeric: tabular-nums;
  -moz-appearance: textfield;
}
.ds-skin .filtre-kontrol-karti input[type="number"]::-webkit-outer-spin-button,
.ds-skin .filtre-kontrol-karti input[type="number"]::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}

/* slider: the number fields already show + edit the values live, so the handle
   tooltips are redundant noise → hide them. Carve the unfilled track into a neu
   groove; the §20 .noUi-connect already fills it with the brand accent. */
.ds-skin #stockslider .noUi-tooltip { display: none !important; }
.ds-skin #stockslider.noUi-target {
  height: 8px;
  border: none;
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface-sunken);
  box-shadow: var(--ds-shadow-neu-inset);
}
.ds-skin #stockslider .noUi-connect { border-radius: var(--ds-radius-full); }
/* drop the pip ruler entirely — it collided with the handles and merely repeated the
   number fields' min/max. A bare track + two clean knobs reads far calmer. */
.ds-skin #stockslider .noUi-pips { display: none !important; }
/* handles → true neu circles (the noUiSlider base is a 34×28 oval). Re-centre for the
   smaller size (base offsets assume a 34px handle) and sit them on the 8px track. The
   neu-circle surface + shadow come from the §20 .noUi-handle rule above. */
.ds-skin #stockslider .noUi-handle {
  width: 22px;
  height: 22px;
  left: -11px;
  top: -7px;
  border-radius: var(--ds-radius-full);
}

/* Stoktakileri toggle → DS switch: inset track, neu knob, accent when on (the
   :checked → accent fill already lands from §20 above). */
.ds-skin .filtre-kontrol-karti .chkSliderSettings {
  background-color: var(--ds-surface-sunken) !important;
  box-shadow: var(--ds-shadow-neu-inset);
  border-radius: var(--ds-radius-full);
}
.ds-skin .filtre-kontrol-karti .chkSliderSettings::before {
  background-color: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-sm);
}
.ds-skin .filtre-kontrol-karti .chkSwitch + span { color: var(--ds-text-2); font-size: var(--ds-text-body-sm); }

/* Temizle → one calm, full-width reset action (was a stray centred pill) */
.ds-skin .filtre-kontrol-karti .ResetSide {
  width: 100%;
  justify-content: center;
  gap: var(--ds-space-2);
  margin-top: var(--ds-space-2);
}

/* ---- CARI INFO CARDS (Borç / Risk / Puan / Sipariş — CariInfoYatay.cshtml) → equal
        height across the row. They differ only by row count (4 vs 3), and BS3 float
        columns don't equalise; make the row a flex line so every card stretches to the
        tallest. Wrapped rows (sm/xs) keep their gap via row-gap; the block keeps its
        gap below via the wrapper (cards' own margin-bottom is zeroed to avoid a double
        gap that would also break the stretch). ---- */
.ds-skin .CariBilgileriYatay { margin-bottom: var(--ds-gap); }
.ds-skin .CariBilgileriYatay .row {
  display: flex;
  flex-wrap: wrap;
  row-gap: var(--ds-gap);
}
.ds-skin .CariBilgileriYatay .row > [class*="col-"] { display: flex; }
.ds-skin .CariBilgileriYatay .row > [class*="col-"] > .egk-panel { width: 100%; margin-bottom: 0; }
/* these cards use .cari-collapse-trigger (synced collapse) instead of .egk-collapse-button,
   so re-add the pointer cursor that §8 gives the latter. */
.ds-skin .cari-collapse-trigger { cursor: pointer; }

/* Cari Bilgileri (sidebar) card → trim the side padding so the whole block sits
   further left and the detail column gains width — names/address wrap to ~2 lines
   even on narrower (24") screens, matching the 27" fit. Vertical padding is left
   as the card default. */
.ds-skin .cari-karne-panel { padding-left: var(--ds-space-4); padding-right: var(--ds-space-4); }

/* ==========================================================================
   20-R. STOCK LIST REDESIGN (2026-07-03) — "the buy line"
   --------------------------------------------------------------------------
   Design pass over §20. Thesis: this page is a wholesale re-ordering counter —
   find the SKU → check stock + YOUR price → add to cart, dozens of times a
   session — so every row should read left→right like that sentence. Moves:
     1. ACCOUNT RIBBON — Borç/Risk/Puan/Sipariş cards ship collapsed with the
        headline figure in the header (.cari-stat-headline, CariInfoYatay.cshtml);
        the full ledger expands on click. Products enter the first viewport.
     2. ROW HIERARCHY — product name leads (flex `order`), SKU/barcode become a
        quiet glyph meta-line, the negotiated price is the row's figure, and all
        numerals go tabular Inter (--ds-font-caption) per the font strategy.
     3. BUY CONTROL — (−)[qty](+) [Sepete Ekle] fuse onto one line: neu-circle
        chevrons, carved qty well, labeled CTA (.sepet-btn-label, ListePaged).
   List-view LAYOUT rules sit behind @media (min-width:1201px) — below that,
   urun-listesi.css reflows each card into a vertical tile and must win. Type +
   colour rules apply at every width. Grid view keeps its icon-only CTA.
   Revert: delete this section + revert CariInfoYatay.cshtml / ListePaged.cshtml.
   ========================================================================== */

/* ---- 1. ACCOUNT RIBBON ------------------------------------------------- */
/* slim cards: header-only when collapsed */
.ds-skin .CariBilgileriYatay .egk-panel { padding: var(--ds-space-3) var(--ds-space-4); }
.ds-skin .CariBilgileriYatay .egk-content-header {
  display: flex;
  align-items: center;
  gap: var(--ds-space-2);
}
.ds-skin .CariBilgileriYatay .egk-content-title { flex: 0 0 auto; }
/* the headline figure — the one number each ledger boils down to */
.ds-skin .cari-stat-headline {
  margin-left: auto;
  font-family: var(--ds-font-caption);
  font-size: var(--ds-text-body);
  font-weight: var(--ds-fw-semibold);
  font-variant-numeric: tabular-nums;
  color: var(--ds-text-1);
  white-space: nowrap;
}
/* the global collapse rides a sluggish 1s transition — the ribbon wants a snap */
.ds-skin .CariBilgileriYatay .egk-collapse-menu { transition: height .25s var(--ds-ease-spring), opacity .2s ease; }

/* ---- 2. ROW HIERARCHY — type & colour (all widths) ---------------------- */
/* product name = the subject of the row */
.ds-skin .urun-detay .urun-baslik > span {
  font-size: 15px;
  font-weight: var(--ds-fw-semibold);
  color: var(--ds-text-1);
  line-height: 1.4;
}
.ds-skin .urun-detay .urun-baslik > span:hover { color: var(--theme-color-ink, var(--theme-color)); }
/* SKU / barcode → glyph meta-line (markup swapped "Stok Kodu:" for fa-hashtag /
   fa-barcode). cursor:copy advertises the click-to-copy behaviour. */
.ds-skin .urun-row .stok-kodu {
  align-items: center;
  gap: var(--ds-space-1-5);
  font-family: var(--ds-font-caption);
  font-size: var(--ds-text-caption);
  font-variant-numeric: tabular-nums;
  color: var(--ds-text-3);
  cursor: copy;
}
.ds-skin .urun-row .stok-kodu i { font-size: 11px; opacity: .8; }
/* "Görsel Yok" → a quiet carved tile (a placeholder shouldn't shout its absence).
   The tile bounds ONLY the placeholder — real photos render up to 132×110 (below).
   accent-soft, not surface-sunken: the carved wells carry the brand wash (§18). */
.ds-skin .urun-row .no-image {
  width: 96px;
  height: 96px;
  border-radius: var(--ds-radius-md);
  background: var(--orbit-accent-soft);
  box-shadow: var(--ds-shadow-neu-inset);
  color: var(--ds-text-3);
  display: flex;
  align-items: center;
  justify-content: center;
}
.ds-skin .urun-row .no-image i { font-size: 24px; opacity: .5; }
.ds-skin .urun-row .no-image span { display: none; }
/* price block: the buyer's negotiated figure is the hero; list price recedes */
.ds-skin .urun-fiyat .size-ozel-fiyat,
.ds-skin .urun-fiyat .liste-fiyat {
  font-family: var(--ds-font-caption);
  font-variant-numeric: tabular-nums;
}
.ds-skin .urun-fiyat .fiyat-tablosu .size-ozel-fiyat {
  font-size: 17px;
  font-weight: 650;
  letter-spacing: -0.01em;
  color: var(--ds-text-1);
}
.ds-skin .urun-fiyat .fiyat-tablosu .liste-fiyat { color: var(--ds-text-2); }
/* stock figures join the numeral face */
.ds-skin .stok-adet .stock-amount,
.ds-skin .stok-adet .paket-icerik { font-family: var(--ds-font-caption); }

/* ---- 2b. ROW HIERARCHY — layout (list view, desktop only) --------------- */
@media (min-width: 1201px) {
  /* name first (order:-1), then the meta-line, then the tag chips — and the
     column stacks from the top instead of space-between scattering it */
  .ds-skin .stockListPartialField:not(.stockListGrid) .urun-row > .urun-detay {
    justify-content: flex-start;
    gap: var(--ds-space-1);
    padding: var(--ds-space-3) var(--ds-space-2) var(--ds-space-3) var(--ds-space-4);
  }
  .ds-skin .stockListPartialField:not(.stockListGrid) .urun-detay > .urun-baslik { order: -1; margin: 0; }
  /* SKU + barcode side by side on one quiet line */
  .ds-skin .stockListPartialField:not(.stockListGrid) .urun-detay > .sk-wrapper {
    flex-direction: row !important;
    flex-wrap: wrap;
    align-items: center;
    column-gap: var(--ds-space-4);
  }
  /* tag chips anchor to the row's bottom edge — identity (name + SKU) reads at the
     top, logistics chips settle at the base instead of floating mid-card */
  .ds-skin .stockListPartialField:not(.stockListGrid) .ozellik-tablosu-tip2 { margin-top: auto; padding-top: var(--ds-space-2); }
  /* image column: full-bleed photo — a 150px column stretched to the row height,
     the image cover-fills it and touches the card's left/top/bottom edges (the
     card's radius + overflow:hidden clip the corners; cover-crop is the accepted
     price). max-none lifts urun-listesi's 140×140 base cap. The no-image
     placeholder stays a compact centered 96×96 tile (above). */
  .ds-skin .stockListPartialField:not(.stockListGrid) .urun-gorsel {
    padding: 0;
    width: 150px;
    min-width: 150px;
    align-self: stretch;
  }
  .ds-skin .stockListPartialField:not(.stockListGrid) .urun-gorsel img {
    width: 100%;
    height: 100%;
    max-width: none;
    max-height: none;
    object-fit: cover;
  }
}

/* ---- 3. BUY CONTROL (list view, desktop only) ---------------------------
   (−) [qty] (+) [🛒 Sepete Ekle] on one line. The chevrons leave their absolute
   perch (customize.css) and become neu circles; the qty input turns into a
   carved well; the CTA carries a real label. */
@media (min-width: 1201px) {
  .ds-skin .stockListPartialField:not(.stockListGrid) .urun-row > .sepete-ekle {
    width: 264px;
    min-width: 264px;
    padding: var(--ds-space-3);
  }
  .ds-skin .stockListPartialField:not(.stockListGrid) .quantityContainer {
    display: flex;
    align-items: center;
    gap: var(--ds-space-2);
    width: 100%;
  }
  .ds-skin .stockListPartialField:not(.stockListGrid) .quantityContainer #qtyDecrease,
  .ds-skin .stockListPartialField:not(.stockListGrid) .quantityContainer #qtyIncrease {
    position: static;
    flex: 0 0 auto;
    width: 28px;
    height: 28px;
    padding: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: var(--ds-radius-full);
    background: var(--ds-surface);
    box-shadow: var(--ds-shadow-neu-circle);
    font-size: 12px;
    transition: var(--ds-transition-base);
  }
  .ds-skin .stockListPartialField:not(.stockListGrid) .quantityContainer #qtyDecrease:hover,
  .ds-skin .stockListPartialField:not(.stockListGrid) .quantityContainer #qtyIncrease:hover {
    color: var(--ds-text-1);
    box-shadow: var(--ds-shadow-neu-hover);
  }
  .ds-skin .stockListPartialField:not(.stockListGrid) .quantityContainer input {
    flex: 0 0 52px;
    width: 52px;
    height: 34px;
    padding: 0;
    background: var(--orbit-accent-soft) !important;   /* brand-washed well (§18) */
    box-shadow: var(--ds-shadow-neu-inset) !important;
    font-family: var(--ds-font-caption);
    font-weight: var(--ds-fw-semibold);
    font-variant-numeric: tabular-nums;
  }
  .ds-skin .stockListPartialField:not(.stockListGrid) .quantityContainer #sepet-butonu {
    margin-top: 0;                    /* the §20 stacked-gap no longer applies */
    flex: 1 1 auto;
    width: auto;                      /* neutralise .full-width in the flex row */
    height: 38px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--ds-space-2);
    white-space: nowrap;
  }
}
.ds-skin .sepet-btn-label { font-size: 13px; font-weight: var(--ds-fw-semibold); }
/* grid tiles keep the icon-only CTA (tooltip still names the action) */
.ds-skin .stockListGrid .sepet-btn-label { display: none; }
/* grid tiles centre their text — the meta-line (inline-flex) must follow suit */
.ds-skin .stockListGrid .urun-row .stok-kodu { justify-content: center; width: 100%; }

/* ==========================================================================
   21. SHOPPING BASKET  (/siparis/siparis-sepeti — AppUser/Cari ShoppingBasket
       → ERP/ShoppingBasketPartial.cshtml, AJAX-reloaded into #ShoppingBasketArea)
   --------------------------------------------------------------------------
   .ds-skin sits on #ShoppingBasketArea so it survives the AJAX innerHTML reloads
   (qty/discount/price/remove handlers all call $("#ShoppingBasketArea").html()).
   The two .egk-panel cards (order form + totals), the #tableBasket cart and the
   .form-control fields are already handled by §1/§4/§5/§6 — these rules add the
   basket-specific widgets. The partial ships an inline <style> (orange
   .gradient-background, white row hover, .basket-totals padding); the extra
   `.ds-skin` class out-ranks it (0,2,0 > the inline 0,1,0).
   ========================================================================== */

/* empty-cart card → neu surface (override the inline box-shadow/bg via !important) */
.ds-skin .no-product {
  background: var(--ds-surface) !important;
  box-shadow: var(--ds-shadow-neu) !important;
  border-radius: var(--ds-radius-card) !important;
}

/* Akıllı Arama zero-result fallback (plan D1) — "Yapay zekâya sor" button +
   "Bunu mu demek istediniz?" chips, injected into .no-product by StockListPaged.js.
   Chip anatomy mirrors the Akıllı Sipariş summary chips (akilli-siparis.css). */
.ds-skin .ai-suggest {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--ds-space-3);
  margin: 0 auto var(--ds-space-3);
}
.ds-skin .ai-suggest-ask { gap: var(--ds-space-2); }
.ds-skin .ai-suggest-note {
  font-family: var(--ds-font-caption);
  font-size: var(--ds-text-caption);
  color: var(--ds-text-3);
}
.ds-skin .ai-suggest-title {
  font-weight: 600;
  color: var(--ds-text-2);
}
.ds-skin .ai-suggest-chips {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--ds-space-2);
}
.ds-skin .ai-suggest-chip {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  padding: 6px 14px;
  border: none;
  border-radius: var(--ds-radius-pill);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-sm);
  color: var(--ds-text-2);
  cursor: pointer;
}
.ds-skin .ai-suggest-chip:hover { color: var(--ds-text-1); filter: brightness(1.03); }
.ds-skin .ai-suggest-chip-kod {
  font-family: var(--ds-font-caption);
  font-size: var(--ds-text-caption);
  color: var(--ds-text-3);
  font-variant-numeric: tabular-nums;
}

/* inline cart inputs (qty / İskonto 1-3 / net price / açıklama) → carved neu WELLS.
   Editable cart values read as recessed slots (same inset style as the stock-list qty
   field), so the whole Miktar/İskonto/Net Fiyat band feels like one set of editable
   wells. Kept compact (NOT --orbit-control-h) so the dense cart rows don't grow tall. */
.ds-skin .sepet-input {
  background: var(--ds-surface-sunken) !important;
  border: none !important;
  border-radius: var(--ds-radius-md) !important;
  box-shadow: var(--ds-shadow-neu-inset) !important;
  color: var(--ds-text-1) !important;
  text-align: center;
  padding: var(--ds-space-1) var(--ds-space-2) !important;
}
.ds-skin .sepet-input:focus {
  box-shadow: var(--ds-shadow-neu-inset), 0 0 0 3px var(--orbit-ring) !important;
  outline: none;
}
.ds-skin .sepet-input[readonly],
.ds-skin .sepet-input:disabled {
  background: var(--ds-surface-sunken) !important;
  color: var(--ds-text-3) !important;
}
.ds-skin .sepet-input-addon { color: var(--ds-text-3); }

/* ---- cart quantity stepper → the stock-list buy control (§20 recipe) ------------
   "make the Miktar cell like the stock-list quantity input": neu-circle round
   chevrons flanking a carved qty well, laid out horizontally. Scoped by
   :has(.quantity-button) so ONLY the qty cells change — the İskonto / Net Fiyat /
   Satır Açıklaması cells (also .sepet-input-wrapper, but no chevrons) keep their §21
   field look. flex `order` yields decrease ⌄ | qty | increase ⌃ (the stock-list
   arrangement) regardless of the markup's DOM order, and turns off the legacy
   absolute-stacked chevrons from the partial's inline <style>. */
.ds-skin .sepet-input-wrapper:has(.quantity-button) {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--ds-space-2);
  position: static;
}
.ds-skin .sepet-input-wrapper:has(.quantity-button) .quantity-button {
  position: static;
  flex: 0 0 auto;
  width: 28px;
  height: 28px;
  top: auto;
  left: auto;
  bottom: auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-circle);
  color: var(--ds-text-2);
  font-size: 12px;
  transition: var(--ds-transition-base);
}
.ds-skin .sepet-input-wrapper:has(.quantity-button) .quantity-button:hover {
  color: var(--ds-text-1);
  box-shadow: var(--ds-shadow-neu-hover);
}
/* chevron-down = decrease → left; qty well → middle; chevron-up = increase → right */
.ds-skin .sepet-input-wrapper:has(.quantity-button) .quantity-add { order: 1; }
.ds-skin .sepet-input-wrapper:has(.quantity-button) .sepet-input {
  order: 2;
  flex: 0 0 52px;
  width: 52px !important;
  height: 34px;
  padding: 0 var(--ds-space-1) !important;
  background: var(--ds-surface-sunken) !important;
  box-shadow: var(--ds-shadow-neu-inset) !important;
  font-family: var(--ds-font-caption);
  font-weight: var(--ds-fw-semibold);
  font-variant-numeric: tabular-nums;
}
.ds-skin .sepet-input-wrapper:has(.quantity-button) .sepet-input:focus {
  box-shadow: var(--ds-shadow-neu-inset), 0 0 0 3px var(--orbit-ring) !important;
}
.ds-skin .sepet-input-wrapper:has(.quantity-button) .quantity-remove { order: 3; }
.ds-skin .sepet-input-wrapper:has(.quantity-button) .sepet-input-addon {
  position: static;
  order: 4;
  right: auto;
  top: auto;
  font-family: var(--ds-font-caption);
  font-size: var(--ds-text-caption);
  color: var(--ds-text-3);
}

/* totals summary: clean label | value rows with hairline separators */
.ds-skin .basket-totals .d-flex {
  align-items: center;
  border-bottom: var(--ds-bw-hairline) solid var(--ds-border-hairline);
}
.ds-skin .basket-totals .d-flex:last-child { border-bottom: none; }
.ds-skin .basket-totals .value {
  font-variant-numeric: tabular-nums;
  font-weight: var(--ds-fw-semibold);
  color: var(--ds-text-1);
}
.ds-skin .basket-totals .text-success { color: var(--ds-success) !important; }
.ds-skin .basket-totals .text-danger { color: var(--ds-error) !important; }

/* highlighted totals rows (Ara Toplam / Ödenecek) — kill the legacy orange
   (#f27a1a border + #fff2e9 bg) for a quiet brand-tinted band + accent stripe.
   Scoped under .basket-totals so a generic .gradient-background elsewhere is untouched. */
.ds-skin .basket-totals .gradient-background {
  background-color: var(--orbit-accent-soft) !important;
  border: none !important;
  border-left: 3px solid var(--ds-accent) !important;
  box-shadow: none !important;
  border-radius: var(--ds-radius-sm);
}

/* "Sepeti Temizle" (the .text-right div after the cart table) — the button was
   hugging the table card's bottom-right corner (the card is the runtime
   .dataTables_wrapper, so the div sits right against its edge). Seat it a
   standard gap below the card. */
.ds-skin #dvSepet .egk-content > .text-right { margin-top: var(--ds-gap); }

/* order form: .OrderForm shares .form-egk-form-label with the filter rows (§8),
   which lays it out as a horizontal flex. Keep the ORDER form a vertical stack. */
.ds-skin .OrderForm { display: block; margin: var(--ds-gap) 0 0; }
.ds-skin .OrderForm .egk-form-input { margin-bottom: var(--ds-space-4); position: relative; }
.ds-skin .OrderForm .egk-form-label {
  font-weight: var(--ds-fw-semibold);
  font-size: var(--ds-text-body-sm);
  color: var(--ds-text-1);
  margin-bottom: var(--ds-space-2);
}
.ds-skin .OrderForm .egk-form-input > i { color: var(--ds-text-3); }

/* ---- leading meaning-icons on every order-detail field (basket polish 2026-07) --
   The order form is a COMMIT surface — teslim carisi, şube, depo, delivery date,
   term (vade), payment & delivery method. Give each field a leading MEDALLION on its
   LEFT that names what it controls, so the labelled stack reads as a scannable
   checkout instead of a wall of look-alike inputs. Same raised domed disc as every
   other medallion in the app (caption mark §8, search disc, navbar): --ds-surface +
   --ds-shadow-neu-circle + brand-ink glyph. Specificity: `.ds-skin .OrderForm
   .egk-form-input > i.egk-field-icon` is (0,4,1) — it out-ranks §25's input-icon hide
   (:has → 0,3,2) and customize's right-anchored green arrow (0,2,1), so the glyph
   survives on plain inputs too (which §25 strips). The trailing chevron <i> (no
   .egk-field-icon) is untouched → selects keep both. */
.ds-skin .OrderForm .egk-form-input > i.egk-field-icon {
  position: absolute;
  left: var(--ds-space-2);
  right: auto !important;
  top: auto !important;
  bottom: 8px !important;            /* (46 − 30)/2 → 30px medallion centred in the field; !important beats §25's bottom:17px */
  width: 30px;
  height: 30px;
  display: inline-flex !important;   /* defeat Font Awesome's unlayered reset (cf. .egk-content-title-mark) */
  align-items: center;
  justify-content: center;
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-circle);   /* raised medallion — matches every other disc in the app */
  color: var(--theme-color-ink, var(--theme-color)) !important;   /* brand-ink glyph, like the caption mark */
  font-size: 13px !important;
  line-height: 1;
  transform: none !important;
  pointer-events: none;
  z-index: 1;
  transition: var(--ds-transition-base);
}
/* clear the well: push the field's text past the 30px disc. Selects need the rule on
   .ds-select-menu__trigger too — orbit-select.js hides the native select and shows the
   value in that trigger button, so padding the <select> alone leaves the text under
   the medallion. */
.ds-skin .OrderForm .egk-form-input:has(> i.egk-field-icon) input,
.ds-skin .OrderForm .egk-form-input:has(> i.egk-field-icon) select,
.ds-skin .OrderForm .egk-form-input:has(> i.egk-field-icon) .ds-select-menu__trigger,
.ds-skin .OrderForm .egk-form-input:has(> i.egk-field-icon) textarea { padding-left: 46px !important; }
/* a textarea is tall → seat the medallion near its TOP, not the field's vertical centre */
.ds-skin .OrderForm .egk-form-input:has(> textarea) > i.egk-field-icon { top: 35px !important; bottom: auto !important; }

/* ---- Ödenecek Tutar → the checkout hero number ---------------------------------
   The totals card lists a dozen quiet label|value rows; only ONE is the decision —
   the payable. Lift it out of the rhythm: brand-inked, larger, tabular, a touch more
   air. It keeps §21's soft-accent band + left stripe (already .gradient-background). */
.ds-skin .basket-totals .basket-payable {
  padding-top: var(--ds-space-4);
  padding-bottom: var(--ds-space-4);
}
.ds-skin .basket-totals .basket-payable > span:first-child {
  font-weight: var(--ds-fw-semibold);
  color: var(--ds-text-1);
}
.ds-skin .basket-totals .basket-payable .value {
  font-size: var(--ds-text-h5);
  font-weight: 700;
  color: var(--ds-accent);
}

/* ==========================================================================
   22. CAPTION HIERARCHY  (.egk-content-title — three tiers by context)
   --------------------------------------------------------------------------
   The raised-pill caption (§8) is a LANDMARK: a domed pill only reads as tactile
   on FLAT GROUND, used once — the dashboard badge (§16a) and the page headers in
   .egk-content (Cari Hareketler, Teklifler). Dropped INSIDE a card it fails two
   ways: (1) a raised pill on a raised .egk-panel (§1) = relief-on-relief — two
   stacked extrusions with no flat ground between them, so the neu shadow turns to
   mud; and (2) the filter sidebar stacks 5+ identical pills, so a section header
   ("Stok Filtrele") and a subordinate group label ("Ürün Çeşidi") carry the exact
   same weight — a landmark used 5× is just noise. Fix = demote BY CONTEXT, not by
   retuning the pill:
     · Tier 1 LANDMARK  .egk-content > .egk-content-title ...... unchanged (§8)
     · Tier 2 EMBEDDED  .egk-panel … .egk-content-title ........ flat card title
     · Tier 3 GROUP     .panel-default .egk-content-title ...... uppercase eyebrow
   Both tier selectors are (0,3,0) → they out-rank the §8 base (0,2,0) on
   specificity, so order vs §8 is irrelevant. Tier 2 and Tier 3 ARE equal (0,3,0)
   and the simple-mode filter group nests in BOTH .egk-panel and .panel-default —
   so Tier 3 MUST stay after Tier 2 below to win for that case. Delete this whole
   section to restore the pill everywhere.
   ========================================================================== */

/* ---- Tier 2 — EMBEDDED caption → inset chip. Keep the pill SHAPE but carve it
        INTO the card (a recessed label slot); carved-in-raised is a valid neu
        pairing, so it kills the relief-on-relief while staying tactile.
        The well takes the accent-soft brand wash (not plain surface) so section
        labels carry a hint of the tenant hue — same wash as the qty/no-image
        wells (§20).
        [ A/B: this is OPTION 2 "inset chip"; OPTION 1 toggle is below ] ---- */
.ds-skin .egk-panel .egk-content-title {
  background: var(--orbit-accent-soft);
  box-shadow: var(--ds-shadow-neu-inset);
  padding: var(--ds-space-2) var(--ds-space-4);
  border-radius: var(--ds-radius-pill);
  /* title text takes the brand ink (contrast-clamped, same as the disc glyph)
     so the whole chip — well, glyph, text — speaks the tenant hue */
  color: var(--theme-color-ink, var(--theme-color));
}
/* icon disc stays domed → it pops OUT of the carved chip well (coherent relief
   stack: card raised, chip recessed, disc raised within it). */
.ds-skin .egk-panel .egk-content-title-mark {
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-circle);
}

/* ---- Tier 3 — GROUP caption (Ürün Çeşidi / Marka / Ürün Grubu, rendered into
        .panel-default by StockListPaged.js) → quiet uppercase eyebrow, mirroring
        the table-header overline (§4). No pill, no disc, muted: these are SUB-
        labels of "Stok Filtrele", not peers of it. MUST follow Tier 2 (see note). */
.ds-skin .panel-default .egk-content-title {
  background: transparent;
  box-shadow: none;
  padding: 0;
  font-family: var(--ds-font-body);
  font-size: var(--ds-text-caption);
  font-weight: var(--ds-fw-semibold);
  letter-spacing: var(--ds-ls-eyebrow);
  text-transform: uppercase;
  color: var(--ds-text-3);
}

/* ==========================================================================
   OPTION 1 — "quiet card title": drop the pill entirely (flat title); the card
   IS the one elevation step, so the title just belongs to it. Icon disc flips
   domed → carved so it reads as a recess holding the glyph, not a second bump.
   TO TRY IT: comment out the two Tier-2 rules above and uncomment this block.
   Tier 3 (eyebrow) is shared — leave it as-is either way.
   --------------------------------------------------------------------------
.ds-skin .egk-panel .egk-content-title {
  background: transparent;
  box-shadow: none;
  padding: 0;
  border-radius: 0;
}
.ds-skin .egk-panel .egk-content-title-mark {
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-inset);
}
   ========================================================================== */


/* ==========================================================================
   23. SWEETALERT2  →  Orbit neumorphic dialogs   (.swal2-* — GLOBAL, unscoped)
   --------------------------------------------------------------------------
   SweetAlert2 (v11.10.5, loaded app-wide in _Layout) appends .swal2-container to
   <body>, OUTSIDE any .ds-skin wrapper — the same body-append escape handled for
   the datepicker in §19. Unlike the per-page adapters, this one is DELIBERATELY
   UNSCOPED: swal2's class names are globally unique, and a dialog is an inherently
   global widget (you can't half-skin your confirms), so it opts in nowhere and
   applies everywhere. :root tokens resolve fine on the body-appended popup, so
   light/dark (both keyed on [data-theme="dark"]) + the brand accent come for free.

   customize.css only lightly touches swal2 (z-index, base font-size, and a NON-
   important dark popup surface), so !important on paint properties wins over both
   customize and swal2's own injected stylesheet. We leave customize's z-index and
   toast font-size rules alone.

   Buttons: unify to the §6 language — confirm = brand-accent fill, cancel/deny =
   neutral raised neu. The !important beats swal2's per-call inline confirm/cancel
   ButtonColor (the app sets red/blue/brand ad-hoc across ~26 sites); those ad-hoc
   colours are intentionally RETIRED. Danger is carried by the status icon (§23a),
   not the button — matching the navbar/§6 "meaning via glyph, not fills" policy.
   ========================================================================== */

/* ---- popup surface → raised neu card (mirrors §19 popover elevation) ---- */
.swal2-popup {
  background: var(--ds-surface-default) !important;
  color: var(--ds-text-1) !important;
  border-radius: var(--ds-radius-card) !important;
  /* e4 = elevation drop (correct for a modal on a scrim — neu doesn't read off-canvas);
     + the Orbit top-light sheen so the card ties into the rest of the skin. */
  box-shadow: var(--ds-shadow-e4), inset 0 3px 1px var(--ds-neu-highlight) !important;
  font-family: var(--ds-font-body) !important;   /* beat customize `* { font-family: Poppins }` */
}
.swal2-title {
  color: var(--ds-text-1) !important;
  font-family: var(--ds-font-heading) !important;
  font-size: var(--ds-text-h5) !important;
  font-weight: var(--ds-fw-semibold) !important;
  letter-spacing: var(--ds-ls-h5);
}
.swal2-html-container { color: var(--ds-text-2) !important; }

/* close (×) → quiet ghost target (swal2 default hover is red) */
.swal2-close {
  color: var(--ds-text-3) !important;
  box-shadow: none !important;
  transition: var(--ds-transition-base);
}
.swal2-close:hover,
.swal2-close:focus {
  color: var(--ds-text-1) !important;
  background: transparent !important;
}

/* ---- buttons → mirror §6 (neutral raised neu; confirm = accent fill) ---- */
.swal2-styled {
  border: none !important;
  border-radius: var(--ds-radius-btn) !important;
  box-shadow: var(--ds-shadow-neu-sm) !important;
  padding: var(--ds-space-2) var(--ds-space-4) !important;
  font-family: var(--ds-font-body) !important;
  font-size: var(--ds-text-body-sm) !important;
  font-weight: var(--ds-fw-medium) !important;
  transition: var(--ds-transition-base);
}
.swal2-styled:hover {
  transform: var(--ds-lift-hover);
  box-shadow: var(--ds-shadow-neu-hover) !important;
}
.swal2-styled:active {
  transform: translateY(0);
  box-shadow: var(--ds-shadow-neu-pressed) !important;
}
/* kill swal2's default coloured focus box-shadow → brand ring */
.swal2-styled:focus {
  box-shadow: var(--ds-shadow-neu-sm), 0 0 0 3px var(--orbit-ring) !important;
}

/* confirm → brand accent fill (beats inline confirmButtonColor via !important) */
.swal2-styled.swal2-confirm {
  background: var(--ds-accent) !important;
  color: var(--ds-accent-fg) !important;
  box-shadow: var(--ds-shadow-dark-button) !important;
}
.swal2-styled.swal2-confirm:hover {
  transform: var(--ds-lift-hover);
  box-shadow: var(--ds-shadow-dark-button) !important;
}
.swal2-styled.swal2-confirm:active {
  transform: translateY(1px) scale(0.985);
  box-shadow: var(--ds-shadow-dark-pressed) !important;
}
.swal2-styled.swal2-confirm:focus {
  box-shadow: var(--ds-shadow-dark-button), 0 0 0 3px var(--orbit-ring) !important;
}

/* cancel / deny → DS outline (.ds-btn--outline): carved/recessed quiet action,
   NOT raised. Overrides inline cancelButtonColor. The base .swal2-styled:hover
   lift is cancelled so an outline button stays carved instead of popping up. */
.swal2-styled.swal2-cancel,
.swal2-styled.swal2-deny {
  background: var(--ds-surface) !important;
  color: var(--ds-text-2) !important;
  box-shadow: var(--ds-shadow-neu-inset) !important;
}
.swal2-styled.swal2-cancel:hover,
.swal2-styled.swal2-deny:hover {
  color: var(--ds-text-1) !important;
  transform: none !important;
  box-shadow: var(--ds-shadow-neu-inset) !important;
}
.swal2-styled.swal2-cancel:active,
.swal2-styled.swal2-deny:active {
  transform: none !important;
  box-shadow: var(--ds-shadow-neu-pressed) !important;
}
.swal2-styled.swal2-cancel:focus,
.swal2-styled.swal2-deny:focus {
  box-shadow: var(--ds-shadow-neu-inset), 0 0 0 3px var(--orbit-ring) !important;
}

/* ---- inputs → mirror §5 raised neu field ---- */
.swal2-input,
.swal2-file,
.swal2-textarea,
.swal2-select {
  background: var(--ds-surface) !important;
  border: none !important;
  border-radius: var(--ds-radius-md) !important;
  box-shadow: var(--ds-shadow-neu-sm) !important;
  color: var(--ds-text-1) !important;
  font-family: var(--ds-font-body) !important;
  font-size: var(--ds-text-body-sm) !important;
}
.swal2-input:focus,
.swal2-textarea:focus,
.swal2-select:focus {
  box-shadow: var(--ds-shadow-neu-sm), 0 0 0 3px var(--orbit-ring) !important;
  outline: none !important;
}
.swal2-input::placeholder,
.swal2-textarea::placeholder { color: var(--ds-text-3) !important; }
.swal2-validation-message {
  background: var(--ds-state-error-bg) !important;
  color: var(--ds-state-error-text) !important;
  border-radius: var(--ds-radius-sm) !important;
}

/* timer progress bar → brand accent */
.swal2-timer-progress-bar { background: var(--ds-accent) !important; }

/* ==========================================================================
   23a. SweetAlert2 status icons → neu disc + semantic glyph
   --------------------------------------------------------------------------
   "Neu disc, semantic glyph" (user choice): the coloured ring becomes a neutral
   raised disc (§17 medallion language) and the glyph keeps its meaning, recoloured
   to the richer, dark-aware --ds-state-*-icon palette. In v11.10.5 the success
   "circular-line" wedges carry NO background, so neutralising the ring + recolouring
   the check is enough (no bg-masking sliver to chase). Scoped to the standard
   (non-toast) dialog — toasts get their own 34px disc treatment in §23b.
   ========================================================================== */
.swal2-popup:not(.swal2-toast) .swal2-icon {
  background: var(--ds-surface) !important;
  border-color: transparent !important;
  /* NOT --ds-shadow-neu-circle: its two opposing inset rims (grey bottom + white top)
     read as a beveled RING at this 80px size ("circle inside a circle"). A single soft
     outer lift + one theme-aware top highlight = a clean raised medallion, no nested ring. */
  box-shadow:
    0 1px 3px rgba(0, 0, 0, 0.10),
    0 6px 16px -6px rgba(0, 0, 0, 0.16),
    inset 0 2px 2px var(--ds-neu-highlight) !important;
}
/* success — drop the green ring, keep the check (richer state green) */
.swal2-popup:not(.swal2-toast) .swal2-icon.swal2-success .swal2-success-ring { border-color: transparent !important; }
.swal2-popup:not(.swal2-toast) .swal2-icon.swal2-success [class^="swal2-success-line"] { background-color: var(--ds-state-success-icon) !important; }
/* error — keep the × */
.swal2-popup:not(.swal2-toast) .swal2-icon.swal2-error [class^="swal2-x-mark-line"] { background-color: var(--ds-state-error-icon) !important; }
/* warning / info / question — the glyph colour is inherited from the icon's `color` */
.swal2-popup:not(.swal2-toast) .swal2-icon.swal2-warning { color: var(--ds-state-warning-icon) !important; }
.swal2-popup:not(.swal2-toast) .swal2-icon.swal2-info { color: var(--ds-state-info-icon) !important; }
.swal2-popup:not(.swal2-toast) .swal2-icon.swal2-question { color: var(--theme-color-ink, var(--ds-text-2)) !important; }

/* ==========================================================================
   23b. SweetAlert2 TOAST → .ds-alert recipe   ("Sepete Eklendi" & friends)
   --------------------------------------------------------------------------
   The app's only LIVE toast system is the swal2 Toast mixin (Base.js:726;
   MarketPlace.js has a stale copy — that module is unused) — toastr.js is
   called in 6 views but never loaded, so there is nothing else to skin. This maps the toast onto the DS alert card
   verbatim: state tint + 3px state-coloured left edge + 34px neu icon disc
   (--ds-shadow-neu-circle IS tuned for 34px — the §23a ring problem is an
   80px artifact) + title-over-body stack (swal2's own toast grid already
   stacks col-2 children; only margins need taming).
   Deltas from .ds-alert, deliberate: e4 drop instead of neu-sm (a toast
   floats over content, not on the canvas) and the tint is layered over an
   opaque surface-default base — dark-mode --ds-state-*-bg are translucent
   rgba and page content would bleed through a floating card.
   v11.10.5 puts NO state class on the popup, so state is read via
   :has(.swal2-icon.swal2-*). Inline background/color from Base.js's mixin
   options lose to !important here.
   ========================================================================== */
.swal2-popup.swal2-toast {
  --orbit-toast-tint: transparent;
  --orbit-toast-edge: var(--ds-ink);
  background:
    linear-gradient(var(--orbit-toast-tint), var(--orbit-toast-tint)),
    var(--ds-surface-default) !important;
  border-left: 3px solid var(--orbit-toast-edge) !important;
  border-radius: var(--ds-radius-card) !important;
  box-shadow: var(--ds-shadow-e4), inset 0 2px 1px var(--ds-neu-highlight) !important;
  padding: var(--ds-space-3) var(--ds-space-4) !important;
  /* fixed width — content-hugging made each toast a different size (error vs
     success looked unrelated); one width = one component */
  width: 380px !important;
  max-width: calc(100vw - 32px) !important;
  overflow: hidden !important;   /* clip the timer bar to the 20px radius */
}
/* state → tint + edge (+ timer bar) via the two custom props above */
.swal2-popup.swal2-toast:has(.swal2-icon.swal2-success) {
  --orbit-toast-tint: var(--ds-state-success-bg);
  --orbit-toast-edge: var(--ds-state-success-icon);
}
.swal2-popup.swal2-toast:has(.swal2-icon.swal2-error) {
  --orbit-toast-tint: var(--ds-state-error-bg);
  --orbit-toast-edge: var(--ds-state-error-icon);
}
.swal2-popup.swal2-toast:has(.swal2-icon.swal2-warning) {
  --orbit-toast-tint: var(--ds-state-warning-bg);
  --orbit-toast-edge: var(--ds-state-warning-icon);
}
.swal2-popup.swal2-toast:has(.swal2-icon.swal2-info) {
  --orbit-toast-tint: var(--ds-state-info-bg);
  --orbit-toast-edge: var(--ds-state-info-icon);
}
.swal2-popup.swal2-toast:has(.swal2-icon.swal2-question) {
  --orbit-toast-edge: var(--theme-color-ink, var(--ds-text-2));
}

/* icon → the .ds-alert__icon disc. font-size 17px makes the 2em box exactly
   34px so swal2's em-drawn glyphs (check/×) scale with it; border:0 because
   .swal2-icon is content-box and its .25em border (the warning/info ring we
   don't want anyway) would fatten the disc to 42px. */
.swal2-popup.swal2-toast .swal2-icon {
  font-size: 17px !important;
  border: 0 !important;
  margin: 0 !important;
  background: var(--ds-surface) !important;
  box-shadow: var(--ds-shadow-neu-circle) !important;
}
.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content {
  font-size: 1em !important;              /* the ! / i / ? glyph — default 1.8em bursts the disc */
  font-weight: var(--ds-fw-semibold);
}
.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring { border-color: transparent !important; }
.swal2-popup.swal2-toast .swal2-icon.swal2-success [class^="swal2-success-line"] { background-color: var(--ds-state-success-icon) !important; }
.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^="swal2-x-mark-line"] { background-color: var(--ds-state-error-icon) !important; }
.swal2-popup.swal2-toast .swal2-icon.swal2-warning { color: var(--ds-state-warning-icon) !important; }
.swal2-popup.swal2-toast .swal2-icon.swal2-info { color: var(--ds-state-info-icon) !important; }
.swal2-popup.swal2-toast .swal2-icon.swal2-question { color: var(--theme-color-ink, var(--ds-text-2)) !important; }

/* text stack → .ds-alert__title / __body (alert titles are body-font semibold,
   not the heading face the standard dialog uses) */
.swal2-popup.swal2-toast .swal2-title {
  margin: 0 0 0 var(--ds-space-3) !important;
  font-family: var(--ds-font-body) !important;
  font-size: var(--ds-text-body-sm) !important;
  font-weight: var(--ds-fw-semibold) !important;
}
.swal2-popup.swal2-toast .swal2-html-container {
  margin: 2px 0 0 var(--ds-space-3) !important;
  font-size: 13px !important;              /* beats customize.css's 14px — orbit-skin loads later */
  line-height: var(--ds-lh-normal) !important;
  color: var(--ds-text-2) !important;
}

/* auto-caption → the .ds-alert__title line. Most call sites pass only text/html,
   so the state name is injected as a caption; suppressed when the call site
   shows a real title (swal2 toggles .swal2-title with inline display:block/none,
   and the element is always in the DOM — hence the [style*="block"] probe). */
.swal2-popup.swal2-toast .swal2-html-container::before {
  display: block;
  font-size: var(--ds-text-body-sm);
  font-weight: var(--ds-fw-semibold);
  color: var(--ds-text-1);
  margin-bottom: 2px;
}
.swal2-popup.swal2-toast:has(.swal2-icon.swal2-success):not(:has(.swal2-title[style*="block"])) .swal2-html-container::before { content: "Başarılı"; }
.swal2-popup.swal2-toast:has(.swal2-icon.swal2-error):not(:has(.swal2-title[style*="block"])) .swal2-html-container::before   { content: "Hata"; }
.swal2-popup.swal2-toast:has(.swal2-icon.swal2-warning):not(:has(.swal2-title[style*="block"])) .swal2-html-container::before { content: "Uyarı"; }
.swal2-popup.swal2-toast:has(.swal2-icon.swal2-info):not(:has(.swal2-title[style*="block"])) .swal2-html-container::before    { content: "Bilgi"; }

/* buttons injected into toast html (cart "Sepeti Görüntüle") → DS accent button.
   The call site (StockListPaged.js:1047) hardcodes inline styles, hence !important. */
.swal2-popup.swal2-toast .swal2-html-container button {
  background: var(--ds-accent) !important;
  color: var(--ds-accent-fg) !important;
  border: none !important;
  border-radius: var(--ds-radius-btn) !important;
  padding: var(--ds-space-1-5) var(--ds-space-3) !important;
  margin-top: var(--ds-space-2) !important;
  font-family: var(--ds-font-body) !important;
  font-size: 13px !important;
  font-weight: var(--ds-fw-medium) !important;
  box-shadow: var(--ds-shadow-dark-button) !important;
  cursor: pointer;
  transition: var(--ds-transition-base);
}
.swal2-popup.swal2-toast .swal2-html-container button:hover { transform: var(--ds-lift-hover); }
.swal2-popup.swal2-toast .swal2-html-container button:active {
  transform: translateY(1px) scale(0.985);
  box-shadow: var(--ds-shadow-dark-pressed) !important;
}

/* timer bar → thin, state-coloured, quiet */
.swal2-popup.swal2-toast .swal2-timer-progress-bar {
  height: 3px !important;
  background: var(--orbit-toast-edge) !important;
  opacity: 0.45;
}

/* motion → soft rise-in / fade-out (replaces swal2's rotateZ wobble) */
@keyframes orbit-toast-in {
  from { opacity: 0; transform: translateY(8px) scale(0.97); }
  to   { opacity: 1; transform: none; }
}
@keyframes orbit-toast-out {
  to { opacity: 0; transform: scale(0.97); }
}
.swal2-popup.swal2-toast.swal2-show { animation: orbit-toast-in 0.3s cubic-bezier(0.21, 1.02, 0.73, 1) !important; }
.swal2-popup.swal2-toast.swal2-hide { animation: orbit-toast-out 0.18s ease-in forwards !important; }


/* ==========================================================================
   24. BOOTSTRAP 3 MODALS  →  Orbit neumorphic dialog   (.orbit-modal marker)
   --------------------------------------------------------------------------
   Bootstrap v3.3.7. CHROME (shell + header + title + footer rule + close ×) is
   skinned here; the body CONTENT rides on the existing .ds-skin adapters (forms
   §5, buttons §6, tables §4/§12, badges …). Both the .orbit-modal marker AND
   .ds-skin are added to every .modal on `show.bs.modal` by a global hook in
   _Layout (opt out with .no-orbit-skin) — needed because body-appended modals
   (e.g. #egk-ajax-modal) escape the per-page wrapper.

   Battlefield: egk-modal.css + customize.css style .modal-content/.modal-header
   mostly WITHOUT !important, and orbit-skin loads AFTER them; but customize's
   DARK rules `[data-theme="dark"] .modal-content/.modal-header` ARE !important —
   the .orbit-modal marker out-specifies them at (0,3,0), the same tactic as §19.
   Chrome only (colour/border/shadow/radius) — no padding/layout changes, so it's
   safe across the ~69 un-audited modal views.
   ========================================================================== */

/* ★ THE BACKDROP FIX (live-DOM-verified): the .ds-skin class the modal gets on open
   carries `background: var(--ds-surface-page)` (§ shell), which paints the FULL-SCREEN
   .modal overlay (position:fixed; inset:0; z-index:1050) OPAQUE — hiding the correctly
   rendered scrim+blur .modal-backdrop (z-index:1040) beneath it. So the dialog read as a
   flat gray box with no separation. Force the overlay transparent so the DS backdrop
   shows through. (.orbit-modal.modal = both classes on the same element → (0,2,0), beats
   the unlayered `.ds-skin{background}` at (0,1,0).) */
.orbit-modal.modal { background: transparent !important; }

/* shell → the DS FORM-COMPONENT card (.ds-card, ds.css:622), user's pick over the white
   .ds-modal: gray --ds-surface canvas, --ds-radius-card (20px), the raised --ds-shadow-neu.
   Now that the overlay is transparent the gray no longer blends into the page — the dark
   blurred backdrop does the page-separation, and the gray card matches the DS form example
   (its sunken/raised fields read against the same canvas, relief from shadow not colour). */
.orbit-modal .modal-content {
  background: var(--ds-surface) !important;          /* gray #f5f5f5 light · dark canvas dark — the .ds-card surface */
  border: none !important;
  border-radius: var(--ds-radius-card) !important;   /* 20px — the .ds-card radius (was card-lg 24px) */
  box-shadow: var(--ds-shadow-neu) !important;       /* the .ds-card raised neu shadow (was e4) */
  color: var(--ds-text-1) !important;
}
[data-theme="dark"] .orbit-modal .modal-content {
  background: var(--ds-surface) !important;          /* dark gray canvas — beats customize's rgba(47,52,71,.95) */
  backdrop-filter: none !important;
}

/* header → borderless, same gray canvas as the body (opaque so the legacy sticky header
   masks scrolled content + fixes dark). */
.orbit-modal .modal-header {
  background: var(--ds-surface) !important;
  border-bottom: none !important;
}

/* ---- Scroll + padding (CRUD form modals) --------------------------------------------
   The AJAX-loaded Create/Edit form wraps its fields in `<div class="modal-body-content"
   style="overflow:auto">` — a SECOND scroll container nested in .modal-content, which
   showed a stray (green, global-styled) inner scrollbar even when the form fit. Let
   .modal-content be the SINGLE scroll owner (it has room up to max-height:90vh, so it
   only scrolls on genuinely short viewports, keeping the sticky header pinned), and give
   the header + form the DS-card's generous padding (was a cramped uniform 18px). Scoped
   to `.modal-body:has(> .modal-body-content)` so other modal types keep their padding. */
.orbit-modal .modal-body:has(> .modal-body-content) {
  /* 24 top (caption breathing room) / 32 sides / 28 bottom. The 28 is a LITERAL:
     there is no --ds-space-7 (the scale skips it — see MANUAL.md), and an
     unresolvable var() in a shorthand voids the WHOLE declaration at
     computed-value time → it still wins the cascade (!important) but collapses
     to padding:0, which is exactly the "no padding at all" bug this caused. */
  padding: var(--ds-space-6) var(--ds-space-8) 28px !important;
}
.orbit-modal .modal-body-content {
  overflow: visible !important;    /* kill the inline inner scroll (!important beats inline) */
  padding: 0 !important;           /* the body supplies the padding now */
}
/* The form is tall (9 fields), so raise the height cap + compact the row rhythm so it fits
   without a scroll on a normal viewport (was max-height:90vh + margin:30px, which capped it
   short). It only scrolls now on genuinely small windows, with the quiet scrollbar below. */
.orbit-modal .modal-dialog { margin: 14px auto !important; }
.orbit-modal .modal-content { max-height: calc(100vh - 28px) !important; }
.orbit-modal .egk-form-input { margin-bottom: var(--ds-space-3) !important; }                 /* 12, was 15 */
.orbit-modal .egk-form-input .egk-form-label { margin-bottom: var(--ds-space-1) !important; } /* 4, was 8 */
.orbit-modal .modal-body-content .form-egk-form-label > .d-flex { padding: var(--ds-space-3) 0 !important; } /* trim the Kaydet p-4; flush horizontally with the field edges */
/* Kaydet → the modal's COMMIT action (§8-style position rule — markup classes untouched):
   right-aligned so the form's reading path (fields → bottom-right) terminates on it,
   full control height, semibold, DS dark-button relief + the round-4 press snap.
   :has guard keeps other .d-flex rows (none today) centered as authored. */
.orbit-modal .modal-body-content .form-egk-form-label > .d-flex:has(> .egk-btn[type="submit"]) {
  justify-content: flex-end !important;
}
.orbit-modal .modal-body-content .form-egk-form-label .egk-btn[type="submit"] {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--ds-space-2);
  height: var(--orbit-control-h);
  min-width: 180px;
  padding: 0 var(--ds-space-6) !important;
  font-size: 15px;
  font-weight: var(--ds-fw-semibold);
  border-radius: var(--ds-radius-md) !important;
  box-shadow: var(--ds-shadow-dark-button) !important;
  transition: var(--ds-transition-base);
}
.orbit-modal .modal-body-content .form-egk-form-label .egk-btn[type="submit"] i { font-size: 15px; }
.orbit-modal .modal-body-content .form-egk-form-label .egk-btn[type="submit"]:active {
  box-shadow: var(--ds-shadow-dark-pressed) !important;
  transform: translateY(1px) scale(0.985);
}
/* when the modal DOES scroll (short viewport), a quiet neutral scrollbar — not the bright
   green global one. */
.orbit-modal .modal-content::-webkit-scrollbar { width: 10px; }
.orbit-modal .modal-content::-webkit-scrollbar-track { background: transparent; }
.orbit-modal .modal-content::-webkit-scrollbar-thumb {
  background: rgba(0, 0, 0, 0.2); border-radius: var(--ds-radius-full);
  border: 3px solid transparent; background-clip: padding-box;
}
[data-theme="dark"] .orbit-modal .modal-content::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.22); }
/* Phantom scrollbar (live-DOM-verified): a CLOSED .ds-dropdown__menu is only
   visibility:hidden (ds.css:797) — still laid out ~200px below its trigger, and
   abs-pos boxes count toward an overflow:auto ancestor's scrollable overflow. With
   9 enhanced selects, the last menus stick out past the form and .modal-content
   grows a scrollbar with nothing visible to scroll to. Drop closed menus from
   layout entirely; a keyframe recreates the open fade (transitions can't cross
   display:none, animations can). orbit-select.js never measures the closed menu,
   so display:none is safe. Close animation is sacrificed — menu hides instantly. */
.orbit-modal .ds-dropdown__menu { display: none; }
.orbit-modal .ds-dropdown.is-open .ds-dropdown__menu,
.orbit-modal .ds-dropdown__menu.is-open {
  display: block;
  animation: orbit-modal-menu-in var(--ds-duration-fast) var(--ds-ease-out);
}
@keyframes orbit-modal-menu-in {
  from { opacity: 0; transform: translateY(-6px); }
}
.orbit-modal .modal-title {
  color: var(--ds-text-1) !important;
  font-family: var(--ds-font-heading) !important;
  font-size: var(--ds-text-h4) !important;      /* .ds-modal__title */
  font-weight: var(--ds-fw-medium) !important;
}
/* Modal caption → the app's LANDMARK PILL (§8), horizontally CENTERED, with the close
   top-right (user: "our caption pills, middle aligned"). We do NOT neutralise §8's pill
   anymore — the modal carries .ds-skin, so `.ds-skin .egk-content-title` renders the full
   raised pill + domed disc (fa-lock from the Create.cshtml markup) exactly like a page
   caption. Here we only centre the header row and set the gap to the first field. */
.orbit-modal .modal-header .egk-content-header {
  display: flex !important;
  justify-content: center;
  align-items: center;
  position: relative;
  margin-bottom: var(--ds-space-5);   /* gap between the caption pill and the first field row */
}

/* footer → borderless like .ds-modal__footer (its buttons get §6 via .ds-skin:
   outline Cancel + accent Confirm — the DS modal's --outline / --primary pair). */
.orbit-modal .modal-footer {
  border-top: none !important;
}

/* BS3 close (×) → quiet ghost (mirrors .ds-btn--ghost; was float-right, opacity .2, black) */
.orbit-modal .modal-header .close {
  color: var(--ds-text-3) !important;
  opacity: 1 !important;
  text-shadow: none !important;
  transition: var(--ds-transition-base);
}
.orbit-modal .modal-header .close:hover,
.orbit-modal .modal-header .close:focus {
  color: var(--ds-text-1) !important;
  opacity: 1 !important;
}

/* Close × → a DS 3D ICON TILE (ds.css .ds-icon-tile--surface): raised neu tile, ink glyph
   (user: "our 3d icon tiles for the X"). Absolute top-right since the caption pill centres.
   The close is an <button class="egk-btn egk-btn-primary" data-dismiss="modal"> caught by
   §8's CRUD position rule (which would paint it a tall green block); (0,4,0) out-ranks it. */
.orbit-modal .egk-content-header .egk-btn[data-dismiss="modal"] {
  position: absolute;
  right: 0;
  top: 50%;
  transform: translateY(-50%);
  width: 44px !important;
  height: 44px !important;
  min-width: 0 !important;
  padding: 0 !important;
  background: var(--ds-surface) !important;
  box-shadow: var(--ds-shadow-neu-circle) !important;
  border: none !important;
  border-radius: var(--ds-radius-tile) !important;
  color: var(--ds-text-1) !important;
  transition: var(--ds-transition-base);
}
.orbit-modal .egk-content-header .egk-btn[data-dismiss="modal"] i { color: inherit !important; font-size: 16px; }
.orbit-modal .egk-content-header .egk-btn[data-dismiss="modal"]:hover,
.orbit-modal .egk-content-header .egk-btn[data-dismiss="modal"]:focus {
  color: var(--theme-color-ink, var(--theme-color)) !important;
}
.orbit-modal .egk-content-header .egk-btn[data-dismiss="modal"]:active {
  box-shadow: var(--ds-shadow-neu-inset) !important;   /* pressed-in feel */
}

/* backdrop → match .ds-modal-backdrop: 45% scrim + blur (legacy egk-modal was 0.27, no blur).
   Put paint on the base .modal-backdrop (not just .in) so it can't miss on fade timing;
   .in only lifts opacity to full. */
.modal-backdrop {
  background: rgba(0, 0, 0, 0.45) !important;
}
.modal-backdrop.in { opacity: 1 !important; }
@supports (backdrop-filter: blur(4px)) {
  .modal-backdrop { backdrop-filter: blur(4px) !important; -webkit-backdrop-filter: blur(4px) !important; }
}

/* ---- Detail-document modals (Teklif Detay / Sipariş Detay / hareket detayları) ----
   A detail modal is a DOCUMENT, not a data grid: the modal itself is already the
   card, so the §12 raised wrapper inside it flattens to the modal surface and the
   line items read as plain §4 hairline rows. Detail views init their DataTable
   with dom:'t' (no export/columns/pager chrome) — a quote you READ. */
.orbit-modal .dataTables_wrapper {
  background: transparent;
  box-shadow: none;
  border-radius: 0;
  padding: 0;
}
/* Hairline paint fix (live-DOM-verified): the app's 90% zoom makes the §4 cell
   borders fractional (computed 1.11px), and Chromium then snaps individual
   border SEGMENTS to nothing — the TUTAR column's separator vanished while its
   computed style still reported a border. Per-cell borders can't be made stable
   here, so inside modals the separator is painted ONCE per row as a tr
   background stripe: one paint op, no per-cell segments to lose. The last row
   drops its stripe — the .ds-doc tear line takes over from there. */
.orbit-modal table.dataTable thead th { border-bottom: none !important; }
.orbit-modal table.dataTable thead tr {
  background: linear-gradient(var(--ds-border-subtle), var(--ds-border-subtle)) left bottom / 100% var(--ds-bw-hairline) no-repeat;
}
.orbit-modal table.dataTable tbody td { border-bottom: none !important; }
.orbit-modal table.dataTable tbody tr {
  background: linear-gradient(var(--ds-border-hairline), var(--ds-border-hairline)) left bottom / 100% var(--ds-bw-hairline) no-repeat;
}
.orbit-modal table.dataTable tbody tr:last-child { background: none; }

/* Document footer under the line items: properties (left, definition list) +
   the money rollup (right, invoice-style stack). Wraps to a single column on
   narrow viewports. The top border is the document's "tear line". */
.orbit-modal .ds-doc {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  flex-wrap: wrap;
  gap: var(--ds-space-5) var(--ds-space-8);
  margin-top: var(--ds-space-4);
  padding-top: var(--ds-space-4);
  border-top: var(--ds-bw-thin) solid var(--ds-border-subtle);
}
.orbit-modal .ds-doc__meta {
  flex: 1 1 280px;
  min-width: 240px;
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: var(--ds-space-1-5) var(--ds-space-4);
  align-content: start;
  align-self: flex-start;
  margin: 0;
}
.orbit-modal .ds-doc__meta dt {
  margin: 0;
  font-size: var(--ds-text-caption);
  font-weight: var(--ds-fw-semibold);
  letter-spacing: var(--ds-ls-eyebrow);
  text-transform: uppercase;
  color: var(--ds-text-3);
  line-height: var(--ds-lh-normal);
}
.orbit-modal .ds-doc__meta dd {
  margin: 0;
  font-size: var(--ds-text-body-sm);
  color: var(--ds-text-1);
  line-height: var(--ds-lh-normal);
  overflow-wrap: anywhere;
}
.orbit-modal .ds-doc__totals {
  flex: 0 1 300px;
  min-width: 260px;
  margin-left: auto;
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-1-5);
}
.orbit-modal .ds-doc__row {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--ds-space-6);
  padding: 0 var(--ds-space-4);   /* rail-aligns with the total well's inner edges */
  font-size: var(--ds-text-body-sm);
  color: var(--ds-text-2);
}
.orbit-modal .ds-doc__row > span:last-child {
  font-variant-numeric: tabular-nums;
  color: var(--ds-text-1);
}
/* a subtraction reads as one: the discount value carries the minus and the error hue */
.orbit-modal .ds-doc__row--minus > span:last-child { color: var(--ds-error); }
/* THE SIGNATURE: the grand total is the modal's only non-flat surface — a
   pressed-in neu well where the money lands. Everything else stays quiet. */
.orbit-modal .ds-doc__total {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--ds-space-8);
  margin-top: var(--ds-space-2);
  padding: var(--ds-space-2-5) var(--ds-space-4);
  background: var(--ds-surface-sunken);
  border-radius: var(--ds-radius-md);
  box-shadow: var(--ds-shadow-neu-inset);
}
.orbit-modal .ds-doc__total-label {
  font-size: var(--ds-text-caption);
  font-weight: var(--ds-fw-semibold);
  letter-spacing: var(--ds-ls-eyebrow);
  text-transform: uppercase;
  color: var(--ds-text-2);
}
.orbit-modal .ds-doc__total-value {
  font-size: var(--ds-text-h5);
  font-weight: var(--ds-fw-semibold);
  font-variant-numeric: tabular-nums;
  color: var(--ds-accent);
  white-space: nowrap;
}


/* ==========================================================================
   25. FORMS — .egk-form-input  (the app's label+field Create/Edit pattern)
   --------------------------------------------------------------------------
   Distinct from §5's Bootstrap .form-control: Create/Edit forms (and MOST modal
   bodies, ~15 "Yeni …" pages that all open the shared #egk-ajax-modal) use
   `.egk-form-input > .egk-form-label + bare <select>/<input> + <i> arrow`
   (customize.css:525-626 — @Html.DropDownListFor/EditorFor emit UNCLASSED fields, so
   §5 never sees them). Legacy = grey border turning brand-green on :focus/:valid + a
   green FA arrow. ONE adapter, scoped to .ds-skin, repaints them ALL at once — every
   such modal is tagged .ds-skin by the §24 hook on open, so no per-page work.
   Height is lifted to --orbit-control-h (52px) to match every other skinned control in
   the app (search/filter fields, dashboard controls); the legacy FA arrow is re-centred
   in the taller field below (bottom-anchored, so it's independent of the label height).
   Selects are additionally upgraded to the DS listbox (.ds-select-menu) by orbit-select.js
   on modal open — that trigger carries its own chevron, so the legacy arrow is hidden. */
.ds-skin .egk-form-input input,
.ds-skin .egk-form-input select,
.ds-skin .egk-form-input textarea {
  background: var(--ds-surface) !important;
  border: none !important;                          /* kills customize's grey/green border (its color rules become moot) */
  border-radius: var(--ds-radius-md) !important;    /* beat customize's `border-radius:6px !important` */
  box-shadow: var(--ds-shadow-neu-sm) !important;
  padding: 0 var(--ds-space-4) !important;          /* was padding-left:15px; right pad keeps text off the arrow */
  height: var(--orbit-control-h) !important;        /* 52px — the app's standard control height (was customize's 42px) */
  font-family: var(--ds-font-body);
  font-size: var(--ds-text-body-sm);
  color: var(--ds-text-1) !important;
  transition: var(--ds-transition-base);
}
.ds-skin .egk-form-input textarea {
  height: auto !important;
  min-height: var(--orbit-control-h) !important;
  padding: var(--ds-space-2) var(--ds-space-4) !important;
}

/* focus → brand ring (out-specifies + beats customize's non-important green
   :focus/:valid border-color, which is moot anyway since the border is gone) */
.ds-skin .form-egk-form-label .egk-form-input input:focus,
.ds-skin .form-egk-form-label .egk-form-input select:focus,
.ds-skin .form-egk-form-label .egk-form-input textarea:focus {
  box-shadow: var(--ds-shadow-neu-sm), 0 0 0 3px var(--orbit-ring) !important;
  outline: none;
}

/* preserve the validation cue (base border:none would otherwise drop the red border) */
.ds-skin .form-egk-form-label .egk-form-input input.is-invalid,
.ds-skin .form-egk-form-label .egk-form-input select.is-invalid {
  box-shadow: var(--ds-shadow-neu-sm), 0 0 0 2px var(--ds-state-error-icon) !important;
}

/* the legacy FA select-arrow (customize paints it brand-green at top:36px, centred for a
   42px field) → muted chevron, RE-CENTRED for the 52px field. The field sits at the group's
   bottom (label above it), so anchor the glyph to the field via `bottom` — independent of
   the label height. `> i` (direct child) targets ONLY the legacy arrow, never the enhanced
   .ds-select-menu__trigger's own chevron. */
.ds-skin .egk-form-input > i,
.ds-skin .egk-form-input > svg {
  color: var(--ds-text-3) !important;
  top: auto !important;
  bottom: 17px !important;                 /* (52 − 18)/2 → glyph vertically centred in the field */
  transform: none !important;
}
/* an enhanced select carries the .ds-select-menu chevron → hide the now-redundant legacy arrow */
.ds-skin .egk-form-input:has(.ds-select-menu.orbit-select) > i,
.ds-skin .egk-form-input:has(.ds-select-menu.orbit-select) > svg { display: none !important; }

/* the enhanced select's chevron is a flex child of the trigger, but customize.css's
   `.egk-form-input i` (green, position:absolute, top:36px) HIJACKS it → a mis-placed green
   arrow. Restore the DS chevron: static (back in the trigger's flex flow, right-aligned +
   vertically centred), muted, refined size. The rotate-on-open (ds.css) still applies. */
.ds-skin .egk-form-input .ds-select-menu__chevron {
  position: static !important;
  top: auto !important;
  right: auto !important;
  color: var(--ds-text-2) !important;
  font-size: 13px !important;
}

/* hide the legacy ↳ (fa-arrow-turn-down) on INPUT fields (e.g. the Cari Kodu autocomplete):
   it's customize's select-arrow, meaningless on a text field. Selects already drop it via
   the :has(.ds-select-menu) rule above; hidden inputs are excluded so their sibling select
   keeps its own handling. */
.ds-skin .egk-form-input:has(> input:not([type="hidden"])) > i { display: none !important; }

/* EXCEPTION — date fields (.egk-date-input) KEEP their calendar glyph, moved to a
   LEADING icon (the DS .ds-input-group--icon-left recipe): it marks the field as
   opening the Orbit calendar. The extra class out-specifies the input-icon hide
   above; left/right flip the customize.css absolute anchor (right:16px). */
.ds-skin .egk-form-input.egk-date-input:has(> input:not([type="hidden"])) > i {
  display: inline-block !important;
  left: var(--ds-space-4);
  right: auto !important;
}
.ds-skin .egk-form-input.egk-date-input input {
  padding-left: 44px !important;   /* clear the leading glyph (16px inset + 18px icon + gap) */
}

/* enhanced select (orbit-select.js → .ds-select-menu) fills the field slot (overrides the
   global min-width:200px from the dashboard/filter context so it tracks the form column). */
.ds-skin .egk-form-input .ds-select-menu.orbit-select {
  display: block;
  width: 100%;
  min-width: 0;
}

/* label above the field → mirror .ds-label (ds.css:1109): ink text, 13px, medium, with a
   little breathing room to the field. */
.ds-skin .egk-form-input .egk-form-label {
  color: var(--ds-text-1);
  font-size: 13px;
  font-weight: var(--ds-fw-medium);
  margin-bottom: var(--ds-space-2);
}

/* ---- CRUD-modal field MEDALLION (the §21 basket recipe, generalised) -----------------
   The ~15 "Yeni …" tanımlama forms open in the shared #egk-ajax-modal; give their fields
   the same leading raised medallion the basket order form has — a 30px domed disc that
   names what the field holds. Scope: .orbit-modal.ds-skin (both classes land on the
   modal element via the §24 hook) → (0,4,1) out-ranks the §25 input-icon hide above
   (:has → 0,3,2), the same battle §21 wins on the basket via its .OrderForm scope. */
.orbit-modal.ds-skin .egk-form-input > i.egk-field-icon {
  position: absolute;
  left: var(--ds-space-2);
  right: auto !important;
  top: auto !important;
  bottom: 8px !important;            /* (46 − 30)/2 → 30px medallion centred in the 46px field (--orbit-control-h) */
  width: 30px;
  height: 30px;
  display: inline-flex !important;   /* defeat FA's unlayered reset AND the §25 display:none hide */
  align-items: center;
  justify-content: center;
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-circle);   /* raised medallion — matches every other disc in the app */
  color: var(--theme-color-ink, var(--theme-color)) !important;   /* brand-ink glyph, like the caption mark */
  font-size: 13px !important;
  line-height: 1;
  transform: none !important;
  pointer-events: none;
  z-index: 1;
  transition: var(--ds-transition-base);
}
/* clear the well: push the field's text past the 30px disc. Selects need the rule on
   .ds-select-menu__trigger too — orbit-select.js hides the native select and shows the
   value in that trigger button, so padding the <select> alone leaves the text under
   the medallion. */
.orbit-modal.ds-skin .egk-form-input:has(> i.egk-field-icon) input,
.orbit-modal.ds-skin .egk-form-input:has(> i.egk-field-icon) select,
.orbit-modal.ds-skin .egk-form-input:has(> i.egk-field-icon) .ds-select-menu__trigger,
.orbit-modal.ds-skin .egk-form-input:has(> i.egk-field-icon) textarea { padding-left: 46px !important; }
/* a textarea is tall → seat the medallion near its TOP, not the field's vertical centre */
.orbit-modal.ds-skin .egk-form-input:has(> textarea) > i.egk-field-icon { top: 35px !important; bottom: auto !important; }

/* ---- DS choice controls (.ds-radio / .ds-checkbox / .ds-switch) in MVC forms ---------
   First wired on OdemeTipleri Create/Edit. Two adapters, both scoped .ds-skin so
   ds.css stays pure:
   1) Html.CheckBoxFor emits `<input type=checkbox><input type=hidden>` — the hidden
      sibling sits between the box and the track, so ds.css's `input:checked + __track`
      never matches. Re-express the checked/focus hops with `~`. */
.ds-skin .ds-switch input[type="checkbox"]:checked ~ .ds-switch__track { background: var(--ds-ink); }
.ds-skin .ds-switch input[type="checkbox"]:checked ~ .ds-switch__track .ds-switch__thumb { transform: translateX(18px); }
[data-theme="dark"] .ds-skin .ds-switch input[type="checkbox"]:checked ~ .ds-switch__track .ds-switch__thumb { background: var(--ds-on-ink); }
.ds-skin .ds-switch input[type="checkbox"]:focus-visible ~ .ds-switch__track { outline: 2px solid var(--ds-accent); outline-offset: 2px; }
/* 1b) Bootstrap 3's UNLAYERED `label { display:inline-block; font-weight:bold }` beats
      ds.css's LAYERED `.ds-switch/.ds-radio { display:inline-flex }` (the same
      unlayered-vs-layered trap as Font Awesome — live-DOM-verified: the switch track
      collapsed to 0×19 because the label never became a flex container). Restore the
      flex display + quiet weight from unlayered orbit-skin. */
.ds-skin label.ds-switch,
.ds-skin label.ds-radio,
.ds-skin label.ds-checkbox {
  display: inline-flex;
  font-weight: var(--ds-fw-regular, 400);
  margin-bottom: 0;
}
/* 2) §25 paints EVERY .egk-form-input input as a raised 46px field — exempt the
      visually-hidden native inputs inside DS choice controls (they'd render as big
      empty wells over the control). (0,3,1) + !important beats §25's (0,2,1). */
.ds-skin .egk-form-input .ds-radio input,
.ds-skin .egk-form-input .ds-checkbox input,
.ds-skin .egk-form-input .ds-switch input {
  position: absolute !important;
  opacity: 0 !important;
  width: 0 !important;
  height: 0 !important;
  min-height: 0 !important;
  padding: 0 !important;
  margin: 0 !important;
  box-shadow: none !important;
}
/* option medallions inside choice labels → brand ink, like every other medallion */
.ds-skin .ds-radio .ds-icon-tile,
.ds-skin .ds-switch .ds-icon-tile { color: var(--theme-color-ink, var(--theme-color)); }
/* customize's `.form-egk-form-label .egk-form-input i` (absolute, right:16px top:36px,
   green — the legacy select-arrow rule) hijacks the glyph INSIDE a DS icon tile and
   flings it to the field's right edge (live-DOM-verified). Seat it back in the tile's
   flex centre. (0,3,1)+!important beats customize's (0,2,1). */
.ds-skin .egk-form-input .ds-icon-tile i {
  position: static !important;
  top: auto !important;
  right: auto !important;
  color: inherit !important;
  font-size: inherit !important;
}
/* rows with unequal cell heights (tall radio group next to a short field) must not
   STRETCH the short cell — the §25b medallion is bottom-anchored to the cell, so a
   stretched cell seats it below its input (live-DOM-verified on Teminat Gün Sayısı). */
.orbit-modal.ds-skin .form-egk-form-label { align-items: flex-start; }

/* ==========================================================================
   26. BACK-TO-TOP  (#back-top in _Layout — GLOBAL, unscoped like §23)
   --------------------------------------------------------------------------
   The legacy .to-top is a 46px theme-green square fixed bottom-right. Re-cast
   as the app's icon medallion (navbar §5 / search-disc recipe): surface disc,
   neu-circle relief, brand-ink glyph. Position, z-index and the show/hide
   mechanics (opacity 0 → .scrolled opacity 1, driven by customize.css + JS)
   are untouched. The #id out-specifies customize's .to-top stack; display
   needs !important only to beat the inline style="display:block" so the
   glyph flex-centres. */
#back-top.to-top {
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  border: 0 !important;
  border-radius: var(--ds-radius-full) !important;
  background: var(--ds-surface) !important;
  box-shadow: var(--ds-shadow-neu-circle) !important;
  color: var(--theme-color-ink, var(--theme-color)) !important;
  font-size: 17px;
  transition: var(--ds-transition-base), opacity 0.3s ease;   /* keep the fade */
}
#back-top.to-top:hover {
  background: var(--ds-surface) !important;
  box-shadow: var(--ds-shadow-neu-hover) !important;
  color: var(--theme-color-ink, var(--theme-color)) !important;
  transform: var(--ds-lift-hover);
}

/* ==========================================================================
   27. PAYMENT  (Payment/PIndex — Ödeme Sayfası)
   --------------------------------------------------------------------------
   The per-bank installment blocks (.bank-installment-table) sat flat on the
   canvas — customize.css (:3563) gives them 1px cell borders + banded rows +
   a silver radial gradient on the bank header, but no surface. Re-cast each
   block as a DS card (surface / radius-card / neu — the .ds-card recipe) and
   let the inner table fall back to the §4 hairline treatment. The banding and
   the gradient go (both light-only paints that glare in dark mode).
   ========================================================================== */
.ds-skin .bank-installment-table {
  background: var(--ds-surface);
  border-radius: var(--ds-radius-card);
  box-shadow: var(--ds-shadow-neu);
  padding: var(--ds-space-4) var(--ds-space-5) var(--ds-space-5);
}
.ds-skin .bank-installment-table .bank-header {
  background: transparent;
  border-radius: 0;
}
.ds-skin .bank-installment-table th,
.ds-skin .bank-installment-table td {
  border: none;
  border-bottom: var(--ds-bw-hairline) solid var(--ds-border-hairline);
}
.ds-skin .bank-installment-table tbody tr:last-child td { border-bottom: none; }
.ds-skin .bank-installment-table tr:nth-child(even) { background-color: transparent; }

/* ==========================================================================
   28. SETTINGS — "the control room"  (Yönetim > Ayarlar — Settings/Index,
       one view behind five route prefixes: genel / stok-parametreleri /
       plasiyer-parametreleri / nox-parametreleri / eposta-ayarlari)
   --------------------------------------------------------------------------
   Redesign 2026-07-04. The old page floated ~50 label+control pairs straight on
   the canvas (toggle ~700px from its label, groups = bare caption chips, Kaydet
   buried at the bottom). New architecture, all markup in Settings/Index.cshtml:
     - page tabs across the five parameter pages + a live search (carved slot)
     - one .settings-card per settings family, canonical title medallion
     - parameter ROWS on hairlines inside a 2-col grid; switch rows read
       label-left / switch-right like an OS settings list
     - sticky .settings-save-dock with a dirty-change counter
   §25 already skins the raw inputs; these rules add the structure. The grid
   dropped the .form-egk-form-label wrapper, so focus/invalid rings are re-added
   here for .settings-grid.
   ========================================================================== */

/* ---- header: title medallion left, parameter count riding beside it ---- */
.ds-skin .settings-header {
  display: flex;
  align-items: center;
  gap: var(--ds-space-3);
  margin-bottom: var(--ds-space-5);
}
.ds-skin .settings-count { font-variant-numeric: tabular-nums; }

/* ---- toolbar: page tabs (segmented pills) + the search slot ---- */
.ds-skin .settings-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--ds-space-4);
  flex-wrap: wrap;
  margin-bottom: var(--ds-space-5);
}
.ds-skin .settings-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: var(--ds-space-2);
}
.ds-skin .settings-tab {
  display: inline-flex;
  align-items: center;
  height: 38px;
  padding: 0 var(--ds-space-4);
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-sm);
  color: var(--ds-text-2);
  font-size: var(--ds-text-body-sm);
  font-weight: var(--ds-fw-medium);
  white-space: nowrap;
  transition: var(--ds-transition-base);
}
.ds-skin .settings-tab:hover {
  color: var(--ds-text-1);
  box-shadow: var(--ds-shadow-neu-hover);
  text-decoration: none;
}
.ds-skin .settings-tab.is-active {
  background: var(--ds-accent);
  color: var(--ds-accent-fg);
  box-shadow: var(--ds-shadow-dark-button);
  font-weight: var(--ds-fw-semibold);
}
/* search → carved inset slot (the .filtre-ara recipe) with a leading magnifier */
.ds-skin .settings-search {
  position: relative;
  flex: 0 1 300px;
  min-width: 220px;
}
.ds-skin .settings-search i {
  position: absolute;
  left: var(--ds-space-3);
  top: 50%;
  transform: translateY(-50%);
  color: var(--ds-text-3);
  font-size: 14px;
  pointer-events: none;
}
.ds-skin .settings-search input {
  width: 100%;
  height: 38px;
  border: none;
  border-radius: var(--ds-radius-md);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-inset);
  padding: 0 var(--ds-space-3) 0 calc(var(--ds-space-3) + 24px);
  font-size: var(--ds-text-body-sm);
  color: var(--ds-text-1);
}
.ds-skin .settings-search input::placeholder { color: var(--ds-text-3); opacity: 1; }
.ds-skin .settings-search input:focus {
  outline: none;
  box-shadow: var(--ds-shadow-neu-inset), 0 0 0 3px var(--orbit-ring);
}

/* ---- family anchor chips (genel page only — >1 named family) ---- */
.ds-skin .settings-anchors {
  display: flex;
  flex-wrap: wrap;
  gap: var(--ds-space-2);
  margin-bottom: var(--ds-space-5);
}
.ds-skin .settings-anchors a { text-decoration: none; }

/* ---- family card ---- */
.ds-skin .settings-card {
  margin-bottom: var(--ds-gap);
  padding: var(--ds-space-5) var(--ds-space-6);
  scroll-margin-top: 96px;              /* anchor jumps clear the sticky navbar */
}
.ds-skin .settings-card[hidden] { display: none; }   /* search may empty a card */
.ds-skin .settings-card__header {
  display: flex;
  align-items: center;
  gap: var(--ds-space-3);
  margin-bottom: var(--ds-space-3);
  padding-bottom: var(--ds-space-3);
  border-bottom: var(--ds-bw-hairline) solid var(--ds-border-hairline);
}
.ds-skin .settings-card__count { font-variant-numeric: tabular-nums; }

/* ---- parameter rows: 2-col grid of hairline rows ---- */
.ds-skin .settings-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: var(--ds-space-10, 48px);
  row-gap: 0;
}
@media (max-width: 1200px) {
  .ds-skin .settings-grid { grid-template-columns: 1fr; }
}
.ds-skin .settings-grid .egk-form-input {
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-1-5);
  margin: 0;
  padding: var(--ds-space-3) var(--ds-space-2-5);
  border-bottom: var(--ds-bw-hairline) solid var(--ds-border-hairline);
  border-radius: var(--ds-radius-md);
  transition: background-color var(--ds-duration-base) ease;
}
.ds-skin .settings-grid .egk-form-input[hidden] { display: none; }   /* beat the flex above */
.ds-skin .settings-grid .egk-form-input:hover { background: var(--ds-surface-sunken); }
/* switch rows read like an OS settings list: label left, switch right, one line */
.ds-skin .settings-grid .egk-form-input:has(.chkSwitch) {
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  min-height: 52px;
}
.ds-skin .settings-grid .egk-form-input:has(.chkSwitch) .egk-form-label { margin-bottom: 0; }
.ds-skin .settings-grid .egk-form-input .chkSwitch { flex: 0 0 auto; margin: 0; }
/* focus/invalid rings (§25 scopes them to .form-egk-form-label, which the grid dropped) */
.ds-skin .settings-grid .egk-form-input input:focus,
.ds-skin .settings-grid .egk-form-input select:focus,
.ds-skin .settings-grid .egk-form-input textarea:focus {
  box-shadow: var(--ds-shadow-neu-sm), 0 0 0 3px var(--orbit-ring) !important;
  outline: none;
}
.ds-skin .settings-grid .egk-form-input input.is-invalid,
.ds-skin .settings-grid .egk-form-input select.is-invalid {
  box-shadow: var(--ds-shadow-neu-sm), 0 0 0 2px var(--ds-state-error-icon) !important;
}

/* unnamed parameter → its raw key, deliberately set as code */
.ds-skin .settings-key {
  font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
  font-size: 12px;
  color: var(--ds-text-2);
  background: var(--ds-surface-sunken);
  box-shadow: var(--ds-shadow-neu-inset);
  border-radius: var(--ds-radius-sm);
  padding: 2px var(--ds-space-2);
}
/* enterprise-license lock chip on the label */
.ds-skin .settings-grid .enterprise-pack {
  display: inline-flex;
  align-items: center;
  margin-left: var(--ds-space-2);
  color: var(--ds-text-3);
  cursor: help;
}

/* odd control types, tamed: color swatch stays a swatch, file input breathes,
   logo thumbnails read as framed tiles */
.ds-skin .settings-grid input[type="color"] {
  width: 96px !important;
  height: 44px !important;
  padding: var(--ds-space-1-5) !important;
  cursor: pointer;
}
.ds-skin .settings-grid input[type="file"] {
  height: auto !important;
  padding: var(--ds-space-3) var(--ds-space-4) !important;
}
.ds-skin .settings-grid .image-thumbnail {
  max-height: 64px;
  max-width: 200px;
  align-self: flex-start;
  border-radius: var(--ds-radius-md);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-sm);
  padding: var(--ds-space-1-5);
  cursor: zoom-in;
}

/* ---- search empty state: explain + offer the way back ---- */
.ds-skin .settings-empty {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--ds-space-3);
  padding: var(--ds-space-8);
  color: var(--ds-text-2);
}
.ds-skin .settings-empty[hidden] { display: none; }
.ds-skin .settings-empty i { font-size: 20px; color: var(--ds-text-3); }

/* ---- sticky save dock: Kaydet is never a scroll away; the chip counts the
        unsaved edits so leaving the page half-done is a conscious act ---- */
.ds-skin .settings-save-dock {
  position: sticky;
  bottom: var(--ds-space-4);
  z-index: 20;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--ds-space-3);
  margin-top: var(--ds-gap);
  pointer-events: none;              /* the bar itself is a ghost; children act */
}
.ds-skin .settings-save-dock > * { pointer-events: auto; }
.ds-skin .settings-dirty[hidden] { display: none; }
.ds-skin .settings-dirty {
  display: inline-flex;
  align-items: center;
  height: 40px;
  padding: 0 var(--ds-space-4);
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu);
  color: var(--ds-text-2);
  font-size: var(--ds-text-body-sm);
}
.ds-skin .settings-dirty b {
  color: var(--theme-color-ink, var(--theme-color));
  font-variant-numeric: tabular-nums;
  font-weight: var(--ds-fw-semibold);
}
.ds-skin .settings-save-btn { min-width: 160px; }

/* ==========================================================================
   29. STOCK DETAIL MODAL — "ürün vitrini"  (ERP/StockDetailPartial, loaded
       into #egk-ajax-modal from the stock list product-name click)
   --------------------------------------------------------------------------
   Polish 2026-07-04. The old top half floated a tiny no-image glyph in a 50%
   column and four chip-buttons in the other; everything below was legacy grey.
   New architecture (markup in StockDetailPartial.cshtml):
     - .sdm-media   → the product VITRINE: a carved inset well (display-case
                      metaphor, same family as the payment page's carved money
                      display) holding the swiper; thumbs = 56px neu chips,
                      active = brand ring
     - right column → identity + watch panel: .sdm-code carved stock-code chip,
                      .sdm-stat purchase-count line, and the three watch
                      toggles as .sdm-action neu pills. Engaged state =
                      pressed-in (neu-inset + accent-soft fill + accent dot):
                      a taken toggle reads as a latched button. JS contract
                      (B2BBundle GetStockDetail) untouched: container classes
                      .Favori/.StogaGirinceHaberVer/.FiyatiDusunceHaberVer,
                      .btn-icon <i>, .btn-text <span>, .action-taken toggle.
     - #tab-1       → depo ledger (eyebrow header, warehouse glyph, tabular
                      figures right)  ·  Özellikler → .sdm-spec chips
     - Quill (snow) → toolbar as raised neu strip, editor as carved well;
                      merged from main 2026-07-04, first skin pass here.
   Scope = .orbit-modal (the modal is body-appended; .ds-skin arrives via the
   §24 hook). Battlefield: customize.css :1117-1271 (.stockDetailBody swiper /
   .stock-detail-actions chips) — out-specified via the .orbit-modal prefix;
   quill.snow.css (loads before this sheet).
   ========================================================================== */

/* ---- dialog: size the shared modal to THIS content (egk-modal.css floors it
        at min-width:60% of the viewport — on wide screens that left ~190px of
        dead air around the vitrine + panel pair). Scoped via :has() so other
        #egk-ajax-modal tenants keep their width. ---- */
.orbit-modal:has(.stockDetailBody) .modal-dialog {
  width: min(1240px, 96vw);
  min-width: 0;
}

/* ---- layout: kill the bootstrap 50/50 float row, go vitrine + panel ---- */
.orbit-modal .stockDetailBody {
  display: flex;
  flex-wrap: wrap;
  align-items: stretch;
  gap: var(--ds-gap);
  margin: 0;
}
.orbit-modal .stockDetailBody > .sdm-media,
.orbit-modal .stockDetailBody > .stock-detail-actions {
  float: none;
  width: auto;
  padding: 0;
}
.orbit-modal .stockDetailBody { justify-content: center; }
.orbit-modal .stockDetailBody > .sdm-media { flex: 1 1 380px; max-width: 560px; }
.orbit-modal .stockDetailBody > .stock-detail-actions {
  flex: 1 1 420px;
  max-width: 680px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: var(--ds-space-3);
  margin: 0;
}
/* the code chip + stat line are also `.stock-detail-actions > div` — shield them
   from customize :1169's chip ring/margins */
.orbit-modal .stock-detail-actions > .sdm-code {
  box-shadow: var(--ds-shadow-neu-inset) !important;
  margin: 0;
}
.orbit-modal .stock-detail-actions > .sdm-stat {
  box-shadow: none !important;
  margin: 0;
}
@media (max-width: 991px) {
  .orbit-modal .stockDetailBody > .sdm-media { max-width: none; }
}

/* ---- the vitrine: carved display case for the product image ---- */
.orbit-modal .sdm-media {
  background: var(--ds-surface);
  border-radius: var(--ds-radius-card);
  box-shadow: var(--ds-shadow-neu-inset);
  padding: var(--ds-space-5);
  display: flex;
  flex-direction: column;
  justify-content: center;
  min-height: 300px;
}
.orbit-modal .sdm-media .swiper { height: auto; }
.orbit-modal .sdm-media .stockDetailMainSwiper { height: 220px; }
.orbit-modal .sdm-media .stockDetailMainSwiper .swiper-slide img {
  width: auto;
  height: auto;
  max-width: 100%;
  max-height: 210px;
  object-fit: contain;             /* product shots must never crop (was cover) */
}
.orbit-modal .sdm-media .stockDetailThumbSwiper {
  height: auto;
  padding: var(--ds-space-4) 0 var(--ds-space-1);
}
.orbit-modal .sdm-media .stockDetailThumbSwiper .swiper-slide {
  width: 56px;
  height: 56px;
  opacity: 0.55;
  border-radius: var(--ds-radius-md);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-sm);
  overflow: hidden;
  cursor: pointer;
  transition: var(--ds-transition-base);
}
.orbit-modal .sdm-media .stockDetailThumbSwiper .swiper-slide img {
  width: auto;
  height: auto;
  max-width: 48px;
  max-height: 48px;
  object-fit: contain;
}
.orbit-modal .sdm-media .stockDetailThumbSwiper .swiper-slide-thumb-active {
  opacity: 1;
  box-shadow: var(--ds-shadow-neu-sm), 0 0 0 3px var(--orbit-ring);
}
/* empty case: one quiet ghost, centered (inline font-size on the <i> needs !important) */
.orbit-modal .sdm-media .no-image {
  height: auto;
  min-height: 220px;
  gap: var(--ds-space-3);
  color: var(--ds-text-3);
  font-size: 13px;
}
.orbit-modal .sdm-media .no-image i { font-size: 72px !important; opacity: 0.5; }

/* ---- identity: the stock code, carved like a stamped plate ---- */
.orbit-modal .sdm-code {
  align-self: flex-start;
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  padding: var(--ds-space-2) var(--ds-space-4);
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-inset);
  font-family: var(--ds-font-caption);
  font-size: 13px;
  font-weight: var(--ds-fw-medium);
  letter-spacing: 0.08em;
  color: var(--ds-text-2);
}
.orbit-modal .sdm-code i {
  color: var(--theme-color-ink, var(--theme-color));
  font-size: 14px;
}

/* ---- relationship stat: how many times this cari bought it ---- */
.orbit-modal .sdm-stat {
  display: flex;
  align-items: center;
  gap: var(--ds-space-3);
  padding: var(--ds-space-1) 0;
  color: var(--ds-text-2);
  font-size: 14px;
}
.orbit-modal .sdm-stat__disc {
  width: 34px;
  height: 34px;
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-circle);
  color: var(--theme-color-ink, var(--theme-color));
  font-size: 15px;
}
.orbit-modal .sdm-stat strong {
  color: var(--ds-text-1);
  font-family: var(--ds-font-caption);
  font-weight: var(--ds-fw-semibold);
  font-variant-numeric: tabular-nums;
}

/* ---- watch panel: the three toggles as latched neu pills ---- */
.orbit-modal .stock-detail-actions > .sdm-action {
  display: flex;
  align-items: center;
  gap: var(--ds-space-3);
  margin: 0;
  padding: 0 var(--ds-space-4) 0 var(--ds-space-2);
  min-height: var(--orbit-control-h, 46px);
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-sm) !important;   /* beats customize :1173 chip shadow */
  cursor: pointer;
  user-select: none;
  transition: var(--ds-transition-base);
  font-size: 14px;
  color: var(--ds-text-1);
}
.orbit-modal .stock-detail-actions > .sdm-action:hover {
  box-shadow: var(--ds-shadow-neu-hover) !important;
  transform: var(--ds-lift-hover);
}
.orbit-modal .stock-detail-actions > .sdm-action:active {
  transform: none;
  box-shadow: var(--ds-shadow-neu-pressed) !important;
}
.orbit-modal .sdm-action__disc {
  width: 34px;
  height: 34px;
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-circle);
}
.orbit-modal .sdm-action .btn-icon { font-size: 15px; color: var(--theme-color-ink, var(--theme-color)); }
/* engaged: JS toggles bootstrap's text-danger/text-success on the <i> — those
   are (0,1,0) and would lose to the rule above, so re-point them to DS state ink */
.orbit-modal .sdm-action .btn-icon.text-danger { color: var(--ds-state-error-icon); }
.orbit-modal .sdm-action .btn-icon.text-success { color: var(--ds-state-success-icon); }
.orbit-modal .sdm-action .btn-text { flex: 1; font-weight: var(--ds-fw-medium); }
/* trailing state dot: hollow at rest, accent-filled when the watch is on */
.orbit-modal .sdm-action::after {
  content: "";
  flex: none;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  box-shadow: inset 0 0 0 2px var(--ds-text-3);
  opacity: 0.45;
  transition: var(--ds-transition-base);
}
.orbit-modal .stock-detail-actions > .sdm-action.action-taken {
  background: var(--orbit-accent-soft) !important;   /* beats customize :1204-:1221 state fills */
  box-shadow: var(--ds-shadow-neu-inset) !important; /* latched = pressed in */
}
.orbit-modal .sdm-action.action-taken::after {
  background: var(--ds-accent);
  box-shadow: none;
  opacity: 1;
}

/* ---- tabs block: breathing room off the vitrine row ---- */
.orbit-modal #tabsStokDetay { margin-top: var(--ds-gap); }

/* ---- tab 1: depo ledger ---- */
.orbit-modal #tab-1 { padding-top: var(--ds-space-2); }
.orbit-modal #tab-1 .dataTable {
  width: 100%;
  max-width: 680px;
  border-collapse: collapse;
}
.orbit-modal #tab-1 .dataTable th {
  padding: var(--ds-space-2) var(--ds-space-3);
  font-size: 11px;
  font-weight: var(--ds-fw-medium);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  text-align: left;
  color: var(--ds-text-3);
  border-bottom: var(--ds-bw-hairline) solid var(--ds-border-hairline);
}
.orbit-modal #tab-1 .dataTable td {
  padding: var(--ds-space-3);
  font-size: 14px;
  color: var(--ds-text-2);
  border-bottom: var(--ds-bw-hairline) solid var(--ds-border-hairline);
}
.orbit-modal #tab-1 .dataTable tbody tr:last-child td { border-bottom: none; }
.orbit-modal #tab-1 .dataTable td:first-child::before {
  content: "\f494";                          /* fa-warehouse */
  font-family: "Font Awesome 6 Pro";
  font-weight: 300;
  margin-right: var(--ds-space-2);
  font-size: 13px;
  color: var(--theme-color-ink, var(--theme-color));
}
.orbit-modal #tab-1 .dataTable th:last-child,
.orbit-modal #tab-1 .dataTable td:last-child { text-align: right; }
.orbit-modal #tab-1 .dataTable td:last-child {
  font-family: var(--ds-font-caption);
  font-size: 15px;
  font-weight: var(--ds-fw-semibold);
  color: var(--ds-text-1);
  font-variant-numeric: tabular-nums;
}

/* ---- tab 3: özellik spec chips ---- */
.orbit-modal .sdm-specs {
  display: flex;
  flex-wrap: wrap;
  gap: var(--ds-space-3);
  padding-top: var(--ds-space-2);
}
.orbit-modal .sdm-spec {
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-1);
  min-width: 140px;
  padding: var(--ds-space-3) var(--ds-space-4);
  border-radius: var(--ds-radius-md);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-sm);
}
.orbit-modal .sdm-spec__label {
  font-size: 11px;
  font-weight: var(--ds-fw-medium);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--ds-text-3);
}
.orbit-modal .sdm-spec__value {
  font-size: 14px;
  font-weight: var(--ds-fw-medium);
  color: var(--ds-text-1);
}

/* ---- quiet empty states (replace the yellow warning badges) ---- */
.orbit-modal .sdm-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--ds-space-3);
  padding: var(--ds-space-10) var(--ds-space-4);
  color: var(--ds-text-3);
  font-size: 13px;
}
.orbit-modal .sdm-empty i { font-size: 40px; opacity: 0.55; }

/* ---- tab 2: Quill (snow) → Orbit. Toolbar = raised strip, editor = carved
        well. Quill's sheet loads before this one; borders need !important
        only where snow uses compound selectors of equal weight. ---- */
.orbit-modal .egk-stock-description-wrapper .ql-toolbar.ql-snow {
  border: none !important;
  background: var(--ds-surface);
  border-radius: var(--ds-radius-md);
  box-shadow: var(--ds-shadow-neu-sm);
  padding: var(--ds-space-2) var(--ds-space-3);
  margin-bottom: var(--ds-space-3);
}
.orbit-modal .egk-stock-description-wrapper .ql-container.ql-snow {
  border: none !important;
  background: var(--ds-surface);
  border-radius: var(--ds-radius-card);
  box-shadow: var(--ds-shadow-neu-inset);
  font-family: inherit;
  font-size: 14px;
}
.orbit-modal .egk-stock-description-wrapper .ql-container.ql-snow:focus-within {
  box-shadow: var(--ds-shadow-neu-inset), 0 0 0 3px var(--orbit-ring);
}
.orbit-modal .ql-editor { padding: var(--ds-space-4) var(--ds-space-5); color: var(--ds-text-1); }
.orbit-modal .ql-editor.ql-blank::before {
  color: var(--ds-text-3);
  font-style: normal;
  left: var(--ds-space-5);
}
/* toolbar glyphs: neutral ink, brand on hover/active (snow ships #444 greys) */
.orbit-modal .ql-snow .ql-stroke { stroke: var(--ds-text-2); }
.orbit-modal .ql-snow .ql-fill,
.orbit-modal .ql-snow .ql-stroke.ql-fill { fill: var(--ds-text-2); }
.orbit-modal .ql-snow .ql-picker { color: var(--ds-text-2); }
.orbit-modal .ql-toolbar.ql-snow button { border-radius: var(--ds-radius-sm); }
.orbit-modal .ql-toolbar.ql-snow button:hover,
.orbit-modal .ql-snow button.ql-active,
.orbit-modal .ql-snow .ql-picker-label:hover { background: var(--orbit-accent-soft); }
.orbit-modal .ql-toolbar.ql-snow button:hover .ql-stroke,
.orbit-modal .ql-snow button.ql-active .ql-stroke,
.orbit-modal .ql-snow .ql-picker-label:hover .ql-stroke,
.orbit-modal .ql-snow .ql-picker-label.ql-active .ql-stroke { stroke: var(--theme-color-ink, var(--theme-color)); }
.orbit-modal .ql-toolbar.ql-snow button:hover .ql-fill,
.orbit-modal .ql-snow button.ql-active .ql-fill { fill: var(--theme-color-ink, var(--theme-color)); }
.orbit-modal .ql-snow .ql-picker-label:hover,
.orbit-modal .ql-snow .ql-picker-label.ql-active,
.orbit-modal .ql-snow .ql-picker-item:hover,
.orbit-modal .ql-snow .ql-picker-item.ql-selected { color: var(--theme-color-ink, var(--theme-color)); }
/* picker popover + link tooltip → DS popover family */
.orbit-modal .ql-snow .ql-picker-label { border: none !important; border-radius: var(--ds-radius-sm); }
.orbit-modal .ql-snow .ql-picker-options {
  background: var(--ds-surface-raised);
  border: none !important;
  border-radius: var(--ds-radius-md);
  box-shadow: var(--ds-shadow-e4);
  padding: var(--ds-space-2);
}
.orbit-modal .ql-snow .ql-tooltip {
  background: var(--ds-surface-raised);
  border: none;
  border-radius: var(--ds-radius-md);
  box-shadow: var(--ds-shadow-e4);
  color: var(--ds-text-1);
}
.orbit-modal .ql-snow .ql-tooltip input[type="text"] {
  border: none;
  background: var(--ds-surface);
  border-radius: var(--ds-radius-sm);
  box-shadow: var(--ds-shadow-neu-inset);
  padding: 4px 10px;
}
.orbit-modal .ql-snow a { color: var(--theme-color-ink, var(--theme-color)); }

/* ---- tab 4 (Görseller): native file control → DS chip button ---- */
.orbit-modal #tabEkGorseller input[type="file"] { cursor: pointer; }
.orbit-modal #tabEkGorseller input[type="file"]::file-selector-button {
  margin-right: var(--ds-space-3);
  padding: var(--ds-space-1-5) var(--ds-space-4);
  border: none;
  border-radius: var(--ds-radius-full);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-neu-sm);
  color: var(--ds-text-2);
  font: inherit;
  font-size: 13px;
  font-weight: var(--ds-fw-medium);
  cursor: pointer;
  transition: var(--ds-transition-base);
}
.orbit-modal #tabEkGorseller input[type="file"]::file-selector-button:hover {
  color: var(--ds-text-1);
  box-shadow: var(--ds-shadow-neu-hover);
}
.orbit-modal #tableEkGorseller img { border-radius: var(--ds-radius-sm); }

/* ==========================================================================
   30. SIDE FLYOUTS — sepet & favori kenar (Views/Bilesenler/SepetKenarda.cshtml,
       rendered by _Layout OUTSIDE every per-page .ds-skin wrapper, so the
       sections carry .ds-skin.orbit-flyout themselves — same tagging idea as
       the §24 body-appended modals)
   --------------------------------------------------------------------------
   Popover family, not card family: raised overlay surface + e4 elevation
   (the .ds-dropdown__menu / .ds-modal recipe), radius-card, slide mechanics
   stay in customize.css (#sepet-kenarda fixed/right/.acik). Rows are rendered
   by Base.js (sepetDataYukle / favoriDataYukle): .kenarSepetElemani =
   64px neu image chip + .ksi-code eyebrow + name + .ksi-foot (qty ds-badge,
   .ksi-price tabular). Footer = .orbit-flyout__foot dock (Toplam row + the
   §6-painted egk-btn-primary CTA, full radius per the §20 stock-list
   precedent — no more clipped .rounded-bottom strip).
   ========================================================================== */

#sepet-kenarda.orbit-flyout,
#favori-kenarda.orbit-flyout {
  background: var(--ds-surface-raised);
  border-radius: var(--ds-radius-card);
  box-shadow: var(--ds-shadow-e4);
  overflow: hidden;
}

/* ---- header: the pill-tab adapter (§3) reads wrong inside a popover —
        flatten to a quiet header row with a hairline base ---- */
.orbit-flyout .line-slide-tab .nav-tabs {
  display: flex;
  align-items: center;
  margin: 0;
  padding: var(--ds-space-2) var(--ds-space-3);
  background: transparent;
  box-shadow: none;
  border-radius: 0;
  /* !important: §3's .ds-skin .nav-tabs pill adapter sets border: none !important */
  border-bottom: var(--ds-bw-hairline) solid var(--ds-border-hairline) !important;
}
.orbit-flyout .line-slide-tab .nav-tabs > li { margin: 0; }
.orbit-flyout .line-slide-tab .nav-tabs > li > a,
.orbit-flyout .line-slide-tab .nav-tabs > li.active > a,
.orbit-flyout .line-slide-tab .nav-tabs > li.active > a:hover,
.orbit-flyout .line-slide-tab .nav-tabs li.active > a:focus {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  padding: var(--ds-space-2) var(--ds-space-2);
  border: none;
  background: transparent !important;
  box-shadow: none !important;   /* §3's active-tab chip shadow */
  font-family: var(--ds-font-heading);
  font-size: var(--ds-text-body-sm);
  font-weight: var(--ds-fw-semibold);
  color: var(--ds-text-1);
}
.orbit-flyout .line-slide-tab .nav-tabs > li > a i {
  color: var(--theme-color-ink, var(--theme-color));
}
/* keep the favori heart its semantic red */
.orbit-flyout .line-slide-tab .nav-tabs > li > a i.text-danger {
  color: var(--ds-state-error-icon);
}
/* kill both underline systems (customize hover-grow + §3 active ink bar) */
.orbit-flyout .line-slide-tab .nav-tabs > li:after,
.orbit-flyout .line-slide-tab .nav-tabs > li.active:after,
.orbit-flyout .line-slide-tab .nav-tabs > li > a::after,
.orbit-flyout .line-slide-tab .nav-tabs > li.active > a::after {
  display: none !important;
}

/* ---- loading indicators ---- */
/* sepet: customize keeps the full-panel scrim — just round it to the card */
.orbit-flyout #kenardaIslemYapiliyor { border-radius: var(--ds-radius-card); }
/* favori: inline spinner docked to the header's right edge (inline style dropped) */
.orbit-flyout #favoriKenardaIslemYapiliyor {
  margin-left: auto;
  color: var(--ds-text-3);
}
.orbit-flyout #favoriKenardaIslemYapiliyor i { font-size: 18px; }

/* ---- body ---- */
.orbit-flyout .tab-content { padding: 0; }
.orbit-flyout #kenarSepetElemanlari,
.orbit-flyout #kenarFavoriElemanlari,
.orbit-flyout #kenarStokBildirimElemanlari {
  overflow-y: auto;                 /* auto, not scroll: no ghost gutter when short */
  overflow-x: hidden;
  max-height: 62vh;
  padding: var(--ds-space-2) var(--ds-space-3);
}

/* ---- rows ---- */
.orbit-flyout .kenarSepetElemani,
.orbit-flyout .kenarFavoriElemani {
  display: flex;
  gap: var(--ds-space-3);
  padding: var(--ds-space-2-5);
  border-radius: var(--ds-radius-md);
  transition: var(--ds-transition-base);
}
.orbit-flyout .kenarSepetElemani:hover,
.orbit-flyout .kenarFavoriElemani:hover { background: var(--ds-accent-subtle); }
.orbit-flyout .kenarSepetElemani + .kenarSepetElemani,
.orbit-flyout .kenarFavoriElemani + .kenarFavoriElemani {
  border-top: var(--ds-bw-hairline) solid var(--ds-border-hairline);
}

/* image chip: 64px neu tile (same family as the §29 vitrine thumbs) */
.orbit-flyout .sepet-gorsel {
  flex: none;
  width: 64px;
  height: 64px;
  display: grid;
  place-items: center;
  align-self: center;
  background: var(--ds-surface);
  border-radius: var(--ds-radius-md);
  box-shadow: var(--ds-shadow-neu-sm);
  overflow: hidden;
}
.orbit-flyout .sepet-gorsel img {
  width: 56px;
  height: 56px;
  object-fit: contain;
}
.orbit-flyout .sepet-gorsel .no-image {
  flex-direction: column;
  align-items: center;
  gap: 2px;
  font-size: 16px;
  color: var(--ds-text-3);
}
.orbit-flyout .sepet-gorsel .no-image span { font-size: 9px; }

.orbit-flyout .sepet-info {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 2px;
  flex: 1;
  min-width: 0;                     /* lets the name ellipsize instead of overflowing */
  width: auto;
}
.orbit-flyout .ksi-code {
  font-family: var(--ds-font-caption);
  font-size: var(--ds-text-caption);
  letter-spacing: var(--ds-ls-eyebrow);
  color: var(--ds-text-3);
}
.orbit-flyout .sepet-kenar-stokadi {
  font-size: var(--ds-text-body-sm);
  font-weight: var(--ds-fw-medium);
  color: var(--ds-text-1);
  line-height: var(--ds-lh-snug);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  padding-right: var(--ds-space-5); /* room for the hover-revealed remove tile */
}
.orbit-flyout .sepet-kenar-stokadi:hover { color: var(--theme-color-ink, var(--theme-color)); }

.orbit-flyout .ksi-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--ds-space-2);
  margin-top: auto;
  padding-top: var(--ds-space-1);
}
.orbit-flyout .ksi-price {
  font-family: var(--ds-font-caption);
  font-size: 15px;
  font-weight: var(--ds-fw-semibold);
  font-variant-numeric: tabular-nums;
  color: var(--ds-text-1);
}

/* remove button: quiet tile, revealed on row hover (customize's <1201px media
   rule still forces it visible on touch widths) */
.orbit-flyout .kenarSepetElemaniSil,
.orbit-flyout .kenarFavoriElemaniSil {
  display: none;
  position: absolute;
  top: 0;
  right: 0;
  padding: 2px;
  border: none;
  background: transparent;
  font-size: 16px;
  line-height: 1;
  color: var(--ds-text-3);
  cursor: pointer;
  transition: var(--ds-transition-base);
}
.orbit-flyout .kenarSepetElemani:hover .kenarSepetElemaniSil,
.orbit-flyout .kenarFavoriElemani:hover .kenarFavoriElemaniSil { display: block; }
.orbit-flyout .kenarSepetElemaniSil:hover,
.orbit-flyout .kenarFavoriElemaniSil:hover { color: var(--ds-state-error-icon); }

/* ---- empty state ---- */
.orbit-flyout .basket-empty {
  padding: var(--ds-space-7) var(--ds-space-4);
  text-align: center;
  font-size: var(--ds-text-body-sm);
  color: var(--ds-text-3);
}

/* ---- footer dock: Toplam row + CTA ---- */
.orbit-flyout__foot {
  padding: var(--ds-space-3) var(--ds-space-4) var(--ds-space-4);
  border-top: var(--ds-bw-hairline) solid var(--ds-border-hairline);
}
.orbit-flyout .basketSubTotal {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  margin: 0 0 var(--ds-space-3);
}
.orbit-flyout .basketSubTotal .bst-label {
  font-size: var(--ds-text-body-sm);
  color: var(--ds-text-2);
}
.orbit-flyout .basketSubTotal .bst-amount {
  font-family: var(--ds-font-caption);
  font-size: var(--ds-text-h5);
  font-weight: var(--ds-fw-semibold);
  font-variant-numeric: tabular-nums;
  color: var(--ds-text-1);
}
.orbit-flyout__foot .egk-btn { width: 100%; }
