/* =============================================================================
   OrganicSystem — ERP Scroll Engine (authoritative)
   STANDARD:
   - Pages WITH a primary grid → grid owns vertical scrolling
   - Pages WITHOUT a grid → content area (main) owns vertical scrolling
   - Horizontal scroll stays inside the grid
   Sticky Toolbar · Sticky Filters · Sticky Footer.
   ============================================================================= */

html[data-os-scroll="content"],
html[data-os-scroll-engine="on"] {
  --os-sticky-topbar: 0px;
  --os-sticky-toolbar: 0px;
  --os-sticky-filter: 0px;
  --os-sticky-stack: 0px;
}

/* ---------- Shell never scrolls; content / grid decide ---------- */
html[data-os-scroll-engine="on"] body.os-module-shell .app-main,
html[data-os-scroll-engine="on"] body.os-module-shell {
  overflow: hidden !important;
}

html[data-os-scroll-engine="on"]:has(body.os-app-shell),
html[data-os-scroll-engine="on"]:has(body.os-module-shell) {
  overflow: hidden !important;
}

html[data-os-scroll-engine="on"] body.os-app-shell,
html[data-os-scroll-engine="on"] body.os-module-shell {
  overflow: hidden !important;
}

/* Default: form / document pages — main may scroll */
html[data-os-scroll-engine="on"] body.os-module-shell .app-main > main.os-app-main,
html[data-os-scroll-engine="on"] body.os-module-shell main.os-app-main.app-content,
html[data-os-scroll-engine="on"] body.os-app-shell:not(.login-shell):not(.os-module-shell) > .container-fluid > .os-app-main,
html[data-os-scroll-engine="on"] body.os-app-shell:not(.login-shell) main.os-app-main {
  overflow-x: clip !important;
  overflow-y: auto !important;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  min-height: 0 !important;
}

/* Grid pages: main is a flex column; the grid consumes remaining height.
   Page does NOT grow a scrollbar because of grid rows.
   Fertigation Edit is excluded — form + fertilizer table need main page scroll. */
html[data-os-scroll-engine="on"] main.os-app-main:has(.os-dx-grid):not(:has(> .ags-fertigation-edit-page)):not(:has(.prs-local-invoice-edit)),
html[data-os-scroll-engine="on"] main.os-app-main:has(.os-page-grid-view):not(:has(> .ags-fertigation-edit-page)):not(:has(.prs-local-invoice-edit)),
html[data-os-scroll-engine="on"] main.os-app-main:has(.os-grid-container):not(:has(> .ags-fertigation-edit-page)):not(:has(.prs-local-invoice-edit)),
html[data-os-scroll-engine="on"] main.os-app-main:has([data-os-page-grid="true"]):not(:has(> .ags-fertigation-edit-page)):not(:has(.prs-local-invoice-edit)),
html[data-os-scroll-engine="on"] body.os-table-fill-page main.os-app-main,
html[data-os-grid-scroll="internal"] main.os-app-main:not(:has(> .ags-fertigation-edit-page)):not(:has(.prs-local-invoice-edit)) {
  display: flex !important;
  flex-direction: column !important;
  overflow-y: hidden !important;
  min-height: 0 !important;
}

/* Edit pages with a grid still need page scroll for form fields above/below.
   Only suppress page Y when the page is a dedicated grid shell. */
html[data-os-scroll-engine="on"] main.os-app-main:has(> [class*="-edit-page"] .os-dx-grid):not(:has(.os-dx-grid--fill)):not(:has([data-os-grid-internal-scroll="1"])),
html[data-os-scroll-engine="on"] main.os-app-main > [class*="-edit-page"]:not(:has(.os-dx-grid--fill)):not(:has([data-os-grid-internal-scroll="1"])),
html[data-os-scroll-engine="on"] main.os-app-main:has(> .ags-fertigation-edit-page),
html[data-os-scroll-engine="on"] main.os-app-main > .ags-fertigation-edit-page {
  overflow-y: auto !important;
}

