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 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
- dispatchEvents | false | Boolean whether or not to dispatch events on certain actions.
107
- clickHandler | null | Function that executes on click and returns the key and index for the clicked data.
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
@@ -1,63 +1,156 @@
1
1
  <script>
2
- import { createEventDispatcher, tick } from "svelte"
2
+ import { tick } from "svelte"
3
3
  import { hoveringKey, hoveringValue } from "./stores/tinyLinkedCharts.js"
4
4
 
5
- export let uid = (Math.random() + 1).toString(36).substring(7)
6
- export let data = {}
7
- export let labels = []
8
- export let values = []
9
- export let linked = ""
10
- export let height = 40
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 = "&nbsp;"
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 = "&nbsp;",
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 * parseInt(height)), barMinHeight)
161
+ return Math.max(Math.ceil(scaledValue * height), barMinHeight)
69
162
  }
70
163
 
164
+ /** @returns {number} */
71
165
  function getBarWidth() {
72
- return Math.max((parseInt(width) - (dataLength * parseInt(gap))) / dataLength, parseInt(barMinWidth))
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 (parseInt(gap) + parseInt(width)) - ((parseInt(gap) + barWidth) * dataLength)
172
+ return (gap + width) - ((gap + barWidth) * dataLength)
78
173
  }
79
174
 
80
- function getPolyLinePoints() {
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 + parseInt(gap)) + (barWidth / (Object.keys(data).length))), height - getHeight(Object.values(data)[i])])
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
- async function startHover(key, index) {
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
- if (dispatchEvents) dispatch('hover', { uid, key, index, linkedKey, value: $hoveringValue[uid], valueElement, eventElement: event.target })
197
+ onhover({ uid, key, index, linkedKey, value: $hoveringValue[uid], valueElement, eventElement: event.target })
97
198
  }
98
199
 
99
- async function endHover() {
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
- if (dispatchEvents) dispatch('blur', { uid, linkedKey, valueElement, eventElement: event.target })
210
+ onblur({ uid, linkedKey, valueElement, eventElement: event.target })
106
211
  }
107
212
  </script>
108
213
 
109
- <!-- svelte-ignore a11y-no-static-element-interactions -->
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
- {...$$restProps}
116
- on:mouseleave={endHover}
117
- on:blur={endHover}>
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={type == "line" ? height : getHeight(value)}
132
- x={(parseInt(gap) + barWidth) * i}
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 ? parseInt(barMinWidth) : barWidth / 2}
242
+ r={grow ? barMinWidth : barWidth / 2}
138
243
  cy={height - getHeight(value)}
139
- cx={((parseInt(gap) + barWidth) + (barWidth / (Object.keys(data).length))) * i} />
244
+ cx={((gap + barWidth) + (barWidth / (Object.keys(data).length))) * i} />
140
245
  {/if}
141
246
 
142
- <!-- svelte-ignore a11y-no-noninteractive-tabindex -->
143
- <!-- svelte-ignore a11y-no-static-element-interactions -->
247
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
248
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
144
249
  <rect
145
- on:mouseover={() => startHover(key, i)}
146
- on:focus={() => startHover(key, i)}
147
- on:touchstart={() => startHover(key, i)}
148
- on:click={() => clickHandler(key, i)}
149
- on:keypress={() => clickHandler(key, i)}
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={(parseInt(gap) + barWidth) * i}
258
+ x={(gap + barWidth) * i}
154
259
  {tabindex} />
155
260
  {/each}
156
261
  </g>
