@hyperfixi/behaviors 3.3.0 → 4.0.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/CHANGELOG.md +162 -0
- package/README.md +29 -9
- package/dist/all.browser.global.js +45 -100
- package/dist/all.browser.global.js.map +1 -1
- package/dist/autodismiss.browser.global.js +5 -11
- package/dist/autodismiss.browser.global.js.map +1 -1
- package/dist/behaviors/autodismiss.cjs +19 -22
- package/dist/behaviors/autodismiss.cjs.map +1 -1
- package/dist/behaviors/autodismiss.d.cts +4 -4
- package/dist/behaviors/autodismiss.d.ts +4 -4
- package/dist/behaviors/autodismiss.js +3 -3
- package/dist/behaviors/clickoutside.cjs +19 -18
- package/dist/behaviors/clickoutside.cjs.map +1 -1
- package/dist/behaviors/clickoutside.d.cts +4 -4
- package/dist/behaviors/clickoutside.d.ts +4 -4
- package/dist/behaviors/clickoutside.js +3 -3
- package/dist/behaviors/clipboard.cjs +18 -19
- package/dist/behaviors/clipboard.cjs.map +1 -1
- package/dist/behaviors/clipboard.d.cts +4 -4
- package/dist/behaviors/clipboard.d.ts +4 -4
- package/dist/behaviors/clipboard.js +3 -3
- package/dist/behaviors/draggable.cjs +20 -25
- package/dist/behaviors/draggable.cjs.map +1 -1
- package/dist/behaviors/draggable.d.cts +4 -4
- package/dist/behaviors/draggable.d.ts +4 -4
- package/dist/behaviors/draggable.js +3 -3
- package/dist/behaviors/focustrap.cjs +18 -19
- package/dist/behaviors/focustrap.cjs.map +1 -1
- package/dist/behaviors/focustrap.d.cts +4 -4
- package/dist/behaviors/focustrap.d.ts +4 -4
- package/dist/behaviors/focustrap.js +3 -3
- package/dist/behaviors/removable.cjs +18 -21
- package/dist/behaviors/removable.cjs.map +1 -1
- package/dist/behaviors/removable.d.cts +4 -3
- package/dist/behaviors/removable.d.ts +4 -3
- package/dist/behaviors/removable.js +3 -3
- package/dist/behaviors/resizable.cjs +19 -19
- package/dist/behaviors/resizable.cjs.map +1 -1
- package/dist/behaviors/resizable.d.cts +4 -4
- package/dist/behaviors/resizable.d.ts +4 -4
- package/dist/behaviors/resizable.js +3 -3
- package/dist/behaviors/scrollreveal.cjs +19 -22
- package/dist/behaviors/scrollreveal.cjs.map +1 -1
- package/dist/behaviors/scrollreveal.d.cts +4 -4
- package/dist/behaviors/scrollreveal.d.ts +4 -4
- package/dist/behaviors/scrollreveal.js +3 -3
- package/dist/behaviors/sortable.cjs +19 -20
- package/dist/behaviors/sortable.cjs.map +1 -1
- package/dist/behaviors/sortable.d.cts +4 -4
- package/dist/behaviors/sortable.d.ts +4 -4
- package/dist/behaviors/sortable.js +3 -3
- package/dist/behaviors/tabs.cjs +20 -25
- package/dist/behaviors/tabs.cjs.map +1 -1
- package/dist/behaviors/tabs.d.cts +4 -4
- package/dist/behaviors/tabs.d.ts +4 -4
- package/dist/behaviors/tabs.js +3 -3
- package/dist/behaviors/toggleable.cjs +25 -26
- package/dist/behaviors/toggleable.cjs.map +1 -1
- package/dist/behaviors/toggleable.d.cts +4 -4
- package/dist/behaviors/toggleable.d.ts +4 -4
- package/dist/behaviors/toggleable.js +3 -3
- package/dist/chunk-2GIS4DCY.js +30 -0
- package/dist/chunk-2GIS4DCY.js.map +1 -0
- package/dist/chunk-3BCBZR6R.js +30 -0
- package/dist/chunk-3BCBZR6R.js.map +1 -0
- package/dist/chunk-4YUIDZAO.js +30 -0
- package/dist/chunk-4YUIDZAO.js.map +1 -0
- package/dist/{chunk-XYZ7FOXJ.js → chunk-AQCOK5J5.js} +10 -14
- package/dist/chunk-AQCOK5J5.js.map +1 -0
- package/dist/chunk-ATGHQQC7.js +30 -0
- package/dist/chunk-ATGHQQC7.js.map +1 -0
- package/dist/{chunk-HQDYH45I.js → chunk-CWLAXLWR.js} +5 -13
- package/dist/chunk-CWLAXLWR.js.map +1 -0
- package/dist/chunk-DMWN52SV.js +30 -0
- package/dist/chunk-DMWN52SV.js.map +1 -0
- package/dist/{chunk-PDMOOWFW.js → chunk-EIVPVTUI.js} +4 -8
- package/dist/{chunk-PDMOOWFW.js.map → chunk-EIVPVTUI.js.map} +1 -1
- package/dist/chunk-HHTEMPIT.js +30 -0
- package/dist/chunk-HHTEMPIT.js.map +1 -0
- package/dist/{chunk-26IX7QU7.js → chunk-HJESSMKB.js} +4 -6
- package/dist/{chunk-26IX7QU7.js.map → chunk-HJESSMKB.js.map} +1 -1
- package/dist/{chunk-5S7WN3ZQ.js → chunk-IFAH652L.js} +4 -7
- package/dist/chunk-IFAH652L.js.map +1 -0
- package/dist/chunk-IUGJG4RA.js +30 -0
- package/dist/chunk-IUGJG4RA.js.map +1 -0
- package/dist/{chunk-ZR66E3T6.js → chunk-JNLVXPHR.js} +13 -13
- package/dist/chunk-KEZEGPEX.js +30 -0
- package/dist/chunk-KEZEGPEX.js.map +1 -0
- package/dist/{chunk-66U2RSYJ.js → chunk-KP4GNXYS.js} +4 -10
- package/dist/chunk-KP4GNXYS.js.map +1 -0
- package/dist/chunk-KXQMCN4O.js +30 -0
- package/dist/chunk-KXQMCN4O.js.map +1 -0
- package/dist/{chunk-YXS27XM6.js → chunk-KYBOZ7C4.js} +3 -7
- package/dist/chunk-KYBOZ7C4.js.map +1 -0
- package/dist/chunk-LBWM6TTU.js +30 -0
- package/dist/chunk-LBWM6TTU.js.map +1 -0
- package/dist/{chunk-3DVDS7CT.js → chunk-LCDONZBX.js} +5 -5
- package/dist/chunk-LCDONZBX.js.map +1 -0
- package/dist/{chunk-OJ3YWO3W.js → chunk-NE76IBV2.js} +3 -7
- package/dist/chunk-NE76IBV2.js.map +1 -0
- package/dist/{chunk-HMU342XE.js → chunk-PVO6TZCZ.js} +3 -9
- package/dist/{chunk-HMU342XE.js.map → chunk-PVO6TZCZ.js.map} +1 -1
- package/dist/{chunk-URZGNPTQ.js → chunk-RILYRQ72.js} +4 -10
- package/dist/chunk-RILYRQ72.js.map +1 -0
- package/dist/{chunk-FBQ3X3UY.js → chunk-U4QMFVAM.js} +5 -13
- package/dist/chunk-U4QMFVAM.js.map +1 -0
- package/dist/chunk-VWDTOSE3.js +26 -0
- package/dist/chunk-VWDTOSE3.js.map +1 -0
- package/dist/chunk-YRQBU2OW.js +30 -0
- package/dist/chunk-YRQBU2OW.js.map +1 -0
- package/dist/clickoutside.browser.global.js +5 -7
- package/dist/clickoutside.browser.global.js.map +1 -1
- package/dist/clipboard.browser.global.js +4 -8
- package/dist/clipboard.browser.global.js.map +1 -1
- package/dist/core.browser.global.js +13 -25
- package/dist/core.browser.global.js.map +1 -1
- package/dist/draggable.browser.global.js +5 -13
- package/dist/draggable.browser.global.js.map +1 -1
- package/dist/focustrap.browser.global.js +4 -8
- package/dist/focustrap.browser.global.js.map +1 -1
- package/dist/index.cjs +96 -271
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -10
- package/dist/index.d.ts +10 -10
- package/dist/index.js +42 -55
- package/dist/index.js.map +1 -1
- package/dist/loaders.cjs +75 -237
- package/dist/loaders.cjs.map +1 -1
- package/dist/loaders.js +13 -13
- package/dist/registry.cjs +4 -4
- package/dist/registry.cjs.map +1 -1
- package/dist/registry.d.cts +5 -6
- package/dist/registry.d.ts +5 -6
- package/dist/registry.js +1 -1
- package/dist/removable.browser.global.js +3 -9
- package/dist/removable.browser.global.js.map +1 -1
- package/dist/resizable.browser.global.js +4 -7
- package/dist/resizable.browser.global.js.map +1 -1
- package/dist/resolver.browser.global.js +45 -100
- package/dist/resolver.browser.global.js.map +1 -1
- package/dist/schemas/index.cjs +38 -93
- package/dist/schemas/index.cjs.map +1 -1
- package/dist/schemas/index.d.cts +2 -2
- package/dist/schemas/index.d.ts +2 -2
- package/dist/schemas/index.js +11 -11
- package/dist/schemas/index.js.map +1 -1
- package/dist/scrollreveal.browser.global.js +5 -11
- package/dist/scrollreveal.browser.global.js.map +1 -1
- package/dist/sortable.browser.global.js +5 -9
- package/dist/sortable.browser.global.js.map +1 -1
- package/dist/tabs.browser.global.js +6 -14
- package/dist/tabs.browser.global.js.map +1 -1
- package/dist/toggleable.browser.global.js +9 -13
- package/dist/toggleable.browser.global.js.map +1 -1
- package/dist/{types-DCCtVQS5.d.cts → types-CbA4L8XJ.d.cts} +16 -23
- package/dist/{types-DCCtVQS5.d.ts → types-CbA4L8XJ.d.ts} +16 -23
- package/package.json +5 -5
- package/src/behavior-resolver.ts +24 -56
- package/src/behaviors/autodismiss.test.ts +12 -20
- package/src/behaviors/autodismiss.ts +8 -23
- package/src/behaviors/clickoutside.test.ts +13 -21
- package/src/behaviors/clickoutside.ts +8 -23
- package/src/behaviors/clipboard.test.ts +12 -34
- package/src/behaviors/clipboard.ts +8 -23
- package/src/behaviors/curated-runtime.test.ts +22 -24
- package/src/behaviors/draggable.ts +10 -24
- package/src/behaviors/experimental-runtime.test.ts +19 -18
- package/src/behaviors/focustrap.test.ts +12 -20
- package/src/behaviors/focustrap.ts +8 -23
- package/src/behaviors/integration.test.ts +19 -54
- package/src/behaviors/optional-runtime.test.ts +17 -22
- package/src/behaviors/removable.ts +6 -20
- package/src/behaviors/resizable.ts +9 -24
- package/src/behaviors/scrollreveal.test.ts +13 -21
- package/src/behaviors/scrollreveal.ts +8 -23
- package/src/behaviors/sortable.ts +7 -22
- package/src/behaviors/tabs.test.ts +12 -34
- package/src/behaviors/tabs.ts +8 -23
- package/src/behaviors/toggleable.ts +10 -26
- package/src/browser-resolver-bundle.ts +20 -30
- package/src/core-bundle.ts +11 -11
- package/src/index.test.ts +2 -2
- package/src/index.ts +30 -47
- package/src/registry.test.ts +9 -34
- package/src/registry.ts +7 -11
- package/src/schemas/autodismiss.schema.ts +3 -9
- package/src/schemas/clickoutside.schema.ts +3 -5
- package/src/schemas/clipboard.schema.ts +2 -6
- package/src/schemas/draggable.schema.ts +4 -12
- package/src/schemas/focustrap.schema.ts +2 -6
- package/src/schemas/index.ts +2 -1
- package/src/schemas/removable.schema.ts +2 -8
- package/src/schemas/resizable.schema.ts +3 -6
- package/src/schemas/scrollreveal.schema.ts +3 -9
- package/src/schemas/sortable.schema.ts +3 -7
- package/src/schemas/tabs.schema.ts +4 -12
- package/src/schemas/toggleable.schema.ts +10 -13
- package/src/schemas/types.ts +37 -30
- package/dist/chunk-2HUF6RMI.js +0 -40
- package/dist/chunk-2HUF6RMI.js.map +0 -1
- package/dist/chunk-3DVDS7CT.js.map +0 -1
- package/dist/chunk-5S7WN3ZQ.js.map +0 -1
- package/dist/chunk-66U2RSYJ.js.map +0 -1
- package/dist/chunk-6TJXDCAQ.js +0 -11
- package/dist/chunk-6TJXDCAQ.js.map +0 -1
- package/dist/chunk-7TPDLB7W.js +0 -40
- package/dist/chunk-7TPDLB7W.js.map +0 -1
- package/dist/chunk-CR3J7VV6.js +0 -40
- package/dist/chunk-CR3J7VV6.js.map +0 -1
- package/dist/chunk-EDBG2F57.js +0 -40
- package/dist/chunk-EDBG2F57.js.map +0 -1
- package/dist/chunk-FBQ3X3UY.js.map +0 -1
- package/dist/chunk-HQDYH45I.js.map +0 -1
- package/dist/chunk-HX663BJ4.js +0 -40
- package/dist/chunk-HX663BJ4.js.map +0 -1
- package/dist/chunk-KROW43CG.js +0 -40
- package/dist/chunk-KROW43CG.js.map +0 -1
- package/dist/chunk-L52AGCMP.js +0 -40
- package/dist/chunk-L52AGCMP.js.map +0 -1
- package/dist/chunk-MTI5PSRH.js +0 -40
- package/dist/chunk-MTI5PSRH.js.map +0 -1
- package/dist/chunk-OJ3YWO3W.js.map +0 -1
- package/dist/chunk-ORBJ7MRW.js +0 -40
- package/dist/chunk-ORBJ7MRW.js.map +0 -1
- package/dist/chunk-SLSCZV4A.js +0 -40
- package/dist/chunk-SLSCZV4A.js.map +0 -1
- package/dist/chunk-URZGNPTQ.js.map +0 -1
- package/dist/chunk-WKBRZGGL.js +0 -40
- package/dist/chunk-WKBRZGGL.js.map +0 -1
- package/dist/chunk-XYZ7FOXJ.js.map +0 -1
- package/dist/chunk-YXS27XM6.js.map +0 -1
- /package/dist/{chunk-ZR66E3T6.js.map → chunk-JNLVXPHR.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas/toggleable.schema.ts","../src/schemas/removable.schema.ts","../src/schemas/autodismiss.schema.ts","../src/schemas/clipboard.schema.ts","../src/schemas/draggable.schema.ts","../src/schemas/clickoutside.schema.ts","../src/schemas/scrollreveal.schema.ts","../src/schemas/tabs.schema.ts","../src/schemas/focustrap.schema.ts","../src/schemas/sortable.schema.ts","../src/schemas/resizable.schema.ts","../src/behavior-resolver.ts","../src/browser-resolver-bundle.ts"],"sourcesContent":["import type { BehaviorSchema } from './types';\n\n/**\n * Toggleable Behavior Schema\n *\n * Toggles a CSS class on click.\n * Useful for accordions, dropdowns, and toggle buttons.\n */\nexport const toggleableSchema: BehaviorSchema = {\n name: 'Toggleable',\n category: 'form',\n tier: 'core',\n version: '1.0.0',\n description: 'Toggles a CSS class on click',\n parameters: [\n {\n name: 'cls',\n type: 'string',\n optional: true,\n default: 'active',\n description: 'CSS class to toggle',\n },\n {\n name: 'target',\n type: 'selector',\n optional: true,\n default: 'me',\n description: 'Element to toggle the class on',\n },\n ],\n events: [\n { name: 'toggleable:on', description: 'Fired when class is added' },\n { name: 'toggleable:off', description: 'Fired when class is removed' },\n ],\n source: `\nbehavior Toggleable(cls, target)\n init\n if cls is undefined\n set cls to \"active\"\n end\n if target is undefined\n set target to me\n end\n end\n on click\n toggle .{cls} on target\n js(target, cls)\n var eventName = target.classList.contains(cls) ? 'toggleable:on' : 'toggleable:off';\n target.dispatchEvent(new CustomEvent(eventName, { bubbles: true }));\n end\n end\nend`.trim(),\n};\n","import type { BehaviorSchema } from './types';\n\n/**\n * Removable Behavior Schema\n *\n * Removes an element when a trigger is clicked.\n * Supports optional confirmation and transition effects.\n *\n * @since 1.2.0 — `trigger` parameter renamed to `triggerEl` to avoid\n * shadowing the hyperscript `trigger` command keyword. Users migrating\n * from v1.x should update: `install Removable(triggerEl: .close-btn)`.\n */\nexport const removableSchema: BehaviorSchema = {\n name: 'Removable',\n category: 'data',\n tier: 'common',\n version: '1.2.0',\n description: 'Makes elements removable on click',\n parameters: [\n {\n name: 'triggerEl',\n type: 'selector',\n optional: true,\n default: 'me',\n description: 'Element that triggers removal (e.g., a close button)',\n },\n {\n name: 'confirmRemoval',\n type: 'boolean',\n optional: true,\n default: false,\n description: 'Show confirmation dialog before removal',\n },\n {\n name: 'effect',\n type: 'string',\n optional: true,\n default: 'none',\n enum: ['fade', 'none'],\n description: 'Transition effect: \"fade\" or \"none\"',\n },\n ],\n events: [\n { name: 'removable:before', description: 'Fired before removal (cancelable)' },\n { name: 'removable:removed', description: 'Fired after removal' },\n ],\n source: `\nbehavior Removable(triggerEl, confirmRemoval, effect)\n init\n if triggerEl is undefined\n set triggerEl to me\n end\n end\n on click from triggerEl\n if confirmRemoval\n js(me)\n if (!window.confirm(\"Are you sure?\")) return \"cancel\";\n end\n if it is \"cancel\"\n halt\n end\n end\n trigger removable:before\n if effect is \"fade\"\n transition opacity to 0 over 300ms\n end\n trigger removable:removed\n remove me\n end\nend\n`.trim(),\n};\n","import type { BehaviorSchema } from './types';\n\n/**\n * AutoDismiss Behavior Schema\n *\n * Auto-removes flash messages and toasts after a configurable delay.\n * Supports pause-on-hover and fade effect.\n */\nexport const autoDismissSchema: BehaviorSchema = {\n name: 'AutoDismiss',\n category: 'ui',\n tier: 'core',\n version: '1.0.0',\n description: 'Auto-removes elements after a delay with optional pause-on-hover',\n parameters: [\n {\n name: 'delay',\n type: 'number',\n optional: true,\n default: 5000,\n description: 'Time in ms before the element is removed',\n },\n {\n name: 'pauseOnHover',\n type: 'boolean',\n optional: true,\n default: true,\n description: 'Pause the countdown when the mouse hovers over the element',\n },\n {\n name: 'effect',\n type: 'string',\n optional: true,\n default: 'none',\n enum: ['fade', 'none'],\n description: 'Transition effect before removal: \"fade\" or \"none\"',\n },\n ],\n events: [\n { name: 'autodismiss:start', description: 'Fired when the countdown timer starts' },\n {\n name: 'autodismiss:dismissed',\n description: 'Fired before removal (cancelable via preventDefault)',\n },\n { name: 'autodismiss:paused', description: 'Fired when the timer is paused on hover' },\n { name: 'autodismiss:resumed', description: 'Fired when the timer resumes on mouseleave' },\n ],\n source: `\nbehavior AutoDismiss(delay, pauseOnHover, effect)\n init\n if delay is undefined\n set delay to 5000\n end\n if pauseOnHover is undefined\n set pauseOnHover to true\n end\n if effect is undefined\n set effect to \"none\"\n end\n js(me, delay, effect, pauseOnHover)\n me.dispatchEvent(new CustomEvent('autodismiss:start', { bubbles: true }));\n var remaining = delay;\n var startedAt = Date.now();\n var timerId = null;\n function dismiss() {\n var ev = new CustomEvent('autodismiss:dismissed', { bubbles: true, cancelable: true });\n me.dispatchEvent(ev);\n if (ev.defaultPrevented) return;\n if (effect === 'fade') {\n me.style.transition = 'opacity 300ms';\n me.style.opacity = '0';\n setTimeout(function() { me.remove(); }, 300);\n } else {\n me.remove();\n }\n }\n function start() {\n startedAt = Date.now();\n timerId = setTimeout(dismiss, remaining);\n }\n start();\n if (pauseOnHover) {\n me.addEventListener('mouseenter', function() {\n if (timerId != null) {\n clearTimeout(timerId);\n timerId = null;\n remaining -= Date.now() - startedAt;\n if (remaining < 0) remaining = 0;\n me.dispatchEvent(new CustomEvent('autodismiss:paused', { bubbles: true }));\n }\n });\n me.addEventListener('mouseleave', function() {\n if (timerId == null && me.isConnected) {\n me.dispatchEvent(new CustomEvent('autodismiss:resumed', { bubbles: true }));\n start();\n }\n });\n }\n end\n end\nend`.trim(),\n};\n","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 // Wrapped in an async IIFE: hyperscript's js() block has no top-level await.\n (async function() {\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 })();\n end\n end\nend`.trim(),\n};\n","import type { BehaviorSchema } from './types';\n\n/**\n * Draggable Behavior Schema\n *\n * Makes elements draggable with pointer events.\n * Supports custom drag handles and lifecycle events.\n */\nexport const draggableSchema: BehaviorSchema = {\n name: 'Draggable',\n category: 'ui',\n tier: 'core',\n version: '1.0.0',\n description:\n 'Makes elements draggable with pointer events (EXPERIMENTAL — stateful async component, beyond the inline-scripting boundary; not part of the curated set)',\n parameters: [\n {\n name: 'dragHandle',\n type: 'selector',\n optional: true,\n default: 'me',\n description: 'CSS selector for the drag handle element',\n },\n ],\n events: [\n { name: 'draggable:start', description: 'Fired when drag begins' },\n { name: 'draggable:move', description: 'Fired during each movement' },\n { name: 'draggable:end', description: 'Fired when drag completes' },\n ],\n requirements: ['position: absolute or position: fixed on the element'],\n source: `\nbehavior Draggable(dragHandle)\n init\n if no dragHandle set dragHandle to me\n end\n on pointerdown(clientX, clientY) from dragHandle\n halt the event\n trigger draggable:start\n measure x\n set startX to it\n measure y\n set startY to it\n set xoff to clientX - startX\n set yoff to clientY - startY\n repeat until event pointerup from document\n wait for pointermove(clientX, clientY) or\n pointerup(clientX, clientY) from document\n add { left: \\${clientX - xoff}px; top: \\${clientY - yoff}px; }\n trigger draggable:move\n end\n trigger draggable:end\n end\nend\n`.trim(),\n};\n","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, event)\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","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","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","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","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:\n 'Makes child elements reorderable via drag-and-drop (EXPERIMENTAL — stateful async component, beyond the inline-scripting boundary; not part of the curated set)',\n parameters: [\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(dragClass)\n init\n if dragClass is undefined\n set dragClass to \"sorting\"\n end\n end\n on pointerdown(clientY) from me\n set item to the target.closest(\"li\")\n if item is null\n exit\n end\n halt the event\n add .{dragClass} to item\n trigger sortable:start on me\n repeat until event pointerup from document\n wait for pointermove(clientY) or pointerup(clientY) from document\n trigger sortable:move on me\n end\n remove .{dragClass} from item\n trigger sortable:end on me\n end\nend`.trim(),\n};\n","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:\n 'Makes elements resizable by dragging (EXPERIMENTAL — stateful async component, beyond the inline-scripting boundary; not part of the curated set)',\n parameters: [\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(minWidth, minHeight, maxWidth, maxHeight)\n on pointerdown(clientX, clientY) from me\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(clientX, clientY) from document\n set newWidth to (startWidth + clientX) - startX\n set newHeight to (startHeight + clientY) - startY\n if newWidth < minWidth then set newWidth to minWidth end\n if newWidth > maxWidth then set newWidth to maxWidth end\n if newHeight < minHeight then set newHeight to minHeight end\n if newHeight > maxHeight then set newHeight to maxHeight end\n set my *width to newWidth + \"px\"\n set my *height to newHeight + \"px\"\n trigger resizable:resize\n end\n trigger resizable:end\n end\nend\n`.trim(),\n};\n","/**\n * Behavior Resolver — Lazy compilation of hyperscript behaviors\n *\n * Provides a resolver function that compiles behavior source strings on demand.\n * When the runtime encounters `install X` and X isn't registered, it calls\n * the resolver. If the resolver has source for X, it compiles it, registers\n * the behavior, and installation proceeds normally.\n *\n * @example\n * ```typescript\n * import { createBehaviorResolver } from '@hyperfixi/behaviors/resolver';\n *\n * const resolve = createBehaviorResolver(window.hyperfixi, window._hyperscript.behaviors);\n * window._hyperscript.behaviors.resolve = resolve;\n *\n * // Now `install Toggleable` will compile the behavior on first use\n * ```\n */\n\nimport { toggleableSchema } from './schemas/toggleable.schema';\nimport { removableSchema } from './schemas/removable.schema';\nimport { autoDismissSchema } from './schemas/autodismiss.schema';\nimport { clipboardSchema } from './schemas/clipboard.schema';\nimport { draggableSchema } from './schemas/draggable.schema';\nimport { clickOutsideSchema } from './schemas/clickoutside.schema';\nimport { scrollRevealSchema } from './schemas/scrollreveal.schema';\nimport { tabsSchema } from './schemas/tabs.schema';\nimport { focusTrapSchema } from './schemas/focustrap.schema';\nimport { sortableSchema } from './schemas/sortable.schema';\nimport { resizableSchema } from './schemas/resizable.schema';\n\nexport const BEHAVIOR_SOURCES: Record<string, string> = {\n Toggleable: toggleableSchema.source,\n Removable: removableSchema.source,\n AutoDismiss: autoDismissSchema.source,\n Clipboard: clipboardSchema.source,\n Draggable: draggableSchema.source,\n ClickOutside: clickOutsideSchema.source,\n ScrollReveal: scrollRevealSchema.source,\n Tabs: tabsSchema.source,\n FocusTrap: focusTrapSchema.source,\n Sortable: sortableSchema.source,\n Resizable: resizableSchema.source,\n};\n\ninterface CompileResult {\n ok: boolean;\n ast?: any;\n errors?: unknown[];\n}\n\ninterface BehaviorAPI {\n set(name: string, definition: any): void;\n}\n\ninterface HyperFixiAPI {\n compileSync(code: string, options?: { traditional?: boolean }): CompileResult;\n}\n\n/**\n * Create a behavior resolver that compiles hyperscript source on demand.\n *\n * The returned function is meant to be assigned to `_hyperscript.behaviors.resolve`.\n * When called with a behavior name, it looks up the source, compiles it,\n * and registers the resulting AST in the behavior registry.\n *\n * @param hyperfixi - The hyperfixi API (needs compileSync)\n * @param behaviorAPI - The behavior registry API (needs set)\n * @returns Resolver function: (name: string) => boolean\n */\nexport function createBehaviorResolver(\n hyperfixi: HyperFixiAPI,\n behaviorAPI: BehaviorAPI\n): (name: string) => boolean {\n return (name: string): boolean => {\n const source = BEHAVIOR_SOURCES[name];\n if (!source) return false;\n\n const result = hyperfixi.compileSync(source, { traditional: true });\n if (!result.ok || !result.ast) return false;\n\n const ast = result.ast as any;\n behaviorAPI.set(name, {\n name: ast.name,\n parameters: ast.parameters,\n eventHandlers: ast.eventHandlers,\n initBlock: ast.initBlock,\n });\n return true;\n };\n}\n","/**\n * Browser Behavior Resolver Bundle\n *\n * Pre-registers all standard behavior definitions with the hyperfixi runtime.\n * Include after hyperfixi.js — all standard behaviors become available.\n *\n * Usage:\n * <script src=\"hyperfixi.js\"></script>\n * <script src=\"hyperfixi-behaviors.js\"></script>\n * <!-- install Toggleable, Draggable, etc. just work -->\n */\n\nimport { BEHAVIOR_SOURCES } from './behavior-resolver';\n\nfunction init() {\n const hf = (window as any).hyperfixi;\n if (!hf?.compileSync || !hf?.execute) return;\n\n // Compile and register each behavior definition with the runtime.\n // This is equivalent to having them in a <script type=\"text/hyperscript\"> block.\n for (const source of Object.values(BEHAVIOR_SOURCES)) {\n const result = hf.compileSync(source, { traditional: true });\n if (result?.ok && result.ast) {\n // execute() registers the behavior in the runtime's behaviorRegistry\n hf.execute(result.ast).catch(() => {\n // Async — errors handled silently\n });\n }\n }\n\n // Re-scan: the attribute processor may have already processed elements\n // and failed (behaviors weren't registered). Reset and re-init.\n const ap = hf.attributeProcessor;\n if (ap) {\n ap.reset();\n ap.init();\n }\n}\n\nif (typeof window !== 'undefined') {\n init();\n}\n"],"mappings":"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","names":["toggleableSchema","removableSchema","autoDismissSchema","clipboardSchema","draggableSchema","clickOutsideSchema","scrollRevealSchema","tabsSchema","focusTrapSchema","sortableSchema","resizableSchema","BEHAVIOR_SOURCES","toggleableSchema","removableSchema","autoDismissSchema","clipboardSchema","draggableSchema","clickOutsideSchema","scrollRevealSchema","tabsSchema","focusTrapSchema","sortableSchema","resizableSchema","init","hf","source","BEHAVIOR_SOURCES","result","ap"]}
|
|
1
|
+
{"version":3,"sources":["../src/schemas/toggleable.schema.ts","../src/schemas/removable.schema.ts","../src/schemas/autodismiss.schema.ts","../src/schemas/clipboard.schema.ts","../src/schemas/draggable.schema.ts","../src/schemas/clickoutside.schema.ts","../src/schemas/scrollreveal.schema.ts","../src/schemas/tabs.schema.ts","../src/schemas/focustrap.schema.ts","../src/schemas/sortable.schema.ts","../src/schemas/resizable.schema.ts","../src/behavior-resolver.ts","../src/schemas/types.ts","../src/browser-resolver-bundle.ts"],"sourcesContent":["import type { BehaviorSchema } from './types';\n\n/**\n * Toggleable Behavior Schema\n *\n * Toggles a CSS class on click.\n * Useful for accordions, dropdowns, and toggle buttons.\n */\nexport const toggleableSchema: BehaviorSchema = {\n name: 'Toggleable',\n category: 'form',\n tier: 'core',\n version: '1.0.0',\n description: 'Toggles a CSS class on click',\n parameters: [\n {\n name: 'cls',\n type: 'string',\n optional: true,\n default: 'active',\n description: 'CSS class to toggle',\n },\n {\n name: 'targetEl',\n type: 'selector',\n optional: true,\n default: 'me',\n description:\n \"Element to toggle the class on (not `target`: that is hyperscript's name for the event target)\",\n },\n ],\n events: [\n { name: 'toggleable:on', description: 'Fired when class is added' },\n { name: 'toggleable:off', description: 'Fired when class is removed' },\n ],\n source: `\nbehavior Toggleable(cls, targetEl)\n init\n if cls is undefined set element's cls to \"active\" end\n if targetEl is undefined set element's targetEl to me end\n end\n on click\n toggle .{cls} on targetEl\n js(targetEl, cls)\n var eventName = targetEl.classList.contains(cls) ? 'toggleable:on' : 'toggleable:off';\n targetEl.dispatchEvent(new CustomEvent(eventName, { bubbles: true }));\n end\n end\nend`.trim(),\n};\n","import type { BehaviorSchema } from './types';\n\n/**\n * Removable Behavior Schema\n *\n * Removes an element when a trigger is clicked.\n * Supports optional confirmation and transition effects.\n *\n * @since 1.2.0 — `trigger` parameter renamed to `triggerEl` to avoid\n * shadowing the hyperscript `trigger` command keyword. Users migrating\n * from v1.x should update: `install Removable(triggerEl: .close-btn)`.\n */\nexport const removableSchema: BehaviorSchema = {\n name: 'Removable',\n category: 'data',\n tier: 'common',\n version: '1.2.0',\n description: 'Makes elements removable on click',\n parameters: [\n {\n name: 'triggerEl',\n type: 'selector',\n optional: true,\n default: 'me',\n description: 'Element that triggers removal (e.g., a close button)',\n },\n {\n name: 'confirmRemoval',\n type: 'boolean',\n optional: true,\n default: false,\n description: 'Show confirmation dialog before removal',\n },\n {\n name: 'effect',\n type: 'string',\n optional: true,\n default: 'none',\n enum: ['fade', 'none'],\n description: 'Transition effect: \"fade\" or \"none\"',\n },\n ],\n events: [\n { name: 'removable:before', description: 'Fired before removal (cancelable)' },\n { name: 'removable:removed', description: 'Fired after removal' },\n ],\n source: `\nbehavior Removable(triggerEl, confirmRemoval, effect)\n on click from (triggerEl or me)\n if confirmRemoval\n js(me)\n if (!window.confirm(\"Are you sure?\")) return \"cancel\";\n end\n if it is \"cancel\"\n halt\n end\n end\n trigger removable:before\n if effect is \"fade\"\n transition opacity to 0 over 300ms\n end\n trigger removable:removed\n remove me\n end\nend`.trim(),\n};\n","import type { BehaviorSchema } from './types';\n\n/**\n * AutoDismiss Behavior Schema\n *\n * Auto-removes flash messages and toasts after a configurable delay.\n * Supports pause-on-hover and fade effect.\n */\nexport const autoDismissSchema: BehaviorSchema = {\n name: 'AutoDismiss',\n category: 'ui',\n tier: 'core',\n version: '1.0.0',\n description: 'Auto-removes elements after a delay with optional pause-on-hover',\n parameters: [\n {\n name: 'delay',\n type: 'number',\n optional: true,\n default: 5000,\n description: 'Time in ms before the element is removed',\n },\n {\n name: 'pauseOnHover',\n type: 'boolean',\n optional: true,\n default: true,\n description: 'Pause the countdown when the mouse hovers over the element',\n },\n {\n name: 'effect',\n type: 'string',\n optional: true,\n default: 'none',\n enum: ['fade', 'none'],\n description: 'Transition effect before removal: \"fade\" or \"none\"',\n },\n ],\n events: [\n { name: 'autodismiss:start', description: 'Fired when the countdown timer starts' },\n {\n name: 'autodismiss:dismissed',\n description: 'Fired before removal (cancelable via preventDefault)',\n },\n { name: 'autodismiss:paused', description: 'Fired when the timer is paused on hover' },\n { name: 'autodismiss:resumed', description: 'Fired when the timer resumes on mouseleave' },\n ],\n source: `\nbehavior AutoDismiss(delay, pauseOnHover, effect)\n init\n if delay is undefined set element's delay to 5000 end\n if pauseOnHover is undefined set element's pauseOnHover to true end\n if effect is undefined set element's effect to \"none\" end\n js(me, delay, effect, pauseOnHover)\n me.dispatchEvent(new CustomEvent('autodismiss:start', { bubbles: true }));\n var remaining = delay;\n var startedAt = Date.now();\n var timerId = null;\n function dismiss() {\n var ev = new CustomEvent('autodismiss:dismissed', { bubbles: true, cancelable: true });\n me.dispatchEvent(ev);\n if (ev.defaultPrevented) return;\n if (effect === 'fade') {\n me.style.transition = 'opacity 300ms';\n me.style.opacity = '0';\n setTimeout(function() { me.remove(); }, 300);\n } else {\n me.remove();\n }\n }\n function start() {\n startedAt = Date.now();\n timerId = setTimeout(dismiss, remaining);\n }\n start();\n if (pauseOnHover) {\n me.addEventListener('mouseenter', function() {\n if (timerId != null) {\n clearTimeout(timerId);\n timerId = null;\n remaining -= Date.now() - startedAt;\n if (remaining < 0) remaining = 0;\n me.dispatchEvent(new CustomEvent('autodismiss:paused', { bubbles: true }));\n }\n });\n me.addEventListener('mouseleave', function() {\n if (timerId == null && me.isConnected) {\n me.dispatchEvent(new CustomEvent('autodismiss:resumed', { bubbles: true }));\n start();\n }\n });\n }\n end\n end\nend`.trim(),\n};\n","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 set element's feedbackDuration to 2000 end\n if source is undefined set element's source to me 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 // Wrapped in an async IIFE: hyperscript's js() block has no top-level await.\n (async function() {\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 })();\n end\n end\nend`.trim(),\n};\n","import type { BehaviorSchema } from './types';\n\n/**\n * Draggable Behavior Schema\n *\n * Makes elements draggable with pointer events.\n * Supports custom drag handles and lifecycle events.\n */\nexport const draggableSchema: BehaviorSchema = {\n name: 'Draggable',\n category: 'ui',\n tier: 'core',\n version: '1.0.0',\n description:\n 'Makes elements draggable with pointer events (EXPERIMENTAL — stateful async component, beyond the inline-scripting boundary; not part of the curated set)',\n parameters: [\n {\n name: 'dragHandle',\n type: 'selector',\n optional: true,\n default: 'me',\n description: 'CSS selector for the drag handle element',\n },\n ],\n events: [\n { name: 'draggable:start', description: 'Fired when drag begins' },\n { name: 'draggable:move', description: 'Fired during each movement' },\n { name: 'draggable:end', description: 'Fired when drag completes' },\n ],\n requirements: ['position: absolute or position: fixed on the element'],\n source: `\nbehavior Draggable(dragHandle)\n on pointerdown(clientX, clientY) from (dragHandle or me)\n halt the event\n trigger draggable:start\n set xoff to clientX - my offsetLeft\n set yoff to clientY - my offsetTop\n repeat until event pointerup from document\n wait for pointermove(clientX, clientY) or\n pointerup(clientX, clientY) from document\n add { left: \\${clientX - xoff}px; top: \\${clientY - yoff}px; }\n trigger draggable:move\n end\n trigger draggable:end\n end\nend`.trim(),\n};\n","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 set element's active to true end\n end\n on pointerdown from document\n js(me, active, event)\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 element's active to true\n end\n on clickoutside:deactivate\n set element's active to false\n end\nend`.trim(),\n};\n","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 set element's cls to \"revealed\" end\n if threshold is undefined set element's threshold to 0.1 end\n if once is undefined set element's once to true 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","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 set element's orientation to \"horizontal\" end\n if activeTab is undefined set element's activeTab to 0 end\n if wrap is undefined set element's wrap to true end\n if activeClass is undefined set element's activeClass to \"active\" 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","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 set element's active to true end\n if returnFocus is undefined set element's returnFocus to true 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","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:\n 'Makes child elements reorderable via drag-and-drop (EXPERIMENTAL — stateful async component, beyond the inline-scripting boundary; not part of the curated set)',\n parameters: [\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(dragClass)\n on pointerdown(clientY) from me\n set item to the target.closest(\"li\")\n if item is null\n exit\n end\n halt the event\n set cls to dragClass or \"sorting\"\n add .{cls} to item\n trigger sortable:start on me\n repeat until event pointerup from document\n wait for pointermove(clientY) or pointerup(clientY) from document\n trigger sortable:move on me\n end\n remove .{cls} from item\n trigger sortable:end on me\n end\nend`.trim(),\n};\n","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:\n 'Makes elements resizable by dragging (EXPERIMENTAL — stateful async component, beyond the inline-scripting boundary; not part of the curated set)',\n parameters: [\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(minWidth, minHeight, maxWidth, maxHeight)\n on pointerdown(clientX, clientY) from me\n halt the event\n trigger resizable:start\n set startWidth to my offsetWidth\n set startHeight to my offsetHeight\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(clientX, clientY) from document\n set newWidth to (startWidth + clientX) - startX\n set newHeight to (startHeight + clientY) - startY\n if newWidth < minWidth then set newWidth to minWidth end\n if newWidth > maxWidth then set newWidth to maxWidth end\n if newHeight < minHeight then set newHeight to minHeight end\n if newHeight > maxHeight then set newHeight to maxHeight end\n set my *width to newWidth + \"px\"\n set my *height to newHeight + \"px\"\n trigger resizable:resize\n end\n trigger resizable:end\n end\nend`.trim(),\n};\n","/**\n * The behavior sources, by name, and the function that defines them on a host.\n *\n * Every consumer — the npm `register*()` functions, the browser bundle\n * (`resolver.browser.global.js`) and `@hyperfixi/patterns-reference` — reads the same\n * `source` string from each schema in `src/schemas/`. A host defines a behavior from its\n * source exactly as it would from a page's `<script type=\"text/hyperscript\">`.\n */\n\nimport { toggleableSchema } from './schemas/toggleable.schema';\nimport { removableSchema } from './schemas/removable.schema';\nimport { autoDismissSchema } from './schemas/autodismiss.schema';\nimport { clipboardSchema } from './schemas/clipboard.schema';\nimport { draggableSchema } from './schemas/draggable.schema';\nimport { clickOutsideSchema } from './schemas/clickoutside.schema';\nimport { scrollRevealSchema } from './schemas/scrollreveal.schema';\nimport { tabsSchema } from './schemas/tabs.schema';\nimport { focusTrapSchema } from './schemas/focustrap.schema';\nimport { sortableSchema } from './schemas/sortable.schema';\nimport { resizableSchema } from './schemas/resizable.schema';\nimport type { HyperscriptHost } from './schemas/types';\n\nexport const BEHAVIOR_SOURCES: Record<string, string> = {\n Toggleable: toggleableSchema.source,\n Removable: removableSchema.source,\n AutoDismiss: autoDismissSchema.source,\n Clipboard: clipboardSchema.source,\n Draggable: draggableSchema.source,\n ClickOutside: clickOutsideSchema.source,\n ScrollReveal: scrollRevealSchema.source,\n Tabs: tabsSchema.source,\n FocusTrap: focusTrapSchema.source,\n Sortable: sortableSchema.source,\n Resizable: resizableSchema.source,\n};\n\n/**\n * Define the named behaviors (every one by default) on a host. A source that does not\n * parse is reported and skipped, so one bad behavior does not take the others with it.\n *\n * @returns the names that were defined\n */\nexport function defineBehaviors(\n host: HyperscriptHost,\n names: readonly string[] = Object.keys(BEHAVIOR_SOURCES)\n): string[] {\n const defined: string[] = [];\n for (const name of names) {\n const source = BEHAVIOR_SOURCES[name];\n if (!source) continue;\n try {\n host.evaluate(source);\n defined.push(name);\n } catch (e) {\n console.error(`[behaviors] ${name} did not parse: ${(e as Error).message}`);\n }\n }\n return defined;\n}\n","/**\n * Behavior Schema Types\n *\n * Defines the structure for behavior metadata used for:\n * - Code generation (TypeScript types, documentation)\n * - Runtime categorization and lazy loading\n * - Tooling and IDE integration\n */\n\n/**\n * Behavior categories for organization.\n * - ui: Visual interaction behaviors (drag, resize, sort)\n * - data: Data manipulation behaviors (remove, transform)\n * - animation: Animation and transition behaviors\n * - form: Form-related behaviors (validation, toggle states)\n * - layout: Layout behaviors (sticky, scrollspy)\n */\nexport type BehaviorCategory = 'ui' | 'data' | 'animation' | 'form' | 'layout';\n\n/**\n * Loading tiers for lazy loading optimization.\n * - core: Always loaded (essential behaviors)\n * - common: High usage (loaded for typical apps)\n * - optional: Low usage (loaded on demand)\n */\nexport type BehaviorTier = 'core' | 'common' | 'optional';\n\n/**\n * Schema for a behavior parameter.\n */\nexport interface ParameterSchema {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'selector' | 'element';\n optional?: boolean;\n default?: string | number | boolean;\n /** Allowed values for constrained parameters */\n enum?: string[];\n description: string;\n}\n\n/**\n * Schema for a behavior event.\n */\nexport interface EventSchema {\n name: string;\n description: string;\n}\n\n/**\n * Complete schema for a behavior.\n * This is the source of truth for all behavior metadata.\n */\nexport interface BehaviorSchema {\n /** Behavior name (PascalCase) */\n name: string;\n /** Category for organization */\n category: BehaviorCategory;\n /** Loading tier for lazy loading */\n tier: BehaviorTier;\n /** Semantic version */\n version: string;\n /** Human-readable description */\n description: string;\n /** Parameter definitions */\n parameters: ParameterSchema[];\n /** Event definitions */\n events: EventSchema[];\n /** The hyperscript behavior source code */\n source: string;\n /** Optional requirements or notes */\n requirements?: string[];\n}\n\n/**\n * Runtime behavior module interface: a behavior's source, its schema, and the function that\n * defines it on a hyperscript host.\n */\nexport interface BehaviorModule {\n source: string;\n metadata: BehaviorSchema;\n register: (host?: HyperscriptHost) => Promise<void>;\n}\n\n/**\n * A hyperscript host, in upstream `_hyperscript`'s shape: `@hyperfixi/engine` (the\n * `hyperfixi-hs.js` bundle, `window.hyperfixi` / `window._hyperscript`) or upstream itself.\n * `evaluate(source)` of a `behavior … end` program defines the behavior; `processNode`\n * initialises the scripted elements under a node.\n */\nexport interface HyperscriptHost {\n evaluate: (source: string) => unknown;\n processNode?: (node: Node) => void;\n}\n\n/** The window globals a host installs itself as. */\nexport interface HyperscriptWindow {\n hyperfixi?: HyperscriptHost;\n _hyperscript?: HyperscriptHost;\n}\n\n/** The host on `window`: `hyperfixi` (the engine's bundle) or `_hyperscript` (upstream's name). */\nexport function resolveRuntime(): HyperscriptHost | null {\n if (typeof window === 'undefined') return null;\n const win = window as unknown as HyperscriptWindow;\n const host = win.hyperfixi ?? win._hyperscript;\n return host && typeof host.evaluate === 'function' ? host : null;\n}\n\n/**\n * Define a behavior on a host from its schema's source, as a page's\n * `<script type=\"text/hyperscript\">` would. Throws when there is no host or the source\n * does not parse.\n */\nexport function defineBehavior(schema: BehaviorSchema, host?: HyperscriptHost): void {\n const hf = host ?? resolveRuntime();\n if (!hf) {\n throw new Error(\n `No hyperscript host found: load @hyperfixi/engine (hyperfixi-hs.js) before defining ${schema.name}.`\n );\n }\n try {\n hf.evaluate(schema.source);\n } catch (e) {\n throw new Error(`Failed to define ${schema.name} behavior: ${(e as Error).message}`);\n }\n}\n","/**\n * The behaviors browser bundle: `resolver.browser.global.js`.\n *\n * Defines every standard behavior on the hyperscript host, so `install Toggleable`,\n * `install Draggable`, … just work. Include it after the host's script:\n *\n * <script src=\"hyperfixi-hs.js\"></script>\n * <script src=\"resolver.browser.global.js\"></script>\n *\n * The host is `@hyperfixi/engine` (`window.hyperfixi`, also `window._hyperscript`) or\n * upstream `_hyperscript` itself: each source is defined with `evaluate`, as a page's\n * `<script type=\"text/hyperscript\">` would be. Loaded before the document is ready, this runs\n * before the host reads the page, so every `install` finds its behavior; loaded later, the\n * document is processed again so the installs can succeed now.\n */\n\nimport { defineBehaviors } from './behavior-resolver';\nimport { resolveRuntime } from './schemas/types';\n\nfunction init(): void {\n const host = resolveRuntime();\n if (!host) {\n console.error('[behaviors] no hyperscript host: load hyperfixi-hs.js before this bundle');\n return;\n }\n defineBehaviors(host);\n if (document.readyState !== 'loading') host.processNode?.(document.body);\n}\n\nif (typeof window !== 'undefined') {\n init();\n}\n"],"mappings":"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","names":["toggleableSchema","removableSchema","autoDismissSchema","clipboardSchema","draggableSchema","clickOutsideSchema","scrollRevealSchema","tabsSchema","focusTrapSchema","sortableSchema","resizableSchema","BEHAVIOR_SOURCES","toggleableSchema","removableSchema","autoDismissSchema","clipboardSchema","draggableSchema","clickOutsideSchema","scrollRevealSchema","tabsSchema","focusTrapSchema","sortableSchema","resizableSchema","defineBehaviors","host","names","defined","name","source","e","resolveRuntime","win","host","init","host","resolveRuntime","defineBehaviors"]}
|
package/dist/schemas/index.cjs
CHANGED
|
@@ -61,18 +61,11 @@ var draggableSchema = {
|
|
|
61
61
|
requirements: ["position: absolute or position: fixed on the element"],
|
|
62
62
|
source: `
|
|
63
63
|
behavior Draggable(dragHandle)
|
|
64
|
-
|
|
65
|
-
if no dragHandle set dragHandle to me
|
|
66
|
-
end
|
|
67
|
-
on pointerdown(clientX, clientY) from dragHandle
|
|
64
|
+
on pointerdown(clientX, clientY) from (dragHandle or me)
|
|
68
65
|
halt the event
|
|
69
66
|
trigger draggable:start
|
|
70
|
-
|
|
71
|
-
set
|
|
72
|
-
measure y
|
|
73
|
-
set startY to it
|
|
74
|
-
set xoff to clientX - startX
|
|
75
|
-
set yoff to clientY - startY
|
|
67
|
+
set xoff to clientX - my offsetLeft
|
|
68
|
+
set yoff to clientY - my offsetTop
|
|
76
69
|
repeat until event pointerup from document
|
|
77
70
|
wait for pointermove(clientX, clientY) or
|
|
78
71
|
pointerup(clientX, clientY) from document
|
|
@@ -81,8 +74,7 @@ behavior Draggable(dragHandle)
|
|
|
81
74
|
end
|
|
82
75
|
trigger draggable:end
|
|
83
76
|
end
|
|
84
|
-
end
|
|
85
|
-
`.trim()
|
|
77
|
+
end`.trim()
|
|
86
78
|
};
|
|
87
79
|
|
|
88
80
|
// src/schemas/sortable.schema.ts
|
|
@@ -112,24 +104,20 @@ var sortableSchema = {
|
|
|
112
104
|
requirements: ["Users must handle DOM reordering in sortable:move event handlers"],
|
|
113
105
|
source: `
|
|
114
106
|
behavior Sortable(dragClass)
|
|
115
|
-
init
|
|
116
|
-
if dragClass is undefined
|
|
117
|
-
set dragClass to "sorting"
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
107
|
on pointerdown(clientY) from me
|
|
121
108
|
set item to the target.closest("li")
|
|
122
109
|
if item is null
|
|
123
110
|
exit
|
|
124
111
|
end
|
|
125
112
|
halt the event
|
|
126
|
-
|
|
113
|
+
set cls to dragClass or "sorting"
|
|
114
|
+
add .{cls} to item
|
|
127
115
|
trigger sortable:start on me
|
|
128
116
|
repeat until event pointerup from document
|
|
129
117
|
wait for pointermove(clientY) or pointerup(clientY) from document
|
|
130
118
|
trigger sortable:move on me
|
|
131
119
|
end
|
|
132
|
-
remove .{
|
|
120
|
+
remove .{cls} from item
|
|
133
121
|
trigger sortable:end on me
|
|
134
122
|
end
|
|
135
123
|
end`.trim()
|
|
@@ -182,10 +170,8 @@ behavior Resizable(minWidth, minHeight, maxWidth, maxHeight)
|
|
|
182
170
|
on pointerdown(clientX, clientY) from me
|
|
183
171
|
halt the event
|
|
184
172
|
trigger resizable:start
|
|
185
|
-
|
|
186
|
-
set
|
|
187
|
-
measure height
|
|
188
|
-
set startHeight to it
|
|
173
|
+
set startWidth to my offsetWidth
|
|
174
|
+
set startHeight to my offsetHeight
|
|
189
175
|
set startX to clientX
|
|
190
176
|
set startY to clientY
|
|
191
177
|
repeat until event pointerup from document
|
|
@@ -202,8 +188,7 @@ behavior Resizable(minWidth, minHeight, maxWidth, maxHeight)
|
|
|
202
188
|
end
|
|
203
189
|
trigger resizable:end
|
|
204
190
|
end
|
|
205
|
-
end
|
|
206
|
-
`.trim()
|
|
191
|
+
end`.trim()
|
|
207
192
|
};
|
|
208
193
|
|
|
209
194
|
// src/schemas/removable.schema.ts
|
|
@@ -243,12 +228,7 @@ var removableSchema = {
|
|
|
243
228
|
],
|
|
244
229
|
source: `
|
|
245
230
|
behavior Removable(triggerEl, confirmRemoval, effect)
|
|
246
|
-
|
|
247
|
-
if triggerEl is undefined
|
|
248
|
-
set triggerEl to me
|
|
249
|
-
end
|
|
250
|
-
end
|
|
251
|
-
on click from triggerEl
|
|
231
|
+
on click from (triggerEl or me)
|
|
252
232
|
if confirmRemoval
|
|
253
233
|
js(me)
|
|
254
234
|
if (!window.confirm("Are you sure?")) return "cancel";
|
|
@@ -264,8 +244,7 @@ behavior Removable(triggerEl, confirmRemoval, effect)
|
|
|
264
244
|
trigger removable:removed
|
|
265
245
|
remove me
|
|
266
246
|
end
|
|
267
|
-
end
|
|
268
|
-
`.trim()
|
|
247
|
+
end`.trim()
|
|
269
248
|
};
|
|
270
249
|
|
|
271
250
|
// src/schemas/toggleable.schema.ts
|
|
@@ -284,11 +263,11 @@ var toggleableSchema = {
|
|
|
284
263
|
description: "CSS class to toggle"
|
|
285
264
|
},
|
|
286
265
|
{
|
|
287
|
-
name: "
|
|
266
|
+
name: "targetEl",
|
|
288
267
|
type: "selector",
|
|
289
268
|
optional: true,
|
|
290
269
|
default: "me",
|
|
291
|
-
description: "Element to toggle the class on"
|
|
270
|
+
description: "Element to toggle the class on (not `target`: that is hyperscript's name for the event target)"
|
|
292
271
|
}
|
|
293
272
|
],
|
|
294
273
|
events: [
|
|
@@ -296,20 +275,16 @@ var toggleableSchema = {
|
|
|
296
275
|
{ name: "toggleable:off", description: "Fired when class is removed" }
|
|
297
276
|
],
|
|
298
277
|
source: `
|
|
299
|
-
behavior Toggleable(cls,
|
|
278
|
+
behavior Toggleable(cls, targetEl)
|
|
300
279
|
init
|
|
301
|
-
if cls is undefined
|
|
302
|
-
|
|
303
|
-
end
|
|
304
|
-
if target is undefined
|
|
305
|
-
set target to me
|
|
306
|
-
end
|
|
280
|
+
if cls is undefined set element's cls to "active" end
|
|
281
|
+
if targetEl is undefined set element's targetEl to me end
|
|
307
282
|
end
|
|
308
283
|
on click
|
|
309
|
-
toggle .{cls} on
|
|
310
|
-
js(
|
|
311
|
-
var eventName =
|
|
312
|
-
|
|
284
|
+
toggle .{cls} on targetEl
|
|
285
|
+
js(targetEl, cls)
|
|
286
|
+
var eventName = targetEl.classList.contains(cls) ? 'toggleable:on' : 'toggleable:off';
|
|
287
|
+
targetEl.dispatchEvent(new CustomEvent(eventName, { bubbles: true }));
|
|
313
288
|
end
|
|
314
289
|
end
|
|
315
290
|
end`.trim()
|
|
@@ -361,12 +336,8 @@ var clipboardSchema = {
|
|
|
361
336
|
source: `
|
|
362
337
|
behavior Clipboard(text, source, feedback, feedbackDuration)
|
|
363
338
|
init
|
|
364
|
-
if feedbackDuration is undefined
|
|
365
|
-
|
|
366
|
-
end
|
|
367
|
-
if source is undefined
|
|
368
|
-
set source to me
|
|
369
|
-
end
|
|
339
|
+
if feedbackDuration is undefined set element's feedbackDuration to 2000 end
|
|
340
|
+
if source is undefined set element's source to me end
|
|
370
341
|
end
|
|
371
342
|
on click
|
|
372
343
|
if text is not undefined
|
|
@@ -449,15 +420,9 @@ var autoDismissSchema = {
|
|
|
449
420
|
source: `
|
|
450
421
|
behavior AutoDismiss(delay, pauseOnHover, effect)
|
|
451
422
|
init
|
|
452
|
-
if delay is undefined
|
|
453
|
-
|
|
454
|
-
end
|
|
455
|
-
if pauseOnHover is undefined
|
|
456
|
-
set pauseOnHover to true
|
|
457
|
-
end
|
|
458
|
-
if effect is undefined
|
|
459
|
-
set effect to "none"
|
|
460
|
-
end
|
|
423
|
+
if delay is undefined set element's delay to 5000 end
|
|
424
|
+
if pauseOnHover is undefined set element's pauseOnHover to true end
|
|
425
|
+
if effect is undefined set element's effect to "none" end
|
|
461
426
|
js(me, delay, effect, pauseOnHover)
|
|
462
427
|
me.dispatchEvent(new CustomEvent('autodismiss:start', { bubbles: true }));
|
|
463
428
|
var remaining = delay;
|
|
@@ -533,9 +498,7 @@ var clickOutsideSchema = {
|
|
|
533
498
|
source: `
|
|
534
499
|
behavior ClickOutside(active)
|
|
535
500
|
init
|
|
536
|
-
if active is undefined
|
|
537
|
-
set active to true
|
|
538
|
-
end
|
|
501
|
+
if active is undefined set element's active to true end
|
|
539
502
|
end
|
|
540
503
|
on pointerdown from document
|
|
541
504
|
js(me, active, event)
|
|
@@ -546,10 +509,10 @@ behavior ClickOutside(active)
|
|
|
546
509
|
end
|
|
547
510
|
end
|
|
548
511
|
on clickoutside:activate
|
|
549
|
-
set active to true
|
|
512
|
+
set element's active to true
|
|
550
513
|
end
|
|
551
514
|
on clickoutside:deactivate
|
|
552
|
-
set active to false
|
|
515
|
+
set element's active to false
|
|
553
516
|
end
|
|
554
517
|
end`.trim()
|
|
555
518
|
};
|
|
@@ -594,12 +557,8 @@ var focusTrapSchema = {
|
|
|
594
557
|
source: `
|
|
595
558
|
behavior FocusTrap(active, initialFocus, returnFocus)
|
|
596
559
|
init
|
|
597
|
-
if active is undefined
|
|
598
|
-
|
|
599
|
-
end
|
|
600
|
-
if returnFocus is undefined
|
|
601
|
-
set returnFocus to true
|
|
602
|
-
end
|
|
560
|
+
if active is undefined set element's active to true end
|
|
561
|
+
if returnFocus is undefined set element's returnFocus to true end
|
|
603
562
|
js(me, active, initialFocus, returnFocus)
|
|
604
563
|
var FOCUSABLE = 'a[href],button:not(:disabled),input:not(:disabled),select:not(:disabled),textarea:not(:disabled),[tabindex]:not([tabindex="-1"])';
|
|
605
564
|
var isActive = false;
|
|
@@ -680,15 +639,9 @@ var scrollRevealSchema = {
|
|
|
680
639
|
source: `
|
|
681
640
|
behavior ScrollReveal(cls, threshold, once)
|
|
682
641
|
init
|
|
683
|
-
if cls is undefined
|
|
684
|
-
|
|
685
|
-
end
|
|
686
|
-
if threshold is undefined
|
|
687
|
-
set threshold to 0.1
|
|
688
|
-
end
|
|
689
|
-
if once is undefined
|
|
690
|
-
set once to true
|
|
691
|
-
end
|
|
642
|
+
if cls is undefined set element's cls to "revealed" end
|
|
643
|
+
if threshold is undefined set element's threshold to 0.1 end
|
|
644
|
+
if once is undefined set element's once to true end
|
|
692
645
|
js(me, cls, threshold, once)
|
|
693
646
|
var obs = new IntersectionObserver(function(entries) {
|
|
694
647
|
for (var i = 0; i < entries.length; i++) {
|
|
@@ -762,18 +715,10 @@ var tabsSchema = {
|
|
|
762
715
|
source: `
|
|
763
716
|
behavior Tabs(orientation, activeTab, wrap, activeClass)
|
|
764
717
|
init
|
|
765
|
-
if orientation is undefined
|
|
766
|
-
|
|
767
|
-
end
|
|
768
|
-
if
|
|
769
|
-
set activeTab to 0
|
|
770
|
-
end
|
|
771
|
-
if wrap is undefined
|
|
772
|
-
set wrap to true
|
|
773
|
-
end
|
|
774
|
-
if activeClass is undefined
|
|
775
|
-
set activeClass to "active"
|
|
776
|
-
end
|
|
718
|
+
if orientation is undefined set element's orientation to "horizontal" end
|
|
719
|
+
if activeTab is undefined set element's activeTab to 0 end
|
|
720
|
+
if wrap is undefined set element's wrap to true end
|
|
721
|
+
if activeClass is undefined set element's activeClass to "active" end
|
|
777
722
|
js(me, orientation, activeTab, wrap, activeClass)
|
|
778
723
|
var tabs = Array.from(me.querySelectorAll('[role="tab"]'));
|
|
779
724
|
var panels = Array.from(me.querySelectorAll('[role="tabpanel"]'));
|