@k2b/ui 0.22.0 → 0.23.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.
Files changed (98) hide show
  1. package/dist/browser/content/Calendar.js +1086 -1049
  2. package/dist/browser/content/Calendar.js.map +1 -1
  3. package/dist/browser/content/CalendarDayView.js +1187 -0
  4. package/dist/browser/content/CalendarDayView.js.map +1 -0
  5. package/dist/browser/content/CalendarWeekView.js +1571 -0
  6. package/dist/browser/content/CalendarWeekView.js.map +1 -0
  7. package/dist/browser/content/ChartExplorer.js +174 -82
  8. package/dist/browser/content/ChartExplorer.js.map +1 -1
  9. package/dist/browser/content/ChartFilterControls.js +90 -33
  10. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  11. package/dist/browser/content/DataTable.js +199 -171
  12. package/dist/browser/content/DataTable.js.map +1 -1
  13. package/dist/browser/content/calendar-day-scroll.js +98 -0
  14. package/dist/browser/content/calendar-day-scroll.js.map +1 -0
  15. package/dist/browser/content/calendar-days.js +408 -0
  16. package/dist/browser/content/calendar-days.js.map +1 -0
  17. package/dist/browser/content/calendar-dialogs.js +236 -0
  18. package/dist/browser/content/calendar-dialogs.js.map +1 -0
  19. package/dist/browser/content/calendar-messages.js +210 -2
  20. package/dist/browser/content/calendar-messages.js.map +1 -1
  21. package/dist/browser/content/calendar-pointer.js +15 -3
  22. package/dist/browser/content/calendar-pointer.js.map +1 -1
  23. package/dist/browser/content/calendar-shared.js +328 -0
  24. package/dist/browser/content/calendar-shared.js.map +1 -0
  25. package/dist/browser/content/calendar-time-view.js +1649 -0
  26. package/dist/browser/content/calendar-time-view.js.map +1 -0
  27. package/dist/browser/content/chart-messages.js +10 -0
  28. package/dist/browser/content/chart-messages.js.map +1 -1
  29. package/dist/browser/content/index.js.map +1 -1
  30. package/dist/browser/inputs/Combobox.js +0 -1
  31. package/dist/browser/inputs/Combobox.js.map +1 -1
  32. package/dist/browser/layout/AppWorkspace.js +123 -97
  33. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  34. package/dist/browser/layout/PageTitle.js +4 -1
  35. package/dist/browser/layout/PageTitle.js.map +1 -1
  36. package/dist/browser/layout/app-workspace-controller.js +164 -86
  37. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  38. package/dist/browser/surfaces/StatCell.js +18 -6
  39. package/dist/browser/surfaces/StatCell.js.map +1 -1
  40. package/dist/ssr/content/Calendar.js +524 -335
  41. package/dist/ssr/content/Calendar.js.map +1 -1
  42. package/dist/ssr/content/CalendarDayView.js +800 -0
  43. package/dist/ssr/content/CalendarDayView.js.map +1 -0
  44. package/dist/ssr/content/CalendarWeekView.js +1069 -0
  45. package/dist/ssr/content/CalendarWeekView.js.map +1 -0
  46. package/dist/ssr/content/ChartExplorer.js +93 -34
  47. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  48. package/dist/ssr/content/ChartFilterControls.js +49 -7
  49. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  50. package/dist/ssr/content/DataTable.js +69 -51
  51. package/dist/ssr/content/DataTable.js.map +1 -1
  52. package/dist/ssr/content/calendar-day-scroll.js +98 -0
  53. package/dist/ssr/content/calendar-day-scroll.js.map +1 -0
  54. package/dist/ssr/content/calendar-days.js +408 -0
  55. package/dist/ssr/content/calendar-days.js.map +1 -0
  56. package/dist/ssr/content/calendar-dialogs.js +159 -0
  57. package/dist/ssr/content/calendar-dialogs.js.map +1 -0
  58. package/dist/ssr/content/calendar-messages.js +210 -2
  59. package/dist/ssr/content/calendar-messages.js.map +1 -1
  60. package/dist/ssr/content/calendar-pointer.js +15 -3
  61. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  62. package/dist/ssr/content/calendar-shared.js +261 -0
  63. package/dist/ssr/content/calendar-shared.js.map +1 -0
  64. package/dist/ssr/content/calendar-time-view.js +1306 -0
  65. package/dist/ssr/content/calendar-time-view.js.map +1 -0
  66. package/dist/ssr/content/chart-messages.js +10 -0
  67. package/dist/ssr/content/chart-messages.js.map +1 -1
  68. package/dist/ssr/content/index.js.map +1 -1
  69. package/dist/ssr/inputs/Combobox.js.map +1 -1
  70. package/dist/ssr/layout/AppWorkspace.js +38 -29
  71. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  72. package/dist/ssr/layout/PageTitle.js +4 -1
  73. package/dist/ssr/layout/PageTitle.js.map +1 -1
  74. package/dist/ssr/layout/app-workspace-controller.js +164 -86
  75. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  76. package/dist/ssr/surfaces/StatCell.js +2 -2
  77. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  78. package/dist/styles.css +1 -1
  79. package/dist/types/content/Calendar.d.ts +91 -0
  80. package/dist/types/content/CalendarDayView.d.ts +7 -0
  81. package/dist/types/content/CalendarWeekView.d.ts +7 -0
  82. package/dist/types/content/ChartExplorer.d.ts +36 -1
  83. package/dist/types/content/ChartFilterControls.d.ts +6 -1
  84. package/dist/types/content/DataTable.d.ts +5 -0
  85. package/dist/types/content/calendar-day-scroll.d.ts +42 -0
  86. package/dist/types/content/calendar-days.d.ts +192 -0
  87. package/dist/types/content/calendar-dialogs.d.ts +22 -0
  88. package/dist/types/content/calendar-messages.d.ts +99 -0
  89. package/dist/types/content/calendar-pointer.d.ts +9 -0
  90. package/dist/types/content/calendar-shared.d.ts +69 -0
  91. package/dist/types/content/calendar-time-view.d.ts +252 -0
  92. package/dist/types/content/chart-messages.d.ts +5 -0
  93. package/dist/types/content/index.d.ts +2 -2
  94. package/dist/types/layout/AppWorkspace.d.ts +25 -3
  95. package/dist/types/layout/PageTitle.d.ts +2 -1
  96. package/dist/types/layout/app-workspace-controller.d.ts +9 -1
  97. package/dist/types/surfaces/StatCell.d.ts +5 -0
  98. package/package.json +1 -1
