well-petal 0.0.63 → 0.0.64

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 (2) hide show
  1. package/dist/petal.js +4 -4
  2. package/package.json +1 -1
package/dist/petal.js CHANGED
@@ -226,7 +226,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
226
226
  \***************************************************/
227
227
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
228
228
 
229
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ animateClose: () => (/* binding */ animateClose),\n/* harmony export */ animateOpen: () => (/* binding */ animateOpen),\n/* harmony export */ initializeDrawerPosition: () => (/* binding */ initializeDrawerPosition)\n/* harmony export */ });\n/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! gsap */ \"./node_modules/gsap/index.js\");\n/* harmony import */ var _lib_animations__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/animations */ \"./src/lib/animations.ts\");\n/* harmony import */ var _lib_attributes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../lib/attributes */ \"./src/lib/attributes.ts\");\n/**\n * Dropdown Animator Module\n *\n * Handles GSAP animations for dropdown menus including:\n * - Opening/closing animations\n * - Overlay fade transitions\n * - Timeline management\n */\n\n\n\n// Animation mapping\nconst animationOpenMap = {\n \"slide-down\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownOpenSlideDown,\n \"slide-up\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownOpenSlideUp,\n \"slide-left\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownOpenSlideLeft,\n \"slide-right\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownOpenSlideRight,\n};\nconst animationCloseMap = {\n \"slide-down\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownCloseSlideDown,\n \"slide-up\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownCloseSlideUp,\n \"slide-left\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownCloseSlideLeft,\n \"slide-right\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownCloseSlideRight,\n};\n/**\n * Animates dropdown opening with GSAP\n */\nfunction animateOpen(elements, currentAnim, currentOffset, config, index) {\n console.log(`Dropdown ${index + 1} - performOpen() executing with GSAP`);\n const { toggle, menu, overlay } = elements;\n const animFunc = animationOpenMap[currentAnim];\n const anim = animFunc(currentOffset);\n // Create GSAP timeline\n const tl = gsap__WEBPACK_IMPORTED_MODULE_2__.gsap.timeline();\n // Find the drawer element to animate\n const drawer = menu.querySelector(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_1__.ATTR_PETAL_ELEMENT}='dropdown-drawer']`);\n // Set menu to visible with flex display\n tl.set(menu, { display: \"flex\", visibility: \"visible\" });\n // Set overlay to flex and visible if it exists\n if (overlay) {\n tl.set(overlay, { display: \"flex\", visibility: \"visible\" }, \"<\");\n }\n // Animate the drawer\n if (drawer) {\n anim.to.duration = config.animOpenSpeed;\n tl.fromTo(drawer, anim.from, anim.to, \"<\");\n }\n // Update ARIA and state\n toggle.setAttribute(_lib_attributes__WEBPACK_IMPORTED_MODULE_1__.ARIA_EXPANDED, \"true\");\n menu.classList.add(_lib_attributes__WEBPACK_IMPORTED_MODULE_1__.CLASS_DROPDOWN_OPEN);\n // Fade in overlay\n if (overlay) {\n tl.to(overlay, { opacity: 1, duration: config.animOpenSpeed }, \"<\");\n }\n return tl;\n}\n/**\n * Animates dropdown closing with GSAP\n */\nfunction animateClose(elements, currentAnim, currentOffset, config, index) {\n console.log(`Dropdown ${index + 1} - closeDropdown() executing with GSAP`);\n const { toggle, menu, overlay } = elements;\n const animFunc = animationCloseMap[currentAnim];\n const anim = animFunc(currentOffset);\n // Create GSAP timeline\n const tl = gsap__WEBPACK_IMPORTED_MODULE_2__.gsap.timeline({\n onComplete: () => {\n // Set visibility to hidden after animation completes\n gsap__WEBPACK_IMPORTED_MODULE_2__.gsap.set(menu, { visibility: \"hidden\" });\n if (overlay) {\n gsap__WEBPACK_IMPORTED_MODULE_2__.gsap.set(overlay, { display: \"none\", visibility: \"hidden\" });\n }\n },\n });\n // Find the drawer element to animate\n const drawer = menu.querySelector(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_1__.ATTR_PETAL_ELEMENT}='dropdown-drawer']`);\n // Animate the drawer\n if (drawer) {\n anim.to.duration = config.animCloseSpeed;\n tl.fromTo(drawer, anim.from, anim.to);\n }\n // Update ARIA and state\n toggle.setAttribute(_lib_attributes__WEBPACK_IMPORTED_MODULE_1__.ARIA_EXPANDED, \"false\");\n menu.classList.remove(_lib_attributes__WEBPACK_IMPORTED_MODULE_1__.CLASS_DROPDOWN_OPEN);\n // Fade out overlay\n if (overlay) {\n tl.to(overlay, { opacity: 0, duration: config.animCloseSpeed }, \"<\");\n }\n return tl;\n}\n/**\n * Initialize drawer to its animation's starting position\n */\nfunction initializeDrawerPosition(menu, currentAnim, currentOffset) {\n const drawer = menu.querySelector(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_1__.ATTR_PETAL_ELEMENT}='dropdown-drawer']`);\n if (drawer) {\n const animFunc = animationOpenMap[currentAnim];\n const anim = animFunc(currentOffset);\n gsap__WEBPACK_IMPORTED_MODULE_2__.gsap.set(drawer, anim.from);\n }\n}\n\n\n//# sourceURL=webpack://petal/./src/modules/dropdown/dropdown-animator.ts?");
229
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ animateClose: () => (/* binding */ animateClose),\n/* harmony export */ animateOpen: () => (/* binding */ animateOpen),\n/* harmony export */ initializeDrawerPosition: () => (/* binding */ initializeDrawerPosition)\n/* harmony export */ });\n/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! gsap */ \"./node_modules/gsap/index.js\");\n/* harmony import */ var _lib_animations__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/animations */ \"./src/lib/animations.ts\");\n/* harmony import */ var _lib_attributes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../lib/attributes */ \"./src/lib/attributes.ts\");\n/**\n * Dropdown Animator Module\n *\n * Handles GSAP animations for dropdown menus including:\n * - Opening/closing animations\n * - Overlay fade transitions\n * - Timeline management\n */\n\n\n\n// Animation mapping\nconst animationOpenMap = {\n \"slide-down\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownOpenSlideDown,\n \"slide-up\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownOpenSlideUp,\n \"slide-left\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownOpenSlideLeft,\n \"slide-right\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownOpenSlideRight,\n};\nconst animationCloseMap = {\n \"slide-down\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownCloseSlideDown,\n \"slide-up\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownCloseSlideUp,\n \"slide-left\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownCloseSlideLeft,\n \"slide-right\": _lib_animations__WEBPACK_IMPORTED_MODULE_0__.animateDropdownCloseSlideRight,\n};\n/**\n * Animates dropdown opening with GSAP\n */\nfunction animateOpen(elements, currentAnim, currentOffset, config, index) {\n console.log(`Dropdown ${index + 1} - performOpen() executing with GSAP`);\n const { toggle, menu, drawer, overlay } = elements;\n const animFunc = animationOpenMap[currentAnim];\n const anim = animFunc(currentOffset);\n // Create GSAP timeline\n const tl = gsap__WEBPACK_IMPORTED_MODULE_2__.gsap.timeline();\n // Set menu to visible with flex display\n tl.set(menu, { display: \"flex\", visibility: \"visible\" });\n // Set overlay to flex and visible if it exists\n if (overlay) {\n tl.set(overlay, { display: \"flex\", visibility: \"visible\" }, \"<\");\n }\n // Animate the drawer\n anim.to.duration = config.animOpenSpeed;\n tl.fromTo(drawer, anim.from, anim.to, \"<\");\n // Update ARIA and state\n toggle.setAttribute(_lib_attributes__WEBPACK_IMPORTED_MODULE_1__.ARIA_EXPANDED, \"true\");\n menu.classList.add(_lib_attributes__WEBPACK_IMPORTED_MODULE_1__.CLASS_DROPDOWN_OPEN);\n // Fade in overlay\n if (overlay) {\n tl.to(overlay, { opacity: 1, duration: config.animOpenSpeed }, \"<\");\n }\n return tl;\n}\n/**\n * Animates dropdown closing with GSAP\n */\nfunction animateClose(elements, currentAnim, currentOffset, config, index) {\n console.log(`Dropdown ${index + 1} - closeDropdown() executing with GSAP`);\n const { toggle, menu, drawer, overlay } = elements;\n const animFunc = animationCloseMap[currentAnim];\n const anim = animFunc(currentOffset);\n // Create GSAP timeline\n const tl = gsap__WEBPACK_IMPORTED_MODULE_2__.gsap.timeline({\n onComplete: () => {\n // Set visibility to hidden after animation completes\n gsap__WEBPACK_IMPORTED_MODULE_2__.gsap.set(menu, { visibility: \"hidden\" });\n if (overlay) {\n gsap__WEBPACK_IMPORTED_MODULE_2__.gsap.set(overlay, { display: \"none\", visibility: \"hidden\" });\n }\n },\n });\n // Animate the drawer\n anim.to.duration = config.animCloseSpeed;\n tl.fromTo(drawer, anim.from, anim.to);\n // Update ARIA and state\n toggle.setAttribute(_lib_attributes__WEBPACK_IMPORTED_MODULE_1__.ARIA_EXPANDED, \"false\");\n menu.classList.remove(_lib_attributes__WEBPACK_IMPORTED_MODULE_1__.CLASS_DROPDOWN_OPEN);\n // Fade out overlay\n if (overlay) {\n tl.to(overlay, { opacity: 0, duration: config.animCloseSpeed }, \"<\");\n }\n return tl;\n}\n/**\n * Initialize drawer to its animation's starting position\n */\nfunction initializeDrawerPosition(drawer, currentAnim, currentOffset) {\n const animFunc = animationOpenMap[currentAnim];\n const anim = animFunc(currentOffset);\n gsap__WEBPACK_IMPORTED_MODULE_2__.gsap.set(drawer, anim.from);\n}\n\n\n//# sourceURL=webpack://petal/./src/modules/dropdown/dropdown-animator.ts?");
230
230
 