html[data-os-scroll-engine="on"] main.os-app-main > .ags-fertigation-edit-page {
  display: block !important;
  height: auto !important;
  max-height: none !important;
  overflow: visible !important;
  flex: none !important;
}

/* Page roots hosting a primary grid fill the main column */
html[data-os-scroll-engine="on"] main.os-app-main > [class*="-index-page"]:has(.os-dx-grid, .os-page-grid-view, .os-grid-container),
html[data-os-scroll-engine="on"] main.os-app-main > [class*="-page"]:not(.ags-fertigation-edit-page):has(.os-dx-grid--fill, [data-os-grid-internal-scroll="1"]),
html[data-os-scroll-engine="on"] main.os-app-main > .os-page-scroll:has(.os-dx-grid, .os-page-grid-view, .os-grid-container),
html[data-os-scroll-engine="on"] main.os-app-main > .ags-plan-page,
html[data-os-scroll-engine="on"] main.os-app-main > .ags-balance-page,
html[data-os-scroll-engine="on"] main.os-app-main > .prs-balance-page,
html[data-os-scroll-engine="on"] main.os-app-main > .rotation-page,
html[data-os-scroll-engine="on"] body.os-table-fill-page main.os-app-main > * {
  display: flex !important;
  flex-direction: column !important;
  flex: 1 1 auto !important;
  min-height: 0 !important;
  max-height: 100% !important;
  overflow: hidden !important;
}

/* Nested page scroll hosts must not become a second Y owner on grid pages */
html[data-os-scroll-engine="on"] .os-app-main .os-page-scroll:has(.os-dx-grid, .os-page-grid-view, .os-grid-container) {
  display: flex !important;
  flex-direction: column !important;
  flex: 1 1 auto !important;
  min-height: 0 !important;
  overflow: hidden !important;
  max-height: none !important;
  height: auto !important;
}

/* ---------- Primary grid hosts: bounded height, internal Y ---------- */
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid:not(.os-dx-grid--content):not([data-os-grid-size="content"]),
html[data-os-scroll-engine="on"] .os-app-main .os-page-grid-view:not(.os-dx-grid--content):not([data-os-grid-size="content"]),
html[data-os-scroll-engine="on"] .os-app-main .os-grid-container,
html[data-os-scroll-engine="on"] .os-app-main .os-page-table-view.os-grid-container,
html[data-os-scroll-engine="on"] .os-app-main .os-page-table-view[data-os-grid-internal-scroll="1"],
html[data-os-scroll-engine="on"] .os-app-main [data-os-page-grid="true"],
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid--fill,
html[data-os-scroll-engine="on"] .os-app-main [data-os-grid-internal-scroll="1"],
html[data-os-scroll-engine="on"] .os-app-main .plan-grid-panel > [id$="-grid"],
html[data-os-scroll-engine="on"] .os-app-main .ags-farms-sites-grid,
html[data-os-scroll-engine="on"] .os-app-main .ags-farms-plots-grid {
  flex: 1 1 auto !important;
  align-self: stretch !important;
  min-width: 0 !important;
  min-height: 0 !important;
  width: auto !important;
  max-width: 100% !important;
  height: var(--os-gc-height, 100%) !important;
  max-height: var(--os-gc-height, 100%) !important;
  overflow: hidden !important;
  position: relative;
}

/* Content-sized detail grids keep page-owned height (do not fill leftover viewport). */
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid.os-dx-grid--content,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid[data-os-grid-size="content"],
html[data-os-scroll-engine="on"] .os-app-main .os-page-grid-view.os-dx-grid--content,
html[data-os-scroll-engine="on"] .os-app-main .os-page-grid-view[data-os-grid-size="content"] {
  flex: 0 0 auto !important;
  flex-grow: 0 !important;
  align-self: stretch !important;
  min-height: 0 !important;
  max-height: none !important;
}

