rapidograph 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +157 -0
- package/dist/components/rapido-bar/index.d.ts +69 -0
- package/dist/components/rapido-bar/index.js +381 -0
- package/dist/components/rapido-bar/index.js.map +1 -0
- package/dist/components/rapido-bar/rapidobar.css.js +5 -0
- package/dist/components/rapido-bar/rapidobar.css.js.map +1 -0
- package/dist/helpers/tooltip/index.d.ts +18 -0
- package/dist/helpers/tooltip/index.js +80 -0
- package/dist/helpers/tooltip/index.js.map +1 -0
- package/dist/helpers/tooltip/tooltip.css.js +5 -0
- package/dist/helpers/tooltip/tooltip.css.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/shared/constants.d.ts +11 -0
- package/dist/shared/constants.js +15 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/enums.d.ts +26 -0
- package/dist/shared/enums.js +25 -0
- package/dist/shared/enums.js.map +1 -0
- package/dist/shared/types.d.ts +12 -0
- package/dist/utils/dom.d.ts +26 -0
- package/dist/utils/dom.js +40 -0
- package/dist/utils/dom.js.map +1 -0
- package/dist/utils/rapidobar.d.ts +66 -0
- package/dist/utils/rapidobar.js +74 -0
- package/dist/utils/rapidobar.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../lib/components/rapido-bar/index.ts"],"sourcesContent":["import {\n DATA_LENGTH_CSS_VAR,\n DEFAULT_Y_AXIS_WIDTH,\n type DataItem,\n MAX_Y_AXIS_WIDTH,\n MIN_Y_AXIS_WIDTH,\n Orientation,\n SCROLLBAR_WIDTH_CSS_VAR,\n ShowLabels,\n Theme,\n type ValueFormatters,\n XAxisPosition,\n X_AXIS_FIRST_LABEL_CSS_VAR,\n X_AXIS_HEIGHT_CSS_VAR,\n X_AXIS_LAST_LABEL_CSS_VAR,\n YAxisPosition,\n Y_AXIS_WIDTH_CSS_VAR,\n} from \"../../shared\";\nimport {\n LitElement,\n type PropertyValues,\n css,\n html,\n nothing,\n unsafeCSS,\n} from \"lit\";\nimport {\n calculateYAxisWidths,\n checkIfAllPositiveOrNegative,\n checkIfSomePositiveAndNegative,\n formatLabel,\n formatLabels,\n generateTicks,\n getMinAndMax,\n getScrollbarSize,\n getSizeInPercentages,\n getTextWidth,\n getUpdatedYAxisWidth,\n noop,\n} from \"../../utils\";\nimport {\n customElement,\n eventOptions,\n property,\n query,\n queryAll,\n state,\n} from \"lit/decorators.js\";\nimport { Tooltip } from \"../../helpers/tooltip\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport styles from \"./rapidobar.css?inline\";\n\n@customElement(\"rapido-bar\")\nexport class Rapidobar extends LitElement {\n static get styles() {\n return css`\n ${unsafeCSS(styles)}\n `;\n }\n\n private _data: DataItem[] = [];\n private _categoryLabels: (string | number)[] = [];\n private _ticks: number[] = [];\n private _tickLabels: (string | number)[] = [];\n private _hasPositive: boolean = true;\n private _hasNegative: boolean = false;\n private _allPositive: boolean = true;\n private _allNegative: boolean = false;\n private _yAxisMinWidth: number = MIN_Y_AXIS_WIDTH;\n private _yAxisMaxWidth: number = MAX_Y_AXIS_WIDTH;\n private _vObserver: IntersectionObserver | undefined;\n private _hObserver: IntersectionObserver | undefined;\n private _oldCursor?: string;\n\n private get _yAxisWidthPercentage() {\n const maxYAxisWidth = this._yAxisMaxWidth - this._yAxisMinWidth;\n const currentYAxisWidth = this._yAxisWidth - this._yAxisMinWidth;\n return ((currentYAxisWidth * 100) / maxYAxisWidth).toFixed(0);\n }\n\n private get _yAxisWidthDescription() {\n return `Y-axis offset ${this._yAxisWidthPercentage}%`;\n }\n\n @state()\n private _xAxisHeight: number = 0;\n @state()\n private _firstXAxisLabelWidth: number = 0;\n @state()\n private _lastXAxisLabelWidth: number = 0;\n @state()\n private _scrollbarSize: number = 0;\n @state()\n private _activeBar: HTMLElement | null = null;\n @state()\n private _yAxisWidth: number = DEFAULT_Y_AXIS_WIDTH;\n @state()\n private _isDraggingYAxis: boolean = false;\n @state()\n private _focusedBarIndex: number = 0;\n\n @property({ type: Array, attribute: false })\n get data(): DataItem[] {\n return this._data || [];\n }\n\n set data(value: DataItem[]) {\n const oldValue = this._data;\n this._data = value;\n this.requestUpdate(\"data\", oldValue);\n\n const length = this._data.length;\n const categories = new Array<string>(length);\n const values = new Array<number>(length);\n this.data.forEach(({ category, value }, index) => {\n categories[index] = category;\n values[index] = value;\n });\n this._categoryLabels = formatLabels(categories, this.formatters.category);\n const [minBarSize, maxBarSize] = getMinAndMax(values);\n this._ticks = generateTicks(minBarSize, maxBarSize);\n this._tickLabels = formatLabels(this._ticks, this.formatters.value);\n [this._hasPositive, this._hasNegative] =\n checkIfSomePositiveAndNegative(values);\n [this._allPositive, this._allNegative] =\n checkIfAllPositiveOrNegative(values);\n this._calculateTickWidths();\n }\n\n @property({ type: Object, attribute: false })\n formatters: ValueFormatters = {};\n\n @property({ type: Orientation })\n orientation: Orientation = Orientation.Vertical;\n\n @property({ type: XAxisPosition, attribute: \"x-axis-position\" })\n xAxisPosition = XAxisPosition.Bottom;\n\n @property({ type: YAxisPosition, attribute: \"y-axis-position\" })\n yAxisPosition = YAxisPosition.Left;\n\n @property({ type: Theme })\n theme = Theme.Light;\n\n @property({ type: Theme, attribute: \"tooltip-theme\" })\n tooltipTheme = Theme.Light;\n\n @property({ type: String, attribute: \"category-label\" })\n categoryLabel: string = \"\";\n\n @property({ type: String, attribute: \"value-label\" })\n valueLabel: string = \"\";\n\n @property({ type: ShowLabels, attribute: \"show-labels\" })\n showLabels = ShowLabels.Always;\n\n private get _wrapperClasses() {\n return {\n rpg: true,\n [this.orientation]: true,\n [`x-axis-${this.xAxisPosition}`]: true,\n [`y-axis-${this.yAxisPosition}`]: true,\n [`labels-${this.showLabels}`]: true,\n };\n }\n private get _wrapperStyles() {\n return {\n [SCROLLBAR_WIDTH_CSS_VAR]: `${this._scrollbarSize}px`,\n [Y_AXIS_WIDTH_CSS_VAR]: `${this._yAxisWidth}px`,\n [X_AXIS_HEIGHT_CSS_VAR]: `${this._xAxisHeight}px`,\n [DATA_LENGTH_CSS_VAR]: this.data.length,\n [X_AXIS_FIRST_LABEL_CSS_VAR]: `${this._firstXAxisLabelWidth}px`,\n [X_AXIS_LAST_LABEL_CSS_VAR]: `${this._lastXAxisLabelWidth}px`,\n };\n }\n private get _barContainerClasses() {\n return {\n \"rpg-bar-container\": true,\n \"start-from-half\": this._hasPositive && this._hasNegative,\n };\n }\n\n @query(\".rpg\")\n private _wrapper!: HTMLElement;\n @query(\".rpg-scrollable\")\n private _scrollableElem!: HTMLElement;\n @query(\".rpg-bar-container\")\n private _barContainer!: HTMLElement;\n @query(\".rpg-x-axis\")\n private _xAxis!: HTMLElement;\n @query(\".rpg-y-axis\")\n private _yAxis!: HTMLElement;\n @query(\"#rpg-get-text-width\")\n private _textSizeDiv!: HTMLElement;\n @queryAll(\".rpg-bar\")\n private _bars!: HTMLElement[];\n\n render() {\n const isVertical = this.orientation === Orientation.Vertical;\n const xAxisLabel = isVertical ? this.categoryLabel : this.valueLabel;\n const yAxisLabel = isVertical ? this.valueLabel : this.categoryLabel;\n let xAxisLabels;\n let yAxisLabels;\n if (isVertical) {\n xAxisLabels = this._categoryLabels;\n yAxisLabels = this._tickLabels;\n } else {\n xAxisLabels = this._tickLabels;\n yAxisLabels = this._categoryLabels;\n }\n\n const xAxisLabelTemplates = [];\n for (const label of xAxisLabels) {\n xAxisLabelTemplates.push(html`\n <div class=\"rpg-axis-label\" title=${label}>${label}</div>\n `);\n }\n const xAxisTemplate = html`\n <div class=\"rpg-x-axis\">\n ${xAxisLabel\n ? html`<div class=\"rpg-axis-label rpg-axis-title\">\n <div class=\"rpg-axis-title-content\">${xAxisLabel}</div>\n </div>`\n : nothing}\n <div class=\"rpg-x-axis-labels\">${xAxisLabelTemplates}</div>\n </div>\n `;\n\n const yAxisLabelTemplates = [];\n for (const label of yAxisLabels) {\n yAxisLabelTemplates.push(html`\n <div class=\"rpg-axis-label\" title=${label}>${label}</div>\n `);\n }\n\n // tabindex matches flex order - visual and focus order are synchronized\n const yAxisTemplate = html`\n <div class=\"rpg-y-axis\">\n <div class=\"rpg-y-axis-labels\">${yAxisLabelTemplates}</div>\n <div\n class=\"rpg-y-axis-line-container\"\n role=\"slider\"\n tabindex=${this.yAxisPosition === YAxisPosition.Left ? \"1\" : \"0\"}\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n aria-valuenow=${this._yAxisWidthPercentage}\n aria-valuetext=${this._yAxisWidthDescription}\n aria-label=${`Y-axis positioned ${this.yAxisPosition}`}\n @dragstart=${noop}\n @pointerdown=${this.onYAxisPointerDown}\n @keydown=${this.onYAxisKeyDown}\n >\n ${yAxisLabel\n ? html`<div class=\"rpg-axis-label rpg-axis-title\">\n <div class=\"rpg-axis-title-content\">${yAxisLabel}</div>\n </div>`\n : nothing}\n <div class=\"rpg-y-axis-line\"></div>\n </div>\n </div>\n `;\n\n const gridlineTemplates = [];\n for (let i = 0; i < this._ticks.length - 1; i++) {\n gridlineTemplates.push(html`<div class=\"rpg-gridline\"></div>`);\n }\n\n const barTemplates = [];\n for (const [index, { value }] of this.data.entries()) {\n const isFocused = index === this._focusedBarIndex;\n const category = this._categoryLabels[index];\n const axisValue = this._tickLabels[index];\n const barValue = formatLabel(value, this.formatters.data);\n const tooltipValue = formatLabel(\n value,\n this.formatters.tooltip || this.formatters.value,\n );\n\n const isPositive =\n this._allPositive || !this._allNegative ? value >= 0 : value > 0;\n const barSize = getSizeInPercentages(\n value,\n this._ticks[0],\n this._ticks.at(-1),\n );\n\n barTemplates.push(\n html`<li\n class=\"rpg-bar ${isPositive ? \"positive\" : \"negative\"}\"\n tabindex=${isFocused ? 0 : -1}\n aria-current=${isFocused ? \"true\" : \"false\"}\n aria-label=\"${category}: ${axisValue}\"\n data-category=${category}\n data-value=${tooltipValue}\n >\n <div\n class=\"rpg-bar-content\"\n style=\"--rpg-bar-size: ${Math.abs(barSize)}%;\"\n >\n <div class=\"rpg-bar-label\">${barValue}</div>\n <div class=\"rpg-small-bar-label\">${barValue}</div>\n </div>\n </li>`,\n );\n }\n\n return html`\n <div\n class=${classMap(this._wrapperClasses)}\n style=${styleMap(this._wrapperStyles)}\n role=\"figure\"\n >\n <div class=\"rpg-scrollable\">\n <div class=\"rpg-scrollable-content\">\n ${isVertical ? xAxisTemplate : yAxisTemplate}\n <div class=\"rpg-content-container\">\n <div class=\"rpg-gridlines\">${gridlineTemplates}</div>\n <ul\n class=${classMap(this._barContainerClasses)}\n @mouseenter=${this.onBarEnter}\n @mouseleave=${this.onBarContainerMouseLeave}\n @focus=${this.onBarContainerFocus}\n @blur=${this.onBarContainerBlur}\n @keydown=${this.onBarContainerKeyDown}\n >\n ${this.data.length\n ? barTemplates\n : html`<div class=\"rpg-empty-state\">No data</div>`}\n </ul>\n </div>\n </div>\n </div>\n ${isVertical ? yAxisTemplate : xAxisTemplate}\n </div>\n <tool-tip\n .element=${this._isDraggingYAxis ? null : this._activeBar}\n .container=${this._scrollableElem}\n orientation=${this.orientation}\n theme=${this.tooltipTheme}\n ></tool-tip>\n <div aria-live=\"polite\">${this._yAxisWidthDescription}</div>\n <div id=\"rpg-get-text-width\" class=\"rpg-axis-label\"></div>\n `;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!customElements.get(\"tool-tip\")) {\n customElements.define(\"tool-tip\", Tooltip);\n }\n }\n\n protected firstUpdated(_changedProperties: PropertyValues): void {\n super.firstUpdated(_changedProperties);\n\n this._calculateYAxisWidths();\n this.addObservers();\n }\n\n updated(changedProperties: Map<string, never>) {\n if (this._xAxis) {\n this._xAxisHeight = this._xAxis.getBoundingClientRect().height ?? 1 - 1;\n }\n\n if (changedProperties.get(\"orientation\") || changedProperties.get(\"data\")) {\n this._calculateYAxisWidths();\n }\n }\n\n private _calculateYAxisWidths(): void {\n const isVertical = this.orientation === Orientation.Vertical;\n [this._yAxisMinWidth, this._yAxisWidth, this._yAxisMaxWidth] =\n calculateYAxisWidths(\n this._textSizeDiv,\n this._wrapper,\n this._yAxis,\n isVertical ? this._tickLabels : this._categoryLabels,\n );\n }\n\n private _calculateTickWidths(): void {\n this._firstXAxisLabelWidth = getTextWidth(\n this._textSizeDiv,\n this._tickLabels[0].toString(),\n );\n this._lastXAxisLabelWidth = getTextWidth(\n this._textSizeDiv,\n this._tickLabels.at(-1)?.toString(),\n );\n }\n\n private addObservers() {\n const options = {\n root: this._scrollableElem,\n threshold: 1,\n };\n\n const callback = () => {\n this._scrollbarSize = getScrollbarSize(\n this.orientation,\n this._scrollableElem,\n );\n };\n this._vObserver = new IntersectionObserver(callback, {\n ...options,\n rootMargin: \"0px -16px\",\n });\n this._hObserver = new IntersectionObserver(callback, {\n ...options,\n rootMargin: \"-16px 0px\",\n });\n this._vObserver.observe(this._barContainer);\n this._hObserver.observe(this._barContainer);\n }\n\n @eventOptions({ capture: true })\n private onBarEnter(event: MouseEvent) {\n const target = event.target as HTMLElement;\n if (target.classList.contains(\"rpg-bar\")) {\n this._activeBar = target;\n }\n }\n\n @eventOptions({ capture: true })\n private onBarContainerMouseLeave(event: MouseEvent) {\n if (event.target === event.currentTarget) {\n this._activeBar = null;\n }\n }\n\n @eventOptions({ capture: true })\n private onBarContainerFocus(event: FocusEvent) {\n this._activeBar = event.target as HTMLElement;\n }\n\n @eventOptions({ capture: true })\n private onBarContainerBlur(event: FocusEvent) {\n const nextFocused = event.relatedTarget as HTMLElement;\n if (\n !nextFocused ||\n (nextFocused && !this._barContainer.contains(nextFocused))\n ) {\n this._activeBar = null;\n this._focusedBarIndex = 0;\n }\n }\n\n @eventOptions({ capture: true })\n private onBarContainerKeyDown(event: KeyboardEvent) {\n const isVertical = this.orientation === Orientation.Vertical;\n const nextKey = isVertical ? \"ArrowRight\" : \"ArrowDown\";\n const prevKey = isVertical ? \"ArrowLeft\" : \"ArrowUp\";\n const key = event.key;\n\n if (key === nextKey) {\n event.preventDefault();\n this._focusedBarIndex = Math.min(\n this._focusedBarIndex + 1,\n this.data.length - 1,\n );\n this._bars[this._focusedBarIndex].focus();\n } else if (key === prevKey) {\n event.preventDefault();\n this._focusedBarIndex = Math.max(this._focusedBarIndex - 1, 0);\n this._bars[this._focusedBarIndex].focus();\n } else if (key === \"Home\") {\n event.preventDefault();\n this._focusedBarIndex = 0;\n this._bars[this._focusedBarIndex].focus();\n } else if (key === \"End\") {\n event.preventDefault();\n this._focusedBarIndex = this.data.length - 1;\n this._bars[this._focusedBarIndex].focus();\n }\n }\n\n private onYAxisPointerDown(pointerDownEvent: PointerEvent) {\n pointerDownEvent.preventDefault();\n this._isDraggingYAxis = true;\n\n let newWidth = this._yAxisWidth;\n const self = this;\n\n const handlePointerMove = (pointerMoveEvent: PointerEvent) => {\n const parent = self._wrapper;\n\n const moveClientX = pointerMoveEvent.clientX;\n const downClientX = pointerDownEvent.clientX;\n\n newWidth =\n self._yAxisWidth +\n (self.yAxisPosition === YAxisPosition.Left\n ? moveClientX - downClientX\n : downClientX - moveClientX);\n let allowedMaxWidth = self._yAxisMaxWidth;\n\n // the pointer is out of slider => lock the thumb within the boundaries\n if (newWidth < self._yAxisMinWidth) {\n newWidth = self._yAxisMinWidth;\n }\n\n if (self._yAxisMaxWidth > parent.offsetWidth - MAX_Y_AXIS_WIDTH) {\n allowedMaxWidth = parent.offsetWidth - MAX_Y_AXIS_WIDTH;\n }\n if (newWidth > allowedMaxWidth) {\n newWidth = allowedMaxWidth;\n }\n this._wrapper.style.setProperty(Y_AXIS_WIDTH_CSS_VAR, `${newWidth}px`);\n };\n\n function handlePointerUp(): void {\n self._yAxisWidth = newWidth;\n self._isDraggingYAxis = false;\n if (self._oldCursor) {\n document.body.style.cursor = self._oldCursor;\n } else {\n document.body.style.removeProperty(\"cursor\");\n }\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n }\n\n self._oldCursor = document.body.style.cursor;\n document.body.style.cursor = \"col-resize\";\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n }\n\n private onYAxisKeyDown(event: KeyboardEvent): void {\n const percentage = parseInt(this._yAxisWidthPercentage ?? \"0\", 10);\n const key = event.key;\n const isLeftAxis = this.yAxisPosition === YAxisPosition.Left;\n const leftKey = isLeftAxis ? \"ArrowLeft\" : \"ArrowRight\";\n const rightKey = isLeftAxis ? \"ArrowRight\" : \"ArrowLeft\";\n const commonArgs = {\n currentPercentage: percentage,\n minWidth: this._yAxisMinWidth,\n maxWidth: this._yAxisMaxWidth,\n };\n\n if (key === leftKey) {\n event.preventDefault();\n this._yAxisWidth =\n getUpdatedYAxisWidth({\n ...commonArgs,\n widthPercentage: Math.max(percentage - 5, 0),\n }) ?? this._yAxisWidth;\n } else if (key === rightKey) {\n event.preventDefault();\n this._yAxisWidth =\n getUpdatedYAxisWidth({\n ...commonArgs,\n widthPercentage: Math.min(percentage + 5, 100),\n }) ?? this._yAxisWidth;\n } else if (key === \"Home\") {\n event.preventDefault();\n this._yAxisWidth =\n getUpdatedYAxisWidth({\n ...commonArgs,\n widthPercentage: 0,\n }) ?? this._yAxisWidth;\n } else if (key === \"End\") {\n event.preventDefault();\n this._yAxisWidth =\n getUpdatedYAxisWidth({\n ...commonArgs,\n widthPercentage: 100,\n }) ?? this._yAxisWidth;\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._vObserver?.unobserve(this._barContainer);\n this._hObserver?.unobserve(this._barContainer);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rapido-bar\": Rapidobar;\n }\n}\n"],"names":["Rapidobar","LitElement","MIN_Y_AXIS_WIDTH","MAX_Y_AXIS_WIDTH","DEFAULT_Y_AXIS_WIDTH","Orientation","XAxisPosition","YAxisPosition","Theme","ShowLabels","css","unsafeCSS","styles","maxYAxisWidth","value","oldValue","length","categories","values","category","index","formatLabels","minBarSize","maxBarSize","getMinAndMax","generateTicks","checkIfSomePositiveAndNegative","checkIfAllPositiveOrNegative","SCROLLBAR_WIDTH_CSS_VAR","Y_AXIS_WIDTH_CSS_VAR","X_AXIS_HEIGHT_CSS_VAR","DATA_LENGTH_CSS_VAR","X_AXIS_FIRST_LABEL_CSS_VAR","X_AXIS_LAST_LABEL_CSS_VAR","isVertical","xAxisLabel","yAxisLabel","xAxisLabels","yAxisLabels","xAxisLabelTemplates","label","html","xAxisTemplate","nothing","yAxisLabelTemplates","yAxisTemplate","noop","gridlineTemplates","i","barTemplates","isFocused","axisValue","barValue","formatLabel","tooltipValue","isPositive","barSize","getSizeInPercentages","classMap","styleMap","Tooltip","_changedProperties","changedProperties","calculateYAxisWidths","getTextWidth","options","callback","getScrollbarSize","event","target","nextFocused","nextKey","prevKey","key","pointerDownEvent","newWidth","self","handlePointerMove","pointerMoveEvent","parent","moveClientX","downClientX","allowedMaxWidth","handlePointerUp","percentage","isLeftAxis","leftKey","rightKey","commonArgs","getUpdatedYAxisWidth","__decorateClass","state","property","query","queryAll","eventOptions","customElement"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
const r = ':host{--rpg-bar-border-radius: .375rem;--rpg-bar-color: #85b8ff;--rpg-bar-bg-color: #f7f8f980;--rpg-bar-color-hover: #579cff;--rpg-bar-label-color: #232529;--rpg-axis-title-color: white;--rpg-gridline-color: #b3b9c4;--rpg-bar-color-dark: #0055cc;--rpg-bar-bg-color-dark: #1d212580;--rpg-bar-color-hover-dark: #0c65e3;--rpg-bar-label-color-dark: #eff1f3;--rpg-axis-title-color-dark: #292a2e;--rpg-gridline-color-dark: #596773;height:100%;font-optical-sizing:auto}:host([theme="dark"]) .rpg{--_bar-color: var(--_bar-color-dark);--_bar-bg-color: var(--_bar-bg-color-dark);--_bar-color-hover: var(--_bar-color-hover-dark);--_bar-label-color: var(--_bar-label-color-dark);--_axis-title-bg-color: var(--_axis-title-bg-color-dark);--_gridline-color: var(--_gridline-color-dark)}@media(prefers-color-scheme:dark){:host(:not([theme])) .rpg{--_bar-color: var(--_bar-color-dark);--_bar-bg-color: var(--_bar-bg-color-dark);--_bar-color-hover: var(--_bar-color-hover-dark);--_bar-label-color: var(--_bar-label-color-dark);--_axis-title-bg-color: var(--_axis-title-bg-color-dark);--_gridline-color: var(--_gridline-color-dark)}}.rpg{--_bar-color: var(--rpg-bar-color);--_bar-bg-color: var(--rpg-bar-bg-color);--_bar-color-hover: var(--rpg-bar-color-hover);--_bar-label-color: var(--rpg-bar-label-color);--_axis-title-bg-color: var(--rpg-axis-title-color);--_gridline-color: var(--rpg-gridline-color);--_bar-color-dark: var(--rpg-bar-color-dark);--_bar-bg-color-dark: var(--rpg-bar-bg-color-dark);--_bar-color-hover-dark: var(--rpg-bar-color-hover-dark);--_bar-label-color-dark: var(--rpg-bar-label-color-dark);--_axis-title-bg-color-dark: var(--rpg-axis-title-color-dark);--_gridline-color-dark: var(--rpg-gridline-color-dark);--_1_5px: .094rem;--_gridline-border: var(--_1_5px) solid transparent;--_gridline-vertical-border-image: repeating-linear-gradient( to right, var(--_light-gridline-color) 0 6px, transparent 6px 12px ) 1;--_gridline-horizontal-border-image: repeating-linear-gradient( to bottom, var(--_light-gridline-color) 0 6px, transparent 6px 12px ) 1;--_light-gridline-color: color-mix( in srgb, var(--_gridline-color) 50%, transparent );--_transition-colors: background-color cubic-bezier(.4, 0, .2, 1) .1s;--_transition-opacity: opacity cubic-bezier(.4, 0, .2, 1) .1s;--_bar-label-offset: calc(100% + .188rem) ;--rpg-data-length: 0;--rpg-x-axis-height: 0;--rpg-x-axis-margin-left: 0;--rpg-y-axis-width: 0;--rpg-x-axis-margin-right: 0;--rpg-scrollbar-width: 0;--rpg-bar-size: 0;--rpg-ticks-length: 5;--rpg-x-axis-first-label: 0;--rpg-x-axis-last-label: 0;display:grid;height:100%;width:100%}.rpg.vertical .rpg-scrollable{overflow-x:auto;overflow-y:hidden}.rpg.vertical .rpg-bar-container{margin-left:1rem;margin-right:1rem;height:100%;grid-template-columns:repeat(var(--rpg-data-length),minmax(2.3rem,1fr))}.rpg.vertical .rpg-bar-container.start-from-half .rpg-bar{grid-template-rows:repeat(2,minmax(0,1fr))}.rpg.vertical .rpg-bar-container.start-from-half .rpg-bar.negative .rpg-bar-content{grid-row-start:2}.rpg.vertical .rpg-bar{max-width:3rem}.rpg.vertical .rpg-bar-content{height:max(var(--_1_5px),var(--rpg-bar-size));width:100%;container:verticalBar / size}.rpg.vertical .rpg-bar-label{margin-top:3px;margin-bottom:3px;height:fit-content;width:100%}.rpg.vertical .rpg-small-bar-label{width:100%;justify-content:center}.rpg.vertical .rpg-x-axis .rpg-axis-title{left:50%}.rpg.vertical .rpg-x-axis-labels{display:grid;text-align:center;margin-left:1rem;margin-right:1rem;grid-template-columns:repeat(var(--rpg-data-length),minmax(1.5rem,1fr))}.rpg.vertical .rpg-y-axis-labels{margin-top:-.5rem;margin-bottom:-.5rem;display:flex;justify-content:space-between}.rpg.vertical .rpg-y-axis-line-container .rpg-axis-title{height:50%;translate:0 100%}.rpg.vertical .rpg-gridline{border-bottom:var(--_gridline-border);border-image:var(--_gridline-vertical-border-image)}.rpg.vertical.x-axis-top .rpg-scrollable-content{grid-template-rows:auto 1fr}.rpg.vertical.x-axis-top .rpg-y-axis{margin-top:var(--rpg-x-axis-height);margin-bottom:var(--rpg-scrollbar-width)}.rpg.vertical.x-axis-top .rpg-bar-container.start-from-half .rpg-bar.negative .rpg-bar-content{height:calc(var(--rpg-bar-size) + var(--_1_5px));margin-top:calc(var(--_1_5px) * -1)}.rpg.vertical.x-axis-bottom .rpg-scrollable-content{grid-template-rows:1fr auto}.rpg.vertical.x-axis-bottom .rpg-gridline:first-of-type{border-top:var(--_gridline-border)}.rpg.vertical.x-axis-bottom .rpg-gridline:last-of-type{border-bottom:0}.rpg.vertical.x-axis-bottom .rpg-x-axis{order:2}.rpg.vertical.x-axis-bottom .rpg-y-axis{margin-bottom:calc(var(--rpg-x-axis-height) + var(--rpg-scrollbar-width))}.rpg.vertical.x-axis-bottom .rpg-bar-container.start-from-half .rpg-bar.positive .rpg-bar-content{height:calc(var(--rpg-bar-size) + var(--_1_5px));margin-bottom:calc(var(--_1_5px) * -1)}.rpg.vertical.y-axis-left{grid-template-columns:auto 1fr}.rpg.vertical.y-axis-left .rpg-scrollable{order:2}.rpg.vertical.y-axis-right{grid-template-columns:1fr auto}.rpg.vertical .rpg-bar.positive{align-items:end}.rpg.vertical .rpg-bar.positive .rpg-small-bar-label{bottom:var(--_bar-label-offset)}.rpg.vertical .rpg-bar.positive .rpg-bar-content{border-radius:var(--rpg-bar-border-radius) var(--rpg-bar-border-radius) 0 0}.rpg.vertical .rpg-bar.negative{align-items:start}.rpg.vertical .rpg-bar.negative .rpg-bar-content{align-items:end;border-radius:0 0 var(--rpg-bar-border-radius) var(--rpg-bar-border-radius)}.rpg.vertical .rpg-bar.negative .rpg-small-bar-label{top:var(--_bar-label-offset)}.rpg.horizontal .rpg-scrollable{overflow-x:hidden;overflow-y:auto}.rpg.horizontal .rpg-bar-container{margin-top:1rem;margin-bottom:1rem;gap:1rem;grid-template-rows:repeat(var(--rpg-data-length),minmax(1.5rem,1fr))}.rpg.horizontal .rpg-bar-container.start-from-half .rpg-bar{grid-template-columns:repeat(2,minmax(0,1fr))}.rpg.horizontal .rpg-bar-container.start-from-half .rpg-bar.positive .rpg-bar-content{grid-column-start:2;width:calc(var(--rpg-bar-size) + var(--_1_5px));margin-left:calc(var(--_1_5px) * -1)}.rpg.horizontal .rpg-bar{max-height:3rem}.rpg.horizontal .rpg-bar.positive .rpg-bar-content{border-radius:0 var(--rpg-bar-border-radius) var(--rpg-bar-border-radius) 0}.rpg.horizontal .rpg-bar.negative .rpg-bar-content{border-radius:var(--rpg-bar-border-radius) 0 0 var(--rpg-bar-border-radius)}.rpg.horizontal .rpg-bar-content{width:max(var(--_1_5px),var(--rpg-bar-size));height:100%;container:horizontalBar / size}.rpg.horizontal .rpg-bar-label{margin:auto;height:fit-content;width:fit-content;align-items:center}.rpg.horizontal .rpg-small-bar-label{width:fit-content;height:100%;align-items:center}.rpg.horizontal .rpg-x-axis-labels{display:flex;justify-content:space-between;margin-left:var(--rpg-x-axis-margin-left, 0);margin-right:var(--rpg-x-axis-margin-right, 0)}.rpg.horizontal .rpg-y-axis-labels{margin-top:1rem;margin-bottom:1rem;display:grid;align-items:center;gap:1rem;grid-template-rows:repeat(var(--rpg-data-length),minmax(0,1fr))}.rpg.horizontal .rpg-gridlines{grid-template-columns:repeat(calc(var(--rpg-ticks-length) - 1),1fr)}.rpg.horizontal .rpg-gridline{border-right:var(--_gridline-border);border-image:var(--_gridline-horizontal-border-image)}.rpg.horizontal .rpg-gridline:first-of-type{border-left:var(--_gridline-border)}.rpg.horizontal.x-axis-top{grid-template-rows:auto 1fr}.rpg.horizontal.x-axis-top .rpg-scrollable{order:2}.rpg.horizontal.x-axis-bottom{grid-template-rows:1fr auto}.rpg.horizontal .rpg-y-axis-line-container .rpg-axis-title{top:50%}.rpg.horizontal.y-axis-left .rpg-x-axis{margin-left:var(--rpg-y-axis-width);margin-right:var(--rpg-scrollbar-width)}.rpg.horizontal.y-axis-left .rpg-x-axis .rpg-x-axis-labels{margin-left:calc(var(--rpg-x-axis-first-label) / -2);margin-right:calc(var(--rpg-x-axis-last-label) / -2)}.rpg.horizontal.y-axis-left .rpg-x-axis .rpg-axis-title{left:50%}.rpg.horizontal.y-axis-left .rpg-x-axis .rpg-axis-title-content{margin-left:calc(var(--rpg-y-axis-width) / 2)}.rpg.horizontal.y-axis-left .rpg-scrollable-content{width:100%;grid-template-columns:auto 1fr}.rpg.horizontal.y-axis-right .rpg-x-axis{margin-right:calc(var(--rpg-y-axis-width) + var(--rpg-scrollbar-width))}.rpg.horizontal.y-axis-right .rpg-x-axis .rpg-axis-title{width:50%;translate:100% 0}.rpg.horizontal.y-axis-right .rpg-x-axis .rpg-axis-title-content{margin-right:calc(var(--rpg-y-axis-width) / 2)}.rpg.horizontal.y-axis-right .rpg-y-axis{order:2}.rpg.horizontal.y-axis-right .rpg-scrollable-content{width:100%;grid-template-columns:1fr auto}.rpg.horizontal .rpg-bar.positive .rpg-small-bar-label{left:var(--_bar-label-offset)}.rpg.horizontal .rpg-bar.negative{justify-items:end}.rpg.horizontal .rpg-bar.negative .rpg-small-bar-label{right:var(--_bar-label-offset)}.rpg.x-axis-top .rpg-x-axis{border-bottom:solid var(--_1_5px) var(--_gridline-color)}.rpg.x-axis-top .rpg-x-axis .rpg-axis-title-content{translate:-50% calc(200% - 2px)}.rpg.x-axis-top .rpg-x-axis-labels{padding-bottom:1rem}.rpg.x-axis-bottom .rpg-x-axis{border-top:solid var(--_1_5px) var(--_gridline-color)}.rpg.x-axis-bottom .rpg-x-axis .rpg-axis-title-content{translate:-50% calc(-50% - 1px)}.rpg.x-axis-bottom .rpg-x-axis-labels{padding-top:1rem}.rpg.y-axis-left .rpg-y-axis-labels{text-align:right}.rpg.y-axis-left .rpg-y-axis .rpg-axis-title-content{transform:rotate(-90deg)}.rpg.y-axis-right .rpg-y-axis{flex-direction:row-reverse}.rpg.y-axis-right .rpg-y-axis .rpg-axis-title-content{transform:rotate(90deg)}.rpg.y-axis-right .rpg-y-axis-labels{text-align:left}.rpg.labels-never .rpg-bar-label,.rpg.labels-never .rpg-small-bar-label{display:none}.rpg-bar:not(:hover) :is(.rpg.labels-hover .rpg-bar-label,.rpg.labels-hover .rpg-small-bar-label){opacity:0}.rpg-scrollable{container:scrollable / inline-size}.rpg-scrollable-content{display:grid;height:100%}.rpg-content-container{position:relative;display:flex}.rpg-bar-container{list-style-type:none;padding:0 0 1px;margin:0;flex:1;position:relative;display:grid;gap:.25rem;place-items:center}.rpg-bar{display:grid;height:100%;width:100%;align-items:center;justify-content:normal;transition:var(--_transition-colors)}.rpg-bar:hover,.rpg-bar:focus{background-color:var(--_bar-bg-color)}.rpg-bar-content{position:relative;display:flex;text-align:center;background-color:var(--_bar-color);transition:var(--_transition-colors)}.rpg-bar:hover>.rpg-bar-content,.rpg-bar:focus>.rpg-bar-content{background-color:var(--_bar-color-hover)}.rpg-bar-label{z-index:1;font-size:.75rem;display:none;justify-content:center;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:inherit;line-height:1;color:var(--_bar-label-color);transition:var(--_transition-opacity)}.rpg-small-bar-label{display:flex;position:absolute;line-height:1;font-size:.75rem;font-weight:500;color:var(--_bar-label-color);transition:var(--_transition-opacity)}.rpg-x-axis{position:relative;z-index:1}.rpg-x-axis .rpg-axis-title-content:after{height:2px;top:calc(50% - 1px)}.rpg-x-axis-labels{position:relative;gap:.25rem;color:var(--_bar-label-color)}.rpg-y-axis{z-index:1;display:flex;justify-content:end}.rpg-y-axis:has(.rpg-y-axis-labels:hover) .rpg-y-axis-line{background-color:var(--_bar-color)}.rpg-y-axis:has(.rpg-y-axis-labels:hover) .rpg-axis-title-content{color:var(--_bar-color)}.rpg-y-axis .rpg-axis-title-content:after{height:.25rem;top:calc(50% - .1rem)}.rpg-y-axis-labels{width:calc(100% - 2rem);flex:1;flex-direction:column-reverse;text-align:right}.rpg-y-axis-line-container{position:relative;width:1.5rem;display:flex;justify-content:center;touch-action:none}.rpg-y-axis-line-container:hover,.rpg-y-axis-line-container:active{cursor:col-resize}:is(.rpg-y-axis-line-container:hover,.rpg-y-axis-line-container:active,.rpg-y-axis-line-container:focus) .rpg-y-axis-line{background-color:var(--_bar-color)}:is(.rpg-y-axis-line-container:hover,.rpg-y-axis-line-container:active,.rpg-y-axis-line-container:focus) .rpg-axis-title-content{color:var(--_bar-color)}.rpg-y-axis-line-container .rpg-axis-title-content{translate:calc(-50% + 1px) -50%}.rpg-y-axis-line{height:100%;width:.2rem;border-radius:1rem;box-sizing:border-box;transition:var(--_transition-colors)}.rpg-axis-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.813rem;line-height:1.1;color:var(--_bar-label-color);transition:var(--_transition-colors)}.rpg-axis-title{font-size:.75rem;position:sticky;width:fit-content;height:fit-content;overflow:inherit;margin:0}.rpg-axis-title-content{position:absolute;height:auto;width:auto;text-shadow:0 1px 0 var(--_axis-title-bg-color),0 -1px 0 var(--_axis-title-bg-color),1px 0 0 var(--_axis-title-bg-color),-1px 0 0 var(--_axis-title-bg-color)}.rpg-axis-title-content:after{content:"";position:absolute;left:0;width:100%;background-color:var(--_axis-title-bg-color);z-index:-1}.rpg-gridlines{position:absolute;display:grid;height:100%;width:100%}.rpg-empty-state{font-size:.813rem}[aria-live=polite]{display:none}#rpg-get-text-width{width:fit-content;height:0}@container scrollable (min-width: 550px){.rpg-x-axis-labels,.rpg-bar-container{gap:.375rem}}@container scrollable (min-width: 650px){.rpg-x-axis-labels,.rpg-bar-container{gap:.5rem}}@container scrollable (min-width: 750px){.rpg-x-axis-labels,.rpg-bar-container{gap:.625rem}}@container verticalBar (min-height: 1.25rem){.rpg-bar-label{display:flex}.rpg-small-bar-label{display:none}}@container horizontalBar (min-width: 2.75rem){.rpg-bar-label{display:flex}.rpg-small-bar-label{display:none}}';
|
|
2
|
+
export {
|
|
3
|
+
r as default
|
|
4
|
+
};
|
|
5
|
+
//# sourceMappingURL=rapidobar.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rapidobar.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import { Orientation, Theme } from '../../shared';
|
|
3
|
+
export declare class Tooltip extends LitElement {
|
|
4
|
+
static get styles(): import('lit').CSSResult;
|
|
5
|
+
private _element;
|
|
6
|
+
private _category;
|
|
7
|
+
private _value;
|
|
8
|
+
private _x;
|
|
9
|
+
private _y;
|
|
10
|
+
get element(): HTMLElement | null;
|
|
11
|
+
set element(elem: HTMLElement);
|
|
12
|
+
orientation: Orientation;
|
|
13
|
+
theme: Theme;
|
|
14
|
+
container: HTMLElement;
|
|
15
|
+
connectedCallback(): void;
|
|
16
|
+
render(): import('lit-html').TemplateResult<1>;
|
|
17
|
+
private moveTooltip;
|
|
18
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { LitElement as y, unsafeCSS as u, css as g, html as _ } from "lit";
|
|
2
|
+
import { state as l, property as h, customElement as v } from "lit/decorators.js";
|
|
3
|
+
import d from "./tooltip.css.js";
|
|
4
|
+
import { Orientation as c, Theme as m } from "../../shared/enums.js";
|
|
5
|
+
var f = Object.defineProperty, b = Object.getOwnPropertyDescriptor, s = (r, t, e, n) => {
|
|
6
|
+
for (var o = n > 1 ? void 0 : n ? b(t, e) : t, p = r.length - 1, a; p >= 0; p--)
|
|
7
|
+
(a = r[p]) && (o = (n ? a(t, e, o) : a(o)) || o);
|
|
8
|
+
return n && o && f(t, e, o), o;
|
|
9
|
+
};
|
|
10
|
+
let i = class extends y {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments), this._element = null, this._category = "Unknown", this._value = "NaN", this._x = 0, this._y = 0, this.orientation = c.Vertical, this.theme = m.Light;
|
|
13
|
+
}
|
|
14
|
+
static get styles() {
|
|
15
|
+
return g`
|
|
16
|
+
${u(d)}
|
|
17
|
+
`;
|
|
18
|
+
}
|
|
19
|
+
get element() {
|
|
20
|
+
return this._element;
|
|
21
|
+
}
|
|
22
|
+
set element(r) {
|
|
23
|
+
const t = r instanceof HTMLElement, e = t ? r : null;
|
|
24
|
+
this._element = e;
|
|
25
|
+
const { category: n, value: o } = e?.dataset || {};
|
|
26
|
+
this._category = n ?? "Unknown", this._value = o ?? "NaN", this.setAttribute("show", t.toString()), this.setAttribute(
|
|
27
|
+
"data-content",
|
|
28
|
+
t ? `${this._category}: ${this._value}` : ""
|
|
29
|
+
), this.moveTooltip();
|
|
30
|
+
}
|
|
31
|
+
connectedCallback() {
|
|
32
|
+
super.connectedCallback(), this.id = "rpg-tooltip", this.role = "tooltip", this.inert = !0;
|
|
33
|
+
}
|
|
34
|
+
render() {
|
|
35
|
+
return _`
|
|
36
|
+
<div class="rpg-tooltip-wrapper">
|
|
37
|
+
<div class="rpg-tooltip-category">${this._category}</div>
|
|
38
|
+
<div class="rpg-tooltip-value">${this._value}</div>
|
|
39
|
+
</div>
|
|
40
|
+
`;
|
|
41
|
+
}
|
|
42
|
+
async moveTooltip() {
|
|
43
|
+
if (!this.element)
|
|
44
|
+
return;
|
|
45
|
+
await this.updateComplete;
|
|
46
|
+
const r = this.container.getBoundingClientRect(), t = this.element.getBoundingClientRect(), e = this.getBoundingClientRect();
|
|
47
|
+
this.orientation === c.Vertical ? (this._x = r.right > t.right + e.width + 4 ? t.right + 4 : t.left - 4 - e.width, this._y = t.top + t.height / 2 - e.height / 2) : (this._x = t.left + t.width / 2 - e.width / 2, this._y = r.bottom > t.bottom + e.height + 4 ? t.bottom + 8 : t.top - 8 - e.height), this.style.setProperty("--x", `${this._x}px`), this.style.setProperty("--y", `${this._y}px`);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
s([
|
|
51
|
+
l()
|
|
52
|
+
], i.prototype, "_category", 2);
|
|
53
|
+
s([
|
|
54
|
+
l()
|
|
55
|
+
], i.prototype, "_value", 2);
|
|
56
|
+
s([
|
|
57
|
+
l()
|
|
58
|
+
], i.prototype, "_x", 2);
|
|
59
|
+
s([
|
|
60
|
+
l()
|
|
61
|
+
], i.prototype, "_y", 2);
|
|
62
|
+
s([
|
|
63
|
+
h({ type: HTMLElement, attribute: !1 })
|
|
64
|
+
], i.prototype, "element", 1);
|
|
65
|
+
s([
|
|
66
|
+
h({ type: c })
|
|
67
|
+
], i.prototype, "orientation", 2);
|
|
68
|
+
s([
|
|
69
|
+
h({ type: m })
|
|
70
|
+
], i.prototype, "theme", 2);
|
|
71
|
+
s([
|
|
72
|
+
h({ type: HTMLElement, attribute: !1 })
|
|
73
|
+
], i.prototype, "container", 2);
|
|
74
|
+
i = s([
|
|
75
|
+
v("tool-tip")
|
|
76
|
+
], i);
|
|
77
|
+
export {
|
|
78
|
+
i as Tooltip
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../lib/helpers/tooltip/index.ts"],"sourcesContent":["import { LitElement, css, html, unsafeCSS } from \"lit\";\nimport { Orientation, Theme } from \"../../shared\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport styles from \"./tooltip.css?inline\";\n\n@customElement(\"tool-tip\")\nexport class Tooltip extends LitElement {\n static get styles() {\n return css`\n ${unsafeCSS(styles)}\n `;\n }\n\n private _element: HTMLElement | null = null;\n\n @state()\n private _category: string = \"Unknown\";\n @state()\n private _value: string = \"NaN\";\n @state()\n private _x: number = 0;\n @state()\n private _y: number = 0;\n\n @property({ type: HTMLElement, attribute: false })\n get element(): HTMLElement | null {\n return this._element;\n }\n set element(elem: HTMLElement) {\n const hasElement = elem instanceof HTMLElement;\n\n const element = hasElement ? elem : null;\n this._element = element;\n\n const { category, value } = element?.dataset || {};\n this._category = category ?? \"Unknown\";\n this._value = value ?? \"NaN\";\n\n this.setAttribute(\"show\", hasElement.toString());\n this.setAttribute(\n \"data-content\",\n hasElement ? `${this._category}: ${this._value}` : \"\",\n );\n this.moveTooltip();\n }\n\n @property({ type: Orientation })\n orientation: Orientation = Orientation.Vertical;\n\n @property({ type: Theme })\n theme: Theme = Theme.Light;\n\n @property({ type: HTMLElement, attribute: false })\n container!: HTMLElement;\n\n connectedCallback() {\n super.connectedCallback();\n this.id = \"rpg-tooltip\";\n this.role = \"tooltip\";\n this.inert = true;\n }\n\n render() {\n return html`\n <div class=\"rpg-tooltip-wrapper\">\n <div class=\"rpg-tooltip-category\">${this._category}</div>\n <div class=\"rpg-tooltip-value\">${this._value}</div>\n </div>\n `;\n }\n\n private async moveTooltip() {\n if (!this.element) {\n return;\n }\n // wait for category and value DOM updates\n await this.updateComplete;\n\n const containerRect = this.container.getBoundingClientRect();\n const elementRect = this.element.getBoundingClientRect();\n const tooltipRect = this.getBoundingClientRect();\n\n if (this.orientation === Orientation.Vertical) {\n this._x =\n containerRect.right > elementRect.right + tooltipRect.width + 4\n ? elementRect.right + 4\n : elementRect.left - 4 - tooltipRect.width;\n this._y =\n elementRect.top + elementRect.height / 2 - tooltipRect.height / 2;\n } else {\n this._x =\n elementRect.left + elementRect.width / 2 - tooltipRect.width / 2;\n this._y =\n containerRect.bottom > elementRect.bottom + tooltipRect.height + 4\n ? elementRect.bottom + 8\n : elementRect.top - 8 - tooltipRect.height;\n }\n this.style.setProperty(`--x`, `${this._x}px`);\n this.style.setProperty(`--y`, `${this._y}px`);\n }\n}\n"],"names":["Tooltip","LitElement","Orientation","Theme","css","unsafeCSS","styles","elem","hasElement","element","category","value","html","containerRect","elementRect","tooltipRect","__decorateClass","state","property","customElement"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
const t = ':host{--_bg-color: #1d2125;--_text-color: #eff1f3;--_padding: .75rem;--_text-align: start;--_inset: calc(100% + var(--_padding));pointer-events:none;-webkit-user-select:none;user-select:none;opacity:0;transition:transform .12s ease-in-out;position:fixed;top:0;left:0;transform:translate(var(--x, 0),var(--y, 0));z-index:2;inline-size:max-content;max-inline-size:25ch;font-size:.813rem;margin:0;border-radius:.375rem;text-align:var(--_text-align);padding:var(--_padding);background:var(--_bg-color);color:var(--_text-color);filter:drop-shadow(0 0 3px hsl(0 0% 0% / var(--_shadow-alpha))) drop-shadow(0 0 12px hsl(0 0% 0% / var(--_shadow-alpha)))}:host:before{content:attr(data-content);clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;width:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}:host .rpg-tooltip-wrapper{display:flex;flex-direction:column;row-gap:.5rem}:host .rpg-tooltip-wrapper .rpg-tooltip-category{font-weight:500}:host .rpg-tooltip-wrapper .rpg-tooltip-value{font-weight:700;font-size:1.25rem}:host([theme="light"]){--_bg-color: white;--_text-color: #232529;--_shadow-alpha: 15%}@media(prefers-color-scheme:light){:host:not([theme]){--_bg-color: white;--_text-color: #232529;--_shadow-alpha: 15%}}:host([show="true"]){animation:fadeIn .12s ease-in-out both .1s}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}';
|
|
2
|
+
export {
|
|
3
|
+
t as default
|
|
4
|
+
};
|
|
5
|
+
//# sourceMappingURL=tooltip.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Rapidobar as e } from "./components/rapido-bar/index.js";
|
|
2
|
+
import { Orientation as t, ShowLabels as s, Theme as a, XAxisPosition as n, YAxisPosition as x } from "./shared/enums.js";
|
|
3
|
+
export {
|
|
4
|
+
t as Orientation,
|
|
5
|
+
e as Rapidobar,
|
|
6
|
+
s as ShowLabels,
|
|
7
|
+
a as Theme,
|
|
8
|
+
n as XAxisPosition,
|
|
9
|
+
x as YAxisPosition
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const X_AXIS_HEIGHT_CSS_VAR = "--rpg-x-axis-height";
|
|
2
|
+
export declare const X_AXIS_FIRST_LABEL_CSS_VAR = "--rpg-x-axis-first-label";
|
|
3
|
+
export declare const X_AXIS_LAST_LABEL_CSS_VAR = "--rpg-x-axis-last-label";
|
|
4
|
+
export declare const Y_AXIS_WIDTH_CSS_VAR = "--rpg-y-axis-width";
|
|
5
|
+
export declare const SCROLLBAR_WIDTH_CSS_VAR = "--rpg-scrollbar-width";
|
|
6
|
+
export declare const DATA_LENGTH_CSS_VAR = "--rpg-data-length";
|
|
7
|
+
export declare const Y_AXIS_LINE_WIDTH = 24;
|
|
8
|
+
export declare const DEFAULT_Y_AXIS_WIDTH: number;
|
|
9
|
+
export declare const MIN_Y_AXIS_WIDTH: number;
|
|
10
|
+
export declare const MAX_Y_AXIS_WIDTH: number;
|
|
11
|
+
export declare const MAX_CONTENT_WIDTH = 130;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const _ = "--rpg-x-axis-height", I = "--rpg-x-axis-first-label", A = "--rpg-x-axis-last-label", S = "--rpg-y-axis-width", t = "--rpg-scrollbar-width", s = "--rpg-data-length", T = 24, X = 120, o = 74, H = 292, L = 130;
|
|
2
|
+
export {
|
|
3
|
+
s as DATA_LENGTH_CSS_VAR,
|
|
4
|
+
X as DEFAULT_Y_AXIS_WIDTH,
|
|
5
|
+
L as MAX_CONTENT_WIDTH,
|
|
6
|
+
H as MAX_Y_AXIS_WIDTH,
|
|
7
|
+
o as MIN_Y_AXIS_WIDTH,
|
|
8
|
+
t as SCROLLBAR_WIDTH_CSS_VAR,
|
|
9
|
+
I as X_AXIS_FIRST_LABEL_CSS_VAR,
|
|
10
|
+
_ as X_AXIS_HEIGHT_CSS_VAR,
|
|
11
|
+
A as X_AXIS_LAST_LABEL_CSS_VAR,
|
|
12
|
+
T as Y_AXIS_LINE_WIDTH,
|
|
13
|
+
S as Y_AXIS_WIDTH_CSS_VAR
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../lib/shared/constants.ts"],"sourcesContent":["export const X_AXIS_HEIGHT_CSS_VAR = \"--rpg-x-axis-height\";\nexport const X_AXIS_FIRST_LABEL_CSS_VAR = \"--rpg-x-axis-first-label\";\nexport const X_AXIS_LAST_LABEL_CSS_VAR = \"--rpg-x-axis-last-label\";\nexport const Y_AXIS_WIDTH_CSS_VAR = \"--rpg-y-axis-width\";\nexport const SCROLLBAR_WIDTH_CSS_VAR = \"--rpg-scrollbar-width\";\nexport const DATA_LENGTH_CSS_VAR = \"--rpg-data-length\";\n\nexport const Y_AXIS_LINE_WIDTH = 24;\nexport const DEFAULT_Y_AXIS_WIDTH = 96 + Y_AXIS_LINE_WIDTH;\nexport const MIN_Y_AXIS_WIDTH = 50 + Y_AXIS_LINE_WIDTH;\nexport const MAX_Y_AXIS_WIDTH = 268 + Y_AXIS_LINE_WIDTH;\nexport const MAX_CONTENT_WIDTH = 130;\n"],"names":["X_AXIS_HEIGHT_CSS_VAR","X_AXIS_FIRST_LABEL_CSS_VAR","X_AXIS_LAST_LABEL_CSS_VAR","Y_AXIS_WIDTH_CSS_VAR","SCROLLBAR_WIDTH_CSS_VAR","DATA_LENGTH_CSS_VAR","Y_AXIS_LINE_WIDTH","DEFAULT_Y_AXIS_WIDTH","MIN_Y_AXIS_WIDTH","MAX_Y_AXIS_WIDTH","MAX_CONTENT_WIDTH"],"mappings":"AAAO,MAAMA,IAAwB,uBACxBC,IAA6B,4BAC7BC,IAA4B,2BAC5BC,IAAuB,sBACvBC,IAA0B,yBAC1BC,IAAsB,qBAEtBC,IAAoB,IACpBC,IAAuB,KACvBC,IAAmB,IACnBC,IAAmB,KACnBC,IAAoB;"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const Orientation: {
|
|
2
|
+
readonly Horizontal: "horizontal";
|
|
3
|
+
readonly Vertical: "vertical";
|
|
4
|
+
};
|
|
5
|
+
export type Orientation = (typeof Orientation)[keyof typeof Orientation];
|
|
6
|
+
export declare const XAxisPosition: {
|
|
7
|
+
readonly Top: "top";
|
|
8
|
+
readonly Bottom: "bottom";
|
|
9
|
+
};
|
|
10
|
+
export type XAxisPosition = (typeof XAxisPosition)[keyof typeof XAxisPosition];
|
|
11
|
+
export declare const YAxisPosition: {
|
|
12
|
+
readonly Left: "left";
|
|
13
|
+
readonly Right: "right";
|
|
14
|
+
};
|
|
15
|
+
export type YAxisPosition = (typeof YAxisPosition)[keyof typeof YAxisPosition];
|
|
16
|
+
export declare const Theme: {
|
|
17
|
+
readonly Light: "light";
|
|
18
|
+
readonly Dark: "dark";
|
|
19
|
+
};
|
|
20
|
+
export type Theme = (typeof Theme)[keyof typeof Theme];
|
|
21
|
+
export declare const ShowLabels: {
|
|
22
|
+
readonly Always: "always";
|
|
23
|
+
readonly Never: "never";
|
|
24
|
+
readonly Hover: "hover";
|
|
25
|
+
};
|
|
26
|
+
export type ShowLabels = (typeof ShowLabels)[keyof typeof ShowLabels];
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const t = {
|
|
2
|
+
Horizontal: "horizontal",
|
|
3
|
+
Vertical: "vertical"
|
|
4
|
+
}, o = {
|
|
5
|
+
Top: "top",
|
|
6
|
+
Bottom: "bottom"
|
|
7
|
+
}, i = {
|
|
8
|
+
Left: "left",
|
|
9
|
+
Right: "right"
|
|
10
|
+
}, e = {
|
|
11
|
+
Light: "light",
|
|
12
|
+
Dark: "dark"
|
|
13
|
+
}, r = {
|
|
14
|
+
Always: "always",
|
|
15
|
+
Never: "never",
|
|
16
|
+
Hover: "hover"
|
|
17
|
+
};
|
|
18
|
+
export {
|
|
19
|
+
t as Orientation,
|
|
20
|
+
r as ShowLabels,
|
|
21
|
+
e as Theme,
|
|
22
|
+
o as XAxisPosition,
|
|
23
|
+
i as YAxisPosition
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=enums.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enums.js","sources":["../../lib/shared/enums.ts"],"sourcesContent":["export const Orientation = {\n Horizontal: \"horizontal\",\n Vertical: \"vertical\",\n} as const;\nexport type Orientation = (typeof Orientation)[keyof typeof Orientation];\n\nexport const XAxisPosition = {\n Top: \"top\",\n Bottom: \"bottom\",\n} as const;\nexport type XAxisPosition = (typeof XAxisPosition)[keyof typeof XAxisPosition];\n\nexport const YAxisPosition = {\n Left: \"left\",\n Right: \"right\",\n} as const;\nexport type YAxisPosition = (typeof YAxisPosition)[keyof typeof YAxisPosition];\n\nexport const Theme = {\n Light: \"light\",\n Dark: \"dark\",\n} as const;\nexport type Theme = (typeof Theme)[keyof typeof Theme];\n\nexport const ShowLabels = {\n Always: \"always\",\n Never: \"never\",\n Hover: \"hover\",\n} as const;\nexport type ShowLabels = (typeof ShowLabels)[keyof typeof ShowLabels];\n"],"names":["Orientation","XAxisPosition","YAxisPosition","Theme","ShowLabels"],"mappings":"AAAO,MAAMA,IAAc;AAAA,EACzB,YAAY;AAAA,EACZ,UAAU;AACZ,GAGaC,IAAgB;AAAA,EAC3B,KAAK;AAAA,EACL,QAAQ;AACV,GAGaC,IAAgB;AAAA,EAC3B,MAAM;AAAA,EACN,OAAO;AACT,GAGaC,IAAQ;AAAA,EACnB,OAAO;AAAA,EACP,MAAM;AACR,GAGaC,IAAa;AAAA,EACxB,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AACT;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type DataItem = {
|
|
2
|
+
category: string;
|
|
3
|
+
value: number;
|
|
4
|
+
};
|
|
5
|
+
type FormatterFn<T extends string | number> = (value: T) => string | number;
|
|
6
|
+
export type ValueFormatters = {
|
|
7
|
+
category?: FormatterFn<DataItem["category"]>;
|
|
8
|
+
value?: FormatterFn<DataItem["value"]>;
|
|
9
|
+
data?: FormatterFn<DataItem["value"]>;
|
|
10
|
+
tooltip?: FormatterFn<DataItem["value"]>;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Orientation } from '../shared';
|
|
2
|
+
/**
|
|
3
|
+
* Measures the rendered width of a given text string in a specific font.
|
|
4
|
+
* @param {HTMLElement} textSizeDiv - Existing element used to measure text size.
|
|
5
|
+
* @param {string} text - The text to measure.
|
|
6
|
+
* @returns {number} The width of the text in pixels.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getTextWidth(textSizeDiv: HTMLElement, text?: string): number;
|
|
9
|
+
/**
|
|
10
|
+
* Calculates the size of the browser's scrollbar.
|
|
11
|
+
* Useful for layout adjustments when dragging y-axis.
|
|
12
|
+
* @param {Orientation} orientation - Chart orientation.
|
|
13
|
+
* @param {HTMLElement} scrollableElement - Chart element that can be scrolled.
|
|
14
|
+
* @returns {number} The scrollbar size in pixels.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getScrollbarSize(orientation: Orientation, scrollableElement: HTMLElement): number;
|
|
17
|
+
/**
|
|
18
|
+
* Calculates the width of the y-axis based on label content,
|
|
19
|
+
* label formatting, tick labels, and any additional spacing.
|
|
20
|
+
* @param {HTMLElement} textSizeDiv - Existing element used to measure text size.
|
|
21
|
+
* @param {HTMLElement} wrapper - Chart wrapper element.
|
|
22
|
+
* @param {HTMLElement} yAxis - Y-axis element.
|
|
23
|
+
* @param {(string | number)[]} formattedValues - Formatted ticks or labels (depending on the orientation).
|
|
24
|
+
* @returns {number} Y-axis width in pixels.
|
|
25
|
+
*/
|
|
26
|
+
export declare function calculateYAxisWidths<T extends string | number>(textSizeDiv: HTMLElement, wrapper: HTMLElement, yAxis: HTMLElement, formattedValues?: T[]): number[];
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { MIN_Y_AXIS_WIDTH as c, MAX_Y_AXIS_WIDTH as f, DEFAULT_Y_AXIS_WIDTH as d, MAX_CONTENT_WIDTH as l, Y_AXIS_WIDTH_CSS_VAR as _, Y_AXIS_LINE_WIDTH as I } from "../shared/constants.js";
|
|
2
|
+
import { Orientation as g } from "../shared/enums.js";
|
|
3
|
+
function T(e, t = "") {
|
|
4
|
+
if (!t || !e)
|
|
5
|
+
return 0;
|
|
6
|
+
const n = document.createTextNode(t);
|
|
7
|
+
e.appendChild(n);
|
|
8
|
+
const o = Math.ceil(e.getBoundingClientRect().width);
|
|
9
|
+
return e.replaceChildren(), o;
|
|
10
|
+
}
|
|
11
|
+
function S(e, t) {
|
|
12
|
+
let n = 0;
|
|
13
|
+
return e === g.Vertical && (n = t.offsetHeight - t.clientHeight), e === g.Horizontal && (n = t.offsetWidth - t.clientWidth), n;
|
|
14
|
+
}
|
|
15
|
+
function M(e, t, n, o = []) {
|
|
16
|
+
const r = /* @__PURE__ */ new Map([
|
|
17
|
+
["min", c],
|
|
18
|
+
["width", d],
|
|
19
|
+
["max", f]
|
|
20
|
+
]);
|
|
21
|
+
if (o.length && e && t && n) {
|
|
22
|
+
n.style.removeProperty("width");
|
|
23
|
+
const a = [...o].sort((W, u) => {
|
|
24
|
+
const h = W.toString(), s = u.toString();
|
|
25
|
+
return s.length !== h.length ? s.length - h.length : s.localeCompare(h);
|
|
26
|
+
});
|
|
27
|
+
let i = T(
|
|
28
|
+
e,
|
|
29
|
+
a[0].toString()
|
|
30
|
+
) + I + 6;
|
|
31
|
+
r.set("min", Math.min(i, c)), r.set("max", Math.max(i, f)), i > d && (i = d), i > t.offsetWidth - l && (i = t.offsetWidth - l), r.set("width", i), t.style.setProperty(_, `${i}px`), n.style.setProperty("width", `var(${_})`);
|
|
32
|
+
}
|
|
33
|
+
return Array.from(r.values());
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
M as calculateYAxisWidths,
|
|
37
|
+
S as getScrollbarSize,
|
|
38
|
+
T as getTextWidth
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=dom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.js","sources":["../../lib/utils/dom.ts"],"sourcesContent":["import {\n DEFAULT_Y_AXIS_WIDTH,\n MAX_CONTENT_WIDTH,\n MAX_Y_AXIS_WIDTH,\n MIN_Y_AXIS_WIDTH,\n Orientation,\n Y_AXIS_LINE_WIDTH,\n Y_AXIS_WIDTH_CSS_VAR,\n} from \"../shared\";\n\n/**\n * Measures the rendered width of a given text string in a specific font.\n * @param {HTMLElement} textSizeDiv - Existing element used to measure text size.\n * @param {string} text - The text to measure.\n * @returns {number} The width of the text in pixels.\n */\nexport function getTextWidth(\n textSizeDiv: HTMLElement,\n text: string = \"\",\n): number {\n if (!text || !textSizeDiv) {\n return 0;\n }\n\n const content = document.createTextNode(text);\n textSizeDiv.appendChild(content);\n const width = Math.ceil(textSizeDiv.getBoundingClientRect().width);\n textSizeDiv.replaceChildren();\n\n return width;\n}\n\n/**\n * Calculates the size of the browser's scrollbar.\n * Useful for layout adjustments when dragging y-axis.\n * @param {Orientation} orientation - Chart orientation.\n * @param {HTMLElement} scrollableElement - Chart element that can be scrolled.\n * @returns {number} The scrollbar size in pixels.\n */\nexport function getScrollbarSize(\n orientation: Orientation,\n scrollableElement: HTMLElement,\n): number {\n let width = 0;\n if (orientation === Orientation.Vertical) {\n width = scrollableElement.offsetHeight - scrollableElement.clientHeight;\n }\n if (orientation === Orientation.Horizontal) {\n width = scrollableElement.offsetWidth - scrollableElement.clientWidth;\n }\n return width;\n}\n\n/**\n * Calculates the width of the y-axis based on label content,\n * label formatting, tick labels, and any additional spacing.\n * @param {HTMLElement} textSizeDiv - Existing element used to measure text size.\n * @param {HTMLElement} wrapper - Chart wrapper element.\n * @param {HTMLElement} yAxis - Y-axis element.\n * @param {(string | number)[]} formattedValues - Formatted ticks or labels (depending on the orientation).\n * @returns {number} Y-axis width in pixels.\n */\nexport function calculateYAxisWidths<T extends string | number>(\n textSizeDiv: HTMLElement,\n wrapper: HTMLElement,\n yAxis: HTMLElement,\n formattedValues: T[] = [],\n): number[] {\n const result = new Map<string, number>([\n [\"min\", MIN_Y_AXIS_WIDTH],\n [\"width\", DEFAULT_Y_AXIS_WIDTH],\n [\"max\", MAX_Y_AXIS_WIDTH],\n ]);\n\n if (formattedValues.length && !!textSizeDiv && !!wrapper && !!yAxis) {\n // reset width when values change so that the new one is calculated correctly\n yAxis.style.removeProperty(\"width\");\n\n const sortedValues = [...formattedValues].sort((a, b) => {\n const strA = a.toString();\n const strB = b.toString();\n if (strB.length !== strA.length) {\n return strB.length - strA.length;\n }\n return strB.localeCompare(strA);\n });\n const longestLabelWidth = getTextWidth(\n textSizeDiv,\n sortedValues[0].toString(),\n );\n // margin 8px + 2px to avoid ellipsis = 6\n let newWidth = longestLabelWidth + Y_AXIS_LINE_WIDTH + 6;\n result.set(\"min\", Math.min(newWidth, MIN_Y_AXIS_WIDTH));\n result.set(\"max\", Math.max(newWidth, MAX_Y_AXIS_WIDTH));\n\n if (newWidth > DEFAULT_Y_AXIS_WIDTH) {\n newWidth = DEFAULT_Y_AXIS_WIDTH;\n }\n if (newWidth > wrapper.offsetWidth - MAX_CONTENT_WIDTH) {\n newWidth = wrapper.offsetWidth - MAX_CONTENT_WIDTH;\n }\n\n result.set(\"width\", newWidth);\n wrapper.style.setProperty(Y_AXIS_WIDTH_CSS_VAR, `${newWidth}px`);\n yAxis.style.setProperty(\"width\", `var(${Y_AXIS_WIDTH_CSS_VAR})`);\n }\n\n return Array.from(result.values());\n}\n"],"names":["getTextWidth","textSizeDiv","text","content","width","getScrollbarSize","orientation","scrollableElement","Orientation","calculateYAxisWidths","wrapper","yAxis","formattedValues","result","MIN_Y_AXIS_WIDTH","DEFAULT_Y_AXIS_WIDTH","MAX_Y_AXIS_WIDTH","sortedValues","a","b","strA","strB","newWidth","Y_AXIS_LINE_WIDTH","MAX_CONTENT_WIDTH","Y_AXIS_WIDTH_CSS_VAR"],"mappings":";;AAgBO,SAASA,EACdC,GACAC,IAAe,IACP;AACR,MAAI,CAACA,KAAQ,CAACD;AACZ,WAAO;AAGT,QAAME,IAAU,SAAS,eAAeD,CAAI;AAC5C,EAAAD,EAAY,YAAYE,CAAO;AAC/B,QAAMC,IAAQ,KAAK,KAAKH,EAAY,sBAAA,EAAwB,KAAK;AACjE,SAAAA,EAAY,gBAAA,GAELG;AACT;AASO,SAASC,EACdC,GACAC,GACQ;AACR,MAAIH,IAAQ;AACZ,SAAIE,MAAgBE,EAAY,aAC9BJ,IAAQG,EAAkB,eAAeA,EAAkB,eAEzDD,MAAgBE,EAAY,eAC9BJ,IAAQG,EAAkB,cAAcA,EAAkB,cAErDH;AACT;AAWO,SAASK,EACdR,GACAS,GACAC,GACAC,IAAuB,CAAA,GACb;AACV,QAAMC,wBAAa,IAAoB;AAAA,IACrC,CAAC,OAAOC,CAAgB;AAAA,IACxB,CAAC,SAASC,CAAoB;AAAA,IAC9B,CAAC,OAAOC,CAAgB;AAAA,EAAA,CACzB;AAED,MAAIJ,EAAgB,UAAYX,KAAiBS,KAAaC,GAAO;AAEnE,IAAAA,EAAM,MAAM,eAAe,OAAO;AAElC,UAAMM,IAAe,CAAC,GAAGL,CAAe,EAAE,KAAK,CAACM,GAAGC,MAAM;AACvD,YAAMC,IAAOF,EAAE,SAAA,GACTG,IAAOF,EAAE,SAAA;AACf,aAAIE,EAAK,WAAWD,EAAK,SAChBC,EAAK,SAASD,EAAK,SAErBC,EAAK,cAAcD,CAAI;AAAA,IAChC,CAAC;AAMD,QAAIE,IALsBtB;AAAA,MACxBC;AAAA,MACAgB,EAAa,CAAC,EAAE,SAAA;AAAA,IAAS,IAGQM,IAAoB;AACvD,IAAAV,EAAO,IAAI,OAAO,KAAK,IAAIS,GAAUR,CAAgB,CAAC,GACtDD,EAAO,IAAI,OAAO,KAAK,IAAIS,GAAUN,CAAgB,CAAC,GAElDM,IAAWP,MACbO,IAAWP,IAETO,IAAWZ,EAAQ,cAAcc,MACnCF,IAAWZ,EAAQ,cAAcc,IAGnCX,EAAO,IAAI,SAASS,CAAQ,GAC5BZ,EAAQ,MAAM,YAAYe,GAAsB,GAAGH,CAAQ,IAAI,GAC/DX,EAAM,MAAM,YAAY,SAAS,OAAOc,CAAoB,GAAG;AAAA,EACjE;AAEA,SAAO,MAAM,KAAKZ,EAAO,OAAA,CAAQ;AACnC;"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export declare function noop(): void;
|
|
2
|
+
export declare function echo<T extends string | number>(value: T): T;
|
|
3
|
+
/**
|
|
4
|
+
* Checks whether the dataset contains both positive and negative values.
|
|
5
|
+
* @param {number[]} values - Array of numeric values to analyze.
|
|
6
|
+
* @returns {[boolean, boolean]} Both true if at least one value is positive and one is negative.
|
|
7
|
+
*/
|
|
8
|
+
export declare function checkIfSomePositiveAndNegative(values?: number[]): [boolean, boolean];
|
|
9
|
+
/**
|
|
10
|
+
* Checks whether all values in the dataset are either entirely positive or entirely negative.
|
|
11
|
+
* @param {number[]} values - Array of numeric values to check.
|
|
12
|
+
* @returns {[boolean, boolean]} Both true if all values have the same sign (all >= 0 or all <= 0).
|
|
13
|
+
*/
|
|
14
|
+
export declare function checkIfAllPositiveOrNegative(values?: number[]): [boolean, boolean];
|
|
15
|
+
/**
|
|
16
|
+
* Use label formatter if it exists, or return the original label.
|
|
17
|
+
* @param {string | number} label - Axis or bar label
|
|
18
|
+
* @param [formatter=echo] - Axis or bar label formatter
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatLabel<T extends string | number>(label: T, formatter?: (value: T) => string | number): string | number;
|
|
21
|
+
/**
|
|
22
|
+
* Use label formatter if it exists, or return the original labels.
|
|
23
|
+
* @param {string | number} labels - Axis or bar labels.
|
|
24
|
+
* @param [formatter=echo] - Axis or bar label formatter.
|
|
25
|
+
* @returns {(string | number)[]} - Formatted labels.
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatLabels<T extends string | number>(labels: T[], formatter?: (value: T) => string | number): (string | number)[];
|
|
28
|
+
/**
|
|
29
|
+
* Computes the minimum and maximum values from the dataset.
|
|
30
|
+
* @param {number[]} values - Array of numeric values.
|
|
31
|
+
* @returns {[number, number]} Min and max values.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getMinAndMax(values?: number[]): [number, number];
|
|
34
|
+
/**
|
|
35
|
+
* Generates a list of tick values for the value axis based on
|
|
36
|
+
* all the values and desired tick count.
|
|
37
|
+
* @param {number} min - Minimum bar value.
|
|
38
|
+
* @param {number} max - Maximum bar value.
|
|
39
|
+
* @param {number} numOfTicks - Number of ticks for the axis.
|
|
40
|
+
* @param {number} granularity - Force the rough tick step to the next available increment.
|
|
41
|
+
* @returns {number[]} An array of tick values evenly distributed across the range.
|
|
42
|
+
*/
|
|
43
|
+
export declare function generateTicks(min?: number, max?: number, numOfTicks?: number, granularity?: number): number[];
|
|
44
|
+
/**
|
|
45
|
+
* Converts a given numeric value into a percentage of a reference size.
|
|
46
|
+
* @param {number} value - The value to convert.
|
|
47
|
+
* @param {number} min - Minimum value.
|
|
48
|
+
* @param {number} max - Maximum value.
|
|
49
|
+
* @returns {number} The value expressed as a percentage of the total.
|
|
50
|
+
*/
|
|
51
|
+
export declare function getSizeInPercentages(value?: number, min?: number, max?: number): number;
|
|
52
|
+
/**
|
|
53
|
+
* Returns the new y-axis width based on min, max and current width in percentages.
|
|
54
|
+
* @param {Object} params - Configuration options.
|
|
55
|
+
* @param {number} [params.currentPercentage=0] - Previously applied y-axis width (in %).
|
|
56
|
+
* @param {number} [params.minWidth=0] - Minimum allowed width (in #).
|
|
57
|
+
* @param {number} [params.maxWidth=100] - Maximum allowed width (in #).
|
|
58
|
+
* @param {number} params.widthPercentage - Newly calculated required width (in %).
|
|
59
|
+
* @returns {number | null} Updated y-axis width in pixels or null if current and new are the same.
|
|
60
|
+
*/
|
|
61
|
+
export declare function getUpdatedYAxisWidth({ currentPercentage, minWidth, maxWidth, widthPercentage, }: {
|
|
62
|
+
currentPercentage?: number;
|
|
63
|
+
minWidth?: number;
|
|
64
|
+
maxWidth?: number;
|
|
65
|
+
widthPercentage: number;
|
|
66
|
+
}): number | null;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
function P() {
|
|
2
|
+
}
|
|
3
|
+
function m(t) {
|
|
4
|
+
return t;
|
|
5
|
+
}
|
|
6
|
+
function b(t = []) {
|
|
7
|
+
const o = t.some((e) => e > 0), n = t.some((e) => e < 0);
|
|
8
|
+
return [o, n];
|
|
9
|
+
}
|
|
10
|
+
function w(t = []) {
|
|
11
|
+
if (!t.length)
|
|
12
|
+
return [!1, !1];
|
|
13
|
+
const o = t.every((e) => e >= 0), n = t.every((e) => e <= 0);
|
|
14
|
+
return [o, n];
|
|
15
|
+
}
|
|
16
|
+
function v(t, o = m) {
|
|
17
|
+
return o(t);
|
|
18
|
+
}
|
|
19
|
+
function A(t, o = m) {
|
|
20
|
+
return t.map((n) => v(n, o));
|
|
21
|
+
}
|
|
22
|
+
function N(t = []) {
|
|
23
|
+
if (!t.length)
|
|
24
|
+
return [0, 0];
|
|
25
|
+
const o = Math.min(...t), n = Math.max(...t), [e, r] = b(t);
|
|
26
|
+
if (e && r) {
|
|
27
|
+
const a = Math.max(Math.abs(o), Math.abs(n));
|
|
28
|
+
return [-Math.abs(a), a];
|
|
29
|
+
}
|
|
30
|
+
return [o, n];
|
|
31
|
+
}
|
|
32
|
+
function S(t = 0, o = 100, n = 5, e = 0.5) {
|
|
33
|
+
if (n <= 1)
|
|
34
|
+
return [];
|
|
35
|
+
let r = t, a = o;
|
|
36
|
+
if (t === o) {
|
|
37
|
+
let l = 1;
|
|
38
|
+
t !== 0 && (l = Math.pow(10, Math.floor(Math.log10(Math.abs(t)))) * 0.1), r = t - l, a = t + l;
|
|
39
|
+
}
|
|
40
|
+
let s = (a - r) / (n - 1);
|
|
41
|
+
s === 0 && (s = 1);
|
|
42
|
+
const c = Math.floor(Math.log10(s)), h = Math.pow(10, c), u = s / h, p = Math.ceil(u / e) * e, i = parseFloat((p * h).toPrecision(12)), M = i.toString().indexOf("."), x = M >= 0 ? i.toString().length - M - 1 : 0;
|
|
43
|
+
let f;
|
|
44
|
+
return r < 0 && a > 0 ? f = -Math.floor(n / 2) * i : a <= 0 ? f = a - i * (n - 1) : f = r, Array.from({ length: n }, (l, g) => {
|
|
45
|
+
const d = Math.pow(10, x);
|
|
46
|
+
return Math.round((f + g * i) * d) / d;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function I(t = 0, o = 0, n = 100) {
|
|
50
|
+
const e = +o, r = +n, a = +t;
|
|
51
|
+
return e === 0 && r === 0 ? 0 : e >= 0 && r >= 0 ? (a - e) / (r - e) * 100 : e <= 0 && r <= 0 ? (r - a) / (r - e) * 100 : a >= 0 ? a / r * 100 : Math.abs(a) / Math.abs(e) * 100;
|
|
52
|
+
}
|
|
53
|
+
function V({
|
|
54
|
+
currentPercentage: t = 0,
|
|
55
|
+
minWidth: o = 0,
|
|
56
|
+
maxWidth: n = 100,
|
|
57
|
+
widthPercentage: e
|
|
58
|
+
}) {
|
|
59
|
+
const r = +t, a = +o, s = +n, c = +e;
|
|
60
|
+
return r === c ? null : (s - a) * c / 100 + a;
|
|
61
|
+
}
|
|
62
|
+
export {
|
|
63
|
+
w as checkIfAllPositiveOrNegative,
|
|
64
|
+
b as checkIfSomePositiveAndNegative,
|
|
65
|
+
m as echo,
|
|
66
|
+
v as formatLabel,
|
|
67
|
+
A as formatLabels,
|
|
68
|
+
S as generateTicks,
|
|
69
|
+
N as getMinAndMax,
|
|
70
|
+
I as getSizeInPercentages,
|
|
71
|
+
V as getUpdatedYAxisWidth,
|
|
72
|
+
P as noop
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=rapidobar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rapidobar.js","sources":["../../lib/utils/rapidobar.ts"],"sourcesContent":["export function noop() {}\nexport function echo<T extends string | number>(value: T): T {\n return value;\n}\n\n/**\n * Checks whether the dataset contains both positive and negative values.\n * @param {number[]} values - Array of numeric values to analyze.\n * @returns {[boolean, boolean]} Both true if at least one value is positive and one is negative.\n */\nexport function checkIfSomePositiveAndNegative(\n values: number[] = [],\n): [boolean, boolean] {\n const hasPositive = values.some((value) => value > 0);\n const hasNegative = values.some((value) => value < 0);\n return [hasPositive, hasNegative];\n}\n\n/**\n * Checks whether all values in the dataset are either entirely positive or entirely negative.\n * @param {number[]} values - Array of numeric values to check.\n * @returns {[boolean, boolean]} Both true if all values have the same sign (all >= 0 or all <= 0).\n */\nexport function checkIfAllPositiveOrNegative(\n values: number[] = [],\n): [boolean, boolean] {\n if (!values.length) {\n return [false, false];\n }\n const allPositive = values.every((value) => value >= 0);\n const allNegative = values.every((value) => value <= 0);\n return [allPositive, allNegative];\n}\n\n/**\n * Use label formatter if it exists, or return the original label.\n * @param {string | number} label - Axis or bar label\n * @param [formatter=echo] - Axis or bar label formatter\n */\nexport function formatLabel<T extends string | number>(\n label: T,\n formatter: (value: T) => string | number = echo,\n): string | number {\n return formatter(label);\n}\n\n/**\n * Use label formatter if it exists, or return the original labels.\n * @param {string | number} labels - Axis or bar labels.\n * @param [formatter=echo] - Axis or bar label formatter.\n * @returns {(string | number)[]} - Formatted labels.\n */\nexport function formatLabels<T extends string | number>(\n labels: T[],\n formatter: (value: T) => string | number = echo,\n): (string | number)[] {\n return labels.map((label) => formatLabel(label, formatter));\n}\n\n/**\n * Computes the minimum and maximum values from the dataset.\n * @param {number[]} values - Array of numeric values.\n * @returns {[number, number]} Min and max values.\n */\nexport function getMinAndMax(values: number[] = []): [number, number] {\n if (!values.length) {\n return [0, 0];\n }\n\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n const [hasPositive, hasNegative] = checkIfSomePositiveAndNegative(values);\n\n if (hasPositive && hasNegative) {\n const max = Math.max(Math.abs(minValue), Math.abs(maxValue));\n return [-Math.abs(max), max];\n }\n return [minValue, maxValue];\n}\n\n/**\n * Generates a list of tick values for the value axis based on\n * all the values and desired tick count.\n * @param {number} min - Minimum bar value.\n * @param {number} max - Maximum bar value.\n * @param {number} numOfTicks - Number of ticks for the axis.\n * @param {number} granularity - Force the rough tick step to the next available increment.\n * @returns {number[]} An array of tick values evenly distributed across the range.\n */\nexport function generateTicks(\n min: number = 0,\n max: number = 100,\n numOfTicks: number = 5,\n granularity: number = 0.5,\n): number[] {\n if (numOfTicks <= 1) {\n return [];\n }\n\n let start = min;\n let stop = max;\n\n if (min === max) {\n // expand the range equally by 10%\n let offset = 1;\n if (min !== 0) {\n const magnitude = Math.pow(10, Math.floor(Math.log10(Math.abs(min))));\n offset = magnitude * 0.1;\n }\n start = min - offset;\n stop = min + offset;\n }\n\n let step = (stop - start) / (numOfTicks - 1);\n if (step === 0) {\n step = 1;\n }\n const power = Math.floor(Math.log10(step));\n const magnitude = Math.pow(10, power);\n const normalizedStep = step / magnitude;\n const factor = Math.ceil(normalizedStep / granularity) * granularity;\n const increment = parseFloat((factor * magnitude).toPrecision(12));\n\n const decimalIndex = increment.toString().indexOf(\".\");\n const decimals =\n decimalIndex >= 0 ? increment.toString().length - decimalIndex - 1 : 0;\n\n let axisMin;\n if (start < 0 && stop > 0) {\n axisMin = -Math.floor(numOfTicks / 2) * increment;\n } else if (stop <= 0) {\n axisMin = stop - increment * (numOfTicks - 1);\n } else {\n axisMin = start;\n }\n\n return Array.from({ length: numOfTicks }, (_, index) => {\n const factor = Math.pow(10, decimals);\n return Math.round((axisMin + index * increment) * factor) / factor;\n });\n}\n\n/**\n * Converts a given numeric value into a percentage of a reference size.\n * @param {number} value - The value to convert.\n * @param {number} min - Minimum value.\n * @param {number} max - Maximum value.\n * @returns {number} The value expressed as a percentage of the total.\n */\nexport function getSizeInPercentages(\n value: number = 0,\n min: number = 0,\n max: number = 100,\n): number {\n const start = +min;\n const stop = +max;\n const val = +value;\n\n if (start === 0 && stop === 0) {\n return 0;\n }\n\n if (start >= 0 && stop >= 0) {\n return ((val - start) / (stop - start)) * 100;\n }\n\n if (start <= 0 && stop <= 0) {\n return ((stop - val) / (stop - start)) * 100;\n }\n\n if (val >= 0) {\n return (val / stop) * 100;\n } else {\n return (Math.abs(val) / Math.abs(start)) * 100;\n }\n}\n\n/**\n * Returns the new y-axis width based on min, max and current width in percentages.\n * @param {Object} params - Configuration options.\n * @param {number} [params.currentPercentage=0] - Previously applied y-axis width (in %).\n * @param {number} [params.minWidth=0] - Minimum allowed width (in #).\n * @param {number} [params.maxWidth=100] - Maximum allowed width (in #).\n * @param {number} params.widthPercentage - Newly calculated required width (in %).\n * @returns {number | null} Updated y-axis width in pixels or null if current and new are the same.\n */\nexport function getUpdatedYAxisWidth({\n currentPercentage = 0,\n minWidth = 0,\n maxWidth = 100,\n widthPercentage,\n}: {\n currentPercentage?: number;\n minWidth?: number;\n maxWidth?: number;\n widthPercentage: number;\n}): number | null {\n const curr = +currentPercentage;\n const min = +minWidth;\n const max = +maxWidth;\n const width = +widthPercentage;\n\n if (curr === width) {\n return null;\n }\n const maxValue = max - min;\n const absolute = (maxValue * width) / 100;\n return absolute + min;\n}\n"],"names":["noop","echo","value","checkIfSomePositiveAndNegative","values","hasPositive","hasNegative","checkIfAllPositiveOrNegative","allPositive","allNegative","formatLabel","label","formatter","formatLabels","labels","getMinAndMax","minValue","maxValue","max","generateTicks","min","numOfTicks","granularity","start","stop","offset","step","power","magnitude","normalizedStep","factor","increment","decimalIndex","decimals","axisMin","_","index","getSizeInPercentages","val","getUpdatedYAxisWidth","currentPercentage","minWidth","maxWidth","widthPercentage","curr","width"],"mappings":"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"}
|