231
231
  /***/ }),
232
232
 
@@ -246,7 +246,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
246
246
  \*****************************************************/
247
247
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
248
248
 
249
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DropdownController: () => (/* binding */ DropdownController)\n/* harmony export */ });\n/* harmony import */ var _lib_attributes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/attributes */ \"./src/lib/attributes.ts\");\n/* harmony import */ var _dropdown_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dropdown-config */ \"./src/modules/dropdown/dropdown-config.ts\");\n/* harmony import */ var _dropdown_animator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dropdown-animator */ \"./src/modules/dropdown/dropdown-animator.ts\");\n/**\n * Dropdown Controller Module\n *\n * Manages dropdown state, event handlers, and group coordination.\n * Orchestrates opening/closing logic with animations.\n */\n\n\n\nclass DropdownController {\n constructor(elements, config, index) {\n this.elements = elements;\n this.config = config;\n this.index = index;\n this.isOpen = false;\n this.timeoutId = null;\n this.currentTimeline = null;\n /**\n * Opens the dropdown menu using GSAP\n * - Cancels any pending close timeout\n * - Delays opening if specified or if another dropdown in same group is open\n * - Animates using GSAP timeline\n */\n this.open = () => {\n console.log(`Dropdown ${this.index + 1} - openDropdown() called`);\n // Cancel any pending close\n if (this.timeoutId) {\n console.log(`Dropdown ${this.index + 1} - Cancelling pending close timeout`);\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n // Kill any existing timeline\n if (this.currentTimeline) {\n this.currentTimeline.kill();\n this.currentTimeline = null;\n }\n // Check if we need to delay opening (group coordination)\n let groupCoordinationDelay = 0;\n if (this.config.group) {\n const groupDropdowns = document.querySelectorAll(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN}'][${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_GROUP}='${this.config.group}']`);\n console.log(`Dropdown ${this.index + 1} - Found ${groupDropdowns.length} dropdowns in group '${this.config.group}'`);\n // Find the currently open dropdown in this group\n const openDropdownInGroup = Array.from(groupDropdowns).find((dd) => {\n const ddToggle = dd.querySelector(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_TOGGLE}']`);\n return ddToggle && ddToggle !== this.elements.toggle && ddToggle.getAttribute(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ARIA_EXPANDED) === \"true\";\n });\n // If another is open, get its close delay attribute for coordination\n if (openDropdownInGroup) {\n groupCoordinationDelay = parseInt(openDropdownInGroup.getAttribute(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_CLOSE_DELAY) || \"0\", 10);\n console.log(`Dropdown ${this.index + 1} - Another dropdown in group is open, coordinating with delay: ${groupCoordinationDelay}ms`);\n }\n }\n // Perform the actual open (immediately or delayed)\n const performOpen = () => {\n const currentAnim = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentAnimation)(this.config);\n const currentOffset = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentOffset)(this.config);\n this.currentTimeline = (0,_dropdown_animator__WEBPACK_IMPORTED_MODULE_2__.animateOpen)(this.elements, currentAnim, currentOffset, this.config, this.index);\n this.isOpen = true;\n };\n // Use the greater of openDelay or groupCoordinationDelay\n const totalDelay = Math.max(this.config.openDelay, groupCoordinationDelay);\n console.log(`Dropdown ${this.index + 1} - Total delay: ${totalDelay}ms (openDelay: ${this.config.openDelay}ms, groupCoordination: ${groupCoordinationDelay}ms)`);\n if (totalDelay > 0) {\n console.log(`Dropdown ${this.index + 1} - Scheduling open in ${totalDelay}ms`);\n setTimeout(performOpen, totalDelay);\n }\n else {\n console.log(`Dropdown ${this.index + 1} - Opening immediately`);\n performOpen();\n }\n };\n /**\n * Closes the dropdown menu using GSAP\n * - Cancels any pending close timeout\n * - Animates using GSAP timeline\n * - Sets visibility to hidden after animation completes\n */\n this.close = () => {\n console.log(`Dropdown ${this.index + 1} - closeDropdown() called`);\n // Cancel any pending close\n if (this.timeoutId) {\n console.log(`Dropdown ${this.index + 1} - Cancelling existing timeout`);\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n // Kill any existing timeline\n if (this.currentTimeline) {\n this.currentTimeline.kill();\n this.currentTimeline = null;\n }\n const currentAnim = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentAnimation)(this.config);\n const currentOffset = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentOffset)(this.config);\n this.currentTimeline = (0,_dropdown_animator__WEBPACK_IMPORTED_MODULE_2__.animateClose)(this.elements, currentAnim, currentOffset, this.config, this.index);\n this.isOpen = false;\n };\n /**\n * Closes the dropdown with an optional delay\n * - Uses petal-dropdown-delay attribute value\n * - Stores timeout ID for potential cancellation\n */\n this.closeWithDelay = () => {\n console.log(`Dropdown ${this.index + 1} - closeDropdownWithDelay() called with delay: ${this.config.closeDelay}ms`);\n if (this.config.closeDelay > 0) {\n console.log(`Dropdown ${this.index + 1} - Scheduling close in ${this.config.closeDelay}ms`);\n this.timeoutId = window.setTimeout(this.close, this.config.closeDelay);\n }\n else {\n console.log(`Dropdown ${this.index + 1} - Closing immediately (no delay)`);\n this.close();\n }\n };\n /**\n * Toggles the dropdown between open and closed states\n * - Used for click-based dropdowns\n */\n this.toggle = () => {\n if (this.isOpen) {\n this.close();\n }\n else {\n this.open();\n }\n };\n /**\n * Handles clicks outside the dropdown\n * - Only active for click-based dropdowns\n * - Closes dropdown if click is outside both toggle and menu\n */\n this.handleOutsideClick = (event, dropdown) => {\n if (!this.isOpen)\n return;\n const clickedInsideDropdown = dropdown.contains(event.target);\n if (!clickedInsideDropdown) {\n this.close();\n }\n };\n /**\n * Handle resize event - reinitialize drawer position if closed\n */\n this.handleResize = () => {\n if (!this.isOpen) {\n this.initializeDrawer();\n }\n };\n this.openOnHover = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentOpenOnHover)(config);\n }\n /**\n * Initialize drawer to starting position\n */\n initializeDrawer() {\n const currentAnim = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentAnimation)(this.config);\n const currentOffset = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentOffset)(this.config);\n (0,_dropdown_animator__WEBPACK_IMPORTED_MODULE_2__.initializeDrawerPosition)(this.elements.menu, currentAnim, currentOffset);\n }\n /**\n * Update interaction mode based on current open-on-hover setting\n */\n updateOpenOnHover() {\n const newOpenOnHover = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentOpenOnHover)(this.config);\n const changed = newOpenOnHover !== this.openOnHover;\n this.openOnHover = newOpenOnHover;\n return changed;\n }\n /**\n * Get current open-on-hover mode\n */\n getOpenOnHover() {\n return this.openOnHover;\n }\n}\n\n\n//# sourceURL=webpack://petal/./src/modules/dropdown/dropdown-controller.ts?");
249
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DropdownController: () => (/* binding */ DropdownController)\n/* harmony export */ });\n/* harmony import */ var _lib_attributes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/attributes */ \"./src/lib/attributes.ts\");\n/* harmony import */ var _dropdown_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dropdown-config */ \"./src/modules/dropdown/dropdown-config.ts\");\n/* harmony import */ var _dropdown_animator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dropdown-animator */ \"./src/modules/dropdown/dropdown-animator.ts\");\n/**\n * Dropdown Controller Module\n *\n * Manages dropdown state, event handlers, and group coordination.\n * Orchestrates opening/closing logic with animations.\n */\n\n\n\nclass DropdownController {\n constructor(elements, config, index) {\n this.elements = elements;\n this.config = config;\n this.index = index;\n this.isOpen = false;\n this.timeoutId = null;\n this.currentTimeline = null;\n /**\n * Opens the dropdown menu using GSAP\n * - Cancels any pending close timeout\n * - Delays opening if specified or if another dropdown in same group is open\n * - Animates using GSAP timeline\n */\n this.open = () => {\n console.log(`Dropdown ${this.index + 1} - openDropdown() called`);\n // Cancel any pending close\n if (this.timeoutId) {\n console.log(`Dropdown ${this.index + 1} - Cancelling pending close timeout`);\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n // Kill any existing timeline\n if (this.currentTimeline) {\n this.currentTimeline.kill();\n this.currentTimeline = null;\n }\n // Check if we need to delay opening (group coordination)\n let groupCoordinationDelay = 0;\n if (this.config.group) {\n const groupDropdowns = document.querySelectorAll(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN}'][${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_GROUP}='${this.config.group}']`);\n console.log(`Dropdown ${this.index + 1} - Found ${groupDropdowns.length} dropdowns in group '${this.config.group}'`);\n // Find the currently open dropdown in this group\n const openDropdownInGroup = Array.from(groupDropdowns).find((dd) => {\n const ddToggle = dd.querySelector(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_TOGGLE}']`);\n return ddToggle && ddToggle !== this.elements.toggle && ddToggle.getAttribute(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ARIA_EXPANDED) === \"true\";\n });\n // If another is open, get its close delay attribute for coordination\n if (openDropdownInGroup) {\n groupCoordinationDelay = parseInt(openDropdownInGroup.getAttribute(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_CLOSE_DELAY) || \"0\", 10);\n console.log(`Dropdown ${this.index + 1} - Another dropdown in group is open, coordinating with delay: ${groupCoordinationDelay}ms`);\n }\n }\n // Perform the actual open (immediately or delayed)\n const performOpen = () => {\n const currentAnim = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentAnimation)(this.config);\n const currentOffset = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentOffset)(this.config);\n this.currentTimeline = (0,_dropdown_animator__WEBPACK_IMPORTED_MODULE_2__.animateOpen)(this.elements, currentAnim, currentOffset, this.config, this.index);\n this.isOpen = true;\n };\n // Use the greater of openDelay or groupCoordinationDelay\n const totalDelay = Math.max(this.config.openDelay, groupCoordinationDelay);\n console.log(`Dropdown ${this.index + 1} - Total delay: ${totalDelay}ms (openDelay: ${this.config.openDelay}ms, groupCoordination: ${groupCoordinationDelay}ms)`);\n if (totalDelay > 0) {\n console.log(`Dropdown ${this.index + 1} - Scheduling open in ${totalDelay}ms`);\n setTimeout(performOpen, totalDelay);\n }\n else {\n console.log(`Dropdown ${this.index + 1} - Opening immediately`);\n performOpen();\n }\n };\n /**\n * Closes the dropdown menu using GSAP\n * - Cancels any pending close timeout\n * - Animates using GSAP timeline\n * - Sets visibility to hidden after animation completes\n */\n this.close = () => {\n console.log(`Dropdown ${this.index + 1} - closeDropdown() called`);\n // Cancel any pending close\n if (this.timeoutId) {\n console.log(`Dropdown ${this.index + 1} - Cancelling existing timeout`);\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n // Kill any existing timeline\n if (this.currentTimeline) {\n this.currentTimeline.kill();\n this.currentTimeline = null;\n }\n const currentAnim = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentAnimation)(this.config);\n const currentOffset = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentOffset)(this.config);\n this.currentTimeline = (0,_dropdown_animator__WEBPACK_IMPORTED_MODULE_2__.animateClose)(this.elements, currentAnim, currentOffset, this.config, this.index);\n this.isOpen = false;\n };\n /**\n * Closes the dropdown with an optional delay\n * - Uses petal-dropdown-delay attribute value\n * - Stores timeout ID for potential cancellation\n */\n this.closeWithDelay = () => {\n console.log(`Dropdown ${this.index + 1} - closeDropdownWithDelay() called with delay: ${this.config.closeDelay}ms`);\n if (this.config.closeDelay > 0) {\n console.log(`Dropdown ${this.index + 1} - Scheduling close in ${this.config.closeDelay}ms`);\n this.timeoutId = window.setTimeout(this.close, this.config.closeDelay);\n }\n else {\n console.log(`Dropdown ${this.index + 1} - Closing immediately (no delay)`);\n this.close();\n }\n };\n /**\n * Toggles the dropdown between open and closed states\n * - Used for click-based dropdowns\n */\n this.toggle = () => {\n if (this.isOpen) {\n this.close();\n }\n else {\n this.open();\n }\n };\n /**\n * Handles clicks outside the dropdown\n * - Only active for click-based dropdowns\n * - Closes dropdown if click is outside both toggle and menu\n */\n this.handleOutsideClick = (event, dropdown) => {\n if (!this.isOpen)\n return;\n const clickedInsideDropdown = dropdown.contains(event.target);\n if (!clickedInsideDropdown) {\n this.close();\n }\n };\n /**\n * Handle resize event - reinitialize drawer position if closed\n */\n this.handleResize = () => {\n if (!this.isOpen) {\n this.initializeDrawer();\n }\n };\n this.openOnHover = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentOpenOnHover)(config);\n }\n /**\n * Initialize drawer to starting position\n */\n initializeDrawer() {\n const currentAnim = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentAnimation)(this.config);\n const currentOffset = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentOffset)(this.config);\n (0,_dropdown_animator__WEBPACK_IMPORTED_MODULE_2__.initializeDrawerPosition)(this.elements.drawer, currentAnim, currentOffset);\n }\n /**\n * Update interaction mode based on current open-on-hover setting\n */\n updateOpenOnHover() {\n const newOpenOnHover = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.getCurrentOpenOnHover)(this.config);\n const changed = newOpenOnHover !== this.openOnHover;\n this.openOnHover = newOpenOnHover;\n return changed;\n }\n /**\n * Get current open-on-hover mode\n */\n getOpenOnHover() {\n return this.openOnHover;\n }\n}\n\n\n//# sourceURL=webpack://petal/./src/modules/dropdown/dropdown-controller.ts?");
250
250
 
