@hyperfixi/behaviors 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/all.browser.global.js +116 -0
  2. package/dist/all.browser.global.js.map +1 -0
  3. package/dist/behaviors/draggable.cjs +109 -0
  4. package/dist/behaviors/draggable.cjs.map +1 -0
  5. package/dist/behaviors/draggable.d.cts +15 -0
  6. package/dist/behaviors/draggable.d.ts +15 -0
  7. package/dist/behaviors/draggable.js +14 -0
  8. package/dist/behaviors/draggable.js.map +1 -0
  9. package/dist/behaviors/removable.cjs +120 -0
  10. package/dist/behaviors/removable.cjs.map +1 -0
  11. package/dist/behaviors/removable.d.cts +15 -0
  12. package/dist/behaviors/removable.d.ts +15 -0
  13. package/dist/behaviors/removable.js +14 -0
  14. package/dist/behaviors/removable.js.map +1 -0
  15. package/dist/behaviors/resizable.cjs +146 -0
  16. package/dist/behaviors/resizable.cjs.map +1 -0
  17. package/dist/behaviors/resizable.d.cts +15 -0
  18. package/dist/behaviors/resizable.d.ts +15 -0
  19. package/dist/behaviors/resizable.js +14 -0
  20. package/dist/behaviors/resizable.js.map +1 -0
  21. package/dist/behaviors/sortable.cjs +119 -0
  22. package/dist/behaviors/sortable.cjs.map +1 -0
  23. package/dist/behaviors/sortable.d.cts +15 -0
  24. package/dist/behaviors/sortable.d.ts +15 -0
  25. package/dist/behaviors/sortable.js +14 -0
  26. package/dist/behaviors/sortable.js.map +1 -0
  27. package/dist/behaviors/toggleable.cjs +105 -0
  28. package/dist/behaviors/toggleable.cjs.map +1 -0
  29. package/dist/behaviors/toggleable.d.cts +15 -0
  30. package/dist/behaviors/toggleable.d.ts +15 -0
  31. package/dist/behaviors/toggleable.js +14 -0
  32. package/dist/behaviors/toggleable.js.map +1 -0
  33. package/dist/chunk-272NKUJ3.js +63 -0
  34. package/dist/chunk-272NKUJ3.js.map +1 -0
  35. package/dist/chunk-2NQHIHD5.js +37 -0
  36. package/dist/chunk-2NQHIHD5.js.map +1 -0
  37. package/dist/chunk-3DVDS7CT.js +170 -0
  38. package/dist/chunk-3DVDS7CT.js.map +1 -0
  39. package/dist/chunk-3Q652JQB.js +37 -0
  40. package/dist/chunk-3Q652JQB.js.map +1 -0
  41. package/dist/chunk-BWZ6EGII.js +62 -0
  42. package/dist/chunk-BWZ6EGII.js.map +1 -0
  43. package/dist/chunk-G6WR2AYR.js +52 -0
  44. package/dist/chunk-G6WR2AYR.js.map +1 -0
  45. package/dist/chunk-HMRPQWQU.js +37 -0
  46. package/dist/chunk-HMRPQWQU.js.map +1 -0
  47. package/dist/chunk-MEP6B7XW.js +37 -0
  48. package/dist/chunk-MEP6B7XW.js.map +1 -0
  49. package/dist/chunk-URBOGGW6.js +32 -0
  50. package/dist/chunk-URBOGGW6.js.map +1 -0
  51. package/dist/chunk-V5IWDPDP.js +89 -0
  52. package/dist/chunk-V5IWDPDP.js.map +1 -0
  53. package/dist/chunk-WU37DFAL.js +37 -0
  54. package/dist/chunk-WU37DFAL.js.map +1 -0
  55. package/dist/chunk-WUHHMDAA.js +48 -0
  56. package/dist/chunk-WUHHMDAA.js.map +1 -0
  57. package/dist/core.browser.global.js +39 -0
  58. package/dist/core.browser.global.js.map +1 -0
  59. package/dist/draggable.browser.global.js +25 -0
  60. package/dist/draggable.browser.global.js.map +1 -0
  61. package/dist/index.cjs +907 -0
  62. package/dist/index.cjs.map +1 -0
  63. package/dist/index.d.cts +134 -0
  64. package/dist/index.d.ts +134 -0
  65. package/dist/index.js +193 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/loaders.cjs +562 -0
  68. package/dist/loaders.cjs.map +1 -0
  69. package/dist/loaders.d.cts +2 -0
  70. package/dist/loaders.d.ts +2 -0
  71. package/dist/loaders.js +8 -0
  72. package/dist/loaders.js.map +1 -0
  73. package/dist/registry.cjs +214 -0
  74. package/dist/registry.cjs.map +1 -0
  75. package/dist/registry.d.cts +116 -0
  76. package/dist/registry.d.ts +116 -0
  77. package/dist/registry.js +47 -0
  78. package/dist/registry.js.map +1 -0
  79. package/dist/removable.browser.global.js +23 -0
  80. package/dist/removable.browser.global.js.map +1 -0
  81. package/dist/resizable.browser.global.js +35 -0
  82. package/dist/resizable.browser.global.js.map +1 -0
  83. package/dist/schemas/index.cjs +353 -0
  84. package/dist/schemas/index.cjs.map +1 -0
  85. package/dist/schemas/index.d.cts +75 -0
  86. package/dist/schemas/index.d.ts +75 -0
  87. package/dist/schemas/index.js +41 -0
  88. package/dist/schemas/index.js.map +1 -0
  89. package/dist/sortable.browser.global.js +25 -0
  90. package/dist/sortable.browser.global.js.map +1 -0
  91. package/dist/toggleable.browser.global.js +16 -0
  92. package/dist/toggleable.browser.global.js.map +1 -0
  93. package/dist/types-CCc_2wAb.d.cts +100 -0
  94. package/dist/types-CCc_2wAb.d.ts +100 -0
  95. package/package.json +109 -0
  96. package/src/behaviors/draggable.ts +60 -0
  97. package/src/behaviors/index.ts +40 -0
  98. package/src/behaviors/integration.test.ts +80 -0
  99. package/src/behaviors/removable.ts +55 -0
  100. package/src/behaviors/resizable.ts +55 -0
  101. package/src/behaviors/sortable.ts +56 -0
  102. package/src/behaviors/toggleable.ts +55 -0
  103. package/src/core-bundle.ts +35 -0
  104. package/src/generated/index.ts +9 -0
  105. package/src/generated/metadata.ts +78 -0
  106. package/src/generated/types.ts +51 -0
  107. package/src/index.test.ts +180 -0
  108. package/src/index.ts +222 -0
  109. package/src/loaders.ts +39 -0
  110. package/src/registry.test.ts +207 -0
  111. package/src/registry.ts +304 -0
  112. package/src/schemas/draggable.schema.ts +54 -0
  113. package/src/schemas/index.ts +60 -0
  114. package/src/schemas/removable.schema.ts +69 -0
  115. package/src/schemas/resizable.schema.ts +91 -0
  116. package/src/schemas/sortable.schema.ts +68 -0
  117. package/src/schemas/toggleable.schema.ts +50 -0
  118. package/src/schemas/types.ts +107 -0
