@deephaven/dashboard-core-plugins 0.23.1-beta.2 → 0.23.1-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"Linker.d.ts","sourceRoot":"","sources":["../../src/linker/Linker.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Linker.d.ts","sourceRoot":"","sources":["../../src/linker/Linker.tsx"],"names":[],"mappings":"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"}
@@ -112,6 +112,7 @@ export class Linker extends Component {
112
112
  eventHub.on(PanelEvent.CLONED, this.handlePanelCloned);
113
113
  eventHub.on(InputFilterEvent.COLUMN_SELECTED, this.handleFilterColumnSelect);
114
114
  eventHub.on(InputFilterEvent.COLUMNS_CHANGED, this.handleColumnsChanged);
115
+ eventHub.on(PanelEvent.CLOSE, this.handlePanelClosed);
115
116
  eventHub.on(PanelEvent.CLOSED, this.handlePanelClosed);
116
117
  }
117
118
  stopListening(layout) {
@@ -126,6 +127,7 @@ export class Linker extends Component {
126
127
  eventHub.off(PanelEvent.CLONED, this.handlePanelCloned);
127
128
  eventHub.off(InputFilterEvent.COLUMN_SELECTED, this.handleFilterColumnSelect);
128
129
  eventHub.off(InputFilterEvent.COLUMNS_CHANGED, this.handleColumnsChanged);
130
+ eventHub.off(PanelEvent.CLOSE, this.handlePanelClosed);
129
131
  eventHub.off(PanelEvent.CLOSED, this.handlePanelClosed);
130
132
  }
131
133
  handleCancel() {
@@ -497,7 +499,7 @@ export class Linker extends Component {
497
499
  }
498
500
  }
499
501
  handlePanelClosed(panelId) {
500
- // Delete links on PanelEvent.CLOSED instead of UNMOUNT
502
+ // Delete links on PanelEvent.CLOSE and PanelEvent.CLOSED instead of UNMOUNT
501
503
  // because the panels can get unmounted on errors and we want to keep the links if that happens
502
504
  log.debug("Panel ".concat(panelId, " closed, deleting links."));
503
505
  this.deleteLinksForPanelId(panelId);
@@ -625,7 +627,7 @@ export class Linker extends Component {
625
627
  } = this.state;
626
628
  var isLinkOverlayShown = this.isOverlayShown();
627
629
  var disabled = linkInProgress != null && linkInProgress.start != null;
628
- var linkerOverlayMessage = isolatedLinkerPanelId === undefined ? 'Click a column source, then click a column target to create a filter link. Remove a filter link by clicking again to erase. Click done when finished.' : 'Create a link between the source column button and a table column by clicking on one, then the other. Remove the link by clicking it directly. Click done when finished.';
630
+ var linkerOverlayMessage = isolatedLinkerPanelId === undefined ? 'Click a column source, then click a column target to create a filter link. The filter comparison operator used by a selected link can be changed. Delete a filter link by clicking the delete button or with alt+click. Click done when finished.' : 'Create a link between the source column button and a table column by clicking on one, then the other. Delete a filter link by clicking the delete button or with alt+click. Click done when finished.';
629
631
  return /*#__PURE__*/React.createElement(CSSTransition, {
630
632
  in: isLinkOverlayShown,
631
633
  timeout: ThemeExport.transitionMs,
@@ -1 +1 @@
1
- {"version":3,"file":"Linker.js","names":["React","Component","connect","shortid","memoize","CSSTransition","ThemeExport","LayoutUtils","PanelEvent","DateTimeColumnFormatter","DateUtils","TableUtils","Log","Type","FilterType","getActiveTool","getTimeZone","setActiveTool","setActiveToolAction","getIsolatedLinkerPanelIdForDashboard","getLinksForDashboard","setDashboardLinks","setDashboardLinksAction","addDashboardLinks","addDashboardLinksAction","deleteDashboardLinks","deleteDashboardLinksAction","setDashboardIsolatedLinkerPanelId","setDashboardIsolatedLinkerPanelIdAction","setDashboardColumnSelectionValidator","setDashboardColumnSelectionValidatorAction","ToolType","ChartEvent","IrisGridEvent","InputFilterEvent","LinkerOverlayContent","LinkerUtils","isLinkablePanel","log","module","mapState","state","ownProps","activeTool","isolatedLinkerPanelId","localDashboardId","links","timeZone","connector","Linker","constructor","props","linkInProgress","isolateForPanelId","combinedLinks","start","push","undefined","filter","link","panelId","end","handleCancel","bind","handleDone","handlePanelCloned","handleFilterColumnSelect","handleColumnsChanged","handlePanelClosed","handleLayoutStateChanged","handleAllLinksDeleted","handleLinkDeleted","handleLinksUpdated","handleChartColumnSelect","handleGridColumnSelect","handleUpdateValues","handleStateChange","handleExited","handleLinkSelected","isColumnSelectionValid","selectedIds","Set","componentDidMount","layout","startListening","updateSelectionValidators","componentDidUpdate","prevProps","stopListening","componentDidCatch","error","info","componentWillUnmount","on","eventHub","COLUMN_SELECTED","DATA_SELECTED","STATE_CHANGED","CLONED","COLUMNS_CHANGED","CLOSED","off","DEFAULT","setState","panel","column","columnSelected","debug","isOverlayShown","getIdFromPanel","panelLinks","LINKER","length","columns","linksToDelete","findColumn","deleteLinks","isAlwaysEndPoint","overrideIsolatedLinkerPanelId","panelComponent","getComponentNameFromPanel","name","columnName","type","columnType","newLink","id","generate","isReversed","getLinkType","existingLinkPanelId","panelLinkEnd","operator","eq","addLinks","unsetFilterValueForLink","panelManager","endPanel","getOpenedPanelById","unsetFilterValue","setPanelFilterMap","filterMap","setFilterMap","clearAll","forEach","map","isolatedLinks","linkId","find","l","dataMap","panelFilterMap","Map","i","endPanelId","has","get","filterList","visibleIndex","startColumnIndex","isExpandable","isGrouped","value","text","isDateType","dateFilterFormatter","showTimeZone","showTSeparator","defaultDateTimeFormatString","FULL_DATE_FORMAT","format","set","cloneConfig","cloneId","linksToAdd","cloneLinksForPanel","deleteLinksForPanelId","newLinks","forceUpdate","updateLinkInProgressType","tableColumn","render","isLinkOverlayShown","disabled","linkerOverlayMessage","transitionMs","getCachedLinks"],"sources":["../../src/linker/Linker.tsx"],"sourcesContent":["import React, { Component, ErrorInfo } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport shortid from 'shortid';\nimport memoize from 'memoize-one';\nimport { CSSTransition } from 'react-transition-group';\nimport { ThemeExport } from '@deephaven/components';\nimport {\n LayoutUtils,\n PanelComponent,\n PanelEvent,\n PanelManager,\n} from '@deephaven/dashboard';\nimport type GoldenLayout from '@deephaven/golden-layout';\nimport {\n DateTimeColumnFormatter,\n DateUtils,\n RowDataMap,\n TableUtils,\n} from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { Type as FilterType } from '@deephaven/filters';\nimport {\n getActiveTool,\n getTimeZone,\n setActiveTool as setActiveToolAction,\n RootState,\n} from '@deephaven/redux';\nimport {\n getIsolatedLinkerPanelIdForDashboard,\n getLinksForDashboard,\n setDashboardLinks as setDashboardLinksAction,\n addDashboardLinks as addDashboardLinksAction,\n deleteDashboardLinks as deleteDashboardLinksAction,\n setDashboardIsolatedLinkerPanelId as setDashboardIsolatedLinkerPanelIdAction,\n setDashboardColumnSelectionValidator as setDashboardColumnSelectionValidatorAction,\n} from '../redux';\nimport ToolType from './ToolType';\nimport { ChartEvent, IrisGridEvent, InputFilterEvent } from '../events';\nimport LinkerOverlayContent from './LinkerOverlayContent';\nimport LinkerUtils, {\n isLinkablePanel,\n Link,\n LinkColumn,\n LinkFilterMap,\n LinkType,\n} from './LinkerUtils';\n\nconst log = Log.module('Linker');\n\ninterface StateProps {\n activeTool: string;\n isolatedLinkerPanelId?: string;\n links: Link[];\n timeZone: string;\n}\n\ninterface OwnProps {\n layout: GoldenLayout;\n panelManager: PanelManager;\n localDashboardId: string;\n}\n\nconst mapState = (state: RootState, ownProps: OwnProps): StateProps => ({\n activeTool: getActiveTool(state),\n isolatedLinkerPanelId: getIsolatedLinkerPanelIdForDashboard(\n state,\n ownProps.localDashboardId\n ),\n links: getLinksForDashboard(state, ownProps.localDashboardId),\n timeZone: getTimeZone(state),\n});\n\nconst connector = connect(mapState, {\n setActiveTool: setActiveToolAction,\n setDashboardLinks: setDashboardLinksAction,\n addDashboardLinks: addDashboardLinksAction,\n deleteDashboardLinks: deleteDashboardLinksAction,\n setDashboardIsolatedLinkerPanelId: setDashboardIsolatedLinkerPanelIdAction,\n setDashboardColumnSelectionValidator: setDashboardColumnSelectionValidatorAction,\n});\n\nexport type LinkerProps = OwnProps &\n StateProps &\n ConnectedProps<typeof connector>;\n\nexport type LinkerState = {\n linkInProgress?: Link;\n selectedIds: Set<string>;\n};\n\nexport class Linker extends Component<LinkerProps, LinkerState> {\n constructor(props: LinkerProps) {\n super(props);\n\n this.handleCancel = this.handleCancel.bind(this);\n this.handleDone = this.handleDone.bind(this);\n this.handlePanelCloned = this.handlePanelCloned.bind(this);\n this.handleFilterColumnSelect = this.handleFilterColumnSelect.bind(this);\n this.handleColumnsChanged = this.handleColumnsChanged.bind(this);\n this.handlePanelClosed = this.handlePanelClosed.bind(this);\n this.handleLayoutStateChanged = this.handleLayoutStateChanged.bind(this);\n this.handleAllLinksDeleted = this.handleAllLinksDeleted.bind(this);\n this.handleLinkDeleted = this.handleLinkDeleted.bind(this);\n this.handleLinksUpdated = this.handleLinksUpdated.bind(this);\n this.handleChartColumnSelect = this.handleChartColumnSelect.bind(this);\n this.handleGridColumnSelect = this.handleGridColumnSelect.bind(this);\n this.handleUpdateValues = this.handleUpdateValues.bind(this);\n this.handleStateChange = this.handleStateChange.bind(this);\n this.handleExited = this.handleExited.bind(this);\n this.handleLinkSelected = this.handleLinkSelected.bind(this);\n this.isColumnSelectionValid = this.isColumnSelectionValid.bind(this);\n\n this.state = { linkInProgress: undefined, selectedIds: new Set<string>() };\n }\n\n componentDidMount(): void {\n const { layout } = this.props;\n this.startListening(layout);\n this.updateSelectionValidators();\n }\n\n componentDidUpdate(prevProps: LinkerProps): void {\n const { activeTool, layout } = this.props;\n if (layout !== prevProps.layout) {\n this.stopListening(prevProps.layout);\n this.startListening(layout);\n }\n if (activeTool !== prevProps.activeTool) {\n this.updateSelectionValidators();\n }\n }\n\n componentDidCatch(error: Error, info: ErrorInfo): void {\n log.error('componentDidCatch', error, info);\n }\n\n componentWillUnmount(): void {\n const { layout } = this.props;\n this.stopListening(layout);\n }\n\n startListening(layout: GoldenLayout): void {\n layout.on('stateChanged', this.handleLayoutStateChanged);\n\n const { eventHub } = layout;\n eventHub.on(IrisGridEvent.COLUMN_SELECTED, this.handleGridColumnSelect);\n eventHub.on(IrisGridEvent.DATA_SELECTED, this.handleUpdateValues);\n eventHub.on(IrisGridEvent.STATE_CHANGED, this.handleStateChange);\n eventHub.on(ChartEvent.COLUMN_SELECTED, this.handleChartColumnSelect);\n eventHub.on(PanelEvent.CLONED, this.handlePanelCloned);\n eventHub.on(\n InputFilterEvent.COLUMN_SELECTED,\n this.handleFilterColumnSelect\n );\n eventHub.on(InputFilterEvent.COLUMNS_CHANGED, this.handleColumnsChanged);\n eventHub.on(PanelEvent.CLOSED, this.handlePanelClosed);\n }\n\n stopListening(layout: GoldenLayout): void {\n layout.off('stateChanged', this.handleLayoutStateChanged);\n\n const { eventHub } = layout;\n eventHub.off(IrisGridEvent.COLUMN_SELECTED, this.handleGridColumnSelect);\n eventHub.off(IrisGridEvent.DATA_SELECTED, this.handleUpdateValues);\n eventHub.off(IrisGridEvent.STATE_CHANGED, this.handleStateChange);\n eventHub.off(ChartEvent.COLUMN_SELECTED, this.handleChartColumnSelect);\n eventHub.off(PanelEvent.CLONED, this.handlePanelCloned);\n eventHub.off(\n InputFilterEvent.COLUMN_SELECTED,\n this.handleFilterColumnSelect\n );\n eventHub.off(InputFilterEvent.COLUMNS_CHANGED, this.handleColumnsChanged);\n eventHub.off(PanelEvent.CLOSED, this.handlePanelClosed);\n }\n\n handleCancel(): void {\n const { linkInProgress } = this.state;\n if (linkInProgress == null) {\n const { setActiveTool } = this.props;\n setActiveTool(ToolType.DEFAULT);\n }\n this.setState({ linkInProgress: undefined });\n }\n\n handleDone(): void {\n const { setActiveTool } = this.props;\n setActiveTool(ToolType.DEFAULT);\n this.setState({\n linkInProgress: undefined,\n selectedIds: new Set<string>(),\n });\n }\n\n handleChartColumnSelect(panel: PanelComponent, column: LinkColumn): void {\n this.columnSelected(panel, column, true);\n }\n\n handleFilterColumnSelect(panel: PanelComponent, column: LinkColumn): void {\n log.debug('handleFilterColumnSelect', this.isOverlayShown());\n const {\n links,\n localDashboardId,\n setActiveTool,\n setDashboardIsolatedLinkerPanelId,\n } = this.props;\n\n const panelId = LayoutUtils.getIdFromPanel(panel);\n const panelLinks = links.filter(\n link => link.start?.panelId === panelId || link.end?.panelId === panelId\n );\n\n if (!this.isOverlayShown() && panelId != null) {\n // Initial click on the filter source button with linker inactive\n // Show linker in isolated mode for panel\n setActiveTool(ToolType.LINKER);\n setDashboardIsolatedLinkerPanelId(localDashboardId, panelId);\n\n if (panelLinks.length === 0) {\n // Source not linked - start new link in isolated linker mode\n // Need to pass panelId for overrideIsolatedLinkerPanelId\n // as redux prop update at this point not yet propagated\n this.columnSelected(panel, column, true, panelId);\n }\n return;\n }\n\n // Filter source clicked with linker active\n this.columnSelected(panel, column, true);\n }\n\n handleColumnsChanged(panel: PanelComponent, columns: LinkColumn[]): void {\n log.debug('handleColumnsChanged', panel, columns);\n const { links } = this.props;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n log.error('Invalid panelId', panel);\n return;\n }\n // Delete links that start or end on non-existent column in the updated panel\n const linksToDelete = links.filter(\n ({ start, end }) =>\n (start.panelId === panelId &&\n LinkerUtils.findColumn(columns, start) == null) ||\n (end != null &&\n end.panelId === panelId &&\n LinkerUtils.findColumn(columns, end) == null)\n );\n this.deleteLinks(linksToDelete);\n }\n\n handleGridColumnSelect(panel: PanelComponent, column: LinkColumn): void {\n this.columnSelected(panel, column);\n }\n\n /**\n * Track a column selection and build the link from it.\n * @param panel The panel component that is the source for the column selection\n * @param column The column that was selected\n * @param isAlwaysEndPoint True if the selection is always the end point, even if it's the first column selected. Defaults to false.\n * @param overrideIsolatedLinkerPanelId isolatedLinkerPanelId to use when method is called before prop changes propagate\n */\n columnSelected(\n panel: PanelComponent,\n column: LinkColumn,\n isAlwaysEndPoint = false,\n overrideIsolatedLinkerPanelId?: string | string[]\n ): void {\n if (overrideIsolatedLinkerPanelId === undefined && !this.isOverlayShown()) {\n return;\n }\n const { isolatedLinkerPanelId } = this.props;\n const { linkInProgress } = this.state;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n return;\n }\n const panelComponent = LayoutUtils.getComponentNameFromPanel(panel);\n const { name: columnName, type: columnType } = column;\n if (linkInProgress == null || linkInProgress.start == null) {\n const newLink: Link = {\n id: shortid.generate(),\n start: {\n panelId,\n panelComponent,\n columnName,\n columnType,\n },\n // Link starts with type Invalid as linking a source to itself is not allowed\n type: 'invalid',\n isReversed: isAlwaysEndPoint,\n };\n\n log.debug('starting link', newLink);\n\n this.setState({ linkInProgress: newLink });\n } else {\n const { links } = this.props;\n const { start, id, isReversed } = linkInProgress;\n const end = {\n panelId,\n panelComponent,\n columnName,\n columnType,\n };\n\n const type = LinkerUtils.getLinkType(\n isReversed !== undefined && isReversed ? end : start,\n isReversed !== undefined && isReversed ? start : end,\n overrideIsolatedLinkerPanelId ?? isolatedLinkerPanelId\n );\n\n switch (type) {\n case 'invalid':\n log.debug('Ignore invalid link connection', linkInProgress, end);\n return;\n case 'filterSource': {\n // filterSource links have a limit of 1 link per target\n // New link validation passed, delete existing links before adding the new one\n const existingLinkPanelId =\n isReversed !== undefined && isReversed\n ? start.panelId\n : end.panelId;\n // In cases with multiple targets per panel (i.e. chart filters)\n // links would have to be filtered by panelId and columnName and columnType\n const linksToDelete = links.filter(\n ({ end: panelLinkEnd }) =>\n panelLinkEnd?.panelId === existingLinkPanelId\n );\n this.deleteLinks(linksToDelete);\n break;\n }\n case 'tableLink':\n // No-op\n break;\n }\n\n // Create a completed link from link in progress\n const newLink: Link = {\n start: isReversed !== undefined && isReversed ? end : start,\n end: isReversed !== undefined && isReversed ? start : end,\n id,\n type,\n operator: FilterType.eq,\n };\n log.info('creating link', newLink);\n\n this.setState(\n { linkInProgress: undefined, selectedIds: new Set<string>([id]) },\n () => {\n // Adding link after updating state\n // otherwise both new link and linkInProgress could be rendered at the same time\n // resulting in \"multiple children with same key\" error\n this.addLinks([newLink]);\n }\n );\n }\n }\n\n unsetFilterValueForLink(link: Link): void {\n const { panelManager } = this.props;\n if (link.end) {\n const { end } = link;\n const { panelId, columnName, columnType } = end;\n const endPanel = panelManager.getOpenedPanelById(panelId);\n if (!endPanel) {\n log.debug(\n 'endPanel no longer exists, ignoring unsetFilterValue',\n panelId\n );\n } else if (isLinkablePanel(endPanel)) {\n endPanel.unsetFilterValue(columnName, columnType);\n } else {\n log.debug('endPanel.unsetFilterValue not implemented', endPanel);\n }\n }\n }\n\n /**\n * Set filters for a given panel ID\n * @param panelId ID of panel to set filters on\n * @param filterMap Map of column name to column type, text, and value\n */\n setPanelFilterMap(panelId: string, filterMap: LinkFilterMap): void {\n log.debug('Set filter data for panel:', panelId, filterMap);\n const { panelManager } = this.props;\n const panel = panelManager.getOpenedPanelById(panelId);\n if (!panel) {\n log.debug('panel no longer exists, ignoring setFilterMap', panelId);\n } else if (isLinkablePanel(panel)) {\n panel.setFilterMap(filterMap);\n } else {\n log.debug('panel.setFilterMap not implemented', panelId, panel);\n }\n }\n\n addLinks(links: Link[]): void {\n const { addDashboardLinks, localDashboardId } = this.props;\n addDashboardLinks(localDashboardId, links);\n }\n\n deleteLinks(links: Link[], clearAll = false): void {\n const { localDashboardId } = this.props;\n links.forEach(link => this.unsetFilterValueForLink(link));\n if (clearAll) {\n const { setDashboardLinks } = this.props;\n setDashboardLinks(localDashboardId, []);\n } else if (links.length > 0) {\n const { deleteDashboardLinks } = this.props;\n deleteDashboardLinks(\n localDashboardId,\n links.map(({ id }) => id)\n );\n }\n }\n\n handleAllLinksDeleted(): void {\n const { links, isolatedLinkerPanelId } = this.props;\n if (isolatedLinkerPanelId === undefined) {\n this.deleteLinks(links, true);\n } else {\n const isolatedLinks = links.filter(\n link =>\n link?.start?.panelId === isolatedLinkerPanelId ||\n link?.end?.panelId === isolatedLinkerPanelId\n );\n this.deleteLinks(isolatedLinks);\n }\n this.setState({ linkInProgress: undefined });\n }\n\n handleLinkDeleted(linkId: string): void {\n const { links } = this.props;\n const link = links.find(l => l.id === linkId);\n if (link) {\n this.deleteLinks([link]);\n } else {\n log.error('Unable to find link to delete', linkId);\n }\n }\n\n handleUpdateValues(panel: PanelComponent, dataMap: RowDataMap): void {\n const panelId = LayoutUtils.getIdFromPanel(panel);\n const { links, timeZone } = this.props;\n // Map of panel ID to filterMap\n const panelFilterMap = new Map();\n // Instead of setting filters one by one for each link,\n // combine them so they could be set in a single call per target panel\n for (let i = 0; i < links.length; i += 1) {\n const { start, end, operator } = links[i];\n if (start.panelId === panelId && end != null) {\n const { panelId: endPanelId, columnName, columnType } = end;\n // Map of column name to column type and filter value\n const filterMap = panelFilterMap.has(endPanelId)\n ? panelFilterMap.get(endPanelId)\n : new Map();\n const filterList =\n filterMap.has(columnName) === true\n ? filterMap.get(columnName).filterList\n : [];\n const {\n visibleIndex: startColumnIndex,\n isExpandable,\n isGrouped,\n } = dataMap[start.columnName];\n let { value } = dataMap[start.columnName];\n let text = `${value}`;\n if (value === null && isExpandable && isGrouped) {\n // Clear filter on empty rollup grouping columns\n value = undefined;\n }\n if (columnType != null && TableUtils.isDateType(columnType)) {\n const dateFilterFormatter = new DateTimeColumnFormatter({\n timeZone,\n showTimeZone: false,\n showTSeparator: true,\n defaultDateTimeFormatString: DateUtils.FULL_DATE_FORMAT,\n });\n // The values are Dates for dateType values, not string like everything else\n text = dateFilterFormatter.format(value as Date);\n }\n const filter = { operator, text, value, startColumnIndex };\n filterList.push(filter);\n filterMap.set(columnName, {\n columnType,\n filterList,\n });\n panelFilterMap.set(endPanelId, filterMap);\n }\n }\n\n // Apply combined filters to all target panels\n panelFilterMap.forEach((filterMap, endPanelId) => {\n this.setPanelFilterMap(endPanelId, filterMap);\n });\n }\n\n handlePanelCloned(panel: PanelComponent, cloneConfig: { id: string }): void {\n const { links } = this.props;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n const cloneId = cloneConfig.id;\n if (panelId != null) {\n const linksToAdd = LinkerUtils.cloneLinksForPanel(\n links,\n panelId,\n cloneId\n );\n this.addLinks(linksToAdd);\n }\n }\n\n handlePanelClosed(panelId: string): void {\n // Delete links on PanelEvent.CLOSED instead of UNMOUNT\n // because the panels can get unmounted on errors and we want to keep the links if that happens\n log.debug(`Panel ${panelId} closed, deleting links.`);\n this.deleteLinksForPanelId(panelId);\n }\n\n handleLinkSelected(linkId: string): void {\n this.setState({ selectedIds: new Set<string>([linkId]) });\n }\n\n handleLinksUpdated(newLinks: Link[]): void {\n const { localDashboardId, setDashboardLinks } = this.props;\n setDashboardLinks(localDashboardId, newLinks);\n }\n\n handleLayoutStateChanged(): void {\n this.forceUpdate();\n }\n\n handleStateChange(): void {\n this.forceUpdate();\n }\n\n handleExited(): void {\n // Has to be done after linker exit animation to avoid flashing non-isolated links\n const { localDashboardId, setDashboardIsolatedLinkerPanelId } = this.props;\n setDashboardIsolatedLinkerPanelId(localDashboardId, undefined);\n }\n\n /**\n * Delete all links for a provided panel ID. Needs to be done whenever a panel is closed or unmounted.\n * @param panelId The panel ID to delete links for\n */\n deleteLinksForPanelId(panelId: string): void {\n const { links } = this.props;\n for (let i = 0; i < links.length; i += 1) {\n const link = links[i];\n const { start, end, id } = link;\n if (start.panelId === panelId || end?.panelId === panelId) {\n this.handleLinkDeleted(id);\n }\n }\n }\n\n getCachedLinks = memoize(\n (\n links: Link[],\n linkInProgress: Link | undefined,\n isolateForPanelId: string | undefined\n ) => {\n const combinedLinks = [...links];\n\n if (linkInProgress != null && linkInProgress.start != null) {\n combinedLinks.push(linkInProgress);\n }\n\n if (isolateForPanelId !== undefined) {\n return combinedLinks.filter(\n link =>\n link?.start?.panelId === isolateForPanelId ||\n link?.end?.panelId === isolateForPanelId ||\n link?.end == null\n );\n }\n // Show all links in regular linker mode -- both isolated and not\n return combinedLinks;\n }\n );\n\n isOverlayShown(): boolean {\n const { activeTool } = this.props;\n return activeTool === ToolType.LINKER;\n }\n\n updateSelectionValidators(): void {\n const {\n activeTool,\n setDashboardColumnSelectionValidator,\n localDashboardId,\n } = this.props;\n switch (activeTool) {\n case ToolType.LINKER:\n setDashboardColumnSelectionValidator(\n localDashboardId,\n this.isColumnSelectionValid\n );\n break;\n default:\n setDashboardColumnSelectionValidator(localDashboardId, undefined);\n break;\n }\n }\n\n updateLinkInProgressType(\n linkInProgress: Link,\n type: LinkType = 'invalid'\n ): void {\n this.setState({\n linkInProgress: {\n ...linkInProgress,\n type,\n },\n });\n }\n\n isColumnSelectionValid(\n panel: PanelComponent,\n tableColumn?: LinkColumn\n ): boolean {\n const { linkInProgress } = this.state;\n const { isolatedLinkerPanelId } = this.props;\n\n // Link not started yet - no need to update type\n if (linkInProgress?.start == null) {\n return true;\n }\n\n if (tableColumn == null) {\n // Link started, end point is not a valid target\n this.updateLinkInProgressType(linkInProgress);\n return false;\n }\n\n const { isReversed, start } = linkInProgress;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n return false;\n }\n\n const end = {\n panelId,\n panelComponent: LayoutUtils.getComponentNameFromPanel(panel),\n columnName: tableColumn.name,\n columnType: tableColumn.type,\n };\n\n const type =\n isReversed !== undefined && isReversed\n ? LinkerUtils.getLinkType(end, start, isolatedLinkerPanelId)\n : LinkerUtils.getLinkType(start, end, isolatedLinkerPanelId);\n\n this.updateLinkInProgressType(linkInProgress, type);\n\n return type !== 'invalid';\n }\n\n render(): JSX.Element {\n const { links, isolatedLinkerPanelId, panelManager } = this.props;\n const { linkInProgress, selectedIds } = this.state;\n\n const isLinkOverlayShown = this.isOverlayShown();\n const disabled = linkInProgress != null && linkInProgress.start != null;\n const linkerOverlayMessage =\n isolatedLinkerPanelId === undefined\n ? 'Click a column source, then click a column target to create a filter link. Remove a filter link by clicking again to erase. Click done when finished.'\n : 'Create a link between the source column button and a table column by clicking on one, then the other. Remove the link by clicking it directly. Click done when finished.';\n\n return (\n <CSSTransition\n in={isLinkOverlayShown}\n timeout={ThemeExport.transitionMs}\n classNames=\"fade\"\n mountOnEnter\n unmountOnExit\n onExited={this.handleExited}\n >\n <LinkerOverlayContent\n disabled={disabled}\n panelManager={panelManager}\n links={this.getCachedLinks(\n links,\n linkInProgress,\n isolatedLinkerPanelId\n )}\n selectedIds={selectedIds}\n messageText={linkerOverlayMessage}\n onLinkSelected={this.handleLinkSelected}\n onLinkDeleted={this.handleLinkDeleted}\n onAllLinksDeleted={this.handleAllLinksDeleted}\n onLinksUpdated={this.handleLinksUpdated}\n onDone={this.handleDone}\n onCancel={this.handleCancel}\n />\n </CSSTransition>\n );\n }\n}\n\nexport default connector(Linker);\n"],"mappings":"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"}
1
+ {"version":3,"file":"Linker.js","names":["React","Component","connect","shortid","memoize","CSSTransition","ThemeExport","LayoutUtils","PanelEvent","DateTimeColumnFormatter","DateUtils","TableUtils","Log","Type","FilterType","getActiveTool","getTimeZone","setActiveTool","setActiveToolAction","getIsolatedLinkerPanelIdForDashboard","getLinksForDashboard","setDashboardLinks","setDashboardLinksAction","addDashboardLinks","addDashboardLinksAction","deleteDashboardLinks","deleteDashboardLinksAction","setDashboardIsolatedLinkerPanelId","setDashboardIsolatedLinkerPanelIdAction","setDashboardColumnSelectionValidator","setDashboardColumnSelectionValidatorAction","ToolType","ChartEvent","IrisGridEvent","InputFilterEvent","LinkerOverlayContent","LinkerUtils","isLinkablePanel","log","module","mapState","state","ownProps","activeTool","isolatedLinkerPanelId","localDashboardId","links","timeZone","connector","Linker","constructor","props","linkInProgress","isolateForPanelId","combinedLinks","start","push","undefined","filter","link","panelId","end","handleCancel","bind","handleDone","handlePanelCloned","handleFilterColumnSelect","handleColumnsChanged","handlePanelClosed","handleLayoutStateChanged","handleAllLinksDeleted","handleLinkDeleted","handleLinksUpdated","handleChartColumnSelect","handleGridColumnSelect","handleUpdateValues","handleStateChange","handleExited","handleLinkSelected","isColumnSelectionValid","selectedIds","Set","componentDidMount","layout","startListening","updateSelectionValidators","componentDidUpdate","prevProps","stopListening","componentDidCatch","error","info","componentWillUnmount","on","eventHub","COLUMN_SELECTED","DATA_SELECTED","STATE_CHANGED","CLONED","COLUMNS_CHANGED","CLOSE","CLOSED","off","DEFAULT","setState","panel","column","columnSelected","debug","isOverlayShown","getIdFromPanel","panelLinks","LINKER","length","columns","linksToDelete","findColumn","deleteLinks","isAlwaysEndPoint","overrideIsolatedLinkerPanelId","panelComponent","getComponentNameFromPanel","name","columnName","type","columnType","newLink","id","generate","isReversed","getLinkType","existingLinkPanelId","panelLinkEnd","operator","eq","addLinks","unsetFilterValueForLink","panelManager","endPanel","getOpenedPanelById","unsetFilterValue","setPanelFilterMap","filterMap","setFilterMap","clearAll","forEach","map","isolatedLinks","linkId","find","l","dataMap","panelFilterMap","Map","i","endPanelId","has","get","filterList","visibleIndex","startColumnIndex","isExpandable","isGrouped","value","text","isDateType","dateFilterFormatter","showTimeZone","showTSeparator","defaultDateTimeFormatString","FULL_DATE_FORMAT","format","set","cloneConfig","cloneId","linksToAdd","cloneLinksForPanel","deleteLinksForPanelId","newLinks","forceUpdate","updateLinkInProgressType","tableColumn","render","isLinkOverlayShown","disabled","linkerOverlayMessage","transitionMs","getCachedLinks"],"sources":["../../src/linker/Linker.tsx"],"sourcesContent":["import React, { Component, ErrorInfo } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport shortid from 'shortid';\nimport memoize from 'memoize-one';\nimport { CSSTransition } from 'react-transition-group';\nimport { ThemeExport } from '@deephaven/components';\nimport {\n LayoutUtils,\n PanelComponent,\n PanelEvent,\n PanelManager,\n} from '@deephaven/dashboard';\nimport type GoldenLayout from '@deephaven/golden-layout';\nimport {\n DateTimeColumnFormatter,\n DateUtils,\n RowDataMap,\n TableUtils,\n} from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { Type as FilterType } from '@deephaven/filters';\nimport {\n getActiveTool,\n getTimeZone,\n setActiveTool as setActiveToolAction,\n RootState,\n} from '@deephaven/redux';\nimport {\n getIsolatedLinkerPanelIdForDashboard,\n getLinksForDashboard,\n setDashboardLinks as setDashboardLinksAction,\n addDashboardLinks as addDashboardLinksAction,\n deleteDashboardLinks as deleteDashboardLinksAction,\n setDashboardIsolatedLinkerPanelId as setDashboardIsolatedLinkerPanelIdAction,\n setDashboardColumnSelectionValidator as setDashboardColumnSelectionValidatorAction,\n} from '../redux';\nimport ToolType from './ToolType';\nimport { ChartEvent, IrisGridEvent, InputFilterEvent } from '../events';\nimport LinkerOverlayContent from './LinkerOverlayContent';\nimport LinkerUtils, {\n isLinkablePanel,\n Link,\n LinkColumn,\n LinkFilterMap,\n LinkType,\n} from './LinkerUtils';\n\nconst log = Log.module('Linker');\n\ninterface StateProps {\n activeTool: string;\n isolatedLinkerPanelId?: string;\n links: Link[];\n timeZone: string;\n}\n\ninterface OwnProps {\n layout: GoldenLayout;\n panelManager: PanelManager;\n localDashboardId: string;\n}\n\nconst mapState = (state: RootState, ownProps: OwnProps): StateProps => ({\n activeTool: getActiveTool(state),\n isolatedLinkerPanelId: getIsolatedLinkerPanelIdForDashboard(\n state,\n ownProps.localDashboardId\n ),\n links: getLinksForDashboard(state, ownProps.localDashboardId),\n timeZone: getTimeZone(state),\n});\n\nconst connector = connect(mapState, {\n setActiveTool: setActiveToolAction,\n setDashboardLinks: setDashboardLinksAction,\n addDashboardLinks: addDashboardLinksAction,\n deleteDashboardLinks: deleteDashboardLinksAction,\n setDashboardIsolatedLinkerPanelId: setDashboardIsolatedLinkerPanelIdAction,\n setDashboardColumnSelectionValidator: setDashboardColumnSelectionValidatorAction,\n});\n\nexport type LinkerProps = OwnProps &\n StateProps &\n ConnectedProps<typeof connector>;\n\nexport type LinkerState = {\n linkInProgress?: Link;\n selectedIds: Set<string>;\n};\n\nexport class Linker extends Component<LinkerProps, LinkerState> {\n constructor(props: LinkerProps) {\n super(props);\n\n this.handleCancel = this.handleCancel.bind(this);\n this.handleDone = this.handleDone.bind(this);\n this.handlePanelCloned = this.handlePanelCloned.bind(this);\n this.handleFilterColumnSelect = this.handleFilterColumnSelect.bind(this);\n this.handleColumnsChanged = this.handleColumnsChanged.bind(this);\n this.handlePanelClosed = this.handlePanelClosed.bind(this);\n this.handleLayoutStateChanged = this.handleLayoutStateChanged.bind(this);\n this.handleAllLinksDeleted = this.handleAllLinksDeleted.bind(this);\n this.handleLinkDeleted = this.handleLinkDeleted.bind(this);\n this.handleLinksUpdated = this.handleLinksUpdated.bind(this);\n this.handleChartColumnSelect = this.handleChartColumnSelect.bind(this);\n this.handleGridColumnSelect = this.handleGridColumnSelect.bind(this);\n this.handleUpdateValues = this.handleUpdateValues.bind(this);\n this.handleStateChange = this.handleStateChange.bind(this);\n this.handleExited = this.handleExited.bind(this);\n this.handleLinkSelected = this.handleLinkSelected.bind(this);\n this.isColumnSelectionValid = this.isColumnSelectionValid.bind(this);\n\n this.state = { linkInProgress: undefined, selectedIds: new Set<string>() };\n }\n\n componentDidMount(): void {\n const { layout } = this.props;\n this.startListening(layout);\n this.updateSelectionValidators();\n }\n\n componentDidUpdate(prevProps: LinkerProps): void {\n const { activeTool, layout } = this.props;\n if (layout !== prevProps.layout) {\n this.stopListening(prevProps.layout);\n this.startListening(layout);\n }\n if (activeTool !== prevProps.activeTool) {\n this.updateSelectionValidators();\n }\n }\n\n componentDidCatch(error: Error, info: ErrorInfo): void {\n log.error('componentDidCatch', error, info);\n }\n\n componentWillUnmount(): void {\n const { layout } = this.props;\n this.stopListening(layout);\n }\n\n startListening(layout: GoldenLayout): void {\n layout.on('stateChanged', this.handleLayoutStateChanged);\n\n const { eventHub } = layout;\n eventHub.on(IrisGridEvent.COLUMN_SELECTED, this.handleGridColumnSelect);\n eventHub.on(IrisGridEvent.DATA_SELECTED, this.handleUpdateValues);\n eventHub.on(IrisGridEvent.STATE_CHANGED, this.handleStateChange);\n eventHub.on(ChartEvent.COLUMN_SELECTED, this.handleChartColumnSelect);\n eventHub.on(PanelEvent.CLONED, this.handlePanelCloned);\n eventHub.on(\n InputFilterEvent.COLUMN_SELECTED,\n this.handleFilterColumnSelect\n );\n eventHub.on(InputFilterEvent.COLUMNS_CHANGED, this.handleColumnsChanged);\n eventHub.on(PanelEvent.CLOSE, this.handlePanelClosed);\n eventHub.on(PanelEvent.CLOSED, this.handlePanelClosed);\n }\n\n stopListening(layout: GoldenLayout): void {\n layout.off('stateChanged', this.handleLayoutStateChanged);\n\n const { eventHub } = layout;\n eventHub.off(IrisGridEvent.COLUMN_SELECTED, this.handleGridColumnSelect);\n eventHub.off(IrisGridEvent.DATA_SELECTED, this.handleUpdateValues);\n eventHub.off(IrisGridEvent.STATE_CHANGED, this.handleStateChange);\n eventHub.off(ChartEvent.COLUMN_SELECTED, this.handleChartColumnSelect);\n eventHub.off(PanelEvent.CLONED, this.handlePanelCloned);\n eventHub.off(\n InputFilterEvent.COLUMN_SELECTED,\n this.handleFilterColumnSelect\n );\n eventHub.off(InputFilterEvent.COLUMNS_CHANGED, this.handleColumnsChanged);\n eventHub.off(PanelEvent.CLOSE, this.handlePanelClosed);\n eventHub.off(PanelEvent.CLOSED, this.handlePanelClosed);\n }\n\n handleCancel(): void {\n const { linkInProgress } = this.state;\n if (linkInProgress == null) {\n const { setActiveTool } = this.props;\n setActiveTool(ToolType.DEFAULT);\n }\n this.setState({ linkInProgress: undefined });\n }\n\n handleDone(): void {\n const { setActiveTool } = this.props;\n setActiveTool(ToolType.DEFAULT);\n this.setState({\n linkInProgress: undefined,\n selectedIds: new Set<string>(),\n });\n }\n\n handleChartColumnSelect(panel: PanelComponent, column: LinkColumn): void {\n this.columnSelected(panel, column, true);\n }\n\n handleFilterColumnSelect(panel: PanelComponent, column: LinkColumn): void {\n log.debug('handleFilterColumnSelect', this.isOverlayShown());\n const {\n links,\n localDashboardId,\n setActiveTool,\n setDashboardIsolatedLinkerPanelId,\n } = this.props;\n\n const panelId = LayoutUtils.getIdFromPanel(panel);\n const panelLinks = links.filter(\n link => link.start?.panelId === panelId || link.end?.panelId === panelId\n );\n\n if (!this.isOverlayShown() && panelId != null) {\n // Initial click on the filter source button with linker inactive\n // Show linker in isolated mode for panel\n setActiveTool(ToolType.LINKER);\n setDashboardIsolatedLinkerPanelId(localDashboardId, panelId);\n\n if (panelLinks.length === 0) {\n // Source not linked - start new link in isolated linker mode\n // Need to pass panelId for overrideIsolatedLinkerPanelId\n // as redux prop update at this point not yet propagated\n this.columnSelected(panel, column, true, panelId);\n }\n return;\n }\n\n // Filter source clicked with linker active\n this.columnSelected(panel, column, true);\n }\n\n handleColumnsChanged(panel: PanelComponent, columns: LinkColumn[]): void {\n log.debug('handleColumnsChanged', panel, columns);\n const { links } = this.props;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n log.error('Invalid panelId', panel);\n return;\n }\n // Delete links that start or end on non-existent column in the updated panel\n const linksToDelete = links.filter(\n ({ start, end }) =>\n (start.panelId === panelId &&\n LinkerUtils.findColumn(columns, start) == null) ||\n (end != null &&\n end.panelId === panelId &&\n LinkerUtils.findColumn(columns, end) == null)\n );\n this.deleteLinks(linksToDelete);\n }\n\n handleGridColumnSelect(panel: PanelComponent, column: LinkColumn): void {\n this.columnSelected(panel, column);\n }\n\n /**\n * Track a column selection and build the link from it.\n * @param panel The panel component that is the source for the column selection\n * @param column The column that was selected\n * @param isAlwaysEndPoint True if the selection is always the end point, even if it's the first column selected. Defaults to false.\n * @param overrideIsolatedLinkerPanelId isolatedLinkerPanelId to use when method is called before prop changes propagate\n */\n columnSelected(\n panel: PanelComponent,\n column: LinkColumn,\n isAlwaysEndPoint = false,\n overrideIsolatedLinkerPanelId?: string | string[]\n ): void {\n if (overrideIsolatedLinkerPanelId === undefined && !this.isOverlayShown()) {\n return;\n }\n const { isolatedLinkerPanelId } = this.props;\n const { linkInProgress } = this.state;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n return;\n }\n const panelComponent = LayoutUtils.getComponentNameFromPanel(panel);\n const { name: columnName, type: columnType } = column;\n if (linkInProgress == null || linkInProgress.start == null) {\n const newLink: Link = {\n id: shortid.generate(),\n start: {\n panelId,\n panelComponent,\n columnName,\n columnType,\n },\n // Link starts with type Invalid as linking a source to itself is not allowed\n type: 'invalid',\n isReversed: isAlwaysEndPoint,\n };\n\n log.debug('starting link', newLink);\n\n this.setState({ linkInProgress: newLink });\n } else {\n const { links } = this.props;\n const { start, id, isReversed } = linkInProgress;\n const end = {\n panelId,\n panelComponent,\n columnName,\n columnType,\n };\n\n const type = LinkerUtils.getLinkType(\n isReversed !== undefined && isReversed ? end : start,\n isReversed !== undefined && isReversed ? start : end,\n overrideIsolatedLinkerPanelId ?? isolatedLinkerPanelId\n );\n\n switch (type) {\n case 'invalid':\n log.debug('Ignore invalid link connection', linkInProgress, end);\n return;\n case 'filterSource': {\n // filterSource links have a limit of 1 link per target\n // New link validation passed, delete existing links before adding the new one\n const existingLinkPanelId =\n isReversed !== undefined && isReversed\n ? start.panelId\n : end.panelId;\n // In cases with multiple targets per panel (i.e. chart filters)\n // links would have to be filtered by panelId and columnName and columnType\n const linksToDelete = links.filter(\n ({ end: panelLinkEnd }) =>\n panelLinkEnd?.panelId === existingLinkPanelId\n );\n this.deleteLinks(linksToDelete);\n break;\n }\n case 'tableLink':\n // No-op\n break;\n }\n\n // Create a completed link from link in progress\n const newLink: Link = {\n start: isReversed !== undefined && isReversed ? end : start,\n end: isReversed !== undefined && isReversed ? start : end,\n id,\n type,\n operator: FilterType.eq,\n };\n log.info('creating link', newLink);\n\n this.setState(\n { linkInProgress: undefined, selectedIds: new Set<string>([id]) },\n () => {\n // Adding link after updating state\n // otherwise both new link and linkInProgress could be rendered at the same time\n // resulting in \"multiple children with same key\" error\n this.addLinks([newLink]);\n }\n );\n }\n }\n\n unsetFilterValueForLink(link: Link): void {\n const { panelManager } = this.props;\n if (link.end) {\n const { end } = link;\n const { panelId, columnName, columnType } = end;\n const endPanel = panelManager.getOpenedPanelById(panelId);\n if (!endPanel) {\n log.debug(\n 'endPanel no longer exists, ignoring unsetFilterValue',\n panelId\n );\n } else if (isLinkablePanel(endPanel)) {\n endPanel.unsetFilterValue(columnName, columnType);\n } else {\n log.debug('endPanel.unsetFilterValue not implemented', endPanel);\n }\n }\n }\n\n /**\n * Set filters for a given panel ID\n * @param panelId ID of panel to set filters on\n * @param filterMap Map of column name to column type, text, and value\n */\n setPanelFilterMap(panelId: string, filterMap: LinkFilterMap): void {\n log.debug('Set filter data for panel:', panelId, filterMap);\n const { panelManager } = this.props;\n const panel = panelManager.getOpenedPanelById(panelId);\n if (!panel) {\n log.debug('panel no longer exists, ignoring setFilterMap', panelId);\n } else if (isLinkablePanel(panel)) {\n panel.setFilterMap(filterMap);\n } else {\n log.debug('panel.setFilterMap not implemented', panelId, panel);\n }\n }\n\n addLinks(links: Link[]): void {\n const { addDashboardLinks, localDashboardId } = this.props;\n addDashboardLinks(localDashboardId, links);\n }\n\n deleteLinks(links: Link[], clearAll = false): void {\n const { localDashboardId } = this.props;\n links.forEach(link => this.unsetFilterValueForLink(link));\n if (clearAll) {\n const { setDashboardLinks } = this.props;\n setDashboardLinks(localDashboardId, []);\n } else if (links.length > 0) {\n const { deleteDashboardLinks } = this.props;\n deleteDashboardLinks(\n localDashboardId,\n links.map(({ id }) => id)\n );\n }\n }\n\n handleAllLinksDeleted(): void {\n const { links, isolatedLinkerPanelId } = this.props;\n if (isolatedLinkerPanelId === undefined) {\n this.deleteLinks(links, true);\n } else {\n const isolatedLinks = links.filter(\n link =>\n link?.start?.panelId === isolatedLinkerPanelId ||\n link?.end?.panelId === isolatedLinkerPanelId\n );\n this.deleteLinks(isolatedLinks);\n }\n this.setState({ linkInProgress: undefined });\n }\n\n handleLinkDeleted(linkId: string): void {\n const { links } = this.props;\n const link = links.find(l => l.id === linkId);\n if (link) {\n this.deleteLinks([link]);\n } else {\n log.error('Unable to find link to delete', linkId);\n }\n }\n\n handleUpdateValues(panel: PanelComponent, dataMap: RowDataMap): void {\n const panelId = LayoutUtils.getIdFromPanel(panel);\n const { links, timeZone } = this.props;\n // Map of panel ID to filterMap\n const panelFilterMap = new Map();\n // Instead of setting filters one by one for each link,\n // combine them so they could be set in a single call per target panel\n for (let i = 0; i < links.length; i += 1) {\n const { start, end, operator } = links[i];\n if (start.panelId === panelId && end != null) {\n const { panelId: endPanelId, columnName, columnType } = end;\n // Map of column name to column type and filter value\n const filterMap = panelFilterMap.has(endPanelId)\n ? panelFilterMap.get(endPanelId)\n : new Map();\n const filterList =\n filterMap.has(columnName) === true\n ? filterMap.get(columnName).filterList\n : [];\n const {\n visibleIndex: startColumnIndex,\n isExpandable,\n isGrouped,\n } = dataMap[start.columnName];\n let { value } = dataMap[start.columnName];\n let text = `${value}`;\n if (value === null && isExpandable && isGrouped) {\n // Clear filter on empty rollup grouping columns\n value = undefined;\n }\n if (columnType != null && TableUtils.isDateType(columnType)) {\n const dateFilterFormatter = new DateTimeColumnFormatter({\n timeZone,\n showTimeZone: false,\n showTSeparator: true,\n defaultDateTimeFormatString: DateUtils.FULL_DATE_FORMAT,\n });\n // The values are Dates for dateType values, not string like everything else\n text = dateFilterFormatter.format(value as Date);\n }\n const filter = { operator, text, value, startColumnIndex };\n filterList.push(filter);\n filterMap.set(columnName, {\n columnType,\n filterList,\n });\n panelFilterMap.set(endPanelId, filterMap);\n }\n }\n\n // Apply combined filters to all target panels\n panelFilterMap.forEach((filterMap, endPanelId) => {\n this.setPanelFilterMap(endPanelId, filterMap);\n });\n }\n\n handlePanelCloned(panel: PanelComponent, cloneConfig: { id: string }): void {\n const { links } = this.props;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n const cloneId = cloneConfig.id;\n if (panelId != null) {\n const linksToAdd = LinkerUtils.cloneLinksForPanel(\n links,\n panelId,\n cloneId\n );\n this.addLinks(linksToAdd);\n }\n }\n\n handlePanelClosed(panelId: string): void {\n // Delete links on PanelEvent.CLOSE and PanelEvent.CLOSED instead of UNMOUNT\n // because the panels can get unmounted on errors and we want to keep the links if that happens\n log.debug(`Panel ${panelId} closed, deleting links.`);\n this.deleteLinksForPanelId(panelId);\n }\n\n handleLinkSelected(linkId: string): void {\n this.setState({ selectedIds: new Set<string>([linkId]) });\n }\n\n handleLinksUpdated(newLinks: Link[]): void {\n const { localDashboardId, setDashboardLinks } = this.props;\n setDashboardLinks(localDashboardId, newLinks);\n }\n\n handleLayoutStateChanged(): void {\n this.forceUpdate();\n }\n\n handleStateChange(): void {\n this.forceUpdate();\n }\n\n handleExited(): void {\n // Has to be done after linker exit animation to avoid flashing non-isolated links\n const { localDashboardId, setDashboardIsolatedLinkerPanelId } = this.props;\n setDashboardIsolatedLinkerPanelId(localDashboardId, undefined);\n }\n\n /**\n * Delete all links for a provided panel ID. Needs to be done whenever a panel is closed or unmounted.\n * @param panelId The panel ID to delete links for\n */\n deleteLinksForPanelId(panelId: string): void {\n const { links } = this.props;\n for (let i = 0; i < links.length; i += 1) {\n const link = links[i];\n const { start, end, id } = link;\n if (start.panelId === panelId || end?.panelId === panelId) {\n this.handleLinkDeleted(id);\n }\n }\n }\n\n getCachedLinks = memoize(\n (\n links: Link[],\n linkInProgress: Link | undefined,\n isolateForPanelId: string | undefined\n ) => {\n const combinedLinks = [...links];\n\n if (linkInProgress != null && linkInProgress.start != null) {\n combinedLinks.push(linkInProgress);\n }\n\n if (isolateForPanelId !== undefined) {\n return combinedLinks.filter(\n link =>\n link?.start?.panelId === isolateForPanelId ||\n link?.end?.panelId === isolateForPanelId ||\n link?.end == null\n );\n }\n // Show all links in regular linker mode -- both isolated and not\n return combinedLinks;\n }\n );\n\n isOverlayShown(): boolean {\n const { activeTool } = this.props;\n return activeTool === ToolType.LINKER;\n }\n\n updateSelectionValidators(): void {\n const {\n activeTool,\n setDashboardColumnSelectionValidator,\n localDashboardId,\n } = this.props;\n switch (activeTool) {\n case ToolType.LINKER:\n setDashboardColumnSelectionValidator(\n localDashboardId,\n this.isColumnSelectionValid\n );\n break;\n default:\n setDashboardColumnSelectionValidator(localDashboardId, undefined);\n break;\n }\n }\n\n updateLinkInProgressType(\n linkInProgress: Link,\n type: LinkType = 'invalid'\n ): void {\n this.setState({\n linkInProgress: {\n ...linkInProgress,\n type,\n },\n });\n }\n\n isColumnSelectionValid(\n panel: PanelComponent,\n tableColumn?: LinkColumn\n ): boolean {\n const { linkInProgress } = this.state;\n const { isolatedLinkerPanelId } = this.props;\n\n // Link not started yet - no need to update type\n if (linkInProgress?.start == null) {\n return true;\n }\n\n if (tableColumn == null) {\n // Link started, end point is not a valid target\n this.updateLinkInProgressType(linkInProgress);\n return false;\n }\n\n const { isReversed, start } = linkInProgress;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n return false;\n }\n\n const end = {\n panelId,\n panelComponent: LayoutUtils.getComponentNameFromPanel(panel),\n columnName: tableColumn.name,\n columnType: tableColumn.type,\n };\n\n const type =\n isReversed !== undefined && isReversed\n ? LinkerUtils.getLinkType(end, start, isolatedLinkerPanelId)\n : LinkerUtils.getLinkType(start, end, isolatedLinkerPanelId);\n\n this.updateLinkInProgressType(linkInProgress, type);\n\n return type !== 'invalid';\n }\n\n render(): JSX.Element {\n const { links, isolatedLinkerPanelId, panelManager } = this.props;\n const { linkInProgress, selectedIds } = this.state;\n\n const isLinkOverlayShown = this.isOverlayShown();\n const disabled = linkInProgress != null && linkInProgress.start != null;\n const linkerOverlayMessage =\n isolatedLinkerPanelId === undefined\n ? 'Click a column source, then click a column target to create a filter link. The filter comparison operator used by a selected link can be changed. Delete a filter link by clicking the delete button or with alt+click. Click done when finished.'\n : 'Create a link between the source column button and a table column by clicking on one, then the other. Delete a filter link by clicking the delete button or with alt+click. Click done when finished.';\n\n return (\n <CSSTransition\n in={isLinkOverlayShown}\n timeout={ThemeExport.transitionMs}\n classNames=\"fade\"\n mountOnEnter\n unmountOnExit\n onExited={this.handleExited}\n >\n <LinkerOverlayContent\n disabled={disabled}\n panelManager={panelManager}\n links={this.getCachedLinks(\n links,\n linkInProgress,\n isolatedLinkerPanelId\n )}\n selectedIds={selectedIds}\n messageText={linkerOverlayMessage}\n onLinkSelected={this.handleLinkSelected}\n onLinkDeleted={this.handleLinkDeleted}\n onAllLinksDeleted={this.handleAllLinksDeleted}\n onLinksUpdated={this.handleLinksUpdated}\n onDone={this.handleDone}\n onCancel={this.handleCancel}\n />\n </CSSTransition>\n );\n }\n}\n\nexport default connector(Linker);\n"],"mappings":"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"}
@@ -9,20 +9,49 @@
9
9
  pointer-events: none;
10
10
  }
11
11
  .linker-overlay .linker-toast-dialog {
12
+ display: grid;
13
+ grid-template-areas: "drag-handle body" "drag-handle footer";
12
14
  position: absolute;
13
15
  right: 1rem;
14
16
  bottom: 1rem;
15
17
  background: #f0f0ee;
16
- max-width: 400px;
18
+ width: 400px;
17
19
  color: #1a171a;
18
20
  pointer-events: auto;
19
21
  box-shadow: 0 0.1rem 1.5rem 0.1rem rgba(26, 23, 26, 0.8);
20
22
  z-index: 1060;
21
23
  }
24
+ .linker-overlay .linker-toast-dialog .btn-drag-handle {
25
+ grid-area: drag-handle;
26
+ cursor: grab;
27
+ display: flex;
28
+ justify-content: center;
29
+ align-items: center;
30
+ border: none;
31
+ border-radius: 0;
32
+ height: 100%;
33
+ background: #c0bfbf;
34
+ color: #555356;
35
+ min-width: unset;
36
+ }
37
+ .linker-overlay .linker-toast-dialog .btn-drag-handle:hover {
38
+ background-color: #929192;
39
+ color: #403e41;
40
+ }
41
+ .linker-overlay .linker-toast-dialog.dragging {
42
+ cursor: grabbing;
43
+ }
44
+ .linker-overlay .linker-toast-dialog.dragging .btn-drag-handle {
45
+ cursor: grabbing;
46
+ background-color: #929192;
47
+ color: #403e41;
48
+ }
22
49
  .linker-overlay .linker-toast-dialog .toast-body {
50
+ grid-area: body;
23
51
  padding: 1rem;
24
52
  }
25
53
  .linker-overlay .linker-toast-dialog .toast-footer {
54
+ grid-area: footer;
26
55
  padding: 1rem;
27
56
  display: flex;
28
57
  justify-content: flex-end;
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../../node_modules/@deephaven/components/scss/custom.scss","../../src/linker/LinkerOverlayContent.scss","../../../../node_modules/bootstrap/scss/_variables.scss","../../../../node_modules/@deephaven/components/scss/new_variables.scss","../../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACEA;EACE,SC4qBkC;ED3qBlC;EACA;EACA;EACA;EACA;EACA;;AAEA;EAIE;EACA,OEZO;EFaP,QEbO;EFcP,YGLa;EHMb;EACA,OGNa;EHOb;EACA,YG4JiB;EH3JjB,SC2pBgC;;ADzpBhC;EACE,SEtBK;;AFyBP;EACE,SE1BK;EF2BL;EACA;;AACA;EACE,cE9BG","file":"LinkerOverlayContent.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 '@deephaven/components/scss/custom.scss';\n\n.linker-overlay {\n z-index: $zindex-fixed;\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n\n .linker-toast-dialog {\n $toast-inner-padding: $spacer-3;\n $toast-outer-padding: $spacer-3;\n\n position: absolute;\n right: $toast-outer-padding;\n bottom: $toast-outer-padding;\n background: $modal-content-bg;\n max-width: 400px;\n color: $background;\n pointer-events: auto;\n box-shadow: $tooltip-box-shadow;\n z-index: $zindex-popover;\n\n .toast-body {\n padding: $toast-inner-padding;\n }\n\n .toast-footer {\n padding: $toast-inner-padding;\n display: flex;\n justify-content: flex-end;\n .btn:not(:last-child) {\n margin-right: $spacer-3;\n }\n }\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","//Set of spacer variables from the spacer map\n$spacer-0: map-get($spacers, 0); //0\n$spacer-1: map-get($spacers, 1);\n$spacer-2: map-get($spacers, 2);\n$spacer-3: map-get($spacers, 3);\n$spacer-4: map-get($spacers, 4);\n$spacer-5: map-get($spacers, 5);\n\n//Marching Ants for golden layout dropzone and drag and drop\n//top bottom, left right.\n//create 4 background images that are 50% color 1, 50% color 2 using graidents, two veritical, two horizontal\n//size them to ant-size and thickness\n//position those images along the egdes and make top/bottom repeat-x and left/right repeat-y\n//then offest each of those background positions by ant-size in animation to make them march.\n$ant-size: 8px;\n$ant-thickness: 1px;\n\n@mixin ants-base($color-1: black, $color-2: white) {\n background-image: linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%);\n background-size: $ant-size $ant-thickness, $ant-size $ant-thickness,\n $ant-thickness $ant-size, $ant-thickness $ant-size;\n background-position: 0 top, 0 bottom, left 0, right 0;\n background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;\n animation: march 0.5s;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n\n@mixin drag-stack($pseudo-element) {\n &::#{$pseudo-element} {\n content: ' ';\n background: $primary;\n box-shadow: $box-shadow;\n border-radius: $border-radius;\n position: absolute;\n height: 100%;\n width: 100%;\n @content;\n }\n}\n\n$focus-bg-transparency: 0.12;\n$hover-bg-transparency: 0.14;\n$active-bg-transparency: 0.28;\n$exception-transparency: 0.13;\n","// Styling overrides for bootstrap\n\n// Override / set color variables\n$red: #f95d84;\n$orange: #f37e3f;\n$yellow: #fcd65b;\n$green: #9edc6f;\n$blue: #76d9e4;\n$purple: #aa9af4;\n\n//Define some UI colors\n$interfacegray: #2d2a2e;\n$interfaceblue: #4878ea;\n$interfacewhite: #f0f0ee; //same as gray-200\n$interfaceblack: #1a171a;\n\n//Define our Gray scale\n$white: $interfacewhite;\n$gray-100: #fcfcfa;\n$gray-200: $interfacewhite;\n$gray-300: #c0bfbf;\n$gray-400: #929192;\n$gray-500: #5b5a5c;\n$gray-600: #555356;\n$gray-700: #403e41;\n$gray-800: #373438;\n$gray-850: #322f33;\n$gray-900: #211f22;\n$black: $interfaceblack;\n$content-bg: $interfacegray;\n$background: $interfaceblack;\n$foreground: $interfacewhite;\n\n//Load colors into map\n$colors: ();\n$colors: map-merge(\n (\n 'red': $red,\n 'orange': $orange,\n 'yellow': $yellow,\n 'green': $green,\n 'blue': $blue,\n 'purple': $purple,\n 'white': $white,\n 'black': $black,\n ),\n $colors\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: $interfaceblue;\n$primary-hover: darken($primary, 8%);\n$primary-dark: mix($primary, $content-bg, 25%);\n$primary-light: scale-color($primary, $lightness: -25%);\n$secondary: $gray-500;\n$secondary-hover: darken($secondary, 8%);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: $red;\n$danger-hover: darken($danger, 8%);\n$light: $gray-100;\n$mid: $gray-400; //Added a mid color, useful for input styling\n$dark: $gray-800;\n$green-dark: scale-color($green, $lightness: -45%, $saturation: -10%);\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n 'primary': $primary,\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'secondary': $secondary,\n 'success': $success,\n 'info': $info,\n 'warning': $warning,\n 'danger': $danger,\n 'light': $light,\n 'dark': $dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n ),\n $theme-colors\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: 'Fira Sans', -apple-system, blinkmacsystemfont,\n 'Segoe UI', 'Roboto', 'Helvetica Neue', arial, 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//so browsers add alpha to your color by default, ignoring opacity 1\n//by setting rgba with 0.99 it tricks browser into thinking there is alpha applied\n$text-select-color: $primary-hover;\n$text-select-color-editor: lighten(\n $gray-700,\n 15%\n); //we lighten it abit to account for that 0.01 loss, and because it needs some anyways.\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 rgba($black, 45%); //because our UI is so dark, we need darker default shadows\n$box-shadow-900: 0 0.1rem 1rem rgba(0, 0, 0, 45%); //darkest shadow for $black popups over $black UI\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition: color 0.12s ease-in-out, background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out, box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n\n//Override Inputs\n$input-bg: $gray-600;\n$input-disabled-bg: $gray-800;\n$input-color: $foreground;\n$input-border-color: $gray-400;\n$input-placeholder-color: $gray-400;\n$input-focus-border-color: rgba($primary, 85%);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: rgba($component-active-bg, 35%);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n\n//checkbox\n$custom-control-indicator-bg: $gray-600;\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: $gray-800;\n$custom-control-indicator-checked-disabled-bg: $gray-800;\n$custom-control-label-disabled-color: $gray-400;\n\n//Custom Select\n$custom-select-indicator-color: $gray-400;\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: darken($gray-400, 5%);\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $gray-200;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n\n// Toast notification\n$toast-bg: $primary-dark;\n$toast-color: $foreground;\n$toast-error-bg: mix($danger, $content-bg, 15%);\n$toast-error-color: $foreground;\n\n//tooltips\n$tooltip-bg: $gray-700;\n$tooltip-color: $foreground;\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem rgba($black, 80%);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: $primary;\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: $gray-600;\n$contextmenu-color: $foreground;\n$contextmenu-disabled-color: $text-muted;\n$contextmenu-keyboard-selected-bg: rgba($primary, 50%);\n$contextmenu-selected-bg: $primary;\n$contextmenu-selected-color: $foreground;\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: theme-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"]}
1
+ {"version":3,"sourceRoot":"","sources":["../../../../node_modules/@deephaven/components/scss/custom.scss","../../src/linker/LinkerOverlayContent.scss","../../../../node_modules/bootstrap/scss/_variables.scss","../../../../node_modules/@deephaven/components/scss/new_variables.scss","../../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACMA;EACE,SCwqBkC;EDvqBlC;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA,OEfO;EFgBP,QEhBO;EFiBP,YGRa;EHSb,OApBW;EAqBX,OGTa;EHUb;EACA,YGyJiB;EHxJjB,SCwpBgC;;ADtpBhC;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YGjBK;EHkBL,OGfK;EHgBL;;AAEA;EACE,kBGrBG;EHsBH,OGnBG;;AHuBP;EACE;;AACA;EACE;EACA,kBG9BG;EH+BH,OG5BG;;AHgCP;EACE;EACA,SEtDK;;AFyDP;EACE;EACA,SE3DK;EF4DL;EACA;;AACA;EACE,cE/DG","file":"LinkerOverlayContent.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 '@deephaven/components/scss/custom.scss';\n\n$dialog-width: 400px;\n$toast-inner-padding: $spacer-3;\n$toast-outer-padding: $spacer-3;\n\n.linker-overlay {\n z-index: $zindex-fixed;\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n\n .linker-toast-dialog {\n display: grid;\n grid-template-areas: 'drag-handle body' 'drag-handle footer';\n position: absolute;\n right: $toast-outer-padding;\n bottom: $toast-outer-padding;\n background: $modal-content-bg;\n width: $dialog-width;\n color: $background;\n pointer-events: auto;\n box-shadow: $tooltip-box-shadow;\n z-index: $zindex-popover;\n\n .btn-drag-handle {\n grid-area: drag-handle;\n cursor: grab;\n display: flex;\n justify-content: center;\n align-items: center;\n border: none;\n border-radius: 0;\n height: 100%;\n background: $gray-300;\n color: $gray-600;\n min-width: unset;\n\n &:hover {\n background-color: $gray-400;\n color: $gray-700;\n }\n }\n\n &.dragging {\n cursor: grabbing;\n .btn-drag-handle {\n cursor: grabbing;\n background-color: $gray-400;\n color: $gray-700;\n }\n }\n\n .toast-body {\n grid-area: body;\n padding: $toast-inner-padding;\n }\n\n .toast-footer {\n grid-area: footer;\n padding: $toast-inner-padding;\n display: flex;\n justify-content: flex-end;\n .btn:not(:last-child) {\n margin-right: $spacer-3;\n }\n }\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","//Set of spacer variables from the spacer map\n$spacer-0: map-get($spacers, 0); //0\n$spacer-1: map-get($spacers, 1);\n$spacer-2: map-get($spacers, 2);\n$spacer-3: map-get($spacers, 3);\n$spacer-4: map-get($spacers, 4);\n$spacer-5: map-get($spacers, 5);\n\n//Marching Ants for golden layout dropzone and drag and drop\n//top bottom, left right.\n//create 4 background images that are 50% color 1, 50% color 2 using graidents, two veritical, two horizontal\n//size them to ant-size and thickness\n//position those images along the egdes and make top/bottom repeat-x and left/right repeat-y\n//then offest each of those background positions by ant-size in animation to make them march.\n$ant-size: 8px;\n$ant-thickness: 1px;\n\n@mixin ants-base($color-1: black, $color-2: white) {\n background-image: linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%);\n background-size: $ant-size $ant-thickness, $ant-size $ant-thickness,\n $ant-thickness $ant-size, $ant-thickness $ant-size;\n background-position: 0 top, 0 bottom, left 0, right 0;\n background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;\n animation: march 0.5s;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n\n@mixin drag-stack($pseudo-element) {\n &::#{$pseudo-element} {\n content: ' ';\n background: $primary;\n box-shadow: $box-shadow;\n border-radius: $border-radius;\n position: absolute;\n height: 100%;\n width: 100%;\n @content;\n }\n}\n\n$focus-bg-transparency: 0.12;\n$hover-bg-transparency: 0.14;\n$active-bg-transparency: 0.28;\n$exception-transparency: 0.13;\n","// Styling overrides for bootstrap\n\n// Override / set color variables\n$red: #f95d84;\n$orange: #f37e3f;\n$yellow: #fcd65b;\n$green: #9edc6f;\n$blue: #76d9e4;\n$purple: #aa9af4;\n\n//Define some UI colors\n$interfacegray: #2d2a2e;\n$interfaceblue: #4878ea;\n$interfacewhite: #f0f0ee; //same as gray-200\n$interfaceblack: #1a171a;\n\n//Define our Gray scale\n$white: $interfacewhite;\n$gray-100: #fcfcfa;\n$gray-200: $interfacewhite;\n$gray-300: #c0bfbf;\n$gray-400: #929192;\n$gray-500: #5b5a5c;\n$gray-600: #555356;\n$gray-700: #403e41;\n$gray-800: #373438;\n$gray-850: #322f33;\n$gray-900: #211f22;\n$black: $interfaceblack;\n$content-bg: $interfacegray;\n$background: $interfaceblack;\n$foreground: $interfacewhite;\n\n//Load colors into map\n$colors: ();\n$colors: map-merge(\n (\n 'red': $red,\n 'orange': $orange,\n 'yellow': $yellow,\n 'green': $green,\n 'blue': $blue,\n 'purple': $purple,\n 'white': $white,\n 'black': $black,\n ),\n $colors\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: $interfaceblue;\n$primary-hover: darken($primary, 8%);\n$primary-dark: mix($primary, $content-bg, 25%);\n$primary-light: scale-color($primary, $lightness: -25%);\n$secondary: $gray-500;\n$secondary-hover: darken($secondary, 8%);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: $red;\n$danger-hover: darken($danger, 8%);\n$light: $gray-100;\n$mid: $gray-400; //Added a mid color, useful for input styling\n$dark: $gray-800;\n$green-dark: scale-color($green, $lightness: -45%, $saturation: -10%);\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n 'primary': $primary,\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'secondary': $secondary,\n 'success': $success,\n 'info': $info,\n 'warning': $warning,\n 'danger': $danger,\n 'light': $light,\n 'dark': $dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n ),\n $theme-colors\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: 'Fira Sans', -apple-system, blinkmacsystemfont,\n 'Segoe UI', 'Roboto', 'Helvetica Neue', arial, 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//so browsers add alpha to your color by default, ignoring opacity 1\n//by setting rgba with 0.99 it tricks browser into thinking there is alpha applied\n$text-select-color: $primary-hover;\n$text-select-color-editor: lighten(\n $gray-700,\n 15%\n); //we lighten it abit to account for that 0.01 loss, and because it needs some anyways.\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 rgba($black, 45%); //because our UI is so dark, we need darker default shadows\n$box-shadow-900: 0 0.1rem 1rem rgba(0, 0, 0, 45%); //darkest shadow for $black popups over $black UI\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition: color 0.12s ease-in-out, background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out, box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n\n//Override Inputs\n$input-bg: $gray-600;\n$input-disabled-bg: $gray-800;\n$input-color: $foreground;\n$input-border-color: $gray-400;\n$input-placeholder-color: $gray-400;\n$input-focus-border-color: rgba($primary, 85%);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: rgba($component-active-bg, 35%);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n\n//checkbox\n$custom-control-indicator-bg: $gray-600;\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: $gray-800;\n$custom-control-indicator-checked-disabled-bg: $gray-800;\n$custom-control-label-disabled-color: $gray-400;\n\n//Custom Select\n$custom-select-indicator-color: $gray-400;\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: darken($gray-400, 5%);\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $gray-200;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n\n// Toast notification\n$toast-bg: $primary-dark;\n$toast-color: $foreground;\n$toast-error-bg: mix($danger, $content-bg, 15%);\n$toast-error-color: $foreground;\n\n//tooltips\n$tooltip-bg: $gray-700;\n$tooltip-color: $foreground;\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem rgba($black, 80%);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: $primary;\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: $gray-600;\n$contextmenu-color: $foreground;\n$contextmenu-disabled-color: $text-muted;\n$contextmenu-keyboard-selected-bg: rgba($primary, 50%);\n$contextmenu-selected-bg: $primary;\n$contextmenu-selected-color: $foreground;\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: theme-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"]}
@@ -1,4 +1,4 @@
1
- import { Component, ErrorInfo } from 'react';
1
+ import React, { Component, ErrorInfo } from 'react';
2
2
  import { PanelManager } from '@deephaven/dashboard';
3
3
  import { TypeValue as FilterTypeValue } from '@deephaven/filters';
4
4
  import { Link, LinkerCoordinate, LinkPoint } from './LinkerUtils';
@@ -26,9 +26,15 @@ export type LinkerOverlayContentProps = {
26
26
  onDone: () => void;
27
27
  panelManager: PanelManager;
28
28
  };
29
+ type Point = {
30
+ x: number;
31
+ y: number;
32
+ };
29
33
  export type LinkerOverlayContentState = {
30
- mouseX?: number;
31
- mouseY?: number;
34
+ mouse?: Point;
35
+ dialog?: Point;
36
+ offset: Point;
37
+ isDragging: boolean;
32
38
  mode: 'select' | 'delete';
33
39
  };
34
40
  export declare class LinkerOverlayContent extends Component<LinkerOverlayContentProps, LinkerOverlayContentState> {
@@ -39,11 +45,15 @@ export declare class LinkerOverlayContent extends Component<LinkerOverlayContent
39
45
  componentDidMount(): void;
40
46
  componentDidCatch(error: Error, info: ErrorInfo): void;
41
47
  componentWillUnmount(): void;
48
+ dialogRef: React.RefObject<HTMLInputElement>;
42
49
  /** Gets the on screen points for a link start or end spec */
43
50
  getPointFromLinkPoint(linkPoint: LinkPoint): LinkerCoordinate;
44
51
  handleOperatorChanged(linkId: string, type: FilterTypeValue): void;
45
52
  handleBlur(): void;
53
+ handleResize(): void;
46
54
  handleMouseMove(event: MouseEvent): void;
55
+ handleMouseDown(event: React.MouseEvent): void;
56
+ handleMouseUp(): void;
47
57
  handleKeyDown(event: KeyboardEvent): void;
48
58
  handleKeyUp(event: KeyboardEvent): void;
49
59
  handleEscapePressed(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"LinkerOverlayContent.d.ts","sourceRoot":"","sources":["../../src/linker/LinkerOverlayContent.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOpD,OAAO,EAAe,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGjE,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAEL,IAAI,EACJ,gBAAgB,EAChB,SAAS,EACV,MAAM,eAAe,CAAC;AAEvB,OAAO,6BAA6B,CAAC;AAIrC,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,cAAc,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IAC3C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC3B,CAAC;AAEF,qBAAa,oBAAqB,SAAQ,SAAS,CACjD,yBAAyB,EACzB,yBAAyB,CAC1B;IACC,MAAM,CAAC,YAAY;;MAEjB;gBAEU,KAAK,EAAE,yBAAyB;IAiB5C,iBAAiB,IAAI,IAAI;IAQzB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAItD,oBAAoB,IAAI,IAAI;IAO5B,6DAA6D;IAC7D,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,gBAAgB;IA+B7D,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAQlE,UAAU,IAAI,IAAI;IAIlB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAOxC,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IASzC,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IASvC,mBAAmB,IAAI,IAAI;IAK3B,MAAM,IAAI,GAAG,CAAC,OAAO;CAuGtB;AAED,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"LinkerOverlayContent.d.ts","sourceRoot":"","sources":["../../src/linker/LinkerOverlayContent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQpD,OAAO,EAAe,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIjE,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,EAEL,IAAI,EACJ,gBAAgB,EAChB,SAAS,EACV,MAAM,eAAe,CAAC;AAEvB,OAAO,6BAA6B,CAAC;AAIrC,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,cAAc,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IAC3C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,KAAK,KAAK,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC3B,CAAC;AAEF,qBAAa,oBAAqB,SAAQ,SAAS,CACjD,yBAAyB,EACzB,yBAAyB,CAC1B;IACC,MAAM,CAAC,YAAY;;MAEjB;gBAEU,KAAK,EAAE,yBAAyB;IAwB5C,iBAAiB,IAAI,IAAI;IAUzB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAItD,oBAAoB,IAAI,IAAI;IAS5B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAE7C,6DAA6D;IAC7D,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,gBAAgB;IA+B7D,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAQlE,UAAU,IAAI,IAAI;IAIlB,YAAY,IAAI,IAAI;IAYpB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IA0BxC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI;IAa9C,aAAa,IAAI,IAAI;IAMrB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAazC,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IASvC,mBAAmB,IAAI,IAAI;IAK3B,MAAM,IAAI,GAAG,CAAC,OAAO;CAyHtB;AAED,eAAe,oBAAoB,CAAC"}
@@ -3,9 +3,11 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
3
3
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4
4
  import React, { Component } from 'react';
5
5
  import classNames from 'classnames';
6
- import { Button, ContextActions, GLOBAL_SHORTCUTS } from '@deephaven/components';
6
+ import { Button, ContextActions, GLOBAL_SHORTCUTS, Tooltip } from '@deephaven/components';
7
7
  import { LayoutUtils } from '@deephaven/dashboard';
8
8
  import Log from '@deephaven/log';
9
+ import { vsGripper } from '@deephaven/icons';
10
+ import clamp from 'lodash.clamp';
9
11
  import { isLinkableFromPanel } from "./LinkerUtils.js";
10
12
  import LinkerLink from "./LinkerLink.js";
11
13
  import "./LinkerOverlayContent.css";
@@ -13,23 +15,35 @@ var log = Log.module('LinkerOverlayContent');
13
15
  export class LinkerOverlayContent extends Component {
14
16
  constructor(props) {
15
17
  super(props);
18
+ _defineProperty(this, "dialogRef", void 0);
16
19
  this.handleBlur = this.handleBlur.bind(this);
20
+ this.handleResize = this.handleResize.bind(this);
17
21
  this.handleMouseMove = this.handleMouseMove.bind(this);
22
+ this.handleMouseDown = this.handleMouseDown.bind(this);
23
+ this.handleMouseUp = this.handleMouseUp.bind(this);
18
24
  this.handleKeyDown = this.handleKeyDown.bind(this);
19
25
  this.handleKeyUp = this.handleKeyUp.bind(this);
20
26
  this.handleEscapePressed = this.handleEscapePressed.bind(this);
21
27
  this.handleOperatorChanged = this.handleOperatorChanged.bind(this);
28
+ this.dialogRef = /*#__PURE__*/React.createRef();
22
29
  this.state = {
23
- mouseX: undefined,
24
- mouseY: undefined,
30
+ mouse: undefined,
31
+ dialog: undefined,
32
+ offset: {
33
+ x: 0,
34
+ y: 0
35
+ },
36
+ isDragging: false,
25
37
  mode: 'select'
26
38
  };
27
39
  }
28
40
  componentDidMount() {
29
41
  window.addEventListener('blur', this.handleBlur, true);
30
42
  window.addEventListener('mousemove', this.handleMouseMove, true);
43
+ window.addEventListener('mouseup', this.handleMouseUp, true);
31
44
  window.addEventListener('keydown', this.handleKeyDown, true);
32
45
  window.addEventListener('keyup', this.handleKeyUp, true);
46
+ window.addEventListener('resize', this.handleResize, true);
33
47
  }
34
48
 
35
49
  // eslint-disable-next-line react/sort-comp
@@ -39,10 +53,11 @@ export class LinkerOverlayContent extends Component {
39
53
  componentWillUnmount() {
40
54
  window.removeEventListener('blur', this.handleBlur, true);
41
55
  window.removeEventListener('mousemove', this.handleMouseMove, true);
56
+ window.removeEventListener('mouseup', this.handleMouseUp, true);
42
57
  window.removeEventListener('keydown', this.handleKeyDown, true);
43
58
  window.removeEventListener('keyup', this.handleKeyUp, true);
59
+ window.removeEventListener('resize', this.handleResize, true);
44
60
  }
45
-
46
61
  /** Gets the on screen points for a link start or end spec */
47
62
  getPointFromLinkPoint(linkPoint) {
48
63
  var {
@@ -92,10 +107,63 @@ export class LinkerOverlayContent extends Component {
92
107
  mode: 'select'
93
108
  });
94
109
  }
110
+ handleResize() {
111
+ var {
112
+ dialog
113
+ } = this.state;
114
+ if (dialog && this.dialogRef.current) {
115
+ var rect = this.dialogRef.current.getBoundingClientRect();
116
+ var dialogX = clamp(dialog.x, 0, window.innerWidth - rect.width);
117
+ var dialogY = clamp(dialog.y, 0, window.innerHeight - rect.height);
118
+ this.setState({
119
+ dialog: {
120
+ x: dialogX,
121
+ y: dialogY
122
+ }
123
+ });
124
+ }
125
+ }
95
126
  handleMouseMove(event) {
127
+ var {
128
+ offset,
129
+ isDragging
130
+ } = this.state;
96
131
  this.setState({
97
- mouseX: event.clientX,
98
- mouseY: event.clientY
132
+ mouse: {
133
+ x: event.clientX,
134
+ y: event.clientY
135
+ }
136
+ });
137
+ if (isDragging && this.dialogRef.current) {
138
+ var rect = this.dialogRef.current.getBoundingClientRect();
139
+ var dialogX = clamp(window.innerWidth - (event.clientX + rect.width + offset.x), 0, window.innerWidth - rect.width);
140
+ var dialogY = clamp(window.innerHeight - (event.clientY + rect.height + offset.y), 0, window.innerHeight - rect.height);
141
+ this.setState({
142
+ dialog: {
143
+ x: dialogX,
144
+ y: dialogY
145
+ }
146
+ });
147
+ }
148
+ }
149
+ handleMouseDown(event) {
150
+ var offset = {
151
+ x: 0,
152
+ y: 0
153
+ };
154
+ if (this.dialogRef.current) {
155
+ var rect = this.dialogRef.current.getBoundingClientRect();
156
+ offset.x = rect.right - (rect.width + event.clientX);
157
+ offset.y = rect.bottom - (rect.height + event.clientY);
158
+ }
159
+ this.setState({
160
+ isDragging: true,
161
+ offset
162
+ });
163
+ }
164
+ handleMouseUp() {
165
+ this.setState({
166
+ isDragging: false
99
167
  });
100
168
  }
101
169
  handleKeyDown(event) {
@@ -104,6 +172,13 @@ export class LinkerOverlayContent extends Component {
104
172
  this.setState({
105
173
  mode: 'delete'
106
174
  });
175
+ } else if (event.key === 'Delete' || event.key === 'Backspace') {
176
+ var {
177
+ selectedIds,
178
+ onLinkDeleted
179
+ } = this.props;
180
+ event.preventDefault();
181
+ selectedIds.forEach(id => onLinkDeleted(id));
107
182
  }
108
183
  }
109
184
  handleKeyUp(event) {
@@ -132,12 +207,14 @@ export class LinkerOverlayContent extends Component {
132
207
  onDone
133
208
  } = this.props;
134
209
  var {
135
- mouseX,
136
- mouseY,
210
+ mouse,
211
+ dialog,
212
+ isDragging,
137
213
  mode
138
214
  } = this.state;
139
215
  var visibleLinks = links.map(link => {
140
216
  try {
217
+ var _mouse$x, _mouse$y;
141
218
  var {
142
219
  id,
143
220
  type,
@@ -148,8 +225,8 @@ export class LinkerOverlayContent extends Component {
148
225
  } = link;
149
226
  var startColumnType = start.columnType;
150
227
  var [x1, y1] = this.getPointFromLinkPoint(start);
151
- var x2 = mouseX !== null && mouseX !== void 0 ? mouseX : x1;
152
- var y2 = mouseY !== null && mouseY !== void 0 ? mouseY : y1;
228
+ var x2 = (_mouse$x = mouse === null || mouse === void 0 ? void 0 : mouse.x) !== null && _mouse$x !== void 0 ? _mouse$x : x1;
229
+ var y2 = (_mouse$y = mouse === null || mouse === void 0 ? void 0 : mouse.y) !== null && _mouse$y !== void 0 ? _mouse$y : y1;
153
230
  if (end != null) {
154
231
  [x2, y2] = this.getPointFromLinkPoint(end);
155
232
  }
@@ -217,8 +294,24 @@ export class LinkerOverlayContent extends Component {
217
294
  onOperatorChanged: this.handleOperatorChanged
218
295
  });
219
296
  }), /*#__PURE__*/React.createElement("div", {
220
- className: "linker-toast-dialog"
221
- }, /*#__PURE__*/React.createElement("div", {
297
+ className: classNames('linker-toast-dialog', {
298
+ dragging: isDragging
299
+ }),
300
+ ref: this.dialogRef,
301
+ style: {
302
+ bottom: dialog === null || dialog === void 0 ? void 0 : dialog.y,
303
+ right: dialog === null || dialog === void 0 ? void 0 : dialog.x
304
+ }
305
+ }, /*#__PURE__*/React.createElement(Button, {
306
+ draggable: true,
307
+ kind: "inline",
308
+ className: "btn-drag-handle",
309
+ icon: vsGripper,
310
+ onClick: () => {
311
+ // no-op
312
+ },
313
+ onMouseDown: this.handleMouseDown
314
+ }, !isDragging && /*#__PURE__*/React.createElement(Tooltip, null, "Drag to reposition")), /*#__PURE__*/React.createElement("div", {
222
315
  className: "toast-body"
223
316
  }, messageText), /*#__PURE__*/React.createElement("div", {
224
317
  className: "toast-footer"
@@ -1 +1 @@
1
- {"version":3,"file":"LinkerOverlayContent.js","names":["React","Component","classNames","Button","ContextActions","GLOBAL_SHORTCUTS","LayoutUtils","Log","isLinkableFromPanel","LinkerLink","log","module","LinkerOverlayContent","constructor","props","handleBlur","bind","handleMouseMove","handleKeyDown","handleKeyUp","handleEscapePressed","handleOperatorChanged","state","mouseX","undefined","mouseY","mode","componentDidMount","window","addEventListener","componentDidCatch","error","info","componentWillUnmount","removeEventListener","getPointFromLinkPoint","linkPoint","panelManager","panelId","columnName","panel","getOpenedPanelById","Error","coordinate","getCoordinateForColumn","e","glContainer","getContainerByPanelId","getTabPoint","linkId","type","links","onLinksUpdated","newLinks","map","link","id","operator","setState","event","clientX","clientY","key","preventDefault","onCancel","render","disabled","selectedIds","messageText","onLinkSelected","onLinkDeleted","onAllLinksDeleted","onDone","visibleLinks","isReversed","start","end","startColumnType","columnType","x1","y1","x2","y2","tmpX","tmpY","className","interactive","has","filter","item","action","shortcut","LINKER_CLOSE","isGlobal"],"sources":["../../src/linker/LinkerOverlayContent.tsx"],"sourcesContent":["import React, { Component, ErrorInfo } from 'react';\nimport classNames from 'classnames';\nimport {\n Button,\n ContextActions,\n GLOBAL_SHORTCUTS,\n} from '@deephaven/components';\nimport { LayoutUtils, PanelManager } from '@deephaven/dashboard';\nimport Log from '@deephaven/log';\nimport type { Container } from '@deephaven/golden-layout';\nimport { TypeValue as FilterTypeValue } from '@deephaven/filters';\nimport {\n isLinkableFromPanel,\n Link,\n LinkerCoordinate,\n LinkPoint,\n} from './LinkerUtils';\nimport LinkerLink from './LinkerLink';\nimport './LinkerOverlayContent.scss';\n\nconst log = Log.module('LinkerOverlayContent');\n\nexport type VisibleLink = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n id: string;\n className: string;\n operator: FilterTypeValue;\n startColumnType: string | null;\n};\n\nexport type LinkerOverlayContentProps = {\n disabled?: boolean;\n links: Link[];\n selectedIds: Set<string>;\n messageText: string;\n onLinkSelected: (linkId: string) => void;\n onLinkDeleted: (linkId: string) => void;\n onAllLinksDeleted: () => void;\n onLinksUpdated: (newLinks: Link[]) => void;\n onCancel: () => void;\n onDone: () => void;\n panelManager: PanelManager;\n};\n\nexport type LinkerOverlayContentState = {\n mouseX?: number;\n mouseY?: number;\n mode: 'select' | 'delete';\n};\n\nexport class LinkerOverlayContent extends Component<\n LinkerOverlayContentProps,\n LinkerOverlayContentState\n> {\n static defaultProps = {\n disabled: 'false',\n };\n\n constructor(props: LinkerOverlayContentProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleKeyUp = this.handleKeyUp.bind(this);\n this.handleEscapePressed = this.handleEscapePressed.bind(this);\n this.handleOperatorChanged = this.handleOperatorChanged.bind(this);\n\n this.state = {\n mouseX: undefined,\n mouseY: undefined,\n mode: 'select',\n };\n }\n\n componentDidMount(): void {\n window.addEventListener('blur', this.handleBlur, true);\n window.addEventListener('mousemove', this.handleMouseMove, true);\n window.addEventListener('keydown', this.handleKeyDown, true);\n window.addEventListener('keyup', this.handleKeyUp, true);\n }\n\n // eslint-disable-next-line react/sort-comp\n componentDidCatch(error: Error, info: ErrorInfo): void {\n log.error('componentDidCatch', error, info);\n }\n\n componentWillUnmount(): void {\n window.removeEventListener('blur', this.handleBlur, true);\n window.removeEventListener('mousemove', this.handleMouseMove, true);\n window.removeEventListener('keydown', this.handleKeyDown, true);\n window.removeEventListener('keyup', this.handleKeyUp, true);\n }\n\n /** Gets the on screen points for a link start or end spec */\n getPointFromLinkPoint(linkPoint: LinkPoint): LinkerCoordinate {\n const { panelManager } = this.props;\n const { panelId, columnName } = linkPoint;\n const panel = panelManager.getOpenedPanelById(panelId);\n if (panel != null) {\n if (!isLinkableFromPanel(panel)) {\n throw new Error(\n `Panel does not have getCoordinateForColumn method: ${panelId}`\n );\n }\n try {\n // TODO: remove try/catch when IDS-7371 is fixed.\n // getCoordinateForColumn throws an exception when accessing\n // columns on a model while it reconnects\n const coordinate = panel.getCoordinateForColumn(columnName);\n if (coordinate != null) {\n return coordinate;\n }\n } catch (e) {\n log.error('Could not get coordinate for column', columnName, panel);\n }\n }\n // Fallback to panel container if the panel itself\n // crashed, unmounted, and removed from openedPanelMap.\n const glContainer = panelManager.getContainerByPanelId(panelId);\n if (glContainer == null) {\n throw new Error(`Unable to find panel container for id: ${panelId}`);\n }\n return LayoutUtils.getTabPoint((glContainer as unknown) as Container);\n }\n\n handleOperatorChanged(linkId: string, type: FilterTypeValue): void {\n const { links, onLinksUpdated } = this.props;\n const newLinks: Link[] = links.map(link =>\n link.id === linkId ? { ...link, operator: type } : link\n );\n onLinksUpdated(newLinks);\n }\n\n handleBlur(): void {\n this.setState({ mode: 'select' });\n }\n\n handleMouseMove(event: MouseEvent): void {\n this.setState({\n mouseX: event.clientX,\n mouseY: event.clientY,\n });\n }\n\n handleKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Alt') {\n event.preventDefault();\n this.setState({\n mode: 'delete',\n });\n }\n }\n\n handleKeyUp(event: KeyboardEvent): void {\n if (event.key === 'Alt') {\n event.preventDefault();\n this.setState({\n mode: 'select',\n });\n }\n }\n\n handleEscapePressed(): void {\n const { onCancel } = this.props;\n onCancel();\n }\n\n render(): JSX.Element {\n const {\n disabled,\n links,\n selectedIds,\n messageText,\n onLinkSelected,\n onLinkDeleted,\n onAllLinksDeleted,\n onDone,\n } = this.props;\n\n const { mouseX, mouseY, mode } = this.state;\n const visibleLinks = links\n .map(link => {\n try {\n const { id, type, isReversed, start, end, operator } = link;\n const startColumnType = start.columnType;\n let [x1, y1] = this.getPointFromLinkPoint(start);\n let x2 = mouseX ?? x1;\n let y2 = mouseY ?? y1;\n if (end != null) {\n [x2, y2] = this.getPointFromLinkPoint(end);\n }\n if (isReversed != null && isReversed) {\n const [tmpX, tmpY] = [x1, y1];\n [x1, y1] = [x2, y2];\n [x2, y2] = [tmpX, tmpY];\n }\n const className = classNames(\n 'linker-link',\n { disabled },\n { 'link-filter-source': type === 'filterSource' },\n { 'link-invalid': type === 'invalid' },\n { interactive: link.end == null },\n { 'link-is-selected': selectedIds.has(id) },\n { 'danger-delete': mode === 'delete' }\n );\n return {\n x1,\n y1,\n x2,\n y2,\n id,\n className,\n operator,\n startColumnType,\n };\n } catch (error) {\n log.error('Unable to get point for link', link, error);\n return null;\n }\n })\n .filter(item => item != null) as VisibleLink[];\n\n return (\n <div\n className={classNames('linker-overlay', {\n 'danger-delete': mode === 'delete',\n })}\n >\n {visibleLinks.map(\n ({ x1, y1, x2, y2, id, className, operator, startColumnType }) => (\n <LinkerLink\n className={className}\n id={id}\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n key={id}\n onClick={onLinkSelected}\n onDelete={onLinkDeleted}\n isSelected={selectedIds.has(id)}\n operator={operator}\n startColumnType={startColumnType}\n onOperatorChanged={this.handleOperatorChanged}\n />\n )\n )}\n <div className=\"linker-toast-dialog\">\n <div className=\"toast-body\">{messageText}</div>\n <div className=\"toast-footer\">\n <Button kind=\"secondary\" onClick={onAllLinksDeleted}>\n Clear All\n </Button>\n <Button kind=\"primary\" onClick={onDone}>\n Done\n </Button>\n </div>\n </div>\n <ContextActions\n actions={[\n {\n action: this.handleEscapePressed,\n shortcut: GLOBAL_SHORTCUTS.LINKER_CLOSE,\n isGlobal: true,\n },\n ]}\n />\n </div>\n );\n }\n}\n\nexport default LinkerOverlayContent;\n"],"mappings":"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"}
1
+ {"version":3,"file":"LinkerOverlayContent.js","names":["React","Component","classNames","Button","ContextActions","GLOBAL_SHORTCUTS","Tooltip","LayoutUtils","Log","vsGripper","clamp","isLinkableFromPanel","LinkerLink","log","module","LinkerOverlayContent","constructor","props","handleBlur","bind","handleResize","handleMouseMove","handleMouseDown","handleMouseUp","handleKeyDown","handleKeyUp","handleEscapePressed","handleOperatorChanged","dialogRef","createRef","state","mouse","undefined","dialog","offset","x","y","isDragging","mode","componentDidMount","window","addEventListener","componentDidCatch","error","info","componentWillUnmount","removeEventListener","getPointFromLinkPoint","linkPoint","panelManager","panelId","columnName","panel","getOpenedPanelById","Error","coordinate","getCoordinateForColumn","e","glContainer","getContainerByPanelId","getTabPoint","linkId","type","links","onLinksUpdated","newLinks","map","link","id","operator","setState","current","rect","getBoundingClientRect","dialogX","innerWidth","width","dialogY","innerHeight","height","event","clientX","clientY","right","bottom","key","preventDefault","selectedIds","onLinkDeleted","forEach","onCancel","render","disabled","messageText","onLinkSelected","onAllLinksDeleted","onDone","visibleLinks","isReversed","start","end","startColumnType","columnType","x1","y1","x2","y2","tmpX","tmpY","className","interactive","has","filter","item","dragging","action","shortcut","LINKER_CLOSE","isGlobal"],"sources":["../../src/linker/LinkerOverlayContent.tsx"],"sourcesContent":["import React, { Component, ErrorInfo } from 'react';\nimport classNames from 'classnames';\nimport {\n Button,\n ContextActions,\n GLOBAL_SHORTCUTS,\n Tooltip,\n} from '@deephaven/components';\nimport { LayoutUtils, PanelManager } from '@deephaven/dashboard';\nimport Log from '@deephaven/log';\nimport type { Container } from '@deephaven/golden-layout';\nimport { vsGripper } from '@deephaven/icons';\nimport { TypeValue as FilterTypeValue } from '@deephaven/filters';\nimport clamp from 'lodash.clamp';\nimport {\n isLinkableFromPanel,\n Link,\n LinkerCoordinate,\n LinkPoint,\n} from './LinkerUtils';\nimport LinkerLink from './LinkerLink';\nimport './LinkerOverlayContent.scss';\n\nconst log = Log.module('LinkerOverlayContent');\n\nexport type VisibleLink = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n id: string;\n className: string;\n operator: FilterTypeValue;\n startColumnType: string | null;\n};\n\nexport type LinkerOverlayContentProps = {\n disabled?: boolean;\n links: Link[];\n selectedIds: Set<string>;\n messageText: string;\n onLinkSelected: (linkId: string) => void;\n onLinkDeleted: (linkId: string) => void;\n onAllLinksDeleted: () => void;\n onLinksUpdated: (newLinks: Link[]) => void;\n onCancel: () => void;\n onDone: () => void;\n panelManager: PanelManager;\n};\n\ntype Point = { x: number; y: number };\n\nexport type LinkerOverlayContentState = {\n mouse?: Point;\n dialog?: Point;\n offset: Point;\n isDragging: boolean;\n mode: 'select' | 'delete';\n};\n\nexport class LinkerOverlayContent extends Component<\n LinkerOverlayContentProps,\n LinkerOverlayContentState\n> {\n static defaultProps = {\n disabled: 'false',\n };\n\n constructor(props: LinkerOverlayContentProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleMouseDown = this.handleMouseDown.bind(this);\n this.handleMouseUp = this.handleMouseUp.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleKeyUp = this.handleKeyUp.bind(this);\n this.handleEscapePressed = this.handleEscapePressed.bind(this);\n this.handleOperatorChanged = this.handleOperatorChanged.bind(this);\n\n this.dialogRef = React.createRef();\n\n this.state = {\n mouse: undefined,\n dialog: undefined,\n offset: { x: 0, y: 0 },\n isDragging: false,\n mode: 'select',\n };\n }\n\n componentDidMount(): void {\n window.addEventListener('blur', this.handleBlur, true);\n window.addEventListener('mousemove', this.handleMouseMove, true);\n window.addEventListener('mouseup', this.handleMouseUp, true);\n window.addEventListener('keydown', this.handleKeyDown, true);\n window.addEventListener('keyup', this.handleKeyUp, true);\n window.addEventListener('resize', this.handleResize, true);\n }\n\n // eslint-disable-next-line react/sort-comp\n componentDidCatch(error: Error, info: ErrorInfo): void {\n log.error('componentDidCatch', error, info);\n }\n\n componentWillUnmount(): void {\n window.removeEventListener('blur', this.handleBlur, true);\n window.removeEventListener('mousemove', this.handleMouseMove, true);\n window.removeEventListener('mouseup', this.handleMouseUp, true);\n window.removeEventListener('keydown', this.handleKeyDown, true);\n window.removeEventListener('keyup', this.handleKeyUp, true);\n window.removeEventListener('resize', this.handleResize, true);\n }\n\n dialogRef: React.RefObject<HTMLInputElement>;\n\n /** Gets the on screen points for a link start or end spec */\n getPointFromLinkPoint(linkPoint: LinkPoint): LinkerCoordinate {\n const { panelManager } = this.props;\n const { panelId, columnName } = linkPoint;\n const panel = panelManager.getOpenedPanelById(panelId);\n if (panel != null) {\n if (!isLinkableFromPanel(panel)) {\n throw new Error(\n `Panel does not have getCoordinateForColumn method: ${panelId}`\n );\n }\n try {\n // TODO: remove try/catch when IDS-7371 is fixed.\n // getCoordinateForColumn throws an exception when accessing\n // columns on a model while it reconnects\n const coordinate = panel.getCoordinateForColumn(columnName);\n if (coordinate != null) {\n return coordinate;\n }\n } catch (e) {\n log.error('Could not get coordinate for column', columnName, panel);\n }\n }\n // Fallback to panel container if the panel itself\n // crashed, unmounted, and removed from openedPanelMap.\n const glContainer = panelManager.getContainerByPanelId(panelId);\n if (glContainer == null) {\n throw new Error(`Unable to find panel container for id: ${panelId}`);\n }\n return LayoutUtils.getTabPoint((glContainer as unknown) as Container);\n }\n\n handleOperatorChanged(linkId: string, type: FilterTypeValue): void {\n const { links, onLinksUpdated } = this.props;\n const newLinks: Link[] = links.map(link =>\n link.id === linkId ? { ...link, operator: type } : link\n );\n onLinksUpdated(newLinks);\n }\n\n handleBlur(): void {\n this.setState({ mode: 'select' });\n }\n\n handleResize(): void {\n const { dialog } = this.state;\n if (dialog && this.dialogRef.current) {\n const rect = this.dialogRef.current.getBoundingClientRect();\n const dialogX = clamp(dialog.x, 0, window.innerWidth - rect.width);\n const dialogY = clamp(dialog.y, 0, window.innerHeight - rect.height);\n this.setState({\n dialog: { x: dialogX, y: dialogY },\n });\n }\n }\n\n handleMouseMove(event: MouseEvent): void {\n const { offset, isDragging } = this.state;\n this.setState({\n mouse: { x: event.clientX, y: event.clientY },\n });\n\n if (isDragging && this.dialogRef.current) {\n const rect = this.dialogRef.current.getBoundingClientRect();\n const dialogX = clamp(\n window.innerWidth - (event.clientX + rect.width + offset.x),\n 0,\n window.innerWidth - rect.width\n );\n\n const dialogY = clamp(\n window.innerHeight - (event.clientY + rect.height + offset.y),\n 0,\n window.innerHeight - rect.height\n );\n\n this.setState({\n dialog: { x: dialogX, y: dialogY },\n });\n }\n }\n\n handleMouseDown(event: React.MouseEvent): void {\n const offset: Point = { x: 0, y: 0 };\n if (this.dialogRef.current) {\n const rect = this.dialogRef.current.getBoundingClientRect();\n offset.x = rect.right - (rect.width + event.clientX);\n offset.y = rect.bottom - (rect.height + event.clientY);\n }\n this.setState({\n isDragging: true,\n offset,\n });\n }\n\n handleMouseUp(): void {\n this.setState({\n isDragging: false,\n });\n }\n\n handleKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Alt') {\n event.preventDefault();\n this.setState({\n mode: 'delete',\n });\n } else if (event.key === 'Delete' || event.key === 'Backspace') {\n const { selectedIds, onLinkDeleted } = this.props;\n event.preventDefault();\n selectedIds.forEach(id => onLinkDeleted(id));\n }\n }\n\n handleKeyUp(event: KeyboardEvent): void {\n if (event.key === 'Alt') {\n event.preventDefault();\n this.setState({\n mode: 'select',\n });\n }\n }\n\n handleEscapePressed(): void {\n const { onCancel } = this.props;\n onCancel();\n }\n\n render(): JSX.Element {\n const {\n disabled,\n links,\n selectedIds,\n messageText,\n onLinkSelected,\n onLinkDeleted,\n onAllLinksDeleted,\n onDone,\n } = this.props;\n\n const { mouse, dialog, isDragging, mode } = this.state;\n const visibleLinks = links\n .map(link => {\n try {\n const { id, type, isReversed, start, end, operator } = link;\n const startColumnType = start.columnType;\n let [x1, y1] = this.getPointFromLinkPoint(start);\n let x2 = mouse?.x ?? x1;\n let y2 = mouse?.y ?? y1;\n if (end != null) {\n [x2, y2] = this.getPointFromLinkPoint(end);\n }\n if (isReversed != null && isReversed) {\n const [tmpX, tmpY] = [x1, y1];\n [x1, y1] = [x2, y2];\n [x2, y2] = [tmpX, tmpY];\n }\n const className = classNames(\n 'linker-link',\n { disabled },\n { 'link-filter-source': type === 'filterSource' },\n { 'link-invalid': type === 'invalid' },\n { interactive: link.end == null },\n { 'link-is-selected': selectedIds.has(id) },\n { 'danger-delete': mode === 'delete' }\n );\n return {\n x1,\n y1,\n x2,\n y2,\n id,\n className,\n operator,\n startColumnType,\n };\n } catch (error) {\n log.error('Unable to get point for link', link, error);\n return null;\n }\n })\n .filter(item => item != null) as VisibleLink[];\n\n return (\n <div\n className={classNames('linker-overlay', {\n 'danger-delete': mode === 'delete',\n })}\n >\n {visibleLinks.map(\n ({ x1, y1, x2, y2, id, className, operator, startColumnType }) => (\n <LinkerLink\n className={className}\n id={id}\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n key={id}\n onClick={onLinkSelected}\n onDelete={onLinkDeleted}\n isSelected={selectedIds.has(id)}\n operator={operator}\n startColumnType={startColumnType}\n onOperatorChanged={this.handleOperatorChanged}\n />\n )\n )}\n <div\n className={classNames('linker-toast-dialog', {\n dragging: isDragging,\n })}\n ref={this.dialogRef}\n style={{ bottom: dialog?.y, right: dialog?.x }}\n >\n <Button\n draggable\n kind=\"inline\"\n className=\"btn-drag-handle\"\n icon={vsGripper}\n onClick={() => {\n // no-op\n }}\n onMouseDown={this.handleMouseDown}\n >\n {!isDragging && <Tooltip>Drag to reposition</Tooltip>}\n </Button>\n <div className=\"toast-body\">{messageText}</div>\n <div className=\"toast-footer\">\n <Button kind=\"secondary\" onClick={onAllLinksDeleted}>\n Clear All\n </Button>\n <Button kind=\"primary\" onClick={onDone}>\n Done\n </Button>\n </div>\n </div>\n <ContextActions\n actions={[\n {\n action: this.handleEscapePressed,\n shortcut: GLOBAL_SHORTCUTS.LINKER_CLOSE,\n isGlobal: true,\n },\n ]}\n />\n </div>\n );\n }\n}\n\nexport default LinkerOverlayContent;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/dashboard-core-plugins",
3
- "version": "0.23.1-beta.2+2fefc95",
3
+ "version": "0.23.1-beta.6+ae43d18",
4
4
  "description": "Deephaven Dashboard Core Plugins",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -22,26 +22,27 @@
22
22
  "build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
23
23
  },
24
24
  "dependencies": {
25
- "@deephaven/chart": "^0.23.1-beta.2+2fefc95",
26
- "@deephaven/components": "^0.23.1-beta.2+2fefc95",
27
- "@deephaven/console": "^0.23.1-beta.2+2fefc95",
28
- "@deephaven/dashboard": "^0.23.1-beta.2+2fefc95",
29
- "@deephaven/file-explorer": "^0.23.1-beta.2+2fefc95",
30
- "@deephaven/filters": "^0.23.1-beta.2+2fefc95",
31
- "@deephaven/golden-layout": "^0.23.1-beta.2+2fefc95",
32
- "@deephaven/grid": "^0.23.1-beta.2+2fefc95",
33
- "@deephaven/icons": "^0.23.1-beta.2+2fefc95",
34
- "@deephaven/iris-grid": "^0.23.1-beta.2+2fefc95",
35
- "@deephaven/jsapi-shim": "^0.23.1-beta.2+2fefc95",
36
- "@deephaven/jsapi-utils": "^0.23.1-beta.2+2fefc95",
37
- "@deephaven/log": "^0.23.1-beta.2+2fefc95",
38
- "@deephaven/react-hooks": "^0.23.1-beta.2+2fefc95",
39
- "@deephaven/redux": "^0.23.1-beta.2+2fefc95",
40
- "@deephaven/storage": "^0.23.1-beta.2+2fefc95",
41
- "@deephaven/utils": "^0.23.1-beta.2+2fefc95",
25
+ "@deephaven/chart": "^0.23.1-beta.6+ae43d18",
26
+ "@deephaven/components": "^0.23.1-beta.6+ae43d18",
27
+ "@deephaven/console": "^0.23.1-beta.6+ae43d18",
28
+ "@deephaven/dashboard": "^0.23.1-beta.6+ae43d18",
29
+ "@deephaven/file-explorer": "^0.23.1-beta.6+ae43d18",
30
+ "@deephaven/filters": "^0.23.1-beta.6+ae43d18",
31
+ "@deephaven/golden-layout": "^0.23.1-beta.6+ae43d18",
32
+ "@deephaven/grid": "^0.23.1-beta.6+ae43d18",
33
+ "@deephaven/icons": "^0.23.1-beta.6+ae43d18",
34
+ "@deephaven/iris-grid": "^0.23.1-beta.6+ae43d18",
35
+ "@deephaven/jsapi-shim": "^0.23.1-beta.6+ae43d18",
36
+ "@deephaven/jsapi-utils": "^0.23.1-beta.6+ae43d18",
37
+ "@deephaven/log": "^0.23.1-beta.6+ae43d18",
38
+ "@deephaven/react-hooks": "^0.23.1-beta.6+ae43d18",
39
+ "@deephaven/redux": "^0.23.1-beta.6+ae43d18",
40
+ "@deephaven/storage": "^0.23.1-beta.6+ae43d18",
41
+ "@deephaven/utils": "^0.23.1-beta.6+ae43d18",
42
42
  "@fortawesome/react-fontawesome": "^0.1.18",
43
43
  "classnames": "^2.3.1",
44
44
  "deep-equal": "^2.0.5",
45
+ "lodash.clamp": "^4.0.3",
45
46
  "lodash.debounce": "^4.0.8",
46
47
  "lodash.throttle": "^4.1.1",
47
48
  "memoize-one": "^5.1.1",
@@ -60,8 +61,8 @@
60
61
  "react-redux": "^7.2.4"
61
62
  },
62
63
  "devDependencies": {
63
- "@deephaven/mocks": "^0.23.1-beta.2+2fefc95",
64
- "@deephaven/tsconfig": "^0.23.1-beta.2+2fefc95"
64
+ "@deephaven/mocks": "^0.23.1-beta.6+ae43d18",
65
+ "@deephaven/tsconfig": "^0.23.1-beta.6+ae43d18"
65
66
  },
66
67
  "files": [
67
68
  "dist"
@@ -69,5 +70,5 @@
69
70
  "publishConfig": {
70
71
  "access": "public"
71
72
  },
72
- "gitHead": "2fefc956696238b9231ee0d075707f2e997f1a1c"
73
+ "gitHead": "ae43d18ca89e6804a274342a298d1bac4eead593"
73
74
  }