@redvars/peacock 3.3.3 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/IndividualComponent-DUINtMGK.js +67 -0
- package/dist/IndividualComponent-DUINtMGK.js.map +1 -0
- package/dist/assets/images/empty-state/no-document.svg +11 -12
- package/dist/assets/images/empty-state/page.svg +15 -9
- package/dist/assets/styles.css +1 -1
- package/dist/assets/styles.css.map +1 -1
- package/dist/banner.js +202 -0
- package/dist/banner.js.map +1 -0
- package/dist/bottom-sheet.js +238 -0
- package/dist/bottom-sheet.js.map +1 -0
- package/dist/{button-ClzS8JLq.js → button-DMN1dPAg.js} +358 -218
- package/dist/button-DMN1dPAg.js.map +1 -0
- package/dist/button-group-CX9CUUXk.js +435 -0
- package/dist/button-group-CX9CUUXk.js.map +1 -0
- package/dist/button-group.js +11 -6
- package/dist/button-group.js.map +1 -1
- package/dist/button.js +10 -5
- package/dist/button.js.map +1 -1
- package/dist/card-content.js +29 -0
- package/dist/card-content.js.map +1 -0
- package/dist/card.js +428 -44
- package/dist/card.js.map +1 -1
- package/dist/{chart-bar-DbnXQgvS.js → chart-bar-cn6rrna-.js} +2 -2
- package/dist/{chart-bar-DbnXQgvS.js.map → chart-bar-cn6rrna-.js.map} +1 -1
- package/dist/chart-bar.js +5 -4
- package/dist/chart-bar.js.map +1 -1
- package/dist/chart-doughnut.js +2 -1
- package/dist/chart-doughnut.js.map +1 -1
- package/dist/chart-pie.js +2 -1
- package/dist/chart-pie.js.map +1 -1
- package/dist/chart-stacked-bar.js +5 -4
- package/dist/chart-stacked-bar.js.map +1 -1
- package/dist/{class-map-59YGWLnx.js → class-map-YU7g0o3B.js} +4 -10
- package/dist/class-map-YU7g0o3B.js.map +1 -0
- package/dist/clock.js +2 -1
- package/dist/clock.js.map +1 -1
- package/dist/code-editor.js +8 -6
- package/dist/code-editor.js.map +1 -1
- package/dist/code-highlighter.js +6 -4
- package/dist/code-highlighter.js.map +1 -1
- package/dist/custom-elements-jsdocs.json +6270 -5026
- package/dist/custom-elements.json +5763 -2049
- package/dist/directive-ZPhl09Yt.js +9 -0
- package/dist/directive-ZPhl09Yt.js.map +1 -0
- package/dist/dispatch-event-utils-CuEqjlPT.js +127 -0
- package/dist/dispatch-event-utils-CuEqjlPT.js.map +1 -0
- package/dist/fab-C5Nzxk0E.js +497 -0
- package/dist/fab-C5Nzxk0E.js.map +1 -0
- package/dist/fab.js +11 -0
- package/dist/fab.js.map +1 -0
- package/dist/index.js +24 -12
- package/dist/index.js.map +1 -1
- package/dist/{observe-theme-change-pALI5fmV.js → is-dark-mode-DicqGkCJ.js} +8 -3
- package/dist/is-dark-mode-DicqGkCJ.js.map +1 -0
- package/dist/notification.js +417 -0
- package/dist/notification.js.map +1 -0
- package/dist/number-counter.js +4 -3
- package/dist/number-counter.js.map +1 -1
- package/dist/observe-slot-change-BGJfgg2E.js +31 -0
- package/dist/observe-slot-change-BGJfgg2E.js.map +1 -0
- package/dist/peacock-loader.js +59 -10
- package/dist/peacock-loader.js.map +1 -1
- package/dist/property-1psGvXOq.js +10 -0
- package/dist/property-1psGvXOq.js.map +1 -0
- package/dist/search.js +452 -0
- package/dist/search.js.map +1 -0
- package/dist/{radio-b70_Ie9n.js → select-4pl4XBj7.js} +2439 -521
- package/dist/select-4pl4XBj7.js.map +1 -0
- package/dist/side-sheet.js +186 -0
- package/dist/side-sheet.js.map +1 -0
- package/dist/spread-B5cgadZl.js +32 -0
- package/dist/spread-B5cgadZl.js.map +1 -0
- package/dist/src/__base_element/BaseHyperlink.d.ts +20 -0
- package/dist/src/__utils/cache-fetch.d.ts +1 -0
- package/dist/src/__utils/is-dark-mode.d.ts +1 -0
- package/dist/src/__utils/is-in-viewport.d.ts +1 -0
- package/dist/src/__utils/observe-slot-change.d.ts +1 -0
- package/dist/src/__utils/sanitize-svg.d.ts +1 -0
- package/dist/src/__utils/throttle.d.ts +4 -0
- package/dist/src/accordion/accordion-item.d.ts +33 -9
- package/dist/src/accordion/accordion.d.ts +21 -5
- package/dist/src/banner/banner.d.ts +47 -0
- package/dist/src/banner/index.d.ts +1 -0
- package/dist/src/bottom-sheet/bottom-sheet.d.ts +42 -0
- package/dist/src/bottom-sheet/index.d.ts +1 -0
- package/dist/src/button/BaseButton.d.ts +7 -13
- package/dist/src/button/button/button.d.ts +4 -0
- package/dist/src/button/button-group/button-group.d.ts +32 -3
- package/dist/src/button/icon-button/icon-button.d.ts +4 -0
- package/dist/src/card/card-content.d.ts +15 -0
- package/dist/src/card/card.d.ts +37 -3
- package/dist/src/card/index.d.ts +1 -0
- package/dist/src/container/container.d.ts +1 -1
- package/dist/src/empty-state/empty-state.d.ts +1 -1
- package/dist/src/fab/fab.d.ts +111 -0
- package/dist/src/fab/index.d.ts +1 -0
- package/dist/src/focus-ring/focus-ring.d.ts +4 -1
- package/dist/src/index.d.ts +11 -1
- package/dist/src/link/link.d.ts +3 -10
- package/dist/src/menu/menu/menu.d.ts +4 -2
- package/dist/src/menu/menu-item/menu-item.d.ts +0 -1
- package/dist/src/menu/sub-menu/sub-menu.d.ts +1 -0
- package/dist/src/notification/index.d.ts +1 -0
- package/dist/src/notification/notification.d.ts +69 -0
- package/dist/src/pagination/pagination.d.ts +8 -1
- package/dist/src/ripple/ripple.d.ts +19 -3
- package/dist/src/search/index.d.ts +1 -0
- package/dist/src/search/search.d.ts +76 -0
- package/dist/src/segmented-button/index.d.ts +2 -0
- package/dist/src/segmented-button/segmented-button-group.d.ts +46 -0
- package/dist/src/segmented-button/segmented-button.d.ts +65 -0
- package/dist/src/select/index.d.ts +3 -0
- package/dist/src/select/option.d.ts +55 -0
- package/dist/src/select/select.d.ts +114 -0
- package/dist/src/side-sheet/index.d.ts +1 -0
- package/dist/src/side-sheet/side-sheet.d.ts +41 -0
- package/dist/src/slider/slider.d.ts +4 -0
- package/dist/src/snackbar/snackbar.d.ts +14 -1
- package/dist/src/tabs/tab-group.d.ts +0 -1
- package/dist/src/tabs/tab.d.ts +8 -2
- package/dist/src/tabs/tabs.d.ts +13 -1
- package/dist/src/toolbar/index.d.ts +1 -0
- package/dist/src/toolbar/toolbar.d.ts +86 -0
- package/dist/state-DwbEjqVk.js +10 -0
- package/dist/state-DwbEjqVk.js.map +1 -0
- package/dist/{style-map-DcB52w-l.js → style-map-DVmWOuYy.js} +3 -3
- package/dist/{style-map-DcB52w-l.js.map → style-map-DVmWOuYy.js.map} +1 -1
- package/dist/test/search.test.d.ts +1 -0
- package/dist/test/toolbar.test.d.ts +1 -0
- package/dist/throttle-C7ZAPqtu.js +24 -0
- package/dist/throttle-C7ZAPqtu.js.map +1 -0
- package/dist/toolbar.js +306 -0
- package/dist/toolbar.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/{unsafe-html-C2r3PyzF.js → unsafe-html-BsGUjx94.js} +3 -3
- package/dist/{unsafe-html-C2r3PyzF.js.map → unsafe-html-BsGUjx94.js.map} +1 -1
- package/package.json +1 -1
- package/readme.md +2 -2
- package/scss/styles.scss +4 -0
- package/src/__base_element/BaseHyperlink.ts +42 -0
- package/src/__base_element/README.md +19 -0
- package/src/__utils/cache-fetch.ts +65 -0
- package/src/{utils → __utils}/dispatch-event-utils.ts +1 -0
- package/src/__utils/is-dark-mode.ts +3 -0
- package/src/__utils/is-in-viewport.ts +6 -0
- package/src/__utils/observe-slot-change.ts +38 -0
- package/src/__utils/sanitize-svg.ts +27 -0
- package/src/__utils/throttle.ts +27 -0
- package/src/accordion/accordion-item.scss +136 -65
- package/src/accordion/accordion-item.ts +117 -44
- package/src/accordion/accordion.scss +24 -5
- package/src/accordion/accordion.ts +29 -23
- package/src/accordion/demo/index.html +74 -35
- package/src/banner/banner.scss +87 -0
- package/src/banner/banner.ts +107 -0
- package/src/banner/index.ts +1 -0
- package/src/bottom-sheet/bottom-sheet.scss +88 -0
- package/src/bottom-sheet/bottom-sheet.ts +135 -0
- package/src/bottom-sheet/index.ts +1 -0
- package/src/button/BaseButton.ts +26 -30
- package/src/button/button/button-colors.scss +90 -19
- package/src/button/button/button-sizes.scss +39 -19
- package/src/button/button/button.scss +117 -116
- package/src/button/button/button.ts +29 -6
- package/src/button/button-group/button-group.scss +25 -22
- package/src/button/button-group/button-group.ts +122 -5
- package/src/button/icon-button/icon-button-sizes.scss +35 -15
- package/src/button/icon-button/icon-button.ts +25 -12
- package/src/card/card-colors.scss +10 -0
- package/src/card/card-content.ts +26 -0
- package/src/card/card.scss +221 -41
- package/src/card/card.ts +251 -8
- package/src/card/index.ts +1 -0
- package/src/chart-bar/chart-bar.ts +1 -1
- package/src/chart-bar/chart-stacked-bar.ts +3 -1
- package/src/chart-doughnut/chart-doughnut.ts +1 -1
- package/src/chart-pie/chart-pie.ts +1 -1
- package/src/checkbox/checkbox.ts +1 -1
- package/src/clock/clock.ts +1 -1
- package/src/code-editor/code-editor.ts +5 -5
- package/src/code-highlighter/code-highlighter.ts +2 -2
- package/src/container/container.ts +1 -1
- package/src/date-picker/date-picker.ts +5 -2
- package/src/divider/divider.ts +3 -1
- package/src/empty-state/empty-state.scss +9 -3
- package/src/empty-state/empty-state.ts +2 -2
- package/src/fab/fab-colors.scss +49 -0
- package/src/fab/fab-sizes.scss +47 -0
- package/src/fab/fab.scss +137 -0
- package/src/fab/fab.ts +285 -0
- package/src/fab/index.ts +1 -0
- package/src/field/field.ts +3 -1
- package/src/focus-ring/focus-ring.ts +37 -19
- package/src/icon/datasource.ts +1 -1
- package/src/icon/icon.ts +3 -1
- package/src/image/image.ts +3 -2
- package/src/index.ts +12 -1
- package/src/input/input.ts +5 -2
- package/src/link/link.ts +2 -15
- package/src/menu/menu/menu.scss +31 -3
- package/src/menu/menu/menu.ts +30 -6
- package/src/menu/menu-item/menu-item.scss +1 -0
- package/src/menu/menu-item/menu-item.ts +1 -9
- package/src/menu/sub-menu/sub-menu.ts +1 -0
- package/src/notification/index.ts +1 -0
- package/src/notification/notification.scss +201 -0
- package/src/notification/notification.ts +206 -0
- package/src/number-counter/number-counter.ts +3 -1
- package/src/number-field/number-field.ts +4 -2
- package/src/pagination/pagination.scss +33 -24
- package/src/pagination/pagination.ts +113 -60
- package/src/peacock-loader.ts +48 -0
- package/src/radio/radio.ts +3 -1
- package/src/ripple/ripple.ts +19 -3
- package/src/search/index.ts +1 -0
- package/src/search/search-colors.scss +14 -0
- package/src/search/search.scss +204 -0
- package/src/search/search.ts +240 -0
- package/src/segmented-button/index.ts +2 -0
- package/src/segmented-button/segmented-button-group.scss +21 -0
- package/src/segmented-button/segmented-button-group.ts +110 -0
- package/src/segmented-button/segmented-button.scss +115 -0
- package/src/segmented-button/segmented-button.ts +175 -0
- package/src/select/index.ts +3 -0
- package/src/select/option.ts +109 -0
- package/src/select/select.scss +125 -0
- package/src/select/select.ts +520 -0
- package/src/side-sheet/index.ts +1 -0
- package/src/side-sheet/side-sheet.scss +79 -0
- package/src/side-sheet/side-sheet.ts +100 -0
- package/src/slider/slider.scss +19 -1
- package/src/slider/slider.ts +30 -19
- package/src/snackbar/snackbar.scss +62 -31
- package/src/snackbar/snackbar.ts +92 -12
- package/src/switch/switch.ts +3 -1
- package/src/table/table.ts +3 -1
- package/src/tabs/demo/index.html +90 -0
- package/src/tabs/tab-group.ts +0 -3
- package/src/tabs/tab.scss +237 -25
- package/src/tabs/tab.ts +91 -14
- package/src/tabs/tabs.scss +37 -3
- package/src/tabs/tabs.ts +118 -2
- package/src/textarea/textarea.ts +4 -2
- package/src/time-picker/time-picker.ts +4 -2
- package/src/toolbar/index.ts +1 -0
- package/src/toolbar/toolbar-colors.scss +16 -0
- package/src/toolbar/toolbar.scss +165 -0
- package/src/toolbar/toolbar.ts +137 -0
- package/dist/IndividualComponent-Dt5xirYG.js +0 -73
- package/dist/IndividualComponent-Dt5xirYG.js.map +0 -1
- package/dist/button-ClzS8JLq.js.map +0 -1
- package/dist/button-group-BMS5WvaF.js +0 -292
- package/dist/button-group-BMS5WvaF.js.map +0 -1
- package/dist/chart-donut.js +0 -309
- package/dist/chart-donut.js.map +0 -1
- package/dist/class-map-59YGWLnx.js.map +0 -1
- package/dist/directive-Cuw6h7YA.js +0 -9
- package/dist/directive-Cuw6h7YA.js.map +0 -1
- package/dist/dispatch-event-utils-B4odODQf.js +0 -277
- package/dist/dispatch-event-utils-B4odODQf.js.map +0 -1
- package/dist/observe-theme-change-pALI5fmV.js.map +0 -1
- package/dist/radio-b70_Ie9n.js.map +0 -1
- package/dist/src/chart-donut/chart-donut.d.ts +0 -53
- package/dist/src/chart-donut/index.d.ts +0 -1
- package/dist/src/styleMixins.css.d.ts +0 -9
- package/dist/src/utils.d.ts +0 -9
- package/src/chart-donut/chart-donut.scss +0 -37
- package/src/chart-donut/chart-donut.ts +0 -287
- package/src/chart-donut/demo/index.html +0 -51
- package/src/chart-donut/index.ts +0 -1
- package/src/styleMixins.css.ts +0 -55
- package/src/utils.ts +0 -193
- /package/dist/src/{spread.d.ts → __directive/spread.d.ts} +0 -0
- /package/dist/src/{utils → __utils}/copy-to-clipboard.d.ts +0 -0
- /package/dist/src/{utils → __utils}/dispatch-event-utils.d.ts +0 -0
- /package/dist/src/{utils → __utils}/observe-theme-change.d.ts +0 -0
- /package/dist/test/{card.test.d.ts → banner.test.d.ts} +0 -0
- /package/src/{spread.ts → __directive/spread.ts} +0 -0
- /package/src/{utils → __utils}/copy-to-clipboard.ts +0 -0
- /package/src/{utils → __utils}/observe-theme-change.ts +0 -0
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { LitElement, PropertyValues } from 'lit';
|
|
2
|
-
export type ChartDonutColor = {
|
|
3
|
-
color: string;
|
|
4
|
-
};
|
|
5
|
-
export type ChartDonutItem = {
|
|
6
|
-
name: string;
|
|
7
|
-
value: number;
|
|
8
|
-
label?: string;
|
|
9
|
-
color?: string;
|
|
10
|
-
};
|
|
11
|
-
/**
|
|
12
|
-
* @label Chart Donut
|
|
13
|
-
* @tag wc-chart-donut
|
|
14
|
-
* @rawTag chart-donut
|
|
15
|
-
* @summary A donut chart is a circular chart with a blank center. The area in the center can be used to display information.
|
|
16
|
-
* @tags charts
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```html
|
|
20
|
-
* <wc-chart-donut width="400" label="Total"></wc-chart-donut>
|
|
21
|
-
* <script>
|
|
22
|
-
* document.querySelector('wc-chart-donut').data = [
|
|
23
|
-
* { name: 'A', value: 30, label: 'Category A' },
|
|
24
|
-
* { name: 'B', value: 50, label: 'Category B' },
|
|
25
|
-
* { name: 'C', value: 20, label: 'Category C' },
|
|
26
|
-
* ];
|
|
27
|
-
* </script>
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export declare class ChartDonut extends LitElement {
|
|
31
|
-
static styles: import("lit").CSSResultGroup[];
|
|
32
|
-
private svgElement?;
|
|
33
|
-
/** Width (and height) of the chart in pixels. */
|
|
34
|
-
width: number;
|
|
35
|
-
/** Margin around the chart. */
|
|
36
|
-
margin: number;
|
|
37
|
-
/** Whether to show labels outside the chart. */
|
|
38
|
-
showLabels: boolean;
|
|
39
|
-
/** Chart data array. Each item should have name, value, and optional label and color. */
|
|
40
|
-
data: ChartDonutItem[];
|
|
41
|
-
/** Label displayed in the center of the donut. */
|
|
42
|
-
label?: string;
|
|
43
|
-
private _initialized;
|
|
44
|
-
private _debouncedRenderChart;
|
|
45
|
-
firstUpdated(): void;
|
|
46
|
-
updated(changedProperties: PropertyValues): void;
|
|
47
|
-
private _getRadius;
|
|
48
|
-
private _getTotal;
|
|
49
|
-
private _getPieData;
|
|
50
|
-
private _getColorScale;
|
|
51
|
-
private _renderChart;
|
|
52
|
-
render(): import("lit-html").TemplateResult<1>;
|
|
53
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { ChartDonut } from './chart-donut.js';
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { CSSResult } from 'lit';
|
|
2
|
-
export declare const focusRing: (color?: string) => CSSResult;
|
|
3
|
-
export declare const getTypography: (name: string) => CSSResult;
|
|
4
|
-
export declare const getTypographyNotImportant: (name: string) => CSSResult;
|
|
5
|
-
export declare const forPhoneOnly: (content: CSSResult) => CSSResult;
|
|
6
|
-
export declare const forTabletPortraitUp: (content: CSSResult) => CSSResult;
|
|
7
|
-
export declare const forTabletLandscapeUp: (content: CSSResult) => CSSResult;
|
|
8
|
-
export declare const forDesktopUp: (content: CSSResult) => CSSResult;
|
|
9
|
-
export declare const forBigDesktopUp: (content: CSSResult) => CSSResult;
|
package/dist/src/utils.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export declare function createCacheFetch(name: string): Promise<(url: string) => Promise<string>>;
|
|
2
|
-
export declare function sanitizeSvg(rawSvg: string): string;
|
|
3
|
-
export declare function observerSlotChangesWithCallback(slot: HTMLSlotElement | null, callback: (hasContent: boolean) => void): void;
|
|
4
|
-
export declare function throttle(func: Function, delay: number, options?: {
|
|
5
|
-
leading: boolean;
|
|
6
|
-
trailing: boolean;
|
|
7
|
-
}): (...args: any[]) => void;
|
|
8
|
-
export declare function isInViewport(element: HTMLElement): boolean;
|
|
9
|
-
export declare function isDarkMode(): boolean;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
@use '../../scss/mixin';
|
|
2
|
-
|
|
3
|
-
@include mixin.base-styles;
|
|
4
|
-
|
|
5
|
-
:host {
|
|
6
|
-
display: inline-block;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
.title {
|
|
10
|
-
@include mixin.get-typography('title-large-emphasized');
|
|
11
|
-
fill: var(--color-on-surface);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
.label {
|
|
15
|
-
@include mixin.get-typography('title-medium');
|
|
16
|
-
fill: var(--color-on-surface);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
.arc {
|
|
20
|
-
cursor: pointer;
|
|
21
|
-
transition: filter 150ms ease;
|
|
22
|
-
|
|
23
|
-
&:hover {
|
|
24
|
-
filter: brightness(1.2);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
.item-polyline {
|
|
29
|
-
fill: none;
|
|
30
|
-
stroke-width: 1;
|
|
31
|
-
stroke: var(--color-on-surface);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
.item-label {
|
|
35
|
-
fill: var(--color-on-surface);
|
|
36
|
-
@include mixin.get-typography('label-medium');
|
|
37
|
-
}
|
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
import { html, LitElement, PropertyValues } from 'lit';
|
|
2
|
-
import { property, query } from 'lit/decorators.js';
|
|
3
|
-
import IndividualComponent from 'src/IndividualComponent.js';
|
|
4
|
-
import * as d3 from 'd3';
|
|
5
|
-
import styles from './chart-donut.scss';
|
|
6
|
-
|
|
7
|
-
export type ChartDonutColor = {
|
|
8
|
-
color: string;
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export type ChartDonutItem = {
|
|
12
|
-
name: string;
|
|
13
|
-
value: number;
|
|
14
|
-
label?: string;
|
|
15
|
-
color?: string;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
const chartColors: ChartDonutColor[] = [];
|
|
19
|
-
['purple', 'blue', 'red', 'green', 'yellow', 'orange'].forEach(colorName => {
|
|
20
|
-
chartColors.push({
|
|
21
|
-
color: `var(--color-${colorName})`,
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
/** SVGPathElement augmented with the last rendered arc datum for smooth tween interpolation. */
|
|
26
|
-
interface ArcPathElement extends SVGPathElement {
|
|
27
|
-
_prevDatum?: d3.PieArcDatum<ChartDonutItem>;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function debounce<T extends (...args: any[]) => void>(fn: T, wait: number): T {
|
|
31
|
-
let timer: ReturnType<typeof setTimeout>;
|
|
32
|
-
return ((...args: any[]) => {
|
|
33
|
-
clearTimeout(timer);
|
|
34
|
-
timer = setTimeout(() => fn(...args), wait);
|
|
35
|
-
}) as T;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* @label Chart Donut
|
|
40
|
-
* @tag wc-chart-donut
|
|
41
|
-
* @rawTag chart-donut
|
|
42
|
-
* @summary A donut chart is a circular chart with a blank center. The area in the center can be used to display information.
|
|
43
|
-
* @tags charts
|
|
44
|
-
*
|
|
45
|
-
* @example
|
|
46
|
-
* ```html
|
|
47
|
-
* <wc-chart-donut width="400" label="Total"></wc-chart-donut>
|
|
48
|
-
* <script>
|
|
49
|
-
* document.querySelector('wc-chart-donut').data = [
|
|
50
|
-
* { name: 'A', value: 30, label: 'Category A' },
|
|
51
|
-
* { name: 'B', value: 50, label: 'Category B' },
|
|
52
|
-
* { name: 'C', value: 20, label: 'Category C' },
|
|
53
|
-
* ];
|
|
54
|
-
* </script>
|
|
55
|
-
* ```
|
|
56
|
-
*/
|
|
57
|
-
@IndividualComponent
|
|
58
|
-
export class ChartDonut extends LitElement {
|
|
59
|
-
static styles = [styles];
|
|
60
|
-
|
|
61
|
-
@query('svg')
|
|
62
|
-
private svgElement?: SVGElement;
|
|
63
|
-
|
|
64
|
-
/** Width (and height) of the chart in pixels. */
|
|
65
|
-
@property({ type: Number, reflect: true }) width: number = 0;
|
|
66
|
-
|
|
67
|
-
/** Margin around the chart. */
|
|
68
|
-
@property({ type: Number, reflect: true }) margin: number = 10;
|
|
69
|
-
|
|
70
|
-
/** Whether to show labels outside the chart. */
|
|
71
|
-
@property({ type: Boolean, reflect: true, attribute: 'show-labels' })
|
|
72
|
-
showLabels: boolean = true;
|
|
73
|
-
|
|
74
|
-
/** Chart data array. Each item should have name, value, and optional label and color. */
|
|
75
|
-
@property({ type: Array }) data: ChartDonutItem[] = [];
|
|
76
|
-
|
|
77
|
-
/** Label displayed in the center of the donut. */
|
|
78
|
-
@property({ type: String }) label?: string;
|
|
79
|
-
|
|
80
|
-
private _initialized = false;
|
|
81
|
-
|
|
82
|
-
private _debouncedRenderChart = debounce(() => {
|
|
83
|
-
this._renderChart(true);
|
|
84
|
-
}, 300);
|
|
85
|
-
|
|
86
|
-
firstUpdated() {
|
|
87
|
-
this._renderChart(false);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
updated(changedProperties: PropertyValues) {
|
|
91
|
-
if (!this._initialized) {
|
|
92
|
-
this._initialized = true;
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
const watchedProps = ['width', 'margin', 'showLabels', 'data'];
|
|
96
|
-
const hasChanged = watchedProps.some(prop => changedProperties.has(prop));
|
|
97
|
-
if (hasChanged) {
|
|
98
|
-
this._debouncedRenderChart();
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
private _getRadius(): number {
|
|
103
|
-
return this.width / 2 - this.margin - 100;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
private _getTotal(): number {
|
|
107
|
-
return this.data.reduce((total, d) => total + d.value, 0);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
private _getPieData() {
|
|
111
|
-
const pie = d3
|
|
112
|
-
.pie<ChartDonutItem>()
|
|
113
|
-
.sort(null)
|
|
114
|
-
.value(d => d.value);
|
|
115
|
-
return pie(this.data);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
private _getColorScale() {
|
|
119
|
-
return d3
|
|
120
|
-
.scaleOrdinal<string, ChartDonutColor>()
|
|
121
|
-
.domain(this.data.map(d => d.name))
|
|
122
|
-
.range(chartColors);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
private _renderChart(animate: boolean) {
|
|
126
|
-
if (!this.svgElement) return;
|
|
127
|
-
|
|
128
|
-
const DURATION = 500;
|
|
129
|
-
const radius = this._getRadius();
|
|
130
|
-
const pieData = this._getPieData();
|
|
131
|
-
const colorScale = this._getColorScale();
|
|
132
|
-
const total = this._getTotal();
|
|
133
|
-
|
|
134
|
-
const svg = d3.select(this.svgElement);
|
|
135
|
-
|
|
136
|
-
const doughnutArc = d3
|
|
137
|
-
.arc<d3.PieArcDatum<ChartDonutItem>>()
|
|
138
|
-
.innerRadius(radius * 0.72)
|
|
139
|
-
.outerRadius(radius);
|
|
140
|
-
|
|
141
|
-
const labelsArc = d3
|
|
142
|
-
.arc<d3.PieArcDatum<ChartDonutItem>>()
|
|
143
|
-
.innerRadius(radius + 10)
|
|
144
|
-
.outerRadius(radius + 10);
|
|
145
|
-
|
|
146
|
-
// Update SVG dimensions and center transform
|
|
147
|
-
svg.attr('width', this.width).attr('height', this.width);
|
|
148
|
-
svg
|
|
149
|
-
.select('.chart-container')
|
|
150
|
-
.attr('transform', `translate(${this.width / 2},${this.width / 2})`);
|
|
151
|
-
|
|
152
|
-
// Arc paths — keyed by name so D3 matches elements across updates
|
|
153
|
-
const $paths = svg
|
|
154
|
-
.select('.arc-container')
|
|
155
|
-
.selectAll<SVGPathElement, d3.PieArcDatum<ChartDonutItem>>('.arc')
|
|
156
|
-
.data(pieData, d => d.data.name)
|
|
157
|
-
.join('path')
|
|
158
|
-
.attr('class', 'arc')
|
|
159
|
-
.style('fill', d => d.data.color || colorScale(d.data.name).color);
|
|
160
|
-
|
|
161
|
-
if (animate) {
|
|
162
|
-
$paths
|
|
163
|
-
.transition()
|
|
164
|
-
.duration(DURATION)
|
|
165
|
-
.ease(d3.easeCubicInOut)
|
|
166
|
-
.attrTween('d', function (this: SVGPathElement, d) {
|
|
167
|
-
const self = this as ArcPathElement;
|
|
168
|
-
// Interpolate from the last rendered angles to the new ones.
|
|
169
|
-
// New (entering) arcs start collapsed at their startAngle.
|
|
170
|
-
const prev: { startAngle: number; endAngle: number } =
|
|
171
|
-
self._prevDatum ?? {
|
|
172
|
-
startAngle: d.startAngle,
|
|
173
|
-
endAngle: d.startAngle,
|
|
174
|
-
};
|
|
175
|
-
self._prevDatum = d;
|
|
176
|
-
const iStart = d3.interpolateNumber(prev.startAngle, d.startAngle);
|
|
177
|
-
const iEnd = d3.interpolateNumber(prev.endAngle, d.endAngle);
|
|
178
|
-
return (t: number) =>
|
|
179
|
-
doughnutArc({ ...d, startAngle: iStart(t), endAngle: iEnd(t) }) ??
|
|
180
|
-
'';
|
|
181
|
-
});
|
|
182
|
-
} else {
|
|
183
|
-
// Initial render: draw immediately and seed previous-datum for later tweens
|
|
184
|
-
$paths
|
|
185
|
-
.each(function (this: SVGPathElement, d) {
|
|
186
|
-
(this as ArcPathElement)._prevDatum = d;
|
|
187
|
-
})
|
|
188
|
-
.attr('d', d => doughnutArc(d) ?? '');
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// Animate the central total counter
|
|
192
|
-
const $title = svg.select('.title');
|
|
193
|
-
if (animate) {
|
|
194
|
-
$title
|
|
195
|
-
.transition()
|
|
196
|
-
.duration(DURATION)
|
|
197
|
-
.ease(d3.easeCubicInOut)
|
|
198
|
-
.tween('text', function (this: d3.BaseType) {
|
|
199
|
-
const sel = d3.select(this as SVGTextElement);
|
|
200
|
-
const start = parseFloat(sel.text()) || 0;
|
|
201
|
-
const interp = d3.interpolateNumber(start, total);
|
|
202
|
-
return function (t: number) {
|
|
203
|
-
sel.text(Math.round(interp(t)));
|
|
204
|
-
};
|
|
205
|
-
});
|
|
206
|
-
} else {
|
|
207
|
-
$title.text(total);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// Label polylines and text
|
|
211
|
-
const $chartContainer = svg.select('.chart-container');
|
|
212
|
-
|
|
213
|
-
if (this.showLabels) {
|
|
214
|
-
const pointsFn = (d: d3.PieArcDatum<ChartDonutItem>) => {
|
|
215
|
-
const posA = doughnutArc.centroid(d);
|
|
216
|
-
const posB = labelsArc.centroid(d);
|
|
217
|
-
const posC = posB.slice() as [number, number];
|
|
218
|
-
const midAngle = d.startAngle + (d.endAngle - d.startAngle) / 2;
|
|
219
|
-
posC[0] = radius * (midAngle < Math.PI ? 1 : -1);
|
|
220
|
-
return [posA, posB, posC].map(p => p.join(',')).join(' ');
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
const transformFn = (d: d3.PieArcDatum<ChartDonutItem>) => {
|
|
224
|
-
const pos = labelsArc.centroid(d);
|
|
225
|
-
const midAngle = d.startAngle + (d.endAngle - d.startAngle) / 2;
|
|
226
|
-
pos[0] = radius * (midAngle < Math.PI ? 1 : -1);
|
|
227
|
-
return `translate(${pos})`;
|
|
228
|
-
};
|
|
229
|
-
|
|
230
|
-
const anchorFn = (d: d3.PieArcDatum<ChartDonutItem>) => {
|
|
231
|
-
const midAngle = d.startAngle + (d.endAngle - d.startAngle) / 2;
|
|
232
|
-
return midAngle < Math.PI ? 'start' : 'end';
|
|
233
|
-
};
|
|
234
|
-
|
|
235
|
-
const $polylines = $chartContainer
|
|
236
|
-
.selectAll<SVGPolylineElement, d3.PieArcDatum<ChartDonutItem>>(
|
|
237
|
-
'.item-polyline',
|
|
238
|
-
)
|
|
239
|
-
.data(pieData, d => d.data.name)
|
|
240
|
-
.join('polyline')
|
|
241
|
-
.attr('class', 'item-polyline');
|
|
242
|
-
|
|
243
|
-
const $labels = $chartContainer
|
|
244
|
-
.selectAll<SVGTextElement, d3.PieArcDatum<ChartDonutItem>>('.item-label')
|
|
245
|
-
.data(pieData, d => d.data.name)
|
|
246
|
-
.join('text')
|
|
247
|
-
.attr('class', 'item-label')
|
|
248
|
-
.text(d => d.data.label ?? '');
|
|
249
|
-
|
|
250
|
-
if (animate) {
|
|
251
|
-
$polylines
|
|
252
|
-
.transition()
|
|
253
|
-
.duration(DURATION)
|
|
254
|
-
.ease(d3.easeCubicInOut)
|
|
255
|
-
.attr('points', pointsFn);
|
|
256
|
-
$labels
|
|
257
|
-
.transition()
|
|
258
|
-
.duration(DURATION)
|
|
259
|
-
.ease(d3.easeCubicInOut)
|
|
260
|
-
.attr('transform', transformFn)
|
|
261
|
-
.style('text-anchor', anchorFn);
|
|
262
|
-
} else {
|
|
263
|
-
$polylines.attr('points', pointsFn);
|
|
264
|
-
$labels.attr('transform', transformFn).style('text-anchor', anchorFn);
|
|
265
|
-
}
|
|
266
|
-
} else {
|
|
267
|
-
$chartContainer.selectAll('.item-polyline').remove();
|
|
268
|
-
$chartContainer.selectAll('.item-label').remove();
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
render() {
|
|
273
|
-
return html`
|
|
274
|
-
<div class="chart">
|
|
275
|
-
<svg>
|
|
276
|
-
<g class="chart-container">
|
|
277
|
-
<g class="arc-container"></g>
|
|
278
|
-
<text class="title" text-anchor="middle"></text>
|
|
279
|
-
<text class="label" text-anchor="middle" y="16">
|
|
280
|
-
${this.label}
|
|
281
|
-
</text>
|
|
282
|
-
</g>
|
|
283
|
-
</svg>
|
|
284
|
-
</div>
|
|
285
|
-
`;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang='en-GB'>
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset='utf-8'>
|
|
5
|
-
<meta name='viewport' content='width=device-width, initial-scale=1.0, viewport-fit=cover' />
|
|
6
|
-
<link rel='stylesheet' href='/dist/assets/styles.css' />
|
|
7
|
-
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Mono:wght@100..900&family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
|
|
8
|
-
|
|
9
|
-
<style>
|
|
10
|
-
body {
|
|
11
|
-
background: #fafafa;
|
|
12
|
-
}
|
|
13
|
-
</style>
|
|
14
|
-
</head>
|
|
15
|
-
<body>
|
|
16
|
-
|
|
17
|
-
<wc-button id="randomize">Randomize</wc-button>
|
|
18
|
-
<br />
|
|
19
|
-
|
|
20
|
-
<wc-chart-doughnut width="400" margin="20"></wc-chart-doughnut>
|
|
21
|
-
|
|
22
|
-
<script>
|
|
23
|
-
const chart = document.querySelector('wc-chart-doughnut');
|
|
24
|
-
chart.label = "Browsers";
|
|
25
|
-
chart.data = [
|
|
26
|
-
{ label: 'Firefox', value: 10, color: '--color-red', hoverColor: '--color-red-40' },
|
|
27
|
-
{ label: 'Chrome', value: 20, color: '--color-green', hoverColor: '--color-green-50' },
|
|
28
|
-
{ label: 'Microsoft Edge', value: 30 },
|
|
29
|
-
{ label: 'Internet Explorer', value: 40 },
|
|
30
|
-
{ label: 'MC Browser', value: 50 },
|
|
31
|
-
];
|
|
32
|
-
|
|
33
|
-
function randomNumber(min, max) {
|
|
34
|
-
return parseInt(Math.random() * (max - min) + min);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
let count = 1;
|
|
38
|
-
document.querySelector('#randomize').addEventListener('click', () => {
|
|
39
|
-
chart.data = chart.data.map(d => ({ ...d, value: parseInt(Math.random() * 100) }));
|
|
40
|
-
chart.width = randomNumber(400, 600);
|
|
41
|
-
});
|
|
42
|
-
</script>
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
<script type='module'>
|
|
46
|
-
import { Button, ChartDonut } from '/dist/index.js';
|
|
47
|
-
window.customElements.define('wc-chart-doughnut', ChartDonut);
|
|
48
|
-
window.customElements.define('wc-button', Button);
|
|
49
|
-
</script>
|
|
50
|
-
</body>
|
|
51
|
-
</html>
|
package/src/chart-donut/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { ChartDonut } from './chart-donut.js';
|
package/src/styleMixins.css.ts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { css, unsafeCSS, CSSResult } from 'lit';
|
|
2
|
-
|
|
3
|
-
export const focusRing = (
|
|
4
|
-
color = 'var(--border-interactive)',
|
|
5
|
-
): CSSResult => css`
|
|
6
|
-
outline: 2px solid ${unsafeCSS(color)};
|
|
7
|
-
`;
|
|
8
|
-
|
|
9
|
-
export const getTypography = (name: string): CSSResult => css`
|
|
10
|
-
font-family: var(--typography-${unsafeCSS(name)}-font-family) !important;
|
|
11
|
-
font-size: var(--typography-${unsafeCSS(name)}-font-size) !important;
|
|
12
|
-
font-weight: var(--typography-${unsafeCSS(name)}-font-weight) !important;
|
|
13
|
-
line-height: var(--typography-${unsafeCSS(name)}-line-height) !important;
|
|
14
|
-
letter-spacing: var(
|
|
15
|
-
--typography-${unsafeCSS(name)}-letter-spacing
|
|
16
|
-
) !important;
|
|
17
|
-
`;
|
|
18
|
-
|
|
19
|
-
export const getTypographyNotImportant = (name: string): CSSResult => css`
|
|
20
|
-
font-family: var(--typography-${unsafeCSS(name)}-font-family);
|
|
21
|
-
font-size: var(--typography-${unsafeCSS(name)}-font-size);
|
|
22
|
-
font-weight: var(--typography-${unsafeCSS(name)}-font-weight);
|
|
23
|
-
line-height: var(--typography-${unsafeCSS(name)}-line-height);
|
|
24
|
-
letter-spacing: var(--typography-${unsafeCSS(name)}-letter-spacing);
|
|
25
|
-
`;
|
|
26
|
-
|
|
27
|
-
export const forPhoneOnly = (content: CSSResult): CSSResult => css`
|
|
28
|
-
@media (max-width: 671px) {
|
|
29
|
-
${content}
|
|
30
|
-
}
|
|
31
|
-
`;
|
|
32
|
-
|
|
33
|
-
export const forTabletPortraitUp = (content: CSSResult): CSSResult => css`
|
|
34
|
-
@media (min-width: 672px) {
|
|
35
|
-
${content}
|
|
36
|
-
}
|
|
37
|
-
`;
|
|
38
|
-
|
|
39
|
-
export const forTabletLandscapeUp = (content: CSSResult): CSSResult => css`
|
|
40
|
-
@media (min-width: 1056px) {
|
|
41
|
-
${content}
|
|
42
|
-
}
|
|
43
|
-
`;
|
|
44
|
-
|
|
45
|
-
export const forDesktopUp = (content: CSSResult): CSSResult => css`
|
|
46
|
-
@media (min-width: 1312px) {
|
|
47
|
-
${content}
|
|
48
|
-
}
|
|
49
|
-
`;
|
|
50
|
-
|
|
51
|
-
export const forBigDesktopUp = (content: CSSResult): CSSResult => css`
|
|
52
|
-
@media (min-width: 1584px) {
|
|
53
|
-
${content}
|
|
54
|
-
}
|
|
55
|
-
`;
|