251
251
  /***/ }),
252
252
 
@@ -266,7 +266,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
266
266
  \******************************************/
267
267
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
268
268
 
269
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ initializeDropdowns: () => (/* binding */ initializeDropdowns)\n/* harmony export */ });\n/* harmony import */ var _lib_attributes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/attributes */ \"./src/lib/attributes.ts\");\n/* harmony import */ var _dropdown_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dropdown-config */ \"./src/modules/dropdown/dropdown-config.ts\");\n/* harmony import */ var _dropdown_controller__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dropdown-controller */ \"./src/modules/dropdown/dropdown-controller.ts\");\n/**\n * Dropdown Component\n *\n * Handles interactive dropdown menus with support for:\n * - Click or hover-based opening\n * - Customizable close delays\n * - Grouped dropdown coordination\n * - CSS-based animations\n * - Accessibility (aria-expanded)\n * - Named element linking (petal=\"name\")\n *\n * HTML Attributes (defined in attributes.ts):\n * - petal=\"name\" (optional) - Links elements together by name. When set on a dropdown container,\n * all related elements (toggle, menu, overlay, close) must have the same petal=\"name\" attribute.\n * Elements are matched by both name and type before firing their behavior.\n * - petal-el=\"dropdown\" - Container element\n * - petal-el=\"dropdown-toggle\" - Clickable/hoverable trigger\n * - petal-el=\"dropdown-menu\" - Menu content\n * - petal-el=\"dropdown-drawer\" - Menu inner box\n * - petal-el=\"dropdown-overlay\" (optional) - Background overlay\n * - petal-el=\"dropdown-close\" (optional) - Clickable element that closes the dropdown\n * - petal-dropdown-group=\"name\" (optional) - Group name for coordinated animations\n * - petal-dropdown-open-on-hover=\"true\" (optional) - Use hover instead of click\n * - petal-dropdown-open-delay=\"ms\" (optional) - Open delay in milliseconds (default: 200)\n * - petal-dropdown-close-delay=\"ms\" (optional) - Close delay in milliseconds (default: 200)\n * - petal-dropdown-anim=\"slide-down|slide-up|slide-left|slide-right\" (optional) - Desktop animation (default: slide-down)\n * - petal-dropdown-anim-tablet=\"slide-down|slide-up|slide-left|slide-right\" (optional) - Tablet animation (inherits from petal-dropdown-anim)\n * - petal-dropdown-anim-mobile-landscape=\"slide-down|slide-up|slide-left|slide-right\" (optional) - Mobile landscape animation (inherits from petal-dropdown-anim-tablet)\n * - petal-dropdown-anim-mobile=\"slide-down|slide-up|slide-left|slide-right\" (optional) - Mobile animation (inherits from petal-dropdown-anim-mobile-landscape)\n * - petal-dropdown-anim-open-speed=\"ms\" (optional) - Animation speed when opening in milliseconds (default: 500)\n * - petal-dropdown-anim-close-speed=\"ms\" (optional) - Animation speed when closing in milliseconds (default: 300)\n */\n\n\n\nfunction initializeDropdowns() {\n const init = () => {\n const dropdowns = document.querySelectorAll(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN}']`);\n console.log(`Found ${dropdowns.length} dropdown(s)`);\n dropdowns.forEach((dropdown, index) => {\n console.log(`\\n=== Initializing Dropdown ${index + 1} ===`);\n // ===========================\n // Element References\n // ===========================\n // Get the name attribute from the dropdown container\n const petalName = dropdown.getAttribute(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_NAME);\n if (petalName) {\n console.log(`Dropdown ${index + 1} - Name: \"${petalName}\"`);\n }\n else {\n console.warn(`Dropdown ${index + 1} - WARNING: No petal name attribute found. Elements will be searched within dropdown container only.`);\n }\n // Build selectors that match elements by both name and type\n const buildSelector = (elementType) => {\n if (petalName) {\n return `[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_NAME}='${petalName}'][${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${elementType}']`;\n }\n return `[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${elementType}']`;\n };\n const toggle = petalName\n ? document.querySelector(buildSelector(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_TOGGLE))\n : dropdown.querySelector(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_TOGGLE}']`);\n const menu = petalName\n ? document.querySelector(buildSelector(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_MENU))\n : dropdown.querySelector(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_MENU}']`);\n const overlay = petalName\n ? document.querySelector(buildSelector(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_OVERLAY))\n : dropdown.querySelector(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_OVERLAY}']`);\n const close = petalName\n ? document.querySelector(buildSelector(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_CLOSE))\n : dropdown.querySelector(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_CLOSE}']`);\n console.log(`Dropdown ${index + 1} - Found toggle:`, toggle);\n console.log(`Dropdown ${index + 1} - Found menu:`, menu);\n console.log(`Dropdown ${index + 1} - Found overlay:`, overlay);\n console.log(`Dropdown ${index + 1} - Found close:`, close);\n // Validate required elements\n if (!toggle || !menu) {\n console.warn(`Dropdown ${index + 1} - Missing toggle or menu, skipping`);\n return;\n }\n // ===========================\n // Configuration\n // ===========================\n const config = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.parseDropdownConfig)(dropdown);\n (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.logConfig)(index, config);\n // ===========================\n // Controller Setup\n // ===========================\n const elements = { toggle, menu, overlay };\n const controller = new _dropdown_controller__WEBPACK_IMPORTED_MODULE_2__.DropdownController(elements, config, index);\n // ===========================\n // Initialization\n // ===========================\n // Set initial aria-expanded state and ensure menu is closed\n toggle.setAttribute(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ARIA_EXPANDED, \"false\");\n menu.classList.remove(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.CLASS_DROPDOWN_OPEN);\n // Initialize drawer to its animation's starting position\n controller.initializeDrawer();\n // Event listener references with console logging\n const mouseEnterHandler = () => {\n console.log(`Dropdown ${index + 1} - MOUSEENTER event triggered`);\n controller.open();\n };\n const mouseLeaveHandler = () => {\n console.log(`Dropdown ${index + 1} - MOUSELEAVE event triggered`);\n controller.closeWithDelay();\n };\n const clickOutsideHandler = (event) => {\n controller.handleOutsideClick(event, dropdown);\n };\n // Function to attach/detach event listeners based on hover mode\n const updateEventListeners = () => {\n const previousMode = controller.getOpenOnHover();\n const modeChanged = controller.updateOpenOnHover();\n if (modeChanged) {\n const newMode = controller.getOpenOnHover();\n console.log(`Dropdown ${index + 1} - Switching interaction mode to ${newMode ? \"hover\" : \"click\"}`);\n // Remove old listeners\n if (previousMode) {\n dropdown.removeEventListener(\"mouseenter\", mouseEnterHandler);\n dropdown.removeEventListener(\"mouseleave\", mouseLeaveHandler);\n }\n else {\n toggle.removeEventListener(\"click\", controller.toggle);\n document.removeEventListener(\"click\", clickOutsideHandler);\n }\n // Attach new listeners\n if (newMode) {\n console.log(`Dropdown ${index + 1} - Attaching hover event listeners`);\n dropdown.addEventListener(\"mouseenter\", mouseEnterHandler);\n dropdown.addEventListener(\"mouseleave\", mouseLeaveHandler);\n }\n else {\n console.log(`Dropdown ${index + 1} - Attaching click event listeners`);\n toggle.addEventListener(\"click\", controller.toggle);\n document.addEventListener(\"click\", clickOutsideHandler);\n }\n }\n };\n // Reinitialize drawer position on window resize and update event listeners\n const handleResize = () => {\n controller.handleResize();\n updateEventListeners();\n };\n window.addEventListener(\"resize\", handleResize);\n // Initial event listener setup\n const initialOpenOnHover = controller.getOpenOnHover();\n if (initialOpenOnHover) {\n console.log(`Dropdown ${index + 1} - Attaching hover event listeners`);\n dropdown.addEventListener(\"mouseenter\", mouseEnterHandler);\n dropdown.addEventListener(\"mouseleave\", mouseLeaveHandler);\n }\n else {\n console.log(`Dropdown ${index + 1} - Attaching click event listeners`);\n toggle.addEventListener(\"click\", controller.toggle);\n document.addEventListener(\"click\", clickOutsideHandler);\n }\n // Attach click listener to dropdown-close element (if it exists)\n if (close) {\n console.log(`Dropdown ${index + 1} - Attaching click listener to close element`);\n close.addEventListener(\"click\", controller.close);\n }\n console.log(`Dropdown ${index + 1} - Initialization complete\\n`);\n });\n };\n // Run immediately if DOM is ready, otherwise wait for DOMContentLoaded\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", init);\n }\n else {\n init();\n }\n}\n\n\n//# sourceURL=webpack://petal/./src/modules/dropdown/dropdown.ts?");
269
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ initializeDropdowns: () => (/* binding */ initializeDropdowns)\n/* harmony export */ });\n/* harmony import */ var _lib_attributes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/attributes */ \"./src/lib/attributes.ts\");\n/* harmony import */ var _dropdown_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dropdown-config */ \"./src/modules/dropdown/dropdown-config.ts\");\n/* harmony import */ var _dropdown_controller__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dropdown-controller */ \"./src/modules/dropdown/dropdown-controller.ts\");\n/**\n * Dropdown Component\n *\n * Handles interactive dropdown menus with support for:\n * - Click or hover-based opening\n * - Customizable close delays\n * - Grouped dropdown coordination\n * - CSS-based animations\n * - Accessibility (aria-expanded)\n * - Named element linking (petal=\"name\")\n *\n * HTML Attributes (defined in attributes.ts):\n * - petal=\"name\" (optional) - Links elements together by name. When set on a dropdown container,\n * all related elements (toggle, menu, overlay, close) must have the same petal=\"name\" attribute.\n * Elements are matched by both name and type before firing their behavior.\n * - petal-el=\"dropdown\" - Container element\n * - petal-el=\"dropdown-toggle\" - Clickable/hoverable trigger\n * - petal-el=\"dropdown-menu\" - Menu content\n * - petal-el=\"dropdown-drawer\" - Menu inner box\n * - petal-el=\"dropdown-overlay\" (optional) - Background overlay\n * - petal-el=\"dropdown-close\" (optional) - Clickable element that closes the dropdown\n * - petal-dropdown-group=\"name\" (optional) - Group name for coordinated animations\n * - petal-dropdown-open-on-hover=\"true\" (optional) - Use hover instead of click\n * - petal-dropdown-open-delay=\"ms\" (optional) - Open delay in milliseconds (default: 200)\n * - petal-dropdown-close-delay=\"ms\" (optional) - Close delay in milliseconds (default: 200)\n * - petal-dropdown-anim=\"slide-down|slide-up|slide-left|slide-right\" (optional) - Desktop animation (default: slide-down)\n * - petal-dropdown-anim-tablet=\"slide-down|slide-up|slide-left|slide-right\" (optional) - Tablet animation (inherits from petal-dropdown-anim)\n * - petal-dropdown-anim-mobile-landscape=\"slide-down|slide-up|slide-left|slide-right\" (optional) - Mobile landscape animation (inherits from petal-dropdown-anim-tablet)\n * - petal-dropdown-anim-mobile=\"slide-down|slide-up|slide-left|slide-right\" (optional) - Mobile animation (inherits from petal-dropdown-anim-mobile-landscape)\n * - petal-dropdown-anim-open-speed=\"ms\" (optional) - Animation speed when opening in milliseconds (default: 500)\n * - petal-dropdown-anim-close-speed=\"ms\" (optional) - Animation speed when closing in milliseconds (default: 300)\n */\n\n\n\nfunction initializeDropdowns() {\n const init = () => {\n const dropdowns = document.querySelectorAll(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN}']`);\n console.log(`Found ${dropdowns.length} dropdown(s)`);\n dropdowns.forEach((dropdown, index) => {\n console.log(`\\n=== Initializing Dropdown ${index + 1} ===`);\n // ===========================\n // Element References\n // ===========================\n // Get the name attribute from the dropdown container\n const petalName = dropdown.getAttribute(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_NAME);\n if (petalName) {\n console.log(`Dropdown ${index + 1} - Name: \"${petalName}\"`);\n }\n else {\n console.warn(`Dropdown ${index + 1} - WARNING: No petal name attribute found. Elements will be searched within dropdown container only.`);\n }\n // Build selectors that match elements by both name and type\n const buildSelector = (elementType) => {\n if (petalName) {\n return `[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_NAME}='${petalName}'][${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${elementType}']`;\n }\n return `[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${elementType}']`;\n };\n const toggle = petalName\n ? document.querySelector(buildSelector(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_TOGGLE))\n : dropdown.querySelector(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_TOGGLE}']`);\n const menu = petalName\n ? document.querySelector(buildSelector(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_MENU))\n : dropdown.querySelector(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_MENU}']`);\n const drawer = petalName\n ? document.querySelector(buildSelector(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_MENU_BOX))\n : dropdown.querySelector(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_MENU_BOX}']`);\n const overlay = petalName\n ? document.querySelector(buildSelector(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_OVERLAY))\n : dropdown.querySelector(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_OVERLAY}']`);\n const close = petalName\n ? document.querySelector(buildSelector(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_CLOSE))\n : dropdown.querySelector(`[${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_ELEMENT}='${_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ATTR_PETAL_DROPDOWN_CLOSE}']`);\n console.log(`Dropdown ${index + 1} - Found toggle:`, toggle);\n console.log(`Dropdown ${index + 1} - Found menu:`, menu);\n console.log(`Dropdown ${index + 1} - Found drawer:`, drawer);\n console.log(`Dropdown ${index + 1} - Found overlay:`, overlay);\n console.log(`Dropdown ${index + 1} - Found close:`, close);\n // Validate required elements\n if (!toggle || !menu || !drawer) {\n console.warn(`Dropdown ${index + 1} - Missing required element (toggle, menu, or drawer), skipping`);\n return;\n }\n // ===========================\n // Configuration\n // ===========================\n const config = (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.parseDropdownConfig)(dropdown);\n (0,_dropdown_config__WEBPACK_IMPORTED_MODULE_1__.logConfig)(index, config);\n // ===========================\n // Controller Setup\n // ===========================\n const elements = { toggle, menu, drawer, overlay };\n const controller = new _dropdown_controller__WEBPACK_IMPORTED_MODULE_2__.DropdownController(elements, config, index);\n // ===========================\n // Initialization\n // ===========================\n // Set initial aria-expanded state and ensure menu is closed\n toggle.setAttribute(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.ARIA_EXPANDED, \"false\");\n menu.classList.remove(_lib_attributes__WEBPACK_IMPORTED_MODULE_0__.CLASS_DROPDOWN_OPEN);\n // Initialize drawer to its animation's starting position\n controller.initializeDrawer();\n // Event listener references with console logging\n const mouseEnterHandler = () => {\n console.log(`Dropdown ${index + 1} - MOUSEENTER event triggered`);\n controller.open();\n };\n const mouseLeaveHandler = () => {\n console.log(`Dropdown ${index + 1} - MOUSELEAVE event triggered`);\n controller.closeWithDelay();\n };\n const clickOutsideHandler = (event) => {\n controller.handleOutsideClick(event, dropdown);\n };\n // Function to attach/detach event listeners based on hover mode\n const updateEventListeners = () => {\n const previousMode = controller.getOpenOnHover();\n const modeChanged = controller.updateOpenOnHover();\n if (modeChanged) {\n const newMode = controller.getOpenOnHover();\n console.log(`Dropdown ${index + 1} - Switching interaction mode to ${newMode ? \"hover\" : \"click\"}`);\n // Remove old listeners\n if (previousMode) {\n dropdown.removeEventListener(\"mouseenter\", mouseEnterHandler);\n dropdown.removeEventListener(\"mouseleave\", mouseLeaveHandler);\n }\n else {\n toggle.removeEventListener(\"click\", controller.toggle);\n document.removeEventListener(\"click\", clickOutsideHandler);\n }\n // Attach new listeners\n if (newMode) {\n console.log(`Dropdown ${index + 1} - Attaching hover event listeners`);\n dropdown.addEventListener(\"mouseenter\", mouseEnterHandler);\n dropdown.addEventListener(\"mouseleave\", mouseLeaveHandler);\n }\n else {\n console.log(`Dropdown ${index + 1} - Attaching click event listeners`);\n toggle.addEventListener(\"click\", controller.toggle);\n document.addEventListener(\"click\", clickOutsideHandler);\n }\n }\n };\n // Reinitialize drawer position on window resize and update event listeners\n const handleResize = () => {\n controller.handleResize();\n updateEventListeners();\n };\n window.addEventListener(\"resize\", handleResize);\n // Initial event listener setup\n const initialOpenOnHover = controller.getOpenOnHover();\n if (initialOpenOnHover) {\n console.log(`Dropdown ${index + 1} - Attaching hover event listeners`);\n dropdown.addEventListener(\"mouseenter\", mouseEnterHandler);\n dropdown.addEventListener(\"mouseleave\", mouseLeaveHandler);\n }\n else {\n console.log(`Dropdown ${index + 1} - Attaching click event listeners`);\n toggle.addEventListener(\"click\", controller.toggle);\n document.addEventListener(\"click\", clickOutsideHandler);\n }\n // Attach click listener to dropdown-close element (if it exists)\n if (close) {\n console.log(`Dropdown ${index + 1} - Attaching click listener to close element`);\n close.addEventListener(\"click\", controller.close);\n }\n console.log(`Dropdown ${index + 1} - Initialization complete\\n`);\n });\n };\n // Run immediately if DOM is ready, otherwise wait for DOMContentLoaded\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", init);\n }\n else {\n init();\n }\n}\n\n\n//# sourceURL=webpack://petal/./src/modules/dropdown/dropdown.ts?");
270
270
 