html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid:not(.os-dx-grid--content):not([data-os-grid-size="content"]) > .dx-datagrid,
html[data-os-scroll-engine="on"] .os-app-main .os-page-grid-view:not(.os-dx-grid--content):not([data-os-grid-size="content"]) > .dx-datagrid,
html[data-os-scroll-engine="on"] .os-app-main .os-grid-container > .dx-datagrid,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid.dx-datagrid:not(.os-dx-grid--content):not([data-os-grid-size="content"]),
html[data-os-scroll-engine="on"] .os-app-main .os-grid-container.dx-datagrid,
html[data-os-scroll-engine="on"] .os-app-main [data-os-grid-internal-scroll="1"] > .dx-datagrid,
html[data-os-scroll-engine="on"] .os-app-main [data-os-grid-internal-scroll="1"].dx-datagrid {
  height: 100% !important;
  max-height: 100% !important;
  min-height: 0 !important;
  width: auto !important;
  max-width: 100% !important;
  overflow: hidden !important;
  display: flex !important;
  flex-direction: column !important;
}

html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid.os-dx-grid--content[data-os-grid-height="auto"].dx-datagrid,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid[data-os-grid-size="content"][data-os-grid-height="auto"].dx-datagrid,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid.os-dx-grid--content[data-os-grid-height="auto"] > .dx-datagrid,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid[data-os-grid-size="content"][data-os-grid-height="auto"] > .dx-datagrid {
  flex: 0 0 auto !important;
  height: auto !important;
  max-height: none !important;
  min-height: 0 !important;
}

html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid.os-dx-grid--content[data-os-grid-height="fixed"].dx-datagrid,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid[data-os-grid-size="content"][data-os-grid-height="fixed"].dx-datagrid,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid.os-dx-grid--content[data-os-grid-height="fixed"] > .dx-datagrid,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid[data-os-grid-size="content"][data-os-grid-height="fixed"] > .dx-datagrid {
  flex: 0 0 auto !important;
  min-height: 0 !important;
}

/* Content-sized AUTO: compact rowsview (no empty fill viewport). */
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid.os-dx-grid--content[data-os-grid-height="auto"] .dx-datagrid-rowsview,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid[data-os-grid-size="content"][data-os-grid-height="auto"] .dx-datagrid-rowsview,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid.os-dx-grid--content[data-os-grid-height="auto"] .dx-datagrid-rowsview .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid[data-os-grid-size="content"][data-os-grid-height="auto"] .dx-datagrid-rowsview .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid.os-dx-grid--content[data-os-grid-height="auto"] .dx-scrollable-native > .dx-scrollable-wrapper > .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid[data-os-grid-size="content"][data-os-grid-height="auto"] .dx-scrollable-native > .dx-scrollable-wrapper > .dx-scrollable-container {
  flex: 0 0 auto !important;
  height: auto !important;
  max-height: none !important;
  min-height: 0 !important;
}

html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid.os-dx-grid--content[data-os-grid-height="auto"] .dx-freespace-row,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid[data-os-grid-size="content"][data-os-grid-height="auto"] .dx-freespace-row {
  height: 0 !important;
  min-height: 0 !important;
  max-height: 0 !important;
}

/* Headers stay pinned; rows own the vertical scrollbar */
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid .dx-datagrid-headers,
html[data-os-scroll-engine="on"] .os-app-main .os-page-grid-view .dx-datagrid-headers,
html[data-os-scroll-engine="on"] .os-app-main .os-grid-container .dx-datagrid-headers,
html[data-os-scroll-engine="on"] .os-app-main [data-os-grid-internal-scroll="1"] .dx-datagrid-headers {
  display: block !important;
  visibility: visible !important;
  opacity: 1 !important;
  flex: 0 0 auto !important;
  height: auto !important;
  min-height: var(--os-grid-header-row-height, 36px) !important;
  max-height: none !important;
  overflow: visible !important;
  z-index: 2;
}

