@santi020k/lumen-elements 3.0.1 → 4.1.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/README.md +518 -5
- package/dist/bullet-chart-html.d.ts +5 -0
- package/dist/bullet-chart-html.d.ts.map +1 -0
- package/dist/bullet-chart-html.js +56 -0
- package/dist/chart-activation.d.ts +15 -0
- package/dist/chart-activation.d.ts.map +1 -0
- package/dist/chart-activation.js +93 -0
- package/dist/chart-html.d.ts +22 -0
- package/dist/chart-html.d.ts.map +1 -0
- package/dist/chart-html.js +1 -0
- package/dist/comparison-chart-html.d.ts +4 -0
- package/dist/comparison-chart-html.d.ts.map +1 -0
- package/dist/comparison-chart-html.js +36 -0
- package/dist/components/ai-surfaces.d.ts +115 -0
- package/dist/components/ai-surfaces.d.ts.map +1 -0
- package/dist/components/ai-surfaces.js +270 -0
- package/dist/components/button.d.ts +55 -2
- package/dist/components/button.d.ts.map +1 -1
- package/dist/components/button.js +110 -2
- package/dist/components/card.d.ts +6 -0
- package/dist/components/card.d.ts.map +1 -1
- package/dist/components/card.js +6 -1
- package/dist/components/combobox.d.ts +1 -2
- package/dist/components/combobox.d.ts.map +1 -1
- package/dist/components/combobox.js +27 -121
- package/dist/components/dashboard.d.ts +41 -0
- package/dist/components/dashboard.d.ts.map +1 -0
- package/dist/components/dashboard.js +88 -0
- package/dist/components/device-frame.d.ts +31 -0
- package/dist/components/device-frame.d.ts.map +1 -0
- package/dist/components/device-frame.js +95 -0
- package/dist/components/foundations.d.ts +58 -18
- package/dist/components/foundations.d.ts.map +1 -1
- package/dist/components/foundations.js +160 -9
- package/dist/components/image-comparison.d.ts +33 -0
- package/dist/components/image-comparison.d.ts.map +1 -0
- package/dist/components/image-comparison.js +144 -0
- package/dist/components/media-selection.d.ts +41 -0
- package/dist/components/media-selection.d.ts.map +1 -0
- package/dist/components/media-selection.js +114 -0
- package/dist/components/media-viewport.d.ts +30 -0
- package/dist/components/media-viewport.d.ts.map +1 -0
- package/dist/components/media-viewport.js +108 -0
- package/dist/components/virtual-list.d.ts +38 -0
- package/dist/components/virtual-list.d.ts.map +1 -0
- package/dist/components/virtual-list.js +30 -0
- package/dist/components/visual-interactions.d.ts +65 -0
- package/dist/components/visual-interactions.d.ts.map +1 -0
- package/dist/components/visual-interactions.js +91 -0
- package/dist/components/world-map.d.ts +46 -0
- package/dist/components/world-map.d.ts.map +1 -0
- package/dist/components/world-map.js +312 -0
- package/dist/consumer-behaviors.d.ts +36 -0
- package/dist/consumer-behaviors.d.ts.map +1 -0
- package/dist/consumer-behaviors.js +1 -0
- package/dist/define.d.ts +229 -6
- package/dist/define.d.ts.map +1 -1
- package/dist/define.js +1 -1
- package/dist/element-base.js +1 -1
- package/dist/expanded-chart-html.d.ts +9 -0
- package/dist/expanded-chart-html.d.ts.map +1 -0
- package/dist/expanded-chart-html.js +61 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/package.json +34 -6
- package/styles/critical.css +696 -66
package/dist/element-base.js
CHANGED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type LumenBoxPlotDatum, type LumenBoxPlotStatisticLabels, type LumenCalendarHeatmapDatum, type LumenChartLabels, type LumenFunnelDatum } from '@santi020k/lumen-core';
|
|
2
|
+
export declare const parseCalendarHeatmapData: (source: string | null) => readonly LumenCalendarHeatmapDatum[];
|
|
3
|
+
export declare const parseFunnelData: (source: string | null) => readonly LumenFunnelDatum[];
|
|
4
|
+
export declare const parseBoxPlotData: (source: string | null) => readonly LumenBoxPlotDatum[];
|
|
5
|
+
export declare const calendarHeatmapHtml: (element: HTMLElement, data: readonly LumenCalendarHeatmapDatum[], text: Readonly<LumenChartLabels>, formatter: (value: number) => string, dateFormatter: (date: string) => string, weekdays: readonly string[]) => string;
|
|
6
|
+
export declare const funnelChartHtml: (element: HTMLElement, data: readonly LumenFunnelDatum[], text: Readonly<LumenChartLabels>, formatter: (value: number) => string) => string;
|
|
7
|
+
export type BoxPlotStatisticLabels = LumenBoxPlotStatisticLabels;
|
|
8
|
+
export declare const boxPlotHtml: (element: HTMLElement, data: readonly LumenBoxPlotDatum[], text: Readonly<LumenChartLabels>, formatter: (value: number) => string, statisticLabels: Partial<BoxPlotStatisticLabels>) => string;
|
|
9
|
+
//# sourceMappingURL=expanded-chart-html.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expanded-chart-html.d.ts","sourceRoot":"","sources":["../src/expanded-chart-html.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+L,KAAK,iBAAiB,EAAE,KAAK,2BAA2B,EAAE,KAAK,yBAAyB,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAe3W,eAAO,MAAM,wBAAwB,GAAI,QAAQ,MAAM,GAAG,IAAI,yCAA6E,CAAA;AAC3I,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,GAAG,IAAI,gCAA6E,CAAA;AAClI,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,GAAG,IAAI,iCAAqH,CAAA;AAQ3K,eAAO,MAAM,mBAAmB,GAC9B,SAAS,WAAW,EACpB,MAAM,SAAS,yBAAyB,EAAE,EAC1C,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAChC,WAAW,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACpC,eAAe,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EACvC,UAAU,SAAS,MAAM,EAAE,KAC1B,MAgBF,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,SAAS,WAAW,EACpB,MAAM,SAAS,gBAAgB,EAAE,EACjC,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAChC,WAAW,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,KACnC,MASF,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,2BAA2B,CAAA;AAIhE,eAAO,MAAM,WAAW,GACtB,SAAS,WAAW,EACpB,MAAM,SAAS,iBAAiB,EAAE,EAClC,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAChC,WAAW,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACpC,iBAAiB,OAAO,CAAC,sBAAsB,CAAC,KAC/C,MAqBF,CAAA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { createLumenBoxPlotGeometry, createLumenCalendarHeatmapGeometry, createLumenFunnelGeometry, getLumenChartToneClassName, isLumenBoxPlotDatum, isLumenCalendarHeatmapDatum, isLumenFunnelDatum } from '@santi020k/lumen-core';
|
|
2
|
+
import { bulletNumberAttribute } from './bullet-chart-html.js';
|
|
3
|
+
import { escapeChartHtml as escape } from './chart-html.js';
|
|
4
|
+
const parseData = (source, guard, invalid) => {
|
|
5
|
+
try {
|
|
6
|
+
const value = JSON.parse(source ?? '[]');
|
|
7
|
+
if (Array.isArray(value) && value.every(guard))
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
catch { }
|
|
11
|
+
return [invalid];
|
|
12
|
+
};
|
|
13
|
+
export const parseCalendarHeatmapData = (source) => parseData(source, isLumenCalendarHeatmapDatum, { date: '', value: NaN });
|
|
14
|
+
export const parseFunnelData = (source) => parseData(source, isLumenFunnelDatum, { id: '', label: '', value: NaN });
|
|
15
|
+
export const parseBoxPlotData = (source) => parseData(source, isLumenBoxPlotDatum, { id: '', label: '', min: NaN, q1: NaN, median: NaN, q3: NaN, max: NaN });
|
|
16
|
+
const domainFor = (element) => element.hasAttribute('domain-min') || element.hasAttribute('domain-max') ? { min: bulletNumberAttribute(element, 'domain-min'), max: bulletNumberAttribute(element, 'domain-max') } : undefined;
|
|
17
|
+
const calendarRange = (element, formatter) => `${formatter(element.getAttribute('start-date') ?? '')} – ${formatter(element.getAttribute('end-date') ?? '')}`;
|
|
18
|
+
const status = (message) => `<p class="ui-chart__empty" role="status">${escape(message)}</p>`;
|
|
19
|
+
const summary = (element, value) => `<p class="ui-sr-only" data-ui-chart-summary>${escape(element.getAttribute('summary') ?? value)}</p>`;
|
|
20
|
+
const table = (element, text, headings, rows) => element.getAttribute('show-table') === 'false' ? '' : `<details class="ui-chart__data"><summary>${escape(text.viewData)}</summary><div role="group" tabindex="0" aria-label="${escape(text.chartData)}"><table><thead><tr>${headings.map(heading => `<th scope="col">${escape(heading)}</th>`).join('')}</tr></thead><tbody>${rows.map(row => `<tr>${row.map((cell, index) => index === 0 ? `<th scope="row">${escape(cell)}</th>` : `<td>${escape(cell)}</td>`).join('')}</tr>`).join('')}</tbody></table></div></details>`;
|
|
21
|
+
export const calendarHeatmapHtml = (element, data, text, formatter, dateFormatter, weekdays) => {
|
|
22
|
+
const weekStartsOn = element.hasAttribute('week-starts-on') ? bulletNumberAttribute(element, 'week-starts-on') : 0;
|
|
23
|
+
if (weekStartsOn !== 0 && weekStartsOn !== 1)
|
|
24
|
+
return status(text.invalidData);
|
|
25
|
+
const model = createLumenCalendarHeatmapGeometry(data, { startDate: element.getAttribute('start-date') ?? '', endDate: element.getAttribute('end-date') ?? '', weekStartsOn, domain: domainFor(element) });
|
|
26
|
+
if (!model.valid)
|
|
27
|
+
return status(text.invalidData);
|
|
28
|
+
const format = (value) => value === null ? text.notAvailable : formatter(value);
|
|
29
|
+
const available = model.cells.filter(cell => cell.value !== null).length;
|
|
30
|
+
const weekdayNames = Array.from({ length: 7 }, (_, day) => `<text class="ui-calendar-heatmap__weekday" x="0" y="${day * 18 + 16}">${escape(weekdays[(day + weekStartsOn) % 7] ?? '')}</text>`).join('');
|
|
31
|
+
const cells = model.cells.map(cell => `<g><rect class="ui-calendar-heatmap__cell ui-chart-tone--series-1"${cell.value === null ? ' data-missing="true"' : ''} x="${cell.week * 18 + 36}" y="${cell.day * 18 + 4}" width="14" height="14" rx="3" style="fill-opacity:${cell.ratio === null ? 1 : 0.15 + cell.ratio * 0.85}"><title>${escape(`${dateFormatter(cell.date)}: ${format(cell.value)}`)}</title></rect>${cell.value === null ? `<text class="ui-calendar-heatmap__missing" x="${cell.week * 18 + 43}" y="${cell.day * 18 + 15}" text-anchor="middle">×</text>` : ''}</g>`).join('');
|
|
32
|
+
const dates = model.cells.filter(cell => cell.day === 0 && cell.week % 4 === 0).map(cell => `<text class="ui-calendar-heatmap__weekday" x="${cell.week * 18 + 36}" y="142">${escape(cell.date.slice(5))}</text>`).join('');
|
|
33
|
+
return summary(element, text.formatHeatmapSummary(available)) + (available === 0 ? status(text.empty) : '') + `<p class="ui-calendar-heatmap__range">${escape(calendarRange(element, dateFormatter))}</p><div class="ui-calendar-heatmap__plot" role="group" tabindex="0" aria-label="${escape(text.chartData)}"><svg aria-hidden="true" width="${model.weekCount * 18 + 36}" height="146" viewBox="0 0 ${model.weekCount * 18 + 36} 146">${weekdayNames}${cells}${dates}</svg></div><div class="ui-calendar-heatmap__legend"><span>${escape(text.low)}: ${escape(formatter(model.domain.min))}</span><span>${escape(text.high)}: ${escape(formatter(model.domain.max))}</span><span class="ui-calendar-heatmap__scale" aria-hidden="true"></span><span>× ${escape(text.notAvailable)}</span></div>` + (element.getAttribute('show-table') === 'false' ? `<ul class="ui-sr-only">${model.cells.map(cell => `<li>${escape(dateFormatter(cell.date))}: ${escape(format(cell.value))}</li>`).join('')}</ul>` : '') + table(element, text, [text.category, text.value], model.cells.map(cell => [dateFormatter(cell.date), format(cell.value)]));
|
|
34
|
+
};
|
|
35
|
+
export const funnelChartHtml = (element, data, text, formatter) => {
|
|
36
|
+
const model = createLumenFunnelGeometry(data);
|
|
37
|
+
if (!model.valid || !model.rows.length)
|
|
38
|
+
return status(model.valid ? text.empty : text.invalidData);
|
|
39
|
+
const format = (value) => value === null ? text.notAvailable : formatter(value);
|
|
40
|
+
const rows = model.rows.map((row, index) => `<li class="${getLumenChartToneClassName(row.tone, index)}"><div class="ui-funnel-chart__label"><span>${escape(row.label)}</span><strong>${escape(format(row.value))}</strong></div><div class="ui-funnel-chart__track" aria-hidden="true">${row.ratio === null ? '' : `<span class="ui-funnel-chart__bar" style="width:${row.ratio * 100}%"></span>`}</div></li>`).join('');
|
|
41
|
+
return summary(element, model.rows.map(row => `${row.label}: ${format(row.value)}`).join('. ')) + `<ol class="ui-funnel-chart__rows">${rows}</ol>` + table(element, text, [text.category, text.value], model.rows.map(row => [row.label, format(row.value)]));
|
|
42
|
+
};
|
|
43
|
+
const defaultBoxPlotStatistics = { min: 'Lower whisker', q1: 'First quartile', median: 'Median', q3: 'Third quartile', max: 'Upper whisker', outliers: 'Outliers' };
|
|
44
|
+
export const boxPlotHtml = (element, data, text, formatter, statisticLabels) => {
|
|
45
|
+
const model = createLumenBoxPlotGeometry(data, { domain: domainFor(element) });
|
|
46
|
+
if (!model.valid || !model.rows.length)
|
|
47
|
+
return status(model.valid ? text.empty : text.invalidData);
|
|
48
|
+
const stats = { ...defaultBoxPlotStatistics, ...statisticLabels };
|
|
49
|
+
const keys = ['min', 'q1', 'median', 'q3', 'max'];
|
|
50
|
+
const format = (value) => value === null ? text.notAvailable : formatter(value);
|
|
51
|
+
const exactRows = model.rows.map(row => `${row.label}: ${keys.map(key => `${stats[key]}: ${format(row[key])}`).join(', ')}. ${stats.outliers}: ${(row.outliers ?? []).map(formatter).join(', ') || '—'}`);
|
|
52
|
+
const rows = model.rows.map((row, index) => {
|
|
53
|
+
const whisker = row.minPosition !== null && row.maxPosition !== null ? `<span class="ui-box-plot__whisker" style="left:${row.minPosition * 100}%;width:${(row.maxPosition - row.minPosition) * 100}%"></span>` : '';
|
|
54
|
+
const box = row.q1Position !== null && row.q3Position !== null ? `<span class="ui-box-plot__box" style="left:${row.q1Position * 100}%;width:${(row.q3Position - row.q1Position) * 100}%"></span>` : '';
|
|
55
|
+
const median = row.medianPosition === null ? '' : `<span class="ui-box-plot__median" style="left:${row.medianPosition * 100}%"></span>`;
|
|
56
|
+
const caps = [row.minPosition, row.maxPosition].map(position => position === null ? '' : `<span class="ui-box-plot__cap" style="left:${position * 100}%"></span>`).join('');
|
|
57
|
+
const outliers = row.outlierPositions.map(position => `<span class="ui-box-plot__outlier" style="left:${position * 100}%"></span>`).join('');
|
|
58
|
+
return `<li class="${getLumenChartToneClassName(row.tone, index)}"><div class="ui-box-plot__label"><span>${escape(row.label)}</span><strong>${escape(stats.median)}: ${escape(format(row.median))}</strong></div><div class="ui-box-plot__track" aria-hidden="true">${whisker}${box}${median}${caps}${outliers}</div></li>`;
|
|
59
|
+
}).join('');
|
|
60
|
+
return summary(element, exactRows.join('. ')) + `<ul class="ui-box-plot__rows">${rows}</ul><div class="ui-bullet-chart__ticks" aria-hidden="true">${model.ticks.map(tick => `<span>${escape(formatter(tick))}</span>`).join('')}</div>` + (element.getAttribute('show-table') === 'false' ? `<ul class="ui-sr-only">${exactRows.map(row => `<li>${escape(row)}</li>`).join('')}</ul>` : '') + table(element, text, [text.category, ...keys.map(key => stats[key]), stats.outliers], model.rows.map(row => [row.label, ...keys.map(key => format(row[key])), (row.outliers ?? []).map(formatter).join(', ') || '—']));
|
|
61
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export type { LumenChartDatumActionsElement } from './chart-activation.js';
|
|
1
2
|
export * from './define.js';
|
|
2
|
-
export type { LumenTabsChangeDetail, LumenTabsChangeEvent } from '@santi020k/lumen-core';
|
|
3
|
+
export type { LumenChartDatumActivationDetail, LumenTabsChangeDetail, LumenTabsChangeEvent } from '@santi020k/lumen-core';
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,uBAAuB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAA;AAC1E,cAAc,aAAa,CAAA;AAC3B,YAAY,EACV,+BAA+B,EAC/B,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,uBAAuB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@santi020k/lumen-elements",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -40,6 +40,10 @@
|
|
|
40
40
|
"types": "./dist/components/combobox.d.ts",
|
|
41
41
|
"import": "./dist/components/combobox.js"
|
|
42
42
|
},
|
|
43
|
+
"./components/image-comparison": {
|
|
44
|
+
"types": "./dist/components/image-comparison.d.ts",
|
|
45
|
+
"import": "./dist/components/image-comparison.js"
|
|
46
|
+
},
|
|
43
47
|
"./components/foundations": {
|
|
44
48
|
"types": "./dist/components/foundations.d.ts",
|
|
45
49
|
"import": "./dist/components/foundations.js"
|
|
@@ -47,7 +51,31 @@
|
|
|
47
51
|
"./styles.css": "./styles.css",
|
|
48
52
|
"./styles/critical.css": "./styles/critical.css",
|
|
49
53
|
"./layers.css": "./layers.css",
|
|
50
|
-
"./package.json": "./package.json"
|
|
54
|
+
"./package.json": "./package.json",
|
|
55
|
+
"./components/dashboard": {
|
|
56
|
+
"types": "./dist/components/dashboard.d.ts",
|
|
57
|
+
"import": "./dist/components/dashboard.js"
|
|
58
|
+
},
|
|
59
|
+
"./components/virtual-list": {
|
|
60
|
+
"types": "./dist/components/virtual-list.d.ts",
|
|
61
|
+
"import": "./dist/components/virtual-list.js"
|
|
62
|
+
},
|
|
63
|
+
"./components/device-frame": {
|
|
64
|
+
"types": "./dist/components/device-frame.d.ts",
|
|
65
|
+
"import": "./dist/components/device-frame.js"
|
|
66
|
+
},
|
|
67
|
+
"./components/world-map": {
|
|
68
|
+
"types": "./dist/components/world-map.d.ts",
|
|
69
|
+
"import": "./dist/components/world-map.js"
|
|
70
|
+
},
|
|
71
|
+
"./components/media-viewport": {
|
|
72
|
+
"types": "./dist/components/media-viewport.d.ts",
|
|
73
|
+
"import": "./dist/components/media-viewport.js"
|
|
74
|
+
},
|
|
75
|
+
"./components/media-selection": {
|
|
76
|
+
"types": "./dist/components/media-selection.d.ts",
|
|
77
|
+
"import": "./dist/components/media-selection.js"
|
|
78
|
+
}
|
|
51
79
|
},
|
|
52
80
|
"files": [
|
|
53
81
|
"bin",
|
|
@@ -62,16 +90,16 @@
|
|
|
62
90
|
"lumen": "./bin/lumen.mjs"
|
|
63
91
|
},
|
|
64
92
|
"dependencies": {
|
|
65
|
-
"@santi020k/lumen": "^
|
|
66
|
-
"@santi020k/lumen-core": "^
|
|
93
|
+
"@santi020k/lumen": "^4.1.0",
|
|
94
|
+
"@santi020k/lumen-core": "^4.1.0"
|
|
67
95
|
},
|
|
68
96
|
"devDependencies": {
|
|
69
|
-
"@vitest/coverage-v8": "^5.0.
|
|
97
|
+
"@vitest/coverage-v8": "^5.0.3",
|
|
70
98
|
"axe-core": "^4.13.0",
|
|
71
99
|
"esbuild": "^0.28.2",
|
|
72
100
|
"jsdom": "^30.1.1",
|
|
73
101
|
"typescript": "~6.0.3",
|
|
74
|
-
"vitest": "^5.0.
|
|
102
|
+
"vitest": "^5.0.3"
|
|
75
103
|
},
|
|
76
104
|
"engines": {
|
|
77
105
|
"node": ">=22.12.0"
|