@internetarchive/histogram-date-range 1.3.2 → 1.4.0-alpha-webdev7756.1
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/demo/index.html +20 -0
- package/dist/demo/js/list-histogram-wrapper.d.ts +20 -0
- package/dist/demo/js/list-histogram-wrapper.js +59 -0
- package/dist/demo/js/list-histogram-wrapper.js.map +1 -0
- package/dist/demo/js/lit-histogram-wrapper.d.ts +21 -0
- package/dist/demo/js/lit-histogram-wrapper.js +73 -0
- package/dist/demo/js/lit-histogram-wrapper.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/src/histogram-date-range.d.ts +27 -0
- package/dist/src/histogram-date-range.js +301 -245
- package/dist/src/histogram-date-range.js.map +1 -1
- package/dist/test/histogram-date-range.test.js +221 -179
- package/dist/test/histogram-date-range.test.js.map +1 -1
- package/docs/demo/index.html +20 -0
- package/docs/dist/src/histogram-date-range.js +44 -12
- package/index.ts +3 -0
- package/package.json +1 -1
- package/src/histogram-date-range.ts +1172 -1110
- package/test/histogram-date-range.test.ts +992 -935
- package/dist/src/dayjs/fix-first-century-years.d.ts +0 -2
- package/dist/src/dayjs/fix-first-century-years.js +0 -25
- package/dist/src/dayjs/fix-first-century-years.js.map +0 -1
- package/dist/src/dayjs/fix-two-digit-dates.d.ts +0 -2
- package/dist/src/dayjs/fix-two-digit-dates.js +0 -25
- package/dist/src/dayjs/fix-two-digit-dates.js.map +0 -1
- package/dist/src/histogram-date-range copy.d.ts +0 -214
- package/dist/src/histogram-date-range copy.js +0 -1018
- package/dist/src/histogram-date-range copy.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"histogram-date-range.test.js","sourceRoot":"","sources":["../../test/histogram-date-range.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-expressions */\r\nimport { html, fixture, expect, oneEvent, aTimeout } from '@open-wc/testing';\r\n\r\nimport { HistogramDateRange } from '../src/histogram-date-range';\r\nimport '../src/histogram-date-range';\r\n\r\nconst SLIDER_WIDTH = 10;\r\nconst WIDTH = 200;\r\n\r\nconst subject = html`\r\n <histogram-date-range\r\n width=\"${WIDTH}\"\r\n tooltipWidth=\"140\"\r\n height=\"50\"\r\n dateFormat=\"M/D/YYYY\"\r\n minDate=\"1900\"\r\n maxDate=\"12/4/2020\"\r\n bins=\"[33, 1, 100]\"\r\n >\r\n </histogram-date-range>\r\n`;\r\n\r\nasync function createCustomElementInHTMLContainer(): Promise<HistogramDateRange> {\r\n document.head.insertAdjacentHTML(\r\n 'beforeend',\r\n `<style>\r\n html {\r\n font-size:10px;\r\n }\r\n .container {\r\n width: 400px;\r\n height: 400px;\r\n display: flex;\r\n background: #FFF6E1;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n </style>`\r\n );\r\n // https://open-wc.org/docs/testing/helpers/#customize-the-fixture-container\r\n const parentNode = document.createElement('div');\r\n parentNode.setAttribute('class', 'container');\r\n return fixture<HistogramDateRange>(subject, { parentNode });\r\n}\r\n\r\ndescribe('HistogramDateRange', () => {\r\n it('shows scaled histogram bars when provided with data', async () => {\r\n const el = await createCustomElementInHTMLContainer();\r\n const bars = el.shadowRoot?.querySelectorAll(\r\n '.bar'\r\n ) as unknown as SVGRectElement[];\r\n const heights = Array.from(bars).map(b => b.height.baseVal.value);\r\n\r\n expect(heights).to.eql([38, 7, 50]);\r\n });\r\n\r\n it('changes the position of the sliders and standardizes date format when dates are entered', async () => {\r\n const el = await createCustomElementInHTMLContainer();\r\n\r\n /* -------------------------- minimum (left) slider ------------------------- */\r\n expect(el.minSliderX).to.eq(SLIDER_WIDTH);\r\n const minDateInput = el.shadowRoot?.querySelector(\r\n '#date-min'\r\n ) as HTMLInputElement;\r\n\r\n const pressEnterEvent = new KeyboardEvent('keyup', {\r\n key: 'Enter',\r\n });\r\n\r\n // valid min date\r\n minDateInput.value = '1950';\r\n minDateInput.dispatchEvent(pressEnterEvent);\r\n\r\n expect(Math.floor(el.minSliderX)).to.eq(84);\r\n expect(el.minSelectedDate).to.eq('1/1/1950'); // set to correct format\r\n\r\n // attempt to set date earlier than first item\r\n minDateInput.value = '10/1/1850';\r\n minDateInput.dispatchEvent(new Event('blur'));\r\n\r\n expect(Math.floor(el.minSliderX)).to.eq(SLIDER_WIDTH); // leftmost valid position\r\n // allow date value less than slider range\r\n expect(el.minSelectedDate).to.eq('10/1/1850');\r\n\r\n /* -------------------------- maximum (right) slider ------------------------- */\r\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH);\r\n const maxDateInput = el.shadowRoot?.querySelector(\r\n '#date-max'\r\n ) as HTMLInputElement;\r\n\r\n // set valid max date\r\n maxDateInput.value = '3/12/1975';\r\n maxDateInput.dispatchEvent(pressEnterEvent);\r\n\r\n expect(Math.floor(el.maxSliderX)).to.eq(121);\r\n expect(maxDateInput.value).to.eq('3/12/1975');\r\n\r\n // attempt to set date later than last item\r\n maxDateInput.value = '12/31/2199';\r\n maxDateInput.dispatchEvent(new Event('blur'));\r\n await el.updateComplete;\r\n\r\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH); // rightmost valid position\r\n // allow date value greater than slider range\r\n expect(maxDateInput.value).to.eq('12/31/2199');\r\n });\r\n\r\n it('when updateWhileFocused option is true, updates are fired upon changing input focus', async () => {\r\n const el = await createCustomElementInHTMLContainer();\r\n el.updateWhileFocused = true;\r\n await el.updateComplete;\r\n\r\n let updateEventFired = false;\r\n el.addEventListener(\r\n 'histogramDateRangeUpdated',\r\n () => (updateEventFired = true)\r\n );\r\n\r\n /* -------------------------- minimum (left) slider ------------------------- */\r\n const minDateInput = el.shadowRoot?.querySelector(\r\n '#date-min'\r\n ) as HTMLInputElement;\r\n\r\n /* -------------------------- maximum (right) slider ------------------------- */\r\n const maxDateInput = el.shadowRoot?.querySelector(\r\n '#date-max'\r\n ) as HTMLInputElement;\r\n\r\n minDateInput.focus();\r\n\r\n // set valid min date, but don't hit Enter -- just switch focus to the max date input\r\n minDateInput.value = '1950';\r\n maxDateInput.focus();\r\n await el.updateComplete;\r\n await aTimeout(0);\r\n\r\n // update event should have fired, setting the minSelectedDate prop & slider position accordingly\r\n expect(updateEventFired).to.be.true;\r\n expect(Math.floor(el.minSliderX)).to.eq(84);\r\n expect(el.minSelectedDate).to.eq('1/1/1950');\r\n\r\n updateEventFired = false;\r\n await el.updateComplete;\r\n\r\n // set valid max date, but don't hit Enter -- just switch focus to the min date input\r\n maxDateInput.value = '3/12/1975';\r\n minDateInput.focus();\r\n await el.updateComplete;\r\n await aTimeout(0);\r\n\r\n // update event should have fired, setting the maxSelectedDate prop & slider position accordingly\r\n expect(updateEventFired).to.be.true;\r\n expect(Math.floor(el.maxSliderX)).to.eq(121);\r\n expect(el.maxSelectedDate).to.eq('3/12/1975');\r\n });\r\n\r\n it('when updateWhileFocused option is false (default), updates are not fired while one of the inputs remains focused', async () => {\r\n const el = await createCustomElementInHTMLContainer();\r\n\r\n let updateEventFired = false;\r\n el.addEventListener(\r\n 'histogramDateRangeUpdated',\r\n () => (updateEventFired = true)\r\n );\r\n\r\n /* -------------------------- minimum (left) slider ------------------------- */\r\n const minDateInput = el.shadowRoot?.querySelector(\r\n '#date-min'\r\n ) as HTMLInputElement;\r\n\r\n /* -------------------------- maximum (right) slider ------------------------- */\r\n const maxDateInput = el.shadowRoot?.querySelector(\r\n '#date-max'\r\n ) as HTMLInputElement;\r\n\r\n minDateInput.focus();\r\n\r\n // set valid min date, but don't hit Enter -- just switch focus to the max date input\r\n minDateInput.value = '1950';\r\n maxDateInput.focus();\r\n await el.updateComplete;\r\n await aTimeout(0);\r\n\r\n // update event should NOT have fired, because focus remains within the inputs\r\n expect(updateEventFired).to.be.false;\r\n\r\n // set valid max date, but don't hit Enter -- just switch focus to the min date input\r\n maxDateInput.value = '3/12/1975';\r\n minDateInput.focus();\r\n await el.updateComplete;\r\n await aTimeout(0);\r\n\r\n // update event should NOT have fired, because focus remains within the inputs\r\n expect(updateEventFired).to.be.false;\r\n });\r\n\r\n it('handles invalid date inputs', async () => {\r\n const el = await createCustomElementInHTMLContainer();\r\n\r\n /* -------------------------- minimum (left) slider ------------------------- */\r\n const minDateInput = el.shadowRoot?.querySelector(\r\n '#date-min'\r\n ) as HTMLInputElement;\r\n\r\n minDateInput.value = '5/17/1961';\r\n minDateInput.dispatchEvent(new Event('blur'));\r\n await el.updateComplete;\r\n\r\n expect(Math.floor(el.minSliderX)).to.eq(101);\r\n expect(minDateInput.value).to.eq('5/17/1961');\r\n\r\n // enter invalid value\r\n minDateInput.value = 'invalid';\r\n minDateInput.dispatchEvent(new Event('blur'));\r\n await el.updateComplete;\r\n\r\n expect(Math.floor(el.minSliderX)).to.eq(101); // does not move\r\n expect(minDateInput.value).to.eq('5/17/1961'); // resets back to previous date\r\n\r\n /* -------------------------- maximum (right) slider ------------------------- */\r\n const maxDateInput = el.shadowRoot?.querySelector(\r\n '#date-max'\r\n ) as HTMLInputElement;\r\n\r\n // initial values\r\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH);\r\n expect(maxDateInput.value).to.eq('12/4/2020');\r\n\r\n // enter invalid value\r\n maxDateInput.value = 'Abc 12, 1YYY';\r\n maxDateInput.dispatchEvent(new Event('blur'));\r\n await el.updateComplete;\r\n\r\n expect(Math.floor(el.maxSliderX)).to.eq(WIDTH - SLIDER_WIDTH); // does not move\r\n expect(maxDateInput.value).to.eq('12/4/2020'); // resets back to previous date\r\n });\r\n\r\n it('updates the date inputs when the sliders are moved', async () => {\r\n const el = await createCustomElementInHTMLContainer();\r\n\r\n /* -------------------------- minimum (left) slider ------------------------- */\r\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\r\n const container = el.shadowRoot?.querySelector(\r\n '#container'\r\n ) as HTMLDivElement;\r\n const minDateInput = el.shadowRoot?.querySelector(\r\n '#date-min'\r\n ) as HTMLInputElement;\r\n\r\n // initial state\r\n expect(minSlider.getBoundingClientRect().x).to.eq(108);\r\n expect(minSlider.classList.contains('draggable')).to.be.true;\r\n\r\n // pointer down\r\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\r\n await el.updateComplete;\r\n\r\n // cursor changes to 'grab'\r\n const classList = minSlider.classList;\r\n expect(classList.contains('draggable')).to.be.true;\r\n expect(classList.contains('dragging')).to.be.true;\r\n\r\n // slide to right\r\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 60 }));\r\n await el.updateComplete;\r\n\r\n // slider has moved\r\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(168);\r\n // min date is updated\r\n expect(minDateInput.value).to.eq('4/23/1940');\r\n\r\n // stop dragging\r\n window.dispatchEvent(new PointerEvent('pointerup'));\r\n await el.updateComplete;\r\n\r\n // cursor returns to normal\r\n expect(Array.from(container.classList)).not.to.include('dragging');\r\n\r\n /* -------------------------- maximum (right) slider ------------------------- */\r\n const maxSlider = el.shadowRoot?.querySelector('#slider-max') as SVGElement;\r\n const maxDateInput = el.shadowRoot?.querySelector(\r\n '#date-max'\r\n ) as HTMLInputElement;\r\n\r\n // initial state\r\n expect(maxSlider.getBoundingClientRect().x).to.eq(298);\r\n\r\n // slide to left\r\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 195 }));\r\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 165 }));\r\n await el.updateComplete;\r\n\r\n // slider has moved\r\n expect(Math.round(maxSlider.getBoundingClientRect().x)).to.eq(268);\r\n // max date is updated\r\n expect(maxDateInput.value).to.eq('10/8/2000');\r\n await el.updateComplete;\r\n\r\n // try to slide min slider past max slider\r\n minSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 62 }));\r\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 190 }));\r\n await el.updateComplete;\r\n\r\n // slider moves all the way to meet the right slider\r\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(258);\r\n\r\n // try to slide max slider past min slider\r\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 120 }));\r\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 50 }));\r\n await el.updateComplete;\r\n expect(Math.round(maxSlider.getBoundingClientRect().x)).to.eq(268); // max slider didn't move\r\n\r\n // try to slide max slider off the right edge\r\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 120 }));\r\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 300 }));\r\n await el.updateComplete;\r\n expect(maxSlider.getBoundingClientRect().x).to.eq(298); // back to its initial position\r\n expect(el.maxSelectedDate).to.equal('12/4/2020');\r\n });\r\n\r\n it('does not permit sliders to select dates outside the allowed range', async () => {\r\n const el = await createCustomElementInHTMLContainer();\r\n el.binSnapping = 'month';\r\n el.dateFormat = 'YYYY-MM';\r\n el.minDate = '2020-01';\r\n el.maxDate = '2021-12';\r\n el.minSelectedDate = '2020-01';\r\n el.maxSelectedDate = '2021-12';\r\n el.bins = [10, 20, 30, 40, 50, 60, 70, 80];\r\n await el.updateComplete;\r\n\r\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\r\n const maxSlider = el.shadowRoot?.querySelector('#slider-max') as SVGElement;\r\n\r\n const minDateInput = el.shadowRoot?.querySelector(\r\n '#date-min'\r\n ) as HTMLInputElement;\r\n const maxDateInput = el.shadowRoot?.querySelector(\r\n '#date-max'\r\n ) as HTMLInputElement;\r\n\r\n // initial state\r\n expect(minSlider.getBoundingClientRect().x).to.eq(108, 'initial');\r\n expect(maxSlider.getBoundingClientRect().x).to.eq(298, 'initial');\r\n expect(minDateInput.value).to.eq('2020-01', 'initial');\r\n expect(maxDateInput.value).to.eq('2021-12', 'initial');\r\n\r\n // try dragging the min slider too far to the left\r\n minSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 0 }));\r\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: -50 }));\r\n await el.updateComplete;\r\n expect(minSlider.getBoundingClientRect().x).to.eq(108); // slider didn't move\r\n expect(minDateInput.value).to.eq('2020-01'); // value unchanged\r\n\r\n // try dragging the max slider too far to the right\r\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 195 }));\r\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 250 }));\r\n await el.updateComplete;\r\n expect(maxSlider.getBoundingClientRect().x).to.eq(298); // slider didn't move\r\n expect(maxDateInput.value).to.eq('2021-12'); // value unchanged\r\n });\r\n\r\n it(\"emits a custom event when the element's date range changes\", async () => {\r\n const el = await createCustomElementInHTMLContainer();\r\n el.updateDelay = 30; // set debounce delay of 30ms\r\n\r\n const minDateInput = el.shadowRoot?.querySelector(\r\n '#date-min'\r\n ) as HTMLInputElement;\r\n const updateEventPromise = oneEvent(el, 'histogramDateRangeUpdated');\r\n\r\n // simulate typing a new value into input\r\n minDateInput.value = '1955';\r\n minDateInput.dispatchEvent(new Event('blur'));\r\n\r\n // will wait longer than debounce delay\r\n const { detail } = await updateEventPromise;\r\n // verify that event is emitted\r\n expect(detail.minDate).to.equal('1/1/1955');\r\n expect(detail.maxDate).to.equal('12/4/2020');\r\n\r\n let eventCount = 0;\r\n el.addEventListener('histogramDateRangeUpdated', () => (eventCount += 1));\r\n\r\n // events are not sent if no change since the last event that was sent\r\n minDateInput.value = '1955';\r\n minDateInput.dispatchEvent(new Event('blur'));\r\n await aTimeout(60); // wait longer than debounce delay\r\n expect(eventCount).to.equal(0);\r\n\r\n const updateEventPromise2 = oneEvent(el, 'histogramDateRangeUpdated');\r\n\r\n // with the debounce, multiple quick changes only result in one event sent\r\n minDateInput.value = '1965';\r\n minDateInput.dispatchEvent(new Event('blur'));\r\n await aTimeout(10); // wait less than the debounce delay\r\n\r\n minDateInput.dispatchEvent(new Event('focus'));\r\n minDateInput.value = '1975';\r\n minDateInput.dispatchEvent(new Event('blur'));\r\n await aTimeout(10);\r\n\r\n minDateInput.dispatchEvent(new Event('focus'));\r\n minDateInput.value = '1985';\r\n minDateInput.dispatchEvent(new Event('blur'));\r\n await aTimeout(10);\r\n\r\n const event2 = await updateEventPromise2;\r\n expect(event2.detail.minDate).to.equal('1/1/1985');\r\n expect(eventCount).to.equal(1); // only one event was fired\r\n });\r\n\r\n it('shows/hides tooltip when hovering over (or pointing at) a bar', async () => {\r\n const el = await createCustomElementInHTMLContainer();\r\n // include a number which will require commas (1,000,000)\r\n el.bins = [1000000, 1, 100];\r\n await aTimeout(10);\r\n const bars = el.shadowRoot?.querySelectorAll(\r\n '.bar'\r\n ) as unknown as SVGRectElement[];\r\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\r\n expect(tooltip.innerText).to.eq('');\r\n\r\n // hover\r\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\r\n await el.updateComplete;\r\n expect(tooltip.innerText).to.match(\r\n /^1,000,000 items\\n1\\/1\\/1900 - 4\\/23\\/1940/\r\n );\r\n expect(getComputedStyle(tooltip).display).to.eq('block');\r\n\r\n // leave\r\n bars[0].dispatchEvent(new PointerEvent('pointerleave'));\r\n await el.updateComplete;\r\n expect(getComputedStyle(tooltip).display).to.eq('none');\r\n expect(tooltip.innerText).to.eq('');\r\n\r\n // ensure singular item is not pluralized\r\n bars[1].dispatchEvent(new PointerEvent('pointerenter'));\r\n await el.updateComplete;\r\n expect(tooltip.innerText).to.match(/^1 item\\n4\\/23\\/1940 - 8\\/13\\/1980/);\r\n });\r\n\r\n it('does not show tooltip while dragging', async () => {\r\n const el = await createCustomElementInHTMLContainer();\r\n const bars = el.shadowRoot?.querySelectorAll(\r\n '.bar'\r\n ) as unknown as SVGRectElement[];\r\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\r\n expect(tooltip.innerText).to.eq('');\r\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\r\n\r\n // pointer down and slide right\r\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\r\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 100 }));\r\n await el.updateComplete;\r\n\r\n // hover over bar\r\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\r\n await el.updateComplete;\r\n // tooltip display is suppressed while dragging\r\n expect(tooltip.style.display).to.eq('');\r\n });\r\n\r\n it('passes the a11y audit', async () => {\r\n await fixture<HistogramDateRange>(subject).then(el =>\r\n expect(el).shadowDom.to.be.accessible()\r\n );\r\n });\r\n\r\n it('allows range to be pre-selected', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range\r\n minDate=\"1900\"\r\n maxDate=\"Dec 4, 2020\"\r\n minSelectedDate=\"2012\"\r\n maxSelectedDate=\"2019\"\r\n bins=\"[33, 1, 100]\"\r\n >\r\n </histogram-date-range>\r\n `\r\n );\r\n const minDateInput = el.shadowRoot?.querySelector(\r\n '#date-min'\r\n ) as HTMLInputElement;\r\n expect(minDateInput.value).to.eq('2012');\r\n\r\n const maxDateInput = el.shadowRoot?.querySelector(\r\n '#date-max'\r\n ) as HTMLInputElement;\r\n expect(maxDateInput.value).to.eq('2019');\r\n });\r\n\r\n it('extends the selected range when the histogram is clicked outside of the current range', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range\r\n minDate=\"1900\"\r\n maxDate=\"2020\"\r\n minSelectedDate=\"1950\"\r\n maxSelectedDate=\"1955\"\r\n bins=\"[33, 1, 1, 1, 10, 10, 1, 1, 1, 50, 100]\"\r\n >\r\n </histogram-date-range>\r\n `\r\n );\r\n\r\n const leftBarToClick = Array.from(\r\n el.shadowRoot?.querySelectorAll('.bar') as NodeList\r\n )[1]; // click on second bar to the left\r\n\r\n leftBarToClick.dispatchEvent(new Event('click'));\r\n await el.updateComplete;\r\n expect(el.minSelectedDate).to.eq('1910'); // range was extended to left\r\n\r\n const rightBarToClick = Array.from(\r\n el.shadowRoot?.querySelectorAll('.bar') as NodeList\r\n )[8]; // click on second bar from the right\r\n\r\n rightBarToClick.dispatchEvent(new Event('click'));\r\n expect(el.maxSelectedDate).to.eq('1998'); // range was extended to right\r\n });\r\n\r\n it('narrows the selected range when the histogram is clicked inside of the current range', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range\r\n minDate=\"1900\"\r\n maxDate=\"2020\"\r\n minSelectedDate=\"1900\"\r\n maxSelectedDate=\"2020\"\r\n bins=\"[33, 1, 1, 1, 10, 10, 1, 1, 1, 50, 100]\"\r\n >\r\n </histogram-date-range>\r\n `\r\n );\r\n\r\n ///////////////////////////////////////////////\r\n // NB: the slider nearest the clicked bar moves\r\n ///////////////////////////////////////////////\r\n\r\n const leftBarToClick = Array.from(\r\n el.shadowRoot?.querySelectorAll('.bar') as NodeList\r\n )[3]; // click on fourth bar to the left\r\n\r\n leftBarToClick.dispatchEvent(new Event('click'));\r\n expect(el.minSelectedDate).to.eq('1932'); // range was extended to the right\r\n\r\n const rightBarToClick = Array.from(\r\n el.shadowRoot?.querySelectorAll('.bar') as NodeList\r\n )[8]; // click on second bar from the right\r\n\r\n rightBarToClick.dispatchEvent(new Event('click'));\r\n expect(el.maxSelectedDate).to.eq('1998'); // range was extended to the left\r\n });\r\n\r\n it('handles invalid pre-selected range by defaulting to overall max and min', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range\r\n minDate=\"1900\"\r\n maxDate=\"2020\"\r\n minSelectedDate=\"2000xyz\"\r\n maxSelectedDate=\"5000\"\r\n bins=\"[33, 1, 100]\"\r\n >\r\n </histogram-date-range>\r\n `\r\n );\r\n const minDateInput = el.shadowRoot?.querySelector(\r\n '#date-min'\r\n ) as HTMLInputElement;\r\n // malformed min date defaults to overall min\r\n expect(minDateInput.value).to.eq('1900');\r\n\r\n const maxDateInput = el.shadowRoot?.querySelector(\r\n '#date-max'\r\n ) as HTMLInputElement;\r\n // well-formed max date is allowed\r\n expect(maxDateInput.value).to.eq('5000');\r\n });\r\n\r\n it('handles year values less than 1000 correctly', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range\r\n dateFormat=\"M/D/YYYY\"\r\n minDate=\"-2000\"\r\n maxDate=\"2000\"\r\n minSelectedDate=\"-500\"\r\n maxSelectedDate=\"500\"\r\n bins=\"[33, 1, 100]\"\r\n >\r\n </histogram-date-range>\r\n `\r\n );\r\n const minDateInput = el.shadowRoot?.querySelector(\r\n '#date-min'\r\n ) as HTMLInputElement;\r\n expect(minDateInput.value).to.eq('1/1/-500');\r\n\r\n const maxDateInput = el.shadowRoot?.querySelector(\r\n '#date-max'\r\n ) as HTMLInputElement;\r\n expect(maxDateInput.value).to.eq('1/1/500');\r\n });\r\n\r\n it('handles missing data', async () => {\r\n let el = await fixture<HistogramDateRange>(\r\n html`<histogram-date-range>\r\n minDate=\"1900\" maxDate=\"2020\" bins=\"\"\r\n </histogram-date-range>`\r\n );\r\n expect(el.shadowRoot?.innerHTML).to.contain('no data');\r\n el = await fixture<HistogramDateRange>(\r\n html`<histogram-date-range\r\n minDate=\"1900\"\r\n maxDate=\"2020\"\r\n bins=\"[]\"\r\n missingDataMessage=\"no data available\"\r\n ></histogram-date-range>`\r\n );\r\n expect(el.shadowRoot?.innerHTML).to.contain('no data available');\r\n });\r\n\r\n it('correctly displays data consisting of a single bin', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range minDate=\"2020\" maxDate=\"2020\" bins=\"[50]\">\r\n </histogram-date-range>\r\n `\r\n );\r\n const bars = el.shadowRoot?.querySelectorAll(\r\n '.bar'\r\n ) as unknown as SVGRectElement[];\r\n const heights = Array.from(bars).map(b => b.height.baseVal.value);\r\n expect(heights).to.eql([157]);\r\n });\r\n\r\n it('correctly displays small diff between max and min values', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range bins=\"[1519,2643,1880,2041,1638,1441]\">\r\n </histogram-date-range>\r\n `\r\n );\r\n const bars = el.shadowRoot?.querySelectorAll(\r\n '.bar'\r\n ) as unknown as SVGRectElement[];\r\n const heights = Array.from(bars).map(b => b.height.baseVal.value);\r\n expect(heights).to.eql([37, 40, 38, 38, 37, 36]);\r\n });\r\n\r\n it('correctly aligns bins to exact month boundaries when binSnapping=month', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range\r\n binSnapping=\"month\"\r\n dateFormat=\"YYYY-MM\"\r\n tooltipDateFormat=\"MMM YYYY\"\r\n minDate=\"2020-01\"\r\n maxDate=\"2021-12\"\r\n bins=\"[10,20,30,40,50,60,70,80]\"\r\n ></histogram-date-range>\r\n `\r\n );\r\n const bars = el.shadowRoot?.querySelectorAll(\r\n '.bar'\r\n ) as unknown as SVGRectElement[];\r\n const tooltips = Array.from(bars).map(b => b.dataset.tooltip);\r\n expect(tooltips).to.eql([\r\n 'Jan 2020 - Mar 2020',\r\n 'Apr 2020 - Jun 2020',\r\n 'Jul 2020 - Sep 2020',\r\n 'Oct 2020 - Dec 2020',\r\n 'Jan 2021 - Mar 2021',\r\n 'Apr 2021 - Jun 2021',\r\n 'Jul 2021 - Sep 2021',\r\n 'Oct 2021 - Dec 2021',\r\n ]);\r\n });\r\n\r\n it('correctly handles month snapping for years 0-99', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range\r\n binSnapping=\"month\"\r\n dateFormat=\"YYYY-MM\"\r\n tooltipDateFormat=\"MMM YYYY\"\r\n minDate=\"0050-01\"\r\n maxDate=\"0065-12\"\r\n bins=\"[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]\"\r\n ></histogram-date-range>\r\n `\r\n );\r\n\r\n const bars = el.shadowRoot?.querySelectorAll(\r\n '.bar'\r\n ) as unknown as SVGRectElement[];\r\n const tooltips = Array.from(bars).map(b => b.dataset.tooltip);\r\n expect(tooltips).to.eql([\r\n 'Jan 50 - Jun 50',\r\n 'Jul 50 - Dec 50',\r\n 'Jan 51 - Jun 51',\r\n 'Jul 51 - Dec 51',\r\n 'Jan 52 - Jun 52',\r\n 'Jul 52 - Dec 52',\r\n 'Jan 53 - Jun 53',\r\n 'Jul 53 - Dec 53',\r\n 'Jan 54 - Jun 54',\r\n 'Jul 54 - Dec 54',\r\n 'Jan 55 - Jun 55',\r\n 'Jul 55 - Dec 55',\r\n 'Jan 56 - Jun 56',\r\n 'Jul 56 - Dec 56',\r\n 'Jan 57 - Jun 57',\r\n 'Jul 57 - Dec 57',\r\n 'Jan 58 - Jun 58',\r\n 'Jul 58 - Dec 58',\r\n 'Jan 59 - Jun 59',\r\n 'Jul 59 - Dec 59',\r\n 'Jan 60 - Jun 60',\r\n 'Jul 60 - Dec 60',\r\n 'Jan 61 - Jun 61',\r\n 'Jul 61 - Dec 61',\r\n 'Jan 62 - Jun 62',\r\n 'Jul 62 - Dec 62',\r\n 'Jan 63 - Jun 63',\r\n 'Jul 63 - Dec 63',\r\n 'Jan 64 - Jun 64',\r\n 'Jul 64 - Dec 64',\r\n 'Jan 65 - Jun 65',\r\n 'Jul 65 - Dec 65',\r\n ]);\r\n });\r\n\r\n it('correctly aligns bins to exact year boundaries when binSnapping=year', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range\r\n binSnapping=\"year\"\r\n minDate=\"2000\"\r\n maxDate=\"2019\"\r\n bins=\"[10,20,30,40,50,60,70,80,90,100]\"\r\n ></histogram-date-range>\r\n `\r\n );\r\n const bars = el.shadowRoot?.querySelectorAll(\r\n '.bar'\r\n ) as unknown as SVGRectElement[];\r\n const tooltips = Array.from(bars).map(b => b.dataset.tooltip);\r\n expect(tooltips).to.eql([\r\n '2000 - 2001',\r\n '2002 - 2003',\r\n '2004 - 2005',\r\n '2006 - 2007',\r\n '2008 - 2009',\r\n '2010 - 2011',\r\n '2012 - 2013',\r\n '2014 - 2015',\r\n '2016 - 2017',\r\n '2018 - 2019',\r\n ]);\r\n });\r\n\r\n it('correctly handles year snapping for years 0-99', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range\r\n binSnapping=\"year\"\r\n dateFormat=\"YYYY\"\r\n minDate=\"0020\"\r\n maxDate=\"0025\"\r\n bins=\"[1,2,3,4,5,6]\"\r\n ></histogram-date-range>\r\n `\r\n );\r\n\r\n const bars = el.shadowRoot?.querySelectorAll(\r\n '.bar'\r\n ) as unknown as SVGRectElement[];\r\n const tooltips = Array.from(bars).map(b => b.dataset.tooltip);\r\n expect(tooltips).to.eql(['20', '21', '22', '23', '24', '25']);\r\n });\r\n\r\n it('does not duplicate start/end date in tooltips when representing a single year', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range\r\n binSnapping=\"year\"\r\n dateFormat=\"YYYY\"\r\n minDate=\"2001\"\r\n maxDate=\"2005\"\r\n bins=\"[10,20,30,40,50]\"\r\n ></histogram-date-range>\r\n `\r\n );\r\n const bars = el.shadowRoot?.querySelectorAll(\r\n '.bar'\r\n ) as unknown as SVGRectElement[];\r\n const tooltips = Array.from(bars).map(b => b.dataset.tooltip);\r\n expect(tooltips).to.eql(['2001', '2002', '2003', '2004', '2005']);\r\n });\r\n\r\n it('falls back to default date format for tooltips if no tooltip date format provided', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range\r\n binSnapping=\"year\"\r\n minDate=\"2001\"\r\n maxDate=\"2005\"\r\n bins=\"[10,20,30,40,50]\"\r\n ></histogram-date-range>\r\n `\r\n );\r\n\r\n const bars = el.shadowRoot?.querySelectorAll(\r\n '.bar'\r\n ) as unknown as SVGRectElement[];\r\n let tooltips = Array.from(bars).map(b => b.dataset.tooltip);\r\n expect(tooltips).to.eql(['2001', '2002', '2003', '2004', '2005']); // default YYYY date format\r\n\r\n el.dateFormat = 'YYYY/MM';\r\n el.minDate = '2001/01';\r\n el.maxDate = '2005/01';\r\n await el.updateComplete;\r\n\r\n // Should use dateFormat fallback for tooltips\r\n tooltips = Array.from(bars).map(b => b.dataset.tooltip);\r\n expect(tooltips).to.eql([\r\n '2001/01 - 2001/12',\r\n '2002/01 - 2002/12',\r\n '2003/01 - 2003/12',\r\n '2004/01 - 2004/12',\r\n '2005/01 - 2005/12',\r\n ]);\r\n\r\n el.dateFormat = 'YYYY';\r\n el.tooltipDateFormat = 'MMMM YYYY';\r\n el.minDate = '2001';\r\n el.maxDate = '2005';\r\n await el.updateComplete;\r\n\r\n // Should use defined tooltipDateFormat for tooltips\r\n tooltips = Array.from(bars).map(b => b.dataset.tooltip);\r\n expect(tooltips).to.eql([\r\n 'January 2001 - December 2001',\r\n 'January 2002 - December 2002',\r\n 'January 2003 - December 2003',\r\n 'January 2004 - December 2004',\r\n 'January 2005 - December 2005',\r\n ]);\r\n });\r\n\r\n it('has a disabled state', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range\r\n minDate=\"1900\"\r\n maxDate=\"2020\"\r\n disabled\r\n bins=\"[33, 1, 100]\"\r\n >\r\n </histogram-date-range>\r\n `\r\n );\r\n expect(\r\n el.shadowRoot\r\n ?.querySelector('.inner-container')\r\n ?.classList.contains('disabled')\r\n ).to.eq(true);\r\n\r\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\r\n\r\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(8); // initial state\r\n\r\n // attempt to slide to right\r\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\r\n await el.updateComplete;\r\n\r\n // cursor is not draggable if disabled\r\n expect(minSlider.classList.contains('draggable')).to.be.false;\r\n\r\n // attempt to slide to right\r\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 70 }));\r\n await el.updateComplete;\r\n\r\n // slider does not moved if element disabled\r\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(8);\r\n });\r\n\r\n it('has a loading state with an activity indicator', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range\r\n minDate=\"1900\"\r\n maxDate=\"2020\"\r\n loading\r\n bins=\"[33, 1, 100]\"\r\n >\r\n </histogram-date-range>\r\n `\r\n );\r\n expect(\r\n el.shadowRoot\r\n ?.querySelector('ia-activity-indicator')\r\n ?.attributes?.getNamedItem('mode')?.value\r\n ).to.eq('processing');\r\n });\r\n\r\n it('can use LitElement bound properties', async () => {\r\n const el = await fixture<HistogramDateRange>(\r\n html`\r\n <histogram-date-range\r\n .minDate=${1900}\r\n .maxDate=${'Dec 4, 2020'}\r\n .minSelectedDate=${2012}\r\n .maxSelectedDate=${2019}\r\n .bins=${[33, 1, 100]}\r\n >\r\n </histogram-date-range>\r\n `\r\n );\r\n const minDateInput = el.shadowRoot?.querySelector(\r\n '#date-min'\r\n ) as HTMLInputElement;\r\n expect(minDateInput.value).to.eq('2012');\r\n\r\n const maxDateInput = el.shadowRoot?.querySelector(\r\n '#date-max'\r\n ) as HTMLInputElement;\r\n expect(maxDateInput.value).to.eq('2019');\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"histogram-date-range.test.js","sourceRoot":"","sources":["../../test/histogram-date-range.test.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG7E,OAAO,6BAA6B,CAAC;AAErC,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,KAAK,GAAG,GAAG,CAAC;AAElB,MAAM,OAAO,GAAG,IAAI,CAAA;;aAEP,KAAK;;;;;;;;;CASjB,CAAC;AAEF,KAAK,UAAU,kCAAkC;IAC/C,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAC9B,WAAW,EACX;;;;;;;;;;;;aAYS,CACV,CAAC;IACF,4EAA4E;IAC5E,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACjD,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC9C,OAAO,OAAO,CAAqB,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;;QACvE,MAAM,EAAE,GAAG,MAAM,kCAAkC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAC1C,MAAM,CACwB,CAAC;QACjC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE9D,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;;QAC7D,MAAM,EAAE,GAAG,MAAM,kCAAkC,EAAE,CAAC;QACtD,EAAE,CAAC,UAAU,GAAG,QAAQ,CAAC;QACzB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAC1C,MAAM,CACwB,CAAC;QACjC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE9D,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;;QAC7D,MAAM,EAAE,GAAG,MAAM,kCAAkC,EAAE,CAAC;QACtD,EAAE,CAAC,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAC1C,MAAM,CACwB,CAAC;QACjC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE9D,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;;QACvG,MAAM,EAAE,GAAG,MAAM,kCAAkC,EAAE,CAAC;QAEtD,gFAAgF;QAChF,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QAEtB,MAAM,eAAe,GAAG,IAAI,aAAa,CAAC,OAAO,EAAE;YACjD,GAAG,EAAE,OAAO;SACb,CAAC,CAAC;QAEH,iBAAiB;QACjB,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC;QAC5B,YAAY,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QAE5C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,wBAAwB;QAEtE,8CAA8C;QAC9C,YAAY,CAAC,KAAK,GAAG,WAAW,CAAC;QACjC,YAAY,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAE9C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,0BAA0B;QACjF,0CAA0C;QAC1C,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;QAE9C,iFAAiF;QACjF,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QAEtB,qBAAqB;QACrB,YAAY,CAAC,KAAK,GAAG,WAAW,CAAC;QACjC,YAAY,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QAE5C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;QAE9C,2CAA2C;QAC3C,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC;QAClC,YAAY,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,2BAA2B;QAC9E,6CAA6C;QAC7C,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;;QACnG,MAAM,EAAE,GAAG,MAAM,kCAAkC,EAAE,CAAC;QACtD,EAAE,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC7B,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,EAAE,CAAC,gBAAgB,CACjB,2BAA2B,EAC3B,GAAG,EAAE,CAAC,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAChC,CAAC;QAEF,gFAAgF;QAChF,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QAEtB,iFAAiF;QACjF,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QAEtB,YAAY,CAAC,KAAK,EAAE,CAAC;QAErB,qFAAqF;QACrF,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC;QAC5B,YAAY,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;QAElB,iGAAiG;QACjG,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QAE7C,gBAAgB,GAAG,KAAK,CAAC;QACzB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,qFAAqF;QACrF,YAAY,CAAC,KAAK,GAAG,WAAW,CAAC;QACjC,YAAY,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;QAElB,iGAAiG;QACjG,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kHAAkH,EAAE,KAAK,IAAI,EAAE;;QAChI,MAAM,EAAE,GAAG,MAAM,kCAAkC,EAAE,CAAC;QAEtD,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,EAAE,CAAC,gBAAgB,CACjB,2BAA2B,EAC3B,GAAG,EAAE,CAAC,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAChC,CAAC;QAEF,gFAAgF;QAChF,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QAEtB,iFAAiF;QACjF,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QAEtB,YAAY,CAAC,KAAK,EAAE,CAAC;QAErB,qFAAqF;QACrF,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC;QAC5B,YAAY,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;QAElB,8EAA8E;QAC9E,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAErC,qFAAqF;QACrF,YAAY,CAAC,KAAK,GAAG,WAAW,CAAC;QACjC,YAAY,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;QAElB,8EAA8E;QAC9E,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;;QAC3C,MAAM,EAAE,GAAG,MAAM,kCAAkC,EAAE,CAAC;QAEtD,gFAAgF;QAChF,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QAEtB,YAAY,CAAC,KAAK,GAAG,WAAW,CAAC;QACjC,YAAY,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;QAE9C,sBAAsB;QACtB,YAAY,CAAC,KAAK,GAAG,SAAS,CAAC;QAC/B,YAAY,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB;QAC9D,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,+BAA+B;QAE9E,iFAAiF;QACjF,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QAEtB,iBAAiB;QACjB,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC;QAClD,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;QAE9C,sBAAsB;QACtB,YAAY,CAAC,KAAK,GAAG,cAAc,CAAC;QACpC,YAAY,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,gBAAgB;QAC/E,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,+BAA+B;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;;QAClE,MAAM,EAAE,GAAG,MAAM,kCAAkC,EAAE,CAAC;QAEtD,gFAAgF;QAChF,MAAM,SAAS,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,aAAa,CAAe,CAAC;QAC5E,MAAM,SAAS,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC5C,YAAY,CACK,CAAC;QACpB,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QAEtB,gBAAgB;QAChB,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAE7D,eAAe;QACf,SAAS,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,2BAA2B;QAC3B,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;QACtC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACnD,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAElD,iBAAiB;QACjB,MAAM,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACvE,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,mBAAmB;QACnB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACnE,sBAAsB;QACtB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;QAE9C,gBAAgB;QAChB,MAAM,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,2BAA2B;QAC3B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAEnE,iFAAiF;QACjF,MAAM,SAAS,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,aAAa,CAAe,CAAC;QAC5E,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QAEtB,gBAAgB;QAChB,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAEvD,gBAAgB;QAChB,SAAS,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,mBAAmB;QACnB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACnE,sBAAsB;QACtB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,0CAA0C;QAC1C,SAAS,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,oDAAoD;QACpD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAEnE,0CAA0C;QAC1C,SAAS,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACvE,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,yBAAyB;QAE7F,6CAA6C;QAC7C,SAAS,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,+BAA+B;QACvF,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;;QACjF,MAAM,EAAE,GAAG,MAAM,kCAAkC,EAAE,CAAC;QACtD,EAAE,CAAC,WAAW,GAAG,OAAO,CAAC;QACzB,EAAE,CAAC,UAAU,GAAG,SAAS,CAAC;QAC1B,EAAE,CAAC,OAAO,GAAG,SAAS,CAAC;QACvB,EAAE,CAAC,OAAO,GAAG,SAAS,CAAC;QACvB,EAAE,CAAC,eAAe,GAAG,SAAS,CAAC;QAC/B,EAAE,CAAC,eAAe,GAAG,SAAS,CAAC;QAC/B,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3C,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,MAAM,SAAS,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,aAAa,CAAe,CAAC;QAC5E,MAAM,SAAS,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,aAAa,CAAe,CAAC;QAE5E,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QACtB,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QAEtB,gBAAgB;QAChB,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAClE,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAClE,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAEvD,kDAAkD;QAClD,SAAS,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB;QAC7E,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB;QAE/D,mDAAmD;QACnD,SAAS,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB;QAC7E,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;;QAC1E,MAAM,EAAE,GAAG,MAAM,kCAAkC,EAAE,CAAC;QACtD,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,6BAA6B;QAElD,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QACtB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,EAAE,EAAE,2BAA2B,CAAC,CAAC;QAErE,yCAAyC;QACzC,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC;QAC5B,YAAY,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAE9C,uCAAuC;QACvC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC;QAC5C,+BAA+B;QAC/B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAE7C,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,EAAE,CAAC,gBAAgB,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC;QAE1E,sEAAsE;QACtE,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC;QAC5B,YAAY,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,kCAAkC;QACtD,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE/B,MAAM,mBAAmB,GAAG,QAAQ,CAAC,EAAE,EAAE,2BAA2B,CAAC,CAAC;QAEtE,0EAA0E;QAC1E,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC;QAC5B,YAAY,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,oCAAoC;QAExD,YAAY,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC;QAC5B,YAAY,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEnB,YAAY,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC;QAC5B,YAAY,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEnB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,2BAA2B;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;;QAC7E,MAAM,EAAE,GAAG,MAAM,kCAAkC,EAAE,CAAC;QACtD,yDAAyD;QACzD,EAAE,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5B,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAC1C,qBAAqB,CACS,CAAC;QACjC,MAAM,OAAO,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,UAAU,CAAmB,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAEpC,QAAQ;QACR,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAChC,4CAA4C,CAC7C,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAEzD,QAAQ;QACR,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAEpC,yCAAyC;QACzC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;;QAC3C,MAAM,EAAE,GAAG,MAAM,kCAAkC,EAAE,CAAC;QACtD,EAAE,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5B,EAAE,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC3B,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAC1C,qBAAqB,CACS,CAAC;QACjC,MAAM,OAAO,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,UAAU,CAAmB,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAEpC,QAAQ;QACR,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAChC,8CAA8C,CAC/C,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAEzD,QAAQ;QACR,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAEpC,yCAAyC;QACzC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;;QACpD,MAAM,EAAE,GAAG,MAAM,kCAAkC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAC1C,qBAAqB,CACS,CAAC;QACjC,MAAM,OAAO,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,UAAU,CAAmB,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,aAAa,CAAe,CAAC;QAE5E,+BAA+B;QAC/B,SAAS,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,iBAAiB;QACjB,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,+CAA+C;QAC/C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,OAAO,CAAqB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CACnD,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CACxC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;;QAC/C,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;;;;;;;OASH,CACF,CAAC;QACF,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QACtB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QACtB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;;QACrG,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;;;;;;;OASH,CACF,CAAC;QAEF,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAC/B,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAAC,qBAAqB,CAAa,CACnE,CAAC,CAAC,CAAC,CAAC,CAAC,kCAAkC;QAExC,cAAc,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,MAAM,EAAE,CAAC,cAAc,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,6BAA6B;QAEvE,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAChC,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAAC,qBAAqB,CAAa,CACnE,CAAC,CAAC,CAAC,CAAC,CAAC,qCAAqC;QAE3C,eAAe,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,8BAA8B;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sFAAsF,EAAE,KAAK,IAAI,EAAE;;QACpG,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;;;;;;;OASH,CACF,CAAC;QAEF,+CAA+C;QAC/C,+CAA+C;QAC/C,+CAA+C;QAE/C,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAC/B,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAAC,qBAAqB,CAAa,CACnE,CAAC,CAAC,CAAC,CAAC,CAAC,kCAAkC;QAExC,cAAc,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,kCAAkC;QAE5E,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAChC,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAAC,qBAAqB,CAAa,CACnE,CAAC,CAAC,CAAC,CAAC,CAAC,qCAAqC;QAE3C,eAAe,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,iCAAiC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;;QACvF,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;;;;;;;OASH,CACF,CAAC;QACF,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QACtB,6CAA6C;QAC7C,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QACtB,kCAAkC;QAClC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;;QAC5D,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;;;;;;;;OAUH,CACF,CAAC;QACF,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QACtB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QAE7C,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QACtB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;;QACpC,IAAI,EAAE,GAAG,MAAM,OAAO,CACpB,IAAI,CAAA;;8BAEoB,CACzB,CAAC;QACF,MAAM,CAAC,MAAA,EAAE,CAAC,UAAU,0CAAE,SAAS,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,EAAE,GAAG,MAAM,OAAO,CAChB,IAAI,CAAA;;;;;+BAKqB,CAC1B,CAAC;QACF,MAAM,CAAC,MAAA,EAAE,CAAC,UAAU,0CAAE,SAAS,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;;QAClE,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;OAGH,CACF,CAAC;QACF,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAC1C,MAAM,CACwB,CAAC;QACjC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;;QACxE,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;OAGH,CACF,CAAC;QACF,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAC1C,MAAM,CACwB,CAAC;QACjC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;;QACtF,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;;;;;;;OASH,CACF,CAAC;QACF,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAC1C,qBAAqB,CACS,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;YACtB,qBAAqB;YACrB,qBAAqB;YACrB,qBAAqB;YACrB,qBAAqB;YACrB,qBAAqB;YACrB,qBAAqB;YACrB,qBAAqB;YACrB,qBAAqB;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;;QAC/D,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;;;;;;;OASH,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAC1C,qBAAqB,CACS,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;YACtB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;;QACpF,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;;;;;OAOH,CACF,CAAC;QACF,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAC1C,qBAAqB,CACS,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;YACtB,aAAa;YACb,aAAa;YACb,aAAa;YACb,aAAa;YACb,aAAa;YACb,aAAa;YACb,aAAa;YACb,aAAa;YACb,aAAa;YACb,aAAa;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;;QAC9D,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;;;;;;OAQH,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAC1C,qBAAqB,CACS,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;;QAC7F,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;;;;;;OAQH,CACF,CAAC;QACF,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAC1C,qBAAqB,CACS,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;;QACjG,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;;;;;OAOH,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,gBAAgB,CAC1C,qBAAqB,CACS,CAAC;QACjC,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,2BAA2B;QAE9F,EAAE,CAAC,UAAU,GAAG,SAAS,CAAC;QAC1B,EAAE,CAAC,OAAO,GAAG,SAAS,CAAC;QACvB,EAAE,CAAC,OAAO,GAAG,SAAS,CAAC;QACvB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,8CAA8C;QAC9C,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;YACtB,mBAAmB;YACnB,mBAAmB;YACnB,mBAAmB;YACnB,mBAAmB;YACnB,mBAAmB;SACpB,CAAC,CAAC;QAEH,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC;QACvB,EAAE,CAAC,iBAAiB,GAAG,WAAW,CAAC;QACnC,EAAE,CAAC,OAAO,GAAG,MAAM,CAAC;QACpB,EAAE,CAAC,OAAO,GAAG,MAAM,CAAC;QACpB,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,oDAAoD;QACpD,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;YACtB,8BAA8B;YAC9B,8BAA8B;YAC9B,8BAA8B;YAC9B,8BAA8B;YAC9B,8BAA8B;SAC/B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;;QACpC,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;;;;;;OAQH,CACF,CAAC;QACF,MAAM,CACJ,MAAA,MAAA,EAAE,CAAC,UAAU,0CACT,aAAa,CAAC,kBAAkB,CAAC,0CACjC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CACnC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,SAAS,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAAC,aAAa,CAAe,CAAC;QAE5E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB;QAElF,4BAA4B;QAC5B,SAAS,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,sCAAsC;QACtC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAE9D,4BAA4B;QAC5B,MAAM,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACvE,MAAM,EAAE,CAAC,cAAc,CAAC;QAExB,4CAA4C;QAC5C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;;QAC9D,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;;;;;;;OAQH,CACF,CAAC;QACF,MAAM,CACJ,MAAA,MAAA,MAAA,MAAA,EAAE,CAAC,UAAU,0CACT,aAAa,CAAC,uBAAuB,CAAC,0CACtC,UAAU,0CAAE,YAAY,CAAC,MAAM,CAAC,0CAAE,KAAK,CAC5C,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;;QACnD,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,IAAI,CAAA;;qBAEW,IAAI;qBACJ,aAAa;6BACL,IAAI;6BACJ,IAAI;kBACf,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;;;OAGvB,CACF,CAAC;QACF,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QACtB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,YAAY,GAAG,MAAA,EAAE,CAAC,UAAU,0CAAE,aAAa,CAC/C,WAAW,CACQ,CAAC;QACtB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-expressions */\nimport { html, fixture, expect, oneEvent, aTimeout } from '@open-wc/testing';\n\nimport { HistogramDateRange } from '../src/histogram-date-range';\nimport '../src/histogram-date-range';\n\nconst SLIDER_WIDTH = 10;\nconst WIDTH = 200;\n\nconst subject = html`\n <histogram-date-range\n width=\"${WIDTH}\"\n tooltipWidth=\"140\"\n height=\"50\"\n dateFormat=\"M/D/YYYY\"\n minDate=\"1900\"\n maxDate=\"12/4/2020\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n`;\n\nasync function createCustomElementInHTMLContainer(): Promise<HistogramDateRange> {\n document.head.insertAdjacentHTML(\n 'beforeend',\n `<style>\n html {\n font-size:10px;\n }\n .container {\n width: 400px;\n height: 400px;\n display: flex;\n background: #FFF6E1;\n justify-content: center;\n align-items: center;\n }\n </style>`\n );\n // https://open-wc.org/docs/testing/helpers/#customize-the-fixture-container\n const parentNode = document.createElement('div');\n parentNode.setAttribute('class', 'container');\n return fixture<HistogramDateRange>(subject, { parentNode });\n}\n\ndescribe('HistogramDateRange', () => {\n it('shows log-scaled histogram bars when provided with data', async () => {\n const el = await createCustomElementInHTMLContainer();\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n\n expect(heights).to.eql([38, 7, 50]);\n });\n\n it('uses linear bar height scaling when specified', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.barScaling = 'linear';\n await el.updateComplete;\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n\n expect(heights).to.eql([16, 0, 50]);\n });\n\n it('uses custom bar height scaling when specified', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.barScaling = (x: number) => Math.sqrt(x);\n await el.updateComplete;\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n\n expect(heights).to.eql([28, 5, 50]);\n });\n\n it('changes the position of the sliders and standardizes date format when dates are entered', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n expect(el.minSliderX).to.eq(SLIDER_WIDTH);\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n const pressEnterEvent = new KeyboardEvent('keyup', {\n key: 'Enter',\n });\n\n // valid min date\n minDateInput.value = '1950';\n minDateInput.dispatchEvent(pressEnterEvent);\n\n expect(Math.floor(el.minSliderX)).to.eq(84);\n expect(el.minSelectedDate).to.eq('1/1/1950'); // set to correct format\n\n // attempt to set date earlier than first item\n minDateInput.value = '10/1/1850';\n minDateInput.dispatchEvent(new Event('blur'));\n\n expect(Math.floor(el.minSliderX)).to.eq(SLIDER_WIDTH); // leftmost valid position\n // allow date value less than slider range\n expect(el.minSelectedDate).to.eq('10/1/1850');\n\n /* -------------------------- maximum (right) slider ------------------------- */\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH);\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // set valid max date\n maxDateInput.value = '3/12/1975';\n maxDateInput.dispatchEvent(pressEnterEvent);\n\n expect(Math.floor(el.maxSliderX)).to.eq(121);\n expect(maxDateInput.value).to.eq('3/12/1975');\n\n // attempt to set date later than last item\n maxDateInput.value = '12/31/2199';\n maxDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH); // rightmost valid position\n // allow date value greater than slider range\n expect(maxDateInput.value).to.eq('12/31/2199');\n });\n\n it('when updateWhileFocused option is true, updates are fired upon changing input focus', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.updateWhileFocused = true;\n await el.updateComplete;\n\n let updateEventFired = false;\n el.addEventListener(\n 'histogramDateRangeUpdated',\n () => (updateEventFired = true)\n );\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n minDateInput.focus();\n\n // set valid min date, but don't hit Enter -- just switch focus to the max date input\n minDateInput.value = '1950';\n maxDateInput.focus();\n await el.updateComplete;\n await aTimeout(0);\n\n // update event should have fired, setting the minSelectedDate prop & slider position accordingly\n expect(updateEventFired).to.be.true;\n expect(Math.floor(el.minSliderX)).to.eq(84);\n expect(el.minSelectedDate).to.eq('1/1/1950');\n\n updateEventFired = false;\n await el.updateComplete;\n\n // set valid max date, but don't hit Enter -- just switch focus to the min date input\n maxDateInput.value = '3/12/1975';\n minDateInput.focus();\n await el.updateComplete;\n await aTimeout(0);\n\n // update event should have fired, setting the maxSelectedDate prop & slider position accordingly\n expect(updateEventFired).to.be.true;\n expect(Math.floor(el.maxSliderX)).to.eq(121);\n expect(el.maxSelectedDate).to.eq('3/12/1975');\n });\n\n it('when updateWhileFocused option is false (default), updates are not fired while one of the inputs remains focused', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n let updateEventFired = false;\n el.addEventListener(\n 'histogramDateRangeUpdated',\n () => (updateEventFired = true)\n );\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n minDateInput.focus();\n\n // set valid min date, but don't hit Enter -- just switch focus to the max date input\n minDateInput.value = '1950';\n maxDateInput.focus();\n await el.updateComplete;\n await aTimeout(0);\n\n // update event should NOT have fired, because focus remains within the inputs\n expect(updateEventFired).to.be.false;\n\n // set valid max date, but don't hit Enter -- just switch focus to the min date input\n maxDateInput.value = '3/12/1975';\n minDateInput.focus();\n await el.updateComplete;\n await aTimeout(0);\n\n // update event should NOT have fired, because focus remains within the inputs\n expect(updateEventFired).to.be.false;\n });\n\n it('handles invalid date inputs', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n minDateInput.value = '5/17/1961';\n minDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.minSliderX)).to.eq(101);\n expect(minDateInput.value).to.eq('5/17/1961');\n\n // enter invalid value\n minDateInput.value = 'invalid';\n minDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.minSliderX)).to.eq(101); // does not move\n expect(minDateInput.value).to.eq('5/17/1961'); // resets back to previous date\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // initial values\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH);\n expect(maxDateInput.value).to.eq('12/4/2020');\n\n // enter invalid value\n maxDateInput.value = 'Abc 12, 1YYY';\n maxDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.maxSliderX)).to.eq(WIDTH - SLIDER_WIDTH); // does not move\n expect(maxDateInput.value).to.eq('12/4/2020'); // resets back to previous date\n });\n\n it('updates the date inputs when the sliders are moved', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n const container = el.shadowRoot?.querySelector(\n '#container'\n ) as HTMLDivElement;\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n // initial state\n expect(minSlider.getBoundingClientRect().x).to.eq(108);\n expect(minSlider.classList.contains('draggable')).to.be.true;\n\n // pointer down\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n await el.updateComplete;\n\n // cursor changes to 'grab'\n const classList = minSlider.classList;\n expect(classList.contains('draggable')).to.be.true;\n expect(classList.contains('dragging')).to.be.true;\n\n // slide to right\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 60 }));\n await el.updateComplete;\n\n // slider has moved\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(168);\n // min date is updated\n expect(minDateInput.value).to.eq('4/23/1940');\n\n // stop dragging\n window.dispatchEvent(new PointerEvent('pointerup'));\n await el.updateComplete;\n\n // cursor returns to normal\n expect(Array.from(container.classList)).not.to.include('dragging');\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxSlider = el.shadowRoot?.querySelector('#slider-max') as SVGElement;\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // initial state\n expect(maxSlider.getBoundingClientRect().x).to.eq(298);\n\n // slide to left\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 195 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 165 }));\n await el.updateComplete;\n\n // slider has moved\n expect(Math.round(maxSlider.getBoundingClientRect().x)).to.eq(268);\n // max date is updated\n expect(maxDateInput.value).to.eq('10/8/2000');\n await el.updateComplete;\n\n // try to slide min slider past max slider\n minSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 62 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 190 }));\n await el.updateComplete;\n\n // slider moves all the way to meet the right slider\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(258);\n\n // try to slide max slider past min slider\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 120 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 50 }));\n await el.updateComplete;\n expect(Math.round(maxSlider.getBoundingClientRect().x)).to.eq(268); // max slider didn't move\n\n // try to slide max slider off the right edge\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 120 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 300 }));\n await el.updateComplete;\n expect(maxSlider.getBoundingClientRect().x).to.eq(298); // back to its initial position\n expect(el.maxSelectedDate).to.equal('12/4/2020');\n });\n\n it('does not permit sliders to select dates outside the allowed range', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.binSnapping = 'month';\n el.dateFormat = 'YYYY-MM';\n el.minDate = '2020-01';\n el.maxDate = '2021-12';\n el.minSelectedDate = '2020-01';\n el.maxSelectedDate = '2021-12';\n el.bins = [10, 20, 30, 40, 50, 60, 70, 80];\n await el.updateComplete;\n\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n const maxSlider = el.shadowRoot?.querySelector('#slider-max') as SVGElement;\n\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // initial state\n expect(minSlider.getBoundingClientRect().x).to.eq(108, 'initial');\n expect(maxSlider.getBoundingClientRect().x).to.eq(298, 'initial');\n expect(minDateInput.value).to.eq('2020-01', 'initial');\n expect(maxDateInput.value).to.eq('2021-12', 'initial');\n\n // try dragging the min slider too far to the left\n minSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 0 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: -50 }));\n await el.updateComplete;\n expect(minSlider.getBoundingClientRect().x).to.eq(108); // slider didn't move\n expect(minDateInput.value).to.eq('2020-01'); // value unchanged\n\n // try dragging the max slider too far to the right\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 195 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 250 }));\n await el.updateComplete;\n expect(maxSlider.getBoundingClientRect().x).to.eq(298); // slider didn't move\n expect(maxDateInput.value).to.eq('2021-12'); // value unchanged\n });\n\n it(\"emits a custom event when the element's date range changes\", async () => {\n const el = await createCustomElementInHTMLContainer();\n el.updateDelay = 30; // set debounce delay of 30ms\n\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n const updateEventPromise = oneEvent(el, 'histogramDateRangeUpdated');\n\n // simulate typing a new value into input\n minDateInput.value = '1955';\n minDateInput.dispatchEvent(new Event('blur'));\n\n // will wait longer than debounce delay\n const { detail } = await updateEventPromise;\n // verify that event is emitted\n expect(detail.minDate).to.equal('1/1/1955');\n expect(detail.maxDate).to.equal('12/4/2020');\n\n let eventCount = 0;\n el.addEventListener('histogramDateRangeUpdated', () => (eventCount += 1));\n\n // events are not sent if no change since the last event that was sent\n minDateInput.value = '1955';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(60); // wait longer than debounce delay\n expect(eventCount).to.equal(0);\n\n const updateEventPromise2 = oneEvent(el, 'histogramDateRangeUpdated');\n\n // with the debounce, multiple quick changes only result in one event sent\n minDateInput.value = '1965';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10); // wait less than the debounce delay\n\n minDateInput.dispatchEvent(new Event('focus'));\n minDateInput.value = '1975';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10);\n\n minDateInput.dispatchEvent(new Event('focus'));\n minDateInput.value = '1985';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10);\n\n const event2 = await updateEventPromise2;\n expect(event2.detail.minDate).to.equal('1/1/1985');\n expect(eventCount).to.equal(1); // only one event was fired\n });\n\n it('shows/hides tooltip when hovering over (or pointing at) a bar', async () => {\n const el = await createCustomElementInHTMLContainer();\n // include a number which will require commas (1,000,000)\n el.bins = [1000000, 1, 100];\n await aTimeout(10);\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\n expect(tooltip.innerText).to.eq('');\n\n // hover\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(\n /^1,000,000 items\\n1\\/1\\/1900 - 4\\/23\\/1940/\n );\n expect(getComputedStyle(tooltip).display).to.eq('block');\n\n // leave\n bars[0].dispatchEvent(new PointerEvent('pointerleave'));\n await el.updateComplete;\n expect(getComputedStyle(tooltip).display).to.eq('none');\n expect(tooltip.innerText).to.eq('');\n\n // ensure singular item is not pluralized\n bars[1].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(/^1 item\\n4\\/23\\/1940 - 8\\/13\\/1980/);\n });\n\n it('uses provided tooltip label', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.bins = [1000000, 1, 100];\n el.tooltipLabel = 'foobar';\n await aTimeout(10);\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\n expect(tooltip.innerText).to.eq('');\n\n // hover\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(\n /^1,000,000 foobars\\n1\\/1\\/1900 - 4\\/23\\/1940/\n );\n expect(getComputedStyle(tooltip).display).to.eq('block');\n\n // leave\n bars[0].dispatchEvent(new PointerEvent('pointerleave'));\n await el.updateComplete;\n expect(getComputedStyle(tooltip).display).to.eq('none');\n expect(tooltip.innerText).to.eq('');\n\n // ensure singular item is not pluralized\n bars[1].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(/^1 foobar\\n4\\/23\\/1940 - 8\\/13\\/1980/);\n });\n\n it('does not show tooltip while dragging', async () => {\n const el = await createCustomElementInHTMLContainer();\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\n expect(tooltip.innerText).to.eq('');\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n\n // pointer down and slide right\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 100 }));\n await el.updateComplete;\n\n // hover over bar\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n // tooltip display is suppressed while dragging\n expect(tooltip.style.display).to.eq('');\n });\n\n it('passes the a11y audit', async () => {\n await fixture<HistogramDateRange>(subject).then(el =>\n expect(el).shadowDom.to.be.accessible()\n );\n });\n\n it('allows range to be pre-selected', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"Dec 4, 2020\"\n minSelectedDate=\"2012\"\n maxSelectedDate=\"2019\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n expect(minDateInput.value).to.eq('2012');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n expect(maxDateInput.value).to.eq('2019');\n });\n\n it('extends the selected range when the histogram is clicked outside of the current range', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n minSelectedDate=\"1950\"\n maxSelectedDate=\"1955\"\n bins=\"[33, 1, 1, 1, 10, 10, 1, 1, 1, 50, 100]\"\n >\n </histogram-date-range>\n `\n );\n\n const leftBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar-pointer-target') as NodeList\n )[1]; // click on second bar to the left\n\n leftBarToClick.dispatchEvent(new Event('click'));\n await el.updateComplete;\n expect(el.minSelectedDate).to.eq('1910'); // range was extended to left\n\n const rightBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar-pointer-target') as NodeList\n )[8]; // click on second bar from the right\n\n rightBarToClick.dispatchEvent(new Event('click'));\n expect(el.maxSelectedDate).to.eq('1998'); // range was extended to right\n });\n\n it('narrows the selected range when the histogram is clicked inside of the current range', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n minSelectedDate=\"1900\"\n maxSelectedDate=\"2020\"\n bins=\"[33, 1, 1, 1, 10, 10, 1, 1, 1, 50, 100]\"\n >\n </histogram-date-range>\n `\n );\n\n ///////////////////////////////////////////////\n // NB: the slider nearest the clicked bar moves\n ///////////////////////////////////////////////\n\n const leftBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar-pointer-target') as NodeList\n )[3]; // click on fourth bar to the left\n\n leftBarToClick.dispatchEvent(new Event('click'));\n expect(el.minSelectedDate).to.eq('1932'); // range was extended to the right\n\n const rightBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar-pointer-target') as NodeList\n )[8]; // click on second bar from the right\n\n rightBarToClick.dispatchEvent(new Event('click'));\n expect(el.maxSelectedDate).to.eq('1998'); // range was extended to the left\n });\n\n it('handles invalid pre-selected range by defaulting to overall max and min', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n minSelectedDate=\"2000xyz\"\n maxSelectedDate=\"5000\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n // malformed min date defaults to overall min\n expect(minDateInput.value).to.eq('1900');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n // well-formed max date is allowed\n expect(maxDateInput.value).to.eq('5000');\n });\n\n it('handles year values less than 1000 correctly', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n dateFormat=\"M/D/YYYY\"\n minDate=\"-2000\"\n maxDate=\"2000\"\n minSelectedDate=\"-500\"\n maxSelectedDate=\"500\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n expect(minDateInput.value).to.eq('1/1/-500');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n expect(maxDateInput.value).to.eq('1/1/500');\n });\n\n it('handles missing data', async () => {\n let el = await fixture<HistogramDateRange>(\n html`<histogram-date-range>\n minDate=\"1900\" maxDate=\"2020\" bins=\"\"\n </histogram-date-range>`\n );\n expect(el.shadowRoot?.innerHTML).to.contain('no data');\n el = await fixture<HistogramDateRange>(\n html`<histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n bins=\"[]\"\n missingDataMessage=\"no data available\"\n ></histogram-date-range>`\n );\n expect(el.shadowRoot?.innerHTML).to.contain('no data available');\n });\n\n it('correctly displays data consisting of a single bin', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range minDate=\"2020\" maxDate=\"2020\" bins=\"[50]\">\n </histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n expect(heights).to.eql([157]);\n });\n\n it('correctly displays small diff between max and min values', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range bins=\"[1519,2643,1880,2041,1638,1441]\">\n </histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n expect(heights).to.eql([37, 40, 38, 38, 37, 36]);\n });\n\n it('correctly aligns bins to exact month boundaries when binSnapping=month', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"month\"\n dateFormat=\"YYYY-MM\"\n tooltipDateFormat=\"MMM YYYY\"\n minDate=\"2020-01\"\n maxDate=\"2021-12\"\n bins=\"[10,20,30,40,50,60,70,80]\"\n ></histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n 'Jan 2020 - Mar 2020',\n 'Apr 2020 - Jun 2020',\n 'Jul 2020 - Sep 2020',\n 'Oct 2020 - Dec 2020',\n 'Jan 2021 - Mar 2021',\n 'Apr 2021 - Jun 2021',\n 'Jul 2021 - Sep 2021',\n 'Oct 2021 - Dec 2021',\n ]);\n });\n\n it('correctly handles month snapping for years 0-99', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"month\"\n dateFormat=\"YYYY-MM\"\n tooltipDateFormat=\"MMM YYYY\"\n minDate=\"0050-01\"\n maxDate=\"0065-12\"\n bins=\"[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]\"\n ></histogram-date-range>\n `\n );\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n 'Jan 50 - Jun 50',\n 'Jul 50 - Dec 50',\n 'Jan 51 - Jun 51',\n 'Jul 51 - Dec 51',\n 'Jan 52 - Jun 52',\n 'Jul 52 - Dec 52',\n 'Jan 53 - Jun 53',\n 'Jul 53 - Dec 53',\n 'Jan 54 - Jun 54',\n 'Jul 54 - Dec 54',\n 'Jan 55 - Jun 55',\n 'Jul 55 - Dec 55',\n 'Jan 56 - Jun 56',\n 'Jul 56 - Dec 56',\n 'Jan 57 - Jun 57',\n 'Jul 57 - Dec 57',\n 'Jan 58 - Jun 58',\n 'Jul 58 - Dec 58',\n 'Jan 59 - Jun 59',\n 'Jul 59 - Dec 59',\n 'Jan 60 - Jun 60',\n 'Jul 60 - Dec 60',\n 'Jan 61 - Jun 61',\n 'Jul 61 - Dec 61',\n 'Jan 62 - Jun 62',\n 'Jul 62 - Dec 62',\n 'Jan 63 - Jun 63',\n 'Jul 63 - Dec 63',\n 'Jan 64 - Jun 64',\n 'Jul 64 - Dec 64',\n 'Jan 65 - Jun 65',\n 'Jul 65 - Dec 65',\n ]);\n });\n\n it('correctly aligns bins to exact year boundaries when binSnapping=year', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"year\"\n minDate=\"2000\"\n maxDate=\"2019\"\n bins=\"[10,20,30,40,50,60,70,80,90,100]\"\n ></histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n '2000 - 2001',\n '2002 - 2003',\n '2004 - 2005',\n '2006 - 2007',\n '2008 - 2009',\n '2010 - 2011',\n '2012 - 2013',\n '2014 - 2015',\n '2016 - 2017',\n '2018 - 2019',\n ]);\n });\n\n it('correctly handles year snapping for years 0-99', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"year\"\n dateFormat=\"YYYY\"\n minDate=\"0020\"\n maxDate=\"0025\"\n bins=\"[1,2,3,4,5,6]\"\n ></histogram-date-range>\n `\n );\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql(['20', '21', '22', '23', '24', '25']);\n });\n\n it('does not duplicate start/end date in tooltips when representing a single year', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"year\"\n dateFormat=\"YYYY\"\n minDate=\"2001\"\n maxDate=\"2005\"\n bins=\"[10,20,30,40,50]\"\n ></histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql(['2001', '2002', '2003', '2004', '2005']);\n });\n\n it('falls back to default date format for tooltips if no tooltip date format provided', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"year\"\n minDate=\"2001\"\n maxDate=\"2005\"\n bins=\"[10,20,30,40,50]\"\n ></histogram-date-range>\n `\n );\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n let tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql(['2001', '2002', '2003', '2004', '2005']); // default YYYY date format\n\n el.dateFormat = 'YYYY/MM';\n el.minDate = '2001/01';\n el.maxDate = '2005/01';\n await el.updateComplete;\n\n // Should use dateFormat fallback for tooltips\n tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n '2001/01 - 2001/12',\n '2002/01 - 2002/12',\n '2003/01 - 2003/12',\n '2004/01 - 2004/12',\n '2005/01 - 2005/12',\n ]);\n\n el.dateFormat = 'YYYY';\n el.tooltipDateFormat = 'MMMM YYYY';\n el.minDate = '2001';\n el.maxDate = '2005';\n await el.updateComplete;\n\n // Should use defined tooltipDateFormat for tooltips\n tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n 'January 2001 - December 2001',\n 'January 2002 - December 2002',\n 'January 2003 - December 2003',\n 'January 2004 - December 2004',\n 'January 2005 - December 2005',\n ]);\n });\n\n it('has a disabled state', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n disabled\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n expect(\n el.shadowRoot\n ?.querySelector('.inner-container')\n ?.classList.contains('disabled')\n ).to.eq(true);\n\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(8); // initial state\n\n // attempt to slide to right\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n await el.updateComplete;\n\n // cursor is not draggable if disabled\n expect(minSlider.classList.contains('draggable')).to.be.false;\n\n // attempt to slide to right\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 70 }));\n await el.updateComplete;\n\n // slider does not moved if element disabled\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(8);\n });\n\n it('has a loading state with an activity indicator', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n loading\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n expect(\n el.shadowRoot\n ?.querySelector('ia-activity-indicator')\n ?.attributes?.getNamedItem('mode')?.value\n ).to.eq('processing');\n });\n\n it('can use LitElement bound properties', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n .minDate=${1900}\n .maxDate=${'Dec 4, 2020'}\n .minSelectedDate=${2012}\n .maxSelectedDate=${2019}\n .bins=${[33, 1, 100]}\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n expect(minDateInput.value).to.eq('2012');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n expect(maxDateInput.value).to.eq('2019');\n });\n});\n"]}
|
package/docs/demo/index.html
CHANGED
|
@@ -72,6 +72,26 @@
|
|
|
72
72
|
</histogram-date-range>
|
|
73
73
|
</div>
|
|
74
74
|
|
|
75
|
+
<div class="container">
|
|
76
|
+
<div class="description">
|
|
77
|
+
as above, but with linear scaled bars
|
|
78
|
+
</div>
|
|
79
|
+
<histogram-date-range
|
|
80
|
+
width="175"
|
|
81
|
+
tooltipwidth="120"
|
|
82
|
+
dateFormat="YYYY"
|
|
83
|
+
updateDelay="1000"
|
|
84
|
+
missingDataMessage="..."
|
|
85
|
+
barScaling="linear"
|
|
86
|
+
minSelectedDate="1987"
|
|
87
|
+
maxSelectedDate="2016"
|
|
88
|
+
minDate="1987"
|
|
89
|
+
maxDate="2016"
|
|
90
|
+
bins="[1519,1643,1880,2046,1973,2085,2148,2152,2349,2304,2314,2484,2590,2450,2495,2475,2392,2631,2504,2619,2519,2552,2462,2217,2171,2132,2127,2041,1638,1441]"
|
|
91
|
+
>
|
|
92
|
+
</histogram-date-range>
|
|
93
|
+
</div>
|
|
94
|
+
|
|
75
95
|
<div class="container">
|
|
76
96
|
<div class="description">small year range and few bins</div>
|
|
77
97
|
<histogram-date-range width="175" tooltipwidth="120"
|
|
@@ -34,7 +34,12 @@ const TOOLTIP_HEIGHT = 30;
|
|
|
34
34
|
const DATE_FORMAT = "YYYY";
|
|
35
35
|
const MISSING_DATA = "no data";
|
|
36
36
|
const UPDATE_DEBOUNCE_DELAY_MS = 0;
|
|
37
|
+
const TOOLTIP_LABEL = "item";
|
|
37
38
|
const SLIDER_CORNER_SIZE = 4;
|
|
39
|
+
const BAR_SCALING_PRESET_FNS = {
|
|
40
|
+
linear: (binValue) => binValue,
|
|
41
|
+
logarithmic: (binValue) => Math.log1p(binValue)
|
|
42
|
+
};
|
|
38
43
|
const sliderColor = css`var(--histogramDateRangeSliderColor, #4B65FE)`;
|
|
39
44
|
const selectedRangeColor = css`var(--histogramDateRangeSelectedRangeColor, #DBE0FF)`;
|
|
40
45
|
const barIncludedFill = css`var(--histogramDateRangeBarIncludedFill, #2C2C2C)`;
|
|
@@ -66,6 +71,8 @@ export let HistogramDateRange = class extends LitElement {
|
|
|
66
71
|
this.bins = [];
|
|
67
72
|
this.updateWhileFocused = false;
|
|
68
73
|
this.binSnapping = "none";
|
|
74
|
+
this.tooltipLabel = TOOLTIP_LABEL;
|
|
75
|
+
this.barScaling = "logarithmic";
|
|
69
76
|
this._tooltipOffsetX = 0;
|
|
70
77
|
this._tooltipOffsetY = 0;
|
|
71
78
|
this._isDragging = false;
|
|
@@ -115,7 +122,7 @@ export let HistogramDateRange = class extends LitElement {
|
|
|
115
122
|
super.disconnectedCallback();
|
|
116
123
|
}
|
|
117
124
|
willUpdate(changedProps) {
|
|
118
|
-
if (changedProps.has("bins") || changedProps.has("minDate") || changedProps.has("maxDate") || changedProps.has("minSelectedDate") || changedProps.has("maxSelectedDate") || changedProps.has("width") || changedProps.has("height") || changedProps.has("binSnapping")) {
|
|
125
|
+
if (changedProps.has("bins") || changedProps.has("minDate") || changedProps.has("maxDate") || changedProps.has("minSelectedDate") || changedProps.has("maxSelectedDate") || changedProps.has("width") || changedProps.has("height") || changedProps.has("binSnapping") || changedProps.has("barScaling")) {
|
|
119
126
|
this.handleDataUpdate();
|
|
120
127
|
}
|
|
121
128
|
}
|
|
@@ -158,11 +165,17 @@ export let HistogramDateRange = class extends LitElement {
|
|
|
158
165
|
return this.snapToNextSecond(timestamp);
|
|
159
166
|
}
|
|
160
167
|
}
|
|
168
|
+
get barScalingFunction() {
|
|
169
|
+
if (typeof this.barScaling === "string") {
|
|
170
|
+
return BAR_SCALING_PRESET_FNS[this.barScaling];
|
|
171
|
+
}
|
|
172
|
+
return this.barScaling;
|
|
173
|
+
}
|
|
161
174
|
calculateHistData() {
|
|
162
175
|
const {bins, height, dateRangeMS, _numBins, _minDateMS} = this;
|
|
163
176
|
const minValue = Math.min(...this.bins);
|
|
164
177
|
const maxValue = Math.max(...this.bins);
|
|
165
|
-
const valueRange = minValue === maxValue ? 1 :
|
|
178
|
+
const valueRange = minValue === maxValue ? 1 : this.barScalingFunction(maxValue);
|
|
166
179
|
const valueScale = height / valueRange;
|
|
167
180
|
const dateScale = dateRangeMS / _numBins;
|
|
168
181
|
return bins.map((v, i) => {
|
|
@@ -175,7 +188,7 @@ export let HistogramDateRange = class extends LitElement {
|
|
|
175
188
|
const tooltip = tooltipStart === tooltipEnd ? tooltipStart : `${tooltipStart} - ${tooltipEnd}`;
|
|
176
189
|
return {
|
|
177
190
|
value: v,
|
|
178
|
-
height: Math.floor(
|
|
191
|
+
height: Math.floor(this.barScalingFunction(v) * valueScale),
|
|
179
192
|
binStart,
|
|
180
193
|
binEnd,
|
|
181
194
|
tooltip
|
|
@@ -277,7 +290,7 @@ export let HistogramDateRange = class extends LitElement {
|
|
|
277
290
|
const target = e.currentTarget;
|
|
278
291
|
const x = target.x.baseVal.value + this.sliderWidth / 2;
|
|
279
292
|
const dataset = target.dataset;
|
|
280
|
-
const itemsText =
|
|
293
|
+
const itemsText = `${this.tooltipLabel}${dataset.numItems !== "1" ? "s" : ""}`;
|
|
281
294
|
const formattedNumItems = Number(dataset.numItems).toLocaleString();
|
|
282
295
|
const tooltipPadding = 2;
|
|
283
296
|
const bufferHeight = 9;
|
|
@@ -494,20 +507,28 @@ export let HistogramDateRange = class extends LitElement {
|
|
|
494
507
|
const barStyle = `stroke-dasharray: 0 ${barWidth} ${barHeight} ${barWidth} 0 ${barHeight}`;
|
|
495
508
|
const bar = svg`
|
|
496
509
|
<rect
|
|
497
|
-
class="bar"
|
|
498
|
-
style=${barStyle}
|
|
510
|
+
class="bar-pointer-target"
|
|
499
511
|
x=${x}
|
|
500
|
-
y
|
|
512
|
+
y="0"
|
|
501
513
|
width=${barWidth}
|
|
502
|
-
height=${
|
|
514
|
+
height=${this.height}
|
|
503
515
|
@pointerenter=${this.showTooltip}
|
|
504
516
|
@pointerleave=${this.hideTooltip}
|
|
505
517
|
@click=${this.handleBarClick}
|
|
506
|
-
fill
|
|
518
|
+
fill="transparent"
|
|
507
519
|
data-num-items=${data.value}
|
|
508
520
|
data-bin-start=${data.binStart}
|
|
509
521
|
data-bin-end=${data.binEnd}
|
|
510
522
|
data-tooltip=${data.tooltip}
|
|
523
|
+
/>
|
|
524
|
+
<rect
|
|
525
|
+
class="bar"
|
|
526
|
+
style=${barStyle}
|
|
527
|
+
x=${x}
|
|
528
|
+
y=${this.height - barHeight}
|
|
529
|
+
width=${barWidth}
|
|
530
|
+
height=${barHeight}
|
|
531
|
+
fill=${barFill}
|
|
511
532
|
/>`;
|
|
512
533
|
x += xScale;
|
|
513
534
|
return bar;
|
|
@@ -661,7 +682,8 @@ HistogramDateRange.styles = css`
|
|
|
661
682
|
-ms-user-select: none; /* Internet Explorer/Edge */
|
|
662
683
|
user-select: none; /* current Chrome, Edge, Opera and Firefox */
|
|
663
684
|
}
|
|
664
|
-
.bar
|
|
685
|
+
.bar,
|
|
686
|
+
.bar-pointer-target {
|
|
665
687
|
/* create a transparent border around the hist bars to prevent "gaps" and
|
|
666
688
|
flickering when moving around between bars. this also helps with handling
|
|
667
689
|
clicks on the bars, preventing users from being able to click in between
|
|
@@ -670,11 +692,15 @@ HistogramDateRange.styles = css`
|
|
|
670
692
|
/* ensure transparent stroke wide enough to cover gap between bars */
|
|
671
693
|
stroke-width: 2px;
|
|
672
694
|
}
|
|
673
|
-
.bar
|
|
695
|
+
.bar {
|
|
696
|
+
/* ensure the bar's pointer target receives events, not the bar itself */
|
|
697
|
+
pointer-events: none;
|
|
698
|
+
}
|
|
699
|
+
.bar-pointer-target:hover + .bar {
|
|
674
700
|
/* highlight currently hovered bar */
|
|
675
701
|
fill-opacity: 0.7;
|
|
676
702
|
}
|
|
677
|
-
.disabled .bar:hover {
|
|
703
|
+
.disabled .bar-pointer-target:hover + .bar {
|
|
678
704
|
/* ensure no visual hover interaction when disabled */
|
|
679
705
|
fill-opacity: 1;
|
|
680
706
|
}
|
|
@@ -791,6 +817,12 @@ __decorate([
|
|
|
791
817
|
__decorate([
|
|
792
818
|
property({type: String})
|
|
793
819
|
], HistogramDateRange.prototype, "binSnapping", 2);
|
|
820
|
+
__decorate([
|
|
821
|
+
property({type: String})
|
|
822
|
+
], HistogramDateRange.prototype, "tooltipLabel", 2);
|
|
823
|
+
__decorate([
|
|
824
|
+
property({type: String})
|
|
825
|
+
], HistogramDateRange.prototype, "barScaling", 2);
|
|
794
826
|
__decorate([
|
|
795
827
|
state()
|
|
796
828
|
], HistogramDateRange.prototype, "_tooltipOffsetX", 2);
|
package/index.ts
CHANGED