@cfasim-ui/charts 0.4.1 → 0.4.3

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.
@@ -50,7 +50,12 @@ type __VLS_Props = {
50
50
  pan?: boolean;
51
51
  /** Tooltip activation mode */
52
52
  tooltipTrigger?: "hover" | "click";
53
- /** Custom tooltip formatter. Receives { id, name, value } and returns HTML string. */
53
+ /**
54
+ * @deprecated Use the `#tooltip` slot instead, which gives you full Vue
55
+ * rendering (components, scoped styles, reactivity). This HTML-string
56
+ * formatter is kept for backwards compatibility and will be removed in a
57
+ * future release.
58
+ */
54
59
  tooltipFormat?: (data: {
55
60
  id: string;
56
61
  name: string;
@@ -68,8 +73,96 @@ type __VLS_Props = {
68
73
  * container's bounding box. `"window"` uses the viewport.
69
74
  */
70
75
  tooltipClamp?: "none" | "chart" | "window";
76
+ /**
77
+ * Feature id(s) (FIPS code, HSA code, or feature name) to pan/zoom to.
78
+ * Pass `null` or an empty array to clear. Works with `v-model:focus`:
79
+ * clicking an unfocused feature emits its id; clicking a focused
80
+ * feature emits `null` (toggle off). Users can pan/zoom away from the
81
+ * focused area even when `zoom` and `pan` are disabled, and the
82
+ * built-in Reset button also clears focus. If a tooltip is configured,
83
+ * focusing a feature shows its tooltip.
84
+ */
85
+ focus?: string | string[] | null;
86
+ /** Scale factor applied when `focus` is set. Default: 4 */
87
+ focusZoomLevel?: number;
71
88
  };
72
- declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
89
+ type ChoroplethFeature = GeoJSON.Feature<GeoJSON.Geometry | null, {
90
+ name?: string;
91
+ }>;
92
+ /** Public payload shape — slot props, hover/click emits, tooltip cache. */
93
+ interface TooltipPayload {
94
+ id: string;
95
+ name: string;
96
+ value?: number | string;
97
+ feature: ChoroplethFeature;
98
+ }
99
+ declare function __VLS_template(): {
100
+ attrs: Partial<{}>;
101
+ slots: Readonly<{
102
+ tooltip?(props: TooltipPayload): unknown;
103
+ }> & {
104
+ tooltip?(props: TooltipPayload): unknown;
105
+ };
106
+ refs: {
107
+ containerRef: HTMLDivElement;
108
+ svgRef: SVGSVGElement;
109
+ mapGroupRef: SVGGElement;
110
+ tooltipChildRef: ({
111
+ $: import('vue').ComponentInternalInstance;
112
+ $data: {};
113
+ $props: Partial<{}> & Omit<{} & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, never>;
114
+ $attrs: import('vue').Attrs;
115
+ $refs: {
116
+ [x: string]: unknown;
117
+ } & {
118
+ root: HTMLDivElement;
119
+ };
120
+ $slots: Readonly<{
121
+ [name: string]: import('vue').Slot<any> | undefined;
122
+ }>;
123
+ $root: import('vue').ComponentPublicInstance | null;
124
+ $parent: import('vue').ComponentPublicInstance | null;
125
+ $host: Element | null;
126
+ $emit: (event: string, ...args: any[]) => void;
127
+ $el: any;
128
+ $options: import('vue').ComponentOptionsBase<Readonly<{}> & Readonly<{}>, {
129
+ setData(next: import('./ChoroplethTooltip').ChoroplethTooltipData | null): void;
130
+ getEl(): HTMLDivElement | null;
131
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, {}, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
132
+ beforeCreate?: (() => void) | (() => void)[];
133
+ created?: (() => void) | (() => void)[];
134
+ beforeMount?: (() => void) | (() => void)[];
135
+ mounted?: (() => void) | (() => void)[];
136
+ beforeUpdate?: (() => void) | (() => void)[];
137
+ updated?: (() => void) | (() => void)[];
138
+ activated?: (() => void) | (() => void)[];
139
+ deactivated?: (() => void) | (() => void)[];
140
+ beforeDestroy?: (() => void) | (() => void)[];
141
+ beforeUnmount?: (() => void) | (() => void)[];
142
+ destroyed?: (() => void) | (() => void)[];
143
+ unmounted?: (() => void) | (() => void)[];
144
+ renderTracked?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
145
+ renderTriggered?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
146
+ errorCaptured?: ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void)[];
147
+ };
148
+ $forceUpdate: () => void;
149
+ $nextTick: typeof import('vue').nextTick;
150
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import('@vue/reactivity').OnCleanup]) => any : (...args: [any, any, import('@vue/reactivity').OnCleanup]) => any, options?: import('vue').WatchOptions): import('vue').WatchStopHandle;
151
+ } & Readonly<{}> & Omit<Readonly<{}> & Readonly<{}>, "setData" | "getEl"> & import('vue').ShallowUnwrapRef<{
152
+ setData(next: import('./ChoroplethTooltip').ChoroplethTooltipData | null): void;
153
+ getEl(): HTMLDivElement | null;
154
+ }> & {} & import('vue').ComponentCustomProperties & {} & {
155
+ $slots: Readonly<{
156
+ default?(props: import('./ChoroplethTooltip').ChoroplethTooltipData): unknown;
157
+ }> & {
158
+ default?(props: import('./ChoroplethTooltip').ChoroplethTooltipData): unknown;
159
+ };
160
+ }) | null;
161
+ };
162
+ rootEl: HTMLDivElement;
163
+ };
164
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
165
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
73
166
  stateClick: (state: {
74
167
  id: string;
75
168
  name: string;
@@ -80,6 +173,7 @@ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {
80
173
  name: string;
81
174
  value?: number | string;
82
175
  } | null) => any;
176
+ "update:focus": (focus: string | null) => any;
83
177
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
84
178
  onStateClick?: ((state: {
85
179
  id: string;
@@ -91,6 +185,7 @@ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {
91
185
  name: string;
92
186
  value?: number | string;
93
187
  } | null) => any) | undefined;
188
+ "onUpdate:focus"?: ((focus: string | null) => any) | undefined;
94
189
  }>, {
95
190
  legend: boolean;
96
191
  menu: boolean | string;
@@ -101,9 +196,67 @@ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {
101
196
  strokeColor: string;
102
197
  zoom: boolean;
103
198
  pan: boolean;
199
+ focusZoomLevel: number;
104
200
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
105
201
  containerRef: HTMLDivElement;
106
202
  svgRef: SVGSVGElement;
107
203
  mapGroupRef: SVGGElement;
204
+ tooltipChildRef: ({
205
+ $: import('vue').ComponentInternalInstance;
206
+ $data: {};
207
+ $props: Partial<{}> & Omit<{} & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, never>;
208
+ $attrs: import('vue').Attrs;
209
+ $refs: {
210
+ [x: string]: unknown;
211
+ } & {
212
+ root: HTMLDivElement;
213
+ };
214
+ $slots: Readonly<{
215
+ [name: string]: import('vue').Slot<any> | undefined;
216
+ }>;
217
+ $root: import('vue').ComponentPublicInstance | null;
218
+ $parent: import('vue').ComponentPublicInstance | null;
219
+ $host: Element | null;
220
+ $emit: (event: string, ...args: any[]) => void;
221
+ $el: any;
222
+ $options: import('vue').ComponentOptionsBase<Readonly<{}> & Readonly<{}>, {
223
+ setData(next: import('./ChoroplethTooltip').ChoroplethTooltipData | null): void;
224
+ getEl(): HTMLDivElement | null;
225
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, {}, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
226
+ beforeCreate?: (() => void) | (() => void)[];
227
+ created?: (() => void) | (() => void)[];
228
+ beforeMount?: (() => void) | (() => void)[];
229
+ mounted?: (() => void) | (() => void)[];
230
+ beforeUpdate?: (() => void) | (() => void)[];
231
+ updated?: (() => void) | (() => void)[];
232
+ activated?: (() => void) | (() => void)[];
233
+ deactivated?: (() => void) | (() => void)[];
234
+ beforeDestroy?: (() => void) | (() => void)[];
235
+ beforeUnmount?: (() => void) | (() => void)[];
236
+ destroyed?: (() => void) | (() => void)[];
237
+ unmounted?: (() => void) | (() => void)[];
238
+ renderTracked?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
239
+ renderTriggered?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
240
+ errorCaptured?: ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void)[];
241
+ };
242
+ $forceUpdate: () => void;
243
+ $nextTick: typeof import('vue').nextTick;
244
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import('@vue/reactivity').OnCleanup]) => any : (...args: [any, any, import('@vue/reactivity').OnCleanup]) => any, options?: import('vue').WatchOptions): import('vue').WatchStopHandle;
245
+ } & Readonly<{}> & Omit<Readonly<{}> & Readonly<{}>, "setData" | "getEl"> & import('vue').ShallowUnwrapRef<{
246
+ setData(next: import('./ChoroplethTooltip').ChoroplethTooltipData | null): void;
247
+ getEl(): HTMLDivElement | null;
248
+ }> & {} & import('vue').ComponentCustomProperties & {} & {
249
+ $slots: Readonly<{
250
+ default?(props: import('./ChoroplethTooltip').ChoroplethTooltipData): unknown;
251
+ }> & {
252
+ default?(props: import('./ChoroplethTooltip').ChoroplethTooltipData): unknown;
253
+ };
254
+ }) | null;
108
255
  }, HTMLDivElement>;
