@refrakt-md/behaviors 0.5.0 → 0.6.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/dist/behaviors/copy.d.ts.map +1 -1
- package/dist/behaviors/copy.js +40 -4
- package/dist/behaviors/copy.js.map +1 -1
- package/dist/behaviors/mobile-menu.d.ts +18 -0
- package/dist/behaviors/mobile-menu.d.ts.map +1 -0
- package/dist/behaviors/mobile-menu.js +77 -0
- package/dist/behaviors/mobile-menu.js.map +1 -0
- package/dist/behaviors/scrollspy.d.ts +12 -0
- package/dist/behaviors/scrollspy.d.ts.map +1 -0
- package/dist/behaviors/scrollspy.js +61 -0
- package/dist/behaviors/scrollspy.js.map +1 -0
- package/dist/elements/context.d.ts +52 -0
- package/dist/elements/context.d.ts.map +1 -0
- package/dist/elements/context.js +31 -0
- package/dist/elements/context.js.map +1 -0
- package/dist/elements/diagram.d.ts +16 -0
- package/dist/elements/diagram.d.ts.map +1 -0
- package/dist/elements/diagram.js +43 -0
- package/dist/elements/diagram.js.map +1 -0
- package/dist/elements/helpers.d.ts +7 -0
- package/dist/elements/helpers.d.ts.map +1 -0
- package/dist/elements/helpers.js +10 -0
- package/dist/elements/helpers.js.map +1 -0
- package/dist/elements/index.d.ts +13 -0
- package/dist/elements/index.d.ts.map +1 -0
- package/dist/elements/index.js +30 -0
- package/dist/elements/index.js.map +1 -0
- package/dist/elements/map.d.ts +19 -0
- package/dist/elements/map.d.ts.map +1 -0
- package/dist/elements/map.js +278 -0
- package/dist/elements/map.js.map +1 -0
- package/dist/elements/nav.d.ts +16 -0
- package/dist/elements/nav.d.ts.map +1 -0
- package/dist/elements/nav.js +43 -0
- package/dist/elements/nav.js.map +1 -0
- package/dist/elements/sandbox.d.ts +25 -0
- package/dist/elements/sandbox.d.ts.map +1 -0
- package/dist/elements/sandbox.js +257 -0
- package/dist/elements/sandbox.js.map +1 -0
- package/dist/elements/ssr-safe.d.ts +10 -0
- package/dist/elements/ssr-safe.d.ts.map +1 -0
- package/dist/elements/ssr-safe.js +13 -0
- package/dist/elements/ssr-safe.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/behaviors/copy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/behaviors/copy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAsC7C;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAqDzE"}
|
package/dist/behaviors/copy.js
CHANGED
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
const SVG_NS = 'http://www.w3.org/2000/svg';
|
|
2
|
+
const COPY_ICON = '<rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/>';
|
|
3
|
+
const CHECK_ICON = '<polyline points="20 6 9 17 4 12"/>';
|
|
4
|
+
function createIcon(svgContent) {
|
|
5
|
+
const svg = document.createElementNS(SVG_NS, 'svg');
|
|
6
|
+
svg.setAttribute('width', '16');
|
|
7
|
+
svg.setAttribute('height', '16');
|
|
8
|
+
svg.setAttribute('viewBox', '0 0 24 24');
|
|
9
|
+
svg.setAttribute('fill', 'none');
|
|
10
|
+
svg.setAttribute('stroke', 'currentColor');
|
|
11
|
+
svg.setAttribute('stroke-width', '2');
|
|
12
|
+
svg.setAttribute('stroke-linecap', 'round');
|
|
13
|
+
svg.setAttribute('stroke-linejoin', 'round');
|
|
14
|
+
svg.innerHTML = svgContent;
|
|
15
|
+
return svg;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Extract copyable text from a `<pre>` element.
|
|
19
|
+
*
|
|
20
|
+
* If the element has a `data-copy-selector` attribute, only the text of
|
|
21
|
+
* matching child elements is collected (joined with newlines). This lets
|
|
22
|
+
* runes like diff exclude gutter numbers and prefixes from the copied text.
|
|
23
|
+
* Otherwise falls back to the full `textContent`.
|
|
24
|
+
*/
|
|
25
|
+
function getCopyText(pre) {
|
|
26
|
+
const selector = pre.getAttribute('data-copy-selector');
|
|
27
|
+
if (selector) {
|
|
28
|
+
const els = pre.querySelectorAll(selector);
|
|
29
|
+
return Array.from(els).map((el) => el.textContent ?? '').join('\n');
|
|
30
|
+
}
|
|
31
|
+
return pre.textContent ?? '';
|
|
32
|
+
}
|
|
1
33
|
/**
|
|
2
34
|
* Copy-to-clipboard behavior for code blocks.
|
|
3
35
|
*
|
|
@@ -17,18 +49,22 @@ export function copyBehavior(container) {
|
|
|
17
49
|
btn.className = 'rf-copy-btn';
|
|
18
50
|
btn.type = 'button';
|
|
19
51
|
btn.setAttribute('aria-label', 'Copy code');
|
|
20
|
-
btn.
|
|
52
|
+
btn.appendChild(createIcon(COPY_ICON));
|
|
21
53
|
let timeout;
|
|
22
54
|
const handler = () => {
|
|
23
|
-
const text = pre
|
|
55
|
+
const text = getCopyText(pre);
|
|
24
56
|
navigator.clipboard.writeText(text).then(() => {
|
|
25
|
-
btn.
|
|
57
|
+
btn.innerHTML = '';
|
|
58
|
+
btn.appendChild(createIcon(CHECK_ICON));
|
|
26
59
|
btn.setAttribute('aria-label', 'Copied');
|
|
60
|
+
btn.classList.add('rf-copy-btn--copied');
|
|
27
61
|
if (timeout)
|
|
28
62
|
clearTimeout(timeout);
|
|
29
63
|
timeout = setTimeout(() => {
|
|
30
|
-
btn.
|
|
64
|
+
btn.innerHTML = '';
|
|
65
|
+
btn.appendChild(createIcon(COPY_ICON));
|
|
31
66
|
btn.setAttribute('aria-label', 'Copy code');
|
|
67
|
+
btn.classList.remove('rf-copy-btn--copied');
|
|
32
68
|
}, 2000);
|
|
33
69
|
});
|
|
34
70
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/behaviors/copy.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiC;IAC7D,MAAM,IAAI,GAAG,SAAS,CAAC,gBAAgB,CAAc,KAAK,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,4FAA4F;QAC5F,IAAI,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAAE,SAAS;QACvE,IAAI,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,SAAS;QAEpE,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,GAAG,CAAC,SAAS,GAAG,aAAa,CAAC;QAC9B,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC;QACpB,GAAG,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAC5C,GAAG,CAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/behaviors/copy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CleanupFn } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Mobile menu behavior for layouts.
|
|
4
|
+
*
|
|
5
|
+
* Replaces Svelte reactive state ($state menuOpen/navOpen) with DOM-based toggling.
|
|
6
|
+
* Discovers elements by data attributes and wires up:
|
|
7
|
+
* - [data-mobile-menu-open] — opens the header menu panel
|
|
8
|
+
* - [data-mobile-menu-close] — closes all panels
|
|
9
|
+
* - [data-mobile-nav-toggle] — toggles the nav panel
|
|
10
|
+
* - Escape key dismisses all open panels
|
|
11
|
+
* - Body scroll lock when a panel is open
|
|
12
|
+
*
|
|
13
|
+
* Panels are toggled via [data-open] attribute. CSS should use:
|
|
14
|
+
* .rf-mobile-panel { display: none; }
|
|
15
|
+
* .rf-mobile-panel[data-open] { display: block; }
|
|
16
|
+
*/
|
|
17
|
+
export declare function mobileMenuBehavior(container: HTMLElement | Document): CleanupFn;
|
|
18
|
+
//# sourceMappingURL=mobile-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mobile-menu.d.ts","sourceRoot":"","sources":["../../src/behaviors/mobile-menu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CA+D/E"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mobile menu behavior for layouts.
|
|
3
|
+
*
|
|
4
|
+
* Replaces Svelte reactive state ($state menuOpen/navOpen) with DOM-based toggling.
|
|
5
|
+
* Discovers elements by data attributes and wires up:
|
|
6
|
+
* - [data-mobile-menu-open] — opens the header menu panel
|
|
7
|
+
* - [data-mobile-menu-close] — closes all panels
|
|
8
|
+
* - [data-mobile-nav-toggle] — toggles the nav panel
|
|
9
|
+
* - Escape key dismisses all open panels
|
|
10
|
+
* - Body scroll lock when a panel is open
|
|
11
|
+
*
|
|
12
|
+
* Panels are toggled via [data-open] attribute. CSS should use:
|
|
13
|
+
* .rf-mobile-panel { display: none; }
|
|
14
|
+
* .rf-mobile-panel[data-open] { display: block; }
|
|
15
|
+
*/
|
|
16
|
+
export function mobileMenuBehavior(container) {
|
|
17
|
+
const cleanups = [];
|
|
18
|
+
const root = container instanceof Document ? container.documentElement : container;
|
|
19
|
+
const panels = root.querySelectorAll('.rf-mobile-panel');
|
|
20
|
+
if (panels.length === 0)
|
|
21
|
+
return () => { };
|
|
22
|
+
function closeAll() {
|
|
23
|
+
panels.forEach(p => p.removeAttribute('data-open'));
|
|
24
|
+
document.body.style.overflow = '';
|
|
25
|
+
}
|
|
26
|
+
function openPanel(panel) {
|
|
27
|
+
closeAll();
|
|
28
|
+
panel.setAttribute('data-open', '');
|
|
29
|
+
document.body.style.overflow = 'hidden';
|
|
30
|
+
}
|
|
31
|
+
// Open menu buttons — open the first non-nav panel
|
|
32
|
+
const openBtns = root.querySelectorAll('[data-mobile-menu-open]');
|
|
33
|
+
for (const btn of openBtns) {
|
|
34
|
+
const handler = () => {
|
|
35
|
+
const panel = root.querySelector('.rf-mobile-panel:not(.rf-mobile-panel--nav)');
|
|
36
|
+
if (panel)
|
|
37
|
+
openPanel(panel);
|
|
38
|
+
};
|
|
39
|
+
btn.addEventListener('click', handler);
|
|
40
|
+
cleanups.push(() => btn.removeEventListener('click', handler));
|
|
41
|
+
}
|
|
42
|
+
// Close buttons
|
|
43
|
+
const closeBtns = root.querySelectorAll('[data-mobile-menu-close]');
|
|
44
|
+
for (const btn of closeBtns) {
|
|
45
|
+
btn.addEventListener('click', closeAll);
|
|
46
|
+
cleanups.push(() => btn.removeEventListener('click', closeAll));
|
|
47
|
+
}
|
|
48
|
+
// Nav panel toggle
|
|
49
|
+
const navToggles = root.querySelectorAll('[data-mobile-nav-toggle]');
|
|
50
|
+
for (const btn of navToggles) {
|
|
51
|
+
const handler = () => {
|
|
52
|
+
const navPanel = root.querySelector('.rf-mobile-panel--nav');
|
|
53
|
+
if (!navPanel)
|
|
54
|
+
return;
|
|
55
|
+
if (navPanel.hasAttribute('data-open')) {
|
|
56
|
+
closeAll();
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
openPanel(navPanel);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
btn.addEventListener('click', handler);
|
|
63
|
+
cleanups.push(() => btn.removeEventListener('click', handler));
|
|
64
|
+
}
|
|
65
|
+
// Escape key
|
|
66
|
+
const onKeydown = (e) => {
|
|
67
|
+
if (e.key === 'Escape')
|
|
68
|
+
closeAll();
|
|
69
|
+
};
|
|
70
|
+
document.addEventListener('keydown', onKeydown);
|
|
71
|
+
cleanups.push(() => document.removeEventListener('keydown', onKeydown));
|
|
72
|
+
return () => {
|
|
73
|
+
closeAll();
|
|
74
|
+
cleanups.forEach(fn => fn());
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=mobile-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mobile-menu.js","sourceRoot":"","sources":["../../src/behaviors/mobile-menu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CleanupFn } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Scroll-spy behavior for "On This Page" navigation.
|
|
4
|
+
*
|
|
5
|
+
* Discovers `[data-scrollspy]` containers, finds anchor links pointing to
|
|
6
|
+
* heading IDs, and uses IntersectionObserver to set `data-active` on the
|
|
7
|
+
* `<li>` whose heading is currently in view.
|
|
8
|
+
*
|
|
9
|
+
* Works with any theme/framework — pure DOM, no framework dependencies.
|
|
10
|
+
*/
|
|
11
|
+
export declare function scrollspyBehavior(container: HTMLElement | Document): CleanupFn;
|
|
12
|
+
//# sourceMappingURL=scrollspy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollspy.d.ts","sourceRoot":"","sources":["../../src/behaviors/scrollspy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CA4D9E"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scroll-spy behavior for "On This Page" navigation.
|
|
3
|
+
*
|
|
4
|
+
* Discovers `[data-scrollspy]` containers, finds anchor links pointing to
|
|
5
|
+
* heading IDs, and uses IntersectionObserver to set `data-active` on the
|
|
6
|
+
* `<li>` whose heading is currently in view.
|
|
7
|
+
*
|
|
8
|
+
* Works with any theme/framework — pure DOM, no framework dependencies.
|
|
9
|
+
*/
|
|
10
|
+
export function scrollspyBehavior(container) {
|
|
11
|
+
const navs = container.querySelectorAll('[data-scrollspy]');
|
|
12
|
+
const cleanups = [];
|
|
13
|
+
for (const nav of navs) {
|
|
14
|
+
const links = nav.querySelectorAll('a[href^="#"]');
|
|
15
|
+
if (links.length === 0)
|
|
16
|
+
continue;
|
|
17
|
+
// Build a map from heading element → <li> to mark active
|
|
18
|
+
const headingToItem = new Map();
|
|
19
|
+
const headings = [];
|
|
20
|
+
for (const link of links) {
|
|
21
|
+
const id = link.getAttribute('href').slice(1);
|
|
22
|
+
const heading = document.getElementById(id);
|
|
23
|
+
if (!heading)
|
|
24
|
+
continue;
|
|
25
|
+
const li = link.closest('li');
|
|
26
|
+
if (!li)
|
|
27
|
+
continue;
|
|
28
|
+
headingToItem.set(heading, li);
|
|
29
|
+
headings.push(heading);
|
|
30
|
+
}
|
|
31
|
+
if (headings.length === 0)
|
|
32
|
+
continue;
|
|
33
|
+
let activeItem = null;
|
|
34
|
+
const observer = new IntersectionObserver((entries) => {
|
|
35
|
+
// Find the topmost visible heading
|
|
36
|
+
for (const entry of entries) {
|
|
37
|
+
if (entry.isIntersecting) {
|
|
38
|
+
const item = headingToItem.get(entry.target);
|
|
39
|
+
if (item && item !== activeItem) {
|
|
40
|
+
activeItem?.removeAttribute('data-active');
|
|
41
|
+
item.setAttribute('data-active', '');
|
|
42
|
+
activeItem = item;
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}, {
|
|
48
|
+
// Trigger when heading enters the top 20% of the viewport
|
|
49
|
+
rootMargin: '0px 0px -80% 0px',
|
|
50
|
+
});
|
|
51
|
+
for (const heading of headings) {
|
|
52
|
+
observer.observe(heading);
|
|
53
|
+
}
|
|
54
|
+
cleanups.push(() => {
|
|
55
|
+
observer.disconnect();
|
|
56
|
+
activeItem?.removeAttribute('data-active');
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return () => cleanups.forEach((fn) => fn());
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=scrollspy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollspy.js","sourceRoot":"","sources":["../../src/behaviors/scrollspy.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiC;IAClE,MAAM,IAAI,GAAG,SAAS,CAAC,gBAAgB,CAAc,kBAAkB,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,GAAG,CAAC,gBAAgB,CAAoB,cAAc,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEjC,yDAAyD;QACzD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAoB,CAAC;QAClD,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,EAAE;gBAAE,SAAS;YAElB,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEpC,IAAI,UAAU,GAAmB,IAAI,CAAC;QAEtC,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CACxC,CAAC,OAAO,EAAE,EAAE;YACX,mCAAmC;YACnC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;oBAC1B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC7C,IAAI,IAAI,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;wBACjC,UAAU,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;wBAC3C,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;wBACrC,UAAU,GAAG,IAAI,CAAC;oBACnB,CAAC;oBACD,MAAM;gBACP,CAAC;YACF,CAAC;QACF,CAAC,EACD;YACC,0DAA0D;YAC1D,UAAU,EAAE,kBAAkB;SAC9B,CACD,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;YAClB,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,UAAU,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** Minimal design token types (mirroring @refrakt-md/types without the dependency) */
|
|
2
|
+
export interface DesignTokenFont {
|
|
3
|
+
role: string;
|
|
4
|
+
family: string;
|
|
5
|
+
weights: number[];
|
|
6
|
+
category: string;
|
|
7
|
+
}
|
|
8
|
+
export interface DesignTokenColor {
|
|
9
|
+
name: string;
|
|
10
|
+
value: string;
|
|
11
|
+
group?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface DesignTokenNamedValue {
|
|
14
|
+
name: string;
|
|
15
|
+
value: string;
|
|
16
|
+
}
|
|
17
|
+
export interface DesignTokens {
|
|
18
|
+
fonts?: DesignTokenFont[];
|
|
19
|
+
colors?: DesignTokenColor[];
|
|
20
|
+
spacing?: {
|
|
21
|
+
unit?: string;
|
|
22
|
+
scale?: string[];
|
|
23
|
+
};
|
|
24
|
+
radii?: DesignTokenNamedValue[];
|
|
25
|
+
shadows?: DesignTokenNamedValue[];
|
|
26
|
+
}
|
|
27
|
+
export interface PageEntry {
|
|
28
|
+
url: string;
|
|
29
|
+
title: string;
|
|
30
|
+
draft: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Framework-neutral context provider for web component runes.
|
|
34
|
+
*
|
|
35
|
+
* Each framework adapter (SvelteKit, Next.js, etc.) sets these values
|
|
36
|
+
* during initialization. Web components read them via static properties.
|
|
37
|
+
*
|
|
38
|
+
* Usage:
|
|
39
|
+
* RfContext.pages = data.pages;
|
|
40
|
+
* RfContext.currentUrl = $page.url.pathname;
|
|
41
|
+
*/
|
|
42
|
+
export declare class RfContext {
|
|
43
|
+
static pages: PageEntry[];
|
|
44
|
+
static currentUrl: string;
|
|
45
|
+
static designTokens: DesignTokens | null;
|
|
46
|
+
static theme: 'light' | 'dark' | 'auto';
|
|
47
|
+
/** Subscribe to theme changes. Called by Sandbox web component. */
|
|
48
|
+
private static themeListeners;
|
|
49
|
+
static onThemeChange(listener: (theme: string) => void): () => void;
|
|
50
|
+
static setTheme(theme: 'light' | 'dark' | 'auto'): void;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/elements/context.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC5B,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC9C,KAAK,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAChC,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,qBAAa,SAAS;IACrB,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,CAAM;IAC/B,MAAM,CAAC,UAAU,SAAM;IACvB,MAAM,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAQ;IAChD,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAU;IAEjD,mEAAmE;IACnE,OAAO,CAAC,MAAM,CAAC,cAAc,CAAsC;IAEnE,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAOnE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM;CAMhD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-neutral context provider for web component runes.
|
|
3
|
+
*
|
|
4
|
+
* Each framework adapter (SvelteKit, Next.js, etc.) sets these values
|
|
5
|
+
* during initialization. Web components read them via static properties.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* RfContext.pages = data.pages;
|
|
9
|
+
* RfContext.currentUrl = $page.url.pathname;
|
|
10
|
+
*/
|
|
11
|
+
export class RfContext {
|
|
12
|
+
static pages = [];
|
|
13
|
+
static currentUrl = '';
|
|
14
|
+
static designTokens = null;
|
|
15
|
+
static theme = 'auto';
|
|
16
|
+
/** Subscribe to theme changes. Called by Sandbox web component. */
|
|
17
|
+
static themeListeners = [];
|
|
18
|
+
static onThemeChange(listener) {
|
|
19
|
+
RfContext.themeListeners.push(listener);
|
|
20
|
+
return () => {
|
|
21
|
+
RfContext.themeListeners = RfContext.themeListeners.filter(l => l !== listener);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
static setTheme(theme) {
|
|
25
|
+
RfContext.theme = theme;
|
|
26
|
+
for (const listener of RfContext.themeListeners) {
|
|
27
|
+
listener(theme);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/elements/context.ts"],"names":[],"mappings":"AAiCA;;;;;;;;;GASG;AACH,MAAM,OAAO,SAAS;IACrB,MAAM,CAAC,KAAK,GAAgB,EAAE,CAAC;IAC/B,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;IACvB,MAAM,CAAC,YAAY,GAAwB,IAAI,CAAC;IAChD,MAAM,CAAC,KAAK,GAA8B,MAAM,CAAC;IAEjD,mEAAmE;IAC3D,MAAM,CAAC,cAAc,GAAmC,EAAE,CAAC;IAEnE,MAAM,CAAC,aAAa,CAAC,QAAiC;QACrD,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACX,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QACjF,CAAC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,KAAgC;QAC/C,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;QACxB,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;YACjD,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACF,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SafeHTMLElement } from './ssr-safe.js';
|
|
2
|
+
/**
|
|
3
|
+
* <rf-diagram> — renders Mermaid diagrams or ASCII art.
|
|
4
|
+
*
|
|
5
|
+
* The postTransform hook produces:
|
|
6
|
+
* - data-language attribute (mermaid | ascii)
|
|
7
|
+
* - A visible <pre><code> fallback (SSR-friendly)
|
|
8
|
+
* - A hidden div with the raw source for the web component to read
|
|
9
|
+
*
|
|
10
|
+
* Progressive enhancement: <pre><code> fallback is shown until Mermaid renders SVG.
|
|
11
|
+
*/
|
|
12
|
+
export declare class RfDiagram extends SafeHTMLElement {
|
|
13
|
+
connectedCallback(): void;
|
|
14
|
+
private renderMermaid;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=diagram.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagram.d.ts","sourceRoot":"","sources":["../../src/elements/diagram.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;;;;;;;;GASG;AACH,qBAAa,SAAU,SAAQ,eAAe;IAC7C,iBAAiB;YAeH,aAAa;CAY3B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { readHiddenContent } from './helpers.js';
|
|
2
|
+
import { SafeHTMLElement } from './ssr-safe.js';
|
|
3
|
+
/**
|
|
4
|
+
* <rf-diagram> — renders Mermaid diagrams or ASCII art.
|
|
5
|
+
*
|
|
6
|
+
* The postTransform hook produces:
|
|
7
|
+
* - data-language attribute (mermaid | ascii)
|
|
8
|
+
* - A visible <pre><code> fallback (SSR-friendly)
|
|
9
|
+
* - A hidden div with the raw source for the web component to read
|
|
10
|
+
*
|
|
11
|
+
* Progressive enhancement: <pre><code> fallback is shown until Mermaid renders SVG.
|
|
12
|
+
*/
|
|
13
|
+
export class RfDiagram extends SafeHTMLElement {
|
|
14
|
+
connectedCallback() {
|
|
15
|
+
const language = this.dataset.language || 'mermaid';
|
|
16
|
+
const source = readHiddenContent(this, 'source');
|
|
17
|
+
const container = this.querySelector('.rf-diagram__container');
|
|
18
|
+
if (!container || !source)
|
|
19
|
+
return;
|
|
20
|
+
if (language === 'mermaid') {
|
|
21
|
+
this.renderMermaid(source, container);
|
|
22
|
+
}
|
|
23
|
+
else if (language === 'ascii') {
|
|
24
|
+
container.textContent = source;
|
|
25
|
+
container.style.fontFamily = 'var(--rf-font-mono)';
|
|
26
|
+
container.style.whiteSpace = 'pre';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async renderMermaid(source, container) {
|
|
30
|
+
try {
|
|
31
|
+
const cdn = 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
|
|
32
|
+
const mermaid = (await import(/* @vite-ignore */ cdn)).default;
|
|
33
|
+
mermaid.initialize({ startOnLoad: false, theme: 'default' });
|
|
34
|
+
const id = 'mermaid-' + Math.random().toString(36).slice(2);
|
|
35
|
+
const { svg } = await mermaid.render(id, source);
|
|
36
|
+
container.innerHTML = svg;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Mermaid failed — fallback <pre> remains visible
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=diagram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagram.js","sourceRoot":"","sources":["../../src/elements/diagram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;;;;;;;;GASG;AACH,MAAM,OAAO,SAAU,SAAQ,eAAe;IAC7C,iBAAiB;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC;QACpD,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAc,wBAAwB,CAAC,CAAC;QAC5E,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM;YAAE,OAAO;QAElC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,SAAS,CAAC,WAAW,GAAG,MAAM,CAAC;YAC/B,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,qBAAqB,CAAC;YACnD,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;QACpC,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,SAAsB;QACjE,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,kEAAkE,CAAC;YAC/E,MAAM,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/D,OAAO,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC7D,MAAM,EAAE,GAAG,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACjD,SAAS,CAAC,SAAS,GAAG,GAAG,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACR,kDAAkD;QACnD,CAAC;IACF,CAAC;CACD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read content from a hidden `<div data-content="name" style="display:none">` child.
|
|
3
|
+
* Used for large content (diagram source, sandbox HTML) that the web component
|
|
4
|
+
* needs but shouldn't be visually rendered. Created by postTransform hooks.
|
|
5
|
+
*/
|
|
6
|
+
export declare function readHiddenContent(el: HTMLElement, name: string): string;
|
|
7
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/elements/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGvE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read content from a hidden `<div data-content="name" style="display:none">` child.
|
|
3
|
+
* Used for large content (diagram source, sandbox HTML) that the web component
|
|
4
|
+
* needs but shouldn't be visually rendered. Created by postTransform hooks.
|
|
5
|
+
*/
|
|
6
|
+
export function readHiddenContent(el, name) {
|
|
7
|
+
const container = el.querySelector(`[data-content="${name}"]`);
|
|
8
|
+
return container?.textContent || '';
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/elements/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAe,EAAE,IAAY;IAC9D,MAAM,SAAS,GAAG,EAAE,CAAC,aAAa,CAAc,kBAAkB,IAAI,IAAI,CAAC,CAAC;IAC5E,OAAO,SAAS,EAAE,WAAW,IAAI,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register all web component custom elements.
|
|
3
|
+
* Idempotent — safe to call multiple times.
|
|
4
|
+
* No-op in SSR (Node.js) where customElements is not defined.
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerElements(): void;
|
|
7
|
+
export { RfContext } from './context.js';
|
|
8
|
+
export type { PageEntry, DesignTokens } from './context.js';
|
|
9
|
+
export { RfDiagram } from './diagram.js';
|
|
10
|
+
export { RfNav } from './nav.js';
|
|
11
|
+
export { RfMap } from './map.js';
|
|
12
|
+
export { RfSandbox } from './sandbox.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/elements/index.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAevC;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { RfDiagram } from './diagram.js';
|
|
2
|
+
import { RfNav } from './nav.js';
|
|
3
|
+
import { RfMap } from './map.js';
|
|
4
|
+
import { RfSandbox } from './sandbox.js';
|
|
5
|
+
/**
|
|
6
|
+
* Register all web component custom elements.
|
|
7
|
+
* Idempotent — safe to call multiple times.
|
|
8
|
+
* No-op in SSR (Node.js) where customElements is not defined.
|
|
9
|
+
*/
|
|
10
|
+
export function registerElements() {
|
|
11
|
+
if (typeof customElements === 'undefined')
|
|
12
|
+
return;
|
|
13
|
+
const elements = [
|
|
14
|
+
['rf-diagram', RfDiagram],
|
|
15
|
+
['rf-nav', RfNav],
|
|
16
|
+
['rf-map', RfMap],
|
|
17
|
+
['rf-sandbox', RfSandbox],
|
|
18
|
+
];
|
|
19
|
+
for (const [name, ctor] of elements) {
|
|
20
|
+
if (!customElements.get(name)) {
|
|
21
|
+
customElements.define(name, ctor);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export { RfContext } from './context.js';
|
|
26
|
+
export { RfDiagram } from './diagram.js';
|
|
27
|
+
export { RfNav } from './nav.js';
|
|
28
|
+
export { RfMap } from './map.js';
|
|
29
|
+
export { RfSandbox } from './sandbox.js';
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/elements/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC/B,IAAI,OAAO,cAAc,KAAK,WAAW;QAAE,OAAO;IAElD,MAAM,QAAQ,GAA8C;QAC3D,CAAC,YAAY,EAAE,SAAS,CAAC;QACzB,CAAC,QAAQ,EAAE,KAAK,CAAC;QACjB,CAAC,QAAQ,EAAE,KAAK,CAAC;QACjB,CAAC,YAAY,EAAE,SAAS,CAAC;KACzB,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACrC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;AACF,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <rf-map> — interactive Leaflet.js map with markers, popups, routes, and clustering.
|
|
3
|
+
*
|
|
4
|
+
* Reads configuration from data attributes (data-zoom, data-center, data-style,
|
|
5
|
+
* data-height, data-provider, data-interactive, data-route, data-cluster, data-api-key).
|
|
6
|
+
* Extracts pin data from child <ol> → <li> elements with data-typeof="MapPin".
|
|
7
|
+
*
|
|
8
|
+
* Progressive enhancement: shows a structured list of locations until Leaflet loads.
|
|
9
|
+
*/
|
|
10
|
+
import { SafeHTMLElement } from './ssr-safe.js';
|
|
11
|
+
export declare class RfMap extends SafeHTMLElement {
|
|
12
|
+
private mapInstance;
|
|
13
|
+
private initializing;
|
|
14
|
+
connectedCallback(): void;
|
|
15
|
+
disconnectedCallback(): void;
|
|
16
|
+
private extractPins;
|
|
17
|
+
private initLeaflet;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/elements/map.ts"],"names":[],"mappings":"AAgDA;;;;;;;;GAQG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,qBAAa,KAAM,SAAQ,eAAe;IACzC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAS;IAE7B,iBAAiB;IAOjB,oBAAoB;IAOpB,OAAO,CAAC,WAAW;YAwBL,WAAW;CAwMzB"}
|