@hyperfixi/behaviors 2.2.1 → 2.3.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/all.browser.global.js +316 -54
- package/dist/all.browser.global.js.map +1 -1
- package/dist/autodismiss.browser.global.js +54 -2
- package/dist/autodismiss.browser.global.js.map +1 -1
- package/dist/behaviors/autodismiss.cjs +54 -18
- package/dist/behaviors/autodismiss.cjs.map +1 -1
- package/dist/behaviors/autodismiss.js +2 -2
- package/dist/behaviors/clickoutside.cjs +23 -4
- package/dist/behaviors/clickoutside.cjs.map +1 -1
- package/dist/behaviors/clickoutside.js +2 -2
- package/dist/behaviors/clipboard.cjs +43 -21
- package/dist/behaviors/clipboard.cjs.map +1 -1
- package/dist/behaviors/clipboard.js +2 -2
- package/dist/behaviors/focustrap.cjs +44 -3
- package/dist/behaviors/focustrap.cjs.map +1 -1
- package/dist/behaviors/focustrap.js +2 -2
- package/dist/behaviors/removable.cjs +7 -4
- package/dist/behaviors/removable.cjs.map +1 -1
- package/dist/behaviors/removable.js +2 -2
- package/dist/behaviors/resizable.cjs +22 -14
- package/dist/behaviors/resizable.cjs.map +1 -1
- package/dist/behaviors/resizable.js +2 -2
- package/dist/behaviors/scrollreveal.cjs +25 -13
- package/dist/behaviors/scrollreveal.cjs.map +1 -1
- package/dist/behaviors/scrollreveal.js +2 -2
- package/dist/behaviors/sortable.cjs +18 -12
- package/dist/behaviors/sortable.cjs.map +1 -1
- package/dist/behaviors/sortable.js +2 -2
- package/dist/behaviors/tabs.cjs +80 -11
- package/dist/behaviors/tabs.cjs.map +1 -1
- package/dist/behaviors/tabs.js +2 -2
- package/dist/behaviors/toggleable.cjs +5 -2
- package/dist/behaviors/toggleable.cjs.map +1 -1
- package/dist/behaviors/toggleable.js +2 -2
- package/dist/chunk-66U2RSYJ.js +100 -0
- package/dist/chunk-66U2RSYJ.js.map +1 -0
- package/dist/{chunk-2NSKQMNM.js → chunk-7O7UOSBH.js} +2 -2
- package/dist/{chunk-244WSZOL.js → chunk-EKKJVXDZ.js} +2 -2
- package/dist/{chunk-AFGA54SA.js → chunk-F3CASJ7Q.js} +2 -2
- package/dist/{chunk-YHQRFUWV.js → chunk-GALKOMJ5.js} +2 -2
- package/dist/{chunk-272NKUJ3.js → chunk-HMU342XE.js} +8 -5
- package/dist/chunk-HMU342XE.js.map +1 -0
- package/dist/chunk-HQDYH45I.js +137 -0
- package/dist/chunk-HQDYH45I.js.map +1 -0
- package/dist/{chunk-WTUVPVSD.js → chunk-IQM32TEY.js} +2 -2
- package/dist/{chunk-H5Y5ARYG.js → chunk-L52AGCMP.js} +2 -2
- package/dist/{chunk-H2MCHR5A.js → chunk-LQJOQTBZ.js} +2 -2
- package/dist/{chunk-7JDV2THA.js → chunk-MVNHMYIK.js} +11 -11
- package/dist/{chunk-BWZ6EGII.js → chunk-NC6I6T7T.js} +19 -13
- package/dist/{chunk-BWZ6EGII.js.map → chunk-NC6I6T7T.js.map} +1 -1
- package/dist/chunk-OJ3YWO3W.js +92 -0
- package/dist/chunk-OJ3YWO3W.js.map +1 -0
- package/dist/{chunk-64DIQGQI.js → chunk-SLOXO6IY.js} +24 -5
- package/dist/chunk-SLOXO6IY.js.map +1 -0
- package/dist/{chunk-RPERQTFU.js → chunk-TLLGH5KX.js} +2 -2
- package/dist/{chunk-V5IWDPDP.js → chunk-U5GNXZUF.js} +23 -15
- package/dist/{chunk-V5IWDPDP.js.map → chunk-U5GNXZUF.js.map} +1 -1
- package/dist/{chunk-GPTHAUWN.js → chunk-URZGNPTQ.js} +26 -14
- package/dist/chunk-URZGNPTQ.js.map +1 -0
- package/dist/chunk-WOTZO7K4.js +92 -0
- package/dist/chunk-WOTZO7K4.js.map +1 -0
- package/dist/{chunk-JKBWIJFI.js → chunk-WPOQIMCC.js} +2 -2
- package/dist/{chunk-WUHHMDAA.js → chunk-XYZ7FOXJ.js} +6 -3
- package/dist/{chunk-WUHHMDAA.js.map → chunk-XYZ7FOXJ.js.map} +1 -1
- package/dist/{chunk-DYHBKDKB.js → chunk-ZZ2WSAX3.js} +2 -2
- package/dist/clickoutside.browser.global.js +16 -5
- package/dist/clickoutside.browser.global.js.map +1 -1
- package/dist/clipboard.browser.global.js +43 -2
- package/dist/clipboard.browser.global.js.map +1 -1
- package/dist/core.browser.global.js +5 -2
- package/dist/core.browser.global.js.map +1 -1
- package/dist/focustrap.browser.global.js +46 -5
- package/dist/focustrap.browser.global.js.map +1 -1
- package/dist/index.cjs +321 -102
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +21 -21
- package/dist/loaders.cjs +321 -102
- package/dist/loaders.cjs.map +1 -1
- package/dist/loaders.js +11 -11
- package/dist/removable.browser.global.js +8 -5
- package/dist/removable.browser.global.js.map +1 -1
- package/dist/resizable.browser.global.js +24 -16
- package/dist/resizable.browser.global.js.map +1 -1
- package/dist/resolver.browser.global.js +407 -0
- package/dist/resolver.browser.global.js.map +1 -0
- package/dist/schemas/index.cjs +321 -102
- package/dist/schemas/index.cjs.map +1 -1
- package/dist/schemas/index.js +10 -10
- package/dist/scrollreveal.browser.global.js +27 -8
- package/dist/scrollreveal.browser.global.js.map +1 -1
- package/dist/sortable.browser.global.js +19 -13
- package/dist/sortable.browser.global.js.map +1 -1
- package/dist/tabs.browser.global.js +80 -2
- package/dist/tabs.browser.global.js.map +1 -1
- package/dist/toggleable.browser.global.js +6 -3
- package/dist/toggleable.browser.global.js.map +1 -1
- package/package.json +1 -1
- package/src/behavior-resolver.ts +91 -0
- package/src/browser-resolver-bundle.ts +42 -0
- package/src/schemas/autodismiss.schema.ts +54 -18
- package/src/schemas/clickoutside.schema.ts +22 -3
- package/src/schemas/clipboard.schema.ts +43 -21
- package/src/schemas/focustrap.schema.ts +44 -3
- package/src/schemas/removable.schema.ts +7 -4
- package/src/schemas/resizable.schema.ts +22 -14
- package/src/schemas/scrollreveal.schema.ts +25 -13
- package/src/schemas/sortable.schema.ts +18 -12
- package/src/schemas/tabs.schema.ts +80 -11
- package/src/schemas/toggleable.schema.ts +5 -2
- package/dist/chunk-272NKUJ3.js.map +0 -1
- package/dist/chunk-64DIQGQI.js.map +0 -1
- package/dist/chunk-GPTHAUWN.js.map +0 -1
- package/dist/chunk-GVJPA2EK.js +0 -68
- package/dist/chunk-GVJPA2EK.js.map +0 -1
- package/dist/chunk-QKDYW4VM.js +0 -70
- package/dist/chunk-QKDYW4VM.js.map +0 -1
- package/dist/chunk-RB7OB6OD.js +0 -51
- package/dist/chunk-RB7OB6OD.js.map +0 -1
- package/dist/chunk-ZQQZTMCJ.js +0 -64
- package/dist/chunk-ZQQZTMCJ.js.map +0 -1
- /package/dist/{chunk-2NSKQMNM.js.map → chunk-7O7UOSBH.js.map} +0 -0
- /package/dist/{chunk-244WSZOL.js.map → chunk-EKKJVXDZ.js.map} +0 -0
- /package/dist/{chunk-AFGA54SA.js.map → chunk-F3CASJ7Q.js.map} +0 -0
- /package/dist/{chunk-YHQRFUWV.js.map → chunk-GALKOMJ5.js.map} +0 -0
- /package/dist/{chunk-WTUVPVSD.js.map → chunk-IQM32TEY.js.map} +0 -0
- /package/dist/{chunk-H5Y5ARYG.js.map → chunk-L52AGCMP.js.map} +0 -0
- /package/dist/{chunk-H2MCHR5A.js.map → chunk-LQJOQTBZ.js.map} +0 -0
- /package/dist/{chunk-7JDV2THA.js.map → chunk-MVNHMYIK.js.map} +0 -0
- /package/dist/{chunk-RPERQTFU.js.map → chunk-TLLGH5KX.js.map} +0 -0
- /package/dist/{chunk-JKBWIJFI.js.map → chunk-WPOQIMCC.js.map} +0 -0
- /package/dist/{chunk-DYHBKDKB.js.map → chunk-ZZ2WSAX3.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemas/tabs.schema.ts"],"sourcesContent":["import type { BehaviorSchema } from './types';\n\nexport const tabsSchema: BehaviorSchema = {\n name: 'Tabs',\n category: 'ui',\n tier: 'core',\n version: '1.0.0',\n description:\n 'WAI-ARIA compliant tabs with roving tabindex keyboard navigation. ' +\n 'Auto-wires role, aria-selected, aria-controls, and aria-labelledby attributes.',\n parameters: [\n {\n name: 'orientation',\n type: 'string',\n optional: true,\n default: 'horizontal',\n enum: ['horizontal', 'vertical'],\n description: 'Arrow key direction: horizontal (Left/Right) or vertical (Up/Down)',\n },\n {\n name: 'activeTab',\n type: 'number',\n optional: true,\n default: 0,\n description: 'Initial active tab index (zero-based)',\n },\n {\n name: 'wrap',\n type: 'boolean',\n optional: true,\n default: true,\n description: 'Wrap to first/last tab when navigating past the end',\n },\n {\n name: 'activeClass',\n type: 'string',\n optional: true,\n default: 'active',\n description: 'CSS class applied to the active tab and its panel',\n },\n ],\n events: [\n {\n name: 'tabs:change',\n description: 'Fired before tab selection changes (cancelable via preventDefault)',\n },\n { name: 'tabs:changed', description: 'Fired after tab selection has changed' },\n ],\n requirements: [\n 'Sets role=\"tablist\" on the tab container',\n 'Sets role=\"tab\" on tab buttons and role=\"tabpanel\" on content panels',\n 'Manages aria-selected, aria-controls, aria-labelledby, and tabindex',\n 'Keyboard: Arrow keys navigate, Home/End jump to first/last, Tab exits tablist',\n ],\n source: `\nbehavior Tabs(orientation, activeTab, wrap, activeClass)\n init\n if orientation is undefined\n set orientation to \"horizontal\"\n end\n if activeTab is undefined\n set activeTab to 0\n end\n if wrap is undefined\n set wrap to true\n end\n if activeClass is undefined\n set activeClass to \"active\"\n end\n js(me, orientation, activeTab, wrap, activeClass)\n var tabs = Array.from(me.querySelectorAll('[role=\"tab\"]'));\n var panels = Array.from(me.querySelectorAll('[role=\"tabpanel\"]'));\n if (tabs.length === 0 || panels.length === 0) return;\n var tablist = me.querySelector('[role=\"tablist\"]') || tabs[0].parentElement;\n if (tablist) tablist.setAttribute('aria-orientation', orientation);\n var count = Math.min(tabs.length, panels.length);\n var idN = 0;\n for (var i = 0; i < count; i++) {\n if (!tabs[i].id) tabs[i].id = 'tab-' + (++idN);\n if (!panels[i].id) panels[i].id = 'tabpanel-' + idN;\n tabs[i].setAttribute('aria-controls', panels[i].id);\n panels[i].setAttribute('aria-labelledby', tabs[i].id);\n }\n var cur = Math.max(0, Math.min(activeTab, count - 1));\n function activate(idx, prev) {\n if (idx === prev || idx < 0 || idx >= count) return false;\n var ev = new CustomEvent('tabs:change', { bubbles: true, cancelable: true, detail: { index: idx, previousIndex: prev } });\n me.dispatchEvent(ev);\n if (ev.defaultPrevented) return false;\n if (prev >= 0 && prev < count) {\n tabs[prev].setAttribute('aria-selected', 'false');\n tabs[prev].setAttribute('tabindex', '-1');\n tabs[prev].classList.remove(activeClass);\n panels[prev].setAttribute('aria-hidden', 'true');\n panels[prev].classList.remove(activeClass);\n }\n tabs[idx].setAttribute('aria-selected', 'true');\n tabs[idx].setAttribute('tabindex', '0');\n tabs[idx].classList.add(activeClass);\n panels[idx].setAttribute('aria-hidden', 'false');\n panels[idx].classList.add(activeClass);\n cur = idx;\n me.dispatchEvent(new CustomEvent('tabs:changed', { bubbles: true, detail: { index: idx } }));\n return true;\n }\n for (var j = 0; j < count; j++) {\n tabs[j].setAttribute('aria-selected', 'false');\n tabs[j].setAttribute('tabindex', '-1');\n panels[j].setAttribute('aria-hidden', 'true');\n panels[j].classList.remove(activeClass);\n }\n tabs[cur].setAttribute('aria-selected', 'true');\n tabs[cur].setAttribute('tabindex', '0');\n tabs[cur].classList.add(activeClass);\n panels[cur].setAttribute('aria-hidden', 'false');\n panels[cur].classList.add(activeClass);\n for (var k = 0; k < count; k++) {\n (function(idx) {\n tabs[idx].addEventListener('click', function() { if (activate(idx, cur)) tabs[idx].focus(); });\n })(k);\n }\n (tablist || me).addEventListener('keydown', function(e) {\n var nk = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown';\n var pk = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp';\n var next = null;\n if (e.key === nk) { next = cur + 1; if (next >= count) next = wrap ? 0 : null; }\n else if (e.key === pk) { next = cur - 1; if (next < 0) next = wrap ? count - 1 : null; }\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = count - 1;\n if (next !== null) { e.preventDefault(); if (activate(next, cur)) tabs[next].focus(); }\n });\n end\n end\nend`.trim(),\n};\n"],"mappings":";AAEO,IAAM,aAA6B;AAAA,EACxC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aACE;AAAA,EAEF,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAM,CAAC,cAAc,UAAU;AAAA,MAC/B,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,EAAE,MAAM,gBAAgB,aAAa,wCAAwC;AAAA,EAC/E;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KA+EL,KAAK;AACV;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resizableSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-U5GNXZUF.js";
|
|
4
4
|
import {
|
|
5
5
|
resolveRuntime
|
|
6
6
|
} from "./chunk-6TJXDCAQ.js";
|
|
@@ -77,4 +77,4 @@ export {
|
|
|
77
77
|
registerResizable,
|
|
78
78
|
resizable_default
|
|
79
79
|
};
|
|
80
|
-
//# sourceMappingURL=chunk-
|
|
80
|
+
//# sourceMappingURL=chunk-IQM32TEY.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
removableSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-HMU342XE.js";
|
|
4
4
|
import {
|
|
5
5
|
resolveRuntime
|
|
6
6
|
} from "./chunk-6TJXDCAQ.js";
|
|
@@ -37,4 +37,4 @@ export {
|
|
|
37
37
|
registerRemovable,
|
|
38
38
|
removable_default
|
|
39
39
|
};
|
|
40
|
-
//# sourceMappingURL=chunk-
|
|
40
|
+
//# sourceMappingURL=chunk-L52AGCMP.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
autoDismissSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-66U2RSYJ.js";
|
|
4
4
|
import {
|
|
5
5
|
resolveRuntime
|
|
6
6
|
} from "./chunk-6TJXDCAQ.js";
|
|
@@ -86,4 +86,4 @@ export {
|
|
|
86
86
|
registerAutoDismiss,
|
|
87
87
|
autodismiss_default
|
|
88
88
|
};
|
|
89
|
-
//# sourceMappingURL=chunk-
|
|
89
|
+
//# sourceMappingURL=chunk-LQJOQTBZ.js.map
|
|
@@ -1,40 +1,40 @@
|
|
|
1
1
|
import {
|
|
2
2
|
removableSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-HMU342XE.js";
|
|
4
4
|
import {
|
|
5
5
|
resizableSchema
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-U5GNXZUF.js";
|
|
7
7
|
import {
|
|
8
8
|
scrollRevealSchema
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-URZGNPTQ.js";
|
|
10
10
|
import {
|
|
11
11
|
sortableSchema
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-NC6I6T7T.js";
|
|
13
13
|
import {
|
|
14
14
|
tabsSchema
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-HQDYH45I.js";
|
|
16
16
|
import {
|
|
17
17
|
toggleableSchema
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-XYZ7FOXJ.js";
|
|
19
19
|
import {
|
|
20
20
|
registerLoader,
|
|
21
21
|
registerSchema
|
|
22
22
|
} from "./chunk-3DVDS7CT.js";
|
|
23
23
|
import {
|
|
24
24
|
autoDismissSchema
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-66U2RSYJ.js";
|
|
26
26
|
import {
|
|
27
27
|
clickOutsideSchema
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-SLOXO6IY.js";
|
|
29
29
|
import {
|
|
30
30
|
clipboardSchema
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-WOTZO7K4.js";
|
|
32
32
|
import {
|
|
33
33
|
draggableSchema
|
|
34
34
|
} from "./chunk-G6WR2AYR.js";
|
|
35
35
|
import {
|
|
36
36
|
focusTrapSchema
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-OJ3YWO3W.js";
|
|
38
38
|
|
|
39
39
|
// src/loaders.ts
|
|
40
40
|
registerSchema(draggableSchema);
|
|
@@ -59,4 +59,4 @@ registerLoader("ClickOutside", () => import("./behaviors/clickoutside.js"));
|
|
|
59
59
|
registerLoader("FocusTrap", () => import("./behaviors/focustrap.js"));
|
|
60
60
|
registerLoader("ScrollReveal", () => import("./behaviors/scrollreveal.js"));
|
|
61
61
|
registerLoader("Tabs", () => import("./behaviors/tabs.js"));
|
|
62
|
-
//# sourceMappingURL=chunk-
|
|
62
|
+
//# sourceMappingURL=chunk-MVNHMYIK.js.map
|
|
@@ -33,30 +33,36 @@ var sortableSchema = {
|
|
|
33
33
|
source: `
|
|
34
34
|
behavior Sortable(handle, dragClass)
|
|
35
35
|
init
|
|
36
|
-
if
|
|
36
|
+
if dragClass is undefined
|
|
37
|
+
set dragClass to "sorting"
|
|
38
|
+
end
|
|
37
39
|
end
|
|
38
|
-
on pointerdown(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if
|
|
40
|
+
on pointerdown(clientY) from me
|
|
41
|
+
js(me, handle, event)
|
|
42
|
+
var target = event.target;
|
|
43
|
+
var item = target.closest("li");
|
|
44
|
+
if (!item || !me.contains(item)) return false;
|
|
45
|
+
if (handle && !target.closest(handle)) return false;
|
|
46
|
+
event.preventDefault();
|
|
47
|
+
event.stopPropagation();
|
|
48
|
+
return true;
|
|
49
|
+
end
|
|
50
|
+
if it is false
|
|
51
|
+
exit
|
|
44
52
|
end
|
|
45
|
-
|
|
46
|
-
add dragClass to item
|
|
53
|
+
add .{dragClass} to me
|
|
47
54
|
trigger sortable:start on me
|
|
48
55
|
repeat until event pointerup from document
|
|
49
56
|
wait for pointermove(clientY) from document
|
|
50
57
|
trigger sortable:move on me
|
|
51
58
|
end
|
|
52
|
-
remove dragClass from
|
|
59
|
+
remove .{dragClass} from me
|
|
53
60
|
trigger sortable:end on me
|
|
54
61
|
end
|
|
55
|
-
end
|
|
56
|
-
`.trim()
|
|
62
|
+
end`.trim()
|
|
57
63
|
};
|
|
58
64
|
|
|
59
65
|
export {
|
|
60
66
|
sortableSchema
|
|
61
67
|
};
|
|
62
|
-
//# sourceMappingURL=chunk-
|
|
68
|
+
//# sourceMappingURL=chunk-NC6I6T7T.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas/sortable.schema.ts"],"sourcesContent":["import type { BehaviorSchema } from './types';\n\n/**\n * Sortable Behavior Schema\n *\n * Drag-and-drop reordering of list items.\n * Apply to a container element; children become sortable.\n *\n * Note: This behavior fires lifecycle events but does NOT automatically\n * reorder DOM elements. Users must handle actual reordering in their\n * `sortable:move` event handlers.\n */\nexport const sortableSchema: BehaviorSchema = {\n name: 'Sortable',\n category: 'ui',\n tier: 'common',\n version: '1.0.0',\n description: 'Makes child elements reorderable via drag-and-drop',\n parameters: [\n {\n name: 'handle',\n type: 'selector',\n optional: true,\n default: 'none',\n description: 'CSS selector for drag handles within items',\n },\n {\n name: 'dragClass',\n type: 'string',\n optional: true,\n default: 'sorting',\n description: 'CSS class added to item during drag',\n },\n ],\n events: [\n { name: 'sortable:start', description: 'Fired when drag begins' },\n {\n name: 'sortable:move',\n description: 'Fired during drag — handle this event to reorder DOM elements',\n },\n { name: 'sortable:end', description: 'Fired when drag completes' },\n ],\n requirements: ['Users must handle DOM reordering in sortable:move event handlers'],\n source: `\nbehavior Sortable(handle, dragClass)\n init\n if
|
|
1
|
+
{"version":3,"sources":["../src/schemas/sortable.schema.ts"],"sourcesContent":["import type { BehaviorSchema } from './types';\n\n/**\n * Sortable Behavior Schema\n *\n * Drag-and-drop reordering of list items.\n * Apply to a container element; children become sortable.\n *\n * Note: This behavior fires lifecycle events but does NOT automatically\n * reorder DOM elements. Users must handle actual reordering in their\n * `sortable:move` event handlers.\n */\nexport const sortableSchema: BehaviorSchema = {\n name: 'Sortable',\n category: 'ui',\n tier: 'common',\n version: '1.0.0',\n description: 'Makes child elements reorderable via drag-and-drop',\n parameters: [\n {\n name: 'handle',\n type: 'selector',\n optional: true,\n default: 'none',\n description: 'CSS selector for drag handles within items',\n },\n {\n name: 'dragClass',\n type: 'string',\n optional: true,\n default: 'sorting',\n description: 'CSS class added to item during drag',\n },\n ],\n events: [\n { name: 'sortable:start', description: 'Fired when drag begins' },\n {\n name: 'sortable:move',\n description: 'Fired during drag — handle this event to reorder DOM elements',\n },\n { name: 'sortable:end', description: 'Fired when drag completes' },\n ],\n requirements: ['Users must handle DOM reordering in sortable:move event handlers'],\n source: `\nbehavior Sortable(handle, dragClass)\n init\n if dragClass is undefined\n set dragClass to \"sorting\"\n end\n end\n on pointerdown(clientY) from me\n js(me, handle, event)\n var target = event.target;\n var item = target.closest(\"li\");\n if (!item || !me.contains(item)) return false;\n if (handle && !target.closest(handle)) return false;\n event.preventDefault();\n event.stopPropagation();\n return true;\n end\n if it is false\n exit\n end\n add .{dragClass} to me\n trigger sortable:start on me\n repeat until event pointerup from document\n wait for pointermove(clientY) from document\n trigger sortable:move on me\n end\n remove .{dragClass} from me\n trigger sortable:end on me\n end\nend`.trim(),\n};\n"],"mappings":";AAYO,IAAM,iBAAiC;AAAA,EAC5C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,MAAM,kBAAkB,aAAa,yBAAyB;AAAA,IAChE;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,EAAE,MAAM,gBAAgB,aAAa,4BAA4B;AAAA,EACnE;AAAA,EACA,cAAc,CAAC,kEAAkE;AAAA,EACjF,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KA6BL,KAAK;AACV;","names":[]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// src/schemas/focustrap.schema.ts
|
|
2
|
+
var focusTrapSchema = {
|
|
3
|
+
name: "FocusTrap",
|
|
4
|
+
category: "ui",
|
|
5
|
+
tier: "core",
|
|
6
|
+
version: "1.0.0",
|
|
7
|
+
description: "Confines Tab navigation inside an element with ARIA support",
|
|
8
|
+
parameters: [
|
|
9
|
+
{
|
|
10
|
+
name: "active",
|
|
11
|
+
type: "boolean",
|
|
12
|
+
optional: true,
|
|
13
|
+
default: true,
|
|
14
|
+
description: "Whether the trap is active on install"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: "initialFocus",
|
|
18
|
+
type: "selector",
|
|
19
|
+
optional: true,
|
|
20
|
+
description: "Element to focus when the trap activates"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: "returnFocus",
|
|
24
|
+
type: "boolean",
|
|
25
|
+
optional: true,
|
|
26
|
+
default: true,
|
|
27
|
+
description: "Restore focus to the previously focused element on deactivation"
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
events: [
|
|
31
|
+
{ name: "focustrap:activated", description: "Fired when the trap is activated" },
|
|
32
|
+
{ name: "focustrap:deactivated", description: "Fired when the trap is deactivated" }
|
|
33
|
+
],
|
|
34
|
+
requirements: [
|
|
35
|
+
'Sets aria-modal="true" on the element when active',
|
|
36
|
+
"Listens for focustrap:activate and focustrap:deactivate custom events for programmatic control"
|
|
37
|
+
],
|
|
38
|
+
source: `
|
|
39
|
+
behavior FocusTrap(active, initialFocus, returnFocus)
|
|
40
|
+
init
|
|
41
|
+
if active is undefined
|
|
42
|
+
set active to true
|
|
43
|
+
end
|
|
44
|
+
if returnFocus is undefined
|
|
45
|
+
set returnFocus to true
|
|
46
|
+
end
|
|
47
|
+
js(me, active, initialFocus, returnFocus)
|
|
48
|
+
var FOCUSABLE = 'a[href],button:not(:disabled),input:not(:disabled),select:not(:disabled),textarea:not(:disabled),[tabindex]:not([tabindex="-1"])';
|
|
49
|
+
var isActive = false;
|
|
50
|
+
var previouslyFocused = null;
|
|
51
|
+
function getFocusable() { return Array.from(me.querySelectorAll(FOCUSABLE)); }
|
|
52
|
+
function activate() {
|
|
53
|
+
if (isActive) return;
|
|
54
|
+
isActive = true;
|
|
55
|
+
previouslyFocused = document.activeElement;
|
|
56
|
+
me.setAttribute('aria-modal', 'true');
|
|
57
|
+
var initEl = initialFocus ? (typeof initialFocus === 'string' ? me.querySelector(initialFocus) : initialFocus) : null;
|
|
58
|
+
if (initEl) { initEl.focus(); } else { var f = getFocusable(); if (f.length) f[0].focus(); }
|
|
59
|
+
me.dispatchEvent(new CustomEvent('focustrap:activated', { bubbles: true }));
|
|
60
|
+
}
|
|
61
|
+
function deactivate() {
|
|
62
|
+
if (!isActive) return;
|
|
63
|
+
isActive = false;
|
|
64
|
+
me.removeAttribute('aria-modal');
|
|
65
|
+
if (returnFocus && previouslyFocused instanceof HTMLElement) previouslyFocused.focus();
|
|
66
|
+
previouslyFocused = null;
|
|
67
|
+
me.dispatchEvent(new CustomEvent('focustrap:deactivated', { bubbles: true }));
|
|
68
|
+
}
|
|
69
|
+
me.addEventListener('keydown', function(e) {
|
|
70
|
+
if (!isActive || e.key !== 'Tab') return;
|
|
71
|
+
var focusable = getFocusable();
|
|
72
|
+
if (focusable.length === 0) { e.preventDefault(); return; }
|
|
73
|
+
e.preventDefault();
|
|
74
|
+
var idx = focusable.indexOf(document.activeElement);
|
|
75
|
+
if (e.shiftKey) {
|
|
76
|
+
focusable[idx <= 0 ? focusable.length - 1 : idx - 1].focus();
|
|
77
|
+
} else {
|
|
78
|
+
focusable[idx >= focusable.length - 1 ? 0 : idx + 1].focus();
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
me.addEventListener('focustrap:activate', function() { activate(); });
|
|
82
|
+
me.addEventListener('focustrap:deactivate', function() { deactivate(); });
|
|
83
|
+
if (active) activate();
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end`.trim()
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export {
|
|
90
|
+
focusTrapSchema
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=chunk-OJ3YWO3W.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemas/focustrap.schema.ts"],"sourcesContent":["import type { BehaviorSchema } from './types';\n\n/**\n * FocusTrap Behavior Schema\n *\n * Confines Tab navigation inside an element and restores focus on release.\n * Manages aria-modal for accessibility compliance.\n */\nexport const focusTrapSchema: BehaviorSchema = {\n name: 'FocusTrap',\n category: 'ui',\n tier: 'core',\n version: '1.0.0',\n description: 'Confines Tab navigation inside an element with ARIA support',\n parameters: [\n {\n name: 'active',\n type: 'boolean',\n optional: true,\n default: true,\n description: 'Whether the trap is active on install',\n },\n {\n name: 'initialFocus',\n type: 'selector',\n optional: true,\n description: 'Element to focus when the trap activates',\n },\n {\n name: 'returnFocus',\n type: 'boolean',\n optional: true,\n default: true,\n description: 'Restore focus to the previously focused element on deactivation',\n },\n ],\n events: [\n { name: 'focustrap:activated', description: 'Fired when the trap is activated' },\n { name: 'focustrap:deactivated', description: 'Fired when the trap is deactivated' },\n ],\n requirements: [\n 'Sets aria-modal=\"true\" on the element when active',\n 'Listens for focustrap:activate and focustrap:deactivate custom events for programmatic control',\n ],\n source: `\nbehavior FocusTrap(active, initialFocus, returnFocus)\n init\n if active is undefined\n set active to true\n end\n if returnFocus is undefined\n set returnFocus to true\n end\n js(me, active, initialFocus, returnFocus)\n var FOCUSABLE = 'a[href],button:not(:disabled),input:not(:disabled),select:not(:disabled),textarea:not(:disabled),[tabindex]:not([tabindex=\"-1\"])';\n var isActive = false;\n var previouslyFocused = null;\n function getFocusable() { return Array.from(me.querySelectorAll(FOCUSABLE)); }\n function activate() {\n if (isActive) return;\n isActive = true;\n previouslyFocused = document.activeElement;\n me.setAttribute('aria-modal', 'true');\n var initEl = initialFocus ? (typeof initialFocus === 'string' ? me.querySelector(initialFocus) : initialFocus) : null;\n if (initEl) { initEl.focus(); } else { var f = getFocusable(); if (f.length) f[0].focus(); }\n me.dispatchEvent(new CustomEvent('focustrap:activated', { bubbles: true }));\n }\n function deactivate() {\n if (!isActive) return;\n isActive = false;\n me.removeAttribute('aria-modal');\n if (returnFocus && previouslyFocused instanceof HTMLElement) previouslyFocused.focus();\n previouslyFocused = null;\n me.dispatchEvent(new CustomEvent('focustrap:deactivated', { bubbles: true }));\n }\n me.addEventListener('keydown', function(e) {\n if (!isActive || e.key !== 'Tab') return;\n var focusable = getFocusable();\n if (focusable.length === 0) { e.preventDefault(); return; }\n e.preventDefault();\n var idx = focusable.indexOf(document.activeElement);\n if (e.shiftKey) {\n focusable[idx <= 0 ? focusable.length - 1 : idx - 1].focus();\n } else {\n focusable[idx >= focusable.length - 1 ? 0 : idx + 1].focus();\n }\n });\n me.addEventListener('focustrap:activate', function() { activate(); });\n me.addEventListener('focustrap:deactivate', function() { deactivate(); });\n if (active) activate();\n end\n end\nend`.trim(),\n};\n"],"mappings":";AAQO,IAAM,kBAAkC;AAAA,EAC7C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,MAAM,uBAAuB,aAAa,mCAAmC;AAAA,IAC/E,EAAE,MAAM,yBAAyB,aAAa,qCAAqC;AAAA,EACrF;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAgDL,KAAK;AACV;","names":[]}
|
|
@@ -15,23 +15,42 @@ var clickOutsideSchema = {
|
|
|
15
15
|
}
|
|
16
16
|
],
|
|
17
17
|
events: [
|
|
18
|
-
{ name: "clickoutside", description: "Fired when a pointer press occurs outside the element" }
|
|
18
|
+
{ name: "clickoutside", description: "Fired when a pointer press occurs outside the element" },
|
|
19
|
+
{
|
|
20
|
+
name: "clickoutside:activate",
|
|
21
|
+
description: "Listen for this event to programmatically activate detection"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: "clickoutside:deactivate",
|
|
25
|
+
description: "Listen for this event to programmatically deactivate detection"
|
|
26
|
+
}
|
|
19
27
|
],
|
|
20
28
|
requirements: ["Uses pointerdown instead of click to avoid timing issues with removed elements"],
|
|
21
29
|
source: `
|
|
22
30
|
behavior ClickOutside(active)
|
|
23
31
|
init
|
|
24
|
-
if active is undefined
|
|
32
|
+
if active is undefined
|
|
33
|
+
set active to true
|
|
34
|
+
end
|
|
25
35
|
end
|
|
26
36
|
on pointerdown from document
|
|
27
|
-
|
|
28
|
-
|
|
37
|
+
js(me, active)
|
|
38
|
+
if (!me.isConnected) return;
|
|
39
|
+
if (active && !me.contains(event.target)) {
|
|
40
|
+
me.dispatchEvent(new CustomEvent('clickoutside', { bubbles: true }));
|
|
41
|
+
}
|
|
29
42
|
end
|
|
30
43
|
end
|
|
44
|
+
on clickoutside:activate
|
|
45
|
+
set active to true
|
|
46
|
+
end
|
|
47
|
+
on clickoutside:deactivate
|
|
48
|
+
set active to false
|
|
49
|
+
end
|
|
31
50
|
end`.trim()
|
|
32
51
|
};
|
|
33
52
|
|
|
34
53
|
export {
|
|
35
54
|
clickOutsideSchema
|
|
36
55
|
};
|
|
37
|
-
//# sourceMappingURL=chunk-
|
|
56
|
+
//# sourceMappingURL=chunk-SLOXO6IY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemas/clickoutside.schema.ts"],"sourcesContent":["import type { BehaviorSchema } from './types';\n\n/**\n * ClickOutside Behavior Schema\n *\n * Fires an event when the user clicks outside the element.\n * Uses pointerdown instead of click to avoid timing issues.\n */\nexport const clickOutsideSchema: BehaviorSchema = {\n name: 'ClickOutside',\n category: 'ui',\n tier: 'core',\n version: '1.0.0',\n description: 'Fires an event when the user clicks outside the element',\n parameters: [\n {\n name: 'active',\n type: 'boolean',\n optional: true,\n default: true,\n description: 'Whether the listener is active (can be toggled programmatically)',\n },\n ],\n events: [\n { name: 'clickoutside', description: 'Fired when a pointer press occurs outside the element' },\n {\n name: 'clickoutside:activate',\n description: 'Listen for this event to programmatically activate detection',\n },\n {\n name: 'clickoutside:deactivate',\n description: 'Listen for this event to programmatically deactivate detection',\n },\n ],\n requirements: ['Uses pointerdown instead of click to avoid timing issues with removed elements'],\n source: `\nbehavior ClickOutside(active)\n init\n if active is undefined\n set active to true\n end\n end\n on pointerdown from document\n js(me, active)\n if (!me.isConnected) return;\n if (active && !me.contains(event.target)) {\n me.dispatchEvent(new CustomEvent('clickoutside', { bubbles: true }));\n }\n end\n end\n on clickoutside:activate\n set active to true\n end\n on clickoutside:deactivate\n set active to false\n end\nend`.trim(),\n};\n"],"mappings":";AAQO,IAAM,qBAAqC;AAAA,EAChD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,MAAM,gBAAgB,aAAa,wDAAwD;AAAA,IAC7F;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,cAAc,CAAC,gFAAgF;AAAA,EAC/F,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAqBL,KAAK;AACV;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
sortableSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-NC6I6T7T.js";
|
|
4
4
|
import {
|
|
5
5
|
resolveRuntime
|
|
6
6
|
} from "./chunk-6TJXDCAQ.js";
|
|
@@ -72,4 +72,4 @@ export {
|
|
|
72
72
|
registerSortable,
|
|
73
73
|
sortable_default
|
|
74
74
|
};
|
|
75
|
-
//# sourceMappingURL=chunk-
|
|
75
|
+
//# sourceMappingURL=chunk-TLLGH5KX.js.map
|
|
@@ -50,11 +50,21 @@ var resizableSchema = {
|
|
|
50
50
|
source: `
|
|
51
51
|
behavior Resizable(handle, minWidth, minHeight, maxWidth, maxHeight)
|
|
52
52
|
init
|
|
53
|
-
if
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if
|
|
57
|
-
|
|
53
|
+
if handle is undefined
|
|
54
|
+
set handle to me
|
|
55
|
+
end
|
|
56
|
+
if minWidth is undefined
|
|
57
|
+
set minWidth to 50
|
|
58
|
+
end
|
|
59
|
+
if minHeight is undefined
|
|
60
|
+
set minHeight to 50
|
|
61
|
+
end
|
|
62
|
+
if maxWidth is undefined
|
|
63
|
+
set maxWidth to 9999
|
|
64
|
+
end
|
|
65
|
+
if maxHeight is undefined
|
|
66
|
+
set maxHeight to 9999
|
|
67
|
+
end
|
|
58
68
|
end
|
|
59
69
|
on pointerdown(clientX, clientY) from handle
|
|
60
70
|
halt the event
|
|
@@ -66,15 +76,13 @@ behavior Resizable(handle, minWidth, minHeight, maxWidth, maxHeight)
|
|
|
66
76
|
set startX to clientX
|
|
67
77
|
set startY to clientY
|
|
68
78
|
repeat until event pointerup from document
|
|
69
|
-
wait for pointermove(clientX, clientY) or
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if newHeight > maxHeight set newHeight to maxHeight
|
|
77
|
-
add { width: \${newWidth}px; height: \${newHeight}px; }
|
|
79
|
+
wait for pointermove(clientX, clientY) or pointerup from document
|
|
80
|
+
js(startWidth, startHeight, clientX, clientY, startX, startY, minWidth, maxWidth, minHeight, maxHeight, me)
|
|
81
|
+
var nw = Math.max(minWidth, Math.min(maxWidth, startWidth + (clientX - startX)));
|
|
82
|
+
var nh = Math.max(minHeight, Math.min(maxHeight, startHeight + (clientY - startY)));
|
|
83
|
+
me.style.width = nw + 'px';
|
|
84
|
+
me.style.height = nh + 'px';
|
|
85
|
+
end
|
|
78
86
|
trigger resizable:resize
|
|
79
87
|
end
|
|
80
88
|
trigger resizable:end
|
|
@@ -86,4 +94,4 @@ end
|
|
|
86
94
|
export {
|
|
87
95
|
resizableSchema
|
|
88
96
|
};
|
|
89
|
-
//# sourceMappingURL=chunk-
|
|
97
|
+
//# sourceMappingURL=chunk-U5GNXZUF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas/resizable.schema.ts"],"sourcesContent":["import type { BehaviorSchema } from './types';\n\n/**\n * Resizable Behavior Schema\n *\n * Makes elements resizable by dragging edges or corners.\n * Supports minimum/maximum dimensions and resize handles.\n */\nexport const resizableSchema: BehaviorSchema = {\n name: 'Resizable',\n category: 'ui',\n tier: 'optional',\n version: '1.0.0',\n description: 'Makes elements resizable by dragging',\n parameters: [\n {\n name: 'handle',\n type: 'selector',\n optional: true,\n default: 'me',\n description: 'CSS selector for the resize handle (defaults to the element itself)',\n },\n {\n name: 'minWidth',\n type: 'number',\n optional: true,\n default: 50,\n description: 'Minimum width in pixels',\n },\n {\n name: 'minHeight',\n type: 'number',\n optional: true,\n default: 50,\n description: 'Minimum height in pixels',\n },\n {\n name: 'maxWidth',\n type: 'number',\n optional: true,\n default: 9999,\n description: 'Maximum width in pixels',\n },\n {\n name: 'maxHeight',\n type: 'number',\n optional: true,\n default: 9999,\n description: 'Maximum height in pixels',\n },\n ],\n events: [\n { name: 'resizable:start', description: 'Fired when resize begins' },\n { name: 'resizable:resize', description: 'Fired during resize' },\n { name: 'resizable:end', description: 'Fired when resize completes' },\n ],\n source: `\nbehavior Resizable(handle, minWidth, minHeight, maxWidth, maxHeight)\n init\n if
|
|
1
|
+
{"version":3,"sources":["../src/schemas/resizable.schema.ts"],"sourcesContent":["import type { BehaviorSchema } from './types';\n\n/**\n * Resizable Behavior Schema\n *\n * Makes elements resizable by dragging edges or corners.\n * Supports minimum/maximum dimensions and resize handles.\n */\nexport const resizableSchema: BehaviorSchema = {\n name: 'Resizable',\n category: 'ui',\n tier: 'optional',\n version: '1.0.0',\n description: 'Makes elements resizable by dragging',\n parameters: [\n {\n name: 'handle',\n type: 'selector',\n optional: true,\n default: 'me',\n description: 'CSS selector for the resize handle (defaults to the element itself)',\n },\n {\n name: 'minWidth',\n type: 'number',\n optional: true,\n default: 50,\n description: 'Minimum width in pixels',\n },\n {\n name: 'minHeight',\n type: 'number',\n optional: true,\n default: 50,\n description: 'Minimum height in pixels',\n },\n {\n name: 'maxWidth',\n type: 'number',\n optional: true,\n default: 9999,\n description: 'Maximum width in pixels',\n },\n {\n name: 'maxHeight',\n type: 'number',\n optional: true,\n default: 9999,\n description: 'Maximum height in pixels',\n },\n ],\n events: [\n { name: 'resizable:start', description: 'Fired when resize begins' },\n { name: 'resizable:resize', description: 'Fired during resize' },\n { name: 'resizable:end', description: 'Fired when resize completes' },\n ],\n source: `\nbehavior Resizable(handle, minWidth, minHeight, maxWidth, maxHeight)\n init\n if handle is undefined\n set handle to me\n end\n if minWidth is undefined\n set minWidth to 50\n end\n if minHeight is undefined\n set minHeight to 50\n end\n if maxWidth is undefined\n set maxWidth to 9999\n end\n if maxHeight is undefined\n set maxHeight to 9999\n end\n end\n on pointerdown(clientX, clientY) from handle\n halt the event\n trigger resizable:start\n measure width\n set startWidth to it\n measure height\n set startHeight to it\n set startX to clientX\n set startY to clientY\n repeat until event pointerup from document\n wait for pointermove(clientX, clientY) or pointerup from document\n js(startWidth, startHeight, clientX, clientY, startX, startY, minWidth, maxWidth, minHeight, maxHeight, me)\n var nw = Math.max(minWidth, Math.min(maxWidth, startWidth + (clientX - startX)));\n var nh = Math.max(minHeight, Math.min(maxHeight, startHeight + (clientY - startY)));\n me.style.width = nw + 'px';\n me.style.height = nh + 'px';\n end\n trigger resizable:resize\n end\n trigger resizable:end\n end\nend\n`.trim(),\n};\n"],"mappings":";AAQO,IAAM,kBAAkC;AAAA,EAC7C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,MAAM,mBAAmB,aAAa,2BAA2B;AAAA,IACnE,EAAE,MAAM,oBAAoB,aAAa,sBAAsB;AAAA,IAC/D,EAAE,MAAM,iBAAiB,aAAa,8BAA8B;AAAA,EACtE;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyCR,KAAK;AACP;","names":[]}
|
|
@@ -26,13 +26,6 @@ var scrollRevealSchema = {
|
|
|
26
26
|
optional: true,
|
|
27
27
|
default: true,
|
|
28
28
|
description: "If true, disconnect observer after first intersection"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
name: "rootMargin",
|
|
32
|
-
type: "string",
|
|
33
|
-
optional: true,
|
|
34
|
-
default: "0px",
|
|
35
|
-
description: "CSS margin around the viewport for triggering earlier or later"
|
|
36
29
|
}
|
|
37
30
|
],
|
|
38
31
|
events: [
|
|
@@ -41,18 +34,37 @@ var scrollRevealSchema = {
|
|
|
41
34
|
],
|
|
42
35
|
requirements: ["Uses IntersectionObserver API (supported in all modern browsers)"],
|
|
43
36
|
source: `
|
|
44
|
-
behavior ScrollReveal(cls, threshold, once
|
|
37
|
+
behavior ScrollReveal(cls, threshold, once)
|
|
45
38
|
init
|
|
46
|
-
if cls is undefined
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if
|
|
39
|
+
if cls is undefined
|
|
40
|
+
set cls to "revealed"
|
|
41
|
+
end
|
|
42
|
+
if threshold is undefined
|
|
43
|
+
set threshold to 0.1
|
|
44
|
+
end
|
|
45
|
+
if once is undefined
|
|
46
|
+
set once to true
|
|
47
|
+
end
|
|
48
|
+
js(me, cls, threshold, once)
|
|
49
|
+
var obs = new IntersectionObserver(function(entries) {
|
|
50
|
+
for (var i = 0; i < entries.length; i++) {
|
|
51
|
+
if (entries[i].isIntersecting) {
|
|
52
|
+
me.classList.add(cls);
|
|
53
|
+
me.dispatchEvent(new CustomEvent('scrollreveal:enter', { bubbles: true }));
|
|
54
|
+
if (once) obs.disconnect();
|
|
55
|
+
} else if (!once) {
|
|
56
|
+
me.classList.remove(cls);
|
|
57
|
+
me.dispatchEvent(new CustomEvent('scrollreveal:exit', { bubbles: true }));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}, { threshold: threshold });
|
|
61
|
+
obs.observe(me);
|
|
62
|
+
end
|
|
50
63
|
end
|
|
51
|
-
-- Imperative installer handles IntersectionObserver setup
|
|
52
64
|
end`.trim()
|
|
53
65
|
};
|
|
54
66
|
|
|
55
67
|
export {
|
|
56
68
|
scrollRevealSchema
|
|
57
69
|
};
|
|
58
|
-
//# sourceMappingURL=chunk-
|
|
70
|
+
//# sourceMappingURL=chunk-URZGNPTQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemas/scrollreveal.schema.ts"],"sourcesContent":["import type { BehaviorSchema } from './types';\n\n/**\n * ScrollReveal Behavior Schema\n *\n * Adds a class or fires events when the element enters or exits the viewport.\n * Uses the IntersectionObserver web standard API.\n */\nexport const scrollRevealSchema: BehaviorSchema = {\n name: 'ScrollReveal',\n category: 'layout',\n tier: 'common',\n version: '1.0.0',\n description: 'Adds a class when the element enters the viewport via IntersectionObserver',\n parameters: [\n {\n name: 'cls',\n type: 'string',\n optional: true,\n default: 'revealed',\n description: 'CSS class added when element enters viewport',\n },\n {\n name: 'threshold',\n type: 'number',\n optional: true,\n default: 0.1,\n description: 'Intersection ratio threshold (0-1) for triggering',\n },\n {\n name: 'once',\n type: 'boolean',\n optional: true,\n default: true,\n description: 'If true, disconnect observer after first intersection',\n },\n ],\n events: [\n { name: 'scrollreveal:enter', description: 'Fired when the element enters the viewport' },\n { name: 'scrollreveal:exit', description: 'Fired when the element exits the viewport' },\n ],\n requirements: ['Uses IntersectionObserver API (supported in all modern browsers)'],\n source: `\nbehavior ScrollReveal(cls, threshold, once)\n init\n if cls is undefined\n set cls to \"revealed\"\n end\n if threshold is undefined\n set threshold to 0.1\n end\n if once is undefined\n set once to true\n end\n js(me, cls, threshold, once)\n var obs = new IntersectionObserver(function(entries) {\n for (var i = 0; i < entries.length; i++) {\n if (entries[i].isIntersecting) {\n me.classList.add(cls);\n me.dispatchEvent(new CustomEvent('scrollreveal:enter', { bubbles: true }));\n if (once) obs.disconnect();\n } else if (!once) {\n me.classList.remove(cls);\n me.dispatchEvent(new CustomEvent('scrollreveal:exit', { bubbles: true }));\n }\n }\n }, { threshold: threshold });\n obs.observe(me);\n end\n end\nend`.trim(),\n};\n"],"mappings":";AAQO,IAAM,qBAAqC;AAAA,EAChD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,MAAM,sBAAsB,aAAa,6CAA6C;AAAA,IACxF,EAAE,MAAM,qBAAqB,aAAa,4CAA4C;AAAA,EACxF;AAAA,EACA,cAAc,CAAC,kEAAkE;AAAA,EACjF,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KA4BL,KAAK;AACV;","names":[]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// src/schemas/clipboard.schema.ts
|
|
2
|
+
var clipboardSchema = {
|
|
3
|
+
name: "Clipboard",
|
|
4
|
+
category: "ui",
|
|
5
|
+
tier: "core",
|
|
6
|
+
version: "1.0.0",
|
|
7
|
+
description: "Copies text to clipboard on click with visual feedback",
|
|
8
|
+
parameters: [
|
|
9
|
+
{
|
|
10
|
+
name: "text",
|
|
11
|
+
type: "string",
|
|
12
|
+
optional: true,
|
|
13
|
+
description: "Literal text to copy (takes priority over source)"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: "source",
|
|
17
|
+
type: "selector",
|
|
18
|
+
optional: true,
|
|
19
|
+
default: "me",
|
|
20
|
+
description: "Element whose textContent or value is copied"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: "feedback",
|
|
24
|
+
type: "selector",
|
|
25
|
+
optional: true,
|
|
26
|
+
description: "Element to show .copied feedback on (defaults to the installed element)"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: "feedbackDuration",
|
|
30
|
+
type: "number",
|
|
31
|
+
optional: true,
|
|
32
|
+
default: 2e3,
|
|
33
|
+
description: "Duration in ms to show .copied class feedback"
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
events: [
|
|
37
|
+
{ name: "clipboard:copied", description: "Fired after text is copied successfully" },
|
|
38
|
+
{ name: "clipboard:error", description: "Fired when clipboard write fails" }
|
|
39
|
+
],
|
|
40
|
+
requirements: [
|
|
41
|
+
"navigator.clipboard.writeText() requires HTTPS or localhost",
|
|
42
|
+
'Falls back to document.execCommand("copy") for older browsers'
|
|
43
|
+
],
|
|
44
|
+
source: `
|
|
45
|
+
behavior Clipboard(text, source, feedback, feedbackDuration)
|
|
46
|
+
init
|
|
47
|
+
if feedbackDuration is undefined
|
|
48
|
+
set feedbackDuration to 2000
|
|
49
|
+
end
|
|
50
|
+
if source is undefined
|
|
51
|
+
set source to me
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
on click
|
|
55
|
+
if text is not undefined
|
|
56
|
+
set copyText to text
|
|
57
|
+
else
|
|
58
|
+
set copyText to source's textContent
|
|
59
|
+
end
|
|
60
|
+
js(me, copyText, feedback, feedbackDuration)
|
|
61
|
+
async function copyToClipboard(t) {
|
|
62
|
+
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
63
|
+
await navigator.clipboard.writeText(t);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
var ta = document.createElement('textarea');
|
|
67
|
+
ta.value = t;
|
|
68
|
+
ta.style.position = 'fixed';
|
|
69
|
+
ta.style.opacity = '0';
|
|
70
|
+
document.body.appendChild(ta);
|
|
71
|
+
ta.select();
|
|
72
|
+
try { document.execCommand('copy'); } finally { document.body.removeChild(ta); }
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
await copyToClipboard(copyText);
|
|
76
|
+
var feedbackEl = feedback ? (typeof feedback === 'string' ? document.querySelector(feedback) : feedback) : me;
|
|
77
|
+
if (!feedbackEl) feedbackEl = me;
|
|
78
|
+
feedbackEl.classList.add('copied');
|
|
79
|
+
me.dispatchEvent(new CustomEvent('clipboard:copied', { bubbles: true, detail: { text: copyText } }));
|
|
80
|
+
setTimeout(function() { feedbackEl.classList.remove('copied'); }, feedbackDuration);
|
|
81
|
+
} catch(err) {
|
|
82
|
+
me.dispatchEvent(new CustomEvent('clipboard:error', { bubbles: true, detail: { error: err } }));
|
|
83
|
+
}
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end`.trim()
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export {
|
|
90
|
+
clipboardSchema
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=chunk-WOTZO7K4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemas/clipboard.schema.ts"],"sourcesContent":["import type { BehaviorSchema } from './types';\n\n/**\n * Clipboard Behavior Schema\n *\n * Copies text to clipboard on click with visual feedback.\n * Uses the Clipboard API with execCommand fallback.\n */\nexport const clipboardSchema: BehaviorSchema = {\n name: 'Clipboard',\n category: 'ui',\n tier: 'core',\n version: '1.0.0',\n description: 'Copies text to clipboard on click with visual feedback',\n parameters: [\n {\n name: 'text',\n type: 'string',\n optional: true,\n description: 'Literal text to copy (takes priority over source)',\n },\n {\n name: 'source',\n type: 'selector',\n optional: true,\n default: 'me',\n description: 'Element whose textContent or value is copied',\n },\n {\n name: 'feedback',\n type: 'selector',\n optional: true,\n description: 'Element to show .copied feedback on (defaults to the installed element)',\n },\n {\n name: 'feedbackDuration',\n type: 'number',\n optional: true,\n default: 2000,\n description: 'Duration in ms to show .copied class feedback',\n },\n ],\n events: [\n { name: 'clipboard:copied', description: 'Fired after text is copied successfully' },\n { name: 'clipboard:error', description: 'Fired when clipboard write fails' },\n ],\n requirements: [\n 'navigator.clipboard.writeText() requires HTTPS or localhost',\n 'Falls back to document.execCommand(\"copy\") for older browsers',\n ],\n source: `\nbehavior Clipboard(text, source, feedback, feedbackDuration)\n init\n if feedbackDuration is undefined\n set feedbackDuration to 2000\n end\n if source is undefined\n set source to me\n end\n end\n on click\n if text is not undefined\n set copyText to text\n else\n set copyText to source's textContent\n end\n js(me, copyText, feedback, feedbackDuration)\n async function copyToClipboard(t) {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n await navigator.clipboard.writeText(t);\n return;\n }\n var ta = document.createElement('textarea');\n ta.value = t;\n ta.style.position = 'fixed';\n ta.style.opacity = '0';\n document.body.appendChild(ta);\n ta.select();\n try { document.execCommand('copy'); } finally { document.body.removeChild(ta); }\n }\n try {\n await copyToClipboard(copyText);\n var feedbackEl = feedback ? (typeof feedback === 'string' ? document.querySelector(feedback) : feedback) : me;\n if (!feedbackEl) feedbackEl = me;\n feedbackEl.classList.add('copied');\n me.dispatchEvent(new CustomEvent('clipboard:copied', { bubbles: true, detail: { text: copyText } }));\n setTimeout(function() { feedbackEl.classList.remove('copied'); }, feedbackDuration);\n } catch(err) {\n me.dispatchEvent(new CustomEvent('clipboard:error', { bubbles: true, detail: { error: err } }));\n }\n end\n end\nend`.trim(),\n};\n"],"mappings":";AAQO,IAAM,kBAAkC;AAAA,EAC7C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,MAAM,oBAAoB,aAAa,0CAA0C;AAAA,IACnF,EAAE,MAAM,mBAAmB,aAAa,mCAAmC;AAAA,EAC7E;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KA0CL,KAAK;AACV;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
tabsSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-HQDYH45I.js";
|
|
4
4
|
import {
|
|
5
5
|
resolveRuntime
|
|
6
6
|
} from "./chunk-6TJXDCAQ.js";
|
|
@@ -152,4 +152,4 @@ export {
|
|
|
152
152
|
registerTabs,
|
|
153
153
|
tabs_default
|
|
154
154
|
};
|
|
155
|
-
//# sourceMappingURL=chunk-
|
|
155
|
+
//# sourceMappingURL=chunk-WPOQIMCC.js.map
|
|
@@ -37,12 +37,15 @@ behavior Toggleable(cls, target)
|
|
|
37
37
|
end
|
|
38
38
|
on click
|
|
39
39
|
toggle .{cls} on target
|
|
40
|
+
js(target, cls)
|
|
41
|
+
var eventName = target.classList.contains(cls) ? 'toggleable:on' : 'toggleable:off';
|
|
42
|
+
target.dispatchEvent(new CustomEvent(eventName, { bubbles: true }));
|
|
43
|
+
end
|
|
40
44
|
end
|
|
41
|
-
end
|
|
42
|
-
`.trim()
|
|
45
|
+
end`.trim()
|
|
43
46
|
};
|
|
44
47
|
|
|
45
48
|
export {
|
|
46
49
|
toggleableSchema
|
|
47
50
|
};
|
|
48
|
-
//# sourceMappingURL=chunk-
|
|
51
|
+
//# sourceMappingURL=chunk-XYZ7FOXJ.js.map
|