lutra 0.0.33 → 0.1.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.
Files changed (242) hide show
  1. package/README.md +4 -24
  2. package/dist/components/AspectRatio.svelte +26 -0
  3. package/dist/components/AspectRatio.svelte.d.ts +8 -0
  4. package/dist/components/Dialog.svelte +78 -0
  5. package/dist/components/Dialog.svelte.d.ts +14 -0
  6. package/dist/components/Layout.svelte +32 -0
  7. package/dist/components/Layout.svelte.d.ts +11 -0
  8. package/dist/components/PageContent.svelte +108 -0
  9. package/dist/components/PageContent.svelte.d.ts +38 -0
  10. package/dist/components/Theme.svelte +87 -0
  11. package/dist/components/Theme.svelte.d.ts +17 -0
  12. package/dist/{display → components}/Tooltip.svelte +33 -8
  13. package/dist/components/Tooltip.svelte.d.ts +12 -0
  14. package/dist/config.d.ts +30 -0
  15. package/dist/config.js +18 -0
  16. package/dist/css/0-layers.css +1 -0
  17. package/dist/css/1-props.css +775 -0
  18. package/dist/css/2-base.css +209 -0
  19. package/dist/css/3-typo.css +65 -0
  20. package/dist/css/4-layout.css +5 -0
  21. package/dist/css/5-media.css +21 -0
  22. package/dist/css/lutra.css +6 -0
  23. package/dist/index.d.ts +5 -1
  24. package/dist/index.js +5 -2
  25. package/dist/types.d.ts +39 -0
  26. package/dist/types.js +25 -0
  27. package/package.json +29 -82
  28. package/dist/color.css +0 -0
  29. package/dist/display/Avatar.svelte +0 -61
  30. package/dist/display/Avatar.svelte.d.ts +0 -19
  31. package/dist/display/Badge.svelte +0 -91
  32. package/dist/display/Badge.svelte.d.ts +0 -30
  33. package/dist/display/Callout.svelte +0 -109
  34. package/dist/display/Callout.svelte.d.ts +0 -28
  35. package/dist/display/Close.svelte +0 -58
  36. package/dist/display/Close.svelte.d.ts +0 -18
  37. package/dist/display/Code.svelte +0 -190
  38. package/dist/display/Code.svelte.d.ts +0 -32
  39. package/dist/display/ContextTip.svelte +0 -23
  40. package/dist/display/ContextTip.svelte.d.ts +0 -18
  41. package/dist/display/DataList.svelte +0 -16
  42. package/dist/display/DataList.svelte.d.ts +0 -21
  43. package/dist/display/Details.svelte +0 -49
  44. package/dist/display/Details.svelte.d.ts +0 -27
  45. package/dist/display/Hero.svelte +0 -50
  46. package/dist/display/Hero.svelte.d.ts +0 -26
  47. package/dist/display/Icon.svelte +0 -39
  48. package/dist/display/Icon.svelte.d.ts +0 -19
  49. package/dist/display/IconButton.svelte +0 -91
  50. package/dist/display/IconButton.svelte.d.ts +0 -27
  51. package/dist/display/Image.svelte +0 -91
  52. package/dist/display/Image.svelte.d.ts +0 -26
  53. package/dist/display/Indicator.svelte +0 -352
  54. package/dist/display/Indicator.svelte.d.ts +0 -23
  55. package/dist/display/Inset.svelte +0 -18
  56. package/dist/display/Inset.svelte.d.ts +0 -18
  57. package/dist/display/LineChart.svelte +0 -385
  58. package/dist/display/LineChart.svelte.d.ts +0 -24
  59. package/dist/display/LoadingIndicator.svelte +0 -33
  60. package/dist/display/LoadingIndicator.svelte.d.ts +0 -15
  61. package/dist/display/Modal.svelte +0 -116
  62. package/dist/display/Modal.svelte.d.ts +0 -27
  63. package/dist/display/Notification.svelte +0 -104
  64. package/dist/display/Notification.svelte.d.ts +0 -23
  65. package/dist/display/Panel.svelte +0 -23
  66. package/dist/display/Panel.svelte.d.ts +0 -19
  67. package/dist/display/Popup.svelte +0 -111
  68. package/dist/display/Popup.svelte.d.ts +0 -25
  69. package/dist/display/Stat.svelte +0 -81
  70. package/dist/display/Stat.svelte.d.ts +0 -30
  71. package/dist/display/Table.svelte +0 -28
  72. package/dist/display/Table.svelte.d.ts +0 -24
  73. package/dist/display/TablePaginator.svelte +0 -51
  74. package/dist/display/TablePaginator.svelte.d.ts +0 -21
  75. package/dist/display/Tag.svelte +0 -90
  76. package/dist/display/Tag.svelte.d.ts +0 -32
  77. package/dist/display/Tooltip.svelte.d.ts +0 -23
  78. package/dist/display/chart.d.ts +0 -78
  79. package/dist/display/chart.js +0 -212
  80. package/dist/display/index.d.ts +0 -24
  81. package/dist/display/index.js +0 -24
  82. package/dist/display/notifications.svelte.d.ts +0 -21
  83. package/dist/display/notifications.svelte.js +0 -31
  84. package/dist/form/Button.svelte +0 -39
  85. package/dist/form/Button.svelte.d.ts +0 -26
  86. package/dist/form/FieldActions.svelte +0 -68
  87. package/dist/form/FieldActions.svelte.d.ts +0 -20
  88. package/dist/form/FieldContainer.svelte +0 -37
  89. package/dist/form/FieldContainer.svelte.d.ts +0 -19
  90. package/dist/form/FieldContent.svelte +0 -153
  91. package/dist/form/FieldContent.svelte.d.ts +0 -31
  92. package/dist/form/FieldError.svelte +0 -14
  93. package/dist/form/FieldError.svelte.d.ts +0 -18
  94. package/dist/form/FieldSection.svelte +0 -86
  95. package/dist/form/FieldSection.svelte.d.ts +0 -20
  96. package/dist/form/Fieldset.svelte +0 -68
  97. package/dist/form/Fieldset.svelte.d.ts +0 -31
  98. package/dist/form/Form.svelte +0 -136
  99. package/dist/form/Form.svelte.d.ts +0 -38
  100. package/dist/form/ImageUpload.svelte +0 -259
  101. package/dist/form/ImageUpload.svelte.d.ts +0 -31
  102. package/dist/form/Input.svelte +0 -326
  103. package/dist/form/Input.svelte.d.ts +0 -117
  104. package/dist/form/InputLength.svelte +0 -32
  105. package/dist/form/InputLength.svelte.d.ts +0 -20
  106. package/dist/form/Label.svelte +0 -44
  107. package/dist/form/Label.svelte.d.ts +0 -25
  108. package/dist/form/LogoUpload.svelte +0 -100
  109. package/dist/form/LogoUpload.svelte.d.ts +0 -29
  110. package/dist/form/Select.svelte +0 -136
  111. package/dist/form/Select.svelte.d.ts +0 -70
  112. package/dist/form/Textarea.svelte +0 -163
  113. package/dist/form/Textarea.svelte.d.ts +0 -108
  114. package/dist/form/Toggle.svelte +0 -2
  115. package/dist/form/Toggle.svelte.d.ts +0 -15
  116. package/dist/form/client.svelte.d.ts +0 -44
  117. package/dist/form/client.svelte.js +0 -98
  118. package/dist/form/form.d.ts +0 -54
  119. package/dist/form/form.js +0 -340
  120. package/dist/form/index.d.ts +0 -18
  121. package/dist/form/index.js +0 -18
  122. package/dist/form/types.d.ts +0 -62
  123. package/dist/form/types.js +0 -1
  124. package/dist/icons/IconAlert.svelte +0 -3
  125. package/dist/icons/IconAlert.svelte.d.ts +0 -23
  126. package/dist/icons/IconCopy.svelte +0 -3
  127. package/dist/icons/IconCopy.svelte.d.ts +0 -23
  128. package/dist/icons/IconDone.svelte +0 -3
  129. package/dist/icons/IconDone.svelte.d.ts +0 -23
  130. package/dist/icons/IconError.svelte +0 -3
  131. package/dist/icons/IconError.svelte.d.ts +0 -23
  132. package/dist/icons/IconHelp.svelte +0 -3
  133. package/dist/icons/IconHelp.svelte.d.ts +0 -23
  134. package/dist/icons/IconHide.svelte +0 -3
  135. package/dist/icons/IconHide.svelte.d.ts +0 -23
  136. package/dist/icons/IconInfo.svelte +0 -3
  137. package/dist/icons/IconInfo.svelte.d.ts +0 -23
  138. package/dist/icons/IconLink.svelte +0 -3
  139. package/dist/icons/IconLink.svelte.d.ts +0 -23
  140. package/dist/icons/IconMenuBurger.svelte +0 -3
  141. package/dist/icons/IconMenuBurger.svelte.d.ts +0 -23
  142. package/dist/icons/IconMenuDots.svelte +0 -3
  143. package/dist/icons/IconMenuDots.svelte.d.ts +0 -23
  144. package/dist/icons/IconSearch.svelte +0 -3
  145. package/dist/icons/IconSearch.svelte.d.ts +0 -23
  146. package/dist/icons/IconShow.svelte +0 -3
  147. package/dist/icons/IconShow.svelte.d.ts +0 -23
  148. package/dist/icons/IconSuccess.svelte +0 -3
  149. package/dist/icons/IconSuccess.svelte.d.ts +0 -23
  150. package/dist/icons/IconWarning.svelte +0 -3
  151. package/dist/icons/IconWarning.svelte.d.ts +0 -23
  152. package/dist/icons/index.d.ts +0 -14
  153. package/dist/icons/index.js +0 -14
  154. package/dist/layout/Layout.svelte +0 -47
  155. package/dist/layout/Layout.svelte.d.ts +0 -22
  156. package/dist/layout/LayoutFooter.svelte +0 -21
  157. package/dist/layout/LayoutFooter.svelte.d.ts +0 -18
  158. package/dist/layout/LayoutGrid.svelte +0 -51
  159. package/dist/layout/LayoutGrid.svelte.d.ts +0 -27
  160. package/dist/layout/LayoutHeader.svelte +0 -97
  161. package/dist/layout/LayoutHeader.svelte.d.ts +0 -34
  162. package/dist/layout/LayoutSideMenu.svelte +0 -55
  163. package/dist/layout/LayoutSideMenu.svelte.d.ts +0 -21
  164. package/dist/layout/LayoutTypes.d.ts +0 -15
  165. package/dist/layout/LayoutTypes.js +0 -9
  166. package/dist/layout/Overlay.svelte +0 -20
  167. package/dist/layout/Overlay.svelte.d.ts +0 -25
  168. package/dist/layout/OverlayContainer.svelte +0 -28
  169. package/dist/layout/OverlayContainer.svelte.d.ts +0 -15
  170. package/dist/layout/OverlayLayer.svelte +0 -140
  171. package/dist/layout/OverlayLayer.svelte.d.ts +0 -19
  172. package/dist/layout/PageContent.svelte +0 -82
  173. package/dist/layout/PageContent.svelte.d.ts +0 -25
  174. package/dist/layout/Theme.svelte +0 -243
  175. package/dist/layout/Theme.svelte.d.ts +0 -19
  176. package/dist/layout/UIContent.svelte +0 -15
  177. package/dist/layout/UIContent.svelte.d.ts +0 -18
  178. package/dist/layout/index.d.ts +0 -11
  179. package/dist/layout/index.js +0 -11
  180. package/dist/layout/overlays.svelte.d.ts +0 -34
  181. package/dist/layout/overlays.svelte.js +0 -44
  182. package/dist/nav/Breadcrumb.svelte +0 -82
  183. package/dist/nav/Breadcrumb.svelte.d.ts +0 -28
  184. package/dist/nav/Menu.svelte +0 -170
  185. package/dist/nav/Menu.svelte.d.ts +0 -27
  186. package/dist/nav/MenuItem.svelte +0 -147
  187. package/dist/nav/MenuItem.svelte.d.ts +0 -22
  188. package/dist/nav/MenuTypes.d.ts +0 -58
  189. package/dist/nav/MenuTypes.js +0 -1
  190. package/dist/nav/NavMenu.svelte +0 -181
  191. package/dist/nav/NavMenu.svelte.d.ts +0 -19
  192. package/dist/nav/TabbedContent.svelte +0 -43
  193. package/dist/nav/TabbedContent.svelte.d.ts +0 -23
  194. package/dist/nav/Tabs.svelte +0 -158
  195. package/dist/nav/Tabs.svelte.d.ts +0 -25
  196. package/dist/nav/index.d.ts +0 -7
  197. package/dist/nav/index.js +0 -6
  198. package/dist/style.css +0 -950
  199. package/dist/typo/Clamp.svelte +0 -25
  200. package/dist/typo/Clamp.svelte.d.ts +0 -24
  201. package/dist/typo/H.svelte +0 -52
  202. package/dist/typo/H.svelte.d.ts +0 -28
  203. package/dist/typo/H1.svelte +0 -14
  204. package/dist/typo/H1.svelte.d.ts +0 -26
  205. package/dist/typo/H2.svelte +0 -14
  206. package/dist/typo/H2.svelte.d.ts +0 -26
  207. package/dist/typo/H3.svelte +0 -14
  208. package/dist/typo/H3.svelte.d.ts +0 -26
  209. package/dist/typo/H4.svelte +0 -14
  210. package/dist/typo/H4.svelte.d.ts +0 -26
  211. package/dist/typo/H5.svelte +0 -14
  212. package/dist/typo/H5.svelte.d.ts +0 -26
  213. package/dist/typo/H6.svelte +0 -14
  214. package/dist/typo/H6.svelte.d.ts +0 -26
  215. package/dist/typo/P.svelte +0 -34
  216. package/dist/typo/P.svelte.d.ts +0 -26
  217. package/dist/typo/index.d.ts +0 -9
  218. package/dist/typo/index.js +0 -9
  219. package/dist/utils/StringOrComponent.svelte +0 -14
  220. package/dist/utils/StringOrComponent.svelte.d.ts +0 -19
  221. package/dist/utils/StringOrSnippet.svelte +0 -11
  222. package/dist/utils/StringOrSnippet.svelte.d.ts +0 -19
  223. package/dist/utils/attr.d.ts +0 -5
  224. package/dist/utils/attr.js +0 -21
  225. package/dist/utils/color.d.ts +0 -51
  226. package/dist/utils/color.js +0 -97
  227. package/dist/utils/defaults.d.ts +0 -4
  228. package/dist/utils/defaults.js +0 -1
  229. package/dist/utils/dom.d.ts +0 -15
  230. package/dist/utils/dom.js +0 -74
  231. package/dist/utils/hooks.server.d.ts +0 -2
  232. package/dist/utils/hooks.server.js +0 -16
  233. package/dist/utils/id.d.ts +0 -1
  234. package/dist/utils/id.js +0 -3
  235. package/dist/utils/index.d.ts +0 -9
  236. package/dist/utils/index.js +0 -6
  237. package/dist/utils/isSnippet.d.ts +0 -3
  238. package/dist/utils/isSnippet.js +0 -11
  239. package/dist/utils/keyboard.svelte.d.ts +0 -22
  240. package/dist/utils/keyboard.svelte.js +0 -161
  241. /package/dist/{utils → util}/transitions.d.ts +0 -0
  242. /package/dist/{utils → util}/transitions.js +0 -0
