svelte-tiny-linked-charts 1.6.2 → 2.0.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 +5 -2
- package/dist/LinkedChart.svelte +180 -75
- package/dist/LinkedChart.svelte.d.ts +173 -91
- package/dist/LinkedLabel.svelte +4 -4
- package/dist/LinkedLabel.svelte.d.ts +13 -25
- package/dist/LinkedValue.svelte +9 -5
- package/dist/LinkedValue.svelte.d.ts +14 -26
- package/dist/stores/tinyLinkedCharts.d.ts +4 -3
- package/dist/stores/tinyLinkedCharts.js +3 -0
- package/package.json +69 -69
package/README.md
CHANGED
|
@@ -20,6 +20,8 @@ yarn add svelte-tiny-linked-charts --dev
|
|
|
20
20
|
npm install svelte-tiny-linked-charts --save-dev
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
+
If you are using Svelte 4, use version ^1.0.0. Version 2 is reserved for Svelte 5.
|
|
24
|
+
|
|
23
25
|
Include the chart in your app.
|
|
24
26
|
```js
|
|
25
27
|
import { LinkedChart, LinkedLabel, LinkedValue } from "svelte-tiny-linked-charts"
|
|
@@ -103,8 +105,9 @@ type | bar | Can be set to "line" to display a line chart instead.
|
|
|
103
105
|
lineColor | fill | Color of the line if used with type="line".
|
|
104
106
|
tabindex | -1 | Sets the tabindex of each bar.
|
|
105
107
|
preserveAspectRatio | false | Sets whether or not the SVG will preserve it's aspect ratio
|
|
106
|
-
|
|
107
|
-
|
|
108
|
+
onclick | null | Function that executes on click and returns the key and index for the clicked data.
|
|
109
|
+
onhover | null | Function that executes on hover of each bar.
|
|
110
|
+
onblur | null | Function that executes when focus leaves the chart.
|
|
108
111
|
|
|
109
112
|
`<LinkedLabel />` component.
|
|
110
113
|
Property | Default | Description
|
package/dist/LinkedChart.svelte
CHANGED
|
@@ -1,63 +1,156 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
import {
|
|
2
|
+
import { tick } from "svelte"
|
|
3
3
|
import { hoveringKey, hoveringValue } from "./stores/tinyLinkedCharts.js"
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export let width = 150
|
|
12
|
-
export let barMinWidth = 4
|
|
13
|
-
export let barMinHeight = 0
|
|
14
|
-
export let hideBarBelow = 0
|
|
15
|
-
export let grow = false
|
|
16
|
-
export let align = "right"
|
|
17
|
-
export let gap = 1
|
|
18
|
-
export let fill = "#ff3e00"
|
|
19
|
-
export let fadeOpacity = 0.5
|
|
20
|
-
export let hover = true
|
|
21
|
-
export let transition = 0
|
|
22
|
-
export let showValue = false
|
|
23
|
-
export let valueDefault = " "
|
|
24
|
-
export let valuePrepend = ""
|
|
25
|
-
export let valueAppend = ""
|
|
26
|
-
export let valuePosition = "static"
|
|
27
|
-
export let valueUndefined = 0
|
|
28
|
-
export let scaleMax = 0
|
|
29
|
-
export let scaleMin = 0
|
|
30
|
-
export let type = "bar"
|
|
31
|
-
export let lineColor = fill
|
|
32
|
-
export let tabindex = -1
|
|
33
|
-
export let dispatchEvents = false
|
|
34
|
-
export let preserveAspectRatio = false
|
|
35
|
-
export let clickHandler = (key, i) => null
|
|
36
|
-
|
|
37
|
-
const dispatch = createEventDispatcher()
|
|
38
|
-
|
|
39
|
-
let valuePositionOffset = 0
|
|
40
|
-
let polyline = []
|
|
41
|
-
let valueElement
|
|
42
|
-
|
|
43
|
-
$: dataLength = Object.keys(data).length
|
|
44
|
-
$: barWidth = grow ? getBarWidth(dataLength) : parseInt(barMinWidth)
|
|
45
|
-
$: highestValue = getHighestValue(data)
|
|
46
|
-
$: alignmentOffset = dataLength ? getAlignment() : 0
|
|
47
|
-
$: linkedKey = linked || (Math.random() + 1).toString(36).substring(7)
|
|
48
|
-
$: $hoveringValue[uid] = $hoveringKey[linkedKey] ? data[$hoveringKey[linkedKey]] : null
|
|
49
|
-
$: if (labels.length && values.length) data = Object.fromEntries(labels.map((_, i) => [labels[i], values[i]]))
|
|
50
|
-
$: if (valuePosition == "floating") valuePositionOffset = (parseInt(gap) + barWidth) * Object.keys(data).indexOf($hoveringKey[linkedKey]) + alignmentOffset
|
|
51
|
-
$: if (type == "line") polyline = getPolyLinePoints(data)
|
|
52
|
-
$: if (dispatchEvents) dispatch('value-update', { value: $hoveringValue[uid], uid, linkedKey, valueElement })
|
|
53
|
-
$: if (tabindex > 0) console.warn("Tabindex should not be higher than 0")
|
|
5
|
+
/** @typedef {Object} OnValueUpdate
|
|
6
|
+
* @property {number | null} [value]
|
|
7
|
+
* @property {string} [uid]
|
|
8
|
+
* @property {string} [linkedKey]
|
|
9
|
+
* @property {HTMLElement | null} [valueElement]
|
|
10
|
+
*/
|
|
54
11
|
|
|
12
|
+
/** @typedef {Object} OnClick
|
|
13
|
+
* @property {string} [key]
|
|
14
|
+
* @property {number} [index]
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** @typedef {Object} OnHover
|
|
18
|
+
* @property {string} uid,
|
|
19
|
+
* @property {string} key,
|
|
20
|
+
* @property {number} index,
|
|
21
|
+
* @property {string} linkedKey,
|
|
22
|
+
* @property {number | null} value,
|
|
23
|
+
* @property {HTMLElement} valueElement,
|
|
24
|
+
* @property {EventTarget | null} eventElement
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/** @typedef {Object} OnBlur
|
|
28
|
+
* @property {string} uid,
|
|
29
|
+
* @property {string} linkedKey,
|
|
30
|
+
* @property {HTMLElement} valueElement,
|
|
31
|
+
* @property {EventTarget | null} eventElement
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @typedef {Object} Props
|
|
36
|
+
* @property {string} [uid]
|
|
37
|
+
* @property {Record<string, number>} [data]
|
|
38
|
+
* @property {string[]} [labels]
|
|
39
|
+
* @property {number[]} [values]
|
|
40
|
+
* @property {string} [linked]
|
|
41
|
+
* @property {number} [height]
|
|
42
|
+
* @property {number} [width]
|
|
43
|
+
* @property {number} [barMinWidth]
|
|
44
|
+
* @property {number} [barMinHeight]
|
|
45
|
+
* @property {number} [hideBarBelow]
|
|
46
|
+
* @property {boolean} [grow]
|
|
47
|
+
* @property {"left" | "right"} [align]
|
|
48
|
+
* @property {number} [gap]
|
|
49
|
+
* @property {string} [fill]
|
|
50
|
+
* @property {number} [fadeOpacity]
|
|
51
|
+
* @property {boolean} [hover]
|
|
52
|
+
* @property {number} [transition]
|
|
53
|
+
* @property {boolean} [showValue]
|
|
54
|
+
* @property {string} [valueDefault]
|
|
55
|
+
* @property {string} [valuePrepend]
|
|
56
|
+
* @property {string} [valueAppend]
|
|
57
|
+
* @property {"static" | "floating"} [valuePosition]
|
|
58
|
+
* @property {number} [valueUndefined]
|
|
59
|
+
* @property {number} [scaleMax]
|
|
60
|
+
* @property {number} [scaleMin]
|
|
61
|
+
* @property {"bar" | "line"} [type]
|
|
62
|
+
* @property {string} [lineColor]
|
|
63
|
+
* @property {-1 | 0} [tabindex]
|
|
64
|
+
* @property {boolean} [preserveAspectRatio]
|
|
65
|
+
* @property {(args: OnClick) => void} [onclick]
|
|
66
|
+
* @property {(args: OnValueUpdate) => void} [onvalueupdate]
|
|
67
|
+
* @property {(args: OnHover) => void} [onhover]
|
|
68
|
+
* @property {(args: OnBlur) => void} [onblur]
|
|
69
|
+
*/
|
|
70
|
+
|
|
71
|
+
/** @type {Props & { [key: string]: any }} */
|
|
72
|
+
let {
|
|
73
|
+
uid = (Math.random() + 1).toString(36).substring(7),
|
|
74
|
+
data = $bindable({}),
|
|
75
|
+
labels = [],
|
|
76
|
+
values = [],
|
|
77
|
+
linked = "",
|
|
78
|
+
height = 40,
|
|
79
|
+
width = 150,
|
|
80
|
+
barMinWidth = 4,
|
|
81
|
+
barMinHeight = 0,
|
|
82
|
+
hideBarBelow = 0,
|
|
83
|
+
grow = false,
|
|
84
|
+
align = "right",
|
|
85
|
+
gap = 1,
|
|
86
|
+
fill = "#ff3e00",
|
|
87
|
+
fadeOpacity = 0.5,
|
|
88
|
+
hover = true,
|
|
89
|
+
transition = 0,
|
|
90
|
+
showValue = false,
|
|
91
|
+
valueDefault = " ",
|
|
92
|
+
valuePrepend = "",
|
|
93
|
+
valueAppend = "",
|
|
94
|
+
valuePosition = "static",
|
|
95
|
+
valueUndefined = 0,
|
|
96
|
+
scaleMax = 0,
|
|
97
|
+
scaleMin = 0,
|
|
98
|
+
type = "bar",
|
|
99
|
+
lineColor = fill,
|
|
100
|
+
tabindex = -1,
|
|
101
|
+
preserveAspectRatio = false,
|
|
102
|
+
onclick = ({ key, index }) => null,
|
|
103
|
+
onvalueupdate = ({ value, uid, linkedKey, valueElement }) => null,
|
|
104
|
+
onhover = ({ uid, key, index, linkedKey, value, valueElement, eventElement }) => null,
|
|
105
|
+
onblur = ({ uid, linkedKey, valueElement, eventElement }) => null,
|
|
106
|
+
...rest
|
|
107
|
+
} = $props()
|
|
108
|
+
|
|
109
|
+
let valuePositionOffset = $state(0)
|
|
110
|
+
/** @type {number[][]} */
|
|
111
|
+
let polyline = $state([])
|
|
112
|
+
let valueElement = $state()
|
|
113
|
+
let dataLength = $derived(Object.keys(data).length)
|
|
114
|
+
let barWidth = $derived(dataLength && grow ? getBarWidth() : barMinWidth)
|
|
115
|
+
let highestValue = $derived(data ? getHighestValue() : 0)
|
|
116
|
+
let alignmentOffset = $derived(dataLength ? getAlignment() : 0)
|
|
117
|
+
let linkedKey = $derived(linked || (Math.random() + 1).toString(36).substring(7))
|
|
118
|
+
|
|
119
|
+
$effect(() => {
|
|
120
|
+
if (labels.length && values.length) data = Object.fromEntries(labels.map((_, i) => [labels[i], values[i]]))
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
$effect(() => {
|
|
124
|
+
$hoveringValue[uid] = $hoveringKey[linkedKey] ? data[$hoveringKey[linkedKey]] : null
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
$effect(() => {
|
|
128
|
+
if (valuePosition === "floating") valuePositionOffset = (gap + barWidth) * Object.keys(data).indexOf($hoveringKey[linkedKey] || "") + alignmentOffset
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
$effect(() => {
|
|
132
|
+
if (type == "line") polyline = getPolyLinePoints(data)
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
$effect(() => {
|
|
136
|
+
onvalueupdate({ value: $hoveringValue[uid], uid, linkedKey, valueElement })
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
$effect(() => {
|
|
140
|
+
if (tabindex > 0) console.warn("tabindex should not be higher than 0")
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
/** @returns {number} */
|
|
55
144
|
function getHighestValue() {
|
|
56
145
|
if (scaleMax) return scaleMax
|
|
57
146
|
if (dataLength) return Math.max(...Object.values(data))
|
|
58
147
|
return 0
|
|
59
148
|
}
|
|
60
149
|
|
|
150
|
+
/**
|
|
151
|
+
* @param {number} value
|
|
152
|
+
* @returns {number}
|
|
153
|
+
*/
|
|
61
154
|
function getHeight(value) {
|
|
62
155
|
if (value < hideBarBelow || value < scaleMin) return 0
|
|
63
156
|
|
|
@@ -65,56 +158,68 @@
|
|
|
65
158
|
const minValue = scaleMin || 0
|
|
66
159
|
|
|
67
160
|
const scaledValue = (value - minValue) / (maxValue - minValue)
|
|
68
|
-
return Math.max(Math.ceil(scaledValue *
|
|
161
|
+
return Math.max(Math.ceil(scaledValue * height), barMinHeight)
|
|
69
162
|
}
|
|
70
163
|
|
|
164
|
+
/** @returns {number} */
|
|
71
165
|
function getBarWidth() {
|
|
72
|
-
return Math.max((
|
|
166
|
+
return Math.max((width - (dataLength * gap)) / dataLength, barMinWidth)
|
|
73
167
|
}
|
|
74
168
|
|
|
169
|
+
/** @returns {number} */
|
|
75
170
|
function getAlignment() {
|
|
76
171
|
if (align == "left") return 0
|
|
77
|
-
return (
|
|
172
|
+
return (gap + width) - ((gap + barWidth) * dataLength)
|
|
78
173
|
}
|
|
79
174
|
|
|
80
|
-
|
|
175
|
+
/** @param {Record<string, number>} data */
|
|
176
|
+
function getPolyLinePoints(data) {
|
|
81
177
|
let points = []
|
|
82
178
|
|
|
83
179
|
for (let i = 0; i < Object.keys(data).length; i++) {
|
|
84
|
-
points.push([i * ((barWidth +
|
|
180
|
+
points.push([i * ((barWidth + gap) + (barWidth / (Object.keys(data).length))), height - getHeight(Object.values(data)[i])])
|
|
85
181
|
}
|
|
86
182
|
|
|
87
183
|
return points
|
|
88
184
|
}
|
|
89
185
|
|
|
90
|
-
|
|
186
|
+
/**
|
|
187
|
+
* @param {MouseEvent | FocusEvent | TouchEvent} event
|
|
188
|
+
* @param {string} key
|
|
189
|
+
* @param {number} index
|
|
190
|
+
*/
|
|
191
|
+
async function startHover(event, key, index) {
|
|
91
192
|
if (!hover) return
|
|
92
193
|
$hoveringKey[linkedKey] = key
|
|
93
194
|
|
|
94
195
|
await tick()
|
|
95
196
|
|
|
96
|
-
|
|
197
|
+
onhover({ uid, key, index, linkedKey, value: $hoveringValue[uid], valueElement, eventElement: event.target })
|
|
97
198
|
}
|
|
98
199
|
|
|
99
|
-
|
|
200
|
+
/**
|
|
201
|
+
* @param {FocusEvent} event
|
|
202
|
+
*/
|
|
203
|
+
async function endHover(event) {
|
|
100
204
|
if (!hover) return
|
|
101
205
|
$hoveringKey[linkedKey] = null
|
|
206
|
+
$hoveringValue[uid] = null
|
|
102
207
|
|
|
103
208
|
await tick()
|
|
104
209
|
|
|
105
|
-
|
|
210
|
+
onblur({ uid, linkedKey, valueElement, eventElement: event.target })
|
|
106
211
|
}
|
|
107
212
|
</script>
|
|
108
213
|
|
|
109
|
-
<!-- svelte-ignore
|
|
214
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
110
215
|
<svg
|
|
111
216
|
{width}
|
|
112
217
|
height={type == "line" ? height + barWidth / 2 : height}
|
|
113
218
|
viewBox="0 0 {width } {height}"
|
|
114
219
|
preserveAspectRatio={preserveAspectRatio ? "true" : "none"}
|
|
115
|
-
{
|
|
116
|
-
|
|
117
|
-
|
|
220
|
+
onmouseleave={endHover}
|
|
221
|
+
onblur={endHover}
|
|
222
|
+
{...rest}>
|
|
118
223
|
|
|
119
224
|
<g transform="translate({alignmentOffset}, 0)">
|
|
120
225
|
{#if type == "line"}
|
|
@@ -128,29 +233,29 @@
|
|
|
128
233
|
opacity={hover && $hoveringKey[linkedKey] && $hoveringKey[linkedKey] != key ? fadeOpacity : 1}
|
|
129
234
|
fill={fill}
|
|
130
235
|
width={barWidth}
|
|
131
|
-
height={
|
|
132
|
-
x={(
|
|
236
|
+
height={getHeight(value)}
|
|
237
|
+
x={(gap + barWidth) * i}
|
|
133
238
|
y={(height - getHeight(value))} />
|
|
134
239
|
{:else if type == "line"}
|
|
135
240
|
<circle
|
|
136
241
|
fill={hover && $hoveringKey[linkedKey] !== null && $hoveringKey[linkedKey] == key ? fill : "transparent"}
|
|
137
|
-
r={grow ?
|
|
242
|
+
r={grow ? barMinWidth : barWidth / 2}
|
|
138
243
|
cy={height - getHeight(value)}
|
|
139
|
-
cx={((
|
|
244
|
+
cx={((gap + barWidth) + (barWidth / (Object.keys(data).length))) * i} />
|
|
140
245
|
{/if}
|
|
141
246
|
|
|
142
|
-
<!-- svelte-ignore
|
|
143
|
-
<!-- svelte-ignore
|
|
247
|
+
<!-- svelte-ignore a11y_no_noninteractive_tabindex -->
|
|
248
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
144
249
|
<rect
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
250
|
+
onmouseover={event => startHover(event, key, i)}
|
|
251
|
+
onfocus={event => startHover(event, key, i)}
|
|
252
|
+
ontouchstart={event => startHover(event, key, i)}
|
|
253
|
+
onclick={() => onclick({ key, index: i })}
|
|
254
|
+
onkeypress={() => onclick({ key, index: i })}
|
|
150
255
|
width={barWidth}
|
|
151
256
|
height={height}
|
|
152
257
|
fill="transparent"
|
|
153
|
-
x={(
|
|
258
|
+
x={(gap + barWidth) * i}
|
|
154
259
|
{tabindex} />
|
|
155
260
|
{/each}
|
|
156
261
|
</g>
|
|
@@ -1,93 +1,175 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
1
|
+
export default LinkedChart;
|
|
2
|
+
type LinkedChart = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<Props & {
|
|
5
|
+
[key: string]: any;
|
|
6
|
+
}>): void;
|
|
7
|
+
};
|
|
8
|
+
declare const LinkedChart: import("svelte").Component<{
|
|
9
|
+
uid?: string | undefined;
|
|
10
|
+
data?: Record<string, number> | undefined;
|
|
11
|
+
labels?: string[] | undefined;
|
|
12
|
+
values?: number[] | undefined;
|
|
13
|
+
linked?: string | undefined;
|
|
14
|
+
height?: number | undefined;
|
|
15
|
+
width?: number | undefined;
|
|
16
|
+
barMinWidth?: number | undefined;
|
|
17
|
+
barMinHeight?: number | undefined;
|
|
18
|
+
hideBarBelow?: number | undefined;
|
|
19
|
+
grow?: boolean | undefined;
|
|
20
|
+
align?: "left" | "right" | undefined;
|
|
21
|
+
gap?: number | undefined;
|
|
22
|
+
fill?: string | undefined;
|
|
23
|
+
fadeOpacity?: number | undefined;
|
|
24
|
+
hover?: boolean | undefined;
|
|
25
|
+
transition?: number | undefined;
|
|
26
|
+
showValue?: boolean | undefined;
|
|
27
|
+
valueDefault?: string | undefined;
|
|
28
|
+
valuePrepend?: string | undefined;
|
|
29
|
+
valueAppend?: string | undefined;
|
|
30
|
+
valuePosition?: "static" | "floating" | undefined;
|
|
31
|
+
valueUndefined?: number | undefined;
|
|
32
|
+
scaleMax?: number | undefined;
|
|
33
|
+
scaleMin?: number | undefined;
|
|
34
|
+
type?: "bar" | "line" | undefined;
|
|
35
|
+
lineColor?: string | undefined;
|
|
36
|
+
tabindex?: 0 | -1 | undefined;
|
|
37
|
+
preserveAspectRatio?: boolean | undefined;
|
|
38
|
+
onclick?: ((args: {
|
|
39
|
+
key?: string | undefined;
|
|
40
|
+
index?: number | undefined;
|
|
41
|
+
}) => void) | undefined;
|
|
42
|
+
onvalueupdate?: ((args: {
|
|
43
|
+
value?: number | null | undefined;
|
|
44
|
+
uid?: string | undefined;
|
|
45
|
+
linkedKey?: string | undefined;
|
|
46
|
+
valueElement?: HTMLElement | null | undefined;
|
|
47
|
+
}) => void) | undefined;
|
|
48
|
+
onhover?: ((args: {
|
|
49
|
+
/**
|
|
50
|
+
* ,
|
|
51
|
+
*/
|
|
52
|
+
uid: string;
|
|
53
|
+
/**
|
|
54
|
+
* ,
|
|
55
|
+
*/
|
|
56
|
+
key: string;
|
|
57
|
+
/**
|
|
58
|
+
* ,
|
|
59
|
+
*/
|
|
60
|
+
index: number;
|
|
61
|
+
/**
|
|
62
|
+
* ,
|
|
63
|
+
*/
|
|
64
|
+
linkedKey: string;
|
|
65
|
+
/**
|
|
66
|
+
* ,
|
|
67
|
+
*/
|
|
68
|
+
value: number | null;
|
|
69
|
+
/**
|
|
70
|
+
* ,
|
|
71
|
+
*/
|
|
72
|
+
valueElement: HTMLElement;
|
|
73
|
+
eventElement: EventTarget | null;
|
|
74
|
+
}) => void) | undefined;
|
|
75
|
+
onblur?: ((args: {
|
|
76
|
+
/**
|
|
77
|
+
* ,
|
|
78
|
+
*/
|
|
79
|
+
uid: string;
|
|
80
|
+
/**
|
|
81
|
+
* ,
|
|
82
|
+
*/
|
|
83
|
+
linkedKey: string;
|
|
84
|
+
/**
|
|
85
|
+
* ,
|
|
86
|
+
*/
|
|
87
|
+
valueElement: HTMLElement;
|
|
88
|
+
eventElement: EventTarget | null;
|
|
89
|
+
}) => void) | undefined;
|
|
41
90
|
} & {
|
|
42
|
-
[
|
|
43
|
-
}, {}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
91
|
+
[key: string]: any;
|
|
92
|
+
}, {}, "data">;
|
|
93
|
+
type Props = {
|
|
94
|
+
uid?: string | undefined;
|
|
95
|
+
data?: Record<string, number> | undefined;
|
|
96
|
+
labels?: string[] | undefined;
|
|
97
|
+
values?: number[] | undefined;
|
|
98
|
+
linked?: string | undefined;
|
|
99
|
+
height?: number | undefined;
|
|
100
|
+
width?: number | undefined;
|
|
101
|
+
barMinWidth?: number | undefined;
|
|
102
|
+
barMinHeight?: number | undefined;
|
|
103
|
+
hideBarBelow?: number | undefined;
|
|
104
|
+
grow?: boolean | undefined;
|
|
105
|
+
align?: "left" | "right" | undefined;
|
|
106
|
+
gap?: number | undefined;
|
|
107
|
+
fill?: string | undefined;
|
|
108
|
+
fadeOpacity?: number | undefined;
|
|
109
|
+
hover?: boolean | undefined;
|
|
110
|
+
transition?: number | undefined;
|
|
111
|
+
showValue?: boolean | undefined;
|
|
112
|
+
valueDefault?: string | undefined;
|
|
113
|
+
valuePrepend?: string | undefined;
|
|
114
|
+
valueAppend?: string | undefined;
|
|
115
|
+
valuePosition?: "static" | "floating" | undefined;
|
|
116
|
+
valueUndefined?: number | undefined;
|
|
117
|
+
scaleMax?: number | undefined;
|
|
118
|
+
scaleMin?: number | undefined;
|
|
119
|
+
type?: "bar" | "line" | undefined;
|
|
120
|
+
lineColor?: string | undefined;
|
|
121
|
+
tabindex?: 0 | -1 | undefined;
|
|
122
|
+
preserveAspectRatio?: boolean | undefined;
|
|
123
|
+
onclick?: ((args: {
|
|
124
|
+
key?: string | undefined;
|
|
125
|
+
index?: number | undefined;
|
|
126
|
+
}) => void) | undefined;
|
|
127
|
+
onvalueupdate?: ((args: {
|
|
128
|
+
value?: number | null | undefined;
|
|
129
|
+
uid?: string | undefined;
|
|
130
|
+
linkedKey?: string | undefined;
|
|
131
|
+
valueElement?: HTMLElement | null | undefined;
|
|
132
|
+
}) => void) | undefined;
|
|
133
|
+
onhover?: ((args: {
|
|
134
|
+
/**
|
|
135
|
+
* ,
|
|
136
|
+
*/
|
|
137
|
+
uid: string;
|
|
138
|
+
/**
|
|
139
|
+
* ,
|
|
140
|
+
*/
|
|
141
|
+
key: string;
|
|
142
|
+
/**
|
|
143
|
+
* ,
|
|
144
|
+
*/
|
|
145
|
+
index: number;
|
|
146
|
+
/**
|
|
147
|
+
* ,
|
|
148
|
+
*/
|
|
149
|
+
linkedKey: string;
|
|
150
|
+
/**
|
|
151
|
+
* ,
|
|
152
|
+
*/
|
|
153
|
+
value: number | null;
|
|
154
|
+
/**
|
|
155
|
+
* ,
|
|
156
|
+
*/
|
|
157
|
+
valueElement: HTMLElement;
|
|
158
|
+
eventElement: EventTarget | null;
|
|
159
|
+
}) => void) | undefined;
|
|
160
|
+
onblur?: ((args: {
|
|
161
|
+
/**
|
|
162
|
+
* ,
|
|
163
|
+
*/
|
|
164
|
+
uid: string;
|
|
165
|
+
/**
|
|
166
|
+
* ,
|
|
167
|
+
*/
|
|
168
|
+
linkedKey: string;
|
|
169
|
+
/**
|
|
170
|
+
* ,
|
|
171
|
+
*/
|
|
172
|
+
valueElement: HTMLElement;
|
|
173
|
+
eventElement: EventTarget | null;
|
|
174
|
+
}) => void) | undefined;
|
|
92
175
|
};
|
|
93
|
-
export {};
|
package/dist/LinkedLabel.svelte
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<script>
|
|
2
2
|
import { hoveringKey } from "./stores/tinyLinkedCharts.js"
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export let transform = (label) => label
|
|
4
|
+
/** @type {{ linked: string, empty?: string, transform?: (label: string) => string }} */
|
|
5
|
+
let { linked, empty = " ", transform = (label = "") => label } = $props()
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
/** @type {string | null} */
|
|
8
|
+
let label = $derived($hoveringKey[linked])
|
|
9
9
|
</script>
|
|
10
10
|
|
|
11
11
|
{#if label}
|
|
@@ -1,27 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
export default LinkedLabel;
|
|
2
|
+
type LinkedLabel = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
declare const LinkedLabel: import("svelte").Component<{
|
|
7
|
+
linked: string;
|
|
8
|
+
empty?: string;
|
|
9
|
+
transform?: (label: string) => string;
|
|
10
|
+
}, {}, "">;
|
|
11
|
+
type $$ComponentProps = {
|
|
12
|
+
linked: string;
|
|
6
13
|
empty?: string;
|
|
7
|
-
transform?: (label:
|
|
8
|
-
}, {
|
|
9
|
-
[evt: string]: CustomEvent<any>;
|
|
10
|
-
}, {}> {
|
|
11
|
-
}
|
|
12
|
-
export type LinkedLabelProps = typeof __propDef.props;
|
|
13
|
-
export type LinkedLabelEvents = typeof __propDef.events;
|
|
14
|
-
export type LinkedLabelSlots = typeof __propDef.slots;
|
|
15
|
-
import { SvelteComponent } from "svelte";
|
|
16
|
-
declare const __propDef: {
|
|
17
|
-
props: {
|
|
18
|
-
linked: any;
|
|
19
|
-
empty?: string;
|
|
20
|
-
transform?: (label: any) => any;
|
|
21
|
-
};
|
|
22
|
-
events: {
|
|
23
|
-
[evt: string]: CustomEvent<any>;
|
|
24
|
-
};
|
|
25
|
-
slots: {};
|
|
14
|
+
transform?: (label: string) => string;
|
|
26
15
|
};
|
|
27
|
-
export {};
|
package/dist/LinkedValue.svelte
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
<script>
|
|
2
2
|
import { hoveringValue } from "./stores/tinyLinkedCharts.js"
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
/** @type {{ uid: string, empty?: string, valueUndefined?: number, transform?: (value: number) => number | string }} */
|
|
5
|
+
let {
|
|
6
|
+
uid,
|
|
7
|
+
empty = " ",
|
|
8
|
+
valueUndefined = 0,
|
|
9
|
+
transform = (value) => value
|
|
10
|
+
} = $props()
|
|
8
11
|
|
|
9
|
-
|
|
12
|
+
/** @type {number | null} */
|
|
13
|
+
let value = $derived($hoveringValue[uid])
|
|
10
14
|
</script>
|
|
11
15
|
|
|
12
16
|
{#if uid in $hoveringValue && value !== null}
|
|
@@ -1,29 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
export default LinkedValue;
|
|
2
|
+
type LinkedValue = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
declare const LinkedValue: import("svelte").Component<{
|
|
7
|
+
uid: string;
|
|
8
|
+
empty?: string;
|
|
6
9
|
valueUndefined?: number;
|
|
10
|
+
transform?: (value: number) => number | string;
|
|
11
|
+
}, {}, "">;
|
|
12
|
+
type $$ComponentProps = {
|
|
13
|
+
uid: string;
|
|
7
14
|
empty?: string;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
[evt: string]: CustomEvent<any>;
|
|
11
|
-
}, {}> {
|
|
12
|
-
}
|
|
13
|
-
export type LinkedValueProps = typeof __propDef.props;
|
|
14
|
-
export type LinkedValueEvents = typeof __propDef.events;
|
|
15
|
-
export type LinkedValueSlots = typeof __propDef.slots;
|
|
16
|
-
import { SvelteComponent } from "svelte";
|
|
17
|
-
declare const __propDef: {
|
|
18
|
-
props: {
|
|
19
|
-
uid: any;
|
|
20
|
-
valueUndefined?: number;
|
|
21
|
-
empty?: string;
|
|
22
|
-
transform?: (value: any) => any;
|
|
23
|
-
};
|
|
24
|
-
events: {
|
|
25
|
-
[evt: string]: CustomEvent<any>;
|
|
26
|
-
};
|
|
27
|
-
slots: {};
|
|
15
|
+
valueUndefined?: number;
|
|
16
|
+
transform?: (value: number) => number | string;
|
|
28
17
|
};
|
|
29
|
-
export {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export const hoveringKey: import("svelte/store").Writable<
|
|
3
|
-
|
|
1
|
+
/** @type {import('svelte/store').Writable<Record<string, string | null>>} */
|
|
2
|
+
export const hoveringKey: import("svelte/store").Writable<Record<string, string | null>>;
|
|
3
|
+
/** @type {import('svelte/store').Writable<Record<string, number | null>>} */
|
|
4
|
+
export const hoveringValue: import("svelte/store").Writable<Record<string, number | null>>;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { writable } from "svelte/store"
|
|
2
2
|
|
|
3
|
+
/** @type {import('svelte/store').Writable<Record<string, string | null>>} */
|
|
3
4
|
export const hoveringKey = writable({})
|
|
5
|
+
|
|
6
|
+
/** @type {import('svelte/store').Writable<Record<string, number | null>>} */
|
|
4
7
|
export const hoveringValue = writable({})
|
package/package.json
CHANGED
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "svelte-tiny-linked-charts",
|
|
3
|
-
"version": "
|
|
4
|
-
"scripts": {
|
|
5
|
-
"dev": "vite dev",
|
|
6
|
-
"build": "vite build && npm run package",
|
|
7
|
-
"preview": "vite preview",
|
|
8
|
-
"package": "svelte-kit sync && svelte-package && publint",
|
|
9
|
-
"prepublishOnly": "npm run package",
|
|
10
|
-
"check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json",
|
|
11
|
-
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch",
|
|
12
|
-
"test": "vitest",
|
|
13
|
-
"lint": "prettier --plugin-search-dir . --check . && eslint .",
|
|
14
|
-
"format": "prettier --plugin-search-dir . --write .",
|
|
15
|
-
"publish-pages": "npm run build && git subtree push --prefix build origin gh-pages"
|
|
16
|
-
},
|
|
17
|
-
"exports": {
|
|
18
|
-
".": {
|
|
19
|
-
"types": "./dist/index.d.ts",
|
|
20
|
-
"svelte": "./dist/index.js"
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
"files": [
|
|
24
|
-
"dist",
|
|
25
|
-
"!dist/**/*.test.*",
|
|
26
|
-
"!dist/**/*.spec.*"
|
|
27
|
-
],
|
|
28
|
-
"peerDependencies": {
|
|
29
|
-
"svelte": "
|
|
30
|
-
},
|
|
31
|
-
"devDependencies": {
|
|
32
|
-
"@sveltejs/adapter-
|
|
33
|
-
"@sveltejs/adapter-
|
|
34
|
-
"@sveltejs/kit": "^
|
|
35
|
-
"@sveltejs/
|
|
36
|
-
"@
|
|
37
|
-
"
|
|
38
|
-
"eslint
|
|
39
|
-
"eslint-
|
|
40
|
-
"
|
|
41
|
-
"prettier": "^
|
|
42
|
-
"prettier-plugin-svelte": "^2.
|
|
43
|
-
"publint": "^0.1.9",
|
|
44
|
-
"svelte": "^
|
|
45
|
-
"svelte-check": "^
|
|
46
|
-
"tslib": "^2.4.1",
|
|
47
|
-
"typescript": "^5.
|
|
48
|
-
"vite": "^4.4
|
|
49
|
-
"vitest": "^
|
|
50
|
-
},
|
|
51
|
-
"svelte": "./dist/index.js",
|
|
52
|
-
"types": "./dist/index.d.ts",
|
|
53
|
-
"main": "./dist/index.js",
|
|
54
|
-
"type": "module",
|
|
55
|
-
"description": "A library to display tiny bar charts using Svelte. These charts are more so meant for graphic aids, rather than scientific representations. There's no axis labels, no extensive data visualisation, just bars.",
|
|
56
|
-
"keywords": [
|
|
57
|
-
"svelte",
|
|
58
|
-
"tiny",
|
|
59
|
-
"charts",
|
|
60
|
-
"linked",
|
|
61
|
-
"linked-charts",
|
|
62
|
-
"tiny-linked-charts"
|
|
63
|
-
],
|
|
64
|
-
"repository": {
|
|
65
|
-
"type": "git",
|
|
66
|
-
"url": "https://github.com/Mitcheljager/svelte-tiny-linked-charts"
|
|
67
|
-
},
|
|
68
|
-
"homepage": "https://mitcheljager.github.io/svelte-tiny-linked-charts/"
|
|
69
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "svelte-tiny-linked-charts",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"scripts": {
|
|
5
|
+
"dev": "vite dev",
|
|
6
|
+
"build": "vite build && npm run package",
|
|
7
|
+
"preview": "vite preview",
|
|
8
|
+
"package": "svelte-kit sync && svelte-package && publint",
|
|
9
|
+
"prepublishOnly": "npm run package",
|
|
10
|
+
"check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json",
|
|
11
|
+
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch",
|
|
12
|
+
"test": "vitest",
|
|
13
|
+
"lint": "prettier --plugin-search-dir . --check . && eslint .",
|
|
14
|
+
"format": "prettier --plugin-search-dir . --write .",
|
|
15
|
+
"publish-pages": "npm run build && git subtree push --prefix build origin gh-pages"
|
|
16
|
+
},
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"svelte": "./dist/index.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"!dist/**/*.test.*",
|
|
26
|
+
"!dist/**/*.spec.*"
|
|
27
|
+
],
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"svelte": ">=5.0.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@sveltejs/adapter-static": "^3.0.0",
|
|
33
|
+
"@sveltejs/adapter-auto": "^3.0.0",
|
|
34
|
+
"@sveltejs/kit": "^2.5.27",
|
|
35
|
+
"@sveltejs/vite-plugin-svelte": "^4.0.0",
|
|
36
|
+
"@sveltejs/package": "^2.3.7",
|
|
37
|
+
"@testing-library/svelte": "^5.2.6",
|
|
38
|
+
"eslint": "^9.0.0",
|
|
39
|
+
"eslint-config-prettier": "^9.1.0",
|
|
40
|
+
"happy-dom": "^16.5.3",
|
|
41
|
+
"prettier": "^3.1.0",
|
|
42
|
+
"prettier-plugin-svelte": "^3.2.6",
|
|
43
|
+
"publint": "^0.1.9",
|
|
44
|
+
"svelte": "^5.0.0",
|
|
45
|
+
"svelte-check": "^4.0.0",
|
|
46
|
+
"tslib": "^2.4.1",
|
|
47
|
+
"typescript": "^5.5.0",
|
|
48
|
+
"vite": "^5.4.4",
|
|
49
|
+
"vitest": "^2.1.8"
|
|
50
|
+
},
|
|
51
|
+
"svelte": "./dist/index.js",
|
|
52
|
+
"types": "./dist/index.d.ts",
|
|
53
|
+
"main": "./dist/index.js",
|
|
54
|
+
"type": "module",
|
|
55
|
+
"description": "A library to display tiny bar charts using Svelte. These charts are more so meant for graphic aids, rather than scientific representations. There's no axis labels, no extensive data visualisation, just bars.",
|
|
56
|
+
"keywords": [
|
|
57
|
+
"svelte",
|
|
58
|
+
"tiny",
|
|
59
|
+
"charts",
|
|
60
|
+
"linked",
|
|
61
|
+
"linked-charts",
|
|
62
|
+
"tiny-linked-charts"
|
|
63
|
+
],
|
|
64
|
+
"repository": {
|
|
65
|
+
"type": "git",
|
|
66
|
+
"url": "https://github.com/Mitcheljager/svelte-tiny-linked-charts"
|
|
67
|
+
},
|
|
68
|
+
"homepage": "https://mitcheljager.github.io/svelte-tiny-linked-charts/"
|
|
69
|
+
}
|