/* This file is part of Tryton. The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. */ @import "bootstrap"; @import "bootstrap-rtl"; @import "sao-variables"; html { .user-select(none); } html[theme="default"] { @import "theme"; } .body { bottom: 0; left: 0; position: absolute; right: 0; top: 0; > .navbar { margin-bottom: 0; } } // Fix double rtl prefix .float-rtl-grid-columns(@class, @rtl-prefix) { .col(@index) { // initial @item: ~".col-@{class}-@{index}"; .col((@index + 1), @item); } .col(@index, @list) when (@index =< @grid-columns) { // general @item: ~".col-@{class}-@{index}"; .col((@index + 1), ~"@{list}, @{item}"); } .col(@index, @list) when (@index > @grid-columns) { // terminal @{list} { float: right; } } .col(1); // kickstart it } // Backport from Bootstrap 4 .stretched-link { &::after { position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 1; // Just in case `pointer-events: none` is set on a parent pointer-events: auto; content: ""; // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color background-color: rgba(0, 0, 0, 0); } } .radio, .checkbox { margin-top: 0; margin-bottom: 0; } .btn-horizontal { .text-overflow() } .input-group > .form-control-feedback { z-index: 3; } .input-group-addon { > .label { position: absolute; right: 0px; top: -5px; } } .navbar-inverse { .close { color: @navbar-inverse-link-color; &:hover, &:focus { color: @navbar-inverse-link-hover-color; background-color: @navbar-inverse-link-hover-bg; } } .active .close { &, &:hover, &:focus { color: @navbar-inverse-link-active-color; background-color: @navbar-inverse-link-active-bg; } } } .navbar { .icon { display: inline-block; height: unit(@line-height-base, em); vertical-align: middle; } } .navbar-nav { @media (min-width: @grid-float-breakpoint) { float:none; } } .btn-primary { .icon { filter: brightness(0) invert(1); } } .panel-heading { a { color: inherit; } } .modal-header { background-color: @brand-primary; color: #fff; .modal-title { small { color: @gray-lighter; } } } .alert { .user-select(text); } #tablist { display: flex; overflow-x: auto; > li { flex: auto; min-width: 9em; > a { > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; /* For IE */ display: block; margin-right: 15px; } [dir="rtl"] & > span { margin-right: 0; margin-left: 15px; } } } } @media screen and (max-width: @screen-xs-max) { #tablist { display: block; > li { float: none; } } } #main { bottom: 0; display: flex; flex-direction: row; gap: .5rem; left: 0; position: absolute; right: 0; top: 6rem; } #menu, #tabs { display: flex; overflow: auto; .navbar-brand { .title { display: inline-block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } } } #tabs { flex: 1; overflow-x: hidden; padding: 0 5px; } @media screen and (max-width: @screen-md-max) { #menu, #tabs { .navbar-brand { .title { max-width: 180px; } } } } @media screen and (max-width: @screen-sm-max) { #menu, #tabs { .navbar-brand { .title { max-width: 170px; } } } } @media screen and (max-width: @screen-xs-max) { #menu, #tabs { padding-left: 0; padding-right: 0; .navbar-brand { padding-left: 0; padding-right: 0; .title { max-width: 70px; } } } } #menu { overflow-y: auto; padding: 0; background-color: @navbar-default-bg; border-color: @panel-default-border; border-style: solid; border-radius: 0 @panel-border-radius @panel-border-radius 0; border-width: 1px; .treeview { height: auto; .cell { .user-select(none); } } @media (min-width: @screen-md-min) { resize: horizontal; width: 35rem; min-width: 20ch; max-width: 100vw; } @media (max-width: (@screen-sm-max)) { width: 100%; } } [dir="rtl"] #menu { border-right: none; } @media screen and (max-width: @screen-sm-max) { #menu { border-right: none; border-left: none; border-width: none; } .active #menu { border-width: 1px; } [dir="rtl"] .active #menu { border-right: none; } } #tabcontent { display: flex; flex: 1; width: 100%; > .tab-pane > .panel { display: flex; flex-direction: column; flex: 1; margin-bottom: 5px; padding-bottom: 0; > .panel-body { display: flex; flex: 1; flex-direction: row; padding: 5px 0; min-height: 0; > div { display: inline-flex; &:first-child { flex: 2; } } } } > .tab-pane.active { /* override bootstrap which sets display to block */ display: flex; flex: 1; } .sidebar { border-color: @panel-default-border; border-style: solid; border-width: 0 0 0 1px; flex: 1; overflow: unset; .sidebar-resizer { display: flex; flex-direction: column; height: 100%; max-width: 100vw; min-width: 100%; overflow: hidden; resize: inline; transform: scaleX(-1); } .sidebar-content { display: flex; flex-direction: column; flex: 1; transform: scaleX(-1); height: 100%; } } } @media screen and (max-width: @screen-xs-max) { #tabcontent { .sidebar:not(:empty) { flex: 2; > .sidebar-resizer { resize: none; } } } } @media screen and (max-width: @screen-sm-max) { #tabcontent { .sidebar { visibility: collapse; } } #tabcontent[data-view-type="form"] { display: block; > .tab-pane > .panel > .panel-body { flex-direction: column; } .sidebar { visibility: unset; } } } @media screen and (min-width: @screen-sm-min) { #global-search-entry { width: 10em; -webkit-transition: width .5s ease; -o-transition: width .5s ease; transition: width .5s ease; .global-search-container:focus-within & { width: 20em; } } } #user-preferences > a { max-width: 30em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; > img { margin: -5px 5px; width: 30px; &[src=''] { width: 0; } &.img-badge { margin-left: -15px; margin-bottom: -25px; width: 15px; } } } .attachment-preview { border-bottom: 1px solid @hr-border; display: flex; flex-direction: column; flex: 1; min-height: 200px; .screen-container { overflow: auto; } .btn-group { margin-bottom: 10px; margin-top: 10px; } } .chat { border-bottom: 1px solid @hr-border; display: flex; flex-direction: column; flex: 1; height: 100%; min-height: 200px; padding-bottom: 20px; // Like .tab-form padding-left: 5px; padding-right: 5px; .chat-messages-outer { display: flex; flex-direction: column; flex: 1; justify-content: flex-end; overflow: hidden; } .chat-messages { max-height: 100%; overflow-y: auto; } .chat-message { margin-top: 5px; } .chat-content { white-space: pre-wrap; word-wrap: break-word; } .chat-content-internal { color: @text-muted; } .media-body.well { border-radius: .5rem; margin: 0; } hr { border-style: dotted; margin-bottom: 5px; margin-top: 5px; width: 100%; } textarea { min-height: 60px; resize: vertical; } .checkbox { margin-bottom: 10px; margin-top: 10px; } } .list-group-item-variant(selected; @state-selected-bg; @state-selected-text); .table-row-variant(selected; @state-selected-bg); /* Duplicate bootstrap variant to have precedence over selected */ .table-row-variant(success; @state-success-bg); .table-row-variant(warning; @state-warning-bg); .table-row-variant(danger; @state-danger-bg); html.accesskey { *[accesskey] ~ span[data-accesskey]:after, *[accesskey]:after { background-color: @brand-info; color: #fff; font-size: x-small; padding: 0 2px; position: absolute; text-transform: uppercase; margin: 0 -1em; z-index: 5; } input[accesskey][type="checkbox"]:after { background-color: initial; } *[accesskey] ~ span[data-accesskey] { float: right; position: relative; &:after { content: attr(data-accesskey); } } *[accesskey]:after { content: attr(accesskey); } input[accesskey][type="checkbox"], input[accesskey][type="checkbox"], select[accesskey] { & ~ span[data-accesskey] { bottom: 1em; } } } .tab-form, .tab-board { padding-bottom: 20px; nav.toolbar { position: -webkit-sticky; position: sticky; top: 0px; z-index: @zindex-navbar - 1; .close { margin-right: 5px; margin-left: 5px; } } .navbar-text { .badge { max-width: 7em; min-width: 7em; overflow: hidden; text-overflow: ellipsis; } } .navbar-btn { .badge { position: absolute; top: -5px; right: -5px; z-index: 1000; } } .tab-domain { overflow-x: auto; max-width: calc(100vw - 10px); flex: 0 0 content; > .nav-tabs { display: inline-flex; white-space: nowrap; width: 1px; } .badge { min-width: 3em; } } } @media screen and (max-height: 750px) { .tab-form, .tab-board { .navbar-header > ul { min-width: 320px; > li { float: left; width: 50%; } } } } @media screen and (max-width: @screen-xs-max) { nav.toolbar { padding-left: 0; padding-right: 0; } } .modal-body { overflow-x: auto; max-height: calc(100vh - 200px); } @media screen and (max-height: 500px) { .modal-body { max-height: 300px; } } .modal-lg { .modal-content { height: auto; border-radius: 0; } } @media screen and (min-width: @screen-sm-min) { .modal-dialog.modal-lg { width: auto; margin: 30px; } } input[type='number'] { text-align: right; text-align: end; } input[type='color'] { .btn { height: @line-height-base; } .btn-lg { height: @line-height-large; } .btn-sm { height: @line-height-small; } .btn-xs { height: @line-height-small; } } .input-file { > input[type='file'] { position: absolute; left: 0; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; li& { top: auto; height: auto; &:hover + a, &:focus + a { background-color: @dropdown-link-hover-bg; color: @dropdown-link-hover-color; text-decoration: none; } } } } /* Hide empty image displayed as broken image */ img[src=''], img:not([src]) { visibility: hidden; } img.icon { height: unit(@line-height-base, em); [dir="rtl"] & { transform: scaleX(-1); } } .screen-container, .board { display: flex; flex-direction: column; flex: 1; } .filter-box { margin: 5px 0; } @media screen and (max-width: @screen-sm-max) { .filter-box { button[disabled] { display: none; } } } .content-box { display: flex; flex-direction: column; flex: 1; overflow-y: auto; } .tree-container { display: flex; flex-direction: column; min-height: 0; .tree-dragged-image { display: block; height: 0; left: 0; position: absolute; top: 0; width: 0; } } .wizard-form { width: 100%; } .list-form { overflow-y: auto; } .treeview { overflow-x: auto; > table.tree { width: 100%; table-layout: fixed; border: 1px solid transparent; &.table-bordered { border-color: @table-border-color; } col.selection-state, col.favorite, col.tree-menu { width: 30px; } td.draggable-handle, td.optional { > img { .center-block(); } } td.draggable-handle { cursor: grab; } th.selection-state { > input { margin-top: 0; margin-bottom: 0; } } th.selection-state, td.selection-state { > input { .center-block(); } } > thead > tr > th { position: relative; padding: 5px; > label { display: inline-block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin: 0; &.sortable { cursor: pointer; } } > div.resizer { z-index: 1; position: absolute; top: 0; inset-inline-end: -5px; width: 2px; height: 100%; cursor: ew-resize; padding: 0 4px; background-color: transparent; } &.tree-menu { cursor: pointer; overflow: visible; } text-align: center; &.char, &.text, &.many2one, &.one2one, &.date, &.time, &.selection, &.reference, &.url, &.email, &.callto, &.sip { text-align: left; text-align: start; } &.timedelta, &.float, &.numeric, &.integer { text-align: right; text-align: end; } } > thead > tr:first-child { position: sticky; top: 0; z-index: 100; th { border: 1px solid transparent; border-bottom: 2px solid @table-border-color; background-color: @body-bg; } &:hover th { border: 1px solid @table-border-color; border-bottom-width: 2px; } } > tfoot > tr { bottom: 0; position: sticky; z-index: 100; th { background-color: @body-bg; & > label { display: none; } & > div.value { .user-select(text); white-space: pre; } } } > tbody > tr > td { cursor: pointer; > * { vertical-align: middle; } } > tbody > tr.dragged-row { background-color: @state-info-bg; } img.column-affix, a.column-affix > img { width: unit(@line-height-base, em); height: unit(@line-height-base, em); display: block; } tr.more-row { text-align: center; } } .editabletree-char, .editabletree-date, .editabletree-datetime, .editabletree-integer, .editabletree-float, .editabletree-selection, .editabletree-timedelta, .editabletree-boolean, .editabletree-many2one, .editabletree-one2many, .editabletree-reference, .editabletree-time { width: 100%; input[type='checkbox'] { margin-top: 0; margin-left: auto; margin-right: auto; } > .input-group { width: 100%; } } @media screen and (min-width: @screen-sm-min) { .editabletree-reference { > .input-sm, > .input-group { width: 50%; } } } td { white-space: nowrap; text-overflow: ellipsis; overflow: hidden; &.edited { /* We have to define an overflow:visible in order for the completion widget to be shown */ overflow: visible; padding: 0 0; } > .column-text { white-space: pre; } } .cell { display: flex; justify-content: space-between; .user-select(text); > * { align-self: center; } .widget, .widget-editable { min-width: 0; flex-grow: 2; > * { width: 100%; } } .widget { > * { overflow: hidden; text-overflow: ellipsis; } > input[type="checkbox"], > input[type="radio"] { overflow: unset; } } .prefix { padding-right: .5 * @table-cell-padding; [dir="rtl"] & { padding-right: 0; padding-left: .5 * @table-cell-padding; } } .suffix { padding-left: .5 * @table-cell-padding; [dir="rtl"] & { padding-left: 0; padding-right: .5 * @table-cell-padding; } } } .expander { cursor: pointer; > img { float: left; [dir="rtl"] & { float: right; } width: unit(@line-height-base, em); height: unit(@line-height-base, em); } } label { font-weight: normal; display: inline; &.required { font-weight: bold; } &.editable { font-style: italic; } } .btn { padding-top: 0; padding-bottom: 0; } > table.table-bordered { border: 1px solid @table-border-color; > thead, > tbody, > tfoot { > tr:first-child { > th, > td { border: 1px solid @table-border-color; } } } > thead > tr:first-child { > th, > td { border-bottom-width: 2px; } } } } .form, .board { width: 100%; height: 100%; .form-container, .form-hcontainer, .form-vcontainer { display: grid; width: 100%; height: 100%; column-gap: 5px; row-gap: 5px; } .form-item { display: flex; > .btn { margin: 5px 0; } } .form-notebook { border-color: @panel-default-border; border-style: solid; border-width: 1px; .nav-tabs { background: @navbar-default-bg; margin-bottom: 5px; } } .form-label { white-space: pre-wrap; width: max-content; max-width: 80ch; } .form-char, .form-password, .form-color, .form-integer, .form-float, .form-timedelta, .form-selection, .form-multiselection, .form-url, .form-email, .form-callto, .form-sip, .form-pyson { input, select { min-width: 8ch; } } .form-date { input { width: calc(10ch + @input-height-base); } } .form-time { input { width: calc(8ch + @input-height-base); } } .form-datetime { input { width: calc(19ch + @input-height-base); } } .form-many2one, .form-one2one, .form-reference, .form-binary { select { min-width: 8ch; } input { min-width: 12ch; &[type='file'] { min-width: unset; } } } .form-selection { select.form-control { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } } @media screen and (min-width: @screen-sm-min) { .form-reference { > .input-sm, > .input-group { width: 50%; } } } @media screen and (max-width: @screen-xs-max) { .form-reference { > .input-sm, > .input-group { width: 100%; } } } .form-url, .form-email, .form-callto, .form-sip { a > img { width: 1em; height: 1em; } } .form-many2one > .input-group { width: 100%; } .form-one2many-menu::after, .form-many2many-menu::after { content: ""; display: table; clear: both; } .form-one2many-menu, .form-many2many-menu { .form-one2many-string, .form-many2many-string { display: inline-table; float: left; margin: 5px; [dir="rtl"] & { float: right; } } .form-one2many-toolbar, .form-many2many-toolbar { display: inline-table; float: right; [dir="rtl"] & { float: left; } .badge { max-width: 5em; min-width: 5em; overflow: hidden; text-overflow: ellipsis; } } } .form-one2many-content, .form-many2many-content { padding: 5px; .treeview, .list-form { height: auto; min-height: 150px; max-height: 300px; } } .form-text, .form-richtext { display: flex; .input-group { display: flex; width: 100%; textarea, .richtext { height: 100%; line-height: 2.5ex; min-height: 12.5ex; overflow: auto; resize: vertical; } > span { flex-basis: fit-content; } } } .form-richtext { > .btn-toolbar { min-width: 450px; } } .form-separator { label { margin-top: 10px; } hr { margin-top: 0; margin-bottom: 5px; } } .form-image { margin: 2px; .caption { min-width: 120px; } } .form-document { object { object-fit: scale-down; object-position: center top; max-width: 100%; min-height: 50vh; height: 100%; width: 100%; @media screen and (max-width: @screen-xs-max) { min-height: 25vh; } } } label { font-weight: normal; display: inline; padding: 0 5px; &.required { font-weight: bold; } &.editable { font-style: italic; } } .nav-tabs { margin-bottom: 15px; } .panel-heading { padding: 2px 2px; } fieldset.form-group_ { overflow: auto; > legend { font-size: @font-size-base; margin-bottom: 5px; } .form-container, .form-hcontainer, .form-vcontainer { vertical-align: middle; } } .xexpand { width: 100%; } .xfill { justify-content: stretch; } .yexpand { height: 100%; } .xalign-start { justify-self: start; justify-content: start; } .xalign-center { justify-self: center; justify-content: center; } .xalign-end { justify-self: end; justify-content: end; } .yalign-start { align-items: start; } .yalign-center { align-items: center; } .yalign-end { align-items: end; } .yfill { align-self: stretch; } } .form-binary, .editabletree-binary { min-width: calc(5 * 2.4em); input:last-of-type { text-align: right; text-align: end; } } .form-multiselection, .dict-multiselection { select { option:before { content: "☐ "; } option:checked:before { content: "☑ "; } } &.yexpand { select { min-height: 150px; max-height: 400px; } } } .form-integer, .form-float, .form-timedelta, .dict-integer, .dict-float, .dict-numeric, .editabletree-integer, .editabletree-float, .editabletree-timedelta { input { text-align: right; text-align: end; } } .column-integer, .column-float, .column-timedelta, .column-binary { text-align: right; text-align: end; } .column-many2many, .column-one2many { text-align: center; } input.column-boolean { .center-block(); } .column-many2one, .column-reference { a:hover:after { content: " 🔗"; display: inline-block; } } .form-date, .form-datetime, .form-time, .dict-date, .dict-datetime, .input-date, .input-datetime-local, .input-time, .editabletree-date, .editabletree-datetime, .editabletree-time { .icon-input { overflow-y: hidden; } input[type="date"], input[type="datetime-local"], input[type="time"] { min-width: 0; opacity: 0; position: absolute; width: calc(100% + 2em); left: -2em; &::-webkit-calendar-picker-indicator { bottom: 0; left: 0; position: absolute; top: 0; width: 100%; height: 100%; } } } .dict-label { text-align: right; text-align: end; } .form-dict-container { display: grid; grid-template-columns: fit-content(50%) 1fr; } .dict-row { display: grid; grid-template-columns: subgrid; grid-column: 1 / span 2; padding: 2px; } .calendar { width: 100%; height: 100%; } .graph { min-height: 400px; } .progress { margin-bottom: 0px; } .window-form { .window-form-toolbar { text-align: right; text-align: end; } } .csv { .modal-dialog { .column-fields { max-height: 400px; overflow: auto; white-space: nowrap; } li.dragged-row { background-color: @state-info-bg; } } } .email { .email-richtext { line-height: 2.5ex; max-height: 50ex; min-height: 12.5ex; overflow: auto; resize: vertical; } input[type='file'] { display: inline-block; } .close { float: none; } } .filter-window { select[multiple] { min-height: 150px; max-height: 400px; option:before { content: "☐ "; } option:checked:before { content: "☑ "; } } } @media screen and (max-width: @screen-xs-max) { .form-dict-container { grid-template-columns: 100%; } .dict-row { grid-column: 1; } .dict-label { text-align: left; text-align: start; } .form-link { display: none; } .form { .form-container, .form-hcontainer, .form-vcontainer { display: block; .form-item { padding: 2px 0; } } .xalign-end { justify-self: start; justify-content: start; } } } @media screen and (max-width: @screen-xs-max) { .responsive.scrollbar { display: none; > div { min-width: unset !important; } } table.responsive, table.responsive > thead, table.responsive > thead > tr, table.responsive > thead > tr > th:not(.invisible), table.responsive > tbody, table.responsive > tbody > tr, table.responsive > tbody > tr > td:not(.invisible), table.responsive > tfoot, table.responsive > tfoot > tr, table.responsive > tfoot > tr > td:not(.invisible) { display: block !important; } table.responsive > thead > tr > th.invisible, table.responsive > tbody > tr > td.invisible, table.responsive > tfoot > tr > td.invisible { display: none; } table.responsive { min-width: unset !important; /* Hide table headers (but not display: none; for accessiblity) */ > thead > tr { position: absolute !important; top: -9999px; left: -9999px; } > thead > tr, > tbody > tr > td { max-width: unset !important; text-align: left !important; text-align: start !important; /* Force height to empty content */ & > span:empty { min-height: calc(@line-height-computed + @table-condensed-cell-padding); display: block; } } .more-row, .cell { .btn { display: block; width: 100%; font-size: @font-size-base; } } tfoot { background-color: @body-bg; border: 1px solid @table-border-color; position: sticky; top: 0; z-index: 100; > tr { & > td:empty, > td > label { display: none !important; } & th { border: none; & > label { display: inline !important; } } } } } table.responsive-noheader { > tbody > tr > td { width: 100% !important; } } table.responsive-header { > tbody > tr { border: 1px solid @table-border-color; } > tbody > tr > td, > tfoot > tr > td { /* Behave like a "row" */ border: none; position: relative; } > tbody > tr, > tfoot > tr { > td[data-title]:before { /* Now like a table header */ position: absolute; /* Top/left values mimic padding */ top: @table-condensed-cell-padding; left: @table-condensed-cell-padding; padding-right: calc(@table-condensed-cell-padding * 2); [dir="rtl"] & { left: unset; right: @table-condensed-cell-padding; padding-right: 0; padding-left: calc(@table-condensed-cell-padding * 2); } text-align: left; text-align: start; overflow: hidden; text-overflow: ellipsis; /* Label */ content: attr(data-title); } > td.required:before { font-weight: bold; } > td.editable:before { font-style: italic; } } } } @keyframes blink { 50% { color: transparent; } } #processing { position: fixed; top: 0px; width: 100%; z-index: 2000; .dot { animation: 1s blink infinite; &:nth-child(2) { animation-delay: 250ms; } &:nth-child(3) { animation-delay: 500ms; } } } .scrollbar { flex: 0 0 content; overflow: auto; > div { height: 5px; } } .btn-code-scanner { bottom: 0; margin: 20px; position: fixed; right: 0; text-align: right; z-index: 1030; } .modal .btn-code-scanner { margin: 5px; position: sticky; } .infobar { line-height: @line-height-computed; position: fixed; top: 30px; left: 50%; transform: translateX(-50%); z-index: 1000; min-width: 25%; text-align: center; font-size: @font-size-large; } img.global-search-icon { width: 2em; height: 2em; } img.favorite-icon { width: 1em; height: 1em; } @import "input-icon"; @import (optional) "custom.less";