{"version":3,"file":"Filter_Base.Cft5FSLZ.mjs","names":["useStore","useState","useState","filters","useRef","useMemo","_Fragment","_Fragment"],"sources":["https:/framerusercontent.com/modules/vj7bFUjvEQFgEzNBkdoG/vf3CKm378wlVcBk7IhSU/createStore.js","https:/framer.com/m/framer/store.js@^1.0.0","https:/framerusercontent.com/modules/oaAH7umUjUOTeKmykfom/W8NpohwbGh9y4kAh2tPN/Stores.js","https:/framerusercontent.com/modules/NktNXvnf4m4T7jKQcOHx/7b8t9NMmUa2XQ7B7X3TQ/Utilities.js","https:/framerusercontent.com/modules/uaC9hWf3ec7HqMv3sXMc/9s9gykd8k0LxLwu8Dx4Y/Hooks.js","https:/framerusercontent.com/modules/Hxho9sUnioBkMjGbLBed/6uGco1Ye7qXYMx0vD0Gi/collectionID.js","https:/framerusercontent.com/modules/1abSdslctova79WmNQRw/ruSTMSLrhJmBlH79lGNM/Filter_Base.js"],"sourcesContent":["import{useState,useEffect}from\"react\";import{Data,useObserveData}from\"framer\";export function createStore(state1){// Use Data so that a Preview reload resets the state\nconst dataStore=Data({state:Object.freeze({...state1})});// Create a set function that updates the state\nconst setDataStore=newState=>{// If the state is an object, make sure we copy it\nif(typeof newState===\"function\"){newState=newState(dataStore.state);}dataStore.state=Object.freeze({...dataStore.state,...newState});};// Store the initial state, copy the object if it's an object\nlet storeState=typeof state1===\"object\"?Object.freeze({...state1}):state1;// Keep a list of all the listeners, in the form of React hook setters\nconst storeSetters=new Set();// Create a set function that updates all the listeners / setters\nconst setStoreState=newState=>{// If the state is an object, make sure we copy it\nif(typeof newState===\"function\"){newState=newState(storeState);}storeState=typeof newState===\"object\"?Object.freeze({...storeState,...newState}):newState;// Update all the listeners / setters with the new value\nstoreSetters.forEach(setter=>setter(storeState));};// Create the actual hook based on everything above\nfunction useStore(){// Create the hook we are going to use as a listener\nconst[state,setState]=useState(storeState);// If we unmount the component using this hook, we need to remove the listener\n// @ts-ignore\nuseEffect(()=>{// But right now, we need to add the listener\nstoreSetters.add(setState);return()=>storeSetters.delete(setState);},[]);// If Data context exists, use Data, otherwise use vanilla React state\nif(useObserveData()===true){useObserveData();return[dataStore.state,setDataStore];}else{// Return the state and a function to update the central store\nreturn[state,setStoreState];}}return useStore;}\nexport const __FramerMetadata__ = {\"exports\":{\"createStore\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./createStore.map","/*\n * createStore (framer/store@1.0.1)\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/vj7bFUjvEQFgEzNBkdoG/vf3CKm378wlVcBk7IhSU/createStore.js\"\n","import{createStore}from\"https://framer.com/m/framer/store.js@^1.0.0\";export const useStore=createStore({});export const useDevStore=createStore({isDebugging:null});\nexport const __FramerMetadata__ = {\"exports\":{\"useStore\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useDevStore\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Stores.map","/**\n * Accepts a string, and returns true/false if the string is in ISO 8601 format with the option of adding \"Z\" at the end.\n * @param {string} str - A string representing a date in ISO 8601 format.\n * @returns {boolean} - Returns true if str is in ISO 8601 format, otherwise returns false.\n */export function isISO8601(str){const isoDateRegex=/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|([+-]\\d{2}:\\d{2}))?$/;return isoDateRegex.test(str);}/**\n * Accepts a text, checks to see if it's in ISO 8601 format, if yes, resets the time and returns ISO 8601 string, otherwise return empty string.\n * @param {string} text - Date as a string in ISO 8601 format.\n * @returns {string} - Returns the same string value with the time cleared or an empty string.\n */export function resetTimeOfISODateString(text){return isISO8601(text)?`${text.substring(0,10)}T00:00:00.000Z`:\"\";}export function getProps({object,target,returnParent=false}){if(!object||!target.name||!target.type)return undefined;const propMatch=object[target.name];const typeMatch=target.type.toLowerCase()===\"array\"?Array.isArray(propMatch):typeof propMatch===target.type.toLowerCase();if(propMatch&&typeMatch){// return the target or the target's parent (which will contain the target)\nreturn returnParent?object:propMatch;}for(let nestedProp in object){const value=object[nestedProp];// don't go down another level if the value is not of type object/array\nif(typeof value!==\"object\")continue;const result=getProps({returnParent,target,object:value});if(result!==undefined)return result;}}export function getAllCollections({queryFrom,referencedCollections={}}){if(!queryFrom)return false;const{constraint,left,right,type}=queryFrom;if(type===\"Collection\"){referencedCollections[queryFrom.alias]={...queryFrom};}getAllCollections({queryFrom:queryFrom.left,referencedCollections});getAllCollections({queryFrom:queryFrom.right,referencedCollections});return referencedCollections;}// the most basic of nodes, mostly used for literal value comparisons\nexport function createBinaryOperationNode({left,right,operator}){return{left,right,operator,type:\"BinaryOperation\"};}// used for enum/option CMS field types\nexport function createCaseNode({controlId,optionIds}){const createCondition=optionId=>{return{then:{type:\"LiteralValue\",value:true},type:\"Condition\",when:{type:\"LiteralValue\",value:optionId}};};return{type:\"Case\",conditions:optionIds.map(createCondition),else:{type:\"LiteralValue\",value:false},value:{name:controlId,type:\"Identifier\"}};}// used for string fields where the condition includes 'starts_with', 'ends_with', or 'contains'\nexport function createFunctionCallNode({binaryNode,functionName}){return{functionName,arguments:[binaryNode.left,binaryNode.right],type:\"FunctionCall\"};}// wraps a node to negate its value\nexport function createUnaryOperationNode({value}){return{operator:\"not\",type:\"UnaryOperation\",value};}export function handleCondition_IsIncludedIn({collection,condition,name,type,value}){// check if the filter condition is for the negated value\nconst negateValue=condition.charAt(0)===\"!\";const node=createBinaryOperationNode({left:{collection,name,type},right:{value,type:\"LiteralValue\"},operator:\"in\"});// if the value needs to be negated, wrap the node in a unary operation\nreturn negateValue?createUnaryOperationNode({value:node}):node;}/**\n * Handles filters with conditions as \"IS_SET\" or \"!IS_SET\".\n * @param {object} controlIdentifier - An object representing the control, composed of\n *   {collection, name, type} properties.\n * @param {string} condition - The string defining the type of filtering condition.\n * @returns {object} - Returns a binary operation node or unary operation node if the value is negated.\n */export function handleCondition_IsSet({collection,name,type,condition}){// check if the filter condition is for the negated value\nconst negateValue=condition.charAt(0)===\"!\";const left=createBinaryOperationNode({operator:\"!=\",left:{collection,name,type},right:{value:null,type:\"LiteralValue\"}});const right=createBinaryOperationNode({operator:\"!=\",left:{collection,name,type},right:{value:\"\",type:\"LiteralValue\"}});const node=createBinaryOperationNode({left,right,operator:\"and\"});// if the value needs to be negated, wrap the node in a unary operation\nreturn negateValue?createUnaryOperationNode({value:node}):node;}/**\n * Handles filters with conditions as \"STARTS_WITH\", \"!STARTS_WITH\", \"ENDS_WITH\", \"!ENDS_WITH\", \"CONTAINS\", \"!CONTAINS\".\n * @param {object} controlIdentifier - An object representing the control, composed of\n *   {collection, name, type} properties.\n * @param {string} condition - The string defining the type of filtering condition.\n * @returns {object} - Returns a binary operation node or unary operation node if the value is negated.\n */export function handleCondition_StartsWith_EndsWith_Contains({controlIdentifier,condition,value}){// check if the filter condition is for the negated value\nconst negateValue=condition.charAt(0)===\"!\";// Framer uses filter functions in their query tree for \"STARTS_WITH\", \"ENDS_WITH\", or \"CONTAINS\"\nconst functionName=negateValue?condition.substring(1):condition;const node=createFunctionCallNode({binaryNode:createBinaryOperationNode({left:controlIdentifier,right:{value,type:\"LiteralValue\"},operator:\"==\"}),functionName});// if the value needs to be negated, wrap the node in a unary operation\nreturn negateValue?createUnaryOperationNode({value:node}):node;}/**\n * Parses a string representing a range\n * @param {string} rangeString - String formatted to represent a range.\n * @returns {object} - Returns an object with the start and end values, and if they're inclusive or exclusive.\n */export function parseRangeCondition({rangeString}){// inclusive:\n// greater than or equal: [\n// lesser than or equal: ]\n//exclusive:\n// greater than: (\n// lesser than: )\n// check the first character to determine if the condition is \"greater than\", or \"greater than or equal\"\nconst startOperator=rangeString.charAt(0)===\"[\"?\">=\":\">\";// check the last character to determine if the condition is \"lesser than\", or \"lesser than or equal\"\nconst endOperator=rangeString.charAt(rangeString.length-1)===\"]\"?\"<=\":\"<\";// ommit the first and last charaters to split the values\nconst ranges=rangeString.substring(1,rangeString.length-1).split(\",\");return{start:{operator:startOperator,value:ranges[0]},end:{operator:endOperator,value:ranges[1]}};}/**\n * Handles filters with conditions that contains the substring \"IS_BETWEEN\".\n * @param {object} controlIdentifier - An object with properties of the control.\n * @param {object} start - The starting value and operator of the range.\n * @param {object} end - The ending value and operator of the range.\n * @returns {object} - Returns a binary operation node.\n */export function handleCondition_IsBetween({controlIdentifier,start,end}){const left=createBinaryOperationNode({left:controlIdentifier,right:{value:start.value,type:\"LiteralValue\"},operator:start.operator});// the results will be less than or equal to this end\nconst right=createBinaryOperationNode({left:controlIdentifier,right:{value:end.value,type:\"LiteralValue\"},operator:end.operator});return createBinaryOperationNode({left,right,operator:\"and\"});}// returns the tree structure used by Framer to apply filters to collection list\nexport function createFramerFilterTree({nodes=[],operator=\"and\"}){let tree={};nodes.forEach((node,index)=>{if(index===0){tree=node;}else{tree={operator,left:tree,right:node,type:\"BinaryOperation\"};}});return tree;}\nexport const __FramerMetadata__ = {\"exports\":{\"createFunctionCallNode\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"handleCondition_IsSet\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"isISO8601\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"handleCondition_IsBetween\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"createUnaryOperationNode\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"parseRangeCondition\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"createCaseNode\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getProps\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"handleCondition_IsIncludedIn\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"resetTimeOfISODateString\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"createFramerFilterTree\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getAllCollections\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"createBinaryOperationNode\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"handleCondition_StartsWith_EndsWith_Contains\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Utilities.map","// @ts-ignore\nimport{useQueryData,useIsOnFramerCanvas}from\"framer\";import{useState,useEffect,useRef,useMemo}from\"react\";import{useStore,useDevStore}from\"https://framerusercontent.com/modules/oaAH7umUjUOTeKmykfom/W8NpohwbGh9y4kAh2tPN/Stores.js\";import{getProps,getAllCollections,createFramerFilterTree,createBinaryOperationNode,createCaseNode,createFunctionCallNode,createUnaryOperationNode,handleCondition_IsBetween,handleCondition_IsIncludedIn,handleCondition_IsSet,handleCondition_StartsWith_EndsWith_Contains,parseRangeCondition}from\"https://framerusercontent.com/modules/NktNXvnf4m4T7jKQcOHx/7b8t9NMmUa2XQ7B7X3TQ/Utilities.js\";/**\n * Hook that prints to the console when debugging CMS Plus.\n * @param {boolean} debug - Is debugging CMS Plus or not.\n *\n * @returns {object} - An object with the following properties:\n * @param {function} consoleLogWhenDebuggingCMSPlus - Function that acts just like console.log, but only when debugging CMS Plus.\n */export const useConsoleLogWhenDebuggingCMSPlus=()=>{const[store]=useDevStore();const consoleLogWhenDebuggingCMSPlus=(...args)=>{if(store.isDebugging)console.log(...args);};return{consoleLogWhenDebuggingCMSPlus};};export const useGetFramerCMSItems=query=>{const[items,setItem]=useState([]);useEffect(()=>{if(!!query){const extractedItems=useQueryData(query);setItem(extractedItems);}},[query]);return items;};/**\n * Hook to debounce a value.\n * @param {number} delay - The delay in milliseconds before the debounced value is returned. Default is 2000.\n * @param {any} value - The value to debounce; the hook will return this value only after the specified delay without changes.\n * @returns {any} - Returns the debounced value after the delay.\n */export const useDebouncer=({delay,value})=>{const[debouncedValue,setDebouncedValue]=useState(value);useEffect(()=>{const ID=setTimeout(()=>{setDebouncedValue(value);},delay);return()=>clearTimeout(ID);},[value]);return debouncedValue;};/**\n * Hook to manage error alerts with a customizable delay.\n * @param {object} options - Configuration options for the hook.\n * @param {number} [options.delay=2000] - Optional delay in milliseconds before showing the alert. Defaults to 2000 if not provided.\n * @returns {object} - An object with the following properties:\n * @property {string[]} addMessage - An array of text messages representing the current error messages.\n * @property {boolean} hasMessages - A boolean indicating if there are any error messages.\n */export const useAlert=({delay=2e3}={})=>{const isOnFramerCanvas=useIsOnFramerCanvas();const[messages,setMessages]=useState([]);const debouncedMessages=useDebouncer({delay,value:messages});const addMessage=message=>{if(!isOnFramerCanvas)setMessages(prev=>[...prev,message]);};const clearMessages=()=>{if(!isOnFramerCanvas)setMessages([]);};useEffect(()=>{if(debouncedMessages.length>0)alert(`\nError!\n\n${debouncedMessages.join(\"\\n\")}`);},[debouncedMessages]);return{addMessage,clearMessages,hasMessages:messages.length>0};};/**\n * Custom hook that uses the cmsPlus collection's active filters to construct Framer's collection query where object.\n * @param {string} collectionID - The id of the collection stored in cmsPlus store.\n * @returns {function} Returns the where object structures as Framer's filtering tree to be used within the colleciton list query.\n */export const useConstructFramerCollectionQueryWhere=({collectionID})=>{const{consoleLogWhenDebuggingCMSPlus}=useConsoleLogWhenDebuggingCMSPlus();const[store]=useStore();const collection=store[collectionID];// get the current collection's props\nconst alias=(collection===null||collection===void 0?void 0:collection.alias)||\"\";const fields=(collection===null||collection===void 0?void 0:collection.fields)||{};const realTimeSearch=(collection===null||collection===void 0?void 0:collection.realTimeSearch)||null;const collectionReferences=(collection===null||collection===void 0?void 0:collection.collectionReferences)||null;// every element stores Framer's query filter structure made up of all the filters for that CMS field,\n// 'branches' will looped throught and formatted into the same Framer query filter structure\nconst branches=[];// if there is a search text, loop through the selected CMS fields and create a Framer query tree joined with \"or\" logic.\n// this is the only time were different CMS field are joined as \"match any\" logic\nif(!!realTimeSearch&&realTimeSearch.text!==\"\"){const nodes=[];// gather all the fields to search in and remove any duplicates\nconst realTimeSearchFields=Array.from(new Set(realTimeSearch.fields));realTimeSearchFields.forEach(fieldName=>{// if the field does not exist in the CMS, skip\nif(!fields.hasOwnProperty(fieldName))return;const control=fields[fieldName];const{type}=control;const controlIdentifier={collection:alias,name:control.id,type:\"Identifier\"};if(type===\"string\"){nodes.push(createFunctionCallNode({binaryNode:createBinaryOperationNode({left:controlIdentifier,right:{value:realTimeSearch.text,type:\"LiteralValue\"},operator:\"==\"}),functionName:\"CONTAINS\"}));}});if(nodes.length>0)branches.push(createFramerFilterTree({nodes,operator:\"or\"}));}// loop through each CMS field, for each active filter create a node, store in 'nodes', then format the 'nodes' into Framer's query filter structure with 'or' logic\nfor(const[name,props]of Object.entries(fields)){// @ts-ignore\nconst{id,type,options,optionTitles,filters}=props;// required for building the Framer query where object\n// collection alias is what collection this field is derived from\n// id is the Framer identification for this field control\nconst controlIdentifier={collection:alias,name:id,type:\"Identifier\"};const nodes=[];filters===null||filters===void 0?void 0:filters.forEach((activeFilter,currentFilterIndex,theseFilters)=>{const{condition,value,isActive}=activeFilter;// handle the active filter based on CMS field type\nswitch(type){case\"enum\":// enum/option CMS field type is different. it does not need to loop through each active filter.\n// all possible options are gathered, and if theres one active filter, then a binary operation node is pushed into nodes, otherwise, more than 1 active filter uses a case note instead.\nif(currentFilterIndex>0)return;// cross reference the filter values to their corresponding Framer control IDs\nconst activeFilterOptionIds=theseFilters.filter(thisFilter=>thisFilter.isActive).map(thisFilter=>{const index=optionTitles.indexOf(thisFilter.value);return options[index];});if(activeFilterOptionIds.length<1)return;// use a binary operation node for 1 active filter, otherwise, for more active filters, use a case node\nnodes.push(theseFilters.length===1?createBinaryOperationNode({left:controlIdentifier,right:{value:activeFilterOptionIds[0],type:\"LiteralValue\"},operator:activeFilter.condition}):createCaseNode({controlId:id,optionIds:activeFilterOptionIds}));break;case\"slug\":case\"string\":// skip if the filter is inactive\nif(!isActive)return;// handles when the condition is \"Equals\" or \"Doesn't Equal\"\nif(condition==\"==\"||condition==\"!=\"){nodes.push(createBinaryOperationNode({left:controlIdentifier,right:{value,type:\"LiteralValue\"},operator:condition}));// handles when the condition is \"IS_SET\" or \"!IS_SET\"\n}else if(condition.includes(\"IS_SET\")){nodes.push(handleCondition_IsSet({...controlIdentifier,condition}));// handles filters with conditions as \"STARTS_WITH\", \"!STARTS_WITH\", \"ENDS_WITH\", \"!ENDS_WITH\", \"CONTAINS\", or \"!CONTAINS\"\n}else if(condition.includes(\"STARTS_WITH\")||condition.includes(\"ENDS_WITH\")||condition.includes(\"CONTAINS\")){nodes.push(handleCondition_StartsWith_EndsWith_Contains({controlIdentifier,condition,value}));}break;case\"number\":// skip if the filter is inactive\nif(!isActive)return;if(condition===\"IS_BETWEEN_NUMBERS\"){const range=parseRangeCondition({rangeString:value});const start={value:Number(range.start.value),operator:range.start.operator};const end={value:Number(range.end.value),operator:range.end.operator};nodes.push(handleCondition_IsBetween({controlIdentifier,start,end}));}else{// handles single values\nnodes.push(createBinaryOperationNode({left:controlIdentifier,right:{value,type:\"LiteralValue\"},operator:condition}));}break;case\"date\":// skip if the filter is inactive\nif(!isActive)return;if(condition===\"IS_BETWEEN_DATES\"){const range=parseRangeCondition({rangeString:value});const start={value:range.start.value,operator:range.start.operator};const end={value:range.end.value,operator:range.end.operator};nodes.push(handleCondition_IsBetween({controlIdentifier,start,end}));}else{// handles single dates\nnodes.push(createBinaryOperationNode({left:controlIdentifier,right:{value,type:\"LiteralValue\"},operator:condition}));}break;case\"file\":case\"richtext\":case\"responsiveimage\":case\"link\":// skip if the filter is inactive\nif(!isActive)return;nodes.push(handleCondition_IsSet({...controlIdentifier,condition}));break;case\"boolean\":// skip if the filter is inactive\nif(!isActive)return;nodes.push(activeFilter.value?controlIdentifier:createUnaryOperationNode({value:controlIdentifier}));break;case\"collectionreference\":// skip if the filter is inactive\nif(!isActive)return;// for references, the referenced collection alias is used as this field control's id, and the name is replaced with 'id'\nconst collectionIdentifier={...controlIdentifier,collection:id,name:\"id\"};if(condition.includes(\"IS_SET\")){nodes.push(handleCondition_IsSet({...collectionIdentifier,condition}));}if(condition==\"==\"||condition==\"!=\"){nodes.push(createBinaryOperationNode({left:collectionIdentifier,right:{value,type:\"LiteralValue\"},operator:condition}));}if(condition.includes(\"IS_INCLUDED\")){nodes.push(handleCondition_IsIncludedIn({...collectionIdentifier,condition,value}));}break;// do nothing if the control is not supported\ndefault:consoleLogWhenDebuggingCMSPlus(\"🆇:\",`CMS field ${type} type is not supported.`);break;}});// every node will be used to construct Framer's query tree joined with \"or\" logic.\n// this will allow filters from the same CMS fields applied as \"match any\" logic.\nif(nodes.length>0)branches.push(createFramerFilterTree({nodes,operator:\"or\"}));}// every branch will be used to construct Framer's query tree joined with \"and\" logic.\n// this will allow filters from different CMS fields applied as \"match all\" logic.\nconst where=createFramerFilterTree({nodes:branches,operator:\"and\"});return()=>Object.keys(where).length>0?where:null;};export const useCMSPlusFilter=({cmsPlusComponentName,collectionID,condition,value,cmsFieldName,preserveActiveFilter,isFilterActive,interactionActiveFilter,interactionInactiveFilter,controlType,valueIsRequired})=>{var _collection_fields;const{consoleLogWhenDebuggingCMSPlus}=useConsoleLogWhenDebuggingCMSPlus();// debounces the toggle between applying and removing this filter\nconst isFilterActiveDebounced=useDebouncer({delay:200,value:isFilterActive});const isOnFramerCanvas=useIsOnFramerCanvas();const supportedControlTypes=[\"boolean\",\"collectionreference\",\"date\",\"enum\",\"file\",\"link\",\"number\",\"responsiveimage\",\"richtext\",\"string\"];const[store,setStore]=useStore();const collection=store[collectionID]||null;const cmsField=(collection===null||collection===void 0?void 0:(_collection_fields=collection.fields)===null||_collection_fields===void 0?void 0:_collection_fields[cmsFieldName])||null;const filters=(cmsField===null||cmsField===void 0?void 0:cmsField.filters)||null;const controlTypeSupported=supportedControlTypes.includes(cmsField===null||cmsField===void 0?void 0:cmsField.type);const controlTypesMatch=controlType===(cmsField===null||cmsField===void 0?void 0:cmsField.type);const collectionReferences=(collection===null||collection===void 0?void 0:collection.collectionReferences)||null;const missingInteractions=!interactionActiveFilter||!interactionInactiveFilter;const canPreserve=preserveActiveFilter&&!missingInteractions;const checkedInteractions=preserveActiveFilter?canPreserve:true;const valueIsValid=valueIsRequired?!!value:true;// the current/latest filter in collection store\nconst currentFilter=filters===null||filters===void 0?void 0:filters.find(f=>f.condition===condition&&f.value===value);/**\n     * changes to collection.filters can only be done when:\n     * - current view is not on Framer canvas\n     * - collection is initiated in store\n     * - the cms field exists\n     * - cms field type is supported\n     * - filter+ control type matches cms field type\n     * - if this is a reference filter, the reference exists\n     */const isFilterUsable=!isOnFramerCanvas&&!!collection&&!!cmsField&&controlTypeSupported&&controlTypesMatch&&valueIsValid;const isFilterInitiated=!!currentFilter;const areFiltersInitiated=isFilterUsable===true&&!!filters;/**\n     * Used to initiate filters for the collection in store.\n     * @param {object} state - The current state of a store.\n     * @returns {[object]} - Returns updated filters.\n     */const initiateFilters=({state})=>{var _state_collectionID_fields_cmsFieldName,_state_collectionID;const filters=((_state_collectionID=state[collectionID])===null||_state_collectionID===void 0?void 0:(_state_collectionID_fields_cmsFieldName=_state_collectionID.fields[cmsFieldName])===null||_state_collectionID_fields_cmsFieldName===void 0?void 0:_state_collectionID_fields_cmsFieldName.filters)||[];filters.push({condition,value,isActive:isFilterActive});return filters;};/**\n     * Used to remove this filter from the collection in store.\n     * @param {object} state - The current state of a store.\n     * @returns {[object]} - Returns updated filters.\n     */const removeFilter=({state})=>{var _state_collectionID_fields_cmsFieldName,_state_collectionID;const filters=[...(_state_collectionID=state[collectionID])===null||_state_collectionID===void 0?void 0:(_state_collectionID_fields_cmsFieldName=_state_collectionID.fields[cmsFieldName])===null||_state_collectionID_fields_cmsFieldName===void 0?void 0:_state_collectionID_fields_cmsFieldName.filters];return filters.filter(f=>{const conditionsDontMatch=f.condition!==condition;const valuesDontMatch=f.value!==value;return conditionsDontMatch||valuesDontMatch;});};/**\n     * Used to update filters for the collection in store.\n     * @param {object} state - The current state of a store.\n     * @returns {[object]} - Returns updated filters.\n     */const updateFilters=({state})=>{const filters=[...state[collectionID].fields[cmsFieldName].filters];return filters.map(filter=>{if(filter.condition===condition&&filter.value===value){return{...filter,isActive:isFilterActive};}return filter;});};/**\n     * Sets filters to the corresponding collection in store.\n     * @param {function} filterFunc - A function that returns a new filter instance that will be saved to the collection in store.\n     */const setFilters=({filterFunc})=>{setStore(prev=>{const filters=filterFunc({state:prev});return{...prev,[collectionID]:{...prev[collectionID],fields:{...prev[collectionID].fields,[cmsFieldName]:{...prev[collectionID].fields[cmsFieldName],filters}}}};});};// check if the component's variant needs to be synced with the current filter status\nconst needsVariantSyncCheckRef=useRef(true);const conditionDefaultRef=useRef(condition);const valueDefaultRef=useRef(value);const removeDefaultFilterRef=useRef(removeFilter);// eg. a fetch updated the value\nconst valueIsOverridden=value!==valueDefaultRef.current;const defaultFilterNeedsRemoval=valueIsOverridden&&areFiltersInitiated;// this useEffect triggers when this filter's \"isActive\" is toggles remotely via Clear+\nuseEffect(()=>{if(isFilterInitiated&&!needsVariantSyncCheckRef.current){if(currentFilter.isActive!==isFilterActive){consoleLogWhenDebuggingCMSPlus(\"🔄:\",`Filter for ${cmsFieldName} on Collection+ ID: ${collectionID} has been cleared remotely, syncing variant...`);interactionInactiveFilter===null||interactionInactiveFilter===void 0?void 0:interactionInactiveFilter();}}},[currentFilter===null||currentFilter===void 0?void 0:currentFilter.isActive]);// error handling\nuseEffect(()=>{if(!isOnFramerCanvas){// consoleLogWhenDebuggingCMSPlus(\n//     `Error handling for: ID ${collectionID} ${cmsPlusComponentName} ${cmsFieldName}, type: ${controlType}, match? ${controlTypesMatch}, supported? ${controlTypeSupported}`\n// )\n// collection found\nif(!!collection){// cms field found\nif(!!cmsField){// user is not using the correct cmsPlus fitler+ component for the cms field type\nif(!controlTypesMatch){consoleLogWhenDebuggingCMSPlus(\"❗️:\",`${cmsPlusComponentName} supports only ${controlType} CMS field types; however, \"${cmsFieldName}\" is a ${cmsField.type} type.`);}// the cms field type is not supported at this time\nif(!controlTypeSupported){consoleLogWhenDebuggingCMSPlus(\"❗️:\",`The \"${cmsFieldName}\" CMS field is a ${cmsField.type} type, which is currently unsupported.`);}if(preserveActiveFilter){if(missingInteractions){consoleLogWhenDebuggingCMSPlus(\"❗️:\",`To preserve the ${cmsFieldName} ${cmsPlusComponentName} for ${collectionID}, both active & inactive variants must be set under 'Interactions'.`);}}}else{// field name provided\nif(!!cmsFieldName){consoleLogWhenDebuggingCMSPlus(\"❗️:\",`CMS field \"${cmsFieldName}\" does not exist.`);// field name empty\n}else{consoleLogWhenDebuggingCMSPlus(\"❗️:\",`Field name is required.`);}}// collection not found\n}else{consoleLogWhenDebuggingCMSPlus(\"❗️:\",`CMS collection \"${collectionID}\" does not exist.`);}}},[isOnFramerCanvas,!!collection,!!cmsField,cmsFieldName,collectionID]);// clean up function that resets the filter if it's not being preserved\nuseEffect(()=>{return()=>{if(isFilterInitiated&&!preserveActiveFilter){consoleLogWhenDebuggingCMSPlus(\"🧹:\",`Filter+ for ${cmsFieldName} is not preserved. Resetting...`);setFilters({filterFunc:updateFilters});}};},[isFilterInitiated]);// handles the filter toggle when it's already been intialized and variant check has been done\nuseEffect(()=>{if(areFiltersInitiated&&!needsVariantSyncCheckRef.current){// handle the filter when its status needs to be toggled\nif(isFilterActive!==currentFilter.isActive){consoleLogWhenDebuggingCMSPlus(`🟨 ${isFilterActive?\"Activating\":\"Deactivating\"} Filter+:`,cmsFieldName,condition,value);setFilters({filterFunc:updateFilters});}}// when toggling the filter and it's not usable, console log the error when debugging CMS+\nif(!isFilterUsable){consoleLogWhenDebuggingCMSPlus(\"🛑:\",`Filter+ for ${collectionID}: ${cmsFieldName} as ${condition}: ${value} is not usable.`);}},[isFilterUsable,isFilterActiveDebounced]);// on mount when the filter is usable\nuseEffect(()=>{if(isFilterUsable){// condition will execute when the filters for the field have been initiated and an override (eg. fetch) has triggered a new value, then remove the original filter so it can be reinitialized with the new value\nif(defaultFilterNeedsRemoval){setFilters({filterFunc:removeDefaultFilterRef.current});}// if this filter with its current value is initialized in the collection store, then run a variant sync check if it's being preserved\nif(isFilterInitiated){// sync variant if needed\nif(preserveActiveFilter&&isFilterActive!==currentFilter.isActive){consoleLogWhenDebuggingCMSPlus(\"🔄:\",\"Preserving active filter variant, syncing...\");currentFilter.isActive?interactionActiveFilter===null||interactionActiveFilter===void 0?void 0:interactionActiveFilter():interactionInactiveFilter===null||interactionInactiveFilter===void 0?void 0:interactionInactiveFilter();}}else{consoleLogWhenDebuggingCMSPlus(`✅: Initializing Filter+: id# ${collectionID} || field ${cmsFieldName} || condition ${condition} || value ${value}`);setFilters({filterFunc:initiateFilters});}needsVariantSyncCheckRef.current=false;}},[isFilterUsable,value]);};export const useFramerCollectionList=({collectionPlusID,framerCollectionList,isDebugging=false})=>{var _store_collection_id,_store_collection_id1,_store_collection_id2;// stores\nconst[store,setStore]=useStore();const[devStore,setDevStore]=useDevStore();// states\n// key for updating the collection list on the page, a change will trigger a render\nconst[key,setKey]=useState(0);const[noSearchResults,setNoSearchResults]=useState(false);const[collection,setCollection]=useState({alias:null,id:null,name:null,query:null});// local variables\nconst collectionInitializedInStore=!!store[collection.id];const sortDirection=(_store_collection_id=store[collection.id])===null||_store_collection_id===void 0?void 0:_store_collection_id.sort;const debounced_delay=250;// hooks\nconst isOnFramerCanvas=useIsOnFramerCanvas();const constructFramerCollectionQueryWhere=useConstructFramerCollectionQueryWhere({collectionID:collection.id});// any dependencies that can trigger the render key should be debounced to prevent collection list flicker\nconst fields_debounced=useDebouncer({delay:debounced_delay,value:(_store_collection_id1=store[collection.id])===null||_store_collection_id1===void 0?void 0:_store_collection_id1.fields});const searchText_debounced=useDebouncer({delay:debounced_delay,value:(_store_collection_id2=store[collection.id])===null||_store_collection_id2===void 0?void 0:_store_collection_id2.realTimeSearch.text});const framerCollectionList_debounced=useDebouncer({delay:debounced_delay,value:framerCollectionList});// in order to extract cms query data, the cmsPlus filters will need to be formatted into Framer's query where tree structure and applied to query\nconst searchResults=useMemo(()=>{if(!!fields_debounced&&!!collection.query){var _collection_query;const where=constructFramerCollectionQueryWhere();const orderBy=((_collection_query=collection.query)===null||_collection_query===void 0?void 0:_collection_query.orderBy)||null;// by default, sort is ascending when orberBy is undefined, and is not neede\nif(!!orderBy&&!!sortDirection){if(isDebugging){console.log(\"↕️:\",`Setting ${sortDirection} order.`);}collection.query.orderBy[0]={...collection.query.orderBy[0],direction:sortDirection};}if(!!where){if(isDebugging)console.log(\"🈸:\",where);collection.query.where=where;}else{delete collection.query.where;}if(isDebugging){console.log(\"🟠:\",\"Query:\",Object.assign({},collection.query));}return useQueryData(collection.query);}return null;},[fields_debounced,sortDirection,!!collection.query,searchText_debounced,framerCollectionList]);// updates the collection store with cms items, updates the render key for the collection list, and updates if the noSearchResults frame shoule be shown\nuseEffect(()=>{/**\n         * at this point:\n         * 1. framerCollectionList has been validated\n         * 2. the collection has been stored\n         * 3. its query has been altered by applying CMS+ filters\n         * 4. the cms items (query data) has been extracted using the altered query\n         * 5. finally the collection list on the page needs to be updated by changing the render key\n         */if(!!searchResults){if(isDebugging){console.log(\"🟢:\",`Updating CMS Items: id# ${collection.id} || name ${collection.name} || item count ${searchResults.length}`);}const noResults=searchResults.length<1;// key = 0 signifies the collection list is updating on Collection+\n// this avoids a split-second double render when switching from no results --> results until the collection list is updated with the latest filters\nconst updatedKey=noResults?0:Math.floor(Math.random()*1e5);setNoSearchResults(noResults);setKey(updatedKey);setStore(prev=>({...prev,[collection.id]:{...prev[collection.id],searchResults}}));}},[collectionInitializedInStore,sortDirection,fields_debounced,searchText_debounced,framerCollectionList_debounced]);// when on Preview/Live view only\n// if collection is not set in store, initialize a valid Framer collection list in store\n// otherwise, if it's the same list, sync the stored collection to Collection+\nuseEffect(()=>{if(!isOnFramerCanvas){if(isDebugging){console.log(\"🛠️:\",\"CMS Plus debugging enabled...\");console.log(\"\");}// get the query object from the Framer collection list\n// if a query object does not exist, then the linked frame is not a valid Framer collection list instance\nconst query=getProps({object:framerCollectionList,target:{name:\"query\",type:\"object\"}});// for Framer collection lists not using any references, this will return query.from\n// otherwise, list using references, it will return query.from.left\nconst props=getProps({object:query,target:{name:\"alias\",type:\"string\"},returnParent:true});// get the name of the collection\n// for collections that include references, multiple collections will be in the query object, but the first one is the target\nconst name=getProps({object:props,target:{name:\"displayName\",type:\"string\"}});// initialize in store\nif(!!name&&!!query){const storedCollection=store[collectionPlusID];if(!storedCollection){if(isDebugging){console.log(\"✅:\",`Initializing Collection+: \"${name}\" with id# ${collectionPlusID} in store.`);console.log(\"🟠:\",\"Query:\",Object.assign({},query));}// these are any native Framer filters applied on the list via the canvas\nconst defaultFilters=getProps({object:query,target:{name:\"where\",type:\"object\"}});// make the cms fields easier to manage by having the object props by readable titles, rather than its Framer ID\nconst cmsFieldsByID=getProps({object:props,target:{name:\"propertyControls\",type:\"object\"}});const cmsFieldsByName={};for(const[controlID,field]of Object.entries(cmsFieldsByID)){// @ts-ignore\nconst{title,...otherProps}=field;cmsFieldsByName[title]={...otherProps,id:controlID};}const from=getProps({object:query,target:{name:\"from\",type:\"object\"}});// if this collection list includes reference CMS fields, then gather all collections and remove the current one to be left the referenced collections only\nconst allCollections=getAllCollections({queryFrom:from});delete allCollections[props===null||props===void 0?void 0:props.alias];const collectionReferences=Object.keys(allCollections).length>0?allCollections:null;if(isDebugging&&collectionReferences){console.log(\"🟠:\",\"References:\",collectionReferences);}// initiate the collection in store if valid\nsetStore(prev=>({...prev,[collectionPlusID]:{...defaultFilters&&{defaultFilters},...collectionReferences&&{collectionReferences},name,alias:props===null||props===void 0?void 0:props.alias,fields:cmsFieldsByName,realTimeSearch:{fields:[],text:\"\"},searchResults:[]}}));}else{if(isDebugging){console.log(\"🟩:\",`Syncing Collection+ from store: id#${storedCollection.id} \"${storedCollection.name}\"`);}if(name===storedCollection.name){var _collection_query;if((_collection_query=collection.query)===null||_collection_query===void 0?void 0:_collection_query.where){query.where=collection.query.where;}}}}// store query from a valid Framer collection list\nsetCollection({name,alias:props===null||props===void 0?void 0:props.alias,id:collectionPlusID,...!!query&&{query}});// always start off with a 0 key, this notifies Collection+ the list is not ready and do not show\nsetKey(0);// cmsPlus collection+ must have props._cmsPlusDebugging = true via an override\nsetDevStore(prev=>({...prev,isDebugging}));}},[isOnFramerCanvas,framerCollectionList]);if(isDebugging)console.log(\"📀:\",Object.assign({},store));return{key,noSearchResults};};\nexport const __FramerMetadata__ = {\"exports\":{\"useConstructFramerCollectionQueryWhere\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useConsoleLogWhenDebuggingCMSPlus\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useFramerCollectionList\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useCMSPlusFilter\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useAlert\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useDebouncer\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useGetFramerCMSItems\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Hooks.map","import{jsx as _jsx,Fragment as _Fragment}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";/**\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n *\n * @framerDisableUnlink\n */export default function CollectionIDControl(props){return /*#__PURE__*/_jsx(_Fragment,{});}addPropertyControls(CollectionIDControl,{collectionID:{type:ControlType.Number,title:\"Collection+ ID\",defaultValue:0,min:0,displayStepper:true,step:1}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"CollectionIDControl\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"auto\",\"framerSupportedLayoutWidth\":\"auto\",\"framerDisableUnlink\":\"\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./collectionID.map","// @ts-ignore\nimport{jsx as _jsx,Fragment as _Fragment}from\"react/jsx-runtime\";import{addPropertyControls,getPropertyControls,ControlType}from\"framer\";import CollectionIDControl from\"https://framerusercontent.com/modules/Hxho9sUnioBkMjGbLBed/6uGco1Ye7qXYMx0vD0Gi/collectionID.js\";/**\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n *\n * @framerDisableUnlink\n */export default function BaseFilterControls(props){return /*#__PURE__*/_jsx(_Fragment,{});}addPropertyControls(BaseFilterControls,{...getPropertyControls(CollectionIDControl),interactionActiveFilter:{type:ControlType.EventHandler,title:\"Active Filter\",defaultValue:null},interactionInactiveFilter:{type:ControlType.EventHandler,title:\"Inactive Filter\",defaultValue:null},applyFilter:{type:ControlType.Boolean,title:\"Filter\",defaultValue:false,enabledTitle:\"Apply\",disabledTitle:\"Clear\",description:`Triggers filter function. [Learn more](https://framercms.plus/documentation/pure-functionality).\nExplore its [documentation](https://framercms.plus/documentation/component-filters-plus).`},preserveActiveFilter:{type:ControlType.Boolean,title:\"Preserve\",defaultValue:true,description:`Filter state. [Explore feature.](https://framercms.plus/documentation/preserve-settings)`}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"BaseFilterControls\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"auto\",\"framerDisableUnlink\":\"\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Filter_Base.map"],"mappings":"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"}