/* rowsview clips; scrollable-container is the sole vertical owner (no double bars).
   Content-sized AUTO hosts are excluded — they must not reserve a fill viewport. */
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid:not([data-os-grid-height="auto"]) .dx-datagrid-rowsview,
html[data-os-scroll-engine="on"] .os-app-main .os-page-grid-view:not([data-os-grid-height="auto"]) .dx-datagrid-rowsview,
html[data-os-scroll-engine="on"] .os-app-main .os-grid-container .dx-datagrid-rowsview,
html[data-os-scroll-engine="on"] .os-app-main [data-os-grid-internal-scroll="1"] .dx-datagrid-rowsview {
  overflow-x: hidden !important;
  overflow-y: hidden !important;
  overscroll-behavior: contain;
  min-height: 0 !important;
  height: 100% !important;
  max-height: 100% !important;
  flex: 1 1 auto !important;
}

/* Native scroll grids: container is the sole Y owner. */
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid:not([data-os-grid-height="auto"]) .dx-scrollable-native > .dx-scrollable-wrapper > .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main .os-page-grid-view:not([data-os-grid-height="auto"]) .dx-scrollable-native > .dx-scrollable-wrapper > .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main .os-grid-container .dx-scrollable-native > .dx-scrollable-wrapper > .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main [data-os-grid-internal-scroll="1"] .dx-scrollable-native > .dx-scrollable-wrapper > .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid:not([data-os-grid-height="auto"]) .dx-datagrid-rowsview.dx-scrollable-native .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main .os-page-grid-view:not([data-os-grid-height="auto"]) .dx-datagrid-rowsview.dx-scrollable-native .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main .os-grid-container .dx-datagrid-rowsview.dx-scrollable-native .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main [data-os-grid-internal-scroll="1"] .dx-datagrid-rowsview.dx-scrollable-native .dx-scrollable-container {
  overflow-x: auto !important;
  overflow-y: auto !important;
  overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
  min-height: 0 !important;
  height: 100% !important;
  max-height: 100% !important;
  flex: 1 1 auto !important;
}

/* Simulated scroll grids: keep container clipped — DX thumb owns scrolling.
   Forcing overflow:auto here creates a dead native bar that steals clicks. */
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid:not([data-os-grid-height="auto"]) .dx-scrollable-simulated > .dx-scrollable-wrapper > .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main .os-page-grid-view:not([data-os-grid-height="auto"]) .dx-scrollable-simulated > .dx-scrollable-wrapper > .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main .os-grid-container .dx-scrollable-simulated > .dx-scrollable-wrapper > .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main [data-os-grid-internal-scroll="1"] .dx-scrollable-simulated > .dx-scrollable-wrapper > .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid:not([data-os-grid-height="auto"]) .dx-datagrid-rowsview.dx-scrollable-simulated .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main .os-page-grid-view:not([data-os-grid-height="auto"]) .dx-datagrid-rowsview.dx-scrollable-simulated .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main .os-grid-container .dx-datagrid-rowsview.dx-scrollable-simulated .dx-scrollable-container,
html[data-os-scroll-engine="on"] .os-app-main [data-os-grid-internal-scroll="1"] .dx-datagrid-rowsview.dx-scrollable-simulated .dx-scrollable-container {
  overflow: hidden !important;
  min-height: 0 !important;
  height: 100% !important;
  max-height: 100% !important;
  flex: 1 1 auto !important;
}

/* Totals stay under the scrollport inside the grid widget */
html[data-os-scroll-engine="on"] .os-app-main .os-dx-grid .dx-datagrid-total-footer,
html[data-os-scroll-engine="on"] .os-app-main .os-grid-container .dx-datagrid-total-footer {
  flex: 0 0 auto !important;
}

/* Nested detail / popup grids — grid owns Y; host must not also scroll */
html[data-os-scroll-engine="on"] .dx-popup-content:has(.dx-datagrid),
html[data-os-scroll-engine="on"] .modal-body:has(.dx-datagrid) {
  overflow: hidden !important;
  display: flex !important;
  flex-direction: column !important;
  min-height: 0 !important;
}

/* Master-detail cells size to content (do not flex-collapse nested grids). */
html[data-os-scroll-engine="on"] .dx-master-detail-cell:has(.dx-datagrid) {
  overflow: visible !important;
  display: block !important;
  height: auto !important;
  max-height: none !important;
  min-height: 0 !important;
}

