+
+
if (logo.length) {
logo.attr(
'src',
- isDark ? 'dist/tradon-dark.png' :
- 'dist/tradon.png');
+ 'dist/tradon_wbg.png');
+ logo.attr('title', 'v1.2');
}
}
@@ -170,7 +183,268 @@ this repository contains the full copyright notices and license terms. -->
}, delay);
});
}
- jQuery('[data-toggle="offcanvas"]').click(function() {
+ // Keep the full-screen menu code in place, but disable its
+ // loading and logo entry point while the layout is refined.
+ var enableFullMenu = false;
+ function setFullMenuVisible(visible) {
+ var main = jQuery('#main');
+ if (visible && !jQuery('#tradon-full-menu')
+ .find('.tradon-full-menu-card').length) {
+ visible = false;
+ }
+ jQuery('#tradon-full-menu').attr(
+ 'aria-hidden', visible ? 'false' : 'true');
+ main.toggleClass('tradon-full-menu-active', visible);
+ if (visible) {
+ jQuery('.row-offcanvas').removeClass('active');
+ }
+ notifyLayoutResize();
+ }
+ function normalizeMenuValue(value) {
+ if (value === null || value === undefined) {
+ return '';
+ }
+ if (Array.isArray(value)) {
+ return value.length > 1 ? value[1] : value[0];
+ }
+ if (typeof value == 'object') {
+ return value.rec_name || value.name || '';
+ }
+ return value;
+ }
+ function menuField(record, name) {
+ if (name == 'rec_name' && record._values &&
+ record._values.rec_name) {
+ return record._values.rec_name;
+ }
+ try {
+ if (record.model && record.model.fields[name]) {
+ return normalizeMenuValue(
+ record.field_get_client(name));
+ }
+ } catch (error) {
+ }
+ return null;
+ }
+ function menuLabel(record) {
+ return menuField(record, 'name') ||
+ menuField(record, 'rec_name') ||
+ (record.id ? String(record.id) : '');
+ }
+ function prepareMenuRecord(record) {
+ var waits = [];
+ ['name', 'icon'].forEach(function(name) {
+ if (record.model && record.model.fields[name] &&
+ !record.is_loaded(name)) {
+ waits.push(record.load(name, true, false));
+ }
+ });
+ if (!record._values || !record._values.rec_name) {
+ waits.push(record.rec_name().then(
+ function(name) {
+ record._values.rec_name = name;
+ },
+ function() {
+ }));
+ }
+ return jQuery.when.apply(jQuery, waits);
+ }
+ function activateMenuRecord(record) {
+ if (Sao.main_menu_screen) {
+ Sao.main_menu_screen.current_record = record;
+ setFullMenuVisible(false);
+ Sao.main_menu_row_activate();
+ }
+ }
+ function loadMenuChildren(record, childrenField) {
+ if (!childrenField) {
+ return jQuery.when([]);
+ }
+ var load = record.is_loaded &&
+ record.is_loaded(childrenField) ?
+ jQuery.when() :
+ record.load(childrenField, true, false);
+ return load.then(function() {
+ return record.field_get_client(childrenField) || [];
+ });
+ }
+ function buildMenuNode(record, childrenField, depth) {
+ return prepareMenuRecord(record).then(function() {
+ var node = {
+ label: menuLabel(record),
+ icon: menuField(record, 'icon'),
+ record: record,
+ children: []
+ };
+ if (depth > 4) {
+ return node;
+ }
+ return loadMenuChildren(record, childrenField)
+ .then(function(children) {
+ var waits = [];
+ children.forEach(function(child) {
+ waits.push(buildMenuNode(
+ child, childrenField, depth + 1));
+ });
+ return jQuery.when.apply(jQuery, waits)
+ .then(function() {
+ node.children = Array.prototype.slice
+ .call(arguments);
+ return node;
+ });
+ });
+ });
+ }
+ function appendMenuLink(container, node, level) {
+ var link = jQuery(' ', {
+ 'type': 'button',
+ 'class': 'tradon-full-menu-link level-' + level,
+ 'title': node.label,
+ 'text': node.label
+ }).click(function() {
+ activateMenuRecord(node.record);
+ });
+ container.append(link);
+ }
+ function appendMenuBranch(container, node, level) {
+ appendMenuLink(container, node, level);
+ if (level >= 3) {
+ return;
+ }
+ node.children.slice(0, 4).forEach(function(child) {
+ appendMenuBranch(container, child, level + 1);
+ });
+ }
+ function renderMenuCard(grid, node, index) {
+ if (!node || !node.label) {
+ return;
+ }
+ var card = jQuery('', {
+ 'class': 'tradon-full-menu-card'
+ }).appendTo(grid);
+ var header = jQuery(' ', {
+ 'type': 'button',
+ 'class': 'tradon-full-menu-card-title',
+ 'title': node.label
+ }).click(function() {
+ activateMenuRecord(node.record);
+ }).appendTo(card);
+ if (node.icon) {
+ Sao.common.ICONFACTORY.get_icon_url(node.icon)
+ .then(function(url) {
+ jQuery('
', {
+ 'class': 'tradon-full-menu-icon',
+ 'src': url,
+ 'alt': ''
+ }).prependTo(header);
+ });
+ }
+ jQuery('', {'text': node.label}).appendTo(header);
+ var content = jQuery('', {
+ 'class': 'tradon-full-menu-card-content'
+ }).appendTo(card);
+ var children = node.children || [];
+ if (children.length > 5) {
+ var tabs = jQuery('', {
+ 'class': 'tradon-full-menu-tabs'
+ }).appendTo(content);
+ children.slice(0, 4).forEach(function(child, tabIndex) {
+ var tab = jQuery(' ', {
+ 'type': 'button',
+ 'class': 'tradon-full-menu-tab' +
+ (tabIndex ? '' : ' active'),
+ 'text': child.label,
+ 'title': child.label
+ }).appendTo(tabs);
+ tab.click(function() {
+ tabs.children().removeClass('active');
+ tab.addClass('active');
+ links.empty();
+ appendMenuBranch(links, child, 1);
+ });
+ });
+ var links = jQuery('', {
+ 'class': 'tradon-full-menu-links'
+ }).appendTo(content);
+ appendMenuBranch(links, children[0], 1);
+ } else {
+ var plainLinks = jQuery('', {
+ 'class': 'tradon-full-menu-links'
+ }).appendTo(content);
+ children.forEach(function(child) {
+ appendMenuBranch(plainLinks, child, 1);
+ });
+ }
+ }
+ function rebuildFullMenu() {
+ var screen = Sao.main_menu_screen;
+ var view = screen && screen.current_view;
+ var grid = jQuery('#tradon-full-menu .tradon-full-menu-grid');
+ var records = [];
+ if (view && view.rows && view.rows.length) {
+ records = view.rows.map(function(row) {
+ return row.record;
+ });
+ } else if (screen && screen.group && screen.group.length) {
+ records = screen.group.slice(0);
+ }
+ if (!view || !records.length) {
+ return jQuery.when(false);
+ }
+ grid.empty();
+ var waits = records.map(function(record) {
+ return buildMenuNode(record, view.children_field, 0);
+ });
+ return jQuery.when.apply(jQuery, waits).then(function() {
+ var nodes = Array.prototype.slice.call(arguments);
+ grid.empty();
+ nodes.forEach(function(node, index) {
+ renderMenuCard(grid, node, index);
+ });
+ return Boolean(grid.children().length);
+ });
+ }
+ function showFullMenuWhenReady(attempt) {
+ if (!enableFullMenu) {
+ setFullMenuVisible(false);
+ return;
+ }
+ attempt = attempt || 0;
+ rebuildFullMenu().then(
+ function(ready) {
+ if (ready) {
+ setFullMenuVisible(true);
+ } else if (attempt < 8) {
+ window.setTimeout(function() {
+ showFullMenuWhenReady(attempt + 1);
+ }, 120);
+ } else {
+ setFullMenuVisible(false);
+ }
+ },
+ function() {
+ setFullMenuVisible(false);
+ });
+ }
+ jQuery(document).on('tradon:main-menu-ready', function() {
+ if (!enableFullMenu) {
+ setFullMenuVisible(false);
+ return;
+ }
+ showFullMenuWhenReady(0);
+ });
+ jQuery('[data-toggle="offcanvas"]').click(function(event) {
+ if (enableFullMenu &&
+ jQuery(event.target).closest('#title-logo').length) {
+ if (jQuery('#main').hasClass(
+ 'tradon-full-menu-active')) {
+ setFullMenuVisible(false);
+ } else {
+ showFullMenuWhenReady(0);
+ }
+ return false;
+ }
+ setFullMenuVisible(false);
jQuery('.row-offcanvas').toggleClass('active');
notifyLayoutResize();
});
diff --git a/tradon_wbg.png b/tradon_wbg.png
new file mode 100644
index 0000000..d2a27e7
Binary files /dev/null and b/tradon_wbg.png differ
diff --git a/tryton-sao.css b/tryton-sao.css
index 5804f4e..505e35f 100644
--- a/tryton-sao.css
+++ b/tryton-sao.css
@@ -9558,6 +9558,20 @@ html.accesskey select[accesskey] ~ span[data-accesskey] {
position: sticky;
top: 0px;
z-index: 999;
+ overflow: visible;
+}
+.tab-form:has(> nav.toolbar .dropdown.navbar-left.open),
+.tab-board:has(> nav.toolbar .dropdown.navbar-left.open),
+#tabcontent:has(> .tab-pane.active > .panel > nav.toolbar .dropdown.navbar-left.open),
+#tabcontent > .tab-pane.active:has(> .panel > nav.toolbar .dropdown.navbar-left.open),
+#tabcontent > .tab-pane.active:has(> .panel > nav.toolbar .dropdown.navbar-left.open) > .panel {
+ overflow: visible;
+}
+.tab-form nav.toolbar .dropdown.navbar-left.open,
+.tab-board nav.toolbar .dropdown.navbar-left.open,
+.tab-form nav.toolbar .dropdown.navbar-left.open > .dropdown-menu,
+.tab-board nav.toolbar .dropdown.navbar-left.open > .dropdown-menu {
+ z-index: 2000;
}
.tab-form nav.toolbar .close,
.tab-board nav.toolbar .close {
@@ -9674,6 +9688,172 @@ img.icon {
[dir="rtl"] img.icon {
transform: scaleX(-1);
}
+:root {
+ --tradon-density-font-size: 14px;
+ --tradon-density-label-size: 14px;
+ --tradon-density-control-height: 36px;
+ --tradon-density-control-padding-y: 6px;
+ --tradon-density-control-padding-x: 12px;
+ --tradon-density-button-height: 36px;
+ --tradon-density-panel-gap: 14px;
+ --tradon-density-panel-padding: 15px;
+ --tradon-density-section-heading-padding-y: 10px;
+ --tradon-density-tab-padding-y: 9px;
+ --tradon-density-tab-padding-x: 14px;
+ --tradon-density-toolbar-height: 44px;
+ --tradon-density-ag-toolbar-height: 32px;
+ --tradon-density-ag-row-height: 38px;
+ --tradon-density-ag-header-height: 42px;
+ --tradon-density-ag-embedded-max-height: 300px;
+}
+html[data-density="compact"] {
+ --tradon-density-font-size: 11px;
+ --tradon-density-label-size: 11px;
+ --tradon-density-control-height: 24px;
+ --tradon-density-control-padding-y: 2px;
+ --tradon-density-control-padding-x: 6px;
+ --tradon-density-button-height: 25px;
+ --tradon-density-panel-gap: 5px;
+ --tradon-density-panel-padding: 6px;
+ --tradon-density-section-heading-padding-y: 4px;
+ --tradon-density-tab-padding-y: 4px;
+ --tradon-density-tab-padding-x: 7px;
+ --tradon-density-toolbar-height: 31px;
+ --tradon-density-ag-toolbar-height: 23px;
+ --tradon-density-ag-row-height: 25px;
+ --tradon-density-ag-header-height: 28px;
+ --tradon-density-ag-embedded-max-height: 198px;
+}
+html[data-density="compact"] body,
+html[data-density="compact"] .body {
+ font-size: var(--tradon-density-font-size);
+}
+html[data-density="compact"] .navbar {
+ min-height: 36px;
+}
+html[data-density="compact"] .navbar-brand {
+ height: 36px;
+ padding-top: 7px;
+ padding-bottom: 7px;
+ font-size: 16px;
+}
+html[data-density="compact"] .navbar-nav > li > a {
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+html[data-density="compact"] .navbar-form {
+ margin-top: 3px;
+ margin-bottom: 3px;
+}
+html[data-density="compact"] .navbar-btn {
+ margin-top: 3px;
+ margin-bottom: 3px;
+}
+html[data-density="compact"] #tablist > li {
+ min-width: 8em;
+}
+html[data-density="compact"] #tablist > li > a {
+ padding-top: 7px;
+ padding-bottom: 7px;
+}
+html[data-density="compact"] #menu,
+html[data-density="compact"] #tabs {
+ margin-top: 3px;
+}
+html[data-density="compact"] #tabcontent > .tab-pane > .panel {
+ margin-bottom: 3px;
+}
+html[data-density="compact"] #tabcontent > .tab-pane > .panel > .panel-body > div {
+ padding-left: 7px;
+ padding-right: 7px;
+}
+html[data-density="compact"] .panel {
+ margin-bottom: var(--tradon-density-panel-gap);
+}
+html[data-density="compact"] .panel-body {
+ padding: var(--tradon-density-panel-padding);
+}
+html[data-density="compact"] .panel-heading {
+ padding-top: var(--tradon-density-section-heading-padding-y);
+ padding-bottom: var(--tradon-density-section-heading-padding-y);
+}
+html[data-density="compact"] .screen-container .control-label,
+html[data-density="compact"] .screen-container label {
+ font-size: var(--tradon-density-label-size);
+}
+html[data-density="compact"] .screen-container input.form-control:not([type="checkbox"]):not([type="radio"]),
+html[data-density="compact"] .screen-container select.form-control,
+html[data-density="compact"] .screen-container textarea.form-control,
+html[data-density="compact"] .screen-container .input-group > .form-control {
+ min-height: var(--tradon-density-control-height);
+ height: var(--tradon-density-control-height);
+ padding: var(--tradon-density-control-padding-y) var(--tradon-density-control-padding-x);
+ font-size: var(--tradon-density-font-size);
+ line-height: 1.35;
+}
+html[data-density="compact"] .screen-container .input-group-btn > .btn,
+html[data-density="compact"] .screen-container .btn-group > .btn,
+html[data-density="compact"] .screen-container .filter-box .btn {
+ min-height: var(--tradon-density-button-height);
+ padding-top: var(--tradon-density-control-padding-y);
+ padding-bottom: var(--tradon-density-control-padding-y);
+ font-size: var(--tradon-density-font-size);
+}
+
+html[data-density="compact"] .screen-container .btn,
+html[data-density="compact"] .form .btn,
+html[data-density="compact"] .btn.btn-default,
+html[data-density="compact"] .btn.btn-primary {
+ min-height: var(--tradon-density-button-height);
+ padding: var(--tradon-density-control-padding-y) var(--tradon-density-control-padding-x);
+ border-radius: 6px;
+ font-size: var(--tradon-density-font-size);
+ line-height: 1.25;
+}
+
+html[data-density="compact"] .screen-container .btn-lg,
+html[data-density="compact"] .form .btn-lg {
+ min-height: 32px;
+ padding: 4px 10px;
+ font-size: 12px;
+}
+
+html[data-density="compact"] .form-link.btn.btn-link > img.icon {
+ width: 30px !important;
+ height: 30px !important;
+}
+
+html[data-density="compact"] .form-link.btn.btn-link svg {
+ width: 30px !important;
+ height: 30px !important;
+}
+
+html[data-density="compact"] .form-link.btn.btn-link {
+ padding: 4px 8px;
+ font-size: 12px;
+ line-height: 1.2;
+}
+html[data-density="compact"] .screen-container .nav-tabs {
+ margin-bottom: 8px;
+}
+html[data-density="compact"] .screen-container .nav-tabs > li > a,
+html[data-density="compact"] .screen-container .nav-tabs > li > a:focus {
+ margin-right: 6px;
+ padding: var(--tradon-density-tab-padding-y) var(--tradon-density-tab-padding-x);
+}
+html[data-density="compact"] .form .form-one2many-menu .form-one2many-string,
+html[data-density="compact"] .form .form-many2many-menu .form-one2many-string,
+html[data-density="compact"] .form .form-one2many-menu .form-many2many-string,
+html[data-density="compact"] .form .form-many2many-menu .form-many2many-string {
+ margin: 3px 5px;
+}
+html[data-density="compact"] .form .form-one2many-content .treeview,
+html[data-density="compact"] .form .form-many2many-content .treeview,
+html[data-density="compact"] .form .form-one2many-content .list-form,
+html[data-density="compact"] .form .form-many2many-content .list-form {
+ min-height: 120px;
+ max-height: 240px;
+}
.screen-container {
display: flex;
flex-direction: column;
@@ -10021,6 +10201,23 @@ img.icon {
box-shadow: none !important;
background: transparent !important; /* optionnel : si tu veux aussi supprimer le fond */
}
+
+html[data-theme-mode="dark"] .form-htmlviewer.htmlviewer-theme-dark,
+html[data-theme-mode="dark"] .htmlviewer-content.htmlviewer-react-dashboard {
+ background: #07100e !important;
+ color: var(--tradon-dark-text, #eaf7f4) !important;
+}
+
+html[data-theme-mode="dark"] .htmlviewer-content.htmlviewer-react-dashboard {
+ border: 1px solid rgba(118, 173, 165, 0.18) !important;
+ border-radius: 6px;
+ padding: 0;
+}
+
+html[data-theme-mode="dark"] .htmlviewer-content.htmlviewer-react-dashboard iframe {
+ background: #07100e !important;
+ display: block;
+}
.form .form-container,
.form .form-hcontainer,
.form .form-vcontainer {
@@ -10365,12 +10562,15 @@ img.icon {
top: 12px;
}
html[data-theme-mode="dark"] .form fieldset.form-panel {
- background: #16201f;
- border-color: #263937;
- box-shadow: none;
+ background: #172724;
+ border-color: #3a5954;
+ box-shadow:
+ inset 0 0 0 1px rgba(87, 193, 185, 0.14),
+ 0 4px 12px rgba(0, 0, 0, 0.16);
}
html[data-theme-mode="dark"] .form fieldset.form-panel > legend {
- border-bottom-color: #263937;
+ background: #172724;
+ border-bottom-color: #3a5954;
color: #8dd7d2;
}
html[data-theme-mode="dark"] .form fieldset.form-panel .form-label {
@@ -10379,6 +10579,17 @@ html[data-theme-mode="dark"] .form fieldset.form-panel .form-label {
html[data-theme-mode="dark"] .form fieldset.form-panel-sidebar .form-label {
color: #8dd7d2;
}
+
+html[data-theme-mode="dark"] .form fieldset.form-panel > legend .form-panel-icon,
+html[data-theme-mode="dark"] .form fieldset.form-panel > legend .form-panel-icon img,
+html[data-theme-mode="dark"] .form fieldset.form-panel > legend .form-panel-icon svg,
+html[data-theme-mode="dark"] .screen-container .icon-input img,
+html[data-theme-mode="dark"] .screen-container .icon-input svg {
+ color: #a9e3dd !important;
+ fill: #a9e3dd !important;
+ stroke: #a9e3dd !important;
+ filter: brightness(0) saturate(100%) invert(88%) sepia(13%) saturate(525%) hue-rotate(125deg) brightness(97%) contrast(88%) !important;
+}
@media screen and (max-width: 767px) {
.form fieldset.form-panel-sticky {
position: static;
@@ -10563,6 +10774,139 @@ input.column-boolean {
.progress {
margin-bottom: 0px;
}
+.form-rich-graph {
+ min-width: 280px;
+ color: #324b4d;
+}
+.form-rich-graph-header {
+ display: flex;
+ align-items: baseline;
+ justify-content: space-between;
+ gap: 12px;
+ margin-bottom: 8px;
+}
+.form-rich-graph-title {
+ min-width: 0;
+ overflow: hidden;
+ font-size: 14px;
+ font-weight: 600;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.form-rich-graph-meta {
+ flex: none;
+ color: #728180;
+ font-size: 12px;
+}
+.form-rich-graph-ranges {
+ display: inline-flex;
+ align-items: center;
+ gap: 4px;
+ margin-left: auto;
+}
+.form-rich-graph-range {
+ min-height: 22px;
+ padding: 2px 7px;
+ border: 1px solid #dbe7e3;
+ border-radius: 5px;
+ background: #ffffff;
+ color: #526261;
+ font-size: 11px;
+ font-weight: 700;
+ line-height: 1.2;
+}
+.form-rich-graph-range.active {
+ border-color: #2b8c87;
+ background: #e7f4f1;
+ color: #145d59;
+}
+.form-rich-graph-stage {
+ position: relative;
+ min-height: 220px;
+ overflow: hidden;
+ border: 1px solid #dbe7e3;
+ border-radius: 6px;
+ background: #fbfdfc;
+}
+.form-rich-graph-svg {
+ display: block;
+ width: 100%;
+ height: 100%;
+}
+.form-rich-graph-grid-line {
+ stroke: #e4ece9;
+ stroke-width: 1;
+}
+.form-rich-graph-axis-label,
+.form-rich-graph-x-label {
+ fill: #70807f;
+ font-size: 11px;
+}
+.form-rich-graph-axis-label {
+ text-anchor: end;
+}
+.form-rich-graph-x-label {
+ text-anchor: middle;
+}
+.form-rich-graph-line {
+ fill: none;
+ stroke-width: 2;
+ stroke-linecap: round;
+ stroke-linejoin: round;
+}
+.form-rich-graph-point {
+ cursor: default;
+ stroke: #ffffff;
+ stroke-width: 1.5;
+}
+.form-rich-graph-hit,
+.form-rich-graph-legend-svg-item {
+ cursor: pointer;
+}
+.form-rich-graph-legend-svg-item text {
+ font-size: 12px;
+ font-weight: 700;
+ dominant-baseline: middle;
+}
+.form-rich-graph-tooltip {
+ position: absolute;
+ z-index: 2;
+ max-width: 220px;
+ padding: 7px 9px;
+ border: 1px solid rgba(53, 81, 84, 0.16);
+ border-radius: 6px;
+ background: rgba(255, 255, 255, 0.96);
+ box-shadow: 0 8px 20px rgba(53, 81, 84, 0.14);
+ color: #243b3d;
+ font-size: 12px;
+ line-height: 1.35;
+ pointer-events: none;
+}
+.form-rich-graph-legend {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px 14px;
+ margin-top: 8px;
+}
+.form-rich-graph-legend-item {
+ display: inline-flex;
+ align-items: center;
+ gap: 5px;
+ min-width: 0;
+ margin: 0;
+ color: #526261;
+ font-size: 12px;
+ font-weight: 500;
+ cursor: pointer;
+}
+.form-rich-graph-legend-item input {
+ margin: 0;
+}
+.form-rich-graph-legend-swatch {
+ width: 18px;
+ height: 3px;
+ border-radius: 3px;
+}
.form-tolerance-gauge {
--tolerance-gauge-value: 50%;
--tolerance-gauge-center: 50%;
@@ -11079,6 +11423,19 @@ body {
filter: none !important;
}
+html[data-theme-mode="dark"] .form-link.btn.btn-link,
+html[data-theme-mode="dark"] .form-link.btn.btn-link .icon,
+html[data-theme-mode="dark"] .form-link.btn.btn-link svg {
+ color: #a9e3dd !important;
+ fill: #a9e3dd !important;
+ stroke: #a9e3dd !important;
+}
+
+html[data-theme-mode="dark"] .form-link.btn.btn-link > img.icon,
+html[data-theme-mode="dark"] .form-link.btn.btn-link img.icon {
+ filter: brightness(0) saturate(100%) invert(88%) sepia(13%) saturate(525%) hue-rotate(125deg) brightness(97%) contrast(88%) !important;
+}
+
.btn-modern {
background-color: #FFFFFF; /* Bleu moderne */
color: black;
@@ -11288,6 +11645,839 @@ html[theme="default"] .screen-container .nav-tabs > li.active > a:hover {
box-shadow: none;
}
+html[theme="default"] .screen-container .form fieldset.form-panel-summary {
+ background: #ffffff;
+ border-color: #d8e6e1;
+ box-shadow: inset 0 0 0 1px #d8e6e1, 0 3px 10px rgba(30, 55, 58, 0.055);
+ color: #24484d;
+}
+
+html[theme="default"] .screen-container .form fieldset.form-panel-summary .form-label {
+ color: #526967;
+}
+
+html[theme="default"] .screen-container .form fieldset.form-panel-summary .form-widget,
+html[theme="default"] .screen-container .form fieldset.form-panel-summary .form-widget span,
+html[theme="default"] .screen-container .form fieldset.form-panel-summary .form-widget div {
+ color: #173b40;
+}
+
+html[theme="default"] .screen-container .form fieldset.form-panel-summary .progress {
+ background: #dce9e5;
+ border: 1px solid #c6d9d3;
+ border-radius: 4px;
+}
+
+html[theme="default"] .screen-container .form fieldset.form-panel-summary .progress-bar {
+ background: #2b8c87;
+ color: #ffffff;
+}
+
+html[theme="default"] .screen-container .d3-execution-summary-container {
+ color: #173b40;
+}
+
+html[data-density="compact"][theme="default"] #tabs,
+html[data-density="compact"][theme="default"] .main-offcanvas {
+ overflow-y: auto !important;
+ height: 100% !important;
+}
+
+html[data-density="compact"][theme="default"] #tablist {
+ align-items: center;
+ height: 40px;
+ min-height: 40px;
+ overflow-y: hidden;
+}
+
+html[data-density="compact"][theme="default"] .content-box:not(.ag-grid-content-box) {
+ overflow-y: visible;
+}
+
+html[data-density="compact"][theme="default"] .screen-container > .filter-box,
+html[data-density="compact"][theme="default"] .screen-container .content-box > .form,
+html[data-density="compact"][theme="default"] .screen-container .content-box > form {
+ border-radius: 8px;
+ padding: 4px 7px;
+}
+
+html[data-density="compact"][theme="default"] .screen-container > .filter-box {
+ padding-top: 3px;
+ padding-bottom: 3px;
+}
+
+html[data-density="compact"][theme="default"] .screen-container > .filter-box > .form,
+html[data-density="compact"][theme="default"] .screen-container > .filter-box > form {
+ height: auto;
+ width: 100%;
+}
+
+html[data-density="compact"][theme="default"] .form .tab-pane:has(> .form-container > .form-item > fieldset.form-panel) {
+ border-radius: 8px;
+ padding: 4px;
+}
+
+html[data-density="compact"][theme="default"] .form .tab-pane:has(> .form-container > .form-item > fieldset.form-panel)
+ > .form-container {
+ gap: 2px 14px;
+}
+
+html[data-density="compact"][theme="default"] .form fieldset.form-panel {
+ margin-bottom: 5px;
+ padding: 25px 7px 6px;
+ border-radius: 7px;
+}
+
+html[data-density="compact"][theme="default"] .form fieldset.form-panel-summary {
+ padding: 7px 10px;
+}
+
+html[data-density="compact"][theme="default"] .form fieldset.form-panel-summary > .form-container,
+html[data-density="compact"][theme="default"] .form .form-panel-summary-grid {
+ align-content: center;
+ align-items: center;
+}
+
+html[data-density="compact"][theme="default"] .form fieldset.form-panel-summary .form-item,
+html[data-density="compact"][theme="default"] .form fieldset.form-panel-summary .form-label,
+html[data-density="compact"][theme="default"] .form fieldset.form-panel-summary .form-widget {
+ align-items: center;
+ align-self: center;
+}
+
+html[data-density="compact"][theme="default"] .form fieldset.form-panel > legend {
+ margin-bottom: 5px;
+ padding-bottom: 3px;
+ top: 6px;
+ left: 7px;
+ right: 7px;
+ height: 16px;
+ font-size: 11.5px;
+}
+
+html[data-density="compact"][theme="default"] .form fieldset.form-panel .form-item {
+ gap: 5px;
+ min-height: 25px;
+ min-width: 0;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+
+html[data-density="compact"][theme="default"] .form fieldset.form-panel .form-label {
+ flex: 0 0 auto;
+ margin-right: 3px;
+ max-width: 18ch;
+}
+
+html[data-density="compact"][theme="default"] .form fieldset.form-panel .input-group,
+html[data-density="compact"][theme="default"] .form fieldset.form-panel .selection,
+html[data-density="compact"][theme="default"] .form fieldset.form-panel .form-widget {
+ flex: 1 1 auto;
+ min-width: 0;
+ max-width: 100%;
+}
+
+html[data-density="compact"][theme="default"] .form fieldset.form-panel input.form-control,
+html[data-density="compact"][theme="default"] .form fieldset.form-panel select.form-control {
+ min-width: 6ch;
+}
+
+html[data-density="compact"][theme="default"] .form fieldset.form-panel .form-many2one input,
+html[data-density="compact"][theme="default"] .form fieldset.form-panel .form-one2one input,
+html[data-density="compact"][theme="default"] .form fieldset.form-panel .form-reference input {
+ min-width: 8ch;
+}
+
+html[data-density="compact"][theme="default"] .form fieldset.form-panel .form-integer input,
+html[data-density="compact"][theme="default"] .form fieldset.form-panel .form-float input {
+ min-width: 5ch;
+}
+
+html[data-density="compact"][theme="default"] .screen-container > .filter-box .form-container {
+ align-items: center;
+}
+
+html[data-density="compact"][theme="default"] .screen-container > .filter-box .form-item {
+ align-items: center;
+}
+
+html[data-density="compact"][theme="default"] .screen-container .form-group {
+ margin-bottom: 5px;
+}
+
+html[data-density="compact"][theme="default"] .screen-container .control-label,
+html[data-density="compact"][theme="default"] .screen-container label {
+ font-size: var(--tradon-density-label-size);
+ line-height: 1.25;
+}
+
+html[data-density="compact"][theme="default"] .screen-container input.form-control:not([type="checkbox"]):not([type="radio"]),
+html[data-density="compact"][theme="default"] .screen-container select.form-control,
+html[data-density="compact"][theme="default"] .screen-container textarea.form-control,
+html[data-density="compact"][theme="default"] .screen-container .input-group > .form-control,
+html[data-density="compact"][theme="default"] .screen-container input[type="text"]:not(.ag-grid-tree-panel-checkbox),
+html[data-density="compact"][theme="default"] .screen-container input[type="date"]:not(.ag-grid-tree-panel-checkbox),
+html[data-density="compact"][theme="default"] .screen-container input[type="datetime-local"]:not(.ag-grid-tree-panel-checkbox),
+html[data-density="compact"][theme="default"] .screen-container input[type="number"]:not(.ag-grid-tree-panel-checkbox),
+html[data-density="compact"][theme="default"] .screen-container input[type="search"]:not(.ag-grid-tree-panel-checkbox) {
+ height: var(--tradon-density-control-height);
+ min-height: var(--tradon-density-control-height);
+ padding: var(--tradon-density-control-padding-y) var(--tradon-density-control-padding-x);
+ font-size: var(--tradon-density-font-size);
+}
+
+html[data-density="compact"][theme="default"] .screen-container .input-group-btn > .btn,
+html[data-density="compact"][theme="default"] .screen-container .btn-group > .btn,
+html[data-density="compact"][theme="default"] .screen-container .filter-box .btn {
+ min-height: var(--tradon-density-button-height);
+ padding: var(--tradon-density-control-padding-y) var(--tradon-density-control-padding-x);
+ border-radius: 6px;
+ font-size: var(--tradon-density-font-size);
+}
+
+html[data-density="compact"][theme="default"] .screen-container .nav-tabs {
+ margin-bottom: 6px;
+}
+
+html[data-density="compact"][theme="default"] .screen-container .nav-tabs > li > a,
+html[data-density="compact"][theme="default"] .screen-container .nav-tabs > li > a:focus {
+ margin-right: 5px;
+ padding: var(--tradon-density-tab-padding-y) var(--tradon-density-tab-padding-x);
+ border-radius: 7px 7px 0 0;
+}
+
+html[data-density="compact"][theme="default"] .tab-form nav.toolbar,
+html[data-density="compact"][theme="default"] .tab-board nav.toolbar,
+html[data-density="compact"][theme="default"] .tab-form nav.toolbar.panel-heading,
+html[data-density="compact"][theme="default"] .tab-board nav.toolbar.panel-heading {
+ height: 36px;
+ min-height: 36px;
+ padding-top: 0;
+ padding-bottom: 0;
+ overflow: visible;
+}
+
+html[data-density="compact"][theme="default"] .tab-form nav.toolbar .container-fluid,
+html[data-density="compact"][theme="default"] .tab-board nav.toolbar .container-fluid {
+ height: 36px;
+ min-height: 36px;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+html[data-density="compact"][theme="default"] .tab-form nav.toolbar .navbar-brand,
+html[data-density="compact"][theme="default"] .tab-board nav.toolbar .navbar-brand {
+ height: 36px;
+ padding-top: 7px;
+ padding-bottom: 7px;
+ line-height: 18px;
+}
+
+html[data-density="compact"][theme="default"] .tab-form nav.toolbar .navbar-btn,
+html[data-density="compact"][theme="default"] .tab-board nav.toolbar .navbar-btn,
+html[data-density="compact"][theme="default"] .tab-form nav.toolbar .btn.btn-default,
+html[data-density="compact"][theme="default"] .tab-board nav.toolbar .btn.btn-default {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ height: 29px;
+ min-height: 29px;
+ margin-top: 3px;
+ margin-bottom: 3px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+
+html[data-density="compact"][theme="default"] .tab-form nav.toolbar .navbar-text,
+html[data-density="compact"][theme="default"] .tab-board nav.toolbar .navbar-text {
+ margin-top: 6px;
+ margin-bottom: 6px;
+ line-height: 22px;
+}
+
+html[data-density="compact"][theme="default"] .form .form-one2many-menu,
+html[data-density="compact"][theme="default"] .form .form-many2many-menu {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ height: 31px;
+ min-height: 31px;
+ padding: 2px 7px;
+ overflow: visible;
+ box-sizing: border-box;
+}
+
+html[data-density="compact"][theme="default"] .form .form-one2many-menu .form-one2many-string,
+html[data-density="compact"][theme="default"] .form .form-many2many-menu .form-one2many-string,
+html[data-density="compact"][theme="default"] .form .form-one2many-menu .form-many2many-string,
+html[data-density="compact"][theme="default"] .form .form-many2many-menu .form-many2many-string {
+ margin: 1px 0;
+ line-height: 25px;
+}
+
+html[data-density="compact"][theme="default"] .form .form-one2many-menu .form-one2many-toolbar,
+html[data-density="compact"][theme="default"] .form .form-many2many-menu .form-one2many-toolbar,
+html[data-density="compact"][theme="default"] .form .form-one2many-menu .form-many2many-toolbar,
+html[data-density="compact"][theme="default"] .form .form-many2many-menu .form-many2many-toolbar {
+ display: inline-flex;
+ align-items: center;
+ flex: 1 1 auto;
+ justify-content: flex-end;
+ min-width: 0;
+ max-width: 100%;
+ min-height: 25px;
+ float: none;
+}
+
+html[data-density="compact"][theme="default"] .form .form-one2many-menu .form-one2many-toolbar > .input-group,
+html[data-density="compact"][theme="default"] .form .form-many2many-menu .form-many2many-toolbar > .input-group {
+ display: flex;
+ align-items: center;
+ flex: 1 1 auto;
+ min-width: 0;
+ max-width: 100%;
+ width: min(100%, 420px);
+}
+
+html[data-density="compact"][theme="default"] .form .form-one2many-menu .form-one2many-toolbar > .input-group > .form-control,
+html[data-density="compact"][theme="default"] .form .form-many2many-menu .form-many2many-toolbar > .input-group > .form-control {
+ flex: 1 1 0;
+ min-width: 0;
+ width: auto;
+}
+
+html[data-density="compact"][theme="default"] .form .form-one2many-menu .form-one2many-toolbar > .input-group > .input-group-btn,
+html[data-density="compact"][theme="default"] .form .form-many2many-menu .form-many2many-toolbar > .input-group > .input-group-btn {
+ display: inline-flex;
+ flex: 0 0 auto;
+ width: auto;
+ white-space: nowrap;
+}
+
+html[data-density="compact"][theme="default"] .form .form-one2many-menu .form-one2many-toolbar .btn,
+html[data-density="compact"][theme="default"] .form .form-many2many-menu .form-one2many-toolbar .btn,
+html[data-density="compact"][theme="default"] .form .form-one2many-menu .form-many2many-toolbar .btn,
+html[data-density="compact"][theme="default"] .form .form-many2many-menu .form-many2many-toolbar .btn {
+ height: 25px;
+ min-height: 25px;
+ margin-top: 0;
+ margin-bottom: 0;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+
+html[data-density="compact"] .navbar.navbar-inverse {
+ min-height: 40px;
+}
+
+html[data-density="compact"] .navbar > .container-fluid,
+html[data-density="compact"] .navbar-header,
+html[data-density="compact"] #main_navbar {
+ min-height: 40px;
+}
+
+html[data-density="compact"] .navbar-header {
+ display: flex;
+ align-items: center;
+}
+
+html[data-density="compact"] .navbar-brand {
+ display: inline-flex !important;
+ align-items: center;
+ gap: 8px;
+ height: 40px;
+ padding: 0 10px;
+ line-height: 40px;
+}
+
+html[data-density="compact"] .navbar-brand .icon,
+html[data-density="compact"] .navbar .icon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+}
+
+html[data-density="compact"] .navbar-brand .icon svg {
+ width: 20px;
+ height: 20px;
+}
+
+html[data-density="compact"] #title-logo {
+ height: 22px !important;
+ margin-left: 0 !important;
+}
+
+html[data-density="compact"] .theme-mode-toggle {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 32px;
+ min-width: 32px;
+ height: 32px;
+ min-height: 32px;
+ margin: 4px 0 4px 8px;
+ padding: 0;
+}
+
+html[data-density="compact"] .theme-mode-toggle-icon,
+html[data-density="compact"] .theme-mode-toggle-icon svg {
+ width: 15px;
+ height: 15px;
+}
+
+html[data-density="compact"] #global-search {
+ display: flex;
+ align-items: center;
+ height: 40px;
+}
+
+html[data-density="compact"] #global-search .global-search-container,
+html[data-density="compact"] #global-search .global-search-container > .input-group,
+html[data-density="compact"] #global-search .global-search-container > .dropdown {
+ display: flex;
+ align-items: center;
+ height: 32px;
+}
+
+html[data-density="compact"] #global-search .global-search-container > .input-group {
+ overflow: visible;
+ border: 1px solid #d6e4df;
+ border-radius: 6px;
+ background: #fff;
+ box-shadow: 0 2px 5px rgba(53, 81, 84, 0.08);
+}
+
+html[data-density="compact"] #global-search .global-search-container > .input-group:focus-within {
+ border-color: #0c6472;
+ box-shadow: 0 0 0 1px #0c6472, 0 2px 5px rgba(53, 81, 84, 0.08);
+}
+
+html[data-density="compact"] #global-search-entry,
+html[data-density="compact"] #global-search .form-control,
+html[data-density="compact"] #global-search .input-group-btn > .btn {
+ height: 32px;
+ min-height: 32px;
+ padding-top: 0;
+ padding-bottom: 0;
+ font-size: 12px;
+ line-height: 32px;
+}
+
+html[data-density="compact"] #global-search-entry,
+html[data-density="compact"] #global-search-entry:focus,
+html[data-density="compact"] #global-search .input-group-btn > .btn,
+html[data-density="compact"] #global-search .input-group-btn > .btn:focus {
+ border: 0;
+ box-shadow: none;
+}
+
+html[data-density="compact"] #global-search .input-group-btn > .btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 32px;
+ padding-left: 7px;
+ padding-right: 7px;
+}
+
+html[data-density="compact"] #user-favorites {
+ position: relative;
+}
+
+html[data-density="compact"] #user-favorites > .dropdown-menu {
+ z-index: 1100;
+ margin-top: 3px;
+ font-size: 12px;
+ line-height: 1.2;
+}
+
+html[data-density="compact"] #user-favorites > .dropdown-menu > li > a {
+ display: flex;
+ align-items: center;
+ min-height: 26px;
+ padding: 3px 10px;
+ font-size: 12px;
+ line-height: 1.2;
+}
+
+html[data-density="compact"] #global-search .input-group-btn img.icon,
+html[data-density="compact"] #global-search .input-group-btn .icon {
+ width: 18px;
+ height: 18px;
+}
+
+html[data-density="compact"] .global-search-container > .dropdown-menu {
+ font-size: 12px;
+ line-height: 1.2;
+}
+
+html[data-density="compact"] .global-search-container > .dropdown-menu > li > a {
+ display: flex;
+ align-items: center;
+ min-height: 26px;
+ padding: 3px 10px;
+ font-size: 12px;
+ line-height: 1.2;
+}
+
+html[data-density="compact"] .global-search-container .global_search-icon,
+html[data-density="compact"] .global-search-container .global-search-icon {
+ flex: 0 0 auto;
+ width: 18px;
+ height: 18px;
+ margin-right: 5px;
+}
+
+html[data-density="compact"] .global-search-container .global-search-text {
+ display: inline-flex;
+ align-items: center;
+ min-width: 0;
+ line-height: 1.2;
+}
+
+html[data-density="compact"] .navbar-nav > li > a {
+ display: flex;
+ align-items: center;
+ min-height: 40px;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+html[data-density="compact"] #tablist > li {
+ display: flex;
+ align-items: center;
+ height: 40px;
+}
+
+html[data-density="compact"] #tablist > li > a {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ height: 32px;
+ min-height: 32px;
+ max-height: 32px;
+ padding: 0 10px;
+ font-size: 12px;
+ line-height: 1.15;
+}
+
+html[data-density="compact"] #tablist > li > a > span {
+ display: inline-flex;
+ align-items: center;
+ min-width: 0;
+ line-height: 1.15;
+ margin-right: 8px;
+}
+
+html[data-density="compact"] #tablist img.icon,
+html[data-density="compact"] #tablist .icon {
+ flex: 0 0 auto;
+ width: 18px;
+ height: 18px;
+}
+
+html[data-density="compact"] #tablist .close {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ align-self: center;
+ width: 18px;
+ height: 18px;
+ margin-top: 0;
+ font-size: 20px;
+ line-height: 18px;
+}
+
+html[data-density="compact"] #menu {
+ font-size: 12px;
+}
+
+html[data-density="compact"] #menu .treeview,
+html[data-density="compact"] #menu .treeview td,
+html[data-density="compact"] #menu .treeview a,
+html[data-density="compact"] #menu .nav > li > a {
+ font-size: 12px;
+ line-height: 1.25;
+}
+
+html[data-density="compact"] #menu .treeview td,
+html[data-density="compact"] #menu .nav > li > a {
+ padding-top: 3px;
+ padding-bottom: 3px;
+}
+
+html[data-density="compact"] .screen-container > .filter-box .form-container {
+ align-content: center;
+ align-items: center;
+ height: auto !important;
+ min-height: var(--tradon-density-control-height);
+ row-gap: 0;
+}
+
+html[data-density="compact"] .screen-container > .filter-box .form-item,
+html[data-density="compact"] .screen-container > .filter-box .form-label,
+html[data-density="compact"] .screen-container > .filter-box .input-group,
+html[data-density="compact"] .screen-container > .filter-box .form-widget {
+ align-items: center;
+ align-self: center;
+}
+
+html[data-density="compact"] .screen-container > .filter-box .form-item {
+ display: flex;
+ min-height: var(--tradon-density-control-height);
+ height: var(--tradon-density-control-height);
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+html[data-density="compact"] .screen-container > .filter-box .form-label {
+ display: inline-flex;
+ align-items: center;
+ height: var(--tradon-density-control-height);
+ line-height: 1;
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+html[data-density="compact"] .screen-container > .filter-box .input-group,
+html[data-density="compact"] .screen-container > .filter-box .form-widget,
+html[data-density="compact"] .screen-container > .filter-box .form-control {
+ height: var(--tradon-density-control-height);
+ min-height: var(--tradon-density-control-height);
+}
+
+html[data-density="compact"] .screen-container > .filter-box > .row {
+ display: flex;
+ align-items: center;
+ gap: 5px;
+ min-height: 28px;
+ margin-left: 0;
+ margin-right: 0;
+}
+
+html[data-density="compact"] .screen-container > .filter-box > .row > .col-sm-10 {
+ flex: 1 1 auto;
+ min-width: 0;
+ width: auto;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+html[data-density="compact"] .screen-container > .filter-box > .row > .col-sm-2 {
+ flex: 0 0 auto;
+ width: auto;
+ min-width: 0;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+html[data-density="compact"] .screen-container > .filter-box > .row > .pull-right {
+ float: none !important;
+}
+
+html[data-density="compact"] .screen-container > .filter-box > .row .input-group.input-group-sm {
+ display: flex;
+ align-items: stretch;
+ width: 100%;
+ height: 28px;
+ min-height: 28px;
+}
+
+html[data-density="compact"] .screen-container > .filter-box > .row .input-group.input-group-sm > .form-control {
+ height: 28px;
+ min-height: 28px;
+}
+
+html[data-density="compact"] .screen-container > .filter-box > .row .input-group.input-group-sm > .input-group-btn,
+html[data-density="compact"] .screen-container > .filter-box > .row .input-group.input-group-sm > .input-group-btn > .btn,
+html[data-density="compact"] .screen-container > .filter-box > .row > .col-sm-2 > .btn-group,
+html[data-density="compact"] .screen-container > .filter-box > .row > .col-sm-2 > .btn-group > .btn {
+ height: 28px;
+ min-height: 28px;
+}
+
+html[data-density="compact"] .screen-container > .filter-box > .row .input-group.input-group-sm > .input-group-btn {
+ display: inline-flex;
+ flex: 0 0 auto;
+ align-items: stretch;
+ width: auto;
+ white-space: nowrap;
+}
+
+html[data-density="compact"] .screen-container > .filter-box > .row .input-group.input-group-sm > .input-group-btn > .btn,
+html[data-density="compact"] .screen-container > .filter-box > .row > .col-sm-2 > .btn-group > .btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+html[data-density="compact"] .screen-container > .filter-box > .row .input-group.input-group-sm > .input-group-btn:first-child > .btn {
+ min-width: 64px;
+ justify-content: flex-start;
+ padding-left: 8px;
+ padding-right: 8px;
+ overflow: visible;
+ text-overflow: clip;
+}
+
+html[data-density="compact"] .screen-container > .filter-box .form-container:has(fieldset.form-panel) {
+ align-content: stretch;
+ align-items: stretch;
+ row-gap: 5px;
+}
+
+html[data-density="compact"] .screen-container > .filter-box .form-item:has(fieldset.form-panel) {
+ align-items: stretch;
+ align-self: stretch;
+ height: auto;
+ min-height: 0;
+}
+
+html[data-density="compact"] .screen-container > .filter-box .form-item:has(fieldset.form-panel) > .form-widget {
+ align-self: stretch;
+ height: auto;
+ min-height: 0;
+}
+
+html[data-density="compact"] .screen-container > .filter-box .form-item:not(:has(fieldset.form-panel)) {
+ align-items: center;
+}
+
+html[data-density="compact"] .screen-container > .filter-box .form-item:not(:has(fieldset.form-panel)) > .form-widget,
+html[data-density="compact"] .screen-container > .filter-box .form-item:not(:has(fieldset.form-panel)) > .form-label {
+ align-self: center;
+}
+
+html[data-density="compact"] .input-icon .icon-input,
+html[data-density="compact"] .input-sm .icon-input,
+html[data-density="compact"] .input-group-sm .icon-input {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: var(--tradon-density-control-height);
+ height: var(--tradon-density-control-height);
+ line-height: var(--tradon-density-control-height);
+ top: 0;
+}
+
+html[data-density="compact"] .input-icon .icon-input img,
+html[data-density="compact"] .input-icon .icon-input svg {
+ max-width: 14px;
+ max-height: 14px;
+}
+
+html[data-density="compact"][dir="ltr"] .input-icon-primary > .form-control,
+html[data-density="compact"][dir="ltr"] .input-sm.input-icon-primary > .form-control,
+html[data-density="compact"][dir="ltr"] .input-group-sm.input-icon-primary > .form-control {
+ padding-left: 25px;
+}
+
+html[data-density="compact"][dir="ltr"] .input-icon-secondary > .form-control,
+html[data-density="compact"][dir="ltr"] .input-sm.input-icon-secondary > .form-control,
+html[data-density="compact"][dir="ltr"] .input-group-sm.input-icon-secondary > .form-control {
+ padding-right: 25px;
+}
+
+html[data-density="compact"] .input-icon-primary > .form-control,
+html[data-density="compact"] .input-sm.input-icon-primary > .form-control,
+html[data-density="compact"] .input-group-sm.input-icon-primary > .form-control {
+ padding-left: 25px;
+}
+
+html[data-density="compact"] .input-icon-secondary > .form-control,
+html[data-density="compact"] .input-sm.input-icon-secondary > .form-control,
+html[data-density="compact"] .input-group-sm.input-icon-secondary > .form-control {
+ padding-right: 25px;
+}
+
+html[dir="rtl"][data-density="compact"] .input-icon-primary > .form-control,
+html[dir="rtl"][data-density="compact"] .input-sm.input-icon-primary > .form-control,
+html[dir="rtl"][data-density="compact"] .input-group-sm.input-icon-primary > .form-control {
+ padding-left: var(--tradon-density-control-padding-x);
+ padding-right: 25px;
+}
+
+html[dir="rtl"][data-density="compact"] .input-icon-secondary > .form-control,
+html[dir="rtl"][data-density="compact"] .input-sm.input-icon-secondary > .form-control,
+html[dir="rtl"][data-density="compact"] .input-group-sm.input-icon-secondary > .form-control {
+ padding-left: 25px;
+ padding-right: var(--tradon-density-control-padding-x);
+}
+
+html[data-density="compact"] .input-group,
+html[data-density="compact"] .form-many2one > .input-group,
+html[data-density="compact"] .form-one2one > .input-group,
+html[data-density="compact"] .form-reference > .input-group {
+ display: flex;
+ align-items: center;
+}
+
+html[data-density="compact"] .input-group > .form-control {
+ flex: 1 1 auto;
+}
+
+html[data-density="compact"] .input-group-addon,
+html[data-density="compact"] .input-group-btn > .btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ min-height: var(--tradon-density-control-height);
+ height: var(--tradon-density-control-height);
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+html[data-density="compact"] .form fieldset.form-panel,
+html[data-density="compact"][theme="default"] .form fieldset.form-panel {
+ overflow: visible !important;
+}
+
+html[data-density="compact"] .form fieldset.form-panel > .form-container {
+ overflow: visible;
+}
+
+html[data-density="compact"] .form fieldset.form-group_.form-panel {
+ overflow: visible !important;
+}
+
+html[data-density="compact"] .form fieldset.form-panel fieldset.form-group_,
+html[data-density="compact"][theme="default"] .form fieldset.form-panel fieldset.form-group_ {
+ overflow-x: visible !important;
+ overflow-y: visible !important;
+}
+
+.form .sao-completion-open,
+.form fieldset.form-panel.sao-completion-open,
+.form fieldset.form-group_.sao-completion-open {
+ position: relative;
+ z-index: 20000;
+ overflow: visible !important;
+}
+
+.form .dropdown.sao-completion-open > .dropdown-menu,
+.form .input-group.dropdown.sao-completion-open > .dropdown-menu {
+ z-index: 20001;
+ min-width: 100%;
+ max-width: min(420px, calc(100vw - 24px));
+ margin-top: 2px;
+ background: #ffffff;
+ border: 1px solid #bfd5cd;
+ border-radius: 6px;
+ box-shadow: 0 12px 28px rgba(32, 54, 56, 0.22);
+ font-size: 12px;
+ line-height: 1.25;
+ text-transform: none;
+}
+
+.form .dropdown.sao-completion-open > .dropdown-menu > li > a,
+.form .input-group.dropdown.sao-completion-open > .dropdown-menu > li > a {
+ padding: 5px 10px;
+ line-height: 1.25;
+ white-space: nowrap;
+}
+
.ag-grid-tree-container {
display: flex;
flex-direction: column;
@@ -12104,7 +13294,7 @@ html[theme="default"] .ag-grid-tree-grouping-panel input[type="checkbox"]:after
}
.ag-grid-summary-item-sum .ag-grid-summary-value {
- color: #111111;
+ color: #145369;
font-weight: 800;
}
@@ -12162,6 +13352,68 @@ html[theme="default"] .ag-grid-tree-grouping-panel input[type="checkbox"]:after
--ag-scrollbar-size: 18px;
}
+html[data-density="compact"] .ag-grid-tree-toolbar {
+ min-height: var(--tradon-density-ag-toolbar-height);
+ padding: 1px 0 2px;
+}
+
+html[data-density="compact"] .ag-grid-tree-columns > .btn,
+html[data-density="compact"] .ag-grid-tree-grouping > .btn,
+html[data-density="compact"] .ag-grid-tree-layouts > .btn,
+html[data-density="compact"] .ag-grid-value-filter-mode,
+html[data-density="compact"] .ag-grid-view-transfer-button,
+html[data-density="compact"] .ag-grid-screen-filter-toggle {
+ min-height: 22px;
+ padding: 2px 6px;
+ font-size: 10.5px;
+}
+
+html[data-density="compact"] .ag-grid-tree-columns-label,
+html[data-density="compact"] .ag-grid-tree-grouping-label,
+html[data-density="compact"] .ag-grid-tree-layouts-label,
+html[data-density="compact"] .ag-grid-value-filter-mode-label {
+ font-size: 10.5px;
+}
+
+html[data-density="compact"] .ag-grid-tree-summary {
+ min-height: 44px;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+html[data-density="compact"] .ag-grid-summary-item {
+ min-height: 44px;
+ padding: 6px 14px;
+}
+
+html[data-density="compact"] .ag-grid-summary-value {
+ font-size: 16px;
+}
+
+html[data-density="compact"] .ag-grid-tree-host {
+ min-height: 270px;
+ height: 270px !important;
+ --ag-row-height: var(--tradon-density-ag-row-height);
+ --ag-header-height: var(--tradon-density-ag-header-height);
+ --ag-list-item-height: 28px;
+}
+
+html[data-density="compact"] .ag-grid-tree-embedded-one2many .ag-grid-tree-host {
+ min-height: 162px;
+ height: var(--tradon-density-ag-embedded-max-height) !important;
+}
+
+html[data-density="compact"] .ag-grid-tree-host .ag-header-cell:not([col-id="__selection__"]),
+html[data-density="compact"] .ag-grid-tree-host .ag-cell:not([col-id="__selection__"]) {
+ padding-left: 6px;
+ padding-right: 8px;
+}
+
+html[data-density="compact"] .ag-grid-tree-host .ag-cell,
+html[data-density="compact"] .ag-grid-tree-host .ag-header-cell-text {
+ font-size: 11px;
+}
+
.ag-grid-tree-host .ag-body-horizontal-scroll,
.ag-grid-tree-host .ag-body-horizontal-scroll-viewport,
.ag-grid-tree-host .ag-body-horizontal-scroll-container {
@@ -12358,18 +13610,32 @@ html[theme="default"] .ag-grid-tree-grouping-panel input[type="checkbox"]:after
padding-left: 0;
}
+.ag-grid-tree-host .ag-header-cell[col-id="__selection__"],
+.ag-grid-tree-host .ag-cell[col-id="__selection__"] {
+ overflow: visible;
+ padding-left: 6px;
+ padding-right: 6px;
+}
+
.ag-grid-tree-host .ag-selection-checkbox,
.ag-grid-tree-host .ag-header-select-all {
display: flex;
justify-content: center;
align-items: center;
+ min-width: 18px;
+ min-height: 18px;
+ overflow: visible;
}
html[theme="default"] .ag-grid-tree-host input[type="checkbox"] {
-webkit-appearance: auto;
appearance: auto;
position: static;
- width: auto;
+ width: 16px;
+ min-width: 16px;
+ height: 16px;
+ min-height: 16px;
+ margin: 0;
accent-color: #2b8c87;
}
@@ -13041,19 +14307,24 @@ html[data-theme-mode="dark"] .tab-form,
html[data-theme-mode="dark"] .tab-board,
html[data-theme-mode="dark"] #tabcontent > .tab-pane > .panel,
html[data-theme-mode="dark"] #tabcontent > .tab-pane > .panel > .panel-body {
- background: #101817;
+ background: #0b1312;
color: #dce7e2;
}
html[data-theme-mode="dark"] #tabcontent > .tab-pane > .panel {
- border-color: #1f2d2c;
- box-shadow: none;
+ background: #101a18;
+ border-color: #263c38;
+ box-shadow: inset 0 1px 0 rgba(143, 225, 216, 0.05);
+}
+
+html[data-theme-mode="dark"] #tabcontent > .tab-pane > .panel > .panel-body {
+ background: #101a18;
}
html[data-theme-mode="dark"] #tabcontent > .tab-pane > .panel > .panel-heading,
html[data-theme-mode="dark"] .form .panel-heading {
- background: #16201f;
- border-color: #233533;
+ background: #0d1716;
+ border-color: #2f4844;
color: #e4efea;
}
@@ -13063,8 +14334,8 @@ html[data-theme-mode="dark"] .tab-form nav.toolbar .container-fluid,
html[data-theme-mode="dark"] .tab-board nav.toolbar .container-fluid,
html[data-theme-mode="dark"] .tab-form nav.toolbar.panel-heading,
html[data-theme-mode="dark"] .tab-board nav.toolbar.panel-heading {
- background: #16201f !important;
- border-color: #233533 !important;
+ background: #0d1716 !important;
+ border-color: #2f4844 !important;
box-shadow: none !important;
}
@@ -13117,8 +14388,13 @@ html[data-theme-mode="dark"] .navbar-inverse #title-logo {
}
html[data-theme-mode="dark"] #menu {
- background: #121b1a;
- border-right: 1px solid #233231;
+ background: #08110f;
+ border-top: 0;
+ border-bottom: 0;
+ border-left: 0;
+ border-right: 1px solid #10231f;
+ border-radius: 0;
+ box-shadow: none;
}
html[data-theme-mode="dark"] #menu a,
@@ -13155,17 +14431,308 @@ html[data-theme-mode="dark"] #menu .treeview tr.selected > td a {
color: #8fe1d8 !important;
}
+.tradon-full-menu {
+ display: none;
+ height: calc(100vh - 50px - 1px - 20px);
+ padding: 16px 18px;
+ overflow: auto;
+ background: #f6f8f7;
+}
+
+#main.tradon-full-menu-active .tradon-full-menu {
+ display: block;
+}
+
+#main.tradon-full-menu-active .row-offcanvas {
+ display: none;
+}
+
+.tradon-full-menu-grid {
+ display: grid;
+ grid-template-columns: repeat(6, minmax(0, 1fr));
+ grid-auto-rows: minmax(220px, 1fr);
+ align-items: stretch;
+ gap: 14px;
+ min-height: 100%;
+}
+
+.tradon-full-menu-card {
+ display: flex;
+ min-width: 0;
+ min-height: 0;
+ flex-direction: column;
+ overflow: hidden;
+ border: 1px solid #e0e7e4;
+ border-radius: 8px;
+ background: #ffffff;
+ box-shadow: 0 3px 12px rgba(47, 70, 84, 0.08);
+}
+
+.tradon-full-menu-card-title {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ width: 100%;
+ min-height: 36px;
+ padding: 8px 10px;
+ overflow: hidden;
+ border: 0;
+ border-bottom: 1px solid #edf2f0;
+ background: #fbfdfc;
+ color: #25484b;
+ font-size: 14px;
+ font-weight: 700;
+ line-height: 1.2;
+ text-align: left;
+}
+
+.tradon-full-menu-card-title:hover,
+.tradon-full-menu-card-title:focus {
+ background: #eef8f5;
+ color: #0b7f7b;
+ outline: none;
+}
+
+.tradon-full-menu-card-title > span {
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.tradon-full-menu-icon {
+ flex: none;
+ width: 16px;
+ height: 16px;
+}
+
+.tradon-full-menu-card-content {
+ display: flex;
+ min-height: 0;
+ flex: 1;
+ flex-direction: column;
+ padding: 8px 9px 10px;
+}
+
+.tradon-full-menu-tabs {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 5px;
+ margin-bottom: 7px;
+}
+
+.tradon-full-menu-tab,
+.tradon-full-menu-link {
+ display: block;
+ min-width: 0;
+ overflow: hidden;
+ border: 0;
+ background: transparent;
+ text-align: left;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.tradon-full-menu-tab {
+ height: 24px;
+ padding: 3px 7px;
+ border-radius: 6px;
+ color: #607171;
+ font-size: 11px;
+ font-weight: 600;
+}
+
+.tradon-full-menu-tab.active,
+.tradon-full-menu-tab:hover,
+.tradon-full-menu-tab:focus {
+ background: #e9f5f2;
+ color: #0b7f7b;
+ outline: none;
+}
+
+.tradon-full-menu-links {
+ display: flex;
+ min-height: 0;
+ flex: 1;
+ flex-direction: column;
+ gap: 2px;
+ overflow: auto;
+}
+
+.tradon-full-menu-link {
+ flex: 0 0 auto;
+ min-height: 20px;
+ padding: 1px 4px;
+ color: #33484d;
+ font-size: 12px;
+ line-height: 18px;
+}
+
+.tradon-full-menu-link.level-2,
+.tradon-full-menu-link.level-3,
+.tradon-full-menu-link.level-4,
+.tradon-full-menu-link.level-5 {
+ color: #697879;
+ font-size: 11px;
+}
+
+.tradon-full-menu-link.level-2 {
+ padding-left: 14px;
+}
+
+.tradon-full-menu-link.level-3,
+.tradon-full-menu-link.level-4,
+.tradon-full-menu-link.level-5 {
+ padding-left: 24px;
+}
+
+.tradon-full-menu-link:hover,
+.tradon-full-menu-link:focus {
+ border-radius: 5px;
+ background: #eef8f5;
+ color: #0b7f7b;
+ outline: none;
+}
+
+html[data-density="compact"] .tradon-full-menu {
+ height: calc(100vh - 40px - 1px);
+ padding: 10px 12px;
+}
+
+html[data-density="compact"] .tradon-full-menu-grid {
+ grid-auto-rows: minmax(180px, 1fr);
+ gap: 9px;
+}
+
+html[data-density="compact"] .tradon-full-menu-card-title {
+ min-height: 30px;
+ padding: 6px 8px;
+ font-size: 12px;
+}
+
+html[data-density="compact"] .tradon-full-menu-card-content {
+ padding: 6px 7px 7px;
+}
+
+html[data-density="compact"] .tradon-full-menu-link {
+ min-height: 17px;
+ font-size: 10.5px;
+ line-height: 15px;
+}
+
+html[data-density="compact"] .tradon-full-menu-tab {
+ height: 20px;
+ padding: 2px 6px;
+ font-size: 10px;
+}
+
+@media (max-width: 1599px) {
+ .tradon-full-menu-grid {
+ grid-template-columns: repeat(5, minmax(0, 1fr));
+ }
+}
+
+@media (max-width: 1199px) {
+ .tradon-full-menu-grid {
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ }
+}
+
+html[data-theme-mode="dark"] .tradon-full-menu {
+ background: #101817;
+}
+
+html[data-theme-mode="dark"] .tradon-full-menu-card {
+ border-color: #223331;
+ background: #16201f;
+ box-shadow: none;
+}
+
+html[data-theme-mode="dark"] .tradon-full-menu-card-title {
+ border-bottom-color: #233533;
+ background: #1a2726;
+ color: #e4efea;
+}
+
+html[data-theme-mode="dark"] .tradon-full-menu-card-title:hover,
+html[data-theme-mode="dark"] .tradon-full-menu-card-title:focus,
+html[data-theme-mode="dark"] .tradon-full-menu-tab.active,
+html[data-theme-mode="dark"] .tradon-full-menu-tab:hover,
+html[data-theme-mode="dark"] .tradon-full-menu-tab:focus,
+html[data-theme-mode="dark"] .tradon-full-menu-link:hover,
+html[data-theme-mode="dark"] .tradon-full-menu-link:focus {
+ background: rgba(43, 140, 135, 0.16);
+ color: #8fe1d8;
+}
+
+html[data-theme-mode="dark"] .tradon-full-menu-tab,
+html[data-theme-mode="dark"] .tradon-full-menu-link {
+ color: #cbd8d2;
+}
+
+html[data-theme-mode="dark"] .tradon-full-menu-link.level-2,
+html[data-theme-mode="dark"] .tradon-full-menu-link.level-3,
+html[data-theme-mode="dark"] .tradon-full-menu-link.level-4,
+html[data-theme-mode="dark"] .tradon-full-menu-link.level-5 {
+ color: #9eafaa;
+}
+
html[data-theme-mode="dark"] #tablist > li > a,
html[data-theme-mode="dark"] .navbar-nav.nav-pills > li > a {
background: #1b2827;
color: #cbd8d2;
- border-left: 1px solid #263736;
+ border: 1px solid transparent;
+ border-left-color: #263736;
+ box-shadow: inset 0 -2px 0 transparent;
+}
+
+html[data-theme-mode="dark"] #tablist > li > a:hover,
+html[data-theme-mode="dark"] #tablist > li > a:focus,
+html[data-theme-mode="dark"] .navbar-nav.nav-pills > li > a:hover,
+html[data-theme-mode="dark"] .navbar-nav.nav-pills > li > a:focus {
+ background: #223331;
+ border-color: #34504c;
+ color: #edf6f1;
}
html[data-theme-mode="dark"] #tablist > li.active > a,
-html[data-theme-mode="dark"] .navbar-nav.nav-pills > li.active > a {
- background: #233231;
- color: #f4fbf8;
+html[data-theme-mode="dark"] #tablist > li.active > a:hover,
+html[data-theme-mode="dark"] #tablist > li.active > a:focus,
+html[data-theme-mode="dark"] .navbar-nav.nav-pills > li.active > a,
+html[data-theme-mode="dark"] .navbar-nav.nav-pills > li.active > a:hover,
+html[data-theme-mode="dark"] .navbar-nav.nav-pills > li.active > a:focus {
+ background: #1b2827;
+ border-color: transparent;
+ color: #8dd7d2;
+ box-shadow: none;
+}
+
+html[data-theme-mode="dark"] #tablist > li.active > a .close,
+html[data-theme-mode="dark"] .navbar-nav.nav-pills > li.active > a .close {
+ background: transparent;
+ border: 0;
+ box-shadow: none;
+ color: #d9fffb;
+ opacity: 0.86;
+}
+
+html[data-theme-mode="dark"] #tablist > li > a .close,
+html[data-theme-mode="dark"] .navbar-nav.nav-pills > li > a .close {
+ background: transparent;
+ border: 0;
+ color: #7fbdb7;
+ text-shadow: none;
+ opacity: 0.72;
+}
+
+html[data-theme-mode="dark"] #tablist > li > a .close:hover,
+html[data-theme-mode="dark"] #tablist > li > a .close:focus,
+html[data-theme-mode="dark"] .navbar-nav.nav-pills > li > a .close:hover,
+html[data-theme-mode="dark"] .navbar-nav.nav-pills > li > a .close:focus {
+ background: rgba(87, 193, 185, 0.16);
+ border-radius: 4px;
+ color: #f4fffd;
+ opacity: 1;
}
html[data-theme-mode="dark"] .theme-mode-toggle {
@@ -13180,6 +14747,94 @@ html[data-theme-mode="dark"] .theme-mode-toggle {
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.25);
}
+html[data-theme-mode="dark"] #global-search .global-search-container > .input-group {
+ background: #1a2726;
+ border-color: #35504d;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.24);
+}
+
+html[data-theme-mode="dark"] #global-search .global-search-container > .input-group:focus-within {
+ border-color: #57c1b9;
+ box-shadow: 0 0 0 2px rgba(87, 193, 185, 0.24);
+}
+
+html[data-theme-mode="dark"] #global-search-entry,
+html[data-theme-mode="dark"] #global-search .form-control,
+html[data-theme-mode="dark"] #global-search .input-group-btn > .btn {
+ background: transparent;
+ border-color: transparent;
+ color: #edf6f1;
+ box-shadow: none;
+}
+
+html[data-theme-mode="dark"] #global-search-entry::placeholder {
+ color: #a8bbb6;
+}
+
+html[data-theme-mode="dark"] #global-search .input-group-btn > .btn:hover,
+html[data-theme-mode="dark"] #global-search .input-group-btn > .btn:focus {
+ background: rgba(87, 193, 185, 0.14);
+ color: #f4fffd;
+}
+
+html[data-theme-mode="dark"] .global-search-container > .dropdown-menu,
+html[data-theme-mode="dark"] #user-favorites > .dropdown-menu {
+ background: #111d20;
+ border: 1px solid rgba(154, 190, 183, 0.18);
+ border-radius: 6px;
+ box-shadow: 0 16px 34px rgba(0, 0, 0, 0.42);
+ color: #dce7e2;
+}
+
+html[data-theme-mode="dark"] .global-search-container > .dropdown-menu > li > a,
+html[data-theme-mode="dark"] #user-favorites > .dropdown-menu > li > a {
+ background: transparent;
+ color: #dce7e2;
+}
+
+html[data-theme-mode="dark"] .global-search-container > .dropdown-menu > li > a:hover,
+html[data-theme-mode="dark"] .global-search-container > .dropdown-menu > li > a:focus,
+html[data-theme-mode="dark"] #user-favorites > .dropdown-menu > li > a:hover,
+html[data-theme-mode="dark"] #user-favorites > .dropdown-menu > li > a:focus {
+ background: rgba(43, 154, 160, 0.14);
+ color: #f3fbf8;
+}
+
+html[data-theme-mode="dark"] .global-search-container > .dropdown-menu > .active > a,
+html[data-theme-mode="dark"] .global-search-container > .dropdown-menu > .active > a:hover,
+html[data-theme-mode="dark"] .global-search-container > .dropdown-menu > .active > a:focus,
+html[data-theme-mode="dark"] #user-favorites > .dropdown-menu > .active > a,
+html[data-theme-mode="dark"] #user-favorites > .dropdown-menu > .active > a:hover,
+html[data-theme-mode="dark"] #user-favorites > .dropdown-menu > .active > a:focus {
+ background: rgba(43, 154, 160, 0.22);
+ color: #ffffff;
+}
+
+html[data-theme-mode="dark"] .global-search-container > .dropdown-menu .divider,
+html[data-theme-mode="dark"] #user-favorites > .dropdown-menu .divider {
+ background-color: rgba(154, 190, 183, 0.14);
+}
+
+html[data-theme-mode="dark"] .global-search-container .global_search-icon,
+html[data-theme-mode="dark"] .global-search-container .global-search-icon,
+html[data-theme-mode="dark"] #user-favorites .dropdown-menu img.icon {
+ filter: var(--tradon-menu-icon-filter) !important;
+ opacity: 1;
+}
+
+html[data-theme-mode="dark"] .global-search-container .global-search-text {
+ color: inherit;
+}
+
+html[data-theme-mode="dark"] .tab-form nav.toolbar .badge,
+html[data-theme-mode="dark"] .tab-board nav.toolbar .badge,
+html[data-theme-mode="dark"] .toolbar.panel-heading .badge {
+ background: #203230;
+ border: 1px solid #57c1b9;
+ color: #f4fffd;
+ box-shadow: inset 0 0 0 1px rgba(87, 193, 185, 0.12);
+}
+
html[data-theme-mode="light"] .theme-mode-toggle {
margin: 8px 0 8px 10px;
min-height: 34px;
@@ -13214,16 +14869,65 @@ html[data-theme-mode="light"] .theme-mode-toggle {
html[data-theme-mode="dark"] .screen-container > .filter-box,
html[data-theme-mode="dark"] .screen-container .content-box > .form,
html[data-theme-mode="dark"] .screen-container .content-box > form,
+html[data-theme-mode="dark"] .content-box.ag-grid-content-box,
+html[data-theme-mode="dark"] .ag-grid-tree-container,
+html[data-theme-mode="dark"] .ag-grid-tree-toolbar,
+html[data-theme-mode="dark"] .form .form-one2many-content,
+html[data-theme-mode="dark"] .form .form-many2many-content,
+html[data-theme-mode="dark"] .form .form-one2many-content .treeview,
+html[data-theme-mode="dark"] .form .form-many2many-content .treeview,
+html[data-theme-mode="dark"] .form .form-one2many-content .list-form,
+html[data-theme-mode="dark"] .form .form-many2many-content .list-form,
html[data-theme-mode="dark"] .ag-grid-tree-grouping-panel,
html[data-theme-mode="dark"] .ag-grid-tree-layouts-panel,
html[data-theme-mode="dark"] .ag-grid-filter-logic-panel,
html[data-theme-mode="dark"] .ag-grid-tree-columns-panel {
- background: linear-gradient(180deg, #162220 0%, #141e1d 100%);
+ background: linear-gradient(180deg, #172724 0%, #14221f 100%);
border-color: #28403d;
box-shadow: 0 8px 26px rgba(0, 0, 0, 0.34);
color: #dce7e2;
}
+html[data-theme-mode="dark"] .screen-container .content-box > .form,
+html[data-theme-mode="dark"] .screen-container .content-box > form,
+html[data-theme-mode="dark"] .form .tab-pane:has(> .form-container > .form-item > fieldset.form-panel) {
+ background: #07100e;
+ border-color: #1b2f2b;
+ box-shadow: none;
+}
+
+html[data-theme-mode="dark"] .form .form-one2many.panel.panel-default,
+html[data-theme-mode="dark"] .form .form-many2many.panel.panel-default,
+html[data-theme-mode="dark"] .screen-container .form-one2many.panel.panel-default,
+html[data-theme-mode="dark"] .screen-container .form-many2many.panel.panel-default {
+ background: #07100e !important;
+ border-color: #1b2f2b !important;
+ color: #dce7e2;
+ box-shadow: none !important;
+}
+
+html[data-theme-mode="dark"] .form .form-one2many.panel.panel-default > .panel-body,
+html[data-theme-mode="dark"] .form .form-many2many.panel.panel-default > .panel-body,
+html[data-theme-mode="dark"] .screen-container .form-one2many.panel.panel-default > .panel-body,
+html[data-theme-mode="dark"] .screen-container .form-many2many.panel.panel-default > .panel-body {
+ background: #07100e !important;
+ color: #dce7e2;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-container,
+html[data-theme-mode="dark"] .content-box.ag-grid-content-box,
+html[data-theme-mode="dark"] .form .form-one2many-content,
+html[data-theme-mode="dark"] .form .form-many2many-content {
+ border-color: #2a403d;
+}
+
+html[data-theme-mode="dark"] .form .form-one2many-menu,
+html[data-theme-mode="dark"] .form .form-many2many-menu {
+ background: #162622;
+ border-color: #36534e;
+ color: #dce7e2;
+}
+
html[data-theme-mode="dark"] .screen-container .control-label,
html[data-theme-mode="dark"] .screen-container label,
html[data-theme-mode="dark"] .ag-grid-tree-grouping-title,
@@ -13244,24 +14948,163 @@ html[data-theme-mode="dark"] .screen-container select.form-control,
html[data-theme-mode="dark"] .screen-container textarea.form-control,
html[data-theme-mode="dark"] .screen-container .input-group > .form-control,
html[data-theme-mode="dark"] .screen-container .input-group > .form-control[readonly] {
- background: #1a2726;
- border-color: #304643;
+ background: #203432;
+ border-color: #496b65;
color: #edf6f1;
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.25);
}
+html[data-theme-mode="dark"] .screen-container .form-control,
+html[data-theme-mode="dark"] .screen-container input[type="text"]:not(.ag-grid-tree-panel-checkbox),
+html[data-theme-mode="dark"] .screen-container input[type="number"]:not(.ag-grid-tree-panel-checkbox),
+html[data-theme-mode="dark"] .screen-container input[type="search"]:not(.ag-grid-tree-panel-checkbox),
+html[data-theme-mode="dark"] .screen-container input[type="date"]:not(.ag-grid-tree-panel-checkbox),
+html[data-theme-mode="dark"] .screen-container input[type="datetime-local"]:not(.ag-grid-tree-panel-checkbox),
+html[data-theme-mode="dark"] .screen-container select,
+html[data-theme-mode="dark"] .screen-container textarea,
+html[data-theme-mode="dark"] .screen-container .selection,
+html[data-theme-mode="dark"] .form .form-selection input,
+html[data-theme-mode="dark"] .form .form-selection select,
+html[data-theme-mode="dark"] .form .form-multiselection input,
+html[data-theme-mode="dark"] .form .form-multiselection select {
+ background: #203432 !important;
+ border-color: #496b65 !important;
+ color: #edf6f1 !important;
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.25) !important;
+}
+
+html[data-theme-mode="dark"] .screen-container .form-control[readonly],
+html[data-theme-mode="dark"] .screen-container .form-control[disabled],
+html[data-theme-mode="dark"] .screen-container input[readonly],
+html[data-theme-mode="dark"] .screen-container input[disabled],
+html[data-theme-mode="dark"] .screen-container select[disabled] {
+ background: #162220 !important;
+ color: #b9cbc6 !important;
+}
+
+html[data-theme-mode="dark"] .screen-container input[type="checkbox"] {
+ background: transparent !important;
+ box-shadow: none !important;
+}
+
+html[data-theme-mode="dark"] .screen-container input[type="checkbox"]:before {
+ background: transparent !important;
+ border-color: #496b65 !important;
+}
+
+html[data-theme-mode="dark"] .screen-container input[type="checkbox"]:focus:before {
+ border-color: #8dd7d2 !important;
+}
+
+html[data-theme-mode="dark"] .screen-container input[type="checkbox"]:checked:before,
+html[data-theme-mode="dark"] .screen-container input[type="checkbox"]:indeterminate:before {
+ background: #2b8c87 !important;
+ border-color: #57c1b9 !important;
+}
+
html[data-theme-mode="dark"] .screen-container input::placeholder,
html[data-theme-mode="dark"] .screen-container textarea::placeholder {
color: #8ea39f;
}
+html[data-theme-mode="dark"] .screen-container .nav-tabs {
+ border-bottom-color: #2d4542;
+}
+
+html[data-theme-mode="dark"] .screen-container .nav-tabs > li > a,
+html[data-theme-mode="dark"] .screen-container .nav-tabs > li > a:focus {
+ background: transparent;
+ border-color: transparent;
+ color: #a8bbb6;
+}
+
+html[data-theme-mode="dark"] .screen-container .nav-tabs > li > a:hover,
+html[data-theme-mode="dark"] .screen-container .nav-tabs > li > a:focus:hover {
+ background: #1b2a28;
+ border-color: #304a46;
+ color: #edf6f1;
+}
+
+html[data-theme-mode="dark"] .screen-container .nav-tabs > li.active > a,
+html[data-theme-mode="dark"] .screen-container .nav-tabs > li.active > a:focus,
+html[data-theme-mode="dark"] .screen-container .nav-tabs > li.active > a:hover {
+ background: transparent;
+ border-color: transparent;
+ color: #8dd7d2;
+ font-weight: 700;
+ box-shadow: none;
+}
+
+html[data-theme-mode="dark"] .form-rich-graph {
+ color: #dce7e2;
+}
+
+html[data-theme-mode="dark"] .form-rich-graph-meta,
+html[data-theme-mode="dark"] .form-rich-graph-legend-item {
+ color: #9db0ab;
+}
+
+html[data-theme-mode="dark"] .form-rich-graph-range {
+ background: #17282c;
+ border-color: rgba(154, 190, 183, 0.16);
+ color: #9fb4af;
+}
+
+html[data-theme-mode="dark"] .form-rich-graph-range:hover,
+html[data-theme-mode="dark"] .form-rich-graph-range:focus {
+ background: #20383d;
+ border-color: rgba(101, 215, 208, 0.34);
+ color: #eef7f4;
+}
+
+html[data-theme-mode="dark"] .form-rich-graph-range.active {
+ background: rgba(101, 215, 208, 0.16);
+ border-color: rgba(101, 215, 208, 0.48);
+ color: #65d7d0;
+}
+
+html[data-theme-mode="dark"] .form-rich-graph-stage {
+ background: #111a22;
+ border-color: #243342;
+}
+
+html[data-theme-mode="dark"] .form-rich-graph-grid-line {
+ stroke: #243342;
+}
+
+html[data-theme-mode="dark"] .form-rich-graph-axis-label,
+html[data-theme-mode="dark"] .form-rich-graph-x-label {
+ fill: #8796a5;
+}
+
+html[data-theme-mode="dark"] .form-rich-graph-point {
+ stroke: #111a22;
+}
+
+html[data-theme-mode="dark"] .form-rich-graph-legend-svg-item text {
+ paint-order: stroke;
+ stroke: #111a22;
+ stroke-width: 3px;
+}
+
+html[data-theme-mode="dark"] .form-rich-graph-tooltip {
+ background: rgba(15, 23, 31, 0.96);
+ border-color: #304357;
+ color: #edf6f1;
+ box-shadow: 0 10px 24px rgba(0, 0, 0, 0.3);
+}
+
html[data-theme-mode="dark"] .screen-container .input-group-btn > .btn,
html[data-theme-mode="dark"] .screen-container .btn-group > .btn,
html[data-theme-mode="dark"] .screen-container .filter-box .btn,
+html[data-theme-mode="dark"] .screen-container .btn,
+html[data-theme-mode="dark"] .form .btn,
html[data-theme-mode="dark"] .ag-grid-tree-columns > .btn,
html[data-theme-mode="dark"] .ag-grid-tree-grouping > .btn,
html[data-theme-mode="dark"] .ag-grid-tree-layouts > .btn,
+html[data-theme-mode="dark"] .ag-grid-value-filter-mode,
html[data-theme-mode="dark"] .ag-grid-view-transfer-button,
+html[data-theme-mode="dark"] .ag-grid-screen-filter-toggle,
html[data-theme-mode="dark"] .ag-grid-tree-grouping-panel .btn,
html[data-theme-mode="dark"] .ag-grid-tree-layouts-panel .btn,
html[data-theme-mode="dark"] .ag-grid-filter-logic-panel .btn,
@@ -13277,10 +15120,19 @@ html[data-theme-mode="dark"] .ag-theme-alpine .ag-filter-apply-panel .ag-standar
html[data-theme-mode="dark"] .screen-container .input-group-btn > .btn:hover,
html[data-theme-mode="dark"] .screen-container .btn-group > .btn:hover,
html[data-theme-mode="dark"] .screen-container .filter-box .btn:hover,
+html[data-theme-mode="dark"] .screen-container .btn:hover,
+html[data-theme-mode="dark"] .screen-container .btn:focus,
+html[data-theme-mode="dark"] .form .btn:hover,
+html[data-theme-mode="dark"] .form .btn:focus,
html[data-theme-mode="dark"] .ag-grid-tree-columns > .btn:hover,
html[data-theme-mode="dark"] .ag-grid-tree-grouping > .btn:hover,
html[data-theme-mode="dark"] .ag-grid-tree-layouts > .btn:hover,
+html[data-theme-mode="dark"] .ag-grid-value-filter-mode:hover,
+html[data-theme-mode="dark"] .ag-grid-value-filter-mode:focus,
+html[data-theme-mode="dark"] .ag-grid-value-filter-mode.active,
html[data-theme-mode="dark"] .ag-grid-view-transfer-button:hover,
+html[data-theme-mode="dark"] .ag-grid-screen-filter-toggle:hover,
+html[data-theme-mode="dark"] .ag-grid-screen-filter-toggle:focus,
html[data-theme-mode="dark"] .ag-grid-tree-grouping-panel .btn:hover,
html[data-theme-mode="dark"] .ag-grid-tree-layouts-panel .btn:hover,
html[data-theme-mode="dark"] .ag-grid-filter-logic-panel .btn:hover,
@@ -13292,6 +15144,22 @@ html[data-theme-mode="dark"] .ag-theme-alpine .ag-filter-apply-panel .ag-standar
color: #f0faf6;
}
+html[data-theme-mode="dark"] .screen-container .btn-primary,
+html[data-theme-mode="dark"] .form .btn-primary {
+ background: linear-gradient(180deg, #28524e 0%, #1f3f3c 100%);
+ border-color: #69d7cf;
+ color: #f4fffd;
+}
+
+html[data-theme-mode="dark"] .screen-container .btn .badge,
+html[data-theme-mode="dark"] .form .btn .badge,
+html[data-theme-mode="dark"] .form .form-one2many-menu .badge,
+html[data-theme-mode="dark"] .form .form-many2many-menu .badge {
+ background: #223331;
+ border: 1px solid #57c1b9;
+ color: #f4fffd;
+}
+
html[data-theme-mode="dark"] .ag-grid-filter-logic-help,
html[data-theme-mode="dark"] .ag-grid-filter-logic-empty,
html[data-theme-mode="dark"] .ag-grid-filter-logic-item-values {
@@ -13333,7 +15201,7 @@ html[data-theme-mode="dark"] .ag-grid-summary-value {
}
html[data-theme-mode="dark"] .ag-grid-summary-item-sum .ag-grid-summary-value {
- color: #111111;
+ color: #eef7f4 !important;
}
html[data-theme-mode="dark"] .ag-grid-summary-item-variation {
@@ -13365,14 +15233,14 @@ html[data-theme-mode="dark"] .form-tolerance-gauge-label-center {
}
html[data-theme-mode="dark"] .form-tolerance-gauge-track {
- border-color: #304643;
- background: linear-gradient(180deg, #213130 0%, #1a2726 100%);
+ border-color: #496b65;
+ background: linear-gradient(180deg, #2d4642 0%, #243a36 100%);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.28);
}
html[data-theme-mode="dark"] .form-tolerance-gauge-fill {
- background: linear-gradient(90deg, #57c1b9 0%, #2b8c87 100%);
- box-shadow: 0 0 0 1px rgba(143, 225, 216, 0.18);
+ background: linear-gradient(90deg, #75cfc7 0%, #4caea6 100%);
+ box-shadow: 0 0 0 1px rgba(143, 225, 216, 0.12);
}
html[data-theme-mode="dark"] .form-tolerance-gauge-center-tick,
@@ -13414,6 +15282,57 @@ html[data-theme-mode="dark"] .ag-grid-tree-host {
--ag-checkbox-indeterminate-color: #57c1b9;
}
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-root-wrapper,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-root,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-root-wrapper-body,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-layout-normal,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-layout-auto-height,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-body,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-body-viewport,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-body-viewport-wrapper,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-center-cols-clipper,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-center-cols-viewport,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-center-cols-container,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-pinned-left-cols-container,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-pinned-right-cols-container,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-floating-bottom,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-overlay,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-overlay-wrapper,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-body-horizontal-scroll,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-body-horizontal-scroll-viewport,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-body-horizontal-scroll-container {
+ background: #101817 !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host.ag-theme-alpine {
+ background: #101817 !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-external-horizontal-scroll {
+ background: #101817;
+ border-color: #2a403d;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-body-horizontal-scroll,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-body-horizontal-scroll-viewport,
+html[data-theme-mode="dark"] .ag-grid-tree-external-horizontal-scroll,
+html[data-theme-mode="dark"] .ag-grid-tree-host ::-webkit-scrollbar-track,
+html[data-theme-mode="dark"] .ag-grid-tree-external-horizontal-scroll::-webkit-scrollbar-track {
+ background: #07100e !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host ::-webkit-scrollbar-thumb,
+html[data-theme-mode="dark"] .ag-grid-tree-external-horizontal-scroll::-webkit-scrollbar-thumb {
+ background: #36534e !important;
+ border: 2px solid #07100e !important;
+}
+
+html[data-theme-mode="dark"] .screen-container hr,
+html[data-theme-mode="dark"] .form .form-separator hr,
+html[data-theme-mode="dark"] .screen-container .nav-tabs {
+ border-color: #24413c;
+}
+
html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell,
html[data-theme-mode="dark"] .ag-grid-tree-host .ag-cell {
border-right-color: #213230;
@@ -13502,6 +15421,25 @@ html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell-text {
color: #eff8f4;
}
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge {
+ min-height: 17px;
+ padding: 1px 7px;
+ font-size: 10px;
+ line-height: 1.25;
+}
+
+html[data-density="compact"] .ag-grid-tree-host .ag-grid-badge {
+ min-height: 16px;
+ padding: 1px 6px;
+ font-size: 9.5px;
+}
+
+html[data-density="compact"] .ag-grid-tree-host .ag-cell,
+html[data-density="compact"] .ag-grid-tree-host .ag-header-cell-text,
+html[data-density="compact"] .ag-grid-tree-host .ag-group-value {
+ font-size: 10.5px;
+}
+
html[data-theme-mode="dark"] .ag-grid-group-row .ag-cell {
background: #1c2b29;
color: #eaf4ef;
@@ -13512,3 +15450,1302 @@ html[data-theme-mode="dark"] .ag-grid-total-row .ag-cell {
color: #f3fbf7;
}
+html[data-theme-mode="dark"] {
+ --tradon-dark-bg: #07100e;
+ --tradon-dark-surface: #101c1f;
+ --tradon-dark-panel: #142326;
+ --tradon-dark-panel-header: #192c30;
+ --tradon-dark-field: #1b2b2f;
+ --tradon-dark-field-focus: #21373b;
+ --tradon-dark-line: rgba(154, 190, 183, 0.16);
+ --tradon-dark-line-strong: rgba(154, 190, 183, 0.28);
+ --tradon-dark-text: #eef7f4;
+ --tradon-dark-muted: rgba(220, 231, 226, 0.66);
+ --tradon-dark-faint: rgba(220, 231, 226, 0.48);
+ --tradon-dark-accent: #65d7d0;
+ --tradon-dark-accent-soft: rgba(101, 215, 208, 0.16);
+}
+
+html[data-theme-mode="dark"] body,
+html[data-theme-mode="dark"] .body,
+html[data-theme-mode="dark"] #main,
+html[data-theme-mode="dark"] #tabs,
+html[data-theme-mode="dark"] #tabcontent,
+html[data-theme-mode="dark"] .tab-content,
+html[data-theme-mode="dark"] .tab-pane,
+html[data-theme-mode="dark"] .content-box,
+html[data-theme-mode="dark"] .main-offcanvas,
+html[data-theme-mode="dark"] .tab-form,
+html[data-theme-mode="dark"] .tab-board,
+html[data-theme-mode="dark"] #tabcontent > .tab-pane > .panel,
+html[data-theme-mode="dark"] #tabcontent > .tab-pane > .panel > .panel-body,
+html[data-theme-mode="dark"] .screen-container .content-box > .form,
+html[data-theme-mode="dark"] .screen-container .content-box > form,
+html[data-theme-mode="dark"] .form .tab-pane:has(> .form-container > .form-item > fieldset.form-panel) {
+ background: var(--tradon-dark-bg) !important;
+ color: var(--tradon-dark-text);
+}
+
+html[data-theme-mode="dark"] .navbar.navbar-inverse,
+html[data-theme-mode="dark"] .tab-form nav.toolbar,
+html[data-theme-mode="dark"] .tab-board nav.toolbar,
+html[data-theme-mode="dark"] .tab-form nav.toolbar .container-fluid,
+html[data-theme-mode="dark"] .tab-board nav.toolbar .container-fluid,
+html[data-theme-mode="dark"] .tab-form nav.toolbar.panel-heading,
+html[data-theme-mode="dark"] .tab-board nav.toolbar.panel-heading {
+ background: linear-gradient(180deg, #111d20 0%, #0c1618 100%) !important;
+ border-color: var(--tradon-dark-line) !important;
+ box-shadow: 0 1px 0 rgba(255, 255, 255, 0.03), 0 12px 26px rgba(0, 0, 0, 0.22) !important;
+}
+
+html[data-theme-mode="dark"] #tabcontent > .tab-pane > .panel > .panel-heading,
+html[data-theme-mode="dark"] .form .panel-heading {
+ background: var(--tradon-dark-panel-header) !important;
+ border-color: var(--tradon-dark-line) !important;
+}
+
+html[data-theme-mode="dark"] .form fieldset.form-panel,
+html[data-theme-mode="dark"] .screen-container > .filter-box,
+html[data-theme-mode="dark"] .content-box.ag-grid-content-box,
+html[data-theme-mode="dark"] .ag-grid-tree-container,
+html[data-theme-mode="dark"] .form .form-one2many.panel.panel-default,
+html[data-theme-mode="dark"] .form .form-many2many.panel.panel-default,
+html[data-theme-mode="dark"] .screen-container .form-one2many.panel.panel-default,
+html[data-theme-mode="dark"] .screen-container .form-many2many.panel.panel-default {
+ background: linear-gradient(180deg, #142326 0%, #101d20 100%) !important;
+ border-color: var(--tradon-dark-line) !important;
+ box-shadow: 0 10px 24px rgba(0, 0, 0, 0.18), inset 0 1px 0 rgba(255, 255, 255, 0.03) !important;
+}
+
+html[data-theme-mode="dark"] .form fieldset.form-panel > legend,
+html[data-theme-mode="dark"] .form .form-one2many-menu,
+html[data-theme-mode="dark"] .form .form-many2many-menu,
+html[data-theme-mode="dark"] .ag-grid-tree-toolbar {
+ background: linear-gradient(180deg, var(--tradon-dark-panel-header) 0%, #142326 100%) !important;
+ border-color: var(--tradon-dark-line) !important;
+ color: var(--tradon-dark-accent) !important;
+}
+
+html[data-theme-mode="dark"] .form fieldset.form-panel .form-label,
+html[data-theme-mode="dark"] .form fieldset.form-panel-sidebar .form-label,
+html[data-theme-mode="dark"] .screen-container .control-label,
+html[data-theme-mode="dark"] .screen-container label {
+ color: var(--tradon-dark-muted) !important;
+ font-weight: 600;
+}
+
+html[data-theme-mode="dark"] .screen-container input.form-control:not([type="checkbox"]):not([type="radio"]),
+html[data-theme-mode="dark"] .screen-container select.form-control,
+html[data-theme-mode="dark"] .screen-container textarea.form-control,
+html[data-theme-mode="dark"] .screen-container .input-group > .form-control,
+html[data-theme-mode="dark"] .screen-container .form-control,
+html[data-theme-mode="dark"] .screen-container input[type="text"]:not(.ag-grid-tree-panel-checkbox),
+html[data-theme-mode="dark"] .screen-container input[type="number"]:not(.ag-grid-tree-panel-checkbox),
+html[data-theme-mode="dark"] .screen-container input[type="search"]:not(.ag-grid-tree-panel-checkbox),
+html[data-theme-mode="dark"] .screen-container input[type="date"]:not(.ag-grid-tree-panel-checkbox),
+html[data-theme-mode="dark"] .screen-container input[type="datetime-local"]:not(.ag-grid-tree-panel-checkbox),
+html[data-theme-mode="dark"] .screen-container select,
+html[data-theme-mode="dark"] .screen-container textarea,
+html[data-theme-mode="dark"] .screen-container .selection {
+ background: var(--tradon-dark-field) !important;
+ border-color: var(--tradon-dark-line) !important;
+ color: var(--tradon-dark-text) !important;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.18) !important;
+}
+
+html[data-theme-mode="dark"] .screen-container input.form-control:focus,
+html[data-theme-mode="dark"] .screen-container select.form-control:focus,
+html[data-theme-mode="dark"] .screen-container textarea.form-control:focus,
+html[data-theme-mode="dark"] .screen-container .input-group > .form-control:focus,
+html[data-theme-mode="dark"] .screen-container input[type="text"]:focus,
+html[data-theme-mode="dark"] .screen-container input[type="number"]:focus,
+html[data-theme-mode="dark"] .screen-container input[type="search"]:focus,
+html[data-theme-mode="dark"] .screen-container input[type="date"]:focus,
+html[data-theme-mode="dark"] .screen-container input[type="datetime-local"]:focus {
+ background: var(--tradon-dark-field-focus) !important;
+ border-color: rgba(101, 215, 208, 0.58) !important;
+ box-shadow: 0 0 0 2px rgba(101, 215, 208, 0.12), inset 0 1px 1px rgba(0, 0, 0, 0.2) !important;
+}
+
+html[data-theme-mode="dark"] .form fieldset.form-panel > legend .form-panel-icon,
+html[data-theme-mode="dark"] .form fieldset.form-panel > legend .form-panel-icon svg {
+ color: var(--tradon-dark-accent) !important;
+ fill: var(--tradon-dark-accent) !important;
+ stroke: var(--tradon-dark-accent) !important;
+}
+
+html[data-theme-mode="dark"] .screen-container .icon-input img,
+html[data-theme-mode="dark"] .screen-container .icon-input svg,
+html[data-theme-mode="dark"] .tab-form nav.toolbar .btn img.icon,
+html[data-theme-mode="dark"] .tab-board nav.toolbar .btn img.icon {
+ opacity: 0.72;
+ filter: brightness(0) saturate(100%) invert(77%) sepia(14%) saturate(336%) hue-rotate(125deg) brightness(93%) contrast(88%) !important;
+}
+
+html[data-theme-mode="dark"] #tablist > li > a,
+html[data-theme-mode="dark"] .navbar-nav.nav-pills > li > a {
+ background: linear-gradient(180deg, #142125 0%, #111b1e 100%);
+ border-color: var(--tradon-dark-line);
+ color: var(--tradon-dark-muted);
+}
+
+html[data-theme-mode="dark"] #tablist > li.active > a,
+html[data-theme-mode="dark"] #tablist > li.active > a:hover,
+html[data-theme-mode="dark"] #tablist > li.active > a:focus,
+html[data-theme-mode="dark"] .navbar-nav.nav-pills > li.active > a,
+html[data-theme-mode="dark"] .navbar-nav.nav-pills > li.active > a:hover,
+html[data-theme-mode="dark"] .navbar-nav.nav-pills > li.active > a:focus {
+ background: linear-gradient(180deg, #0f827f 0%, #086565 100%);
+ border-color: rgba(101, 215, 208, 0.38);
+ color: #f6fffd;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12), 0 8px 18px rgba(0, 0, 0, 0.22);
+}
+
+html[data-theme-mode="dark"] .screen-container .nav-tabs {
+ background: rgba(16, 28, 31, 0.62);
+ border-bottom-color: var(--tradon-dark-line);
+}
+
+html[data-theme-mode="dark"] .screen-container .nav-tabs > li > a,
+html[data-theme-mode="dark"] .screen-container .nav-tabs > li > a:focus {
+ color: var(--tradon-dark-muted);
+}
+
+html[data-theme-mode="dark"] .screen-container .nav-tabs > li.active > a,
+html[data-theme-mode="dark"] .screen-container .nav-tabs > li.active > a:focus,
+html[data-theme-mode="dark"] .screen-container .nav-tabs > li.active > a:hover {
+ background: transparent;
+ border-color: transparent;
+ border-bottom: 2px solid var(--tradon-dark-accent);
+ color: var(--tradon-dark-accent);
+ box-shadow: none;
+}
+
+html[data-theme-mode="dark"] .tab-form nav.toolbar .btn.btn-default,
+html[data-theme-mode="dark"] .tab-board nav.toolbar .btn.btn-default,
+html[data-theme-mode="dark"] .tab-form nav.toolbar .navbar-btn,
+html[data-theme-mode="dark"] .tab-board nav.toolbar .navbar-btn,
+html[data-theme-mode="dark"] .screen-container .btn,
+html[data-theme-mode="dark"] .form .btn,
+html[data-theme-mode="dark"] .ag-grid-tree-columns > .btn,
+html[data-theme-mode="dark"] .ag-grid-tree-grouping > .btn,
+html[data-theme-mode="dark"] .ag-grid-tree-layouts > .btn,
+html[data-theme-mode="dark"] .ag-grid-value-filter-mode,
+html[data-theme-mode="dark"] .ag-grid-screen-filter-toggle {
+ background: #17282c !important;
+ border-color: var(--tradon-dark-line) !important;
+ color: var(--tradon-dark-text) !important;
+ box-shadow: none !important;
+}
+
+html[data-theme-mode="dark"] .tab-form nav.toolbar .btn.btn-default:hover,
+html[data-theme-mode="dark"] .tab-board nav.toolbar .btn.btn-default:hover,
+html[data-theme-mode="dark"] .screen-container .btn:hover,
+html[data-theme-mode="dark"] .screen-container .btn:focus,
+html[data-theme-mode="dark"] .form .btn:hover,
+html[data-theme-mode="dark"] .form .btn:focus {
+ background: #20383d !important;
+ border-color: var(--tradon-dark-line-strong) !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host {
+ --ag-background-color: #0b1517;
+ --ag-header-background-color: #17282c;
+ --ag-foreground-color: #dce7e2;
+ --ag-header-foreground-color: #f2faf7;
+ --ag-border-color: var(--tradon-dark-line);
+ --ag-row-border-color: rgba(154, 190, 183, 0.1);
+ --ag-odd-row-background-color: #112022;
+ --ag-selected-row-background-color: rgba(101, 215, 208, 0.18);
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-root-wrapper,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-root,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-root-wrapper-body,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-layout-normal,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-layout-auto-height,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-body,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-body-viewport,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-body-viewport-wrapper,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-center-cols-clipper,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-center-cols-viewport,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-center-cols-container,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-pinned-left-cols-container,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-pinned-right-cols-container,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-floating-bottom,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-overlay,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-overlay-wrapper {
+ background: #0b1517 !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header {
+ background: #17282c !important;
+ border-bottom-color: var(--tradon-dark-line-strong);
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-cell {
+ border-right-color: rgba(154, 190, 183, 0.09);
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-row {
+ background-color: #0b1517;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-row:nth-child(odd) {
+ background-color: #112022;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-row:hover {
+ background-color: #173034 !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-cell a,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-cell .cell {
+ color: #68d7cf;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell-label,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-cell,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-group-value {
+ color: #dce7e2;
+}
+
+html[data-theme-mode="dark"] .form-tolerance-gauge-track {
+ border-color: rgba(154, 190, 183, 0.18);
+ background: #18282c;
+}
+
+html[data-theme-mode="dark"] .form-tolerance-gauge-fill {
+ background: linear-gradient(90deg, #65d7d0 0%, #3da9a5 100%);
+}
+
+html[data-theme-mode="dark"] {
+ --tradon-menu-icon: #2b9aa0;
+ --tradon-menu-icon-filter: brightness(0) saturate(100%) invert(45%) sepia(57%) saturate(501%) hue-rotate(136deg) brightness(92%) contrast(88%);
+}
+
+html[data-theme-mode="dark"] #menu .icon,
+html[data-theme-mode="dark"] #menu svg,
+html[data-theme-mode="dark"] #menu [class*="icon"],
+html[data-theme-mode="dark"] .form fieldset.form-panel > legend .form-panel-icon,
+html[data-theme-mode="dark"] .form fieldset.form-panel > legend .form-panel-icon svg,
+html[data-theme-mode="dark"] .screen-container .icon-input svg,
+html[data-theme-mode="dark"] .form-link.btn.btn-link,
+html[data-theme-mode="dark"] .form-link.btn.btn-link .icon,
+html[data-theme-mode="dark"] .form-link.btn.btn-link svg,
+html[data-theme-mode="dark"] .tab-form nav.toolbar .btn,
+html[data-theme-mode="dark"] .tab-board nav.toolbar .btn,
+html[data-theme-mode="dark"] .ag-grid-toolbar-icon {
+ color: var(--tradon-menu-icon) !important;
+ fill: var(--tradon-menu-icon) !important;
+ stroke: var(--tradon-menu-icon) !important;
+}
+
+html[data-theme-mode="dark"] #menu img.icon,
+html[data-theme-mode="dark"] .form fieldset.form-panel > legend .form-panel-icon img,
+html[data-theme-mode="dark"] .screen-container .icon-input img,
+html[data-theme-mode="dark"] .form-link.btn.btn-link > img.icon,
+html[data-theme-mode="dark"] .form-link.btn.btn-link img.icon,
+html[data-theme-mode="dark"] .tab-form nav.toolbar .btn img.icon,
+html[data-theme-mode="dark"] .tab-board nav.toolbar .btn img.icon {
+ opacity: 1;
+ filter: var(--tradon-menu-icon-filter) !important;
+}
+
+html[data-theme-mode="dark"] .tab-form nav.toolbar,
+html[data-theme-mode="dark"] .tab-board nav.toolbar,
+html[data-theme-mode="dark"] .tab-form nav.toolbar.panel-heading,
+html[data-theme-mode="dark"] .tab-board nav.toolbar.panel-heading,
+html[data-theme-mode="dark"] .tab-form nav.toolbar .container-fluid,
+html[data-theme-mode="dark"] .tab-board nav.toolbar .container-fluid {
+ background: var(--tradon-dark-bg) !important;
+ border-left-color: transparent !important;
+ box-shadow: none !important;
+}
+
+html[data-theme-mode="dark"] .tab-form nav.toolbar .container-fluid,
+html[data-theme-mode="dark"] .tab-board nav.toolbar .container-fluid {
+ padding-left: 0;
+}
+
+html[data-theme-mode="dark"] .tab-form nav.toolbar .navbar-brand,
+html[data-theme-mode="dark"] .tab-board nav.toolbar .navbar-brand {
+ background: transparent !important;
+}
+
+html[data-theme-mode="dark"] .tab-form > nav.toolbar.panel-heading,
+html[data-theme-mode="dark"] .tab-board > nav.toolbar.panel-heading,
+html[data-theme-mode="dark"] .panel.tab-form > nav.toolbar.panel-heading,
+html[data-theme-mode="dark"] .panel.tab-board > nav.toolbar.panel-heading {
+ margin-left: 0 !important;
+ padding-left: 0 !important;
+ border-left: 0 !important;
+ background: var(--tradon-dark-bg) !important;
+ background-image: none !important;
+}
+
+html[data-theme-mode="dark"] .tab-form > nav.toolbar.panel-heading > .container-fluid,
+html[data-theme-mode="dark"] .tab-board > nav.toolbar.panel-heading > .container-fluid,
+html[data-theme-mode="dark"] .panel.tab-form > nav.toolbar.panel-heading > .container-fluid,
+html[data-theme-mode="dark"] .panel.tab-board > nav.toolbar.panel-heading > .container-fluid {
+ margin-left: 0 !important;
+ padding-left: 0 !important;
+ background: transparent !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-container {
+ background: #0b1517 !important;
+ border-color: rgba(154, 190, 183, 0.16) !important;
+ box-shadow: 0 14px 30px rgba(0, 0, 0, 0.22) !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-toolbar {
+ gap: 7px;
+ min-height: 34px;
+ padding: 5px 8px;
+ background: linear-gradient(180deg, #132326 0%, #0f1c1f 100%) !important;
+ border-color: rgba(154, 190, 183, 0.12) !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-columns > .btn,
+html[data-theme-mode="dark"] .ag-grid-tree-grouping > .btn,
+html[data-theme-mode="dark"] .ag-grid-tree-layouts > .btn,
+html[data-theme-mode="dark"] .ag-grid-value-filter-mode,
+html[data-theme-mode="dark"] .ag-grid-screen-filter-toggle {
+ min-height: 26px;
+ padding: 4px 9px;
+ border-radius: 5px;
+ background: rgba(27, 43, 47, 0.82) !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host {
+ border-color: rgba(154, 190, 183, 0.14) !important;
+ border-radius: 4px;
+ --ag-background-color: #0d181a;
+ --ag-header-background-color: #1b292c;
+ --ag-foreground-color: #dce7e2;
+ --ag-header-foreground-color: #f4fbf8;
+ --ag-border-color: rgba(154, 190, 183, 0.12);
+ --ag-row-border-color: rgba(154, 190, 183, 0.12);
+ --ag-odd-row-background-color: #131f21;
+ --ag-selected-row-background-color: rgba(101, 215, 208, 0.15);
+}
+
+html[data-theme-mode="dark"][data-density="compact"] .ag-grid-tree-host {
+ --ag-row-height: 34px;
+ --ag-header-height: 40px;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-root-wrapper,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-root,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-root-wrapper-body,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-layout-normal,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-layout-auto-height,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-body,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-body-viewport,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-body-viewport-wrapper,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-center-cols-clipper,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-center-cols-viewport,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-center-cols-container,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-pinned-left-cols-container,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-pinned-right-cols-container,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-floating-bottom,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-overlay,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-overlay-wrapper {
+ background: #0d181a !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header {
+ background: #1b292c !important;
+ border-bottom: 1px solid rgba(154, 190, 183, 0.22) !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-row {
+ background: #1b292c !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell {
+ background: transparent !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-cell {
+ border-right-color: rgba(154, 190, 183, 0.055) !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-row {
+ background-color: #141f21 !important;
+ border-bottom-color: rgba(154, 190, 183, 0.09) !important;
+ transition: background-color 120ms ease, box-shadow 120ms ease;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-row:nth-child(odd) {
+ background-color: #101a1c !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-row:hover {
+ background-color: #1d2d30 !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-row.ag-row-selected,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-row.ag-row-selected:hover {
+ background-color: rgba(101, 215, 208, 0.15) !important;
+ box-shadow: inset 3px 0 0 #65d7d0;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-cell-focus,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-cell.ag-cell-focus {
+ border-color: rgba(101, 215, 208, 0.36) !important;
+ box-shadow: inset 0 0 0 1px rgba(101, 215, 208, 0.34);
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell-text {
+ color: #f4fbf8 !important;
+ font-weight: 700;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-cell,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-group-value {
+ color: #d8e4df !important;
+ font-weight: 500;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-cell a,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-cell a .cell {
+ color: #68d7cf !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-right-aligned-cell,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-right-aligned-cell .cell,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-aggregate-cell {
+ color: #eef7f4 !important;
+ font-variant-numeric: tabular-nums;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell-menu-button,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-sort-indicator-container,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-custom-icon {
+ opacity: 0.18;
+ transition: opacity 120ms ease, color 120ms ease;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell:hover .ag-header-cell-menu-button,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell:hover .ag-sort-indicator-container,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell:hover .ag-custom-icon,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell-filtered .ag-header-cell-menu-button,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell-filtered .ag-custom-icon,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell-sorted-asc .ag-sort-indicator-container,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell-sorted-desc .ag-sort-indicator-container {
+ opacity: 0.82;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell-filtered .ag-header-cell-menu-button,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell-filtered .ag-custom-icon,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell-filtered .ag-custom-icon-menu path {
+ color: #65d7d0 !important;
+ stroke: #65d7d0 !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host input[type="checkbox"],
+html[data-theme-mode="dark"] .ag-theme-alpine input[type="checkbox"] {
+ width: 18px !important;
+ height: 18px !important;
+ min-width: 18px !important;
+ min-height: 18px !important;
+ border-color: rgba(184, 209, 204, 0.52) !important;
+ border-radius: 5px !important;
+ background: #101d20 !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host input[type="checkbox"]:checked,
+html[data-theme-mode="dark"] .ag-theme-alpine input[type="checkbox"]:checked {
+ border-color: #65d7d0 !important;
+ background: #0f8f8a !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host input[type="checkbox"]::after,
+html[data-theme-mode="dark"] .ag-theme-alpine input[type="checkbox"]::after {
+ left: 5px !important;
+ top: 2px !important;
+ width: 5px !important;
+ height: 9px !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge {
+ min-height: 18px;
+ padding: 2px 8px;
+ border: 0 !important;
+ border-radius: 999px;
+ box-shadow: none !important;
+ font-size: 10.5px;
+ font-weight: 700;
+ line-height: 1.25;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="239, 68, 68"],
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="#ef4444"],
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="red"] {
+ background: rgba(239, 68, 68, 0.14) !important;
+ color: #ff8a8a !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="37, 99, 235"],
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="#2563eb"],
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="blue"] {
+ background: rgba(92, 154, 255, 0.14) !important;
+ color: #72b7ff !important;
+}
+
+html[data-theme-mode="dark"][data-density="compact"] .ag-grid-tree-host .ag-cell,
+html[data-theme-mode="dark"][data-density="compact"] .ag-grid-tree-host .ag-header-cell-text,
+html[data-theme-mode="dark"][data-density="compact"] .ag-grid-tree-host .ag-group-value {
+ font-size: 11px;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host {
+ --ag-odd-row-background-color: #0e181a;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-row {
+ background-color: #172426 !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-row:nth-child(odd) {
+ background-color: #0e181a !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-row:hover {
+ background-color: #213337 !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-sort-indicator-container {
+ display: none !important;
+}
+
+html[theme="default"] .ag-grid-tree-host .ag-sort-indicator-container,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-sort-indicator-container {
+ display: none !important;
+}
+
+html[theme="default"] .ag-grid-tree-host .ag-header-cell:not([col-id="__selection__"]) .ag-header-cell-text,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell:not([col-id="__selection__"]) .ag-header-cell-text {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+}
+
+html[theme="default"] .ag-grid-tree-host .ag-header-cell:not([col-id="__selection__"]) .ag-header-cell-text::before,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell:not([col-id="__selection__"]) .ag-header-cell-text::before {
+ content: "\2195";
+ flex: none;
+ color: rgba(53, 81, 84, 0.36);
+ font-size: 12px;
+ font-weight: 700;
+ line-height: 1;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell:not([col-id="__selection__"]) .ag-header-cell-text::before {
+ color: rgba(220, 231, 226, 0.36);
+}
+
+html[theme="default"] .ag-grid-tree-host .ag-header-cell[aria-sort="ascending"] .ag-header-cell-text::before,
+html[theme="default"] .ag-grid-tree-host .ag-header-cell.ag-header-cell-sorted-asc .ag-header-cell-text::before,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell[aria-sort="ascending"] .ag-header-cell-text::before,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell.ag-header-cell-sorted-asc .ag-header-cell-text::before {
+ content: "\2191";
+ color: currentColor;
+}
+
+html[theme="default"] .ag-grid-tree-host .ag-header-cell[aria-sort="descending"] .ag-header-cell-text::before,
+html[theme="default"] .ag-grid-tree-host .ag-header-cell.ag-header-cell-sorted-desc .ag-header-cell-text::before,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell[aria-sort="descending"] .ag-header-cell-text::before,
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-header-cell.ag-header-cell-sorted-desc .ag-header-cell-text::before {
+ content: "\2193";
+ color: currentColor;
+}
+
+html[data-theme-mode="dark"] .ag-popup,
+html[data-theme-mode="dark"] .ag-popup-child,
+html[data-theme-mode="dark"] .ag-theme-alpine .ag-popup-child,
+html[data-theme-mode="dark"] .ag-theme-alpine .ag-menu,
+html[data-theme-mode="dark"] .ag-theme-alpine .ag-filter-wrapper {
+ background: #111d20 !important;
+ border-color: rgba(154, 190, 183, 0.2) !important;
+ color: #dce7e2 !important;
+ box-shadow: 0 18px 38px rgba(0, 0, 0, 0.46) !important;
+}
+
+html[data-theme-mode="dark"] .ag-popup *,
+html[data-theme-mode="dark"] .ag-popup-child * {
+ color: inherit;
+}
+
+html[data-theme-mode="dark"] .ag-popup .ag-filter,
+html[data-theme-mode="dark"] .ag-popup-child .ag-filter,
+html[data-theme-mode="dark"] .ag-popup .ag-filter-body,
+html[data-theme-mode="dark"] .ag-popup-child .ag-filter-body,
+html[data-theme-mode="dark"] .ag-popup .ag-filter-body-wrapper,
+html[data-theme-mode="dark"] .ag-popup-child .ag-filter-body-wrapper,
+html[data-theme-mode="dark"] .ag-popup .ag-filter-condition,
+html[data-theme-mode="dark"] .ag-popup-child .ag-filter-condition,
+html[data-theme-mode="dark"] .ag-popup .ag-filter-condition-body,
+html[data-theme-mode="dark"] .ag-popup-child .ag-filter-condition-body,
+html[data-theme-mode="dark"] .ag-popup .ag-filter-apply-panel,
+html[data-theme-mode="dark"] .ag-popup-child .ag-filter-apply-panel {
+ background: transparent !important;
+ border-color: rgba(154, 190, 183, 0.14) !important;
+}
+
+html[data-theme-mode="dark"] .ag-popup .ag-picker-field-wrapper,
+html[data-theme-mode="dark"] .ag-popup-child .ag-picker-field-wrapper,
+html[data-theme-mode="dark"] .ag-popup .ag-filter-select,
+html[data-theme-mode="dark"] .ag-popup-child .ag-filter-select,
+html[data-theme-mode="dark"] .ag-popup .ag-input-wrapper,
+html[data-theme-mode="dark"] .ag-popup-child .ag-input-wrapper,
+html[data-theme-mode="dark"] .ag-popup .ag-input-field-input,
+html[data-theme-mode="dark"] .ag-popup-child .ag-input-field-input,
+html[data-theme-mode="dark"] .ag-popup input,
+html[data-theme-mode="dark"] .ag-popup-child input,
+html[data-theme-mode="dark"] .ag-popup select,
+html[data-theme-mode="dark"] .ag-popup-child select {
+ background: #1b2b2f !important;
+ border-color: rgba(154, 190, 183, 0.2) !important;
+ color: #eef7f4 !important;
+ box-shadow: none !important;
+}
+
+html[data-theme-mode="dark"] .ag-popup .ag-input-field-input::placeholder,
+html[data-theme-mode="dark"] .ag-popup-child .ag-input-field-input::placeholder,
+html[data-theme-mode="dark"] .ag-popup input::placeholder,
+html[data-theme-mode="dark"] .ag-popup-child input::placeholder {
+ color: #8ba19d !important;
+}
+
+html[data-theme-mode="dark"] .ag-popup .ag-picker-field-wrapper:focus-within,
+html[data-theme-mode="dark"] .ag-popup-child .ag-picker-field-wrapper:focus-within,
+html[data-theme-mode="dark"] .ag-popup .ag-input-field-input:focus,
+html[data-theme-mode="dark"] .ag-popup-child .ag-input-field-input:focus {
+ border-color: rgba(101, 215, 208, 0.58) !important;
+ box-shadow: 0 0 0 2px rgba(101, 215, 208, 0.12) !important;
+}
+
+html[data-theme-mode="dark"] .ag-popup .ag-menu-option:hover,
+html[data-theme-mode="dark"] .ag-popup-child .ag-menu-option:hover,
+html[data-theme-mode="dark"] .ag-popup .ag-menu-option-active,
+html[data-theme-mode="dark"] .ag-popup-child .ag-menu-option-active,
+html[data-theme-mode="dark"] .ag-popup .ag-list-item:hover,
+html[data-theme-mode="dark"] .ag-popup-child .ag-list-item:hover,
+html[data-theme-mode="dark"] .ag-popup .ag-active-item,
+html[data-theme-mode="dark"] .ag-popup-child .ag-active-item {
+ background: #213337 !important;
+ color: #f4fbf8 !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-grouping-panel,
+html[data-theme-mode="dark"] .ag-grid-tree-columns-panel,
+html[data-theme-mode="dark"] .ag-grid-tree-layouts-panel {
+ background: #111d20 !important;
+ border-color: rgba(154, 190, 183, 0.2) !important;
+ color: #dce7e2 !important;
+ box-shadow: 0 18px 38px rgba(0, 0, 0, 0.42) !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-grouping-title {
+ color: #f4fbf8 !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-grouping-section-label {
+ color: #8fa7a3 !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-grouping-panel select,
+html[data-theme-mode="dark"] .ag-grid-tree-grouping-panel input,
+html[data-theme-mode="dark"] .ag-grid-tree-grouping-panel .form-control,
+html[data-theme-mode="dark"] .ag-grid-tree-columns-panel select,
+html[data-theme-mode="dark"] .ag-grid-tree-columns-panel input,
+html[data-theme-mode="dark"] .ag-grid-tree-columns-panel .form-control,
+html[data-theme-mode="dark"] .ag-grid-tree-layouts-panel select,
+html[data-theme-mode="dark"] .ag-grid-tree-layouts-panel input,
+html[data-theme-mode="dark"] .ag-grid-tree-layouts-panel .form-control {
+ background: #1b2b2f !important;
+ border-color: rgba(154, 190, 183, 0.22) !important;
+ color: #eef7f4 !important;
+ box-shadow: none !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-grouping-panel option,
+html[data-theme-mode="dark"] .ag-grid-tree-columns-panel option,
+html[data-theme-mode="dark"] .ag-grid-tree-layouts-panel option {
+ background: #111d20 !important;
+ color: #eef7f4 !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-grouping-check,
+html[data-theme-mode="dark"] .ag-grid-tree-grouping-level-text,
+html[data-theme-mode="dark"] .ag-grid-tree-grouping-aggregate-label {
+ color: #dce7e2 !important;
+}
+
+.ag-grid-tree-columns > .btn,
+.ag-grid-tree-grouping > .btn,
+.ag-grid-tree-layouts > .btn,
+.ag-grid-value-filter-mode,
+.ag-grid-view-transfer-button {
+ min-height: 32px !important;
+ height: 32px !important;
+ padding: 5px 10px !important;
+ font-size: 12px !important;
+ line-height: 1.2 !important;
+}
+
+html[data-density="compact"] .ag-grid-tree-columns > .btn,
+html[data-density="compact"] .ag-grid-tree-grouping > .btn,
+html[data-density="compact"] .ag-grid-tree-layouts > .btn,
+html[data-density="compact"] .ag-grid-value-filter-mode,
+html[data-density="compact"] .ag-grid-view-transfer-button {
+ min-height: 32px !important;
+ height: 32px !important;
+ padding: 5px 10px !important;
+ font-size: 12px !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge {
+ box-shadow: inset 0 0 0 1px rgba(189, 231, 255, 0.16) !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="239, 68, 68"],
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="#ef4444"],
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="red"] {
+ background: rgba(239, 68, 68, 0.24) !important;
+ color: #ffb0b0 !important;
+ box-shadow: inset 0 0 0 1px rgba(255, 176, 176, 0.16) !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="37, 99, 235"],
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="#2563eb"],
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="blue"] {
+ background: rgba(92, 154, 255, 0.26) !important;
+ color: #afd2ff !important;
+ box-shadow: inset 0 0 0 1px rgba(175, 210, 255, 0.16) !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-summary-item-sum .ag-grid-summary-value {
+ color: #eef7f4 !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge {
+ box-shadow: inset 0 0 0 1px rgba(238, 247, 244, 0.13) !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="239, 68, 68"],
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="#ef4444"],
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="red"] {
+ background: rgba(239, 68, 68, 0.34) !important;
+ color: #ffc1c1 !important;
+ box-shadow: inset 0 0 0 1px rgba(255, 193, 193, 0.18) !important;
+}
+
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="37, 99, 235"],
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="#2563eb"],
+html[data-theme-mode="dark"] .ag-grid-tree-host .ag-grid-badge[style*="blue"] {
+ background: rgba(92, 154, 255, 0.34) !important;
+ color: #c3ddff !important;
+ box-shadow: inset 0 0 0 1px rgba(195, 221, 255, 0.18) !important;
+}
+
+.modal-backdrop.in {
+ opacity: 0.5;
+}
+
+.modal-dialog .modal-content {
+ background: #f8fbfa;
+ border: 1px solid #d9e6e1;
+ border-radius: 6px;
+ box-shadow: 0 20px 54px rgba(32, 54, 56, 0.18);
+ color: #24383b;
+ overflow: hidden;
+}
+
+.modal-dialog .modal-header {
+ min-height: 44px;
+ padding: 10px 16px;
+ background: #edf3f1;
+ border-bottom: 1px solid #d9e6e1;
+ color: #172b2f;
+}
+
+.modal-dialog .modal-title {
+ color: inherit;
+ font-size: 16px;
+ font-weight: 700;
+ line-height: 24px;
+}
+
+.modal-dialog .modal-title small,
+.modal-dialog .modal-header .close {
+ color: #617679;
+ opacity: 0.82;
+ text-shadow: none;
+}
+
+.modal-dialog .modal-body {
+ background: #f8fbfa;
+ color: #24383b;
+ padding: 14px 16px;
+}
+
+.modal-dialog .modal-footer {
+ background: #f8fbfa;
+ border-top: 1px solid #d9e6e1;
+ padding: 10px 16px;
+}
+
+.modal-dialog .tab-content,
+.modal-dialog .tab-pane,
+.modal-dialog .panel,
+.modal-dialog .panel-body {
+ background: transparent;
+ box-shadow: none;
+}
+
+.modal-dialog .nav-tabs {
+ background: #edf3f1;
+ border-bottom: 1px solid #d9e6e1;
+ margin: 0 0 10px;
+ padding: 0;
+}
+
+.modal-dialog .nav-tabs > li > a,
+.modal-dialog .nav-tabs > li > a:focus {
+ background: transparent;
+ border: 0;
+ border-bottom: 2px solid transparent;
+ border-radius: 0;
+ color: #6a7b7a;
+ font-size: 12px;
+ font-weight: 700;
+ line-height: 18px;
+ margin: 0;
+ padding: 8px 12px;
+}
+
+.modal-dialog .nav-tabs > li > a:hover,
+.modal-dialog .nav-tabs > li > a:focus:hover {
+ background: rgba(43, 140, 135, 0.08);
+ color: #247d7a;
+}
+
+.modal-dialog .nav-tabs > li.active > a,
+.modal-dialog .nav-tabs > li.active > a:focus,
+.modal-dialog .nav-tabs > li.active > a:hover {
+ background: transparent;
+ border: 0;
+ border-bottom: 2px solid #39c6c4;
+ color: #247d7a;
+}
+
+.modal-dialog .modal-footer .btn {
+ min-height: 32px;
+ padding: 6px 12px;
+ border-radius: 5px;
+ font-size: 12px;
+ font-weight: 700;
+ line-height: 1.2;
+}
+
+.modal-dialog .modal-footer .btn-primary {
+ background: #0f7e84;
+ border-color: #0f7e84;
+ color: #fff;
+}
+
+.modal-dialog .modal-footer .btn-default {
+ background: #fff;
+ border-color: #cfded9;
+ box-shadow: 0 2px 8px rgba(53, 81, 84, 0.08);
+ color: #355154;
+}
+
+.modal-dialog .modal-footer .btn-link {
+ color: #24383b;
+ font-weight: 700;
+}
+
+.modal-dialog .modal-footer .btn-primary:hover,
+.modal-dialog .modal-footer .btn-primary:focus {
+ background: #0d7378;
+ border-color: #0d7378;
+ color: #fff;
+}
+
+html[data-theme-mode="dark"] .modal-backdrop.in {
+ opacity: 0.68;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .modal-content {
+ background: var(--tradon-dark-bg);
+ border-color: var(--tradon-dark-line);
+ box-shadow: 0 24px 64px rgba(0, 0, 0, 0.58);
+ color: var(--tradon-dark-text);
+}
+
+html[data-theme-mode="dark"] .modal-dialog .modal-header {
+ background: linear-gradient(180deg, #111d20 0%, #0c1618 100%);
+ border-bottom-color: var(--tradon-dark-line);
+ color: var(--tradon-dark-text);
+}
+
+html[data-theme-mode="dark"] .modal-dialog .modal-title small,
+html[data-theme-mode="dark"] .modal-dialog .modal-header .close {
+ color: var(--tradon-dark-muted);
+ opacity: 0.86;
+ text-shadow: none;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .modal-body,
+html[data-theme-mode="dark"] .modal-dialog .modal-footer {
+ background: var(--tradon-dark-bg);
+ border-color: var(--tradon-dark-line);
+ color: var(--tradon-dark-text);
+}
+
+html[data-theme-mode="dark"] .modal-dialog .tab-content,
+html[data-theme-mode="dark"] .modal-dialog .tab-pane,
+html[data-theme-mode="dark"] .modal-dialog .panel,
+html[data-theme-mode="dark"] .modal-dialog .panel-body,
+html[data-theme-mode="dark"] .modal-dialog .form {
+ background: transparent !important;
+ color: var(--tradon-dark-text);
+}
+
+html[data-theme-mode="dark"] .modal-dialog .nav-tabs {
+ background: #0d1716;
+ border-bottom-color: var(--tradon-dark-line);
+}
+
+html[data-theme-mode="dark"] .modal-dialog .nav-tabs > li > a,
+html[data-theme-mode="dark"] .modal-dialog .nav-tabs > li > a:focus {
+ background: transparent;
+ color: var(--tradon-dark-muted);
+}
+
+html[data-theme-mode="dark"] .modal-dialog .nav-tabs > li > a:hover,
+html[data-theme-mode="dark"] .modal-dialog .nav-tabs > li > a:focus:hover {
+ background: rgba(101, 215, 208, 0.08);
+ color: var(--tradon-dark-accent);
+}
+
+html[data-theme-mode="dark"] .modal-dialog .nav-tabs > li.active > a,
+html[data-theme-mode="dark"] .modal-dialog .nav-tabs > li.active > a:focus,
+html[data-theme-mode="dark"] .modal-dialog .nav-tabs > li.active > a:hover {
+ background: transparent;
+ border-bottom-color: var(--tradon-dark-accent);
+ color: var(--tradon-dark-accent);
+}
+
+html[data-theme-mode="dark"] .modal-dialog .form-label,
+html[data-theme-mode="dark"] .modal-dialog .control-label,
+html[data-theme-mode="dark"] .modal-dialog label {
+ color: var(--tradon-dark-muted) !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog input.form-control:not([type="checkbox"]):not([type="radio"]),
+html[data-theme-mode="dark"] .modal-dialog select.form-control,
+html[data-theme-mode="dark"] .modal-dialog textarea.form-control,
+html[data-theme-mode="dark"] .modal-dialog .input-group > .form-control,
+html[data-theme-mode="dark"] .modal-dialog .form-control,
+html[data-theme-mode="dark"] .modal-dialog input[type="text"]:not([type="checkbox"]):not([type="radio"]),
+html[data-theme-mode="dark"] .modal-dialog input[type="number"]:not([type="checkbox"]):not([type="radio"]),
+html[data-theme-mode="dark"] .modal-dialog input[type="search"]:not([type="checkbox"]):not([type="radio"]),
+html[data-theme-mode="dark"] .modal-dialog input[type="date"]:not([type="checkbox"]):not([type="radio"]),
+html[data-theme-mode="dark"] .modal-dialog input[type="datetime-local"]:not([type="checkbox"]):not([type="radio"]),
+html[data-theme-mode="dark"] .modal-dialog select,
+html[data-theme-mode="dark"] .modal-dialog textarea {
+ background: var(--tradon-dark-field) !important;
+ border-color: var(--tradon-dark-line) !important;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.18) !important;
+ color: var(--tradon-dark-text) !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog input.form-control:focus,
+html[data-theme-mode="dark"] .modal-dialog select.form-control:focus,
+html[data-theme-mode="dark"] .modal-dialog textarea.form-control:focus,
+html[data-theme-mode="dark"] .modal-dialog .input-group > .form-control:focus {
+ background: var(--tradon-dark-field-focus) !important;
+ border-color: rgba(101, 215, 208, 0.58) !important;
+ box-shadow: 0 0 0 2px rgba(101, 215, 208, 0.12), inset 0 1px 1px rgba(0, 0, 0, 0.2) !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .modal-footer .btn.btn-default {
+ background: var(--tradon-dark-field) !important;
+ border-color: var(--tradon-dark-line) !important;
+ box-shadow: none !important;
+ color: var(--tradon-dark-text) !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .modal-footer .btn.btn-default:hover,
+html[data-theme-mode="dark"] .modal-dialog .modal-footer .btn.btn-default:focus {
+ background: var(--tradon-dark-field-focus) !important;
+ border-color: var(--tradon-dark-line-strong) !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .modal-footer .btn.btn-link {
+ color: var(--tradon-dark-text) !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .modal-footer .btn.btn-primary {
+ background: #0f7e84 !important;
+ border-color: #17a6aa !important;
+ color: #fff !important;
+}
+
+html[data-theme-mode="dark"] .modal .modal-footer .btn:not(.btn-primary),
+html[data-theme-mode="dark"] .modal-dialog .modal-footer .btn:not(.btn-primary) {
+ background: var(--tradon-dark-field) !important;
+ border-color: var(--tradon-dark-line) !important;
+ box-shadow: none !important;
+ color: var(--tradon-dark-text) !important;
+}
+
+html[data-theme-mode="dark"] .modal .modal-footer .btn:not(.btn-primary):hover,
+html[data-theme-mode="dark"] .modal .modal-footer .btn:not(.btn-primary):focus,
+html[data-theme-mode="dark"] .modal .modal-footer .btn:not(.btn-primary):active,
+html[data-theme-mode="dark"] .modal-dialog .modal-footer .btn:not(.btn-primary):hover,
+html[data-theme-mode="dark"] .modal-dialog .modal-footer .btn:not(.btn-primary):focus,
+html[data-theme-mode="dark"] .modal-dialog .modal-footer .btn:not(.btn-primary):active {
+ background: var(--tradon-dark-field-focus) !important;
+ border-color: var(--tradon-dark-line-strong) !important;
+ color: var(--tradon-dark-text) !important;
+}
+
+html[data-theme-mode="dark"] .modal .modal-footer .btn:not(.btn-primary)[disabled],
+html[data-theme-mode="dark"] .modal .modal-footer .btn:not(.btn-primary).disabled,
+html[data-theme-mode="dark"] .modal-dialog .modal-footer .btn:not(.btn-primary)[disabled],
+html[data-theme-mode="dark"] .modal-dialog .modal-footer .btn:not(.btn-primary).disabled {
+ background: #152321 !important;
+ border-color: var(--tradon-dark-line) !important;
+ color: var(--tradon-dark-faint) !important;
+ opacity: 1 !important;
+}
+
+html[data-theme-mode="dark"] .modal .modal-footer .btn:not(.btn-primary)[disabled]:hover,
+html[data-theme-mode="dark"] .modal .modal-footer .btn:not(.btn-primary).disabled:hover,
+html[data-theme-mode="dark"] .modal-dialog .modal-footer .btn:not(.btn-primary)[disabled]:hover,
+html[data-theme-mode="dark"] .modal-dialog .modal-footer .btn:not(.btn-primary).disabled:hover {
+ background: #152321 !important;
+ border-color: var(--tradon-dark-line) !important;
+ color: var(--tradon-dark-faint) !important;
+}
+
+html[data-theme-mode="dark"] .form .form-one2many-content table,
+html[data-theme-mode="dark"] .form .form-many2many-content table,
+html[data-theme-mode="dark"] .form .form-one2many-content .table,
+html[data-theme-mode="dark"] .form .form-many2many-content .table,
+html[data-theme-mode="dark"] .form .form-one2many-content .treeview,
+html[data-theme-mode="dark"] .form .form-many2many-content .treeview,
+html[data-theme-mode="dark"] .form .form-one2many-content .list-form,
+html[data-theme-mode="dark"] .form .form-many2many-content .list-form {
+ background: var(--tradon-dark-bg) !important;
+ border-color: var(--tradon-dark-line) !important;
+ color: var(--tradon-dark-text) !important;
+}
+
+html[data-theme-mode="dark"] .form .form-one2many-content table > thead,
+html[data-theme-mode="dark"] .form .form-many2many-content table > thead,
+html[data-theme-mode="dark"] .form .form-one2many-content .table > thead,
+html[data-theme-mode="dark"] .form .form-many2many-content .table > thead,
+html[data-theme-mode="dark"] .form .form-one2many-content table > thead > tr,
+html[data-theme-mode="dark"] .form .form-many2many-content table > thead > tr,
+html[data-theme-mode="dark"] .form .form-one2many-content .table > thead > tr,
+html[data-theme-mode="dark"] .form .form-many2many-content .table > thead > tr {
+ background: var(--tradon-dark-panel-header) !important;
+ color: var(--tradon-dark-text) !important;
+}
+
+html[data-theme-mode="dark"] .form .form-one2many-content table > thead > tr > th,
+html[data-theme-mode="dark"] .form .form-many2many-content table > thead > tr > th,
+html[data-theme-mode="dark"] .form .form-one2many-content table > thead > tr > td,
+html[data-theme-mode="dark"] .form .form-many2many-content table > thead > tr > td,
+html[data-theme-mode="dark"] .form .form-one2many-content .table > thead > tr > th,
+html[data-theme-mode="dark"] .form .form-many2many-content .table > thead > tr > th,
+html[data-theme-mode="dark"] .form .form-one2many-content .table > thead > tr > td,
+html[data-theme-mode="dark"] .form .form-many2many-content .table > thead > tr > td {
+ background: var(--tradon-dark-panel-header) !important;
+ border-color: var(--tradon-dark-line) !important;
+ color: var(--tradon-dark-muted) !important;
+ font-weight: 700;
+}
+
+html[data-theme-mode="dark"] .form .form-one2many-content table > tbody,
+html[data-theme-mode="dark"] .form .form-many2many-content table > tbody,
+html[data-theme-mode="dark"] .form .form-one2many-content .table > tbody,
+html[data-theme-mode="dark"] .form .form-many2many-content .table > tbody {
+ background: var(--tradon-dark-bg) !important;
+}
+
+html[data-theme-mode="dark"] .form .form-one2many-content table > tbody > tr,
+html[data-theme-mode="dark"] .form .form-many2many-content table > tbody > tr,
+html[data-theme-mode="dark"] .form .form-one2many-content .table > tbody > tr,
+html[data-theme-mode="dark"] .form .form-many2many-content .table > tbody > tr {
+ background: #0b1715 !important;
+ color: var(--tradon-dark-text) !important;
+}
+
+html[data-theme-mode="dark"] .form .form-one2many-content table > tbody > tr:nth-child(odd),
+html[data-theme-mode="dark"] .form .form-many2many-content table > tbody > tr:nth-child(odd),
+html[data-theme-mode="dark"] .form .form-one2many-content .table > tbody > tr:nth-child(odd),
+html[data-theme-mode="dark"] .form .form-many2many-content .table > tbody > tr:nth-child(odd) {
+ background: #13211f !important;
+}
+
+html[data-theme-mode="dark"] .form .form-one2many-content table > tbody > tr:hover,
+html[data-theme-mode="dark"] .form .form-many2many-content table > tbody > tr:hover,
+html[data-theme-mode="dark"] .form .form-one2many-content .table > tbody > tr:hover,
+html[data-theme-mode="dark"] .form .form-many2many-content .table > tbody > tr:hover {
+ background: #1a2b28 !important;
+}
+
+html[data-theme-mode="dark"] .form .form-one2many-content table > tbody > tr > td,
+html[data-theme-mode="dark"] .form .form-many2many-content table > tbody > tr > td,
+html[data-theme-mode="dark"] .form .form-one2many-content table > tbody > tr > th,
+html[data-theme-mode="dark"] .form .form-many2many-content table > tbody > tr > th,
+html[data-theme-mode="dark"] .form .form-one2many-content .table > tbody > tr > td,
+html[data-theme-mode="dark"] .form .form-many2many-content .table > tbody > tr > td,
+html[data-theme-mode="dark"] .form .form-one2many-content .table > tbody > tr > th,
+html[data-theme-mode="dark"] .form .form-many2many-content .table > tbody > tr > th {
+ background: transparent !important;
+ border-color: var(--tradon-dark-line) !important;
+ color: var(--tradon-dark-text) !important;
+}
+
+html[data-theme-mode="dark"] .form .form-one2many-content table input:not([type="checkbox"]):not([type="radio"]),
+html[data-theme-mode="dark"] .form .form-many2many-content table input:not([type="checkbox"]):not([type="radio"]),
+html[data-theme-mode="dark"] .form .form-one2many-content table select,
+html[data-theme-mode="dark"] .form .form-many2many-content table select,
+html[data-theme-mode="dark"] .form .form-one2many-content table textarea,
+html[data-theme-mode="dark"] .form .form-many2many-content table textarea {
+ background: var(--tradon-dark-field) !important;
+ border-color: var(--tradon-dark-line) !important;
+ color: var(--tradon-dark-text) !important;
+}
+
+html[data-theme-mode="dark"] .dropdown-menu {
+ background: #111d20 !important;
+ border-color: rgba(154, 190, 183, 0.24) !important;
+ box-shadow: 0 16px 34px rgba(0, 0, 0, 0.48) !important;
+ color: var(--tradon-dark-text) !important;
+}
+
+html[data-theme-mode="dark"] .dropdown-menu > li > a,
+html[data-theme-mode="dark"] .dropdown-menu > li > button,
+html[data-theme-mode="dark"] .dropdown-menu .dropdown-header {
+ background: transparent !important;
+ color: var(--tradon-dark-text) !important;
+}
+
+html[data-theme-mode="dark"] .dropdown-menu > li > a:hover,
+html[data-theme-mode="dark"] .dropdown-menu > li > a:focus,
+html[data-theme-mode="dark"] .dropdown-menu > li > button:hover,
+html[data-theme-mode="dark"] .dropdown-menu > li > button:focus,
+html[data-theme-mode="dark"] .dropdown-menu > .active > a,
+html[data-theme-mode="dark"] .dropdown-menu > .active > a:hover,
+html[data-theme-mode="dark"] .dropdown-menu > .active > a:focus {
+ background: rgba(43, 154, 160, 0.20) !important;
+ color: #ffffff !important;
+}
+
+html[data-theme-mode="dark"] .dropdown-menu .divider {
+ background-color: rgba(154, 190, 183, 0.14) !important;
+}
+
+html[data-theme-mode="dark"] .dropdown-menu > .disabled > a,
+html[data-theme-mode="dark"] .dropdown-menu > .disabled > a:hover,
+html[data-theme-mode="dark"] .dropdown-menu > .disabled > a:focus {
+ background: transparent !important;
+ color: var(--tradon-dark-faint) !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .treeview,
+html[data-theme-mode="dark"] .modal-dialog .treeview table,
+html[data-theme-mode="dark"] .modal-dialog .table,
+html[data-theme-mode="dark"] .modal-dialog table {
+ background: var(--tradon-dark-bg) !important;
+ border-color: var(--tradon-dark-line) !important;
+ color: var(--tradon-dark-text) !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .treeview thead,
+html[data-theme-mode="dark"] .modal-dialog .treeview thead tr,
+html[data-theme-mode="dark"] .modal-dialog .table > thead,
+html[data-theme-mode="dark"] .modal-dialog .table > thead > tr,
+html[data-theme-mode="dark"] .modal-dialog table > thead,
+html[data-theme-mode="dark"] .modal-dialog table > thead > tr {
+ background: var(--tradon-dark-panel-header) !important;
+ color: var(--tradon-dark-muted) !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .treeview th,
+html[data-theme-mode="dark"] .modal-dialog .treeview thead td,
+html[data-theme-mode="dark"] .modal-dialog .table > thead > tr > th,
+html[data-theme-mode="dark"] .modal-dialog .table > thead > tr > td,
+html[data-theme-mode="dark"] .modal-dialog table > thead > tr > th,
+html[data-theme-mode="dark"] .modal-dialog table > thead > tr > td {
+ background: var(--tradon-dark-panel-header) !important;
+ border-color: var(--tradon-dark-line) !important;
+ color: var(--tradon-dark-muted) !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .treeview tbody,
+html[data-theme-mode="dark"] .modal-dialog .table > tbody,
+html[data-theme-mode="dark"] .modal-dialog table > tbody {
+ background: var(--tradon-dark-bg) !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .treeview tbody > tr,
+html[data-theme-mode="dark"] .modal-dialog .table > tbody > tr,
+html[data-theme-mode="dark"] .modal-dialog table > tbody > tr {
+ background: #0b1715 !important;
+ color: var(--tradon-dark-text) !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .treeview tbody > tr:nth-child(odd),
+html[data-theme-mode="dark"] .modal-dialog .table > tbody > tr:nth-child(odd),
+html[data-theme-mode="dark"] .modal-dialog table > tbody > tr:nth-child(odd) {
+ background: #13211f !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .treeview tbody > tr:hover,
+html[data-theme-mode="dark"] .modal-dialog .table-hover > tbody > tr:hover,
+html[data-theme-mode="dark"] .modal-dialog .table > tbody > tr:hover,
+html[data-theme-mode="dark"] .modal-dialog table > tbody > tr:hover {
+ background: #1d3430 !important;
+ color: #f4fffd !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .treeview tbody > tr.selected,
+html[data-theme-mode="dark"] .modal-dialog .treeview tbody > tr.active,
+html[data-theme-mode="dark"] .modal-dialog .table > tbody > tr.selected,
+html[data-theme-mode="dark"] .modal-dialog .table > tbody > tr.active,
+html[data-theme-mode="dark"] .modal-dialog table > tbody > tr.selected,
+html[data-theme-mode="dark"] .modal-dialog table > tbody > tr.active {
+ background: rgba(43, 154, 160, 0.28) !important;
+ color: #ffffff !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .treeview tbody > tr > td,
+html[data-theme-mode="dark"] .modal-dialog .treeview tbody > tr > th,
+html[data-theme-mode="dark"] .modal-dialog .table > tbody > tr > td,
+html[data-theme-mode="dark"] .modal-dialog .table > tbody > tr > th,
+html[data-theme-mode="dark"] .modal-dialog table > tbody > tr > td,
+html[data-theme-mode="dark"] .modal-dialog table > tbody > tr > th {
+ background: transparent !important;
+ border-color: var(--tradon-dark-line) !important;
+ color: inherit !important;
+}
+
+html[data-theme-mode="dark"] .modal-dialog .treeview a,
+html[data-theme-mode="dark"] .modal-dialog .table a {
+ color: #74d7d0 !important;
+}
+
diff --git a/tryton-sao.js b/tryton-sao.js
index 6e345d2..3b3b126 100644
--- a/tryton-sao.js
+++ b/tryton-sao.js
@@ -474,16 +474,16 @@ var Sao = {
document.title = title.filter(function(e) {return e;}).join(' - ');
// Remplacer le texte par une image avec le bon style
- var theme_mode = document.documentElement.getAttribute(
- 'data-theme-mode') || 'light';
- var logo_src = theme_mode === 'dark' ?
- 'dist/tradon-dark.png' : 'dist/tradon.png';
+ var logo_src = 'dist/tradon_wbg.png';
+ var app_version = 'v1.2';
if (jQuery('#title').length) {
jQuery('#title').replaceWith(
- '
'
+ '
'
);
} else if (jQuery('#title-logo').length) {
- jQuery('#title-logo').attr('src', logo_src);
+ jQuery('#title-logo')
+ .attr('src', logo_src)
+ .attr('title', app_version);
}
// Ajouter un style au conteneur parent si nécessaire
@@ -896,6 +896,7 @@ var Sao = {
form.screen.views[0].table.find('> colgroup').append(column.col);
form.screen.views[0].table.find('> thead > tr').append(column.header);
form.screen.views[0].columns.push(column);
+ jQuery(document).trigger('tradon:main-menu-ready');
});
};
Sao.main_menu_screen = null;
@@ -1065,6 +1066,28 @@ var Sao = {
}
}
});
+ window.setTimeout(function() {
+ try {
+ if (window.localStorage.getItem('tradonTraceDensity') != '1') {
+ return;
+ }
+ var input = jQuery('#global-search-entry');
+ var button = jQuery('#user-favorites > button');
+ var container = jQuery('#global-search .global-search-container');
+ var menu = container.children('.dropdown-menu');
+ console.debug('[Tradon density] global search metrics', {
+ container: container.length && container[0].getBoundingClientRect(),
+ input: input.length && input[0].getBoundingClientRect(),
+ button: button.length && button[0].getBoundingClientRect(),
+ menu: menu.length && menu[0].getBoundingClientRect(),
+ inputFontSize: input.css('font-size'),
+ inputLineHeight: input.css('line-height'),
+ buttonFontSize: button.css('font-size')
+ });
+ } catch (error) {
+ console.debug('[Tradon density] trace failed', error);
+ }
+ }, 0);
},
format: function(content) {
var el = jQuery('');
@@ -6992,12 +7015,20 @@ var Sao = {
el.closest('.modal-body').css('overflow', overflow);
el.closest('.navbar-collapse.in').css('overflow-y', overflow);
el.closest('.content-box').css('overflow-y', overflow);
+ el.parents('fieldset.form-panel').css('overflow', overflow);
+ el.parents('fieldset.form-panel').children('.form-container')
+ .css('overflow', overflow);
+ el.parents('.form-container').css('overflow', overflow);
+ el.parents('.form-item, .form-widget').css('overflow', overflow);
el.parents('fieldset.form-group_').css('overflow', overflow);
Sao.common.scrollIntoViewIfNeeded(el);
};
Sao.common.InputCompletion = Sao.class_(Object, {
init: function(el, source, match_selected, format) {
+ Sao.common.InputCompletion._next_debug_id =
+ (Sao.common.InputCompletion._next_debug_id || 0) + 1;
+ this._debug_id = Sao.common.InputCompletion._next_debug_id;
if (!el.is('input')) {
el.addClass('dropdown');
this.dropdown = el;
@@ -7027,8 +7058,13 @@ var Sao = {
this.action_activated = null;
this._search_text = null;
+ this._last_values = [];
+ this._trace_completion('init');
this.input.on('input', () => {
+ this._trace_completion('input', {
+ value: this.input.val(),
+ });
window.setTimeout(this._input.bind(this), 300,
this.input.val());
});
@@ -7056,12 +7092,94 @@ var Sao = {
});
this.dropdown.on('hide.bs.dropdown', () => {
this.input.focus();
+ this.dropdown.removeClass('sao-completion-open');
+ this.dropdown.parents('.form-item, .form-widget, .tab-pane')
+ .removeClass('sao-completion-open');
+ this.dropdown.parents('fieldset.form-panel')
+ .removeClass('sao-completion-open');
+ this.dropdown.parents('fieldset.form-group_')
+ .removeClass('sao-completion-open');
Sao.common.set_overflow(this.input, 'hide');
+ this._trace_completion('hide');
});
this.dropdown.on('show.bs.dropdown', () => {
+ this.dropdown.addClass('sao-completion-open');
+ this.dropdown.parents('.form-item, .form-widget, .tab-pane')
+ .addClass('sao-completion-open');
+ this.dropdown.parents('fieldset.form-panel')
+ .addClass('sao-completion-open');
+ this.dropdown.parents('fieldset.form-group_')
+ .addClass('sao-completion-open');
Sao.common.set_overflow(this.input, 'show');
+ window.setTimeout(() => this._trace_completion('show'), 0);
});
},
+ _trace_completion: function(reason, extra) {
+ if (!window.console) {
+ return;
+ }
+ var input = this.input && this.input[0];
+ var menu = this.menu && this.menu[0];
+ var dropdown = this.dropdown && this.dropdown[0];
+ var rect = function(element) {
+ if (!element || !element.getBoundingClientRect) {
+ return null;
+ }
+ var box = element.getBoundingClientRect();
+ return {
+ left: Math.round(box.left),
+ top: Math.round(box.top),
+ width: Math.round(box.width),
+ height: Math.round(box.height),
+ bottom: Math.round(box.bottom),
+ };
+ };
+ var css_snapshot = function(element) {
+ if (!element || !window.getComputedStyle) {
+ return null;
+ }
+ var style = window.getComputedStyle(element);
+ return {
+ tag: element.tagName,
+ classes: element.className || '',
+ display: style.display,
+ position: style.position,
+ zIndex: style.zIndex,
+ overflow: style.overflow,
+ overflowX: style.overflowX,
+ overflowY: style.overflowY,
+ };
+ };
+ var ancestors = [];
+ if (input) {
+ var current = input.parentElement;
+ var count = 0;
+ while (current && count < 10) {
+ ancestors.push(css_snapshot(current));
+ current = current.parentElement;
+ count += 1;
+ }
+ }
+ var payload = jQuery.extend({
+ id: this._debug_id,
+ reason: reason,
+ fieldName: this.input && this.input.attr('name') || null,
+ value: this.input && this.input.val ? this.input.val() : null,
+ open: this.dropdown && this.dropdown.hasClass('open'),
+ completionCount: this.menu ?
+ this.menu.find('li.completion').length : null,
+ actionCount: this.menu ?
+ this.menu.find('li.action').length : null,
+ allowCreate: Boolean(this._allow_create),
+ inputRect: rect(input),
+ dropdownRect: rect(dropdown),
+ menuRect: rect(menu),
+ inputCss: css_snapshot(input),
+ dropdownCss: css_snapshot(dropdown),
+ menuCss: css_snapshot(menu),
+ ancestors: ancestors,
+ }, extra || {});
+ },
set_actions: function(action_activated, search=true, create=true) {
if (action_activated !== undefined) {
this.action_activated = action_activated;
@@ -7076,6 +7194,11 @@ var Sao = {
this.menu.find('li.action').remove();
if (jQuery.isEmptyObject(actions)) {
this.separator.hide();
+ this._trace_completion('set_actions', {
+ search: search,
+ create: create,
+ actionCount: 0,
+ });
return;
}
this.separator.show();
@@ -7096,6 +7219,11 @@ var Sao = {
})
.appendTo(this.menu);
}, this);
+ this._trace_completion('set_actions', {
+ search: search,
+ create: create,
+ actionCount: actions.length,
+ });
},
_format: function(content) {
if (this.format) {
@@ -7111,6 +7239,10 @@ var Sao = {
},
_input: function(text) {
if (text != this.input.val()) {
+ this._trace_completion('input_stale', {
+ requestedText: text,
+ currentText: this.input.val(),
+ });
return;
}
var prm;
@@ -7123,8 +7255,18 @@ var Sao = {
}
prm.then(values => {
if (text != this.input.val()) {
+ this._trace_completion('result_stale', {
+ requestedText: text,
+ currentText: this.input.val(),
+ });
return;
}
+ this._trace_completion('result', {
+ requestedText: text,
+ resultCount: values ? values.length : 0,
+ sample: (values || []).slice(0, 6).map(value =>
+ value && (value.name || value.rec_name || value)),
+ });
this._set_selection(values);
});
},
@@ -7132,6 +7274,7 @@ var Sao = {
if (values === undefined) {
values = [];
}
+ this._last_values = values.slice ? values.slice() : values;
this.menu.find('li.completion').remove();
values.reverse().forEach(function(value) {
jQuery('', {
@@ -7150,13 +7293,25 @@ var Sao = {
if (!this.input.val() || (
!this.menu.find('li.completion').length &&
!this.menu.find('li.action').length)) {
+ this._trace_completion('close_decision', {
+ reasonDetail: !this.input.val() ?
+ 'empty_input' : 'no_completion_or_action',
+ valueCount: values.length,
+ });
if (this.dropdown.hasClass('open')) {
this.menu.dropdown('toggle');
}
} else {
+ this._trace_completion('open_decision', {
+ valueCount: values.length,
+ completionCount: this.menu.find('li.completion').length,
+ actionCount: this.menu.find('li.action').length,
+ });
if (!this.dropdown.hasClass('open')) {
this.menu.dropdown('toggle');
}
+ window.setTimeout(() =>
+ this._trace_completion('after_open_decision'), 0);
}
}
});
@@ -7178,7 +7333,16 @@ var Sao = {
Sao.common.update_completion = function(
entry, record, field, model, domain) {
var search_text = entry.val();
+ var trace = function(reason, extra) {
+ if (!window.console) {
+ return;
+ }
+ };
if (!search_text || !model) {
+ trace('skip', {
+ hasText: Boolean(search_text),
+ hasModel: Boolean(model),
+ });
return jQuery.when();
}
if (domain === undefined) {
@@ -7188,12 +7352,18 @@ var Sao = {
var order = field.get_search_order(record);
var sao_model = new Sao.Model(model);
+ trace('request', {
+ domain: domain,
+ context: context,
+ order: order,
+ limit: Sao.config.limit,
+ });
return sao_model.execute(
'autocomplete',
[search_text, domain, Sao.config.limit, order], context)
.then(
function(result) {
- return result.filter((value) => {
+ var filtered = result.filter((value) => {
return value.id || entry.completion._allow_create;
}).map((value) => {
if (value.id === null) {
@@ -7202,8 +7372,19 @@ var Sao = {
}
return value;
});
+ trace('response', {
+ rawCount: result ? result.length : 0,
+ filteredCount: filtered.length,
+ allowCreate: Boolean(entry.completion._allow_create),
+ sample: filtered.slice(0, 6).map(value =>
+ value && (value.name || value.rec_name || value)),
+ });
+ return filtered;
},
- function() {
+ function(error) {
+ trace('error', {
+ error: error && (error.message || String(error)) || null,
+ });
Sao.Logger.warn(
"Unable to search for completion of %s", model);
});
@@ -14882,8 +15063,6 @@ var Sao = {
};
Sao.View.parse = function(screen, view_id, type, xml, children_field) {
- console.log('typeof xml:', typeof xml);
- console.log('xml:', xml);
switch (type) {
case 'tree':
if (Sao.View.get_tree_view) {
@@ -15057,6 +15236,8 @@ function eval_pyson(value){
availableWidgets: Object.keys(
Sao.View.FormXMLViewParser.WIDGETS).sort(),
});
+ attributes.widget = 'char';
+ WidgetFactory = Sao.View.FormXMLViewParser.WIDGETS.char;
}
var widget = new WidgetFactory(this.view, attributes);
if (!this.view.widgets[name]) {
@@ -17757,12 +17938,16 @@ function eval_pyson(value){
},
_sync_icon_padding: function() {
var rtl = jQuery('html').attr('dir') == 'rtl';
+ var compact_density = document.documentElement.getAttribute(
+ 'data-density') == 'compact';
+ var icon_padding = compact_density ? '25px' : '33px';
+ var empty_padding = compact_density ? '6px' : '12px';
var primary_visible = this.but_primary.parent().css('display') !=
'none';
var secondary_visible = this.but_secondary.parent().css('display') !=
'none';
- var start_padding = primary_visible ? '33px' : '12px';
- var end_padding = secondary_visible ? '33px' : '12px';
+ var start_padding = primary_visible ? icon_padding : empty_padding;
+ var end_padding = secondary_visible ? icon_padding : empty_padding;
this.entry.css({
'padding-left': rtl ? end_padding : start_padding,
'padding-right': rtl ? start_padding : end_padding,
@@ -20033,6 +20218,505 @@ function eval_pyson(value){
}
});
+ Sao.View.Form.RichGraph = Sao.class_(Sao.View.Form.Widget, {
+ class_: 'form-rich-graph',
+ expand: true,
+ init: function(view, attributes) {
+ Sao.View.Form.RichGraph._super.init.call(this, view, attributes);
+ this.series_visibility = {};
+ this.active_range = attributes.default_range || 'ALL';
+ this.range_options = ['5D', '1M', '3M', '6M', '1Y', '5Y', 'ALL'];
+ this.el = jQuery('', {
+ 'class': this.class_
+ });
+ var header = jQuery('', {
+ 'class': this.class_ + '-header'
+ }).appendTo(this.el);
+ this.title = jQuery('', {
+ 'class': this.class_ + '-title'
+ }).appendTo(header);
+ this.meta = jQuery('', {
+ 'class': this.class_ + '-meta'
+ }).appendTo(header);
+ this.ranges = jQuery('', {
+ 'class': this.class_ + '-ranges'
+ }).appendTo(header);
+ for (const range of this.range_options) {
+ jQuery(' ', {
+ type: 'button',
+ 'class': this.class_ + '-range',
+ text: range
+ }).toggleClass('active', range == this.active_range)
+ .on('click', () => {
+ this.active_range = range;
+ this.ranges.children().removeClass('active');
+ this.ranges.children().filter(function() {
+ return jQuery(this).text() == range;
+ }).addClass('active');
+ this._render(this._records());
+ }).appendTo(this.ranges);
+ }
+ this.stage = jQuery('', {
+ 'class': this.class_ + '-stage'
+ }).appendTo(this.el);
+ this.svg = jQuery(document.createElementNS(
+ 'http://www.w3.org/2000/svg', 'svg'));
+ this.svg.attr({
+ 'class': this.class_ + '-svg',
+ 'role': 'img'
+ }).appendTo(this.stage);
+ this.tooltip = jQuery('', {
+ 'class': this.class_ + '-tooltip'
+ }).appendTo(this.stage).hide();
+ this.legend = jQuery('', {
+ 'class': this.class_ + '-legend'
+ }).appendTo(this.el);
+ },
+ display: function() {
+ Sao.View.Form.RichGraph._super.display.call(this);
+ var source_field = this._source_field();
+ var source_prm = jQuery.when();
+ if (source_field && this.record &&
+ this.record.model.fields[source_field]) {
+ source_prm = this.record.load(source_field);
+ }
+ source_prm.always(() => {
+ var records = this._records();
+ var fields = this._fields_to_load();
+ var prms = [];
+ for (const record of records) {
+ for (const field of fields) {
+ if (record.model.fields[field]) {
+ prms.push(record.load(field));
+ }
+ }
+ }
+ jQuery.when.apply(jQuery, prms).always(() => {
+ this._render(records);
+ });
+ });
+ },
+ _split: function(value) {
+ if (!value) {
+ return [];
+ }
+ return String(value).split(',').map(function(item) {
+ return item.trim();
+ }).filter(Boolean);
+ },
+ _map: function(value) {
+ var result = {};
+ for (const item of this._split(value)) {
+ var pos = item.indexOf(':');
+ if (pos > -1) {
+ result[item.slice(0, pos).trim()] = item.slice(pos + 1).trim();
+ }
+ }
+ return result;
+ },
+ _records: function() {
+ var source_field = this._source_field();
+ if (source_field && this.record &&
+ this.record.model.fields[source_field]) {
+ var related = this.record.field_get_client(source_field) || [];
+ var related_records = [];
+ for (const record of related) {
+ related_records.push(record);
+ }
+ return related_records;
+ }
+ var records = [];
+ var group = this.view.screen.group || [];
+ for (const record of group) {
+ records.push(record);
+ }
+ if (!records.length && this.record) {
+ records.push(this.record);
+ }
+ return records;
+ },
+ _source_field: function() {
+ return this.attributes.records_field || this.attributes.data_field ||
+ this.attributes.source_field;
+ },
+ _series_names: function() {
+ var names = [this.attributes.name].concat(
+ this._split(this.attributes.series));
+ var seen = {};
+ return names.filter(function(name) {
+ if (!name || seen[name]) {
+ return false;
+ }
+ seen[name] = true;
+ return true;
+ });
+ },
+ _date_field: function() {
+ return this.attributes.date_field || this.attributes.x_field ||
+ this.attributes.date || 'date';
+ },
+ _fields_to_load: function() {
+ return [this._date_field()].concat(this._series_names());
+ },
+ _number: function(value) {
+ if ((value === null) || (value === undefined) || (value === '')) {
+ return null;
+ }
+ value = Number(value);
+ if (isNaN(value)) {
+ return null;
+ }
+ return value;
+ },
+ _svg_el: function(tag, attrs) {
+ var el = document.createElementNS('http://www.w3.org/2000/svg', tag);
+ for (const name in attrs) {
+ if (attrs[name] === null || attrs[name] === undefined) {
+ continue;
+ }
+ if (name == 'text') {
+ el.textContent = attrs[name];
+ } else {
+ el.setAttribute(name, attrs[name]);
+ }
+ }
+ return jQuery(el);
+ },
+ _x_value: function(record, field_name, index) {
+ var field = record.model.fields[field_name];
+ if (!field) {
+ return index;
+ }
+ var value = field.get(record);
+ if (value && (value.isDate || value.isDateTime)) {
+ value = value.valueOf ? value.valueOf() : Date.parse(value.toString());
+ } else if (value instanceof Date) {
+ value = value.getTime();
+ } else if (typeof value == 'string') {
+ var parsed = Date.parse(value);
+ value = isNaN(parsed) ? index : parsed;
+ }
+ return this._number(value) === null ? index : Number(value);
+ },
+ _is_time_x: function(value) {
+ var date_field = this._date_field();
+ var model = this.view.screen && this.view.screen.model;
+ var field = model && model.fields[date_field];
+ var type = field && field.description.type;
+ return (type == 'date') || (type == 'datetime') ||
+ Math.abs(Number(value)) > 100000000000;
+ },
+ _label_for: function(name, labels, records) {
+ if (labels[name]) {
+ return labels[name];
+ }
+ var model = records && records.length ? records[0].model :
+ this.view.screen.model;
+ var field = model.fields[name];
+ return field && field.description.string || name;
+ },
+ _color_for: function(name, index, colors) {
+ var palette = ['#00b894', '#8b5cf6', '#f59f00', '#e03131',
+ '#228be6', '#15aabf', '#f06595', '#868e96'];
+ return colors[name] || palette[index % palette.length];
+ },
+ _collect: function(records) {
+ var date_field = this._date_field();
+ var labels = this._map(this.attributes.labels);
+ var colors = this._map(this.attributes.colors);
+ var hidden = this._split(this.attributes.hidden_series);
+ var dashed = this._split(this.attributes.dashed_series);
+ var series = [];
+ var names = this._series_names();
+ for (var s = 0; s < names.length; s++) {
+ var name = names[s];
+ if (!(name in this.series_visibility)) {
+ this.series_visibility[name] = hidden.indexOf(name) < 0;
+ }
+ series.push({
+ name: name,
+ label: this._label_for(name, labels, records),
+ color: this._color_for(name, s, colors),
+ dashed: dashed.indexOf(name) >= 0,
+ visible: this.series_visibility[name],
+ values: []
+ });
+ }
+ for (var i = 0; i < records.length; i++) {
+ var record = records[i];
+ var x = this._x_value(record, date_field, i);
+ for (const serie of series) {
+ var field = record.model.fields[serie.name];
+ var value = field ? this._number(field.get(record)) : null;
+ if (value !== null) {
+ serie.values.push({x: x, y: value, record: record});
+ }
+ }
+ }
+ for (const serie of series) {
+ serie.values.sort(function(a, b) {
+ return a.x - b.x;
+ });
+ }
+ return series;
+ },
+ _format_x: function(value) {
+ var date_field = this._date_field();
+ var field = this.view.screen.model.fields[date_field];
+ var type = field && field.description.type;
+ if ((type == 'date') || (type == 'datetime') || this._is_time_x(value)) {
+ var format = Sao.common.date_format(
+ this.view.screen.context.date_format);
+ if (type == 'datetime') {
+ return Sao.common.format_datetime(format + ' %X',
+ moment(value));
+ }
+ return Sao.common.format_date(format, moment(value));
+ }
+ return String(value);
+ },
+ _format_x_tick: function(value, min_x, max_x) {
+ if (!this._is_time_x(value)) {
+ return String(Math.round(value));
+ }
+ var span = max_x - min_x;
+ var date = moment(value);
+ if (span <= 1000 * 60 * 60 * 24 * 2) {
+ return date.format('DD/MM HH:mm');
+ }
+ if (span <= 1000 * 60 * 60 * 24 * 120) {
+ return date.format('DD/MM/YY');
+ }
+ return date.format('MMM YY');
+ },
+ _range_cutoff: function(max_x) {
+ if (!this._is_time_x(max_x) || this.active_range == 'ALL') {
+ return null;
+ }
+ var day = 1000 * 60 * 60 * 24;
+ var spans = {
+ '5D': 5 * day,
+ '1M': 31 * day,
+ '3M': 93 * day,
+ '6M': 186 * day,
+ '1Y': 366 * day,
+ '5Y': 366 * 5 * day
+ };
+ return spans[this.active_range] ? max_x - spans[this.active_range] : null;
+ },
+ _filter_visible_series: function(series) {
+ var visible = series.filter(function(serie) {
+ return serie.visible && serie.values.length;
+ });
+ if (!visible.length) {
+ return visible;
+ }
+ var xs = [];
+ for (const serie of visible) {
+ for (const point of serie.values) {
+ xs.push(point.x);
+ }
+ }
+ var cutoff = this._range_cutoff(Math.max.apply(null, xs));
+ if (cutoff === null) {
+ return visible;
+ }
+ return visible.map(function(serie) {
+ var copy = Object.assign({}, serie);
+ copy.values = serie.values.filter(function(point) {
+ return point.x >= cutoff;
+ });
+ return copy;
+ }).filter(function(serie) {
+ return serie.values.length;
+ });
+ },
+ _format_y: function(value) {
+ return Number(value).toLocaleString(
+ Sao.i18n.BC47(Sao.i18n.getlang()), {
+ maximumFractionDigits: Number(this.attributes.digits || 6)
+ });
+ },
+ _render: function(records) {
+ var height = parseInt(this.attributes.height || 320, 10);
+ var width = Math.max(320, this.stage.width() || this.el.width() || 640);
+ this.stage.css('height', height + 'px');
+ this.svg.attr('viewBox', '0 0 ' + width + ' ' + height);
+ this.svg.empty();
+ this.tooltip.hide();
+ this.title.text(this.attributes.string || this.attributes.label ||
+ this._label_for(this.attributes.name, {}));
+
+ var series = this._collect(records);
+ this.legend.empty();
+ var visible = this._filter_visible_series(series);
+ if (!visible.length) {
+ this.meta.text(Sao.i18n.gettext('No data'));
+ return;
+ }
+ this.meta.text(records.length + ' ' + Sao.i18n.gettext('records'));
+
+ var margin = {top: 42, right: 16, bottom: 34, left: 52};
+ var plot_width = width - margin.left - margin.right;
+ var plot_height = height - margin.top - margin.bottom;
+ var xs = [], ys = [];
+ for (const serie of visible) {
+ for (const point of serie.values) {
+ xs.push(point.x);
+ ys.push(point.y);
+ }
+ }
+ var min_x = Math.min.apply(null, xs);
+ var max_x = Math.max.apply(null, xs);
+ var min_y = Math.min.apply(null, ys);
+ var max_y = Math.max.apply(null, ys);
+ if (min_x == max_x) {
+ min_x -= 1;
+ max_x += 1;
+ }
+ if (min_y == max_y) {
+ min_y -= 1;
+ max_y += 1;
+ }
+ var y_pad = (max_y - min_y) * 0.08;
+ min_y -= y_pad;
+ max_y += y_pad;
+ var xscale = x => margin.left + ((x - min_x) / (max_x - min_x)) *
+ plot_width;
+ var yscale = y => margin.top + plot_height -
+ ((y - min_y) / (max_y - min_y)) * plot_height;
+ var svg = this.svg;
+ var line = function(points) {
+ return points.map(function(point, index) {
+ return (index ? 'L' : 'M') + xscale(point.x) + ' ' +
+ yscale(point.y);
+ }).join(' ');
+ };
+ for (var g = 0; g <= 4; g++) {
+ var y = margin.top + (plot_height / 4) * g;
+ this._svg_el('line', {
+ x1: margin.left,
+ x2: width - margin.right,
+ y1: y,
+ y2: y,
+ 'class': this.class_ + '-grid-line'
+ }).appendTo(svg);
+ var value = max_y - ((max_y - min_y) / 4) * g;
+ this._svg_el('text', {
+ x: margin.left - 8,
+ y: y + 4,
+ 'class': this.class_ + '-axis-label',
+ text: this._format_y(value)
+ }).appendTo(svg);
+ }
+ for (var t = 0; t <= 5; t++) {
+ var xvalue = min_x + ((max_x - min_x) / 5) * t;
+ var x = xscale(xvalue);
+ this._svg_el('line', {
+ x1: x,
+ x2: x,
+ y1: margin.top,
+ y2: height - margin.bottom,
+ 'class': this.class_ + '-grid-line'
+ }).appendTo(svg);
+ this._svg_el('text', {
+ x: x,
+ y: height - 10,
+ 'class': this.class_ + '-x-label',
+ text: this._format_x_tick(xvalue, min_x, max_x)
+ }).appendTo(svg);
+ }
+ this._render_svg_legend(series, margin.left, 18);
+ for (const serie of visible) {
+ this._svg_el('path', {
+ d: line(serie.values),
+ 'class': this.class_ + '-line',
+ stroke: serie.color,
+ 'stroke-dasharray': serie.dashed ? '7 5' : null
+ }).appendTo(svg);
+ if (this.attributes.points != '0') {
+ for (const point of serie.values) {
+ this._svg_el('circle', {
+ cx: xscale(point.x),
+ cy: yscale(point.y),
+ r: 3.2,
+ fill: serie.color,
+ 'class': this.class_ + '-point'
+ }).data('point', {
+ serie: serie,
+ point: point
+ }).appendTo(svg);
+ this._svg_el('circle', {
+ cx: xscale(point.x),
+ cy: yscale(point.y),
+ r: 10,
+ fill: 'transparent',
+ 'class': this.class_ + '-hit'
+ }).data('point', {
+ serie: serie,
+ point: point
+ }).appendTo(svg);
+ }
+ }
+ }
+ this._bind_tooltip();
+ },
+ _render_svg_legend: function(series, x, y) {
+ var cursor = x;
+ for (const serie of series) {
+ var group = this._svg_el('g', {
+ 'class': this.class_ + '-legend-svg-item',
+ transform: 'translate(' + cursor + ',' + y + ')',
+ opacity: serie.visible ? 1 : 0.36
+ }).appendTo(this.svg);
+ this._svg_el('line', {
+ x1: 0,
+ x2: 18,
+ y1: 0,
+ y2: 0,
+ stroke: serie.color,
+ 'stroke-width': 3,
+ 'stroke-linecap': 'round'
+ }).appendTo(group);
+ this._svg_el('text', {
+ x: 24,
+ y: 4,
+ fill: serie.color,
+ text: serie.label
+ }).appendTo(group);
+ group.css('cursor', 'pointer').on('click', () => {
+ this.series_visibility[serie.name] = !serie.visible;
+ this._render(this._records());
+ });
+ cursor += Math.min(180, 44 + (serie.label || '').length * 7);
+ }
+ },
+ _bind_tooltip: function() {
+ var tooltip = this.tooltip;
+ var format_x = this._format_x.bind(this);
+ var format_y = this._format_y.bind(this);
+ this.svg.find('.' + this.class_ + '-point, .' + this.class_ + '-hit')
+ .on('mouseenter', function() {
+ var data = jQuery(this).data('point');
+ tooltip.html(
+ '' + data.serie.label + '
' + + format_x(data.point.x) + '
' + + format_y(data.point.y)); + tooltip.show(); + }) + .on('mousemove', function(event) { + var stage = tooltip.parent().offset(); + tooltip.css({ + left: event.pageX - stage.left + 12, + top: event.pageY - stage.top + 12 + }); + }) + .on('mouseleave', function() { + tooltip.hide(); + }); + } + }); + Sao.View.ToleranceGaugeMixin = { _number: function(value) { if ((value === null) || (value === undefined) || (value === '')) { @@ -20944,6 +21628,45 @@ function eval_pyson(value){ this.container = jQuery('', { 'class': 'panel-body htmlviewer-content', }).appendTo(this.el); + if (window.MutationObserver) { + this._theme_observer = new MutationObserver(mutations => { + var changed = mutations.some(mutation => + mutation.attributeName == 'data-theme-mode'); + if (!changed) { + return; + } + this._sync_theme_classes(); + if (!document.documentElement.contains(this.el[0])) { + this._theme_observer.disconnect(); + this._theme_observer = null; + return; + } + this.container.find('iframe[data-htmlviewer-dashboard="1"]') + .each(function() { + Sao.applyHTMLViewerThemeToIFrame(this); + }); + if (!String(this._last_value || '').startsWith('d3:')) { + return; + } + window.requestAnimationFrame(() => this.display()); + }); + this._theme_observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['data-theme-mode'], + }); + } + }, + + _sync_theme_classes: function() { + var theme_mode = document.documentElement.getAttribute( + 'data-theme-mode') || ''; + var is_dark = theme_mode == 'dark'; + this.container + .toggleClass('htmlviewer-theme-dark', is_dark) + .toggleClass('htmlviewer-theme-light', !is_dark); + this.el + .toggleClass('htmlviewer-theme-dark', is_dark) + .toggleClass('htmlviewer-theme-light', !is_dark); }, display: function() { @@ -20954,15 +21677,18 @@ function eval_pyson(value){ if (record) { value = record.field_get_client(this.field_name); } - console.log("HTMLViewer",this.field_name) - console.log("Value from display",value) - console.log("Last Value from display",this._last_value) + this._sync_theme_classes(); + var theme_mode = document.documentElement.getAttribute( + 'data-theme-mode') || ''; + var render_key = String(value || '').startsWith('d3:') ? + value + '|theme:' + theme_mode : value; // Si la valeur n'a pas changé, ne rien faire - if (this._last_value === value) { + if (this._last_render_key === render_key) { return; } this._last_value = value; + this._last_render_key = render_key; this.container.empty(); // if (!value) { @@ -21106,14 +21832,594 @@ function eval_pyson(value){ // } // }); + Sao.traceHTMLViewerTheme = function(stage, payload) { + if (!window.console) { + return; + } + var storage_theme = null; + try { + storage_theme = window.localStorage && + localStorage.getItem('sao_theme_mode'); + } catch (error) { + storage_theme = 'unavailable:' + (error && error.name || 'error'); + } + try { + console.info('[HTMLVIEWER][THEME_DEBUG]', JSON.stringify( + jQuery.extend({ + stage: stage, + href: window.location.href, + parentTheme: document.documentElement.getAttribute( + 'data-theme-mode') || null, + storageTheme: storage_theme, + }, payload || {}))); + } catch (error) { + console.info('[HTMLVIEWER][THEME_DEBUG]', stage, payload); + } + }; + + Sao.htmlViewerThemeMode = function() { + return document.documentElement.getAttribute('data-theme-mode') || 'light'; + }; + + Sao.isHTMLViewerDashboardURL = function(value) { + return /\/dashboard\/index\.html(?:[?#]|$)/i.test(String(value || '')); + }; + + Sao.shouldRewriteHTMLViewerDashboardOrigin = function(url) { + if (!url || url.origin == window.location.origin) { + return false; + } + var current_host = window.location.hostname || ''; + var dashboard_host = url.hostname || ''; + return /(^|\.)open-squared\.tech$/i.test(current_host) && + /(^|\.)open-squared\.tech$/i.test(dashboard_host); + }; + + Sao.withHTMLViewerThemeParam = function(value) { + var is_dashboard = Sao.isHTMLViewerDashboardURL(value); + if (!is_dashboard) { + Sao.traceHTMLViewerTheme('with-param-skip', { + value: value, + reason: 'not-dashboard-url', + }); + return value; + } + try { + var url = new URL(value, window.location.href); + var input_origin = url.origin; + if (Sao.shouldRewriteHTMLViewerDashboardOrigin(url)) { + url.protocol = window.location.protocol; + url.host = window.location.host; + Sao.traceHTMLViewerTheme('origin-rewrite', { + input: value, + fromOrigin: input_origin, + toOrigin: url.origin, + currentOrigin: window.location.origin, + }); + } + var mode = Sao.htmlViewerThemeMode(); + url.searchParams.set('theme', mode); + url.searchParams.set('theme_mode', mode); + Sao.traceHTMLViewerTheme('with-param', { + input: value, + output: url.toString(), + mode: mode, + urlOrigin: url.origin, + urlPathname: url.pathname, + sameOrigin: url.origin == window.location.origin, + themeParam: url.searchParams.get('theme'), + themeModeParam: url.searchParams.get('theme_mode'), + }); + return url.toString(); + } catch (e) { + var separator = value.indexOf('?') == -1 ? '?' : '&'; + var mode = encodeURIComponent(Sao.htmlViewerThemeMode()); + var output = value + separator + 'theme=' + mode + + '&theme_mode=' + mode; + Sao.traceHTMLViewerTheme('with-param-fallback', { + input: value, + output: output, + mode: mode, + error: e && (e.name + ': ' + e.message), + }); + return output; + } + }; + + Sao.applyHTMLViewerThemeToIFrame = function(iframe) { + var mode = Sao.htmlViewerThemeMode(); + var dashboard = iframe.getAttribute('data-htmlviewer-dashboard') == '1'; + Sao.traceHTMLViewerTheme('apply-start', { + dashboard: dashboard, + mode: mode, + src: iframe.getAttribute('src') || '', + originalSrc: iframe.getAttribute('data-original-src') || '', + }); + if (!dashboard) { + return; + } + var next_src = Sao.withHTMLViewerThemeParam( + iframe.getAttribute('data-original-src') || iframe.getAttribute('src') || ''); + if (next_src && iframe.getAttribute('src') != next_src) { + Sao.traceHTMLViewerTheme('apply-src-update', { + previousSrc: iframe.getAttribute('src') || '', + nextSrc: next_src, + }); + iframe.setAttribute('src', next_src); + } + try { + var doc = iframe.contentDocument || iframe.contentWindow.document; + if (!doc || !doc.documentElement) { + Sao.traceHTMLViewerTheme('apply-no-document', { + src: iframe.getAttribute('src') || '', + }); + return; + } + var existing_style = doc.getElementById( + 'tradon-htmlviewer-theme-bridge'); + Sao.traceHTMLViewerTheme('apply-document-access', { + src: iframe.getAttribute('src') || '', + readyState: doc.readyState, + docUrl: doc.location && doc.location.href || null, + docThemeBefore: doc.documentElement.getAttribute( + 'data-theme-mode') || null, + bodyThemeBefore: doc.body && + doc.body.getAttribute('data-theme-mode') || null, + hasHead: Boolean(doc.head), + hasBody: Boolean(doc.body), + bridgeBefore: Boolean(existing_style), + }); + doc.documentElement.setAttribute('data-theme-mode', mode); + doc.body && doc.body.setAttribute('data-theme-mode', mode); + var style = doc.getElementById('tradon-htmlviewer-theme-bridge'); + if (!style) { + style = doc.createElement('style'); + style.id = 'tradon-htmlviewer-theme-bridge'; + doc.head.appendChild(style); + } + var dashboard_logo_url = new URL( + 'dist/tradon_wbg.png', window.location.href).toString(); + var compact_dashboard_css = ` + :root { + --tradon-dashboard-card-radius: 6px; + font-size: 14px !important; + } + body { + font-size: 0.9rem !important; + } + #root > [class*="min-h-screen"], + #app > [class*="min-h-screen"], + body > [class*="min-h-screen"] { + padding: 0.75rem !important; + } + [class*="container"], [class*="max-w-"] { + padding-left: 0.6rem !important; + padding-right: 0.6rem !important; + } + [class*="grid"][class*="gap-6"], + [class*="grid"][class*="gap-5"], + [class*="grid"][class*="gap-4"] { + gap: 0.7rem !important; + } + [class*="gap-6"], [class*="gap-5"], [class*="gap-4"] { + gap: 0.7rem !important; + } + [class*="gap-3"], [class*="gap-2"] { + gap: 0.4rem !important; + } + [class*="p-8"], [class*="p-7"], [class*="p-6"] { + padding: 0.75rem !important; + } + [class*="p-5"], [class*="p-4"] { + padding: 0.65rem !important; + } + [class*="px-6"], [class*="px-5"], [class*="px-4"] { + padding-left: 0.7rem !important; + padding-right: 0.7rem !important; + } + [class*="py-6"], [class*="py-5"], [class*="py-4"] { + padding-top: 0.55rem !important; + padding-bottom: 0.55rem !important; + } + [class*="mb-8"], [class*="mb-7"], [class*="mb-6"] { + margin-bottom: 0.75rem !important; + } + [class*="mt-8"], [class*="mt-7"], [class*="mt-6"] { + margin-top: 0.75rem !important; + } + [class*="space-y-6"] > :not([hidden]) ~ :not([hidden]), + [class*="space-y-5"] > :not([hidden]) ~ :not([hidden]), + [class*="space-y-4"] > :not([hidden]) ~ :not([hidden]) { + margin-top: 0.7rem !important; + } + [class*="bg-white"], [class*="card"], [class*="Card"], + section, article { + border-radius: var(--tradon-dashboard-card-radius) !important; + min-height: 0 !important; + } + [class*="rounded-2xl"], [class*="rounded-xl"], [class*="rounded-lg"] { + border-radius: var(--tradon-dashboard-card-radius) !important; + } + [class*="shadow-lg"], [class*="shadow-xl"], [class*="shadow-md"] { + box-shadow: 0 3px 8px rgba(15, 23, 42, 0.12) !important; + } + [class*="text-6xl"], [class*="text-5xl"] { + font-size: 1.75rem !important; + line-height: 2rem !important; + } + [class*="text-4xl"] { + font-size: 1.55rem !important; + line-height: 1.85rem !important; + } + [class*="text-3xl"] { + font-size: 1.3rem !important; + line-height: 1.6rem !important; + } + [class*="text-2xl"] { + font-size: 1.1rem !important; + line-height: 1.35rem !important; + } + [class*="text-xl"] { + font-size: 1rem !important; + line-height: 1.25rem !important; + } + [class*="text-lg"] { + font-size: 0.95rem !important; + line-height: 1.2rem !important; + } + [class*="w-12"][class*="h-12"], + [class*="w-10"][class*="h-10"], + [class*="w-8"][class*="h-8"] { + width: 1.35rem !important; + height: 1.35rem !important; + } + [class*="w-6"][class*="h-6"], + [class*="w-5"][class*="h-5"] { + width: 1rem !important; + height: 1rem !important; + } + svg { + max-width: 1.35rem !important; + max-height: 1.35rem !important; + } + [class*="h-3"], [class*="h-4"] { + min-height: 0 !important; + } + canvas, [class*="chart"], [class*="Chart"], [class*="recharts"] { + max-height: 150px !important; + } + `; + var dark_dashboard_css = ` + :root { color-scheme: dark; } + html { + font-size: 14px !important; + } + body { + font-size: 0.9rem !important; + } + #root > [class*="min-h-screen"], + #app > [class*="min-h-screen"], + body > [class*="min-h-screen"] { + padding: 0.75rem !important; + } + [class*="grid"][class*="gap-4"] { + gap: 0.7rem !important; + } + [class*="p-6"] { + padding: 0.75rem !important; + } + [class*="p-4"] { + padding: 0.65rem !important; + } + [class*="mb-6"] { + margin-bottom: 0.75rem !important; + } + [class*="gap-2"] { + gap: 0.4rem !important; + } + [class*="text-4xl"] { + font-size: 1.55rem !important; + line-height: 1.85rem !important; + } + html, body, #root, #app, [id*="root"], [class*="app"] { + background: #000000 !important; + color: #eaf7f4 !important; + } + body { + scrollbar-color: #31534e #000000; + } + body > div, #root, #app, + #root > div, #app > div, + #root > div > div, #app > div > div, + main, + [class*="min-h-screen"], [class*="dashboard"], [class*="Dashboard"] { + background-color: #000000 !important; + } + [class*="bg-gray-50"], [class*="bg-slate-50"], + [class*="bg-neutral-50"], [class*="bg-zinc-50"], + [class*="bg-gray-100"], [class*="bg-slate-100"], + [class*="bg-neutral-100"], [class*="bg-zinc-100"] { + background: #000000 !important; + } + [class*="bg-white"], [class*="card"], + [class*="Card"], section, article { + background: linear-gradient(180deg, #142326 0%, #101d20 100%) !important; + border-color: rgba(118, 173, 165, 0.22) !important; + color: #eaf7f4 !important; + box-shadow: 0 10px 24px rgba(0, 0, 0, 0.28), inset 0 1px 0 rgba(255, 255, 255, 0.035) !important; + } + [class*="text-gray"], [class*="text-slate"], [class*="text-neutral"], + [class*="text-zinc"] { + color: #c3d4cf !important; + } + [class*="text-gray-400"], [class*="text-gray-500"], + [class*="text-slate-400"], [class*="text-slate-500"], + [class*="text-neutral-400"], [class*="text-neutral-500"] { + color: #a9c1bb !important; + } + h1, h2, h3, h4, h5, h6, + [class*="font-semibold"], [class*="font-bold"] { + color: #f4fbf8 !important; + } + svg, svg * { + color: #a9e3dd !important; + stroke: currentColor !important; + } + svg { + opacity: 0.94 !important; + } + [class*="bg-gray-200"], [class*="bg-slate-200"], + [class*="bg-neutral-200"], [class*="bg-zinc-200"] { + background: #1b2c2e !important; + } + [class*="bg-green"], [class*="bg-emerald"], [class*="bg-teal"], + [class*="bg-cyan"] { + background: #11625d !important; + color: #a2fff7 !important; + } + [class*="text-green"], [class*="text-emerald"], [class*="text-teal"] { + color: #5ee6dc !important; + } + [class*="bg-blue"], [class*="bg-sky"], [class*="bg-indigo"] { + background: #0f5e83 !important; + color: #9be0ff !important; + } + [class*="bg-red"], [class*="bg-rose"], [class*="bg-pink"] { + background: #4a2228 !important; + color: #ff9ba6 !important; + } + [class*="bg-yellow"], [class*="bg-amber"], [class*="bg-orange"] { + background: #4a3818 !important; + color: #ffd071 !important; + } + [class*="rounded-full"], [class*="badge"], [class*="Badge"] { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.10) !important; + font-weight: 700 !important; + } + [class*="bg-green"][class*="rounded"], + [class*="bg-emerald"][class*="rounded"], + [class*="bg-teal"][class*="rounded"], + [class*="bg-cyan"][class*="rounded"], + [class*="bg-blue"][class*="rounded"], + [class*="bg-sky"][class*="rounded"], + [class*="bg-indigo"][class*="rounded"] { + box-shadow: inset 0 0 0 1px rgba(126, 228, 220, 0.20) !important; + } + [class*="bg-green"][class*="rounded-lg"], + [class*="bg-green"][class*="rounded-xl"], + [class*="bg-emerald"][class*="rounded-lg"], + [class*="bg-emerald"][class*="rounded-xl"], + [class*="bg-teal"][class*="rounded-lg"], + [class*="bg-teal"][class*="rounded-xl"], + [class*="bg-cyan"][class*="rounded-lg"], + [class*="bg-cyan"][class*="rounded-xl"] { + background: rgba(20, 88, 82, 0.18) !important; + border: 1px solid rgba(46, 196, 182, 0.52) !important; + color: #dffdfa !important; + box-shadow: inset 0 0 0 1px rgba(126, 228, 220, 0.08) !important; + } + [class*="bg-blue"][class*="rounded-lg"], + [class*="bg-blue"][class*="rounded-xl"], + [class*="bg-sky"][class*="rounded-lg"], + [class*="bg-sky"][class*="rounded-xl"], + [class*="bg-indigo"][class*="rounded-lg"], + [class*="bg-indigo"][class*="rounded-xl"] { + background: rgba(35, 82, 118, 0.18) !important; + border: 1px solid rgba(82, 153, 214, 0.50) !important; + color: #e6f5ff !important; + box-shadow: inset 0 0 0 1px rgba(155, 224, 255, 0.08) !important; + } + [class*="flex"][class*="items-center"][class*="justify-between"], + [class*="flex"][class*="justify-between"][class*="items-center"] { + background: transparent !important; + box-shadow: none !important; + border-color: transparent !important; + } + [class*="w-3"][class*="h-3"], [class*="w-4"][class*="h-4"] { + box-shadow: none !important; + } + button, a[role="button"], [role="button"] { + color: #edf8f5 !important; + border-color: rgba(118, 173, 165, 0.20) !important; + transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease; + } + button:hover, button:focus, + a[role="button"]:hover, a[role="button"]:focus, + [role="button"]:hover, [role="button"]:focus { + background: #1b3436 !important; + border-color: rgba(126, 228, 220, 0.34) !important; + color: #ffffff !important; + } + canvas, [class*="chart"], [class*="Chart"], [class*="recharts"] { + background: transparent !important; + border-color: transparent !important; + box-shadow: none !important; + } + [class*="chart"] svg, [class*="Chart"] svg, + [class*="recharts"] svg { + background: transparent !important; + overflow: visible !important; + } + [class*="chart"] svg text, + [class*="Chart"] svg text, + [class*="chart"] svg line, + [class*="Chart"] svg line, + [class*="chart"] svg rect, + [class*="Chart"] svg rect { + opacity: 0 !important; + } + [class*="recharts-cartesian-axis"], + [class*="recharts-cartesian-grid"], + [class*="recharts-tooltip-cursor"], + [class*="axis"], [class*="Axis"], + [class*="tick"], [class*="Tick"] { + opacity: 0 !important; + } + [class*="recharts-line-curve"], + [class*="recharts-area-curve"], + [class*="chart"] svg path, + [class*="Chart"] svg path, + [class*="chart"] svg polyline, + [class*="Chart"] svg polyline { + stroke: #15d6a4 !important; + stroke-width: 3 !important; + stroke-linecap: round !important; + stroke-linejoin: round !important; + filter: drop-shadow(0 0 7px rgba(21, 214, 164, 0.34)) !important; + } + [class*="chart"] svg path[fill="none"], + [class*="Chart"] svg path[fill="none"], + [class*="chart"] svg polyline, + [class*="Chart"] svg polyline { + fill: none !important; + } + [class*="chart"] svg polygon, + [class*="Chart"] svg polygon, + [class*="chart"] svg path:not([fill="none"]), + [class*="Chart"] svg path:not([fill="none"]) { + fill: rgba(21, 214, 164, 0.13) !important; + stroke: transparent !important; + } + [class*="recharts-area-area"] { + fill: rgba(21, 214, 164, 0.14) !important; + } + svg [stroke="#000"], svg [stroke="black"], + svg [stroke="#111"], svg [stroke="#222"] { + stroke: #7ed6cf !important; + } + [class*="text-4xl"], [class*="text-5xl"], [class*="text-6xl"] { + background: transparent !important; + box-shadow: none !important; + border-color: transparent !important; + } + img[src*="logo"], img[src*="Logo"], img[src*="tradon"], img[src*="Tradon"] { + content: url("${dashboard_logo_url}") !important; + object-fit: contain !important; + background: transparent !important; + border-color: transparent !important; + box-shadow: none !important; + } + [class*="logo"], [class*="Logo"] { + background-image: url("${dashboard_logo_url}") !important; + background-size: contain !important; + background-repeat: no-repeat !important; + background-position: center !important; + background-color: transparent !important; + border-color: transparent !important; + box-shadow: none !important; + } + [class*="splash"], [class*="Splash"], + [class*="loading"], [class*="Loading"], + [class*="loader"], [class*="Loader"] { + background: transparent !important; + border-color: transparent !important; + box-shadow: none !important; + } + [class*="border"], hr { + border-color: rgba(118, 173, 165, 0.22) !important; + } + input, select, textarea { + background: #1a3033 !important; + border-color: rgba(118, 173, 165, 0.26) !important; + color: #f4fbf8 !important; + } + `; + if (mode != 'dark') { + style.textContent = compact_dashboard_css; + Sao.traceHTMLViewerTheme('apply-light-compact-injected', { + src: iframe.getAttribute('src') || '', + bridgePresent: Boolean(doc.getElementById( + 'tradon-htmlviewer-theme-bridge')), + styleLength: style && style.textContent ? + style.textContent.length : 0, + }); + return; + } + style.textContent = compact_dashboard_css + dark_dashboard_css; + doc.querySelectorAll('img').forEach(function(img) { + var marker = [ + img.getAttribute('src') || '', + img.getAttribute('alt') || '', + img.className || '', + img.id || '', + ].join(' '); + if (!/logo|tradon/i.test(marker)) { + return; + } + if (!img.getAttribute('data-tradon-light-src')) { + img.setAttribute('data-tradon-light-src', img.getAttribute('src') || ''); + } + img.setAttribute('src', dashboard_logo_url); + var parent = img.parentElement; + var depth = 0; + while (parent && depth < 3) { + var parent_marker = [ + parent.className || '', + parent.id || '', + ].join(' '); + if (/logo|tradon|splash|loading|loader/i.test(parent_marker) || + parent.children.length == 1) { + parent.style.setProperty('background', 'transparent', 'important'); + parent.style.setProperty('background-color', 'transparent', 'important'); + parent.style.setProperty('border-color', 'transparent', 'important'); + parent.style.setProperty('box-shadow', 'none', 'important'); + } + parent = parent.parentElement; + depth += 1; + } + }); + Sao.traceHTMLViewerTheme('apply-dark-injected', { + src: iframe.getAttribute('src') || '', + docThemeAfter: doc.documentElement.getAttribute( + 'data-theme-mode') || null, + bodyThemeAfter: doc.body && + doc.body.getAttribute('data-theme-mode') || null, + bridgePresent: Boolean(doc.getElementById( + 'tradon-htmlviewer-theme-bridge')), + styleLength: style && style.textContent ? + style.textContent.length : 0, + bodyClass: doc.body && doc.body.className || '', + rootFound: Boolean(doc.getElementById('root') || + doc.getElementById('app')), + }); + } catch (e) { + Sao.traceHTMLViewerTheme('apply-error', { + src: iframe.getAttribute('src') || '', + errorName: e && e.name || '', + errorMessage: e && e.message || String(e), + }); + // Cross-origin dashboards can still read the theme query parameter. + } + }; + Sao.renderHTMLViewerContent = function(container, value, height, width, record) { function decodeHtmlEntities(str) { const txt = document.createElement('textarea'); txt.innerHTML = str; return txt.value; } - console.log("Value",value) container.empty(); + container.removeClass('htmlviewer-react-dashboard'); if (!value) return; @@ -21130,16 +22436,41 @@ function eval_pyson(value){ } else if (/^https?:\/\//i.test(value)) { // Case 2: Generic URL (not VesselFinder) - console.log("InFrame",value) + var is_dashboard = Sao.isHTMLViewerDashboardURL(value); + Sao.traceHTMLViewerTheme('render-url', { + value: value, + isDashboard: is_dashboard, + height: height, + width: width, + }); var iframe = jQuery('', { - src: value, + src: Sao.withHTMLViewerThemeParam(value), width: '100%', height: height.toString()+'px', frameborder: 0, scrolling: 'auto', // sandbox: 'allow-same-origin allow-scripts allow-popups allow-forms', // optional: adjust based on your security needs }); + if (is_dashboard) { + iframe.attr({ + 'data-htmlviewer-dashboard': '1', + 'data-original-src': value, + }); + container.addClass('htmlviewer-react-dashboard'); + iframe.on('load', function() { + Sao.traceHTMLViewerTheme('iframe-load', { + src: this.getAttribute('src') || '', + originalSrc: this.getAttribute('data-original-src') || '', + }); + Sao.applyHTMLViewerThemeToIFrame(this); + }); + } else { + container.removeClass('htmlviewer-react-dashboard'); + } container.append(iframe); + if (is_dashboard) { + Sao.applyHTMLViewerThemeToIFrame(iframe[0]); + } } else if (value.startsWith("metabase:")) { const url = value.replace(/^metabase:/, ''); const iframe = jQuery('', { @@ -21345,13 +22676,26 @@ function eval_pyson(value){ const statsY = hasTitle ? 30 : 8; const barY = hasTitle ? 58 : 36; const rowY = hasTitle ? 84 : 62; - const palette = { + const html = document.documentElement; + const themeMode = html.getAttribute('data-theme-mode'); + const isDarkMode = themeMode === 'dark'; + const isLightMode = !isDarkMode && ( + html.getAttribute('theme') === 'default' || + themeMode === 'light'); + const palette = !isLightMode ? { + matched: '#65d7d0', + shipped: '#4fb8b2', + open: '#405b56', + text: '#eef7f4', + muted: '#b7cac5', + line: '#66817b' + } : { matched: '#2b8c87', - shipped: '#145369', - open: '#dbe8e3', - text: '#24484d', - muted: '#6b7d7b', - line: '#e3ede8' + shipped: '#4ba9a4', + open: '#dce9e5', + text: '#173b40', + muted: '#526967', + line: '#bfd4ce' }; const svg = d3.select(node).append('svg') @@ -21520,8 +22864,9 @@ function eval_pyson(value){
' + + format_x(data.point.x) + '
' + + format_y(data.point.y)); + tooltip.show(); + }) + .on('mousemove', function(event) { + var stage = tooltip.parent().offset(); + tooltip.css({ + left: event.pageX - stage.left + 12, + top: event.pageY - stage.top + 12 + }); + }) + .on('mouseleave', function() { + tooltip.hide(); + }); + } + }); + Sao.View.ToleranceGaugeMixin = { _number: function(value) { if ((value === null) || (value === undefined) || (value === '')) { @@ -20944,6 +21628,45 @@ function eval_pyson(value){ this.container = jQuery('', { 'class': 'panel-body htmlviewer-content', }).appendTo(this.el); + if (window.MutationObserver) { + this._theme_observer = new MutationObserver(mutations => { + var changed = mutations.some(mutation => + mutation.attributeName == 'data-theme-mode'); + if (!changed) { + return; + } + this._sync_theme_classes(); + if (!document.documentElement.contains(this.el[0])) { + this._theme_observer.disconnect(); + this._theme_observer = null; + return; + } + this.container.find('iframe[data-htmlviewer-dashboard="1"]') + .each(function() { + Sao.applyHTMLViewerThemeToIFrame(this); + }); + if (!String(this._last_value || '').startsWith('d3:')) { + return; + } + window.requestAnimationFrame(() => this.display()); + }); + this._theme_observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['data-theme-mode'], + }); + } + }, + + _sync_theme_classes: function() { + var theme_mode = document.documentElement.getAttribute( + 'data-theme-mode') || ''; + var is_dark = theme_mode == 'dark'; + this.container + .toggleClass('htmlviewer-theme-dark', is_dark) + .toggleClass('htmlviewer-theme-light', !is_dark); + this.el + .toggleClass('htmlviewer-theme-dark', is_dark) + .toggleClass('htmlviewer-theme-light', !is_dark); }, display: function() { @@ -20954,15 +21677,18 @@ function eval_pyson(value){ if (record) { value = record.field_get_client(this.field_name); } - console.log("HTMLViewer",this.field_name) - console.log("Value from display",value) - console.log("Last Value from display",this._last_value) + this._sync_theme_classes(); + var theme_mode = document.documentElement.getAttribute( + 'data-theme-mode') || ''; + var render_key = String(value || '').startsWith('d3:') ? + value + '|theme:' + theme_mode : value; // Si la valeur n'a pas changé, ne rien faire - if (this._last_value === value) { + if (this._last_render_key === render_key) { return; } this._last_value = value; + this._last_render_key = render_key; this.container.empty(); // if (!value) { @@ -21106,14 +21832,594 @@ function eval_pyson(value){ // } // }); + Sao.traceHTMLViewerTheme = function(stage, payload) { + if (!window.console) { + return; + } + var storage_theme = null; + try { + storage_theme = window.localStorage && + localStorage.getItem('sao_theme_mode'); + } catch (error) { + storage_theme = 'unavailable:' + (error && error.name || 'error'); + } + try { + console.info('[HTMLVIEWER][THEME_DEBUG]', JSON.stringify( + jQuery.extend({ + stage: stage, + href: window.location.href, + parentTheme: document.documentElement.getAttribute( + 'data-theme-mode') || null, + storageTheme: storage_theme, + }, payload || {}))); + } catch (error) { + console.info('[HTMLVIEWER][THEME_DEBUG]', stage, payload); + } + }; + + Sao.htmlViewerThemeMode = function() { + return document.documentElement.getAttribute('data-theme-mode') || 'light'; + }; + + Sao.isHTMLViewerDashboardURL = function(value) { + return /\/dashboard\/index\.html(?:[?#]|$)/i.test(String(value || '')); + }; + + Sao.shouldRewriteHTMLViewerDashboardOrigin = function(url) { + if (!url || url.origin == window.location.origin) { + return false; + } + var current_host = window.location.hostname || ''; + var dashboard_host = url.hostname || ''; + return /(^|\.)open-squared\.tech$/i.test(current_host) && + /(^|\.)open-squared\.tech$/i.test(dashboard_host); + }; + + Sao.withHTMLViewerThemeParam = function(value) { + var is_dashboard = Sao.isHTMLViewerDashboardURL(value); + if (!is_dashboard) { + Sao.traceHTMLViewerTheme('with-param-skip', { + value: value, + reason: 'not-dashboard-url', + }); + return value; + } + try { + var url = new URL(value, window.location.href); + var input_origin = url.origin; + if (Sao.shouldRewriteHTMLViewerDashboardOrigin(url)) { + url.protocol = window.location.protocol; + url.host = window.location.host; + Sao.traceHTMLViewerTheme('origin-rewrite', { + input: value, + fromOrigin: input_origin, + toOrigin: url.origin, + currentOrigin: window.location.origin, + }); + } + var mode = Sao.htmlViewerThemeMode(); + url.searchParams.set('theme', mode); + url.searchParams.set('theme_mode', mode); + Sao.traceHTMLViewerTheme('with-param', { + input: value, + output: url.toString(), + mode: mode, + urlOrigin: url.origin, + urlPathname: url.pathname, + sameOrigin: url.origin == window.location.origin, + themeParam: url.searchParams.get('theme'), + themeModeParam: url.searchParams.get('theme_mode'), + }); + return url.toString(); + } catch (e) { + var separator = value.indexOf('?') == -1 ? '?' : '&'; + var mode = encodeURIComponent(Sao.htmlViewerThemeMode()); + var output = value + separator + 'theme=' + mode + + '&theme_mode=' + mode; + Sao.traceHTMLViewerTheme('with-param-fallback', { + input: value, + output: output, + mode: mode, + error: e && (e.name + ': ' + e.message), + }); + return output; + } + }; + + Sao.applyHTMLViewerThemeToIFrame = function(iframe) { + var mode = Sao.htmlViewerThemeMode(); + var dashboard = iframe.getAttribute('data-htmlviewer-dashboard') == '1'; + Sao.traceHTMLViewerTheme('apply-start', { + dashboard: dashboard, + mode: mode, + src: iframe.getAttribute('src') || '', + originalSrc: iframe.getAttribute('data-original-src') || '', + }); + if (!dashboard) { + return; + } + var next_src = Sao.withHTMLViewerThemeParam( + iframe.getAttribute('data-original-src') || iframe.getAttribute('src') || ''); + if (next_src && iframe.getAttribute('src') != next_src) { + Sao.traceHTMLViewerTheme('apply-src-update', { + previousSrc: iframe.getAttribute('src') || '', + nextSrc: next_src, + }); + iframe.setAttribute('src', next_src); + } + try { + var doc = iframe.contentDocument || iframe.contentWindow.document; + if (!doc || !doc.documentElement) { + Sao.traceHTMLViewerTheme('apply-no-document', { + src: iframe.getAttribute('src') || '', + }); + return; + } + var existing_style = doc.getElementById( + 'tradon-htmlviewer-theme-bridge'); + Sao.traceHTMLViewerTheme('apply-document-access', { + src: iframe.getAttribute('src') || '', + readyState: doc.readyState, + docUrl: doc.location && doc.location.href || null, + docThemeBefore: doc.documentElement.getAttribute( + 'data-theme-mode') || null, + bodyThemeBefore: doc.body && + doc.body.getAttribute('data-theme-mode') || null, + hasHead: Boolean(doc.head), + hasBody: Boolean(doc.body), + bridgeBefore: Boolean(existing_style), + }); + doc.documentElement.setAttribute('data-theme-mode', mode); + doc.body && doc.body.setAttribute('data-theme-mode', mode); + var style = doc.getElementById('tradon-htmlviewer-theme-bridge'); + if (!style) { + style = doc.createElement('style'); + style.id = 'tradon-htmlviewer-theme-bridge'; + doc.head.appendChild(style); + } + var dashboard_logo_url = new URL( + 'dist/tradon_wbg.png', window.location.href).toString(); + var compact_dashboard_css = ` + :root { + --tradon-dashboard-card-radius: 6px; + font-size: 14px !important; + } + body { + font-size: 0.9rem !important; + } + #root > [class*="min-h-screen"], + #app > [class*="min-h-screen"], + body > [class*="min-h-screen"] { + padding: 0.75rem !important; + } + [class*="container"], [class*="max-w-"] { + padding-left: 0.6rem !important; + padding-right: 0.6rem !important; + } + [class*="grid"][class*="gap-6"], + [class*="grid"][class*="gap-5"], + [class*="grid"][class*="gap-4"] { + gap: 0.7rem !important; + } + [class*="gap-6"], [class*="gap-5"], [class*="gap-4"] { + gap: 0.7rem !important; + } + [class*="gap-3"], [class*="gap-2"] { + gap: 0.4rem !important; + } + [class*="p-8"], [class*="p-7"], [class*="p-6"] { + padding: 0.75rem !important; + } + [class*="p-5"], [class*="p-4"] { + padding: 0.65rem !important; + } + [class*="px-6"], [class*="px-5"], [class*="px-4"] { + padding-left: 0.7rem !important; + padding-right: 0.7rem !important; + } + [class*="py-6"], [class*="py-5"], [class*="py-4"] { + padding-top: 0.55rem !important; + padding-bottom: 0.55rem !important; + } + [class*="mb-8"], [class*="mb-7"], [class*="mb-6"] { + margin-bottom: 0.75rem !important; + } + [class*="mt-8"], [class*="mt-7"], [class*="mt-6"] { + margin-top: 0.75rem !important; + } + [class*="space-y-6"] > :not([hidden]) ~ :not([hidden]), + [class*="space-y-5"] > :not([hidden]) ~ :not([hidden]), + [class*="space-y-4"] > :not([hidden]) ~ :not([hidden]) { + margin-top: 0.7rem !important; + } + [class*="bg-white"], [class*="card"], [class*="Card"], + section, article { + border-radius: var(--tradon-dashboard-card-radius) !important; + min-height: 0 !important; + } + [class*="rounded-2xl"], [class*="rounded-xl"], [class*="rounded-lg"] { + border-radius: var(--tradon-dashboard-card-radius) !important; + } + [class*="shadow-lg"], [class*="shadow-xl"], [class*="shadow-md"] { + box-shadow: 0 3px 8px rgba(15, 23, 42, 0.12) !important; + } + [class*="text-6xl"], [class*="text-5xl"] { + font-size: 1.75rem !important; + line-height: 2rem !important; + } + [class*="text-4xl"] { + font-size: 1.55rem !important; + line-height: 1.85rem !important; + } + [class*="text-3xl"] { + font-size: 1.3rem !important; + line-height: 1.6rem !important; + } + [class*="text-2xl"] { + font-size: 1.1rem !important; + line-height: 1.35rem !important; + } + [class*="text-xl"] { + font-size: 1rem !important; + line-height: 1.25rem !important; + } + [class*="text-lg"] { + font-size: 0.95rem !important; + line-height: 1.2rem !important; + } + [class*="w-12"][class*="h-12"], + [class*="w-10"][class*="h-10"], + [class*="w-8"][class*="h-8"] { + width: 1.35rem !important; + height: 1.35rem !important; + } + [class*="w-6"][class*="h-6"], + [class*="w-5"][class*="h-5"] { + width: 1rem !important; + height: 1rem !important; + } + svg { + max-width: 1.35rem !important; + max-height: 1.35rem !important; + } + [class*="h-3"], [class*="h-4"] { + min-height: 0 !important; + } + canvas, [class*="chart"], [class*="Chart"], [class*="recharts"] { + max-height: 150px !important; + } + `; + var dark_dashboard_css = ` + :root { color-scheme: dark; } + html { + font-size: 14px !important; + } + body { + font-size: 0.9rem !important; + } + #root > [class*="min-h-screen"], + #app > [class*="min-h-screen"], + body > [class*="min-h-screen"] { + padding: 0.75rem !important; + } + [class*="grid"][class*="gap-4"] { + gap: 0.7rem !important; + } + [class*="p-6"] { + padding: 0.75rem !important; + } + [class*="p-4"] { + padding: 0.65rem !important; + } + [class*="mb-6"] { + margin-bottom: 0.75rem !important; + } + [class*="gap-2"] { + gap: 0.4rem !important; + } + [class*="text-4xl"] { + font-size: 1.55rem !important; + line-height: 1.85rem !important; + } + html, body, #root, #app, [id*="root"], [class*="app"] { + background: #000000 !important; + color: #eaf7f4 !important; + } + body { + scrollbar-color: #31534e #000000; + } + body > div, #root, #app, + #root > div, #app > div, + #root > div > div, #app > div > div, + main, + [class*="min-h-screen"], [class*="dashboard"], [class*="Dashboard"] { + background-color: #000000 !important; + } + [class*="bg-gray-50"], [class*="bg-slate-50"], + [class*="bg-neutral-50"], [class*="bg-zinc-50"], + [class*="bg-gray-100"], [class*="bg-slate-100"], + [class*="bg-neutral-100"], [class*="bg-zinc-100"] { + background: #000000 !important; + } + [class*="bg-white"], [class*="card"], + [class*="Card"], section, article { + background: linear-gradient(180deg, #142326 0%, #101d20 100%) !important; + border-color: rgba(118, 173, 165, 0.22) !important; + color: #eaf7f4 !important; + box-shadow: 0 10px 24px rgba(0, 0, 0, 0.28), inset 0 1px 0 rgba(255, 255, 255, 0.035) !important; + } + [class*="text-gray"], [class*="text-slate"], [class*="text-neutral"], + [class*="text-zinc"] { + color: #c3d4cf !important; + } + [class*="text-gray-400"], [class*="text-gray-500"], + [class*="text-slate-400"], [class*="text-slate-500"], + [class*="text-neutral-400"], [class*="text-neutral-500"] { + color: #a9c1bb !important; + } + h1, h2, h3, h4, h5, h6, + [class*="font-semibold"], [class*="font-bold"] { + color: #f4fbf8 !important; + } + svg, svg * { + color: #a9e3dd !important; + stroke: currentColor !important; + } + svg { + opacity: 0.94 !important; + } + [class*="bg-gray-200"], [class*="bg-slate-200"], + [class*="bg-neutral-200"], [class*="bg-zinc-200"] { + background: #1b2c2e !important; + } + [class*="bg-green"], [class*="bg-emerald"], [class*="bg-teal"], + [class*="bg-cyan"] { + background: #11625d !important; + color: #a2fff7 !important; + } + [class*="text-green"], [class*="text-emerald"], [class*="text-teal"] { + color: #5ee6dc !important; + } + [class*="bg-blue"], [class*="bg-sky"], [class*="bg-indigo"] { + background: #0f5e83 !important; + color: #9be0ff !important; + } + [class*="bg-red"], [class*="bg-rose"], [class*="bg-pink"] { + background: #4a2228 !important; + color: #ff9ba6 !important; + } + [class*="bg-yellow"], [class*="bg-amber"], [class*="bg-orange"] { + background: #4a3818 !important; + color: #ffd071 !important; + } + [class*="rounded-full"], [class*="badge"], [class*="Badge"] { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.10) !important; + font-weight: 700 !important; + } + [class*="bg-green"][class*="rounded"], + [class*="bg-emerald"][class*="rounded"], + [class*="bg-teal"][class*="rounded"], + [class*="bg-cyan"][class*="rounded"], + [class*="bg-blue"][class*="rounded"], + [class*="bg-sky"][class*="rounded"], + [class*="bg-indigo"][class*="rounded"] { + box-shadow: inset 0 0 0 1px rgba(126, 228, 220, 0.20) !important; + } + [class*="bg-green"][class*="rounded-lg"], + [class*="bg-green"][class*="rounded-xl"], + [class*="bg-emerald"][class*="rounded-lg"], + [class*="bg-emerald"][class*="rounded-xl"], + [class*="bg-teal"][class*="rounded-lg"], + [class*="bg-teal"][class*="rounded-xl"], + [class*="bg-cyan"][class*="rounded-lg"], + [class*="bg-cyan"][class*="rounded-xl"] { + background: rgba(20, 88, 82, 0.18) !important; + border: 1px solid rgba(46, 196, 182, 0.52) !important; + color: #dffdfa !important; + box-shadow: inset 0 0 0 1px rgba(126, 228, 220, 0.08) !important; + } + [class*="bg-blue"][class*="rounded-lg"], + [class*="bg-blue"][class*="rounded-xl"], + [class*="bg-sky"][class*="rounded-lg"], + [class*="bg-sky"][class*="rounded-xl"], + [class*="bg-indigo"][class*="rounded-lg"], + [class*="bg-indigo"][class*="rounded-xl"] { + background: rgba(35, 82, 118, 0.18) !important; + border: 1px solid rgba(82, 153, 214, 0.50) !important; + color: #e6f5ff !important; + box-shadow: inset 0 0 0 1px rgba(155, 224, 255, 0.08) !important; + } + [class*="flex"][class*="items-center"][class*="justify-between"], + [class*="flex"][class*="justify-between"][class*="items-center"] { + background: transparent !important; + box-shadow: none !important; + border-color: transparent !important; + } + [class*="w-3"][class*="h-3"], [class*="w-4"][class*="h-4"] { + box-shadow: none !important; + } + button, a[role="button"], [role="button"] { + color: #edf8f5 !important; + border-color: rgba(118, 173, 165, 0.20) !important; + transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease; + } + button:hover, button:focus, + a[role="button"]:hover, a[role="button"]:focus, + [role="button"]:hover, [role="button"]:focus { + background: #1b3436 !important; + border-color: rgba(126, 228, 220, 0.34) !important; + color: #ffffff !important; + } + canvas, [class*="chart"], [class*="Chart"], [class*="recharts"] { + background: transparent !important; + border-color: transparent !important; + box-shadow: none !important; + } + [class*="chart"] svg, [class*="Chart"] svg, + [class*="recharts"] svg { + background: transparent !important; + overflow: visible !important; + } + [class*="chart"] svg text, + [class*="Chart"] svg text, + [class*="chart"] svg line, + [class*="Chart"] svg line, + [class*="chart"] svg rect, + [class*="Chart"] svg rect { + opacity: 0 !important; + } + [class*="recharts-cartesian-axis"], + [class*="recharts-cartesian-grid"], + [class*="recharts-tooltip-cursor"], + [class*="axis"], [class*="Axis"], + [class*="tick"], [class*="Tick"] { + opacity: 0 !important; + } + [class*="recharts-line-curve"], + [class*="recharts-area-curve"], + [class*="chart"] svg path, + [class*="Chart"] svg path, + [class*="chart"] svg polyline, + [class*="Chart"] svg polyline { + stroke: #15d6a4 !important; + stroke-width: 3 !important; + stroke-linecap: round !important; + stroke-linejoin: round !important; + filter: drop-shadow(0 0 7px rgba(21, 214, 164, 0.34)) !important; + } + [class*="chart"] svg path[fill="none"], + [class*="Chart"] svg path[fill="none"], + [class*="chart"] svg polyline, + [class*="Chart"] svg polyline { + fill: none !important; + } + [class*="chart"] svg polygon, + [class*="Chart"] svg polygon, + [class*="chart"] svg path:not([fill="none"]), + [class*="Chart"] svg path:not([fill="none"]) { + fill: rgba(21, 214, 164, 0.13) !important; + stroke: transparent !important; + } + [class*="recharts-area-area"] { + fill: rgba(21, 214, 164, 0.14) !important; + } + svg [stroke="#000"], svg [stroke="black"], + svg [stroke="#111"], svg [stroke="#222"] { + stroke: #7ed6cf !important; + } + [class*="text-4xl"], [class*="text-5xl"], [class*="text-6xl"] { + background: transparent !important; + box-shadow: none !important; + border-color: transparent !important; + } + img[src*="logo"], img[src*="Logo"], img[src*="tradon"], img[src*="Tradon"] { + content: url("${dashboard_logo_url}") !important; + object-fit: contain !important; + background: transparent !important; + border-color: transparent !important; + box-shadow: none !important; + } + [class*="logo"], [class*="Logo"] { + background-image: url("${dashboard_logo_url}") !important; + background-size: contain !important; + background-repeat: no-repeat !important; + background-position: center !important; + background-color: transparent !important; + border-color: transparent !important; + box-shadow: none !important; + } + [class*="splash"], [class*="Splash"], + [class*="loading"], [class*="Loading"], + [class*="loader"], [class*="Loader"] { + background: transparent !important; + border-color: transparent !important; + box-shadow: none !important; + } + [class*="border"], hr { + border-color: rgba(118, 173, 165, 0.22) !important; + } + input, select, textarea { + background: #1a3033 !important; + border-color: rgba(118, 173, 165, 0.26) !important; + color: #f4fbf8 !important; + } + `; + if (mode != 'dark') { + style.textContent = compact_dashboard_css; + Sao.traceHTMLViewerTheme('apply-light-compact-injected', { + src: iframe.getAttribute('src') || '', + bridgePresent: Boolean(doc.getElementById( + 'tradon-htmlviewer-theme-bridge')), + styleLength: style && style.textContent ? + style.textContent.length : 0, + }); + return; + } + style.textContent = compact_dashboard_css + dark_dashboard_css; + doc.querySelectorAll('img').forEach(function(img) { + var marker = [ + img.getAttribute('src') || '', + img.getAttribute('alt') || '', + img.className || '', + img.id || '', + ].join(' '); + if (!/logo|tradon/i.test(marker)) { + return; + } + if (!img.getAttribute('data-tradon-light-src')) { + img.setAttribute('data-tradon-light-src', img.getAttribute('src') || ''); + } + img.setAttribute('src', dashboard_logo_url); + var parent = img.parentElement; + var depth = 0; + while (parent && depth < 3) { + var parent_marker = [ + parent.className || '', + parent.id || '', + ].join(' '); + if (/logo|tradon|splash|loading|loader/i.test(parent_marker) || + parent.children.length == 1) { + parent.style.setProperty('background', 'transparent', 'important'); + parent.style.setProperty('background-color', 'transparent', 'important'); + parent.style.setProperty('border-color', 'transparent', 'important'); + parent.style.setProperty('box-shadow', 'none', 'important'); + } + parent = parent.parentElement; + depth += 1; + } + }); + Sao.traceHTMLViewerTheme('apply-dark-injected', { + src: iframe.getAttribute('src') || '', + docThemeAfter: doc.documentElement.getAttribute( + 'data-theme-mode') || null, + bodyThemeAfter: doc.body && + doc.body.getAttribute('data-theme-mode') || null, + bridgePresent: Boolean(doc.getElementById( + 'tradon-htmlviewer-theme-bridge')), + styleLength: style && style.textContent ? + style.textContent.length : 0, + bodyClass: doc.body && doc.body.className || '', + rootFound: Boolean(doc.getElementById('root') || + doc.getElementById('app')), + }); + } catch (e) { + Sao.traceHTMLViewerTheme('apply-error', { + src: iframe.getAttribute('src') || '', + errorName: e && e.name || '', + errorMessage: e && e.message || String(e), + }); + // Cross-origin dashboards can still read the theme query parameter. + } + }; + Sao.renderHTMLViewerContent = function(container, value, height, width, record) { function decodeHtmlEntities(str) { const txt = document.createElement('textarea'); txt.innerHTML = str; return txt.value; } - console.log("Value",value) container.empty(); + container.removeClass('htmlviewer-react-dashboard'); if (!value) return; @@ -21130,16 +22436,41 @@ function eval_pyson(value){ } else if (/^https?:\/\//i.test(value)) { // Case 2: Generic URL (not VesselFinder) - console.log("InFrame",value) + var is_dashboard = Sao.isHTMLViewerDashboardURL(value); + Sao.traceHTMLViewerTheme('render-url', { + value: value, + isDashboard: is_dashboard, + height: height, + width: width, + }); var iframe = jQuery('', { - src: value, + src: Sao.withHTMLViewerThemeParam(value), width: '100%', height: height.toString()+'px', frameborder: 0, scrolling: 'auto', // sandbox: 'allow-same-origin allow-scripts allow-popups allow-forms', // optional: adjust based on your security needs }); + if (is_dashboard) { + iframe.attr({ + 'data-htmlviewer-dashboard': '1', + 'data-original-src': value, + }); + container.addClass('htmlviewer-react-dashboard'); + iframe.on('load', function() { + Sao.traceHTMLViewerTheme('iframe-load', { + src: this.getAttribute('src') || '', + originalSrc: this.getAttribute('data-original-src') || '', + }); + Sao.applyHTMLViewerThemeToIFrame(this); + }); + } else { + container.removeClass('htmlviewer-react-dashboard'); + } container.append(iframe); + if (is_dashboard) { + Sao.applyHTMLViewerThemeToIFrame(iframe[0]); + } } else if (value.startsWith("metabase:")) { const url = value.replace(/^metabase:/, ''); const iframe = jQuery('', { @@ -21345,13 +22676,26 @@ function eval_pyson(value){ const statsY = hasTitle ? 30 : 8; const barY = hasTitle ? 58 : 36; const rowY = hasTitle ? 84 : 62; - const palette = { + const html = document.documentElement; + const themeMode = html.getAttribute('data-theme-mode'); + const isDarkMode = themeMode === 'dark'; + const isLightMode = !isDarkMode && ( + html.getAttribute('theme') === 'default' || + themeMode === 'light'); + const palette = !isLightMode ? { + matched: '#65d7d0', + shipped: '#4fb8b2', + open: '#405b56', + text: '#eef7f4', + muted: '#b7cac5', + line: '#66817b' + } : { matched: '#2b8c87', - shipped: '#145369', - open: '#dbe8e3', - text: '#24484d', - muted: '#6b7d7b', - line: '#e3ede8' + shipped: '#4ba9a4', + open: '#dce9e5', + text: '#173b40', + muted: '#526967', + line: '#bfd4ce' }; const svg = d3.select(node).append('svg') @@ -21520,8 +22864,9 @@ function eval_pyson(value){