@deephaven/components 1.2.1-plotly-rc.3 → 1.3.0
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.
- package/css/BaseStyleSheet.css.map +1 -1
- package/dist/AutoCompleteInput.css.map +1 -1
- package/dist/AutoCompleteInput.js.map +1 -1
- package/dist/AutoResizeTextarea.css.map +1 -1
- package/dist/AutoResizeTextarea.js.map +1 -1
- package/dist/BasicModal.js.map +1 -1
- package/dist/BulkActionBar.js.map +1 -1
- package/dist/Button.js.map +1 -1
- package/dist/CardFlip.css.map +1 -1
- package/dist/CardFlip.js.map +1 -1
- package/dist/Checkbox.js.map +1 -1
- package/dist/Collapse.js.map +1 -1
- package/dist/ComboBox.css.map +1 -1
- package/dist/ComponentUtils.js.map +1 -1
- package/dist/CopyButton.js.map +1 -1
- package/dist/CustomTimeSelect.css.map +1 -1
- package/dist/CustomTimeSelect.js.map +1 -1
- package/dist/DateInput.js.map +1 -1
- package/dist/DateInputUtils.js.map +1 -1
- package/dist/DateTimeInput.js.map +1 -1
- package/dist/DateTimeInputUtils.js.map +1 -1
- package/dist/DebouncedSearchInput.js.map +1 -1
- package/dist/DragUtils.js.map +1 -1
- package/dist/DraggableItemList.css.map +1 -1
- package/dist/DraggableItemList.js.map +1 -1
- package/dist/EditableItemList.js.map +1 -1
- package/dist/ErrorBoundary.js.map +1 -1
- package/dist/ErrorView.css.map +1 -1
- package/dist/ErrorView.js.map +1 -1
- package/dist/HierarchicalCheckboxMenu.css.map +1 -1
- package/dist/HierarchicalCheckboxMenu.js.map +1 -1
- package/dist/ItemList.css.map +1 -1
- package/dist/ItemList.js.map +1 -1
- package/dist/ItemListItem.css.map +1 -1
- package/dist/ItemListItem.js.map +1 -1
- package/dist/LoadingOverlay.css.map +1 -1
- package/dist/LoadingOverlay.js.map +1 -1
- package/dist/LoadingSpinner.js.map +1 -1
- package/dist/MaskedInput.css.map +1 -1
- package/dist/MaskedInput.js.map +1 -1
- package/dist/MaskedInputUtils.js.map +1 -1
- package/dist/Option.js.map +1 -1
- package/dist/RadioGroup.js.map +1 -1
- package/dist/RadioItem.js.map +1 -1
- package/dist/RandomAreaPlotAnimation.css.map +1 -1
- package/dist/RandomAreaPlotAnimation.js.map +1 -1
- package/dist/SearchInput.css.map +1 -1
- package/dist/SearchInput.js.map +1 -1
- package/dist/SearchableCombobox.js.map +1 -1
- package/dist/Select.js.map +1 -1
- package/dist/SelectValueList.css.map +1 -1
- package/dist/SelectValueList.js.map +1 -1
- package/dist/SocketedButton.css.map +1 -1
- package/dist/SocketedButton.js.map +1 -1
- package/dist/SplitButtonGroup.js.map +1 -1
- package/dist/TableViewEmptyState.js.map +1 -1
- package/dist/TextWithTooltip.js.map +1 -1
- package/dist/ThemeExport.js.map +1 -1
- package/dist/ThemeExport.module.css.map +1 -1
- package/dist/TimeInput.js.map +1 -1
- package/dist/TimeSlider.css.map +1 -1
- package/dist/TimeSlider.js.map +1 -1
- package/dist/TimeSlider.module.css.map +1 -1
- package/dist/ToastNotification.css.map +1 -1
- package/dist/ToastNotification.js.map +1 -1
- package/dist/UIConstants.js.map +1 -1
- package/dist/UISwitch.css.map +1 -1
- package/dist/UISwitch.js.map +1 -1
- package/dist/XComponent.js.map +1 -1
- package/dist/XComponentMap.js.map +1 -1
- package/dist/actions/ConfirmActionButton.js.map +1 -1
- package/dist/actions/IconActionButton.js.map +1 -1
- package/dist/actions/index.js.map +1 -1
- package/dist/context-actions/ContextActionUtils.js.map +1 -1
- package/dist/context-actions/ContextActions.css +2 -2
- package/dist/context-actions/ContextActions.css.map +1 -1
- package/dist/context-actions/ContextActions.js.map +1 -1
- package/dist/context-actions/ContextMenu.js.map +1 -1
- package/dist/context-actions/ContextMenuItem.js.map +1 -1
- package/dist/context-actions/ContextMenuRoot.js.map +1 -1
- package/dist/context-actions/GlobalContextAction.js.map +1 -1
- package/dist/context-actions/GlobalContextActions.js.map +1 -1
- package/dist/context-actions/index.js.map +1 -1
- package/dist/declaration.d.js.map +1 -1
- package/dist/dialogs/ActionButtonDialogTrigger.js.map +1 -1
- package/dist/dialogs/ConfirmationDialog.js.map +1 -1
- package/dist/dialogs/index.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/menu-actions/DropdownMenu.css.map +1 -1
- package/dist/menu-actions/DropdownMenu.js.map +1 -1
- package/dist/menu-actions/Menu.js.map +1 -1
- package/dist/menu-actions/index.js.map +1 -1
- package/dist/modal/DebouncedModal.js.map +1 -1
- package/dist/modal/InfoModal.css.map +1 -1
- package/dist/modal/InfoModal.js.map +1 -1
- package/dist/modal/Modal.js.map +1 -1
- package/dist/modal/ModalBody.js.map +1 -1
- package/dist/modal/ModalFooter.js.map +1 -1
- package/dist/modal/ModalHeader.js.map +1 -1
- package/dist/modal/index.js.map +1 -1
- package/dist/navigation/Menu.css.map +1 -1
- package/dist/navigation/Menu.js.map +1 -1
- package/dist/navigation/MenuItem.css.map +1 -1
- package/dist/navigation/MenuItem.js.map +1 -1
- package/dist/navigation/NavTab.js.map +1 -1
- package/dist/navigation/NavTabList.css.map +1 -1
- package/dist/navigation/NavTabList.js.map +1 -1
- package/dist/navigation/Page.css.map +1 -1
- package/dist/navigation/Page.js.map +1 -1
- package/dist/navigation/Stack.css.map +1 -1
- package/dist/navigation/Stack.js.map +1 -1
- package/dist/navigation/index.js.map +1 -1
- package/dist/popper/Popper.css.map +1 -1
- package/dist/popper/Popper.js.map +1 -1
- package/dist/popper/Tooltip.js.map +1 -1
- package/dist/popper/index.js.map +1 -1
- package/dist/shortcuts/GlobalShortcuts.js.map +1 -1
- package/dist/shortcuts/NavigationShortcuts.js.map +1 -1
- package/dist/shortcuts/Shortcut.js.map +1 -1
- package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
- package/dist/shortcuts/index.js.map +1 -1
- package/dist/spectrum/ActionGroup.js.map +1 -1
- package/dist/spectrum/ActionMenu.js.map +1 -1
- package/dist/spectrum/CheckboxGroup.js.map +1 -1
- package/dist/spectrum/Heading.js.map +1 -1
- package/dist/spectrum/ItemContent.js.map +1 -1
- package/dist/spectrum/ItemTooltip.js.map +1 -1
- package/dist/spectrum/ListActionGroup.js.map +1 -1
- package/dist/spectrum/ListActionMenu.js.map +1 -1
- package/dist/spectrum/TabPanels.js.map +1 -1
- package/dist/spectrum/Text.js.map +1 -1
- package/dist/spectrum/View.js.map +1 -1
- package/dist/spectrum/buttons.js.map +1 -1
- package/dist/spectrum/collections.js.map +1 -1
- package/dist/spectrum/comboBox/ComboBox.js.map +1 -1
- package/dist/spectrum/comboBox/ComboBoxNormalized.js.map +1 -1
- package/dist/spectrum/comboBox/index.js.map +1 -1
- package/dist/spectrum/content.js.map +1 -1
- package/dist/spectrum/dateAndTime.js.map +1 -1
- package/dist/spectrum/forms.js.map +1 -1
- package/dist/spectrum/icons.js.map +1 -1
- package/dist/spectrum/index.js.map +1 -1
- package/dist/spectrum/layout.js.map +1 -1
- package/dist/spectrum/listView/ListView.js.map +1 -1
- package/dist/spectrum/listView/ListViewNormalized.js.map +1 -1
- package/dist/spectrum/listView/ListViewWrapper.js.map +1 -1
- package/dist/spectrum/listView/index.js.map +1 -1
- package/dist/spectrum/navigation.js.map +1 -1
- package/dist/spectrum/overlays.js.map +1 -1
- package/dist/spectrum/picker/Picker.js.map +1 -1
- package/dist/spectrum/picker/PickerNormalized.js.map +1 -1
- package/dist/spectrum/picker/PickerProps.js.map +1 -1
- package/dist/spectrum/picker/index.js.map +1 -1
- package/dist/spectrum/picker/usePickerItemScale.js.map +1 -1
- package/dist/spectrum/picker/usePickerNormalizedProps.js.map +1 -1
- package/dist/spectrum/picker/usePickerProps.js.map +1 -1
- package/dist/spectrum/picker/usePickerScrollOnOpen.js.map +1 -1
- package/dist/spectrum/shared.js.map +1 -1
- package/dist/spectrum/status.js.map +1 -1
- package/dist/spectrum/utils/index.js.map +1 -1
- package/dist/spectrum/utils/itemUtils.js.map +1 -1
- package/dist/spectrum/utils/itemWrapperUtils.js.map +1 -1
- package/dist/spectrum/utils/propsUtils.js.map +1 -1
- package/dist/spectrum/utils/themeUtils.js.map +1 -1
- package/dist/spectrum/utils/useOnChangeTrackUncontrolled.js.map +1 -1
- package/dist/spectrum/utils/useRenderNormalizedItem.js.map +1 -1
- package/dist/spectrum/utils/useStaticItemInitialScrollPosition.js.map +1 -1
- package/dist/spectrum/utils/useStringifiedMultiSelection.js.map +1 -1
- package/dist/spectrum/utils/useStringifiedSelection.js.map +1 -1
- package/dist/theme/Logo.js.map +1 -1
- package/dist/theme/SpectrumThemeProvider.js.map +1 -1
- package/dist/theme/ThemeModel.js.map +1 -1
- package/dist/theme/ThemePicker.js.map +1 -1
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/ThemeUtils.js.map +1 -1
- package/dist/theme/colorUtils.js.map +1 -1
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/theme-dark/index.js.map +1 -1
- package/dist/theme/theme-light/index.js.map +1 -1
- package/dist/theme/theme-light/theme-light-semantic.css +1 -1
- package/dist/theme/theme-light/theme-light-semantic.css.map +1 -1
- package/dist/theme/theme-spectrum/index.js.map +1 -1
- package/dist/theme/useExternalTheme.js.map +1 -1
- package/dist/theme/useSpectrumThemeProvider.js.map +1 -1
- package/dist/theme/useTheme.js.map +1 -1
- package/dist/transitions/FadeTransition.js.map +1 -1
- package/dist/transitions/SlideTransition.js.map +1 -1
- package/dist/transitions/index.js.map +1 -1
- package/package.json +8 -8
- package/scss/bootstrap_overrides.scss +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sourceRoot":"","sources":["../scss/custom.scss","../scss/bootstrap_overrides.scss","../src/CustomTimeSelect.scss","../../../node_modules/bootstrap/scss/_variables.scss","../scss/util.scss"],"names":[],"mappings":"AAAA;AC6LA;ACrLA;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA,eD0IY;ECzIZ;EACA;EACA,aC4Q0B;;AD1Q1B;EEpBF,iBAY4D;EAX5D;EACA,YAUyB;EATzB;EACA;EACA,WAO4D;EAE5D;EACA,OALQ;EAMR,QALS;EFYL;;AAIJ;EACE;;AAGF;EACE,cDqEK;;AClEP;EACE,cD0IuB;;;ACrIzB;EACE,kBDjBI;;ACoBN;EACE;EACA;;AAGF;EACE;;AAEF;EACE;EACA;;AAEF;EACE;EACA;EACA,OA5DkB;EA6DlB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE,kBAtEoB;;AAuEpB;EACE,kBAvEwB;;AA2E5B;EACE,OD3CS;EC4CT,kBA5EiB;;AA8EnB;EACE;;AAGF;EACE,wBDmEY;EClEZ,yBDkEY","file":"CustomTimeSelect.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","@import '../scss/custom.scss';\n\n$cs-option-btn-color: var(--dh-color-item-list-selected-fg);\n$cs-option-selected-bg: var(--dh-color-item-list-selected-bg);\n$cs-option-selected-hover-bg: var(--dh-color-item-list-selected-hover-bg);\n$cs-option-hover-bg: var(--dh-color-item-list-hover-bg);\n$cs-option-hover-color: $dropdown-link-hover-color;\n\n.cs-container {\n flex-wrap: nowrap;\n\n .cs-dropdown .cs-btn {\n color: var(--dh-color-input-fg);\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n border-radius: $border-radius;\n border: $input-border-width solid $input-border-color;\n min-width: 14rem;\n font-weight: $font-weight-normal;\n\n .cs-caret {\n @include caret-icon;\n\n margin-right: 4px;\n }\n }\n\n .cs-dropdown:hover .cs-btn:not(:disabled) .cs-caret {\n background-color: var(--dh-color-selector-hover-fg);\n }\n\n .cs-dropdown-invalid .cs-btn-invalid {\n border-color: $danger;\n }\n\n .cs-btn:focus {\n border-color: $input-focus-border-color;\n }\n}\n\n.cs-menu-container {\n .cs-divider {\n background-color: $black;\n }\n\n .cs-custom-container {\n display: flex;\n direction: row;\n }\n\n .custom-label {\n padding: $input-btn-padding-y $input-btn-padding-x;\n }\n .cs-options {\n max-height: 400px;\n overflow: auto;\n }\n .cs-option-btn {\n border: none;\n width: 100%;\n color: $cs-option-btn-color;\n padding: $input-btn-padding-y $input-btn-padding-x;\n white-space: nowrap;\n text-decoration: none;\n background-color: transparent;\n text-align: left;\n cursor: pointer;\n user-select: none;\n display: block;\n }\n .cs-option-btn.keyboard-active {\n background-color: $cs-option-selected-bg;\n &:hover {\n background-color: $cs-option-selected-hover-bg;\n }\n }\n\n .cs-option-btn:hover {\n color: $cs-option-hover-color;\n background-color: $cs-option-hover-bg;\n }\n .cs-option-btn:focus {\n outline: none;\n }\n\n .cs-options:first-child {\n border-top-left-radius: $border-radius;\n border-top-right-radius: $border-radius;\n }\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","// 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 negative-down-bg-opacity($i: 100) {\n @return color-mix-opacity('negative-down-bg', $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"]}
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../scss/custom.scss","../scss/bootstrap_overrides.scss","../src/CustomTimeSelect.scss","../../../node_modules/bootstrap/scss/_variables.scss","../scss/util.scss"],"names":[],"mappings":"AAAA;AC6LA;ACrLA;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA,eD0IY;ECzIZ;EACA;EACA,aC4Q0B;;AD1Q1B;EEpBF,iBAY4D;EAX5D;EACA,YAUyB;EATzB;EACA;EACA,WAO4D;EAE5D;EACA,OALQ;EAMR,QALS;EFYL;;AAIJ;EACE;;AAGF;EACE,cDqEK;;AClEP;EACE,cD0IuB;;;ACrIzB;EACE,kBDjBI;;ACoBN;EACE;EACA;;AAGF;EACE;;AAEF;EACE;EACA;;AAEF;EACE;EACA;EACA,OA5DkB;EA6DlB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE,kBAtEoB;;AAuEpB;EACE,kBAvEwB;;AA2E5B;EACE,OD3CS;EC4CT,kBA5EiB;;AA8EnB;EACE;;AAGF;EACE,wBDmEY;EClEZ,yBDkEY","file":"CustomTimeSelect.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-text-disabled);\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","@import '../scss/custom.scss';\n\n$cs-option-btn-color: var(--dh-color-item-list-selected-fg);\n$cs-option-selected-bg: var(--dh-color-item-list-selected-bg);\n$cs-option-selected-hover-bg: var(--dh-color-item-list-selected-hover-bg);\n$cs-option-hover-bg: var(--dh-color-item-list-hover-bg);\n$cs-option-hover-color: $dropdown-link-hover-color;\n\n.cs-container {\n flex-wrap: nowrap;\n\n .cs-dropdown .cs-btn {\n color: var(--dh-color-input-fg);\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n border-radius: $border-radius;\n border: $input-border-width solid $input-border-color;\n min-width: 14rem;\n font-weight: $font-weight-normal;\n\n .cs-caret {\n @include caret-icon;\n\n margin-right: 4px;\n }\n }\n\n .cs-dropdown:hover .cs-btn:not(:disabled) .cs-caret {\n background-color: var(--dh-color-selector-hover-fg);\n }\n\n .cs-dropdown-invalid .cs-btn-invalid {\n border-color: $danger;\n }\n\n .cs-btn:focus {\n border-color: $input-focus-border-color;\n }\n}\n\n.cs-menu-container {\n .cs-divider {\n background-color: $black;\n }\n\n .cs-custom-container {\n display: flex;\n direction: row;\n }\n\n .custom-label {\n padding: $input-btn-padding-y $input-btn-padding-x;\n }\n .cs-options {\n max-height: 400px;\n overflow: auto;\n }\n .cs-option-btn {\n border: none;\n width: 100%;\n color: $cs-option-btn-color;\n padding: $input-btn-padding-y $input-btn-padding-x;\n white-space: nowrap;\n text-decoration: none;\n background-color: transparent;\n text-align: left;\n cursor: pointer;\n user-select: none;\n display: block;\n }\n .cs-option-btn.keyboard-active {\n background-color: $cs-option-selected-bg;\n &:hover {\n background-color: $cs-option-selected-hover-bg;\n }\n }\n\n .cs-option-btn:hover {\n color: $cs-option-hover-color;\n background-color: $cs-option-hover-bg;\n }\n .cs-option-btn:focus {\n outline: none;\n }\n\n .cs-options:first-child {\n border-top-left-radius: $border-radius;\n border-top-right-radius: $border-radius;\n }\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","// 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 negative-down-bg-opacity($i: 100) {\n @return color-mix-opacity('negative-down-bg', $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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomTimeSelect.js","names":["React","Component","FontAwesomeIcon","vsCheck","TimeUtils","classNames","TimeInput","DropdownMenu","jsx","_jsx","jsxs","_jsxs","CUSTOM_OPTION","MENU_NAVIGATION_DIRECTION","CustomTimeSelect","constructor","props","_defineProperty","value","valueToTime","toggleMenu","bind","handleMenuKeyDown","closeMenu","handleOptionClick","handleOptionFocus","handleMenuOpened","handleMenuExited","handleCustomInput","csContainer","createRef","menuContainer","button","input","state","keyboardOptionIndex","menuIsOpen","inputWidth","customTime","inputFocused","getSelectedText","options","placeholder","i","length","option","title","formatTime","setInputWidth","current","setState","getBoundingClientRect","width","focus","_this$button$current","updateInputValue","onChange","handleResize","event","_this$button$current2","key","updateFromCustom","stopPropagation","preventDefault","shiftKey","handleMenuNavigation","UP","DOWN","direction","menuOptionsLength","newKeyboardOptionIndex","focusInput","focusOption","scrollOptionIntoView","optionIndex","Number","currentTarget","timeToValue","update","updateAndClose","_this$button$current3","target","_this$menuContainer$c","activeOption","querySelector","HTMLElement","valueIndex","map","indexOf","_this$input$current","index","_this$menuContainer$c2","children","item","openMenu","updateKeyboardIndex","focusButton","arguments","undefined","_this$button$current4","_this$menuContainer$c3","offsetTop","DROP_DOWN_MENU_HEIGHT","scrollTop","renderMenuElement","className","ref","role","onKeyDown","onClick","style","renderOptions","icon","customText","matchFound","optionArray","concat","push","type","onFocus","onBlur","render","disabled","invalid","dataTestId","popperOptions","_objectSpread","placement","modifiers","preventOverflow","enabled","isShown","actions","menuElement","popperClassName","onMenuOpened","onMenuClosed","menuStyle","maxWidth","Math","round","time"],"sources":["../src/CustomTimeSelect.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport { type PopperOptions } from 'popper.js';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsCheck, type IconDefinition } from '@deephaven/icons';\nimport { TimeUtils } from '@deephaven/utils';\nimport classNames from 'classnames';\nimport TimeInput, { type TimeInputElement } from './TimeInput';\nimport DropdownMenu from './menu-actions/DropdownMenu';\nimport './CustomTimeSelect.scss';\n\nconst CUSTOM_OPTION = -1;\n\nenum MENU_NAVIGATION_DIRECTION {\n UP = 'UP',\n DOWN = 'DOWN',\n}\n\ntype CustomTimeSelectProps = {\n options: { title: string; value: number }[];\n popperOptions: PopperOptions;\n value: number | null;\n onChange: (value: number) => void;\n disabled: boolean;\n icon: IconDefinition;\n placeholder: string;\n customText: string;\n // Defaults to converting the value in milliseconds to time in seconds\n valueToTime: (val: number | null) => number;\n // Defaults to converting the time in seconds to value in milliseconds\n timeToValue: (time: number) => number;\n invalid: boolean;\n 'data-testid'?: string;\n};\n\ntype TimeInSeconds = number;\n\ntype CustomTimeSelectState = {\n keyboardOptionIndex: number;\n menuIsOpen: boolean;\n inputWidth: number;\n customTime: TimeInSeconds;\n inputFocused: boolean;\n};\n\nclass CustomTimeSelect extends Component<\n CustomTimeSelectProps,\n CustomTimeSelectState\n> {\n static MENU_NAVIGATION_DIRECTION = MENU_NAVIGATION_DIRECTION;\n\n static DROP_DOWN_MENU_HEIGHT = 125;\n\n static defaultProps: Partial<CustomTimeSelectProps> = {\n onChange(): void {\n // no-op\n },\n value: null,\n disabled: false,\n popperOptions: {},\n icon: vsCheck,\n customText: 'Custom',\n placeholder: 'Select a time',\n valueToTime: value => (value === null ? 0 : Math.round(value / 1000)),\n timeToValue: time => time * 1000,\n invalid: false,\n 'data-testid': undefined,\n };\n\n constructor(props: CustomTimeSelectProps) {\n super(props);\n\n const { value, valueToTime } = props;\n\n this.toggleMenu = this.toggleMenu.bind(this);\n this.handleMenuKeyDown = this.handleMenuKeyDown.bind(this);\n this.closeMenu = this.closeMenu.bind(this);\n\n this.handleOptionClick = this.handleOptionClick.bind(this);\n this.handleOptionFocus = this.handleOptionFocus.bind(this);\n\n this.handleMenuOpened = this.handleMenuOpened.bind(this);\n this.handleMenuExited = this.handleMenuExited.bind(this);\n this.handleCustomInput = this.handleCustomInput.bind(this);\n\n this.csContainer = React.createRef();\n this.menuContainer = React.createRef();\n this.button = React.createRef();\n this.input = React.createRef();\n\n this.state = {\n keyboardOptionIndex: 0,\n menuIsOpen: false,\n inputWidth: 100,\n customTime: valueToTime(value),\n inputFocused: false,\n };\n }\n\n csContainer: React.RefObject<HTMLDivElement>;\n\n menuContainer: React.RefObject<HTMLDivElement>;\n\n button: React.RefObject<HTMLButtonElement>;\n\n input: React.RefObject<TimeInputElement>;\n\n getSelectedText(): string {\n const { options, value, placeholder } = this.props;\n const { customTime } = this.state;\n\n if (value === null) {\n return placeholder;\n }\n\n for (let i = 0; i < options.length; i += 1) {\n const option = options[i];\n if (option.value === value) {\n return option.title;\n }\n }\n\n return TimeUtils.formatTime(customTime);\n }\n\n setInputWidth(): void {\n if (this.csContainer.current) {\n this.setState({\n inputWidth: this.csContainer.current.getBoundingClientRect().width,\n });\n }\n }\n\n focus(): void {\n this.button.current?.focus();\n }\n\n updateInputValue(value: number): void {\n const { onChange } = this.props;\n onChange(value);\n }\n\n handleResize(): void {\n this.setInputWidth();\n }\n\n handleMenuKeyDown(event: React.KeyboardEvent<HTMLDivElement>): void {\n const { keyboardOptionIndex, inputFocused } = this.state;\n const { options } = this.props;\n\n switch (event.key) {\n case 'Enter':\n case ' ': // Space Bar\n if (inputFocused) {\n this.updateFromCustom();\n } else {\n this.updateInputValue(options[keyboardOptionIndex].value);\n }\n this.closeMenu();\n this.button.current?.focus();\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'Tab':\n if (event.shiftKey) {\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.UP\n );\n } else {\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.DOWN\n );\n }\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'ArrowUp':\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.UP\n );\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'ArrowDown':\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.DOWN\n );\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'Escape':\n this.closeMenu();\n break;\n default:\n break;\n }\n }\n\n handleMenuNavigation(direction: MENU_NAVIGATION_DIRECTION): void {\n const { keyboardOptionIndex, inputFocused } = this.state;\n const { options } = this.props;\n const menuOptionsLength = options.length;\n let newKeyboardOptionIndex = keyboardOptionIndex;\n switch (direction) {\n case CustomTimeSelect.MENU_NAVIGATION_DIRECTION.UP:\n if (!inputFocused && keyboardOptionIndex === 0) {\n this.focusInput();\n break;\n } else if (inputFocused) {\n this.focusOption(keyboardOptionIndex);\n }\n\n if (keyboardOptionIndex > 0 && !inputFocused) {\n newKeyboardOptionIndex =\n (newKeyboardOptionIndex - 1) % menuOptionsLength;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n } else if (keyboardOptionIndex === 0) {\n newKeyboardOptionIndex = menuOptionsLength - 1;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n }\n this.scrollOptionIntoView(newKeyboardOptionIndex);\n break;\n case CustomTimeSelect.MENU_NAVIGATION_DIRECTION.DOWN:\n if (!inputFocused && keyboardOptionIndex === menuOptionsLength - 1) {\n this.focusInput();\n break;\n } else if (inputFocused) {\n this.focusOption(keyboardOptionIndex);\n }\n\n if (\n keyboardOptionIndex < menuOptionsLength &&\n !(inputFocused && keyboardOptionIndex === 0)\n ) {\n newKeyboardOptionIndex =\n (newKeyboardOptionIndex + 1) % menuOptionsLength;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n }\n this.scrollOptionIntoView(newKeyboardOptionIndex);\n break;\n default:\n break;\n }\n }\n\n handleOptionClick(event: React.MouseEvent<HTMLButtonElement>): void {\n const optionIndex = Number(event.currentTarget.value);\n const { options, timeToValue } = this.props;\n const { customTime } = this.state;\n\n if (optionIndex === CUSTOM_OPTION) {\n const update = timeToValue(customTime);\n this.updateAndClose(update);\n } else {\n this.updateAndClose(options[optionIndex].value);\n }\n }\n\n updateAndClose(update: number): void {\n this.updateInputValue(update);\n this.closeMenu();\n this.button.current?.focus();\n }\n\n handleOptionFocus(event: React.FocusEvent<HTMLButtonElement>): void {\n this.setState({ keyboardOptionIndex: Number(event.target.value) });\n }\n\n handleMenuOpened(): void {\n const { options, value } = this.props;\n const { keyboardOptionIndex } = this.state;\n this.scrollOptionIntoView(keyboardOptionIndex);\n const activeOption = this.menuContainer.current?.querySelector(\n '.cs-option-btn.keyboard-active'\n );\n if (activeOption instanceof HTMLElement) {\n activeOption.focus();\n }\n\n if (value === null) {\n return;\n }\n const valueIndex = options.map(option => option.value).indexOf(value);\n if (valueIndex < 0) {\n // The custom option should be selected\n this.focusInput();\n }\n }\n\n focusInput(): void {\n this.input.current?.focus();\n }\n\n focusOption(index: number): void {\n const options = this.menuContainer.current?.querySelector('.cs-options');\n if (options && options.children != null) {\n const option = options.children.item(index);\n if (option instanceof HTMLElement) {\n option.focus();\n }\n }\n }\n\n handleMenuExited(): void {\n const { menuIsOpen } = this.state;\n if (menuIsOpen) {\n this.setState({ menuIsOpen: false, keyboardOptionIndex: 0 });\n }\n }\n\n handleCustomInput(value: number): void {\n const { timeToValue } = this.props;\n\n const update = timeToValue(value);\n this.updateInputValue(update);\n this.setState({\n customTime: value,\n });\n }\n\n updateFromCustom(): void {\n const { timeToValue } = this.props;\n const { customTime } = this.state;\n\n const update = timeToValue(customTime);\n this.updateInputValue(update);\n }\n\n toggleMenu(event: React.MouseEvent<HTMLButtonElement>): void {\n const { menuIsOpen } = this.state;\n if (menuIsOpen) {\n this.closeMenu();\n } else {\n this.openMenu();\n }\n event.stopPropagation();\n }\n\n openMenu(): void {\n this.updateKeyboardIndex();\n this.setInputWidth();\n this.setState({ menuIsOpen: true });\n }\n\n closeMenu(focusButton = true): void {\n this.setState({ menuIsOpen: false });\n if (focusButton) {\n this.button.current?.focus();\n }\n }\n\n updateKeyboardIndex(): void {\n const { options, value } = this.props;\n if (value === null) {\n return;\n }\n const valueIndex = options.map(option => option.value).indexOf(value);\n if (valueIndex > 0) {\n this.setState({ keyboardOptionIndex: valueIndex });\n }\n }\n\n scrollOptionIntoView(index: number): void {\n const options = this.menuContainer.current?.querySelector('.cs-options');\n if (options && options.children != null) {\n const activeOption = options.children.item(index);\n if (\n activeOption instanceof HTMLElement &&\n activeOption.offsetTop > CustomTimeSelect.DROP_DOWN_MENU_HEIGHT\n ) {\n options.scrollTop =\n activeOption.offsetTop - CustomTimeSelect.DROP_DOWN_MENU_HEIGHT;\n } else if (\n (activeOption instanceof HTMLElement && activeOption.offsetTop < 0) ||\n index === 0\n ) {\n options.scrollTop = 0;\n }\n }\n }\n\n renderMenuElement(): JSX.Element {\n const { inputWidth } = this.state;\n return (\n <div\n className=\"cs-menu-container\"\n ref={this.menuContainer}\n role=\"presentation\"\n onKeyDown={this.handleMenuKeyDown}\n onClick={event => {\n event.stopPropagation();\n }}\n style={{ width: inputWidth }}\n >\n <div className=\"cs-options-container\">\n <div className=\"cs-options\">{this.renderOptions()}</div>\n </div>\n </div>\n );\n }\n\n renderOptions(): React.ReactNode {\n const { options, value, icon, customText } = this.props;\n const { keyboardOptionIndex, customTime, inputFocused } = this.state;\n\n let matchFound = false;\n const optionArray: JSX.Element[] = [];\n for (let index = 0; index < options.length; index += 1) {\n const option = options[index];\n const key = `option-${index}-${option.value}`;\n matchFound = matchFound || option.value === value;\n optionArray.push(\n <button\n key={key}\n type=\"button\"\n value={index}\n className={classNames('cs-option-btn', {\n 'keyboard-active': keyboardOptionIndex === index && !inputFocused,\n })}\n onClick={this.handleOptionClick}\n onFocus={this.handleOptionFocus}\n >\n {option.value === value && (\n <FontAwesomeIcon icon={icon} className=\"mr-2\" />\n )}\n {option.value !== value && <span className=\"mr-4\" />}\n {option.title}\n </button>\n );\n }\n\n optionArray.push(<hr className=\"cs-divider\" key=\"option-divider\" />);\n\n optionArray.push(\n <button\n key=\"option-custom-label\"\n type=\"button\"\n value={CUSTOM_OPTION}\n className={classNames('cs-option-btn', {\n 'keyboard-active': inputFocused,\n })}\n onClick={this.handleOptionClick}\n onFocus={this.handleOptionFocus}\n >\n {!matchFound && value !== null ? (\n <FontAwesomeIcon icon={icon} className=\"mr-2\" />\n ) : (\n <span className=\"mr-4\" />\n )}\n {customText}\n </button>\n );\n\n optionArray.push(\n <div key=\"cs-custom-container\" className=\"cs-custom-container\">\n <span className=\"mr-2\" />\n <TimeInput\n key=\"option-input\"\n ref={this.input}\n onChange={this.handleCustomInput}\n value={customTime}\n onFocus={() => this.setState({ inputFocused: true })}\n onBlur={() => this.setState({ inputFocused: false })}\n />\n <span className=\"ml-2\" />\n </div>\n );\n\n optionArray.push(<hr key=\"option-end\" className=\"mb-2\" />);\n\n return optionArray;\n }\n\n render(): JSX.Element {\n const { disabled, invalid, value, 'data-testid': dataTestId } = this.props;\n const { menuIsOpen } = this.state;\n let { popperOptions } = this.props;\n popperOptions = {\n placement: 'bottom-end',\n modifiers: {\n preventOverflow: { enabled: false },\n },\n ...popperOptions,\n };\n\n return (\n <div\n className=\"input-group cs-container context-menu\"\n ref={this.csContainer}\n data-testid={dataTestId}\n >\n <div\n className={classNames('input-group-append cs-dropdown', {\n 'cs-dropdown-invalid': invalid,\n })}\n >\n <button\n type=\"button\"\n className={classNames('btn cs-btn form-control', {\n 'cs-btn-invalid': invalid,\n })}\n ref={this.button}\n onClick={this.toggleMenu}\n disabled={disabled}\n >\n <span\n className={classNames({\n 'text-muted': value === null,\n })}\n >\n {this.getSelectedText()}\n </span>\n <span className=\"cs-caret\" />\n <DropdownMenu\n isShown={menuIsOpen}\n actions={{ menuElement: this.renderMenuElement() }}\n popperOptions={popperOptions}\n popperClassName=\"CustomTimeSelect\"\n onMenuOpened={this.handleMenuOpened}\n onMenuClosed={this.handleMenuExited}\n menuStyle={{ maxWidth: '100rem' }}\n />\n </button>\n </div>\n </div>\n );\n }\n}\n\nexport default CustomTimeSelect;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"CustomTimeSelect.js","names":["React","Component","FontAwesomeIcon","vsCheck","TimeUtils","classNames","TimeInput","DropdownMenu","jsx","_jsx","jsxs","_jsxs","CUSTOM_OPTION","MENU_NAVIGATION_DIRECTION","CustomTimeSelect","constructor","props","_defineProperty","value","valueToTime","toggleMenu","bind","handleMenuKeyDown","closeMenu","handleOptionClick","handleOptionFocus","handleMenuOpened","handleMenuExited","handleCustomInput","csContainer","createRef","menuContainer","button","input","state","keyboardOptionIndex","menuIsOpen","inputWidth","customTime","inputFocused","getSelectedText","options","placeholder","i","length","option","title","formatTime","setInputWidth","current","setState","getBoundingClientRect","width","focus","_this$button$current","updateInputValue","onChange","handleResize","event","_this$button$current2","key","updateFromCustom","stopPropagation","preventDefault","shiftKey","handleMenuNavigation","UP","DOWN","direction","menuOptionsLength","newKeyboardOptionIndex","focusInput","focusOption","scrollOptionIntoView","optionIndex","Number","currentTarget","timeToValue","update","updateAndClose","_this$button$current3","target","_this$menuContainer$c","activeOption","querySelector","HTMLElement","valueIndex","map","indexOf","_this$input$current","index","_this$menuContainer$c2","children","item","openMenu","updateKeyboardIndex","focusButton","arguments","undefined","_this$button$current4","_this$menuContainer$c3","offsetTop","DROP_DOWN_MENU_HEIGHT","scrollTop","renderMenuElement","className","ref","role","onKeyDown","onClick","style","renderOptions","icon","customText","matchFound","optionArray","concat","push","type","onFocus","onBlur","render","disabled","invalid","dataTestId","popperOptions","_objectSpread","placement","modifiers","preventOverflow","enabled","isShown","actions","menuElement","popperClassName","onMenuOpened","onMenuClosed","menuStyle","maxWidth","Math","round","time"],"sources":["../src/CustomTimeSelect.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport { type PopperOptions } from 'popper.js';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsCheck, type IconDefinition } from '@deephaven/icons';\nimport { TimeUtils } from '@deephaven/utils';\nimport classNames from 'classnames';\nimport TimeInput, { type TimeInputElement } from './TimeInput';\nimport DropdownMenu from './menu-actions/DropdownMenu';\nimport './CustomTimeSelect.scss';\n\nconst CUSTOM_OPTION = -1;\n\nenum MENU_NAVIGATION_DIRECTION {\n UP = 'UP',\n DOWN = 'DOWN',\n}\n\ntype CustomTimeSelectProps = {\n options: { title: string; value: number }[];\n popperOptions: PopperOptions;\n value: number | null;\n onChange: (value: number) => void;\n disabled: boolean;\n icon: IconDefinition;\n placeholder: string;\n customText: string;\n // Defaults to converting the value in milliseconds to time in seconds\n valueToTime: (val: number | null) => number;\n // Defaults to converting the time in seconds to value in milliseconds\n timeToValue: (time: number) => number;\n invalid: boolean;\n 'data-testid'?: string;\n};\n\ntype TimeInSeconds = number;\n\ntype CustomTimeSelectState = {\n keyboardOptionIndex: number;\n menuIsOpen: boolean;\n inputWidth: number;\n customTime: TimeInSeconds;\n inputFocused: boolean;\n};\n\nclass CustomTimeSelect extends Component<\n CustomTimeSelectProps,\n CustomTimeSelectState\n> {\n static MENU_NAVIGATION_DIRECTION = MENU_NAVIGATION_DIRECTION;\n\n static DROP_DOWN_MENU_HEIGHT = 125;\n\n static defaultProps: Partial<CustomTimeSelectProps> = {\n onChange(): void {\n // no-op\n },\n value: null,\n disabled: false,\n popperOptions: {},\n icon: vsCheck,\n customText: 'Custom',\n placeholder: 'Select a time',\n valueToTime: value => (value === null ? 0 : Math.round(value / 1000)),\n timeToValue: time => time * 1000,\n invalid: false,\n 'data-testid': undefined,\n };\n\n constructor(props: CustomTimeSelectProps) {\n super(props);\n\n const { value, valueToTime } = props;\n\n this.toggleMenu = this.toggleMenu.bind(this);\n this.handleMenuKeyDown = this.handleMenuKeyDown.bind(this);\n this.closeMenu = this.closeMenu.bind(this);\n\n this.handleOptionClick = this.handleOptionClick.bind(this);\n this.handleOptionFocus = this.handleOptionFocus.bind(this);\n\n this.handleMenuOpened = this.handleMenuOpened.bind(this);\n this.handleMenuExited = this.handleMenuExited.bind(this);\n this.handleCustomInput = this.handleCustomInput.bind(this);\n\n this.csContainer = React.createRef();\n this.menuContainer = React.createRef();\n this.button = React.createRef();\n this.input = React.createRef();\n\n this.state = {\n keyboardOptionIndex: 0,\n menuIsOpen: false,\n inputWidth: 100,\n customTime: valueToTime(value),\n inputFocused: false,\n };\n }\n\n csContainer: React.RefObject<HTMLDivElement>;\n\n menuContainer: React.RefObject<HTMLDivElement>;\n\n button: React.RefObject<HTMLButtonElement>;\n\n input: React.RefObject<TimeInputElement>;\n\n getSelectedText(): string {\n const { options, value, placeholder } = this.props;\n const { customTime } = this.state;\n\n if (value === null) {\n return placeholder;\n }\n\n for (let i = 0; i < options.length; i += 1) {\n const option = options[i];\n if (option.value === value) {\n return option.title;\n }\n }\n\n return TimeUtils.formatTime(customTime);\n }\n\n setInputWidth(): void {\n if (this.csContainer.current) {\n this.setState({\n inputWidth: this.csContainer.current.getBoundingClientRect().width,\n });\n }\n }\n\n focus(): void {\n this.button.current?.focus();\n }\n\n updateInputValue(value: number): void {\n const { onChange } = this.props;\n onChange(value);\n }\n\n handleResize(): void {\n this.setInputWidth();\n }\n\n handleMenuKeyDown(event: React.KeyboardEvent<HTMLDivElement>): void {\n const { keyboardOptionIndex, inputFocused } = this.state;\n const { options } = this.props;\n\n switch (event.key) {\n case 'Enter':\n case ' ': // Space Bar\n if (inputFocused) {\n this.updateFromCustom();\n } else {\n this.updateInputValue(options[keyboardOptionIndex].value);\n }\n this.closeMenu();\n this.button.current?.focus();\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'Tab':\n if (event.shiftKey) {\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.UP\n );\n } else {\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.DOWN\n );\n }\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'ArrowUp':\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.UP\n );\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'ArrowDown':\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.DOWN\n );\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'Escape':\n this.closeMenu();\n break;\n default:\n break;\n }\n }\n\n handleMenuNavigation(direction: MENU_NAVIGATION_DIRECTION): void {\n const { keyboardOptionIndex, inputFocused } = this.state;\n const { options } = this.props;\n const menuOptionsLength = options.length;\n let newKeyboardOptionIndex = keyboardOptionIndex;\n switch (direction) {\n case CustomTimeSelect.MENU_NAVIGATION_DIRECTION.UP:\n if (!inputFocused && keyboardOptionIndex === 0) {\n this.focusInput();\n break;\n } else if (inputFocused) {\n this.focusOption(keyboardOptionIndex);\n }\n\n if (keyboardOptionIndex > 0 && !inputFocused) {\n newKeyboardOptionIndex =\n (newKeyboardOptionIndex - 1) % menuOptionsLength;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n } else if (keyboardOptionIndex === 0) {\n newKeyboardOptionIndex = menuOptionsLength - 1;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n }\n this.scrollOptionIntoView(newKeyboardOptionIndex);\n break;\n case CustomTimeSelect.MENU_NAVIGATION_DIRECTION.DOWN:\n if (!inputFocused && keyboardOptionIndex === menuOptionsLength - 1) {\n this.focusInput();\n break;\n } else if (inputFocused) {\n this.focusOption(keyboardOptionIndex);\n }\n\n if (\n keyboardOptionIndex < menuOptionsLength &&\n !(inputFocused && keyboardOptionIndex === 0)\n ) {\n newKeyboardOptionIndex =\n (newKeyboardOptionIndex + 1) % menuOptionsLength;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n }\n this.scrollOptionIntoView(newKeyboardOptionIndex);\n break;\n default:\n break;\n }\n }\n\n handleOptionClick(event: React.MouseEvent<HTMLButtonElement>): void {\n const optionIndex = Number(event.currentTarget.value);\n const { options, timeToValue } = this.props;\n const { customTime } = this.state;\n\n if (optionIndex === CUSTOM_OPTION) {\n const update = timeToValue(customTime);\n this.updateAndClose(update);\n } else {\n this.updateAndClose(options[optionIndex].value);\n }\n }\n\n updateAndClose(update: number): void {\n this.updateInputValue(update);\n this.closeMenu();\n this.button.current?.focus();\n }\n\n handleOptionFocus(event: React.FocusEvent<HTMLButtonElement>): void {\n this.setState({ keyboardOptionIndex: Number(event.target.value) });\n }\n\n handleMenuOpened(): void {\n const { options, value } = this.props;\n const { keyboardOptionIndex } = this.state;\n this.scrollOptionIntoView(keyboardOptionIndex);\n const activeOption = this.menuContainer.current?.querySelector(\n '.cs-option-btn.keyboard-active'\n );\n if (activeOption instanceof HTMLElement) {\n activeOption.focus();\n }\n\n if (value === null) {\n return;\n }\n const valueIndex = options.map(option => option.value).indexOf(value);\n if (valueIndex < 0) {\n // The custom option should be selected\n this.focusInput();\n }\n }\n\n focusInput(): void {\n this.input.current?.focus();\n }\n\n focusOption(index: number): void {\n const options = this.menuContainer.current?.querySelector('.cs-options');\n if (options && options.children != null) {\n const option = options.children.item(index);\n if (option instanceof HTMLElement) {\n option.focus();\n }\n }\n }\n\n handleMenuExited(): void {\n const { menuIsOpen } = this.state;\n if (menuIsOpen) {\n this.setState({ menuIsOpen: false, keyboardOptionIndex: 0 });\n }\n }\n\n handleCustomInput(value: number): void {\n const { timeToValue } = this.props;\n\n const update = timeToValue(value);\n this.updateInputValue(update);\n this.setState({\n customTime: value,\n });\n }\n\n updateFromCustom(): void {\n const { timeToValue } = this.props;\n const { customTime } = this.state;\n\n const update = timeToValue(customTime);\n this.updateInputValue(update);\n }\n\n toggleMenu(event: React.MouseEvent<HTMLButtonElement>): void {\n const { menuIsOpen } = this.state;\n if (menuIsOpen) {\n this.closeMenu();\n } else {\n this.openMenu();\n }\n event.stopPropagation();\n }\n\n openMenu(): void {\n this.updateKeyboardIndex();\n this.setInputWidth();\n this.setState({ menuIsOpen: true });\n }\n\n closeMenu(focusButton = true): void {\n this.setState({ menuIsOpen: false });\n if (focusButton) {\n this.button.current?.focus();\n }\n }\n\n updateKeyboardIndex(): void {\n const { options, value } = this.props;\n if (value === null) {\n return;\n }\n const valueIndex = options.map(option => option.value).indexOf(value);\n if (valueIndex > 0) {\n this.setState({ keyboardOptionIndex: valueIndex });\n }\n }\n\n scrollOptionIntoView(index: number): void {\n const options = this.menuContainer.current?.querySelector('.cs-options');\n if (options && options.children != null) {\n const activeOption = options.children.item(index);\n if (\n activeOption instanceof HTMLElement &&\n activeOption.offsetTop > CustomTimeSelect.DROP_DOWN_MENU_HEIGHT\n ) {\n options.scrollTop =\n activeOption.offsetTop - CustomTimeSelect.DROP_DOWN_MENU_HEIGHT;\n } else if (\n (activeOption instanceof HTMLElement && activeOption.offsetTop < 0) ||\n index === 0\n ) {\n options.scrollTop = 0;\n }\n }\n }\n\n renderMenuElement(): JSX.Element {\n const { inputWidth } = this.state;\n return (\n <div\n className=\"cs-menu-container\"\n ref={this.menuContainer}\n role=\"presentation\"\n onKeyDown={this.handleMenuKeyDown}\n onClick={event => {\n event.stopPropagation();\n }}\n style={{ width: inputWidth }}\n >\n <div className=\"cs-options-container\">\n <div className=\"cs-options\">{this.renderOptions()}</div>\n </div>\n </div>\n );\n }\n\n renderOptions(): React.ReactNode {\n const { options, value, icon, customText } = this.props;\n const { keyboardOptionIndex, customTime, inputFocused } = this.state;\n\n let matchFound = false;\n const optionArray: JSX.Element[] = [];\n for (let index = 0; index < options.length; index += 1) {\n const option = options[index];\n const key = `option-${index}-${option.value}`;\n matchFound = matchFound || option.value === value;\n optionArray.push(\n <button\n key={key}\n type=\"button\"\n value={index}\n className={classNames('cs-option-btn', {\n 'keyboard-active': keyboardOptionIndex === index && !inputFocused,\n })}\n onClick={this.handleOptionClick}\n onFocus={this.handleOptionFocus}\n >\n {option.value === value && (\n <FontAwesomeIcon icon={icon} className=\"mr-2\" />\n )}\n {option.value !== value && <span className=\"mr-4\" />}\n {option.title}\n </button>\n );\n }\n\n optionArray.push(<hr className=\"cs-divider\" key=\"option-divider\" />);\n\n optionArray.push(\n <button\n key=\"option-custom-label\"\n type=\"button\"\n value={CUSTOM_OPTION}\n className={classNames('cs-option-btn', {\n 'keyboard-active': inputFocused,\n })}\n onClick={this.handleOptionClick}\n onFocus={this.handleOptionFocus}\n >\n {!matchFound && value !== null ? (\n <FontAwesomeIcon icon={icon} className=\"mr-2\" />\n ) : (\n <span className=\"mr-4\" />\n )}\n {customText}\n </button>\n );\n\n optionArray.push(\n <div key=\"cs-custom-container\" className=\"cs-custom-container\">\n <span className=\"mr-2\" />\n <TimeInput\n key=\"option-input\"\n ref={this.input}\n onChange={this.handleCustomInput}\n value={customTime}\n onFocus={() => this.setState({ inputFocused: true })}\n onBlur={() => this.setState({ inputFocused: false })}\n />\n <span className=\"ml-2\" />\n </div>\n );\n\n optionArray.push(<hr key=\"option-end\" className=\"mb-2\" />);\n\n return optionArray;\n }\n\n render(): JSX.Element {\n const { disabled, invalid, value, 'data-testid': dataTestId } = this.props;\n const { menuIsOpen } = this.state;\n let { popperOptions } = this.props;\n popperOptions = {\n placement: 'bottom-end',\n modifiers: {\n preventOverflow: { enabled: false },\n },\n ...popperOptions,\n };\n\n return (\n <div\n className=\"input-group cs-container context-menu\"\n ref={this.csContainer}\n data-testid={dataTestId}\n >\n <div\n className={classNames('input-group-append cs-dropdown', {\n 'cs-dropdown-invalid': invalid,\n })}\n >\n <button\n type=\"button\"\n className={classNames('btn cs-btn form-control', {\n 'cs-btn-invalid': invalid,\n })}\n ref={this.button}\n onClick={this.toggleMenu}\n disabled={disabled}\n >\n <span\n className={classNames({\n 'text-muted': value === null,\n })}\n >\n {this.getSelectedText()}\n </span>\n <span className=\"cs-caret\" />\n <DropdownMenu\n isShown={menuIsOpen}\n actions={{ menuElement: this.renderMenuElement() }}\n popperOptions={popperOptions}\n popperClassName=\"CustomTimeSelect\"\n onMenuOpened={this.handleMenuOpened}\n onMenuClosed={this.handleMenuExited}\n menuStyle={{ maxWidth: '100rem' }}\n />\n </button>\n </div>\n </div>\n );\n }\n}\n\nexport default CustomTimeSelect;\n"],"mappings":"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"}
|
package/dist/DateInput.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateInput.js","names":["React","useCallback","useState","classNames","Log","MaskedInput","getNextSegmentValue","jsx","_jsx","log","module","DATE_PATTERN","EXAMPLES","DATE_FORMAT","DateInput","forwardRef","props","ref","className","onChange","undefined","defaultValue","onFocus","onBlur","dataTestId","value","setValue","selection","setSelection","handleChange","newValue","debug","children","example","onSelect","pattern","placeholder","displayName"],"sources":["../src/DateInput.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport MaskedInput, { type SelectionSegment } from './MaskedInput';\nimport { getNextSegmentValue } from './DateInputUtils';\n\nconst log = Log.module('DateInput');\n\nconst DATE_PATTERN = '[12][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])';\nconst EXAMPLES = ['2000-01-01', '2022-12-31'];\nconst DATE_FORMAT = 'YYYY-MM-DD';\n\ntype DateInputProps = {\n className?: string;\n onChange?: (date: string) => void;\n defaultValue?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n 'data-testid'?: string;\n};\n\nconst DateInput = React.forwardRef<HTMLInputElement, DateInputProps>(\n (props: DateInputProps, ref) => {\n const {\n className = '',\n onChange = () => undefined,\n defaultValue = '',\n onFocus = () => undefined,\n onBlur = () => undefined,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(defaultValue);\n const [selection, setSelection] = useState<SelectionSegment>();\n\n const handleChange = useCallback(\n (newValue: string): void => {\n log.debug('handleChange', newValue);\n setValue(newValue);\n onChange(newValue);\n },\n [onChange]\n );\n\n return (\n <div className=\"d-flex flex-row align-items-center\">\n <MaskedInput\n ref={ref}\n className={classNames(className)}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n onChange={handleChange}\n onSelect={setSelection}\n pattern={DATE_PATTERN}\n placeholder={DATE_FORMAT}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n </div>\n );\n }\n);\nDateInput.displayName = 'DateInput';\n\nexport default DateInput;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AACpD,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,WAAW;AAAA,SACTC,mBAAmB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAE5B,IAAMC,GAAG,GAAGL,GAAG,CAACM,MAAM,CAAC,WAAW,CAAC;AAEnC,IAAMC,YAAY,GAAG,yDAAyD;AAC9E,IAAMC,QAAQ,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC;AAC7C,IAAMC,WAAW,GAAG,YAAY;AAWhC,IAAMC,SAAS,gBAAGd,KAAK,CAACe,UAAU,CAChC,CAACC,KAAqB,EAAEC,GAAG,KAAK;EAC9B,IAAM;IACJC,SAAS,GAAG,EAAE;IACdC,QAAQ,GAAGA,CAAA,KAAMC,SAAS;IAC1BC,YAAY,GAAG,EAAE;IACjBC,OAAO,GAAGA,CAAA,KAAMF,SAAS;IACzBG,MAAM,GAAGA,CAAA,KAAMH,SAAS;IACxB,aAAa,EAAEI;EACjB,CAAC,GAAGR,KAAK;EACT,IAAM,CAACS,KAAK,EAAEC,QAAQ,CAAC,GAAGxB,QAAQ,CAACmB,YAAY,CAAC;EAChD,IAAM,CAACM,SAAS,EAAEC,YAAY,CAAC,GAAG1B,QAAQ,CAAmB,CAAC;EAE9D,IAAM2B,YAAY,GAAG5B,WAAW,CAC7B6B,QAAgB,IAAW;IAC1BrB,GAAG,CAACsB,KAAK,CAAC,cAAc,EAAED,QAAQ,CAAC;IACnCJ,QAAQ,CAACI,QAAQ,CAAC;IAClBX,QAAQ,CAACW,QAAQ,CAAC;EACpB,CAAC,EACD,CAACX,QAAQ,CACX,CAAC;EAED,oBACEX,IAAA;IAAKU,SAAS,EAAC,oCAAoC;IAAAc,QAAA,eACjDxB,IAAA,CAACH,WAAW;MACVY,GAAG,EAAEA,GAAI;MACTC,SAAS,EAAEf,UAAU,CAACe,SAAS,CAAE;MACjCe,OAAO,EAAErB,QAAS;MAClBN,mBAAmB,EAAEA,mBAAoB;MACzCa,QAAQ,EAAEU,YAAa;MACvBK,QAAQ,EAAEN,YAAa;MACvBO,OAAO,EAAExB,YAAa;MACtByB,WAAW,EAAEvB,WAAY;MACzBc,SAAS,EAAEA,SAAU;MACrBF,KAAK,EAAEA,KAAM;MACbH,OAAO,EAAEA,OAAQ;MACjBC,MAAM,EAAEA,MAAO;MACf,eAAaC;IAAW,CACzB;EAAC,CACC,CAAC;AAEV,CACF,CAAC;AACDV,SAAS,CAACuB,WAAW,GAAG,WAAW;AAEnC,eAAevB,SAAS"
|
|
1
|
+
{"version":3,"file":"DateInput.js","names":["React","useCallback","useState","classNames","Log","MaskedInput","getNextSegmentValue","jsx","_jsx","log","module","DATE_PATTERN","EXAMPLES","DATE_FORMAT","DateInput","forwardRef","props","ref","className","onChange","undefined","defaultValue","onFocus","onBlur","dataTestId","value","setValue","selection","setSelection","handleChange","newValue","debug","children","example","onSelect","pattern","placeholder","displayName"],"sources":["../src/DateInput.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport MaskedInput, { type SelectionSegment } from './MaskedInput';\nimport { getNextSegmentValue } from './DateInputUtils';\n\nconst log = Log.module('DateInput');\n\nconst DATE_PATTERN = '[12][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])';\nconst EXAMPLES = ['2000-01-01', '2022-12-31'];\nconst DATE_FORMAT = 'YYYY-MM-DD';\n\ntype DateInputProps = {\n className?: string;\n onChange?: (date: string) => void;\n defaultValue?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n 'data-testid'?: string;\n};\n\nconst DateInput = React.forwardRef<HTMLInputElement, DateInputProps>(\n (props: DateInputProps, ref) => {\n const {\n className = '',\n onChange = () => undefined,\n defaultValue = '',\n onFocus = () => undefined,\n onBlur = () => undefined,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(defaultValue);\n const [selection, setSelection] = useState<SelectionSegment>();\n\n const handleChange = useCallback(\n (newValue: string): void => {\n log.debug('handleChange', newValue);\n setValue(newValue);\n onChange(newValue);\n },\n [onChange]\n );\n\n return (\n <div className=\"d-flex flex-row align-items-center\">\n <MaskedInput\n ref={ref}\n className={classNames(className)}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n onChange={handleChange}\n onSelect={setSelection}\n pattern={DATE_PATTERN}\n placeholder={DATE_FORMAT}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n </div>\n );\n }\n);\nDateInput.displayName = 'DateInput';\n\nexport default DateInput;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AACpD,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,WAAW;AAAA,SACTC,mBAAmB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAE5B,IAAMC,GAAG,GAAGL,GAAG,CAACM,MAAM,CAAC,WAAW,CAAC;AAEnC,IAAMC,YAAY,GAAG,yDAAyD;AAC9E,IAAMC,QAAQ,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC;AAC7C,IAAMC,WAAW,GAAG,YAAY;AAWhC,IAAMC,SAAS,gBAAGd,KAAK,CAACe,UAAU,CAChC,CAACC,KAAqB,EAAEC,GAAG,KAAK;EAC9B,IAAM;IACJC,SAAS,GAAG,EAAE;IACdC,QAAQ,GAAGA,CAAA,KAAMC,SAAS;IAC1BC,YAAY,GAAG,EAAE;IACjBC,OAAO,GAAGA,CAAA,KAAMF,SAAS;IACzBG,MAAM,GAAGA,CAAA,KAAMH,SAAS;IACxB,aAAa,EAAEI;EACjB,CAAC,GAAGR,KAAK;EACT,IAAM,CAACS,KAAK,EAAEC,QAAQ,CAAC,GAAGxB,QAAQ,CAACmB,YAAY,CAAC;EAChD,IAAM,CAACM,SAAS,EAAEC,YAAY,CAAC,GAAG1B,QAAQ,CAAmB,CAAC;EAE9D,IAAM2B,YAAY,GAAG5B,WAAW,CAC7B6B,QAAgB,IAAW;IAC1BrB,GAAG,CAACsB,KAAK,CAAC,cAAc,EAAED,QAAQ,CAAC;IACnCJ,QAAQ,CAACI,QAAQ,CAAC;IAClBX,QAAQ,CAACW,QAAQ,CAAC;EACpB,CAAC,EACD,CAACX,QAAQ,CACX,CAAC;EAED,oBACEX,IAAA;IAAKU,SAAS,EAAC,oCAAoC;IAAAc,QAAA,eACjDxB,IAAA,CAACH,WAAW;MACVY,GAAG,EAAEA,GAAI;MACTC,SAAS,EAAEf,UAAU,CAACe,SAAS,CAAE;MACjCe,OAAO,EAAErB,QAAS;MAClBN,mBAAmB,EAAEA,mBAAoB;MACzCa,QAAQ,EAAEU,YAAa;MACvBK,QAAQ,EAAEN,YAAa;MACvBO,OAAO,EAAExB,YAAa;MACtByB,WAAW,EAAEvB,WAAY;MACzBc,SAAS,EAAEA,SAAU;MACrBF,KAAK,EAAEA,KAAM;MACbH,OAAO,EAAEA,OAAQ;MACjBC,MAAM,EAAEA,MAAO;MACf,eAAaC;IAAW,CACzB;EAAC,CACC,CAAC;AAEV,CACF,CAAC;AACDV,SAAS,CAACuB,WAAW,GAAG,WAAW;AAEnC,eAAevB,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateInputUtils.js","names":["getNextNumberSegmentValue","delta","segmentValue","lowerBound","upperBound","length","modValue","newSegmentValue","parseInt","concat","padStart","getNextSegmentValue","range","selectionStart"],"sources":["../src/DateInputUtils.ts"],"sourcesContent":["import { type SelectionSegment } from './MaskedInput';\n\nexport function getNextNumberSegmentValue(\n delta: number,\n segmentValue: string,\n lowerBound: number,\n upperBound: number,\n length: number\n): string {\n const modValue = upperBound - lowerBound + 1;\n const newSegmentValue =\n ((((parseInt(segmentValue, 10) - delta - lowerBound) % modValue) +\n modValue) %\n modValue) +\n lowerBound;\n return `${newSegmentValue}`.padStart(length, '0');\n}\n\nexport function getNextSegmentValue(\n range: SelectionSegment,\n delta: number,\n segmentValue: string\n): string {\n const { selectionStart } = range;\n if (selectionStart === 0) {\n return getNextNumberSegmentValue(delta, segmentValue, 1900, 2099, 4);\n }\n if (selectionStart === 5) {\n return getNextNumberSegmentValue(delta, segmentValue, 1, 12, 2);\n }\n if (selectionStart === 8) {\n return getNextNumberSegmentValue(delta, segmentValue, 1, 31, 2);\n }\n if (selectionStart === 11) {\n // Hours input\n return getNextNumberSegmentValue(delta, segmentValue, 0, 23, 2);\n }\n if (selectionStart === 17 || selectionStart === 14) {\n // Minutes/seconds input\n return getNextNumberSegmentValue(delta, segmentValue, 0, 59, 2);\n }\n if (selectionStart === 20 || selectionStart === 24 || selectionStart === 28) {\n // Milli, micro, and nanosecond input\n return getNextNumberSegmentValue(delta, segmentValue, 0, 999, 3);\n }\n\n return segmentValue;\n}\n"],"mappings":"AAEA,OAAO,SAASA,yBAAyBA,CACvCC,KAAa,EACbC,YAAoB,EACpBC,UAAkB,EAClBC,UAAkB,EAClBC,MAAc,EACN;EACR,IAAMC,QAAQ,GAAGF,UAAU,GAAGD,UAAU,GAAG,CAAC;EAC5C,IAAMI,eAAe,GAClB,CAAE,CAACC,QAAQ,CAACN,YAAY,EAAE,EAAE,CAAC,GAAGD,KAAK,GAAGE,UAAU,IAAIG,QAAQ,GAC7DA,QAAQ,IACRA,QAAQ,GACVH,UAAU;EACZ,OAAO,GAAAM,MAAA,CAAGF,eAAe,EAAGG,QAAQ,CAACL,MAAM,EAAE,GAAG,CAAC;AACnD;AAEA,OAAO,SAASM,mBAAmBA,CACjCC,KAAuB,EACvBX,KAAa,EACbC,YAAoB,EACZ;EACR,IAAM;IAAEW;EAAe,CAAC,GAAGD,KAAK;EAChC,IAAIC,cAAc,KAAK,CAAC,EAAE;IACxB,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;EACtE;EACA,IAAIW,cAAc,KAAK,CAAC,EAAE;IACxB,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;EACjE;EACA,IAAIW,cAAc,KAAK,CAAC,EAAE;IACxB,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;EACjE;EACA,IAAIW,cAAc,KAAK,EAAE,EAAE;IACzB;IACA,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;EACjE;EACA,IAAIW,cAAc,KAAK,EAAE,IAAIA,cAAc,KAAK,EAAE,EAAE;IAClD;IACA,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;EACjE;EACA,IAAIW,cAAc,KAAK,EAAE,IAAIA,cAAc,KAAK,EAAE,IAAIA,cAAc,KAAK,EAAE,EAAE;IAC3E;IACA,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;EAClE;EAEA,OAAOA,YAAY;AACrB"
|
|
1
|
+
{"version":3,"file":"DateInputUtils.js","names":["getNextNumberSegmentValue","delta","segmentValue","lowerBound","upperBound","length","modValue","newSegmentValue","parseInt","concat","padStart","getNextSegmentValue","range","selectionStart"],"sources":["../src/DateInputUtils.ts"],"sourcesContent":["import { type SelectionSegment } from './MaskedInput';\n\nexport function getNextNumberSegmentValue(\n delta: number,\n segmentValue: string,\n lowerBound: number,\n upperBound: number,\n length: number\n): string {\n const modValue = upperBound - lowerBound + 1;\n const newSegmentValue =\n ((((parseInt(segmentValue, 10) - delta - lowerBound) % modValue) +\n modValue) %\n modValue) +\n lowerBound;\n return `${newSegmentValue}`.padStart(length, '0');\n}\n\nexport function getNextSegmentValue(\n range: SelectionSegment,\n delta: number,\n segmentValue: string\n): string {\n const { selectionStart } = range;\n if (selectionStart === 0) {\n return getNextNumberSegmentValue(delta, segmentValue, 1900, 2099, 4);\n }\n if (selectionStart === 5) {\n return getNextNumberSegmentValue(delta, segmentValue, 1, 12, 2);\n }\n if (selectionStart === 8) {\n return getNextNumberSegmentValue(delta, segmentValue, 1, 31, 2);\n }\n if (selectionStart === 11) {\n // Hours input\n return getNextNumberSegmentValue(delta, segmentValue, 0, 23, 2);\n }\n if (selectionStart === 17 || selectionStart === 14) {\n // Minutes/seconds input\n return getNextNumberSegmentValue(delta, segmentValue, 0, 59, 2);\n }\n if (selectionStart === 20 || selectionStart === 24 || selectionStart === 28) {\n // Milli, micro, and nanosecond input\n return getNextNumberSegmentValue(delta, segmentValue, 0, 999, 3);\n }\n\n return segmentValue;\n}\n"],"mappings":"AAEA,OAAO,SAASA,yBAAyBA,CACvCC,KAAa,EACbC,YAAoB,EACpBC,UAAkB,EAClBC,UAAkB,EAClBC,MAAc,EACN;EACR,IAAMC,QAAQ,GAAGF,UAAU,GAAGD,UAAU,GAAG,CAAC;EAC5C,IAAMI,eAAe,GAClB,CAAE,CAACC,QAAQ,CAACN,YAAY,EAAE,EAAE,CAAC,GAAGD,KAAK,GAAGE,UAAU,IAAIG,QAAQ,GAC7DA,QAAQ,IACRA,QAAQ,GACVH,UAAU;EACZ,OAAO,GAAAM,MAAA,CAAGF,eAAe,EAAGG,QAAQ,CAACL,MAAM,EAAE,GAAG,CAAC;AACnD;AAEA,OAAO,SAASM,mBAAmBA,CACjCC,KAAuB,EACvBX,KAAa,EACbC,YAAoB,EACZ;EACR,IAAM;IAAEW;EAAe,CAAC,GAAGD,KAAK;EAChC,IAAIC,cAAc,KAAK,CAAC,EAAE;IACxB,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;EACtE;EACA,IAAIW,cAAc,KAAK,CAAC,EAAE;IACxB,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;EACjE;EACA,IAAIW,cAAc,KAAK,CAAC,EAAE;IACxB,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;EACjE;EACA,IAAIW,cAAc,KAAK,EAAE,EAAE;IACzB;IACA,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;EACjE;EACA,IAAIW,cAAc,KAAK,EAAE,IAAIA,cAAc,KAAK,EAAE,EAAE;IAClD;IACA,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;EACjE;EACA,IAAIW,cAAc,KAAK,EAAE,IAAIA,cAAc,KAAK,EAAE,IAAIA,cAAc,KAAK,EAAE,EAAE;IAC3E;IACA,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;EAClE;EAEA,OAAOA,YAAY;AACrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateTimeInput.js","names":["React","useCallback","useState","classNames","Log","MaskedInput","getNextSegmentValue","addSeparators","jsx","_jsx","log","module","DATE_PATTERN","TIME_PATTERN","FULL_DATE_PATTERN","concat","DATE_VALUE_STRING","DEFAULT_VALUE_STRING","FULL_DATE_FORMAT","fixIncompleteValue","value","length","substring","replace","removeSeparators","EXAMPLES","DateTimeInput","forwardRef","props","ref","className","onChange","undefined","defaultValue","onFocus","onBlur","onSubmit","dataTestId","setValue","selection","setSelection","handleChange","newValue","debug","handleBlur","prevValue","fixedValue","children","example","onSelect","pattern","placeholder","displayName","defaultProps"],"sources":["../src/DateTimeInput.tsx"],"sourcesContent":["import React, { type KeyboardEvent, useCallback, useState } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport MaskedInput, { type SelectionSegment } from './MaskedInput';\nimport { getNextSegmentValue } from './DateInputUtils';\nimport { addSeparators } from './DateTimeInputUtils';\n\nconst log = Log.module('DateTimeInput');\n\n// This could be more restrictive and restrict days to the number of days in the month...\n// But then gotta take leap year into account and everything.\nconst DATE_PATTERN = '[12][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])';\n// Put zero width spaces in the nanosecond part of the date to allow jumping between segments\nconst TIME_PATTERN =\n '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\\\\.[0-9]{3}\\u200B[0-9]{3}\\u200B[0-9]{3}';\nconst FULL_DATE_PATTERN = `${DATE_PATTERN} ${TIME_PATTERN}`;\nconst DATE_VALUE_STRING = '2022-01-01';\nconst DEFAULT_VALUE_STRING = `${DATE_VALUE_STRING} 00:00:00.000000000`;\nconst FULL_DATE_FORMAT = 'YYYY-MM-DD HH:MM:SS.SSSSSSSSS';\n\nexport type DateTimeInputProps = {\n className?: string;\n onChange?: (value: string) => void;\n defaultValue?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n onSubmit?: (event: KeyboardEvent<HTMLInputElement>) => void;\n 'data-testid'?: string;\n};\n\nfunction fixIncompleteValue(value: string): string {\n if (value != null && value.length >= DATE_VALUE_STRING.length) {\n return `${value.substring(0, DATE_VALUE_STRING.length)}${value\n .substring(DATE_VALUE_STRING.length)\n .replace(/\\u2007/g, '0')}${DEFAULT_VALUE_STRING.substring(value.length)}`;\n }\n return value;\n}\n\nfunction removeSeparators(value: string): string {\n return value.replace(/\\u200B/g, '');\n}\n\nconst EXAMPLES = [addSeparators(DEFAULT_VALUE_STRING)];\n\nexport const DateTimeInput = React.forwardRef<\n HTMLInputElement,\n DateTimeInputProps\n>((props, ref) => {\n const {\n className = '',\n onChange = () => undefined,\n defaultValue = '',\n onFocus = () => undefined,\n onBlur = () => undefined,\n onSubmit,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(\n defaultValue.length > 0 ? addSeparators(defaultValue) : ''\n );\n const [selection, setSelection] = useState<SelectionSegment>();\n\n const handleChange = useCallback(\n (newValue: string): void => {\n log.debug('handleChange', newValue);\n setValue(newValue);\n onChange(fixIncompleteValue(removeSeparators(newValue)));\n },\n [onChange]\n );\n\n const handleBlur = useCallback((): void => {\n const prevValue = removeSeparators(value);\n const fixedValue = fixIncompleteValue(prevValue);\n // Update the value displayed in the input\n // onChange with the fixed value already triggered in handleChange\n if (fixedValue !== prevValue) {\n setValue(addSeparators(fixedValue));\n }\n onBlur();\n }, [value, onBlur]);\n\n return (\n <div className=\"d-flex flex-row align-items-center\">\n <MaskedInput\n ref={ref}\n className={classNames(className)}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n onChange={handleChange}\n onSelect={setSelection}\n onSubmit={onSubmit}\n pattern={FULL_DATE_PATTERN}\n placeholder={FULL_DATE_FORMAT}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={handleBlur}\n data-testid={dataTestId}\n />\n </div>\n );\n});\n\nDateTimeInput.displayName = 'DateTimeInput';\n\nDateTimeInput.defaultProps = {\n className: '',\n onChange: () => undefined,\n defaultValue: '',\n onFocus: () => undefined,\n onBlur: () => undefined,\n 'data-testid': undefined,\n};\n\nexport default DateTimeInput;\n"],"mappings":"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"
|
|
1
|
+
{"version":3,"file":"DateTimeInput.js","names":["React","useCallback","useState","classNames","Log","MaskedInput","getNextSegmentValue","addSeparators","jsx","_jsx","log","module","DATE_PATTERN","TIME_PATTERN","FULL_DATE_PATTERN","concat","DATE_VALUE_STRING","DEFAULT_VALUE_STRING","FULL_DATE_FORMAT","fixIncompleteValue","value","length","substring","replace","removeSeparators","EXAMPLES","DateTimeInput","forwardRef","props","ref","className","onChange","undefined","defaultValue","onFocus","onBlur","onSubmit","dataTestId","setValue","selection","setSelection","handleChange","newValue","debug","handleBlur","prevValue","fixedValue","children","example","onSelect","pattern","placeholder","displayName","defaultProps"],"sources":["../src/DateTimeInput.tsx"],"sourcesContent":["import React, { type KeyboardEvent, useCallback, useState } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport MaskedInput, { type SelectionSegment } from './MaskedInput';\nimport { getNextSegmentValue } from './DateInputUtils';\nimport { addSeparators } from './DateTimeInputUtils';\n\nconst log = Log.module('DateTimeInput');\n\n// This could be more restrictive and restrict days to the number of days in the month...\n// But then gotta take leap year into account and everything.\nconst DATE_PATTERN = '[12][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])';\n// Put zero width spaces in the nanosecond part of the date to allow jumping between segments\nconst TIME_PATTERN =\n '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\\\\.[0-9]{3}\\u200B[0-9]{3}\\u200B[0-9]{3}';\nconst FULL_DATE_PATTERN = `${DATE_PATTERN} ${TIME_PATTERN}`;\nconst DATE_VALUE_STRING = '2022-01-01';\nconst DEFAULT_VALUE_STRING = `${DATE_VALUE_STRING} 00:00:00.000000000`;\nconst FULL_DATE_FORMAT = 'YYYY-MM-DD HH:MM:SS.SSSSSSSSS';\n\nexport type DateTimeInputProps = {\n className?: string;\n onChange?: (value: string) => void;\n defaultValue?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n onSubmit?: (event: KeyboardEvent<HTMLInputElement>) => void;\n 'data-testid'?: string;\n};\n\nfunction fixIncompleteValue(value: string): string {\n if (value != null && value.length >= DATE_VALUE_STRING.length) {\n return `${value.substring(0, DATE_VALUE_STRING.length)}${value\n .substring(DATE_VALUE_STRING.length)\n .replace(/\\u2007/g, '0')}${DEFAULT_VALUE_STRING.substring(value.length)}`;\n }\n return value;\n}\n\nfunction removeSeparators(value: string): string {\n return value.replace(/\\u200B/g, '');\n}\n\nconst EXAMPLES = [addSeparators(DEFAULT_VALUE_STRING)];\n\nexport const DateTimeInput = React.forwardRef<\n HTMLInputElement,\n DateTimeInputProps\n>((props, ref) => {\n const {\n className = '',\n onChange = () => undefined,\n defaultValue = '',\n onFocus = () => undefined,\n onBlur = () => undefined,\n onSubmit,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(\n defaultValue.length > 0 ? addSeparators(defaultValue) : ''\n );\n const [selection, setSelection] = useState<SelectionSegment>();\n\n const handleChange = useCallback(\n (newValue: string): void => {\n log.debug('handleChange', newValue);\n setValue(newValue);\n onChange(fixIncompleteValue(removeSeparators(newValue)));\n },\n [onChange]\n );\n\n const handleBlur = useCallback((): void => {\n const prevValue = removeSeparators(value);\n const fixedValue = fixIncompleteValue(prevValue);\n // Update the value displayed in the input\n // onChange with the fixed value already triggered in handleChange\n if (fixedValue !== prevValue) {\n setValue(addSeparators(fixedValue));\n }\n onBlur();\n }, [value, onBlur]);\n\n return (\n <div className=\"d-flex flex-row align-items-center\">\n <MaskedInput\n ref={ref}\n className={classNames(className)}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n onChange={handleChange}\n onSelect={setSelection}\n onSubmit={onSubmit}\n pattern={FULL_DATE_PATTERN}\n placeholder={FULL_DATE_FORMAT}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={handleBlur}\n data-testid={dataTestId}\n />\n </div>\n );\n});\n\nDateTimeInput.displayName = 'DateTimeInput';\n\nDateTimeInput.defaultProps = {\n className: '',\n onChange: () => undefined,\n defaultValue: '',\n onFocus: () => undefined,\n onBlur: () => undefined,\n 'data-testid': undefined,\n};\n\nexport default DateTimeInput;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateTimeInputUtils.js","names":["addSeparators","value","dateTimeMillis","substring","micros","nanos","filter","v","join"],"sources":["../src/DateTimeInputUtils.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\nexport function addSeparators(value: string): string {\n const dateTimeMillis = value.substring(0, 23);\n const micros = value.substring(23, 26);\n const nanos = value.substring(26);\n return [dateTimeMillis, micros, nanos].filter(v => v !== '').join('\\u200B');\n}\n"],"mappings":"AAAA;AACA,OAAO,SAASA,aAAaA,CAACC,KAAa,EAAU;EACnD,IAAMC,cAAc,GAAGD,KAAK,CAACE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;EAC7C,IAAMC,MAAM,GAAGH,KAAK,CAACE,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;EACtC,IAAME,KAAK,GAAGJ,KAAK,CAACE,SAAS,CAAC,EAAE,CAAC;EACjC,OAAO,CAACD,cAAc,EAAEE,MAAM,EAAEC,KAAK,CAAC,CAACC,MAAM,CAACC,CAAC,IAAIA,CAAC,KAAK,EAAE,CAAC,CAACC,IAAI,CAAC,QAAQ,CAAC;AAC7E"
|
|
1
|
+
{"version":3,"file":"DateTimeInputUtils.js","names":["addSeparators","value","dateTimeMillis","substring","micros","nanos","filter","v","join"],"sources":["../src/DateTimeInputUtils.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\nexport function addSeparators(value: string): string {\n const dateTimeMillis = value.substring(0, 23);\n const micros = value.substring(23, 26);\n const nanos = value.substring(26);\n return [dateTimeMillis, micros, nanos].filter(v => v !== '').join('\\u200B');\n}\n"],"mappings":"AAAA;AACA,OAAO,SAASA,aAAaA,CAACC,KAAa,EAAU;EACnD,IAAMC,cAAc,GAAGD,KAAK,CAACE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;EAC7C,IAAMC,MAAM,GAAGH,KAAK,CAACE,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;EACtC,IAAME,KAAK,GAAGJ,KAAK,CAACE,SAAS,CAAC,EAAE,CAAC;EACjC,OAAO,CAACD,cAAc,EAAEE,MAAM,EAAEC,KAAK,CAAC,CAACC,MAAM,CAACC,CAAC,IAAIA,CAAC,KAAK,EAAE,CAAC,CAACC,IAAI,CAAC,QAAQ,CAAC;AAC7E"}
|