html[data-os-scroll-engine="on"] .dx-popup-content:has(.dx-datagrid) > .dx-datagrid,
html[data-os-scroll-engine="on"] .dx-popup-content:has(.dx-datagrid) .dx-datagrid,
html[data-os-scroll-engine="on"] .modal-body:has(.dx-datagrid) .dx-datagrid {
  flex: 1 1 auto !important;
  min-height: 0 !important;
  max-height: 100% !important;
  overflow: hidden !important;
}

html[data-os-scroll-engine="on"] .dx-master-detail-cell .dx-datagrid {
  flex: none !important;
  height: auto !important;
  min-height: 0 !important;
  max-height: none !important;
  overflow: visible !important;
}

html[data-os-scroll-engine="on"] .dx-popup-content .dx-datagrid-rowsview,
html[data-os-scroll-engine="on"] .modal-body .dx-datagrid-rowsview {
  overflow-x: hidden !important;
  overflow-y: hidden !important;
  max-height: none;
  min-height: 0 !important;
  flex: 1 1 auto !important;
}

html[data-os-scroll-engine="on"] .dx-master-detail-cell .dx-datagrid-rowsview {
  overflow-x: auto !important;
  overflow-y: visible !important;
  height: auto !important;
  max-height: none !important;
  min-height: 0 !important;
  flex: none !important;
}

html[data-os-scroll-engine="on"] .dx-popup-content .dx-datagrid-rowsview.dx-scrollable-native .dx-scrollable-container,
html[data-os-scroll-engine="on"] .modal-body .dx-datagrid-rowsview.dx-scrollable-native .dx-scrollable-container {
  overflow-x: auto !important;
  overflow-y: auto !important;
  min-height: 0 !important;
  max-height: 100% !important;
}

html[data-os-scroll-engine="on"] .dx-master-detail-cell .dx-datagrid-rowsview.dx-scrollable-native .dx-scrollable-container,
html[data-os-scroll-engine="on"] .dx-master-detail-cell .dx-datagrid-rowsview.dx-scrollable-simulated .dx-scrollable-container {
  overflow-x: auto !important;
  overflow-y: visible !important;
  height: auto !important;
  min-height: 0 !important;
  max-height: none !important;
  flex: none !important;
}

html[data-os-scroll-engine="on"] .dx-popup-content .dx-datagrid-rowsview.dx-scrollable-simulated .dx-scrollable-container,
html[data-os-scroll-engine="on"] .modal-body .dx-datagrid-rowsview.dx-scrollable-simulated .dx-scrollable-container {
  overflow: hidden !important;
  min-height: 0 !important;
  max-height: 100% !important;
}

/* Split / plan panes: each pane clips; grid inside scrolls */
html[data-os-scroll-engine="on"] .os-app-main .plan-page-grids-host,
html[data-os-scroll-engine="on"] .os-app-main .plan-grids-row,
html[data-os-scroll-engine="on"] .os-app-main .os-split-view,
html[data-os-scroll-engine="on"] .os-app-main .os-split-pane,
html[data-os-scroll-engine="on"] .os-app-main .plan-grid-panel {
  min-height: 0 !important;
  overflow: hidden !important;
}

html[data-os-scroll-engine="on"] .os-app-main .os-split-view[data-os-split-mode="stack"] {
  overflow-y: auto !important; /* stack mode: page area may scroll between panes */
  overflow-x: clip !important;
}