@@ -1,22 +1,26 @@
1
1
  import { template as _$template } from "solid-js/web";
2
- import { memo as _$memo } from "solid-js/web";
3
2
  import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
4
3
  import { className as _$className } from "solid-js/web";
5
4
  import { effect as _$effect } from "solid-js/web";
5
+ import { memo as _$memo } from "solid-js/web";
6
6
  import { getNextMarker as _$getNextMarker } from "solid-js/web";
7
- import { createComponent as _$createComponent } from "solid-js/web";
8
7
  import { getNextElement as _$getNextElement } from "solid-js/web";
9
8
  import { insert as _$insert } from "solid-js/web";
9
+ import { createComponent as _$createComponent } from "solid-js/web";
10
10
  import { setAttribute as _$setAttribute } from "solid-js/web";
11
11
  var _tmpl$ = /*#__PURE__*/_$template(`<div>`),
12
12
  _tmpl$2 = /*#__PURE__*/_$template(`<span role=alert>`),
13
- _tmpl$3 = /*#__PURE__*/_$template(`<div class=k2b-chart-explorer__details aria-live=polite>`),
14
- _tmpl$4 = /*#__PURE__*/_$template(`<section><header class=k2b-chart-explorer__header><div><h3></h3><!$><!/></div><div class=k2b-chart-explorer__actions><!$><!/><!$><!/></div></header><!$><!/><div class=k2b-chart-explorer__viewport></div><!$><!/>`),
15
- _tmpl$5 = /*#__PURE__*/_$template(`<div class=k2b-chart__empty>`),
16
- _tmpl$6 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
17
- _tmpl$7 = /*#__PURE__*/_$template(`<i class="ti ti-x"aria-hidden=true>`),
18
- _tmpl$8 = /*#__PURE__*/_$template(`<div class=k2b-chart-explorer__detail-header><span></span><!$><!/>`);
19
- import { createEffect, createMemo, createSignal, createUniqueId, Show } from "solid-js";
13
+ _tmpl$3 = /*#__PURE__*/_$template(`<ul class=k2b-chart-legend>`),
14
+ _tmpl$4 = /*#__PURE__*/_$template(`<div class=k2b-chart-explorer__details aria-live=polite>`),
15
+ _tmpl$5 = /*#__PURE__*/_$template(`<section><header class=k2b-chart-explorer__header><div><!$><!/><!$><!/></div><div class=k2b-chart-explorer__actions><!$><!/><!$><!/></div></header><!$><!/><!$><!/><div class=k2b-chart-explorer__viewport></div><!$><!/>`),
16
+ _tmpl$6 = /*#__PURE__*/_$template(`<div class=k2b-chart__empty>`),
17
+ _tmpl$7 = /*#__PURE__*/_$template(`<p class=k2b-chart-explorer__note>`),
18
+ _tmpl$8 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
19
+ _tmpl$9 = /*#__PURE__*/_$template(`<li><span class=k2b-chart-legend__swatch aria-hidden=true></span><!$><!/>`),
20
+ _tmpl$0 = /*#__PURE__*/_$template(`<i class="ti ti-x"aria-hidden=true>`),
21
+ _tmpl$1 = /*#__PURE__*/_$template(`<div class=k2b-chart-explorer__detail-header><span></span><!$><!/>`);
22
+ import { createEffect, createMemo, createSignal, createUniqueId, For, Show } from "solid-js";
23
+ import { Dynamic } from "solid-js/web";
20
24
  import { Button, IconButton } from "../actions/Button";
21
25
  import { CopyButton } from "../actions/CopyButton";
22
26
  import { SelectChip } from "../inputs/SelectChip";
@@ -28,7 +32,13 @@ import { ChartSnapshotView } from "./ChartSnapshotView";
28
32
  import { validateChartExplorerData } from "./chart-explorer";
29
33
  import { useChartMessages } from "./chart-messages";
30
34
  import DataTable from "./DataTable";
31
- const tsvCell = value => /[\t\r\n"]/.test(value) ? `"${value.replaceAll('"', '""')}"` : value;
35
+
36
+ /** One legend entry; `color` is the palette index the renderer gave the series (0 is `--stdlib-chart-c1`). */
37
+
38
+ const tsvCell = (value, numeric = false) => {
39
+ const safe = !numeric && /^[=+\-@\t\r]/.test(value) ? `'${value}` : value;
40
+ return /[\t\r\n"]/.test(safe) ? `"${safe.replaceAll('"', '""')}"` : safe;
41
+ };
32
42
  export function ChartExplorer(props) {
33
43
  const messages = useUiMessages();
34
44
  const chartMessages = useChartMessages();
@@ -84,38 +94,70 @@ export function ChartExplorer(props) {
84
94
  return order.direction === "asc" ? comparison : -comparison;
85
95
  });
86
96
  });
