@sankhyatronics/sankhya-cms 0.1.10 → 0.1.12
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/custom-elements.json +941 -229
- package/dist/attention-panel/index.d.ts +23 -0
- package/dist/attention-panel/index.js +9 -0
- package/dist/attention-panel/index.js.map +1 -0
- package/dist/bar-chart/index.d.ts +43 -0
- package/dist/bar-chart/index.js +9 -0
- package/dist/bar-chart/index.js.map +1 -0
- package/dist/chip/index.d.ts +21 -0
- package/dist/chip/index.js +9 -0
- package/dist/chip/index.js.map +1 -0
- package/dist/chunk-4PXZPGWQ.js +127 -0
- package/dist/chunk-4PXZPGWQ.js.map +1 -0
- package/dist/chunk-AG2COC64.js +217 -0
- package/dist/chunk-AG2COC64.js.map +1 -0
- package/dist/chunk-DAGSL2JV.js +83 -0
- package/dist/chunk-DAGSL2JV.js.map +1 -0
- package/dist/chunk-LGGLQNSU.js +93 -0
- package/dist/chunk-LGGLQNSU.js.map +1 -0
- package/dist/chunk-MG2VTZA4.js +122 -0
- package/dist/chunk-MG2VTZA4.js.map +1 -0
- package/dist/chunk-T55CG4YG.js +190 -0
- package/dist/chunk-T55CG4YG.js.map +1 -0
- package/dist/date-tile/index.d.ts +20 -0
- package/dist/date-tile/index.js +9 -0
- package/dist/date-tile/index.js.map +1 -0
- package/dist/index.d.ts +7 -1
- package/dist/index.js +51 -27
- package/dist/kpi-card/index.d.ts +30 -0
- package/dist/kpi-card/index.js +9 -0
- package/dist/kpi-card/index.js.map +1 -0
- package/dist/schema/index.d.ts +6 -0
- package/dist/schema/index.js +6 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/segmented-control/index.d.ts +30 -0
- package/dist/segmented-control/index.js +9 -0
- package/dist/segmented-control/index.js.map +1 -0
- package/package.json +26 -2
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as lit from 'lit';
|
|
2
|
+
import { LitElement } from 'lit';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A tinted panel that calls out the most serious item needing action: an icon, a title, a line of
|
|
6
|
+
* detail and an action link. `tone` picks the colour: `warning` (amber) for things due soon,
|
|
7
|
+
* `danger` (red) for overdue or failing items, `accent` (blue) for set-up tips.
|
|
8
|
+
*
|
|
9
|
+
* Slots: `icon` (a glyph beside the title), default (the detail text), `action` (a link or button).
|
|
10
|
+
*/
|
|
11
|
+
declare class AttentionPanel extends LitElement {
|
|
12
|
+
static styles: lit.CSSResult;
|
|
13
|
+
/** Colour of the panel: `accent` for tips, `warning` for due soon, `danger` for overdue. */
|
|
14
|
+
tone: 'accent' | 'warning' | 'danger';
|
|
15
|
+
/** Bold line at the top of the panel. */
|
|
16
|
+
heading: string;
|
|
17
|
+
/** Set when an element is slotted into `icon`, so the icon tile only renders with an icon. */
|
|
18
|
+
hasIcon: boolean;
|
|
19
|
+
connectedCallback(): void;
|
|
20
|
+
render(): lit.TemplateResult<1>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { AttentionPanel };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import * as lit from 'lit';
|
|
2
|
+
import { LitElement } from 'lit';
|
|
3
|
+
|
|
4
|
+
interface BarChartBar {
|
|
5
|
+
/** Category under the bar (for example a month abbreviation). */
|
|
6
|
+
label: string;
|
|
7
|
+
/** Bar height in the chart's units. `null` draws a grey stub, for periods not reached yet. */
|
|
8
|
+
value: number | null;
|
|
9
|
+
/** The value text above the bar. Format it before passing it in (for example "5.74 L"). */
|
|
10
|
+
valueLabel?: string;
|
|
11
|
+
/** Highlights this bar in the lighter accent, for the current period. */
|
|
12
|
+
current?: boolean;
|
|
13
|
+
}
|
|
14
|
+
interface BarChartTick {
|
|
15
|
+
/** Height of the gridline, in the chart's units. */
|
|
16
|
+
value: number;
|
|
17
|
+
/** Text at the left edge of the gridline, already formatted. */
|
|
18
|
+
label: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A vertical bar chart for a fixed set of categories: value labels above the bars, gridlines with
|
|
22
|
+
* labels on the left, and category labels underneath. Heights scale to `max`, or to the largest
|
|
23
|
+
* bar or tick when `max` is not set. Values are not formatted here: pass `valueLabel` and tick
|
|
24
|
+
* labels already formatted (currency, lakh/crore), so this element stays locale-free.
|
|
25
|
+
*/
|
|
26
|
+
declare class BarChart extends LitElement {
|
|
27
|
+
static styles: lit.CSSResult;
|
|
28
|
+
/** The bars, in order from left to right. */
|
|
29
|
+
bars: BarChartBar[];
|
|
30
|
+
/** Optional gridlines with labels. */
|
|
31
|
+
ticks: BarChartTick[];
|
|
32
|
+
/** The value that maps to the top of the plot. Defaults to the largest bar or tick. */
|
|
33
|
+
max: number | null;
|
|
34
|
+
/** Plot height in pixels, excluding category labels. */
|
|
35
|
+
plotHeight: number;
|
|
36
|
+
/** Accessible name for the chart. */
|
|
37
|
+
chartLabel: string;
|
|
38
|
+
private topValue;
|
|
39
|
+
private heightPct;
|
|
40
|
+
render(): lit.TemplateResult<1>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { BarChart };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as lit from 'lit';
|
|
2
|
+
import { LitElement } from 'lit';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A small rounded status pill: text in the default slot, with an optional leading dot. Tones map
|
|
6
|
+
* to the theme's status tokens (soft background, text colour on that background), so a chip reads
|
|
7
|
+
* the same in every theme. Use `neutral` for plain labels, `accent` for the brand tint, and the
|
|
8
|
+
* status tones for meaning only (success = done, warning = due soon, danger = overdue).
|
|
9
|
+
*/
|
|
10
|
+
declare class Chip extends LitElement {
|
|
11
|
+
static styles: lit.CSSResult;
|
|
12
|
+
/** Colour treatment: a soft tint of the matching theme token. */
|
|
13
|
+
tone: 'neutral' | 'accent' | 'success' | 'warning' | 'danger';
|
|
14
|
+
/** `sm` for dense lists and table cells. */
|
|
15
|
+
size: 'md' | 'sm';
|
|
16
|
+
/** Shows a leading dot in the chip's text colour. */
|
|
17
|
+
dot: boolean;
|
|
18
|
+
render(): lit.TemplateResult<1>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { Chip };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import {
|
|
2
|
+
fontFamilyStyles
|
|
3
|
+
} from "./chunk-KMU6ABQF.js";
|
|
4
|
+
import {
|
|
5
|
+
__decorateClass
|
|
6
|
+
} from "./chunk-EUXUH3YW.js";
|
|
7
|
+
|
|
8
|
+
// src/attention-panel/AttentionPanel.ts
|
|
9
|
+
import { LitElement, css, html, nothing } from "lit";
|
|
10
|
+
import { customElement, property } from "lit/decorators.js";
|
|
11
|
+
var AttentionPanel = class extends LitElement {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.tone = "accent";
|
|
15
|
+
this.heading = "";
|
|
16
|
+
this.hasIcon = false;
|
|
17
|
+
}
|
|
18
|
+
connectedCallback() {
|
|
19
|
+
super.connectedCallback();
|
|
20
|
+
this.hasIcon = this.querySelector('[slot="icon"]') !== null;
|
|
21
|
+
}
|
|
22
|
+
render() {
|
|
23
|
+
return html`
|
|
24
|
+
${this.hasIcon ? html`<span class="icon" part="icon"><slot name="icon"></slot></span>` : nothing}
|
|
25
|
+
<div class="body">
|
|
26
|
+
<p class="title" part="title">${this.heading}</p>
|
|
27
|
+
<div class="detail" part="detail"><slot></slot></div>
|
|
28
|
+
<div class="action" part="action"><slot name="action"></slot></div>
|
|
29
|
+
</div>
|
|
30
|
+
`;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
AttentionPanel.styles = css`
|
|
34
|
+
${fontFamilyStyles}
|
|
35
|
+
|
|
36
|
+
:host {
|
|
37
|
+
display: flex;
|
|
38
|
+
align-items: flex-start;
|
|
39
|
+
gap: var(--st-space-12);
|
|
40
|
+
padding: var(--st-space-16);
|
|
41
|
+
border-radius: var(--st-radius-md);
|
|
42
|
+
background: var(--st-color-accent-subtle);
|
|
43
|
+
color: var(--st-color-text);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
:host([tone='warning']) {
|
|
47
|
+
background: var(--st-color-warning-subtle);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
:host([tone='danger']) {
|
|
51
|
+
background: var(--st-color-danger-subtle);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.icon {
|
|
55
|
+
display: inline-grid;
|
|
56
|
+
place-items: center;
|
|
57
|
+
width: 32px;
|
|
58
|
+
height: 32px;
|
|
59
|
+
border-radius: var(--st-radius-sm);
|
|
60
|
+
background: var(--st-color-surface);
|
|
61
|
+
flex: none;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.body {
|
|
65
|
+
display: flex;
|
|
66
|
+
flex-direction: column;
|
|
67
|
+
gap: var(--st-space-4);
|
|
68
|
+
min-width: 0;
|
|
69
|
+
flex: 1;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.title {
|
|
73
|
+
margin: 0;
|
|
74
|
+
font-size: var(--st-text-lg);
|
|
75
|
+
font-weight: var(--st-font-weight-semibold);
|
|
76
|
+
color: var(--st-color-text-strong);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.detail {
|
|
80
|
+
font-size: var(--st-text-base);
|
|
81
|
+
line-height: 1.5;
|
|
82
|
+
color: var(--st-color-text-secondary);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.action {
|
|
86
|
+
margin-top: var(--st-space-6);
|
|
87
|
+
font-size: var(--st-text-base);
|
|
88
|
+
font-weight: var(--st-font-weight-semibold);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
:host([tone='warning']) .action {
|
|
92
|
+
color: var(--st-color-warning-text);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
:host([tone='danger']) .action {
|
|
96
|
+
color: var(--st-color-danger-text);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
:host([tone='accent']) .action {
|
|
100
|
+
color: var(--st-color-accent-text);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.action:empty {
|
|
104
|
+
display: none;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.icon:empty {
|
|
108
|
+
display: none;
|
|
109
|
+
}
|
|
110
|
+
`;
|
|
111
|
+
__decorateClass([
|
|
112
|
+
property({ type: String, reflect: true })
|
|
113
|
+
], AttentionPanel.prototype, "tone", 2);
|
|
114
|
+
__decorateClass([
|
|
115
|
+
property({ type: String })
|
|
116
|
+
], AttentionPanel.prototype, "heading", 2);
|
|
117
|
+
__decorateClass([
|
|
118
|
+
property({ type: Boolean, reflect: true, attribute: "has-icon" })
|
|
119
|
+
], AttentionPanel.prototype, "hasIcon", 2);
|
|
120
|
+
AttentionPanel = __decorateClass([
|
|
121
|
+
customElement("st-attention-panel")
|
|
122
|
+
], AttentionPanel);
|
|
123
|
+
|
|
124
|
+
export {
|
|
125
|
+
AttentionPanel
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=chunk-4PXZPGWQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/attention-panel/AttentionPanel.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { fontFamilyStyles } from '../shared/styles';\n\n/**\n * A tinted panel that calls out the most serious item needing action: an icon, a title, a line of\n * detail and an action link. `tone` picks the colour: `warning` (amber) for things due soon,\n * `danger` (red) for overdue or failing items, `accent` (blue) for set-up tips.\n *\n * Slots: `icon` (a glyph beside the title), default (the detail text), `action` (a link or button).\n */\n@customElement('st-attention-panel')\nexport class AttentionPanel extends LitElement {\n static styles = css`\n ${fontFamilyStyles}\n\n :host {\n display: flex;\n align-items: flex-start;\n gap: var(--st-space-12);\n padding: var(--st-space-16);\n border-radius: var(--st-radius-md);\n background: var(--st-color-accent-subtle);\n color: var(--st-color-text);\n }\n\n :host([tone='warning']) {\n background: var(--st-color-warning-subtle);\n }\n\n :host([tone='danger']) {\n background: var(--st-color-danger-subtle);\n }\n\n .icon {\n display: inline-grid;\n place-items: center;\n width: 32px;\n height: 32px;\n border-radius: var(--st-radius-sm);\n background: var(--st-color-surface);\n flex: none;\n }\n\n .body {\n display: flex;\n flex-direction: column;\n gap: var(--st-space-4);\n min-width: 0;\n flex: 1;\n }\n\n .title {\n margin: 0;\n font-size: var(--st-text-lg);\n font-weight: var(--st-font-weight-semibold);\n color: var(--st-color-text-strong);\n }\n\n .detail {\n font-size: var(--st-text-base);\n line-height: 1.5;\n color: var(--st-color-text-secondary);\n }\n\n .action {\n margin-top: var(--st-space-6);\n font-size: var(--st-text-base);\n font-weight: var(--st-font-weight-semibold);\n }\n\n :host([tone='warning']) .action {\n color: var(--st-color-warning-text);\n }\n\n :host([tone='danger']) .action {\n color: var(--st-color-danger-text);\n }\n\n :host([tone='accent']) .action {\n color: var(--st-color-accent-text);\n }\n\n .action:empty {\n display: none;\n }\n\n .icon:empty {\n display: none;\n }\n `;\n\n /** Colour of the panel: `accent` for tips, `warning` for due soon, `danger` for overdue. */\n @property({ type: String, reflect: true })\n tone: 'accent' | 'warning' | 'danger' = 'accent';\n\n /** Bold line at the top of the panel. */\n @property({ type: String })\n heading = '';\n\n /** Set when an element is slotted into `icon`, so the icon tile only renders with an icon. */\n @property({ type: Boolean, reflect: true, attribute: 'has-icon' })\n hasIcon = false;\n\n connectedCallback() {\n super.connectedCallback();\n this.hasIcon = this.querySelector('[slot=\"icon\"]') !== null;\n }\n\n render() {\n return html`\n ${this.hasIcon ? html`<span class=\"icon\" part=\"icon\"><slot name=\"icon\"></slot></span>` : nothing}\n <div class=\"body\">\n <p class=\"title\" part=\"title\">${this.heading}</p>\n <div class=\"detail\" part=\"detail\"><slot></slot></div>\n <div class=\"action\" part=\"action\"><slot name=\"action\"></slot></div>\n </div>\n `;\n }\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,YAAY,KAAK,MAAM,eAAe;AAC/C,SAAS,eAAe,gBAAgB;AAYjC,IAAM,iBAAN,cAA6B,WAAW;AAAA,EAAxC;AAAA;AAkFL,gBAAwC;AAIxC,mBAAU;AAIV,mBAAU;AAAA;AAAA,EAEV,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,SAAK,UAAU,KAAK,cAAc,eAAe,MAAM;AAAA,EACzD;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,QACH,KAAK,UAAU,wEAAwE,OAAO;AAAA;AAAA,wCAE9D,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlD;AACF;AA3Ga,eACJ,SAAS;AAAA,MACZ,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgFpB;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAjF9B,eAkFX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GArFf,eAsFX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM,WAAW,WAAW,CAAC;AAAA,GAzFtD,eA0FX;AA1FW,iBAAN;AAAA,EADN,cAAc,oBAAoB;AAAA,GACtB;","names":[]}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import {
|
|
2
|
+
fontFamilyStyles
|
|
3
|
+
} from "./chunk-KMU6ABQF.js";
|
|
4
|
+
import {
|
|
5
|
+
__decorateClass
|
|
6
|
+
} from "./chunk-EUXUH3YW.js";
|
|
7
|
+
|
|
8
|
+
// src/bar-chart/BarChart.ts
|
|
9
|
+
import { LitElement, css, html, nothing } from "lit";
|
|
10
|
+
import { customElement, property } from "lit/decorators.js";
|
|
11
|
+
var BarChart = class extends LitElement {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.bars = [];
|
|
15
|
+
this.ticks = [];
|
|
16
|
+
this.max = null;
|
|
17
|
+
this.plotHeight = 200;
|
|
18
|
+
this.chartLabel = "";
|
|
19
|
+
}
|
|
20
|
+
topValue() {
|
|
21
|
+
if (this.max !== null && this.max > 0) return this.max;
|
|
22
|
+
const values = [...this.bars.map((bar) => bar.value ?? 0), ...this.ticks.map((tick) => tick.value)];
|
|
23
|
+
return Math.max(...values, 0) || 1;
|
|
24
|
+
}
|
|
25
|
+
heightPct(value) {
|
|
26
|
+
if (value === null) return 0;
|
|
27
|
+
return Math.max(0, Math.min(100, value / this.topValue() * 100));
|
|
28
|
+
}
|
|
29
|
+
render() {
|
|
30
|
+
if (!this.bars.length) {
|
|
31
|
+
return html`<div class="empty">${this.chartLabel || nothing}</div>`;
|
|
32
|
+
}
|
|
33
|
+
const top = this.topValue();
|
|
34
|
+
return html`
|
|
35
|
+
<div class="frame" role="img" aria-label=${this.chartLabel || nothing} style="--st-bar-chart-height: ${this.plotHeight}px">
|
|
36
|
+
<div class="axis" aria-hidden="true">
|
|
37
|
+
${this.ticks.map((tick) => html`<span style="bottom: ${tick.value / top * 100}%">${tick.label}</span>`)}
|
|
38
|
+
</div>
|
|
39
|
+
<div class="plot">
|
|
40
|
+
<div class="grid" aria-hidden="true">
|
|
41
|
+
${this.ticks.map((tick) => html`<i style="bottom: ${tick.value / top * 100}%"></i>`)}
|
|
42
|
+
</div>
|
|
43
|
+
<div class="bars">
|
|
44
|
+
${this.bars.map((bar) => {
|
|
45
|
+
const state = bar.value === null ? "future" : bar.current ? "current" : "default";
|
|
46
|
+
return html`<div class="col" data-state=${state} title=${bar.valueLabel ?? bar.label}>
|
|
47
|
+
<div class="stack" style="height: ${this.heightPct(bar.value)}%">
|
|
48
|
+
${bar.valueLabel ? html`<span class="value">${bar.valueLabel}</span>` : nothing}
|
|
49
|
+
<div class="bar"></div>
|
|
50
|
+
</div>
|
|
51
|
+
</div>`;
|
|
52
|
+
})}
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
<div></div>
|
|
56
|
+
<div class="categories" aria-hidden="true">
|
|
57
|
+
${this.bars.map((bar) => html`<span class=${bar.current ? "current" : ""}>${bar.label}</span>`)}
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
`;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
BarChart.styles = css`
|
|
64
|
+
${fontFamilyStyles}
|
|
65
|
+
|
|
66
|
+
:host {
|
|
67
|
+
display: block;
|
|
68
|
+
min-width: 0;
|
|
69
|
+
color: var(--st-color-text-muted);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.frame {
|
|
73
|
+
position: relative;
|
|
74
|
+
display: grid;
|
|
75
|
+
grid-template-columns: auto 1fr;
|
|
76
|
+
column-gap: var(--st-space-10);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.axis {
|
|
80
|
+
position: relative;
|
|
81
|
+
height: var(--st-bar-chart-height, 200px);
|
|
82
|
+
font-size: var(--st-text-xs);
|
|
83
|
+
font-variant-numeric: tabular-nums;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.axis span {
|
|
87
|
+
position: absolute;
|
|
88
|
+
right: 0;
|
|
89
|
+
transform: translateY(50%);
|
|
90
|
+
white-space: nowrap;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.plot {
|
|
94
|
+
position: relative;
|
|
95
|
+
height: var(--st-bar-chart-height, 200px);
|
|
96
|
+
border-bottom: 1px solid var(--st-color-border);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.grid {
|
|
100
|
+
position: absolute;
|
|
101
|
+
inset: 0;
|
|
102
|
+
pointer-events: none;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.grid i {
|
|
106
|
+
position: absolute;
|
|
107
|
+
left: 0;
|
|
108
|
+
right: 0;
|
|
109
|
+
border-top: 1px dashed var(--st-color-border);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.bars {
|
|
113
|
+
position: absolute;
|
|
114
|
+
inset: 0;
|
|
115
|
+
display: grid;
|
|
116
|
+
grid-auto-flow: column;
|
|
117
|
+
grid-auto-columns: 1fr;
|
|
118
|
+
align-items: end;
|
|
119
|
+
gap: var(--st-space-8);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.col {
|
|
123
|
+
position: relative;
|
|
124
|
+
height: 100%;
|
|
125
|
+
min-width: 0;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* The bar and its value label share one box, anchored to the baseline, so the label always
|
|
129
|
+
sits just above the bar's top edge. */
|
|
130
|
+
.stack {
|
|
131
|
+
position: absolute;
|
|
132
|
+
left: 0;
|
|
133
|
+
right: 0;
|
|
134
|
+
bottom: 0;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.value {
|
|
138
|
+
position: absolute;
|
|
139
|
+
left: 0;
|
|
140
|
+
right: 0;
|
|
141
|
+
bottom: 100%;
|
|
142
|
+
padding-bottom: var(--st-space-4);
|
|
143
|
+
text-align: center;
|
|
144
|
+
font-size: var(--st-text-xs);
|
|
145
|
+
font-weight: var(--st-font-weight-medium);
|
|
146
|
+
white-space: nowrap;
|
|
147
|
+
color: var(--st-color-text-secondary);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.bar {
|
|
151
|
+
width: 100%;
|
|
152
|
+
height: 100%;
|
|
153
|
+
border-radius: 4px 4px 0 0;
|
|
154
|
+
background: var(--st-color-accent);
|
|
155
|
+
min-height: 2px;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.col[data-state='current'] .bar {
|
|
159
|
+
background: color-mix(in oklch, var(--st-color-accent) 70%, #ffffff);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.col[data-state='future'] .bar {
|
|
163
|
+
background: var(--st-color-subtle);
|
|
164
|
+
min-height: 4px;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.col[data-state='current'] .value {
|
|
168
|
+
color: var(--st-color-accent-text);
|
|
169
|
+
font-weight: var(--st-font-weight-semibold);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.categories {
|
|
173
|
+
display: grid;
|
|
174
|
+
grid-auto-flow: column;
|
|
175
|
+
grid-auto-columns: 1fr;
|
|
176
|
+
gap: var(--st-space-8);
|
|
177
|
+
margin-top: var(--st-space-8);
|
|
178
|
+
font-size: var(--st-text-xs);
|
|
179
|
+
text-align: center;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.categories .current {
|
|
183
|
+
font-weight: var(--st-font-weight-semibold);
|
|
184
|
+
color: var(--st-color-accent-text);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.empty {
|
|
188
|
+
display: flex;
|
|
189
|
+
align-items: center;
|
|
190
|
+
justify-content: center;
|
|
191
|
+
min-height: 120px;
|
|
192
|
+
font-size: var(--st-text-base);
|
|
193
|
+
}
|
|
194
|
+
`;
|
|
195
|
+
__decorateClass([
|
|
196
|
+
property({ attribute: false })
|
|
197
|
+
], BarChart.prototype, "bars", 2);
|
|
198
|
+
__decorateClass([
|
|
199
|
+
property({ attribute: false })
|
|
200
|
+
], BarChart.prototype, "ticks", 2);
|
|
201
|
+
__decorateClass([
|
|
202
|
+
property({ type: Number })
|
|
203
|
+
], BarChart.prototype, "max", 2);
|
|
204
|
+
__decorateClass([
|
|
205
|
+
property({ type: Number, attribute: "plot-height" })
|
|
206
|
+
], BarChart.prototype, "plotHeight", 2);
|
|
207
|
+
__decorateClass([
|
|
208
|
+
property({ type: String, attribute: "chart-label" })
|
|
209
|
+
], BarChart.prototype, "chartLabel", 2);
|
|
210
|
+
BarChart = __decorateClass([
|
|
211
|
+
customElement("st-bar-chart")
|
|
212
|
+
], BarChart);
|
|
213
|
+
|
|
214
|
+
export {
|
|
215
|
+
BarChart
|
|
216
|
+
};
|
|
217
|
+
//# sourceMappingURL=chunk-AG2COC64.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bar-chart/BarChart.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { fontFamilyStyles } from '../shared/styles';\n\nexport interface BarChartBar {\n /** Category under the bar (for example a month abbreviation). */\n label: string;\n /** Bar height in the chart's units. `null` draws a grey stub, for periods not reached yet. */\n value: number | null;\n /** The value text above the bar. Format it before passing it in (for example \"5.74 L\"). */\n valueLabel?: string;\n /** Highlights this bar in the lighter accent, for the current period. */\n current?: boolean;\n}\n\nexport interface BarChartTick {\n /** Height of the gridline, in the chart's units. */\n value: number;\n /** Text at the left edge of the gridline, already formatted. */\n label: string;\n}\n\n/**\n * A vertical bar chart for a fixed set of categories: value labels above the bars, gridlines with\n * labels on the left, and category labels underneath. Heights scale to `max`, or to the largest\n * bar or tick when `max` is not set. Values are not formatted here: pass `valueLabel` and tick\n * labels already formatted (currency, lakh/crore), so this element stays locale-free.\n */\n@customElement('st-bar-chart')\nexport class BarChart extends LitElement {\n static styles = css`\n ${fontFamilyStyles}\n\n :host {\n display: block;\n min-width: 0;\n color: var(--st-color-text-muted);\n }\n\n .frame {\n position: relative;\n display: grid;\n grid-template-columns: auto 1fr;\n column-gap: var(--st-space-10);\n }\n\n .axis {\n position: relative;\n height: var(--st-bar-chart-height, 200px);\n font-size: var(--st-text-xs);\n font-variant-numeric: tabular-nums;\n }\n\n .axis span {\n position: absolute;\n right: 0;\n transform: translateY(50%);\n white-space: nowrap;\n }\n\n .plot {\n position: relative;\n height: var(--st-bar-chart-height, 200px);\n border-bottom: 1px solid var(--st-color-border);\n }\n\n .grid {\n position: absolute;\n inset: 0;\n pointer-events: none;\n }\n\n .grid i {\n position: absolute;\n left: 0;\n right: 0;\n border-top: 1px dashed var(--st-color-border);\n }\n\n .bars {\n position: absolute;\n inset: 0;\n display: grid;\n grid-auto-flow: column;\n grid-auto-columns: 1fr;\n align-items: end;\n gap: var(--st-space-8);\n }\n\n .col {\n position: relative;\n height: 100%;\n min-width: 0;\n }\n\n /* The bar and its value label share one box, anchored to the baseline, so the label always\n sits just above the bar's top edge. */\n .stack {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n .value {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 100%;\n padding-bottom: var(--st-space-4);\n text-align: center;\n font-size: var(--st-text-xs);\n font-weight: var(--st-font-weight-medium);\n white-space: nowrap;\n color: var(--st-color-text-secondary);\n }\n\n .bar {\n width: 100%;\n height: 100%;\n border-radius: 4px 4px 0 0;\n background: var(--st-color-accent);\n min-height: 2px;\n }\n\n .col[data-state='current'] .bar {\n background: color-mix(in oklch, var(--st-color-accent) 70%, #ffffff);\n }\n\n .col[data-state='future'] .bar {\n background: var(--st-color-subtle);\n min-height: 4px;\n }\n\n .col[data-state='current'] .value {\n color: var(--st-color-accent-text);\n font-weight: var(--st-font-weight-semibold);\n }\n\n .categories {\n display: grid;\n grid-auto-flow: column;\n grid-auto-columns: 1fr;\n gap: var(--st-space-8);\n margin-top: var(--st-space-8);\n font-size: var(--st-text-xs);\n text-align: center;\n }\n\n .categories .current {\n font-weight: var(--st-font-weight-semibold);\n color: var(--st-color-accent-text);\n }\n\n .empty {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 120px;\n font-size: var(--st-text-base);\n }\n `;\n\n /** The bars, in order from left to right. */\n @property({ attribute: false })\n bars: BarChartBar[] = [];\n\n /** Optional gridlines with labels. */\n @property({ attribute: false })\n ticks: BarChartTick[] = [];\n\n /** The value that maps to the top of the plot. Defaults to the largest bar or tick. */\n @property({ type: Number })\n max: number | null = null;\n\n /** Plot height in pixels, excluding category labels. */\n @property({ type: Number, attribute: 'plot-height' })\n plotHeight = 200;\n\n /** Accessible name for the chart. */\n @property({ type: String, attribute: 'chart-label' })\n chartLabel = '';\n\n private topValue(): number {\n if (this.max !== null && this.max > 0) return this.max;\n const values = [...this.bars.map(bar => bar.value ?? 0), ...this.ticks.map(tick => tick.value)];\n return Math.max(...values, 0) || 1;\n }\n\n private heightPct(value: number | null): number {\n if (value === null) return 0;\n return Math.max(0, Math.min(100, (value / this.topValue()) * 100));\n }\n\n render() {\n if (!this.bars.length) {\n return html`<div class=\"empty\">${this.chartLabel || nothing}</div>`;\n }\n const top = this.topValue();\n return html`\n <div class=\"frame\" role=\"img\" aria-label=${this.chartLabel || nothing} style=\"--st-bar-chart-height: ${this.plotHeight}px\">\n <div class=\"axis\" aria-hidden=\"true\">\n ${this.ticks.map(tick => html`<span style=\"bottom: ${(tick.value / top) * 100}%\">${tick.label}</span>`)}\n </div>\n <div class=\"plot\">\n <div class=\"grid\" aria-hidden=\"true\">\n ${this.ticks.map(tick => html`<i style=\"bottom: ${(tick.value / top) * 100}%\"></i>`)}\n </div>\n <div class=\"bars\">\n ${this.bars.map(bar => {\n const state = bar.value === null ? 'future' : bar.current ? 'current' : 'default';\n return html`<div class=\"col\" data-state=${state} title=${bar.valueLabel ?? bar.label}>\n <div class=\"stack\" style=\"height: ${this.heightPct(bar.value)}%\">\n ${bar.valueLabel ? html`<span class=\"value\">${bar.valueLabel}</span>` : nothing}\n <div class=\"bar\"></div>\n </div>\n </div>`;\n })}\n </div>\n </div>\n <div></div>\n <div class=\"categories\" aria-hidden=\"true\">\n ${this.bars.map(bar => html`<span class=${bar.current ? 'current' : ''}>${bar.label}</span>`)}\n </div>\n </div>\n `;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import {
|
|
2
|
+
fontFamilyStyles
|
|
3
|
+
} from "./chunk-KMU6ABQF.js";
|
|
4
|
+
import {
|
|
5
|
+
__decorateClass
|
|
6
|
+
} from "./chunk-EUXUH3YW.js";
|
|
7
|
+
|
|
8
|
+
// src/date-tile/DateTile.ts
|
|
9
|
+
import { LitElement, css, html } from "lit";
|
|
10
|
+
import { customElement, property } from "lit/decorators.js";
|
|
11
|
+
var DateTile = class extends LitElement {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.month = "";
|
|
15
|
+
this.day = "";
|
|
16
|
+
this.tone = "default";
|
|
17
|
+
}
|
|
18
|
+
render() {
|
|
19
|
+
return html`<span class="month" part="month">${this.month}</span><span class="day" part="day">${this.day}</span>`;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
DateTile.styles = css`
|
|
23
|
+
${fontFamilyStyles}
|
|
24
|
+
|
|
25
|
+
:host {
|
|
26
|
+
display: inline-flex;
|
|
27
|
+
flex-direction: column;
|
|
28
|
+
align-items: stretch;
|
|
29
|
+
width: 52px;
|
|
30
|
+
border: 1px solid var(--st-color-border);
|
|
31
|
+
border-radius: var(--st-radius-sm);
|
|
32
|
+
background: var(--st-color-surface);
|
|
33
|
+
overflow: hidden;
|
|
34
|
+
text-align: center;
|
|
35
|
+
flex: none;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.month {
|
|
39
|
+
padding: var(--st-space-3) 0;
|
|
40
|
+
font-size: var(--st-text-2xs);
|
|
41
|
+
font-weight: var(--st-font-weight-bold);
|
|
42
|
+
letter-spacing: 0.06em;
|
|
43
|
+
text-transform: uppercase;
|
|
44
|
+
background: var(--st-color-accent-subtle);
|
|
45
|
+
color: var(--st-color-accent-text);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
:host([tone='warning']) .month {
|
|
49
|
+
background: var(--st-color-warning-subtle);
|
|
50
|
+
color: var(--st-color-warning-text);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
:host([tone='danger']) .month {
|
|
54
|
+
background: var(--st-color-danger-subtle);
|
|
55
|
+
color: var(--st-color-danger-text);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.day {
|
|
59
|
+
padding: var(--st-space-6) 0 var(--st-space-8);
|
|
60
|
+
font-size: var(--st-text-2xl);
|
|
61
|
+
font-weight: var(--st-font-weight-bold);
|
|
62
|
+
line-height: 1;
|
|
63
|
+
font-variant-numeric: tabular-nums;
|
|
64
|
+
color: var(--st-color-text-strong);
|
|
65
|
+
}
|
|
66
|
+
`;
|
|
67
|
+
__decorateClass([
|
|
68
|
+
property({ type: String })
|
|
69
|
+
], DateTile.prototype, "month", 2);
|
|
70
|
+
__decorateClass([
|
|
71
|
+
property({ type: String })
|
|
72
|
+
], DateTile.prototype, "day", 2);
|
|
73
|
+
__decorateClass([
|
|
74
|
+
property({ type: String, reflect: true })
|
|
75
|
+
], DateTile.prototype, "tone", 2);
|
|
76
|
+
DateTile = __decorateClass([
|
|
77
|
+
customElement("st-date-tile")
|
|
78
|
+
], DateTile);
|
|
79
|
+
|
|
80
|
+
export {
|
|
81
|
+
DateTile
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=chunk-DAGSL2JV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/date-tile/DateTile.ts"],"sourcesContent":["import { LitElement, css, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { fontFamilyStyles } from '../shared/styles';\n\n/**\n * A calendar date tile: a month band over a large day number, as used for due dates. `tone`\n * colours the month band: `default` for a neutral date, `warning` for due soon, `danger` for\n * overdue.\n */\n@customElement('st-date-tile')\nexport class DateTile extends LitElement {\n static styles = css`\n ${fontFamilyStyles}\n\n :host {\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n width: 52px;\n border: 1px solid var(--st-color-border);\n border-radius: var(--st-radius-sm);\n background: var(--st-color-surface);\n overflow: hidden;\n text-align: center;\n flex: none;\n }\n\n .month {\n padding: var(--st-space-3) 0;\n font-size: var(--st-text-2xs);\n font-weight: var(--st-font-weight-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n background: var(--st-color-accent-subtle);\n color: var(--st-color-accent-text);\n }\n\n :host([tone='warning']) .month {\n background: var(--st-color-warning-subtle);\n color: var(--st-color-warning-text);\n }\n\n :host([tone='danger']) .month {\n background: var(--st-color-danger-subtle);\n color: var(--st-color-danger-text);\n }\n\n .day {\n padding: var(--st-space-6) 0 var(--st-space-8);\n font-size: var(--st-text-2xl);\n font-weight: var(--st-font-weight-bold);\n line-height: 1;\n font-variant-numeric: tabular-nums;\n color: var(--st-color-text-strong);\n }\n `;\n\n /** Month abbreviation shown in the band (for example \"NOV\"). */\n @property({ type: String })\n month = '';\n\n /** Day of the month (for example \"11\"). */\n @property({ type: String })\n day = '';\n\n /** Colour of the month band. */\n @property({ type: String, reflect: true })\n tone: 'default' | 'warning' | 'danger' = 'default';\n\n render() {\n return html`<span class=\"month\" part=\"month\">${this.month}</span><span class=\"day\" part=\"day\">${this.day}</span>`;\n }\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,YAAY,KAAK,YAAY;AACtC,SAAS,eAAe,gBAAgB;AAUjC,IAAM,WAAN,cAAuB,WAAW;AAAA,EAAlC;AAAA;AAiDL,iBAAQ;AAIR,eAAM;AAIN,gBAAyC;AAAA;AAAA,EAEzC,SAAS;AACP,WAAO,wCAAwC,KAAK,KAAK,uCAAuC,KAAK,GAAG;AAAA,EAC1G;AACF;AA9Da,SACJ,SAAS;AAAA,MACZ,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+CpB;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAhDf,SAiDX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GApDf,SAqDX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAxD9B,SAyDX;AAzDW,WAAN;AAAA,EADN,cAAc,cAAc;AAAA,GAChB;","names":[]}
|