@hyperfixi/behaviors 2.5.1 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +100 -0
  2. package/dist/all.browser.global.js +43 -40
  3. package/dist/all.browser.global.js.map +1 -1
  4. package/dist/autodismiss.browser.global.js +2 -2
  5. package/dist/autodismiss.browser.global.js.map +1 -1
  6. package/dist/behaviors/autodismiss.cjs +5 -54
  7. package/dist/behaviors/autodismiss.cjs.map +1 -1
  8. package/dist/behaviors/autodismiss.d.cts +3 -2
  9. package/dist/behaviors/autodismiss.d.ts +3 -2
  10. package/dist/behaviors/autodismiss.js +1 -1
  11. package/dist/behaviors/clickoutside.cjs +6 -28
  12. package/dist/behaviors/clickoutside.cjs.map +1 -1
  13. package/dist/behaviors/clickoutside.d.cts +3 -2
  14. package/dist/behaviors/clickoutside.d.ts +3 -2
  15. package/dist/behaviors/clickoutside.js +2 -2
  16. package/dist/behaviors/clipboard.cjs +30 -86
  17. package/dist/behaviors/clipboard.cjs.map +1 -1
  18. package/dist/behaviors/clipboard.d.cts +3 -2
  19. package/dist/behaviors/clipboard.d.ts +3 -2
  20. package/dist/behaviors/clipboard.js +2 -2
  21. package/dist/behaviors/draggable.cjs +6 -41
  22. package/dist/behaviors/draggable.cjs.map +1 -1
  23. package/dist/behaviors/draggable.d.cts +3 -3
  24. package/dist/behaviors/draggable.d.ts +3 -3
  25. package/dist/behaviors/draggable.js +2 -2
  26. package/dist/behaviors/focustrap.cjs +5 -81
  27. package/dist/behaviors/focustrap.cjs.map +1 -1
  28. package/dist/behaviors/focustrap.d.cts +3 -2
  29. package/dist/behaviors/focustrap.d.ts +3 -2
  30. package/dist/behaviors/focustrap.js +1 -1
  31. package/dist/behaviors/removable.d.cts +1 -1
  32. package/dist/behaviors/removable.d.ts +1 -1
  33. package/dist/behaviors/resizable.cjs +9 -49
  34. package/dist/behaviors/resizable.cjs.map +1 -1
  35. package/dist/behaviors/resizable.d.cts +3 -2
  36. package/dist/behaviors/resizable.d.ts +3 -2
  37. package/dist/behaviors/resizable.js +2 -2
  38. package/dist/behaviors/scrollreveal.cjs +5 -32
  39. package/dist/behaviors/scrollreveal.cjs.map +1 -1
  40. package/dist/behaviors/scrollreveal.d.cts +3 -2
  41. package/dist/behaviors/scrollreveal.d.ts +3 -2
  42. package/dist/behaviors/scrollreveal.js +1 -1
  43. package/dist/behaviors/sortable.cjs +8 -43
  44. package/dist/behaviors/sortable.cjs.map +1 -1
  45. package/dist/behaviors/sortable.d.cts +3 -2
  46. package/dist/behaviors/sortable.d.ts +3 -2
  47. package/dist/behaviors/sortable.js +2 -2
  48. package/dist/behaviors/tabs.cjs +5 -120
  49. package/dist/behaviors/tabs.cjs.map +1 -1
  50. package/dist/behaviors/tabs.d.cts +3 -2
  51. package/dist/behaviors/tabs.d.ts +3 -2
  52. package/dist/behaviors/tabs.js +1 -1
  53. package/dist/behaviors/toggleable.cjs +5 -27
  54. package/dist/behaviors/toggleable.cjs.map +1 -1
  55. package/dist/behaviors/toggleable.d.cts +3 -3
  56. package/dist/behaviors/toggleable.d.ts +3 -3
  57. package/dist/behaviors/toggleable.js +1 -1
  58. package/dist/{chunk-SLOXO6IY.js → chunk-26IX7QU7.js} +2 -2
  59. package/dist/{chunk-SLOXO6IY.js.map → chunk-26IX7QU7.js.map} +1 -1
  60. package/dist/chunk-2HUF6RMI.js +40 -0
  61. package/dist/chunk-2HUF6RMI.js.map +1 -0
  62. package/dist/{chunk-ZBSWTV6I.js → chunk-5LFOFVZ3.js} +5 -5
  63. package/dist/chunk-5LFOFVZ3.js.map +1 -0
  64. package/dist/{chunk-BBIIOGMF.js → chunk-6EG2MNC7.js} +6 -6
  65. package/dist/chunk-7NGOA3T5.js +40 -0
  66. package/dist/chunk-7NGOA3T5.js.map +1 -0
  67. package/dist/{chunk-ZZ2WSAX3.js → chunk-7TPDLB7W.js} +7 -29
  68. package/dist/chunk-7TPDLB7W.js.map +1 -0
  69. package/dist/chunk-CR3J7VV6.js +40 -0
  70. package/dist/chunk-CR3J7VV6.js.map +1 -0
  71. package/dist/chunk-EDBG2F57.js +40 -0
  72. package/dist/chunk-EDBG2F57.js.map +1 -0
  73. package/dist/{chunk-G6WR2AYR.js → chunk-FBQ3X3UY.js} +2 -2
  74. package/dist/chunk-FBQ3X3UY.js.map +1 -0
  75. package/dist/chunk-HX663BJ4.js +40 -0
  76. package/dist/chunk-HX663BJ4.js.map +1 -0
  77. package/dist/chunk-KROW43CG.js +40 -0
  78. package/dist/chunk-KROW43CG.js.map +1 -0
  79. package/dist/chunk-ORBJ7MRW.js +40 -0
  80. package/dist/chunk-ORBJ7MRW.js.map +1 -0
  81. package/dist/{chunk-V2M4W3LO.js → chunk-PDMOOWFW.js} +4 -4
  82. package/dist/chunk-PDMOOWFW.js.map +1 -0
  83. package/dist/chunk-SLSCZV4A.js +40 -0
  84. package/dist/chunk-SLSCZV4A.js.map +1 -0
  85. package/dist/chunk-WKBRZGGL.js +40 -0
  86. package/dist/chunk-WKBRZGGL.js.map +1 -0
  87. package/dist/{chunk-WOTZO7K4.js → chunk-YXS27XM6.js} +26 -23
  88. package/dist/chunk-YXS27XM6.js.map +1 -0
  89. package/dist/clickoutside.browser.global.js +3 -3
  90. package/dist/clickoutside.browser.global.js.map +1 -1
  91. package/dist/clipboard.browser.global.js +27 -24
  92. package/dist/clipboard.browser.global.js.map +1 -1
  93. package/dist/core.browser.global.js +3 -3
  94. package/dist/core.browser.global.js.map +1 -1
  95. package/dist/draggable.browser.global.js +2 -2
  96. package/dist/draggable.browser.global.js.map +1 -1
  97. package/dist/focustrap.browser.global.js +2 -2
  98. package/dist/focustrap.browser.global.js.map +1 -1
  99. package/dist/index.cjs +120 -563
  100. package/dist/index.cjs.map +1 -1
  101. package/dist/index.d.cts +41 -3
  102. package/dist/index.d.ts +41 -3
  103. package/dist/index.js +44 -16
  104. package/dist/index.js.map +1 -1
  105. package/dist/loaders.cjs +86 -563
  106. package/dist/loaders.cjs.map +1 -1
  107. package/dist/loaders.js +6 -6
  108. package/dist/registry.d.cts +1 -1
  109. package/dist/registry.d.ts +1 -1
  110. package/dist/resizable.browser.global.js +5 -5
  111. package/dist/resizable.browser.global.js.map +1 -1
  112. package/dist/resolver.browser.global.js +34 -31
  113. package/dist/resolver.browser.global.js.map +1 -1
  114. package/dist/schemas/index.cjs +34 -31
  115. package/dist/schemas/index.cjs.map +1 -1
  116. package/dist/schemas/index.d.cts +2 -2
  117. package/dist/schemas/index.d.ts +2 -2
  118. package/dist/schemas/index.js +5 -5
  119. package/dist/scrollreveal.browser.global.js +2 -2
  120. package/dist/scrollreveal.browser.global.js.map +1 -1
  121. package/dist/sortable.browser.global.js +4 -4
  122. package/dist/sortable.browser.global.js.map +1 -1
  123. package/dist/tabs.browser.global.js +2 -2
  124. package/dist/tabs.browser.global.js.map +1 -1
  125. package/dist/toggleable.browser.global.js +2 -2
  126. package/dist/toggleable.browser.global.js.map +1 -1
  127. package/dist/{types-BY-jB5FV.d.ts → types-DCCtVQS5.d.cts} +1 -1
  128. package/dist/{types-BY-jB5FV.d.cts → types-DCCtVQS5.d.ts} +1 -1
  129. package/package.json +4 -4
  130. package/src/behaviors/autodismiss.test.ts +15 -9
  131. package/src/behaviors/autodismiss.ts +15 -70
  132. package/src/behaviors/clickoutside.test.ts +17 -9
  133. package/src/behaviors/clickoutside.ts +13 -39
  134. package/src/behaviors/clipboard.test.ts +16 -10
  135. package/src/behaviors/clipboard.ts +15 -93
  136. package/src/behaviors/curated-runtime.test.ts +158 -0
  137. package/src/behaviors/draggable.ts +15 -59
  138. package/src/behaviors/experimental-runtime.test.ts +136 -0
  139. package/src/behaviors/focustrap.test.ts +15 -9
  140. package/src/behaviors/focustrap.ts +17 -121
  141. package/src/behaviors/integration.test.ts +9 -64
  142. package/src/behaviors/optional-runtime.test.ts +251 -0
  143. package/src/behaviors/resizable.ts +14 -61
  144. package/src/behaviors/scrollreveal.test.ts +17 -9
  145. package/src/behaviors/scrollreveal.ts +17 -41
  146. package/src/behaviors/sortable.ts +15 -58
  147. package/src/behaviors/tabs.test.ts +16 -10
  148. package/src/behaviors/tabs.ts +18 -160
  149. package/src/behaviors/toggleable.ts +14 -41
  150. package/src/curation.test.ts +45 -0
  151. package/src/curation.ts +58 -0
  152. package/src/index.ts +14 -0
  153. package/src/registry.test.ts +6 -11
  154. package/src/schemas/clickoutside.schema.ts +1 -1
  155. package/src/schemas/clipboard.schema.ts +25 -22
  156. package/src/schemas/draggable.schema.ts +2 -1
  157. package/src/schemas/resizable.schema.ts +5 -4
  158. package/src/schemas/sortable.schema.ts +4 -3
  159. package/dist/chunk-7O7UOSBH.js +0 -99
  160. package/dist/chunk-7O7UOSBH.js.map +0 -1
  161. package/dist/chunk-EKKJVXDZ.js +0 -67
  162. package/dist/chunk-EKKJVXDZ.js.map +0 -1
  163. package/dist/chunk-F3CASJ7Q.js +0 -116
  164. package/dist/chunk-F3CASJ7Q.js.map +0 -1
  165. package/dist/chunk-G6WR2AYR.js.map +0 -1
  166. package/dist/chunk-GALKOMJ5.js +0 -62
  167. package/dist/chunk-GALKOMJ5.js.map +0 -1
  168. package/dist/chunk-IMDFEGIT.js +0 -75
  169. package/dist/chunk-IMDFEGIT.js.map +0 -1
  170. package/dist/chunk-IT6TYVMW.js +0 -80
  171. package/dist/chunk-IT6TYVMW.js.map +0 -1
  172. package/dist/chunk-LQJOQTBZ.js +0 -89
  173. package/dist/chunk-LQJOQTBZ.js.map +0 -1
  174. package/dist/chunk-S4QDV2MH.js +0 -75
  175. package/dist/chunk-S4QDV2MH.js.map +0 -1
  176. package/dist/chunk-V2M4W3LO.js.map +0 -1
  177. package/dist/chunk-WOTZO7K4.js.map +0 -1
  178. package/dist/chunk-WPOQIMCC.js +0 -155
  179. package/dist/chunk-WPOQIMCC.js.map +0 -1
  180. package/dist/chunk-ZBSWTV6I.js.map +0 -1
  181. package/dist/chunk-ZZ2WSAX3.js.map +0 -1
  182. /package/dist/{chunk-BBIIOGMF.js.map → chunk-6EG2MNC7.js.map} +0 -0