/* ---------- Sticky Toolbar (inside content scroll / chrome) ---------- */
html[data-os-scroll-engine="on"] .os-app-main .os-page-sticky-chrome,
html[data-os-scroll-engine="on"] .os-app-main .plan-page-chrome,
html[data-os-scroll-engine="on"] .os-app-main .os-desktop-page-header:has(.os-page-toolbar),
html[data-os-scroll-engine="on"] .os-app-main .os-page-toolbar,
html[data-os-scroll-engine="on"] .os-app-main .plan-toolbar {
  position: sticky !important;
  top: var(--os-sticky-stack, 0px) !important;
  z-index: 25;
  background: var(--os-color-surface, #fff);
  max-height: none !important;
  overflow: visible !important;
  flex: 0 0 auto !important;
}

html[data-os-scroll-engine="on"] body.os-module-shell .app-main > .app-topbar,
html[data-os-scroll-engine="on"] body.os-module-shell .app-main > .os-erp-breadcrumb,
html[data-os-scroll-engine="on"] body.os-module-shell .app-main > #os-app-page-chrome-host,
html[data-os-scroll-engine="on"] body.os-module-shell .app-main > .os-module-toolbar {
  position: relative !important;
  top: auto !important;
  flex: 0 0 auto !important;
  z-index: 30;
  overflow: visible !important;
  transform: none !important;
}

html[data-os-scroll-engine="on"] .os-app-main .os-filter-bar,
html[data-os-scroll-engine="on"] .os-app-main .os-report-filter-form,
html[data-os-scroll-engine="on"] .os-app-main .os-page-sticky-chrome .os-filter-bar {
  position: sticky !important;
  top: calc(var(--os-sticky-stack, 0px) + var(--os-sticky-toolbar, 0px)) !important;
  z-index: 24;
  background: var(--os-color-surface, #fff);
  overflow-x: clip !important;
  overflow-y: visible !important;
  flex: 0 0 auto !important;
}

html[data-os-scroll-engine="on"] body.os-module-shell > footer.os-app-footer,
html[data-os-scroll-engine="on"] body.os-module-shell > .os-app-footer,
html[data-os-scroll-engine="on"] body.os-module-shell .app-main > footer.os-app-footer,
html[data-os-scroll-engine="on"] body.os-module-shell .app-main > .os-app-footer,
html[data-os-scroll-engine="on"] body.os-app-shell > footer.os-app-footer,
html[data-os-scroll-engine="on"] body.os-app-shell > footer.footer {
  position: relative !important;
  flex: 0 0 auto !important;
  margin-top: 0 !important;
  width: 100% !important;
  height: var(--os-app-footer-height, 1.5rem) !important;
  min-height: var(--os-app-footer-height, 1.5rem) !important;
  max-height: var(--os-app-footer-height, 1.5rem) !important;
  overflow: hidden !important;
  z-index: 45;
}

/* Allowlisted nested Y (dialogs / sidebar nav).
   Popups/modals that host a DataGrid must NOT scroll — the grid owns Y. */
html[data-os-scroll-engine="on"] .app-sidebar__scroll,
html[data-os-scroll-engine="on"] .modal-body:not(:has(.dx-datagrid)),
html[data-os-scroll-engine="on"] .modal-dialog-scrollable .modal-body:not(:has(.dx-datagrid)),
html[data-os-scroll-engine="on"] .offcanvas-body:not(:has(.dx-datagrid)),
html[data-os-scroll-engine="on"] .dx-popup-content:not(:has(.dx-datagrid)) {
  overflow-y: auto;
}

html[data-os-scroll-engine="on"] .dx-popup-content:has(.dx-datagrid),
html[data-os-scroll-engine="on"] .modal-body:has(.dx-datagrid),
html[data-os-scroll-engine="on"] .offcanvas-body:has(.dx-datagrid) {
  overflow: hidden !important;
}

/* =============================================================================
   FINAL KILL-SWITCH — nested vertical scrollbars on grid pages
   Loaded last among scroll layers. Beats os-scroll.css / os-responsive-fix.css
   rules that reopen main { overflow-y:auto } or leave Bootstrap wrappers as
   overflow-y:auto (via overflow-x:auto → overflow-y computes to auto).
   Contract: when html[data-os-grid-scroll="internal"], ONLY the grid's
   .dx-scrollable-container (native) or DX simulated thumb owns vertical scroll.
   ============================================================================= */

html[data-os-grid-scroll="internal"] body.os-module-shell .app-main > main.os-app-main:not(:has(.prs-local-invoice-edit)),
html[data-os-grid-scroll="internal"] body.os-module-shell .app-main > main.os-app-main.app-content:not(:has(.prs-local-invoice-edit)),
html[data-os-grid-scroll="internal"] body.os-app-shell:not(.login-shell) > .container-fluid > .os-app-main:not(:has(.prs-local-invoice-edit)),
html[data-os-scroll-engine="on"][data-os-grid-scroll="internal"] body.os-module-shell .app-main > main.os-app-main:not(:has(.prs-local-invoice-edit)),
html[data-os-scroll-engine="on"][data-os-grid-scroll="internal"] body.os-module-shell .app-main > main.os-app-main.app-content:not(:has(.prs-local-invoice-edit)) {
  display: flex !important;
  flex-direction: column !important;
  overflow-x: clip !important;
  overflow-y: hidden !important;
  min-height: 0 !important;
  /* Padding-bottom on the clip host creates a phantom second gutter next to the grid. */
  padding-bottom: 0 !important;
}

/* Page shell / panels wrap the fill grid — flex column, never a Y owner */
html[data-os-grid-scroll="internal"] .os-app-main > .os-erp-page-shell:not(.prs-local-invoice-edit),
html[data-os-grid-scroll="internal"] .os-app-main > .os-erp-page:not(.prs-local-invoice-edit),
html[data-os-grid-scroll="internal"] .os-app-main > [class*="-page"]:not(.prs-local-invoice-edit):has(.os-dx-grid--fill, [data-os-grid-internal-scroll="1"], .os-grid-container),
html[data-os-grid-scroll="internal"] .os-app-main .prs-content-panel:has(.os-dx-grid, .dx-datagrid),
html[data-os-grid-scroll="internal"] .os-app-main .os-erp-panel:has(.os-dx-grid, .dx-datagrid),
html[data-os-grid-scroll="internal"] .os-app-main .table-responsive:has(.os-dx-grid, .dx-datagrid),
html[data-os-grid-scroll="internal"] .os-app-main .os-erp-data-table-host:has(.os-dx-grid, .dx-datagrid) {
  display: flex !important;
  flex-direction: column !important;
  flex: 1 1 auto !important;
  min-height: 0 !important;
  max-height: 100% !important;
  overflow-x: auto !important;
  overflow-y: hidden !important;
}

/* rowsview clips; never become a second Y scroller beside scrollable-container */
html[data-os-grid-scroll="internal"] .os-app-main .dx-datagrid-rowsview,
html[data-os-grid-scroll="internal"] .os-app-main .os-dx-grid .dx-datagrid-rowsview,
html[data-os-grid-scroll="internal"] .os-app-main .os-grid-container .dx-datagrid-rowsview {
  overflow-x: hidden !important;
  overflow-y: hidden !important;
}

/* Sole vertical owner for native-scroll grids */
html[data-os-grid-scroll="internal"] .os-app-main .dx-datagrid-rowsview.dx-scrollable-native > .dx-scrollable-wrapper > .dx-scrollable-container,
html[data-os-grid-scroll="internal"] .os-app-main .dx-datagrid-rowsview.dx-scrollable-native .dx-scrollable-container {
  overflow-x: auto !important;
  overflow-y: auto !important;
}

/* Portrait / narrow: page owns Y on EVERY page (including former grid-internal hosts). */
@media (orientation: portrait), (max-aspect-ratio: 1/1), (max-width: 991.98px) {
  html[data-os-portrait-scroll="page"] body.os-module-shell .app-main > main.os-app-main,
  html[data-os-portrait-scroll="page"] body.os-module-shell .app-main > main.os-app-main.app-content,
  html[data-os-portrait-scroll="page"] body.os-app-shell:not(.login-shell) > .container-fluid > .os-app-main,
  html[data-os-grid-scroll="internal"] body.os-module-shell .app-main > main.os-app-main,
  html[data-os-grid-scroll="internal"] body.os-module-shell .app-main > main.os-app-main.app-content,
  html[data-os-grid-scroll="internal"] body.os-app-shell:not(.login-shell) > .container-fluid > .os-app-main {
    display: block !important;
    overflow-x: clip !important;
    overflow-y: auto !important;
    height: auto !important;
    max-height: none !important;
    min-height: 0 !important;
    padding-bottom: 0 !important;
  }

  html[data-os-portrait-scroll="page"] .os-app-main > .os-erp-page-shell,
  html[data-os-portrait-scroll="page"] .os-app-main > .os-erp-page,
  html[data-os-portrait-scroll="page"] .os-app-main .table-responsive:has(.os-dx-grid, .dx-datagrid),
  html[data-os-portrait-scroll="page"] .os-app-main .os-erp-data-table-host:has(.os-dx-grid, .dx-datagrid),
  html[data-os-portrait-scroll="page"] .os-app-main .os-erp-panel:has(.os-dx-grid, .dx-datagrid),
  html[data-os-portrait-scroll="page"] .os-app-main .prs-content-panel:has(.os-dx-grid, .dx-datagrid),
  html[data-os-grid-scroll="internal"] .os-app-main > .os-erp-page-shell,
  html[data-os-grid-scroll="internal"] .os-app-main .table-responsive:has(.os-dx-grid, .dx-datagrid) {
    display: block !important;
    flex: none !important;
    max-height: none !important;
    height: auto !important;
    overflow-x: auto !important;
    overflow-y: visible !important;
  }

  html[data-os-portrait-scroll="page"] .os-app-main .os-dx-grid,
  html[data-os-portrait-scroll="page"] .os-app-main .os-page-grid-view,
  html[data-os-portrait-scroll="page"] .os-app-main .os-grid-container,
  html[data-os-portrait-scroll="page"] .os-app-main .os-dx-grid--fill,
  html[data-os-portrait-scroll="page"] .os-app-main [data-os-grid-internal-scroll="1"] {
    height: auto !important;
    max-height: none !important;
    flex: none !important;
    overflow-x: auto !important;
    overflow-y: visible !important;
  }
}

/* Local Invoice Edit: main owns page Y; side balance + products tables own their own scroll. */
html[data-os-scroll-engine="on"] body.os-module-shell:has(.prs-local-invoice-edit) .app-main > main.os-app-main,
html[data-os-scroll-engine="on"] body.os-module-shell:has(.prs-local-invoice-edit) .app-main > main.os-app-main.app-content,
html[data-os-scroll-engine="on"] body.os-app-shell:has(.prs-local-invoice-edit) main.os-app-main,
html[data-os-scroll-engine="on"][data-os-grid-scroll="internal"] body.os-module-shell:has(.prs-local-invoice-edit) .app-main > main.os-app-main,
html[data-os-scroll-engine="on"][data-os-grid-scroll="internal"] body.os-module-shell:has(.prs-local-invoice-edit) .app-main > main.os-app-main.app-content,
html[data-os-scroll-engine="on"] main.os-app-main:has(.prs-local-invoice-edit) {
  display: block !important;
  flex: 1 1 auto !important;
  min-height: 0 !important;
  overflow-x: hidden !important;
  overflow-y: auto !important;
}

html[data-os-grid-scroll="internal"] .os-app-main > .prs-local-invoice-edit,
html[data-os-grid-scroll="internal"] .os-app-main > .prs-local-invoice-edit.os-erp-page-shell,
html[data-os-grid-scroll="internal"] .os-app-main > .prs-local-invoice-edit.os-erp-page,
html[data-os-scroll-engine="on"] .prs-local-invoice-edit {
  display: flex !important;
  flex-direction: column !important;
  flex: 0 0 auto !important;
  min-height: 0 !important;
  height: auto !important;
  max-height: none !important;
  overflow: visible !important;
}

html[data-os-grid-scroll="internal"] .prs-local-invoice-edit .prs-content-panel,
html[data-os-grid-scroll="internal"] .prs-local-invoice-edit .prs-content-panel:has(.os-dx-grid, .dx-datagrid),
html[data-os-scroll-engine="on"] .prs-local-invoice-edit .prs-content-panel {
  display: block !important;
  flex: 0 0 auto !important;
  min-height: 0 !important;
  height: auto !important;
  max-height: none !important;
  overflow: visible !important;
}

