@getdom/studio 0.2.3 → 0.2.5
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/CHANGELOG.md +47 -0
- package/package.json +1 -1
- package/src/pages/charts/_shared/CompactChartTooltip.vue +39 -0
- package/src/pages/charts/_shared/XYChart.vue +7 -2
- package/src/pages/charts/_shared/XYRenderer.vue +18 -11
- package/src/pages/charts/sparkline/DomSparkline.vue +1 -0
- package/src/pages/data/data-grid/DataGridVirtualRows.vue +5 -1
- package/src/pages/data/data-grid/DomDataGrid.vue +47 -9
- package/src/pages/lib/vue/index.d.ts +12 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,52 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.5 - 2026-10-08
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Data grids support `layout="flush"` with application-owned `gutter-class`
|
|
8
|
+
padding, including responsive utilities and CSS variable values. Toolbar,
|
|
9
|
+
footer and outer header/body cell edges align while middle cells retain their
|
|
10
|
+
spacing. Works with ordinary and virtual rows.
|
|
11
|
+
- A copyable full-width article library example documents the layout contract.
|
|
12
|
+
|
|
13
|
+
### Upgrade notes
|
|
14
|
+
|
|
15
|
+
- Existing grids keep their card layout. Applications own the surrounding width
|
|
16
|
+
and negative margins; flush removes side borders, corner rounding and shadow.
|
|
17
|
+
|
|
18
|
+
## 0.2.4 - 2026-10-08
|
|
19
|
+
|
|
20
|
+
Reliable chart hover values and optional sparkline tooltips.
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- Opt-in sparkline tooltips with `tooltip`, showing the inspected label and
|
|
25
|
+
formatted series values on hover or keyboard navigation. The floating panel
|
|
26
|
+
stays outside the compact plot and escapes scrolling-table clipping.
|
|
27
|
+
- Website privacy policy and terms pages, linked from checkout and the footer.
|
|
28
|
+
|
|
29
|
+
### Improved
|
|
30
|
+
|
|
31
|
+
- Documentation explains how component source, runnable examples and reference
|
|
32
|
+
pages live together, and how that structure supports human and AI development.
|
|
33
|
+
|
|
34
|
+
### Fixed
|
|
35
|
+
|
|
36
|
+
- Line and area chart tooltips update as the pointer moves between data points,
|
|
37
|
+
without requiring a click. Clicking preserves and selects the hovered record.
|
|
38
|
+
- Shared chart bindings forward Unovis configuration using its expected names,
|
|
39
|
+
including crosshair callbacks and stacked-series inspection.
|
|
40
|
+
- Chart values dismiss when the crosshair leaves the plot.
|
|
41
|
+
- Website licence checkout no longer depends on email delivery being configured.
|
|
42
|
+
Existing installations receive a repair migration for missing licence columns.
|
|
43
|
+
|
|
44
|
+
### Upgrade notes
|
|
45
|
+
|
|
46
|
+
- Sparkline tooltips remain off by default. Add `tooltip` to `DomSparkline` to
|
|
47
|
+
enable them; existing value and label formatters also apply to the tooltip.
|
|
48
|
+
- Email-based licence claiming and recovery still require a configured sender.
|
|
49
|
+
|
|
3
50
|
## 0.2.3 - 2026-09-27
|
|
4
51
|
|
|
5
52
|
Searchable Google Fonts previews, shared paginated option lists, and more reliable
|
package/package.json
CHANGED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { onBeforeUnmount, onMounted, ref } from 'vue';
|
|
3
|
+
import { applyFloatingPosition, autoUpdateFloating } from '../../lib/headless/floating.js';
|
|
4
|
+
import ChartTooltip from './ChartTooltip.vue';
|
|
5
|
+
|
|
6
|
+
const props = defineProps({
|
|
7
|
+
anchor: { type: Object, required: true },
|
|
8
|
+
label: { type: String, default: '' },
|
|
9
|
+
items: { type: Array, default: () => [] },
|
|
10
|
+
});
|
|
11
|
+
const panel = ref(null);
|
|
12
|
+
let stopPositioning;
|
|
13
|
+
|
|
14
|
+
/** Positions the compact tooltip outside the plot and within the viewport. @returns {void} */
|
|
15
|
+
function position() {
|
|
16
|
+
applyFloatingPosition(props.anchor, panel.value, { placement: 'top', align: 'center', offset: 8, padding: 8 });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Opens in the top layer so table overflow cannot clip chart values. @returns {void} */
|
|
20
|
+
function open() {
|
|
21
|
+
panel.value.showPopover();
|
|
22
|
+
position();
|
|
23
|
+
stopPositioning = autoUpdateFloating(props.anchor, panel.value, position);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Releases scroll/resize observers when inspection ends or the chart unmounts. @returns {void} */
|
|
27
|
+
function cleanup() {
|
|
28
|
+
stopPositioning?.();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
onMounted(open);
|
|
32
|
+
onBeforeUnmount(cleanup);
|
|
33
|
+
</script>
|
|
34
|
+
|
|
35
|
+
<template>
|
|
36
|
+
<div ref="panel" popover="manual" class="pointer-events-none m-0 w-max max-w-[calc(100vw-1rem)] overflow-visible border-0 bg-transparent p-0 text-canvas-fg">
|
|
37
|
+
<ChartTooltip :label="label" :items="items" />
|
|
38
|
+
</div>
|
|
39
|
+
</template>
|
|
@@ -5,6 +5,7 @@ import { chartPoints, chartSeries, formatChartValue, percentagePoints } from './
|
|
|
5
5
|
import ChartContainer from './ChartContainer.vue';
|
|
6
6
|
import ChartLegend from './ChartLegend.vue';
|
|
7
7
|
import ChartTooltip from './ChartTooltip.vue';
|
|
8
|
+
import CompactChartTooltip from './CompactChartTooltip.vue';
|
|
8
9
|
|
|
9
10
|
const props = defineProps({
|
|
10
11
|
...chartProps,
|
|
@@ -13,12 +14,14 @@ const props = defineProps({
|
|
|
13
14
|
percentage: { type: Boolean, default: false },
|
|
14
15
|
horizontal: { type: Boolean, default: false },
|
|
15
16
|
compact: { type: Boolean, default: false },
|
|
17
|
+
tooltip: { type: Boolean, default: true },
|
|
16
18
|
});
|
|
17
19
|
const emit = defineEmits(['retry', 'select']);
|
|
18
20
|
const renderer = shallowRef(null);
|
|
19
21
|
const loadError = ref('');
|
|
20
22
|
const hiddenKeys = ref([]);
|
|
21
23
|
const inspected = ref(null);
|
|
24
|
+
const plot = ref(null);
|
|
22
25
|
let disposed = false;
|
|
23
26
|
const allSeries = computed(() => chartSeries(props.series));
|
|
24
27
|
const visibleSeries = computed(() => allSeries.value.filter((item) => !hiddenKeys.value.includes(item.key)));
|
|
@@ -108,16 +111,18 @@ function scrub(event) { inspected.value = points.value[Number(event.target.value
|
|
|
108
111
|
<template>
|
|
109
112
|
<ChartContainer :title="title" :description="description" :height="safeHeight" :compact="compact" :loading="loading" :error="error || validationError || loadError" :empty="!hasData" :empty-label="emptyLabel" @retry="retry">
|
|
110
113
|
<div
|
|
114
|
+
ref="plot"
|
|
111
115
|
class="relative rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
112
116
|
:style="{ height: `${safeHeight}px` }" tabindex="0" role="group"
|
|
113
117
|
:aria-label="`${title}. Use arrow keys to inspect values; Enter selects a row.`"
|
|
114
|
-
@keydown="navigate" @focus="inspect(points[0])" @blur="inspect(null)" @mouseleave="inspect(null)" @click="selectPoint"
|
|
118
|
+
@keydown="navigate" @focus="inspect(inspected || points[0])" @blur="inspect(null)" @mouseleave="inspect(null)" @click="selectPoint"
|
|
115
119
|
>
|
|
116
120
|
<div aria-hidden="true">
|
|
117
121
|
<component :is="renderer" v-if="renderer" :key="`${kind}-${horizontal}-${stacked}-${percentage}`" :points="renderPoints" :series="visibleSeries" :kind="kind" :height="safeHeight" :curve="curve" :stacked="stacked || percentage" :percentage="percentage" :horizontal="horizontal" :compact="compact" :grid="grid" :x-type="xType" :format-x="formatAxisLabel" :format-y="formatAxisValue" @inspect="inspect" />
|
|
118
122
|
<div v-else class="h-full w-full" />
|
|
119
123
|
</div>
|
|
120
|
-
<
|
|
124
|
+
<CompactChartTooltip v-if="inspected && tooltip && compact" :anchor="plot" :label="formatLabel(inspected.row[xKey])" :items="tooltipItems" />
|
|
125
|
+
<ChartTooltip v-else-if="inspected && tooltip" class="absolute right-2 top-2 z-10" :label="formatLabel(inspected.row[xKey])" :items="tooltipItems" />
|
|
121
126
|
<span class="sr-only" aria-live="polite">{{ inspected ? `${formatLabel(inspected.row[xKey])}: ${tooltipItems.map(item => `${item.label} ${item.value}`).join(', ')}` : '' }}</span>
|
|
122
127
|
</div>
|
|
123
128
|
<template #legend>
|
|
@@ -56,35 +56,42 @@ function getX(point) { return point.x; }
|
|
|
56
56
|
/** @param {unknown} _datum Unovis datum. @param {number} index Series index. @returns {string} Stable colour. */
|
|
57
57
|
function getColor(_datum, index) { return props.series[index]?.color || 'var(--primary)'; }
|
|
58
58
|
|
|
59
|
-
/**
|
|
60
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Synchronizes inspection with the crosshair, including plot-boundary dismissal.
|
|
61
|
+
* Unovis can retain the nearest datum while clearing the pointer coordinate.
|
|
62
|
+
* @param {number|Date|undefined} x Pointer coordinate; absent when hidden.
|
|
63
|
+
* @param {object|undefined} point Nearest datum.
|
|
64
|
+
* @returns {void}
|
|
65
|
+
*/
|
|
66
|
+
function inspectPoint(x, point) { emit('inspect', x == null ? null : point || null); }
|
|
61
67
|
|
|
62
68
|
/** @param {object} datum Bar or stack datum. @returns {void} Inspects horizontal and touch-selected bars. */
|
|
63
69
|
function inspectBar(datum) { emit('inspect', datum.datum || datum); }
|
|
64
70
|
</script>
|
|
65
71
|
|
|
66
72
|
<template>
|
|
73
|
+
<!-- Unovis 1.7 forwards undeclared attributes verbatim; config bindings must use camelCase. -->
|
|
67
74
|
<VisXYContainer
|
|
68
75
|
:data="points" :height="height" :duration="0" class="block w-full"
|
|
69
|
-
:
|
|
70
|
-
:
|
|
76
|
+
:xDomain="horizontal ? valueDomain : undefined" :yDomain="horizontal ? undefined : valueDomain"
|
|
77
|
+
:yDirection="horizontal ? 'south' : 'north'"
|
|
71
78
|
:margin="compact ? { top: 4, bottom: 4, left: 4, right: 4 } : { top: 12, right: 12 }"
|
|
72
79
|
>
|
|
73
80
|
<template v-if="kind === 'line'">
|
|
74
|
-
<VisLine v-for="(item, index) in series" :key="item.key" :x="getX" :y="accessors[index]" :color="item.color" :
|
|
81
|
+
<VisLine v-for="(item, index) in series" :key="item.key" :x="getX" :y="accessors[index]" :color="item.color" :curveType="curve" :lineWidth="2" :lineDashArray="item.dashed ? [5, 4] : undefined" :duration="0" />
|
|
75
82
|
<VisScatter v-if="points.length === 1" :x="getX" :y="accessors" :color="getColor" :size="24" :duration="0" />
|
|
76
83
|
</template>
|
|
77
84
|
<template v-else-if="kind === 'area'">
|
|
78
|
-
<VisArea v-if="stacked" :x="getX" :y="accessors" :color="getColor" :
|
|
79
|
-
<VisArea v-for="(item, index) in stacked ? [] : series" :key="item.key" :x="getX" :y="accessors[index]" :color="item.color" :
|
|
85
|
+
<VisArea v-if="stacked" :x="getX" :y="accessors" :color="getColor" :curveType="curve" :opacity="0.45" :duration="0" />
|
|
86
|
+
<VisArea v-for="(item, index) in stacked ? [] : series" :key="item.key" :x="getX" :y="accessors[index]" :color="item.color" :curveType="curve" :opacity="0.15" :line="true" :lineColor="item.color" :duration="0" />
|
|
80
87
|
</template>
|
|
81
88
|
<component
|
|
82
89
|
:is="stacked ? VisStackedBar : VisGroupedBar" v-else
|
|
83
90
|
:x="getX" :y="accessors" :color="getColor" :orientation="horizontal ? 'horizontal' : 'vertical'"
|
|
84
|
-
:
|
|
91
|
+
:barPadding="stacked ? 0.3 : 0.1" :groupPadding="0.3" :roundedCorners="3" :barMinHeight="0" :duration="0" :events="barEvents"
|
|
85
92
|
/>
|
|
86
|
-
<VisAxis v-if="!compact" :key="`category-${horizontal}`" :type="horizontal ? 'y' : 'x'" :
|
|
87
|
-
<VisAxis v-if="!compact" :key="`value-${horizontal}`" :type="horizontal ? 'x' : 'y'" :
|
|
88
|
-
<VisCrosshair v-if="!horizontal" :x="getX" :y="stacked ? [] : accessors" :
|
|
93
|
+
<VisAxis v-if="!compact" :key="`category-${horizontal}`" :type="horizontal ? 'y' : 'x'" :tickValues="categoryTicks" :tickFormat="formatX" :gridLine="false" :domainLine="false" :tickLine="false" :tickTextWidth="horizontal ? 90 : 72" :tickTextHideOverlapping="true" :tickTextAdaptiveSets="true" :duration="0" />
|
|
94
|
+
<VisAxis v-if="!compact" :key="`value-${horizontal}`" :type="horizontal ? 'x' : 'y'" :tickFormat="formatY" :gridLine="grid" :domainLine="false" :tickLine="false" :tickTextWidth="90" :tickTextHideOverlapping="true" :numTicks="4" :duration="0" />
|
|
95
|
+
<VisCrosshair v-if="!horizontal" :x="getX" :y="stacked ? [] : accessors" :yStacked="stacked ? accessors : undefined" :color="getColor" :hideWhenFarFromPointer="false" :onCrosshairMove="inspectPoint" :duration="0" />
|
|
89
96
|
</VisXYContainer>
|
|
90
97
|
</template>
|
|
@@ -21,6 +21,7 @@ const props = defineProps({
|
|
|
21
21
|
height: { type: Number, default: 48 },
|
|
22
22
|
legend: { type: Boolean, default: false },
|
|
23
23
|
showTable: { type: Boolean, default: false },
|
|
24
|
+
tooltip: { type: Boolean, default: false, _edit: { description: 'Show formatted values on hover or keyboard inspection in a floating tooltip outside the compact plot.' } },
|
|
24
25
|
});
|
|
25
26
|
defineEmits(['select', 'retry']);
|
|
26
27
|
</script>
|
|
@@ -7,6 +7,10 @@ defineOptions({
|
|
|
7
7
|
});
|
|
8
8
|
|
|
9
9
|
const props = defineProps({
|
|
10
|
+
gutterClass: {
|
|
11
|
+
type: String,
|
|
12
|
+
default: '',
|
|
13
|
+
},
|
|
10
14
|
rows: {
|
|
11
15
|
type: Array,
|
|
12
16
|
default: () => [],
|
|
@@ -168,7 +172,7 @@ function spacerStyle(height) {
|
|
|
168
172
|
v-for="item in renderedRows"
|
|
169
173
|
:key="resolvedRowKey(item.row, item.index)"
|
|
170
174
|
class="group bg-canvas transition hover:bg-secondary/45"
|
|
171
|
-
:class="rowSelected(item.row, item.index) && 'bg-sky-500/5'"
|
|
175
|
+
:class="[rowSelected(item.row, item.index) && 'bg-sky-500/5', gutterClass]"
|
|
172
176
|
:aria-rowindex="item.index + 1"
|
|
173
177
|
:aria-selected="rowSelected(item.row, item.index) || undefined"
|
|
174
178
|
:style="rowStyle()"
|
|
@@ -55,6 +55,16 @@
|
|
|
55
55
|
*/
|
|
56
56
|
|
|
57
57
|
export const dataGridProps = {
|
|
58
|
+
layout: {
|
|
59
|
+
type: String,
|
|
60
|
+
default: 'card',
|
|
61
|
+
_edit: { description: 'Card keeps the bordered container. Flush removes outer side borders, rounding and shadow; the application owns the surrounding width.', options: ['card', 'flush'] },
|
|
62
|
+
},
|
|
63
|
+
gutterClass: {
|
|
64
|
+
type: String,
|
|
65
|
+
default: 'px-3',
|
|
66
|
+
_edit: { description: 'Horizontal padding classes for flush toolbar, footer and outer cell edges, such as px-4 sm:px-6 or px-[var(--page-gutter)]. Ignored in card layout.' },
|
|
67
|
+
},
|
|
58
68
|
rows: {
|
|
59
69
|
type: Array,
|
|
60
70
|
default: () => [],
|
|
@@ -1178,10 +1188,12 @@ function onCellComponentAction(row, column, rowIndex, payload) {
|
|
|
1178
1188
|
|
|
1179
1189
|
<template>
|
|
1180
1190
|
<section
|
|
1181
|
-
class="dom-data-grid overflow-hidden
|
|
1191
|
+
class="dom-data-grid overflow-hidden border-border bg-canvas text-canvas-fg"
|
|
1192
|
+
:class="layout === 'flush' ? 'border-y' : 'rounded-lg border shadow-sm'"
|
|
1193
|
+
:data-layout="layout"
|
|
1182
1194
|
:aria-labelledby="titleId"
|
|
1183
1195
|
>
|
|
1184
|
-
<header v-if="toolbar" class="border-b border-border bg-secondary/35
|
|
1196
|
+
<header v-if="toolbar" class="border-b border-border bg-secondary/35 py-3" :class="layout === 'flush' ? gutterClass : 'px-3'">
|
|
1185
1197
|
<div class="flex flex-wrap items-center gap-3">
|
|
1186
1198
|
<div class="min-w-0 flex-1">
|
|
1187
1199
|
<h2 :id="titleId" class="truncate text-sm font-semibold tracking-tight text-canvas-fg">{{ title }}</h2>
|
|
@@ -1241,7 +1253,7 @@ function onCellComponentAction(row, column, rowIndex, payload) {
|
|
|
1241
1253
|
</div>
|
|
1242
1254
|
</header>
|
|
1243
1255
|
|
|
1244
|
-
<div ref="scrollViewport" class="overflow-auto pb-3" :style="gridHeightStyle" @scroll="onViewportScroll">
|
|
1256
|
+
<div ref="scrollViewport" class="overflow-auto pb-3" data-grid-viewport :style="gridHeightStyle" @scroll="onViewportScroll">
|
|
1245
1257
|
<table class="w-full table-fixed border-separate border-spacing-0 text-sm" :style="tableStyle">
|
|
1246
1258
|
<colgroup>
|
|
1247
1259
|
<col v-if="selectable" class="w-11" />
|
|
@@ -1254,7 +1266,7 @@ function onCellComponentAction(row, column, rowIndex, payload) {
|
|
|
1254
1266
|
</colgroup>
|
|
1255
1267
|
|
|
1256
1268
|
<thead class="text-xs">
|
|
1257
|
-
<tr v-if="showColumnLetters" class="bg-secondary/60 text-muted-fg">
|
|
1269
|
+
<tr v-if="showColumnLetters" class="bg-secondary/60 text-muted-fg" :class="layout === 'flush' && gutterClass">
|
|
1258
1270
|
<th
|
|
1259
1271
|
v-if="selectable"
|
|
1260
1272
|
class="border-b border-r border-border px-2 py-1.5 font-semibold"
|
|
@@ -1275,7 +1287,7 @@ function onCellComponentAction(row, column, rowIndex, payload) {
|
|
|
1275
1287
|
</th>
|
|
1276
1288
|
</tr>
|
|
1277
1289
|
|
|
1278
|
-
<tr class="bg-canvas text-muted-fg">
|
|
1290
|
+
<tr class="bg-canvas text-muted-fg" :class="layout === 'flush' && gutterClass">
|
|
1279
1291
|
<th
|
|
1280
1292
|
v-if="selectable"
|
|
1281
1293
|
class="border-b border-r border-border px-2 text-center"
|
|
@@ -1506,6 +1518,7 @@ function onCellComponentAction(row, column, rowIndex, payload) {
|
|
|
1506
1518
|
:row-key="rowKey"
|
|
1507
1519
|
:cell-value="cellValue"
|
|
1508
1520
|
:formatted-cell="formattedCell"
|
|
1521
|
+
:gutter-class="layout === 'flush' ? gutterClass : ''"
|
|
1509
1522
|
:cell-align-class="cellAlignClass"
|
|
1510
1523
|
:row-density-class="rowDensityClass"
|
|
1511
1524
|
:selected-keys="internalSelectedKeys"
|
|
@@ -1555,12 +1568,12 @@ function onCellComponentAction(row, column, rowIndex, payload) {
|
|
|
1555
1568
|
</DataGridVirtualRows>
|
|
1556
1569
|
|
|
1557
1570
|
<tbody v-else>
|
|
1558
|
-
<tr v-if="loading">
|
|
1571
|
+
<tr v-if="loading" :class="layout === 'flush' && gutterClass">
|
|
1559
1572
|
<td :colspan="emptyColspan" class="border-b border-border px-4 py-10 text-center text-sm text-muted-fg">
|
|
1560
1573
|
Loading {{ resourceLabel }}...
|
|
1561
1574
|
</td>
|
|
1562
1575
|
</tr>
|
|
1563
|
-
<tr v-else-if="!displayRows.length">
|
|
1576
|
+
<tr v-else-if="!displayRows.length" :class="layout === 'flush' && gutterClass">
|
|
1564
1577
|
<td :colspan="emptyColspan" class="px-4 py-12 text-center text-sm text-muted-fg">
|
|
1565
1578
|
<slot name="empty">{{ emptyText }}</slot>
|
|
1566
1579
|
</td>
|
|
@@ -1570,7 +1583,7 @@ function onCellComponentAction(row, column, rowIndex, payload) {
|
|
|
1570
1583
|
v-for="(row, rowIndex) in displayRows"
|
|
1571
1584
|
:key="rowKey(row, rowIndex)"
|
|
1572
1585
|
class="group bg-canvas transition hover:bg-secondary/45"
|
|
1573
|
-
:class="rowSelected(row, rowIndex) && 'bg-sky-500/5'"
|
|
1586
|
+
:class="[rowSelected(row, rowIndex) && 'bg-sky-500/5', layout === 'flush' && gutterClass]"
|
|
1574
1587
|
:aria-selected="rowSelected(row, rowIndex) || undefined"
|
|
1575
1588
|
@click="emit('row-click', { row, index: rowIndex })"
|
|
1576
1589
|
>
|
|
@@ -1634,10 +1647,35 @@ function onCellComponentAction(row, column, rowIndex, payload) {
|
|
|
1634
1647
|
</table>
|
|
1635
1648
|
</div>
|
|
1636
1649
|
|
|
1637
|
-
<footer class="flex flex-wrap items-center justify-between gap-2 border-t border-border bg-secondary/25
|
|
1650
|
+
<footer class="flex flex-wrap items-center justify-between gap-2 border-t border-border bg-secondary/25 py-2 text-xs text-muted-fg" :class="layout === 'flush' ? gutterClass : 'px-3'">
|
|
1638
1651
|
<span>{{ visibleColumns.length }} columns</span>
|
|
1639
1652
|
<span v-if="internalSelectedKeys.length">{{ internalSelectedKeys.length }} selected</span>
|
|
1640
1653
|
<span v-else>Ready</span>
|
|
1641
1654
|
</footer>
|
|
1642
1655
|
</section>
|
|
1643
1656
|
</template>
|
|
1657
|
+
|
|
1658
|
+
<style scoped>
|
|
1659
|
+
/* Row padding does not affect table layout. Only the two outer cell edges
|
|
1660
|
+
* inherit it, so responsive/custom utility classes remain application-owned.
|
|
1661
|
+
* Direct table ancestry prevents these rules leaking into nested cell content. */
|
|
1662
|
+
[data-layout="flush"] > [data-grid-viewport] > table > :deep(:is(thead, tbody) > tr:not([aria-hidden="true"]) > :is(th, td):first-child) {
|
|
1663
|
+
padding-left: inherit;
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
[data-layout="flush"] > [data-grid-viewport] > table > :deep(:is(thead, tbody) > tr:not([aria-hidden="true"]) > :is(th, td):last-child) {
|
|
1667
|
+
padding-right: inherit;
|
|
1668
|
+
}
|
|
1669
|
+
|
|
1670
|
+
/* The sortable header has two inner wrappers; remove their extra edge inset
|
|
1671
|
+
* so the label starts on the same gutter as the toolbar and body cells. */
|
|
1672
|
+
[data-layout="flush"] > [data-grid-viewport] > table > thead > tr > th:first-child > div,
|
|
1673
|
+
[data-layout="flush"] > [data-grid-viewport] > table > thead > tr > th:first-child > div > button {
|
|
1674
|
+
padding-left: 0;
|
|
1675
|
+
}
|
|
1676
|
+
|
|
1677
|
+
[data-layout="flush"] > [data-grid-viewport] > table > thead > tr > th:last-child > div:not(.pr-9),
|
|
1678
|
+
[data-layout="flush"] > [data-grid-viewport] > table > thead > tr > th:last-child > div > button {
|
|
1679
|
+
padding-right: 0;
|
|
1680
|
+
}
|
|
1681
|
+
</style>
|
|
@@ -2215,6 +2215,14 @@ export interface DomContextMenuProps {
|
|
|
2215
2215
|
export declare const DomContextMenu: DomComponent<DomContextMenuProps>;
|
|
2216
2216
|
|
|
2217
2217
|
export interface DomDataGridProps {
|
|
2218
|
+
/**
|
|
2219
|
+
* Card keeps the bordered container. Flush removes outer side borders, rounding and shadow; the application owns the surrounding width.
|
|
2220
|
+
*/
|
|
2221
|
+
layout?: "card" | "flush";
|
|
2222
|
+
/**
|
|
2223
|
+
* Horizontal padding classes for flush toolbar, footer and outer cell edges, such as px-4 sm:px-6 or px-[var(--page-gutter)]. Ignored in card layout.
|
|
2224
|
+
*/
|
|
2225
|
+
gutterClass?: string;
|
|
2218
2226
|
/**
|
|
2219
2227
|
* Rows to render. Each row should be a plain object from an API, store, or database result.
|
|
2220
2228
|
*/
|
|
@@ -7811,6 +7819,10 @@ export interface DomSparklineProps {
|
|
|
7811
7819
|
* Line interpolation. Linear avoids implying unobserved smooth changes.
|
|
7812
7820
|
*/
|
|
7813
7821
|
curve?: "linear" | "monotoneX" | "step";
|
|
7822
|
+
/**
|
|
7823
|
+
* Show formatted values on hover or keyboard inspection in a floating tooltip outside the compact plot.
|
|
7824
|
+
*/
|
|
7825
|
+
tooltip?: boolean;
|
|
7814
7826
|
}
|
|
7815
7827
|
export declare const DomSparkline: DomComponent<DomSparklineProps>;
|
|
7816
7828
|
|