/**
* =============================================================================
* NHance — custom.css (listing tables / DataTables)
* =============================================================================
* Purpose:
* Shared look for DataTables-based listing pages: toolbar, footer, sort
* arrows, last-column spacing, card-style rows (.app-table-card +
* tbody.app-table-body), and
* safer row action dropdowns.
*
* Load order:
* Include this file in the layout
after app-creative and DataTables
* Bootstrap CSS so these rules can override theme defaults.
*
* Related layout:
* app/Views/layout/header.php — to this file
*
* Behaviour notes (why some issues happened):
* - Toolbar: pages that used position:absolute on .dataTables_filter broke the
* flex row; we keep the filter in normal flow (see rules below).
* - Sort icons: theme used fixed vertical offsets; we use stacked triangles
* with top:50% for alignment with header text.
* - Action dropdowns: DataTables scrollX wraps the table in .dataTables_scrollBody
* with overflow:auto. Bootstrap’s dropdown (Popper) then uses a scroll
* boundary that can mis-place menus (often worse on the last row). Global
* JS in layout/footer.php sets Popper boundary and temporarily relaxes
* overflow while the menu is open — see comments there.
* =============================================================================
*/
/* -----------------------------------------------------------------------------
* SECTION: DataTables toolbar (first row inside .dataTables_wrapper)
* Search/filter left, export/buttons right, vertically centered.
* ----------------------------------------------------------------------------- */
div.dataTables_wrapper > div.row:first-of-type {
display: flex !important;
flex-wrap: wrap;
align-items: center !important;
justify-content: space-between !important;
gap: 0.15rem 0.25rem;
/* margin-left: 0 !important; */
/* margin-right: 0 !important; */
/* margin-bottom: 0.25rem !important; */
}
/* Match horizontal padding with Bootstrap columns */
div.dataTables_wrapper > div.row:first-of-type > [class*="col-"] {
padding-left: 4px;
padding-right: 4px;
}
/* Keep filter in document flow (overrides stray position:absolute in old views) */
div.dataTables_wrapper div.dataTables_filter {
position: relative !important;
float: none !important;
text-align: left !important;
margin-bottom: 0.35rem;
}
div.dataTables_wrapper .dt-buttons {
text-align: right !important;
float: none !important;
margin-bottom: 0.35rem;
}
div.dataTables_wrapper .datatable-search,
div.dataTables_wrapper .datatable-buttons {
flex: 0 1 auto;
}
/* Keep top controls on one line for desktop/tablet list pages */
@media (min-width: 768px) {
div.dataTables_wrapper > div.row:first-of-type {
flex-wrap: nowrap !important;
}
/* Legacy view-level CSS sets .dt-buttons.btn-group to grid; normalize */
div.dataTables_wrapper .dt-buttons.btn-group,
div.dataTables_wrapper .datatable-buttons.dt-buttons {
display: inline-flex !important;
flex-wrap: wrap;
align-items: center;
justify-content: flex-end;
gap: 0.4rem;
}
/* Prevent search area from consuming full row width */
div.dataTables_wrapper div.dataTables_filter {
margin-bottom: 0 !important;
}
div.dataTables_wrapper div.dataTables_filter label {
display: inline-flex !important;
align-items: center !important;
margin-bottom: 0 !important;
white-space: nowrap;
}
div.dataTables_wrapper .datatable-search-wrapper {
width: min(320px, 100%) !important;
}
}
/* Custom dom: d-flex justify-content-between (e.g. client_list, tpa_list) */
div.dataTables_wrapper .row .d-flex.justify-content-between {
width: 100%;
align-items: center !important;
}
/* -----------------------------------------------------------------------------
* SECTION: DataTables footer (last row — info, length, pagination)
* “Showing X to Y” left; “Show n entries” + pager right.
* ----------------------------------------------------------------------------- */
div.dataTables_wrapper > div.row:last-of-type {
display: flex !important;
flex-wrap: wrap;
align-items: center !important;
justify-content: space-between !important;
margin-top: 0.35rem !important;
margin-left: 0 !important;
margin-right: 0 !important;
}
/*
* Default Bootstrap/DataTables bottom row often puts length + paginate in the last
* grid column using floats; wide pagination then overlaps the word “entries”.
* Flex + gap keeps both visible on all listing pages.
*/
div.dataTables_wrapper > div.row:last-of-type > div[class*="col-"]:last-child:has(.dataTables_paginate),
div.dataTables_wrapper > div.row:last-child > div[class*="col-"]:last-child:has(.dataTables_paginate) {
display: flex !important;
flex-wrap: wrap;
align-items: center !important;
justify-content: flex-end !important;
gap: 0.5rem;
}
div.dataTables_wrapper div.dataTables_info {
padding-top: 0.5rem !important;
color: #333 !important;
font-weight: 500 !important;
}
div.dataTables_wrapper div.dataTables_length {
padding-top: 0 !important;
/* Keep “Show … entries” fully visible when pagination is wide (flex row must not shrink this) */
flex-shrink: 0 !important;
margin-right: 0.65rem !important;
overflow: visible !important;
}
div.dataTables_wrapper div.dataTables_length label {
display: inline-flex !important;
align-items: center !important;
gap: 0.35rem;
margin-bottom: 0 !important;
overflow: visible !important;
/* Views set height: 21px which can clip label text */
height: auto !important;
min-height: 0 !important;
}
/* Length “entries” dropdown — light panel */
div.dataTables_wrapper div.dataTables_length select {
/* background-color: #e0f7fa !important; */
border: 1px solid #b2ebf2 !important;
border-radius: 8px !important;
padding: 0.2rem 1.75rem 0.2rem 0.5rem !important;
font-weight: 500 !important;
color: #333 !important;
}
div.dataTables_wrapper div.dataTables_paginate {
text-align: right !important;
padding-top: 0 !important;
flex-shrink: 1 !important;
min-width: 0 !important;
}
div.dataTables_wrapper .dataTables_paginate ul.pagination {
justify-content: flex-end !important;
align-items: center !important;
flex-wrap: wrap;
margin-bottom: 0 !important;
}
/* Extra gap between “entries” and pager when both sit in a flex row (custom dom: …<'me-2'l>p…) */
div.dataTables_wrapper > div.row:last-of-type .d-flex.align-items-center,
div.dataTables_wrapper > div.row:last-child .d-flex.align-items-center {
gap: 0.5rem;
flex-wrap: wrap;
}
/* Length is often wrapped in .me-2 — that wrapper was shrinking and clipping “entries” */
div.dataTables_wrapper > div.row:last-of-type .d-flex > .me-2,
div.dataTables_wrapper > div.row:last-child .d-flex > .me-2 {
flex-shrink: 0 !important;
}
/* Inactive numbered links */
div.dataTables_wrapper .dataTables_paginate .page-item:not(.active):not(.previous):not(.next) .page-link {
background: transparent !important;
border: none !important;
color: #333 !important;
}
/* Previous / Next — shared box; arrows centered via ::before (absolute + translate) */
div.dataTables_wrapper .dataTables_paginate .page-item.previous,
div.dataTables_wrapper .dataTables_paginate .page-item.next {
display: inline-flex !important;
align-items: center !important;
align-self: center !important;
}
div.dataTables_wrapper .dataTables_paginate .page-item.previous .page-link,
div.dataTables_wrapper .dataTables_paginate .page-item.next .page-link {
border-radius: 13px !important;
border: none !important;
box-shadow: none !important;
outline: none !important;
position: relative !important;
/* Hide DataTables “Previous/Next” text; icon is ::before only */
font-size: 0 !important;
line-height: 0 !important;
color: transparent !important;
overflow: hidden !important;
min-width: 32px !important;
width: 32px !important;
min-height: 2.25rem !important;
padding: 0 !important;
display: inline-flex !important;
align-items: center !important;
justify-content: center !important;
}
div.dataTables_wrapper .dataTables_paginate .page-item.previous:not(.disabled) .page-link,
div.dataTables_wrapper .dataTables_paginate .page-item.next:not(.disabled) .page-link {
background-color: #ffffff !important;
cursor: pointer !important;
pointer-events: auto !important;
}
/* First page / last page / single page: Bootstrap + DataTables add .disabled on the */
div.dataTables_wrapper .dataTables_paginate .page-item.previous.disabled .page-link,
div.dataTables_wrapper .dataTables_paginate .page-item.next.disabled .page-link {
background-color: #ffffff !important;
cursor: not-allowed !important;
pointer-events: none !important;
opacity: 1 !important;
}
div.dataTables_wrapper .dataTables_paginate .page-item.previous .page-link::before,
div.dataTables_wrapper .dataTables_paginate .page-item.next .page-link::before {
content: "";
position: absolute !important;
left: 50% !important;
top: 50% !important;
transform: translate(-50%, -50%) !important;
text-indent: 0 !important;
line-height: 1 !important;
font-size: 12px !important;
font-family: inherit !important;
display: block !important;
margin: 0 !important;
}
div.dataTables_wrapper .dataTables_paginate .page-item.previous:not(.disabled) .page-link::before {
content: "◄";
color: #333333;
}
div.dataTables_wrapper .dataTables_paginate .page-item.next:not(.disabled) .page-link::before {
content: "►";
color: #333333;
}
div.dataTables_wrapper .dataTables_paginate .page-item.previous.disabled .page-link::before {
content: "◄";
color: #adb5bd !important;
}
div.dataTables_wrapper .dataTables_paginate .page-item.next.disabled .page-link::before {
content: "►";
color: #adb5bd !important;
}
/* DataTables markup variant without .page-item/.page-link */
div.dataTables_wrapper .dataTables_paginate .paginate_button.previous,
div.dataTables_wrapper .dataTables_paginate .paginate_button.next {
border-radius: 13px !important;
background-color: #F5FFFF !important;
border: none !important;
box-shadow: none !important;
outline: none !important;
font-size: 0 !important;
line-height: 0 !important;
color: transparent !important;
position: relative !important;
overflow: hidden !important;
min-width: 32px !important;
width: 32px !important;
min-height: 2.25rem !important;
padding: 0 !important;
display: inline-flex !important;
align-items: center !important;
justify-content: center !important;
}
div.dataTables_wrapper .dataTables_paginate .paginate_button.previous:not(.disabled),
div.dataTables_wrapper .dataTables_paginate .paginate_button.next:not(.disabled) {
background-color: #ffffff !important;
cursor: pointer !important;
}
div.dataTables_wrapper .dataTables_paginate .paginate_button.previous.disabled,
div.dataTables_wrapper .dataTables_paginate .paginate_button.next.disabled {
background-color: #ffffff !important;
cursor: not-allowed !important;
pointer-events: none !important;
opacity: 1 !important;
}
div.dataTables_wrapper .dataTables_paginate .paginate_button.previous::before,
div.dataTables_wrapper .dataTables_paginate .paginate_button.next::before {
position: absolute !important;
left: 50% !important;
top: 50% !important;
transform: translate(-50%, -50%) !important;
line-height: 1 !important;
font-size: 12px !important;
display: block !important;
margin: 0 !important;
}
div.dataTables_wrapper .dataTables_paginate .paginate_button.previous:not(.disabled)::before {
content: "◄";
color: #333333;
}
div.dataTables_wrapper .dataTables_paginate .paginate_button.next:not(.disabled)::before {
content: "►";
color: #333333;
}
div.dataTables_wrapper .dataTables_paginate .paginate_button.previous.disabled::before {
content: "◄";
color: #adb5bd !important;
}
div.dataTables_wrapper .dataTables_paginate .paginate_button.next.disabled::before {
content: "►";
color: #adb5bd !important;
}
/* Bootstrap nested markup: show arrow only on .page-link (avoid duplicate icon) */
div.dataTables_wrapper .dataTables_paginate li.paginate_button.previous::before,
div.dataTables_wrapper .dataTables_paginate li.paginate_button.next::before {
content: none !important;
}
/* -----------------------------------------------------------------------------
* SECTION: Header cells — vertical alignment for label + sort icons
* ----------------------------------------------------------------------------- */
table.dataTable thead > tr > th {
vertical-align: middle !important;
}
/* Optional wrapper used in some views — keep label from colliding with sort */
table.dataTable thead th .column-header {
display: inline-block;
vertical-align: middle;
margin-right: 0;
max-width: calc(100% - 40px);
}
/* -----------------------------------------------------------------------------
* SECTION: Last column — extra right inset (header sort + row actions)
* Rounded teal header and “…” buttons were flush to the edge; this adds
* breathing room on all listing tables using .dataTable.
* ----------------------------------------------------------------------------- */
table.dataTable thead > tr > th:last-child,
table.dataTable tbody > tr > td:last-child {
padding-right: 1.35rem !important;
}
table.dataTable thead > tr > th:last-child {
text-align: left;
}
/*
* Action cells: only when the last column contains a Bootstrap dropdown (avoids
* affecting numeric/text-only last columns that are not row actions).
*/
table.dataTable tbody > tr > td:last-child:has(.dropdown) {
position: relative;
text-align: left;
}
table.dataTable tbody > tr > td:last-child:has(.dropdown) .btn-group.dropdown {
display: inline-flex;
justify-content: flex-start;
}
/* -----------------------------------------------------------------------------
* Action column — left-aligned “…” / dropdown (footer.js adds .table-action-cell)
* ----------------------------------------------------------------------------- */
table.dataTable tbody > tr > td.table-action-cell {
text-align: left !important;
vertical-align: middle !important;
}
table.dataTable tbody > tr > td.table-action-cell .btn-group.dropdown {
display: inline-flex !important;
justify-content: flex-start !important;
float: none !important;
margin-right: 0 !important; /* Prevent global dropdown margin shifting anchor */
}
table.dataTable tbody > tr > td:last-child.table-action-cell:has(.dropdown),
table.dataTable tbody > tr > td.table-action-cell:has(.dropdown) {
text-align: left !important;
}
table.dataTable tbody > tr > td:last-child.table-action-cell:has(.dropdown) .btn-group.dropdown {
justify-content: flex-start !important;
}
/* Dropdown menu stacks above row borders / scroll quirks */
div.dataTables_wrapper .dropdown-menu {
z-index: 1050;
}
/* Tbody row actions: static + optional .dropup from footer.js — menu stays inside .btn-group */
div.dataTables_wrapper table.dataTable tbody .btn-group.dropdown {
position: relative !important;
}
div.dataTables_wrapper table.dataTable tbody .btn-group.dropdown .dropdown-menu {
z-index: 1060;
}
/* If global boundary=window ever added .position-static to a row dropdown parent, the menu
loses its anchor; tbody row toggles use data-boundary="scrollParent" — this is a safety net. */
div.dataTables_wrapper table.dataTable tbody .btn-group.dropdown.position-static {
position: relative !important;
}
/* -----------------------------------------------------------------------------
* SECTION: Sort arrows — stacked triangles (neutral / asc / desc)
* ----------------------------------------------------------------------------- */
table.dataTable thead > tr > th.sorting,
table.dataTable thead > tr > th.sorting_asc,
table.dataTable thead > tr > th.sorting_desc,
table.dataTable thead > tr > th.sorting_asc_disabled,
table.dataTable thead > tr > th.sorting_desc_disabled {
position: relative !important;
/* Room for stacked sort triangles + gap before cell edge */
padding-right: 2.35rem !important;
}
/* Reset theme font icons to CSS triangles */
table.dataTable thead .sorting:before,
table.dataTable thead .sorting_asc:before,
table.dataTable thead .sorting_desc:before,
table.dataTable thead .sorting_asc_disabled:before,
table.dataTable thead .sorting_desc_disabled:before,
table.dataTable thead .sorting:after,
table.dataTable thead .sorting_asc:after,
table.dataTable thead .sorting_desc:after,
table.dataTable thead .sorting_asc_disabled:after,
table.dataTable thead .sorting_desc_disabled:after {
font-family: inherit !important;
font-size: 0 !important;
line-height: 0 !important;
width: 0 !important;
height: 0 !important;
border: none !important;
bottom: auto !important;
opacity: 1 !important;
}
/* Up triangle */
table.dataTable thead .sorting:before,
table.dataTable thead .sorting_asc:before,
table.dataTable thead .sorting_desc:before,
table.dataTable thead .sorting_asc_disabled:before,
table.dataTable thead .sorting_desc_disabled:before {
content: "" !important;
position: absolute;
right: 0.85rem !important;
left: auto !important;
top: 50% !important;
margin-top: -7px !important;
border-left: 4px solid transparent !important;
border-right: 4px solid transparent !important;
border-bottom: 5px solid rgba(178, 235, 242, 0.95) !important;
}
/* Down triangle */
table.dataTable thead .sorting:after,
table.dataTable thead .sorting_asc:after,
table.dataTable thead .sorting_desc:after,
table.dataTable thead .sorting_asc_disabled:after,
table.dataTable thead .sorting_desc_disabled:after {
content: "" !important;
position: absolute;
right: 0.85rem !important;
left: auto !important;
top: 50% !important;
margin-top: 0 !important;
border-left: 4px solid transparent !important;
border-right: 4px solid transparent !important;
border-top: 5px solid rgba(178, 235, 242, 0.95) !important;
}
/* Active: ascending — strong up arrow */
table.dataTable thead .sorting_asc:before {
border-bottom-color: #ffffff !important;
}
table.dataTable thead .sorting_asc:after {
border-top-color: rgba(255, 255, 255, 0.35) !important;
}
/* Active: descending — strong down arrow */
table.dataTable thead .sorting_desc:before {
border-bottom-color: rgba(255, 255, 255, 0.35) !important;
}
table.dataTable thead .sorting_desc:after {
border-top-color: #ffffff !important;
}
/* Sortable but not active */
table.dataTable thead .sorting:before,
table.dataTable thead .sorting:after {
border-bottom-color: rgba(178, 235, 242, 0.95) !important;
border-top-color: rgba(178, 235, 242, 0.95) !important;
}
/* Compact table variant */
table.dataTable.table-sm > thead > tr > th.sorting:before,
table.dataTable.table-sm > thead > tr > th.sorting_asc:before,
table.dataTable.table-sm > thead > tr > th.sorting_desc:before {
margin-top: -7px !important;
}
table.dataTable.table-sm > thead > tr > th.sorting:after,
table.dataTable.table-sm > thead > tr > th.sorting_asc:after,
table.dataTable.table-sm > thead > tr > th.sorting_desc:after {
margin-top: 0 !important;
}
/*
* Last header column only: sort triangles sit 2px from the inner right edge of
* the (all listing pages). Matches product ask: fixed 2px gap vs. rounded edge.
*/
table.dataTable thead > tr > th:last-child.sorting:before,
table.dataTable thead > tr > th:last-child.sorting_asc:before,
table.dataTable thead > tr > th:last-child.sorting_desc:before,
table.dataTable thead > tr > th:last-child.sorting_asc_disabled:before,
table.dataTable thead > tr > th:last-child.sorting_desc_disabled:before,
table.dataTable thead > tr > th:last-child.sorting:after,
table.dataTable thead > tr > th:last-child.sorting_asc:after,
table.dataTable thead > tr > th:last-child.sorting_desc:after,
table.dataTable thead > tr > th:last-child.sorting_asc_disabled:after,
table.dataTable thead > tr > th:last-child.sorting_desc_disabled:after {
right: 0.65rem !important;
}
/* -----------------------------------------------------------------------------
* SECTION: Compact spacing mode for all listing tables
* Reduce extra white space around search/buttons/header/rows.
* ----------------------------------------------------------------------------- */
/* Search input compact height */
div.dataTables_wrapper .dataTables_filter input[type="search"] {
height: 34px !important;
min-height: 34px !important;
padding-top: 0.28rem !important;
padding-bottom: 0.28rem !important;
}
/* DataTables buttons compact */
div.dataTables_wrapper .dt-buttons .btn {
padding-top: 0.34rem !important;
padding-bottom: 0.34rem !important;
}
/* -----------------------------------------------------------------------------
* SECTION: Card-style listing rows
* Markup:
* …
*
* Why .app-table-card (not :has()):
* - :has() is unsupported in some environments; when invalid, the whole rule
* is dropped, so row gaps never apply.
* - dataTables.bootstrap4 sets table.dataTable { border-spacing: 0 }; we need
* a selector at least as specific as table.table.dataTable with !important.
* ----------------------------------------------------------------------------- */
table[data-custom-table-css="table"].app-table-card.table.dataTable,
table[data-custom-table-css="table"].app-table-card.table,
table[data-custom-table-css="second-table"].app-table-card.table.dataTable,
table[data-custom-table-css="second-table"].app-table-card.table {
border-collapse: separate !important;
border-spacing: 0 6px !important;
}
table[data-custom-table-css="table"].app-table-card thead tr th:first-child,
table[data-custom-table-css="second-table"].app-table-card thead tr th:first-child {
border-top-left-radius: 12px !important;
border-bottom-left-radius: 12px !important;
}
table[data-custom-table-css="table"].app-table-card thead tr th:last-child,
table[data-custom-table-css="second-table"].app-table-card thead tr th:last-child {
border-top-right-radius: 12px !important;
border-bottom-right-radius: 12px !important;
}
table[data-custom-table-css="table"].app-table-card tbody.app-table-body > tr > td,
table[data-custom-table-css="second-table"].app-table-card tbody.app-table-body > tr > td {
background-color: #ffffff !important;
border-style: solid !important;
border-color: #e8ecef !important;
border-width: 1px 0 !important;
vertical-align: middle !important;
transition: background-color 0.2s ease, border-color 0.2s ease;
}
table[data-custom-table-css="table"].app-table-card tbody.app-table-body > tr > td:first-child,
table[data-custom-table-css="second-table"].app-table-card tbody.app-table-body > tr > td:first-child {
border-left-width: 1px !important;
border-top-left-radius: 12px !important;
border-bottom-left-radius: 12px !important;
}
table[data-custom-table-css="table"].app-table-card tbody.app-table-body > tr > td:last-child,
table[data-custom-table-css="second-table"].app-table-card tbody.app-table-body > tr > td:last-child {
border-right-width: 1px !important;
border-top-right-radius: 12px !important;
border-bottom-right-radius: 12px !important;
}
table[data-custom-table-css="table"].app-table-card tbody.app-table-body > tr:hover > td,
table[data-custom-table-css="second-table"].app-table-card tbody.app-table-body > tr:hover > td {
background-color: #f0fafb !important;
border-color: #c5e6e8 !important;
}
/* Reduce header/body padding globally for listing tables */
/* table[data-custom-table-css="table"].dataTable thead th,
table[data-custom-table-css="second-table"].dataTable thead th {
padding-top: 10px !important;
padding-bottom: 10px !important; */
/* Match body cell horizontal inset so header labels line up with td text */
/* padding-left: 0.75rem !important;
padding-right: 0.75rem !important;
} */
table[data-custom-table-css="table"] tbody td,
table[data-custom-table-css="second-table"] tbody td {
padding-top: 8px !important;
padding-bottom: 8px !important;
padding-left: 0.75rem !important;
padding-right: 0.75rem !important;
}
/* Keep listing text in single line (requested no-wrap). */
div.dataTables_wrapper table.dataTable th,
div.dataTables_wrapper table.dataTable td {
white-space: nowrap !important;
}
/* Keep horizontal + vertical scrolling behavior consistent across list pages. */
div.dataTables_wrapper .dataTables_scrollHead,
div.dataTables_wrapper .dataTables_scrollBody {
width: 100% !important;
}
div.dataTables_wrapper .dataTables_scrollBody {
overflow-x: auto !important;
overflow-y: auto !important;
}
/*
* Bootstrap `.table-responsive` uses overflow-x: auto. Listing pages wrap the whole
* `.dataTables_wrapper` (toolbar + scrollX area + pagination) in it, so the same div
* gets a second horizontal scrollbar under the footer. Only `.dataTables_scrollBody`
* should scroll horizontally — turn off outer overflow when a DT wrapper is inside.
* Class is set from layout/footer.php on `init.dt`; `:has()` covers edge cases without JS.
*/
.table-responsive.nh-dt-no-outer-scroll,
.table-responsive:has(.dataTables_wrapper) {
overflow-x: visible !important;
-webkit-overflow-scrolling: auto;
}
div.dataTables_wrapper {
overflow-x: visible !important;
max-width: 100%;
}
/*
* DataTables — consistent minimum height on main app pages (≈10" laptops → large monitors).
* vmin tracks the smaller viewport edge; caps limit empty space on very large displays.
* Scroll split: min height on .dataTables_scroll / .dataTables_scrollBody.
* No scroll split: min height on wrapper only (avoids stacking min-heights with scroll region).
*/
.content-page div.dataTables_wrapper:not(:has(.dataTables_scroll)) {
min-height: clamp(18rem, 36vmin, 40rem);
}
.content-page div.dataTables_wrapper .dataTables_scroll {
min-height: clamp(16rem, 32vmin, 34rem);
}
.content-page div.dataTables_wrapper .dataTables_scrollBody {
min-height: clamp(14rem, 28vmin, 30rem);
}
/* Modals / overlays: do not reserve main-page list height */
.modal div.dataTables_wrapper,
.modal div.dataTables_wrapper .dataTables_scroll,
.modal div.dataTables_wrapper .dataTables_scrollBody,
#tpa_variation_modal div.dataTables_wrapper,
#tpa_variation_modal div.dataTables_wrapper .dataTables_scroll,
#tpa_variation_modal div.dataTables_wrapper .dataTables_scrollBody {
min-height: 0 !important;
}
/* Let the middle row shrink inside flex layouts so the wrapper doesn’t widen the page */
div.dataTables_wrapper > .row .dataTables_scroll {
max-width: 100%;
min-width: 0;
}
/* Reusable listing-table dropdown + footer spacing helpers */
div.dataTables_wrapper .dataTables_scroll {
margin-bottom: 10px;
}
div.dataTables_wrapper > .row:last-child {
clear: both;
position: relative;
}
div.dataTables_wrapper table.dataTable tbody tr.nh-force-dropup td.table-action-cell .btn-group.dropdown .dropdown-menu {
top: auto !important;
bottom: 100% !important;
margin-top: 0 !important;
margin-bottom: 0.15rem !important;
}
div.dataTables_wrapper table.dataTable tbody td.table-action-cell .dropdown-menu {
background-color: #ffffff !important;
opacity: 1 !important;
border: 1px solid rgba(0, 0, 0, 0.12) !important;
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.12) !important;
z-index: 1080 !important;
max-height: none !important;
overflow-y: visible !important;
overflow-x: visible !important;
}
div.dataTables_wrapper table.dataTable tbody td.table-action-cell .dropdown-menu .dropdown-item {
background-color: #ffffff !important;
}
div.dataTables_wrapper table.dataTable tbody td.table-action-cell .dropdown-menu .dropdown-item:hover {
background-color: #f8f9fa !important;
}
/* Row action menu: reusable click-to-open menu for list pages */
table.nh-row-action-table tbody td.table-action-cell .action-menu-toggle {
border: none !important;
background: transparent !important;
padding: 2px 8px !important;
color: #7a7a7a !important;
box-shadow: none !important;
}
table.nh-row-action-table tbody td.table-action-cell .action-menu-toggle:hover,
table.nh-row-action-table tbody td.table-action-cell .action-menu-toggle:focus {
background: #f3f6f9 !important;
color: #495057 !important;
}
table.nh-row-action-table tbody td.table-action-cell .action-menu-toggle i {
font-size: 18px;
line-height: 1;
}
table.nh-row-action-table tbody .nh-row-action-menu {
position: fixed !important;
min-width: 190px;
display: none;
z-index: 1085 !important;
transform: none !important;
}
table.nh-row-action-table tbody .nh-row-action-menu.show {
display: block !important;
bottom: auto !important;
}
/* Force downward opening for custom row-action menu, even if legacy dropup classes exist */
div.dataTables_wrapper table.nh-row-action-table tbody tr.nh-force-dropup td.table-action-cell .btn-group.dropdown .nh-row-action-menu,
div.dataTables_wrapper table.nh-row-action-table tbody td.table-action-cell .btn-group.dropdown.dropup .nh-row-action-menu,
div.dataTables_wrapper table.nh-row-action-table tbody td.table-action-cell .dropup .nh-row-action-menu {
bottom: auto !important;
margin-bottom: 0 !important;
}
/* -----------------------------------------------------------------------------
* SECTION: Small screens — stack/center DataTables controls
* ----------------------------------------------------------------------------- */
@media (max-width: 767.98px) {
div.dataTables_wrapper div.dataTables_filter,
div.dataTables_wrapper div.dataTables_length,
div.dataTables_wrapper div.dataTables_info,
div.dataTables_wrapper div.dataTables_paginate {
text-align: center !important;
}
div.dataTables_wrapper .dataTables_paginate ul.pagination {
justify-content: center !important;
}
}
/* ============================================================================
* Last column sort: enough right padding so triangles are not flush to edge
* (still respects th:last-child extra inset from “last column” section above).
* ============================================================================ */
table.dataTable thead > tr > th.sorting:last-child,
table.dataTable thead > tr > th.sorting_asc:last-child,
table.dataTable thead > tr > th.sorting_desc:last-child,
table.dataTable thead > tr > th.sorting_asc_disabled:last-child,
table.dataTable thead > tr > th.sorting_desc_disabled:last-child {
padding-right: 2.35rem !important;
}
table.dataTable thead > tr > th.sorting:last-child:before,
table.dataTable thead > tr > th.sorting_asc:last-child:before,
table.dataTable thead > tr > th.sorting_desc:last-child:before,
table.dataTable thead > tr > th.sorting_asc_disabled:last-child:before,
table.dataTable thead > tr > th.sorting_desc_disabled:last-child:before,
table.dataTable thead > tr > th.sorting:last-child:after,
table.dataTable thead > tr > th.sorting_asc:last-child:after,
table.dataTable thead > tr > th.sorting_desc:last-child:after,
table.dataTable thead > tr > th.sorting_asc_disabled:last-child:after,
table.dataTable thead > tr > th.sorting_desc_disabled:last-child:after {
right: 0.65rem !important;
} |