@hortonstudio/main 1.9.10 → 1.9.20

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 (124) hide show
  1. package/.prettierrc +8 -0
  2. package/README.md +146 -0
  3. package/eslint.config.js +32 -0
  4. package/index.ts +275 -0
  5. package/package.json +19 -2
  6. package/public/bootstrap.js +16 -0
  7. package/src/animations/animations.ts +93 -0
  8. package/src/animations/functions/counter/counter.ts +137 -0
  9. package/src/config.json +570 -0
  10. package/src/config.ts +105 -0
  11. package/src/modules/default/README.md +167 -0
  12. package/src/modules/default/default.ts +71 -0
  13. package/{autoInit → src/modules/default/functions}/accessibility/README.md +44 -12
  14. package/src/modules/default/functions/accessibility/accessibility.ts +54 -0
  15. package/src/modules/default/functions/accordion/README.md +451 -0
  16. package/src/modules/default/functions/accordion/accordion.ts +189 -0
  17. package/src/modules/default/functions/comparison/comparison.ts +424 -0
  18. package/src/modules/default/functions/marquee/marquee.ts +206 -0
  19. package/src/modules/default/functions/navbar/README.md +393 -0
  20. package/src/modules/default/functions/navbar/functions/arrow-navigation/arrow-navigation.ts +183 -0
  21. package/src/modules/default/functions/navbar/functions/dropdown/dropdown.ts +313 -0
  22. package/src/modules/default/functions/navbar/functions/menu/menu.ts +315 -0
  23. package/src/modules/default/functions/navbar/navbar.ts +51 -0
  24. package/{autoInit → src/modules/default/functions}/smooth-scroll/README.md +45 -14
  25. package/{autoInit/smooth-scroll/smooth-scroll.js → src/modules/default/functions/smooth-scroll/smooth-scroll.ts} +33 -38
  26. package/{autoInit → src/modules/default/functions}/transition/README.md +59 -32
  27. package/src/modules/default/functions/transition/transition.ts +290 -0
  28. package/src/modules/normalize/README.md +172 -0
  29. package/src/modules/normalize/functions/clickable/README.md +84 -0
  30. package/src/modules/normalize/functions/clickable/clickable.ts +43 -0
  31. package/src/modules/normalize/functions/clickable/functions/normalize/README.md +213 -0
  32. package/src/modules/normalize/functions/clickable/functions/normalize/normalize.ts +68 -0
  33. package/src/modules/normalize/functions/dupe/README.md +405 -0
  34. package/src/modules/normalize/functions/dupe/dupe.ts +197 -0
  35. package/src/modules/normalize/functions/sync/sync.ts +378 -0
  36. package/src/modules/normalize/normalize.ts +58 -0
  37. package/src/modules/structure/README.md +190 -0
  38. package/src/modules/structure/functions/form/README.md +94 -0
  39. package/src/modules/structure/functions/form/form.ts +54 -0
  40. package/src/modules/structure/functions/form/functions/honeypot/README.md +77 -0
  41. package/src/modules/structure/functions/form/functions/honeypot/honeypot.ts +37 -0
  42. package/src/modules/structure/functions/form/functions/range/README.md +410 -0
  43. package/src/modules/structure/functions/form/functions/range/range.ts +92 -0
  44. package/src/modules/structure/functions/form/functions/select/README.md +393 -0
  45. package/src/modules/structure/functions/form/functions/select/functions/custom-select/custom-select.ts +637 -0
  46. package/src/modules/structure/functions/form/functions/select/functions/states/states.ts +118 -0
  47. package/src/modules/structure/functions/form/functions/select/select.ts +48 -0
  48. package/src/modules/structure/functions/form/functions/test/test.ts +132 -0
  49. package/src/modules/structure/functions/pagination/README.md +527 -0
  50. package/src/modules/structure/functions/pagination/pagination.ts +493 -0
  51. package/src/modules/structure/functions/site-settings/README.md +395 -0
  52. package/src/modules/structure/functions/site-settings/site-settings.ts +158 -0
  53. package/{autoInit/accessibility → src/modules/structure}/functions/toc/README.md +18 -15
  54. package/{autoInit/accessibility/functions/toc/toc.js → src/modules/structure/functions/toc/functions/heading-links/heading-links.ts} +43 -63
  55. package/src/modules/structure/functions/toc/functions/progress-bar/progress-bar.ts +101 -0
  56. package/src/modules/structure/functions/toc/toc.ts +35 -0
  57. package/{autoInit/accessibility → src/modules/structure}/functions/year-replacement/README.md +7 -6
  58. package/src/modules/structure/functions/year-replacement/year-replacement.ts +59 -0
  59. package/src/modules/structure/structure.ts +59 -0
  60. package/src/utils/attributeSelector.ts +78 -0
  61. package/src/utils/cssVariables.ts +24 -0
  62. package/src/utils/gsap.ts +198 -0
  63. package/src/utils/heightAnimator.ts +130 -0
  64. package/src/utils/modalManager.ts +150 -0
  65. package/src/utils.ts +54 -0
  66. package/tsconfig.json +24 -0
  67. package/vite.config.js +45 -0
  68. package/.claude/settings.local.json +0 -70
  69. package/archive/hero.js +0 -794
  70. package/archive/modal.js +0 -80
  71. package/archive/text.js +0 -628
  72. package/autoInit/accessibility/accessibility.js +0 -53
  73. package/autoInit/accessibility/functions/blog-remover/README.md +0 -61
  74. package/autoInit/accessibility/functions/blog-remover/blog-remover.js +0 -31
  75. package/autoInit/accessibility/functions/click-forwarding/README.md +0 -60
  76. package/autoInit/accessibility/functions/click-forwarding/click-forwarding.js +0 -82
  77. package/autoInit/accessibility/functions/dropdown/README.md +0 -212
  78. package/autoInit/accessibility/functions/dropdown/dropdown.js +0 -167
  79. package/autoInit/accessibility/functions/list-accessibility/README.md +0 -56
  80. package/autoInit/accessibility/functions/list-accessibility/list-accessibility.js +0 -23
  81. package/autoInit/accessibility/functions/pagination/README.md +0 -428
  82. package/autoInit/accessibility/functions/pagination/pagination.js +0 -359
  83. package/autoInit/accessibility/functions/text-synchronization/README.md +0 -62
  84. package/autoInit/accessibility/functions/text-synchronization/text-synchronization.js +0 -101
  85. package/autoInit/accessibility/functions/year-replacement/year-replacement.js +0 -43
  86. package/autoInit/button/README.md +0 -122
  87. package/autoInit/button/button.js +0 -51
  88. package/autoInit/counter/README.md +0 -274
  89. package/autoInit/counter/counter.js +0 -185
  90. package/autoInit/form/README.md +0 -338
  91. package/autoInit/form/form.js +0 -374
  92. package/autoInit/navbar/README.md +0 -366
  93. package/autoInit/navbar/navbar.js +0 -786
  94. package/autoInit/site-settings/README.md +0 -218
  95. package/autoInit/site-settings/site-settings.js +0 -134
  96. package/autoInit/transition/transition.js +0 -116
  97. package/index.js +0 -305
  98. package/utils/before-after/README.md +0 -520
  99. package/utils/before-after/before-after.js +0 -653
  100. package/utils/css-animations/buttons/main/bgbasic/btn-main-bgbasic.html +0 -10
  101. package/utils/css-animations/buttons/main/bgfill/btn-main-bgfill.html +0 -29
  102. package/utils/css-animations/buttons/navbar/bgbasic/navbar-main-bgbasic.html +0 -17
  103. package/utils/css-animations/buttons/navbar/bgbasic/navbar-menu-bgbasic.html +0 -16
  104. package/utils/css-animations/buttons/navbar/bgfill/navbar-main-bgfill.html +0 -46
  105. package/utils/css-animations/buttons/navbar/bgfill/navbar-menu-bgfill.html +0 -39
  106. package/utils/css-animations/buttons/navbar/color/navbar-announce-color.html +0 -5
  107. package/utils/css-animations/buttons/navbar/color/navbar-main-color.html +0 -7
  108. package/utils/css-animations/buttons/navbar/color/navbar-menu-color.html +0 -7
  109. package/utils/css-animations/buttons/navbar/double-slide/navbar-announce-double-slide.html +0 -40
  110. package/utils/css-animations/buttons/navbar/double-slide/navbar-main-double-slide.html +0 -77
  111. package/utils/css-animations/buttons/navbar/scale/navbar-announce-scale.html +0 -6
  112. package/utils/css-animations/buttons/navbar/scale/navbar-main-scale.html +0 -9
  113. package/utils/css-animations/buttons/navbar/scale/navbar-menu-scale.html +0 -8
  114. package/utils/css-animations/buttons/navbar/underline/navbar-announce-underline.html +0 -32
  115. package/utils/css-animations/buttons/navbar/underline/navbar-main-underline.html +0 -56
  116. package/utils/css-animations/buttons/text/color/text-footer-color.html +0 -5
  117. package/utils/css-animations/buttons/text/color/text-main-color.html +0 -5
  118. package/utils/css-animations/buttons/text/double-slide/text-main-double-slide.html +0 -56
  119. package/utils/css-animations/buttons/text/scale/text-footer-scale.html +0 -6
  120. package/utils/css-animations/buttons/text/scale/text-main-scale.html +0 -6
  121. package/utils/css-animations/buttons/text/underline/text-footer-underline.html +0 -45
  122. package/utils/css-animations/buttons/text/underline/text-main-underline.html +0 -58
  123. package/utils/css-animations/cards/card-clickable.html +0 -11
  124. package/utils/css-animations/defaults.html +0 -69
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Counter Module
3
+ *
4
+ * GSAP-powered number counter that triggers on scroll into viewport.
5
+ * Supports decimals, prefixes, and suffixes with smooth easing.
6
+ *
7
+ * Usage:
8
+ * <span data-hs-anim="counter">1000</span>
9
+ *
10
+ * Attributes:
11
+ * data-hs-anim="counter" - Number element to animate (required)
12
+ *
13
+ * Features:
14
+ * - Auto-detects decimals, prefixes, suffixes
15
+ * - Respects prefers-reduced-motion
16
+ * - Triggers on scroll into viewport
17
+ * - Accessible with aria-live announcements
18
+ */
19
+
20
+ import { querySelectorAll, getGsap, prefersReducedMotion } from '@utils';
21
+
22
+ export async function init(config: any) {
23
+ // Skip if user prefers reduced motion
24
+ if (prefersReducedMotion()) {
25
+ return { result: 'counter skipped - prefers-reduced-motion enabled' };
26
+ }
27
+
28
+ const gsapLib = getGsap('counter');
29
+ if (!gsapLib) {
30
+ return { result: 'counter skipped - GSAP not loaded' };
31
+ }
32
+
33
+ const { gsap, ScrollTrigger } = gsapLib;
34
+
35
+ if (ScrollTrigger) {
36
+ gsap.registerPlugin(ScrollTrigger);
37
+ }
38
+
39
+ const counters = querySelectorAll(config, 'counter');
40
+ const cleanup = {
41
+ timelines: [],
42
+ scrollTriggers: [],
43
+ };
44
+
45
+ function parseText(text: string) {
46
+ // Remove commas from the text before parsing
47
+ const cleanText = text.replace(/,/g, '');
48
+ const match = cleanText.match(/([^\d.]*)(\d*\.?\d+)(.*)/);
49
+ if (!match) {
50
+ return { prefix: '', number: 0, suffix: '' };
51
+ }
52
+ return {
53
+ prefix: match[1] || '',
54
+ number: parseFloat(match[2]),
55
+ suffix: match[3] || '',
56
+ };
57
+ }
58
+
59
+ counters.forEach((counter) => {
60
+ const htmlElement = counter as HTMLElement;
61
+ const originalText = htmlElement.textContent?.trim() || '';
62
+ const parsed = parseText(originalText);
63
+ const decimals = (parsed.number.toString().split('.')[1] || '').length;
64
+
65
+ // Check if original had commas (for numbers >= 1000)
66
+ const hasCommas = originalText.includes(',');
67
+
68
+ // Add accessibility attributes
69
+ htmlElement.setAttribute('aria-live', 'polite');
70
+ htmlElement.setAttribute('aria-atomic', 'true');
71
+
72
+ // Create a temporary object to animate
73
+ const counterObj = { value: 0 };
74
+
75
+ // Create GSAP animation
76
+ const tl = gsap.timeline({ paused: true });
77
+
78
+ tl.to(counterObj, {
79
+ value: parsed.number,
80
+ duration: 3,
81
+ ease: 'power4.out',
82
+ onUpdate: function () {
83
+ const currentValue = counterObj.value;
84
+ let formatted =
85
+ decimals > 0 ? currentValue.toFixed(decimals) : Math.round(currentValue).toString();
86
+
87
+ // Add commas if original had them
88
+ if (hasCommas) {
89
+ formatted = formatted.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
90
+ }
91
+
92
+ htmlElement.textContent = `${parsed.prefix}${formatted}${parsed.suffix}`;
93
+ },
94
+ onComplete: function () {
95
+ // Set final exact value
96
+ htmlElement.textContent = originalText;
97
+ },
98
+ });
99
+
100
+ cleanup.timelines.push(tl);
101
+
102
+ // Use ScrollTrigger to play animation on scroll into view
103
+ if (ScrollTrigger) {
104
+ const st = ScrollTrigger.create({
105
+ trigger: counter,
106
+ start: 'top bottom',
107
+ once: true,
108
+ onEnter: () => {
109
+ (tl as any).play();
110
+ },
111
+ });
112
+ cleanup.scrollTriggers.push(st);
113
+ } else {
114
+ // Fallback: play immediately if no ScrollTrigger
115
+ (tl as any).play();
116
+ }
117
+ });
118
+
119
+ return {
120
+ result: `counter initialized (${counters.length} instances)`,
121
+ destroy: () => {
122
+ // Kill all timelines
123
+ cleanup.timelines.forEach((tl) => {
124
+ if (tl) (tl as any).kill();
125
+ });
126
+
127
+ // Kill all scroll triggers
128
+ cleanup.scrollTriggers.forEach((st) => {
129
+ if (st) (st as any).kill();
130
+ });
131
+
132
+ // Clear arrays
133
+ cleanup.timelines.length = 0;
134
+ cleanup.scrollTriggers.length = 0;
135
+ },
136
+ };
137
+ }
@@ -0,0 +1,570 @@
1
+ {
2
+ "_global": {
3
+ "version": "2.0.0",
4
+ "apiName": "hsmain",
5
+ "attributes": {
6
+ "height": "data-hs-height",
7
+ "heightValue": "element",
8
+ "heightDuration": "data-hs-height-duration",
9
+ "heightEase": "data-hs-height-ease",
10
+ "moduleType": "data-hs-module-type",
11
+ "module": "data-hs-module"
12
+ },
13
+ "classes": {
14
+ "modalOpen": "hs-modal-open",
15
+ "overflowHidden": "u-overflow-hidden",
16
+ "initialized": "hs-main",
17
+ "displayContents": "u-display-contents",
18
+ "active": "is-active",
19
+ "gsap": "hs-gsap"
20
+ },
21
+ "cssVars": {
22
+ "prefix": "--_hs---",
23
+ "state": {
24
+ "name": "state",
25
+ "values": {
26
+ "active": "1",
27
+ "inactive": "0"
28
+ }
29
+ },
30
+ "clip": {
31
+ "name": "clip"
32
+ }
33
+ },
34
+ "clickable": {
35
+ "module": "global-clickable",
36
+ "attributes": {
37
+ "elements": {
38
+ "wrapper": {
39
+ "primary": "data-hs-clickable='wrapper'",
40
+ "aliases": []
41
+ },
42
+ "button": {
43
+ "primary": "data-hs-clickable='button'",
44
+ "aliases": []
45
+ }
46
+ }
47
+ }
48
+ }
49
+ },
50
+ "normalize": {
51
+ "sync": {
52
+ "module": "sync",
53
+ "description": "Syncs collection list data to static lists with matching structure",
54
+ "attributes": {
55
+ "elements": {
56
+ "source": {
57
+ "primary": "data-hs-sync='source'",
58
+ "aliases": []
59
+ },
60
+ "target": {
61
+ "primary": "data-hs-sync='target'",
62
+ "aliases": []
63
+ },
64
+ "item": {
65
+ "primary": "data-hs-sync='item'",
66
+ "aliases": []
67
+ },
68
+ "ignore": {
69
+ "primary": "data-hs-sync='ignore'",
70
+ "aliases": []
71
+ }
72
+ },
73
+ "properties": {
74
+ "syncId": "data-hs-sync-id",
75
+ "syncField": "data-hs-sync-field",
76
+ "syncMode": "data-hs-sync-mode"
77
+ }
78
+ }
79
+ },
80
+ "clickable": {
81
+ "module": "clickable",
82
+ "attributes": {
83
+ "elements": {
84
+ "wrapper": {
85
+ "primary": "data-hs-clickable='wrapper'",
86
+ "aliases": []
87
+ }
88
+ }
89
+ },
90
+ "normalize": {
91
+ "module": "normalize",
92
+ "description": "Normalizes clickable wrappers by keeping either button or link based on href validity",
93
+ "attributes": {
94
+ "elements": {
95
+ "wrapper": {
96
+ "primary": "data-hs-clickable='wrapper'",
97
+ "aliases": []
98
+ },
99
+ "button": {
100
+ "primary": "data-hs-clickable='button'",
101
+ "aliases": []
102
+ }
103
+ }
104
+ }
105
+ }
106
+ },
107
+ "dupe": {
108
+ "module": "dupe",
109
+ "description": "Duplicates elements or their children based on specified modes",
110
+ "attributes": {
111
+ "elements": {
112
+ "wrapper": {
113
+ "primary": "data-hs-dupe",
114
+ "aliases": []
115
+ }
116
+ },
117
+ "properties": {
118
+ "count": "data-hs-dupe-count",
119
+ "hidden": "data-hs-dupe-hidden",
120
+ "noSelect": "data-hs-dupe-no-select"
121
+ }
122
+ },
123
+ "modes": {
124
+ "child": "Duplicates the first direct child element",
125
+ "self": "Duplicates the element itself as a sibling"
126
+ },
127
+ "modifiers": {
128
+ "hidden": "Adds aria-hidden='true' to clones for accessibility",
129
+ "noSelect": "Adds user-select: none to clones to prevent text selection"
130
+ },
131
+ "limits": {
132
+ "maxCount": 20
133
+ }
134
+ }
135
+ },
136
+ "structure": {
137
+ "year-replacement": {
138
+ "module": "year-replacement",
139
+ "attributes": {
140
+ "placeholders": {
141
+ "year": "{{year}}",
142
+ "month": "{{month}}"
143
+ }
144
+ }
145
+ },
146
+ "toc": {
147
+ "module": "toc",
148
+ "description": "Table of contents with heading links and optional progress bar",
149
+ "attributes": {
150
+ "elements": {
151
+ "content": {
152
+ "primary": "data-hs-toc='content'",
153
+ "aliases": []
154
+ },
155
+ "list": {
156
+ "primary": "data-hs-toc='list'",
157
+ "aliases": []
158
+ }
159
+ }
160
+ },
161
+ "progress-bar": {
162
+ "module": "progress-bar",
163
+ "attributes": {
164
+ "elements": {
165
+ "wrapper": {
166
+ "primary": "data-hs-toc-progress='wrapper'",
167
+ "aliases": []
168
+ },
169
+ "element": {
170
+ "primary": "data-hs-toc-progress='element'",
171
+ "aliases": []
172
+ }
173
+ }
174
+ }
175
+ }
176
+ },
177
+ "pagination": {
178
+ "module": "pagination",
179
+ "attributes": {
180
+ "elements": {
181
+ "wrapper": {
182
+ "primary": "data-hs-pagination='wrapper'",
183
+ "aliases": []
184
+ },
185
+ "list": {
186
+ "primary": "data-hs-pagination='list'",
187
+ "aliases": []
188
+ },
189
+ "controls": {
190
+ "primary": "data-hs-pagination='controls'",
191
+ "aliases": []
192
+ },
193
+ "previous": {
194
+ "primary": "data-hs-pagination='previous'",
195
+ "aliases": []
196
+ },
197
+ "next": {
198
+ "primary": "data-hs-pagination='next'",
199
+ "aliases": []
200
+ },
201
+ "counter": {
202
+ "primary": "data-hs-pagination='counter'",
203
+ "aliases": []
204
+ },
205
+ "dots": {
206
+ "primary": "data-hs-pagination='dots'",
207
+ "aliases": []
208
+ }
209
+ }
210
+ }
211
+ },
212
+ "site-settings": {
213
+ "module": "site-settings",
214
+ "attributes": {
215
+ "elements": {
216
+ "wrapper": {
217
+ "primary": "data-site-settings-element='wrapper'",
218
+ "aliases": []
219
+ },
220
+ "list": {
221
+ "primary": "data-site-settings-element='list'",
222
+ "aliases": []
223
+ },
224
+ "setting": {
225
+ "primary": "data-site-settings",
226
+ "aliases": []
227
+ },
228
+ "hide": {
229
+ "primary": "data-site-settings-hide",
230
+ "aliases": []
231
+ }
232
+ }
233
+ }
234
+ },
235
+ "form": {
236
+ "honeypot": {
237
+ "module": "honeypot",
238
+ "attributes": {
239
+ "elements": {
240
+ "form-handler": {
241
+ "primary": "data-hs-form='form-handler'",
242
+ "aliases": []
243
+ }
244
+ }
245
+ }
246
+ },
247
+ "range": {
248
+ "module": "range",
249
+ "attributes": {
250
+ "elements": {
251
+ "wrapper": {
252
+ "primary": "data-hs-form-range='wrapper'",
253
+ "aliases": []
254
+ },
255
+ "output": {
256
+ "primary": "data-hs-form-range='output'",
257
+ "aliases": []
258
+ }
259
+ }
260
+ }
261
+ },
262
+ "test": {
263
+ "module": "form-test",
264
+ "attributes": {
265
+ "elements": {
266
+ "wrapper": {
267
+ "primary": "data-hs-form-test='wrapper'",
268
+ "aliases": []
269
+ },
270
+ "info": {
271
+ "primary": "data-hs-form-test='info'",
272
+ "aliases": []
273
+ }
274
+ }
275
+ }
276
+ },
277
+ "select": {
278
+ "module": "select",
279
+ "attributes": {
280
+ "elements": {
281
+ "wrapper": {
282
+ "primary": "data-hs-form-select='wrapper'",
283
+ "aliases": []
284
+ },
285
+ "list": {
286
+ "primary": "data-hs-form-select='list'",
287
+ "aliases": []
288
+ },
289
+ "button": {
290
+ "primary": "data-hs-form-select='button'",
291
+ "aliases": []
292
+ }
293
+ }
294
+ },
295
+ "states": {
296
+ "module": "select-states",
297
+ "attributes": {
298
+ "elements": {
299
+ "states": {
300
+ "primary": "data-hs-form-select='states'",
301
+ "aliases": []
302
+ }
303
+ }
304
+ }
305
+ },
306
+ "custom-select": {
307
+ "module": "select-custom",
308
+ "attributes": {
309
+ "elements": {
310
+ "wrapper": {
311
+ "primary": "data-hs-form-select='wrapper'",
312
+ "aliases": []
313
+ },
314
+ "list": {
315
+ "primary": "data-hs-form-select='list'",
316
+ "aliases": []
317
+ },
318
+ "button": {
319
+ "primary": "data-hs-form-select='button'",
320
+ "aliases": []
321
+ }
322
+ }
323
+ }
324
+ }
325
+ }
326
+ }
327
+ },
328
+ "default": {
329
+ "transition": {
330
+ "module": "transition",
331
+ "attributes": {
332
+ "elements": {
333
+ "element": {
334
+ "primary": "data-hs-transition='element'",
335
+ "aliases": []
336
+ },
337
+ "exitTrigger": {
338
+ "primary": "data-hs-transition-exit-trigger",
339
+ "aliases": []
340
+ },
341
+ "enterTrigger": {
342
+ "primary": "data-hs-transition-enter-trigger",
343
+ "aliases": []
344
+ },
345
+ "namespace": {
346
+ "primary": "data-hs-transition-namespace",
347
+ "aliases": []
348
+ },
349
+ "exitTime": {
350
+ "primary": "data-hs-exit-time",
351
+ "aliases": []
352
+ },
353
+ "enterTime": {
354
+ "primary": "data-hs-enter-time",
355
+ "aliases": []
356
+ },
357
+ "exitDelay": {
358
+ "primary": "data-hs-exit-delay",
359
+ "aliases": []
360
+ },
361
+ "enterDelay": {
362
+ "primary": "data-hs-enter-delay",
363
+ "aliases": []
364
+ }
365
+ }
366
+ }
367
+ },
368
+ "smooth-scroll": {
369
+ "module": "smooth-scroll",
370
+ "attributes": {
371
+ "elements": {},
372
+ "note": "This module auto-detects anchor links (a[href^='#']) and does not require data attributes"
373
+ }
374
+ },
375
+ "accordion": {
376
+ "module": "accordion",
377
+ "attributes": {
378
+ "elements": {
379
+ "wrapper": {
380
+ "primary": "data-hs-accordion='wrapper'",
381
+ "aliases": []
382
+ },
383
+ "toggle": {
384
+ "primary": "data-hs-accordion='toggle'",
385
+ "aliases": []
386
+ },
387
+ "content": {
388
+ "primary": "data-hs-accordion='content'",
389
+ "aliases": []
390
+ },
391
+ "state": {
392
+ "primary": "data-hs-accordion-text='state'",
393
+ "aliases": []
394
+ }
395
+ },
396
+ "properties": {
397
+ "default": "data-hs-accordion-default",
398
+ "open": "data-hs-accordion-open",
399
+ "closed": "data-hs-accordion-closed"
400
+ }
401
+ }
402
+ },
403
+ "comparison": {
404
+ "module": "comparison",
405
+ "attributes": {
406
+ "elements": {
407
+ "wrapper": {
408
+ "primary": "data-hs-comparison='wrapper'",
409
+ "aliases": []
410
+ },
411
+ "template-list": {
412
+ "primary": "data-hs-comparison-template='list'",
413
+ "aliases": []
414
+ },
415
+ "template-item": {
416
+ "primary": "data-hs-comparison-template='item'",
417
+ "aliases": []
418
+ },
419
+ "template-name": {
420
+ "primary": "data-hs-comparison-template='name'",
421
+ "aliases": []
422
+ },
423
+ "template-description": {
424
+ "primary": "data-hs-comparison-template='description'",
425
+ "aliases": []
426
+ },
427
+ "template-before-image": {
428
+ "primary": "data-hs-comparison-template='before-image'",
429
+ "aliases": []
430
+ },
431
+ "template-after-image": {
432
+ "primary": "data-hs-comparison-template='after-image'",
433
+ "aliases": []
434
+ },
435
+ "name": {
436
+ "primary": "data-hs-comparison='name'",
437
+ "aliases": []
438
+ },
439
+ "description": {
440
+ "primary": "data-hs-comparison='description'",
441
+ "aliases": []
442
+ },
443
+ "image-wrapper": {
444
+ "primary": "data-hs-comparison='image-wrapper'",
445
+ "aliases": []
446
+ },
447
+ "before-image": {
448
+ "primary": "data-hs-comparison-image='before'",
449
+ "aliases": []
450
+ },
451
+ "after-image": {
452
+ "primary": "data-hs-comparison-image='after'",
453
+ "aliases": []
454
+ },
455
+ "slider": {
456
+ "primary": "data-hs-comparison='slider'",
457
+ "aliases": []
458
+ },
459
+ "pagination": {
460
+ "primary": "data-hs-comparison='pagination'",
461
+ "aliases": []
462
+ }
463
+ },
464
+ "properties": {
465
+ "modeType": "data-hs-comparison-mode",
466
+ "navType": "data-hs-comparison-nav"
467
+ }
468
+ }
469
+ },
470
+ "marquee": {
471
+ "module": "marquee",
472
+ "attributes": {
473
+ "elements": {
474
+ "wrapper": {
475
+ "primary": "data-hs-marquee='wrapper'",
476
+ "aliases": []
477
+ }
478
+ },
479
+ "properties": {
480
+ "direction": "data-hs-marquee-direction",
481
+ "duration": "data-hs-marquee-duration",
482
+ "scrollMultiplier": "data-hs-marquee-scroll",
483
+ "type": "data-hs-marquee-type"
484
+ }
485
+ },
486
+ "defaults": {
487
+ "duration": "25",
488
+ "scrollMultiplier": "0"
489
+ }
490
+ },
491
+ "navbar": {
492
+ "module": "navbar",
493
+ "description": "Main navigation orchestrator with modular functions",
494
+ "attributes": {
495
+ "elements": {
496
+ "wrapper": {
497
+ "primary": "data-hs-nav='wrapper'",
498
+ "aliases": []
499
+ },
500
+ "skip-link": {
501
+ "primary": "data-hs-nav='skip-link'",
502
+ "aliases": []
503
+ }
504
+ }
505
+ },
506
+ "dropdown": {
507
+ "module": "dropdown",
508
+ "description": "Navigation dropdown with hover or click behavior",
509
+ "attributes": {
510
+ "elements": {
511
+ "wrapper": {
512
+ "primary": "data-hs-nav-dropdown='wrapper'",
513
+ "aliases": []
514
+ },
515
+ "list": {
516
+ "primary": "data-hs-nav-dropdown='list'",
517
+ "aliases": []
518
+ }
519
+ },
520
+ "properties": {
521
+ "type": "data-hs-nav-dropdown-type"
522
+ }
523
+ },
524
+ "types": {
525
+ "hover": "Desktop behavior: hover + full keyboard navigation (ArrowDown/Up, Space, Enter, Escape)",
526
+ "click": "Mobile/accordion behavior: click only + simple keyboard (Space, Enter, Escape)"
527
+ }
528
+ },
529
+ "menu": {
530
+ "module": "menu",
531
+ "description": "Mobile menu button and modal behavior",
532
+ "attributes": {
533
+ "elements": {
534
+ "wrapper": {
535
+ "primary": "data-hs-nav-menu='wrapper'",
536
+ "aliases": []
537
+ },
538
+ "button": {
539
+ "primary": "data-hs-nav-menu='button'",
540
+ "aliases": []
541
+ }
542
+ }
543
+ }
544
+ },
545
+ "arrow-navigation": {
546
+ "module": "arrow-navigation",
547
+ "description": "Keyboard arrow navigation for desktop navbar and mobile menu"
548
+ }
549
+ }
550
+ },
551
+ "animations": {
552
+ "module": "animations",
553
+ "description": "Conditionally loaded GSAP animations based on DOM presence",
554
+ "counter": {
555
+ "module": "counter",
556
+ "attributes": {
557
+ "elements": {
558
+ "wrapper": {
559
+ "primary": "data-hs-counter='wrapper'",
560
+ "aliases": []
561
+ },
562
+ "counter": {
563
+ "primary": "data-hs-anim='counter'",
564
+ "aliases": []
565
+ }
566
+ }
567
+ }
568
+ }
569
+ }
570
+ }