87
- const copyText = () => [props.columns.map(c => tsvCell(c.label)).join("\t"), ...rows().map(row => props.columns.map(c => tsvCell(c.value(row))).join("\t"))].join("\n");
97
+ const shownRows = () => props.tableRows === undefined ? rows() : rows().slice(0, props.tableRows);
98
+ // Chart ids are data; a prefix keeps one named "table" apart from the table entry.
99
+ const switcherValue = () => view() === "table" || !props.charts?.length ? view() : `chart:${props.chart ?? props.charts[0]?.id}`;
100
+ const switcherOptions = () => props.charts?.length ? [...props.charts.map(chart => ({
101
+ value: `chart:${chart.id}`,
102
+ label: chart.label
103
+ })), {
104
+ value: "table",
105
+ label: chartMessages().chartData
106
+ }] : [{
107
+ value: "chart",
108
+ label: chartMessages().chartDiagram
109
+ }, {
110
+ value: "table",
111
+ label: chartMessages().chartData
112
+ }];
113
+ const pick = value => {
114
+ if (value === "table" || value === "chart") return setView(value);
115
+ setView("chart");
116
+ props.onChartChange?.(value.slice("chart:".length));
117
+ };
118
+ const copyText = () => [props.columns.map(c => tsvCell(c.label)).join("\t"), ...rows().map(row => props.columns.map(c => tsvCell(c.value(row), typeof c.sortValue?.(row) === "number")).join("\t"))].join("\n");
88
119
  return (() => {
89
- var _el$ = _$getNextElement(_tmpl$4),
120
+ var _el$ = _$getNextElement(_tmpl$5),
90
121
  _el$2 = _el$.firstChild,
91
122
  _el$3 = _el$2.firstChild,
92
- _el$4 = _el$3.firstChild,
93
- _el$6 = _el$4.nextSibling,
94
- [_el$7, _co$] = _$getNextMarker(_el$6.nextSibling),
95
- _el$8 = _el$3.nextSibling,
96
- _el$9 = _el$8.firstChild,
97
- [_el$0, _co$2] = _$getNextMarker(_el$9.nextSibling),
98
- _el$1 = _el$0.nextSibling,
99
- [_el$10, _co$3] = _$getNextMarker(_el$1.nextSibling),
100
- _el$14 = _el$2.nextSibling,
101
- [_el$15, _co$4] = _$getNextMarker(_el$14.nextSibling),
102
- _el$12 = _el$15.nextSibling,
103
- _el$16 = _el$12.nextSibling,
104
- [_el$17, _co$5] = _$getNextMarker(_el$16.nextSibling);
123
+ _el$5 = _el$3.firstChild,
124
+ [_el$6, _co$] = _$getNextMarker(_el$5.nextSibling),
125
+ _el$7 = _el$6.nextSibling,
126
+ [_el$8, _co$2] = _$getNextMarker(_el$7.nextSibling),
127
+ _el$9 = _el$3.nextSibling,
128
+ _el$0 = _el$9.firstChild,
129
+ [_el$1, _co$3] = _$getNextMarker(_el$0.nextSibling),
130
+ _el$10 = _el$1.nextSibling,
131
+ [_el$11, _co$4] = _$getNextMarker(_el$10.nextSibling),
132
+ _el$16 = _el$2.nextSibling,
133
+ [_el$17, _co$5] = _$getNextMarker(_el$16.nextSibling),
134
+ _el$18 = _el$17.nextSibling,
135
+ [_el$19, _co$6] = _$getNextMarker(_el$18.nextSibling),
136
+ _el$13 = _el$19.nextSibling,
137
+ _el$20 = _el$13.nextSibling,
138
+ [_el$21, _co$7] = _$getNextMarker(_el$20.nextSibling);
105
139
  _$setAttribute(_el$, "aria-labelledby", id);
106
- _$setAttribute(_el$4, "id", id);
107
- _$insert(_el$4, () => props.title);
140
+ _$insert(_el$3, _$createComponent(Dynamic, {
141
+ get component() {
142
+ return `h${props.headingLevel ?? 3}`;
143
+ },
144
+ id: id,
145
+ "class": "k2b-chart-explorer__title",
146
+ get children() {
147
+ return props.title;
148
+ }
149
+ }), _el$6, _co$);
108
150
  _$insert(_el$3, _$createComponent(Show, {
109
151
  get when() {
110
152
  return props.description;
111
153
  },
112
154
  get children() {
113
- var _el$5 = _$getNextElement(_tmpl$);
114
- _$insert(_el$5, () => props.description);
115
- return _el$5;
155
+ var _el$4 = _$getNextElement(_tmpl$);
156
+ _$insert(_el$4, () => props.description);
157
+ return _el$4;
116
158
  }
117
- }), _el$7, _co$);
118
- _$insert(_el$8, _$createComponent(CopyButton, {
159
+ }), _el$8, _co$2);
160
+ _$insert(_el$9, _$createComponent(CopyButton, {
119
161
  get text() {
120
162
  return copyText();
121
163
  },
@@ -130,44 +172,39 @@ export function ChartExplorer(props) {
130
172
  },
131
173
  onCopyError: () => setCopyFailed(true),
132
174
  onCopied: () => setCopyFailed(false)
133
- }), _el$0, _co$2);
134
- _$insert(_el$8, _$createComponent(SelectChip, {
175
+ }), _el$1, _co$3);
176
+ _$insert(_el$9, _$createComponent(SelectChip, {
135
177
  get value() {
136
- return view();
178
+ return switcherValue();
137
179
  },
138
- onValueChange: setView,
180
+ onValueChange: pick,
139
181
  get ["aria-label"]() {
140
182
  return chartMessages().chartView;
141
183
  },
142
184
  get options() {
143
- return [{
144
- value: "chart",
145
- label: chartMessages().chartDiagram
146
- }, {
147
- value: "table",
148
- label: chartMessages().chartData
149
- }];
185
+ return switcherOptions();
150
186
  }
151
- }), _el$10, _co$3);
187
+ }), _el$11, _co$4);
152
188
  _$insert(_el$, _$createComponent(Show, {
153
189
  get when() {
154
190
  return copyFailed();
155
191
  },
156
192
  get children() {
157
- var _el$11 = _$getNextElement(_tmpl$2);
158
- _$insert(_el$11, () => chartMessages().chartCopyFailed);
159
- return _el$11;
193
+ var _el$12 = _$getNextElement(_tmpl$2);
194
+ _$insert(_el$12, () => chartMessages().chartCopyFailed);
195
+ return _el$12;
160
196
  }
161
- }), _el$15, _co$4);
162
- _$insert(_el$12, _$createComponent(Show, {
197
+ }), _el$17, _co$5);
198
+ _$insert(_el$, () => props.controls, _el$19, _co$6);
199
+ _$insert(_el$13, _$createComponent(Show, {
163
200
  get when() {
164
201
  return data().rows.length > 0;
165
202
  },
166
203
  get fallback() {
167
204
  return (() => {
168
- var _el$18 = _$getNextElement(_tmpl$5);
169
- _$insert(_el$18, () => messages().noData);
170
- return _el$18;
205
+ var _el$22 = _$getNextElement(_tmpl$6);
206
+ _$insert(_el$22, () => props.empty ?? messages().noData);
207
+ return _el$22;
171
208
  })();
172
209
  },
173
210
  get children() {
@@ -176,9 +213,9 @@ export function ChartExplorer(props) {
176
213
  return view() === "chart";
177
214
  },
178
215
  get fallback() {
179
- return _$createComponent(DataTable, {
216
+ return [_$createComponent(DataTable, {
180
217
  get rows() {
181
- return rows();
218
+ return shownRows();
182
219
  },
183
220
  get columns() {
184
221
  return props.columns.map(column => ({
@@ -208,7 +245,7 @@ export function ChartExplorer(props) {
208
245
  }) => {
209
246
  const custom = props.columns.find(column => column.id === col.id)?.render;
210
247
  const cell = () => custom ? custom(row) : render(value);
211
- return col.id === props.columns[0]?.id ? _$createComponent(Button, {
248
+ return !custom && col.id === props.columns[0]?.id ? _$createComponent(Button, {
212
249
  variant: "text",
213
250
  size: "sm",
214
251
  onClick: () => select(row.key),
@@ -229,25 +266,37 @@ export function ChartExplorer(props) {
229
266
  }),
230
267
  get children() {
231
268
  return [_$memo(() => props.columns.find(column => column.id === col.id)?.label), (() => {
232
- var _el$19 = _$getNextElement(_tmpl$6);
269
+ var _el$24 = _$getNextElement(_tmpl$8);
233
270
  _$effect(_p$ => {
234
- var _v$3 = `k2b-data-table__sort-icon ti ${sort()?.key === col.id && sort()?.direction === "asc" ? "ti-arrow-up" : "ti-arrow-down"}`,
235
- _v$4 = sort()?.key === col.id ? "true" : undefined;
236
- _v$3 !== _p$.e && _$className(_el$19, _p$.e = _v$3);
237
- _v$4 !== _p$.t && _$setAttribute(_el$19, "data-active", _p$.t = _v$4);
271
+ var _v$5 = `k2b-data-table__sort-icon ti ${sort()?.key === col.id && sort()?.direction === "asc" ? "ti-arrow-up" : "ti-arrow-down"}`,
272
+ _v$6 = sort()?.key === col.id ? "true" : undefined;
273
+ _v$5 !== _p$.e && _$className(_el$24, _p$.e = _v$5);
274
+ _v$6 !== _p$.t && _$setAttribute(_el$24, "data-active", _p$.t = _v$6);
238
275
  return _p$;
239
276
  }, {
240
277
  e: undefined,
241
278
  t: undefined
242
279
  });
243
- return _el$19;
280
+ return _el$24;
244
281
  })()];
245
282
  }
246
283
  }) : render()
247
- });
284
+ }), _$createComponent(Show, {
285
+ get when() {
286
+ return shownRows().length < rows().length;
287
+ },
288
+ get children() {
289
+ var _el$23 = _$getNextElement(_tmpl$7);
290
+ _$insert(_el$23, () => chartMessages().chartRowsShown({
291
+ shown: new Intl.NumberFormat(locale()).format(shownRows().length),
292
+ total: new Intl.NumberFormat(locale()).format(rows().length)
293
+ }));
294
+ return _el$23;
295
+ }
296
+ })];
248
297
  },
249
298
  get children() {
250
- return _$createComponent(ChartSnapshotView, {
299
+ return [_$createComponent(ChartSnapshotView, {
251
300
  get cursor() {
252
301
  return props.cursor;
253
302
  },
@@ -258,10 +307,47 @@ export function ChartExplorer(props) {
258
307
  return selected();
259
308
  },
260
309
  onSelect: select,
261
- style: {
262
- height: "100%"
310
+ get style() {
311
+ return props.legend?.length ? undefined : {
312
+ height: "100%"
313
+ };
263
314
  }
264
- });
315
+ }), _$createComponent(Show, {
316
+ get when() {
317
+ return props.legend?.length;
318
+ },
319
+ get children() {
320
+ var _el$14 = _$getNextElement(_tmpl$3);
321
+ _$insert(_el$14, _$createComponent(For, {
322
+ get each() {
323
+ return props.legend;
324
+ },
325
+ children: entry => (() => {
326
+ var _el$25 = _$getNextElement(_tmpl$9),
327
+ _el$26 = _el$25.firstChild,
328
+ _el$27 = _el$26.nextSibling,
329
+ [_el$28, _co$8] = _$getNextMarker(_el$27.nextSibling);
330
+ _$insert(_el$25, () => entry.label, _el$28, _co$8);
331
+ _$effect(_p$ => {
332
+ var _v$7 = entry.style && entry.style !== "solid" ? entry.style : undefined,
333
+ _v$8 = entry.reference ? "true" : undefined,
334
+ _v$9 = `var(--stdlib-chart-c${Math.abs(Math.trunc(entry.color)) % 8 + 1})`;
335
+ _v$7 !== _p$.e && _$setAttribute(_el$26, "data-style", _p$.e = _v$7);
336
+ _v$8 !== _p$.t && _$setAttribute(_el$26, "data-reference", _p$.t = _v$8);
337
+ _v$9 !== _p$.a && _$setStyleProperty(_el$26, "--k2b-chart-legend-color", _p$.a = _v$9);
338
+ return _p$;
339
+ }, {
340
+ e: undefined,
341
+ t: undefined,
342
+ a: undefined
343
+ });
344
+ return _el$25;
345
+ })()
346
+ }));
347
+ _$effect(() => _$setAttribute(_el$14, "aria-label", chartMessages().chartLegend));
348
+ return _el$14;
349
+ }
350
+ })];
265
351
  }
266
352
  });
267
353
  }
@@ -271,8 +357,8 @@ export function ChartExplorer(props) {
271
357
  return props.renderDetails !== false;
272
358
  },
273
359
  get children() {
274
- var _el$13 = _$getNextElement(_tmpl$3);
275
- _$insert(_el$13, _$createComponent(Show, {
360
+ var _el$15 = _$getNextElement(_tmpl$4);
361
+ _$insert(_el$15, _$createComponent(Show, {
276
362
  get when() {
277
363
  return selectedRow();
278
364
  },
@@ -280,12 +366,12 @@ export function ChartExplorer(props) {
280
366
  "class": "k2b-chart-explorer__detail-paper",
281
367
  get children() {
282
368
  return [(() => {
283
- var _el$20 = _$getNextElement(_tmpl$8),
284
- _el$21 = _el$20.firstChild,
285
- _el$23 = _el$21.nextSibling,
286
- [_el$24, _co$6] = _$getNextMarker(_el$23.nextSibling);
287
- _$insert(_el$21, () => chartMessages().chartSelectedDatum);
288
- _$insert(_el$20, _$createComponent(IconButton, {
369
+ var _el$29 = _$getNextElement(_tmpl$1),
370
+ _el$30 = _el$29.firstChild,
371
+ _el$32 = _el$30.nextSibling,
372
+ [_el$33, _co$9] = _$getNextMarker(_el$32.nextSibling);
373
+ _$insert(_el$30, () => chartMessages().chartSelectedDatum);
374
+ _$insert(_el$29, _$createComponent(IconButton, {
289
375
  variant: "text",
290
376
  size: "sm",
291
377
  get label() {
@@ -293,10 +379,10 @@ export function ChartExplorer(props) {
293
379
  },
294
380
  onClick: () => select(null),
295
381
  get children() {
296
- return _$getNextElement(_tmpl$7);
382
+ return _$getNextElement(_tmpl$0);
297
383
  }
298
- }), _el$24, _co$6);
299
- return _el$20;
384
+ }), _el$33, _co$9);
385
+ return _el$29;
300
386
  })(), _$memo(() => _$memo(() => !!props.renderDetails)() ? props.renderDetails(row()) : _$createComponent(DescriptionList, {
301
387
  columns: 3,
302
388
  size: "sm",
@@ -310,18 +396,24 @@ export function ChartExplorer(props) {
310
396
  }
311
397
  })
312
398
  }));
313
- return _el$13;
399
+ return _el$15;
314
400
  }
315
- }), _el$17, _co$5);
401
+ }), _el$21, _co$7);
316
402
  _$effect(_p$ => {
317
403
  var _v$ = `k2b-chart-explorer ${props.class ?? ""}`,
318
- _v$2 = props.height ?? "18rem";
404
+ _v$2 = view() === "chart" && props.legend?.length && data().rows.length > 0 ? "true" : undefined,
405
+ _v$3 = view() === "table" && shownRows().length < rows().length ? "true" : undefined,
406
+ _v$4 = props.height ?? "18rem";
319
407
  _v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
320
- _v$2 !== _p$.t && _$setStyleProperty(_el$12, "height", _p$.t = _v$2);
408
+ _v$2 !== _p$.t && _$setAttribute(_el$13, "data-legend", _p$.t = _v$2);
409
+ _v$3 !== _p$.a && _$setAttribute(_el$13, "data-capped", _p$.a = _v$3);
410
+ _v$4 !== _p$.o && _$setStyleProperty(_el$13, "height", _p$.o = _v$4);
321
411
  return _p$;
322
412
  }, {
323
413
  e: undefined,
324
- t: undefined
414
+ t: undefined,
415
+ a: undefined,
416
+ o: undefined
325
417
  });
326
418
  return _el$;
327
419
  })();
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/ChartExplorer.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, createUniqueId, type JSX, Show } from \"solid-js\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { CopyButton } from \"../actions/CopyButton\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { DescriptionList } from \"../surfaces/DescriptionList\";\nimport { Paper } from \"../surfaces/Paper\";\nimport { ChartSnapshotView } from \"./ChartSnapshotView\";\nimport type { ChartCursor } from \"./chart-cursor\";\nimport { type ChartExplorerData, type ChartExplorerRow, validateChartExplorerData } from \"./chart-explorer\";\nimport { useChartMessages } from \"./chart-messages\";\nimport DataTable, { type DataTableSort } from \"./DataTable\";\n\nexport type ChartExplorerColumn<T> = {\n id: string;\n label: string;\n value: (row: T) => string;\n /** Optional table cell presentation; value remains the plain text used for copy/details. */\n render?: (row: T) => JSX.Element;\n /** Explicit comparable value. Omit to leave the column unsortable. */\n sortValue?: (row: T) => string | number | null;\n align?: \"left\" | \"center\" | \"right\";\n};\nexport type ChartExplorerProps<T extends ChartExplorerRow> = {\n cursor?: ChartCursor;\n title: string;\n description?: JSX.Element;\n data: ChartExplorerData<T>;\n columns: readonly ChartExplorerColumn<T>[];\n view?: \"chart\" | \"table\";\n defaultView?: \"chart\" | \"table\";\n onViewChange?: (view: \"chart\" | \"table\") => void;\n sort?: DataTableSort | null;\n defaultSort?: DataTableSort | null;\n onSortChange?: (sort: DataTableSort | null) => void;\n selectedKey?: string | null;\n onSelectedKeyChange?: (key: string | null) => void;\n /** false hides the complete local detail area for a shared selection panel. */\n renderDetails?: false | ((row: T) => JSX.Element);\n height?: string;\n class?: string;\n};\n\nconst tsvCell = (value: string) => (/[\\t\\r\\n\"]/.test(value) ? `\"${value.replaceAll('\"', '\"\"')}\"` : value);\n\nexport function ChartExplorer<T extends ChartExplorerRow>(props: ChartExplorerProps<T>) {\n const messages = useUiMessages();\n const chartMessages = useChartMessages();\n const locale = useLocale();\n const id = `k2b-chart-explorer-${createUniqueId()}`;\n const data = () => props.data;\n const [copyFailed, setCopyFailed] = createSignal(false);\n const [localSelection, setLocalSelection] = createSignal<string | null>(null);\n const [localView, setLocalView] = createSignal(props.defaultView ?? \"chart\");\n const [localSort, setLocalSort] = createSignal<DataTableSort | null>(props.defaultSort ?? null);\n const view = () => props.view ?? localView();\n const sort = () => (props.sort === undefined ? localSort() : props.sort);\n const setView = (value: \"chart\" | \"table\") => {\n if (props.view === undefined) setLocalView(value);\n props.onViewChange?.(value);\n };\n const setSort = (value: DataTableSort | null) => {\n if (props.sort === undefined) setLocalSort(value);\n props.onSortChange?.(value);\n };\n const rowsByKey = createMemo(() => new Map(data().rows.map((row) => [row.key, row])));\n const rawSelected = () => (props.selectedKey !== undefined ? props.selectedKey : localSelection());\n const selected = () => (rowsByKey().has(rawSelected() ?? \"\") ? rawSelected() : null);\n const selectedRow = () => rowsByKey().get(selected() ?? \"\");\n const select = (key: string | null) => {\n if (key !== null && !rowsByKey().has(key)) return;\n setLocalSelection(key);\n props.onSelectedKeyChange?.(key);\n };\n if (\n !props.columns.length ||\n props.columns.some((column) => !column.id) ||\n new Set(props.columns.map((column) => column.id)).size !== props.columns.length\n ) {\n throw new Error(\"Chart columns require unique nonempty IDs and at least one column\");\n }\n validateChartExplorerData(data());\n createEffect(() => validateChartExplorerData(data()));\n createEffect(() => {\n if (props.selectedKey === undefined && rawSelected() !== null && selected() === null) select(null);\n });\n const rows = createMemo(() => {\n const result = [...data().rows];\n const order = sort();\n const column = props.columns.find((c) => c.id === order?.key);\n const value = column?.sortValue;\n if (!order || !value) return result;\n const collator = new Intl.Collator(locale(), { numeric: true });\n return result.sort((a, b) => {\n const av = value(a),\n bv = value(b);\n if (av === null) return bv === null ? 0 : 1;\n if (bv === null) return -1;\n const comparison = typeof av === \"number\" && typeof bv === \"number\" ? av - bv : collator.compare(String(av), String(bv));\n return order.direction === \"asc\" ? comparison : -comparison;\n });\n });\n const copyText = () =>\n [\n props.columns.map((c) => tsvCell(c.label)).join(\"\\t\"),\n ...rows().map((row) => props.columns.map((c) => tsvCell(c.value(row))).join(\"\\t\")),\n ].join(\"\\n\");\n return (\n <section class={`k2b-chart-explorer ${props.class ?? \"\"}`} aria-labelledby={id}>\n <header class=\"k2b-chart-explorer__header\">\n <div>\n <h3 id={id}>{props.title}</h3>\n <Show when={props.description}>\n <div>{props.description}</div>\n </Show>\n </div>\n <div class=\"k2b-chart-explorer__actions\">\n <CopyButton\n text={copyText()}\n label={chartMessages().chartCopyData}\n iconOnly\n size=\"sm\"\n variant=\"ghost\"\n disabled={!rows().length}\n onCopyError={() => setCopyFailed(true)}\n onCopied={() => setCopyFailed(false)}\n />\n <SelectChip<\"chart\" | \"table\">\n value={view()}\n onValueChange={setView}\n aria-label={chartMessages().chartView}\n options={[\n { value: \"chart\", label: chartMessages().chartDiagram },\n { value: \"table\", label: chartMessages().chartData },\n ]}\n />\n </div>\n </header>\n <Show when={copyFailed()}>\n <span role=\"alert\">{chartMessages().chartCopyFailed}</span>\n </Show>\n <div class=\"k2b-chart-explorer__viewport\" style={{ height: props.height ?? \"18rem\" }}>\n <Show when={data().rows.length > 0} fallback={<div class=\"k2b-chart__empty\">{messages().noData}</div>}>\n <Show\n when={view() === \"chart\"}\n fallback={\n <DataTable\n rows={rows()}\n columns={props.columns.map((column) => ({\n id: column.id,\n header: column.label,\n value: column.value,\n align: column.align,\n sortable: Boolean(column.sortValue),\n }))}\n ariaLabelledBy={id}\n getRowId={(row) => row.key}\n selectedRowId={selected()}\n sort={sort()}\n fillHeight\n surface=\"paper\"\n onRowClick={(row) => select(row.key)}\n renderCell={({ row, col, value, render }) => {\n const custom = props.columns.find((column) => column.id === col.id)?.render;\n const cell = () => (custom ? custom(row) : render(value));\n return col.id === props.columns[0]?.id ? (\n <Button variant=\"text\" size=\"sm\" onClick={() => select(row.key)}>\n {cell()}\n </Button>\n ) : (\n cell()\n );\n }}\n renderHeader={({ col, render }) =>\n col.sortable ? (\n <Button\n variant=\"text\"\n size=\"sm\"\n onClick={() =>\n setSort({\n key: col.id,\n direction: sort()?.key === col.id && sort()?.direction === \"asc\" ? \"desc\" : \"asc\",\n })\n }\n >\n {props.columns.find((column) => column.id === col.id)?.label}\n {/* The data table's own marker: inactive columns keep a dimmed arrow so the header reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${sort()?.key === col.id && sort()?.direction === \"asc\" ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={sort()?.key === col.id ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </Button>\n ) : (\n render()\n )\n }\n />\n }\n >\n <ChartSnapshotView\n cursor={props.cursor}\n snapshot={data().chart}\n selectedKey={selected()}\n onSelect={select}\n style={{ height: \"100%\" }}\n />\n </Show>\n </Show>\n </div>\n <Show when={props.renderDetails !== false}>\n <div class=\"k2b-chart-explorer__details\" aria-live=\"polite\">\n <Show when={selectedRow()}>\n {(row) => (\n <Paper class=\"k2b-chart-explorer__detail-paper\">\n <div class=\"k2b-chart-explorer__detail-header\">\n <span>{chartMessages().chartSelectedDatum}</span>\n <IconButton variant=\"text\" size=\"sm\" label={messages().clearSelection} onClick={() => select(null)}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n {props.renderDetails ? (\n props.renderDetails(row())\n ) : (\n <DescriptionList\n columns={3}\n size=\"sm\"\n items={props.columns.map((column) => ({\n term: column.label,\n description: column.value(row()),\n }))}\n />\n )}\n </Paper>\n )}\n </Show>\n </div>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/ChartExplorer.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, Show } from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { CopyButton } from \"../actions/CopyButton\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { DescriptionList } from \"../surfaces/DescriptionList\";\nimport { Paper } from \"../surfaces/Paper\";\nimport { ChartSnapshotView } from \"./ChartSnapshotView\";\nimport type { ChartCursor } from \"./chart-cursor\";\nimport { type ChartExplorerData, type ChartExplorerRow, validateChartExplorerData } from \"./chart-explorer\";\nimport { useChartMessages } from \"./chart-messages\";\nimport DataTable, { type DataTableSort } from \"./DataTable\";\n\nexport type ChartExplorerColumn<T> = {\n id: string;\n label: string;\n value: (row: T) => string;\n /** Optional table cell presentation; value remains the plain text used for copy/details. */\n render?: (row: T) => JSX.Element;\n /**\n * Explicit comparable value. Omit to leave the column unsortable.\n * Returning a number also exempts the cell from spreadsheet formula guarding on copy.\n */\n sortValue?: (row: T) => string | number | null;\n align?: \"left\" | \"center\" | \"right\";\n};\n/** One legend entry; `color` is the palette index the renderer gave the series (0 is `--stdlib-chart-c1`). */\nexport type ChartLegendEntry = {\n label: string;\n color: number;\n /** Line pattern of a line series; a solid series shows a filled swatch. */\n style?: \"solid\" | \"dashed\" | \"dotted\";\n /** A comparison series, drawn hollow like its marks. */\n reference?: boolean;\n};\nexport type ChartExplorerProps<T extends ChartExplorerRow> = {\n cursor?: ChartCursor;\n title: string;\n /** Level of the title heading. Defaults to 3; a chart inside a titled group of charts sits one level below it. */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n description?: JSX.Element;\n data: ChartExplorerData<T>;\n columns: readonly ChartExplorerColumn<T>[];\n view?: \"chart\" | \"table\";\n defaultView?: \"chart\" | \"table\";\n onViewChange?: (view: \"chart\" | \"table\") => void;\n /**\n * Several charts of the same rows. The switcher then lists each chart and the table; `chart` names the one `data`\n * holds, and `onChartChange` reports a pick, so the owner passes the matching data.\n */\n charts?: readonly { id: string; label: string }[];\n chart?: string;\n onChartChange?: (id: string) => void;\n /** Filter controls between the header and the viewport, such as ChartFilterControls. */\n controls?: JSX.Element;\n /** The table renders at most this many rows of the sorted order; sorting and Copy data use every row. */\n tableRows?: number;\n sort?: DataTableSort | null;\n defaultSort?: DataTableSort | null;\n onSortChange?: (sort: DataTableSort | null) => void;\n selectedKey?: string | null;\n onSelectedKeyChange?: (key: string | null) => void;\n /** false hides the complete local detail area for a shared selection panel. */\n renderDetails?: false | ((row: T) => JSX.Element);\n height?: string;\n /**\n * Series names below the chart, wrapping inside the fixed viewport height. Use it instead of the renderer's legend,\n * which draws in one row and runs out of narrow columns.\n */\n legend?: readonly ChartLegendEntry[];\n /** What the viewport shows without rows, for example while they load; defaults to \"No data\". */\n empty?: JSX.Element;\n class?: string;\n};\n\nconst tsvCell = (value: string, numeric = false) => {\n const safe = !numeric && /^[=+\\-@\\t\\r]/.test(value) ? `'${value}` : value;\n return /[\\t\\r\\n\"]/.test(safe) ? `\"${safe.replaceAll('\"', '\"\"')}\"` : safe;\n};\n\nexport function ChartExplorer<T extends ChartExplorerRow>(props: ChartExplorerProps<T>) {\n const messages = useUiMessages();\n const chartMessages = useChartMessages();\n const locale = useLocale();\n const id = `k2b-chart-explorer-${createUniqueId()}`;\n const data = () => props.data;\n const [copyFailed, setCopyFailed] = createSignal(false);\n const [localSelection, setLocalSelection] = createSignal<string | null>(null);\n const [localView, setLocalView] = createSignal(props.defaultView ?? \"chart\");\n const [localSort, setLocalSort] = createSignal<DataTableSort | null>(props.defaultSort ?? null);\n const view = () => props.view ?? localView();\n const sort = () => (props.sort === undefined ? localSort() : props.sort);\n const setView = (value: \"chart\" | \"table\") => {\n if (props.view === undefined) setLocalView(value);\n props.onViewChange?.(value);\n };\n const setSort = (value: DataTableSort | null) => {\n if (props.sort === undefined) setLocalSort(value);\n props.onSortChange?.(value);\n };\n const rowsByKey = createMemo(() => new Map(data().rows.map((row) => [row.key, row])));\n const rawSelected = () => (props.selectedKey !== undefined ? props.selectedKey : localSelection());\n const selected = () => (rowsByKey().has(rawSelected() ?? \"\") ? rawSelected() : null);\n const selectedRow = () => rowsByKey().get(selected() ?? \"\");\n const select = (key: string | null) => {\n if (key !== null && !rowsByKey().has(key)) return;\n setLocalSelection(key);\n props.onSelectedKeyChange?.(key);\n };\n if (\n !props.columns.length ||\n props.columns.some((column) => !column.id) ||\n new Set(props.columns.map((column) => column.id)).size !== props.columns.length\n ) {\n throw new Error(\"Chart columns require unique nonempty IDs and at least one column\");\n }\n validateChartExplorerData(data());\n createEffect(() => validateChartExplorerData(data()));\n createEffect(() => {\n if (props.selectedKey === undefined && rawSelected() !== null && selected() === null) select(null);\n });\n const rows = createMemo(() => {\n const result = [...data().rows];\n const order = sort();\n const column = props.columns.find((c) => c.id === order?.key);\n const value = column?.sortValue;\n if (!order || !value) return result;\n const collator = new Intl.Collator(locale(), { numeric: true });\n return result.sort((a, b) => {\n const av = value(a),\n bv = value(b);\n if (av === null) return bv === null ? 0 : 1;\n if (bv === null) return -1;\n const comparison = typeof av === \"number\" && typeof bv === \"number\" ? av - bv : collator.compare(String(av), String(bv));\n return order.direction === \"asc\" ? comparison : -comparison;\n });\n });\n const shownRows = () => (props.tableRows === undefined ? rows() : rows().slice(0, props.tableRows));\n // Chart ids are data; a prefix keeps one named \"table\" apart from the table entry.\n const switcherValue = () => (view() === \"table\" || !props.charts?.length ? view() : `chart:${props.chart ?? props.charts[0]?.id}`);\n const switcherOptions = () =>\n props.charts?.length\n ? [\n ...props.charts.map((chart) => ({ value: `chart:${chart.id}`, label: chart.label })),\n { value: \"table\", label: chartMessages().chartData },\n ]\n : [\n { value: \"chart\", label: chartMessages().chartDiagram },\n { value: \"table\", label: chartMessages().chartData },\n ];\n const pick = (value: string) => {\n if (value === \"table\" || value === \"chart\") return setView(value);\n setView(\"chart\");\n props.onChartChange?.(value.slice(\"chart:\".length));\n };\n const copyText = () =>\n [\n props.columns.map((c) => tsvCell(c.label)).join(\"\\t\"),\n ...rows().map((row) => props.columns.map((c) => tsvCell(c.value(row), typeof c.sortValue?.(row) === \"number\")).join(\"\\t\")),\n ].join(\"\\n\");\n return (\n <section class={`k2b-chart-explorer ${props.class ?? \"\"}`} aria-labelledby={id}>\n <header class=\"k2b-chart-explorer__header\">\n <div>\n <Dynamic component={`h${props.headingLevel ?? 3}`} id={id} class=\"k2b-chart-explorer__title\">\n {props.title}\n </Dynamic>\n <Show when={props.description}>\n <div>{props.description}</div>\n </Show>\n </div>\n <div class=\"k2b-chart-explorer__actions\">\n <CopyButton\n text={copyText()}\n label={chartMessages().chartCopyData}\n iconOnly\n size=\"sm\"\n variant=\"ghost\"\n disabled={!rows().length}\n onCopyError={() => setCopyFailed(true)}\n onCopied={() => setCopyFailed(false)}\n />\n <SelectChip<string>\n value={switcherValue()}\n onValueChange={pick}\n aria-label={chartMessages().chartView}\n options={switcherOptions()}\n />\n </div>\n </header>\n <Show when={copyFailed()}>\n <span role=\"alert\">{chartMessages().chartCopyFailed}</span>\n </Show>\n {props.controls}\n <div\n class=\"k2b-chart-explorer__viewport\"\n data-legend={view() === \"chart\" && props.legend?.length && data().rows.length > 0 ? \"true\" : undefined}\n data-capped={view() === \"table\" && shownRows().length < rows().length ? \"true\" : undefined}\n style={{ height: props.height ?? \"18rem\" }}\n >\n <Show when={data().rows.length > 0} fallback={<div class=\"k2b-chart__empty\">{props.empty ?? messages().noData}</div>}>\n <Show\n when={view() === \"chart\"}\n fallback={\n <>\n <DataTable\n rows={shownRows()}\n columns={props.columns.map((column) => ({\n id: column.id,\n header: column.label,\n value: column.value,\n align: column.align,\n sortable: Boolean(column.sortValue),\n }))}\n ariaLabelledBy={id}\n getRowId={(row) => row.key}\n selectedRowId={selected()}\n sort={sort()}\n fillHeight\n surface=\"paper\"\n onRowClick={(row) => select(row.key)}\n renderCell={({ row, col, value, render }) => {\n const custom = props.columns.find((column) => column.id === col.id)?.render;\n const cell = () => (custom ? custom(row) : render(value));\n return !custom && col.id === props.columns[0]?.id ? (\n <Button variant=\"text\" size=\"sm\" onClick={() => select(row.key)}>\n {cell()}\n </Button>\n ) : (\n cell()\n );\n }}\n renderHeader={({ col, render }) =>\n col.sortable ? (\n <Button\n variant=\"text\"\n size=\"sm\"\n onClick={() =>\n setSort({\n key: col.id,\n direction: sort()?.key === col.id && sort()?.direction === \"asc\" ? \"desc\" : \"asc\",\n })\n }\n >\n {props.columns.find((column) => column.id === col.id)?.label}\n {/* The data table's own marker: inactive columns keep a dimmed arrow so the header reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${sort()?.key === col.id && sort()?.direction === \"asc\" ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={sort()?.key === col.id ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </Button>\n ) : (\n render()\n )\n }\n />\n <Show when={shownRows().length < rows().length}>\n <p class=\"k2b-chart-explorer__note\">\n {chartMessages().chartRowsShown({\n shown: new Intl.NumberFormat(locale()).format(shownRows().length),\n total: new Intl.NumberFormat(locale()).format(rows().length),\n })}\n </p>\n </Show>\n </>\n }\n >\n <ChartSnapshotView\n cursor={props.cursor}\n snapshot={data().chart}\n selectedKey={selected()}\n onSelect={select}\n style={props.legend?.length ? undefined : { height: \"100%\" }}\n />\n <Show when={props.legend?.length}>\n <ul class=\"k2b-chart-legend\" aria-label={chartMessages().chartLegend}>\n <For each={props.legend}>\n {(entry) => (\n <li>\n <span\n class=\"k2b-chart-legend__swatch\"\n data-style={entry.style && entry.style !== \"solid\" ? entry.style : undefined}\n data-reference={entry.reference ? \"true\" : undefined}\n style={{ \"--k2b-chart-legend-color\": `var(--stdlib-chart-c${(Math.abs(Math.trunc(entry.color)) % 8) + 1})` }}\n aria-hidden=\"true\"\n />\n {entry.label}\n </li>\n )}\n </For>\n </ul>\n </Show>\n </Show>\n </Show>\n </div>\n <Show when={props.renderDetails !== false}>\n <div class=\"k2b-chart-explorer__details\" aria-live=\"polite\">\n <Show when={selectedRow()}>\n {(row) => (\n <Paper class=\"k2b-chart-explorer__detail-paper\">\n <div class=\"k2b-chart-explorer__detail-header\">\n <span>{chartMessages().chartSelectedDatum}</span>\n <IconButton variant=\"text\" size=\"sm\" label={messages().clearSelection} onClick={() => select(null)}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n {props.renderDetails ? (\n props.renderDetails(row())\n ) : (\n <DescriptionList\n columns={3}\n size=\"sm\"\n items={props.columns.map((column) => ({\n term: column.label,\n description: column.value(row()),\n }))}\n />\n )}\n </Paper>\n )}\n </Show>\n </div>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}