@radiofrance/svelte-leaflet 0.1.0-alpha.16 → 0.1.0-alpha.17

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.
@@ -1,9 +1,9 @@
1
1
  import { SvelteComponent } from "svelte";
2
- import type { Circle as LeafletCircle, LatLngExpression } from 'leaflet';
2
+ import type { Circle as LeafletCircle, CircleOptions, LatLngExpression } from 'leaflet';
3
3
  declare const __propDef: {
4
4
  props: {
5
5
  center: LatLngExpression;
6
- options?: import("leaflet").CircleMarkerOptions | undefined;
6
+ options?: CircleOptions;
7
7
  instance?: LeafletCircle | undefined;
8
8
  };
9
9
  events: {
@@ -27,6 +27,8 @@ declare const __propDef: {
27
27
  slots: {
28
28
  default: {};
29
29
  };
30
+ exports?: {} | undefined;
31
+ bindings?: string | undefined;
30
32
  };
31
33
  export type CircleProps = typeof __propDef.props;
32
34
  export type CircleEvents = typeof __propDef.events;
package/dist/Map.svelte CHANGED
@@ -9,12 +9,18 @@ import { bindEvents, keyboardEvents, layerGroupEvents, layersControlEvents, leaf
9
9
  import GeolocationButton from "./private/GeolocationButton.svelte";
10
10
  let L;
11
11
  let locateButtonContainer;
12
- const defaultOptions = { center: [46.6188459, 1.7262114], zoom: 7, maxZoom: 18 };
13
12
  export let options = {};
14
13
  export let tilesUrl = "https://tile.openstreetmap.org/{z}/{x}/{y}.png";
15
14
  export let attribution = `&copy;<a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a>`;
16
15
  export let instance = null;
17
16
  export let locateControl = void 0;
17
+ export let focusable = true;
18
+ const defaultOptions = {
19
+ center: [46.6188459, 1.7262114],
20
+ zoom: 7,
21
+ maxZoom: 18,
22
+ keyboard: options.keyboard === void 0 ? focusable : options.keyboard
23
+ };
18
24
  const dispatch = createEventDispatcher();
19
25
  export const getMarkers = () => {
20
26
  const markers = [];
@@ -26,6 +32,7 @@ export const getMarkers = () => {
26
32
  return markers;
27
33
  };
28
34
  setContext("map", () => instance);
35
+ setContext("focusable", focusable ? null : -1);
29
36
  let container;
30
37
  $: if (instance) {
31
38
  instance.options = Object.assign(instance.options, options);
@@ -53,7 +60,16 @@ function onLoad() {
53
60
  iconUrl: markerIcon,
54
61
  shadowUrl: markerShadow
55
62
  });
56
- instance = L.map(container, { ...defaultOptions, ...options });
63
+ instance = L.map(container, { ...defaultOptions, ...options, zoomControl: false });
64
+ if (options.zoomControl !== false) {
65
+ const zoomControl = L.control.zoom({
66
+ position: "bottomright"
67
+ });
68
+ zoomControl.addTo(instance);
69
+ zoomControl.getContainer().childNodes.forEach((child) => {
70
+ child.setAttribute("tabindex", focusable ? "0" : "-1");
71
+ });
72
+ }
57
73
  bindEvents(instance, dispatch, events);
58
74
  L.tileLayer(tilesUrl, {
59
75
  attribution
@@ -1,5 +1,5 @@
1
1
  import { SvelteComponent } from "svelte";
2
- import type { MapOptions, Marker, Map } from 'leaflet';
2
+ import type { MapOptions, Marker } from 'leaflet';
3
3
  import type Leaflet from 'leaflet';
4
4
  import 'leaflet/dist/leaflet.css';
5
5
  import 'leaflet.markercluster/dist/MarkerCluster.css';
@@ -7,12 +7,13 @@ import 'leaflet.markercluster/dist/MarkerCluster.Default.css';
7
7
  import { type LocateControlOptions } from './index.js';
8
8
  declare const __propDef: {
9
9
  props: {
10
- options?: MapOptions | undefined;
11
- tilesUrl?: string | undefined;
12
- attribution?: string | undefined;
13
- instance?: Map | undefined;
10
+ options?: MapOptions;
11
+ tilesUrl?: string;
12
+ attribution?: string;
13
+ instance?: Map;
14
14
  locateControl?: LocateControlOptions | undefined;
15
- getMarkers?: (() => Marker[]) | undefined;
15
+ focusable?: boolean;
16
+ getMarkers?: () => Marker[];
16
17
  };
17
18
  events: {
18
19
  keypress: CustomEvent<Leaflet.LeafletKeyboardEvent>;
@@ -58,11 +59,13 @@ declare const __propDef: {
58
59
  default: {};
59
60
  'locate-button': {};
60
61
  };
62
+ exports?: {} | undefined;
63
+ bindings?: string | undefined;
61
64
  };
62
65
  export type MapProps = typeof __propDef.props;
63
66
  export type MapEvents = typeof __propDef.events;
64
67
  export type MapSlots = typeof __propDef.slots;
65
68
  export default class Map extends SvelteComponent<MapProps, MapEvents, MapSlots> {
66
- get getMarkers(): () => Marker<any>[];
69
+ get getMarkers(): () => Marker[];
67
70
  }
68
71
  export {};
@@ -10,6 +10,7 @@ export let id = "";
10
10
  export let options = {};
11
11
  let markerElement;
12
12
  let marker;
13
+ const tabindex = getContext("focusable");
13
14
  const getMap = getContext("map");
14
15
  const getLayerGroup = getContext("layerGroup");
15
16
  setContext("layer", () => marker);
@@ -24,7 +25,10 @@ async function createMarker(size2, latlng2, id2, options2) {
24
25
  const layerGroup = getLayerGroup?.();
25
26
  const map = getMap();
26
27
  const mapOrLayerGroup = layerGroup || map;
27
- marker = L.marker(latlng2, options2);
28
+ marker = L.marker(latlng2, {
29
+ ...options2,
30
+ keyboard: tabindex === -1 ? false : true
31
+ });
28
32
  marker.id = id2;
29
33
  marker.on("click", (e) => dispatch("click", e)).on("dblclick", (e) => dispatch("dblclick", e)).on("contextmenu", (e) => dispatch("contextmenu", e)).on("dragstart", (e) => dispatch("dragstart", e)).on("drag", (e) => dispatch("drag", e)).on("dragend", (e) => dispatch("dragend", e));
30
34
  mapOrLayerGroup.addLayer(marker);
@@ -6,10 +6,10 @@ export type Marker = LeafletMarker & MarkerContext;
6
6
  import type { LatLngExpression, Marker as LeafletMarker, MarkerOptions } from 'leaflet';
7
7
  declare const __propDef: {
8
8
  props: {
9
- size?: number | undefined;
9
+ size?: number;
10
10
  latlng: LatLngExpression;
11
- id?: string | undefined;
12
- options?: MarkerOptions | undefined;
11
+ id?: string;
12
+ options?: MarkerOptions;
13
13
  };
14
14
  events: {
15
15
  click: CustomEvent<any>;
@@ -25,6 +25,8 @@ declare const __propDef: {
25
25
  icon: {};
26
26
  default: {};
27
27
  };
28
+ exports?: {} | undefined;
29
+ bindings?: string | undefined;
28
30
  };
29
31
  export type MarkerProps = typeof __propDef.props;
30
32
  export type MarkerEvents = typeof __propDef.events;
@@ -2,7 +2,7 @@ import { SvelteComponent } from "svelte";
2
2
  import type { MarkerClusterGroupOptions } from 'leaflet';
3
3
  declare const __propDef: {
4
4
  props: {
5
- options?: MarkerClusterGroupOptions | undefined;
5
+ options?: MarkerClusterGroupOptions;
6
6
  icon?: any;
7
7
  };
8
8
  events: {
@@ -12,6 +12,8 @@ declare const __propDef: {
12
12
  default: {};
13
13
  icon: {};
14
14
  };
15
+ exports?: {} | undefined;
16
+ bindings?: string | undefined;
15
17
  };
16
18
  export type MarkerClusterGroupProps = typeof __propDef.props;
17
19
  export type MarkerClusterGroupEvents = typeof __propDef.events;
@@ -4,7 +4,7 @@ import { type Latlngs } from './index.js';
4
4
  declare const __propDef: {
5
5
  props: {
6
6
  latlngs: Latlngs;
7
- options?: PolylineOptions | undefined;
7
+ options?: PolylineOptions;
8
8
  instance?: LeafletPolygon | undefined;
9
9
  };
10
10
  events: {
@@ -27,6 +27,8 @@ declare const __propDef: {
27
27
  slots: {
28
28
  default: {};
29
29
  };
30
+ exports?: {} | undefined;
31
+ bindings?: string | undefined;
30
32
  };
31
33
  export type PolygonProps = typeof __propDef.props;
32
34
  export type PolygonEvents = typeof __propDef.events;
@@ -3,7 +3,7 @@ import type { LatLngExpression, PathOptions } from 'leaflet';
3
3
  declare const __propDef: {
4
4
  props: {
5
5
  latlngs: LatLngExpression[];
6
- options?: PathOptions | undefined;
6
+ options?: PathOptions;
7
7
  };
8
8
  events: {
9
9
  click: CustomEvent<any>;
@@ -13,6 +13,8 @@ declare const __propDef: {
13
13
  slots: {
14
14
  default: {};
15
15
  };
16
+ exports?: {} | undefined;
17
+ bindings?: string | undefined;
16
18
  };
17
19
  export type PolylineProps = typeof __propDef.props;
18
20
  export type PolylineEvents = typeof __propDef.events;
@@ -2,7 +2,7 @@ import { SvelteComponent } from "svelte";
2
2
  import type { PopupOptions } from 'leaflet';
3
3
  declare const __propDef: {
4
4
  props: {
5
- options?: PopupOptions | undefined;
5
+ options?: PopupOptions;
6
6
  };
7
7
  events: {
8
8
  [evt: string]: CustomEvent<any>;
@@ -10,6 +10,8 @@ declare const __propDef: {
10
10
  slots: {
11
11
  default: {};
12
12
  };
13
+ exports?: {} | undefined;
14
+ bindings?: string | undefined;
13
15
  };
14
16
  export type PopupProps = typeof __propDef.props;
15
17
  export type PopupEvents = typeof __propDef.events;
@@ -1,9 +1,12 @@
1
1
  <script>
2
+ import { getContext } from 'svelte';
2
3
  import GeolocationIcon from './GeolocationIcon.svelte';
4
+
5
+ const tabindex = getContext('focusable');
3
6
  </script>
4
7
 
5
8
  <div>
6
- <button>
9
+ <button {tabindex}>
7
10
  <GeolocationIcon width="1rem" />
8
11
  </button>
9
12
  </div>
@@ -19,5 +19,7 @@ declare const __propDef: {
19
19
  [evt: string]: CustomEvent<any>;
20
20
  };
21
21
  slots: {};
22
+ exports?: undefined;
23
+ bindings?: undefined;
22
24
  };
23
25
  export {};
@@ -1,12 +1,14 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
- width?: string | undefined;
4
+ width?: string;
5
5
  };
6
6
  events: {
7
7
  [evt: string]: CustomEvent<any>;
8
8
  };
9
9
  slots: {};
10
+ exports?: {} | undefined;
11
+ bindings?: string | undefined;
10
12
  };
11
13
  export type GeolocationIconProps = typeof __propDef.props;
12
14
  export type GeolocationIconEvents = typeof __propDef.events;
@@ -0,0 +1,7 @@
1
+ export default highlighter;
2
+ /**
3
+ * @param {string} code
4
+ * @param {string} lang
5
+ * @param {string} meta
6
+ */
7
+ declare function highlighter(code: string, lang: string, meta: string): Promise<string>;
@@ -0,0 +1,45 @@
1
+ import { codeToHtml, getSingletonHighlighter } from 'shiki';
2
+ import { transformerMetaHighlight } from '@shikijs/transformers';
3
+ import { transformerTwoslash, rendererClassic } from '@shikijs/twoslash';
4
+
5
+ const THEME = 'github-dark';
6
+
7
+ /**
8
+ * @param {string} code
9
+ * @param {string} lang
10
+ * @param {string} meta
11
+ */
12
+ async function highlighter(code, lang, meta) {
13
+ await getSingletonHighlighter({
14
+ langs: [lang],
15
+ themes: [THEME]
16
+ });
17
+ const html = await codeToHtml(code, {
18
+ theme: THEME,
19
+ lang,
20
+ meta: { __raw: meta },
21
+ transformers: [
22
+ transformerMetaHighlight(),
23
+ transformerTwoslash({
24
+ renderer: rendererClassic()
25
+ })
26
+ ]
27
+ });
28
+
29
+ return escapeHtml(html);
30
+ }
31
+
32
+ /**
33
+ * Returns code with curly braces and backticks replaced by HTML entity equivalents
34
+ * @param {string} code - highlighted HTML
35
+ * @returns {string} - escaped HTML
36
+ */
37
+
38
+ function escapeHtml(code) {
39
+ return code.replace(
40
+ /[{}`]/g,
41
+ (character) => ({ '{': '&lbrace;', '}': '&rbrace;', '`': '&grave;' })[character] || ''
42
+ );
43
+ }
44
+
45
+ export default highlighter;
@@ -0,0 +1,323 @@
1
+ /* Start of Shiki Twoslash CSS:
2
+
3
+ Code blocks structurally look like:
4
+
5
+ <pre class='shiki lsp twoslash [theme-name]'>
6
+ <div class='language-id'>[lang-id]</div>
7
+ <div class='code-container'>
8
+ <code>[the code as a series of spans]</code>
9
+ <a href='playground...'>Try</a> (optional)
10
+ </div>
11
+ </pre>
12
+ */
13
+
14
+ .shiki {
15
+ /*@apply !bg-gray-900 pl-12 pr-16 text-2xl;*/
16
+ line-height: 2.1rem;
17
+ }
18
+
19
+ pre {
20
+ /* All code samples get a grey border, twoslash ones get a different color */
21
+ /* border-left: 1px solid #999;
22
+ border-bottom: 1px solid #999; */
23
+
24
+ /* Important to allow the code to move horizontally; */
25
+ overflow-x: auto;
26
+ position: relative;
27
+ }
28
+ pre.shiki {
29
+ overflow-x: auto;
30
+ }
31
+ pre.shiki:hover .dim {
32
+ opacity: 1;
33
+ }
34
+ pre.shiki div.dim {
35
+ opacity: 0.5;
36
+ }
37
+ pre.shiki div.dim,
38
+ pre.shiki div.highlight {
39
+ margin: 0;
40
+ padding: 0;
41
+ }
42
+ pre.shiki div.highlight {
43
+ opacity: 1;
44
+ background-color: #f1f8ff;
45
+ }
46
+ pre.shiki div.line {
47
+ min-height: 1rem;
48
+ }
49
+
50
+ /** Don't show the language identifiers */
51
+ pre.shiki .language-id {
52
+ display: none;
53
+ }
54
+
55
+ /* Visually differentiates twoslash code samples */
56
+ pre.twoslash {
57
+ border-color: #719af4;
58
+ }
59
+
60
+ /** When you mouse over the pre, show the underlines */
61
+ pre.twoslash:hover data-lsp {
62
+ border-color: #747474;
63
+ }
64
+
65
+ /** The tooltip-like which provides the LSP response */
66
+ pre.twoslash data-lsp:hover::before {
67
+ content: attr(lsp);
68
+ position: absolute;
69
+ transform: translate(0, 1rem);
70
+
71
+ /*@apply text-base bg-gray-600;*/
72
+ color: #fff;
73
+ text-align: left;
74
+ padding: 5px 8px;
75
+ border-radius: 2px;
76
+ line-height: 1.6rem;
77
+ font-family:
78
+ 'JetBrains Mono',
79
+ Menlo,
80
+ Monaco,
81
+ Consolas,
82
+ Courier New,
83
+ monospace;
84
+ white-space: pre-wrap;
85
+ z-index: 100;
86
+ }
87
+
88
+ pre .code-container {
89
+ overflow: auto;
90
+ }
91
+ /* The try button */
92
+ pre .code-container > a {
93
+ position: absolute;
94
+ right: 8px;
95
+ bottom: 8px;
96
+ border-radius: 4px;
97
+ border: 1px solid #719af4;
98
+ padding: 0 8px;
99
+ color: #719af4;
100
+ text-decoration: none;
101
+ opacity: 0;
102
+ transition-timing-function: ease;
103
+ transition: opacity 0.3s;
104
+ }
105
+ /* Respect no animations */
106
+ @media (prefers-reduced-motion: reduce) {
107
+ pre .code-container > a {
108
+ transition: none;
109
+ }
110
+ }
111
+ pre .code-container > a:hover {
112
+ color: white;
113
+ background-color: #719af4;
114
+ }
115
+ pre .code-container:hover a {
116
+ opacity: 1;
117
+ }
118
+
119
+ pre code {
120
+ font-family:
121
+ 'JetBrains Mono',
122
+ Menlo,
123
+ Monaco,
124
+ Consolas,
125
+ Courier New,
126
+ monospace;
127
+ white-space: pre;
128
+ -webkit-overflow-scrolling: touch;
129
+ }
130
+ pre code a {
131
+ text-decoration: none;
132
+ }
133
+ pre data-err {
134
+ /* Extracted from VS Code */
135
+ background: url("data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%206%203'%20enable-background%3D'new%200%200%206%203'%20height%3D'3'%20width%3D'6'%3E%3Cg%20fill%3D'%23c94824'%3E%3Cpolygon%20points%3D'5.5%2C0%202.5%2C3%201.1%2C3%204.1%2C0'%2F%3E%3Cpolygon%20points%3D'4%2C0%206%2C2%206%2C0.6%205.4%2C0'%2F%3E%3Cpolygon%20points%3D'0%2C2%201%2C3%202.4%2C3%200%2C0.6'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")
136
+ repeat-x bottom left;
137
+ padding-bottom: 3px;
138
+ }
139
+ pre .query {
140
+ margin-bottom: 10px;
141
+ color: #137998;
142
+ display: inline-block;
143
+ }
144
+
145
+ /* In order to have the 'popped out' style design and to not break the layout
146
+ /* we need to place a fake and un-selectable copy of the error which _isn't_ broken out
147
+ /* behind the actual error message.
148
+
149
+ /* This sections keeps both of those two in in sync */
150
+
151
+ pre .error,
152
+ pre .error-behind {
153
+ margin-left: -14px;
154
+ margin-top: 8px;
155
+ margin-bottom: 4px;
156
+ padding: 6px;
157
+ padding-left: 14px;
158
+ padding-right: 14px;
159
+ white-space: pre-wrap;
160
+ display: block;
161
+ /*@apply max-w-2xl text-lg;*/
162
+ }
163
+ pre .error {
164
+ /*@apply bg-gray-800 text-red-50;*/
165
+ position: absolute;
166
+ border-left: 4px solid #bf1818;
167
+ /* Give the space to the error code */
168
+ display: flex;
169
+ align-items: center;
170
+ }
171
+ pre .error .code {
172
+ display: none;
173
+ }
174
+ pre .error-behind {
175
+ user-select: none;
176
+ visibility: transparent;
177
+ /* @apply text-transparent; */
178
+ }
179
+ /* Queries */
180
+ pre .arrow {
181
+ /* Transparent background */
182
+ /* @apply bg-gray-800; */
183
+ position: relative;
184
+ top: -7px;
185
+ margin-left: 0.1rem;
186
+ /* Edges */
187
+ border-left: 1px solid rgb(51, 65, 85);
188
+ border-top: 1px solid rgb(51, 65, 85);
189
+ transform: translateY(25%) rotate(45deg);
190
+ /* Size */
191
+ height: 8px;
192
+ width: 8px;
193
+ }
194
+ pre .popover {
195
+ /* @apply text-gray-100 bg-gray-800; */
196
+ margin-bottom: 10px;
197
+ display: inline-block;
198
+ padding: 0 0.5rem 0.3rem;
199
+ margin-top: 10px;
200
+ border-radius: 3px;
201
+ /* @apply max-w-2xl text-lg; */
202
+ }
203
+ /* Completion */
204
+ pre .inline-completions ul.dropdown {
205
+ display: inline-block;
206
+ position: absolute;
207
+ width: 240px;
208
+ background-color: gainsboro;
209
+ color: grey;
210
+ padding-top: 4px;
211
+ font-family: var(--code-font);
212
+ font-size: 0.8rem;
213
+ margin: 0;
214
+ padding: 0;
215
+ border-left: 4px solid #4b9edd;
216
+ }
217
+ pre .inline-completions ul.dropdown::before {
218
+ background-color: #4b9edd;
219
+ width: 2px;
220
+ position: absolute;
221
+ top: -1.2rem;
222
+ left: -3px;
223
+ content: ' ';
224
+ }
225
+ pre .inline-completions ul.dropdown li {
226
+ overflow-x: hidden;
227
+ padding-left: 4px;
228
+ margin-bottom: 4px;
229
+ }
230
+ pre .inline-completions ul.dropdown li.deprecated {
231
+ text-decoration: line-through;
232
+ }
233
+ pre .inline-completions ul.dropdown li span.result-found {
234
+ color: #4b9edd;
235
+ }
236
+ pre .inline-completions ul.dropdown li span.result {
237
+ width: 100px;
238
+ color: black;
239
+ display: inline-block;
240
+ }
241
+ .dark-theme .markdown pre {
242
+ background-color: #d8d8d8;
243
+ border-color: #ddd;
244
+ filter: invert(98%) hue-rotate(180deg);
245
+ }
246
+ data-lsp {
247
+ /* Fades in unobtrusively */
248
+ transition-timing-function: ease;
249
+ transition: border-color 0.3s;
250
+ }
251
+ /* Respect people's wishes to not have animations */
252
+ @media (prefers-reduced-motion: reduce) {
253
+ data-lsp {
254
+ transition: none;
255
+ }
256
+ }
257
+
258
+ /** Annotations support, providing a tool for meta commentary */
259
+ .tag-container {
260
+ position: relative;
261
+ }
262
+ .tag-container .twoslash-annotation {
263
+ position: absolute;
264
+ font-family:
265
+ 'JetBrains Mono',
266
+ Menlo,
267
+ Monaco,
268
+ Consolas,
269
+ Courier New,
270
+ monospace;
271
+ right: -10px;
272
+ /** Default annotation text to 200px */
273
+ width: 200px;
274
+ color: #187abf;
275
+ background-color: #fcf3d9 bb;
276
+ }
277
+ .tag-container .twoslash-annotation p {
278
+ text-align: left;
279
+ font-size: 0.8rem;
280
+ line-height: 0.9rem;
281
+ }
282
+ .tag-container .twoslash-annotation svg {
283
+ float: left;
284
+ margin-left: -44px;
285
+ }
286
+ .tag-container .twoslash-annotation.left {
287
+ right: auto;
288
+ left: -200px;
289
+ }
290
+ .tag-container .twoslash-annotation.left svg {
291
+ float: right;
292
+ margin-right: -5px;
293
+ }
294
+
295
+ /** Support for showing console log/warn/errors inline */
296
+ pre .logger {
297
+ display: flex;
298
+ align-items: center;
299
+ color: black;
300
+ padding: 6px;
301
+ padding-left: 8px;
302
+ width: calc(100% - 19px);
303
+ white-space: pre-wrap;
304
+ }
305
+ pre .logger svg {
306
+ margin-right: 9px;
307
+ }
308
+ pre .logger.error-log {
309
+ /* @apply bg-gray-800; */
310
+ border-left: 4px solid #bf1818;
311
+ }
312
+ pre .logger.warn-log {
313
+ background-color: #ffe;
314
+ border-left: 4px solid #eae662;
315
+ }
316
+ pre .logger.log-log {
317
+ background-color: #e9e9e9;
318
+ border-left: 4px solid #ababab;
319
+ }
320
+ pre .logger.log-log svg {
321
+ margin-left: 6px;
322
+ margin-right: 9px;
323
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@radiofrance/svelte-leaflet",
3
- "version": "0.1.0-alpha.16",
3
+ "version": "0.1.0-alpha.17",
4
4
  "description": "A library that wraps leaflet classes in domless/renderless svelte components.",
5
5
  "keywords": [
6
6
  "svelte",
@@ -47,7 +47,11 @@
47
47
  },
48
48
  "devDependencies": {
49
49
  "@csstools/postcss-global-data": "^2.1.1",
50
+ "@fontsource-variable/fira-code": "^5.0.18",
50
51
  "@playwright/test": "^1.28.1",
52
+ "@shikijs/core": "1.12.1",
53
+ "@shikijs/transformers": "^1.10.3",
54
+ "@shikijs/twoslash": "^1.12.1",
51
55
  "@sveltejs/adapter-auto": "^3.0.0",
52
56
  "@sveltejs/kit": "^2.0.0",
53
57
  "@sveltejs/package": "^2.0.0",
@@ -63,12 +67,15 @@
63
67
  "eslint": "^8.56.0",
64
68
  "eslint-config-prettier": "^9.1.0",
65
69
  "eslint-plugin-svelte": "^2.35.1",
70
+ "mdsvex": "^0.11.2",
71
+ "node-html-parser": "^6.1.13",
66
72
  "postcss": "^8.4.39",
67
73
  "postcss-csso": "^6.0.1",
68
74
  "postcss-preset-env": "^9.6.0",
69
75
  "prettier": "^3.1.1",
70
76
  "prettier-plugin-svelte": "^3.1.2",
71
77
  "publint": "^0.1.9",
78
+ "shiki": "^1.10.3",
72
79
  "svelte": "^4.2.7",
73
80
  "svelte-check": "^3.6.0",
74
81
  "svelte-preprocess": "^6.0.1",