advanced-filter-system 1.0.3 → 1.0.4

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.
package/dist/AFS.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"AFS.js","sources":["../src/AFS.js"],"sourcesContent":["/**\n * @fileoverview Advanced Filter System for DOM elements\n * @version 1.0.0\n *\n * A flexible and customizable filtering system that supports:\n * - Multiple filtering modes (OR/AND)\n * - Text search with debouncing\n * - Multiple sorting criteria\n * - Range filtering\n * - URL state management\n * - Animation and transitions\n * - Results counter\n */\n\n/**\n * Utility function for debouncing\n * @param {Function} func - Function to debounce\n * @param {number} wait - Delay in milliseconds\n * @returns {Function} Debounced function\n */\nfunction debounce(func, wait) {\n let timeout;\n return function executedFunction(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n}\n\nclass AFS {\n /**\n * @typedef {Object} FilterOptions\n * @property {string} containerSelector - Main container selector\n * @property {string} itemSelector - Items to filter selector\n * @property {string} filterButtonSelector - Filter buttons selector\n * @property {string} [searchInputSelector] - Search input selector\n * @property {string} [counterSelector] - Results counter selector\n * @property {string} [activeClass='active'] - Active state class\n * @property {string} [hiddenClass='hidden'] - Hidden state class\n * @property {number} [animationDuration=300] - Animation duration in ms\n * @property {string} [filterMode='OR'] - Filter mode ('OR' or 'AND')\n * @property {string[]} [searchKeys=['title']] - Data attributes to search in\n * @property {number} [debounceTime=300] - Search debounce delay in ms\n */\n\n /**\n * @param {FilterOptions} options - Filter configuration options\n */\n constructor(options = {}) {\n this.options = {\n containerSelector: \".filter-container\",\n itemSelector: \".filter-item\",\n filterButtonSelector: \".btn-filter\",\n searchInputSelector: \".filter-search\",\n counterSelector: \".filter-counter\",\n activeClass: \"active\",\n hiddenClass: \"hidden\",\n animationDuration: 300,\n filterMode: \"OR\",\n searchKeys: [\"title\"],\n debounceTime: 300,\n ...options,\n };\n\n // Initialize elements\n this.container = document.querySelector(this.options.containerSelector);\n this.items = document.querySelectorAll(this.options.itemSelector);\n this.filterButtons = document.querySelectorAll(\n this.options.filterButtonSelector,\n );\n this.searchInput = document.querySelector(\n this.options.searchInputSelector,\n );\n this.counter = document.querySelector(this.options.counterSelector);\n\n // Initialize state\n this.currentFilters = new Set([\"*\"]);\n this.currentSearch = \"\";\n this.visibleItems = new Set(this.items);\n\n this.init();\n }\n\n /**\n * Initialize the filter system\n * @private\n */\n init() {\n this.addStyles();\n this.bindEvents();\n this.loadFromURL();\n this.updateCounter();\n }\n\n /**\n * Add required styles to document\n * @private\n */\n addStyles() {\n const styles = `\n .${this.options.hiddenClass} {\n display: none !important;\n }\n\n ${this.options.itemSelector} {\n opacity: 1;\n transform: scale(1);\n transition: opacity ${this.options.animationDuration}ms ease-out,\n transform ${this.options.animationDuration}ms ease-out;\n }\n\n ${this.options.filterButtonSelector} {\n opacity: 0.5;\n transition: opacity ${this.options.animationDuration}ms ease;\n }\n\n ${this.options.filterButtonSelector}.${this.options.activeClass} {\n opacity: 1;\n }\n `;\n\n const styleSheet = document.createElement(\"style\");\n styleSheet.textContent = styles;\n document.head.appendChild(styleSheet);\n }\n\n /**\n * Bind all event listeners\n * @private\n */\n bindEvents() {\n this.filterButtons.forEach((button) => {\n button.addEventListener(\"click\", () =>\n this.handleFilterClick(button),\n );\n });\n\n if (this.searchInput) {\n this.searchInput.addEventListener(\n \"input\",\n debounce((e) => {\n this.search(e.target.value);\n }, this.options.debounceTime),\n );\n }\n\n window.addEventListener(\"popstate\", () => this.loadFromURL());\n }\n\n /**\n * Handle filter button clicks\n * @private\n * @param {HTMLElement} button - Clicked filter button\n */\n handleFilterClick(button) {\n const filterValue = button.dataset.filter;\n\n if (filterValue === \"*\") {\n this.resetFilters();\n } else {\n this.toggleFilter(filterValue, button);\n }\n\n this.filter();\n this.updateURL();\n }\n\n /**\n * Reset all filters to default state\n * @private\n */\n resetFilters() {\n this.filterButtons.forEach((btn) =>\n btn.classList.remove(this.options.activeClass),\n );\n this.currentFilters.clear();\n this.currentFilters.add(\"*\");\n this.filterButtons[0].classList.add(this.options.activeClass);\n this.resetCounter();\n }\n\n /**\n * Reset visible items counter\n * @private\n */\n resetCounter() {\n this.visibleItems = new Set(this.items);\n this.updateCounter();\n }\n\n /**\n * Toggle individual filter state\n * @private\n * @param {string} filterValue - Filter value to toggle\n * @param {HTMLElement} button - Filter button element\n */\n toggleFilter(filterValue, button) {\n this.currentFilters.delete(\"*\");\n this.filterButtons[0].classList.remove(this.options.activeClass);\n\n if (button.classList.contains(this.options.activeClass)) {\n button.classList.remove(this.options.activeClass);\n this.currentFilters.delete(filterValue);\n\n if (this.currentFilters.size === 0) {\n this.resetFilters();\n }\n } else {\n button.classList.add(this.options.activeClass);\n this.currentFilters.add(filterValue);\n }\n }\n\n /**\n * Apply current filters to items\n * @public\n */\n filter() {\n this.visibleItems.clear(); // Start with an empty set\n\n this.items.forEach((item) => {\n if (this.currentFilters.has(\"*\")) {\n this.showItem(item);\n this.visibleItems.add(item); // Add visible item to the set\n } else {\n const itemCategories = new Set(\n item.dataset.categories?.split(\" \") || [],\n );\n const matchesFilter =\n this.options.filterMode === \"OR\"\n ? this.matchesAnyFilter(itemCategories)\n : this.matchesAllFilters(itemCategories);\n\n if (matchesFilter) {\n this.showItem(item);\n this.visibleItems.add(item); // Add visible item to the set\n } else {\n this.hideItem(item);\n }\n }\n });\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n }\n\n /**\n * Check if item matches any active filter (OR mode)\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches any filter\n */\n matchesAnyFilter(itemCategories) {\n return [...this.currentFilters].some((filter) => {\n const [type, value] = filter.split(\":\");\n return itemCategories.has(`${type}:${value}`);\n });\n }\n\n /**\n * Check if item matches all active filters (AND mode)\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches all filters\n */\n matchesAllFilters(itemCategories) {\n return [...this.currentFilters].every((filter) => {\n const [type, value] = filter.split(\":\");\n return itemCategories.has(`${type}:${value}`);\n });\n }\n\n /**\n * Show an item with animation\n * @private\n * @param {HTMLElement} item - Item to show\n */\n showItem(item) {\n this.visibleItems.add(item);\n item.classList.remove(this.options.hiddenClass);\n item.style.opacity = \"0\";\n item.style.transform = \"scale(0.95)\";\n\n item.offsetHeight;\n\n requestAnimationFrame(() => {\n item.style.opacity = \"1\";\n item.style.transform = \"scale(1)\";\n });\n }\n\n /**\n * Hide an item with animation\n * @private\n * @param {HTMLElement} item - Item to hide\n */\n hideItem(item) {\n item.style.opacity = \"0\";\n item.style.transform = \"scale(0.95)\";\n\n setTimeout(() => {\n if (item.style.opacity === \"0\") {\n item.classList.add(this.options.hiddenClass);\n this.visibleItems.delete(item);\n }\n }, this.options.animationDuration);\n }\n\n /**\n * Search items by text\n * @public\n * @param {string} query - Search query\n */\n search(query) {\n this.currentSearch = query.toLowerCase().trim();\n let matches = 0;\n\n this.items.forEach((item) => {\n const searchText = this.options.searchKeys\n .map((key) => item.dataset[key] || \"\")\n .join(\" \")\n .toLowerCase();\n\n const matchesSearch =\n this.currentSearch === \"\" ||\n searchText.includes(this.currentSearch);\n\n if (matchesSearch) {\n this.showItem(item);\n matches++;\n } else {\n this.hideItem(item);\n }\n });\n\n this.updateURL();\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n }\n\n /**\n * Sort items by multiple criteria\n * @public\n * @param {Array<{key: string, direction: string}>} criteria - Sort criteria\n */\n sortMultiple(criteria) {\n const items = [...this.items];\n\n items.sort((a, b) => {\n for (const criterion of criteria) {\n const valueA = a.dataset[criterion.key];\n const valueB = b.dataset[criterion.key];\n\n const comparison =\n criterion.direction === \"asc\"\n ? valueA.localeCompare(valueB)\n : valueB.localeCompare(valueA);\n\n if (comparison !== 0) return comparison;\n }\n return 0;\n });\n\n items.forEach((item) => this.container.appendChild(item));\n }\n\n /**\n * Filter items by numeric range\n * @public\n * @param {string} key - Data attribute key\n * @param {number} min - Minimum value\n * @param {number} max - Maximum value\n */\n addRangeFilter(key, min, max) {\n this.items.forEach((item) => {\n const value = parseFloat(item.dataset[key]);\n const inRange = value >= min && value <= max;\n\n if (inRange) {\n this.showItem(item);\n } else {\n this.hideItem(item);\n }\n });\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n }\n\n /**\n * Update URL with current filter state\n * @private\n */\n updateURL() {\n const params = new URLSearchParams();\n\n // Séparer les filtres par type\n const filtersByType = {};\n for (const filter of this.currentFilters) {\n if (filter !== \"*\") {\n const [type, value] = filter.split(\":\");\n if (!filtersByType[type]) {\n filtersByType[type] = new Set();\n }\n filtersByType[type].add(value);\n }\n }\n\n // Ajouter chaque type de filtre à l'URL\n Object.entries(filtersByType).forEach(([type, values]) => {\n params.set(type, Array.from(values).join(\",\"));\n });\n\n if (this.currentSearch) {\n params.set(\"search\", this.currentSearch);\n }\n\n const newURL = `${window.location.pathname}${\n params.toString() ? \"?\" + params.toString() : \"\"\n }`;\n window.history.pushState({}, \"\", newURL);\n }\n\n /**\n * Load filter state from URL\n * @private\n */\n loadFromURL() {\n const params = new URLSearchParams(window.location.search);\n this.currentFilters.clear();\n\n // Si aucun filtre n'est présent, utiliser '*'\n let hasFilters = false;\n\n // Parcourir tous les paramètres\n for (const [type, values] of params.entries()) {\n if (type !== \"search\") {\n hasFilters = true;\n values.split(\",\").forEach((value) => {\n this.currentFilters.add(`${type}:${value}`);\n });\n }\n }\n\n if (!hasFilters) {\n this.currentFilters.add(\"*\");\n }\n\n // Update active buttons\n this.filterButtons.forEach((button) => {\n const filterValue = button.dataset.filter;\n if (\n this.currentFilters.has(filterValue) ||\n (filterValue === \"*\" && this.currentFilters.has(\"*\"))\n ) {\n button.classList.add(this.options.activeClass);\n } else {\n button.classList.remove(this.options.activeClass);\n }\n });\n\n // Load search\n const search = params.get(\"search\") || \"\";\n if (this.searchInput) {\n this.searchInput.value = search;\n }\n\n this.filter();\n if (search) {\n this.search(search);\n }\n }\n\n /**\n * Update results counter\n * @private\n * @returns {{total: number, visible: number}}\n */\n updateCounter() {\n const total = this.items.length;\n const visible = this.visibleItems.size;\n\n if (this.counter) {\n this.counter.textContent = `Showing ${visible} of ${total}`;\n }\n\n return { total, visible };\n }\n\n /**\n * Set filter logic mode (alias for setFilterMode)\n * @public\n * @param {string} logic - New filter logic ('AND' or 'OR')\n */\n setLogic(logic) {\n if (typeof logic === 'boolean') {\n // Handle boolean input (true = AND, false = OR)\n this.options.filterMode = logic ? 'AND' : 'OR';\n this.filter();\n return;\n }\n\n const mode = logic.toUpperCase();\n if (['OR', 'AND'].includes(mode)) {\n this.options.filterMode = mode;\n this.filter();\n }\n }\n\n\n /**\n * Change filter mode\n * @public\n * @param {string} mode - New filter mode ('OR' or 'AND')\n */\n setFilterMode(mode) {\n if ([\"OR\", \"AND\"].includes(mode.toUpperCase())) {\n this.options.filterMode = mode.toUpperCase();\n this.filter();\n }\n }\n\n /**\n * Add filter by type and value\n * @public\n * @param {string} type - Filter type\n * @param {string} value - Filter value\n */\n addFilter(type, value) {\n this.currentFilters.add(`${type}:${value}`);\n this.filter();\n this.updateURL();\n }\n\n /**\n * Remove filter by type and value\n * @public\n * @param {string} type - Filter type\n */\n removeFilter(type, value) {\n this.currentFilters.delete(`${type}:${value}`);\n if (this.currentFilters.size === 0) {\n this.currentFilters.add(\"*\");\n }\n this.filter();\n this.updateURL();\n }\n\n /**\n * Get active filters by type\n * @public\n * @param {string} type - Filter type\n */\n getActiveFiltersByType(type) {\n return [...this.currentFilters]\n .filter((filter) => filter.startsWith(`${type}:`))\n .map((filter) => filter.split(\":\")[1]);\n }\n}\n\nexport { AFS };\n"],"names":["debounce","func","wait","timeout","executedFunction","_len","arguments","length","args","Array","_key","later","clearTimeout","setTimeout","AFS","constructor","options","undefined","containerSelector","itemSelector","filterButtonSelector","searchInputSelector","counterSelector","activeClass","hiddenClass","animationDuration","filterMode","searchKeys","debounceTime","container","document","querySelector","items","querySelectorAll","filterButtons","searchInput","counter","currentFilters","Set","currentSearch","visibleItems","init","addStyles","bindEvents","loadFromURL","updateCounter","styles","styleSheet","createElement","textContent","head","appendChild","forEach","button","addEventListener","handleFilterClick","e","search","target","value","window","filterValue","dataset","filter","resetFilters","toggleFilter","updateURL","btn","classList","remove","clear","add","resetCounter","delete","contains","size","item","has","showItem","itemCategories","categories","split","matchesFilter","matchesAnyFilter","matchesAllFilters","hideItem","some","type","every","style","opacity","transform","offsetHeight","requestAnimationFrame","query","toLowerCase","trim","searchText","map","key","join","matchesSearch","includes","sortMultiple","criteria","sort","a","b","criterion","valueA","valueB","comparison","direction","localeCompare","addRangeFilter","min","max","parseFloat","inRange","params","URLSearchParams","filtersByType","Object","entries","_ref","values","set","from","newURL","location","pathname","toString","history","pushState","hasFilters","get","total","visible","setLogic","logic","mode","toUpperCase","setFilterMode","addFilter","removeFilter","getActiveFiltersByType","startsWith"],"mappings":";;;;;;IAAA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;IAEA;IACA;IACA;IACA;IACA;IACA;IACA,SAASA,QAAQA,CAACC,IAAI,EAAEC,IAAI,EAAE;IAC1B,EAAA,IAAIC,OAAO,CAAA;MACX,OAAO,SAASC,gBAAgBA,GAAU;IAAA,IAAA,KAAA,IAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAANC,IAAI,GAAAC,IAAAA,KAAA,CAAAJ,IAAA,GAAAK,IAAA,GAAA,CAAA,EAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA,EAAA,EAAA;IAAJF,MAAAA,IAAI,CAAAE,IAAA,CAAAJ,GAAAA,SAAA,CAAAI,IAAA,CAAA,CAAA;IAAA,KAAA;QACpC,MAAMC,KAAK,GAAGA,MAAM;UAChBC,YAAY,CAACT,OAAO,CAAC,CAAA;UACrBF,IAAI,CAAC,GAAGO,IAAI,CAAC,CAAA;SAChB,CAAA;QACDI,YAAY,CAACT,OAAO,CAAC,CAAA;IACrBA,IAAAA,OAAO,GAAGU,UAAU,CAACF,KAAK,EAAET,IAAI,CAAC,CAAA;OACpC,CAAA;IACL,CAAA;IAEA,MAAMY,GAAG,CAAC;IACN;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;IAEI;IACJ;IACA;IACIC,EAAAA,WAAWA,GAAe;IAAA,IAAA,IAAdC,OAAO,GAAAV,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAW,SAAA,GAAAX,SAAA,CAAA,CAAA,CAAA,GAAG,EAAE,CAAA;QACpB,IAAI,CAACU,OAAO,GAAG;IACXE,MAAAA,iBAAiB,EAAE,mBAAmB;IACtCC,MAAAA,YAAY,EAAE,cAAc;IAC5BC,MAAAA,oBAAoB,EAAE,aAAa;IACnCC,MAAAA,mBAAmB,EAAE,gBAAgB;IACrCC,MAAAA,eAAe,EAAE,iBAAiB;IAClCC,MAAAA,WAAW,EAAE,QAAQ;IACrBC,MAAAA,WAAW,EAAE,QAAQ;IACrBC,MAAAA,iBAAiB,EAAE,GAAG;IACtBC,MAAAA,UAAU,EAAE,IAAI;UAChBC,UAAU,EAAE,CAAC,OAAO,CAAC;IACrBC,MAAAA,YAAY,EAAE,GAAG;UACjB,GAAGZ,OAAAA;SACN,CAAA;;IAED;IACA,IAAA,IAAI,CAACa,SAAS,GAAGC,QAAQ,CAACC,aAAa,CAAC,IAAI,CAACf,OAAO,CAACE,iBAAiB,CAAC,CAAA;IACvE,IAAA,IAAI,CAACc,KAAK,GAAGF,QAAQ,CAACG,gBAAgB,CAAC,IAAI,CAACjB,OAAO,CAACG,YAAY,CAAC,CAAA;IACjE,IAAA,IAAI,CAACe,aAAa,GAAGJ,QAAQ,CAACG,gBAAgB,CAC1C,IAAI,CAACjB,OAAO,CAACI,oBACjB,CAAC,CAAA;IACD,IAAA,IAAI,CAACe,WAAW,GAAGL,QAAQ,CAACC,aAAa,CACrC,IAAI,CAACf,OAAO,CAACK,mBACjB,CAAC,CAAA;IACD,IAAA,IAAI,CAACe,OAAO,GAAGN,QAAQ,CAACC,aAAa,CAAC,IAAI,CAACf,OAAO,CAACM,eAAe,CAAC,CAAA;;IAEnE;QACA,IAAI,CAACe,cAAc,GAAG,IAAIC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACpC,IAAI,CAACC,aAAa,GAAG,EAAE,CAAA;QACvB,IAAI,CAACC,YAAY,GAAG,IAAIF,GAAG,CAAC,IAAI,CAACN,KAAK,CAAC,CAAA;QAEvC,IAAI,CAACS,IAAI,EAAE,CAAA;IACf,GAAA;;IAEA;IACJ;IACA;IACA;IACIA,EAAAA,IAAIA,GAAG;QACH,IAAI,CAACC,SAAS,EAAE,CAAA;QAChB,IAAI,CAACC,UAAU,EAAE,CAAA;QACjB,IAAI,CAACC,WAAW,EAAE,CAAA;QAClB,IAAI,CAACC,aAAa,EAAE,CAAA;IACxB,GAAA;;IAEA;IACJ;IACA;IACA;IACIH,EAAAA,SAASA,GAAG;IACR,IAAA,MAAMI,MAAM,GAAG,CAAA;AACvB,aAAA,EAAe,IAAI,CAAC9B,OAAO,CAACQ,WAAW,CAAA;AACvC;AACA;AACA;AACA,YAAA,EAAc,IAAI,CAACR,OAAO,CAACG,YAAY,CAAA;AACvC;AACA;AACA,oCAAA,EAAsC,IAAI,CAACH,OAAO,CAACS,iBAAiB,CAAA;AACpE,sCAAA,EAAwC,IAAI,CAACT,OAAO,CAACS,iBAAiB,CAAA;AACtE;AACA;AACA,YAAA,EAAc,IAAI,CAACT,OAAO,CAACI,oBAAoB,CAAA;AAC/C;AACA,oCAAA,EAAsC,IAAI,CAACJ,OAAO,CAACS,iBAAiB,CAAA;AACpE;AACA;AACA,YAAc,EAAA,IAAI,CAACT,OAAO,CAACI,oBAAoB,IAAI,IAAI,CAACJ,OAAO,CAACO,WAAW,CAAA;AAC3E;AACA;AACA,QAAS,CAAA,CAAA;IAED,IAAA,MAAMwB,UAAU,GAAGjB,QAAQ,CAACkB,aAAa,CAAC,OAAO,CAAC,CAAA;QAClDD,UAAU,CAACE,WAAW,GAAGH,MAAM,CAAA;IAC/BhB,IAAAA,QAAQ,CAACoB,IAAI,CAACC,WAAW,CAACJ,UAAU,CAAC,CAAA;IACzC,GAAA;;IAEA;IACJ;IACA;IACA;IACIJ,EAAAA,UAAUA,GAAG;IACT,IAAA,IAAI,CAACT,aAAa,CAACkB,OAAO,CAAEC,MAAM,IAAK;IACnCA,MAAAA,MAAM,CAACC,gBAAgB,CAAC,OAAO,EAAE,MAC7B,IAAI,CAACC,iBAAiB,CAACF,MAAM,CACjC,CAAC,CAAA;IACL,KAAC,CAAC,CAAA;QAEF,IAAI,IAAI,CAAClB,WAAW,EAAE;UAClB,IAAI,CAACA,WAAW,CAACmB,gBAAgB,CAC7B,OAAO,EACPtD,QAAQ,CAAEwD,CAAC,IAAK;YACZ,IAAI,CAACC,MAAM,CAACD,CAAC,CAACE,MAAM,CAACC,KAAK,CAAC,CAAA;IAC/B,OAAC,EAAE,IAAI,CAAC3C,OAAO,CAACY,YAAY,CAChC,CAAC,CAAA;IACL,KAAA;QAEAgC,MAAM,CAACN,gBAAgB,CAAC,UAAU,EAAE,MAAM,IAAI,CAACV,WAAW,EAAE,CAAC,CAAA;IACjE,GAAA;;IAEA;IACJ;IACA;IACA;IACA;MACIW,iBAAiBA,CAACF,MAAM,EAAE;IACtB,IAAA,MAAMQ,WAAW,GAAGR,MAAM,CAACS,OAAO,CAACC,MAAM,CAAA;QAEzC,IAAIF,WAAW,KAAK,GAAG,EAAE;UACrB,IAAI,CAACG,YAAY,EAAE,CAAA;IACvB,KAAC,MAAM;IACH,MAAA,IAAI,CAACC,YAAY,CAACJ,WAAW,EAAER,MAAM,CAAC,CAAA;IAC1C,KAAA;QAEA,IAAI,CAACU,MAAM,EAAE,CAAA;QACb,IAAI,CAACG,SAAS,EAAE,CAAA;IACpB,GAAA;;IAEA;IACJ;IACA;IACA;IACIF,EAAAA,YAAYA,GAAG;IACX,IAAA,IAAI,CAAC9B,aAAa,CAACkB,OAAO,CAAEe,GAAG,IAC3BA,GAAG,CAACC,SAAS,CAACC,MAAM,CAAC,IAAI,CAACrD,OAAO,CAACO,WAAW,CACjD,CAAC,CAAA;IACD,IAAA,IAAI,CAACc,cAAc,CAACiC,KAAK,EAAE,CAAA;IAC3B,IAAA,IAAI,CAACjC,cAAc,CAACkC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,IAAA,IAAI,CAACrC,aAAa,CAAC,CAAC,CAAC,CAACkC,SAAS,CAACG,GAAG,CAAC,IAAI,CAACvD,OAAO,CAACO,WAAW,CAAC,CAAA;QAC7D,IAAI,CAACiD,YAAY,EAAE,CAAA;IACvB,GAAA;;IAEA;IACJ;IACA;IACA;IACIA,EAAAA,YAAYA,GAAG;QACX,IAAI,CAAChC,YAAY,GAAG,IAAIF,GAAG,CAAC,IAAI,CAACN,KAAK,CAAC,CAAA;QACvC,IAAI,CAACa,aAAa,EAAE,CAAA;IACxB,GAAA;;IAEA;IACJ;IACA;IACA;IACA;IACA;IACIoB,EAAAA,YAAYA,CAACJ,WAAW,EAAER,MAAM,EAAE;IAC9B,IAAA,IAAI,CAAChB,cAAc,CAACoC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAA,IAAI,CAACvC,aAAa,CAAC,CAAC,CAAC,CAACkC,SAAS,CAACC,MAAM,CAAC,IAAI,CAACrD,OAAO,CAACO,WAAW,CAAC,CAAA;IAEhE,IAAA,IAAI8B,MAAM,CAACe,SAAS,CAACM,QAAQ,CAAC,IAAI,CAAC1D,OAAO,CAACO,WAAW,CAAC,EAAE;UACrD8B,MAAM,CAACe,SAAS,CAACC,MAAM,CAAC,IAAI,CAACrD,OAAO,CAACO,WAAW,CAAC,CAAA;IACjD,MAAA,IAAI,CAACc,cAAc,CAACoC,MAAM,CAACZ,WAAW,CAAC,CAAA;IAEvC,MAAA,IAAI,IAAI,CAACxB,cAAc,CAACsC,IAAI,KAAK,CAAC,EAAE;YAChC,IAAI,CAACX,YAAY,EAAE,CAAA;IACvB,OAAA;IACJ,KAAC,MAAM;UACHX,MAAM,CAACe,SAAS,CAACG,GAAG,CAAC,IAAI,CAACvD,OAAO,CAACO,WAAW,CAAC,CAAA;IAC9C,MAAA,IAAI,CAACc,cAAc,CAACkC,GAAG,CAACV,WAAW,CAAC,CAAA;IACxC,KAAA;IACJ,GAAA;;IAEA;IACJ;IACA;IACA;IACIE,EAAAA,MAAMA,GAAG;IACL,IAAA,IAAI,CAACvB,YAAY,CAAC8B,KAAK,EAAE,CAAC;;IAE1B,IAAA,IAAI,CAACtC,KAAK,CAACoB,OAAO,CAAEwB,IAAI,IAAK;UACzB,IAAI,IAAI,CAACvC,cAAc,CAACwC,GAAG,CAAC,GAAG,CAAC,EAAE;IAC9B,QAAA,IAAI,CAACC,QAAQ,CAACF,IAAI,CAAC,CAAA;YACnB,IAAI,CAACpC,YAAY,CAAC+B,GAAG,CAACK,IAAI,CAAC,CAAC;IAChC,OAAC,MAAM;IACH,QAAA,MAAMG,cAAc,GAAG,IAAIzC,GAAG,CAC1BsC,IAAI,CAACd,OAAO,CAACkB,UAAU,EAAEC,KAAK,CAAC,GAAG,CAAC,IAAI,EAC3C,CAAC,CAAA;YACD,MAAMC,aAAa,GACf,IAAI,CAAClE,OAAO,CAACU,UAAU,KAAK,IAAI,GAC1B,IAAI,CAACyD,gBAAgB,CAACJ,cAAc,CAAC,GACrC,IAAI,CAACK,iBAAiB,CAACL,cAAc,CAAC,CAAA;IAEhD,QAAA,IAAIG,aAAa,EAAE;IACf,UAAA,IAAI,CAACJ,QAAQ,CAACF,IAAI,CAAC,CAAA;cACnB,IAAI,CAACpC,YAAY,CAAC+B,GAAG,CAACK,IAAI,CAAC,CAAC;IAChC,SAAC,MAAM;IACH,UAAA,IAAI,CAACS,QAAQ,CAACT,IAAI,CAAC,CAAA;IACvB,SAAA;IACJ,OAAA;IACJ,KAAC,CAAC,CAAA;IAEF/D,IAAAA,UAAU,CAAC,MAAM;UACb,IAAI,CAACgC,aAAa,EAAE,CAAA;IACxB,KAAC,EAAE,IAAI,CAAC7B,OAAO,CAACS,iBAAiB,CAAC,CAAA;IACtC,GAAA;;IAEA;IACJ;IACA;IACA;IACA;IACA;MACI0D,gBAAgBA,CAACJ,cAAc,EAAE;QAC7B,OAAO,CAAC,GAAG,IAAI,CAAC1C,cAAc,CAAC,CAACiD,IAAI,CAAEvB,MAAM,IAAK;UAC7C,MAAM,CAACwB,IAAI,EAAE5B,KAAK,CAAC,GAAGI,MAAM,CAACkB,KAAK,CAAC,GAAG,CAAC,CAAA;UACvC,OAAOF,cAAc,CAACF,GAAG,CAAC,GAAGU,IAAI,CAAA,CAAA,EAAI5B,KAAK,CAAA,CAAE,CAAC,CAAA;IACjD,KAAC,CAAC,CAAA;IACN,GAAA;;IAEA;IACJ;IACA;IACA;IACA;IACA;MACIyB,iBAAiBA,CAACL,cAAc,EAAE;QAC9B,OAAO,CAAC,GAAG,IAAI,CAAC1C,cAAc,CAAC,CAACmD,KAAK,CAAEzB,MAAM,IAAK;UAC9C,MAAM,CAACwB,IAAI,EAAE5B,KAAK,CAAC,GAAGI,MAAM,CAACkB,KAAK,CAAC,GAAG,CAAC,CAAA;UACvC,OAAOF,cAAc,CAACF,GAAG,CAAC,GAAGU,IAAI,CAAA,CAAA,EAAI5B,KAAK,CAAA,CAAE,CAAC,CAAA;IACjD,KAAC,CAAC,CAAA;IACN,GAAA;;IAEA;IACJ;IACA;IACA;IACA;MACImB,QAAQA,CAACF,IAAI,EAAE;IACX,IAAA,IAAI,CAACpC,YAAY,CAAC+B,GAAG,CAACK,IAAI,CAAC,CAAA;QAC3BA,IAAI,CAACR,SAAS,CAACC,MAAM,CAAC,IAAI,CAACrD,OAAO,CAACQ,WAAW,CAAC,CAAA;IAC/CoD,IAAAA,IAAI,CAACa,KAAK,CAACC,OAAO,GAAG,GAAG,CAAA;IACxBd,IAAAA,IAAI,CAACa,KAAK,CAACE,SAAS,GAAG,aAAa,CAAA;IAEpCf,IAAAA,IAAI,CAACgB,YAAY,CAAA;IAEjBC,IAAAA,qBAAqB,CAAC,MAAM;IACxBjB,MAAAA,IAAI,CAACa,KAAK,CAACC,OAAO,GAAG,GAAG,CAAA;IACxBd,MAAAA,IAAI,CAACa,KAAK,CAACE,SAAS,GAAG,UAAU,CAAA;IACrC,KAAC,CAAC,CAAA;IACN,GAAA;;IAEA;IACJ;IACA;IACA;IACA;MACIN,QAAQA,CAACT,IAAI,EAAE;IACXA,IAAAA,IAAI,CAACa,KAAK,CAACC,OAAO,GAAG,GAAG,CAAA;IACxBd,IAAAA,IAAI,CAACa,KAAK,CAACE,SAAS,GAAG,aAAa,CAAA;IAEpC9E,IAAAA,UAAU,CAAC,MAAM;IACb,MAAA,IAAI+D,IAAI,CAACa,KAAK,CAACC,OAAO,KAAK,GAAG,EAAE;YAC5Bd,IAAI,CAACR,SAAS,CAACG,GAAG,CAAC,IAAI,CAACvD,OAAO,CAACQ,WAAW,CAAC,CAAA;IAC5C,QAAA,IAAI,CAACgB,YAAY,CAACiC,MAAM,CAACG,IAAI,CAAC,CAAA;IAClC,OAAA;IACJ,KAAC,EAAE,IAAI,CAAC5D,OAAO,CAACS,iBAAiB,CAAC,CAAA;IACtC,GAAA;;IAEA;IACJ;IACA;IACA;IACA;MACIgC,MAAMA,CAACqC,KAAK,EAAE;QACV,IAAI,CAACvD,aAAa,GAAGuD,KAAK,CAACC,WAAW,EAAE,CAACC,IAAI,EAAE,CAAA;IAG/C,IAAA,IAAI,CAAChE,KAAK,CAACoB,OAAO,CAAEwB,IAAI,IAAK;IACzB,MAAA,MAAMqB,UAAU,GAAG,IAAI,CAACjF,OAAO,CAACW,UAAU,CACrCuE,GAAG,CAAEC,GAAG,IAAKvB,IAAI,CAACd,OAAO,CAACqC,GAAG,CAAC,IAAI,EAAE,CAAC,CACrCC,IAAI,CAAC,GAAG,CAAC,CACTL,WAAW,EAAE,CAAA;IAElB,MAAA,MAAMM,aAAa,GACf,IAAI,CAAC9D,aAAa,KAAK,EAAE,IACzB0D,UAAU,CAACK,QAAQ,CAAC,IAAI,CAAC/D,aAAa,CAAC,CAAA;IAE3C,MAAA,IAAI8D,aAAa,EAAE;IACf,QAAA,IAAI,CAACvB,QAAQ,CAACF,IAAI,CAAC,CAAA;IAEvB,OAAC,MAAM;IACH,QAAA,IAAI,CAACS,QAAQ,CAACT,IAAI,CAAC,CAAA;IACvB,OAAA;IACJ,KAAC,CAAC,CAAA;QAEF,IAAI,CAACV,SAAS,EAAE,CAAA;IAEhBrD,IAAAA,UAAU,CAAC,MAAM;UACb,IAAI,CAACgC,aAAa,EAAE,CAAA;IACxB,KAAC,EAAE,IAAI,CAAC7B,OAAO,CAACS,iBAAiB,CAAC,CAAA;IACtC,GAAA;;IAEA;IACJ;IACA;IACA;IACA;MACI8E,YAAYA,CAACC,QAAQ,EAAE;IACnB,IAAA,MAAMxE,KAAK,GAAG,CAAC,GAAG,IAAI,CAACA,KAAK,CAAC,CAAA;IAE7BA,IAAAA,KAAK,CAACyE,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK;IACjB,MAAA,KAAK,MAAMC,SAAS,IAAIJ,QAAQ,EAAE;YAC9B,MAAMK,MAAM,GAAGH,CAAC,CAAC5C,OAAO,CAAC8C,SAAS,CAACT,GAAG,CAAC,CAAA;YACvC,MAAMW,MAAM,GAAGH,CAAC,CAAC7C,OAAO,CAAC8C,SAAS,CAACT,GAAG,CAAC,CAAA;YAEvC,MAAMY,UAAU,GACZH,SAAS,CAACI,SAAS,KAAK,KAAK,GACvBH,MAAM,CAACI,aAAa,CAACH,MAAM,CAAC,GAC5BA,MAAM,CAACG,aAAa,CAACJ,MAAM,CAAC,CAAA;IAEtC,QAAA,IAAIE,UAAU,KAAK,CAAC,EAAE,OAAOA,UAAU,CAAA;IAC3C,OAAA;IACA,MAAA,OAAO,CAAC,CAAA;IACZ,KAAC,CAAC,CAAA;IAEF/E,IAAAA,KAAK,CAACoB,OAAO,CAAEwB,IAAI,IAAK,IAAI,CAAC/C,SAAS,CAACsB,WAAW,CAACyB,IAAI,CAAC,CAAC,CAAA;IAC7D,GAAA;;IAEA;IACJ;IACA;IACA;IACA;IACA;IACA;IACIsC,EAAAA,cAAcA,CAACf,GAAG,EAAEgB,GAAG,EAAEC,GAAG,EAAE;IAC1B,IAAA,IAAI,CAACpF,KAAK,CAACoB,OAAO,CAAEwB,IAAI,IAAK;UACzB,MAAMjB,KAAK,GAAG0D,UAAU,CAACzC,IAAI,CAACd,OAAO,CAACqC,GAAG,CAAC,CAAC,CAAA;UAC3C,MAAMmB,OAAO,GAAG3D,KAAK,IAAIwD,GAAG,IAAIxD,KAAK,IAAIyD,GAAG,CAAA;IAE5C,MAAA,IAAIE,OAAO,EAAE;IACT,QAAA,IAAI,CAACxC,QAAQ,CAACF,IAAI,CAAC,CAAA;IACvB,OAAC,MAAM;IACH,QAAA,IAAI,CAACS,QAAQ,CAACT,IAAI,CAAC,CAAA;IACvB,OAAA;IACJ,KAAC,CAAC,CAAA;IAEF/D,IAAAA,UAAU,CAAC,MAAM;UACb,IAAI,CAACgC,aAAa,EAAE,CAAA;IACxB,KAAC,EAAE,IAAI,CAAC7B,OAAO,CAACS,iBAAiB,CAAC,CAAA;IACtC,GAAA;;IAEA;IACJ;IACA;IACA;IACIyC,EAAAA,SAASA,GAAG;IACR,IAAA,MAAMqD,MAAM,GAAG,IAAIC,eAAe,EAAE,CAAA;;IAEpC;QACA,MAAMC,aAAa,GAAG,EAAE,CAAA;IACxB,IAAA,KAAK,MAAM1D,MAAM,IAAI,IAAI,CAAC1B,cAAc,EAAE;UACtC,IAAI0B,MAAM,KAAK,GAAG,EAAE;YAChB,MAAM,CAACwB,IAAI,EAAE5B,KAAK,CAAC,GAAGI,MAAM,CAACkB,KAAK,CAAC,GAAG,CAAC,CAAA;IACvC,QAAA,IAAI,CAACwC,aAAa,CAAClC,IAAI,CAAC,EAAE;IACtBkC,UAAAA,aAAa,CAAClC,IAAI,CAAC,GAAG,IAAIjD,GAAG,EAAE,CAAA;IACnC,SAAA;IACAmF,QAAAA,aAAa,CAAClC,IAAI,CAAC,CAAChB,GAAG,CAACZ,KAAK,CAAC,CAAA;IAClC,OAAA;IACJ,KAAA;;IAEA;QACA+D,MAAM,CAACC,OAAO,CAACF,aAAa,CAAC,CAACrE,OAAO,CAACwE,IAAA,IAAoB;IAAA,MAAA,IAAnB,CAACrC,IAAI,EAAEsC,MAAM,CAAC,GAAAD,IAAA,CAAA;IACjDL,MAAAA,MAAM,CAACO,GAAG,CAACvC,IAAI,EAAE9E,KAAK,CAACsH,IAAI,CAACF,MAAM,CAAC,CAACzB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAClD,KAAC,CAAC,CAAA;QAEF,IAAI,IAAI,CAAC7D,aAAa,EAAE;UACpBgF,MAAM,CAACO,GAAG,CAAC,QAAQ,EAAE,IAAI,CAACvF,aAAa,CAAC,CAAA;IAC5C,KAAA;QAEA,MAAMyF,MAAM,GAAG,CAAA,EAAGpE,MAAM,CAACqE,QAAQ,CAACC,QAAQ,CACtCX,EAAAA,MAAM,CAACY,QAAQ,EAAE,GAAG,GAAG,GAAGZ,MAAM,CAACY,QAAQ,EAAE,GAAG,EAAE,CAClD,CAAA,CAAA;QACFvE,MAAM,CAACwE,OAAO,CAACC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAEL,MAAM,CAAC,CAAA;IAC5C,GAAA;;IAEA;IACJ;IACA;IACA;IACIpF,EAAAA,WAAWA,GAAG;QACV,MAAM2E,MAAM,GAAG,IAAIC,eAAe,CAAC5D,MAAM,CAACqE,QAAQ,CAACxE,MAAM,CAAC,CAAA;IAC1D,IAAA,IAAI,CAACpB,cAAc,CAACiC,KAAK,EAAE,CAAA;;IAE3B;QACA,IAAIgE,UAAU,GAAG,KAAK,CAAA;;IAEtB;IACA,IAAA,KAAK,MAAM,CAAC/C,IAAI,EAAEsC,MAAM,CAAC,IAAIN,MAAM,CAACI,OAAO,EAAE,EAAE;UAC3C,IAAIpC,IAAI,KAAK,QAAQ,EAAE;IACnB+C,QAAAA,UAAU,GAAG,IAAI,CAAA;YACjBT,MAAM,CAAC5C,KAAK,CAAC,GAAG,CAAC,CAAC7B,OAAO,CAAEO,KAAK,IAAK;cACjC,IAAI,CAACtB,cAAc,CAACkC,GAAG,CAAC,GAAGgB,IAAI,CAAA,CAAA,EAAI5B,KAAK,CAAA,CAAE,CAAC,CAAA;IAC/C,SAAC,CAAC,CAAA;IACN,OAAA;IACJ,KAAA;QAEA,IAAI,CAAC2E,UAAU,EAAE;IACb,MAAA,IAAI,CAACjG,cAAc,CAACkC,GAAG,CAAC,GAAG,CAAC,CAAA;IAChC,KAAA;;IAEA;IACA,IAAA,IAAI,CAACrC,aAAa,CAACkB,OAAO,CAAEC,MAAM,IAAK;IACnC,MAAA,MAAMQ,WAAW,GAAGR,MAAM,CAACS,OAAO,CAACC,MAAM,CAAA;UACzC,IACI,IAAI,CAAC1B,cAAc,CAACwC,GAAG,CAAChB,WAAW,CAAC,IACnCA,WAAW,KAAK,GAAG,IAAI,IAAI,CAACxB,cAAc,CAACwC,GAAG,CAAC,GAAG,CAAE,EACvD;YACExB,MAAM,CAACe,SAAS,CAACG,GAAG,CAAC,IAAI,CAACvD,OAAO,CAACO,WAAW,CAAC,CAAA;IAClD,OAAC,MAAM;YACH8B,MAAM,CAACe,SAAS,CAACC,MAAM,CAAC,IAAI,CAACrD,OAAO,CAACO,WAAW,CAAC,CAAA;IACrD,OAAA;IACJ,KAAC,CAAC,CAAA;;IAEF;QACA,MAAMkC,MAAM,GAAG8D,MAAM,CAACgB,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;QACzC,IAAI,IAAI,CAACpG,WAAW,EAAE;IAClB,MAAA,IAAI,CAACA,WAAW,CAACwB,KAAK,GAAGF,MAAM,CAAA;IACnC,KAAA;QAEA,IAAI,CAACM,MAAM,EAAE,CAAA;IACb,IAAA,IAAIN,MAAM,EAAE;IACR,MAAA,IAAI,CAACA,MAAM,CAACA,MAAM,CAAC,CAAA;IACvB,KAAA;IACJ,GAAA;;IAEA;IACJ;IACA;IACA;IACA;IACIZ,EAAAA,aAAaA,GAAG;IACZ,IAAA,MAAM2F,KAAK,GAAG,IAAI,CAACxG,KAAK,CAACzB,MAAM,CAAA;IAC/B,IAAA,MAAMkI,OAAO,GAAG,IAAI,CAACjG,YAAY,CAACmC,IAAI,CAAA;QAEtC,IAAI,IAAI,CAACvC,OAAO,EAAE;UACd,IAAI,CAACA,OAAO,CAACa,WAAW,GAAG,CAAWwF,QAAAA,EAAAA,OAAO,CAAOD,IAAAA,EAAAA,KAAK,CAAE,CAAA,CAAA;IAC/D,KAAA;QAEA,OAAO;UAAEA,KAAK;IAAEC,MAAAA,OAAAA;SAAS,CAAA;IAC7B,GAAA;;IAEA;IACJ;IACA;IACA;IACA;MACIC,QAAQA,CAACC,KAAK,EAAE;IACZ,IAAA,IAAI,OAAOA,KAAK,KAAK,SAAS,EAAE;IAC5B;UACA,IAAI,CAAC3H,OAAO,CAACU,UAAU,GAAGiH,KAAK,GAAG,KAAK,GAAG,IAAI,CAAA;UAC9C,IAAI,CAAC5E,MAAM,EAAE,CAAA;IACb,MAAA,OAAA;IACJ,KAAA;IAEA,IAAA,MAAM6E,IAAI,GAAGD,KAAK,CAACE,WAAW,EAAE,CAAA;QAChC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAACvC,QAAQ,CAACsC,IAAI,CAAC,EAAE;IAC9B,MAAA,IAAI,CAAC5H,OAAO,CAACU,UAAU,GAAGkH,IAAI,CAAA;UAC9B,IAAI,CAAC7E,MAAM,EAAE,CAAA;IACjB,KAAA;IACJ,GAAA;;IAGA;IACJ;IACA;IACA;IACA;MACI+E,aAAaA,CAACF,IAAI,EAAE;IAChB,IAAA,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAACtC,QAAQ,CAACsC,IAAI,CAACC,WAAW,EAAE,CAAC,EAAE;UAC5C,IAAI,CAAC7H,OAAO,CAACU,UAAU,GAAGkH,IAAI,CAACC,WAAW,EAAE,CAAA;UAC5C,IAAI,CAAC9E,MAAM,EAAE,CAAA;IACjB,KAAA;IACJ,GAAA;;IAEA;IACJ;IACA;IACA;IACA;IACA;IACIgF,EAAAA,SAASA,CAACxD,IAAI,EAAE5B,KAAK,EAAE;QACnB,IAAI,CAACtB,cAAc,CAACkC,GAAG,CAAC,GAAGgB,IAAI,CAAA,CAAA,EAAI5B,KAAK,CAAA,CAAE,CAAC,CAAA;QAC3C,IAAI,CAACI,MAAM,EAAE,CAAA;QACb,IAAI,CAACG,SAAS,EAAE,CAAA;IACpB,GAAA;;IAEA;IACJ;IACA;IACA;IACA;IACI8E,EAAAA,YAAYA,CAACzD,IAAI,EAAE5B,KAAK,EAAE;QACtB,IAAI,CAACtB,cAAc,CAACoC,MAAM,CAAC,GAAGc,IAAI,CAAA,CAAA,EAAI5B,KAAK,CAAA,CAAE,CAAC,CAAA;IAC9C,IAAA,IAAI,IAAI,CAACtB,cAAc,CAACsC,IAAI,KAAK,CAAC,EAAE;IAChC,MAAA,IAAI,CAACtC,cAAc,CAACkC,GAAG,CAAC,GAAG,CAAC,CAAA;IAChC,KAAA;QACA,IAAI,CAACR,MAAM,EAAE,CAAA;QACb,IAAI,CAACG,SAAS,EAAE,CAAA;IACpB,GAAA;;IAEA;IACJ;IACA;IACA;IACA;MACI+E,sBAAsBA,CAAC1D,IAAI,EAAE;IACzB,IAAA,OAAO,CAAC,GAAG,IAAI,CAAClD,cAAc,CAAC,CAC1B0B,MAAM,CAAEA,MAAM,IAAKA,MAAM,CAACmF,UAAU,CAAC,CAAG3D,EAAAA,IAAI,CAAG,CAAA,CAAA,CAAC,CAAC,CACjDW,GAAG,CAAEnC,MAAM,IAAKA,MAAM,CAACkB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9C,GAAA;IACJ;;;;;;;;"}
1
+ {"version":3,"file":"AFS.js","sources":["../src/AFS.js"],"sourcesContent":["/**\n * @fileoverview Advanced Filter System for DOM elements\n * @version 1.0.0\n *\n * A flexible and customizable filtering system that supports:\n * - Multiple filtering modes (OR/AND)\n * - Text search with debouncing\n * - Multiple sorting criteria\n * - Range filtering\n * - URL state management\n * - Animation and transitions\n * - Results counter\n */\n\n/**\n * Utility function for debouncing\n * @param {Function} func - Function to debounce\n * @param {number} wait - Delay in milliseconds\n * @returns {Function} Debounced function\n */\nfunction debounce(func, wait) {\n let timeout;\n return function executedFunction(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n}\n\nclass AFS {\n /**\n * @typedef {Object} FilterOptions\n * @property {string} containerSelector - Main container selector\n * @property {string} itemSelector - Items to filter selector\n * @property {string} filterButtonSelector - Filter buttons selector\n * @property {string} [searchInputSelector] - Search input selector\n * @property {string} [counterSelector] - Results counter selector\n * @property {string} [activeClass='active'] - Active state class\n * @property {string} [hiddenClass='hidden'] - Hidden state class\n * @property {number} [animationDuration=300] - Animation duration in ms\n * @property {string} [filterMode='OR'] - Filter mode ('OR' or 'AND')\n * @property {string[]} [searchKeys=['title']] - Data attributes to search in\n * @property {number} [debounceTime=300] - Search debounce delay in ms\n */\n\n /**\n * @param {FilterOptions} options - Filter configuration options\n */\n constructor(options = {}) {\n this.options = {\n containerSelector: \".filter-container\",\n itemSelector: \".filter-item\",\n filterButtonSelector: \".btn-filter\",\n searchInputSelector: \".filter-search\",\n counterSelector: \".filter-counter\",\n activeClass: \"active\",\n hiddenClass: \"hidden\",\n animationDuration: 300,\n filterMode: \"OR\",\n searchKeys: [\"title\"],\n debounceTime: 300,\n ...options,\n };\n\n // Initialize elements\n this.container = document.querySelector(this.options.containerSelector);\n this.items = document.querySelectorAll(this.options.itemSelector);\n this.filterButtons = document.querySelectorAll(\n this.options.filterButtonSelector,\n );\n this.searchInput = document.querySelector(this.options.searchInputSelector);\n this.counter = document.querySelector(this.options.counterSelector);\n\n // Initialize state\n this.currentFilters = new Set([\"*\"]);\n this.currentSearch = \"\";\n this.visibleItems = new Set(this.items);\n this.filterGroups = new Map();\n this.groupMode = \"OR\"; // Default group mode\n\n this.init();\n }\n\n /**\n * Initialize the filter system\n * @private\n */\n init() {\n this.addStyles();\n this.bindEvents();\n this.loadFromURL();\n this.updateCounter();\n }\n\n /**\n * Add required styles to document\n * @private\n */\n addStyles() {\n const styles = `\n .${this.options.hiddenClass} {\n display: none !important;\n }\n\n ${this.options.itemSelector} {\n opacity: 1;\n transform: scale(1);\n transition: opacity ${this.options.animationDuration}ms ease-out,\n transform ${this.options.animationDuration}ms ease-out;\n }\n\n ${this.options.filterButtonSelector} {\n opacity: 0.5;\n transition: opacity ${this.options.animationDuration}ms ease;\n }\n\n ${this.options.filterButtonSelector}.${this.options.activeClass} {\n opacity: 1;\n }\n `;\n\n const styleSheet = document.createElement(\"style\");\n styleSheet.textContent = styles;\n document.head.appendChild(styleSheet);\n }\n\n /**\n * Bind all event listeners\n * @private\n */\n bindEvents() {\n this.filterButtons.forEach((button) => {\n button.addEventListener(\"click\", () => this.handleFilterClick(button));\n });\n\n if (this.searchInput) {\n this.searchInput.addEventListener(\n \"input\",\n debounce((e) => {\n this.search(e.target.value);\n }, this.options.debounceTime),\n );\n }\n\n window.addEventListener(\"popstate\", () => this.loadFromURL());\n }\n\n /**\n * Handle filter button clicks\n * @private\n * @param {HTMLElement} button - Clicked filter button\n */\n handleFilterClick(button) {\n const filterValue = button.dataset.filter;\n\n if (filterValue === \"*\") {\n this.resetFilters();\n } else {\n this.toggleFilter(filterValue, button);\n }\n\n this.filter();\n this.updateURL();\n }\n\n /**\n * Reset all filters to default state\n * @private\n */\n resetFilters() {\n this.filterButtons.forEach((btn) =>\n btn.classList.remove(this.options.activeClass),\n );\n this.currentFilters.clear();\n this.currentFilters.add(\"*\");\n this.filterButtons[0].classList.add(this.options.activeClass);\n this.resetCounter();\n }\n\n /**\n * Reset visible items counter\n * @private\n */\n resetCounter() {\n this.visibleItems = new Set(this.items);\n this.updateCounter();\n }\n\n /**\n * Toggle individual filter state\n * @private\n * @param {string} filterValue - Filter value to toggle\n * @param {HTMLElement} button - Filter button element\n */\n toggleFilter(filterValue, button) {\n this.currentFilters.delete(\"*\");\n this.filterButtons[0].classList.remove(this.options.activeClass);\n\n if (button.classList.contains(this.options.activeClass)) {\n button.classList.remove(this.options.activeClass);\n this.currentFilters.delete(filterValue);\n\n if (this.currentFilters.size === 0) {\n this.resetFilters();\n }\n } else {\n button.classList.add(this.options.activeClass);\n this.currentFilters.add(filterValue);\n }\n }\n\n /**\n * Apply current filters to items\n * @public\n */\n /**\n * Apply current filters to items\n * @public\n */\nfilter() {\n // Store the original filter logic\n const standardFilter = () => {\n this.visibleItems.clear();\n \n this.items.forEach((item) => {\n if (this.currentFilters.has(\"*\")) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n const itemCategories = new Set(\n item.dataset.categories?.split(\" \") || [],\n );\n const matchesFilter =\n this.options.filterMode === \"OR\"\n ? this.matchesAnyFilter(itemCategories)\n : this.matchesAllFilters(itemCategories);\n\n if (matchesFilter) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n this.hideItem(item);\n }\n }\n });\n };\n\n // Check if we should use group filtering or standard filtering\n if (this.filterGroups.size === 0) {\n standardFilter();\n } else {\n this.visibleItems.clear();\n\n this.items.forEach(item => {\n if (this.currentFilters.has(\"*\")) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n const itemCategories = new Set(item.dataset.categories?.split(\" \") || []);\n const matchesGroups = this.matchesFilterGroups(itemCategories);\n\n if (matchesGroups) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n this.hideItem(item);\n }\n }\n });\n }\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n}\n\n /**\n * Add or update a filter group\n * @public\n * @param {string} groupId - Group identifier\n * @param {string[]} filters - Array of filter values\n * @param {string} [operator='OR'] - Operator within group ('AND' or 'OR')\n * @returns {boolean} Success status\n */\n addFilterGroup(groupId, filters, operator = \"OR\") {\n try {\n // Validate inputs\n if (!groupId || !Array.isArray(filters)) {\n console.warn(\"Invalid group parameters\");\n return false;\n }\n\n const validOperator = operator.toUpperCase();\n if (![\"AND\", \"OR\"].includes(validOperator)) {\n console.warn('Invalid operator. Using default \"OR\"');\n operator = \"OR\";\n }\n\n // Create or update group\n this.filterGroups.set(groupId, {\n filters: new Set(filters),\n operator: validOperator,\n });\n\n // Only update if we have active groups\n if (this.filterGroups.size > 0) {\n this.updateFiltersFromGroups();\n this.filter();\n this.updateURL();\n }\n\n return true;\n } catch (error) {\n console.error(\"Error adding filter group:\", error);\n return false;\n }\n }\n\n /**\n * Set how groups combine with each other\n * @public\n * @param {string} mode - Mode for combining groups ('AND' or 'OR')\n */\n setGroupMode(mode) {\n const validMode = mode.toUpperCase();\n if ([\"AND\", \"OR\"].includes(validMode)) {\n this.groupMode = validMode;\n if (this.filterGroups.size > 0) {\n this.filter();\n }\n }\n }\n\n /**\n * Remove a filter group\n * @public\n * @param {string} groupId - Group identifier\n * @returns {boolean} Success status\n */\n removeFilterGroup(groupId) {\n if (this.filterGroups.has(groupId)) {\n this.filterGroups.delete(groupId);\n\n // If no groups left, revert to normal filtering\n if (this.filterGroups.size === 0) {\n this.resetFilters();\n } else {\n this.updateFiltersFromGroups();\n }\n\n this.filter();\n this.updateURL();\n return true;\n }\n return false;\n }\n\n /**\n * Update filters based on groups\n * @private\n */\n updateFiltersFromGroups() {\n // Only process if we have groups\n if (this.filterGroups.size === 0) return;\n\n // Clear current filters except '*'\n if (!this.currentFilters.has(\"*\")) {\n this.currentFilters.clear();\n }\n\n // Combine all group filters\n for (const group of this.filterGroups.values()) {\n group.filters.forEach((filter) => {\n if (filter !== \"*\") {\n this.currentFilters.add(filter);\n }\n });\n }\n }\n\n /**\n * Check if item matches any active filter (OR mode)\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches any filter\n */\n matchesAnyFilter(itemCategories) {\n return [...this.currentFilters].some((filter) => {\n const [type, value] = filter.split(\":\");\n return itemCategories.has(`${type}:${value}`);\n });\n }\n\n /**\n * Check if item matches all active filters (AND mode)\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches all filters\n */\n matchesAllFilters(itemCategories) {\n return [...this.currentFilters].every((filter) => {\n const [type, value] = filter.split(\":\");\n return itemCategories.has(`${type}:${value}`);\n });\n }\n\n /**\n * Show an item with animation\n * @private\n * @param {HTMLElement} item - Item to show\n */\n showItem(item) {\n this.visibleItems.add(item);\n item.classList.remove(this.options.hiddenClass);\n item.style.opacity = \"0\";\n item.style.transform = \"scale(0.95)\";\n\n item.offsetHeight;\n\n requestAnimationFrame(() => {\n item.style.opacity = \"1\";\n item.style.transform = \"scale(1)\";\n });\n }\n\n /**\n * Hide an item with animation\n * @private\n * @param {HTMLElement} item - Item to hide\n */\n hideItem(item) {\n item.style.opacity = \"0\";\n item.style.transform = \"scale(0.95)\";\n\n setTimeout(() => {\n if (item.style.opacity === \"0\") {\n item.classList.add(this.options.hiddenClass);\n this.visibleItems.delete(item);\n }\n }, this.options.animationDuration);\n }\n\n /**\n * Search items by text\n * @public\n * @param {string} query - Search query\n */\n search(query) {\n this.currentSearch = query.toLowerCase().trim();\n let matches = 0;\n\n this.items.forEach((item) => {\n const searchText = this.options.searchKeys\n .map((key) => item.dataset[key] || \"\")\n .join(\" \")\n .toLowerCase();\n\n const matchesSearch =\n this.currentSearch === \"\" || searchText.includes(this.currentSearch);\n\n if (matchesSearch) {\n this.showItem(item);\n matches++;\n } else {\n this.hideItem(item);\n }\n });\n\n this.updateURL();\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n }\n\n /**\n * Sort items by multiple criteria\n * @public\n * @param {Array<{key: string, direction: string}>} criteria - Sort criteria\n */\n sortMultiple(criteria) {\n const items = [...this.items];\n\n items.sort((a, b) => {\n for (const criterion of criteria) {\n const valueA = a.dataset[criterion.key];\n const valueB = b.dataset[criterion.key];\n\n const comparison =\n criterion.direction === \"asc\"\n ? valueA.localeCompare(valueB)\n : valueB.localeCompare(valueA);\n\n if (comparison !== 0) return comparison;\n }\n return 0;\n });\n\n items.forEach((item) => this.container.appendChild(item));\n }\n\n /**\n * Filter items by numeric range\n * @public\n * @param {string} key - Data attribute key\n * @param {number} min - Minimum value\n * @param {number} max - Maximum value\n */\n addRangeFilter(key, min, max) {\n this.items.forEach((item) => {\n const value = parseFloat(item.dataset[key]);\n const inRange = value >= min && value <= max;\n\n if (inRange) {\n this.showItem(item);\n } else {\n this.hideItem(item);\n }\n });\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n }\n\n /**\n * Check if item matches filter groups\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches the group filters\n */\n matchesFilterGroups(itemCategories) {\n const groupMatches = [...this.filterGroups.values()].map((group) => {\n const groupFilters = [...group.filters];\n if (groupFilters.length === 0) return true;\n\n return group.operator === \"OR\"\n ? groupFilters.some((filter) => itemCategories.has(filter))\n : groupFilters.every((filter) => itemCategories.has(filter));\n });\n\n return this.groupMode === \"OR\"\n ? groupMatches.some((matches) => matches)\n : groupMatches.every((matches) => matches);\n }\n\n /**\n * Update URL with current filter state\n * @private\n */\n updateURL() {\n const params = new URLSearchParams(window.location.search);\n\n // Add groups to URL if they exist\n if (this.filterGroups.size > 0) {\n for (const [groupId, group] of this.filterGroups.entries()) {\n params.set(`group_${groupId}`, [...group.filters].join(\",\"));\n params.set(`groupOp_${groupId}`, group.operator.toLowerCase());\n }\n params.set(\"groupMode\", this.groupMode.toLowerCase());\n }\n\n // Séparer les filtres par type\n const filtersByType = {};\n for (const filter of this.currentFilters) {\n if (filter !== \"*\") {\n const [type, value] = filter.split(\":\");\n if (!filtersByType[type]) {\n filtersByType[type] = new Set();\n }\n filtersByType[type].add(value);\n }\n }\n\n // Ajouter chaque type de filtre à l'URL\n Object.entries(filtersByType).forEach(([type, values]) => {\n params.set(type, Array.from(values).join(\",\"));\n });\n\n if (this.currentSearch) {\n params.set(\"search\", this.currentSearch);\n }\n\n const newURL = `${window.location.pathname}${\n params.toString() ? \"?\" + params.toString() : \"\"\n }`;\n window.history.pushState({}, \"\", newURL);\n }\n\n /**\n * Load filter state from URL\n * @private\n */\n loadFromURL() {\n const params = new URLSearchParams(window.location.search);\n\n // Load groups if they exist\n this.filterGroups.clear();\n for (const [key, value] of params.entries()) {\n if (key.startsWith(\"group_\")) {\n const groupId = key.replace(\"group_\", \"\");\n const operator =\n params.get(`groupOp_${groupId}`)?.toUpperCase() || \"OR\";\n const filters = value.split(\",\");\n this.addFilterGroup(groupId, filters, operator);\n }\n }\n\n // Set group mode if present\n const groupMode = params.get(\"groupMode\")?.toUpperCase();\n if (groupMode && [\"AND\", \"OR\"].includes(groupMode)) {\n this.groupMode = groupMode;\n }\n\n this.currentFilters.clear();\n\n // Si aucun filtre n'est présent, utiliser '*'\n let hasFilters = false;\n\n // Parcourir tous les paramètres\n for (const [type, values] of params.entries()) {\n if (type !== \"search\") {\n hasFilters = true;\n values.split(\",\").forEach((value) => {\n this.currentFilters.add(`${type}:${value}`);\n });\n }\n }\n\n if (!hasFilters) {\n this.currentFilters.add(\"*\");\n }\n\n // Update active buttons\n this.filterButtons.forEach((button) => {\n const filterValue = button.dataset.filter;\n if (\n this.currentFilters.has(filterValue) ||\n (filterValue === \"*\" && this.currentFilters.has(\"*\"))\n ) {\n button.classList.add(this.options.activeClass);\n } else {\n button.classList.remove(this.options.activeClass);\n }\n });\n\n // Load search\n const search = params.get(\"search\") || \"\";\n if (this.searchInput) {\n this.searchInput.value = search;\n }\n\n this.filter();\n if (search) {\n this.search(search);\n }\n }\n\n /**\n * Update results counter\n * @private\n * @returns {{total: number, visible: number}}\n */\n updateCounter() {\n const total = this.items.length;\n const visible = this.visibleItems.size;\n\n if (this.counter) {\n this.counter.textContent = `Showing ${visible} of ${total}`;\n }\n\n return { total, visible };\n }\n\n /**\n * Set animation options\n * @public\n * @param {Object} options - Animation options\n */\n setAnimationOptions(options = {}) {\n this.options.animationDuration =\n options.duration || this.options.animationDuration;\n this.options.animationType = options.type || \"ease-out\";\n this.addStyles(); // Refresh styles with new options\n }\n\n /**\n * Event handling system\n */\n addEventSystem() {\n this.events = {};\n\n this.on = (eventName, callback) => {\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n this.events[eventName].push(callback);\n };\n\n this.emit = (eventName, data) => {\n if (this.events[eventName]) {\n this.events[eventName].forEach((callback) => callback(data));\n }\n };\n }\n\n /**\n * Add pagination\n * @public\n * @param {number} itemsPerPage - Number of items per page\n */\n setPagination(itemsPerPage) {\n this.pagination = {\n currentPage: 1,\n itemsPerPage: itemsPerPage,\n totalPages: Math.ceil(this.visibleItems.size / itemsPerPage),\n };\n this.updatePagination();\n }\n\n updatePagination() {\n const start =\n (this.pagination.currentPage - 1) * this.pagination.itemsPerPage;\n const end = start + this.pagination.itemsPerPage;\n\n [...this.visibleItems].forEach((item, index) => {\n if (index >= start && index < end) {\n this.showItem(item);\n } else {\n this.hideItem(item);\n }\n });\n }\n\n /**\n * Enable analytics tracking\n * @public\n * @param {Function} callback - Analytics callback function\n */\n enableAnalytics(callback) {\n this.analyticsCallback = callback;\n this.on(\"filter\", (data) => {\n this.analyticsCallback({\n type: \"filter\",\n filters: [...this.currentFilters],\n visibleItems: this.visibleItems.size,\n timestamp: new Date().toISOString(),\n });\n });\n }\n\n /**\n * Sort with custom comparator\n * @public\n * @param {string} key - Data attribute key\n * @param {Function} comparator - Custom comparison function\n */\n sortWithComparator(key, comparator) {\n const items = [...this.items];\n items.sort((a, b) => {\n const valueA = a.dataset[key];\n const valueB = b.dataset[key];\n return comparator(valueA, valueB);\n });\n items.forEach((item) => this.container.appendChild(item));\n }\n\n /**\n * Add responsive behavior\n * @public\n * @param {Object} breakpoints - Breakpoint configurations\n */\n setResponsiveOptions(breakpoints) {\n window.addEventListener(\n \"resize\",\n debounce(() => {\n const width = window.innerWidth;\n for (const [breakpoint, options] of Object.entries(breakpoints)) {\n if (width <= parseInt(breakpoint)) {\n Object.assign(this.options, options);\n this.filter();\n break;\n }\n }\n }, 250),\n );\n }\n\n /**\n * Enable keyboard navigation\n * @public\n */\n enableKeyboardNavigation() {\n document.addEventListener(\"keydown\", (e) => {\n if (\n e.key === \"Enter\" &&\n document.activeElement.classList.contains(\n this.options.filterButtonSelector.slice(1),\n )\n ) {\n document.activeElement.click();\n }\n });\n }\n\n /**\n * Export current filter state\n * @public\n * @returns {Object} Filter state\n */\n exportState() {\n return {\n filters: [...this.currentFilters],\n search: this.currentSearch,\n mode: this.options.filterMode,\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Import filter state\n * @public\n * @param {Object} state - Filter state to import\n */\n importState(state) {\n if (state.filters) {\n this.currentFilters = new Set(state.filters);\n this.currentSearch = state.search || \"\";\n this.options.filterMode = state.mode || \"OR\";\n this.filter();\n this.updateURL();\n }\n }\n\n /**\n * Save current filter state as preset\n * @public\n * @param {string} presetName - Name of the preset\n */\n savePreset(presetName) {\n const preset = {\n filters: [...this.currentFilters],\n search: this.currentSearch,\n mode: this.options.filterMode,\n };\n localStorage.setItem(`afs_preset_${presetName}`, JSON.stringify(preset));\n }\n\n /**\n * Load filter preset\n * @public\n * @param {string} presetName - Name of the preset to load\n */\n loadPreset(presetName) {\n const preset = JSON.parse(localStorage.getItem(`afs_preset_${presetName}`));\n if (preset) {\n this.currentFilters = new Set(preset.filters);\n this.currentSearch = preset.search;\n this.options.filterMode = preset.mode;\n this.filter();\n this.updateURL();\n }\n }\n\n /**\n * Set filter logic mode (alias for setFilterMode)\n * @public\n * @param {string} logic - New filter logic ('AND' or 'OR')\n */\n setLogic(logic) {\n if (typeof logic === \"boolean\") {\n // Handle boolean input (true = AND, false = OR)\n this.options.filterMode = logic ? \"AND\" : \"OR\";\n this.filter();\n return;\n }\n\n const mode = logic.toUpperCase();\n if ([\"OR\", \"AND\"].includes(mode)) {\n this.options.filterMode = mode;\n this.filter();\n }\n }\n\n /**\n * Change filter mode\n * @public\n * @param {string} mode - New filter mode ('OR' or 'AND')\n */\n setFilterMode(mode) {\n if ([\"OR\", \"AND\"].includes(mode.toUpperCase())) {\n this.options.filterMode = mode.toUpperCase();\n this.filter();\n }\n }\n\n /**\n * Add filter by type and value\n * @public\n * @param {string} type - Filter type\n * @param {string} value - Filter value\n */\n addFilter(type, value) {\n this.currentFilters.add(`${type}:${value}`);\n this.filter();\n this.updateURL();\n }\n\n /**\n * Remove filter by type and value\n * @public\n * @param {string} type - Filter type\n */\n removeFilter(type, value) {\n this.currentFilters.delete(`${type}:${value}`);\n if (this.currentFilters.size === 0) {\n this.currentFilters.add(\"*\");\n }\n this.filter();\n this.updateURL();\n }\n\n /**\n * Get active filters by type\n * @public\n * @param {string} type - Filter type\n */\n getActiveFiltersByType(type) {\n return [...this.currentFilters]\n .filter((filter) => filter.startsWith(`${type}:`))\n .map((filter) => filter.split(\":\")[1]);\n }\n}\n\nexport { AFS };\n"],"names":["debounce","func","wait","timeout","executedFunction","_len","arguments","length","args","Array","_key","later","clearTimeout","setTimeout","AFS","constructor","options","undefined","containerSelector","itemSelector","filterButtonSelector","searchInputSelector","counterSelector","activeClass","hiddenClass","animationDuration","filterMode","searchKeys","debounceTime","container","document","querySelector","items","querySelectorAll","filterButtons","searchInput","counter","currentFilters","Set","currentSearch","visibleItems","filterGroups","Map","groupMode","init","addStyles","bindEvents","loadFromURL","updateCounter","styles","styleSheet","createElement","textContent","head","appendChild","forEach","button","addEventListener","handleFilterClick","e","search","target","value","window","filterValue","dataset","filter","resetFilters","toggleFilter","updateURL","btn","classList","remove","clear","add","resetCounter","delete","contains","size","standardFilter","item","has","showItem","itemCategories","categories","split","matchesFilter","matchesAnyFilter","matchesAllFilters","hideItem","matchesGroups","matchesFilterGroups","addFilterGroup","groupId","filters","operator","isArray","console","warn","validOperator","toUpperCase","includes","set","updateFiltersFromGroups","error","setGroupMode","mode","validMode","removeFilterGroup","group","values","some","type","every","style","opacity","transform","offsetHeight","requestAnimationFrame","query","toLowerCase","trim","searchText","map","key","join","matchesSearch","sortMultiple","criteria","sort","a","b","criterion","valueA","valueB","comparison","direction","localeCompare","addRangeFilter","min","max","parseFloat","inRange","groupMatches","groupFilters","matches","params","URLSearchParams","location","entries","filtersByType","Object","_ref","from","newURL","pathname","toString","history","pushState","startsWith","replace","get","hasFilters","total","visible","setAnimationOptions","duration","animationType","addEventSystem","events","on","eventName","callback","push","emit","data","setPagination","itemsPerPage","pagination","currentPage","totalPages","Math","ceil","updatePagination","start","end","index","enableAnalytics","analyticsCallback","timestamp","Date","toISOString","sortWithComparator","comparator","setResponsiveOptions","breakpoints","width","innerWidth","breakpoint","parseInt","assign","enableKeyboardNavigation","activeElement","slice","click","exportState","importState","state","savePreset","presetName","preset","localStorage","setItem","JSON","stringify","loadPreset","parse","getItem","setLogic","logic","setFilterMode","addFilter","removeFilter","getActiveFiltersByType"],"mappings":"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"}
package/dist/AFS.min.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).AFS={})}(this,(function(t){"use strict";t.AFS=class{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options={containerSelector:".filter-container",itemSelector:".filter-item",filterButtonSelector:".btn-filter",searchInputSelector:".filter-search",counterSelector:".filter-counter",activeClass:"active",hiddenClass:"hidden",animationDuration:300,filterMode:"OR",searchKeys:["title"],debounceTime:300,...t},this.container=document.querySelector(this.options.containerSelector),this.items=document.querySelectorAll(this.options.itemSelector),this.filterButtons=document.querySelectorAll(this.options.filterButtonSelector),this.searchInput=document.querySelector(this.options.searchInputSelector),this.counter=document.querySelector(this.options.counterSelector),this.currentFilters=new Set(["*"]),this.currentSearch="",this.visibleItems=new Set(this.items),this.init()}init(){this.addStyles(),this.bindEvents(),this.loadFromURL(),this.updateCounter()}addStyles(){const t=`\n .${this.options.hiddenClass} {\n display: none !important;\n }\n\n ${this.options.itemSelector} {\n opacity: 1;\n transform: scale(1);\n transition: opacity ${this.options.animationDuration}ms ease-out,\n transform ${this.options.animationDuration}ms ease-out;\n }\n\n ${this.options.filterButtonSelector} {\n opacity: 0.5;\n transition: opacity ${this.options.animationDuration}ms ease;\n }\n\n ${this.options.filterButtonSelector}.${this.options.activeClass} {\n opacity: 1;\n }\n `,e=document.createElement("style");e.textContent=t,document.head.appendChild(e)}bindEvents(){this.filterButtons.forEach((t=>{t.addEventListener("click",(()=>this.handleFilterClick(t)))})),this.searchInput&&this.searchInput.addEventListener("input",function(t,e){let s;return function(){for(var i=arguments.length,r=new Array(i),o=0;o<i;o++)r[o]=arguments[o];clearTimeout(s),s=setTimeout((()=>{clearTimeout(s),t(...r)}),e)}}((t=>{this.search(t.target.value)}),this.options.debounceTime)),window.addEventListener("popstate",(()=>this.loadFromURL()))}handleFilterClick(t){const e=t.dataset.filter;"*"===e?this.resetFilters():this.toggleFilter(e,t),this.filter(),this.updateURL()}resetFilters(){this.filterButtons.forEach((t=>t.classList.remove(this.options.activeClass))),this.currentFilters.clear(),this.currentFilters.add("*"),this.filterButtons[0].classList.add(this.options.activeClass),this.resetCounter()}resetCounter(){this.visibleItems=new Set(this.items),this.updateCounter()}toggleFilter(t,e){this.currentFilters.delete("*"),this.filterButtons[0].classList.remove(this.options.activeClass),e.classList.contains(this.options.activeClass)?(e.classList.remove(this.options.activeClass),this.currentFilters.delete(t),0===this.currentFilters.size&&this.resetFilters()):(e.classList.add(this.options.activeClass),this.currentFilters.add(t))}filter(){this.visibleItems.clear(),this.items.forEach((t=>{if(this.currentFilters.has("*"))this.showItem(t),this.visibleItems.add(t);else{const e=new Set(t.dataset.categories?.split(" ")||[]);("OR"===this.options.filterMode?this.matchesAnyFilter(e):this.matchesAllFilters(e))?(this.showItem(t),this.visibleItems.add(t)):this.hideItem(t)}})),setTimeout((()=>{this.updateCounter()}),this.options.animationDuration)}matchesAnyFilter(t){return[...this.currentFilters].some((e=>{const[s,i]=e.split(":");return t.has(`${s}:${i}`)}))}matchesAllFilters(t){return[...this.currentFilters].every((e=>{const[s,i]=e.split(":");return t.has(`${s}:${i}`)}))}showItem(t){this.visibleItems.add(t),t.classList.remove(this.options.hiddenClass),t.style.opacity="0",t.style.transform="scale(0.95)",t.offsetHeight,requestAnimationFrame((()=>{t.style.opacity="1",t.style.transform="scale(1)"}))}hideItem(t){t.style.opacity="0",t.style.transform="scale(0.95)",setTimeout((()=>{"0"===t.style.opacity&&(t.classList.add(this.options.hiddenClass),this.visibleItems.delete(t))}),this.options.animationDuration)}search(t){this.currentSearch=t.toLowerCase().trim(),this.items.forEach((t=>{const e=this.options.searchKeys.map((e=>t.dataset[e]||"")).join(" ").toLowerCase();""===this.currentSearch||e.includes(this.currentSearch)?this.showItem(t):this.hideItem(t)})),this.updateURL(),setTimeout((()=>{this.updateCounter()}),this.options.animationDuration)}sortMultiple(t){const e=[...this.items];e.sort(((e,s)=>{for(const i of t){const t=e.dataset[i.key],r=s.dataset[i.key],o="asc"===i.direction?t.localeCompare(r):r.localeCompare(t);if(0!==o)return o}return 0})),e.forEach((t=>this.container.appendChild(t)))}addRangeFilter(t,e,s){this.items.forEach((i=>{const r=parseFloat(i.dataset[t]);r>=e&&r<=s?this.showItem(i):this.hideItem(i)})),setTimeout((()=>{this.updateCounter()}),this.options.animationDuration)}updateURL(){const t=new URLSearchParams,e={};for(const t of this.currentFilters)if("*"!==t){const[s,i]=t.split(":");e[s]||(e[s]=new Set),e[s].add(i)}Object.entries(e).forEach((e=>{let[s,i]=e;t.set(s,Array.from(i).join(","))})),this.currentSearch&&t.set("search",this.currentSearch);const s=`${window.location.pathname}${t.toString()?"?"+t.toString():""}`;window.history.pushState({},"",s)}loadFromURL(){const t=new URLSearchParams(window.location.search);this.currentFilters.clear();let e=!1;for(const[s,i]of t.entries())"search"!==s&&(e=!0,i.split(",").forEach((t=>{this.currentFilters.add(`${s}:${t}`)})));e||this.currentFilters.add("*"),this.filterButtons.forEach((t=>{const e=t.dataset.filter;this.currentFilters.has(e)||"*"===e&&this.currentFilters.has("*")?t.classList.add(this.options.activeClass):t.classList.remove(this.options.activeClass)}));const s=t.get("search")||"";this.searchInput&&(this.searchInput.value=s),this.filter(),s&&this.search(s)}updateCounter(){const t=this.items.length,e=this.visibleItems.size;return this.counter&&(this.counter.textContent=`Showing ${e} of ${t}`),{total:t,visible:e}}setLogic(t){if("boolean"==typeof t)return this.options.filterMode=t?"AND":"OR",void this.filter();const e=t.toUpperCase();["OR","AND"].includes(e)&&(this.options.filterMode=e,this.filter())}setFilterMode(t){["OR","AND"].includes(t.toUpperCase())&&(this.options.filterMode=t.toUpperCase(),this.filter())}addFilter(t,e){this.currentFilters.add(`${t}:${e}`),this.filter(),this.updateURL()}removeFilter(t,e){this.currentFilters.delete(`${t}:${e}`),0===this.currentFilters.size&&this.currentFilters.add("*"),this.filter(),this.updateURL()}getActiveFiltersByType(t){return[...this.currentFilters].filter((e=>e.startsWith(`${t}:`))).map((t=>t.split(":")[1]))}}}));
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).AFS={})}(this,(function(t){"use strict";function e(t,e){let s;return function(){for(var i=arguments.length,r=new Array(i),o=0;o<i;o++)r[o]=arguments[o];clearTimeout(s),s=setTimeout((()=>{clearTimeout(s),t(...r)}),e)}}t.AFS=class{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options={containerSelector:".filter-container",itemSelector:".filter-item",filterButtonSelector:".btn-filter",searchInputSelector:".filter-search",counterSelector:".filter-counter",activeClass:"active",hiddenClass:"hidden",animationDuration:300,filterMode:"OR",searchKeys:["title"],debounceTime:300,...t},this.container=document.querySelector(this.options.containerSelector),this.items=document.querySelectorAll(this.options.itemSelector),this.filterButtons=document.querySelectorAll(this.options.filterButtonSelector),this.searchInput=document.querySelector(this.options.searchInputSelector),this.counter=document.querySelector(this.options.counterSelector),this.currentFilters=new Set(["*"]),this.currentSearch="",this.visibleItems=new Set(this.items),this.filterGroups=new Map,this.groupMode="OR",this.init()}init(){this.addStyles(),this.bindEvents(),this.loadFromURL(),this.updateCounter()}addStyles(){const t=`\n .${this.options.hiddenClass} {\n display: none !important;\n }\n\n ${this.options.itemSelector} {\n opacity: 1;\n transform: scale(1);\n transition: opacity ${this.options.animationDuration}ms ease-out,\n transform ${this.options.animationDuration}ms ease-out;\n }\n\n ${this.options.filterButtonSelector} {\n opacity: 0.5;\n transition: opacity ${this.options.animationDuration}ms ease;\n }\n\n ${this.options.filterButtonSelector}.${this.options.activeClass} {\n opacity: 1;\n }\n `,e=document.createElement("style");e.textContent=t,document.head.appendChild(e)}bindEvents(){this.filterButtons.forEach((t=>{t.addEventListener("click",(()=>this.handleFilterClick(t)))})),this.searchInput&&this.searchInput.addEventListener("input",e((t=>{this.search(t.target.value)}),this.options.debounceTime)),window.addEventListener("popstate",(()=>this.loadFromURL()))}handleFilterClick(t){const e=t.dataset.filter;"*"===e?this.resetFilters():this.toggleFilter(e,t),this.filter(),this.updateURL()}resetFilters(){this.filterButtons.forEach((t=>t.classList.remove(this.options.activeClass))),this.currentFilters.clear(),this.currentFilters.add("*"),this.filterButtons[0].classList.add(this.options.activeClass),this.resetCounter()}resetCounter(){this.visibleItems=new Set(this.items),this.updateCounter()}toggleFilter(t,e){this.currentFilters.delete("*"),this.filterButtons[0].classList.remove(this.options.activeClass),e.classList.contains(this.options.activeClass)?(e.classList.remove(this.options.activeClass),this.currentFilters.delete(t),0===this.currentFilters.size&&this.resetFilters()):(e.classList.add(this.options.activeClass),this.currentFilters.add(t))}filter(){const t=()=>{this.visibleItems.clear(),this.items.forEach((t=>{if(this.currentFilters.has("*"))this.showItem(t),this.visibleItems.add(t);else{const e=new Set(t.dataset.categories?.split(" ")||[]);("OR"===this.options.filterMode?this.matchesAnyFilter(e):this.matchesAllFilters(e))?(this.showItem(t),this.visibleItems.add(t)):this.hideItem(t)}}))};0===this.filterGroups.size?t():(this.visibleItems.clear(),this.items.forEach((t=>{if(this.currentFilters.has("*"))this.showItem(t),this.visibleItems.add(t);else{const e=new Set(t.dataset.categories?.split(" ")||[]);this.matchesFilterGroups(e)?(this.showItem(t),this.visibleItems.add(t)):this.hideItem(t)}}))),setTimeout((()=>{this.updateCounter()}),this.options.animationDuration)}addFilterGroup(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"OR";try{if(!t||!Array.isArray(e))return console.warn("Invalid group parameters"),!1;const i=s.toUpperCase();return["AND","OR"].includes(i)||(console.warn('Invalid operator. Using default "OR"'),s="OR"),this.filterGroups.set(t,{filters:new Set(e),operator:i}),this.filterGroups.size>0&&(this.updateFiltersFromGroups(),this.filter(),this.updateURL()),!0}catch(t){return console.error("Error adding filter group:",t),!1}}setGroupMode(t){const e=t.toUpperCase();["AND","OR"].includes(e)&&(this.groupMode=e,this.filterGroups.size>0&&this.filter())}removeFilterGroup(t){return!!this.filterGroups.has(t)&&(this.filterGroups.delete(t),0===this.filterGroups.size?this.resetFilters():this.updateFiltersFromGroups(),this.filter(),this.updateURL(),!0)}updateFiltersFromGroups(){if(0!==this.filterGroups.size){this.currentFilters.has("*")||this.currentFilters.clear();for(const t of this.filterGroups.values())t.filters.forEach((t=>{"*"!==t&&this.currentFilters.add(t)}))}}matchesAnyFilter(t){return[...this.currentFilters].some((e=>{const[s,i]=e.split(":");return t.has(`${s}:${i}`)}))}matchesAllFilters(t){return[...this.currentFilters].every((e=>{const[s,i]=e.split(":");return t.has(`${s}:${i}`)}))}showItem(t){this.visibleItems.add(t),t.classList.remove(this.options.hiddenClass),t.style.opacity="0",t.style.transform="scale(0.95)",t.offsetHeight,requestAnimationFrame((()=>{t.style.opacity="1",t.style.transform="scale(1)"}))}hideItem(t){t.style.opacity="0",t.style.transform="scale(0.95)",setTimeout((()=>{"0"===t.style.opacity&&(t.classList.add(this.options.hiddenClass),this.visibleItems.delete(t))}),this.options.animationDuration)}search(t){this.currentSearch=t.toLowerCase().trim(),this.items.forEach((t=>{const e=this.options.searchKeys.map((e=>t.dataset[e]||"")).join(" ").toLowerCase();""===this.currentSearch||e.includes(this.currentSearch)?this.showItem(t):this.hideItem(t)})),this.updateURL(),setTimeout((()=>{this.updateCounter()}),this.options.animationDuration)}sortMultiple(t){const e=[...this.items];e.sort(((e,s)=>{for(const i of t){const t=e.dataset[i.key],r=s.dataset[i.key],o="asc"===i.direction?t.localeCompare(r):r.localeCompare(t);if(0!==o)return o}return 0})),e.forEach((t=>this.container.appendChild(t)))}addRangeFilter(t,e,s){this.items.forEach((i=>{const r=parseFloat(i.dataset[t]);r>=e&&r<=s?this.showItem(i):this.hideItem(i)})),setTimeout((()=>{this.updateCounter()}),this.options.animationDuration)}matchesFilterGroups(t){const e=[...this.filterGroups.values()].map((e=>{const s=[...e.filters];return 0===s.length||("OR"===e.operator?s.some((e=>t.has(e))):s.every((e=>t.has(e))))}));return"OR"===this.groupMode?e.some((t=>t)):e.every((t=>t))}updateURL(){const t=new URLSearchParams(window.location.search);if(this.filterGroups.size>0){for(const[e,s]of this.filterGroups.entries())t.set(`group_${e}`,[...s.filters].join(",")),t.set(`groupOp_${e}`,s.operator.toLowerCase());t.set("groupMode",this.groupMode.toLowerCase())}const e={};for(const t of this.currentFilters)if("*"!==t){const[s,i]=t.split(":");e[s]||(e[s]=new Set),e[s].add(i)}Object.entries(e).forEach((e=>{let[s,i]=e;t.set(s,Array.from(i).join(","))})),this.currentSearch&&t.set("search",this.currentSearch);const s=`${window.location.pathname}${t.toString()?"?"+t.toString():""}`;window.history.pushState({},"",s)}loadFromURL(){const t=new URLSearchParams(window.location.search);this.filterGroups.clear();for(const[e,s]of t.entries())if(e.startsWith("group_")){const i=e.replace("group_",""),r=t.get(`groupOp_${i}`)?.toUpperCase()||"OR",o=s.split(",");this.addFilterGroup(i,o,r)}const e=t.get("groupMode")?.toUpperCase();e&&["AND","OR"].includes(e)&&(this.groupMode=e),this.currentFilters.clear();let s=!1;for(const[e,i]of t.entries())"search"!==e&&(s=!0,i.split(",").forEach((t=>{this.currentFilters.add(`${e}:${t}`)})));s||this.currentFilters.add("*"),this.filterButtons.forEach((t=>{const e=t.dataset.filter;this.currentFilters.has(e)||"*"===e&&this.currentFilters.has("*")?t.classList.add(this.options.activeClass):t.classList.remove(this.options.activeClass)}));const i=t.get("search")||"";this.searchInput&&(this.searchInput.value=i),this.filter(),i&&this.search(i)}updateCounter(){const t=this.items.length,e=this.visibleItems.size;return this.counter&&(this.counter.textContent=`Showing ${e} of ${t}`),{total:t,visible:e}}setAnimationOptions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options.animationDuration=t.duration||this.options.animationDuration,this.options.animationType=t.type||"ease-out",this.addStyles()}addEventSystem(){this.events={},this.on=(t,e)=>{this.events[t]||(this.events[t]=[]),this.events[t].push(e)},this.emit=(t,e)=>{this.events[t]&&this.events[t].forEach((t=>t(e)))}}setPagination(t){this.pagination={currentPage:1,itemsPerPage:t,totalPages:Math.ceil(this.visibleItems.size/t)},this.updatePagination()}updatePagination(){const t=(this.pagination.currentPage-1)*this.pagination.itemsPerPage,e=t+this.pagination.itemsPerPage;[...this.visibleItems].forEach(((s,i)=>{i>=t&&i<e?this.showItem(s):this.hideItem(s)}))}enableAnalytics(t){this.analyticsCallback=t,this.on("filter",(t=>{this.analyticsCallback({type:"filter",filters:[...this.currentFilters],visibleItems:this.visibleItems.size,timestamp:(new Date).toISOString()})}))}sortWithComparator(t,e){const s=[...this.items];s.sort(((s,i)=>{const r=s.dataset[t],o=i.dataset[t];return e(r,o)})),s.forEach((t=>this.container.appendChild(t)))}setResponsiveOptions(t){window.addEventListener("resize",e((()=>{const e=window.innerWidth;for(const[s,i]of Object.entries(t))if(e<=parseInt(s)){Object.assign(this.options,i),this.filter();break}}),250))}enableKeyboardNavigation(){document.addEventListener("keydown",(t=>{"Enter"===t.key&&document.activeElement.classList.contains(this.options.filterButtonSelector.slice(1))&&document.activeElement.click()}))}exportState(){return{filters:[...this.currentFilters],search:this.currentSearch,mode:this.options.filterMode,timestamp:(new Date).toISOString()}}importState(t){t.filters&&(this.currentFilters=new Set(t.filters),this.currentSearch=t.search||"",this.options.filterMode=t.mode||"OR",this.filter(),this.updateURL())}savePreset(t){const e={filters:[...this.currentFilters],search:this.currentSearch,mode:this.options.filterMode};localStorage.setItem(`afs_preset_${t}`,JSON.stringify(e))}loadPreset(t){const e=JSON.parse(localStorage.getItem(`afs_preset_${t}`));e&&(this.currentFilters=new Set(e.filters),this.currentSearch=e.search,this.options.filterMode=e.mode,this.filter(),this.updateURL())}setLogic(t){if("boolean"==typeof t)return this.options.filterMode=t?"AND":"OR",void this.filter();const e=t.toUpperCase();["OR","AND"].includes(e)&&(this.options.filterMode=e,this.filter())}setFilterMode(t){["OR","AND"].includes(t.toUpperCase())&&(this.options.filterMode=t.toUpperCase(),this.filter())}addFilter(t,e){this.currentFilters.add(`${t}:${e}`),this.filter(),this.updateURL()}removeFilter(t,e){this.currentFilters.delete(`${t}:${e}`),0===this.currentFilters.size&&this.currentFilters.add("*"),this.filter(),this.updateURL()}getActiveFiltersByType(t){return[...this.currentFilters].filter((e=>e.startsWith(`${t}:`))).map((t=>t.split(":")[1]))}}}));
2
2
  //# sourceMappingURL=AFS.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AFS.min.js","sources":["../src/AFS.js"],"sourcesContent":["/**\n * @fileoverview Advanced Filter System for DOM elements\n * @version 1.0.0\n *\n * A flexible and customizable filtering system that supports:\n * - Multiple filtering modes (OR/AND)\n * - Text search with debouncing\n * - Multiple sorting criteria\n * - Range filtering\n * - URL state management\n * - Animation and transitions\n * - Results counter\n */\n\n/**\n * Utility function for debouncing\n * @param {Function} func - Function to debounce\n * @param {number} wait - Delay in milliseconds\n * @returns {Function} Debounced function\n */\nfunction debounce(func, wait) {\n let timeout;\n return function executedFunction(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n}\n\nclass AFS {\n /**\n * @typedef {Object} FilterOptions\n * @property {string} containerSelector - Main container selector\n * @property {string} itemSelector - Items to filter selector\n * @property {string} filterButtonSelector - Filter buttons selector\n * @property {string} [searchInputSelector] - Search input selector\n * @property {string} [counterSelector] - Results counter selector\n * @property {string} [activeClass='active'] - Active state class\n * @property {string} [hiddenClass='hidden'] - Hidden state class\n * @property {number} [animationDuration=300] - Animation duration in ms\n * @property {string} [filterMode='OR'] - Filter mode ('OR' or 'AND')\n * @property {string[]} [searchKeys=['title']] - Data attributes to search in\n * @property {number} [debounceTime=300] - Search debounce delay in ms\n */\n\n /**\n * @param {FilterOptions} options - Filter configuration options\n */\n constructor(options = {}) {\n this.options = {\n containerSelector: \".filter-container\",\n itemSelector: \".filter-item\",\n filterButtonSelector: \".btn-filter\",\n searchInputSelector: \".filter-search\",\n counterSelector: \".filter-counter\",\n activeClass: \"active\",\n hiddenClass: \"hidden\",\n animationDuration: 300,\n filterMode: \"OR\",\n searchKeys: [\"title\"],\n debounceTime: 300,\n ...options,\n };\n\n // Initialize elements\n this.container = document.querySelector(this.options.containerSelector);\n this.items = document.querySelectorAll(this.options.itemSelector);\n this.filterButtons = document.querySelectorAll(\n this.options.filterButtonSelector,\n );\n this.searchInput = document.querySelector(\n this.options.searchInputSelector,\n );\n this.counter = document.querySelector(this.options.counterSelector);\n\n // Initialize state\n this.currentFilters = new Set([\"*\"]);\n this.currentSearch = \"\";\n this.visibleItems = new Set(this.items);\n\n this.init();\n }\n\n /**\n * Initialize the filter system\n * @private\n */\n init() {\n this.addStyles();\n this.bindEvents();\n this.loadFromURL();\n this.updateCounter();\n }\n\n /**\n * Add required styles to document\n * @private\n */\n addStyles() {\n const styles = `\n .${this.options.hiddenClass} {\n display: none !important;\n }\n\n ${this.options.itemSelector} {\n opacity: 1;\n transform: scale(1);\n transition: opacity ${this.options.animationDuration}ms ease-out,\n transform ${this.options.animationDuration}ms ease-out;\n }\n\n ${this.options.filterButtonSelector} {\n opacity: 0.5;\n transition: opacity ${this.options.animationDuration}ms ease;\n }\n\n ${this.options.filterButtonSelector}.${this.options.activeClass} {\n opacity: 1;\n }\n `;\n\n const styleSheet = document.createElement(\"style\");\n styleSheet.textContent = styles;\n document.head.appendChild(styleSheet);\n }\n\n /**\n * Bind all event listeners\n * @private\n */\n bindEvents() {\n this.filterButtons.forEach((button) => {\n button.addEventListener(\"click\", () =>\n this.handleFilterClick(button),\n );\n });\n\n if (this.searchInput) {\n this.searchInput.addEventListener(\n \"input\",\n debounce((e) => {\n this.search(e.target.value);\n }, this.options.debounceTime),\n );\n }\n\n window.addEventListener(\"popstate\", () => this.loadFromURL());\n }\n\n /**\n * Handle filter button clicks\n * @private\n * @param {HTMLElement} button - Clicked filter button\n */\n handleFilterClick(button) {\n const filterValue = button.dataset.filter;\n\n if (filterValue === \"*\") {\n this.resetFilters();\n } else {\n this.toggleFilter(filterValue, button);\n }\n\n this.filter();\n this.updateURL();\n }\n\n /**\n * Reset all filters to default state\n * @private\n */\n resetFilters() {\n this.filterButtons.forEach((btn) =>\n btn.classList.remove(this.options.activeClass),\n );\n this.currentFilters.clear();\n this.currentFilters.add(\"*\");\n this.filterButtons[0].classList.add(this.options.activeClass);\n this.resetCounter();\n }\n\n /**\n * Reset visible items counter\n * @private\n */\n resetCounter() {\n this.visibleItems = new Set(this.items);\n this.updateCounter();\n }\n\n /**\n * Toggle individual filter state\n * @private\n * @param {string} filterValue - Filter value to toggle\n * @param {HTMLElement} button - Filter button element\n */\n toggleFilter(filterValue, button) {\n this.currentFilters.delete(\"*\");\n this.filterButtons[0].classList.remove(this.options.activeClass);\n\n if (button.classList.contains(this.options.activeClass)) {\n button.classList.remove(this.options.activeClass);\n this.currentFilters.delete(filterValue);\n\n if (this.currentFilters.size === 0) {\n this.resetFilters();\n }\n } else {\n button.classList.add(this.options.activeClass);\n this.currentFilters.add(filterValue);\n }\n }\n\n /**\n * Apply current filters to items\n * @public\n */\n filter() {\n this.visibleItems.clear(); // Start with an empty set\n\n this.items.forEach((item) => {\n if (this.currentFilters.has(\"*\")) {\n this.showItem(item);\n this.visibleItems.add(item); // Add visible item to the set\n } else {\n const itemCategories = new Set(\n item.dataset.categories?.split(\" \") || [],\n );\n const matchesFilter =\n this.options.filterMode === \"OR\"\n ? this.matchesAnyFilter(itemCategories)\n : this.matchesAllFilters(itemCategories);\n\n if (matchesFilter) {\n this.showItem(item);\n this.visibleItems.add(item); // Add visible item to the set\n } else {\n this.hideItem(item);\n }\n }\n });\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n }\n\n /**\n * Check if item matches any active filter (OR mode)\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches any filter\n */\n matchesAnyFilter(itemCategories) {\n return [...this.currentFilters].some((filter) => {\n const [type, value] = filter.split(\":\");\n return itemCategories.has(`${type}:${value}`);\n });\n }\n\n /**\n * Check if item matches all active filters (AND mode)\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches all filters\n */\n matchesAllFilters(itemCategories) {\n return [...this.currentFilters].every((filter) => {\n const [type, value] = filter.split(\":\");\n return itemCategories.has(`${type}:${value}`);\n });\n }\n\n /**\n * Show an item with animation\n * @private\n * @param {HTMLElement} item - Item to show\n */\n showItem(item) {\n this.visibleItems.add(item);\n item.classList.remove(this.options.hiddenClass);\n item.style.opacity = \"0\";\n item.style.transform = \"scale(0.95)\";\n\n item.offsetHeight;\n\n requestAnimationFrame(() => {\n item.style.opacity = \"1\";\n item.style.transform = \"scale(1)\";\n });\n }\n\n /**\n * Hide an item with animation\n * @private\n * @param {HTMLElement} item - Item to hide\n */\n hideItem(item) {\n item.style.opacity = \"0\";\n item.style.transform = \"scale(0.95)\";\n\n setTimeout(() => {\n if (item.style.opacity === \"0\") {\n item.classList.add(this.options.hiddenClass);\n this.visibleItems.delete(item);\n }\n }, this.options.animationDuration);\n }\n\n /**\n * Search items by text\n * @public\n * @param {string} query - Search query\n */\n search(query) {\n this.currentSearch = query.toLowerCase().trim();\n let matches = 0;\n\n this.items.forEach((item) => {\n const searchText = this.options.searchKeys\n .map((key) => item.dataset[key] || \"\")\n .join(\" \")\n .toLowerCase();\n\n const matchesSearch =\n this.currentSearch === \"\" ||\n searchText.includes(this.currentSearch);\n\n if (matchesSearch) {\n this.showItem(item);\n matches++;\n } else {\n this.hideItem(item);\n }\n });\n\n this.updateURL();\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n }\n\n /**\n * Sort items by multiple criteria\n * @public\n * @param {Array<{key: string, direction: string}>} criteria - Sort criteria\n */\n sortMultiple(criteria) {\n const items = [...this.items];\n\n items.sort((a, b) => {\n for (const criterion of criteria) {\n const valueA = a.dataset[criterion.key];\n const valueB = b.dataset[criterion.key];\n\n const comparison =\n criterion.direction === \"asc\"\n ? valueA.localeCompare(valueB)\n : valueB.localeCompare(valueA);\n\n if (comparison !== 0) return comparison;\n }\n return 0;\n });\n\n items.forEach((item) => this.container.appendChild(item));\n }\n\n /**\n * Filter items by numeric range\n * @public\n * @param {string} key - Data attribute key\n * @param {number} min - Minimum value\n * @param {number} max - Maximum value\n */\n addRangeFilter(key, min, max) {\n this.items.forEach((item) => {\n const value = parseFloat(item.dataset[key]);\n const inRange = value >= min && value <= max;\n\n if (inRange) {\n this.showItem(item);\n } else {\n this.hideItem(item);\n }\n });\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n }\n\n /**\n * Update URL with current filter state\n * @private\n */\n updateURL() {\n const params = new URLSearchParams();\n\n // Séparer les filtres par type\n const filtersByType = {};\n for (const filter of this.currentFilters) {\n if (filter !== \"*\") {\n const [type, value] = filter.split(\":\");\n if (!filtersByType[type]) {\n filtersByType[type] = new Set();\n }\n filtersByType[type].add(value);\n }\n }\n\n // Ajouter chaque type de filtre à l'URL\n Object.entries(filtersByType).forEach(([type, values]) => {\n params.set(type, Array.from(values).join(\",\"));\n });\n\n if (this.currentSearch) {\n params.set(\"search\", this.currentSearch);\n }\n\n const newURL = `${window.location.pathname}${\n params.toString() ? \"?\" + params.toString() : \"\"\n }`;\n window.history.pushState({}, \"\", newURL);\n }\n\n /**\n * Load filter state from URL\n * @private\n */\n loadFromURL() {\n const params = new URLSearchParams(window.location.search);\n this.currentFilters.clear();\n\n // Si aucun filtre n'est présent, utiliser '*'\n let hasFilters = false;\n\n // Parcourir tous les paramètres\n for (const [type, values] of params.entries()) {\n if (type !== \"search\") {\n hasFilters = true;\n values.split(\",\").forEach((value) => {\n this.currentFilters.add(`${type}:${value}`);\n });\n }\n }\n\n if (!hasFilters) {\n this.currentFilters.add(\"*\");\n }\n\n // Update active buttons\n this.filterButtons.forEach((button) => {\n const filterValue = button.dataset.filter;\n if (\n this.currentFilters.has(filterValue) ||\n (filterValue === \"*\" && this.currentFilters.has(\"*\"))\n ) {\n button.classList.add(this.options.activeClass);\n } else {\n button.classList.remove(this.options.activeClass);\n }\n });\n\n // Load search\n const search = params.get(\"search\") || \"\";\n if (this.searchInput) {\n this.searchInput.value = search;\n }\n\n this.filter();\n if (search) {\n this.search(search);\n }\n }\n\n /**\n * Update results counter\n * @private\n * @returns {{total: number, visible: number}}\n */\n updateCounter() {\n const total = this.items.length;\n const visible = this.visibleItems.size;\n\n if (this.counter) {\n this.counter.textContent = `Showing ${visible} of ${total}`;\n }\n\n return { total, visible };\n }\n\n /**\n * Set filter logic mode (alias for setFilterMode)\n * @public\n * @param {string} logic - New filter logic ('AND' or 'OR')\n */\n setLogic(logic) {\n if (typeof logic === 'boolean') {\n // Handle boolean input (true = AND, false = OR)\n this.options.filterMode = logic ? 'AND' : 'OR';\n this.filter();\n return;\n }\n\n const mode = logic.toUpperCase();\n if (['OR', 'AND'].includes(mode)) {\n this.options.filterMode = mode;\n this.filter();\n }\n }\n\n\n /**\n * Change filter mode\n * @public\n * @param {string} mode - New filter mode ('OR' or 'AND')\n */\n setFilterMode(mode) {\n if ([\"OR\", \"AND\"].includes(mode.toUpperCase())) {\n this.options.filterMode = mode.toUpperCase();\n this.filter();\n }\n }\n\n /**\n * Add filter by type and value\n * @public\n * @param {string} type - Filter type\n * @param {string} value - Filter value\n */\n addFilter(type, value) {\n this.currentFilters.add(`${type}:${value}`);\n this.filter();\n this.updateURL();\n }\n\n /**\n * Remove filter by type and value\n * @public\n * @param {string} type - Filter type\n */\n removeFilter(type, value) {\n this.currentFilters.delete(`${type}:${value}`);\n if (this.currentFilters.size === 0) {\n this.currentFilters.add(\"*\");\n }\n this.filter();\n this.updateURL();\n }\n\n /**\n * Get active filters by type\n * @public\n * @param {string} type - Filter type\n */\n getActiveFiltersByType(type) {\n return [...this.currentFilters]\n .filter((filter) => filter.startsWith(`${type}:`))\n .map((filter) => filter.split(\":\")[1]);\n }\n}\n\nexport { AFS };\n"],"names":["constructor","options","arguments","length","undefined","this","containerSelector","itemSelector","filterButtonSelector","searchInputSelector","counterSelector","activeClass","hiddenClass","animationDuration","filterMode","searchKeys","debounceTime","container","document","querySelector","items","querySelectorAll","filterButtons","searchInput","counter","currentFilters","Set","currentSearch","visibleItems","init","addStyles","bindEvents","loadFromURL","updateCounter","styles","styleSheet","createElement","textContent","head","appendChild","forEach","button","addEventListener","handleFilterClick","func","wait","timeout","_len","args","Array","_key","clearTimeout","setTimeout","later","debounce","e","search","target","value","window","filterValue","dataset","filter","resetFilters","toggleFilter","updateURL","btn","classList","remove","clear","add","resetCounter","delete","contains","size","item","has","showItem","itemCategories","categories","split","matchesAnyFilter","matchesAllFilters","hideItem","some","type","every","style","opacity","transform","offsetHeight","requestAnimationFrame","query","toLowerCase","trim","searchText","map","key","join","includes","sortMultiple","criteria","sort","a","b","criterion","valueA","valueB","comparison","direction","localeCompare","addRangeFilter","min","max","parseFloat","params","URLSearchParams","filtersByType","Object","entries","_ref","values","set","from","newURL","location","pathname","toString","history","pushState","hasFilters","get","total","visible","setLogic","logic","mode","toUpperCase","setFilterMode","addFilter","removeFilter","getActiveFiltersByType","startsWith"],"mappings":"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"}
