@deephaven/dashboard 0.62.1-beta.1 → 0.62.1-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
1
  /* stylelint-disable scss/at-import-no-partial-leading-underscore */
2
2
  /* stylelint-disable-next-line number-max-precision */
3
+ /* stylelint-disable no-descending-specificity */
3
4
  .lm_root {
4
5
  position: relative;
5
6
  }
@@ -96,7 +97,7 @@
96
97
  cursor: pointer;
97
98
  height: 14px;
98
99
  margin-top: 1px;
99
- padding: 0px 10px 5px;
100
+ padding: 0 10px 5px;
100
101
  padding-right: 25px;
101
102
  position: relative;
102
103
  min-width: 0;
@@ -138,7 +139,7 @@
138
139
  transform-origin: left top;
139
140
  top: 0;
140
141
  width: 1000px;
141
- /*hack*/
142
+ /* hack */
142
143
  }
143
144
  .lm_dragProxy.lm_left .lm_header .lm_controls,
144
145
  .lm_dragProxy.lm_right .lm_header .lm_controls,
@@ -288,6 +289,7 @@
288
289
  z-index: 20;
289
290
  }
290
291
 
292
+ /* stylelint-disable no-descending-specificity */
291
293
  /* stylelint-disable scss/at-import-no-partial-leading-underscore */
292
294
  /* stylelint-disable-next-line number-max-precision */
