@deephaven/components 0.58.0 → 0.58.1-alpha-theming.3

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.
Files changed (37) hide show
  1. package/css/BaseStyleSheet.css +1 -1
  2. package/css/BaseStyleSheet.css.map +1 -1
  3. package/dist/Button.d.ts +1 -1
  4. package/dist/Select.d.ts +1 -1
  5. package/dist/actions/ConfirmActionButton.d.ts +2 -1
  6. package/dist/actions/ConfirmActionButton.d.ts.map +1 -1
  7. package/dist/actions/ConfirmActionButton.js +2 -0
  8. package/dist/actions/ConfirmActionButton.js.map +1 -1
  9. package/dist/actions/IconActionButton.d.ts +2 -1
  10. package/dist/actions/IconActionButton.d.ts.map +1 -1
  11. package/dist/actions/IconActionButton.js +11 -5
  12. package/dist/actions/IconActionButton.js.map +1 -1
  13. package/dist/context-actions/ContextActions.d.ts +1 -1
  14. package/dist/context-actions/ContextActions.d.ts.map +1 -1
  15. package/dist/context-actions/ContextActions.js.map +1 -1
  16. package/dist/dialogs/ActionButtonDialogTrigger.d.ts +2 -1
  17. package/dist/dialogs/ActionButtonDialogTrigger.d.ts.map +1 -1
  18. package/dist/dialogs/ActionButtonDialogTrigger.js +8 -2
  19. package/dist/dialogs/ActionButtonDialogTrigger.js.map +1 -1
  20. package/dist/navigation/NavTab.d.ts +16 -0
  21. package/dist/navigation/NavTab.d.ts.map +1 -0
  22. package/dist/navigation/NavTab.js +78 -0
  23. package/dist/navigation/NavTab.js.map +1 -0
  24. package/dist/navigation/NavTabList.css +124 -0
  25. package/dist/navigation/NavTabList.css.map +1 -0
  26. package/dist/navigation/NavTabList.d.ts +64 -0
  27. package/dist/navigation/NavTabList.d.ts.map +1 -0
  28. package/dist/navigation/NavTabList.js +351 -0
  29. package/dist/navigation/NavTabList.js.map +1 -0
  30. package/dist/navigation/index.d.ts +2 -0
  31. package/dist/navigation/index.d.ts.map +1 -1
  32. package/dist/navigation/index.js +1 -0
  33. package/dist/navigation/index.js.map +1 -1
  34. package/dist/theme/theme-spectrum/theme-spectrum-overrides.css +1 -1
  35. package/dist/theme/theme-spectrum/theme-spectrum-overrides.css.map +1 -1
  36. package/package.json +7 -7
  37. package/scss/BaseStyleSheet.scss +1 -1