1
+ {"version":3,"file":"AFS.min.js","sources":["../src/AFS.js"],"sourcesContent":["/**\n * @fileoverview Advanced Filter System for DOM elements\n * @version 1.0.0\n *\n * A flexible and customizable filtering system that supports:\n * - Multiple filtering modes (OR/AND)\n * - Text search with debouncing\n * - Multiple sorting criteria\n * - Range filtering\n * - URL state management\n * - Animation and transitions\n * - Results counter\n */\n\n/**\n * Utility function for debouncing\n * @param {Function} func - Function to debounce\n * @param {number} wait - Delay in milliseconds\n * @returns {Function} Debounced function\n */\nfunction debounce(func, wait) {\n let timeout;\n return function executedFunction(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n}\n\nclass AFS {\n /**\n * @typedef {Object} FilterOptions\n * @property {string} containerSelector - Main container selector\n * @property {string} itemSelector - Items to filter selector\n * @property {string} filterButtonSelector - Filter buttons selector\n * @property {string} [searchInputSelector] - Search input selector\n * @property {string} [counterSelector] - Results counter selector\n * @property {string} [activeClass='active'] - Active state class\n * @property {string} [hiddenClass='hidden'] - Hidden state class\n * @property {number} [animationDuration=300] - Animation duration in ms\n * @property {string} [filterMode='OR'] - Filter mode ('OR' or 'AND')\n * @property {string[]} [searchKeys=['title']] - Data attributes to search in\n * @property {number} [debounceTime=300] - Search debounce delay in ms\n */\n\n /**\n * @param {FilterOptions} options - Filter configuration options\n */\n constructor(options = {}) {\n this.options = {\n containerSelector: \".filter-container\",\n itemSelector: \".filter-item\",\n filterButtonSelector: \".btn-filter\",\n searchInputSelector: \".filter-search\",\n counterSelector: \".filter-counter\",\n activeClass: \"active\",\n hiddenClass: \"hidden\",\n animationDuration: 300,\n filterMode: \"OR\",\n searchKeys: [\"title\"],\n debounceTime: 300,\n ...options,\n };\n\n // Initialize elements\n this.container = document.querySelector(this.options.containerSelector);\n this.items = document.querySelectorAll(this.options.itemSelector);\n this.filterButtons = document.querySelectorAll(\n this.options.filterButtonSelector,\n );\n this.searchInput = document.querySelector(this.options.searchInputSelector);\n this.counter = document.querySelector(this.options.counterSelector);\n\n // Initialize state\n this.currentFilters = new Set([\"*\"]);\n this.currentSearch = \"\";\n this.visibleItems = new Set(this.items);\n this.filterGroups = new Map();\n this.groupMode = \"OR\"; // Default group mode\n\n this.init();\n }\n\n /**\n * Initialize the filter system\n * @private\n */\n init() {\n this.addStyles();\n this.bindEvents();\n this.loadFromURL();\n this.updateCounter();\n }\n\n /**\n * Add required styles to document\n * @private\n */\n addStyles() {\n const styles = `\n .${this.options.hiddenClass} {\n display: none !important;\n }\n\n ${this.options.itemSelector} {\n opacity: 1;\n transform: scale(1);\n transition: opacity ${this.options.animationDuration}ms ease-out,\n transform ${this.options.animationDuration}ms ease-out;\n }\n\n ${this.options.filterButtonSelector} {\n opacity: 0.5;\n transition: opacity ${this.options.animationDuration}ms ease;\n }\n\n ${this.options.filterButtonSelector}.${this.options.activeClass} {\n opacity: 1;\n }\n `;\n\n const styleSheet = document.createElement(\"style\");\n styleSheet.textContent = styles;\n document.head.appendChild(styleSheet);\n }\n\n /**\n * Bind all event listeners\n * @private\n */\n bindEvents() {\n this.filterButtons.forEach((button) => {\n button.addEventListener(\"click\", () => this.handleFilterClick(button));\n });\n\n if (this.searchInput) {\n this.searchInput.addEventListener(\n \"input\",\n debounce((e) => {\n this.search(e.target.value);\n }, this.options.debounceTime),\n );\n }\n\n window.addEventListener(\"popstate\", () => this.loadFromURL());\n }\n\n /**\n * Handle filter button clicks\n * @private\n * @param {HTMLElement} button - Clicked filter button\n */\n handleFilterClick(button) {\n const filterValue = button.dataset.filter;\n\n if (filterValue === \"*\") {\n this.resetFilters();\n } else {\n this.toggleFilter(filterValue, button);\n }\n\n this.filter();\n this.updateURL();\n }\n\n /**\n * Reset all filters to default state\n * @private\n */\n resetFilters() {\n this.filterButtons.forEach((btn) =>\n btn.classList.remove(this.options.activeClass),\n );\n this.currentFilters.clear();\n this.currentFilters.add(\"*\");\n this.filterButtons[0].classList.add(this.options.activeClass);\n this.resetCounter();\n }\n\n /**\n * Reset visible items counter\n * @private\n */\n resetCounter() {\n this.visibleItems = new Set(this.items);\n this.updateCounter();\n }\n\n /**\n * Toggle individual filter state\n * @private\n * @param {string} filterValue - Filter value to toggle\n * @param {HTMLElement} button - Filter button element\n */\n toggleFilter(filterValue, button) {\n this.currentFilters.delete(\"*\");\n this.filterButtons[0].classList.remove(this.options.activeClass);\n\n if (button.classList.contains(this.options.activeClass)) {\n button.classList.remove(this.options.activeClass);\n this.currentFilters.delete(filterValue);\n\n if (this.currentFilters.size === 0) {\n this.resetFilters();\n }\n } else {\n button.classList.add(this.options.activeClass);\n this.currentFilters.add(filterValue);\n }\n }\n\n /**\n * Apply current filters to items\n * @public\n */\n /**\n * Apply current filters to items\n * @public\n */\nfilter() {\n // Store the original filter logic\n const standardFilter = () => {\n this.visibleItems.clear();\n \n this.items.forEach((item) => {\n if (this.currentFilters.has(\"*\")) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n const itemCategories = new Set(\n item.dataset.categories?.split(\" \") || [],\n );\n const matchesFilter =\n this.options.filterMode === \"OR\"\n ? this.matchesAnyFilter(itemCategories)\n : this.matchesAllFilters(itemCategories);\n\n if (matchesFilter) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n this.hideItem(item);\n }\n }\n });\n };\n\n // Check if we should use group filtering or standard filtering\n if (this.filterGroups.size === 0) {\n standardFilter();\n } else {\n this.visibleItems.clear();\n\n this.items.forEach(item => {\n if (this.currentFilters.has(\"*\")) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n const itemCategories = new Set(item.dataset.categories?.split(\" \") || []);\n const matchesGroups = this.matchesFilterGroups(itemCategories);\n\n if (matchesGroups) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n this.hideItem(item);\n }\n }\n });\n }\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n}\n\n /**\n * Add or update a filter group\n * @public\n * @param {string} groupId - Group identifier\n * @param {string[]} filters - Array of filter values\n * @param {string} [operator='OR'] - Operator within group ('AND' or 'OR')\n * @returns {boolean} Success status\n */\n addFilterGroup(groupId, filters, operator = \"OR\") {\n try {\n // Validate inputs\n if (!groupId || !Array.isArray(filters)) {\n console.warn(\"Invalid group parameters\");\n return false;\n }\n\n const validOperator = operator.toUpperCase();\n if (![\"AND\", \"OR\"].includes(validOperator)) {\n console.warn('Invalid operator. Using default \"OR\"');\n operator = \"OR\";\n }\n\n // Create or update group\n this.filterGroups.set(groupId, {\n filters: new Set(filters),\n operator: validOperator,\n });\n\n // Only update if we have active groups\n if (this.filterGroups.size > 0) {\n this.updateFiltersFromGroups();\n this.filter();\n this.updateURL();\n }\n\n return true;\n } catch (error) {\n console.error(\"Error adding filter group:\", error);\n return false;\n }\n }\n\n /**\n * Set how groups combine with each other\n * @public\n * @param {string} mode - Mode for combining groups ('AND' or 'OR')\n */\n setGroupMode(mode) {\n const validMode = mode.toUpperCase();\n if ([\"AND\", \"OR\"].includes(validMode)) {\n this.groupMode = validMode;\n if (this.filterGroups.size > 0) {\n this.filter();\n }\n }\n }\n\n /**\n * Remove a filter group\n * @public\n * @param {string} groupId - Group identifier\n * @returns {boolean} Success status\n */\n removeFilterGroup(groupId) {\n if (this.filterGroups.has(groupId)) {\n this.filterGroups.delete(groupId);\n\n // If no groups left, revert to normal filtering\n if (this.filterGroups.size === 0) {\n this.resetFilters();\n } else {\n this.updateFiltersFromGroups();\n }\n\n this.filter();\n this.updateURL();\n return true;\n }\n return false;\n }\n\n /**\n * Update filters based on groups\n * @private\n */\n updateFiltersFromGroups() {\n // Only process if we have groups\n if (this.filterGroups.size === 0) return;\n\n // Clear current filters except '*'\n if (!this.currentFilters.has(\"*\")) {\n this.currentFilters.clear();\n }\n\n // Combine all group filters\n for (const group of this.filterGroups.values()) {\n group.filters.forEach((filter) => {\n if (filter !== \"*\") {\n this.currentFilters.add(filter);\n }\n });\n }\n }\n\n /**\n * Check if item matches any active filter (OR mode)\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches any filter\n */\n matchesAnyFilter(itemCategories) {\n return [...this.currentFilters].some((filter) => {\n const [type, value] = filter.split(\":\");\n return itemCategories.has(`${type}:${value}`);\n });\n }\n\n /**\n * Check if item matches all active filters (AND mode)\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches all filters\n */\n matchesAllFilters(itemCategories) {\n return [...this.currentFilters].every((filter) => {\n const [type, value] = filter.split(\":\");\n return itemCategories.has(`${type}:${value}`);\n });\n }\n\n /**\n * Show an item with animation\n * @private\n * @param {HTMLElement} item - Item to show\n */\n showItem(item) {\n this.visibleItems.add(item);\n item.classList.remove(this.options.hiddenClass);\n item.style.opacity = \"0\";\n item.style.transform = \"scale(0.95)\";\n\n item.offsetHeight;\n\n requestAnimationFrame(() => {\n item.style.opacity = \"1\";\n item.style.transform = \"scale(1)\";\n });\n }\n\n /**\n * Hide an item with animation\n * @private\n * @param {HTMLElement} item - Item to hide\n */\n hideItem(item) {\n item.style.opacity = \"0\";\n item.style.transform = \"scale(0.95)\";\n\n setTimeout(() => {\n if (item.style.opacity === \"0\") {\n item.classList.add(this.options.hiddenClass);\n this.visibleItems.delete(item);\n }\n }, this.options.animationDuration);\n }\n\n /**\n * Search items by text\n * @public\n * @param {string} query - Search query\n */\n search(query) {\n this.currentSearch = query.toLowerCase().trim();\n let matches = 0;\n\n this.items.forEach((item) => {\n const searchText = this.options.searchKeys\n .map((key) => item.dataset[key] || \"\")\n .join(\" \")\n .toLowerCase();\n\n const matchesSearch =\n this.currentSearch === \"\" || searchText.includes(this.currentSearch);\n\n if (matchesSearch) {\n this.showItem(item);\n matches++;\n } else {\n this.hideItem(item);\n }\n });\n\n this.updateURL();\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n }\n\n /**\n * Sort items by multiple criteria\n * @public\n * @param {Array<{key: string, direction: string}>} criteria - Sort criteria\n */\n sortMultiple(criteria) {\n const items = [...this.items];\n\n items.sort((a, b) => {\n for (const criterion of criteria) {\n const valueA = a.dataset[criterion.key];\n const valueB = b.dataset[criterion.key];\n\n const comparison =\n criterion.direction === \"asc\"\n ? valueA.localeCompare(valueB)\n : valueB.localeCompare(valueA);\n\n if (comparison !== 0) return comparison;\n }\n return 0;\n });\n\n items.forEach((item) => this.container.appendChild(item));\n }\n\n /**\n * Filter items by numeric range\n * @public\n * @param {string} key - Data attribute key\n * @param {number} min - Minimum value\n * @param {number} max - Maximum value\n */\n addRangeFilter(key, min, max) {\n this.items.forEach((item) => {\n const value = parseFloat(item.dataset[key]);\n const inRange = value >= min && value <= max;\n\n if (inRange) {\n this.showItem(item);\n } else {\n this.hideItem(item);\n }\n });\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n }\n\n /**\n * Check if item matches filter groups\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches the group filters\n */\n matchesFilterGroups(itemCategories) {\n const groupMatches = [...this.filterGroups.values()].map((group) => {\n const groupFilters = [...group.filters];\n if (groupFilters.length === 0) return true;\n\n return group.operator === \"OR\"\n ? groupFilters.some((filter) => itemCategories.has(filter))\n : groupFilters.every((filter) => itemCategories.has(filter));\n });\n\n return this.groupMode === \"OR\"\n ? groupMatches.some((matches) => matches)\n : groupMatches.every((matches) => matches);\n }\n\n /**\n * Update URL with current filter state\n * @private\n */\n updateURL() {\n const params = new URLSearchParams(window.location.search);\n\n // Add groups to URL if they exist\n if (this.filterGroups.size > 0) {\n for (const [groupId, group] of this.filterGroups.entries()) {\n params.set(`group_${groupId}`, [...group.filters].join(\",\"));\n params.set(`groupOp_${groupId}`, group.operator.toLowerCase());\n }\n params.set(\"groupMode\", this.groupMode.toLowerCase());\n }\n\n // Séparer les filtres par type\n const filtersByType = {};\n for (const filter of this.currentFilters) {\n if (filter !== \"*\") {\n const [type, value] = filter.split(\":\");\n if (!filtersByType[type]) {\n filtersByType[type] = new Set();\n }\n filtersByType[type].add(value);\n }\n }\n\n // Ajouter chaque type de filtre à l'URL\n Object.entries(filtersByType).forEach(([type, values]) => {\n params.set(type, Array.from(values).join(\",\"));\n });\n\n if (this.currentSearch) {\n params.set(\"search\", this.currentSearch);\n }\n\n const newURL = `${window.location.pathname}${\n params.toString() ? \"?\" + params.toString() : \"\"\n }`;\n window.history.pushState({}, \"\", newURL);\n }\n\n /**\n * Load filter state from URL\n * @private\n */\n loadFromURL() {\n const params = new URLSearchParams(window.location.search);\n\n // Load groups if they exist\n this.filterGroups.clear();\n for (const [key, value] of params.entries()) {\n if (key.startsWith(\"group_\")) {\n const groupId = key.replace(\"group_\", \"\");\n const operator =\n params.get(`groupOp_${groupId}`)?.toUpperCase() || \"OR\";\n const filters = value.split(\",\");\n this.addFilterGroup(groupId, filters, operator);\n }\n }\n\n // Set group mode if present\n const groupMode = params.get(\"groupMode\")?.toUpperCase();\n if (groupMode && [\"AND\", \"OR\"].includes(groupMode)) {\n this.groupMode = groupMode;\n }\n\n this.currentFilters.clear();\n\n // Si aucun filtre n'est présent, utiliser '*'\n let hasFilters = false;\n\n // Parcourir tous les paramètres\n for (const [type, values] of params.entries()) {\n if (type !== \"search\") {\n hasFilters = true;\n values.split(\",\").forEach((value) => {\n this.currentFilters.add(`${type}:${value}`);\n });\n }\n }\n\n if (!hasFilters) {\n this.currentFilters.add(\"*\");\n }\n\n // Update active buttons\n this.filterButtons.forEach((button) => {\n const filterValue = button.dataset.filter;\n if (\n this.currentFilters.has(filterValue) ||\n (filterValue === \"*\" && this.currentFilters.has(\"*\"))\n ) {\n button.classList.add(this.options.activeClass);\n } else {\n button.classList.remove(this.options.activeClass);\n }\n });\n\n // Load search\n const search = params.get(\"search\") || \"\";\n if (this.searchInput) {\n this.searchInput.value = search;\n }\n\n this.filter();\n if (search) {\n this.search(search);\n }\n }\n\n /**\n * Update results counter\n * @private\n * @returns {{total: number, visible: number}}\n */\n updateCounter() {\n const total = this.items.length;\n const visible = this.visibleItems.size;\n\n if (this.counter) {\n this.counter.textContent = `Showing ${visible} of ${total}`;\n }\n\n return { total, visible };\n }\n\n /**\n * Set animation options\n * @public\n * @param {Object} options - Animation options\n */\n setAnimationOptions(options = {}) {\n this.options.animationDuration =\n options.duration || this.options.animationDuration;\n this.options.animationType = options.type || \"ease-out\";\n this.addStyles(); // Refresh styles with new options\n }\n\n /**\n * Event handling system\n */\n addEventSystem() {\n this.events = {};\n\n this.on = (eventName, callback) => {\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n this.events[eventName].push(callback);\n };\n\n this.emit = (eventName, data) => {\n if (this.events[eventName]) {\n this.events[eventName].forEach((callback) => callback(data));\n }\n };\n }\n\n /**\n * Add pagination\n * @public\n * @param {number} itemsPerPage - Number of items per page\n */\n setPagination(itemsPerPage) {\n this.pagination = {\n currentPage: 1,\n itemsPerPage: itemsPerPage,\n totalPages: Math.ceil(this.visibleItems.size / itemsPerPage),\n };\n this.updatePagination();\n }\n\n updatePagination() {\n const start =\n (this.pagination.currentPage - 1) * this.pagination.itemsPerPage;\n const end = start + this.pagination.itemsPerPage;\n\n [...this.visibleItems].forEach((item, index) => {\n if (index >= start && index < end) {\n this.showItem(item);\n } else {\n this.hideItem(item);\n }\n });\n }\n\n /**\n * Enable analytics tracking\n * @public\n * @param {Function} callback - Analytics callback function\n */\n enableAnalytics(callback) {\n this.analyticsCallback = callback;\n this.on(\"filter\", (data) => {\n this.analyticsCallback({\n type: \"filter\",\n filters: [...this.currentFilters],\n visibleItems: this.visibleItems.size,\n timestamp: new Date().toISOString(),\n });\n });\n }\n\n /**\n * Sort with custom comparator\n * @public\n * @param {string} key - Data attribute key\n * @param {Function} comparator - Custom comparison function\n */\n sortWithComparator(key, comparator) {\n const items = [...this.items];\n items.sort((a, b) => {\n const valueA = a.dataset[key];\n const valueB = b.dataset[key];\n return comparator(valueA, valueB);\n });\n items.forEach((item) => this.container.appendChild(item));\n }\n\n /**\n * Add responsive behavior\n * @public\n * @param {Object} breakpoints - Breakpoint configurations\n */\n setResponsiveOptions(breakpoints) {\n window.addEventListener(\n \"resize\",\n debounce(() => {\n const width = window.innerWidth;\n for (const [breakpoint, options] of Object.entries(breakpoints)) {\n if (width <= parseInt(breakpoint)) {\n Object.assign(this.options, options);\n this.filter();\n break;\n }\n }\n }, 250),\n );\n }\n\n /**\n * Enable keyboard navigation\n * @public\n */\n enableKeyboardNavigation() {\n document.addEventListener(\"keydown\", (e) => {\n if (\n e.key === \"Enter\" &&\n document.activeElement.classList.contains(\n this.options.filterButtonSelector.slice(1),\n )\n ) {\n document.activeElement.click();\n }\n });\n }\n\n /**\n * Export current filter state\n * @public\n * @returns {Object} Filter state\n */\n exportState() {\n return {\n filters: [...this.currentFilters],\n search: this.currentSearch,\n mode: this.options.filterMode,\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Import filter state\n * @public\n * @param {Object} state - Filter state to import\n */\n importState(state) {\n if (state.filters) {\n this.currentFilters = new Set(state.filters);\n this.currentSearch = state.search || \"\";\n this.options.filterMode = state.mode || \"OR\";\n this.filter();\n this.updateURL();\n }\n }\n\n /**\n * Save current filter state as preset\n * @public\n * @param {string} presetName - Name of the preset\n */\n savePreset(presetName) {\n const preset = {\n filters: [...this.currentFilters],\n search: this.currentSearch,\n mode: this.options.filterMode,\n };\n localStorage.setItem(`afs_preset_${presetName}`, JSON.stringify(preset));\n }\n\n /**\n * Load filter preset\n * @public\n * @param {string} presetName - Name of the preset to load\n */\n loadPreset(presetName) {\n const preset = JSON.parse(localStorage.getItem(`afs_preset_${presetName}`));\n if (preset) {\n this.currentFilters = new Set(preset.filters);\n this.currentSearch = preset.search;\n this.options.filterMode = preset.mode;\n this.filter();\n this.updateURL();\n }\n }\n\n /**\n * Set filter logic mode (alias for setFilterMode)\n * @public\n * @param {string} logic - New filter logic ('AND' or 'OR')\n */\n setLogic(logic) {\n if (typeof logic === \"boolean\") {\n // Handle boolean input (true = AND, false = OR)\n this.options.filterMode = logic ? \"AND\" : \"OR\";\n this.filter();\n return;\n }\n\n const mode = logic.toUpperCase();\n if ([\"OR\", \"AND\"].includes(mode)) {\n this.options.filterMode = mode;\n this.filter();\n }\n }\n\n /**\n * Change filter mode\n * @public\n * @param {string} mode - New filter mode ('OR' or 'AND')\n */\n setFilterMode(mode) {\n if ([\"OR\", \"AND\"].includes(mode.toUpperCase())) {\n this.options.filterMode = mode.toUpperCase();\n this.filter();\n }\n }\n\n /**\n * Add filter by type and value\n * @public\n * @param {string} type - Filter type\n * @param {string} value - Filter value\n */\n addFilter(type, value) {\n this.currentFilters.add(`${type}:${value}`);\n this.filter();\n this.updateURL();\n }\n\n /**\n * Remove filter by type and value\n * @public\n * @param {string} type - Filter type\n */\n removeFilter(type, value) {\n this.currentFilters.delete(`${type}:${value}`);\n if (this.currentFilters.size === 0) {\n this.currentFilters.add(\"*\");\n }\n this.filter();\n this.updateURL();\n }\n\n /**\n * Get active filters by type\n * @public\n * @param {string} type - Filter type\n */\n getActiveFiltersByType(type) {\n return [...this.currentFilters]\n .filter((filter) => filter.startsWith(`${type}:`))\n .map((filter) => filter.split(\":\")[1]);\n }\n}\n\nexport { AFS };\n"],"names":["debounce","func","wait","timeout","_len","arguments","length","args","Array","_key","clearTimeout","setTimeout","later","constructor","options","undefined","this","containerSelector","itemSelector","filterButtonSelector","searchInputSelector","counterSelector","activeClass","hiddenClass","animationDuration","filterMode","searchKeys","debounceTime","container","document","querySelector","items","querySelectorAll","filterButtons","searchInput","counter","currentFilters","Set","currentSearch","visibleItems","filterGroups","Map","groupMode","init","addStyles","bindEvents","loadFromURL","updateCounter","styles","styleSheet","createElement","textContent","head","appendChild","forEach","button","addEventListener","handleFilterClick","e","search","target","value","window","filterValue","dataset","filter","resetFilters","toggleFilter","updateURL","btn","classList","remove","clear","add","resetCounter","delete","contains","size","standardFilter","item","has","showItem","itemCategories","categories","split","matchesAnyFilter","matchesAllFilters","hideItem","matchesFilterGroups","addFilterGroup","groupId","filters","operator","isArray","console","warn","validOperator","toUpperCase","includes","set","updateFiltersFromGroups","error","setGroupMode","mode","validMode","removeFilterGroup","group","values","some","type","every","style","opacity","transform","offsetHeight","requestAnimationFrame","query","toLowerCase","trim","searchText","map","key","join","sortMultiple","criteria","sort","a","b","criterion","valueA","valueB","comparison","direction","localeCompare","addRangeFilter","min","max","parseFloat","groupMatches","groupFilters","matches","params","URLSearchParams","location","entries","filtersByType","Object","_ref","from","newURL","pathname","toString","history","pushState","startsWith","replace","get","hasFilters","total","visible","setAnimationOptions","duration","animationType","addEventSystem","events","on","eventName","callback","push","emit","data","setPagination","itemsPerPage","pagination","currentPage","totalPages","Math","ceil","updatePagination","start","end","index","enableAnalytics","analyticsCallback","timestamp","Date","toISOString","sortWithComparator","comparator","setResponsiveOptions","breakpoints","width","innerWidth","breakpoint","parseInt","assign","enableKeyboardNavigation","activeElement","slice","click","exportState","importState","state","savePreset","presetName","preset","localStorage","setItem","JSON","stringify","loadPreset","parse","getItem","setLogic","logic","setFilterMode","addFilter","removeFilter","getActiveFiltersByType"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "advanced-filter-system",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Advanced filtering system for DOM elements with multiple features",
5
5
  "main": "dist/AFS.js",
6
6
  "module": "dist/AFS.esm.js",