271
271
  /***/ }),
272
272
 
@@ -306,7 +306,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
306
306
  \**********************/
307
307
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
308
308
 
309
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _modules_popup_popup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modules/popup/popup */ \"./src/modules/popup/popup.ts\");\n/* harmony import */ var _modules_nav_banner__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/nav/banner */ \"./src/modules/nav/banner.ts\");\n/* harmony import */ var _modules_dropdown_dropdown__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/dropdown/dropdown */ \"./src/modules/dropdown/dropdown.ts\");\n/* harmony import */ var _petal_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./petal.css */ \"./src/petal.css\");\n/* harmony import */ var _modules_dropdown_dropdown_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/dropdown/dropdown.css */ \"./src/modules/dropdown/dropdown.css\");\n\n\n\n\n\nconsole.log(`🌸 Hello from Wellflow Petal v${\"0.0.63\"}`);\n(0,_modules_popup_popup__WEBPACK_IMPORTED_MODULE_0__.initializeAllPopups)();\n(0,_modules_popup_popup__WEBPACK_IMPORTED_MODULE_0__.initializePopupTriggers)();\n(0,_modules_nav_banner__WEBPACK_IMPORTED_MODULE_1__.initializeBanner)();\n(0,_modules_dropdown_dropdown__WEBPACK_IMPORTED_MODULE_2__.initializeDropdowns)();\n\n\n//# sourceURL=webpack://petal/./src/petal.ts?");
309
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _modules_popup_popup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modules/popup/popup */ \"./src/modules/popup/popup.ts\");\n/* harmony import */ var _modules_nav_banner__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/nav/banner */ \"./src/modules/nav/banner.ts\");\n/* harmony import */ var _modules_dropdown_dropdown__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/dropdown/dropdown */ \"./src/modules/dropdown/dropdown.ts\");\n/* harmony import */ var _petal_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./petal.css */ \"./src/petal.css\");\n/* harmony import */ var _modules_dropdown_dropdown_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/dropdown/dropdown.css */ \"./src/modules/dropdown/dropdown.css\");\n\n\n\n\n\nconsole.log(`🌸 Hello from Wellflow Petal v${\"0.0.64\"}`);\n(0,_modules_popup_popup__WEBPACK_IMPORTED_MODULE_0__.initializeAllPopups)();\n(0,_modules_popup_popup__WEBPACK_IMPORTED_MODULE_0__.initializePopupTriggers)();\n(0,_modules_nav_banner__WEBPACK_IMPORTED_MODULE_1__.initializeBanner)();\n(0,_modules_dropdown_dropdown__WEBPACK_IMPORTED_MODULE_2__.initializeDropdowns)();\n\n\n//# sourceURL=webpack://petal/./src/petal.ts?");
310
310
 
311
311
  /***/ }),
312
312
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "well-petal",
3
- "version": "0.0.63",
3
+ "version": "0.0.64",
4
4
  "description": "Webflow Popups powered by attributes",
5
5
  "main": "dist/petal.js",
6
6
  "files": [