@@ -1,93 +1,175 @@
1
- /** @typedef {typeof __propDef.props} LinkedChartProps */
2
- /** @typedef {typeof __propDef.events} LinkedChartEvents */
3
- /** @typedef {typeof __propDef.slots} LinkedChartSlots */
4
- export default class LinkedChart extends SvelteComponent<{
5
- [x: string]: any;
6
- hover?: boolean;
7
- uid?: string;
8
- data?: {};
9
- labels?: any[];
10
- values?: any[];
11
- linked?: string;
12
- height?: number;
13
- width?: number;
14
- barMinWidth?: number;
15
- barMinHeight?: number;
16
- hideBarBelow?: number;
17
- grow?: boolean;
18
- align?: string;
19
- gap?: number;
20
- fill?: string;
21
- fadeOpacity?: number;
22
- transition?: number;
23
- showValue?: boolean;
24
- valueDefault?: string;
25
- valuePrepend?: string;
26
- valueAppend?: string;
27
- valuePosition?: string;
28
- valueUndefined?: number;
29
- scaleMax?: number;
30
- scaleMin?: number;
31
- type?: string;
32
- lineColor?: string;
33
- tabindex?: number;
34
- dispatchEvents?: boolean;
35
- preserveAspectRatio?: boolean;
36
- clickHandler?: (key: any, i: any) => any;
37
- }, {
38
- 'value-update': CustomEvent<any>;
39
- hover: CustomEvent<any>;
40
- blur: CustomEvent<any>;
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
- [evt: string]: CustomEvent<any>;
43
- }, {}> {
44
- }
45
- export type LinkedChartProps = typeof __propDef.props;
46
- export type LinkedChartEvents = typeof __propDef.events;
47
- export type LinkedChartSlots = typeof __propDef.slots;
48
- import { SvelteComponent } from "svelte";
49
- declare const __propDef: {
50
- props: {
51
- [x: string]: any;
52
- hover?: boolean;
53
- uid?: string;
54
- data?: {};
55
- labels?: any[];
56
- values?: any[];
57
- linked?: string;
58
- height?: number;
59
- width?: number;
60
- barMinWidth?: number;
61
- barMinHeight?: number;
62
- hideBarBelow?: number;
63
- grow?: boolean;
64
- align?: string;
65
- gap?: number;
66
- fill?: string;
67
- fadeOpacity?: number;
68
- transition?: number;
69
- showValue?: boolean;
70
- valueDefault?: string;
71
- valuePrepend?: string;
72
- valueAppend?: string;
73
- valuePosition?: string;
74
- valueUndefined?: number;
75
- scaleMax?: number;
76
- scaleMin?: number;
77
- type?: string;
78
- lineColor?: string;
79
- tabindex?: number;
80
- dispatchEvents?: boolean;
81
- preserveAspectRatio?: boolean;
82
- clickHandler?: (key: any, i: any) => any;
83
- };
84
- events: {
85
- 'value-update': CustomEvent<any>;
86
- hover: CustomEvent<any>;
87
- blur: CustomEvent<any>;
88
- } & {
89
- [evt: string]: CustomEvent<any>;
90
- };
91
- slots: {};
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 {};
@@ -1,11 +1,11 @@
1
1
  <script>
2
2
  import { hoveringKey } from "./stores/tinyLinkedCharts.js"
3
3
 
4
- export let linked
5
- export let empty = "&nbsp;"
6
- export let transform = (label) => label
4
+ /** @type {{ linked: string, empty?: string, transform?: (label: string) => string }} */
5
+ let { linked, empty = "&nbsp;", transform = (label = "") => label } = $props()
7
6
 
8
- $: label = $hoveringKey[linked]
7
+ /** @type {string | null} */
8
+ let label = $derived($hoveringKey[linked])
9
9
  </script>
10
10
 
11
11
  {#if label}
@@ -1,27 +1,15 @@
1
- /** @typedef {typeof __propDef.props} LinkedLabelProps */
2
- /** @typedef {typeof __propDef.events} LinkedLabelEvents */
3
- /** @typedef {typeof __propDef.slots} LinkedLabelSlots */
4
- export default class LinkedLabel extends SvelteComponent<{
5
- linked: any;
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: any) => any;
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 {};
@@ -1,12 +1,16 @@
1
1
  <script>
2
2
  import { hoveringValue } from "./stores/tinyLinkedCharts.js"
3
3
 
4
- export let uid
5
- export let empty = "&nbsp;"
6
- export let valueUndefined = 0
7
- export let transform = (value) => value
4
+ /** @type {{ uid: string, empty?: string, valueUndefined?: number, transform?: (value: number) => number | string }} */
5
+ let {
6
+ uid,
7
+ empty = "&nbsp;",
8
+ valueUndefined = 0,
9
+ transform = (value) => value
10
+ } = $props()
8
11
 
9
- $: value = $hoveringValue[uid]
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
- /** @typedef {typeof __propDef.props} LinkedValueProps */
2
- /** @typedef {typeof __propDef.events} LinkedValueEvents */
3
- /** @typedef {typeof __propDef.slots} LinkedValueSlots */
4
- export default class LinkedValue extends SvelteComponent<{
5
- uid: any;
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
- transform?: (value: any) => any;
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
- /// <reference types="svelte" />
2
- export const hoveringKey: import("svelte/store").Writable<{}>;
3
- export const hoveringValue: import("svelte/store").Writable<{}>;
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": "1.6.2",
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": "^4.0.0 || >= 5.0.0"
30
- },
31
- "devDependencies": {
32
- "@sveltejs/adapter-auto": "^2.0.0",
33
- "@sveltejs/adapter-static": "^2.0.3",
34
- "@sveltejs/kit": "^1.20.4",
35
- "@sveltejs/package": "^2.0.0",
36
- "@testing-library/svelte": "^4.0.3",
37
- "eslint": "^8.28.0",
38
- "eslint-config-prettier": "^8.5.0",
39
- "eslint-plugin-svelte": "^2.30.0",
40
- "jsdom": "^22.1.0",
41
- "prettier": "^2.8.0",
42
- "prettier-plugin-svelte": "^2.10.1",
43
- "publint": "^0.1.9",
44
- "svelte": "^4.0.5",
45
- "svelte-check": "^3.4.3",
46
- "tslib": "^2.4.1",
47
- "typescript": "^5.0.0",
48
- "vite": "^4.4.2",
49
- "vitest": "^0.34.0"
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
+ }