256
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
109
257
  export default _default;
258
+ type __VLS_WithTemplateSlots<T, S> = T & {
259
+ new (): {
260
+ $slots: S;
261
+ };
262
+ };
@@ -0,0 +1,32 @@
1
+ export interface ChoroplethTooltipData {
2
+ id: string;
3
+ name: string;
4
+ value?: number | string;
5
+ feature: unknown;
6
+ }
7
+ declare function __VLS_template(): {
8
+ attrs: Partial<{}>;
9
+ slots: Readonly<{
10
+ default?(props: ChoroplethTooltipData): unknown;
11
+ }> & {
12
+ default?(props: ChoroplethTooltipData): unknown;
13
+ };
14
+ refs: {
15
+ root: HTMLDivElement;
16
+ };
17
+ rootEl: any;
18
+ };
19
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
20
+ declare const __VLS_component: import('vue').DefineComponent<{}, {
21
+ setData(next: ChoroplethTooltipData | null): void;
22
+ getEl(): HTMLDivElement | null;
23
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {
24
+ root: HTMLDivElement;
25
+ }, any>;
26
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
27
+ export default _default;
28
+ type __VLS_WithTemplateSlots<T, S> = T & {
29
+ new (): {
30
+ $slots: S;
31
+ };
32
+ };
package/dist/index.css CHANGED
@@ -1,2 +1,2 @@
1
- .chart-menu-trigger-area[data-v-b3c563e8]{z-index:1;position:absolute;top:0;right:0}.chart-menu-button[data-v-b3c563e8]{border:1px solid var(--color-border);background:var(--color-bg-0,#fff);width:28px;height:28px;color:var(--color-text-secondary);cursor:pointer;opacity:0;border-radius:.25em;justify-content:center;align-items:center;transition:opacity .15s;display:flex}.chart-menu-button[data-state=open][data-v-b3c563e8]{opacity:1}.chart-menu-button[data-v-b3c563e8]:hover{background:var(--color-bg-1,#0000000d);color:var(--color-text)}.chart-menu-content{z-index:100;background:var(--color-bg-0);border:1px solid var(--color-border);border-radius:.25em;min-width:140px;padding:.25em;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.chart-menu-item{font-size:var(--font-size-sm);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;border-radius:.25em;outline:none;align-items:center;padding:.375em .5em;display:flex}.chart-menu-item[data-highlighted]{background:var(--color-primary);color:#fff}.line-chart-wrapper[data-v-083d1c2f]{width:100%;position:relative}.line-chart-wrapper[data-v-083d1c2f]:hover .chart-menu-button{opacity:1}.line-chart-tooltip-label[data-v-083d1c2f]{margin-bottom:.25em;font-weight:600}.line-chart-tooltip-row[data-v-083d1c2f]{align-items:center;gap:.375em;display:flex}.line-chart-download-link[data-v-083d1c2f]{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}.line-chart-tooltip-swatch[data-v-083d1c2f]{border-radius:50%;flex-shrink:0;width:.625em;height:.625em;display:inline-block}.bar-chart-wrapper[data-v-4f604d9f]{width:100%;position:relative}.bar-chart-wrapper[data-v-4f604d9f]:hover .chart-menu-button{opacity:1}.bar-chart-tooltip-label[data-v-4f604d9f]{margin-bottom:.25em;font-weight:600}.bar-chart-tooltip-row[data-v-4f604d9f]{align-items:center;gap:.375em;display:flex}.bar-chart-download-link[data-v-4f604d9f]{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}.bar-chart-tooltip-swatch[data-v-4f604d9f]{border-radius:50%;flex-shrink:0;width:.625em;height:.625em;display:inline-block}.choropleth-wrapper[data-v-105ba317]{width:100%;position:relative}.choropleth-wrapper.pannable svg[data-v-105ba317]{cursor:grab}.choropleth-wrapper.pannable svg[data-v-105ba317]:active{cursor:grabbing}.choropleth-wrapper[data-v-105ba317]:hover .chart-menu-button{opacity:1}.state-path[data-v-105ba317]{cursor:pointer}.chart-tooltip-anchor[data-v-44377f70]{pointer-events:none;width:1px;height:1px;position:absolute}.chart-tooltip-content{z-index:100;background:var(--color-bg-0,#fff);border:1px solid var(--color-border,#e5e7eb);font-size:var(--font-size-sm,.875rem);pointer-events:none;border-radius:.375em;padding:.5em .75em;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.TableOuter[data-v-d5c290dc]{display:inline-block;position:relative}.TableOuter.full-width[data-v-d5c290dc]{display:block}.TableWrapper[data-v-d5c290dc]{font-size:var(--font-size-sm);overflow-x:auto}.Table[data-v-d5c290dc]{border-collapse:collapse;font-variant-numeric:tabular-nums;border:1px solid var(--color-border);table-layout:fixed;margin:0;display:table}.Table.full-width[data-v-d5c290dc]{width:100%}.Table tr[data-v-d5c290dc],.Table th[data-v-d5c290dc],.Table td[data-v-d5c290dc]{background:0 0;border:none}.Table th[data-v-d5c290dc],.Table td[data-v-d5c290dc]{white-space:nowrap;text-align:left;padding:.75em 1.25em}.Table th[data-v-d5c290dc]{border-bottom:1px solid var(--color-border-header);font-weight:600;position:sticky;top:0}.Table tbody td[data-v-d5c290dc]{border-bottom:1px solid var(--color-border)}.Table tbody tr:last-child td[data-v-d5c290dc]{border-bottom:none}.TableOuter[data-v-d5c290dc] .chart-menu-trigger-area{top:4px;right:4px}.TableOuter[data-v-d5c290dc] .chart-menu-button{opacity:1}.TableOuter.has-menu .Table thead th[data-v-d5c290dc]:last-child{padding-right:2.5em}
1
+ .chart-menu-trigger-area[data-v-b3c563e8]{z-index:1;position:absolute;top:0;right:0}.chart-menu-button[data-v-b3c563e8]{border:1px solid var(--color-border);background:var(--color-bg-0,#fff);width:28px;height:28px;color:var(--color-text-secondary);cursor:pointer;opacity:0;border-radius:.25em;justify-content:center;align-items:center;transition:opacity .15s;display:flex}.chart-menu-button[data-state=open][data-v-b3c563e8]{opacity:1}.chart-menu-button[data-v-b3c563e8]:hover{background:var(--color-bg-1,#0000000d);color:var(--color-text)}.chart-menu-content{z-index:100;background:var(--color-bg-0);border:1px solid var(--color-border);border-radius:.25em;min-width:140px;padding:.25em;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.chart-menu-item{font-size:var(--font-size-sm);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;border-radius:.25em;outline:none;align-items:center;padding:.375em .5em;display:flex}.chart-menu-item[data-highlighted]{background:var(--color-primary);color:#fff}.line-chart-wrapper[data-v-083d1c2f]{width:100%;position:relative}.line-chart-wrapper[data-v-083d1c2f]:hover .chart-menu-button{opacity:1}.line-chart-tooltip-label[data-v-083d1c2f]{margin-bottom:.25em;font-weight:600}.line-chart-tooltip-row[data-v-083d1c2f]{align-items:center;gap:.375em;display:flex}.line-chart-download-link[data-v-083d1c2f]{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}.line-chart-tooltip-swatch[data-v-083d1c2f]{border-radius:50%;flex-shrink:0;width:.625em;height:.625em;display:inline-block}.bar-chart-wrapper[data-v-4f604d9f]{width:100%;position:relative}.bar-chart-wrapper[data-v-4f604d9f]:hover .chart-menu-button{opacity:1}.bar-chart-tooltip-label[data-v-4f604d9f]{margin-bottom:.25em;font-weight:600}.bar-chart-tooltip-row[data-v-4f604d9f]{align-items:center;gap:.375em;display:flex}.bar-chart-download-link[data-v-4f604d9f]{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}.bar-chart-tooltip-swatch[data-v-4f604d9f]{border-radius:50%;flex-shrink:0;width:.625em;height:.625em;display:inline-block}.choropleth-wrapper[data-v-62648243]{--choropleth-legend-bg:var(--color-bg-0,#fff);width:100%;position:relative}.choropleth-wrapper svg[data-v-62648243]{width:100%;height:auto;display:block}.choropleth-wrapper.pannable svg[data-v-62648243]{cursor:grab}.choropleth-wrapper.pannable svg[data-v-62648243]:active{cursor:grabbing}.choropleth-wrapper[data-v-62648243]:hover .chart-menu-button{opacity:1}.state-path[data-v-62648243]{cursor:pointer}.choropleth-reset[data-v-62648243]{font:inherit;color:var(--color-text-secondary,#555);background:var(--color-bg-0,#fff);border:1px solid var(--color-border,#e5e7eb);cursor:pointer;border-radius:4px;padding:4px 10px;font-size:12px;position:absolute;bottom:8px;left:8px;box-shadow:0 1px 2px #0000000d}.choropleth-reset[data-v-62648243]:hover{background:var(--color-bg-1,#f8f9fa);color:var(--color-text,#212529)}.choropleth-header[data-v-62648243]{background:var(--choropleth-legend-bg);color:currentColor;border-radius:4px;flex-direction:column;align-items:center;gap:10px;width:fit-content;margin:0 auto;padding:8px 14px;display:flex}.choropleth-title[data-v-62648243]{font-size:14px;font-weight:600;line-height:1.2}.choropleth-legend[data-v-62648243]{align-items:center;gap:14px;font-size:13px;line-height:1.2;display:flex}.choropleth-legend-title[data-v-62648243]{font-weight:600}.choropleth-legend-item[data-v-62648243]{align-items:center;gap:6px;display:inline-flex}.choropleth-legend-swatch[data-v-62648243]{border-radius:3px;width:12px;height:12px;display:inline-block}.choropleth-legend-continuous[data-v-62648243]{flex-direction:column;width:160px;display:flex}.choropleth-legend-gradient[data-v-62648243]{border-radius:2px;height:12px}.choropleth-legend-ticks[data-v-62648243]{opacity:.7;height:14px;margin-top:4px;font-size:11px;position:relative}.choropleth-legend-ticks>span[data-v-62648243]{position:absolute;transform:translate(-50%)}.chart-tooltip-anchor[data-v-44377f70]{pointer-events:none;width:1px;height:1px;position:absolute}.chart-tooltip-content{z-index:100;background:var(--color-bg-0,#fff);border:1px solid var(--color-border,#e5e7eb);font-size:var(--font-size-sm,.875rem);pointer-events:none;border-radius:.375em;padding:.5em .75em;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.TableOuter[data-v-d5c290dc]{display:inline-block;position:relative}.TableOuter.full-width[data-v-d5c290dc]{display:block}.TableWrapper[data-v-d5c290dc]{font-size:var(--font-size-sm);overflow-x:auto}.Table[data-v-d5c290dc]{border-collapse:collapse;font-variant-numeric:tabular-nums;border:1px solid var(--color-border);table-layout:fixed;margin:0;display:table}.Table.full-width[data-v-d5c290dc]{width:100%}.Table tr[data-v-d5c290dc],.Table th[data-v-d5c290dc],.Table td[data-v-d5c290dc]{background:0 0;border:none}.Table th[data-v-d5c290dc],.Table td[data-v-d5c290dc]{white-space:nowrap;text-align:left;padding:.75em 1.25em}.Table th[data-v-d5c290dc]{border-bottom:1px solid var(--color-border-header);font-weight:600;position:sticky;top:0}.Table tbody td[data-v-d5c290dc]{border-bottom:1px solid var(--color-border)}.Table tbody tr:last-child td[data-v-d5c290dc]{border-bottom:none}.TableOuter[data-v-d5c290dc] .chart-menu-trigger-area{top:4px;right:4px}.TableOuter[data-v-d5c290dc] .chart-menu-button{opacity:1}.TableOuter.has-menu .Table thead th[data-v-d5c290dc]:last-child{padding-right:2.5em}
2
2
  /*$vite$:1*/