@@ -0,0 +1,37 @@
1
+ import {
2
+ removableSchema
3
+ } from "./chunk-272NKUJ3.js";
4
+
5
+ // src/behaviors/removable.ts
6
+ var removableSource = removableSchema.source;
7
+ var removableMetadata = removableSchema;
8
+ async function registerRemovable(hyperfixi) {
9
+ const hf = hyperfixi || (typeof window !== "undefined" ? window.lokascript : null);
10
+ if (!hf) {
11
+ throw new Error(
12
+ "LokaScript not found. Make sure @hyperfixi/core is loaded before registering behaviors."
13
+ );
14
+ }
15
+ const result = hf.compileSync(removableSchema.source, { traditional: true });
16
+ if (!result.ok) {
17
+ throw new Error(`Failed to compile Removable behavior: ${JSON.stringify(result.errors)}`);
18
+ }
19
+ const ctx = hf.createContext ? hf.createContext() : { locals: /* @__PURE__ */ new Map(), globals: /* @__PURE__ */ new Map() };
20
+ await hf.execute(result.ast, ctx);
21
+ }
22
+ if (typeof window !== "undefined" && window.lokascript) {
23
+ registerRemovable().catch(console.error);
24
+ }
25
+ var removable_default = {
26
+ source: removableSchema.source,
27
+ metadata: removableSchema,
28
+ register: registerRemovable
29
+ };
30
+
31
+ export {
32
+ removableSource,
33
+ removableMetadata,
34
+ registerRemovable,
35
+ removable_default
36
+ };
37
+ //# sourceMappingURL=chunk-2NQHIHD5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/behaviors/removable.ts"],"sourcesContent":["/**\n * Removable Behavior\n *\n * A behavior that removes an element when a trigger is clicked.\n * Supports optional confirmation and transition effects.\n *\n * @example\n * ```html\n * <div _=\"install Removable\">Click to remove</div>\n *\n * <div _=\"install Removable(confirm: true)\">With confirmation</div>\n * ```\n */\n\nimport { removableSchema } from '../schemas/removable.schema';\nimport type { LokaScriptInstance, LokaScriptWindow } from '../schemas/types';\n\n// Re-export schema-derived values for backwards compatibility\nexport const removableSource = removableSchema.source;\nexport const removableMetadata = removableSchema;\n\n/**\n * Register the Removable behavior with LokaScript.\n */\nexport async function registerRemovable(hyperfixi?: LokaScriptInstance): Promise<void> {\n const hf =\n hyperfixi ||\n (typeof window !== 'undefined' ? (window as unknown as LokaScriptWindow).lokascript : null);\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 result = hf.compileSync(removableSchema.source, { traditional: true });\n\n if (!result.ok) {\n throw new Error(`Failed to compile Removable behavior: ${JSON.stringify(result.errors)}`);\n }\n\n const ctx = hf.createContext ? hf.createContext() : { locals: new Map(), globals: new Map() };\n await hf.execute(result.ast, ctx);\n}\n\n// Auto-register when loaded as a script tag\nif (typeof window !== 'undefined' && (window as unknown as LokaScriptWindow).lokascript) {\n registerRemovable().catch(console.error);\n}\n\nexport default {\n source: removableSchema.source,\n metadata: removableSchema,\n register: registerRemovable,\n};\n"],"mappings":";;;;;AAkBO,IAAM,kBAAkB,gBAAgB;AACxC,IAAM,oBAAoB;AAKjC,eAAsB,kBAAkB,WAA+C;AACrF,QAAM,KACJ,cACC,OAAO,WAAW,cAAe,OAAuC,aAAa;AAExF,MAAI,CAAC,IAAI;AACP,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,GAAG,YAAY,gBAAgB,QAAQ,EAAE,aAAa,KAAK,CAAC;AAE3E,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,IAAI,MAAM,yCAAyC,KAAK,UAAU,OAAO,MAAM,CAAC,EAAE;AAAA,EAC1F;AAEA,QAAM,MAAM,GAAG,gBAAgB,GAAG,cAAc,IAAI,EAAE,QAAQ,oBAAI,IAAI,GAAG,SAAS,oBAAI,IAAI,EAAE;AAC5F,QAAM,GAAG,QAAQ,OAAO,KAAK,GAAG;AAClC;AAGA,IAAI,OAAO,WAAW,eAAgB,OAAuC,YAAY;AACvF,oBAAkB,EAAE,MAAM,QAAQ,KAAK;AACzC;AAEA,IAAO,oBAAQ;AAAA,EACb,QAAQ,gBAAgB;AAAA,EACxB,UAAU;AAAA,EACV,UAAU;AACZ;","names":[]}
@@ -0,0 +1,170 @@
1
+ // src/registry.ts
2
+ var behaviors = /* @__PURE__ */ new Map();
3
+ var schemas = /* @__PURE__ */ new Map();
4
+ var loaders = /* @__PURE__ */ new Map();
5
+ var loadingPromises = /* @__PURE__ */ new Map();
6
+ function registerBehavior(name, module) {
7
+ behaviors.set(name, module);
8
+ if (module.metadata) {
9
+ schemas.set(name, module.metadata);
10
+ }
11
+ }
12
+ function registerSchema(schema) {
13
+ schemas.set(schema.name, schema);
14
+ }
15
+ function registerLoader(name, loader) {
16
+ loaders.set(name, loader);
17
+ }
18
+ function getBehavior(name) {
19
+ const behavior = behaviors.get(name);
20
+ if (!behavior) {
21
+ const registered = Array.from(behaviors.keys()).join(", ");
22
+ throw new Error(
23
+ `Behavior '${name}' is not registered. Registered behaviors: ${registered || "none"}. Use loadBehavior('${name}') to lazy load it.`
24
+ );
25
+ }
26
+ return behavior;
27
+ }
28
+ function tryGetBehavior(name) {
29
+ return behaviors.get(name);
30
+ }
31
+ function getSchema(name) {
32
+ const schema = schemas.get(name);
33
+ if (!schema) {
34
+ throw new Error(
35
+ `Schema for behavior '${name}' is not registered. Use tryGetSchema('${name}') for a non-throwing alternative.`
36
+ );
37
+ }
38
+ return schema;
39
+ }
40
+ function tryGetSchema(name) {
41
+ return schemas.get(name);
42
+ }
43
+ function isRegistered(name) {
44
+ return behaviors.has(name);
45
+ }
46
+ function hasLoader(name) {
47
+ return loaders.has(name);
48
+ }
49
+ function getRegisteredBehaviors() {
50
+ return Array.from(behaviors.keys());
51
+ }
52
+ function getAvailableBehaviors() {
53
+ const names = /* @__PURE__ */ new Set([...behaviors.keys(), ...loaders.keys()]);
54
+ return Array.from(names);
55
+ }
56
+ function getBehaviorsByCategory(category) {
57
+ const result = [];
58
+ for (const [name, schema] of schemas) {
59
+ if (schema.category === category) {
60
+ result.push(name);
61
+ }
62
+ }
63
+ return result;
64
+ }
65
+ function getBehaviorsByTier(tier) {
66
+ const result = [];
67
+ for (const [name, schema] of schemas) {
68
+ if (schema.tier === tier) {
69
+ result.push(name);
70
+ }
71
+ }
72
+ return result;
73
+ }
74
+ function getAllSchemas() {
75
+ return Array.from(schemas.values());
76
+ }
77
+ function getAllSchemasRecord() {
78
+ const result = {};
79
+ for (const [name, schema] of schemas) {
80
+ result[name] = schema;
81
+ }
82
+ return result;
83
+ }
84
+ async function loadBehavior(name) {
85
+ const cached = behaviors.get(name);
86
+ if (cached) {
87
+ return cached;
88
+ }
89
+ const inFlight = loadingPromises.get(name);
90
+ if (inFlight) {
91
+ return inFlight;
92
+ }
93
+ const loader = loaders.get(name);
94
+ if (!loader) {
95
+ throw new Error(
96
+ `No loader registered for behavior '${name}'. Available loaders: ${Array.from(loaders.keys()).join(", ") || "none"}`
97
+ );
98
+ }
99
+ const promise = loader().then((mod) => {
100
+ const module = mod.default;
101
+ registerBehavior(name, module);
102
+ loadingPromises.delete(name);
103
+ return module;
104
+ });
105
+ loadingPromises.set(name, promise);
106
+ return promise;
107
+ }
108
+ async function preloadTier(tier) {
109
+ const names = getBehaviorsByTier(tier);
110
+ await Promise.all(
111
+ names.map(
112
+ (name) => loadBehavior(name).catch((err) => {
113
+ console.warn(`[behaviors] Failed to preload '${name}' (tier: ${tier}):`, err);
114
+ })
115
+ )
116
+ );
117
+ }
118
+ async function preloadCategory(category) {
119
+ const names = getBehaviorsByCategory(category);
120
+ await Promise.all(
121
+ names.map(
122
+ (name) => loadBehavior(name).catch((err) => {
123
+ console.warn(`[behaviors] Failed to preload '${name}' (category: ${category}):`, err);
124
+ })
125
+ )
126
+ );
127
+ }
128
+ async function loadAll() {
129
+ const names = getAvailableBehaviors();
130
+ await Promise.all(
131
+ names.map(
132
+ (name) => loadBehavior(name).catch((err) => {
133
+ console.warn(`[behaviors] Failed to load '${name}':`, err);
134
+ })
135
+ )
136
+ );
137
+ }
138
+ async function registerWithRuntime(name, hyperfixi) {
139
+ const module = await loadBehavior(name);
140
+ await module.register(hyperfixi);
141
+ }
142
+ async function registerAllWithRuntime(hyperfixi) {
143
+ const registrations = Array.from(behaviors.values()).map((module) => module.register(hyperfixi));
144
+ await Promise.all(registrations);
145
+ }
146
+
147
+ export {
148
+ registerBehavior,
149
+ registerSchema,
150
+ registerLoader,
151
+ getBehavior,
152
+ tryGetBehavior,
153
+ getSchema,
154
+ tryGetSchema,
155
+ isRegistered,
156
+ hasLoader,
157
+ getRegisteredBehaviors,
158
+ getAvailableBehaviors,
159
+ getBehaviorsByCategory,
160
+ getBehaviorsByTier,
161
+ getAllSchemas,
162
+ getAllSchemasRecord,
163
+ loadBehavior,
164
+ preloadTier,
165
+ preloadCategory,
166
+ loadAll,
167
+ registerWithRuntime,
168
+ registerAllWithRuntime
169
+ };
170
+ //# sourceMappingURL=chunk-3DVDS7CT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/registry.ts"],"sourcesContent":["/**\n * Behavior Registry\n *\n * Central registration point for behaviors. Modeled on semantic/registry.ts.\n * Supports lazy loading, category/tier queries, and tree-shaking.\n *\n * @example\n * ```typescript\n * // Register a behavior\n * registerBehavior('Draggable', DraggableModule);\n *\n * // Query behaviors\n * const uiBehaviors = getBehaviorsByCategory('ui');\n * const coreBehaviors = getBehaviorsByTier('core');\n *\n * // Lazy load on demand\n * const module = await loadBehavior('Resizable');\n * ```\n */\n\nimport type {\n BehaviorModule,\n BehaviorSchema,\n BehaviorCategory,\n BehaviorTier,\n LokaScriptInstance,\n} from './schemas/types';\n\n// =============================================================================\n// Registry State\n// =============================================================================\n\nconst behaviors = new Map<string, BehaviorModule>();\nconst schemas = new Map<string, BehaviorSchema>();\nconst loaders = new Map<string, () => Promise<{ default: BehaviorModule }>>();\nconst loadingPromises = new Map<string, Promise<BehaviorModule>>();\n\n// =============================================================================\n// Registration Functions\n// =============================================================================\n\n/**\n * Register a behavior module.\n */\nexport function registerBehavior(name: string, module: BehaviorModule): void {\n behaviors.set(name, module);\n if (module.metadata) {\n schemas.set(name, module.metadata);\n }\n}\n\n/**\n * Register a behavior schema (without the module).\n */\nexport function registerSchema(schema: BehaviorSchema): void {\n schemas.set(schema.name, schema);\n}\n\n/**\n * Register a lazy loader for a behavior.\n * The loader should return a module with a default export.\n */\nexport function registerLoader(\n name: string,\n loader: () => Promise<{ default: BehaviorModule }>\n): void {\n loaders.set(name, loader);\n}\n\n// =============================================================================\n// Query Functions (Sync)\n// =============================================================================\n\n/**\n * Get a behavior module by name.\n * @throws Error if behavior is not registered\n */\nexport function getBehavior(name: string): BehaviorModule {\n const behavior = behaviors.get(name);\n if (!behavior) {\n const registered = Array.from(behaviors.keys()).join(', ');\n throw new Error(\n `Behavior '${name}' is not registered. ` +\n `Registered behaviors: ${registered || 'none'}. ` +\n `Use loadBehavior('${name}') to lazy load it.`\n );\n }\n return behavior;\n}\n\n/**\n * Try to get a behavior, returning undefined if not registered.\n */\nexport function tryGetBehavior(name: string): BehaviorModule | undefined {\n return behaviors.get(name);\n}\n\n/**\n * Get a behavior schema by name.\n * @throws Error if schema is not registered\n */\nexport function getSchema(name: string): BehaviorSchema {\n const schema = schemas.get(name);\n if (!schema) {\n throw new Error(\n `Schema for behavior '${name}' is not registered. ` +\n `Use tryGetSchema('${name}') for a non-throwing alternative.`\n );\n }\n return schema;\n}\n\n/**\n * Try to get a schema, returning undefined if not registered.\n */\nexport function tryGetSchema(name: string): BehaviorSchema | undefined {\n return schemas.get(name);\n}\n\n/**\n * Check if a behavior is registered.\n */\nexport function isRegistered(name: string): boolean {\n return behaviors.has(name);\n}\n\n/**\n * Check if a loader is registered for a behavior.\n */\nexport function hasLoader(name: string): boolean {\n return loaders.has(name);\n}\n\n/**\n * Get all registered behavior names.\n */\nexport function getRegisteredBehaviors(): string[] {\n return Array.from(behaviors.keys());\n}\n\n/**\n * Get all behavior names that have loaders (including unloaded).\n */\nexport function getAvailableBehaviors(): string[] {\n const names = new Set([...behaviors.keys(), ...loaders.keys()]);\n return Array.from(names);\n}\n\n// =============================================================================\n// Query by Metadata\n// =============================================================================\n\n/**\n * Get behavior names by category.\n */\nexport function getBehaviorsByCategory(category: BehaviorCategory): string[] {\n const result: string[] = [];\n for (const [name, schema] of schemas) {\n if (schema.category === category) {\n result.push(name);\n }\n }\n return result;\n}\n\n/**\n * Get behavior names by tier.\n */\nexport function getBehaviorsByTier(tier: BehaviorTier): string[] {\n const result: string[] = [];\n for (const [name, schema] of schemas) {\n if (schema.tier === tier) {\n result.push(name);\n }\n }\n return result;\n}\n\n/**\n * Get all schemas.\n */\nexport function getAllSchemas(): BehaviorSchema[] {\n return Array.from(schemas.values());\n}\n\n/**\n * Get all schemas as a record.\n */\nexport function getAllSchemasRecord(): Record<string, BehaviorSchema> {\n const result: Record<string, BehaviorSchema> = {};\n for (const [name, schema] of schemas) {\n result[name] = schema;\n }\n return result;\n}\n\n// =============================================================================\n// Lazy Loading (Async)\n// =============================================================================\n\n/**\n * Load a behavior by name.\n * If already loaded, returns the cached module.\n * If a loader is registered, loads and caches the module.\n */\nexport async function loadBehavior(name: string): Promise<BehaviorModule> {\n // Return cached if available\n const cached = behaviors.get(name);\n if (cached) {\n return cached;\n }\n\n // Check for in-flight load\n const inFlight = loadingPromises.get(name);\n if (inFlight) {\n return inFlight;\n }\n\n // Check for loader\n const loader = loaders.get(name);\n if (!loader) {\n throw new Error(\n `No loader registered for behavior '${name}'. ` +\n `Available loaders: ${Array.from(loaders.keys()).join(', ') || 'none'}`\n );\n }\n\n // Load and cache\n const promise = loader().then(mod => {\n const module = mod.default;\n registerBehavior(name, module);\n loadingPromises.delete(name);\n return module;\n });\n\n loadingPromises.set(name, promise);\n return promise;\n}\n\n/**\n * Preload all behaviors in a tier.\n */\nexport async function preloadTier(tier: BehaviorTier): Promise<void> {\n const names = getBehaviorsByTier(tier);\n await Promise.all(\n names.map(name =>\n loadBehavior(name).catch(err => {\n console.warn(`[behaviors] Failed to preload '${name}' (tier: ${tier}):`, err);\n })\n )\n );\n}\n\n/**\n * Preload all behaviors in a category.\n */\nexport async function preloadCategory(category: BehaviorCategory): Promise<void> {\n const names = getBehaviorsByCategory(category);\n await Promise.all(\n names.map(name =>\n loadBehavior(name).catch(err => {\n console.warn(`[behaviors] Failed to preload '${name}' (category: ${category}):`, err);\n })\n )\n );\n}\n\n/**\n * Load and register all available behaviors.\n */\nexport async function loadAll(): Promise<void> {\n const names = getAvailableBehaviors();\n await Promise.all(\n names.map(name =>\n loadBehavior(name).catch(err => {\n console.warn(`[behaviors] Failed to load '${name}':`, err);\n })\n )\n );\n}\n\n// =============================================================================\n// Runtime Registration\n// =============================================================================\n\n/**\n * Register a behavior with HyperFixi runtime.\n * Compiles and executes the behavior source.\n */\nexport async function registerWithRuntime(\n name: string,\n hyperfixi?: LokaScriptInstance\n): Promise<void> {\n const module = await loadBehavior(name);\n await module.register(hyperfixi);\n}\n\n/**\n * Register all loaded behaviors with HyperFixi runtime.\n */\nexport async function registerAllWithRuntime(hyperfixi?: LokaScriptInstance): Promise<void> {\n const registrations = Array.from(behaviors.values()).map(module => module.register(hyperfixi));\n await Promise.all(registrations);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,37 @@
1
+ import {
2
+ toggleableSchema
3
+ } from "./chunk-WUHHMDAA.js";
4
+
5
+ // src/behaviors/toggleable.ts
6
+ var toggleableSource = toggleableSchema.source;
7
+ var toggleableMetadata = toggleableSchema;
8
+ async function registerToggleable(hyperfixi) {
9
+ const hf = hyperfixi || (typeof window !== "undefined" ? window.lokascript : null);
10
+ if (!hf) {
11
+ throw new Error(
12
+ "LokaScript not found. Make sure @hyperfixi/core is loaded before registering behaviors."
13
+ );
14
+ }
15
+ const result = hf.compileSync(toggleableSchema.source, { traditional: true });
16
+ if (!result.ok) {
17
+ throw new Error(`Failed to compile Toggleable behavior: ${JSON.stringify(result.errors)}`);
18
+ }
19
+ const ctx = hf.createContext ? hf.createContext() : { locals: /* @__PURE__ */ new Map(), globals: /* @__PURE__ */ new Map() };
20
+ await hf.execute(result.ast, ctx);
21
+ }
22
+ if (typeof window !== "undefined" && window.lokascript) {
23
+ registerToggleable().catch(console.error);
24
+ }
25
+ var toggleable_default = {
26
+ source: toggleableSchema.source,
27
+ metadata: toggleableSchema,
28
+ register: registerToggleable
29
+ };
30
+
31
+ export {
32
+ toggleableSource,
33
+ toggleableMetadata,
34
+ registerToggleable,
35
+ toggleable_default
36
+ };
37
+ //# sourceMappingURL=chunk-3Q652JQB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/behaviors/toggleable.ts"],"sourcesContent":["/**\n * Toggleable Behavior\n *\n * A behavior that toggles a CSS class on click.\n * Useful for accordions, dropdowns, and toggle buttons.\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, LokaScriptWindow } 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 * Register the Toggleable behavior with LokaScript.\n */\nexport async function registerToggleable(hyperfixi?: LokaScriptInstance): Promise<void> {\n const hf =\n hyperfixi ||\n (typeof window !== 'undefined' ? (window as unknown as LokaScriptWindow).lokascript : null);\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 result = hf.compileSync(toggleableSchema.source, { traditional: true });\n\n if (!result.ok) {\n throw new Error(`Failed to compile Toggleable behavior: ${JSON.stringify(result.errors)}`);\n }\n\n const ctx = hf.createContext ? hf.createContext() : { locals: new Map(), globals: new Map() };\n await hf.execute(result.ast, ctx);\n}\n\n// Auto-register when loaded as a script tag\nif (typeof window !== 'undefined' && (window as unknown as LokaScriptWindow).lokascript) {\n registerToggleable().catch(console.error);\n}\n\nexport default {\n source: toggleableSchema.source,\n metadata: toggleableSchema,\n register: registerToggleable,\n};\n"],"mappings":";;;;;AAkBO,IAAM,mBAAmB,iBAAiB;AAC1C,IAAM,qBAAqB;AAKlC,eAAsB,mBAAmB,WAA+C;AACtF,QAAM,KACJ,cACC,OAAO,WAAW,cAAe,OAAuC,aAAa;AAExF,MAAI,CAAC,IAAI;AACP,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,GAAG,YAAY,iBAAiB,QAAQ,EAAE,aAAa,KAAK,CAAC;AAE5E,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,IAAI,MAAM,0CAA0C,KAAK,UAAU,OAAO,MAAM,CAAC,EAAE;AAAA,EAC3F;AAEA,QAAM,MAAM,GAAG,gBAAgB,GAAG,cAAc,IAAI,EAAE,QAAQ,oBAAI,IAAI,GAAG,SAAS,oBAAI,IAAI,EAAE;AAC5F,QAAM,GAAG,QAAQ,OAAO,KAAK,GAAG;AAClC;AAGA,IAAI,OAAO,WAAW,eAAgB,OAAuC,YAAY;AACvF,qBAAmB,EAAE,MAAM,QAAQ,KAAK;AAC1C;AAEA,IAAO,qBAAQ;AAAA,EACb,QAAQ,iBAAiB;AAAA,EACzB,UAAU;AAAA,EACV,UAAU;AACZ;","names":[]}
@@ -0,0 +1,62 @@
1
+ // src/schemas/sortable.schema.ts
2
+ var sortableSchema = {
3
+ name: "Sortable",
4
+ category: "ui",
5
+ tier: "common",
6
+ version: "1.0.0",
7
+ description: "Makes child elements reorderable via drag-and-drop",
8
+ parameters: [
9
+ {
10
+ name: "handle",
11
+ type: "selector",
12
+ optional: true,
13
+ default: "none",
14
+ description: "CSS selector for drag handles within items"
15
+ },
16
+ {
17
+ name: "dragClass",
18
+ type: "string",
19
+ optional: true,
20
+ default: "sorting",
21
+ description: "CSS class added to item during drag"
22
+ }
23
+ ],
24
+ events: [
25
+ { name: "sortable:start", description: "Fired when drag begins" },
26
+ {
27
+ name: "sortable:move",
28
+ description: "Fired during drag \u2014 handle this event to reorder DOM elements"
29
+ },
30
+ { name: "sortable:end", description: "Fired when drag completes" }
31
+ ],
32
+ requirements: ["Users must handle DOM reordering in sortable:move event handlers"],
33
+ source: `
34
+ behavior Sortable(handle, dragClass)
35
+ init
36
+ if no dragClass set dragClass to "sorting"
37
+ end
38
+ on pointerdown(target, clientY) from me
39
+ set item to closest <li/> in target
40
+ if no item exit
41
+ if handle
42
+ set handleEl to target.closest(handle)
43
+ if no handleEl exit
44
+ end
45
+ halt the event
46
+ add dragClass to item
47
+ trigger sortable:start on me
48
+ repeat until event pointerup from document
49
+ wait for pointermove(clientY) from document
50
+ trigger sortable:move on me
51
+ end
52
+ remove dragClass from item
53
+ trigger sortable:end on me
54
+ end
55
+ end
56
+ `.trim()
57
+ };
58
+
59
+ export {
60
+ sortableSchema
61
+ };
62
+ //# sourceMappingURL=chunk-BWZ6EGII.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schemas/sortable.schema.ts"],"sourcesContent":["import type { BehaviorSchema } from './types';\n\n/**\n * Sortable Behavior Schema\n *\n * Drag-and-drop reordering of list items.\n * Apply to a container element; children become sortable.\n *\n * Note: This behavior fires lifecycle events but does NOT automatically\n * reorder DOM elements. Users must handle actual reordering in their\n * `sortable:move` event handlers.\n */\nexport const sortableSchema: BehaviorSchema = {\n name: 'Sortable',\n category: 'ui',\n tier: 'common',\n version: '1.0.0',\n description: 'Makes child elements reorderable via drag-and-drop',\n parameters: [\n {\n name: 'handle',\n type: 'selector',\n optional: true,\n default: 'none',\n description: 'CSS selector for drag handles within items',\n },\n {\n name: 'dragClass',\n type: 'string',\n optional: true,\n default: 'sorting',\n description: 'CSS class added to item during drag',\n },\n ],\n events: [\n { name: 'sortable:start', description: 'Fired when drag begins' },\n {\n name: 'sortable:move',\n description: 'Fired during drag — handle this event to reorder DOM elements',\n },\n { name: 'sortable:end', description: 'Fired when drag completes' },\n ],\n requirements: ['Users must handle DOM reordering in sortable:move event handlers'],\n source: `\nbehavior Sortable(handle, dragClass)\n init\n if no dragClass set dragClass to \"sorting\"\n end\n on pointerdown(target, clientY) from me\n set item to closest <li/> in target\n if no item exit\n if handle\n set handleEl to target.closest(handle)\n if no handleEl 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\n`.trim(),\n};\n"],"mappings":";AAYO,IAAM,iBAAiC;AAAA,EAC5C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,MAAM,kBAAkB,aAAa,yBAAyB;AAAA,IAChE;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,EAAE,MAAM,gBAAgB,aAAa,4BAA4B;AAAA,EACnE;AAAA,EACA,cAAc,CAAC,kEAAkE;AAAA,EACjF,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBR,KAAK;AACP;","names":[]}
@@ -0,0 +1,52 @@
1
+ // src/schemas/draggable.schema.ts
2
+ var draggableSchema = {
3
+ name: "Draggable",
4
+ category: "ui",
5
+ tier: "core",
6
+ version: "1.0.0",
7
+ description: "Makes elements draggable with pointer events",
8
+ parameters: [
9
+ {
10
+ name: "dragHandle",
11
+ type: "selector",
12
+ optional: true,
13
+ default: "me",
14
+ description: "CSS selector for the drag handle element"
15
+ }
16
+ ],
17
+ events: [
18
+ { name: "draggable:start", description: "Fired when drag begins" },
19
+ { name: "draggable:move", description: "Fired during each movement" },
20
+ { name: "draggable:end", description: "Fired when drag completes" }
21
+ ],
22
+ requirements: ["position: absolute or position: fixed on the element"],
23
+ source: `
24
+ behavior Draggable(dragHandle)
25
+ init
26
+ if no dragHandle set dragHandle to me
27
+ end
28
+ on pointerdown(clientX, clientY) from dragHandle
29
+ halt the event
30
+ trigger draggable:start
31
+ measure x
32
+ set startX to it
33
+ measure y
34
+ set startY to it
35
+ set xoff to clientX - startX
36
+ set yoff to clientY - startY
37
+ repeat until event pointerup from document
38
+ wait for pointermove(clientX, clientY) or
39
+ pointerup(clientX, clientY) from document
40
+ add { left: \${clientX - xoff}px; top: \${clientY - yoff}px; }
41
+ trigger draggable:move
42
+ end
43
+ trigger draggable:end
44
+ end
45
+ end
46
+ `.trim()
47
+ };
48
+
49
+ export {
50
+ draggableSchema
51
+ };
52
+ //# sourceMappingURL=chunk-G6WR2AYR.js.map
@@ -0,0 +1 @@
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":[]}
@@ -0,0 +1,37 @@
1
+ import {
2
+ resizableSchema
3
+ } from "./chunk-V5IWDPDP.js";
4
+
5
+ // src/behaviors/resizable.ts
6
+ var resizableSource = resizableSchema.source;
7
+ var resizableMetadata = resizableSchema;
8
+ async function registerResizable(hyperfixi) {
9
+ const hf = hyperfixi || (typeof window !== "undefined" ? window.lokascript : null);
10
+ if (!hf) {
11
+ throw new Error(
12
+ "LokaScript not found. Make sure @hyperfixi/core is loaded before registering behaviors."
13
+ );
14
+ }
15
+ const result = hf.compileSync(resizableSchema.source, { traditional: true });
16
+ if (!result.ok) {
17
+ throw new Error(`Failed to compile Resizable behavior: ${JSON.stringify(result.errors)}`);
18
+ }
19
+ const ctx = hf.createContext ? hf.createContext() : { locals: /* @__PURE__ */ new Map(), globals: /* @__PURE__ */ new Map() };
20
+ await hf.execute(result.ast, ctx);
21
+ }
22
+ if (typeof window !== "undefined" && window.lokascript) {
23
+ registerResizable().catch(console.error);
24
+ }
25
+ var resizable_default = {
26
+ source: resizableSchema.source,
27
+ metadata: resizableSchema,
28
+ register: registerResizable
29
+ };
30
+
31
+ export {
32
+ resizableSource,
33
+ resizableMetadata,
34
+ registerResizable,
35
+ resizable_default
36
+ };
37
+ //# sourceMappingURL=chunk-HMRPQWQU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/behaviors/resizable.ts"],"sourcesContent":["/**\n * Resizable Behavior\n *\n * A behavior that 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, LokaScriptWindow } 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 * Register the Resizable behavior with LokaScript.\n */\nexport async function registerResizable(hyperfixi?: LokaScriptInstance): Promise<void> {\n const hf =\n hyperfixi ||\n (typeof window !== 'undefined' ? (window as unknown as LokaScriptWindow).lokascript : null);\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 result = hf.compileSync(resizableSchema.source, { traditional: true });\n\n if (!result.ok) {\n throw new Error(`Failed to compile Resizable behavior: ${JSON.stringify(result.errors)}`);\n }\n\n const ctx = hf.createContext ? hf.createContext() : { locals: new Map(), globals: new Map() };\n await hf.execute(result.ast, ctx);\n}\n\n// Auto-register when loaded as a script tag\nif (typeof window !== 'undefined' && (window as unknown as LokaScriptWindow).lokascript) {\n registerResizable().catch(console.error);\n}\n\nexport default {\n source: resizableSchema.source,\n metadata: resizableSchema,\n register: registerResizable,\n};\n"],"mappings":";;;;;AAkBO,IAAM,kBAAkB,gBAAgB;AACxC,IAAM,oBAAoB;AAKjC,eAAsB,kBAAkB,WAA+C;AACrF,QAAM,KACJ,cACC,OAAO,WAAW,cAAe,OAAuC,aAAa;AAExF,MAAI,CAAC,IAAI;AACP,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,GAAG,YAAY,gBAAgB,QAAQ,EAAE,aAAa,KAAK,CAAC;AAE3E,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,IAAI,MAAM,yCAAyC,KAAK,UAAU,OAAO,MAAM,CAAC,EAAE;AAAA,EAC1F;AAEA,QAAM,MAAM,GAAG,gBAAgB,GAAG,cAAc,IAAI,EAAE,QAAQ,oBAAI,IAAI,GAAG,SAAS,oBAAI,IAAI,EAAE;AAC5F,QAAM,GAAG,QAAQ,OAAO,KAAK,GAAG;AAClC;AAGA,IAAI,OAAO,WAAW,eAAgB,OAAuC,YAAY;AACvF,oBAAkB,EAAE,MAAM,QAAQ,KAAK;AACzC;AAEA,IAAO,oBAAQ;AAAA,EACb,QAAQ,gBAAgB;AAAA,EACxB,UAAU;AAAA,EACV,UAAU;AACZ;","names":[]}
@@ -0,0 +1,37 @@
1
+ import {
2
+ sortableSchema
3
+ } from "./chunk-BWZ6EGII.js";
4
+
5
+ // src/behaviors/sortable.ts
6
+ var sortableSource = sortableSchema.source;
7
+ var sortableMetadata = sortableSchema;
8
+ async function registerSortable(hyperfixi) {
9
+ const hf = hyperfixi || (typeof window !== "undefined" ? window.lokascript : null);
10
+ if (!hf) {
11
+ throw new Error(
12
+ "LokaScript not found. Make sure @hyperfixi/core is loaded before registering behaviors."
13
+ );
14
+ }
15
+ const result = hf.compileSync(sortableSchema.source, { traditional: true });
16
+ if (!result.ok) {
17
+ throw new Error(`Failed to compile Sortable behavior: ${JSON.stringify(result.errors)}`);
18
+ }
19
+ const ctx = hf.createContext ? hf.createContext() : { locals: /* @__PURE__ */ new Map(), globals: /* @__PURE__ */ new Map() };
20
+ await hf.execute(result.ast, ctx);
21
+ }
22
+ if (typeof window !== "undefined" && window.lokascript) {
23
+ registerSortable().catch(console.error);
24
+ }
25
+ var sortable_default = {
26
+ source: sortableSchema.source,
27
+ metadata: sortableSchema,
28
+ register: registerSortable
29
+ };
30
+
31
+ export {
32
+ sortableSource,
33
+ sortableMetadata,
34
+ registerSortable,
35
+ sortable_default
36
+ };
37
+ //# sourceMappingURL=chunk-MEP6B7XW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/behaviors/sortable.ts"],"sourcesContent":["/**\n * Sortable Behavior\n *\n * A behavior for drag-and-drop reordering of list items.\n * Apply to a container element; children become sortable.\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, LokaScriptWindow } 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 * Register the Sortable behavior with LokaScript.\n */\nexport async function registerSortable(hyperfixi?: LokaScriptInstance): Promise<void> {\n const hf =\n hyperfixi ||\n (typeof window !== 'undefined' ? (window as unknown as LokaScriptWindow).lokascript : null);\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 result = hf.compileSync(sortableSchema.source, { traditional: true });\n\n if (!result.ok) {\n throw new Error(`Failed to compile Sortable behavior: ${JSON.stringify(result.errors)}`);\n }\n\n const ctx = hf.createContext ? hf.createContext() : { locals: new Map(), globals: new Map() };\n await hf.execute(result.ast, ctx);\n}\n\n// Auto-register when loaded as a script tag\nif (typeof window !== 'undefined' && (window as unknown as LokaScriptWindow).lokascript) {\n registerSortable().catch(console.error);\n}\n\nexport default {\n source: sortableSchema.source,\n metadata: sortableSchema,\n register: registerSortable,\n};\n"],"mappings":";;;;;AAmBO,IAAM,iBAAiB,eAAe;AACtC,IAAM,mBAAmB;AAKhC,eAAsB,iBAAiB,WAA+C;AACpF,QAAM,KACJ,cACC,OAAO,WAAW,cAAe,OAAuC,aAAa;AAExF,MAAI,CAAC,IAAI;AACP,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,GAAG,YAAY,eAAe,QAAQ,EAAE,aAAa,KAAK,CAAC;AAE1E,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,IAAI,MAAM,wCAAwC,KAAK,UAAU,OAAO,MAAM,CAAC,EAAE;AAAA,EACzF;AAEA,QAAM,MAAM,GAAG,gBAAgB,GAAG,cAAc,IAAI,EAAE,QAAQ,oBAAI,IAAI,GAAG,SAAS,oBAAI,IAAI,EAAE;AAC5F,QAAM,GAAG,QAAQ,OAAO,KAAK,GAAG;AAClC;AAGA,IAAI,OAAO,WAAW,eAAgB,OAAuC,YAAY;AACvF,mBAAiB,EAAE,MAAM,QAAQ,KAAK;AACxC;AAEA,IAAO,mBAAQ;AAAA,EACb,QAAQ,eAAe;AAAA,EACvB,UAAU;AAAA,EACV,UAAU;AACZ;","names":[]}
@@ -0,0 +1,32 @@
1
+ import {
2
+ registerLoader,
3
+ registerSchema
4
+ } from "./chunk-3DVDS7CT.js";
5
+ import {
6
+ draggableSchema
7
+ } from "./chunk-G6WR2AYR.js";
8
+ import {
9
+ removableSchema
10
+ } from "./chunk-272NKUJ3.js";
11
+ import {
12
+ resizableSchema
13
+ } from "./chunk-V5IWDPDP.js";
14
+ import {
15
+ sortableSchema
16
+ } from "./chunk-BWZ6EGII.js";
17
+ import {
18
+ toggleableSchema
19
+ } from "./chunk-WUHHMDAA.js";
20
+
21
+ // src/loaders.ts
22
+ registerSchema(draggableSchema);
23
+ registerSchema(sortableSchema);
24
+ registerSchema(resizableSchema);
25
+ registerSchema(removableSchema);
26
+ registerSchema(toggleableSchema);
27
+ registerLoader("Draggable", () => import("./behaviors/draggable.js"));
28
+ registerLoader("Sortable", () => import("./behaviors/sortable.js"));
29
+ registerLoader("Resizable", () => import("./behaviors/resizable.js"));
30
+ registerLoader("Removable", () => import("./behaviors/removable.js"));
31
+ registerLoader("Toggleable", () => import("./behaviors/toggleable.js"));
32
+ //# sourceMappingURL=chunk-URBOGGW6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/loaders.ts"],"sourcesContent":["/**\n * Behavior Loaders\n *\n * Registers lazy loaders for all behaviors.\n * Import this module to enable on-demand loading without bundling all behaviors.\n *\n * @example\n * ```typescript\n * // Enable lazy loading\n * import '@hyperfixi/behaviors/loaders';\n *\n * // Now load behaviors on demand\n * import { loadBehavior } from '@hyperfixi/behaviors/registry';\n * await loadBehavior('Draggable');\n * ```\n */\n\nimport { registerLoader, registerSchema } from './registry';\n\n// Register schemas for metadata queries before loading\nimport { draggableSchema } from './schemas/draggable.schema';\nimport { sortableSchema } from './schemas/sortable.schema';\nimport { resizableSchema } from './schemas/resizable.schema';\nimport { removableSchema } from './schemas/removable.schema';\nimport { toggleableSchema } from './schemas/toggleable.schema';\n\n// Register all schemas\nregisterSchema(draggableSchema);\nregisterSchema(sortableSchema);\nregisterSchema(resizableSchema);\nregisterSchema(removableSchema);\nregisterSchema(toggleableSchema);\n\n// Register lazy loaders - behaviors are only loaded when requested\nregisterLoader('Draggable', () => import('./behaviors/draggable'));\nregisterLoader('Sortable', () => import('./behaviors/sortable'));\nregisterLoader('Resizable', () => import('./behaviors/resizable'));\nregisterLoader('Removable', () => import('./behaviors/removable'));\nregisterLoader('Toggleable', () => import('./behaviors/toggleable'));\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA2BA,eAAe,eAAe;AAC9B,eAAe,cAAc;AAC7B,eAAe,eAAe;AAC9B,eAAe,eAAe;AAC9B,eAAe,gBAAgB;AAG/B,eAAe,aAAa,MAAM,OAAO,0BAAuB,CAAC;AACjE,eAAe,YAAY,MAAM,OAAO,yBAAsB,CAAC;AAC/D,eAAe,aAAa,MAAM,OAAO,0BAAuB,CAAC;AACjE,eAAe,aAAa,MAAM,OAAO,0BAAuB,CAAC;AACjE,eAAe,cAAc,MAAM,OAAO,2BAAwB,CAAC;","names":[]}
@@ -0,0 +1,89 @@
1
+ // src/schemas/resizable.schema.ts
2
+ var resizableSchema = {
3
+ name: "Resizable",
4
+ category: "ui",
5
+ tier: "optional",
6
+ version: "1.0.0",
7
+ description: "Makes elements resizable by dragging",
8
+ parameters: [
9
+ {
10
+ name: "handle",
11
+ type: "selector",
12
+ optional: true,
13
+ default: "me",
14
+ description: "CSS selector for the resize handle (defaults to the element itself)"
15
+ },
16
+ {
17
+ name: "minWidth",
18
+ type: "number",
19
+ optional: true,
20
+ default: 50,
21
+ description: "Minimum width in pixels"
22
+ },
23
+ {
24
+ name: "minHeight",
25
+ type: "number",
26
+ optional: true,
27
+ default: 50,
28
+ description: "Minimum height in pixels"
29
+ },
30
+ {
31
+ name: "maxWidth",
32
+ type: "number",
33
+ optional: true,
34
+ default: 9999,
35
+ description: "Maximum width in pixels"
36
+ },
37
+ {
38
+ name: "maxHeight",
39
+ type: "number",
40
+ optional: true,
41
+ default: 9999,
42
+ description: "Maximum height in pixels"
43
+ }
44
+ ],
45
+ events: [
46
+ { name: "resizable:start", description: "Fired when resize begins" },
47
+ { name: "resizable:resize", description: "Fired during resize" },
48
+ { name: "resizable:end", description: "Fired when resize completes" }
49
+ ],
50
+ source: `
51
+ behavior Resizable(handle, minWidth, minHeight, maxWidth, maxHeight)
52
+ init
53
+ if no handle set handle to me
54
+ if no minWidth set minWidth to 50
55
+ if no minHeight set minHeight to 50
56
+ if no maxWidth set maxWidth to 9999
57
+ if no maxHeight set maxHeight to 9999
58
+ end
59
+ on pointerdown(clientX, clientY) from handle
60
+ halt the event
61
+ trigger resizable:start
62
+ measure width
63
+ set startWidth to it
64
+ measure height
65
+ set startHeight to it
66
+ set startX to clientX
67
+ set startY to clientY
68
+ repeat until event pointerup from document
69
+ wait for pointermove(clientX, clientY) or
70
+ pointerup from document
71
+ set newWidth to startWidth + (clientX - startX)
72
+ set newHeight to startHeight + (clientY - startY)
73
+ if newWidth < minWidth set newWidth to minWidth
74
+ if newWidth > maxWidth set newWidth to maxWidth
75
+ if newHeight < minHeight set newHeight to minHeight
76
+ if newHeight > maxHeight set newHeight to maxHeight
77
+ add { width: \${newWidth}px; height: \${newHeight}px; }
78
+ trigger resizable:resize
79
+ end
80
+ trigger resizable:end
81
+ end
82
+ end
83
+ `.trim()
84
+ };
85
+
86
+ export {
87
+ resizableSchema
88
+ };
89
+ //# sourceMappingURL=chunk-V5IWDPDP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schemas/resizable.schema.ts"],"sourcesContent":["import type { BehaviorSchema } from './types';\n\n/**\n * Resizable Behavior Schema\n *\n * Makes elements resizable by dragging edges or corners.\n * Supports minimum/maximum dimensions and resize handles.\n */\nexport const resizableSchema: BehaviorSchema = {\n name: 'Resizable',\n category: 'ui',\n tier: 'optional',\n version: '1.0.0',\n description: 'Makes elements resizable by dragging',\n parameters: [\n {\n name: 'handle',\n type: 'selector',\n optional: true,\n default: 'me',\n description: 'CSS selector for the resize handle (defaults to the element itself)',\n },\n {\n name: 'minWidth',\n type: 'number',\n optional: true,\n default: 50,\n description: 'Minimum width in pixels',\n },\n {\n name: 'minHeight',\n type: 'number',\n optional: true,\n default: 50,\n description: 'Minimum height in pixels',\n },\n {\n name: 'maxWidth',\n type: 'number',\n optional: true,\n default: 9999,\n description: 'Maximum width in pixels',\n },\n {\n name: 'maxHeight',\n type: 'number',\n optional: true,\n default: 9999,\n description: 'Maximum height in pixels',\n },\n ],\n events: [\n { name: 'resizable:start', description: 'Fired when resize begins' },\n { name: 'resizable:resize', description: 'Fired during resize' },\n { name: 'resizable:end', description: 'Fired when resize completes' },\n ],\n source: `\nbehavior Resizable(handle, minWidth, minHeight, maxWidth, maxHeight)\n init\n if no handle set handle to me\n if no minWidth set minWidth to 50\n if no minHeight set minHeight to 50\n if no maxWidth set maxWidth to 9999\n if no maxHeight set maxHeight to 9999\n end\n on pointerdown(clientX, clientY) from handle\n halt the event\n trigger resizable:start\n measure width\n set startWidth to it\n measure height\n set startHeight to it\n set startX to clientX\n set startY to clientY\n repeat until event pointerup from document\n wait for pointermove(clientX, clientY) or\n pointerup from document\n set newWidth to startWidth + (clientX - startX)\n set newHeight to startHeight + (clientY - startY)\n if newWidth < minWidth set newWidth to minWidth\n if newWidth > maxWidth set newWidth to maxWidth\n if newHeight < minHeight set newHeight to minHeight\n if newHeight > maxHeight set newHeight to maxHeight\n add { width: \\${newWidth}px; height: \\${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,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,MAAM,mBAAmB,aAAa,2BAA2B;AAAA,IACnE,EAAE,MAAM,oBAAoB,aAAa,sBAAsB;AAAA,IAC/D,EAAE,MAAM,iBAAiB,aAAa,8BAA8B;AAAA,EACtE;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCR,KAAK;AACP;","names":[]}