lutra 0.0.20 → 0.0.33
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/dist/color.css +0 -0
- package/dist/display/Avatar.svelte +1 -1
- package/dist/display/Avatar.svelte.d.ts +18 -22
- package/dist/display/Badge.svelte +2 -4
- package/dist/display/Badge.svelte.d.ts +28 -32
- package/dist/display/Callout.svelte +8 -8
- package/dist/display/Callout.svelte.d.ts +27 -35
- package/dist/display/Close.svelte.d.ts +17 -20
- package/dist/display/Code.svelte +26 -31
- package/dist/display/Code.svelte.d.ts +31 -30
- package/dist/display/ContextTip.svelte +2 -5
- package/dist/display/ContextTip.svelte.d.ts +16 -20
- package/dist/display/DataList.svelte +16 -0
- package/dist/display/DataList.svelte.d.ts +21 -0
- package/dist/display/Details.svelte.d.ts +25 -30
- package/dist/display/Hero.svelte.d.ts +24 -28
- package/dist/display/Icon.svelte +3 -4
- package/dist/display/Icon.svelte.d.ts +18 -23
- package/dist/display/IconButton.svelte +12 -5
- package/dist/display/IconButton.svelte.d.ts +26 -29
- package/dist/display/Image.svelte.d.ts +25 -36
- package/dist/display/Indicator.svelte.d.ts +21 -22
- package/dist/display/Inset.svelte.d.ts +16 -20
- package/dist/display/LineChart.svelte +385 -0
- package/dist/display/LineChart.svelte.d.ts +24 -0
- package/dist/display/LoadingIndicator.svelte +33 -0
- package/dist/display/LoadingIndicator.svelte.d.ts +15 -0
- package/dist/display/Modal.svelte +116 -0
- package/dist/display/Modal.svelte.d.ts +27 -0
- package/dist/display/Notification.svelte.d.ts +22 -41
- package/dist/display/Panel.svelte +23 -0
- package/dist/display/Panel.svelte.d.ts +19 -0
- package/dist/display/Popup.svelte.d.ts +23 -28
- package/dist/{data → display}/Stat.svelte +9 -17
- package/dist/display/Stat.svelte.d.ts +30 -0
- package/dist/display/Table.svelte +14 -10
- package/dist/display/Table.svelte.d.ts +22 -32
- package/dist/display/TablePaginator.svelte +51 -0
- package/dist/display/TablePaginator.svelte.d.ts +21 -0
- package/dist/display/Tag.svelte.d.ts +29 -32
- package/dist/display/Tooltip.svelte +5 -4
- package/dist/display/Tooltip.svelte.d.ts +21 -26
- package/dist/display/chart.d.ts +78 -0
- package/dist/display/chart.js +212 -0
- package/dist/display/index.d.ts +11 -1
- package/dist/display/index.js +11 -1
- package/dist/display/notifications.svelte.d.ts +3 -3
- package/dist/display/notifications.svelte.js +2 -2
- package/dist/form/Button.svelte +7 -2
- package/dist/form/Button.svelte.d.ts +25 -35
- package/dist/form/FieldActions.svelte +25 -3
- package/dist/form/FieldActions.svelte.d.ts +18 -22
- package/dist/form/FieldContainer.svelte +1 -1
- package/dist/form/FieldContainer.svelte.d.ts +17 -22
- package/dist/form/FieldContent.svelte +52 -33
- package/dist/form/FieldContent.svelte.d.ts +28 -56
- package/dist/form/FieldError.svelte.d.ts +17 -20
- package/dist/form/FieldSection.svelte.d.ts +18 -32
- package/dist/form/Fieldset.svelte.d.ts +29 -40
- package/dist/form/Form.svelte +55 -17
- package/dist/form/Form.svelte.d.ts +36 -31
- package/dist/form/ImageUpload.svelte +259 -0
- package/dist/form/ImageUpload.svelte.d.ts +31 -0
- package/dist/form/Input.svelte +192 -153
- package/dist/form/Input.svelte.d.ts +115 -140
- package/dist/form/InputLength.svelte.d.ts +19 -20
- package/dist/form/Label.svelte +21 -4
- package/dist/form/Label.svelte.d.ts +24 -30
- package/dist/form/LogoUpload.svelte +100 -0
- package/dist/form/LogoUpload.svelte.d.ts +29 -0
- package/dist/form/Select.svelte +84 -36
- package/dist/form/Select.svelte.d.ts +69 -96
- package/dist/form/Textarea.svelte +163 -0
- package/dist/form/Textarea.svelte.d.ts +108 -0
- package/dist/form/Toggle.svelte +2 -0
- package/dist/form/Toggle.svelte.d.ts +15 -0
- package/dist/form/client.svelte.d.ts +8 -9
- package/dist/form/client.svelte.js +18 -10
- package/dist/form/form.d.ts +6 -4
- package/dist/form/form.js +23 -9
- package/dist/form/index.d.ts +6 -3
- package/dist/form/index.js +6 -3
- package/dist/form/types.d.ts +11 -1
- package/dist/icons/IconAlert.svelte.d.ts +23 -0
- package/dist/icons/{Copy.svelte → IconCopy.svelte} +1 -1
- package/dist/icons/IconCopy.svelte.d.ts +23 -0
- package/dist/icons/IconDone.svelte.d.ts +23 -0
- package/dist/icons/IconError.svelte.d.ts +23 -0
- package/dist/icons/IconHelp.svelte.d.ts +23 -0
- package/dist/icons/IconHide.svelte.d.ts +23 -0
- package/dist/icons/IconInfo.svelte.d.ts +23 -0
- package/dist/icons/IconLink.svelte.d.ts +23 -0
- package/dist/icons/IconMenuBurger.svelte.d.ts +23 -0
- package/dist/icons/IconMenuDots.svelte.d.ts +23 -0
- package/dist/icons/IconSearch.svelte +3 -0
- package/dist/icons/IconSearch.svelte.d.ts +23 -0
- package/dist/icons/IconShow.svelte.d.ts +23 -0
- package/dist/icons/IconSuccess.svelte.d.ts +23 -0
- package/dist/icons/IconWarning.svelte.d.ts +23 -0
- package/dist/icons/index.d.ts +14 -11
- package/dist/icons/index.js +14 -11
- package/dist/layout/Layout.svelte +7 -5
- package/dist/layout/Layout.svelte.d.ts +19 -22
- package/dist/layout/LayoutFooter.svelte.d.ts +17 -18
- package/dist/layout/LayoutGrid.svelte.d.ts +25 -36
- package/dist/layout/LayoutHeader.svelte +3 -0
- package/dist/layout/LayoutHeader.svelte.d.ts +33 -38
- package/dist/layout/LayoutSideMenu.svelte +18 -17
- package/dist/layout/LayoutSideMenu.svelte.d.ts +18 -22
- package/dist/layout/Overlay.svelte.d.ts +22 -32
- package/dist/layout/OverlayContainer.svelte.d.ts +14 -15
- package/dist/layout/OverlayLayer.svelte +6 -11
- package/dist/layout/OverlayLayer.svelte.d.ts +17 -20
- package/dist/layout/PageContent.svelte +9 -24
- package/dist/layout/PageContent.svelte.d.ts +23 -26
- package/dist/layout/Theme.svelte +19 -4
- package/dist/layout/Theme.svelte.d.ts +17 -22
- package/dist/layout/UIContent.svelte.d.ts +16 -20
- package/dist/layout/index.d.ts +5 -1
- package/dist/layout/index.js +5 -1
- package/dist/layout/overlays.svelte.d.ts +2 -2
- package/dist/nav/Breadcrumb.svelte +1 -1
- package/dist/nav/Breadcrumb.svelte.d.ts +26 -31
- package/dist/nav/Menu.svelte +6 -13
- package/dist/nav/Menu.svelte.d.ts +25 -31
- package/dist/nav/MenuItem.svelte +15 -8
- package/dist/nav/MenuItem.svelte.d.ts +20 -24
- package/dist/nav/MenuTypes.d.ts +7 -7
- package/dist/nav/NavMenu.svelte +7 -9
- package/dist/nav/NavMenu.svelte.d.ts +17 -18
- package/dist/nav/TabbedContent.svelte +1 -1
- package/dist/nav/TabbedContent.svelte.d.ts +21 -22
- package/dist/nav/Tabs.svelte +53 -13
- package/dist/nav/Tabs.svelte.d.ts +24 -25
- package/dist/nav/index.d.ts +2 -1
- package/dist/nav/index.js +2 -1
- package/dist/style.css +176 -79
- package/dist/typo/Clamp.svelte.d.ts +22 -26
- package/dist/typo/H.svelte.d.ts +26 -30
- package/dist/typo/H1.svelte.d.ts +24 -28
- package/dist/typo/H2.svelte.d.ts +24 -28
- package/dist/typo/H3.svelte.d.ts +24 -28
- package/dist/typo/H4.svelte.d.ts +24 -28
- package/dist/typo/H5.svelte.d.ts +24 -28
- package/dist/typo/H6.svelte.d.ts +24 -28
- package/dist/typo/P.svelte.d.ts +24 -28
- package/dist/utils/StringOrComponent.svelte +14 -0
- package/dist/utils/StringOrComponent.svelte.d.ts +19 -0
- package/dist/utils/StringOrSnippet.svelte +11 -0
- package/dist/utils/StringOrSnippet.svelte.d.ts +19 -0
- package/dist/utils/color.d.ts +1 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/isSnippet.d.ts +3 -5
- package/dist/utils/isSnippet.js +9 -4
- package/package.json +32 -25
- package/dist/data/Stat.svelte.d.ts +0 -39
- package/dist/data/index.d.ts +0 -1
- package/dist/data/index.js +0 -1
- package/dist/grid/Column.svelte +0 -11
- package/dist/grid/Column.svelte.d.ts +0 -22
- package/dist/grid/Grid.svelte +0 -19
- package/dist/grid/Grid.svelte.d.ts +0 -24
- package/dist/grid/Row.svelte +0 -44
- package/dist/grid/Row.svelte.d.ts +0 -24
- package/dist/icons/Alert.svelte.d.ts +0 -23
- package/dist/icons/Copy.svelte.d.ts +0 -23
- package/dist/icons/Done.svelte.d.ts +0 -23
- package/dist/icons/Error.svelte.d.ts +0 -23
- package/dist/icons/Help.svelte.d.ts +0 -23
- package/dist/icons/Hide.svelte.d.ts +0 -23
- package/dist/icons/Info.svelte.d.ts +0 -23
- package/dist/icons/Link.svelte.d.ts +0 -23
- package/dist/icons/MenuBurger.svelte.d.ts +0 -23
- package/dist/icons/MenuDots.svelte.d.ts +0 -23
- package/dist/icons/Show.svelte.d.ts +0 -23
- package/dist/icons/Success.svelte.d.ts +0 -23
- package/dist/icons/Warning.svelte.d.ts +0 -23
- package/dist/utils/StringOrComponentOrSnippet.svelte +0 -14
- package/dist/utils/StringOrComponentOrSnippet.svelte.d.ts +0 -24
- /package/dist/icons/{Alert.svelte → IconAlert.svelte} +0 -0
- /package/dist/icons/{Done.svelte → IconDone.svelte} +0 -0
- /package/dist/icons/{Error.svelte → IconError.svelte} +0 -0
- /package/dist/icons/{Help.svelte → IconHelp.svelte} +0 -0
- /package/dist/icons/{Hide.svelte → IconHide.svelte} +0 -0
- /package/dist/icons/{Info.svelte → IconInfo.svelte} +0 -0
- /package/dist/icons/{Link.svelte → IconLink.svelte} +0 -0
- /package/dist/icons/{MenuBurger.svelte → IconMenuBurger.svelte} +0 -0
- /package/dist/icons/{MenuDots.svelte → IconMenuDots.svelte} +0 -0
- /package/dist/icons/{Show.svelte → IconShow.svelte} +0 -0
- /package/dist/icons/{Success.svelte → IconSuccess.svelte} +0 -0
- /package/dist/icons/{Warning.svelte → IconWarning.svelte} +0 -0
@@ -0,0 +1,385 @@
|
|
1
|
+
<script lang="ts">import { onMount } from "svelte";
|
2
|
+
import { makeScale, getShortKValue, catmullRomToSVG, catmullRomBase, catmullRomGetY, getSVGSize } from "./chart.js";
|
3
|
+
let {
|
4
|
+
contained,
|
5
|
+
rounded,
|
6
|
+
tension = 0.1,
|
7
|
+
data = {
|
8
|
+
labels: [],
|
9
|
+
values: []
|
10
|
+
},
|
11
|
+
options = {
|
12
|
+
yValues: 8
|
13
|
+
}
|
14
|
+
} = $props();
|
15
|
+
if (!options?.yValues) {
|
16
|
+
options.yValues = 5;
|
17
|
+
}
|
18
|
+
let svg;
|
19
|
+
let mouseX = $state(0);
|
20
|
+
let withinBounds = $state(false);
|
21
|
+
const colors = ["#881177", "#aa3355", "#cc6666", "#ee9944", "#eedd00", "#99dd55", "#44aa88", "#22ccbb", "#00bbcc", "#0099cc", "#3366bb"];
|
22
|
+
const colorSets = [
|
23
|
+
["#881177", "#aa3355"],
|
24
|
+
["#cc6666", "#ee9944"],
|
25
|
+
["#eedd00", "#99dd55"],
|
26
|
+
["#44aa88", "#22ccbb"],
|
27
|
+
["#00bbcc", "#0099cc"],
|
28
|
+
["#3366bb", "#3366bb"]
|
29
|
+
];
|
30
|
+
const scaledValues = makeScale(data.values, options.yValues);
|
31
|
+
const maxScaledValue = Math.max(...scaledValues);
|
32
|
+
const coords = data.values?.map((value, index) => ({
|
33
|
+
x: index * (100 / (data.labels.length - 1)),
|
34
|
+
y: 100 - value * 100 / maxScaledValue
|
35
|
+
}));
|
36
|
+
const pointsData = catmullRomBase(coords || [], tension);
|
37
|
+
function generatePath() {
|
38
|
+
const d = catmullRomToSVG(pointsData, tension, coords[0]);
|
39
|
+
let path2 = `M` + d;
|
40
|
+
return path2;
|
41
|
+
}
|
42
|
+
const path = generatePath();
|
43
|
+
function handleMouseMove(event) {
|
44
|
+
const rect = svg.getBoundingClientRect();
|
45
|
+
const styles = window.getComputedStyle(svg);
|
46
|
+
const leftPadding = parseFloat(styles.paddingLeft);
|
47
|
+
const rightPadding = parseFloat(styles.paddingRight);
|
48
|
+
const padding = leftPadding + rightPadding;
|
49
|
+
const width = rect.width - padding;
|
50
|
+
if (event.clientX > rect.left && event.clientX < rect.right) {
|
51
|
+
withinBounds = true;
|
52
|
+
} else {
|
53
|
+
withinBounds = false;
|
54
|
+
}
|
55
|
+
mouseX = event.clientX - svg.getBoundingClientRect().left;
|
56
|
+
}
|
57
|
+
let dotY = $derived.by(() => {
|
58
|
+
if (mouseX) {
|
59
|
+
return getYAtIndex(findClosestValueIndex(mouseX));
|
60
|
+
}
|
61
|
+
return 0;
|
62
|
+
});
|
63
|
+
function handleMouseOut(event) {
|
64
|
+
if (event.composedPath().includes(svg)) {
|
65
|
+
withinBounds = true;
|
66
|
+
} else {
|
67
|
+
withinBounds = false;
|
68
|
+
}
|
69
|
+
}
|
70
|
+
function getYAtIndex(index) {
|
71
|
+
const { innerWidth, innerHeight, padding, height } = getSVGSize(svg);
|
72
|
+
const heightPaddingRatio = innerHeight / height;
|
73
|
+
const ret = catmullRomGetY(pointsData, tension, (getXatIndex(index) - padding.left) / innerWidth * 100, heightPaddingRatio);
|
74
|
+
return ret;
|
75
|
+
}
|
76
|
+
function getXatIndex(index) {
|
77
|
+
const { innerWidth, innerHeight, padding } = getSVGSize(svg);
|
78
|
+
return index / (data.labels.length - 1) * innerWidth + padding.left;
|
79
|
+
}
|
80
|
+
function findClosestValueIndex(x) {
|
81
|
+
const { innerWidth, innerHeight, padding } = getSVGSize(svg);
|
82
|
+
let index = Math.round((x - padding.left) / innerWidth * (data.labels.length - 1));
|
83
|
+
if (index < 0) {
|
84
|
+
index = 0;
|
85
|
+
}
|
86
|
+
if (index > data.labels.length - 1) {
|
87
|
+
index = data.labels.length - 1;
|
88
|
+
}
|
89
|
+
return index;
|
90
|
+
}
|
91
|
+
</script>
|
92
|
+
|
93
|
+
<div class="ChartContainer" class:contained class:rounded>
|
94
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
95
|
+
<!-- svelte-ignore a11y_mouse_events_have_key_events -->
|
96
|
+
<div class="Chart" style="--items: {data.labels.length};" onmousemove={handleMouseMove} onmouseout={handleMouseOut}>
|
97
|
+
<svg bind:this={svg} viewBox={`0 0 100 100`} preserveAspectRatio="none">
|
98
|
+
<defs>
|
99
|
+
<linearGradient id="myGradient" x1="0%" x2="0%" y1="0%" y2="100%" gradientTransform="matrix(1, 0, 0, 1.5, 0, 0)">
|
100
|
+
<stop offset="0%" stop-color="#0099cc"/>
|
101
|
+
<stop offset="100%" stop-color="#0099cc" stop-opacity="0"/>
|
102
|
+
</linearGradient>
|
103
|
+
</defs>
|
104
|
+
<g class="Curve">
|
105
|
+
<path
|
106
|
+
stroke="#0099cc"
|
107
|
+
stroke-width="2"
|
108
|
+
fill="none"
|
109
|
+
d={path}
|
110
|
+
/>
|
111
|
+
</g>
|
112
|
+
<g class="Curve2">
|
113
|
+
<path
|
114
|
+
fill="url(#myGradient)"
|
115
|
+
fill-rule="nonzero"
|
116
|
+
d={path+`L 100 100 L 0 100 Z`}
|
117
|
+
/>
|
118
|
+
</g>
|
119
|
+
</svg>
|
120
|
+
<div class="X Axis">
|
121
|
+
<div class="Labels">
|
122
|
+
{#each data.labels as label, i}
|
123
|
+
<span style="left: calc(
|
124
|
+
({i * (100 / (data.labels.length - 1))}%)
|
125
|
+
)">
|
126
|
+
{label}
|
127
|
+
</span>
|
128
|
+
{/each}
|
129
|
+
</div>
|
130
|
+
</div>
|
131
|
+
<div class="Y Axis">
|
132
|
+
<div class="Labels">
|
133
|
+
{#each scaledValues as maxValue, index}
|
134
|
+
<span style="bottom: calc(
|
135
|
+
({index * (100 / scaledValues.length + ((options.yValues || 5) - scaledValues.length + 1))}%)
|
136
|
+
)">
|
137
|
+
{getShortKValue(maxValue)}
|
138
|
+
</span>
|
139
|
+
{/each}
|
140
|
+
</div>
|
141
|
+
</div>
|
142
|
+
<div class="Lines">
|
143
|
+
<div class="Y">
|
144
|
+
{#each scaledValues as maxValue, index}
|
145
|
+
<span style="bottom: calc(
|
146
|
+
({index * (100 / scaledValues.length + ((options.yValues || 5) - scaledValues.length + 1))}%)
|
147
|
+
)">
|
148
|
+
</span>
|
149
|
+
{/each}
|
150
|
+
</div>
|
151
|
+
<div class="X">
|
152
|
+
{#each data.labels as label, index}
|
153
|
+
<span style="left: calc((
|
154
|
+
({index * (100 / (data.labels.length - 1))}%)
|
155
|
+
)"
|
156
|
+
class:hover={withinBounds && findClosestValueIndex(mouseX) == index}
|
157
|
+
>
|
158
|
+
</span>
|
159
|
+
{/each}
|
160
|
+
</div>
|
161
|
+
</div>
|
162
|
+
{#if withinBounds}
|
163
|
+
<div class="InteractiveDot">
|
164
|
+
<div class="Dot" class:last={findClosestValueIndex(mouseX) >= data.labels.length / 2} style="left: calc({getXatIndex(findClosestValueIndex(mouseX))}px - var(--interactive-dot-size) / 2); top: calc({dotY}% - var(--interactive-dot-size) / 2);">
|
165
|
+
<div class="DotValue">
|
166
|
+
<span>{data.labels[findClosestValueIndex(mouseX)] ? data.labels[findClosestValueIndex(mouseX)] : ''}</span>
|
167
|
+
{data.values[findClosestValueIndex(mouseX)] || 0}
|
168
|
+
</div>
|
169
|
+
</div>
|
170
|
+
</div>
|
171
|
+
{/if}
|
172
|
+
</div>
|
173
|
+
</div>
|
174
|
+
|
175
|
+
<style>
|
176
|
+
.ChartContainer {
|
177
|
+
position: relative;
|
178
|
+
width: 100%;
|
179
|
+
height: 100%;
|
180
|
+
}
|
181
|
+
.ChartContainer.contained {
|
182
|
+
padding: 1rem 1rem 2rem 3rem;
|
183
|
+
border: var(--border);
|
184
|
+
}
|
185
|
+
.ChartContainer.rounded {
|
186
|
+
border-radius: var(--border-radius);
|
187
|
+
}
|
188
|
+
.Chart {
|
189
|
+
--chart-padding: 1rem;
|
190
|
+
--dot-size: 0.5rem;
|
191
|
+
--interactive-dot-size: 1rem;
|
192
|
+
--dot-hitbox: calc(100% / var(--items)) / 2;
|
193
|
+
--border-alpha: color-mix(in srgb, var(--border-color) 70%, transparent);
|
194
|
+
position: relative;
|
195
|
+
width: 100%;
|
196
|
+
height: 100%;
|
197
|
+
user-select: none;
|
198
|
+
}
|
199
|
+
svg {
|
200
|
+
background: var(--bg);
|
201
|
+
padding-left: calc(var(--chart-padding));
|
202
|
+
padding-right: calc(var(--chart-padding));
|
203
|
+
padding-top: calc(var(--chart-padding));
|
204
|
+
padding-bottom: calc(var(--chart-padding));
|
205
|
+
overflow: visible;
|
206
|
+
position: relative;
|
207
|
+
width: 100%;
|
208
|
+
height: 100%;
|
209
|
+
}
|
210
|
+
.Curve2 {
|
211
|
+
opacity: 0.65;
|
212
|
+
}
|
213
|
+
svg * {
|
214
|
+
vector-effect: non-scaling-stroke;
|
215
|
+
}
|
216
|
+
|
217
|
+
/* dots */
|
218
|
+
.InteractiveDot {
|
219
|
+
padding: var(--chart-padding) 0 var(--chart-padding) 0;
|
220
|
+
position: absolute;
|
221
|
+
top: 0;
|
222
|
+
left: 0;
|
223
|
+
width: 100%;
|
224
|
+
height: 100%;
|
225
|
+
display: flex;
|
226
|
+
justify-content: stretch;
|
227
|
+
}
|
228
|
+
.Dot {
|
229
|
+
position: relative;
|
230
|
+
left: calc((-1 * var(--dot-hitbox) + var(--dot-size) / 2) - 2px);
|
231
|
+
width: var(--dot-size);
|
232
|
+
height: var(--dot-size);
|
233
|
+
background: orange;
|
234
|
+
border-radius: 50%;
|
235
|
+
border: var(--border-subtle);
|
236
|
+
outline: 0px;
|
237
|
+
opacity: 0;
|
238
|
+
}
|
239
|
+
.InteractiveDot .Dot {
|
240
|
+
opacity: 1;
|
241
|
+
width: var(--interactive-dot-size);
|
242
|
+
height: var(--interactive-dot-size);
|
243
|
+
transition: left 0.15s ease-out, top 0.15s ease-out;
|
244
|
+
}
|
245
|
+
.InteractiveDot {
|
246
|
+
pointer-events: none;
|
247
|
+
}
|
248
|
+
.DotValue {
|
249
|
+
position: absolute;
|
250
|
+
top: calc(-1 * var(--dot-size) / 2 + 0.25rem + 2px);
|
251
|
+
left: calc(var(--dot-size) + 1rem);
|
252
|
+
background: var(--bg-app);
|
253
|
+
transform: translateY(-50%);
|
254
|
+
color: var(--text);
|
255
|
+
padding: 0.75rem 1rem;
|
256
|
+
border: var(--border);
|
257
|
+
border-radius: var(--border-radius);
|
258
|
+
box-shadow: 0px 0.5rem 1rem var(--shadow);
|
259
|
+
white-space: nowrap;
|
260
|
+
transition: all 0.2s;
|
261
|
+
font-size: 1.5rem;
|
262
|
+
line-height: 2rem;
|
263
|
+
font-weight: 500;
|
264
|
+
}
|
265
|
+
.DotValue span {
|
266
|
+
font-size: 0.9rem;
|
267
|
+
line-height: 1.4rem;
|
268
|
+
font-weight: 400;
|
269
|
+
display: block;
|
270
|
+
}
|
271
|
+
|
272
|
+
/* Axis */
|
273
|
+
.Axis {
|
274
|
+
position: absolute;
|
275
|
+
top: 0;
|
276
|
+
pointer-events: none;
|
277
|
+
transition: opacity 0.4s;
|
278
|
+
}
|
279
|
+
.X.Axis {
|
280
|
+
bottom: 0;
|
281
|
+
top: auto;
|
282
|
+
width: 100%;
|
283
|
+
height: auto;
|
284
|
+
}
|
285
|
+
|
286
|
+
.Y.Axis {
|
287
|
+
height: 100%;
|
288
|
+
}
|
289
|
+
|
290
|
+
.Lines {
|
291
|
+
position: absolute;
|
292
|
+
top: 0;
|
293
|
+
left: 0;
|
294
|
+
width: 100%;
|
295
|
+
height: 100%;
|
296
|
+
pointer-events: none;
|
297
|
+
}
|
298
|
+
.InteractiveDot {
|
299
|
+
visibility: hidden;
|
300
|
+
}
|
301
|
+
|
302
|
+
.Chart:hover .InteractiveDot {
|
303
|
+
visibility: visible;
|
304
|
+
}
|
305
|
+
|
306
|
+
.Lines .X, .Lines .Y {
|
307
|
+
position: absolute;
|
308
|
+
top: 0;
|
309
|
+
left: 0;
|
310
|
+
width: 100%;
|
311
|
+
height: 100%;
|
312
|
+
}
|
313
|
+
|
314
|
+
.Lines .Y {
|
315
|
+
top: var(--chart-padding);
|
316
|
+
height: calc(100% - 2 * var(--chart-padding));
|
317
|
+
}
|
318
|
+
.Lines .X {
|
319
|
+
left: var(--chart-padding);
|
320
|
+
width: calc(100% - 2 * var(--chart-padding));
|
321
|
+
}
|
322
|
+
|
323
|
+
.Lines .X span {
|
324
|
+
display: block;
|
325
|
+
position: absolute;
|
326
|
+
left: var(--chart-padding);
|
327
|
+
height: 100%;
|
328
|
+
border-left: 1px dotted var(--border-alpha);
|
329
|
+
transform: translateX(-50%);
|
330
|
+
}
|
331
|
+
|
332
|
+
.Lines .Y span {
|
333
|
+
display: block;
|
334
|
+
position: absolute;
|
335
|
+
width: 100%;
|
336
|
+
border-top: 1px dotted var(--border-alpha);
|
337
|
+
}
|
338
|
+
|
339
|
+
.Chart:hover .Lines .X span.hover {
|
340
|
+
border-left-style: solid;
|
341
|
+
border-left-color: orange;
|
342
|
+
border-left-width: 3px;
|
343
|
+
outline: 1px solid var(--bg);
|
344
|
+
}
|
345
|
+
|
346
|
+
.Axis .Labels {
|
347
|
+
position: absolute;
|
348
|
+
top: 0;
|
349
|
+
width: 100%;
|
350
|
+
height: 100%;
|
351
|
+
}
|
352
|
+
|
353
|
+
.X.Axis .Labels {
|
354
|
+
left: var(--chart-padding);
|
355
|
+
width: calc(100% - 2 * var(--chart-padding));
|
356
|
+
pointer-events: none;
|
357
|
+
}
|
358
|
+
|
359
|
+
.Y.Axis .Labels {
|
360
|
+
top: calc((var(--chart-padding) * 2) - 0.075rem);
|
361
|
+
height: calc(100% - 2 * var(--chart-padding));
|
362
|
+
pointer-events: none;
|
363
|
+
}
|
364
|
+
|
365
|
+
.Axis span {
|
366
|
+
font-size: 0.65rem;
|
367
|
+
line-height: 1rem;
|
368
|
+
color: var(--text-lighter);
|
369
|
+
position: absolute;
|
370
|
+
line-height: 1;
|
371
|
+
}
|
372
|
+
|
373
|
+
.Y.Axis .Labels span {
|
374
|
+
left: -0.5rem;
|
375
|
+
transform: translate(-100%,-100%);
|
376
|
+
}
|
377
|
+
|
378
|
+
.X.Axis .Labels span {
|
379
|
+
top: 0.5rem;
|
380
|
+
transform: translate(-50%,0);
|
381
|
+
white-space: nowrap;
|
382
|
+
text-align: center;
|
383
|
+
}
|
384
|
+
|
385
|
+
</style>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import { type ChartData } from './chart.js';
|
2
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
3
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
4
|
+
$$bindings?: Bindings;
|
5
|
+
} & Exports;
|
6
|
+
(internal: unknown, props: Props & {
|
7
|
+
$$events?: Events;
|
8
|
+
$$slots?: Slots;
|
9
|
+
}): Exports;
|
10
|
+
z_$$bindings?: Bindings;
|
11
|
+
}
|
12
|
+
declare const LineChart: $$__sveltets_2_IsomorphicComponent<{
|
13
|
+
contained?: boolean;
|
14
|
+
rounded?: boolean;
|
15
|
+
tension?: number;
|
16
|
+
data: ChartData;
|
17
|
+
options?: {
|
18
|
+
yValues?: number;
|
19
|
+
};
|
20
|
+
}, {
|
21
|
+
[evt: string]: CustomEvent<any>;
|
22
|
+
}, {}, {}, "">;
|
23
|
+
type LineChart = InstanceType<typeof LineChart>;
|
24
|
+
export default LineChart;
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<script lang="ts">import { navigating } from "$app/stores";
|
2
|
+
</script>
|
3
|
+
|
4
|
+
<div class="LoadingIndicator" class:visible={$navigating}>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<style>
|
8
|
+
.LoadingIndicator {
|
9
|
+
position: fixed;
|
10
|
+
height: 8px;
|
11
|
+
width: 100%;
|
12
|
+
bottom: 0;
|
13
|
+
left: 0;
|
14
|
+
z-index: 10000000;
|
15
|
+
background-image: linear-gradient(to right,#817,#a35,#c66,#e94,#ed0,#9d5,#4d8,#2cb,#0bc,#09c,#36b,#639,#817);
|
16
|
+
background-size: 200% 100%;
|
17
|
+
opacity: 0;
|
18
|
+
transition: opacity 0.2s ease-in;
|
19
|
+
pointer-events: none;
|
20
|
+
}
|
21
|
+
.LoadingIndicator.visible {
|
22
|
+
opacity: 1;
|
23
|
+
animation: stripe 2s linear infinite;
|
24
|
+
}
|
25
|
+
@keyframes stripe {
|
26
|
+
0% {
|
27
|
+
background-position: 0 0;
|
28
|
+
}
|
29
|
+
100% {
|
30
|
+
background-position: 200% 0;
|
31
|
+
}
|
32
|
+
}
|
33
|
+
</style>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
2
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
3
|
+
$$bindings?: Bindings;
|
4
|
+
} & Exports;
|
5
|
+
(internal: unknown, props: {
|
6
|
+
$$events?: Events;
|
7
|
+
$$slots?: Slots;
|
8
|
+
}): Exports;
|
9
|
+
z_$$bindings?: Bindings;
|
10
|
+
}
|
11
|
+
declare const LoadingIndicator: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
12
|
+
[evt: string]: CustomEvent<any>;
|
13
|
+
}, {}, {}, string>;
|
14
|
+
type LoadingIndicator = InstanceType<typeof LoadingIndicator>;
|
15
|
+
export default LoadingIndicator;
|
@@ -0,0 +1,116 @@
|
|
1
|
+
<script lang="ts">import UiContent from "../layout/UIContent.svelte";
|
2
|
+
import { slidefade } from "../utils/transitions.js";
|
3
|
+
import { attr } from "../utils/attr.js";
|
4
|
+
let {
|
5
|
+
contained,
|
6
|
+
content,
|
7
|
+
buttons,
|
8
|
+
trigger,
|
9
|
+
shape = "rounded"
|
10
|
+
} = $props();
|
11
|
+
const id = `po-${Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)}`;
|
12
|
+
let isOpen = $state(false);
|
13
|
+
function closeModal() {
|
14
|
+
document.getElementById(id).hidePopover();
|
15
|
+
isOpen = false;
|
16
|
+
}
|
17
|
+
function toggleModal() {
|
18
|
+
isOpen = !isOpen;
|
19
|
+
}
|
20
|
+
function clickElsewhere(e) {
|
21
|
+
if (e.target instanceof HTMLElement && !e.target.closest(".ModalContent")) {
|
22
|
+
closeModal();
|
23
|
+
}
|
24
|
+
}
|
25
|
+
$effect(() => {
|
26
|
+
if (isOpen) {
|
27
|
+
document.getElementsByTagName("html")[0].style.overflow = "hidden";
|
28
|
+
} else {
|
29
|
+
document.getElementsByTagName("html")[0].style.overflow = "auto";
|
30
|
+
}
|
31
|
+
});
|
32
|
+
let attrs = $derived.by(() => {
|
33
|
+
return attr({
|
34
|
+
id: `trigger-${id}`,
|
35
|
+
popovertarget: id,
|
36
|
+
onclick: toggleModal
|
37
|
+
});
|
38
|
+
});
|
39
|
+
</script>
|
40
|
+
|
41
|
+
<div class="Modal">
|
42
|
+
<div class="Trigger">
|
43
|
+
{@render trigger(attrs)}
|
44
|
+
</div>
|
45
|
+
{#if isOpen}
|
46
|
+
<UiContent>
|
47
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
48
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
49
|
+
<div {id} onclick={clickElsewhere} popover="auto" class="ModalContainer">
|
50
|
+
<div class="ModalContent {shape}" class:contained>
|
51
|
+
<div class="ModalContentInside">
|
52
|
+
{@render content(closeModal)}
|
53
|
+
{#if buttons}
|
54
|
+
<div class="ModalActions">
|
55
|
+
{@render buttons(closeModal)}
|
56
|
+
</div>
|
57
|
+
{/if}
|
58
|
+
</div>
|
59
|
+
</div>
|
60
|
+
</div>
|
61
|
+
</UiContent>
|
62
|
+
{/if}
|
63
|
+
</div>
|
64
|
+
|
65
|
+
<style>
|
66
|
+
.Modal, .Trigger {
|
67
|
+
position: relative;
|
68
|
+
display: inline-block;
|
69
|
+
}
|
70
|
+
.ModalContainer {
|
71
|
+
border: 0;
|
72
|
+
width: 100vw;
|
73
|
+
height: 100vh;
|
74
|
+
background-color: var(--bg-overlay);
|
75
|
+
backdrop-filter: var(--overlay-filter);
|
76
|
+
overflow-y: auto;
|
77
|
+
}
|
78
|
+
.ModalContent {
|
79
|
+
background: var(--bg, var(--bg-app));
|
80
|
+
box-shadow: var(--shadow);
|
81
|
+
opacity: 1;
|
82
|
+
position: absolute;
|
83
|
+
left: 50%;
|
84
|
+
top: 50%;
|
85
|
+
transform: translate(-50%, -50%);
|
86
|
+
box-shadow: 0 0.25rem 1rem 0 var(--shadow);
|
87
|
+
}
|
88
|
+
.ModalContentInsize {
|
89
|
+
container-type: inline-size;
|
90
|
+
}
|
91
|
+
.ModalContent.rounded {
|
92
|
+
border-radius: var(--border-radius);
|
93
|
+
}
|
94
|
+
.ModalContent.contained {
|
95
|
+
border: var(--border);
|
96
|
+
}
|
97
|
+
.ModalActions {
|
98
|
+
display: flex;
|
99
|
+
gap: 1rem;
|
100
|
+
border-top: var(--border);
|
101
|
+
justify-content: flex-end;
|
102
|
+
padding: 1rem;
|
103
|
+
background: var(--bg-subtle) linear-gradient(0deg, transparent, 95%, color-mix(in hsl, transparent 95%, var(--mix-target)));
|
104
|
+
}
|
105
|
+
[popover] {
|
106
|
+
animation: fadeIn 0.2s;
|
107
|
+
}
|
108
|
+
@keyframes fadeIn {
|
109
|
+
from {
|
110
|
+
opacity: 0;
|
111
|
+
}
|
112
|
+
to {
|
113
|
+
opacity: 1;
|
114
|
+
}
|
115
|
+
}
|
116
|
+
</style>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import type { Snippet } from "svelte";
|
2
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
3
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
4
|
+
$$bindings?: Bindings;
|
5
|
+
} & Exports;
|
6
|
+
(internal: unknown, props: Props & {
|
7
|
+
$$events?: Events;
|
8
|
+
$$slots?: Slots;
|
9
|
+
}): Exports;
|
10
|
+
z_$$bindings?: Bindings;
|
11
|
+
}
|
12
|
+
declare const Modal: $$__sveltets_2_IsomorphicComponent<{
|
13
|
+
/** Whether the modal should be contained with a border */
|
14
|
+
contained?: boolean;
|
15
|
+
/** The content of the modal */
|
16
|
+
content: Snippet<[close: () => void]>;
|
17
|
+
/** Snippet containing the trigger element */
|
18
|
+
trigger: Snippet<[attrs: (node: Element) => void]>;
|
19
|
+
/** Buttons to be displayed in the modal */
|
20
|
+
buttons?: Snippet<[close: () => void]>;
|
21
|
+
/** The shape of the modal */
|
22
|
+
shape?: "rounded" | "sharp";
|
23
|
+
}, {
|
24
|
+
[evt: string]: CustomEvent<any>;
|
25
|
+
}, {}, {}, "">;
|
26
|
+
type Modal = InstanceType<typeof Modal>;
|
27
|
+
export default Modal;
|
@@ -1,42 +1,23 @@
|
|
1
|
-
import {
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
icon?: string | ((this: void) => typeof import("svelte").SnippetReturn & {
|
12
|
-
_: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
|
13
|
-
}) | ComponentType | undefined;
|
14
|
-
actions?: ((this: void) => typeof import("svelte").SnippetReturn & {
|
15
|
-
_: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
|
16
|
-
}) | undefined;
|
17
|
-
};
|
18
|
-
events: {
|
19
|
-
[evt: string]: CustomEvent<any>;
|
20
|
-
};
|
21
|
-
slots: {};
|
22
|
-
};
|
23
|
-
export type NotificationProps = typeof __propDef.props;
|
24
|
-
export type NotificationEvents = typeof __propDef.events;
|
25
|
-
export type NotificationSlots = typeof __propDef.slots;
|
26
|
-
export default class Notification extends SvelteComponent<NotificationProps, NotificationEvents, NotificationSlots> {
|
27
|
-
constructor(options?: import("svelte").ComponentConstructorOptions<{
|
28
|
-
id?: string | undefined;
|
29
|
-
children?: ((this: void) => typeof import("svelte").SnippetReturn & {
|
30
|
-
_: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
|
31
|
-
}) | undefined;
|
32
|
-
title?: string | undefined;
|
33
|
-
content?: string | undefined;
|
34
|
-
icon?: string | ((this: void) => typeof import("svelte").SnippetReturn & {
|
35
|
-
_: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
|
36
|
-
}) | ComponentType | undefined;
|
37
|
-
actions?: ((this: void) => typeof import("svelte").SnippetReturn & {
|
38
|
-
_: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
|
39
|
-
}) | undefined;
|
40
|
-
}>);
|
1
|
+
import type { Snippet, Component } from "svelte";
|
2
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
3
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
4
|
+
$$bindings?: Bindings;
|
5
|
+
} & Exports;
|
6
|
+
(internal: unknown, props: Props & {
|
7
|
+
$$events?: Events;
|
8
|
+
$$slots?: Slots;
|
9
|
+
}): Exports;
|
10
|
+
z_$$bindings?: Bindings;
|
41
11
|
}
|
42
|
-
|
12
|
+
declare const Notification: $$__sveltets_2_IsomorphicComponent<{
|
13
|
+
id?: string;
|
14
|
+
children?: Snippet;
|
15
|
+
title?: string;
|
16
|
+
content?: string;
|
17
|
+
icon?: string | Snippet | Component;
|
18
|
+
actions?: Snippet;
|
19
|
+
}, {
|
20
|
+
[evt: string]: CustomEvent<any>;
|
21
|
+
}, {}, {}, "">;
|
22
|
+
type Notification = InstanceType<typeof Notification>;
|
23
|
+
export default Notification;
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<script lang="ts">import { getContext, setContext } from "svelte";
|
2
|
+
let {
|
3
|
+
children,
|
4
|
+
z
|
5
|
+
} = $props();
|
6
|
+
const prevZ = getContext("ltr.z") ?? 0;
|
7
|
+
const currentZ = Number.isInteger(z) ? z : prevZ + 1;
|
8
|
+
setContext("ltr.z", currentZ);
|
9
|
+
</script>
|
10
|
+
|
11
|
+
<div class="Panel" style="--z: {currentZ};">
|
12
|
+
Z: {currentZ}
|
13
|
+
{@render children()}
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<style>
|
17
|
+
.Panel {
|
18
|
+
background: var(--bg-panel);
|
19
|
+
border: var(--border);
|
20
|
+
padding: 2rem;
|
21
|
+
position: relative;
|
22
|
+
}
|
23
|
+
</style>
|