293
295
  .lm_dragging {
@@ -309,12 +311,14 @@ body:not(.lm_dragging) .lm_header .lm_tab:not(.lm_active):hover {
309
311
  }
310
312
 
311
313
  body:not(.lm_dragging) .lm_header .lm_tab:hover .lm_close_tab {
312
- opacity: 0.4;
313
- transition: opacity 300ms ease;
314
+ opacity: 0.35;
314
315
  }
315
316
  body:not(.lm_dragging) .lm_header .lm_tab:hover .lm_close_tab:hover {
316
317
  opacity: 1;
317
318
  }
319
+ body:not(.lm_dragging) .lm_header .lm_tab:hover .lm_close_tab:hover::before {
320
+ opacity: 1;
321
+ }
318
322
 
319
323
  .lm_goldenlayout {
320
324
  background: var(--dh-color-bg, #1a171a);
@@ -395,19 +399,19 @@ body:not(.lm_dragging) .lm_header .lm_tab:hover .lm_close_tab:hover {
395
399
  color: var(--dh-color-gray-600);
396
400
  height: 28px;
397
401
  font-size: 12px;
398
- min-width: 5rem;
402
+ min-width: 10ch;
399
403
  margin: 0;
400
- padding: 0 0.25rem 0 0.5rem;
404
+ padding: 0 0 0 6px;
401
405
  box-shadow: inset -1px -1px 0 0 var(--dh-color-bg, #1a171a);
402
406
  transition: color 0.15s, background-color 0.15s;
403
- max-width: 12rem;
407
+ max-width: 12.25rem;
404
408
  white-space: nowrap;
405
409
  overflow: hidden;
406
410
  }
407
411
  .lm_header .lm_tab .lm_title,
408
412
  .lm_tabdropdown_list .lm_tab .lm_title {
409
413
  flex-grow: 1;
410
- padding-right: 0.25rem;
414
+ padding-right: 6px;
411
415
  }
412
416
  .lm_header .lm_tab .lm_title_before,
413
417
  .lm_tabdropdown_list .lm_tab .lm_title_before {
@@ -416,20 +420,35 @@ body:not(.lm_dragging) .lm_header .lm_tab:hover .lm_close_tab:hover {
416
420
  }
417
421
  .lm_header .lm_tab .lm_close_tab,
418
422
  .lm_tabdropdown_list .lm_tab .lm_close_tab {
423
+ margin-left: -6px;
424
+ flex-shrink: 0;
425
+ cursor: pointer;
426
+ position: relative;
427
+ width: 18px;
428
+ height: 100%;
429
+ opacity: 0;
430
+ }
431
+ .lm_header .lm_tab .lm_close_tab::before,
432
+ .lm_tabdropdown_list .lm_tab .lm_close_tab::before {
433
+ content: "";
434
+ position: absolute;
435
+ inset: 3px 3px 3px 1px;
436
+ border-radius: 2px;
437
+ background-color: var(--dh-color-highlight-selected-hover);
438
+ opacity: 0;
439
+ transition: opacity 0.15s ease;
440
+ }
441
+ .lm_header .lm_tab .lm_close_tab::after,
442
+ .lm_tabdropdown_list .lm_tab .lm_close_tab::after {
419
443
  background-size: 8px;
420
444
  background-color: var(--dh-color-fg);
421
445
  mask-image: var(--dh-svg-icon-close-tab);
422
446
  mask-position: center center;
423
447
  mask-repeat: no-repeat;
424
448
  mask-size: 8px;
425
- cursor: pointer;
426
- position: relative;
427
- width: 8px;
428
- height: 8px;
429
- padding: 4px;
430
- margin-left: -0.25rem;
431
- opacity: 0;
432
- transition: opacity 300ms ease;
449
+ content: "";
450
+ position: absolute;
451
+ inset: 0 2px 0 0;
433
452
  }
434
453
 
435
454
  .lm_selected .lm_header {
@@ -448,6 +467,10 @@ body:not(.lm_dragging) .lm_header .lm_tab:hover .lm_close_tab:hover {
448
467
  .lm_header .lm_tab.lm_active:hover.lm_focusin {
449
468
  box-shadow: inset 0 1px var(--dh-color-accent-bg), inset -1px 0 0 0 var(--dh-color-bg, #1a171a);
450
469
  }
470
+ .lm_header .lm_tab.lm_active .lm_close_tab,
471
+ .lm_header .lm_tab.lm_active:hover .lm_close_tab {
472
+ opacity: 0.35;
473
+ }
451
474
 
452
475
  .lm_window_blur .lm_header .lm_tab.lm_active.lm_focusin {
453
476
  box-shadow: inset -1px 0 0 0 var(--dh-color-bg, #1a171a);
@@ -455,7 +478,7 @@ body:not(.lm_dragging) .lm_header .lm_tab:hover .lm_close_tab:hover {
455
478
 
456
479
  .lm_controls > li {
457
480
  opacity: 0.4;
458
- transition: opacity 300ms ease;
481
+ transition: opacity 0.15s ease;
459
482
  position: relative;
460
483
  background-position: center center;
461
484
  background-repeat: no-repeat;
@@ -586,9 +609,9 @@ body:not(.lm_dragging) .lm_header .lm_tab:hover .lm_close_tab:hover {
586
609
 
587
610
  .lm_tab .editor-unsaved-indicator {
588
611
  display: none;
589
- margin-right: 5px;
590
612
  width: 8px;
591
613
  height: 8px;
614
+ margin-right: 0.25rem;
592
615
  border-radius: 50%;
593
616
  background: var(--dh-color-accent-bg);
594
617
  }
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../../node_modules/@deephaven/components/scss/custom.scss","../../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss","../../../../node_modules/@deephaven/golden-layout/scss/goldenlayout-base.scss","../../../../node_modules/@deephaven/golden-layout/scss/goldenlayout-dark-theme.scss","../../../../node_modules/@deephaven/components/scss/new_variables.scss","../../../../node_modules/@deephaven/components/scss/util.scss","../../../../node_modules/bootstrap/scss/_variables.scss","../../src/layout/GoldenLayout.scss"],"names":[],"mappings":"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","file":"GoldenLayout.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n@import './util.scss';\n","// Styling overrides for bootstrap\n@use 'sass:map';\n\n// Override / set color variables\n$red: var(--dh-color-visual-red);\n$orange: var(--dh-color-visual-orange);\n$yellow: var(--dh-color-visual-yellow);\n$green: var(--dh-color-visual-green);\n$blue: var(--dh-color-visual-blue);\n$purple: var(--dh-color-visual-purple);\n\n// Fallback colors are used if theme isn't loaded\n// this is required for error messages if the API doesn't load\n\n//Define our Gray scale\n$gray-100: var(--dh-color-gray-900, #fcfcfa);\n$gray-200: var(--dh-color-gray-800);\n$gray-300: var(--dh-color-gray-700);\n$gray-400: var(--dh-color-gray-600);\n$gray-500: var(--dh-color-gray-500);\n// intentional duplicate, scale doesn't line up otherwise\n// as we have gray-850 and spectrum doesn't and it is needed\n$gray-600: var(--dh-color-gray-500);\n$gray-700: var(--dh-color-gray-400);\n$gray-800: var(--dh-color-gray-300);\n$gray-850: var(--dh-color-gray-200);\n$gray-900: var(--dh-color-gray-75);\n$black: var(--dh-color-black, #1a171a);\n$white: var(--dh-color-white, #f0f0ee);\n\n//Define some UI colors\n$interfacegray: var(--dh-color-content-bg, #2d2a2e);\n$interfaceblue: var(--dh-color-accent-bg);\n$interfacewhite: $white;\n$interfaceblack: $black;\n$content-bg: var(--dh-color-content-bg, #2d2a2e);\n$background: var(--dh-color-bg, #1a171a);\n$foreground: var(--dh-color-fg, #f0f0ee);\n\n// Extend default Bootstrap $grays map\n$grays-custom: (\n '850': $gray-850,\n);\n$grays: () !default;\n$grays: map-merge($grays, $grays-custom);\n\n// Extend default Bootstrap $colors map\n$colors-custom: (\n 'black': $black,\n);\n$colors: () !default;\n$colors: map-merge($colors, $colors-custom);\n\n// Override default Bootstrap $theme-colors map by mapping each key to itself.\n// These will then be re-mapped inside of `button-outline-variant` and\n// `button-outline-variant` mixins in `bootstrap_override_mixins_buttons.scss`\n$theme-colors-self-map: ();\n@each $key\n in (\n 'primary',\n 'secondary',\n 'success',\n 'info',\n 'warning',\n 'danger',\n 'light',\n 'dark'\n )\n{\n $theme-colors-self-map: map.set($theme-colors-self-map, $key, $key);\n}\n$theme-colors: () !default;\n$theme-colors: map-merge($theme-colors, $theme-colors-self-map);\n\n// Used by bootstrap_override_mixins_buttons.scss to map Bootstrap colors to\n// DH semantic colors\n$bootstrap-dh-semantic-map: (\n 'primary': 'accent',\n 'secondary': 'neutral',\n 'success': 'positive',\n 'info': 'info',\n 'warning': 'notice',\n 'danger': 'negative',\n // We shouldn't be using these, but mapping so they work with our custom\n // `color-yiq` mixin. If we find a way to remove $light + $dark that are\n // defined in Bootstrap _variables.scss, we should remove these\n 'light': 'neutral',\n 'dark': 'neutral',\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: var(--dh-color-accent-bg);\n$primary-hover: var(--dh-color-accent-hover-bg);\n$primary-dark: var(--dh-color-accent-down-bg);\n$secondary: var(--dh-color-neutral-bg);\n$secondary-hover: var(--dh-color-neutral-hover-bg);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: var(--dh-color-negative-bg);\n$danger-hover: var(--dh-color-negative-hover-bg);\n// We really don't want to use $light or $dark variables, but Bootstrap defines\n// them in _variables.scss. Explicitly setting them to ensure we are in control\n// of their values. If we can find a way to remove them, we should\n$light: var(--dh-color-gray-light);\n$dark: var(--dh-color-gray-dark);\n// Bootstrap doesn't define $mid, and we want to move away from this particular\n// semantic. Should be deleted by #1635\n$mid: var(--dh-color-gray-mid);\n\n$semantic-colors: (\n 'primary-hover': $primary-hover,\n 'primary-dark': $primary-dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n 'secondary-hover': $secondary-hover,\n 'danger-hover': $danger-hover,\n);\n\n$component-active-bg: $primary;\n$theme-color-interval: 9%;\n$yiq-contrasted-threshold: 180;\n\n// Override fonts\n$font-family-sans-serif:\n 'Fira Sans',\n -apple-system,\n blinkmacsystemfont,\n 'Segoe UI',\n 'Roboto',\n 'Helvetica Neue',\n arial,\n sans-serif; //fira sans then native system ui fallbacks\n$font-family-monospace: 'Fira Mono', menlo, monaco, consolas, 'Liberation Mono',\n 'Courier New', monospace;\n$font-family-base: $font-family-sans-serif;\n\n$headings-font-weight: 400;\n\n//Text overides\n$text-muted: $gray-400;\n\n//Style Selection highlight color\n$text-select-color: var(--dh-color-text-highlight);\n\n//Grid variables, same value as default just making easily accessible\n$grid-gutter-width: 30px;\n\n//Visual Overrides\n$border-radius: 4px;\n$box-shadow: 0 0.1rem 1rem var(--dh-color-dropshadow);\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition:\n color 0.12s ease-in-out,\n background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out,\n box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n$btn-font-weight: var(--spectrum-global-font-weight-bold);\n$btn-line-height: 1.3;\n\n//Override Inputs\n$input-bg: var(--dh-color-input-bg);\n$input-disabled-bg: var(--dh-color-input-disabled-bg);\n$input-color: var(--dh-color-input-fg);\n$input-border-color: var(--dh-color-input-border);\n$input-placeholder-color: var(--dh-color-input-placeholder);\n$input-focus-border-color: var(--dh-color-input-focus-border);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: color-mix(\n in srgb,\n var(--dh-color-accent) 35%,\n transparent\n);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n$input-btn-line-height: 1.3;\n// Bootstrap uses a calc expression to determine the input height (calc(line-height + 2*padding-y + border)).\n// The padding-y value has to be in rem to match units as it is a SASS calc.\n// Using 0.42145rem with 1.3 line height gets us to spectrum's 32px.\n/* stylelint-disable-next-line number-max-precision */\n$input-btn-padding-y: 0.42145rem;\n\n//checkbox\n$custom-control-indicator-bg: var(--dh-color-input-bg);\n$custom-control-indicator-border-color: var(--dh-color-input-border);\n$custom-checkbox-indicator-border-radius: 2px;\n$custom-control-indicator-border-width: 2px;\n$custom-control-indicator-active-bg: var(--dh-color-input-bg);\n$custom-control-indicator-active-border-color: var(--dh-color-input-fg);\n$custom-control-indicator-checked-bg: var(--dh-color-input-fg);\n$custom-control-indicator-checked-color: black; // used as mask fill color\n$custom-checkbox-indicator-indeterminate-bg: var(--dh-color-input-fg);\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: var(--dh-color-input-disabled-bg);\n$custom-control-indicator-checked-disabled-bg: var(\n --dh-color-input-disabled-bg\n);\n$custom-control-label-disabled-color: var(--dh-color-input-disabled-fg);\n\n// The $custom-select-indicator variable is used by Bootstrap to provide the\n// icon for the select dropdown. Inline svgs can't use CSS variables, so we hard\n// code the color to #929192 (the default value of --dh-color-gray-600). PR #1651\n// overrides this icon altogether for known dropdowns, so technically we may not\n// need this, but it's here in case there are any remaining instances.\n$custom-select-indicator-color: #929192;\n$custom-select-bg: var(--dh-color-selector-bg);\n$custom-select-bg-size: 16px 16px;\n//dhSort icon encoded\n$custom-select-indicator: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M4 7l-.4-.8 4-3.7h.8l4 3.7-.4.8H4zm0 2l-.4.8 4 3.7h.8l4-3.7L12 9H4z'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n);\n$custom-select-focus-box-shadow: $input-btn-focus-box-shadow;\n$custom-select-disabled-color: $gray-500;\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $content-bg;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n$close-color: var(--dh-color-text);\n$close-text-shadow: none;\n\n// Toast notification\n$toast-bg: var(--dh-color-accent-100);\n$toast-color: var(--dh-color-text);\n$toast-error-bg: var(--dh-color-negative-bg);\n$toast-error-color: var(--dh-color-text);\n\n//tooltips\n$tooltip-bg: var(--dh-color-tooltip-bg);\n$tooltip-color: var(--dh-color-tooltip-fg);\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem var(--dh-color-tooltip-box-shadow);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: var(--dh-color-item-list-hover-bg);\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: var(--dh-color-popover-bg);\n$contextmenu-color: var(--dh-color-text);\n$contextmenu-disabled-color: var(--dh-color-input-disabled-fg);\n$contextmenu-keyboard-selected-bg: var(--dh-color-keyboard-selected-bg);\n$contextmenu-selected-bg: var(--dh-color-item-list-hover-bg);\n$contextmenu-selected-color: var(--dh-color-item-list-selected-fg);\n\n//hr\n$hr-border-color: var(--dh-color-hr);\n\n//links\n$link-color: $gray-400;\n$link-hover-color: $foreground;\n\n//progress-bar\n$progress-bg: $gray-600;\n$progress-border-radius: 1rem;\n\n// Set global options\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-print-styles: false; //I don't think anyone should expect to \"print\" this app.\n\n// Transition times\n$transition: 0.15s;\n$transition-mid: 0.2s;\n$transition-long: 0.3s;\n$transition-slow: 0.6s;\n\n//form-validation icon, uses vsWarning icon encoded here as svg\n$form-feedback-icon-invalid-color: $danger;\n$form-feedback-icon-invalid: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cg fill='none'%3E%3Cg fill='#{$form-feedback-icon-invalid-color}'%3E%3Cpath d='M7.56 1h.88l6.54 12.26-.44.74H1.44L1 13.26 7.56 1zM8 2.28 2.28 13H13.7L8 2.28zM8.625 12v-1h-1.25v1h1.25zm-1.25-2V6h1.25v4h-1.25z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E \"),\n '#',\n '%23'\n);\n\n// This section of variables is not consumed directly by DH, but they need to be\n// defined for sass to compile _variables\n$table-dark-bg: $gray-800;\n$table-dark-accent-bg: var(--dh-color-highlight-hover);\n$table-dark-hover-bg: var(--dh-color-highlight-active);\n$table-dark-border-color: $gray-700;\n$popover-bg: var(--dh-color-tooltip-bg);\n$popover-border-color: var(--dh-color-overlay-modal-bg);\n$popover-header-bg: #000;\n$popover-arrow-outer-color: var(--dh-color-dropshadow);\n$custom-range-thumb-active-bg: var(--dh-color-accent-1100);\n","// Width variables (appears count calculates by raw css)\n$width0: 100%; // Appears 3 times\n$width1: 20px; // Appears 2 times\n$width2: 100px; // Appears 1 time\n$width3: 14px; // Appears 1 time\n$width4: 18px; // Appears 1 time\n$width5: 15px; // Appears 1 time\n$width6: 2px; // Appears 1 time\n\n// Height variables (appears count calculates by raw css)\n$height0: 100%; // Appears 4 times\n$height1: 20px; // Appears 2 times\n$height2: 14px; // Appears 2 times\n$height3: 10px; // Appears 1 time\n$height4: 19px; // Appears 1 time\n$height5: 18px; // Appears 1 time\n$height6: 15px; // Appears 1 time\n\n.lm_root {\n position: relative;\n}\n\n.lm_row > .lm_item {\n float: left;\n}\n\n// Single Pane content (area in which final dragged content is contained)\n.lm_content {\n overflow: hidden;\n position: relative;\n outline: 0;\n}\n\n// \".lm_dragging\" is applied to BODY tag during Drag and is also directly applied to the root of the object being dragged\n.lm_dragging,\n.lm_dragging * {\n cursor: grabbing !important;\n user-select: none;\n}\n\n// If a specific Pane is maximized\n.lm_maximised {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 40;\n}\n\n.lm_maximise_placeholder {\n display: none;\n}\n\n// Separator line (handle to change pane size)\n.lm_splitter {\n position: relative;\n z-index: 20;\n\n &:hover, // When hovered by mouse...\n &.lm_dragging {\n background: orange;\n }\n\n &.lm_vertical {\n .lm_drag_handle {\n width: $width0;\n position: absolute;\n cursor: ns-resize;\n }\n }\n\n &.lm_horizontal {\n float: left;\n height: $height0;\n\n .lm_drag_handle {\n height: $height0;\n position: absolute;\n cursor: ew-resize;\n }\n }\n}\n\n// Pane Header (container of Tabs for each pane)\n.lm_header {\n display: flex;\n justify-content: space-between;\n max-width: 100%;\n z-index: 12; //above lm_content, below lm_splitter\n position: relative;\n overflow: hidden;\n\n &.lm_dropdown_open {\n // This is an ugly hack, z-index of the whole header needs to be moved up\n // when the menu is open, because its positioned relative to header.\n // The header has a position, which creates a stacking context\n // that can result in the next header being \"above\" the dropdown.\n // The same problem happens for splitters too.\n // A better solution would refactor the dropdown to be a root node,\n // and in general use z-index way less.\n z-index: 22; //above other lm_headers and lm_splitter\n }\n\n [class^='lm_'] {\n box-sizing: content-box !important;\n }\n\n // Pane controls (popout, maximize, minimize, close)\n .lm_controls {\n display: flex;\n user-select: none;\n\n > li {\n cursor: pointer;\n float: left;\n width: $width4;\n height: $height5;\n text-align: center;\n }\n\n > li[disabled] {\n cursor: default;\n opacity: 0.1;\n }\n }\n\n ul {\n margin: 0;\n padding: 0;\n list-style-type: none;\n }\n\n .lm_tabs {\n display: flex;\n flex-grow: 1;\n overflow: hidden;\n }\n\n // Single Tab container. A single Tab is set for each pane, a group of Tabs are contained in \".lm_header\"\n .lm_tab {\n cursor: pointer;\n height: $height2;\n margin-top: 1px;\n padding: 0px 10px 5px;\n padding-right: 25px;\n position: relative;\n min-width: 0;\n flex-shrink: 0;\n\n .lm_title {\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n }\n\n // Close Tab Icon\n .lm_close_tab {\n width: $width3;\n height: $height2;\n position: absolute;\n top: 0;\n right: 0;\n text-align: center;\n }\n }\n}\n\n// Headers positions\n.lm_stack.lm_left,\n.lm_stack.lm_right {\n .lm_header {\n height: 100%;\n }\n}\n\n.lm_dragProxy.lm_left,\n.lm_dragProxy.lm_right,\n.lm_stack.lm_left,\n.lm_stack.lm_right {\n .lm_header {\n width: 20px;\n float: left;\n vertical-align: top;\n .lm_tabs {\n transform-origin: left top;\n top: 0;\n width: 1000px; /*hack*/\n }\n .lm_controls {\n bottom: 0;\n }\n }\n .lm_items {\n float: left;\n }\n}\n\n.lm_dragProxy.lm_left,\n.lm_stack.lm_left {\n .lm_header {\n .lm_tabs {\n transform: rotate(-90deg) scaleX(-1);\n left: 0;\n .lm_tab {\n transform: scaleX(-1);\n margin-top: 1px;\n }\n }\n .lm_tabdropdown_list {\n top: initial;\n right: initial;\n left: 20px;\n }\n }\n}\n\n.lm_dragProxy.lm_right .lm_content {\n float: left;\n}\n\n.lm_dragProxy.lm_right,\n.lm_stack.lm_right {\n .lm_header {\n .lm_tabs {\n transform: rotate(90deg) scaleX(1);\n left: 100%;\n margin-left: 0;\n }\n .lm_controls {\n left: 3px;\n }\n .lm_tabdropdown_list {\n top: initial;\n right: 20px;\n }\n }\n}\n\n.lm_dragProxy.lm_bottom,\n.lm_stack.lm_bottom {\n .lm_header {\n .lm_tab {\n margin-top: 0;\n border-top: none;\n }\n .lm_controls {\n top: 3px;\n }\n .lm_tabdropdown_list {\n top: initial;\n bottom: 20px;\n }\n }\n}\n\n.lm_drop_tab_placeholder {\n flex-shrink: 0;\n}\n\n// Dropdown arrow for additional tabs when too many to be displayed\n.lm_tabdropdown_list {\n position: absolute;\n overflow-y: auto;\n overflow-x: hidden;\n top: 0;\n left: 0;\n max-height: 100%;\n\n .lm_tabs {\n flex-direction: column;\n }\n\n .lm_tab {\n padding-right: 10px;\n\n .lm_title {\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n }\n }\n\n .lm_close_tab {\n display: none !important;\n }\n}\n\n/***********************************\n* Drag Proxy\n***********************************/\n\n// Single Pane content during Drag (style of moving window following mouse)\n.lm_dragProxy {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 30;\n pointer-events: none;\n\n .lm_header {\n background: transparent;\n }\n\n .lm_content {\n border-top: none;\n overflow: hidden;\n }\n}\n\n// Placeholder Container of target position\n.lm_dropTargetIndicator {\n display: none;\n position: absolute;\n z-index: 20;\n pointer-events: none;\n\n // Inner Placeholder\n .lm_inner {\n width: $width0;\n height: $height0;\n position: relative;\n top: 0;\n left: 0;\n }\n}\n\n// If a specific Pane is Popped Out, so move it to a different Browser Window, Icon to restore original position is:\n.lm_popin {\n width: $width1;\n height: $height1;\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 9999;\n\n > * {\n width: $width0;\n height: $height0;\n position: absolute;\n top: 0;\n left: 0;\n }\n\n > .lm_bg {\n z-index: 10;\n }\n\n > .lm_icon {\n z-index: 20;\n }\n}\n","@import '@deephaven/components/scss/custom.scss';\n\n$tab-height: 28px;\n$drag-border-width: 5px;\n\n$close-button-height: 8px;\n$tab-font-size: 12px;\n\n$lm-tab-color: $gray-400;\n$lm-tab-hover-color: $gray-300;\n$lm-tab-active-color: var(--dh-color-text);\n$lm-tab-icon-color: $gray-200;\n\n//make some subtle tab background colors relative to our defined color\n$lm-tab-active-background: var(--dh-color-golden-layout-tab-selected-bg);\n$lm-tab-background: var(--dh-color-golden-layout-tab-bg);\n$lm-header-background: var(--dh-color-golden-layout-tab-header-bg);\n\n$lm-splitter-hover-color: $gray-400;\n$lm-splitter-active-color: $gray-300;\n\n@mixin hover-opacity {\n opacity: 0.4;\n transition: opacity 300ms ease;\n\n &:hover {\n opacity: 1;\n }\n}\n\n// \".lm_dragging\" is applied to BODY tag during Drag and is also directly applied to the root of the object being dragged\n//is added to the body class, prevents overflow in our app context\n.lm_dragging {\n overflow: hidden;\n pointer-events: none;\n\n // we still need events on our header for scroll while dragging to work\n .lm_goldenlayout .lm_header {\n pointer-events: auto;\n\n // disable other control buttons during drag\n .lm_controls > li {\n pointer-events: none;\n\n &.lm_tabpreviousbutton,\n &.lm_tabnextbutton {\n pointer-events: auto;\n }\n }\n }\n}\n\n// disable hover styling during drag (pointer-events still needed)\nbody:not(.lm_dragging) .lm_header .lm_tab:not(.lm_active):hover {\n color: $lm-tab-hover-color;\n}\n\nbody:not(.lm_dragging) .lm_header .lm_tab:hover .lm_close_tab {\n @include hover-opacity;\n}\n\n// Entire GoldenLayout Container, if a background is set, it is visible as color of \"pane header\" and \"splitters\" (if these latest has opacity very low)\n.lm_goldenlayout {\n background: $background;\n position: absolute;\n}\n\n// Single Pane content (area in which final dragged content is contained)\n.lm_content {\n background: $content-bg;\n overflow: visible;\n}\n\n// Single Pane content during Drag (style of moving window following mouse)\n.lm_dragProxy {\n .lm_content {\n height: 100%;\n width: 100%;\n box-shadow: $box-shadow;\n }\n .lm_header {\n height: $tab-height;\n box-shadow: none;\n\n .lm_tab,\n .lm_tab.lm_active {\n border: 0;\n box-shadow: $box-shadow;\n }\n }\n}\n\n// Placeholder Container of target position\n.lm_dropTargetIndicator {\n @include ants-base($white, $black); //replace with ants\n\n box-sizing: border-box;\n transition: all $transition-mid ease;\n\n // Inner Placeholder\n .lm_inner {\n box-sizing: border-box;\n border: $ant-thickness solid transparent; //offset shadow using a transparent border\n box-shadow: inset 0 0 1rem 1px var(--dh-color-dropshadow);\n opacity: 1; //set opacity back to 1, default 0.2 and backroudn was solid.\n background: accent-opacity(10);\n }\n}\n\n// Separator line (handle to change pane size)\n.lm_splitter {\n background: $lm-splitter-hover-color;\n opacity: 0.001;\n transition: opacity $transition ease;\n\n &:hover, // When hovered by mouse...\n &.lm_dragging {\n background: $lm-splitter-active-color;\n opacity: 1;\n }\n}\n\n// Pane Header (container of Tabs for each pane)\n.lm_header {\n box-sizing: content-box; // golden-layout sets a js height using a content box model\n height: $tab-height;\n padding-top: 0;\n background: $lm-header-background;\n box-shadow: inset 0 -1px 0 0 $background;\n // inset box shadows with 0-blur used to draw borders without impacting spacing or GL size calculations.\n // golden layout default styling doesnt have the same border styling we want\n // this trick is used elsewhere in the header as well for the same purpose\n user-select: none;\n\n .lm_controls {\n > li {\n height: 100%;\n width: 24px;\n }\n }\n\n &.lm_selectable {\n cursor: pointer;\n }\n}\n\n.lm_header,\n.lm_tabdropdown_list {\n // Single Tab container. A single Tab is set for each pane, a group of Tabs are contained in \".lm_header\"\n .lm_tab {\n display: flex;\n align-items: center;\n font-family: $font-family-sans-serif;\n background-color: $lm-tab-background;\n color: $lm-tab-color;\n height: $tab-height;\n font-size: $tab-font-size;\n min-width: 5rem;\n margin: 0;\n padding: 0 $spacer-1 0 $spacer-2;\n box-shadow: inset -1px -1px 0 0 $background; // acting as bottom and right border\n transition:\n color $transition,\n background-color $transition;\n max-width: 12rem;\n white-space: nowrap;\n overflow: hidden;\n\n .lm_title {\n flex-grow: 1;\n padding-right: $spacer-1;\n // add equalized spacing for tabs without close buttons\n // so that when a tab is longer then min-width it still\n // is balanced with equal padding. Extra padding is then\n // removed from tabs with close buttons via negative margin\n }\n\n .lm_title_before {\n display: flex;\n align-items: center;\n }\n\n // Close Tab Icon\n .lm_close_tab {\n $lm-close-button-padding: 4px;\n\n @include icon-image-mask(\n var(--dh-svg-icon-close-tab),\n $close-button-height\n );\n\n cursor: pointer;\n position: relative;\n width: $close-button-height;\n height: $close-button-height;\n padding: $lm-close-button-padding;\n margin-left: -$spacer-1; // undo padding on title\n opacity: 0;\n transition: opacity 300ms ease;\n }\n }\n}\n\n// If Pane Header (container of Tabs for each pane) is selected (used only if addition of new Contents is made \"by selection\" and not \"by drag\")\n.lm_selected {\n .lm_header {\n background-color: $lm-tab-active-background;\n }\n}\n\n.lm_header .lm_tab.lm_active,\n.lm_header .lm_tab.lm_active:hover {\n height: $tab-height;\n background-color: $lm-tab-active-background;\n color: $lm-tab-active-color;\n padding-bottom: 0;\n box-shadow: inset -1px 0 0 0 $background; // act as right border only when active\n // also kills the default shadow, doesn't work well with our design\n &.lm_focusin {\n box-shadow:\n inset 0 1px $primary,\n inset -1px 0 0 0 $background; // top focus indicator, right border\n }\n}\n\n.lm_window_blur {\n .lm_header .lm_tab.lm_active.lm_focusin {\n box-shadow: inset -1px 0 0 0 $background;\n }\n}\n\n// Pane controls (popout, maximize, minimize, close)\n.lm_controls {\n // All Pane controls shares these\n > li {\n @include hover-opacity;\n\n position: relative;\n background-position: center center;\n background-repeat: no-repeat;\n }\n\n // Icon to PopOut Pane, so move it to a different Browser Window\n .lm_popout {\n // Leaving this inline since it is a PNG. We should convert it to a 16px\n // SVG like other icons and move to a css variable so it can be overridden.\n @include icon-image-mask(\n url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAPklEQVR4nI2Q0QoAIAwCNfr/X7aXCpGN8snBdgejJOzckpkxs9jR6K6T5JpU0nWl5pSXTk7qwh8SnNT+CAAWCgkKFpuSWsUAAAAASUVORK5CYII='),\n auto\n );\n }\n\n // Icon to Maximize Pane, so it will fill the entire GoldenLayout Container\n .lm_maximise {\n @include icon-image-mask(var(--dh-svg-icon-maximise));\n }\n\n .lm_tabdropdown {\n @include icon-image-mask(var(--dh-svg-icon-tab-dropdown));\n }\n\n // Icon to Close Pane and so remove it from GoldenLayout Container\n .lm_close {\n @include icon-image-mask(var(--dh-svg-icon-close));\n }\n\n .lm_tabnextbutton {\n @include icon-image-mask(var(--dh-svg-icon-next));\n }\n\n .lm_tabpreviousbutton {\n @include icon-image-mask(var(--dh-svg-icon-prev));\n }\n}\n\n.lm_tabdropdown_list {\n z-index: $zindex-dropdown;\n background: var(--dh-color-popover-bg);\n box-shadow: $box-shadow;\n border-radius: $border-radius;\n max-width: 12rem;\n margin: 0;\n padding: 0;\n list-style-type: none;\n\n .lm_tabdropdown_search {\n padding: $spacer-1;\n input {\n padding: $input-padding-y $input-padding-x;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n border: $input-border-width solid $input-border-color;\n border-radius: $border-radius;\n max-width: 100%;\n\n &::placeholder {\n color: $input-placeholder-color;\n opacity: 1;\n }\n\n &:focus {\n border-color: $input-focus-border-color;\n box-shadow: $input-btn-focus-box-shadow;\n outline: 0;\n }\n }\n }\n\n .lm_tabs {\n padding: 0;\n }\n\n .lm_tab {\n background: transparent;\n color: $lm-tab-hover-color;\n box-shadow: none;\n\n &.lm_keyboard_active {\n color: $lm-tab-hover-color;\n background-color: var(--dh-color-highlight-selected);\n\n &:hover {\n background-color: var(--dh-color-highlight-selected-hover);\n }\n }\n\n &:hover {\n color: $lm-tab-active-color;\n background-color: var(--dh-color-highlight-hover);\n }\n }\n}\n\n// If a specific Pane is maximized\n.lm_maximised {\n border: 15px solid bg-opacity(80);\n height: 100% !important;\n width: 100% !important;\n .lm_items {\n box-shadow: $box-shadow;\n }\n\n // Pane controls are different in Maximized Mode, especially the old Icon \"Maximise\" that now has a different meaning, so \"Minimize\" (even if CSS Class did not change)\n .lm_controls {\n .lm_maximise {\n @include icon-image-mask(var(--dh-svg-icon-minimise));\n }\n }\n}\n\n.lm_tabs:empty + .lm_controls .lm_maximise {\n display: none;\n}\n","@use 'sass:math';\n\n//Set of spacer variables from the spacer map\n$spacer-0: map-get($spacers, 0); //0\n$spacer-1: map-get($spacers, 1);\n$spacer-2: map-get($spacers, 2);\n$spacer-3: map-get($spacers, 3);\n$spacer-4: map-get($spacers, 4);\n$spacer-5: map-get($spacers, 5);\n\n//Marching Ants for golden layout dropzone and drag and drop\n//top bottom, left right.\n//create 4 background images that are 50% color 1, 50% color 2 using graidents, two veritical, two horizontal\n//size them to ant-size and thickness\n//position those images along the egdes and make top/bottom repeat-x and left/right repeat-y\n//then offest each of those background positions by ant-size in animation to make them march.\n$ant-size: 8px;\n$ant-thickness: 1px;\n\n@mixin ants-base($color-1: black, $color-2: white) {\n background-image: linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%);\n background-size:\n $ant-size $ant-thickness,\n $ant-size $ant-thickness,\n $ant-thickness $ant-size,\n $ant-thickness $ant-size;\n background-position:\n 0 top,\n 0 bottom,\n left 0,\n right 0;\n background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;\n animation: march 0.5s;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n\n@mixin drag-stack($pseudo-element) {\n &::#{$pseudo-element} {\n content: ' ';\n background: $primary;\n box-shadow: $box-shadow;\n border-radius: $border-radius;\n position: absolute;\n height: 100%;\n width: 100%;\n @content;\n }\n}\n\n$focus-bg-transparency: 12%;\n$hover-bg-transparency: 14%;\n$active-bg-transparency: 28%;\n$exception-transparency: 13%;\n","// Setup a mask-image for an inline svg\n@mixin icon-image-mask($mask-image, $size: 16px) {\n background-size: $size;\n background-color: var(--dh-color-fg);\n mask-image: $mask-image;\n mask-position: center center;\n mask-repeat: no-repeat;\n mask-size: $size;\n}\n\n// Caret icon for pickers, dropdowns, select, etc.\n@mixin caret-icon() {\n $width: 10px;\n $height: 6px;\n @include icon-image-mask(var(--dh-svg-icon-selector-caret), $width $height);\n\n background-color: var(--dh-color-selector-fg);\n width: $width;\n height: $height;\n}\n\n/// Utilty for increasing specificity by repeating a given selector n number of\n/// times.\n///\n/// It should work for selectors that can be concatenated without delimiters\n/// such as '.some-selector.some-selector', '#some-id#some-id', or '&&'. A\n/// case where it would not work would be with an element selector e.g. 'divdiv'.\n///\n/// Example usage:\n///\n/// #{multiply-specificity-n('.some-selector', 2)} {\n/// }\n///\n/// would produce\n///\n/// .some-selector.some-selector {\n/// }\n///\n/// @param {string} $selector the selector to duplicate\n/// @param {number} $n number of times to duplicate\n/// @return {string} duplicated selector\n@function multiply-specificity-n($selector, $n) {\n $result: $selector;\n @for $i from 2 through $n {\n $result: selector-append($result, $selector);\n }\n\n @return $result;\n}\n\n// Linear gradient with same start and end color. Useful for certain scenarios\n// where we need a solid background image layer.\n@function solid-gradient($color) {\n @return linear-gradient(0deg, $color, $color);\n}\n\n@function color-mix-opacity($semantic-name, $i: 100) {\n @return color-mix(\n in srgb,\n /* if $i doesn't contain a % sign, add one */\n var(--dh-color-#{$semantic-name}) #{$i}#{if(unit($i) == '%', '', '%')},\n transparent\n );\n}\n\n@function accent-opacity($i: 100) {\n @return color-mix-opacity('accent', $i);\n}\n\n@function negative-opacity($i: 100) {\n @return color-mix-opacity('negative', $i);\n}\n\n@function black-opacity($i: 100) {\n @return color-mix-opacity('black', $i);\n}\n\n@function bg-opacity($i: 100) {\n @return color-mix-opacity('bg', $i);\n}\n\n@function fg-opacity($i: 100) {\n @return color-mix-opacity('fg', $i);\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n$grid-row-columns: 6 !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n$table-th-font-weight: null !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height-sm * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height-lg * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n$custom-control-cursor: null !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-label-color: null !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: null !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: null !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'><path fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/></svg>\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'><path stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/></svg>\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: null !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'><circle r='3' fill='#{$custom-control-indicator-checked-color}'/></svg>\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size * .5 !default;\n$custom-switch-indicator-size: subtract($custom-control-indicator-size, $custom-control-indicator-border-width * 4) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'><path fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/></svg>\") !default;\n$custom-select-background: escape-svg($custom-select-indicator) right $custom-select-padding-x center / $custom-select-bg-size no-repeat !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: add(1em * .75, (2 * $custom-select-padding-y * .75) + $custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/></svg>\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='#{$form-feedback-icon-invalid-color}' viewBox='0 0 12 12'><circle cx='6' cy='6' r='4.5'/><path stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/><circle cx='6' cy='8.2' r='.6' fill='#{$form-feedback-icon-invalid-color}' stroke='none'/></svg>\") !default;\n\n$form-validation-states: () !default;\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer * .5 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-nav-scroll-max-height: 75vh !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'><path stroke='#{$navbar-dark-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'><path stroke='#{$navbar-light-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-200 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-500 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding: $dropdown-padding-y $dropdown-item-padding-x !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n$pagination-border-radius-sm: $border-radius-sm !default;\n$pagination-border-radius-lg: $border-radius-lg !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width * .5 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n// Margin between elements in footer, must be lower than or equal to 2 * $modal-inner-padding\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-font-size: null !default;\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' width='8' height='8' viewBox='0 0 8 8'><path d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/></svg>\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' width='8' height='8' viewBox='0 0 8 8'><path d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/></svg>\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n$user-selects: all, auto, none !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n","@import '@deephaven/components/scss/custom.scss';\n@import '@deephaven/golden-layout/scss/goldenlayout-base.scss';\n@import '@deephaven/golden-layout/scss/goldenlayout-dark-theme.scss';\n\n// Styling for behaviours not part of the default golden layout package\n\n.lm_tab .editor-unsaved-indicator {\n display: none;\n margin-right: 5px;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: $primary;\n\n &.is-unsaved {\n display: inline-block;\n }\n}\n\n.lm_dragging {\n //disable plotly pointer events while dragging golden layout\n .js-plotly-plot .plotly {\n svg,\n g,\n rect,\n path {\n pointer-events: none !important;\n }\n }\n}\n"]}
1
+ {"version":3,"sourceRoot":"","sources":["../../../../node_modules/@deephaven/components/scss/custom.scss","../../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss","../../../../node_modules/@deephaven/golden-layout/scss/goldenlayout-base.scss","../../../../node_modules/@deephaven/golden-layout/scss/goldenlayout-dark-theme.scss","../../../../node_modules/@deephaven/components/scss/new_variables.scss","../../../../node_modules/@deephaven/components/scss/util.scss","../../../../node_modules/bootstrap/scss/_variables.scss","../../src/layout/GoldenLayout.scss"],"names":[],"mappings":"AAAA;AC6LA;AC7LA;AAmBA;EACE;;;AAGF;EACE;;;AAIF;EACE;EACA;EACA;;;AAIF;AAAA;EAEE;EACA;;;AAIF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAIF;EACE;EACA;;AAEA;EAEE;;AAIA;EACE,OA/DG;EAgEH;EACA;;AAIJ;EACE;EACA,QA9DM;;AAgEN;EACE,QAjEI;EAkEJ;EACA;;;AAMN;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EAQE;;AAGF;EACE;;AAIF;EACE;EACA;;AAEA;EACE;EACA;EACA,OA7GG;EA8GH,QApGI;EAqGJ;;AAGF;EACE;EACA;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAIF;EACE;EACA,QAhIM;EAiIN;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE,OA1JG;EA2JH,QAnJI;EAoJJ;EACA;EACA;EACA;;;AAQJ;AAAA;EACE;;;AAQF;AAAA;AAAA;AAAA;EACE;EACA;EACA;;AACA;AAAA;AAAA;AAAA;EACE;EACA;EACA;AAAe;;AAEjB;AAAA;AAAA;AAAA;EACE;;AAGJ;AAAA;AAAA;AAAA;EACE;;;AAOA;AAAA;EACE;EACA;;AACA;AAAA;EACE;EACA;;AAGJ;AAAA;EACE;EACA;EACA;;;AAKN;EACE;;;AAME;AAAA;EACE;EACA;EACA;;AAEF;AAAA;EACE;;AAEF;AAAA;EACE;EACA;;;AAQF;AAAA;EACE;EACA;;AAEF;AAAA;EACE;;AAEF;AAAA;EACE;EACA;;;AAKN;EACE;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAIJ;EACE;;;AAIJ;AAAA;AAAA;AAKA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;;AAKJ;EACE;EACA;EACA;EACA;;AAGA;EACE,OAhUK;EAiUL,QAxTM;EAyTN;EACA;EACA;;;AAKJ;EACE,OAzUO;EA0UP,QAjUQ;EAkUR;EACA;EACA;EACA;;AAEA;EACE,OAlVK;EAmVL,QA1UM;EA2UN;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;;AChWJ;AHAA;AC6LA;AErKA;EACE;EACA;;AAGA;EACE;;AAGA;EACE;;AAEA;EAEE;;;AAOR;EACE,OF7BS;;;AEgCX;EACE;;AAEA;EACE;;AAEA;EACE;;;AAMN;EACE,YF3BW;EE4BX;;;AAIF;EACE,YFlCW;EEmCX;;;AAKA;EACE;EACA;EACA,YF8ES;;AE5EX;EACE,QA9ES;EA+ET;;AAEA;AAAA;EAEE;EACA,YFqEO;;;AE/Db;ECzEE;EAIA,iBACE;EAIF,qBACE;EAIF;EACA;EACA;EACA;ED2DA;EACA;;AAGA;EACE;EACA;EACA;EACA;EACA;;;AAKJ;EACE,YF7FS;EE8FT;EACA;;AAEA;EAEE,YFpGO;EEqGP;;;AAKJ;EACE;EACA,QA1HW;EA2HX;EACA,YA9GqB;EA+GrB;EAIA;;AAGE;EACE;EACA;;AAIJ;EACE;;;AAOF;AAAA;EACE;EACA;EACA,aFrBF;EEsBE,kBAzIgB;EA0IhB,OFxIO;EEyIP,QAxJS;EAyJT,WArJY;EAsJZ;EACA;EACA;EACA;EACA,YACE;EAEF;EACA;EACA;;AAEA;AAAA;EACE;EACA,eAtKU;;AA6KZ;AAAA;EACE;EACA;;AAIF;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;AAAA;EE9MJ,iBFsLwB;EErLxB;EACA,YFgNQ;EE/MR;EACA;EACA,WFiLwB;EAgClB;EACA;EACA;;;AAQN;EACE,kBApNuB;;;AAwN3B;AAAA;EAEE,QAtOW;EAuOX,kBA3NyB;EA4NzB,OAhOoB;EAiOpB;EACA;;AAEA;AAAA;EACE,YACE;;AAIJ;AAAA;EAEE;;;AAKF;EACE;;;AAOF;EACE;EACA;EAMA;EACA;EACA;;AANA;EACE;;AASJ;EEhRA,iBFqRI;EEpRJ;EACA,YFkRI;EEjRJ;EACA;EACA,WFgRI;;AAKJ;EE1RA,iBADyC;EAEzC;EACA,YFyR2B;EExR3B;EACA;EACA,WANyC;;AF+RzC;EE9RA,iBADyC;EAEzC;EACA,YF6R2B;EE5R3B;EACA;EACA,WANyC;;AFoSzC;EEnSA,iBADyC;EAEzC;EACA,YFkS2B;EEjS3B;EACA;EACA,WANyC;;AFwSzC;EEvSA,iBADyC;EAEzC;EACA,YFsS2B;EErS3B;EACA;EACA,WANyC;;AF4SzC;EE3SA,iBADyC;EAEzC;EACA,YF0S2B;EEzS3B;EACA;EACA,WANyC;;;AFiT3C;EACE,SG0XkC;EHzXlC;EACA,YFzJW;EE0JX,eF3Jc;EE4Jd;EACA;EACA;EACA;;AAEA;EACE,SCzTO;;AD0TP;EACE;EACA,aFvIkB;EEwIlB,OFpJQ;EEqJR,kBFvJK;EEwJL;EACA,eFzKU;EE0KV;;AAEA;EACE,OFzJkB;EE0JlB;;AAGF;EACE,cF7JmB;EE8JnB,YFtJqB;EEuJrB;;AAKN;EACE;;AAGF;EACE;EACA,OFzUO;EE0UP;;AAEA;EACE,OF7UK;EE8UL;;AAEA;EACE;;AAIJ;EACE,OA5VgB;EA6VhB;;;AAMN;EACE;EACA;EACA;;AACA;EACE,YFvNS;;AE4NT;EEtXF,iBADyC;EAEzC;EACA,YFqX6B;EEpX7B;EACA;EACA,WANyC;;;AF6X3C;EACE;;;AIzXF;EACE;EACA;EACA;EACA,cHNS;EGOT;EACA,YNmFQ;;AMjFR;EACE;;;AAOA;AAAA;AAAA;AAAA;EAIE","file":"GoldenLayout.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n@import './util.scss';\n","// Styling overrides for bootstrap\n@use 'sass:map';\n\n// Override / set color variables\n$red: var(--dh-color-visual-red);\n$orange: var(--dh-color-visual-orange);\n$yellow: var(--dh-color-visual-yellow);\n$green: var(--dh-color-visual-green);\n$blue: var(--dh-color-visual-blue);\n$purple: var(--dh-color-visual-purple);\n\n// Fallback colors are used if theme isn't loaded\n// this is required for error messages if the API doesn't load\n\n//Define our Gray scale\n$gray-100: var(--dh-color-gray-900, #fcfcfa);\n$gray-200: var(--dh-color-gray-800);\n$gray-300: var(--dh-color-gray-700);\n$gray-400: var(--dh-color-gray-600);\n$gray-500: var(--dh-color-gray-500);\n// intentional duplicate, scale doesn't line up otherwise\n// as we have gray-850 and spectrum doesn't and it is needed\n$gray-600: var(--dh-color-gray-500);\n$gray-700: var(--dh-color-gray-400);\n$gray-800: var(--dh-color-gray-300);\n$gray-850: var(--dh-color-gray-200);\n$gray-900: var(--dh-color-gray-75);\n$black: var(--dh-color-black, #1a171a);\n$white: var(--dh-color-white, #f0f0ee);\n\n//Define some UI colors\n$interfacegray: var(--dh-color-content-bg, #2d2a2e);\n$interfaceblue: var(--dh-color-accent-bg);\n$interfacewhite: $white;\n$interfaceblack: $black;\n$content-bg: var(--dh-color-content-bg, #2d2a2e);\n$background: var(--dh-color-bg, #1a171a);\n$foreground: var(--dh-color-fg, #f0f0ee);\n\n// Extend default Bootstrap $grays map\n$grays-custom: (\n '850': $gray-850,\n);\n$grays: () !default;\n$grays: map-merge($grays, $grays-custom);\n\n// Extend default Bootstrap $colors map\n$colors-custom: (\n 'black': $black,\n);\n$colors: () !default;\n$colors: map-merge($colors, $colors-custom);\n\n// Override default Bootstrap $theme-colors map by mapping each key to itself.\n// These will then be re-mapped inside of `button-outline-variant` and\n// `button-outline-variant` mixins in `bootstrap_override_mixins_buttons.scss`\n$theme-colors-self-map: ();\n@each $key\n in (\n 'primary',\n 'secondary',\n 'success',\n 'info',\n 'warning',\n 'danger',\n 'light',\n 'dark'\n )\n{\n $theme-colors-self-map: map.set($theme-colors-self-map, $key, $key);\n}\n$theme-colors: () !default;\n$theme-colors: map-merge($theme-colors, $theme-colors-self-map);\n\n// Used by bootstrap_override_mixins_buttons.scss to map Bootstrap colors to\n// DH semantic colors\n$bootstrap-dh-semantic-map: (\n 'primary': 'accent',\n 'secondary': 'neutral',\n 'success': 'positive',\n 'info': 'info',\n 'warning': 'notice',\n 'danger': 'negative',\n // We shouldn't be using these, but mapping so they work with our custom\n // `color-yiq` mixin. If we find a way to remove $light + $dark that are\n // defined in Bootstrap _variables.scss, we should remove these\n 'light': 'neutral',\n 'dark': 'neutral',\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: var(--dh-color-accent-bg);\n$primary-hover: var(--dh-color-accent-hover-bg);\n$primary-dark: var(--dh-color-accent-down-bg);\n$secondary: var(--dh-color-neutral-bg);\n$secondary-hover: var(--dh-color-neutral-hover-bg);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: var(--dh-color-negative-bg);\n$danger-hover: var(--dh-color-negative-hover-bg);\n// We really don't want to use $light or $dark variables, but Bootstrap defines\n// them in _variables.scss. Explicitly setting them to ensure we are in control\n// of their values. If we can find a way to remove them, we should\n$light: var(--dh-color-gray-light);\n$dark: var(--dh-color-gray-dark);\n// Bootstrap doesn't define $mid, and we want to move away from this particular\n// semantic. Should be deleted by #1635\n$mid: var(--dh-color-gray-mid);\n\n$semantic-colors: (\n 'primary-hover': $primary-hover,\n 'primary-dark': $primary-dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n 'secondary-hover': $secondary-hover,\n 'danger-hover': $danger-hover,\n);\n\n$component-active-bg: $primary;\n$theme-color-interval: 9%;\n$yiq-contrasted-threshold: 180;\n\n// Override fonts\n$font-family-sans-serif:\n 'Fira Sans',\n -apple-system,\n blinkmacsystemfont,\n 'Segoe UI',\n 'Roboto',\n 'Helvetica Neue',\n arial,\n sans-serif; //fira sans then native system ui fallbacks\n$font-family-monospace: 'Fira Mono', menlo, monaco, consolas, 'Liberation Mono',\n 'Courier New', monospace;\n$font-family-base: $font-family-sans-serif;\n\n$headings-font-weight: 400;\n\n//Text overides\n$text-muted: $gray-400;\n\n//Style Selection highlight color\n$text-select-color: var(--dh-color-text-highlight);\n\n//Grid variables, same value as default just making easily accessible\n$grid-gutter-width: 30px;\n\n//Visual Overrides\n$border-radius: 4px;\n$box-shadow: 0 0.1rem 1rem var(--dh-color-dropshadow);\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition:\n color 0.12s ease-in-out,\n background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out,\n box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n$btn-font-weight: var(--spectrum-global-font-weight-bold);\n$btn-line-height: 1.3;\n\n//Override Inputs\n$input-bg: var(--dh-color-input-bg);\n$input-disabled-bg: var(--dh-color-input-disabled-bg);\n$input-color: var(--dh-color-input-fg);\n$input-border-color: var(--dh-color-input-border);\n$input-placeholder-color: var(--dh-color-input-placeholder);\n$input-focus-border-color: var(--dh-color-input-focus-border);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: color-mix(\n in srgb,\n var(--dh-color-accent) 35%,\n transparent\n);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n$input-btn-line-height: 1.3;\n// Bootstrap uses a calc expression to determine the input height (calc(line-height + 2*padding-y + border)).\n// The padding-y value has to be in rem to match units as it is a SASS calc.\n// Using 0.42145rem with 1.3 line height gets us to spectrum's 32px.\n/* stylelint-disable-next-line number-max-precision */\n$input-btn-padding-y: 0.42145rem;\n\n//checkbox\n$custom-control-indicator-bg: var(--dh-color-input-bg);\n$custom-control-indicator-border-color: var(--dh-color-input-border);\n$custom-checkbox-indicator-border-radius: 2px;\n$custom-control-indicator-border-width: 2px;\n$custom-control-indicator-active-bg: var(--dh-color-input-bg);\n$custom-control-indicator-active-border-color: var(--dh-color-input-fg);\n$custom-control-indicator-checked-bg: var(--dh-color-input-fg);\n$custom-control-indicator-checked-color: black; // used as mask fill color\n$custom-checkbox-indicator-indeterminate-bg: var(--dh-color-input-fg);\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: var(--dh-color-input-disabled-bg);\n$custom-control-indicator-checked-disabled-bg: var(\n --dh-color-input-disabled-bg\n);\n$custom-control-label-disabled-color: var(--dh-color-input-disabled-fg);\n\n// The $custom-select-indicator variable is used by Bootstrap to provide the\n// icon for the select dropdown. Inline svgs can't use CSS variables, so we hard\n// code the color to #929192 (the default value of --dh-color-gray-600). PR #1651\n// overrides this icon altogether for known dropdowns, so technically we may not\n// need this, but it's here in case there are any remaining instances.\n$custom-select-indicator-color: #929192;\n$custom-select-bg: var(--dh-color-selector-bg);\n$custom-select-bg-size: 16px 16px;\n//dhSort icon encoded\n$custom-select-indicator: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M4 7l-.4-.8 4-3.7h.8l4 3.7-.4.8H4zm0 2l-.4.8 4 3.7h.8l4-3.7L12 9H4z'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n);\n$custom-select-focus-box-shadow: $input-btn-focus-box-shadow;\n$custom-select-disabled-color: $gray-500;\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $content-bg;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n$close-color: var(--dh-color-text);\n$close-text-shadow: none;\n\n// Toast notification\n$toast-bg: var(--dh-color-accent-100);\n$toast-color: var(--dh-color-text);\n$toast-error-bg: var(--dh-color-negative-bg);\n$toast-error-color: var(--dh-color-text);\n\n//tooltips\n$tooltip-bg: var(--dh-color-tooltip-bg);\n$tooltip-color: var(--dh-color-tooltip-fg);\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem var(--dh-color-tooltip-box-shadow);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: var(--dh-color-item-list-hover-bg);\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: var(--dh-color-popover-bg);\n$contextmenu-color: var(--dh-color-text);\n$contextmenu-disabled-color: var(--dh-color-input-disabled-fg);\n$contextmenu-keyboard-selected-bg: var(--dh-color-keyboard-selected-bg);\n$contextmenu-selected-bg: var(--dh-color-item-list-hover-bg);\n$contextmenu-selected-color: var(--dh-color-item-list-selected-fg);\n\n//hr\n$hr-border-color: var(--dh-color-hr);\n\n//links\n$link-color: $gray-400;\n$link-hover-color: $foreground;\n\n//progress-bar\n$progress-bg: $gray-600;\n$progress-border-radius: 1rem;\n\n// Set global options\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-print-styles: false; //I don't think anyone should expect to \"print\" this app.\n\n// Transition times\n$transition: 0.15s;\n$transition-mid: 0.2s;\n$transition-long: 0.3s;\n$transition-slow: 0.6s;\n\n//form-validation icon, uses vsWarning icon encoded here as svg\n$form-feedback-icon-invalid-color: $danger;\n$form-feedback-icon-invalid: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cg fill='none'%3E%3Cg fill='#{$form-feedback-icon-invalid-color}'%3E%3Cpath d='M7.56 1h.88l6.54 12.26-.44.74H1.44L1 13.26 7.56 1zM8 2.28 2.28 13H13.7L8 2.28zM8.625 12v-1h-1.25v1h1.25zm-1.25-2V6h1.25v4h-1.25z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E \"),\n '#',\n '%23'\n);\n\n// This section of variables is not consumed directly by DH, but they need to be\n// defined for sass to compile _variables\n$table-dark-bg: $gray-800;\n$table-dark-accent-bg: var(--dh-color-highlight-hover);\n$table-dark-hover-bg: var(--dh-color-highlight-active);\n$table-dark-border-color: $gray-700;\n$popover-bg: var(--dh-color-tooltip-bg);\n$popover-border-color: var(--dh-color-overlay-modal-bg);\n$popover-header-bg: #000;\n$popover-arrow-outer-color: var(--dh-color-dropshadow);\n$custom-range-thumb-active-bg: var(--dh-color-accent-1100);\n","/* stylelint-disable no-descending-specificity */\n// Width variables (appears count calculates by raw css)\n$width0: 100%; // Appears 3 times\n$width1: 20px; // Appears 2 times\n$width2: 100px; // Appears 1 time\n$width3: 14px; // Appears 1 time\n$width4: 18px; // Appears 1 time\n$width5: 15px; // Appears 1 time\n$width6: 2px; // Appears 1 time\n\n// Height variables (appears count calculates by raw css)\n$height0: 100%; // Appears 4 times\n$height1: 20px; // Appears 2 times\n$height2: 14px; // Appears 2 times\n$height3: 10px; // Appears 1 time\n$height4: 19px; // Appears 1 time\n$height5: 18px; // Appears 1 time\n$height6: 15px; // Appears 1 time\n\n.lm_root {\n position: relative;\n}\n\n.lm_row > .lm_item {\n float: left;\n}\n\n// Single Pane content (area in which final dragged content is contained)\n.lm_content {\n overflow: hidden;\n position: relative;\n outline: 0;\n}\n\n// \".lm_dragging\" is applied to BODY tag during Drag and is also directly applied to the root of the object being dragged\n.lm_dragging,\n.lm_dragging * {\n cursor: grabbing !important;\n user-select: none;\n}\n\n// If a specific Pane is maximized\n.lm_maximised {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 40;\n}\n\n.lm_maximise_placeholder {\n display: none;\n}\n\n// Separator line (handle to change pane size)\n.lm_splitter {\n position: relative;\n z-index: 20;\n\n &:hover, // When hovered by mouse...\n &.lm_dragging {\n background: orange;\n }\n\n &.lm_vertical {\n .lm_drag_handle {\n width: $width0;\n position: absolute;\n cursor: ns-resize;\n }\n }\n\n &.lm_horizontal {\n float: left;\n height: $height0;\n\n .lm_drag_handle {\n height: $height0;\n position: absolute;\n cursor: ew-resize;\n }\n }\n}\n\n// Pane Header (container of Tabs for each pane)\n.lm_header {\n display: flex;\n justify-content: space-between;\n max-width: 100%;\n z-index: 12; //above lm_content, below lm_splitter\n position: relative;\n overflow: hidden;\n\n &.lm_dropdown_open {\n // This is an ugly hack, z-index of the whole header needs to be moved up\n // when the menu is open, because its positioned relative to header.\n // The header has a position, which creates a stacking context\n // that can result in the next header being \"above\" the dropdown.\n // The same problem happens for splitters too.\n // A better solution would refactor the dropdown to be a root node,\n // and in general use z-index way less.\n z-index: 22; //above other lm_headers and lm_splitter\n }\n\n [class^='lm_'] {\n box-sizing: content-box !important;\n }\n\n // Pane controls (popout, maximize, minimize, close)\n .lm_controls {\n display: flex;\n user-select: none;\n\n > li {\n cursor: pointer;\n float: left;\n width: $width4;\n height: $height5;\n text-align: center;\n }\n\n > li[disabled] {\n cursor: default;\n opacity: 0.1;\n }\n }\n\n ul {\n margin: 0;\n padding: 0;\n list-style-type: none;\n }\n\n .lm_tabs {\n display: flex;\n flex-grow: 1;\n overflow: hidden;\n }\n\n // Single Tab container. A single Tab is set for each pane, a group of Tabs are contained in \".lm_header\"\n .lm_tab {\n cursor: pointer;\n height: $height2;\n margin-top: 1px;\n padding: 0 10px 5px;\n padding-right: 25px;\n position: relative;\n min-width: 0;\n flex-shrink: 0;\n\n .lm_title {\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n }\n\n // Close Tab Icon\n .lm_close_tab {\n width: $width3;\n height: $height2;\n position: absolute;\n top: 0;\n right: 0;\n text-align: center;\n }\n }\n}\n\n// Headers positions\n.lm_stack.lm_left,\n.lm_stack.lm_right {\n .lm_header {\n height: 100%;\n }\n}\n\n.lm_dragProxy.lm_left,\n.lm_dragProxy.lm_right,\n.lm_stack.lm_left,\n.lm_stack.lm_right {\n .lm_header {\n width: 20px;\n float: left;\n vertical-align: top;\n .lm_tabs {\n transform-origin: left top;\n top: 0;\n width: 1000px; /* hack */\n }\n .lm_controls {\n bottom: 0;\n }\n }\n .lm_items {\n float: left;\n }\n}\n\n.lm_dragProxy.lm_left,\n.lm_stack.lm_left {\n .lm_header {\n .lm_tabs {\n transform: rotate(-90deg) scaleX(-1);\n left: 0;\n .lm_tab {\n transform: scaleX(-1);\n margin-top: 1px;\n }\n }\n .lm_tabdropdown_list {\n top: initial;\n right: initial;\n left: 20px;\n }\n }\n}\n\n.lm_dragProxy.lm_right .lm_content {\n float: left;\n}\n\n.lm_dragProxy.lm_right,\n.lm_stack.lm_right {\n .lm_header {\n .lm_tabs {\n transform: rotate(90deg) scaleX(1);\n left: 100%;\n margin-left: 0;\n }\n .lm_controls {\n left: 3px;\n }\n .lm_tabdropdown_list {\n top: initial;\n right: 20px;\n }\n }\n}\n\n.lm_dragProxy.lm_bottom,\n.lm_stack.lm_bottom {\n .lm_header {\n .lm_tab {\n margin-top: 0;\n border-top: none;\n }\n .lm_controls {\n top: 3px;\n }\n .lm_tabdropdown_list {\n top: initial;\n bottom: 20px;\n }\n }\n}\n\n.lm_drop_tab_placeholder {\n flex-shrink: 0;\n}\n\n// Dropdown arrow for additional tabs when too many to be displayed\n.lm_tabdropdown_list {\n position: absolute;\n overflow-y: auto;\n overflow-x: hidden;\n top: 0;\n left: 0;\n max-height: 100%;\n\n .lm_tabs {\n flex-direction: column;\n }\n\n .lm_tab {\n padding-right: 10px;\n\n .lm_title {\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n }\n }\n\n .lm_close_tab {\n display: none !important;\n }\n}\n\n/***********************************\n* Drag Proxy\n***********************************/\n\n// Single Pane content during Drag (style of moving window following mouse)\n.lm_dragProxy {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 30;\n pointer-events: none;\n\n .lm_header {\n background: transparent;\n }\n\n .lm_content {\n border-top: none;\n overflow: hidden;\n }\n}\n\n// Placeholder Container of target position\n.lm_dropTargetIndicator {\n display: none;\n position: absolute;\n z-index: 20;\n pointer-events: none;\n\n // Inner Placeholder\n .lm_inner {\n width: $width0;\n height: $height0;\n position: relative;\n top: 0;\n left: 0;\n }\n}\n\n// If a specific Pane is Popped Out, so move it to a different Browser Window, Icon to restore original position is:\n.lm_popin {\n width: $width1;\n height: $height1;\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 9999;\n\n > * {\n width: $width0;\n height: $height0;\n position: absolute;\n top: 0;\n left: 0;\n }\n\n > .lm_bg {\n z-index: 10;\n }\n\n > .lm_icon {\n z-index: 20;\n }\n}\n","/* stylelint-disable no-descending-specificity */\n@import '@deephaven/components/scss/custom.scss';\n\n$tab-height: 28px;\n$tab-padding-x: 6px;\n$drag-border-width: 5px;\n\n$tab-font-size: 12px;\n\n$lm-tab-color: $gray-400;\n$lm-tab-hover-color: $gray-300;\n$lm-tab-active-color: var(--dh-color-text);\n$lm-tab-icon-color: $gray-200;\n\n//make some subtle tab background colors relative to our defined color\n$lm-tab-active-background: var(--dh-color-golden-layout-tab-selected-bg);\n$lm-tab-background: var(--dh-color-golden-layout-tab-bg);\n$lm-header-background: var(--dh-color-golden-layout-tab-header-bg);\n\n$lm-splitter-hover-color: $gray-400;\n$lm-splitter-active-color: $gray-300;\n\n// \".lm_dragging\" is applied to BODY tag during Drag and is also directly applied to the root of the object being dragged\n//is added to the body class, prevents overflow in our app context\n.lm_dragging {\n overflow: hidden;\n pointer-events: none;\n\n // we still need events on our header for scroll while dragging to work\n .lm_goldenlayout .lm_header {\n pointer-events: auto;\n\n // disable other control buttons during drag\n .lm_controls > li {\n pointer-events: none;\n\n &.lm_tabpreviousbutton,\n &.lm_tabnextbutton {\n pointer-events: auto;\n }\n }\n }\n}\n\n// disable hover styling during drag (pointer-events still needed)\nbody:not(.lm_dragging) .lm_header .lm_tab:not(.lm_active):hover {\n color: $lm-tab-hover-color;\n}\n\nbody:not(.lm_dragging) .lm_header .lm_tab:hover .lm_close_tab {\n opacity: 0.35;\n\n &:hover {\n opacity: 1;\n\n &::before {\n opacity: 1;\n }\n }\n}\n\n// Entire GoldenLayout Container, if a background is set, it is visible as color of \"pane header\" and \"splitters\" (if these latest has opacity very low)\n.lm_goldenlayout {\n background: $background;\n position: absolute;\n}\n\n// Single Pane content (area in which final dragged content is contained)\n.lm_content {\n background: $content-bg;\n overflow: visible;\n}\n\n// Single Pane content during Drag (style of moving window following mouse)\n.lm_dragProxy {\n .lm_content {\n height: 100%;\n width: 100%;\n box-shadow: $box-shadow;\n }\n .lm_header {\n height: $tab-height;\n box-shadow: none;\n\n .lm_tab,\n .lm_tab.lm_active {\n border: 0;\n box-shadow: $box-shadow;\n }\n }\n}\n\n// Placeholder Container of target position\n.lm_dropTargetIndicator {\n @include ants-base($white, $black); //replace with ants\n\n box-sizing: border-box;\n transition: all $transition-mid ease;\n\n // Inner Placeholder\n .lm_inner {\n box-sizing: border-box;\n border: $ant-thickness solid transparent; //offset shadow using a transparent border\n box-shadow: inset 0 0 1rem 1px var(--dh-color-dropshadow);\n opacity: 1; //set opacity back to 1, default 0.2 and backroudn was solid.\n background: accent-opacity(10);\n }\n}\n\n// Separator line (handle to change pane size)\n.lm_splitter {\n background: $lm-splitter-hover-color;\n opacity: 0.001;\n transition: opacity $transition ease;\n\n &:hover, // When hovered by mouse...\n &.lm_dragging {\n background: $lm-splitter-active-color;\n opacity: 1;\n }\n}\n\n// Pane Header (container of Tabs for each pane)\n.lm_header {\n box-sizing: content-box; // golden-layout sets a js height using a content box model\n height: $tab-height;\n padding-top: 0;\n background: $lm-header-background;\n box-shadow: inset 0 -1px 0 0 $background;\n // inset box shadows with 0-blur used to draw borders without impacting spacing or GL size calculations.\n // golden layout default styling doesnt have the same border styling we want\n // this trick is used elsewhere in the header as well for the same purpose\n user-select: none;\n\n .lm_controls {\n > li {\n height: 100%;\n width: 24px;\n }\n }\n\n &.lm_selectable {\n cursor: pointer;\n }\n}\n\n.lm_header,\n.lm_tabdropdown_list {\n // Single Tab container. A single Tab is set for each pane, a group of Tabs are contained in \".lm_header\"\n .lm_tab {\n display: flex;\n align-items: center;\n font-family: $font-family-sans-serif;\n background-color: $lm-tab-background;\n color: $lm-tab-color;\n height: $tab-height;\n font-size: $tab-font-size;\n min-width: 10ch;\n margin: 0;\n padding: 0 0 0 $tab-padding-x;\n box-shadow: inset -1px -1px 0 0 $background; // acting as bottom and right border\n transition:\n color $transition,\n background-color $transition;\n max-width: 12.25rem;\n white-space: nowrap;\n overflow: hidden;\n\n .lm_title {\n flex-grow: 1;\n padding-right: $tab-padding-x;\n // add equalized spacing for tabs without close buttons\n // so that when a tab is longer then min-width it still\n // is balanced with equal padding. Extra padding is then\n // removed from tabs with close buttons via negative margin\n }\n\n .lm_title_before {\n display: flex;\n align-items: center;\n }\n\n // Close Tab Icon\n .lm_close_tab {\n $close-button-size: 8px;\n\n margin-left: -$tab-padding-x;\n flex-shrink: 0;\n cursor: pointer;\n position: relative;\n width: 18px;\n height: 100%;\n opacity: 0;\n // intentionally no transition on close icon\n // we want the button to appear instantly\n\n &::before {\n // used for hover background\n // which is a different shape then the hit area\n content: '';\n position: absolute;\n inset: 3px 3px 3px 1px; // looks better offset\n border-radius: 2px;\n background-color: var(--dh-color-highlight-selected-hover);\n opacity: 0;\n transition: opacity $transition ease;\n }\n\n &::after {\n // since this is a mask, we need to isolate it\n // so it doesn't mask our hover background\n @include icon-image-mask(\n var(--dh-svg-icon-close-tab),\n $close-button-size\n );\n\n content: '';\n position: absolute;\n inset: 0 2px 0 0; // looks better offset\n }\n }\n }\n}\n\n// If Pane Header (container of Tabs for each pane) is selected (used only if addition of new Contents is made \"by selection\" and not \"by drag\")\n.lm_selected {\n .lm_header {\n background-color: $lm-tab-active-background;\n }\n}\n\n.lm_header .lm_tab.lm_active,\n.lm_header .lm_tab.lm_active:hover {\n height: $tab-height;\n background-color: $lm-tab-active-background;\n color: $lm-tab-active-color;\n padding-bottom: 0;\n box-shadow: inset -1px 0 0 0 $background; // act as right border only when active\n // also kills the default shadow, doesn't work well with our design\n &.lm_focusin {\n box-shadow:\n inset 0 1px $primary,\n inset -1px 0 0 0 $background; // top focus indicator, right border\n }\n\n .lm_close_tab {\n // show close button on active tab\n opacity: 0.35;\n }\n}\n\n.lm_window_blur {\n .lm_header .lm_tab.lm_active.lm_focusin {\n box-shadow: inset -1px 0 0 0 $background;\n }\n}\n\n// Pane controls (popout, maximize, minimize, close)\n.lm_controls {\n // All Pane controls shares these\n > li {\n opacity: 0.4;\n transition: opacity $transition ease;\n\n &:hover {\n opacity: 1;\n }\n\n position: relative;\n background-position: center center;\n background-repeat: no-repeat;\n }\n\n // Icon to PopOut Pane, so move it to a different Browser Window\n .lm_popout {\n // Leaving this inline since it is a PNG. We should convert it to a 16px\n // SVG like other icons and move to a css variable so it can be overridden.\n @include icon-image-mask(\n url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAPklEQVR4nI2Q0QoAIAwCNfr/X7aXCpGN8snBdgejJOzckpkxs9jR6K6T5JpU0nWl5pSXTk7qwh8SnNT+CAAWCgkKFpuSWsUAAAAASUVORK5CYII='),\n auto\n );\n }\n\n // Icon to Maximize Pane, so it will fill the entire GoldenLayout Container\n .lm_maximise {\n @include icon-image-mask(var(--dh-svg-icon-maximise));\n }\n\n .lm_tabdropdown {\n @include icon-image-mask(var(--dh-svg-icon-tab-dropdown));\n }\n\n // Icon to Close Pane and so remove it from GoldenLayout Container\n .lm_close {\n @include icon-image-mask(var(--dh-svg-icon-close));\n }\n\n .lm_tabnextbutton {\n @include icon-image-mask(var(--dh-svg-icon-next));\n }\n\n .lm_tabpreviousbutton {\n @include icon-image-mask(var(--dh-svg-icon-prev));\n }\n}\n\n.lm_tabdropdown_list {\n z-index: $zindex-dropdown;\n background: var(--dh-color-popover-bg);\n box-shadow: $box-shadow;\n border-radius: $border-radius;\n max-width: 12rem;\n margin: 0;\n padding: 0;\n list-style-type: none;\n\n .lm_tabdropdown_search {\n padding: $spacer-1;\n input {\n padding: $input-padding-y $input-padding-x;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n border: $input-border-width solid $input-border-color;\n border-radius: $border-radius;\n max-width: 100%;\n\n &::placeholder {\n color: $input-placeholder-color;\n opacity: 1;\n }\n\n &:focus {\n border-color: $input-focus-border-color;\n box-shadow: $input-btn-focus-box-shadow;\n outline: 0;\n }\n }\n }\n\n .lm_tabs {\n padding: 0;\n }\n\n .lm_tab {\n background: transparent;\n color: $lm-tab-hover-color;\n box-shadow: none;\n\n &.lm_keyboard_active {\n color: $lm-tab-hover-color;\n background-color: var(--dh-color-highlight-selected);\n\n &:hover {\n background-color: var(--dh-color-highlight-selected-hover);\n }\n }\n\n &:hover {\n color: $lm-tab-active-color;\n background-color: var(--dh-color-highlight-hover);\n }\n }\n}\n\n// If a specific Pane is maximized\n.lm_maximised {\n border: 15px solid bg-opacity(80);\n height: 100% !important;\n width: 100% !important;\n .lm_items {\n box-shadow: $box-shadow;\n }\n\n // Pane controls are different in Maximized Mode, especially the old Icon \"Maximise\" that now has a different meaning, so \"Minimize\" (even if CSS Class did not change)\n .lm_controls {\n .lm_maximise {\n @include icon-image-mask(var(--dh-svg-icon-minimise));\n }\n }\n}\n\n.lm_tabs:empty + .lm_controls .lm_maximise {\n display: none;\n}\n","@use 'sass:math';\n\n//Set of spacer variables from the spacer map\n$spacer-0: map-get($spacers, 0); //0\n$spacer-1: map-get($spacers, 1);\n$spacer-2: map-get($spacers, 2);\n$spacer-3: map-get($spacers, 3);\n$spacer-4: map-get($spacers, 4);\n$spacer-5: map-get($spacers, 5);\n\n//Marching Ants for golden layout dropzone and drag and drop\n//top bottom, left right.\n//create 4 background images that are 50% color 1, 50% color 2 using graidents, two veritical, two horizontal\n//size them to ant-size and thickness\n//position those images along the egdes and make top/bottom repeat-x and left/right repeat-y\n//then offest each of those background positions by ant-size in animation to make them march.\n$ant-size: 8px;\n$ant-thickness: 1px;\n\n@mixin ants-base($color-1: black, $color-2: white) {\n background-image: linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%);\n background-size:\n $ant-size $ant-thickness,\n $ant-size $ant-thickness,\n $ant-thickness $ant-size,\n $ant-thickness $ant-size;\n background-position:\n 0 top,\n 0 bottom,\n left 0,\n right 0;\n background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;\n animation: march 0.5s;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n\n@mixin drag-stack($pseudo-element) {\n &::#{$pseudo-element} {\n content: ' ';\n background: $primary;\n box-shadow: $box-shadow;\n border-radius: $border-radius;\n position: absolute;\n height: 100%;\n width: 100%;\n @content;\n }\n}\n\n$focus-bg-transparency: 12%;\n$hover-bg-transparency: 14%;\n$active-bg-transparency: 28%;\n$exception-transparency: 13%;\n","// Setup a mask-image for an inline svg\n@mixin icon-image-mask($mask-image, $size: 16px) {\n background-size: $size;\n background-color: var(--dh-color-fg);\n mask-image: $mask-image;\n mask-position: center center;\n mask-repeat: no-repeat;\n mask-size: $size;\n}\n\n// Caret icon for pickers, dropdowns, select, etc.\n@mixin caret-icon() {\n $width: 10px;\n $height: 6px;\n @include icon-image-mask(var(--dh-svg-icon-selector-caret), $width $height);\n\n background-color: var(--dh-color-selector-fg);\n width: $width;\n height: $height;\n}\n\n/// Utilty for increasing specificity by repeating a given selector n number of\n/// times.\n///\n/// It should work for selectors that can be concatenated without delimiters\n/// such as '.some-selector.some-selector', '#some-id#some-id', or '&&'. A\n/// case where it would not work would be with an element selector e.g. 'divdiv'.\n///\n/// Example usage:\n///\n/// #{multiply-specificity-n('.some-selector', 2)} {\n/// }\n///\n/// would produce\n///\n/// .some-selector.some-selector {\n/// }\n///\n/// @param {string} $selector the selector to duplicate\n/// @param {number} $n number of times to duplicate\n/// @return {string} duplicated selector\n@function multiply-specificity-n($selector, $n) {\n $result: $selector;\n @for $i from 2 through $n {\n $result: selector-append($result, $selector);\n }\n\n @return $result;\n}\n\n// Linear gradient with same start and end color. Useful for certain scenarios\n// where we need a solid background image layer.\n@function solid-gradient($color) {\n @return linear-gradient(0deg, $color, $color);\n}\n\n@function color-mix-opacity($semantic-name, $i: 100) {\n @return color-mix(\n in srgb,\n /* if $i doesn't contain a % sign, add one */\n var(--dh-color-#{$semantic-name}) #{$i}#{if(unit($i) == '%', '', '%')},\n transparent\n );\n}\n\n@function accent-opacity($i: 100) {\n @return color-mix-opacity('accent', $i);\n}\n\n@function negative-opacity($i: 100) {\n @return color-mix-opacity('negative', $i);\n}\n\n@function black-opacity($i: 100) {\n @return color-mix-opacity('black', $i);\n}\n\n@function bg-opacity($i: 100) {\n @return color-mix-opacity('bg', $i);\n}\n\n@function fg-opacity($i: 100) {\n @return color-mix-opacity('fg', $i);\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n$grid-row-columns: 6 !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n$table-th-font-weight: null !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height-sm * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height-lg * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n$custom-control-cursor: null !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-label-color: null !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: null !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: null !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'><path fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/></svg>\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'><path stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/></svg>\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: null !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'><circle r='3' fill='#{$custom-control-indicator-checked-color}'/></svg>\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size * .5 !default;\n$custom-switch-indicator-size: subtract($custom-control-indicator-size, $custom-control-indicator-border-width * 4) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'><path fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/></svg>\") !default;\n$custom-select-background: escape-svg($custom-select-indicator) right $custom-select-padding-x center / $custom-select-bg-size no-repeat !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: add(1em * .75, (2 * $custom-select-padding-y * .75) + $custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/></svg>\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='#{$form-feedback-icon-invalid-color}' viewBox='0 0 12 12'><circle cx='6' cy='6' r='4.5'/><path stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/><circle cx='6' cy='8.2' r='.6' fill='#{$form-feedback-icon-invalid-color}' stroke='none'/></svg>\") !default;\n\n$form-validation-states: () !default;\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer * .5 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-nav-scroll-max-height: 75vh !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'><path stroke='#{$navbar-dark-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'><path stroke='#{$navbar-light-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-200 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-500 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding: $dropdown-padding-y $dropdown-item-padding-x !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n$pagination-border-radius-sm: $border-radius-sm !default;\n$pagination-border-radius-lg: $border-radius-lg !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width * .5 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n// Margin between elements in footer, must be lower than or equal to 2 * $modal-inner-padding\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-font-size: null !default;\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' width='8' height='8' viewBox='0 0 8 8'><path d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/></svg>\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' width='8' height='8' viewBox='0 0 8 8'><path d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/></svg>\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n$user-selects: all, auto, none !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n","@import '@deephaven/components/scss/custom.scss';\n@import '@deephaven/golden-layout/scss/goldenlayout-base.scss';\n@import '@deephaven/golden-layout/scss/goldenlayout-dark-theme.scss';\n\n// Styling for behaviours not part of the default golden layout package\n\n.lm_tab .editor-unsaved-indicator {\n display: none;\n width: 8px;\n height: 8px;\n margin-right: $spacer-1;\n border-radius: 50%;\n background: $primary;\n\n &.is-unsaved {\n display: inline-block;\n }\n}\n\n.lm_dragging {\n //disable plotly pointer events while dragging golden layout\n .js-plotly-plot .plotly {\n svg,\n g,\n rect,\n path {\n pointer-events: none !important;\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutUtils.d.ts","sourceRoot":"","sources":["../../src/layout/LayoutUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LayoutUtils.d.ts","sourceRoot":"","sources":["../../src/layout/LayoutUtils.ts"],"names":[],"mappings":"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"}
@@ -295,14 +295,16 @@ class LayoutUtils {
295
295
  */
296
296
  static isEqual(layout1, layout2) {
297
297
  var major = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
298
+ var layout1Clone = LayoutUtils.cloneLayout(layout1);
299
+ var layout2Clone = LayoutUtils.cloneLayout(layout2);
298
300
  if (major) {
299
- var layout1Clone = LayoutUtils.cloneLayout(layout1);
300
- var layout2Clone = LayoutUtils.cloneLayout(layout2);
301
301
  LayoutUtils.dropLayoutMinorChange(layout1Clone);
302
302
  LayoutUtils.dropLayoutMinorChange(layout2Clone);
303
303
  return deepEqual(layout1Clone, layout2Clone);
304
304
  }
305
- return deepEqual(layout1, layout2);
305
+ // Pass cloned layouts to avoid false negatives
306
+ // when comparing layouts with undefined and missing properties
307
+ return deepEqual(layout1Clone, layout2Clone);
306
308
  }
307
309
  static cloneLayout(layout) {
308
310
  return JSON.parse(JSON.stringify(layout));
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutUtils.js","names":["deepEqual","shortid","isMatch","Log","isComponent","isRoot","isStack","GoldenLayoutThemeExport","assertNotNull","log","module","isComponentConfig","config","componentName","undefined","isReactComponentConfig","reactConfig","type","component","isHTMLElement","element","focus","isStackItemConfig","LayoutUtils","activateTab","root","stack","getStackForRoot","error","contentItem","getContentItemInStack","setActiveContentItem","isActiveTab","activeItem","getActiveContentItem","addStack","parent","columnPreferred","arguments","length","contentItems","addChild","child","isCorrectType","isColumn","isRow","removeChild","maintainFocusElement","document","activeElement","newParent","getStackForConfig","item","allowEmptyStack","i","createIfNecessary","matchComponentType","getStackForComponentTypes","types","isLastType","dehydrateLayoutConfig","dehydrateComponent","dehydratedConfig","itemConfig","content","dehydratedComponent","push","debug2","concat","layoutItemConfig","_objectSpread","getTabPoint","glContainer","tab","Error","tabRect","getBoundingClientRect","left","width","bottom","dropLayoutMinorChange","activeItemIndex","props","panelState","id","irisGridState","sorts","quickFilters","gridState","isStuckToBottom","isStuckToRight","isEqual","layout1","layout2","major","layout1Clone","cloneLayout","layout2Clone","layout","JSON","parse","stringify","hydrateLayoutConfig","hydrateComponent","hydratedConfig","_itemConfig$id","contentConfig","warn","openComponent","configParam","replaceExisting","replaceConfig","createNewStack","focusElement","dragEvent","generate","layoutManager","createDragSourceFromEvent","searchConfig","oldContentItem","onComponentCreated","event","debug","off","origin","requestAnimationFrame","on","index","indexOf","openComponentInStack","closeComponent","closeOptions","container","close","contains","renameComponent","newTitle","setTitle","cloneComponent","getPanelComponentState","cloneConfig","title","_config$componentStat","componentState","_config$props","makeDefaultLayout","dimensions","headerHeight","tabHeight","borderWidth","dragBorderWidth","borderGrabWidth","settings","showPopoutIcon","showCloseIcon","constrainDragToContainer","getRootFromContainer","getComponentConfigFromContainer","_config","getTitleFromContainer","getTitleFromTab","getIdFromContainer","getIdFromPanel","panel","getComponentNameFromPanel","_config$component","getComponentName","_component$WrappedCom","_component$WrappedCom2","name","WrappedComponent","displayName","selector","DEFAULT_FOCUS_SELECTOR","querySelector","onInitialized","Promise","resolve","isInitialised","onInit","_defineProperty"],"sources":["../../src/layout/LayoutUtils.ts"],"sourcesContent":["import { DragEvent } from 'react';\nimport deepEqual from 'deep-equal';\nimport shortid from 'shortid';\nimport isMatch from 'lodash.ismatch';\nimport Log from '@deephaven/log';\nimport GoldenLayout, {\n isComponent,\n isRoot,\n isStack,\n GoldenLayoutThemeExport,\n GLPanelProps,\n} from '@deephaven/golden-layout';\nimport type {\n ComponentConfig,\n Config,\n Container,\n ContentItem,\n ItemConfig,\n ItemConfigType,\n ReactComponentConfig,\n Stack,\n Tab,\n CloseOptions,\n} from '@deephaven/golden-layout';\nimport { assertNotNull } from '@deephaven/utils';\nimport { DashboardLayoutConfig } from '../DashboardLayout';\nimport { PanelConfig } from '../DashboardPlugin';\n\nconst log = Log.module('LayoutUtils');\n\ntype LayoutConfig = { id?: string; component?: string };\n\nexport type LayoutPanel = {\n props: GLPanelProps;\n};\n\nexport type StackItemConfig = ItemConfig & {\n activeItemIndex?: number;\n};\n\nfunction isComponentConfig(config: ItemConfigType): config is ComponentConfig {\n return (config as ComponentConfig).componentName !== undefined;\n}\n\nexport function isReactComponentConfig(\n config: ItemConfigType\n): config is ReactComponentConfig {\n const reactConfig = config as ReactComponentConfig;\n // Golden layout sets the type to 'component' and componentName to 'lm-react-component' in `createContentItem`, then changes it back in `toConfig`\n // For our purposes, we need to check both.\n return (\n ((isComponentConfig(config) &&\n config.componentName === 'lm-react-component') ||\n config.type === 'react-component') &&\n reactConfig.component !== undefined\n );\n}\n\nfunction isHTMLElement(element: Element): element is HTMLElement {\n return (element as HTMLElement).focus !== undefined;\n}\n\nfunction isStackItemConfig(config: ItemConfigType): config is StackItemConfig {\n return config.type === 'stack';\n}\nclass LayoutUtils {\n static DEFAULT_FOCUS_SELECTOR = 'input, select, textarea, button';\n\n static activateTab(root: ContentItem, config: Partial<ItemConfigType>): void {\n const stack = LayoutUtils.getStackForRoot(root, config, false);\n if (!stack) {\n log.error('Could not find stack for config', config);\n return;\n }\n // Find the tab with the specified table and activate it\n const contentItem = LayoutUtils.getContentItemInStack(stack, config);\n if (contentItem) {\n stack.setActiveContentItem(contentItem);\n }\n }\n\n /**\n * Is the tab with the given config active\n * @param root A GoldenLayout content item with the tab\n * @param config Tab config to match\n * @returns True if the tab is active\n */\n static isActiveTab(\n root: ContentItem,\n config: Partial<ReactComponentConfig>\n ): boolean {\n const stack = LayoutUtils.getStackForRoot(root, config, false);\n if (!stack) {\n log.error('Could not find stack for config', config);\n return false;\n }\n // Find the item with the specified config and compare with active item\n const contentItem = LayoutUtils.getContentItemInStack(stack, config);\n const activeItem = stack.getActiveContentItem();\n return activeItem === contentItem;\n }\n\n /**\n * Adds a stack to the root layout specified. Adds to the first row/column with only one item\n * @param parent A GoldenLayout content item to add the stack to\n * @returns The newly created stack.\n */\n static addStack(parent: ContentItem, columnPreferred = true): Stack {\n const type = columnPreferred ? 'column' : 'row';\n if (isRoot(parent)) {\n if (parent.contentItems == null || parent.contentItems.length === 0) {\n parent.addChild({ type });\n }\n\n const child = parent.contentItems[0];\n const isCorrectType = columnPreferred ? child.isColumn : child.isRow;\n if (!isCorrectType) {\n parent.removeChild(child, true);\n parent.addChild({ type });\n\n // The addChild may cause the element that has focus to be removed from the DOM, which changes focus to the body\n // Try and maintain the focus as best we can. The unfocused element may still send a blur/focus event so that needs to be handled correctly.\n const maintainFocusElement = document.activeElement;\n parent.contentItems[0].addChild(child);\n if (\n maintainFocusElement &&\n (maintainFocusElement as HTMLElement).focus != null\n ) {\n (maintainFocusElement as HTMLElement).focus();\n }\n }\n\n return this.addStack(parent.contentItems[0], columnPreferred);\n }\n\n if (parent.contentItems.length < 2) {\n parent.addChild({ type: 'stack' });\n return parent.contentItems[parent.contentItems.length - 1] as Stack;\n }\n let newParent = parent.contentItems[parent.contentItems.length - 1];\n const isCorrectType = !columnPreferred\n ? newParent.isColumn\n : newParent.isRow;\n if (!isCorrectType) {\n parent.addChild({ type: !columnPreferred ? 'column' : 'row' });\n parent.removeChild(newParent, true);\n parent.contentItems[parent.contentItems.length - 1].addChild(newParent);\n newParent = parent.contentItems[parent.contentItems.length - 1];\n }\n\n return this.addStack(newParent, !columnPreferred);\n }\n\n /**\n * Gets the first stack which contains a contentItem with the given config values\n * @param item Golden layout content item to search for the stack\n * @param config The item properties to match\n */\n static getStackForConfig(\n item: ContentItem,\n config: Partial<ItemConfigType> = {},\n allowEmptyStack = false\n ): Stack | null {\n if (allowEmptyStack && isStack(item) && item.contentItems.length === 0) {\n return item;\n }\n\n if (item.contentItems == null) {\n return null;\n }\n\n for (let i = 0; i < item.contentItems.length; i += 1) {\n const contentItem = item.contentItems[i];\n if (contentItem.isComponent && contentItem.config != null) {\n if (isMatch(contentItem.config, config)) {\n return item as Stack;\n }\n }\n\n const stack = this.getStackForConfig(\n contentItem,\n config,\n allowEmptyStack\n );\n if (stack) {\n return stack;\n }\n }\n\n return null;\n }\n\n /**\n * Gets a stack matching the specified config\n * @param root The root GoldenLayout element\n * @param config The item config type to match, eg. { component: 'IrisGridPanel', title: 'Table Name' }\n * @param createIfNecessary Whether to create the stack if it does not exist.\n * @param matchComponentType If the config doesn't match exactly, just find another one of the same component type\n * @param allowEmptyStack If no configs match, search for an empty stack that can be used\n */\n static getStackForRoot(\n root: ContentItem,\n config: Partial<ReactComponentConfig>,\n createIfNecessary = true,\n matchComponentType = true,\n allowEmptyStack = true\n ): Stack | null {\n let stack = this.getStackForConfig(root, config);\n if (!stack && matchComponentType) {\n stack = this.getStackForConfig(\n root,\n { component: config.component },\n allowEmptyStack\n );\n }\n\n if (!stack && createIfNecessary) {\n stack = this.addStack(root);\n }\n\n return stack;\n }\n\n /**\n * Gets a stack matching one of the specified types, creates new stack if necessary\n * @param root The GoldenLayout root to find or create the stack in\n * @param types The array of component types to match\n * @param createIfNecessary Whether to create the stack if it does not exist\n * @param matchComponentType If the config doesn't match exactly, just find another one of the same component type\n * @param allowEmptyStack If no configs match, search for an empty stack that can be used\n */\n static getStackForComponentTypes(\n root: ContentItem,\n types: string[],\n createIfNecessary = true,\n matchComponentType = true,\n allowEmptyStack = true\n ): Stack | null {\n for (let i = 0; i < types.length; i += 1) {\n const component = types[i];\n const isLastType = i === types.length - 1;\n const stack = LayoutUtils.getStackForRoot(\n root,\n { component },\n createIfNecessary && isLastType,\n matchComponentType,\n allowEmptyStack\n );\n if (stack) {\n return stack;\n }\n }\n return null;\n }\n\n /**\n * Gets first content item with the specified config in stack.\n * @param stack The stack to search for the item\n * @param config The item config type to match, eg. { component: 'IrisGridPanel', title: 'Table Name' }\n * @returns Returns the found content item, null if not found.\n */\n static getContentItemInStack(\n stack: ContentItem | null,\n config: Partial<ItemConfigType>\n ): ContentItem | null {\n if (!stack) {\n return null;\n }\n for (let i = 0; i < stack.contentItems.length; i += 1) {\n const contentItem = stack.contentItems[i];\n if (contentItem.isComponent && contentItem.config != null) {\n if (isMatch(contentItem.config, config)) {\n return contentItem;\n }\n }\n }\n return null;\n }\n\n /**\n * Removes dynamic props from components in the given config so this config could be serialized\n * @param config Config objec\n * @returns Dehydrated config\n */\n static dehydrateLayoutConfig(\n config: ItemConfigType[],\n dehydrateComponent: (\n componentName: string,\n config: ItemConfigType\n ) => PanelConfig\n ): (PanelConfig | ItemConfig)[] {\n if (config == null || !config.length) {\n return [];\n }\n const dehydratedConfig: (PanelConfig | ItemConfig)[] = [];\n\n for (let i = 0; i < config.length; i += 1) {\n const itemConfig = config[i];\n const { component, content } = itemConfig as ReactComponentConfig;\n if (component) {\n const dehydratedComponent = dehydrateComponent(component, itemConfig);\n if (dehydratedComponent != null) {\n dehydratedConfig.push(dehydratedComponent);\n } else {\n log.debug2(\n `dehydrateLayoutConfig: skipping unmapped component \"${component}\"`\n );\n }\n } else if (content) {\n const layoutItemConfig = {\n ...itemConfig,\n content: LayoutUtils.dehydrateLayoutConfig(\n content,\n dehydrateComponent\n ),\n };\n dehydratedConfig.push(layoutItemConfig);\n } else {\n dehydratedConfig.push(itemConfig);\n }\n }\n return dehydratedConfig;\n }\n\n static getTabPoint(glContainer: Container): [number, number] {\n const { tab } = glContainer;\n if (tab == null) {\n throw new Error(`Cannot get tab for panel container ${glContainer}`);\n }\n const tabRect = tab.element[0].getBoundingClientRect();\n\n return [tabRect.left + tabRect.width * 0.5, tabRect.bottom - 8];\n }\n\n /**\n * Drop minor changes in Layout Configuration for deep comparison\n * @param config Layout Configuration\n *\n * minor changes:\n * 1. sorts in grid\n * 2. quick filters in grid\n * 3. active item\n * 4. isStuckToBottom/isStuckToRight\n *\n * item id is also removed\n */\n static dropLayoutMinorChange(config: DashboardLayoutConfig): void {\n for (let i = 0; i < config.length; i += 1) {\n const itemConfig = config[i];\n const { content } = itemConfig;\n if (content !== undefined) {\n if (isStackItemConfig(itemConfig)) {\n delete itemConfig.activeItemIndex;\n }\n LayoutUtils.dropLayoutMinorChange(content);\n } else if (\n isReactComponentConfig(itemConfig) &&\n itemConfig.component === 'IrisGridPanel'\n ) {\n if (itemConfig.props.panelState != null) {\n delete itemConfig.id;\n itemConfig.props.panelState.irisGridState.sorts = [];\n itemConfig.props.panelState.irisGridState.quickFilters = [];\n itemConfig.props.panelState.gridState.isStuckToBottom = false;\n itemConfig.props.panelState.gridState.isStuckToRight = false;\n }\n }\n }\n }\n\n /**\n * Compare two layouts to see if they are equivalent\n * @param layout1 A Golden Layout config object\n * @param layout2 Another Golden layout config object\n * @param major When true, will ignore \"minor\" property differences (eg. sorts)\n */\n static isEqual(\n layout1: DashboardLayoutConfig,\n layout2: DashboardLayoutConfig,\n major = false\n ): boolean {\n if (major) {\n const layout1Clone = LayoutUtils.cloneLayout(layout1);\n const layout2Clone = LayoutUtils.cloneLayout(layout2);\n LayoutUtils.dropLayoutMinorChange(layout1Clone);\n LayoutUtils.dropLayoutMinorChange(layout2Clone);\n return deepEqual(layout1Clone, layout2Clone);\n }\n return deepEqual(layout1, layout2);\n }\n\n static cloneLayout(layout: DashboardLayoutConfig): DashboardLayoutConfig {\n return JSON.parse(JSON.stringify(layout));\n }\n\n /**\n * Adds dynamic props to components in the given config so this config could be used to initialize a layout\n * @param config Dehydrated config object\n * @param hydrateComponent Function to hydrate the component\n * @returns Hydrated config\n */\n static hydrateLayoutConfig(\n config: (PanelConfig | ItemConfig)[],\n hydrateComponent: (\n componentName: string,\n config: PanelConfig | ItemConfig\n ) => ReactComponentConfig\n ): DashboardLayoutConfig {\n if (config == null || !config.length) {\n return [];\n }\n const hydratedConfig = [];\n\n for (let i = 0; i < config.length; i += 1) {\n const itemConfig = config[i];\n if (isReactComponentConfig(itemConfig)) {\n const { component, props = {} } = itemConfig;\n hydratedConfig.push({\n ...itemConfig,\n id: itemConfig?.id ?? shortid(),\n props: hydrateComponent(component, props),\n });\n } else if (itemConfig.content !== undefined) {\n const contentConfig = LayoutUtils.hydrateLayoutConfig(\n itemConfig.content,\n hydrateComponent\n );\n if (\n isStackItemConfig(itemConfig) &&\n itemConfig.activeItemIndex != null &&\n itemConfig.activeItemIndex >= contentConfig.length\n ) {\n log.warn(\n 'Fixing bad activeItemIndex!',\n itemConfig.activeItemIndex,\n itemConfig\n );\n itemConfig.activeItemIndex = 0;\n }\n hydratedConfig.push({\n ...itemConfig,\n content: contentConfig,\n });\n } else {\n hydratedConfig.push(itemConfig);\n }\n }\n\n return hydratedConfig;\n }\n\n /**\n * Opens a component. It will try and open the component in an existing stack of the same component.\n * If `replaceExisting` is true and there is a component found with the same `config.id`, it will replace that component with this one.\n * If `allowStack` is true and there is a component of the same type found, it will open in that stack (potentially covering up a panel).\n * @param root The GoldenLayout root to open the component in\n * @param config The component config definition to open\n * @param replaceExisting Whether it should replace the existing one matching component type and id, or open a new one\n * @param replaceConfig The component config to replace\n * @param createNewStack True to force opening in a new stack, false to try and open in a stack with the same type of component.\n * @param focusElement The element to focus on\n * @param dragEvent Whether component is being created with a drag, mouse event is initial position for drag proxy\n */\n static openComponent({\n root,\n config: configParam,\n replaceExisting = true,\n replaceConfig = undefined,\n createNewStack = false,\n focusElement = undefined,\n dragEvent = undefined,\n }: {\n root?: ContentItem;\n config?: Partial<ReactComponentConfig>;\n replaceExisting?: boolean;\n replaceConfig?: Partial<ItemConfigType>;\n createNewStack?: boolean;\n focusElement?: string;\n dragEvent?: DragEvent;\n } = {}): void {\n // attempt to retain focus after dom manipulation, which can break focus\n const maintainFocusElement = document.activeElement;\n const config = { ...configParam } as ReactComponentConfig;\n\n if (config.id == null) {\n config.id = shortid.generate();\n }\n\n if (dragEvent != null) {\n root?.layoutManager.createDragSourceFromEvent(config, dragEvent);\n return;\n }\n\n const searchConfig = replaceConfig || {\n id: config.id,\n component: config.component,\n };\n assertNotNull(root);\n const stack = createNewStack\n ? LayoutUtils.addStack(root)\n : LayoutUtils.getStackForRoot(root, searchConfig);\n\n assertNotNull(stack);\n const oldContentItem = LayoutUtils.getContentItemInStack(\n stack,\n searchConfig\n );\n\n if (focusElement != null) {\n // We need to listen for when the stack is created\n const onComponentCreated = (event: {\n origin: { element: Element[] };\n }): void => {\n log.debug('Component created, focusing element', focusElement);\n\n stack.off('componentCreated', onComponentCreated);\n\n const { element } = event.origin;\n\n // Need to wait until the component actually renders.\n requestAnimationFrame(() => {\n LayoutUtils.focusElement(element[0], focusElement);\n });\n };\n stack.on('componentCreated', onComponentCreated);\n }\n if (replaceExisting && oldContentItem) {\n const index = stack.contentItems.indexOf(oldContentItem);\n\n // Using remove/add here instead of replaceChild because I was getting errors with replaceChild... should be the same.\n // Add first so that the stack doesn't get screwed up\n stack.addChild(config, index + 1);\n stack.removeChild(oldContentItem);\n\n stack.setActiveContentItem(stack.contentItems[index]);\n } else {\n stack.addChild(config);\n }\n\n if (\n focusElement == null &&\n maintainFocusElement &&\n isHTMLElement(maintainFocusElement)\n ) {\n maintainFocusElement.focus();\n }\n }\n\n /**\n * Opens a component in an given stack.\n * If `replaceExisting` is true and there is a component found with the same `config.id`, it will replace that component with this one\n * @param stack The GoldenLayout stack to open the component in\n * @param config The component config definition to open\n * @param replaceExisting Whether it should replace the existing one matching component type and id, or open a new one\n */\n static openComponentInStack(\n stack: Stack | null,\n config: ItemConfigType & Record<string, unknown>,\n replaceExisting = true\n ): void {\n const maintainFocusElement = document.activeElement; // attempt to retain focus after dom manipulation, which can break focus\n\n const searchConfig = { id: config.id };\n\n const oldContentItem = LayoutUtils.getContentItemInStack(\n stack,\n searchConfig\n );\n\n if (replaceExisting && oldContentItem && stack) {\n const index = stack?.contentItems.indexOf(oldContentItem);\n\n // Using remove/add here instead of replaceChild because I was getting errors with replaceChild... should be the same.\n // Add first so that the stack doesn't get screwed up\n stack.addChild(config, index + 1);\n stack.removeChild(oldContentItem);\n\n stack.setActiveContentItem(stack.contentItems[index]);\n } else {\n stack?.addChild(config);\n }\n\n if (maintainFocusElement && isHTMLElement(maintainFocusElement)) {\n maintainFocusElement.focus();\n }\n }\n\n /**\n * Close the specified component and remove it from the stack it's currently in\n * @param root The GoldenLayout root to search and close the component in\n * @param config The GoldenLayout component config definition to close, eg. { component: 'IrisGridPanel', id: 'table-t' }\n */\n static closeComponent(\n root: ContentItem,\n config: LayoutConfig,\n closeOptions?: CloseOptions\n ): void {\n const stack = LayoutUtils.getStackForRoot(\n root,\n config,\n false,\n false,\n false\n );\n\n if (!stack) {\n log.warn('Cannot find stack for component, ignoring close', config);\n return;\n }\n\n // Find the tab with the specified config and remove it\n // Same component was used to get the stack above, so getContentItemInStack shouldn't return null\n const oldContentItem = LayoutUtils.getContentItemInStack(stack, config);\n const maintainFocusElement = document.activeElement; // attempt to retain focus after dom manipulation, which can break focus\n if (oldContentItem) {\n if (isComponent(oldContentItem)) {\n oldContentItem.container.close(closeOptions);\n } else {\n stack.removeChild(oldContentItem);\n }\n }\n // if focused element is still in dom restore focus, note it could have been in the removed panel so check first\n if (\n maintainFocusElement &&\n document.contains(maintainFocusElement) &&\n isHTMLElement(maintainFocusElement)\n ) {\n maintainFocusElement.focus();\n }\n }\n\n static renameComponent(\n root: ContentItem,\n config: Partial<ItemConfigType>,\n newTitle: string\n ): void {\n const stack = LayoutUtils.getStackForRoot(root, config, false);\n if (!stack) {\n log.error('Could not find stack for config', config);\n return;\n }\n // Find the tab with the specified config and rename it\n const contentItem = LayoutUtils.getContentItemInStack(stack, config);\n if (contentItem) {\n contentItem.setTitle(newTitle);\n }\n }\n\n /**\n * Create a component clone based on the given config\n * @param root The GoldenLayout root to clone the component in\n * @param config The config to clone\n * @returns Clone config\n */\n static cloneComponent(\n root: ContentItem,\n config: ReactComponentConfig\n ): ReactComponentConfig | null {\n const stack = LayoutUtils.getStackForRoot(root, config, false);\n if (!stack) {\n log.error('Could not find stack for config', config);\n return null;\n }\n const { props = {} } = config;\n const panelState = LayoutUtils.getPanelComponentState(config);\n const cloneConfig = {\n type: 'react-component' as const,\n component: config.component,\n props: {\n ...props,\n panelState,\n },\n title: `${config.title} Copy`,\n id: shortid.generate(),\n };\n LayoutUtils.openComponentInStack(stack, cloneConfig);\n return cloneConfig;\n }\n\n /**\n * Get panel component state for the given config\n * @param config Panel config\n * @returns Panel state\n */\n static getPanelComponentState(config: ItemConfigType): unknown {\n if (isComponentConfig(config)) {\n return config.componentState?.panelState;\n }\n if (isReactComponentConfig(config)) {\n return config.props?.panelState;\n }\n return null;\n }\n\n static makeDefaultLayout(): Config {\n return {\n dimensions: {\n headerHeight: GoldenLayoutThemeExport.tabHeight,\n borderWidth: GoldenLayoutThemeExport.dragBorderWidth,\n borderGrabWidth: 10,\n },\n settings: {\n showPopoutIcon: false,\n showCloseIcon: false,\n constrainDragToContainer: false,\n },\n } as Config;\n }\n\n /**\n * Gets a containers root node\n * @param container The Golden Layout container to get the root for\n */\n static getRootFromContainer(container: Container): ContentItem {\n return container.layoutManager.root;\n }\n\n /**\n * Gets the config for the panel component given a glContainer\n * @param container The Golden Layout container to get the config for\n */\n static getComponentConfigFromContainer(\n container?: Container\n ): ItemConfigType | null {\n if (container) {\n if (container.tab != null && container.tab.contentItem != null) {\n return container.tab.contentItem.config;\n }\n\n // If the container hasn't populated the tab yet, just get the config directly from the container\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore private api usage\n // eslint-disable-next-line no-underscore-dangle\n return container._config;\n }\n\n return null;\n }\n\n static getTitleFromContainer(\n container: Container\n ): string | null | undefined {\n if (\n container != null &&\n container.tab != null &&\n container.tab.contentItem != null\n ) {\n return container.tab.contentItem.config.title;\n }\n return null;\n }\n\n static getTitleFromTab(tab: Tab): string | null | undefined {\n if (tab != null && tab.contentItem != null) {\n return tab.contentItem.config.title;\n }\n return null;\n }\n\n /**\n * Retrieve the panel ID for the provided golden layout container\n * @param glContainer The container to get the panel ID for\n * @returns Panel ID\n */\n static getIdFromContainer(\n glContainer: Container\n ): string | string[] | null | undefined {\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n if (config) {\n return config.id;\n }\n return null;\n }\n\n /**\n * Retrieve the ID of the panel provided\n * @param panel The panel to get the ID for\n * @returns Panel ID\n */\n static getIdFromPanel(\n panel: LayoutPanel\n ): string | string[] | null | undefined {\n const { glContainer } = panel.props;\n return LayoutUtils.getIdFromContainer(glContainer);\n }\n\n /**\n * Get component name from the panel instance\n * @param panel Panel to get component name for\n * @returns Component name or null if unable to retrieve name\n */\n static getComponentNameFromPanel(panel: LayoutPanel): string | null {\n const { glContainer } = panel.props;\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n if (config && isReactComponentConfig(config)) {\n return config.component ?? null;\n }\n return null;\n }\n\n /**\n * Get component name for wrapped and un-wrapped components\n * @param component Component to get name for\n * @returns Component name\n * @throws If displayName for the component is not defined\n */\n static getComponentName(component: {\n displayName?: string;\n WrappedComponent?: { displayName?: string };\n }): string {\n const name =\n component.WrappedComponent?.displayName ?? component.displayName;\n if (name == null) {\n throw new Error(`Component displayName not defined ${component}`);\n }\n return name;\n }\n\n /**\n * Put focus on the first \"input\" element (input, button, select, textarea) within an element\n * If element is null or input element not found, does nothing\n * @param element The element to put focus in.\n * @param selector The first element matching this selector will be focused.\n * @returns The element that was focused, null if not focused\n */\n static focusElement(\n element: Element,\n selector = LayoutUtils.DEFAULT_FOCUS_SELECTOR\n ): Element | null {\n if (element == null) {\n return null;\n }\n const focusElement = element.querySelector(selector);\n if (focusElement == null) {\n return null;\n }\n\n if (isHTMLElement(focusElement)) {\n focusElement.focus();\n }\n return focusElement;\n }\n\n /**\n * Get a promise that initializes when layout is initialized\n * @param layout The layout to await initialization on\n * @returns Promise that resolves when layout is initialized\n */\n static onInitialized(layout: GoldenLayout): Promise<void> {\n return new Promise(resolve => {\n if (layout.isInitialised) {\n resolve();\n return;\n }\n const onInit = (): void => {\n layout.off('initialised', onInit);\n resolve();\n };\n layout.on('initialised', onInit);\n });\n }\n}\n\nexport default LayoutUtils;\n"],"mappings":"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"}
1
+ {"version":3,"file":"LayoutUtils.js","names":["deepEqual","shortid","isMatch","Log","isComponent","isRoot","isStack","GoldenLayoutThemeExport","assertNotNull","log","module","isComponentConfig","config","componentName","undefined","isReactComponentConfig","reactConfig","type","component","isHTMLElement","element","focus","isStackItemConfig","LayoutUtils","activateTab","root","stack","getStackForRoot","error","contentItem","getContentItemInStack","setActiveContentItem","isActiveTab","activeItem","getActiveContentItem","addStack","parent","columnPreferred","arguments","length","contentItems","addChild","child","isCorrectType","isColumn","isRow","removeChild","maintainFocusElement","document","activeElement","newParent","getStackForConfig","item","allowEmptyStack","i","createIfNecessary","matchComponentType","getStackForComponentTypes","types","isLastType","dehydrateLayoutConfig","dehydrateComponent","dehydratedConfig","itemConfig","content","dehydratedComponent","push","debug2","concat","layoutItemConfig","_objectSpread","getTabPoint","glContainer","tab","Error","tabRect","getBoundingClientRect","left","width","bottom","dropLayoutMinorChange","activeItemIndex","props","panelState","id","irisGridState","sorts","quickFilters","gridState","isStuckToBottom","isStuckToRight","isEqual","layout1","layout2","major","layout1Clone","cloneLayout","layout2Clone","layout","JSON","parse","stringify","hydrateLayoutConfig","hydrateComponent","hydratedConfig","_itemConfig$id","contentConfig","warn","openComponent","configParam","replaceExisting","replaceConfig","createNewStack","focusElement","dragEvent","generate","layoutManager","createDragSourceFromEvent","searchConfig","oldContentItem","onComponentCreated","event","debug","off","origin","requestAnimationFrame","on","index","indexOf","openComponentInStack","closeComponent","closeOptions","container","close","contains","renameComponent","newTitle","setTitle","cloneComponent","getPanelComponentState","cloneConfig","title","_config$componentStat","componentState","_config$props","makeDefaultLayout","dimensions","headerHeight","tabHeight","borderWidth","dragBorderWidth","borderGrabWidth","settings","showPopoutIcon","showCloseIcon","constrainDragToContainer","getRootFromContainer","getComponentConfigFromContainer","_config","getTitleFromContainer","getTitleFromTab","getIdFromContainer","getIdFromPanel","panel","getComponentNameFromPanel","_config$component","getComponentName","_component$WrappedCom","_component$WrappedCom2","name","WrappedComponent","displayName","selector","DEFAULT_FOCUS_SELECTOR","querySelector","onInitialized","Promise","resolve","isInitialised","onInit","_defineProperty"],"sources":["../../src/layout/LayoutUtils.ts"],"sourcesContent":["import { DragEvent } from 'react';\nimport deepEqual from 'deep-equal';\nimport shortid from 'shortid';\nimport isMatch from 'lodash.ismatch';\nimport Log from '@deephaven/log';\nimport GoldenLayout, {\n isComponent,\n isRoot,\n isStack,\n GoldenLayoutThemeExport,\n GLPanelProps,\n} from '@deephaven/golden-layout';\nimport type {\n ComponentConfig,\n Config,\n Container,\n ContentItem,\n ItemConfig,\n ItemConfigType,\n ReactComponentConfig,\n Stack,\n Tab,\n CloseOptions,\n} from '@deephaven/golden-layout';\nimport { assertNotNull } from '@deephaven/utils';\nimport { DashboardLayoutConfig } from '../DashboardLayout';\nimport { PanelConfig } from '../DashboardPlugin';\n\nconst log = Log.module('LayoutUtils');\n\ntype LayoutConfig = { id?: string; component?: string };\n\nexport type LayoutPanel = {\n props: GLPanelProps;\n};\n\nexport type StackItemConfig = ItemConfig & {\n activeItemIndex?: number;\n};\n\nfunction isComponentConfig(config: ItemConfigType): config is ComponentConfig {\n return (config as ComponentConfig).componentName !== undefined;\n}\n\nexport function isReactComponentConfig(\n config: ItemConfigType\n): config is ReactComponentConfig {\n const reactConfig = config as ReactComponentConfig;\n // Golden layout sets the type to 'component' and componentName to 'lm-react-component' in `createContentItem`, then changes it back in `toConfig`\n // For our purposes, we need to check both.\n return (\n ((isComponentConfig(config) &&\n config.componentName === 'lm-react-component') ||\n config.type === 'react-component') &&\n reactConfig.component !== undefined\n );\n}\n\nfunction isHTMLElement(element: Element): element is HTMLElement {\n return (element as HTMLElement).focus !== undefined;\n}\n\nfunction isStackItemConfig(config: ItemConfigType): config is StackItemConfig {\n return config.type === 'stack';\n}\nclass LayoutUtils {\n static DEFAULT_FOCUS_SELECTOR = 'input, select, textarea, button';\n\n static activateTab(root: ContentItem, config: Partial<ItemConfigType>): void {\n const stack = LayoutUtils.getStackForRoot(root, config, false);\n if (!stack) {\n log.error('Could not find stack for config', config);\n return;\n }\n // Find the tab with the specified table and activate it\n const contentItem = LayoutUtils.getContentItemInStack(stack, config);\n if (contentItem) {\n stack.setActiveContentItem(contentItem);\n }\n }\n\n /**\n * Is the tab with the given config active\n * @param root A GoldenLayout content item with the tab\n * @param config Tab config to match\n * @returns True if the tab is active\n */\n static isActiveTab(\n root: ContentItem,\n config: Partial<ReactComponentConfig>\n ): boolean {\n const stack = LayoutUtils.getStackForRoot(root, config, false);\n if (!stack) {\n log.error('Could not find stack for config', config);\n return false;\n }\n // Find the item with the specified config and compare with active item\n const contentItem = LayoutUtils.getContentItemInStack(stack, config);\n const activeItem = stack.getActiveContentItem();\n return activeItem === contentItem;\n }\n\n /**\n * Adds a stack to the root layout specified. Adds to the first row/column with only one item\n * @param parent A GoldenLayout content item to add the stack to\n * @returns The newly created stack.\n */\n static addStack(parent: ContentItem, columnPreferred = true): Stack {\n const type = columnPreferred ? 'column' : 'row';\n if (isRoot(parent)) {\n if (parent.contentItems == null || parent.contentItems.length === 0) {\n parent.addChild({ type });\n }\n\n const child = parent.contentItems[0];\n const isCorrectType = columnPreferred ? child.isColumn : child.isRow;\n if (!isCorrectType) {\n parent.removeChild(child, true);\n parent.addChild({ type });\n\n // The addChild may cause the element that has focus to be removed from the DOM, which changes focus to the body\n // Try and maintain the focus as best we can. The unfocused element may still send a blur/focus event so that needs to be handled correctly.\n const maintainFocusElement = document.activeElement;\n parent.contentItems[0].addChild(child);\n if (\n maintainFocusElement &&\n (maintainFocusElement as HTMLElement).focus != null\n ) {\n (maintainFocusElement as HTMLElement).focus();\n }\n }\n\n return this.addStack(parent.contentItems[0], columnPreferred);\n }\n\n if (parent.contentItems.length < 2) {\n parent.addChild({ type: 'stack' });\n return parent.contentItems[parent.contentItems.length - 1] as Stack;\n }\n let newParent = parent.contentItems[parent.contentItems.length - 1];\n const isCorrectType = !columnPreferred\n ? newParent.isColumn\n : newParent.isRow;\n if (!isCorrectType) {\n parent.addChild({ type: !columnPreferred ? 'column' : 'row' });\n parent.removeChild(newParent, true);\n parent.contentItems[parent.contentItems.length - 1].addChild(newParent);\n newParent = parent.contentItems[parent.contentItems.length - 1];\n }\n\n return this.addStack(newParent, !columnPreferred);\n }\n\n /**\n * Gets the first stack which contains a contentItem with the given config values\n * @param item Golden layout content item to search for the stack\n * @param config The item properties to match\n */\n static getStackForConfig(\n item: ContentItem,\n config: Partial<ItemConfigType> = {},\n allowEmptyStack = false\n ): Stack | null {\n if (allowEmptyStack && isStack(item) && item.contentItems.length === 0) {\n return item;\n }\n\n if (item.contentItems == null) {\n return null;\n }\n\n for (let i = 0; i < item.contentItems.length; i += 1) {\n const contentItem = item.contentItems[i];\n if (contentItem.isComponent && contentItem.config != null) {\n if (isMatch(contentItem.config, config)) {\n return item as Stack;\n }\n }\n\n const stack = this.getStackForConfig(\n contentItem,\n config,\n allowEmptyStack\n );\n if (stack) {\n return stack;\n }\n }\n\n return null;\n }\n\n /**\n * Gets a stack matching the specified config\n * @param root The root GoldenLayout element\n * @param config The item config type to match, eg. { component: 'IrisGridPanel', title: 'Table Name' }\n * @param createIfNecessary Whether to create the stack if it does not exist.\n * @param matchComponentType If the config doesn't match exactly, just find another one of the same component type\n * @param allowEmptyStack If no configs match, search for an empty stack that can be used\n */\n static getStackForRoot(\n root: ContentItem,\n config: Partial<ReactComponentConfig>,\n createIfNecessary = true,\n matchComponentType = true,\n allowEmptyStack = true\n ): Stack | null {\n let stack = this.getStackForConfig(root, config);\n if (!stack && matchComponentType) {\n stack = this.getStackForConfig(\n root,\n { component: config.component },\n allowEmptyStack\n );\n }\n\n if (!stack && createIfNecessary) {\n stack = this.addStack(root);\n }\n\n return stack;\n }\n\n /**\n * Gets a stack matching one of the specified types, creates new stack if necessary\n * @param root The GoldenLayout root to find or create the stack in\n * @param types The array of component types to match\n * @param createIfNecessary Whether to create the stack if it does not exist\n * @param matchComponentType If the config doesn't match exactly, just find another one of the same component type\n * @param allowEmptyStack If no configs match, search for an empty stack that can be used\n */\n static getStackForComponentTypes(\n root: ContentItem,\n types: string[],\n createIfNecessary = true,\n matchComponentType = true,\n allowEmptyStack = true\n ): Stack | null {\n for (let i = 0; i < types.length; i += 1) {\n const component = types[i];\n const isLastType = i === types.length - 1;\n const stack = LayoutUtils.getStackForRoot(\n root,\n { component },\n createIfNecessary && isLastType,\n matchComponentType,\n allowEmptyStack\n );\n if (stack) {\n return stack;\n }\n }\n return null;\n }\n\n /**\n * Gets first content item with the specified config in stack.\n * @param stack The stack to search for the item\n * @param config The item config type to match, eg. { component: 'IrisGridPanel', title: 'Table Name' }\n * @returns Returns the found content item, null if not found.\n */\n static getContentItemInStack(\n stack: ContentItem | null,\n config: Partial<ItemConfigType>\n ): ContentItem | null {\n if (!stack) {\n return null;\n }\n for (let i = 0; i < stack.contentItems.length; i += 1) {\n const contentItem = stack.contentItems[i];\n if (contentItem.isComponent && contentItem.config != null) {\n if (isMatch(contentItem.config, config)) {\n return contentItem;\n }\n }\n }\n return null;\n }\n\n /**\n * Removes dynamic props from components in the given config so this config could be serialized\n * @param config Config objec\n * @returns Dehydrated config\n */\n static dehydrateLayoutConfig(\n config: ItemConfigType[],\n dehydrateComponent: (\n componentName: string,\n config: ItemConfigType\n ) => PanelConfig\n ): (PanelConfig | ItemConfig)[] {\n if (config == null || !config.length) {\n return [];\n }\n const dehydratedConfig: (PanelConfig | ItemConfig)[] = [];\n\n for (let i = 0; i < config.length; i += 1) {\n const itemConfig = config[i];\n const { component, content } = itemConfig as ReactComponentConfig;\n if (component) {\n const dehydratedComponent = dehydrateComponent(component, itemConfig);\n if (dehydratedComponent != null) {\n dehydratedConfig.push(dehydratedComponent);\n } else {\n log.debug2(\n `dehydrateLayoutConfig: skipping unmapped component \"${component}\"`\n );\n }\n } else if (content) {\n const layoutItemConfig = {\n ...itemConfig,\n content: LayoutUtils.dehydrateLayoutConfig(\n content,\n dehydrateComponent\n ),\n };\n dehydratedConfig.push(layoutItemConfig);\n } else {\n dehydratedConfig.push(itemConfig);\n }\n }\n return dehydratedConfig;\n }\n\n static getTabPoint(glContainer: Container): [number, number] {\n const { tab } = glContainer;\n if (tab == null) {\n throw new Error(`Cannot get tab for panel container ${glContainer}`);\n }\n const tabRect = tab.element[0].getBoundingClientRect();\n\n return [tabRect.left + tabRect.width * 0.5, tabRect.bottom - 8];\n }\n\n /**\n * Drop minor changes in Layout Configuration for deep comparison\n * @param config Layout Configuration\n *\n * minor changes:\n * 1. sorts in grid\n * 2. quick filters in grid\n * 3. active item\n * 4. isStuckToBottom/isStuckToRight\n *\n * item id is also removed\n */\n static dropLayoutMinorChange(config: DashboardLayoutConfig): void {\n for (let i = 0; i < config.length; i += 1) {\n const itemConfig = config[i];\n const { content } = itemConfig;\n if (content !== undefined) {\n if (isStackItemConfig(itemConfig)) {\n delete itemConfig.activeItemIndex;\n }\n LayoutUtils.dropLayoutMinorChange(content);\n } else if (\n isReactComponentConfig(itemConfig) &&\n itemConfig.component === 'IrisGridPanel'\n ) {\n if (itemConfig.props.panelState != null) {\n delete itemConfig.id;\n itemConfig.props.panelState.irisGridState.sorts = [];\n itemConfig.props.panelState.irisGridState.quickFilters = [];\n itemConfig.props.panelState.gridState.isStuckToBottom = false;\n itemConfig.props.panelState.gridState.isStuckToRight = false;\n }\n }\n }\n }\n\n /**\n * Compare two layouts to see if they are equivalent\n * @param layout1 A Golden Layout config object\n * @param layout2 Another Golden layout config object\n * @param major When true, will ignore \"minor\" property differences (eg. sorts)\n */\n static isEqual(\n layout1: DashboardLayoutConfig,\n layout2: DashboardLayoutConfig,\n major = false\n ): boolean {\n const layout1Clone = LayoutUtils.cloneLayout(layout1);\n const layout2Clone = LayoutUtils.cloneLayout(layout2);\n if (major) {\n LayoutUtils.dropLayoutMinorChange(layout1Clone);\n LayoutUtils.dropLayoutMinorChange(layout2Clone);\n return deepEqual(layout1Clone, layout2Clone);\n }\n // Pass cloned layouts to avoid false negatives\n // when comparing layouts with undefined and missing properties\n return deepEqual(layout1Clone, layout2Clone);\n }\n\n static cloneLayout(layout: DashboardLayoutConfig): DashboardLayoutConfig {\n return JSON.parse(JSON.stringify(layout));\n }\n\n /**\n * Adds dynamic props to components in the given config so this config could be used to initialize a layout\n * @param config Dehydrated config object\n * @param hydrateComponent Function to hydrate the component\n * @returns Hydrated config\n */\n static hydrateLayoutConfig(\n config: (PanelConfig | ItemConfig)[],\n hydrateComponent: (\n componentName: string,\n config: PanelConfig | ItemConfig\n ) => ReactComponentConfig\n ): DashboardLayoutConfig {\n if (config == null || !config.length) {\n return [];\n }\n const hydratedConfig = [];\n\n for (let i = 0; i < config.length; i += 1) {\n const itemConfig = config[i];\n if (isReactComponentConfig(itemConfig)) {\n const { component, props = {} } = itemConfig;\n hydratedConfig.push({\n ...itemConfig,\n id: itemConfig?.id ?? shortid(),\n props: hydrateComponent(component, props),\n });\n } else if (itemConfig.content !== undefined) {\n const contentConfig = LayoutUtils.hydrateLayoutConfig(\n itemConfig.content,\n hydrateComponent\n );\n if (\n isStackItemConfig(itemConfig) &&\n itemConfig.activeItemIndex != null &&\n itemConfig.activeItemIndex >= contentConfig.length\n ) {\n log.warn(\n 'Fixing bad activeItemIndex!',\n itemConfig.activeItemIndex,\n itemConfig\n );\n itemConfig.activeItemIndex = 0;\n }\n hydratedConfig.push({\n ...itemConfig,\n content: contentConfig,\n });\n } else {\n hydratedConfig.push(itemConfig);\n }\n }\n\n return hydratedConfig;\n }\n\n /**\n * Opens a component. It will try and open the component in an existing stack of the same component.\n * If `replaceExisting` is true and there is a component found with the same `config.id`, it will replace that component with this one.\n * If `allowStack` is true and there is a component of the same type found, it will open in that stack (potentially covering up a panel).\n * @param root The GoldenLayout root to open the component in\n * @param config The component config definition to open\n * @param replaceExisting Whether it should replace the existing one matching component type and id, or open a new one\n * @param replaceConfig The component config to replace\n * @param createNewStack True to force opening in a new stack, false to try and open in a stack with the same type of component.\n * @param focusElement The element to focus on\n * @param dragEvent Whether component is being created with a drag, mouse event is initial position for drag proxy\n */\n static openComponent({\n root,\n config: configParam,\n replaceExisting = true,\n replaceConfig = undefined,\n createNewStack = false,\n focusElement = undefined,\n dragEvent = undefined,\n }: {\n root?: ContentItem;\n config?: Partial<ReactComponentConfig>;\n replaceExisting?: boolean;\n replaceConfig?: Partial<ItemConfigType>;\n createNewStack?: boolean;\n focusElement?: string;\n dragEvent?: DragEvent;\n } = {}): void {\n // attempt to retain focus after dom manipulation, which can break focus\n const maintainFocusElement = document.activeElement;\n const config = { ...configParam } as ReactComponentConfig;\n\n if (config.id == null) {\n config.id = shortid.generate();\n }\n\n if (dragEvent != null) {\n root?.layoutManager.createDragSourceFromEvent(config, dragEvent);\n return;\n }\n\n const searchConfig = replaceConfig || {\n id: config.id,\n component: config.component,\n };\n assertNotNull(root);\n const stack = createNewStack\n ? LayoutUtils.addStack(root)\n : LayoutUtils.getStackForRoot(root, searchConfig);\n\n assertNotNull(stack);\n const oldContentItem = LayoutUtils.getContentItemInStack(\n stack,\n searchConfig\n );\n\n if (focusElement != null) {\n // We need to listen for when the stack is created\n const onComponentCreated = (event: {\n origin: { element: Element[] };\n }): void => {\n log.debug('Component created, focusing element', focusElement);\n\n stack.off('componentCreated', onComponentCreated);\n\n const { element } = event.origin;\n\n // Need to wait until the component actually renders.\n requestAnimationFrame(() => {\n LayoutUtils.focusElement(element[0], focusElement);\n });\n };\n stack.on('componentCreated', onComponentCreated);\n }\n if (replaceExisting && oldContentItem) {\n const index = stack.contentItems.indexOf(oldContentItem);\n\n // Using remove/add here instead of replaceChild because I was getting errors with replaceChild... should be the same.\n // Add first so that the stack doesn't get screwed up\n stack.addChild(config, index + 1);\n stack.removeChild(oldContentItem);\n\n stack.setActiveContentItem(stack.contentItems[index]);\n } else {\n stack.addChild(config);\n }\n\n if (\n focusElement == null &&\n maintainFocusElement &&\n isHTMLElement(maintainFocusElement)\n ) {\n maintainFocusElement.focus();\n }\n }\n\n /**\n * Opens a component in an given stack.\n * If `replaceExisting` is true and there is a component found with the same `config.id`, it will replace that component with this one\n * @param stack The GoldenLayout stack to open the component in\n * @param config The component config definition to open\n * @param replaceExisting Whether it should replace the existing one matching component type and id, or open a new one\n */\n static openComponentInStack(\n stack: Stack | null,\n config: ItemConfigType & Record<string, unknown>,\n replaceExisting = true\n ): void {\n const maintainFocusElement = document.activeElement; // attempt to retain focus after dom manipulation, which can break focus\n\n const searchConfig = { id: config.id };\n\n const oldContentItem = LayoutUtils.getContentItemInStack(\n stack,\n searchConfig\n );\n\n if (replaceExisting && oldContentItem && stack) {\n const index = stack?.contentItems.indexOf(oldContentItem);\n\n // Using remove/add here instead of replaceChild because I was getting errors with replaceChild... should be the same.\n // Add first so that the stack doesn't get screwed up\n stack.addChild(config, index + 1);\n stack.removeChild(oldContentItem);\n\n stack.setActiveContentItem(stack.contentItems[index]);\n } else {\n stack?.addChild(config);\n }\n\n if (maintainFocusElement && isHTMLElement(maintainFocusElement)) {\n maintainFocusElement.focus();\n }\n }\n\n /**\n * Close the specified component and remove it from the stack it's currently in\n * @param root The GoldenLayout root to search and close the component in\n * @param config The GoldenLayout component config definition to close, eg. { component: 'IrisGridPanel', id: 'table-t' }\n */\n static closeComponent(\n root: ContentItem,\n config: LayoutConfig,\n closeOptions?: CloseOptions\n ): void {\n const stack = LayoutUtils.getStackForRoot(\n root,\n config,\n false,\n false,\n false\n );\n\n if (!stack) {\n log.warn('Cannot find stack for component, ignoring close', config);\n return;\n }\n\n // Find the tab with the specified config and remove it\n // Same component was used to get the stack above, so getContentItemInStack shouldn't return null\n const oldContentItem = LayoutUtils.getContentItemInStack(stack, config);\n const maintainFocusElement = document.activeElement; // attempt to retain focus after dom manipulation, which can break focus\n if (oldContentItem) {\n if (isComponent(oldContentItem)) {\n oldContentItem.container.close(closeOptions);\n } else {\n stack.removeChild(oldContentItem);\n }\n }\n // if focused element is still in dom restore focus, note it could have been in the removed panel so check first\n if (\n maintainFocusElement &&\n document.contains(maintainFocusElement) &&\n isHTMLElement(maintainFocusElement)\n ) {\n maintainFocusElement.focus();\n }\n }\n\n static renameComponent(\n root: ContentItem,\n config: Partial<ItemConfigType>,\n newTitle: string\n ): void {\n const stack = LayoutUtils.getStackForRoot(root, config, false);\n if (!stack) {\n log.error('Could not find stack for config', config);\n return;\n }\n // Find the tab with the specified config and rename it\n const contentItem = LayoutUtils.getContentItemInStack(stack, config);\n if (contentItem) {\n contentItem.setTitle(newTitle);\n }\n }\n\n /**\n * Create a component clone based on the given config\n * @param root The GoldenLayout root to clone the component in\n * @param config The config to clone\n * @returns Clone config\n */\n static cloneComponent(\n root: ContentItem,\n config: ReactComponentConfig\n ): ReactComponentConfig | null {\n const stack = LayoutUtils.getStackForRoot(root, config, false);\n if (!stack) {\n log.error('Could not find stack for config', config);\n return null;\n }\n const { props = {} } = config;\n const panelState = LayoutUtils.getPanelComponentState(config);\n const cloneConfig = {\n type: 'react-component' as const,\n component: config.component,\n props: {\n ...props,\n panelState,\n },\n title: `${config.title} Copy`,\n id: shortid.generate(),\n };\n LayoutUtils.openComponentInStack(stack, cloneConfig);\n return cloneConfig;\n }\n\n /**\n * Get panel component state for the given config\n * @param config Panel config\n * @returns Panel state\n */\n static getPanelComponentState(config: ItemConfigType): unknown {\n if (isComponentConfig(config)) {\n return config.componentState?.panelState;\n }\n if (isReactComponentConfig(config)) {\n return config.props?.panelState;\n }\n return null;\n }\n\n static makeDefaultLayout(): Config {\n return {\n dimensions: {\n headerHeight: GoldenLayoutThemeExport.tabHeight,\n borderWidth: GoldenLayoutThemeExport.dragBorderWidth,\n borderGrabWidth: 10,\n },\n settings: {\n showPopoutIcon: false,\n showCloseIcon: false,\n constrainDragToContainer: false,\n },\n } as Config;\n }\n\n /**\n * Gets a containers root node\n * @param container The Golden Layout container to get the root for\n */\n static getRootFromContainer(container: Container): ContentItem {\n return container.layoutManager.root;\n }\n\n /**\n * Gets the config for the panel component given a glContainer\n * @param container The Golden Layout container to get the config for\n */\n static getComponentConfigFromContainer(\n container?: Container\n ): ItemConfigType | null {\n if (container) {\n if (container.tab != null && container.tab.contentItem != null) {\n return container.tab.contentItem.config;\n }\n\n // If the container hasn't populated the tab yet, just get the config directly from the container\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore private api usage\n // eslint-disable-next-line no-underscore-dangle\n return container._config;\n }\n\n return null;\n }\n\n static getTitleFromContainer(\n container: Container\n ): string | null | undefined {\n if (\n container != null &&\n container.tab != null &&\n container.tab.contentItem != null\n ) {\n return container.tab.contentItem.config.title;\n }\n return null;\n }\n\n static getTitleFromTab(tab: Tab): string | null | undefined {\n if (tab != null && tab.contentItem != null) {\n return tab.contentItem.config.title;\n }\n return null;\n }\n\n /**\n * Retrieve the panel ID for the provided golden layout container\n * @param glContainer The container to get the panel ID for\n * @returns Panel ID\n */\n static getIdFromContainer(\n glContainer: Container\n ): string | string[] | null | undefined {\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n if (config) {\n return config.id;\n }\n return null;\n }\n\n /**\n * Retrieve the ID of the panel provided\n * @param panel The panel to get the ID for\n * @returns Panel ID\n */\n static getIdFromPanel(\n panel: LayoutPanel\n ): string | string[] | null | undefined {\n const { glContainer } = panel.props;\n return LayoutUtils.getIdFromContainer(glContainer);\n }\n\n /**\n * Get component name from the panel instance\n * @param panel Panel to get component name for\n * @returns Component name or null if unable to retrieve name\n */\n static getComponentNameFromPanel(panel: LayoutPanel): string | null {\n const { glContainer } = panel.props;\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n if (config && isReactComponentConfig(config)) {\n return config.component ?? null;\n }\n return null;\n }\n\n /**\n * Get component name for wrapped and un-wrapped components\n * @param component Component to get name for\n * @returns Component name\n * @throws If displayName for the component is not defined\n */\n static getComponentName(component: {\n displayName?: string;\n WrappedComponent?: { displayName?: string };\n }): string {\n const name =\n component.WrappedComponent?.displayName ?? component.displayName;\n if (name == null) {\n throw new Error(`Component displayName not defined ${component}`);\n }\n return name;\n }\n\n /**\n * Put focus on the first \"input\" element (input, button, select, textarea) within an element\n * If element is null or input element not found, does nothing\n * @param element The element to put focus in.\n * @param selector The first element matching this selector will be focused.\n * @returns The element that was focused, null if not focused\n */\n static focusElement(\n element: Element,\n selector = LayoutUtils.DEFAULT_FOCUS_SELECTOR\n ): Element | null {\n if (element == null) {\n return null;\n }\n const focusElement = element.querySelector(selector);\n if (focusElement == null) {\n return null;\n }\n\n if (isHTMLElement(focusElement)) {\n focusElement.focus();\n }\n return focusElement;\n }\n\n /**\n * Get a promise that initializes when layout is initialized\n * @param layout The layout to await initialization on\n * @returns Promise that resolves when layout is initialized\n */\n static onInitialized(layout: GoldenLayout): Promise<void> {\n return new Promise(resolve => {\n if (layout.isInitialised) {\n resolve();\n return;\n }\n const onInit = (): void => {\n layout.off('initialised', onInit);\n resolve();\n };\n layout.on('initialised', onInit);\n });\n }\n}\n\nexport default LayoutUtils;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/dashboard",
3
- "version": "0.62.1-beta.1+e6955c1b",
3
+ "version": "0.62.1-beta.5+e90b627f",
4
4
  "description": "Deephaven Dashboard",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -22,12 +22,12 @@
22
22
  "build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
23
23
  },
24
24
  "dependencies": {
25
- "@deephaven/components": "^0.62.1-beta.1+e6955c1b",
26
- "@deephaven/golden-layout": "^0.62.1-beta.1+e6955c1b",
27
- "@deephaven/log": "^0.62.1-beta.1+e6955c1b",
28
- "@deephaven/react-hooks": "^0.62.1-beta.1+e6955c1b",
29
- "@deephaven/redux": "^0.62.1-beta.1+e6955c1b",
30
- "@deephaven/utils": "^0.62.1-beta.1+e6955c1b",
25
+ "@deephaven/components": "^0.62.1-beta.5+e90b627f",
26
+ "@deephaven/golden-layout": "^0.62.1-beta.5+e90b627f",
27
+ "@deephaven/log": "^0.62.1-beta.5+e90b627f",
28
+ "@deephaven/react-hooks": "^0.62.1-beta.5+e90b627f",
29
+ "@deephaven/redux": "^0.62.1-beta.5+e90b627f",
30
+ "@deephaven/utils": "^0.62.1-beta.5+e90b627f",
31
31
  "deep-equal": "^2.0.5",
32
32
  "lodash.ismatch": "^4.1.1",
33
33
  "lodash.throttle": "^4.1.1",
@@ -41,7 +41,7 @@
41
41
  "react-redux": "^7.2.4"
42
42
  },
43
43
  "devDependencies": {
44
- "@deephaven/mocks": "^0.62.1-beta.1+e6955c1b",
44
+ "@deephaven/mocks": "^0.62.1-beta.5+e90b627f",
45
45
  "@types/lodash.ismatch": "^4.4.0"
46
46
  },
47
47
  "files": [
@@ -50,5 +50,5 @@
50
50
  "publishConfig": {
51
51
  "access": "public"
52
52
  },
53
- "gitHead": "e6955c1b330ae09d3bfbe3bbcb6d1bf303ea9b48"
53
+ "gitHead": "e90b627fed2c76b81ee96006abef14942388f3cc"
54
54
  }