@@ -1,385 +0,0 @@
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>
@@ -1,24 +0,0 @@
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;
@@ -1,33 +0,0 @@
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>
@@ -1,15 +0,0 @@
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;
@@ -1,116 +0,0 @@
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>
@@ -1,27 +0,0 @@
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,104 +0,0 @@
1
- <script lang="ts">import Overlay from "../layout/Overlay.svelte";
2
- import PageContent from "../layout/PageContent.svelte";
3
- import { removeOverlay } from "../layout/overlays.svelte.js";
4
- import Close from "./Close.svelte";
5
- import { createId } from "../utils/id.js";
6
- import Icon from "./Icon.svelte";
7
- let {
8
- id = createId(),
9
- children,
10
- title,
11
- content,
12
- icon,
13
- actions
14
- } = $props();
15
- function onclick(e) {
16
- e.preventDefault();
17
- removeOverlay(id);
18
- }
19
- </script>
20
-
21
- {#snippet notification()}
22
- <div class="Notification">
23
- {#if !actions}
24
- <Close position="top right" {onclick} />
25
- {/if}
26
- {#if icon}
27
- <div class="Icon">
28
- <Icon {icon} --vertical-align="text-top" --icon-width="2rem" --icon-height="2rem" />
29
- </div>
30
- {/if}
31
- <div class="Content">
32
- <PageContent --margin-scale="0.35">
33
- {#if children}
34
- {@render children()}
35
- {:else}
36
- {#if title}
37
- <h5>{title}</h5>
38
- {/if}
39
- <p>{content}</p>
40
- {/if}
41
- </PageContent>
42
- </div>
43
- {#if actions}
44
- <div class="Actions">
45
- {@render actions()}
46
- </div>
47
- {/if}
48
- </div>
49
- {/snippet}
50
-
51
- {#if children}
52
- <Overlay z={100} layer="notifications" position="bottom right" {id}>
53
- {@render notification()}
54
- </Overlay>
55
- {:else}
56
- {@render notification()}
57
- {/if}
58
-
59
- <style>
60
- .Notification {
61
- display: block;
62
- pointer-events: none;
63
- background: var(--bg-app);
64
- border-radius: var(--border-radius);
65
- border: var(--border);
66
- padding: 0.75rem 1rem;
67
- width: 30rem;
68
- font-size: 0.85em;
69
- display: grid;
70
- grid-template-areas: "content";
71
- grid-template-columns: 1fr;
72
- gap: 1rem;
73
- box-shadow: 0 0.5rem 1rem var(--shadow);
74
- }
75
- .Notification:has(.Icon):has(.Actions) {
76
- grid-template-areas: "icon content actions";
77
- grid-template-columns: auto 1fr auto;
78
- }
79
- .Notification:not(:has(.Icon)):has(.Actions) {
80
- grid-template-areas: "content actions";
81
- grid-template-columns: 1fr auto;
82
- }
83
- .Notification:has(.Icon):not(:has(.Actions)) {
84
- grid-template-areas: "icon content";
85
- grid-template-columns: auto 1fr;
86
- }
87
- .Icon {
88
- grid-area: icon;
89
- display: flex;
90
- gap: 0.5rem;
91
- align-items: center;
92
- pointer-events: auto;
93
- }
94
- .Content {
95
- grid-area: content;
96
- }
97
- .Actions {
98
- grid-area: actions;
99
- display: flex;
100
- gap: 0.5rem;
101
- align-items: center;
102
- pointer-events: auto;
103
- }
104
- </style>