@@ -0,0 +1,124 @@
1
+ /* stylelint-disable scss/at-import-no-partial-leading-underscore */
2
+ .nav-container {
3
+ display: flex;
4
+ flex-shrink: 0;
5
+ }
6
+ .nav-container .nav-tabs {
7
+ border: none;
8
+ height: 32px;
9
+ font-size: 1rem;
10
+ flex-wrap: nowrap;
11
+ overflow-x: hidden;
12
+ position: relative;
13
+ }
14
+ .nav-container .nav-tabs.dragging {
15
+ background-image: linear-gradient(to right, var(--dh-color-bg) 50%, var(--dh-color-gray-700) 50%), linear-gradient(to right, var(--dh-color-bg) 50%, var(--dh-color-gray-700) 50%), linear-gradient(to bottom, var(--dh-color-bg) 50%, var(--dh-color-gray-700) 50%), linear-gradient(to bottom, var(--dh-color-bg) 50%, var(--dh-color-gray-700) 50%);
16
+ background-size: 8px 1px, 8px 1px, 1px 8px, 1px 8px;
17
+ background-position: 0 top, 0 bottom, left 0, right 0;
18
+ background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
19
+ animation: march 0.5s;
20
+ animation-timing-function: linear;
21
+ animation-iteration-count: infinite;
22
+ }
23
+ .nav-container .nav-tabs .btn-nav-tab {
24
+ line-height: 30px;
25
+ width: auto;
26
+ max-width: 200px;
27
+ overflow: hidden;
28
+ padding: 0 24px;
29
+ position: relative;
30
+ text-overflow: ellipsis;
31
+ user-select: none;
32
+ white-space: nowrap;
33
+ flex-shrink: 0;
34
+ background: none;
35
+ background-clip: padding-box;
36
+ }
37
+ .nav-container .nav-tabs .btn-nav-tab .btn-nav-tab-close {
38
+ position: absolute;
39
+ height: 20px;
40
+ line-height: 1rem;
41
+ right: 0.25rem;
42
+ bottom: 6px;
43
+ padding: 2px 1px;
44
+ opacity: 0;
45
+ transition: opacity 0.15s ease-out;
46
+ }
47
+ .nav-container .nav-tabs .btn-nav-tab .btn-nav-tab-close:hover {
48
+ color: var(--dh-color-gray-800);
49
+ }
50
+ .nav-container .nav-tabs .btn-nav-tab .btn-nav-tab-close:focus {
51
+ opacity: 1;
52
+ color: var(--dh-color-gray-800);
53
+ }
54
+ .nav-container .nav-tabs .btn-nav-tab::before, .nav-container .nav-tabs .btn-nav-tab::after {
55
+ content: "";
56
+ position: absolute;
57
+ height: 1px;
58
+ left: 24px;
59
+ right: 24px;
60
+ bottom: 6px;
61
+ transition: all 0.2s ease-out;
62
+ }
63
+ .nav-container .nav-tabs .btn-nav-tab::before {
64
+ background: transparent;
65
+ transform: translateY(6px);
66
+ }
67
+ .nav-container .nav-tabs .btn-nav-tab::after {
68
+ background: var(--dh-color-accent-bg);
69
+ transform: scaleX(0);
70
+ }
71
+ .nav-container .nav-tabs .btn-nav-tab:focus {
72
+ box-shadow: none;
73
+ border-color: transparent;
74
+ }
75
+ .nav-container .nav-tabs .btn-nav-tab:focus::before {
76
+ box-shadow: 0 1px 0 1px hsla(var(--dh-color-accent-hsl), 0.35);
77
+ }
78
+ .nav-container .nav-tabs .btn-nav-tab:hover, .nav-container .nav-tabs .btn-nav-tab:focus {
79
+ text-decoration: none;
80
+ }
81
+ .nav-container .nav-tabs .btn-nav-tab:hover .btn-nav-tab-close, .nav-container .nav-tabs .btn-nav-tab:focus .btn-nav-tab-close {
82
+ opacity: 1;
83
+ }
84
+ .nav-container .nav-tabs .btn-nav-tab:hover::before, .nav-container .nav-tabs .btn-nav-tab:focus::before {
85
+ background: var(--dh-color-gray-600);
86
+ transform: translateY(0);
87
+ }
88
+ .nav-container .nav-tabs .btn-nav-tab.active {
89
+ color: var(--dh-color-gray-800);
90
+ }
91
+ .nav-container .nav-tabs .btn-nav-tab.active .btn-nav-tab-close {
92
+ opacity: 1;
93
+ }
94
+ .nav-container .nav-tabs .btn-nav-tab.active::after {
95
+ transform: scaleX(1);
96
+ }
97
+ .nav-container .nav-tabs .btn-nav-tab.active::before {
98
+ transform: translateY(0);
99
+ }
100
+ .nav-container .nav-tabs .btn-nav-tab.dragging {
101
+ color: var(--dh-color-gray-800);
102
+ background-color: var(--dh-color-accent-down-bg);
103
+ }
104
+ .nav-container .nav-tabs .btn-nav-tab.dragging .btn-nav-tab-close {
105
+ opacity: 0;
106
+ }
107
+ .nav-container .nav-tabs .btn-nav-tab.dragging::before, .nav-container .nav-tabs .btn-nav-tab.dragging::after {
108
+ display: none;
109
+ }
110
+ .nav-container .tab-controls-btn {
111
+ border-radius: 4px;
112
+ width: 25px;
113
+ padding: 0;
114
+ flex-shrink: 0;
115
+ z-index: 2;
116
+ }
117
+ .nav-container .tab-controls-btn-left {
118
+ margin-right: -8px;
119
+ }
120
+ .nav-container .tab-controls-btn-right {
121
+ margin-left: -8px;
122
+ }
123
+
124
+ /*# sourceMappingURL=NavTabList.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["../../scss/custom.scss","../../src/navigation/NavTabList.scss","../../scss/new_variables.scss","../../scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACqBA;EACE;EACA;;AAEA;EACE;EACA,QAzBS;EA0BT,WAxBY;EAyBZ;EACA;EACA;;AAEA;ECbF;EAIA,iBACE;EAIF,qBACE;EAIF;EACA;EACA;EACA;;ADAE;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA,aAlDQ;EAmDR;EACA;EACA;EACA;EACA;;AAEA;EACE,OEjDC;;AFoDH;EACE;EACA,OEtDC;;AF0DL;EAEE;EACA;EACA;EACA,MAtEgB;EAuEhB,OAvEgB;EAwEhB,QAvEqB;EAwErB;;AAIF;EACE;EACA;;AAIF;EACE,YA9E0B;EA+E1B;;AAGF;EAEE;EACA;;AACA;EACE;;AAIJ;EAEE;;AAEA;EACE;;AAGF;EACE,YEjGC;EFkGD;;AAIJ;EACE,OEzGG;;AF2GH;EACE;;AAGF;EACE;;AAEF;EACE;;AAIJ;EACE,OExHG;EFyHH;;AAEA;EACE;;AAGF;EAEE;;AAMR;EACE,eEKY;EFJZ;EACA;EACA;EACA;;AAGF;EACE,cA1IqB;;AA6IvB;EACE,aA9IqB","file":"NavTabList.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 '../../scss/custom.scss';\n\n$tab-height: 32px;\n$tab-drag-border-width: 1px;\n$tab-font-size: 1rem;\n\n$tab-link-side-padding: 24px;\n$tab-link-underline-spacing: 6px;\n\n$tab-link-hover-underline-color: $gray-400;\n\n$tab-link-active-color: $gray-200;\n$tab-link-active-underline-color: var(--dh-color-accent-bg);\n\n$tab-link-active-hover-underline-color: var(--dh-color-accent-bg);\n\n$tab-button-hover-color: $gray-200;\n$tab-button-separator-color: $gray-600;\n\n$tab-control-btn-offset: -8px;\n\n.nav-container {\n display: flex;\n flex-shrink: 0;\n\n .nav-tabs {\n border: none;\n height: $tab-height;\n font-size: $tab-font-size;\n flex-wrap: nowrap;\n overflow-x: hidden;\n position: relative;\n\n &.dragging {\n @include ants-base($gray-300, $background);\n }\n\n .btn-nav-tab {\n line-height: $tab-height - $tab-drag-border-width * 2; // subtract top and bottom borders, and focus border\n width: auto;\n max-width: 200px;\n overflow: hidden;\n padding: 0 $tab-link-side-padding;\n position: relative;\n text-overflow: ellipsis;\n user-select: none;\n white-space: nowrap;\n flex-shrink: 0;\n background: none;\n background-clip: padding-box;\n\n .btn-nav-tab-close {\n position: absolute;\n height: 20px;\n line-height: $tab-font-size;\n right: 0.25rem;\n bottom: 6px;\n padding: 2px 1px;\n opacity: 0;\n transition: opacity $transition ease-out;\n\n &:hover {\n color: $tab-button-hover-color;\n }\n\n &:focus {\n opacity: 1;\n color: $tab-button-hover-color;\n }\n }\n\n &::before,\n &::after {\n content: '';\n position: absolute;\n height: 1px;\n left: $tab-link-side-padding;\n right: $tab-link-side-padding;\n bottom: $tab-link-underline-spacing;\n transition: all $transition-mid ease-out;\n }\n\n //hover line is drawn as a before element\n &::before {\n background: transparent;\n transform: translateY($tab-link-underline-spacing);\n }\n\n //active is drawn animated overtop as after element\n &::after {\n background: $tab-link-active-underline-color;\n transform: scaleX(0);\n }\n\n &:focus {\n // these seem like something that shouldn't have a regular focus state\n box-shadow: none;\n border-color: transparent;\n &::before {\n box-shadow: 0 1px 0 1px $input-btn-focus-color;\n }\n }\n\n &:hover,\n &:focus {\n text-decoration: none;\n\n .btn-nav-tab-close {\n opacity: 1;\n }\n\n &::before {\n background: $tab-link-hover-underline-color;\n transform: translateY(0);\n }\n }\n\n &.active {\n color: $tab-link-active-color;\n\n .btn-nav-tab-close {\n opacity: 1;\n }\n\n &::after {\n transform: scaleX(1);\n }\n &::before {\n transform: translateY(0);\n }\n }\n\n &.dragging {\n color: $tab-link-active-color;\n background-color: var(--dh-color-accent-down-bg);\n\n .btn-nav-tab-close {\n opacity: 0;\n }\n\n &::before,\n &::after {\n display: none;\n }\n }\n }\n }\n\n .tab-controls-btn {\n border-radius: $border-radius;\n width: 25px;\n padding: 0;\n flex-shrink: 0;\n z-index: 2;\n }\n\n .tab-controls-btn-left {\n margin-right: $tab-control-btn-offset;\n }\n\n .tab-controls-btn-right {\n margin-left: $tab-control-btn-offset;\n }\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@function hsla-opacity($semantic-name, $i: 100) {\n @return hsla(var(--dh-color-#{$semantic-name}-hsl), math.div($i, 100));\n}\n\n@function accent-opacity($i: 100) {\n @return hsla-opacity('accent', $i);\n}\n\n@function background-opacity($i: 100) {\n @return hsla-opacity('bg', $i);\n}\n\n@function foreground-opacity($i: 100) {\n @return hsla-opacity('fg', $i);\n}\n\n$focus-bg-transparency: 0.12;\n$hover-bg-transparency: 0.14;\n$active-bg-transparency: 0.28;\n$exception-transparency: 0.13;\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//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);\n$foreground: var(--dh-color-fg);\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$primary-light: var(--dh-color-accent-1100);\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-light': $primary-light,\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: hsla(var(--dh-color-accent-hsl), 0.35);\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. Using 0.4214rem with 1.3\n// line height gets us to 31.99px vs Spectrum's 32px.\n$input-btn-padding-y: 0.4214rem;\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: $primary;\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"]}
@@ -0,0 +1,64 @@
1
+ import React from 'react';
2
+ import './NavTabList.scss';
3
+ import { ContextAction } from '../context-actions';
4
+ export interface NavTabItem {
5
+ /**
6
+ * Unique key for the tab.
7
+ */
8
+ key: string;
9
+ /**
10
+ * Title to display on the tab.
11
+ */
12
+ title: string;
13
+ /**
14
+ * Whether the tab is closable.
15
+ * If omitted, the tab will be closeable if onClose exists.
16
+ */
17
+ isClosable?: boolean;
18
+ }
19
+ type NavTabListProps<T extends NavTabItem = NavTabItem> = {
20
+ /**
21
+ * The key of the active tab.
22
+ * If this does not match a tab key, no tab will be active.
23
+ */
24
+ activeKey: string;
25
+ /**
26
+ * Array of tabs to display.
27
+ * @see {@link NavTabItem} for the minimum required properties.
28
+ */
29
+ tabs: T[];
30
+ /**
31
+ * Function called when a tab is selected.
32
+ *
33
+ * @param key The key of the tab to select
34
+ */
35
+ onSelect: (key: string) => void;
36
+ /**
37
+ * Function called when a tab is closed.
38
+ * If the function is provided, all tabs will be closeable by default.
39
+ * Tabs may set their own closeable property to override this behavior.
40
+ *
41
+ * @param key The key of the tab to close
42
+ */
43
+ onClose?: (key: string) => void;
44
+ /**
45
+ * Function called when a tab is reordered.
46
+ * If the function is omitted, the tab list will not be reorderable.
47
+ *
48
+ * @param sourceIndex Index in the tab list the drag started from
49
+ * @param destinationIndex Index in the tab list the drag ended at
50
+ */
51
+ onReorder?: (sourceIndex: number, destinationIndex: number) => void;
52
+ /**
53
+ * Context actions to add to the tab in addition to the default actions.
54
+ * The default actions are Close, Close to the Right, and Close All.
55
+ * The default actions have a group value of 20.
56
+ *
57
+ * @param tab The tab to make context items for
58
+ * @returns Additional context items for the tab
59
+ */
60
+ makeContextActions?: (tab: T) => ContextAction | ContextAction[];
61
+ };
62
+ declare function NavTabList({ activeKey, tabs, onSelect, onReorder, onClose, makeContextActions, }: NavTabListProps): React.ReactElement;
63
+ export default NavTabList;
64
+ //# sourceMappingURL=NavTabList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavTabList.d.ts","sourceRoot":"","sources":["../../src/navigation/NavTabList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAcf,OAAO,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC;AAS5E,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,KAAK,eAAe,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU,IAAI;IACxD;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,IAAI,EAAE,CAAC,EAAE,CAAC;IAEV;;;;OAIG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAEhC;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAEhC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpE;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,aAAa,GAAG,aAAa,EAAE,CAAC;CAClE,CAAC;AAmEF,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,OAAO,EACP,kBAAkB,GACnB,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAkUtC;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,351 @@
1
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
3
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
5
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
6
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
7
+ import classNames from 'classnames';
8
+ import clamp from 'lodash.clamp';
9
+ import { DragDropContext, Droppable } from 'react-beautiful-dnd';
10
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
11
+ import { vsChevronRight, vsChevronLeft } from '@deephaven/icons';
12
+ import { useResizeObserver } from '@deephaven/react-hooks';
13
+ import DragUtils from "../DragUtils.js";
14
+ import Button from "../Button.js";
15
+ import NavTab from "./NavTab.js";
16
+ import "./NavTabList.css";
17
+ import { jsx as _jsx } from "react/jsx-runtime";
18
+ import { jsxs as _jsxs } from "react/jsx-runtime";
19
+ // mouse hold timeout to act as hold instead of click
20
+ var CLICK_TIMEOUT = 500;
21
+
22
+ // mouse hold acceleration
23
+ var START_SPEED = 0.01;
24
+ var ACCELERATION = 0.0005;
25
+ function isScrolledLeft(element) {
26
+ return element.scrollLeft === 0;
27
+ }
28
+ function isScrolledRight(element) {
29
+ return element.scrollLeft + element.clientWidth === element.scrollWidth || element.scrollWidth === 0;
30
+ }
31
+ function makeBaseContextActions(tab, tabs, onClose) {
32
+ var {
33
+ isClosable = false,
34
+ key
35
+ } = tab;
36
+ var contextActions = [];
37
+ if (isClosable && onClose != null) {
38
+ contextActions.push({
39
+ title: 'Close',
40
+ order: 10,
41
+ group: 20,
42
+ action: () => {
43
+ onClose(key);
44
+ }
45
+ });
46
+ var disabled = true;
47
+ for (var i = tabs.length - 1; i > 0; i -= 1) {
48
+ if (tabs[i].key === tab.key) break;
49
+ if (tabs[i].isClosable === true) {
50
+ disabled = false;
51
+ break;
52
+ }
53
+ }
54
+ contextActions.push({
55
+ title: 'Close to the Right',
56
+ order: 20,
57
+ group: 20,
58
+ action: () => {
59
+ for (var _i = tabs.length - 1; _i > 0; _i -= 1) {
60
+ if (tabs[_i].key === key) break;
61
+ if (tabs[_i].isClosable === true) onClose(tabs[_i].key);
62
+ }
63
+ },
64
+ disabled
65
+ });
66
+ contextActions.push({
67
+ title: 'Close All',
68
+ order: 30,
69
+ group: 20,
70
+ action: () => {
71
+ tabs.forEach(t => {
72
+ if (t.isClosable === true) onClose(t.key);
73
+ });
74
+ }
75
+ });
76
+ }
77
+ return contextActions;
78
+ }
79
+ function NavTabList(_ref) {
80
+ var {
81
+ activeKey,
82
+ tabs,
83
+ onSelect,
84
+ onReorder,
85
+ onClose,
86
+ makeContextActions
87
+ } = _ref;
88
+ var containerRef = useRef();
89
+ var [isOverflowing, setIsOverflowing] = useState(true);
90
+ var [disableScrollLeft, setDisableScrollLeft] = useState(true);
91
+ var [disableScrollRight, setDisableScrollRight] = useState(true);
92
+ var handleResize = useCallback(() => {
93
+ if (containerRef.current == null) {
94
+ return;
95
+ }
96
+ if (containerRef.current.clientWidth < containerRef.current.scrollWidth && tabs.length > 0) {
97
+ setIsOverflowing(true);
98
+ } else {
99
+ setIsOverflowing(false);
100
+ }
101
+ setDisableScrollLeft(isScrolledLeft(containerRef.current));
102
+ setDisableScrollRight(isScrolledRight(containerRef.current));
103
+ }, [tabs]);
104
+ useResizeObserver(containerRef.current, handleResize);
105
+ var onDragEnd = useCallback(result => {
106
+ DragUtils.stopDragging();
107
+
108
+ // dropped outside the list
109
+ if (!result.destination) {
110
+ return;
111
+ }
112
+ onReorder === null || onReorder === void 0 ? void 0 : onReorder(result.source.index, result.destination.index);
113
+ }, [onReorder]);
114
+ var handleScroll = useCallback(() => {
115
+ if (containerRef.current == null) {
116
+ return;
117
+ }
118
+ var shouldDisableScrollLeft = isScrolledLeft(containerRef.current);
119
+ if (shouldDisableScrollLeft !== disableScrollLeft) {
120
+ setDisableScrollLeft(shouldDisableScrollLeft);
121
+ }
122
+ var shouldDisableScrollRight = isScrolledRight(containerRef.current);
123
+ if (shouldDisableScrollRight !== disableScrollRight) {
124
+ setDisableScrollRight(shouldDisableScrollRight);
125
+ }
126
+ }, [disableScrollLeft, disableScrollRight]);
127
+ var continuousScrollRef = useRef({
128
+ cancelClick: false
129
+ });
130
+ var handleLeftClick = useCallback(() => {
131
+ if (containerRef.current == null || continuousScrollRef.current.cancelClick) {
132
+ return;
133
+ }
134
+ var {
135
+ children
136
+ } = containerRef.current;
137
+ for (var i = children.length - 1; i >= 0; i -= 1) {
138
+ var child = children[i];
139
+ // Subtract 5px from left edge to account for rounding of offset values
140
+ if (child.offsetLeft < containerRef.current.scrollLeft - 5) {
141
+ child.scrollIntoView({
142
+ behavior: 'smooth',
143
+ block: 'nearest',
144
+ inline: 'start'
145
+ });
146
+ return;
147
+ }
148
+ }
149
+ }, []);
150
+ var handleRightClick = useCallback(() => {
151
+ if (containerRef.current == null || continuousScrollRef.current.cancelClick) {
152
+ return;
153
+ }
154
+ var {
155
+ children
156
+ } = containerRef.current;
157
+ for (var i = 0; i < children.length; i += 1) {
158
+ var child = children[i];
159
+ // Add 5px to right edge to account for rounding of offset values
160
+ if (child.offsetLeft + 5 > containerRef.current.scrollLeft + containerRef.current.offsetWidth) {
161
+ child.scrollIntoView({
162
+ behavior: 'smooth',
163
+ block: 'nearest',
164
+ inline: 'end'
165
+ });
166
+ return;
167
+ }
168
+ }
169
+ }, []);
170
+
171
+ /**
172
+ * Recurively called after initial timeout on mousedown. Continuously scroll with acceleration.
173
+ * Cancelled by mouseup handler cancelling the animationFrame.
174
+ * @param direction of scroll, left or right
175
+ * @param startX starting position of scroll
176
+ * @param deltaX delta from intial startX calculated recursively
177
+ * @param prevTimestamp called on subsequent delta frames
178
+ */
179
+ var handleMouseRepeat = useCallback(function (direction, startX) {
180
+ var deltaX = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
181
+ var prevTimestamp = arguments.length > 3 ? arguments[3] : undefined;
182
+ var container = containerRef.current;
183
+ if (container == null) {
184
+ return;
185
+ }
186
+ continuousScrollRef.current.cancelClick = true;
187
+ if (direction === 'left') {
188
+ // eslint-disable-next-line no-param-reassign
189
+ container.scrollLeft = startX - deltaX;
190
+ } else if (direction === 'right') {
191
+ // eslint-disable-next-line no-param-reassign
192
+ container.scrollLeft = startX + deltaX;
193
+ }
194
+
195
+ // eslint-disable-next-line no-param-reassign
196
+ continuousScrollRef.current.rAF = requestAnimationFrame(timestamp => {
197
+ var startTime = prevTimestamp !== null && prevTimestamp !== void 0 ? prevTimestamp : timestamp;
198
+ var deltaTime = timestamp - startTime;
199
+ var newDeltaX = START_SPEED * deltaTime + 0.5 * ACCELERATION * deltaTime ** 2;
200
+ newDeltaX = Math.min(newDeltaX, container.scrollWidth);
201
+ // scrollLeft enforces a limit but no point letting delta increment beyond scrollWidth
202
+
203
+ handleMouseRepeat(direction, startX, newDeltaX, startTime);
204
+ });
205
+ }, []);
206
+ var endContinuousScroll = useCallback(() => {
207
+ var {
208
+ holdTimer,
209
+ rAF
210
+ } = continuousScrollRef.current;
211
+ if (holdTimer != null) {
212
+ clearTimeout(holdTimer);
213
+ continuousScrollRef.current.holdTimer = undefined;
214
+ }
215
+ if (rAF != null) {
216
+ cancelAnimationFrame(rAF);
217
+ continuousScrollRef.current.rAF = undefined;
218
+ }
219
+ window.removeEventListener('mouseup', endContinuousScroll);
220
+ }, []);
221
+ useEffect(() => () => window.removeEventListener('mouseup', endContinuousScroll), [endContinuousScroll]);
222
+ var handleMouseDown = useCallback(direction => {
223
+ if (containerRef.current != null) {
224
+ continuousScrollRef.current.holdTimer = window.setTimeout(handleMouseRepeat, CLICK_TIMEOUT, direction, containerRef.current.scrollLeft);
225
+ }
226
+ continuousScrollRef.current.cancelClick = false;
227
+ window.addEventListener('mouseup', endContinuousScroll);
228
+ }, [endContinuousScroll, handleMouseRepeat]);
229
+ var handleMouseDownLeft = useCallback(() => {
230
+ handleMouseDown('left');
231
+ }, [handleMouseDown]);
232
+ var handleMouseDownRight = useCallback(() => {
233
+ handleMouseDown('right');
234
+ }, [handleMouseDown]);
235
+
236
+ // React binds to the root as a passive listener for wheel
237
+ // This prevents the wheel event from being canceled
238
+ // Bypass React's event system so we can prevent the default behavior
239
+ // https://github.com/facebook/react/issues/14856
240
+ useEffect(function handleWheel() {
241
+ var _containerRef$current;
242
+ var onWheel = e => {
243
+ e.stopPropagation();
244
+ e.preventDefault();
245
+ var nav = e.currentTarget;
246
+ var delta = Math.abs(e.deltaY) > Math.abs(e.deltaX) ? e.deltaY : e.deltaX;
247
+
248
+ // Scrolling jumps too far sometimes, so clamp to get a smoother scroll
249
+ nav.scrollLeft += clamp(delta, -30, 30);
250
+ };
251
+ (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.addEventListener('wheel', onWheel);
252
+ return () => {
253
+ var _containerRef$current2;
254
+ (_containerRef$current2 = containerRef.current) === null || _containerRef$current2 === void 0 ? void 0 : _containerRef$current2.removeEventListener('wheel', onWheel);
255
+ };
256
+ }, []);
257
+ var tabContextActionMap = useMemo(() => {
258
+ var tabContextActions = new Map();
259
+ tabs.forEach(tab => {
260
+ var {
261
+ key
262
+ } = tab;
263
+ var contextActions = [() => makeBaseContextActions(tab, tabs, onClose), () => {
264
+ var _makeContextActions;
265
+ return (_makeContextActions = makeContextActions === null || makeContextActions === void 0 ? void 0 : makeContextActions(tab)) !== null && _makeContextActions !== void 0 ? _makeContextActions : [];
266
+ }];
267
+ tabContextActions.set(key, contextActions);
268
+ });
269
+ return tabContextActions;
270
+ }, [makeContextActions, tabs, onClose]);
271
+ var activeTabRef = useRef(null);
272
+ var activeTab = tabs.find(tab => tab.key === activeKey);
273
+ var navTabs = tabs.map((tab, index) => {
274
+ var {
275
+ key
276
+ } = tab;
277
+ var isActive = tab === activeTab;
278
+ return /*#__PURE__*/_jsx(NavTab, {
279
+ tab: tab,
280
+ index: index,
281
+ isActive: isActive,
282
+ activeRef: activeTabRef,
283
+ onSelect: onSelect,
284
+ onClose: onClose,
285
+ isDraggable: onReorder != null,
286
+ contextActions: tabContextActionMap.get(key)
287
+ }, key);
288
+ });
289
+ useEffect(
290
+ // Needs to be in a useEffect so the ref is updated
291
+ function scrollActiveTabIntoView() {
292
+ if (activeTabRef.current != null) {
293
+ activeTabRef.current.scrollIntoView({
294
+ block: 'nearest',
295
+ inline: 'nearest'
296
+ });
297
+ }
298
+ }, [activeKey]);
299
+ return /*#__PURE__*/_jsxs("nav", {
300
+ className: "nav-container",
301
+ children: [isOverflowing && /*#__PURE__*/_jsx(Button, {
302
+ kind: "ghost",
303
+ icon: /*#__PURE__*/_jsx(FontAwesomeIcon, {
304
+ icon: vsChevronLeft,
305
+ transform: "grow-4"
306
+ }),
307
+ className: "tab-controls-btn tab-controls-btn-left",
308
+ tooltip: "Scroll left",
309
+ onClick: handleLeftClick,
310
+ onMouseDown: handleMouseDownLeft,
311
+ disabled: disableScrollLeft
312
+ }), /*#__PURE__*/_jsx(DragDropContext, {
313
+ onDragStart: DragUtils.startDragging,
314
+ onDragEnd: onDragEnd,
315
+ children: /*#__PURE__*/_jsx(Droppable, {
316
+ droppableId: "droppable-tab-navigation",
317
+ direction: "horizontal",
318
+ children: (provided, snapshot) => /*#__PURE__*/_jsxs("div", _objectSpread(_objectSpread({
319
+ ref: r => {
320
+ if (r == null) {
321
+ return;
322
+ }
323
+ containerRef.current = r;
324
+ provided.innerRef(r);
325
+ }
326
+ // eslint-disable-next-line react/jsx-props-no-spreading
327
+ }, provided.droppableProps), {}, {
328
+ className: classNames('nav nav-tabs', {
329
+ dragging: snapshot.draggingFromThisWith
330
+ }),
331
+ role: "tablist",
332
+ onScroll: handleScroll,
333
+ children: [navTabs, provided.placeholder]
334
+ }))
335
+ })
336
+ }), isOverflowing && /*#__PURE__*/_jsx(Button, {
337
+ kind: "ghost",
338
+ icon: /*#__PURE__*/_jsx(FontAwesomeIcon, {
339
+ icon: vsChevronRight,
340
+ transform: "grow-4"
341
+ }),
342
+ className: "tab-controls-btn tab-controls-btn-right",
343
+ tooltip: "Scroll right",
344
+ onClick: handleRightClick,
345
+ onMouseDown: handleMouseDownRight,
346
+ disabled: disableScrollRight
347
+ })]
348
+ });
349
+ }
350
+ export default NavTabList;
351
+ //# sourceMappingURL=NavTabList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavTabList.js","names":["React","useCallback","useEffect","useMemo","useRef","useState","classNames","clamp","DragDropContext","Droppable","FontAwesomeIcon","vsChevronRight","vsChevronLeft","useResizeObserver","DragUtils","Button","NavTab","jsx","_jsx","jsxs","_jsxs","CLICK_TIMEOUT","START_SPEED","ACCELERATION","isScrolledLeft","element","scrollLeft","isScrolledRight","clientWidth","scrollWidth","makeBaseContextActions","tab","tabs","onClose","isClosable","key","contextActions","push","title","order","group","action","disabled","i","length","forEach","t","NavTabList","_ref","activeKey","onSelect","onReorder","makeContextActions","containerRef","isOverflowing","setIsOverflowing","disableScrollLeft","setDisableScrollLeft","disableScrollRight","setDisableScrollRight","handleResize","current","onDragEnd","result","stopDragging","destination","source","index","handleScroll","shouldDisableScrollLeft","shouldDisableScrollRight","continuousScrollRef","cancelClick","handleLeftClick","children","child","offsetLeft","scrollIntoView","behavior","block","inline","handleRightClick","offsetWidth","handleMouseRepeat","direction","startX","deltaX","arguments","undefined","prevTimestamp","container","rAF","requestAnimationFrame","timestamp","startTime","deltaTime","newDeltaX","Math","min","endContinuousScroll","holdTimer","clearTimeout","cancelAnimationFrame","window","removeEventListener","handleMouseDown","setTimeout","addEventListener","handleMouseDownLeft","handleMouseDownRight","handleWheel","_containerRef$current","onWheel","e","stopPropagation","preventDefault","nav","currentTarget","delta","abs","deltaY","_containerRef$current2","tabContextActionMap","tabContextActions","Map","_makeContextActions","set","activeTabRef","activeTab","find","navTabs","map","isActive","activeRef","isDraggable","get","scrollActiveTabIntoView","className","kind","icon","transform","tooltip","onClick","onMouseDown","onDragStart","startDragging","droppableId","provided","snapshot","_objectSpread","ref","r","innerRef","droppableProps","dragging","draggingFromThisWith","role","onScroll","placeholder"],"sources":["../../src/navigation/NavTabList.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport clamp from 'lodash.clamp';\nimport {\n DragDropContext,\n Droppable,\n OnDragEndResponder,\n} from 'react-beautiful-dnd';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsChevronRight, vsChevronLeft } from '@deephaven/icons';\nimport { useResizeObserver } from '@deephaven/react-hooks';\nimport DragUtils from '../DragUtils';\nimport Button from '../Button';\nimport NavTab from './NavTab';\nimport './NavTabList.scss';\nimport { ContextAction, ResolvableContextAction } from '../context-actions';\n\n// mouse hold timeout to act as hold instead of click\nconst CLICK_TIMEOUT = 500;\n\n// mouse hold acceleration\nconst START_SPEED = 0.01;\nconst ACCELERATION = 0.0005;\n\nexport interface NavTabItem {\n /**\n * Unique key for the tab.\n */\n key: string;\n\n /**\n * Title to display on the tab.\n */\n title: string;\n\n /**\n * Whether the tab is closable.\n * If omitted, the tab will be closeable if onClose exists.\n */\n isClosable?: boolean;\n}\n\ntype NavTabListProps<T extends NavTabItem = NavTabItem> = {\n /**\n * The key of the active tab.\n * If this does not match a tab key, no tab will be active.\n */\n activeKey: string;\n\n /**\n * Array of tabs to display.\n * @see {@link NavTabItem} for the minimum required properties.\n */\n tabs: T[];\n\n /**\n * Function called when a tab is selected.\n *\n * @param key The key of the tab to select\n */\n onSelect: (key: string) => void;\n\n /**\n * Function called when a tab is closed.\n * If the function is provided, all tabs will be closeable by default.\n * Tabs may set their own closeable property to override this behavior.\n *\n * @param key The key of the tab to close\n */\n onClose?: (key: string) => void;\n\n /**\n * Function called when a tab is reordered.\n * If the function is omitted, the tab list will not be reorderable.\n *\n * @param sourceIndex Index in the tab list the drag started from\n * @param destinationIndex Index in the tab list the drag ended at\n */\n onReorder?: (sourceIndex: number, destinationIndex: number) => void;\n\n /**\n * Context actions to add to the tab in addition to the default actions.\n * The default actions are Close, Close to the Right, and Close All.\n * The default actions have a group value of 20.\n *\n * @param tab The tab to make context items for\n * @returns Additional context items for the tab\n */\n makeContextActions?: (tab: T) => ContextAction | ContextAction[];\n};\n\nfunction isScrolledLeft(element: HTMLElement): boolean {\n return element.scrollLeft === 0;\n}\n\nfunction isScrolledRight(element: HTMLElement): boolean {\n return (\n element.scrollLeft + element.clientWidth === element.scrollWidth ||\n element.scrollWidth === 0\n );\n}\n\nfunction makeBaseContextActions(\n tab: NavTabItem,\n tabs: NavTabItem[],\n onClose: ((key: string) => void) | undefined\n): ContextAction[] {\n const { isClosable = false, key } = tab;\n const contextActions: ContextAction[] = [];\n if (isClosable && onClose != null) {\n contextActions.push({\n title: 'Close',\n order: 10,\n group: 20,\n action: () => {\n onClose(key);\n },\n });\n\n let disabled = true;\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n if (tabs[i].key === tab.key) break;\n if (tabs[i].isClosable === true) {\n disabled = false;\n break;\n }\n }\n\n contextActions.push({\n title: 'Close to the Right',\n order: 20,\n group: 20,\n action: () => {\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n if (tabs[i].key === key) break;\n if (tabs[i].isClosable === true) onClose(tabs[i].key);\n }\n },\n disabled,\n });\n\n contextActions.push({\n title: 'Close All',\n order: 30,\n group: 20,\n action: () => {\n tabs.forEach(t => {\n if (t.isClosable === true) onClose(t.key);\n });\n },\n });\n }\n\n return contextActions;\n}\n\nfunction NavTabList({\n activeKey,\n tabs,\n onSelect,\n onReorder,\n onClose,\n makeContextActions,\n}: NavTabListProps): React.ReactElement {\n const containerRef = useRef<HTMLDivElement>();\n const [isOverflowing, setIsOverflowing] = useState(true);\n const [disableScrollLeft, setDisableScrollLeft] = useState(true);\n const [disableScrollRight, setDisableScrollRight] = useState(true);\n const handleResize = useCallback(() => {\n if (containerRef.current == null) {\n return;\n }\n\n if (\n containerRef.current.clientWidth < containerRef.current.scrollWidth &&\n tabs.length > 0\n ) {\n setIsOverflowing(true);\n } else {\n setIsOverflowing(false);\n }\n\n setDisableScrollLeft(isScrolledLeft(containerRef.current));\n setDisableScrollRight(isScrolledRight(containerRef.current));\n }, [tabs]);\n useResizeObserver(containerRef.current, handleResize);\n\n const onDragEnd: OnDragEndResponder = useCallback(\n result => {\n DragUtils.stopDragging();\n\n // dropped outside the list\n if (!result.destination) {\n return;\n }\n\n onReorder?.(result.source.index, result.destination.index);\n },\n [onReorder]\n );\n\n const handleScroll = useCallback(() => {\n if (containerRef.current == null) {\n return;\n }\n\n const shouldDisableScrollLeft = isScrolledLeft(containerRef.current);\n if (shouldDisableScrollLeft !== disableScrollLeft) {\n setDisableScrollLeft(shouldDisableScrollLeft);\n }\n\n const shouldDisableScrollRight = isScrolledRight(containerRef.current);\n if (shouldDisableScrollRight !== disableScrollRight) {\n setDisableScrollRight(shouldDisableScrollRight);\n }\n }, [disableScrollLeft, disableScrollRight]);\n\n const continuousScrollRef = useRef<{\n holdTimer?: number;\n rAF?: number;\n cancelClick: boolean;\n }>({ cancelClick: false });\n\n const handleLeftClick = useCallback(() => {\n if (\n containerRef.current == null ||\n continuousScrollRef.current.cancelClick\n ) {\n return;\n }\n\n const { children } = containerRef.current;\n for (let i = children.length - 1; i >= 0; i -= 1) {\n const child = children[i] as HTMLElement;\n // Subtract 5px from left edge to account for rounding of offset values\n if (child.offsetLeft < containerRef.current.scrollLeft - 5) {\n child.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'start',\n });\n return;\n }\n }\n }, []);\n\n const handleRightClick = useCallback(() => {\n if (\n containerRef.current == null ||\n continuousScrollRef.current.cancelClick\n ) {\n return;\n }\n\n const { children } = containerRef.current;\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i] as HTMLElement;\n // Add 5px to right edge to account for rounding of offset values\n if (\n child.offsetLeft + 5 >\n containerRef.current.scrollLeft + containerRef.current.offsetWidth\n ) {\n child.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'end',\n });\n return;\n }\n }\n }, []);\n\n /**\n * Recurively called after initial timeout on mousedown. Continuously scroll with acceleration.\n * Cancelled by mouseup handler cancelling the animationFrame.\n * @param direction of scroll, left or right\n * @param startX starting position of scroll\n * @param deltaX delta from intial startX calculated recursively\n * @param prevTimestamp called on subsequent delta frames\n */\n const handleMouseRepeat = useCallback(\n (\n direction: 'left' | 'right',\n startX: number,\n deltaX = 0,\n prevTimestamp?: number\n ) => {\n const container = containerRef.current;\n if (container == null) {\n return;\n }\n\n continuousScrollRef.current.cancelClick = true;\n\n if (direction === 'left') {\n // eslint-disable-next-line no-param-reassign\n container.scrollLeft = startX - deltaX;\n } else if (direction === 'right') {\n // eslint-disable-next-line no-param-reassign\n container.scrollLeft = startX + deltaX;\n }\n\n // eslint-disable-next-line no-param-reassign\n continuousScrollRef.current.rAF = requestAnimationFrame(timestamp => {\n const startTime = prevTimestamp ?? timestamp;\n const deltaTime = timestamp - startTime;\n let newDeltaX =\n START_SPEED * deltaTime + 0.5 * ACCELERATION * deltaTime ** 2;\n newDeltaX = Math.min(newDeltaX, container.scrollWidth);\n // scrollLeft enforces a limit but no point letting delta increment beyond scrollWidth\n\n handleMouseRepeat(direction, startX, newDeltaX, startTime);\n });\n },\n []\n );\n\n const endContinuousScroll = useCallback(() => {\n const { holdTimer, rAF } = continuousScrollRef.current;\n if (holdTimer != null) {\n clearTimeout(holdTimer);\n continuousScrollRef.current.holdTimer = undefined;\n }\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n continuousScrollRef.current.rAF = undefined;\n }\n window.removeEventListener('mouseup', endContinuousScroll);\n }, []);\n\n useEffect(\n () => () => window.removeEventListener('mouseup', endContinuousScroll),\n [endContinuousScroll]\n );\n\n const handleMouseDown = useCallback(\n (direction: 'left' | 'right') => {\n if (containerRef.current != null) {\n continuousScrollRef.current.holdTimer = window.setTimeout(\n handleMouseRepeat,\n CLICK_TIMEOUT,\n direction,\n containerRef.current.scrollLeft\n );\n }\n continuousScrollRef.current.cancelClick = false;\n window.addEventListener('mouseup', endContinuousScroll);\n },\n [endContinuousScroll, handleMouseRepeat]\n );\n\n const handleMouseDownLeft = useCallback(() => {\n handleMouseDown('left');\n }, [handleMouseDown]);\n\n const handleMouseDownRight = useCallback(() => {\n handleMouseDown('right');\n }, [handleMouseDown]);\n\n // React binds to the root as a passive listener for wheel\n // This prevents the wheel event from being canceled\n // Bypass React's event system so we can prevent the default behavior\n // https://github.com/facebook/react/issues/14856\n useEffect(function handleWheel() {\n const onWheel = (e: WheelEvent) => {\n e.stopPropagation();\n e.preventDefault();\n const nav = e.currentTarget as HTMLDivElement;\n const delta =\n Math.abs(e.deltaY) > Math.abs(e.deltaX) ? e.deltaY : e.deltaX;\n\n // Scrolling jumps too far sometimes, so clamp to get a smoother scroll\n nav.scrollLeft += clamp(delta, -30, 30);\n };\n\n containerRef.current?.addEventListener('wheel', onWheel);\n return () => {\n containerRef.current?.removeEventListener('wheel', onWheel);\n };\n }, []);\n\n const tabContextActionMap = useMemo(() => {\n const tabContextActions = new Map<string, ResolvableContextAction[]>();\n tabs.forEach(tab => {\n const { key } = tab;\n const contextActions = [\n () => makeBaseContextActions(tab, tabs, onClose),\n () => makeContextActions?.(tab) ?? [],\n ];\n tabContextActions.set(key, contextActions);\n });\n return tabContextActions;\n }, [makeContextActions, tabs, onClose]);\n\n const activeTabRef = useRef<HTMLDivElement>(null);\n const activeTab = tabs.find(tab => tab.key === activeKey);\n const navTabs = tabs.map((tab, index) => {\n const { key } = tab;\n const isActive = tab === activeTab;\n\n return (\n <NavTab\n tab={tab}\n key={key}\n index={index}\n isActive={isActive}\n activeRef={activeTabRef}\n onSelect={onSelect}\n onClose={onClose}\n isDraggable={onReorder != null}\n contextActions={tabContextActionMap.get(key)}\n />\n );\n });\n\n useEffect(\n // Needs to be in a useEffect so the ref is updated\n function scrollActiveTabIntoView() {\n if (activeTabRef.current != null) {\n activeTabRef.current.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n }\n },\n [activeKey]\n );\n\n return (\n <nav className=\"nav-container\">\n {isOverflowing && (\n <Button\n kind=\"ghost\"\n icon={<FontAwesomeIcon icon={vsChevronLeft} transform=\"grow-4\" />}\n className=\"tab-controls-btn tab-controls-btn-left\"\n tooltip=\"Scroll left\"\n onClick={handleLeftClick}\n onMouseDown={handleMouseDownLeft}\n disabled={disableScrollLeft}\n />\n )}\n <DragDropContext\n onDragStart={DragUtils.startDragging}\n onDragEnd={onDragEnd}\n >\n <Droppable\n droppableId=\"droppable-tab-navigation\"\n direction=\"horizontal\"\n >\n {(provided, snapshot) => (\n <div\n ref={r => {\n if (r == null) {\n return;\n }\n containerRef.current = r;\n provided.innerRef(r);\n }}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.droppableProps}\n className={classNames('nav nav-tabs', {\n dragging: snapshot.draggingFromThisWith,\n })}\n role=\"tablist\"\n onScroll={handleScroll}\n >\n {navTabs}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n {isOverflowing && (\n <Button\n kind=\"ghost\"\n icon={<FontAwesomeIcon icon={vsChevronRight} transform=\"grow-4\" />}\n className=\"tab-controls-btn tab-controls-btn-right\"\n tooltip=\"Scroll right\"\n onClick={handleRightClick}\n onMouseDown={handleMouseDownRight}\n disabled={disableScrollRight}\n />\n )}\n </nav>\n );\n}\n\nexport default NavTabList;\n"],"mappings":"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"}
@@ -2,6 +2,8 @@ export { default as Menu } from './Menu';
2
2
  export type { MenuProps } from './Menu';
3
3
  export { default as MenuItem } from './MenuItem';
4
4
  export type { SwitchMenuItemDef, MenuItemDef, MenuItemProps } from './MenuItem';
5
+ export { default as NavTabList } from './NavTabList';
6
+ export type { NavTabItem } from './NavTabList';
5
7
  export { default as Page } from './Page';
6
8
  export type { PageProps } from './Page';
7
9
  export { default as Stack } from './Stack';