@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 +0,0 @@
1
- {"version":3,"sources":["../src/behaviors/clipboard.ts"],"sourcesContent":["/**\n * Clipboard Behavior — Imperative Implementation\n *\n * Copies text to clipboard on click with visual feedback.\n * Uses navigator.clipboard.writeText() with execCommand fallback.\n */\n\nimport { clipboardSchema } from '../schemas/clipboard.schema';\nimport type { LokaScriptInstance } from '../schemas/types';\nimport { resolveRuntime } from '../schemas/types';\n\n// Re-export schema-derived values\nexport const clipboardSource = clipboardSchema.source;\nexport const clipboardMetadata = clipboardSchema;\n\n/**\n * Copy text to clipboard using the modern Clipboard API,\n * falling back to execCommand for older browsers.\n */\nasync function copyToClipboard(text: string): Promise<void> {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n\n // Fallback: temporary textarea + execCommand\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n try {\n document.execCommand('copy');\n } finally {\n document.body.removeChild(textarea);\n }\n}\n\n/**\n * Resolve a selector parameter to an HTMLElement.\n */\nfunction resolveElement(element: HTMLElement, param: unknown): HTMLElement | null {\n if (!param || param === 'me') return element;\n if (param instanceof HTMLElement) return param;\n if (typeof param === 'string') {\n return (\n (element.querySelector(param) as HTMLElement) ||\n (document.querySelector(param) as HTMLElement) ||\n null\n );\n }\n return null;\n}\n\n/**\n * Imperative installer for Clipboard behavior.\n */\nfunction installClipboard(element: HTMLElement, params: Record<string, any>): void {\n const feedbackDuration =\n typeof params.feedbackDuration === 'number' ? params.feedbackDuration : 2000;\n\n element.addEventListener('click', async () => {\n // Determine text to copy\n let copyText: string;\n if (params.text != null) {\n copyText = String(params.text);\n } else {\n const sourceEl = resolveElement(element, params.source) || element;\n copyText = (sourceEl as HTMLInputElement).value ?? sourceEl.textContent ?? '';\n }\n\n try {\n await copyToClipboard(copyText);\n\n // Show feedback\n const feedbackEl = resolveElement(element, params.feedback) || element;\n feedbackEl.classList.add('copied');\n setTimeout(() => feedbackEl.classList.remove('copied'), feedbackDuration);\n\n element.dispatchEvent(\n new CustomEvent('clipboard:copied', {\n bubbles: true,\n detail: { text: copyText },\n })\n );\n } catch (error) {\n element.dispatchEvent(\n new CustomEvent('clipboard:error', {\n bubbles: true,\n detail: { error },\n })\n );\n }\n });\n}\n\n/**\n * Register the Clipboard behavior with LokaScript.\n */\nexport async function registerClipboard(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: 'Clipboard',\n parameters: ['text', 'source', 'feedback', 'feedbackDuration'],\n eventHandlers: [],\n imperativeInstaller: installClipboard,\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 registerClipboard().catch(console.error);\n}\n\nexport default {\n source: clipboardSchema.source,\n metadata: clipboardSchema,\n register: registerClipboard,\n};\n"],"mappings":";;;;;;;;AAYO,IAAM,kBAAkB,gBAAgB;AACxC,IAAM,oBAAoB;AAMjC,eAAe,gBAAgB,MAA6B;AAC1D,MAAI,UAAU,WAAW,WAAW;AAClC,UAAM,UAAU,UAAU,UAAU,IAAI;AACxC;AAAA,EACF;AAGA,QAAM,WAAW,SAAS,cAAc,UAAU;AAClD,WAAS,QAAQ;AACjB,WAAS,MAAM,WAAW;AAC1B,WAAS,MAAM,UAAU;AACzB,WAAS,KAAK,YAAY,QAAQ;AAClC,WAAS,OAAO;AAChB,MAAI;AACF,aAAS,YAAY,MAAM;AAAA,EAC7B,UAAE;AACA,aAAS,KAAK,YAAY,QAAQ;AAAA,EACpC;AACF;AAKA,SAAS,eAAe,SAAsB,OAAoC;AAChF,MAAI,CAAC,SAAS,UAAU,KAAM,QAAO;AACrC,MAAI,iBAAiB,YAAa,QAAO;AACzC,MAAI,OAAO,UAAU,UAAU;AAC7B,WACG,QAAQ,cAAc,KAAK,KAC3B,SAAS,cAAc,KAAK,KAC7B;AAAA,EAEJ;AACA,SAAO;AACT;AAKA,SAAS,iBAAiB,SAAsB,QAAmC;AACjF,QAAM,mBACJ,OAAO,OAAO,qBAAqB,WAAW,OAAO,mBAAmB;AAE1E,UAAQ,iBAAiB,SAAS,YAAY;AAE5C,QAAI;AACJ,QAAI,OAAO,QAAQ,MAAM;AACvB,iBAAW,OAAO,OAAO,IAAI;AAAA,IAC/B,OAAO;AACL,YAAM,WAAW,eAAe,SAAS,OAAO,MAAM,KAAK;AAC3D,iBAAY,SAA8B,SAAS,SAAS,eAAe;AAAA,IAC7E;AAEA,QAAI;AACF,YAAM,gBAAgB,QAAQ;AAG9B,YAAM,aAAa,eAAe,SAAS,OAAO,QAAQ,KAAK;AAC/D,iBAAW,UAAU,IAAI,QAAQ;AACjC,iBAAW,MAAM,WAAW,UAAU,OAAO,QAAQ,GAAG,gBAAgB;AAExE,cAAQ;AAAA,QACN,IAAI,YAAY,oBAAoB;AAAA,UAClC,SAAS;AAAA,UACT,QAAQ,EAAE,MAAM,SAAS;AAAA,QAC3B,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,IAAI,YAAY,mBAAmB;AAAA,UACjC,SAAS;AAAA,UACT,QAAQ,EAAE,MAAM;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAKA,eAAsB,kBAAkB,WAA+C;AACrF,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,UAAU,YAAY,kBAAkB;AAAA,IAC7D,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,67 +0,0 @@
1
- import {
2
- scrollRevealSchema
3
- } from "./chunk-URZGNPTQ.js";
4
- import {
5
- resolveRuntime
6
- } from "./chunk-6TJXDCAQ.js";
7
-
8
- // src/behaviors/scrollreveal.ts
9
- var scrollRevealSource = scrollRevealSchema.source;
10
- var scrollRevealMetadata = scrollRevealSchema;
11
- function installScrollReveal(element, params) {
12
- const cls = typeof params.cls === "string" ? params.cls : "revealed";
13
- const threshold = typeof params.threshold === "number" ? params.threshold : 0.1;
14
- const once = params.once !== false;
15
- const rootMargin = typeof params.rootMargin === "string" ? params.rootMargin : "0px";
16
- const observer = new IntersectionObserver(
17
- (entries) => {
18
- for (const entry of entries) {
19
- if (entry.isIntersecting) {
20
- element.classList.add(cls);
21
- element.dispatchEvent(new CustomEvent("scrollreveal:enter", { bubbles: true }));
22
- if (once) {
23
- observer.disconnect();
24
- }
25
- } else if (!once) {
26
- element.classList.remove(cls);
27
- element.dispatchEvent(new CustomEvent("scrollreveal:exit", { bubbles: true }));
28
- }
29
- }
30
- },
31
- { threshold, rootMargin }
32
- );
33
- observer.observe(element);
34
- }
35
- async function registerScrollReveal(hyperfixi) {
36
- const hf = hyperfixi || resolveRuntime();
37
- if (!hf) {
38
- throw new Error(
39
- "LokaScript not found. Make sure @hyperfixi/core is loaded before registering behaviors."
40
- );
41
- }
42
- const syntheticNode = {
43
- type: "behavior",
44
- name: "ScrollReveal",
45
- parameters: ["cls", "threshold", "once", "rootMargin"],
46
- eventHandlers: [],
47
- imperativeInstaller: installScrollReveal
48
- };
49
- const ctx = hf.createContext ? hf.createContext() : { locals: /* @__PURE__ */ new Map(), globals: /* @__PURE__ */ new Map() };
50
- await hf.execute(syntheticNode, ctx);
51
- }
52
- if (resolveRuntime()) {
53
- registerScrollReveal().catch(console.error);
54
- }
55
- var scrollreveal_default = {
56
- source: scrollRevealSchema.source,
57
- metadata: scrollRevealSchema,
58
- register: registerScrollReveal
59
- };
60
-
61
- export {
62
- scrollRevealSource,
63
- scrollRevealMetadata,
64
- registerScrollReveal,
65
- scrollreveal_default
66
- };
67
- //# sourceMappingURL=chunk-EKKJVXDZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/behaviors/scrollreveal.ts"],"sourcesContent":["/**\n * ScrollReveal Behavior — Imperative Implementation\n *\n * Adds a class or fires events when the element enters or exits the viewport.\n * Uses the IntersectionObserver web standard API.\n */\n\nimport { scrollRevealSchema } from '../schemas/scrollreveal.schema';\nimport type { LokaScriptInstance } from '../schemas/types';\nimport { resolveRuntime } from '../schemas/types';\n\n// Re-export schema-derived values\nexport const scrollRevealSource = scrollRevealSchema.source;\nexport const scrollRevealMetadata = scrollRevealSchema;\n\n/**\n * Imperative installer for ScrollReveal behavior.\n */\nfunction installScrollReveal(element: HTMLElement, params: Record<string, any>): void {\n const cls = typeof params.cls === 'string' ? params.cls : 'revealed';\n const threshold = typeof params.threshold === 'number' ? params.threshold : 0.1;\n const once = params.once !== false;\n const rootMargin = typeof params.rootMargin === 'string' ? params.rootMargin : '0px';\n\n const observer = new IntersectionObserver(\n entries => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n element.classList.add(cls);\n element.dispatchEvent(new CustomEvent('scrollreveal:enter', { bubbles: true }));\n if (once) {\n observer.disconnect();\n }\n } else if (!once) {\n element.classList.remove(cls);\n element.dispatchEvent(new CustomEvent('scrollreveal:exit', { bubbles: true }));\n }\n }\n },\n { threshold, rootMargin }\n );\n\n observer.observe(element);\n}\n\n/**\n * Register the ScrollReveal behavior with LokaScript.\n */\nexport async function registerScrollReveal(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: 'ScrollReveal',\n parameters: ['cls', 'threshold', 'once', 'rootMargin'],\n eventHandlers: [],\n imperativeInstaller: installScrollReveal,\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 registerScrollReveal().catch(console.error);\n}\n\nexport default {\n source: scrollRevealSchema.source,\n metadata: scrollRevealSchema,\n register: registerScrollReveal,\n};\n"],"mappings":";;;;;;;;AAYO,IAAM,qBAAqB,mBAAmB;AAC9C,IAAM,uBAAuB;AAKpC,SAAS,oBAAoB,SAAsB,QAAmC;AACpF,QAAM,MAAM,OAAO,OAAO,QAAQ,WAAW,OAAO,MAAM;AAC1D,QAAM,YAAY,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AAC5E,QAAM,OAAO,OAAO,SAAS;AAC7B,QAAM,aAAa,OAAO,OAAO,eAAe,WAAW,OAAO,aAAa;AAE/E,QAAM,WAAW,IAAI;AAAA,IACnB,aAAW;AACT,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,gBAAgB;AACxB,kBAAQ,UAAU,IAAI,GAAG;AACzB,kBAAQ,cAAc,IAAI,YAAY,sBAAsB,EAAE,SAAS,KAAK,CAAC,CAAC;AAC9E,cAAI,MAAM;AACR,qBAAS,WAAW;AAAA,UACtB;AAAA,QACF,WAAW,CAAC,MAAM;AAChB,kBAAQ,UAAU,OAAO,GAAG;AAC5B,kBAAQ,cAAc,IAAI,YAAY,qBAAqB,EAAE,SAAS,KAAK,CAAC,CAAC;AAAA,QAC/E;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,WAAW,WAAW;AAAA,EAC1B;AAEA,WAAS,QAAQ,OAAO;AAC1B;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,OAAO,aAAa,QAAQ,YAAY;AAAA,IACrD,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":[]}
@@ -1,116 +0,0 @@
1
- import {
2
- focusTrapSchema
3
- } from "./chunk-OJ3YWO3W.js";
4
- import {
5
- resolveRuntime
6
- } from "./chunk-6TJXDCAQ.js";
7
-
8
- // src/behaviors/focustrap.ts
9
- var focusTrapSource = focusTrapSchema.source;
10
- var focusTrapMetadata = focusTrapSchema;
11
- var FOCUSABLE_SELECTOR = [
12
- "a[href]",
13
- "button:not(:disabled)",
14
- "input:not(:disabled)",
15
- "select:not(:disabled)",
16
- "textarea:not(:disabled)",
17
- '[tabindex]:not([tabindex="-1"])'
18
- ].join(", ");
19
- function resolveElement(container, param) {
20
- if (!param) return null;
21
- if (param instanceof HTMLElement) return param;
22
- if (typeof param === "string") {
23
- return container.querySelector(param) || document.querySelector(param) || null;
24
- }
25
- return null;
26
- }
27
- function installFocusTrap(element, params) {
28
- const returnFocus = params.returnFocus !== false;
29
- let isActive = false;
30
- let previouslyFocused = null;
31
- function getFocusableElements() {
32
- return Array.from(element.querySelectorAll(FOCUSABLE_SELECTOR));
33
- }
34
- function onKeyDown(e) {
35
- if (!isActive || e.key !== "Tab") return;
36
- const focusable = getFocusableElements();
37
- if (focusable.length === 0) {
38
- e.preventDefault();
39
- return;
40
- }
41
- e.preventDefault();
42
- const currentIndex = focusable.indexOf(document.activeElement);
43
- if (e.shiftKey) {
44
- const prevIndex = currentIndex <= 0 ? focusable.length - 1 : currentIndex - 1;
45
- focusable[prevIndex].focus();
46
- } else {
47
- const nextIndex = currentIndex >= focusable.length - 1 ? 0 : currentIndex + 1;
48
- focusable[nextIndex].focus();
49
- }
50
- }
51
- function activate() {
52
- if (isActive) return;
53
- isActive = true;
54
- previouslyFocused = document.activeElement;
55
- element.setAttribute("aria-modal", "true");
56
- const initialEl = resolveElement(element, params.initialFocus);
57
- if (initialEl) {
58
- initialEl.focus();
59
- } else {
60
- const focusable = getFocusableElements();
61
- if (focusable.length > 0) {
62
- focusable[0].focus();
63
- }
64
- }
65
- element.dispatchEvent(new CustomEvent("focustrap:activated", { bubbles: true }));
66
- }
67
- function deactivate() {
68
- if (!isActive) return;
69
- isActive = false;
70
- element.removeAttribute("aria-modal");
71
- if (returnFocus && previouslyFocused instanceof HTMLElement) {
72
- previouslyFocused.focus();
73
- }
74
- previouslyFocused = null;
75
- element.dispatchEvent(new CustomEvent("focustrap:deactivated", { bubbles: true }));
76
- }
77
- element.addEventListener("keydown", onKeyDown);
78
- element.addEventListener("focustrap:activate", () => activate());
79
- element.addEventListener("focustrap:deactivate", () => deactivate());
80
- if (params.active !== false) {
81
- activate();
82
- }
83
- }
84
- async function registerFocusTrap(hyperfixi) {
85
- const hf = hyperfixi || resolveRuntime();
86
- if (!hf) {
87
- throw new Error(
88
- "LokaScript not found. Make sure @hyperfixi/core is loaded before registering behaviors."
89
- );
90
- }
91
- const syntheticNode = {
92
- type: "behavior",
93
- name: "FocusTrap",
94
- parameters: ["active", "initialFocus", "returnFocus"],
95
- eventHandlers: [],
96
- imperativeInstaller: installFocusTrap
97
- };
98
- const ctx = hf.createContext ? hf.createContext() : { locals: /* @__PURE__ */ new Map(), globals: /* @__PURE__ */ new Map() };
99
- await hf.execute(syntheticNode, ctx);
100
- }
101
- if (resolveRuntime()) {
102
- registerFocusTrap().catch(console.error);
103
- }
104
- var focustrap_default = {
105
- source: focusTrapSchema.source,
106
- metadata: focusTrapSchema,
107
- register: registerFocusTrap
108
- };
109
-
110
- export {
111
- focusTrapSource,
112
- focusTrapMetadata,
113
- registerFocusTrap,
114
- focustrap_default
115
- };
116
- //# sourceMappingURL=chunk-F3CASJ7Q.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/behaviors/focustrap.ts"],"sourcesContent":["/**\n * FocusTrap Behavior — Imperative Implementation\n *\n * Confines Tab navigation inside an element, manages aria-modal,\n * and restores focus on deactivation.\n */\n\nimport { focusTrapSchema } from '../schemas/focustrap.schema';\nimport type { LokaScriptInstance } from '../schemas/types';\nimport { resolveRuntime } from '../schemas/types';\n\n// Re-export schema-derived values\nexport const focusTrapSource = focusTrapSchema.source;\nexport const focusTrapMetadata = focusTrapSchema;\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not(:disabled)',\n 'input:not(:disabled)',\n 'select:not(:disabled)',\n 'textarea:not(:disabled)',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(', ');\n\n/**\n * Resolve a selector parameter to an HTMLElement within the container.\n */\nfunction resolveElement(container: HTMLElement, param: unknown): HTMLElement | null {\n if (!param) return null;\n if (param instanceof HTMLElement) return param;\n if (typeof param === 'string') {\n return (\n (container.querySelector(param) as HTMLElement) ||\n (document.querySelector(param) as HTMLElement) ||\n null\n );\n }\n return null;\n}\n\n/**\n * Imperative installer for FocusTrap behavior.\n */\nfunction installFocusTrap(element: HTMLElement, params: Record<string, any>): void {\n const returnFocus = params.returnFocus !== false;\n let isActive = false;\n let previouslyFocused: Element | null = null;\n\n function getFocusableElements(): HTMLElement[] {\n return Array.from(element.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n }\n\n function onKeyDown(e: KeyboardEvent) {\n if (!isActive || e.key !== 'Tab') return;\n\n const focusable = getFocusableElements();\n if (focusable.length === 0) {\n e.preventDefault();\n return;\n }\n\n // Always prevent default Tab and manually manage focus.\n // This ensures focus never escapes to elements outside the trap,\n // even when the modal is embedded in a page with other focusable elements.\n e.preventDefault();\n\n const currentIndex = focusable.indexOf(document.activeElement as HTMLElement);\n\n if (e.shiftKey) {\n const prevIndex = currentIndex <= 0 ? focusable.length - 1 : currentIndex - 1;\n focusable[prevIndex].focus();\n } else {\n const nextIndex = currentIndex >= focusable.length - 1 ? 0 : currentIndex + 1;\n focusable[nextIndex].focus();\n }\n }\n\n function activate() {\n if (isActive) return;\n isActive = true;\n previouslyFocused = document.activeElement;\n\n element.setAttribute('aria-modal', 'true');\n\n // Focus initialFocus element or first focusable\n const initialEl = resolveElement(element, params.initialFocus);\n if (initialEl) {\n initialEl.focus();\n } else {\n const focusable = getFocusableElements();\n if (focusable.length > 0) {\n focusable[0].focus();\n }\n }\n\n element.dispatchEvent(new CustomEvent('focustrap:activated', { bubbles: true }));\n }\n\n function deactivate() {\n if (!isActive) return;\n isActive = false;\n\n element.removeAttribute('aria-modal');\n\n if (returnFocus && previouslyFocused instanceof HTMLElement) {\n previouslyFocused.focus();\n }\n previouslyFocused = null;\n\n element.dispatchEvent(new CustomEvent('focustrap:deactivated', { bubbles: true }));\n }\n\n // Keydown handler for Tab trapping\n element.addEventListener('keydown', onKeyDown);\n\n // Programmatic activation/deactivation via custom events\n element.addEventListener('focustrap:activate', () => activate());\n element.addEventListener('focustrap:deactivate', () => deactivate());\n\n // Activate immediately if requested\n if (params.active !== false) {\n activate();\n }\n}\n\n/**\n * Register the FocusTrap behavior with LokaScript.\n */\nexport async function registerFocusTrap(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: 'FocusTrap',\n parameters: ['active', 'initialFocus', 'returnFocus'],\n eventHandlers: [],\n imperativeInstaller: installFocusTrap,\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 registerFocusTrap().catch(console.error);\n}\n\nexport default {\n source: focusTrapSchema.source,\n metadata: focusTrapSchema,\n register: registerFocusTrap,\n};\n"],"mappings":";;;;;;;;AAYO,IAAM,kBAAkB,gBAAgB;AACxC,IAAM,oBAAoB;AAEjC,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAKX,SAAS,eAAe,WAAwB,OAAoC;AAClF,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,iBAAiB,YAAa,QAAO;AACzC,MAAI,OAAO,UAAU,UAAU;AAC7B,WACG,UAAU,cAAc,KAAK,KAC7B,SAAS,cAAc,KAAK,KAC7B;AAAA,EAEJ;AACA,SAAO;AACT;AAKA,SAAS,iBAAiB,SAAsB,QAAmC;AACjF,QAAM,cAAc,OAAO,gBAAgB;AAC3C,MAAI,WAAW;AACf,MAAI,oBAAoC;AAExC,WAAS,uBAAsC;AAC7C,WAAO,MAAM,KAAK,QAAQ,iBAA8B,kBAAkB,CAAC;AAAA,EAC7E;AAEA,WAAS,UAAU,GAAkB;AACnC,QAAI,CAAC,YAAY,EAAE,QAAQ,MAAO;AAElC,UAAM,YAAY,qBAAqB;AACvC,QAAI,UAAU,WAAW,GAAG;AAC1B,QAAE,eAAe;AACjB;AAAA,IACF;AAKA,MAAE,eAAe;AAEjB,UAAM,eAAe,UAAU,QAAQ,SAAS,aAA4B;AAE5E,QAAI,EAAE,UAAU;AACd,YAAM,YAAY,gBAAgB,IAAI,UAAU,SAAS,IAAI,eAAe;AAC5E,gBAAU,SAAS,EAAE,MAAM;AAAA,IAC7B,OAAO;AACL,YAAM,YAAY,gBAAgB,UAAU,SAAS,IAAI,IAAI,eAAe;AAC5E,gBAAU,SAAS,EAAE,MAAM;AAAA,IAC7B;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,QAAI,SAAU;AACd,eAAW;AACX,wBAAoB,SAAS;AAE7B,YAAQ,aAAa,cAAc,MAAM;AAGzC,UAAM,YAAY,eAAe,SAAS,OAAO,YAAY;AAC7D,QAAI,WAAW;AACb,gBAAU,MAAM;AAAA,IAClB,OAAO;AACL,YAAM,YAAY,qBAAqB;AACvC,UAAI,UAAU,SAAS,GAAG;AACxB,kBAAU,CAAC,EAAE,MAAM;AAAA,MACrB;AAAA,IACF;AAEA,YAAQ,cAAc,IAAI,YAAY,uBAAuB,EAAE,SAAS,KAAK,CAAC,CAAC;AAAA,EACjF;AAEA,WAAS,aAAa;AACpB,QAAI,CAAC,SAAU;AACf,eAAW;AAEX,YAAQ,gBAAgB,YAAY;AAEpC,QAAI,eAAe,6BAA6B,aAAa;AAC3D,wBAAkB,MAAM;AAAA,IAC1B;AACA,wBAAoB;AAEpB,YAAQ,cAAc,IAAI,YAAY,yBAAyB,EAAE,SAAS,KAAK,CAAC,CAAC;AAAA,EACnF;AAGA,UAAQ,iBAAiB,WAAW,SAAS;AAG7C,UAAQ,iBAAiB,sBAAsB,MAAM,SAAS,CAAC;AAC/D,UAAQ,iBAAiB,wBAAwB,MAAM,WAAW,CAAC;AAGnE,MAAI,OAAO,WAAW,OAAO;AAC3B,aAAS;AAAA,EACX;AACF;AAKA,eAAsB,kBAAkB,WAA+C;AACrF,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,UAAU,gBAAgB,aAAa;AAAA,IACpD,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/draggable.schema.ts"],"sourcesContent":["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: 'Makes elements draggable with pointer events',\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"],"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,EACF;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,MAAM,mBAAmB,aAAa,yBAAyB;AAAA,IACjE,EAAE,MAAM,kBAAkB,aAAa,6BAA6B;AAAA,IACpE,EAAE,MAAM,iBAAiB,aAAa,4BAA4B;AAAA,EACpE;AAAA,EACA,cAAc,CAAC,sDAAsD;AAAA,EACrE,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBR,KAAK;AACP;","names":[]}
@@ -1,62 +0,0 @@
1
- import {
2
- toggleableSchema
3
- } from "./chunk-XYZ7FOXJ.js";
4
- import {
5
- resolveRuntime
6
- } from "./chunk-6TJXDCAQ.js";
7
-
8
- // src/behaviors/toggleable.ts
9
- var toggleableSource = toggleableSchema.source;
10
- var toggleableMetadata = toggleableSchema;
11
- function installToggleable(element, params) {
12
- const cls = params.cls || "active";
13
- let targetEl = element;
14
- if (params.target && params.target !== "me") {
15
- if (typeof params.target === "string") {
16
- const found = document.querySelector(params.target);
17
- if (found instanceof HTMLElement) targetEl = found;
18
- } else if (params.target instanceof HTMLElement) {
19
- targetEl = params.target;
20
- }
21
- }
22
- element.addEventListener("click", () => {
23
- const wasOn = targetEl.classList.contains(cls);
24
- targetEl.classList.toggle(cls);
25
- targetEl.dispatchEvent(
26
- new CustomEvent(wasOn ? "toggleable:off" : "toggleable:on", { bubbles: true })
27
- );
28
- });
29
- }
30
- async function registerToggleable(hyperfixi) {
31
- const hf = hyperfixi || resolveRuntime();
32
- if (!hf) {
33
- throw new Error(
34
- "LokaScript not found. Make sure @hyperfixi/core is loaded before registering behaviors."
35
- );
36
- }
37
- const syntheticNode = {
38
- type: "behavior",
39
- name: "Toggleable",
40
- parameters: ["cls", "target"],
41
- eventHandlers: [],
42
- imperativeInstaller: installToggleable
43
- };
44
- const ctx = hf.createContext ? hf.createContext() : { locals: /* @__PURE__ */ new Map(), globals: /* @__PURE__ */ new Map() };
45
- await hf.execute(syntheticNode, ctx);
46
- }
47
- if (resolveRuntime()) {
48
- registerToggleable().catch(console.error);
49
- }
50
- var toggleable_default = {
51
- source: toggleableSchema.source,
52
- metadata: toggleableSchema,
53
- register: registerToggleable
54
- };
55
-
56
- export {
57
- toggleableSource,
58
- toggleableMetadata,
59
- registerToggleable,
60
- toggleable_default
61
- };
62
- //# sourceMappingURL=chunk-GALKOMJ5.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/behaviors/toggleable.ts"],"sourcesContent":["/**\n * Toggleable Behavior — Imperative Implementation\n *\n * A behavior that toggles a CSS class on click.\n * Useful for accordions, dropdowns, and toggle buttons.\n *\n * Uses direct DOM APIs instead of compiling hyperscript source,\n * because `toggle .{cls}` template interpolation doesn't resolve\n * behavior parameters at runtime.\n *\n * @example\n * ```html\n * <button _=\"install Toggleable\">Toggle</button>\n *\n * <button _=\"install Toggleable(cls: expanded, target: #menu)\">Menu</button>\n * ```\n */\n\nimport { toggleableSchema } from '../schemas/toggleable.schema';\nimport type { LokaScriptInstance } from '../schemas/types';\nimport { resolveRuntime } from '../schemas/types';\n\n// Re-export schema-derived values for backwards compatibility\nexport const toggleableSource = toggleableSchema.source;\nexport const toggleableMetadata = toggleableSchema;\n\n/**\n * Imperative installer for Toggleable behavior.\n * Called directly by the runtime when `install Toggleable` is executed.\n */\nfunction installToggleable(element: HTMLElement, params: Record<string, any>): void {\n const cls = params.cls || 'active';\n\n // Resolve target element\n let targetEl: HTMLElement = element;\n if (params.target && params.target !== 'me') {\n if (typeof params.target === 'string') {\n const found = document.querySelector(params.target);\n if (found instanceof HTMLElement) targetEl = found;\n } else if (params.target instanceof HTMLElement) {\n targetEl = params.target;\n }\n }\n\n element.addEventListener('click', () => {\n const wasOn = targetEl.classList.contains(cls);\n targetEl.classList.toggle(cls);\n targetEl.dispatchEvent(\n new CustomEvent(wasOn ? 'toggleable:off' : 'toggleable:on', { bubbles: true })\n );\n });\n}\n\n/**\n * Register the Toggleable behavior with LokaScript.\n * Uses imperative installer via synthetic behavior node.\n */\nexport async function registerToggleable(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: 'Toggleable',\n parameters: ['cls', 'target'],\n eventHandlers: [],\n imperativeInstaller: installToggleable,\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 registerToggleable().catch(console.error);\n}\n\nexport default {\n source: toggleableSchema.source,\n metadata: toggleableSchema,\n register: registerToggleable,\n};\n"],"mappings":";;;;;;;;AAuBO,IAAM,mBAAmB,iBAAiB;AAC1C,IAAM,qBAAqB;AAMlC,SAAS,kBAAkB,SAAsB,QAAmC;AAClF,QAAM,MAAM,OAAO,OAAO;AAG1B,MAAI,WAAwB;AAC5B,MAAI,OAAO,UAAU,OAAO,WAAW,MAAM;AAC3C,QAAI,OAAO,OAAO,WAAW,UAAU;AACrC,YAAM,QAAQ,SAAS,cAAc,OAAO,MAAM;AAClD,UAAI,iBAAiB,YAAa,YAAW;AAAA,IAC/C,WAAW,OAAO,kBAAkB,aAAa;AAC/C,iBAAW,OAAO;AAAA,IACpB;AAAA,EACF;AAEA,UAAQ,iBAAiB,SAAS,MAAM;AACtC,UAAM,QAAQ,SAAS,UAAU,SAAS,GAAG;AAC7C,aAAS,UAAU,OAAO,GAAG;AAC7B,aAAS;AAAA,MACP,IAAI,YAAY,QAAQ,mBAAmB,iBAAiB,EAAE,SAAS,KAAK,CAAC;AAAA,IAC/E;AAAA,EACF,CAAC;AACH;AAMA,eAAsB,mBAAmB,WAA+C;AACtF,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,OAAO,QAAQ;AAAA,IAC5B,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,qBAAmB,EAAE,MAAM,QAAQ,KAAK;AAC1C;AAEA,IAAO,qBAAQ;AAAA,EACb,QAAQ,iBAAiB;AAAA,EACzB,UAAU;AAAA,EACV,UAAU;AACZ;","names":[]}
@@ -1,75 +0,0 @@
1
- import {
2
- sortableSchema
3
- } from "./chunk-V2M4W3LO.js";
4
- import {
5
- resolveRuntime
6
- } from "./chunk-6TJXDCAQ.js";
7
-
8
- // src/behaviors/sortable.ts
9
- var sortableSource = sortableSchema.source;
10
- var sortableMetadata = sortableSchema;
11
- function installSortable(element, params) {
12
- const dragClass = params.dragClass || "sorting";
13
- const handleSelector = params.handle || null;
14
- element.addEventListener("pointerdown", (e) => {
15
- const target = e.target;
16
- const item = target.closest("li");
17
- if (!item || !element.contains(item)) return;
18
- if (handleSelector) {
19
- const handleEl = target.closest(handleSelector);
20
- if (!handleEl) return;
21
- }
22
- e.preventDefault();
23
- item.classList.add(dragClass);
24
- element.dispatchEvent(new CustomEvent("sortable:start", { bubbles: true, detail: { item } }));
25
- function onMove(ev) {
26
- element.dispatchEvent(
27
- new CustomEvent("sortable:move", {
28
- bubbles: true,
29
- detail: { clientY: ev.clientY, item }
30
- })
31
- );
32
- }
33
- function onUp() {
34
- document.removeEventListener("pointermove", onMove);
35
- document.removeEventListener("pointerup", onUp);
36
- item.classList.remove(dragClass);
37
- element.dispatchEvent(new CustomEvent("sortable:end", { bubbles: true, detail: { item } }));
38
- }
39
- document.addEventListener("pointermove", onMove);
40
- document.addEventListener("pointerup", onUp);
41
- });
42
- }
43
- async function registerSortable(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: "Sortable",
53
- parameters: ["dragClass"],
54
- eventHandlers: [],
55
- imperativeInstaller: installSortable
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
- registerSortable().catch(console.error);
62
- }
63
- var sortable_default = {
64
- source: sortableSchema.source,
65
- metadata: sortableSchema,
66
- register: registerSortable
67
- };
68
-
69
- export {
70
- sortableSource,
71
- sortableMetadata,
72
- registerSortable,
73
- sortable_default
74
- };
75
- //# sourceMappingURL=chunk-IMDFEGIT.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/behaviors/sortable.ts"],"sourcesContent":["/**\n * Sortable Behavior — Imperative Implementation\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 *\n * @example\n * ```html\n * <ul _=\"install Sortable\">\n * <li>Item 1</li>\n * <li>Item 2</li>\n * </ul>\n * ```\n */\n\nimport { sortableSchema } from '../schemas/sortable.schema';\nimport type { LokaScriptInstance } from '../schemas/types';\nimport { resolveRuntime } from '../schemas/types';\n\n// Re-export schema-derived values for backwards compatibility\nexport const sortableSource = sortableSchema.source;\nexport const sortableMetadata = sortableSchema;\n\n/**\n * Imperative installer for Sortable behavior.\n */\nfunction installSortable(element: HTMLElement, params: Record<string, any>): void {\n const dragClass = params.dragClass || 'sorting';\n const handleSelector = params.handle || null;\n\n element.addEventListener('pointerdown', (e: PointerEvent) => {\n const target = e.target as HTMLElement;\n const item = target.closest('li');\n if (!item || !element.contains(item)) return;\n\n // If a handle selector is specified, only start drag from the handle\n if (handleSelector) {\n const handleEl = target.closest(handleSelector);\n if (!handleEl) return;\n }\n\n e.preventDefault();\n item.classList.add(dragClass);\n element.dispatchEvent(new CustomEvent('sortable:start', { bubbles: true, detail: { item } }));\n\n function onMove(ev: PointerEvent) {\n element.dispatchEvent(\n new CustomEvent('sortable:move', {\n bubbles: true,\n detail: { clientY: ev.clientY, item },\n })\n );\n }\n\n function onUp() {\n document.removeEventListener('pointermove', onMove);\n document.removeEventListener('pointerup', onUp);\n item!.classList.remove(dragClass);\n element.dispatchEvent(new CustomEvent('sortable:end', { bubbles: true, detail: { item } }));\n }\n\n document.addEventListener('pointermove', onMove);\n document.addEventListener('pointerup', onUp);\n });\n}\n\n/**\n * Register the Sortable behavior with LokaScript.\n */\nexport async function registerSortable(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: 'Sortable',\n parameters: ['dragClass'],\n eventHandlers: [],\n imperativeInstaller: installSortable,\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 registerSortable().catch(console.error);\n}\n\nexport default {\n source: sortableSchema.source,\n metadata: sortableSchema,\n register: registerSortable,\n};\n"],"mappings":";;;;;;;;AAwBO,IAAM,iBAAiB,eAAe;AACtC,IAAM,mBAAmB;AAKhC,SAAS,gBAAgB,SAAsB,QAAmC;AAChF,QAAM,YAAY,OAAO,aAAa;AACtC,QAAM,iBAAiB,OAAO,UAAU;AAExC,UAAQ,iBAAiB,eAAe,CAAC,MAAoB;AAC3D,UAAM,SAAS,EAAE;AACjB,UAAM,OAAO,OAAO,QAAQ,IAAI;AAChC,QAAI,CAAC,QAAQ,CAAC,QAAQ,SAAS,IAAI,EAAG;AAGtC,QAAI,gBAAgB;AAClB,YAAM,WAAW,OAAO,QAAQ,cAAc;AAC9C,UAAI,CAAC,SAAU;AAAA,IACjB;AAEA,MAAE,eAAe;AACjB,SAAK,UAAU,IAAI,SAAS;AAC5B,YAAQ,cAAc,IAAI,YAAY,kBAAkB,EAAE,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAE5F,aAAS,OAAO,IAAkB;AAChC,cAAQ;AAAA,QACN,IAAI,YAAY,iBAAiB;AAAA,UAC/B,SAAS;AAAA,UACT,QAAQ,EAAE,SAAS,GAAG,SAAS,KAAK;AAAA,QACtC,CAAC;AAAA,MACH;AAAA,IACF;AAEA,aAAS,OAAO;AACd,eAAS,oBAAoB,eAAe,MAAM;AAClD,eAAS,oBAAoB,aAAa,IAAI;AAC9C,WAAM,UAAU,OAAO,SAAS;AAChC,cAAQ,cAAc,IAAI,YAAY,gBAAgB,EAAE,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAAA,IAC5F;AAEA,aAAS,iBAAiB,eAAe,MAAM;AAC/C,aAAS,iBAAiB,aAAa,IAAI;AAAA,EAC7C,CAAC;AACH;AAKA,eAAsB,iBAAiB,WAA+C;AACpF,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,WAAW;AAAA,IACxB,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,mBAAiB,EAAE,MAAM,QAAQ,KAAK;AACxC;AAEA,IAAO,mBAAQ;AAAA,EACb,QAAQ,eAAe;AAAA,EACvB,UAAU;AAAA,EACV,UAAU;AACZ;","names":[]}
@@ -1,80 +0,0 @@
1
- import {
2
- resizableSchema
3
- } from "./chunk-ZBSWTV6I.js";
4
- import {
5
- resolveRuntime
6
- } from "./chunk-6TJXDCAQ.js";
7
-
8
- // src/behaviors/resizable.ts
9
- var resizableSource = resizableSchema.source;
10
- var resizableMetadata = resizableSchema;
11
- function installResizable(element, params) {
12
- let handleEl = element;
13
- if (params.handle && params.handle !== "me") {
14
- if (typeof params.handle === "string") {
15
- const found = element.querySelector(params.handle);
16
- if (found instanceof HTMLElement) handleEl = found;
17
- } else if (params.handle instanceof HTMLElement) {
18
- handleEl = params.handle;
19
- }
20
- }
21
- const minW = params.minWidth ?? 50;
22
- const minH = params.minHeight ?? 50;
23
- const maxW = params.maxWidth ?? 9999;
24
- const maxH = params.maxHeight ?? 9999;
25
- handleEl.addEventListener("pointerdown", (e) => {
26
- e.preventDefault();
27
- element.dispatchEvent(new CustomEvent("resizable:start", { bubbles: true }));
28
- const startWidth = element.offsetWidth;
29
- const startHeight = element.offsetHeight;
30
- const startX = e.clientX;
31
- const startY = e.clientY;
32
- function onMove(ev) {
33
- const newWidth = Math.max(minW, Math.min(maxW, startWidth + (ev.clientX - startX)));
34
- const newHeight = Math.max(minH, Math.min(maxH, startHeight + (ev.clientY - startY)));
35
- element.style.width = `${newWidth}px`;
36
- element.style.height = `${newHeight}px`;
37
- element.dispatchEvent(new CustomEvent("resizable:resize", { bubbles: true }));
38
- }
39
- function onUp() {
40
- document.removeEventListener("pointermove", onMove);
41
- document.removeEventListener("pointerup", onUp);
42
- element.dispatchEvent(new CustomEvent("resizable:end", { bubbles: true }));
43
- }
44
- document.addEventListener("pointermove", onMove);
45
- document.addEventListener("pointerup", onUp);
46
- });
47
- }
48
- async function registerResizable(hyperfixi) {
49
- const hf = hyperfixi || resolveRuntime();
50
- if (!hf) {
51
- throw new Error(
52
- "LokaScript not found. Make sure @hyperfixi/core is loaded before registering behaviors."
53
- );
54
- }
55
- const syntheticNode = {
56
- type: "behavior",
57
- name: "Resizable",
58
- parameters: [],
59
- eventHandlers: [],
60
- imperativeInstaller: installResizable
61
- };
62
- const ctx = hf.createContext ? hf.createContext() : { locals: /* @__PURE__ */ new Map(), globals: /* @__PURE__ */ new Map() };
63
- await hf.execute(syntheticNode, ctx);
64
- }
65
- if (resolveRuntime()) {
66
- registerResizable().catch(console.error);
67
- }
68
- var resizable_default = {
69
- source: resizableSchema.source,
70
- metadata: resizableSchema,
71
- register: registerResizable
72
- };
73
-
74
- export {
75
- resizableSource,
76
- resizableMetadata,
77
- registerResizable,
78
- resizable_default
79
- };
80
- //# sourceMappingURL=chunk-IT6TYVMW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/behaviors/resizable.ts"],"sourcesContent":["/**\n * Resizable Behavior — Imperative Implementation\n *\n * Makes elements resizable by dragging edges or corners.\n * Supports minimum/maximum dimensions and resize handles.\n *\n * @example\n * ```html\n * <div _=\"install Resizable\" style=\"width: 200px; height: 150px;\">\n * Resize me!\n * </div>\n * ```\n */\n\nimport { resizableSchema } from '../schemas/resizable.schema';\nimport type { LokaScriptInstance } from '../schemas/types';\nimport { resolveRuntime } from '../schemas/types';\n\n// Re-export schema-derived values for backwards compatibility\nexport const resizableSource = resizableSchema.source;\nexport const resizableMetadata = resizableSchema;\n\n/**\n * Imperative installer for Resizable behavior.\n */\nfunction installResizable(element: HTMLElement, params: Record<string, any>): void {\n // Resolve handle element\n let handleEl: HTMLElement = element;\n if (params.handle && params.handle !== 'me') {\n if (typeof params.handle === 'string') {\n const found = element.querySelector(params.handle);\n if (found instanceof HTMLElement) handleEl = found;\n } else if (params.handle instanceof HTMLElement) {\n handleEl = params.handle;\n }\n }\n\n const minW = params.minWidth ?? 50;\n const minH = params.minHeight ?? 50;\n const maxW = params.maxWidth ?? 9999;\n const maxH = params.maxHeight ?? 9999;\n\n handleEl.addEventListener('pointerdown', (e: PointerEvent) => {\n e.preventDefault();\n element.dispatchEvent(new CustomEvent('resizable:start', { bubbles: true }));\n\n const startWidth = element.offsetWidth;\n const startHeight = element.offsetHeight;\n const startX = e.clientX;\n const startY = e.clientY;\n\n function onMove(ev: PointerEvent) {\n const newWidth = Math.max(minW, Math.min(maxW, startWidth + (ev.clientX - startX)));\n const newHeight = Math.max(minH, Math.min(maxH, startHeight + (ev.clientY - startY)));\n\n element.style.width = `${newWidth}px`;\n element.style.height = `${newHeight}px`;\n element.dispatchEvent(new CustomEvent('resizable:resize', { bubbles: true }));\n }\n\n function onUp() {\n document.removeEventListener('pointermove', onMove);\n document.removeEventListener('pointerup', onUp);\n element.dispatchEvent(new CustomEvent('resizable:end', { bubbles: true }));\n }\n\n document.addEventListener('pointermove', onMove);\n document.addEventListener('pointerup', onUp);\n });\n}\n\n/**\n * Register the Resizable behavior with LokaScript.\n */\nexport async function registerResizable(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: 'Resizable',\n parameters: [],\n eventHandlers: [],\n imperativeInstaller: installResizable,\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 registerResizable().catch(console.error);\n}\n\nexport default {\n source: resizableSchema.source,\n metadata: resizableSchema,\n register: registerResizable,\n};\n"],"mappings":";;;;;;;;AAmBO,IAAM,kBAAkB,gBAAgB;AACxC,IAAM,oBAAoB;AAKjC,SAAS,iBAAiB,SAAsB,QAAmC;AAEjF,MAAI,WAAwB;AAC5B,MAAI,OAAO,UAAU,OAAO,WAAW,MAAM;AAC3C,QAAI,OAAO,OAAO,WAAW,UAAU;AACrC,YAAM,QAAQ,QAAQ,cAAc,OAAO,MAAM;AACjD,UAAI,iBAAiB,YAAa,YAAW;AAAA,IAC/C,WAAW,OAAO,kBAAkB,aAAa;AAC/C,iBAAW,OAAO;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,OAAO,OAAO,YAAY;AAChC,QAAM,OAAO,OAAO,aAAa;AACjC,QAAM,OAAO,OAAO,YAAY;AAChC,QAAM,OAAO,OAAO,aAAa;AAEjC,WAAS,iBAAiB,eAAe,CAAC,MAAoB;AAC5D,MAAE,eAAe;AACjB,YAAQ,cAAc,IAAI,YAAY,mBAAmB,EAAE,SAAS,KAAK,CAAC,CAAC;AAE3E,UAAM,aAAa,QAAQ;AAC3B,UAAM,cAAc,QAAQ;AAC5B,UAAM,SAAS,EAAE;AACjB,UAAM,SAAS,EAAE;AAEjB,aAAS,OAAO,IAAkB;AAChC,YAAM,WAAW,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,cAAc,GAAG,UAAU,OAAO,CAAC;AAClF,YAAM,YAAY,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,eAAe,GAAG,UAAU,OAAO,CAAC;AAEpF,cAAQ,MAAM,QAAQ,GAAG,QAAQ;AACjC,cAAQ,MAAM,SAAS,GAAG,SAAS;AACnC,cAAQ,cAAc,IAAI,YAAY,oBAAoB,EAAE,SAAS,KAAK,CAAC,CAAC;AAAA,IAC9E;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;AAKA,eAAsB,kBAAkB,WAA+C;AACrF,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;AAAA,IACb,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,89 +0,0 @@
1
- import {
2
- autoDismissSchema
3
- } from "./chunk-66U2RSYJ.js";
4
- import {
5
- resolveRuntime
6
- } from "./chunk-6TJXDCAQ.js";
7
-
8
- // src/behaviors/autodismiss.ts
9
- var autoDismissSource = autoDismissSchema.source;
10
- var autoDismissMetadata = autoDismissSchema;
11
- function installAutoDismiss(element, params) {
12
- const delay = typeof params.delay === "number" ? params.delay : 5e3;
13
- const pauseOnHover = params.pauseOnHover !== false;
14
- const effect = params.effect === "fade" ? "fade" : "none";
15
- let timerId = null;
16
- let remaining = delay;
17
- let startedAt = Date.now();
18
- function dismiss() {
19
- const event = new CustomEvent("autodismiss:dismissed", {
20
- bubbles: true,
21
- cancelable: true
22
- });
23
- element.dispatchEvent(event);
24
- if (event.defaultPrevented) return;
25
- if (effect === "fade") {
26
- element.style.transition = "opacity 300ms";
27
- element.style.opacity = "0";
28
- setTimeout(() => element.remove(), 300);
29
- } else {
30
- element.remove();
31
- }
32
- }
33
- function start() {
34
- startedAt = Date.now();
35
- timerId = setTimeout(dismiss, remaining);
36
- }
37
- element.dispatchEvent(new CustomEvent("autodismiss:start", { bubbles: true }));
38
- start();
39
- if (pauseOnHover) {
40
- element.addEventListener("mouseenter", () => {
41
- if (timerId != null) {
42
- clearTimeout(timerId);
43
- timerId = null;
44
- remaining -= Date.now() - startedAt;
45
- if (remaining < 0) remaining = 0;
46
- element.dispatchEvent(new CustomEvent("autodismiss:paused", { bubbles: true }));
47
- }
48
- });
49
- element.addEventListener("mouseleave", () => {
50
- if (timerId == null && element.isConnected) {
51
- element.dispatchEvent(new CustomEvent("autodismiss:resumed", { bubbles: true }));
52
- start();
53
- }
54
- });
55
- }
56
- }
57
- async function registerAutoDismiss(hyperfixi) {
58
- const hf = hyperfixi || resolveRuntime();
59
- if (!hf) {
60
- throw new Error(
61
- "LokaScript not found. Make sure @hyperfixi/core is loaded before registering behaviors."
62
- );
63
- }
64
- const syntheticNode = {
65
- type: "behavior",
66
- name: "AutoDismiss",
67
- parameters: ["delay", "pauseOnHover", "effect"],
68
- eventHandlers: [],
69
- imperativeInstaller: installAutoDismiss
70
- };
71
- const ctx = hf.createContext ? hf.createContext() : { locals: /* @__PURE__ */ new Map(), globals: /* @__PURE__ */ new Map() };
72
- await hf.execute(syntheticNode, ctx);
73
- }
74
- if (resolveRuntime()) {
75
- registerAutoDismiss().catch(console.error);
76
- }
77
- var autodismiss_default = {
78
- source: autoDismissSchema.source,
79
- metadata: autoDismissSchema,
80
- register: registerAutoDismiss
81
- };
82
-
83
- export {
84
- autoDismissSource,
85
- autoDismissMetadata,
86
- registerAutoDismiss,
87
- autodismiss_default
88
- };
89
- //# sourceMappingURL=chunk-LQJOQTBZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/behaviors/autodismiss.ts"],"sourcesContent":["/**\n * AutoDismiss Behavior — Imperative Implementation\n *\n * Auto-removes elements after a configurable delay.\n * Supports pause-on-hover and fade effect using standard setTimeout/clearTimeout.\n */\n\nimport { autoDismissSchema } from '../schemas/autodismiss.schema';\nimport type { LokaScriptInstance } from '../schemas/types';\nimport { resolveRuntime } from '../schemas/types';\n\n// Re-export schema-derived values\nexport const autoDismissSource = autoDismissSchema.source;\nexport const autoDismissMetadata = autoDismissSchema;\n\n/**\n * Imperative installer for AutoDismiss behavior.\n */\nfunction installAutoDismiss(element: HTMLElement, params: Record<string, any>): void {\n const delay = typeof params.delay === 'number' ? params.delay : 5000;\n const pauseOnHover = params.pauseOnHover !== false;\n const effect = params.effect === 'fade' ? 'fade' : 'none';\n\n let timerId: ReturnType<typeof setTimeout> | null = null;\n let remaining = delay;\n let startedAt = Date.now();\n\n function dismiss() {\n const event = new CustomEvent('autodismiss:dismissed', {\n bubbles: true,\n cancelable: true,\n });\n element.dispatchEvent(event);\n\n if (event.defaultPrevented) return;\n\n if (effect === 'fade') {\n element.style.transition = 'opacity 300ms';\n element.style.opacity = '0';\n setTimeout(() => element.remove(), 300);\n } else {\n element.remove();\n }\n }\n\n function start() {\n startedAt = Date.now();\n timerId = setTimeout(dismiss, remaining);\n }\n\n // Start the countdown\n element.dispatchEvent(new CustomEvent('autodismiss:start', { bubbles: true }));\n start();\n\n if (pauseOnHover) {\n element.addEventListener('mouseenter', () => {\n if (timerId != null) {\n clearTimeout(timerId);\n timerId = null;\n remaining -= Date.now() - startedAt;\n if (remaining < 0) remaining = 0;\n element.dispatchEvent(new CustomEvent('autodismiss:paused', { bubbles: true }));\n }\n });\n\n element.addEventListener('mouseleave', () => {\n if (timerId == null && element.isConnected) {\n element.dispatchEvent(new CustomEvent('autodismiss:resumed', { bubbles: true }));\n start();\n }\n });\n }\n}\n\n/**\n * Register the AutoDismiss behavior with LokaScript.\n */\nexport async function registerAutoDismiss(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: 'AutoDismiss',\n parameters: ['delay', 'pauseOnHover', 'effect'],\n eventHandlers: [],\n imperativeInstaller: installAutoDismiss,\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 registerAutoDismiss().catch(console.error);\n}\n\nexport default {\n source: autoDismissSchema.source,\n metadata: autoDismissSchema,\n register: registerAutoDismiss,\n};\n"],"mappings":";;;;;;;;AAYO,IAAM,oBAAoB,kBAAkB;AAC5C,IAAM,sBAAsB;AAKnC,SAAS,mBAAmB,SAAsB,QAAmC;AACnF,QAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAChE,QAAM,eAAe,OAAO,iBAAiB;AAC7C,QAAM,SAAS,OAAO,WAAW,SAAS,SAAS;AAEnD,MAAI,UAAgD;AACpD,MAAI,YAAY;AAChB,MAAI,YAAY,KAAK,IAAI;AAEzB,WAAS,UAAU;AACjB,UAAM,QAAQ,IAAI,YAAY,yBAAyB;AAAA,MACrD,SAAS;AAAA,MACT,YAAY;AAAA,IACd,CAAC;AACD,YAAQ,cAAc,KAAK;AAE3B,QAAI,MAAM,iBAAkB;AAE5B,QAAI,WAAW,QAAQ;AACrB,cAAQ,MAAM,aAAa;AAC3B,cAAQ,MAAM,UAAU;AACxB,iBAAW,MAAM,QAAQ,OAAO,GAAG,GAAG;AAAA,IACxC,OAAO;AACL,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF;AAEA,WAAS,QAAQ;AACf,gBAAY,KAAK,IAAI;AACrB,cAAU,WAAW,SAAS,SAAS;AAAA,EACzC;AAGA,UAAQ,cAAc,IAAI,YAAY,qBAAqB,EAAE,SAAS,KAAK,CAAC,CAAC;AAC7E,QAAM;AAEN,MAAI,cAAc;AAChB,YAAQ,iBAAiB,cAAc,MAAM;AAC3C,UAAI,WAAW,MAAM;AACnB,qBAAa,OAAO;AACpB,kBAAU;AACV,qBAAa,KAAK,IAAI,IAAI;AAC1B,YAAI,YAAY,EAAG,aAAY;AAC/B,gBAAQ,cAAc,IAAI,YAAY,sBAAsB,EAAE,SAAS,KAAK,CAAC,CAAC;AAAA,MAChF;AAAA,IACF,CAAC;AAED,YAAQ,iBAAiB,cAAc,MAAM;AAC3C,UAAI,WAAW,QAAQ,QAAQ,aAAa;AAC1C,gBAAQ,cAAc,IAAI,YAAY,uBAAuB,EAAE,SAAS,KAAK,CAAC,CAAC;AAC/E,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAKA,eAAsB,oBAAoB,WAA+C;AACvF,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,SAAS,gBAAgB,QAAQ;AAAA,IAC9C,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,sBAAoB,EAAE,MAAM,QAAQ,KAAK;AAC3C;AAEA,IAAO,sBAAQ;AAAA,EACb,QAAQ,kBAAkB;AAAA,EAC1B,UAAU;AAAA,EACV,UAAU;AACZ;","names":[]}