@@ -1,75 +0,0 @@
1
- import {
2
- draggableSchema
3
- } from "./chunk-G6WR2AYR.js";
4
- import {
5
- resolveRuntime
6
- } from "./chunk-6TJXDCAQ.js";
7
-
8
- // src/behaviors/draggable.ts
9
- var draggableSource = draggableSchema.source;
10
- var draggableMetadata = draggableSchema;
11
- function installDraggable(element, params) {
12
- let dragHandle = element;
13
- if (params.dragHandle && params.dragHandle !== "me") {
14
- if (typeof params.dragHandle === "string") {
15
- const found = element.querySelector(params.dragHandle);
16
- if (found instanceof HTMLElement) dragHandle = found;
17
- } else if (params.dragHandle instanceof HTMLElement) {
18
- dragHandle = params.dragHandle;
19
- }
20
- }
21
- dragHandle.addEventListener("pointerdown", (e) => {
22
- e.preventDefault();
23
- e.stopPropagation();
24
- element.dispatchEvent(new CustomEvent("draggable:start", { bubbles: true }));
25
- const startX = element.offsetLeft;
26
- const startY = element.offsetTop;
27
- const xoff = e.clientX - startX;
28
- const yoff = e.clientY - startY;
29
- function onMove(ev) {
30
- element.style.left = `${ev.clientX - xoff}px`;
31
- element.style.top = `${ev.clientY - yoff}px`;
32
- element.dispatchEvent(new CustomEvent("draggable:move", { bubbles: true }));
33
- }
34
- function onUp() {
35
- document.removeEventListener("pointermove", onMove);
36
- document.removeEventListener("pointerup", onUp);
37
- element.dispatchEvent(new CustomEvent("draggable:end", { bubbles: true }));
38
- }
39
- document.addEventListener("pointermove", onMove);
40
- document.addEventListener("pointerup", onUp);
41
- });
42
- }
43
- async function registerDraggable(hyperfixi) {
44
- const hf = hyperfixi || resolveRuntime();
45
- if (!hf) {
46
- throw new Error(
47
- "LokaScript not found. Make sure @hyperfixi/core is loaded before registering behaviors."
48
- );
49
- }
50
- const syntheticNode = {
51
- type: "behavior",
52
- name: "Draggable",
53
- parameters: ["dragHandle"],
54
- eventHandlers: [],
55
- imperativeInstaller: installDraggable
56
- };
57
- const ctx = hf.createContext ? hf.createContext() : { locals: /* @__PURE__ */ new Map(), globals: /* @__PURE__ */ new Map() };
58
- await hf.execute(syntheticNode, ctx);
59
- }
60
- if (resolveRuntime()) {
61
- registerDraggable().catch(console.error);
62
- }
63
- var draggable_default = {
64
- source: draggableSchema.source,
65
- metadata: draggableSchema,
66
- register: registerDraggable
67
- };
68
-
69
- export {
70
- draggableSource,
71
- draggableMetadata,
72
- registerDraggable,
73
- draggable_default
74
- };
75
- //# sourceMappingURL=chunk-S4QDV2MH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/behaviors/draggable.ts"],"sourcesContent":["/**\n * Draggable Behavior — Imperative Implementation\n *\n * Makes elements draggable with pointer events.\n * Uses direct DOM APIs instead of compiling hyperscript source,\n * bypassing the complex repeat-until-event + wait-for async pattern.\n *\n * @example\n * ```html\n * <!-- Basic usage -->\n * <div _=\"install Draggable\">Drag me!</div>\n *\n * <!-- With custom drag handle -->\n * <div _=\"install Draggable(dragHandle: .titlebar)\">\n * <div class=\"titlebar\">Drag here</div>\n * <div class=\"content\">Content</div>\n * </div>\n * ```\n */\n\nimport { draggableSchema } from '../schemas/draggable.schema';\nimport type { LokaScriptInstance } from '../schemas/types';\nimport { resolveRuntime } from '../schemas/types';\n\n// Re-export schema-derived values for backwards compatibility\nexport const draggableSource = draggableSchema.source;\nexport const draggableMetadata = draggableSchema;\n\n/**\n * Imperative installer for Draggable behavior.\n * Called directly by the runtime when `install Draggable` is executed.\n */\nfunction installDraggable(element: HTMLElement, params: Record<string, any>): void {\n // Resolve drag handle: parameter value, CSS selector, or the element itself\n let dragHandle: HTMLElement = element;\n if (params.dragHandle && params.dragHandle !== 'me') {\n if (typeof params.dragHandle === 'string') {\n const found = element.querySelector(params.dragHandle);\n if (found instanceof HTMLElement) dragHandle = found;\n } else if (params.dragHandle instanceof HTMLElement) {\n dragHandle = params.dragHandle;\n }\n }\n\n dragHandle.addEventListener('pointerdown', (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n element.dispatchEvent(new CustomEvent('draggable:start', { bubbles: true }));\n\n const startX = element.offsetLeft;\n const startY = element.offsetTop;\n const xoff = e.clientX - startX;\n const yoff = e.clientY - startY;\n\n function onMove(ev: PointerEvent) {\n element.style.left = `${ev.clientX - xoff}px`;\n element.style.top = `${ev.clientY - yoff}px`;\n element.dispatchEvent(new CustomEvent('draggable:move', { bubbles: true }));\n }\n\n function onUp() {\n document.removeEventListener('pointermove', onMove);\n document.removeEventListener('pointerup', onUp);\n element.dispatchEvent(new CustomEvent('draggable:end', { bubbles: true }));\n }\n\n document.addEventListener('pointermove', onMove);\n document.addEventListener('pointerup', onUp);\n });\n}\n\n/**\n * Register the Draggable behavior with LokaScript.\n * Uses imperative installer via synthetic behavior node.\n */\nexport async function registerDraggable(hyperfixi?: LokaScriptInstance): Promise<void> {\n const hf = hyperfixi || resolveRuntime();\n\n if (!hf) {\n throw new Error(\n 'LokaScript not found. Make sure @hyperfixi/core is loaded before registering behaviors.'\n );\n }\n\n // Register via execute() with a synthetic behavior node containing the imperative installer.\n // The runtime detects imperativeInstaller and stores it directly in the behaviorRegistry.\n const syntheticNode = {\n type: 'behavior',\n name: 'Draggable',\n parameters: ['dragHandle'],\n eventHandlers: [],\n imperativeInstaller: installDraggable,\n };\n const ctx = hf.createContext ? hf.createContext() : { locals: new Map(), globals: new Map() };\n await hf.execute(syntheticNode, ctx);\n}\n\n// Auto-register when loaded as a script tag\nif (resolveRuntime()) {\n registerDraggable().catch(console.error);\n}\n\nexport default {\n source: draggableSchema.source,\n metadata: draggableSchema,\n register: registerDraggable,\n};\n"],"mappings":";;;;;;;;AAyBO,IAAM,kBAAkB,gBAAgB;AACxC,IAAM,oBAAoB;AAMjC,SAAS,iBAAiB,SAAsB,QAAmC;AAEjF,MAAI,aAA0B;AAC9B,MAAI,OAAO,cAAc,OAAO,eAAe,MAAM;AACnD,QAAI,OAAO,OAAO,eAAe,UAAU;AACzC,YAAM,QAAQ,QAAQ,cAAc,OAAO,UAAU;AACrD,UAAI,iBAAiB,YAAa,cAAa;AAAA,IACjD,WAAW,OAAO,sBAAsB,aAAa;AACnD,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF;AAEA,aAAW,iBAAiB,eAAe,CAAC,MAAoB;AAC9D,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,YAAQ,cAAc,IAAI,YAAY,mBAAmB,EAAE,SAAS,KAAK,CAAC,CAAC;AAE3E,UAAM,SAAS,QAAQ;AACvB,UAAM,SAAS,QAAQ;AACvB,UAAM,OAAO,EAAE,UAAU;AACzB,UAAM,OAAO,EAAE,UAAU;AAEzB,aAAS,OAAO,IAAkB;AAChC,cAAQ,MAAM,OAAO,GAAG,GAAG,UAAU,IAAI;AACzC,cAAQ,MAAM,MAAM,GAAG,GAAG,UAAU,IAAI;AACxC,cAAQ,cAAc,IAAI,YAAY,kBAAkB,EAAE,SAAS,KAAK,CAAC,CAAC;AAAA,IAC5E;AAEA,aAAS,OAAO;AACd,eAAS,oBAAoB,eAAe,MAAM;AAClD,eAAS,oBAAoB,aAAa,IAAI;AAC9C,cAAQ,cAAc,IAAI,YAAY,iBAAiB,EAAE,SAAS,KAAK,CAAC,CAAC;AAAA,IAC3E;AAEA,aAAS,iBAAiB,eAAe,MAAM;AAC/C,aAAS,iBAAiB,aAAa,IAAI;AAAA,EAC7C,CAAC;AACH;AAMA,eAAsB,kBAAkB,WAA+C;AACrF,QAAM,KAAK,aAAa,eAAe;AAEvC,MAAI,CAAC,IAAI;AACP,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAIA,QAAM,gBAAgB;AAAA,IACpB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC,YAAY;AAAA,IACzB,eAAe,CAAC;AAAA,IAChB,qBAAqB;AAAA,EACvB;AACA,QAAM,MAAM,GAAG,gBAAgB,GAAG,cAAc,IAAI,EAAE,QAAQ,oBAAI,IAAI,GAAG,SAAS,oBAAI,IAAI,EAAE;AAC5F,QAAM,GAAG,QAAQ,eAAe,GAAG;AACrC;AAGA,IAAI,eAAe,GAAG;AACpB,oBAAkB,EAAE,MAAM,QAAQ,KAAK;AACzC;AAEA,IAAO,oBAAQ;AAAA,EACb,QAAQ,gBAAgB;AAAA,EACxB,UAAU;AAAA,EACV,UAAU;AACZ;","names":[]}
@@ -1 +0,0 @@
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: '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 closest <li/> to the target\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) 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"],"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,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,KAsBL,KAAK;AACV;","names":[]}
@@ -1 +0,0 @@
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,155 +0,0 @@
1
- import {
2
- tabsSchema
3
- } from "./chunk-HQDYH45I.js";
4
- import {
5
- resolveRuntime
6
- } from "./chunk-6TJXDCAQ.js";
7
-
8
- // src/behaviors/tabs.ts
9
- var tabsSource = tabsSchema.source;
10
- var tabsMetadata = tabsSchema;
11
- var idCounter = 0;
12
- function ensureId(el, prefix) {
13
- if (!el.id) {
14
- el.id = `${prefix}-${++idCounter}`;
15
- }
16
- return el.id;
17
- }
18
- function installTabs(element, params) {
19
- const orientation = params.orientation === "vertical" ? "vertical" : "horizontal";
20
- const wrap = params.wrap !== false;
21
- const activeClass = params.activeClass || "active";
22
- const initialIndex = typeof params.activeTab === "number" ? params.activeTab : 0;
23
- const tabs = Array.from(element.querySelectorAll('[role="tab"]'));
24
- const panels = Array.from(element.querySelectorAll('[role="tabpanel"]'));
25
- if (tabs.length === 0 || panels.length === 0) return;
26
- const tablist = element.querySelector('[role="tablist"]') || tabs[0].parentElement;
27
- if (tablist && !tablist.getAttribute("role")) {
28
- tablist.setAttribute("role", "tablist");
29
- }
30
- if (tablist) {
31
- tablist.setAttribute("aria-orientation", orientation);
32
- }
33
- const count = Math.min(tabs.length, panels.length);
34
- for (let i = 0; i < count; i++) {
35
- const tabId = ensureId(tabs[i], "tab");
36
- const panelId = ensureId(panels[i], "tabpanel");
37
- tabs[i].setAttribute("aria-controls", panelId);
38
- panels[i].setAttribute("aria-labelledby", tabId);
39
- }
40
- let currentIndex = -1;
41
- function selectTab(index, previousIndex) {
42
- if (index === previousIndex || index < 0 || index >= count) return false;
43
- const detail = {
44
- tab: tabs[index],
45
- panel: panels[index],
46
- index,
47
- previousIndex
48
- };
49
- const changeEvent = new CustomEvent("tabs:change", {
50
- bubbles: true,
51
- cancelable: true,
52
- detail
53
- });
54
- element.dispatchEvent(changeEvent);
55
- if (changeEvent.defaultPrevented) return false;
56
- if (previousIndex >= 0 && previousIndex < count) {
57
- tabs[previousIndex].setAttribute("aria-selected", "false");
58
- tabs[previousIndex].setAttribute("tabindex", "-1");
59
- tabs[previousIndex].classList.remove(activeClass);
60
- panels[previousIndex].setAttribute("aria-hidden", "true");
61
- panels[previousIndex].classList.remove(activeClass);
62
- }
63
- tabs[index].setAttribute("aria-selected", "true");
64
- tabs[index].setAttribute("tabindex", "0");
65
- tabs[index].classList.add(activeClass);
66
- panels[index].setAttribute("aria-hidden", "false");
67
- panels[index].classList.add(activeClass);
68
- currentIndex = index;
69
- element.dispatchEvent(new CustomEvent("tabs:changed", { bubbles: true, detail }));
70
- return true;
71
- }
72
- for (let i = 0; i < count; i++) {
73
- tabs[i].setAttribute("aria-selected", "false");
74
- tabs[i].setAttribute("tabindex", "-1");
75
- tabs[i].classList.remove(activeClass);
76
- panels[i].setAttribute("aria-hidden", "true");
77
- panels[i].classList.remove(activeClass);
78
- }
79
- const clamped = Math.max(0, Math.min(initialIndex, count - 1));
80
- tabs[clamped].setAttribute("aria-selected", "true");
81
- tabs[clamped].setAttribute("tabindex", "0");
82
- tabs[clamped].classList.add(activeClass);
83
- panels[clamped].setAttribute("aria-hidden", "false");
84
- panels[clamped].classList.add(activeClass);
85
- currentIndex = clamped;
86
- for (let i = 0; i < count; i++) {
87
- tabs[i].addEventListener("click", () => {
88
- selectTab(i, currentIndex);
89
- tabs[i].focus();
90
- });
91
- }
92
- const keyTarget = tablist || element;
93
- keyTarget.addEventListener("keydown", (e) => {
94
- const isHorizontal = orientation === "horizontal";
95
- const nextKey = isHorizontal ? "ArrowRight" : "ArrowDown";
96
- const prevKey = isHorizontal ? "ArrowLeft" : "ArrowUp";
97
- let nextIndex = null;
98
- if (e.key === nextKey) {
99
- nextIndex = currentIndex + 1;
100
- if (nextIndex >= count) nextIndex = wrap ? 0 : null;
101
- } else if (e.key === prevKey) {
102
- nextIndex = currentIndex - 1;
103
- if (nextIndex < 0) nextIndex = wrap ? count - 1 : null;
104
- } else if (e.key === "Home") {
105
- nextIndex = 0;
106
- } else if (e.key === "End") {
107
- nextIndex = count - 1;
108
- }
109
- if (nextIndex !== null) {
110
- e.preventDefault();
111
- if (selectTab(nextIndex, currentIndex)) {
112
- tabs[nextIndex].focus();
113
- }
114
- }
115
- });
116
- element.addEventListener("tabs:select", ((e) => {
117
- const index = e.detail?.index;
118
- if (typeof index === "number") {
119
- selectTab(index, currentIndex);
120
- }
121
- }));
122
- }
123
- async function registerTabs(hyperfixi) {
124
- const hf = hyperfixi || resolveRuntime();
125
- if (!hf) {
126
- throw new Error(
127
- "LokaScript not found. Make sure @hyperfixi/core is loaded before registering behaviors."
128
- );
129
- }
130
- const syntheticNode = {
131
- type: "behavior",
132
- name: "Tabs",
133
- parameters: ["orientation", "activeTab", "wrap", "activeClass"],
134
- eventHandlers: [],
135
- imperativeInstaller: installTabs
136
- };
137
- const ctx = hf.createContext ? hf.createContext() : { locals: /* @__PURE__ */ new Map(), globals: /* @__PURE__ */ new Map() };
138
- await hf.execute(syntheticNode, ctx);
139
- }
140
- if (resolveRuntime()) {
141
- registerTabs().catch(console.error);
142
- }
143
- var tabs_default = {
144
- source: tabsSchema.source,
145
- metadata: tabsSchema,
146
- register: registerTabs
147
- };
148
-
149
- export {
150
- tabsSource,
151
- tabsMetadata,
152
- registerTabs,
153
- tabs_default
154
- };
155
- //# sourceMappingURL=chunk-WPOQIMCC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/behaviors/tabs.ts"],"sourcesContent":["/**\n * Tabs Behavior — Imperative Implementation\n *\n * WAI-ARIA compliant tabs with roving tabindex keyboard navigation.\n * Auto-wires role, aria-selected, aria-controls, and aria-labelledby.\n */\n\nimport { tabsSchema } from '../schemas/tabs.schema';\nimport type { LokaScriptInstance } from '../schemas/types';\nimport { resolveRuntime } from '../schemas/types';\n\nexport const tabsSource = tabsSchema.source;\nexport const tabsMetadata = tabsSchema;\n\nlet idCounter = 0;\n\nfunction ensureId(el: HTMLElement, prefix: string): string {\n if (!el.id) {\n el.id = `${prefix}-${++idCounter}`;\n }\n return el.id;\n}\n\n/**\n * Imperative installer for Tabs behavior.\n */\nfunction installTabs(element: HTMLElement, params: Record<string, any>): void {\n const orientation = params.orientation === 'vertical' ? 'vertical' : 'horizontal';\n const wrap = params.wrap !== false;\n const activeClass = (params.activeClass as string) || 'active';\n const initialIndex = typeof params.activeTab === 'number' ? params.activeTab : 0;\n\n // Discover tabs and panels\n const tabs = Array.from(element.querySelectorAll<HTMLElement>('[role=\"tab\"]'));\n const panels = Array.from(element.querySelectorAll<HTMLElement>('[role=\"tabpanel\"]'));\n\n if (tabs.length === 0 || panels.length === 0) return;\n\n // Find or mark the tablist\n const tablist = element.querySelector<HTMLElement>('[role=\"tablist\"]') || tabs[0].parentElement;\n if (tablist && !tablist.getAttribute('role')) {\n tablist.setAttribute('role', 'tablist');\n }\n if (tablist) {\n tablist.setAttribute('aria-orientation', orientation);\n }\n\n // Wire IDs, aria-controls, aria-labelledby\n const count = Math.min(tabs.length, panels.length);\n for (let i = 0; i < count; i++) {\n const tabId = ensureId(tabs[i], 'tab');\n const panelId = ensureId(panels[i], 'tabpanel');\n tabs[i].setAttribute('aria-controls', panelId);\n panels[i].setAttribute('aria-labelledby', tabId);\n }\n\n let currentIndex = -1;\n\n function selectTab(index: number, previousIndex: number): boolean {\n if (index === previousIndex || index < 0 || index >= count) return false;\n\n const detail = {\n tab: tabs[index],\n panel: panels[index],\n index,\n previousIndex,\n };\n\n // Cancelable before-event\n const changeEvent = new CustomEvent('tabs:change', {\n bubbles: true,\n cancelable: true,\n detail,\n });\n element.dispatchEvent(changeEvent);\n if (changeEvent.defaultPrevented) return false;\n\n // Deactivate previous\n if (previousIndex >= 0 && previousIndex < count) {\n tabs[previousIndex].setAttribute('aria-selected', 'false');\n tabs[previousIndex].setAttribute('tabindex', '-1');\n tabs[previousIndex].classList.remove(activeClass);\n panels[previousIndex].setAttribute('aria-hidden', 'true');\n panels[previousIndex].classList.remove(activeClass);\n }\n\n // Activate new\n tabs[index].setAttribute('aria-selected', 'true');\n tabs[index].setAttribute('tabindex', '0');\n tabs[index].classList.add(activeClass);\n panels[index].setAttribute('aria-hidden', 'false');\n panels[index].classList.add(activeClass);\n\n currentIndex = index;\n\n element.dispatchEvent(new CustomEvent('tabs:changed', { bubbles: true, detail }));\n return true;\n }\n\n // Initialize all tabs as inactive, then activate initial\n for (let i = 0; i < count; i++) {\n tabs[i].setAttribute('aria-selected', 'false');\n tabs[i].setAttribute('tabindex', '-1');\n tabs[i].classList.remove(activeClass);\n panels[i].setAttribute('aria-hidden', 'true');\n panels[i].classList.remove(activeClass);\n }\n\n const clamped = Math.max(0, Math.min(initialIndex, count - 1));\n // Directly activate without firing change event on init\n tabs[clamped].setAttribute('aria-selected', 'true');\n tabs[clamped].setAttribute('tabindex', '0');\n tabs[clamped].classList.add(activeClass);\n panels[clamped].setAttribute('aria-hidden', 'false');\n panels[clamped].classList.add(activeClass);\n currentIndex = clamped;\n\n // Click handler\n for (let i = 0; i < count; i++) {\n tabs[i].addEventListener('click', () => {\n selectTab(i, currentIndex);\n tabs[i].focus();\n });\n }\n\n // Keyboard handler on tablist\n const keyTarget = tablist || element;\n keyTarget.addEventListener('keydown', (e: KeyboardEvent) => {\n const isHorizontal = orientation === 'horizontal';\n const nextKey = isHorizontal ? 'ArrowRight' : 'ArrowDown';\n const prevKey = isHorizontal ? 'ArrowLeft' : 'ArrowUp';\n\n let nextIndex: number | null = null;\n\n if (e.key === nextKey) {\n nextIndex = currentIndex + 1;\n if (nextIndex >= count) nextIndex = wrap ? 0 : null;\n } else if (e.key === prevKey) {\n nextIndex = currentIndex - 1;\n if (nextIndex < 0) nextIndex = wrap ? count - 1 : null;\n } else if (e.key === 'Home') {\n nextIndex = 0;\n } else if (e.key === 'End') {\n nextIndex = count - 1;\n }\n\n if (nextIndex !== null) {\n e.preventDefault();\n if (selectTab(nextIndex, currentIndex)) {\n tabs[nextIndex].focus();\n }\n }\n });\n\n // Programmatic tab selection\n element.addEventListener('tabs:select', ((e: CustomEvent) => {\n const index = e.detail?.index;\n if (typeof index === 'number') {\n selectTab(index, currentIndex);\n }\n }) as EventListener);\n}\n\n/**\n * Register the Tabs behavior with LokaScript.\n */\nexport async function registerTabs(hyperfixi?: LokaScriptInstance): Promise<void> {\n const hf = hyperfixi || resolveRuntime();\n\n if (!hf) {\n throw new Error(\n 'LokaScript not found. Make sure @hyperfixi/core is loaded before registering behaviors.'\n );\n }\n\n const syntheticNode = {\n type: 'behavior',\n name: 'Tabs',\n parameters: ['orientation', 'activeTab', 'wrap', 'activeClass'],\n eventHandlers: [],\n imperativeInstaller: installTabs,\n };\n const ctx = hf.createContext ? hf.createContext() : { locals: new Map(), globals: new Map() };\n await hf.execute(syntheticNode, ctx);\n}\n\n// Auto-register when loaded as a script tag\nif (resolveRuntime()) {\n registerTabs().catch(console.error);\n}\n\nexport default {\n source: tabsSchema.source,\n metadata: tabsSchema,\n register: registerTabs,\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
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: '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) 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 style.width to newWidth + \"px\"\n set my style.height to newHeight + \"px\"\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,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,EA0BR,KAAK;AACP;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/behaviors/clickoutside.ts"],"sourcesContent":["/**\n * ClickOutside Behavior — Imperative Implementation\n *\n * Fires a clickoutside event when the user clicks outside the element.\n * Uses pointerdown instead of click to avoid timing issues.\n */\n\nimport { clickOutsideSchema } from '../schemas/clickoutside.schema';\nimport type { LokaScriptInstance } from '../schemas/types';\nimport { resolveRuntime } from '../schemas/types';\n\n// Re-export schema-derived values\nexport const clickOutsideSource = clickOutsideSchema.source;\nexport const clickOutsideMetadata = clickOutsideSchema;\n\n/**\n * Imperative installer for ClickOutside behavior.\n */\nfunction installClickOutside(element: HTMLElement, params: Record<string, any>): void {\n let active = params.active !== false;\n\n function onPointerDown(e: Event) {\n // Auto-cleanup if element has been removed from DOM\n if (!element.isConnected) {\n document.removeEventListener('pointerdown', onPointerDown);\n return;\n }\n\n if (active && !element.contains(e.target as Node)) {\n element.dispatchEvent(new CustomEvent('clickoutside', { bubbles: true }));\n }\n }\n\n document.addEventListener('pointerdown', onPointerDown);\n\n // Programmatic activation/deactivation via custom events\n element.addEventListener('clickoutside:activate', () => {\n active = true;\n });\n element.addEventListener('clickoutside:deactivate', () => {\n active = false;\n });\n}\n\n/**\n * Register the ClickOutside behavior with LokaScript.\n */\nexport async function registerClickOutside(hyperfixi?: LokaScriptInstance): Promise<void> {\n const hf = hyperfixi || resolveRuntime();\n\n if (!hf) {\n throw new Error(\n 'LokaScript not found. Make sure @hyperfixi/core is loaded before registering behaviors.'\n );\n }\n\n const syntheticNode = {\n type: 'behavior',\n name: 'ClickOutside',\n parameters: ['active'],\n eventHandlers: [],\n imperativeInstaller: installClickOutside,\n };\n const ctx = hf.createContext ? hf.createContext() : { locals: new Map(), globals: new Map() };\n await hf.execute(syntheticNode, ctx);\n}\n\n// Auto-register when loaded as a script tag\nif (resolveRuntime()) {\n registerClickOutside().catch(console.error);\n}\n\nexport default {\n source: clickOutsideSchema.source,\n metadata: clickOutsideSchema,\n register: registerClickOutside,\n};\n"],"mappings":";;;;;;;;AAYO,IAAM,qBAAqB,mBAAmB;AAC9C,IAAM,uBAAuB;AAKpC,SAAS,oBAAoB,SAAsB,QAAmC;AACpF,MAAI,SAAS,OAAO,WAAW;AAE/B,WAAS,cAAc,GAAU;AAE/B,QAAI,CAAC,QAAQ,aAAa;AACxB,eAAS,oBAAoB,eAAe,aAAa;AACzD;AAAA,IACF;AAEA,QAAI,UAAU,CAAC,QAAQ,SAAS,EAAE,MAAc,GAAG;AACjD,cAAQ,cAAc,IAAI,YAAY,gBAAgB,EAAE,SAAS,KAAK,CAAC,CAAC;AAAA,IAC1E;AAAA,EACF;AAEA,WAAS,iBAAiB,eAAe,aAAa;AAGtD,UAAQ,iBAAiB,yBAAyB,MAAM;AACtD,aAAS;AAAA,EACX,CAAC;AACD,UAAQ,iBAAiB,2BAA2B,MAAM;AACxD,aAAS;AAAA,EACX,CAAC;AACH;AAKA,eAAsB,qBAAqB,WAA+C;AACxF,QAAM,KAAK,aAAa,eAAe;AAEvC,MAAI,CAAC,IAAI;AACP,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB;AAAA,IACpB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC,QAAQ;AAAA,IACrB,eAAe,CAAC;AAAA,IAChB,qBAAqB;AAAA,EACvB;AACA,QAAM,MAAM,GAAG,gBAAgB,GAAG,cAAc,IAAI,EAAE,QAAQ,oBAAI,IAAI,GAAG,SAAS,oBAAI,IAAI,EAAE;AAC5F,QAAM,GAAG,QAAQ,eAAe,GAAG;AACrC;AAGA,IAAI,eAAe,GAAG;AACpB,uBAAqB,EAAE,MAAM,QAAQ,KAAK;AAC5C;AAEA,IAAO,uBAAQ;AAAA,EACb,QAAQ,mBAAmB;AAAA,EAC3B,UAAU;AAAA,EACV,UAAU;AACZ;","names":[]}