Changeset - 26a6928a2046
[Not reviewed]
conservancy/static/js/vendor/alpine-3.14.1.js
Show inline comments
 
new file 100644
 
(() => {
 
  // packages/alpinejs/src/scheduler.js
 
  var flushPending = false;
 
  var flushing = false;
 
  var queue = [];
 
  var lastFlushedIndex = -1;
 
  function scheduler(callback) {
 
    queueJob(callback);
 
  }
 
  function queueJob(job) {
 
    if (!queue.includes(job))
 
      queue.push(job);
 
    queueFlush();
 
  }
 
  function dequeueJob(job) {
 
    let index = queue.indexOf(job);
 
    if (index !== -1 && index > lastFlushedIndex)
 
      queue.splice(index, 1);
 
  }
 
  function queueFlush() {
 
    if (!flushing && !flushPending) {
 
      flushPending = true;
 
      queueMicrotask(flushJobs);
 
    }
 
  }
 
  function flushJobs() {
 
    flushPending = false;
 
    flushing = true;
 
    for (let i = 0; i < queue.length; i++) {
 
      queue[i]();
 
      lastFlushedIndex = i;
 
    }
 
    queue.length = 0;
 
    lastFlushedIndex = -1;
 
    flushing = false;
 
  }
 

	
 
  // packages/alpinejs/src/reactivity.js
 
  var reactive;
 
  var effect;
 
  var release;
 
  var raw;
 
  var shouldSchedule = true;
 
  function disableEffectScheduling(callback) {
 
    shouldSchedule = false;
 
    callback();
 
    shouldSchedule = true;
 
  }
 
  function setReactivityEngine(engine) {
 
    reactive = engine.reactive;
 
    release = engine.release;
 
    effect = (callback) => engine.effect(callback, { scheduler: (task) => {
 
      if (shouldSchedule) {
 
        scheduler(task);
 
      } else {
 
        task();
 
      }
 
    } });
 
    raw = engine.raw;
 
  }
 
  function overrideEffect(override) {
 
    effect = override;
 
  }
 
  function elementBoundEffect(el) {
 
    let cleanup2 = () => {
 
    };
 
    let wrappedEffect = (callback) => {
 
      let effectReference = effect(callback);
 
      if (!el._x_effects) {
 
        el._x_effects = /* @__PURE__ */ new Set();
 
        el._x_runEffects = () => {
 
          el._x_effects.forEach((i) => i());
 
        };
 
      }
 
      el._x_effects.add(effectReference);
 
      cleanup2 = () => {
 
        if (effectReference === void 0)
 
          return;
 
        el._x_effects.delete(effectReference);
 
        release(effectReference);
 
      };
 
      return effectReference;
 
    };
 
    return [wrappedEffect, () => {
 
      cleanup2();
 
    }];
 
  }
 
  function watch(getter, callback) {
 
    let firstTime = true;
 
    let oldValue;
 
    let effectReference = effect(() => {
 
      let value = getter();
 
      JSON.stringify(value);
 
      if (!firstTime) {
 
        queueMicrotask(() => {
 
          callback(value, oldValue);
 
          oldValue = value;
 
        });
 
      } else {
 
        oldValue = value;
 
      }
 
      firstTime = false;
 
    });
 
    return () => release(effectReference);
 
  }
 

	
 
  // packages/alpinejs/src/mutation.js
 
  var onAttributeAddeds = [];
 
  var onElRemoveds = [];
 
  var onElAddeds = [];
 
  function onElAdded(callback) {
 
    onElAddeds.push(callback);
 
  }
 
  function onElRemoved(el, callback) {
 
    if (typeof callback === "function") {
 
      if (!el._x_cleanups)
 
        el._x_cleanups = [];
 
      el._x_cleanups.push(callback);
 
    } else {
 
      callback = el;
 
      onElRemoveds.push(callback);
 
    }
 
  }
 
  function onAttributesAdded(callback) {
 
    onAttributeAddeds.push(callback);
 
  }
 
  function onAttributeRemoved(el, name, callback) {
 
    if (!el._x_attributeCleanups)
 
      el._x_attributeCleanups = {};
 
    if (!el._x_attributeCleanups[name])
 
      el._x_attributeCleanups[name] = [];
 
    el._x_attributeCleanups[name].push(callback);
 
  }
 
  function cleanupAttributes(el, names) {
 
    if (!el._x_attributeCleanups)
 
      return;
 
    Object.entries(el._x_attributeCleanups).forEach(([name, value]) => {
 
      if (names === void 0 || names.includes(name)) {
 
        value.forEach((i) => i());
 
        delete el._x_attributeCleanups[name];
 
      }
 
    });
 
  }
 
  function cleanupElement(el) {
 
    if (el._x_cleanups) {
 
      while (el._x_cleanups.length)
 
        el._x_cleanups.pop()();
 
    }
 
  }
 
  var observer = new MutationObserver(onMutate);
 
  var currentlyObserving = false;
 
  function startObservingMutations() {
 
    observer.observe(document, { subtree: true, childList: true, attributes: true, attributeOldValue: true });
 
    currentlyObserving = true;
 
  }
 
  function stopObservingMutations() {
 
    flushObserver();
 
    observer.disconnect();
 
    currentlyObserving = false;
 
  }
 
  var queuedMutations = [];
 
  function flushObserver() {
 
    let records = observer.takeRecords();
 
    queuedMutations.push(() => records.length > 0 && onMutate(records));
 
    let queueLengthWhenTriggered = queuedMutations.length;
 
    queueMicrotask(() => {
 
      if (queuedMutations.length === queueLengthWhenTriggered) {
 
        while (queuedMutations.length > 0)
 
          queuedMutations.shift()();
 
      }
 
    });
 
  }
 
  function mutateDom(callback) {
 
    if (!currentlyObserving)
 
      return callback();
 
    stopObservingMutations();
 
    let result = callback();
 
    startObservingMutations();
 
    return result;
 
  }
 
  var isCollecting = false;
 
  var deferredMutations = [];
 
  function deferMutations() {
 
    isCollecting = true;
 
  }
 
  function flushAndStopDeferringMutations() {
 
    isCollecting = false;
 
    onMutate(deferredMutations);
 
    deferredMutations = [];
 
  }
 
  function onMutate(mutations) {
 
    if (isCollecting) {
 
      deferredMutations = deferredMutations.concat(mutations);
 
      return;
 
    }
 
    let addedNodes = /* @__PURE__ */ new Set();
 
    let removedNodes = /* @__PURE__ */ new Set();
 
    let addedAttributes = /* @__PURE__ */ new Map();
 
    let removedAttributes = /* @__PURE__ */ new Map();
 
    for (let i = 0; i < mutations.length; i++) {
 
      if (mutations[i].target._x_ignoreMutationObserver)
 
        continue;
 
      if (mutations[i].type === "childList") {
 
        mutations[i].addedNodes.forEach((node) => node.nodeType === 1 && addedNodes.add(node));
 
        mutations[i].removedNodes.forEach((node) => node.nodeType === 1 && removedNodes.add(node));
 
      }
 
      if (mutations[i].type === "attributes") {
 
        let el = mutations[i].target;
 
        let name = mutations[i].attributeName;
 
        let oldValue = mutations[i].oldValue;
 
        let add2 = () => {
 
          if (!addedAttributes.has(el))
 
            addedAttributes.set(el, []);
 
          addedAttributes.get(el).push({ name, value: el.getAttribute(name) });
 
        };
 
        let remove = () => {
 
          if (!removedAttributes.has(el))
 
            removedAttributes.set(el, []);
 
          removedAttributes.get(el).push(name);
 
        };
 
        if (el.hasAttribute(name) && oldValue === null) {
 
          add2();
 
        } else if (el.hasAttribute(name)) {
 
          remove();
 
          add2();
 
        } else {
 
          remove();
 
        }
 
      }
 
    }
 
    removedAttributes.forEach((attrs, el) => {
 
      cleanupAttributes(el, attrs);
 
    });
 
    addedAttributes.forEach((attrs, el) => {
 
      onAttributeAddeds.forEach((i) => i(el, attrs));
 
    });
 
    for (let node of removedNodes) {
 
      if (addedNodes.has(node))
 
        continue;
 
      onElRemoveds.forEach((i) => i(node));
 
    }
 
    addedNodes.forEach((node) => {
 
      node._x_ignoreSelf = true;
 
      node._x_ignore = true;
 
    });
 
    for (let node of addedNodes) {
 
      if (removedNodes.has(node))
 
        continue;
 
      if (!node.isConnected)
 
        continue;
 
      delete node._x_ignoreSelf;
 
      delete node._x_ignore;
 
      onElAddeds.forEach((i) => i(node));
 
      node._x_ignore = true;
 
      node._x_ignoreSelf = true;
 
    }
 
    addedNodes.forEach((node) => {
 
      delete node._x_ignoreSelf;
 
      delete node._x_ignore;
 
    });
 
    addedNodes = null;
 
    removedNodes = null;
 
    addedAttributes = null;
 
    removedAttributes = null;
 
  }
 

	
 
  // packages/alpinejs/src/scope.js
 
  function scope(node) {
 
    return mergeProxies(closestDataStack(node));
 
  }
 
  function addScopeToNode(node, data2, referenceNode) {
 
    node._x_dataStack = [data2, ...closestDataStack(referenceNode || node)];
 
    return () => {
 
      node._x_dataStack = node._x_dataStack.filter((i) => i !== data2);
 
    };
 
  }
 
  function closestDataStack(node) {
 
    if (node._x_dataStack)
 
      return node._x_dataStack;
 
    if (typeof ShadowRoot === "function" && node instanceof ShadowRoot) {
 
      return closestDataStack(node.host);
 
    }
 
    if (!node.parentNode) {
 
      return [];
 
    }
 
    return closestDataStack(node.parentNode);
 
  }
 
  function mergeProxies(objects) {
 
    return new Proxy({ objects }, mergeProxyTrap);
 
  }
 
  var mergeProxyTrap = {
 
    ownKeys({ objects }) {
 
      return Array.from(
 
        new Set(objects.flatMap((i) => Object.keys(i)))
 
      );
 
    },
 
    has({ objects }, name) {
 
      if (name == Symbol.unscopables)
 
        return false;
 
      return objects.some(
 
        (obj) => Object.prototype.hasOwnProperty.call(obj, name) || Reflect.has(obj, name)
 
      );
 
    },
 
    get({ objects }, name, thisProxy) {
 
      if (name == "toJSON")
 
        return collapseProxies;
 
      return Reflect.get(
 
        objects.find(
 
          (obj) => Reflect.has(obj, name)
 
        ) || {},
 
        name,
 
        thisProxy
 
      );
 
    },
 
    set({ objects }, name, value, thisProxy) {
 
      const target = objects.find(
 
        (obj) => Object.prototype.hasOwnProperty.call(obj, name)
 
      ) || objects[objects.length - 1];
 
      const descriptor = Object.getOwnPropertyDescriptor(target, name);
 
      if (descriptor?.set && descriptor?.get)
 
        return descriptor.set.call(thisProxy, value) || true;
 
      return Reflect.set(target, name, value);
 
    }
 
  };
 
  function collapseProxies() {
 
    let keys = Reflect.ownKeys(this);
 
    return keys.reduce((acc, key) => {
 
      acc[key] = Reflect.get(this, key);
 
      return acc;
 
    }, {});
 
  }
 

	
 
  // packages/alpinejs/src/interceptor.js
 
  function initInterceptors(data2) {
 
    let isObject2 = (val) => typeof val === "object" && !Array.isArray(val) && val !== null;
 
    let recurse = (obj, basePath = "") => {
 
      Object.entries(Object.getOwnPropertyDescriptors(obj)).forEach(([key, { value, enumerable }]) => {
 
        if (enumerable === false || value === void 0)
 
          return;
 
        if (typeof value === "object" && value !== null && value.__v_skip)
 
          return;
 
        let path = basePath === "" ? key : `${basePath}.${key}`;
 
        if (typeof value === "object" && value !== null && value._x_interceptor) {
 
          obj[key] = value.initialize(data2, path, key);
 
        } else {
 
          if (isObject2(value) && value !== obj && !(value instanceof Element)) {
 
            recurse(value, path);
 
          }
 
        }
 
      });
 
    };
 
    return recurse(data2);
 
  }
 
  function interceptor(callback, mutateObj = () => {
 
  }) {
 
    let obj = {
 
      initialValue: void 0,
 
      _x_interceptor: true,
 
      initialize(data2, path, key) {
 
        return callback(this.initialValue, () => get(data2, path), (value) => set(data2, path, value), path, key);
 
      }
 
    };
 
    mutateObj(obj);
 
    return (initialValue) => {
 
      if (typeof initialValue === "object" && initialValue !== null && initialValue._x_interceptor) {
 
        let initialize = obj.initialize.bind(obj);
 
        obj.initialize = (data2, path, key) => {
 
          let innerValue = initialValue.initialize(data2, path, key);
 
          obj.initialValue = innerValue;
 
          return initialize(data2, path, key);
 
        };
 
      } else {
 
        obj.initialValue = initialValue;
 
      }
 
      return obj;
 
    };
 
  }
 
  function get(obj, path) {
 
    return path.split(".").reduce((carry, segment) => carry[segment], obj);
 
  }
 
  function set(obj, path, value) {
 
    if (typeof path === "string")
 
      path = path.split(".");
 
    if (path.length === 1)
 
      obj[path[0]] = value;
 
    else if (path.length === 0)
 
      throw error;
 
    else {
 
      if (obj[path[0]])
 
        return set(obj[path[0]], path.slice(1), value);
 
      else {
 
        obj[path[0]] = {};
 
        return set(obj[path[0]], path.slice(1), value);
 
      }
 
    }
 
  }
 

	
 
  // packages/alpinejs/src/magics.js
 
  var magics = {};
 
  function magic(name, callback) {
 
    magics[name] = callback;
 
  }
 
  function injectMagics(obj, el) {
 
    Object.entries(magics).forEach(([name, callback]) => {
 
      let memoizedUtilities = null;
 
      function getUtilities() {
 
        if (memoizedUtilities) {
 
          return memoizedUtilities;
 
        } else {
 
          let [utilities, cleanup2] = getElementBoundUtilities(el);
 
          memoizedUtilities = { interceptor, ...utilities };
 
          onElRemoved(el, cleanup2);
 
          return memoizedUtilities;
 
        }
 
      }
 
      Object.defineProperty(obj, `$${name}`, {
 
        get() {
 
          return callback(el, getUtilities());
 
        },
 
        enumerable: false
 
      });
 
    });
 
    return obj;
 
  }
 

	
 
  // packages/alpinejs/src/utils/error.js
 
  function tryCatch(el, expression, callback, ...args) {
 
    try {
 
      return callback(...args);
 
    } catch (e) {
 
      handleError(e, el, expression);
 
    }
 
  }
 
  function handleError(error2, el, expression = void 0) {
 
    error2 = Object.assign(
 
      error2 ?? { message: "No error message given." },
 
      { el, expression }
 
    );
 
    console.warn(`Alpine Expression Error: ${error2.message}
 

	
 
${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
 
    setTimeout(() => {
 
      throw error2;
 
    }, 0);
 
  }
 

	
 
  // packages/alpinejs/src/evaluator.js
 
  var shouldAutoEvaluateFunctions = true;
 
  function dontAutoEvaluateFunctions(callback) {
 
    let cache = shouldAutoEvaluateFunctions;
 
    shouldAutoEvaluateFunctions = false;
 
    let result = callback();
 
    shouldAutoEvaluateFunctions = cache;
 
    return result;
 
  }
 
  function evaluate(el, expression, extras = {}) {
 
    let result;
 
    evaluateLater(el, expression)((value) => result = value, extras);
 
    return result;
 
  }
 
  function evaluateLater(...args) {
 
    return theEvaluatorFunction(...args);
 
  }
 
  var theEvaluatorFunction = normalEvaluator;
 
  function setEvaluator(newEvaluator) {
 
    theEvaluatorFunction = newEvaluator;
 
  }
 
  function normalEvaluator(el, expression) {
 
    let overriddenMagics = {};
 
    injectMagics(overriddenMagics, el);
 
    let dataStack = [overriddenMagics, ...closestDataStack(el)];
 
    let evaluator = typeof expression === "function" ? generateEvaluatorFromFunction(dataStack, expression) : generateEvaluatorFromString(dataStack, expression, el);
 
    return tryCatch.bind(null, el, expression, evaluator);
 
  }
 
  function generateEvaluatorFromFunction(dataStack, func) {
 
    return (receiver = () => {
 
    }, { scope: scope2 = {}, params = [] } = {}) => {
 
      let result = func.apply(mergeProxies([scope2, ...dataStack]), params);
 
      runIfTypeOfFunction(receiver, result);
 
    };
 
  }
 
  var evaluatorMemo = {};
 
  function generateFunctionFromString(expression, el) {
 
    if (evaluatorMemo[expression]) {
 
      return evaluatorMemo[expression];
 
    }
 
    let AsyncFunction = Object.getPrototypeOf(async function() {
 
    }).constructor;
 
    let rightSideSafeExpression = /^[\n\s]*if.*\(.*\)/.test(expression.trim()) || /^(let|const)\s/.test(expression.trim()) ? `(async()=>{ ${expression} })()` : expression;
 
    const safeAsyncFunction = () => {
 
      try {
 
        let func2 = new AsyncFunction(
 
          ["__self", "scope"],
 
          `with (scope) { __self.result = ${rightSideSafeExpression} }; __self.finished = true; return __self.result;`
 
        );
 
        Object.defineProperty(func2, "name", {
 
          value: `[Alpine] ${expression}`
 
        });
 
        return func2;
 
      } catch (error2) {
 
        handleError(error2, el, expression);
 
        return Promise.resolve();
 
      }
 
    };
 
    let func = safeAsyncFunction();
 
    evaluatorMemo[expression] = func;
 
    return func;
 
  }
 
  function generateEvaluatorFromString(dataStack, expression, el) {
 
    let func = generateFunctionFromString(expression, el);
 
    return (receiver = () => {
 
    }, { scope: scope2 = {}, params = [] } = {}) => {
 
      func.result = void 0;
 
      func.finished = false;
 
      let completeScope = mergeProxies([scope2, ...dataStack]);
 
      if (typeof func === "function") {
 
        let promise = func(func, completeScope).catch((error2) => handleError(error2, el, expression));
 
        if (func.finished) {
 
          runIfTypeOfFunction(receiver, func.result, completeScope, params, el);
 
          func.result = void 0;
 
        } else {
 
          promise.then((result) => {
 
            runIfTypeOfFunction(receiver, result, completeScope, params, el);
 
          }).catch((error2) => handleError(error2, el, expression)).finally(() => func.result = void 0);
 
        }
 
      }
 
    };
 
  }
 
  function runIfTypeOfFunction(receiver, value, scope2, params, el) {
 
    if (shouldAutoEvaluateFunctions && typeof value === "function") {
 
      let result = value.apply(scope2, params);
 
      if (result instanceof Promise) {
 
        result.then((i) => runIfTypeOfFunction(receiver, i, scope2, params)).catch((error2) => handleError(error2, el, value));
 
      } else {
 
        receiver(result);
 
      }
 
    } else if (typeof value === "object" && value instanceof Promise) {
 
      value.then((i) => receiver(i));
 
    } else {
 
      receiver(value);
 
    }
 
  }
 

	
 
  // packages/alpinejs/src/directives.js
 
  var prefixAsString = "x-";
 
  function prefix(subject = "") {
 
    return prefixAsString + subject;
 
  }
 
  function setPrefix(newPrefix) {
 
    prefixAsString = newPrefix;
 
  }
 
  var directiveHandlers = {};
 
  function directive(name, callback) {
 
    directiveHandlers[name] = callback;
 
    return {
 
      before(directive2) {
 
        if (!directiveHandlers[directive2]) {
 
          console.warn(String.raw`Cannot find directive \`${directive2}\`. \`${name}\` will use the default order of execution`);
 
          return;
 
        }
 
        const pos = directiveOrder.indexOf(directive2);
 
        directiveOrder.splice(pos >= 0 ? pos : directiveOrder.indexOf("DEFAULT"), 0, name);
 
      }
 
    };
 
  }
 
  function directiveExists(name) {
 
    return Object.keys(directiveHandlers).includes(name);
 
  }
 
  function directives(el, attributes, originalAttributeOverride) {
 
    attributes = Array.from(attributes);
 
    if (el._x_virtualDirectives) {
 
      let vAttributes = Object.entries(el._x_virtualDirectives).map(([name, value]) => ({ name, value }));
 
      let staticAttributes = attributesOnly(vAttributes);
 
      vAttributes = vAttributes.map((attribute) => {
 
        if (staticAttributes.find((attr) => attr.name === attribute.name)) {
 
          return {
 
            name: `x-bind:${attribute.name}`,
 
            value: `"${attribute.value}"`
 
          };
 
        }
 
        return attribute;
 
      });
 
      attributes = attributes.concat(vAttributes);
 
    }
 
    let transformedAttributeMap = {};
 
    let directives2 = attributes.map(toTransformedAttributes((newName, oldName) => transformedAttributeMap[newName] = oldName)).filter(outNonAlpineAttributes).map(toParsedDirectives(transformedAttributeMap, originalAttributeOverride)).sort(byPriority);
 
    return directives2.map((directive2) => {
 
      return getDirectiveHandler(el, directive2);
 
    });
 
  }
 
  function attributesOnly(attributes) {
 
    return Array.from(attributes).map(toTransformedAttributes()).filter((attr) => !outNonAlpineAttributes(attr));
 
  }
 
  var isDeferringHandlers = false;
 
  var directiveHandlerStacks = /* @__PURE__ */ new Map();
 
  var currentHandlerStackKey = Symbol();
 
  function deferHandlingDirectives(callback) {
 
    isDeferringHandlers = true;
 
    let key = Symbol();
 
    currentHandlerStackKey = key;
 
    directiveHandlerStacks.set(key, []);
 
    let flushHandlers = () => {
 
      while (directiveHandlerStacks.get(key).length)
 
        directiveHandlerStacks.get(key).shift()();
 
      directiveHandlerStacks.delete(key);
 
    };
 
    let stopDeferring = () => {
 
      isDeferringHandlers = false;
 
      flushHandlers();
 
    };
 
    callback(flushHandlers);
 
    stopDeferring();
 
  }
 
  function getElementBoundUtilities(el) {
 
    let cleanups = [];
 
    let cleanup2 = (callback) => cleanups.push(callback);
 
    let [effect3, cleanupEffect] = elementBoundEffect(el);
 
    cleanups.push(cleanupEffect);
 
    let utilities = {
 
      Alpine: alpine_default,
 
      effect: effect3,
 
      cleanup: cleanup2,
 
      evaluateLater: evaluateLater.bind(evaluateLater, el),
 
      evaluate: evaluate.bind(evaluate, el)
 
    };
 
    let doCleanup = () => cleanups.forEach((i) => i());
 
    return [utilities, doCleanup];
 
  }
 
  function getDirectiveHandler(el, directive2) {
 
    let noop = () => {
 
    };
 
    let handler4 = directiveHandlers[directive2.type] || noop;
 
    let [utilities, cleanup2] = getElementBoundUtilities(el);
 
    onAttributeRemoved(el, directive2.original, cleanup2);
 
    let fullHandler = () => {
 
      if (el._x_ignore || el._x_ignoreSelf)
 
        return;
 
      handler4.inline && handler4.inline(el, directive2, utilities);
 
      handler4 = handler4.bind(handler4, el, directive2, utilities);
 
      isDeferringHandlers ? directiveHandlerStacks.get(currentHandlerStackKey).push(handler4) : handler4();
 
    };
 
    fullHandler.runCleanups = cleanup2;
 
    return fullHandler;
 
  }
 
  var startingWith = (subject, replacement) => ({ name, value }) => {
 
    if (name.startsWith(subject))
 
      name = name.replace(subject, replacement);
 
    return { name, value };
 
  };
 
  var into = (i) => i;
 
  function toTransformedAttributes(callback = () => {
 
  }) {
 
    return ({ name, value }) => {
 
      let { name: newName, value: newValue } = attributeTransformers.reduce((carry, transform) => {
 
        return transform(carry);
 
      }, { name, value });
 
      if (newName !== name)
 
        callback(newName, name);
 
      return { name: newName, value: newValue };
 
    };
 
  }
 
  var attributeTransformers = [];
 
  function mapAttributes(callback) {
 
    attributeTransformers.push(callback);
 
  }
 
  function outNonAlpineAttributes({ name }) {
 
    return alpineAttributeRegex().test(name);
 
  }
 
  var alpineAttributeRegex = () => new RegExp(`^${prefixAsString}([^:^.]+)\\b`);
 
  function toParsedDirectives(transformedAttributeMap, originalAttributeOverride) {
 
    return ({ name, value }) => {
 
      let typeMatch = name.match(alpineAttributeRegex());
 
      let valueMatch = name.match(/:([a-zA-Z0-9\-_:]+)/);
 
      let modifiers = name.match(/\.[^.\]]+(?=[^\]]*$)/g) || [];
 
      let original = originalAttributeOverride || transformedAttributeMap[name] || name;
 
      return {
 
        type: typeMatch ? typeMatch[1] : null,
 
        value: valueMatch ? valueMatch[1] : null,
 
        modifiers: modifiers.map((i) => i.replace(".", "")),
 
        expression: value,
 
        original
 
      };
 
    };
 
  }
 
  var DEFAULT = "DEFAULT";
 
  var directiveOrder = [
 
    "ignore",
 
    "ref",
 
    "data",
 
    "id",
 
    "anchor",
 
    "bind",
 
    "init",
 
    "for",
 
    "model",
 
    "modelable",
 
    "transition",
 
    "show",
 
    "if",
 
    DEFAULT,
 
    "teleport"
 
  ];
 
  function byPriority(a, b) {
 
    let typeA = directiveOrder.indexOf(a.type) === -1 ? DEFAULT : a.type;
 
    let typeB = directiveOrder.indexOf(b.type) === -1 ? DEFAULT : b.type;
 
    return directiveOrder.indexOf(typeA) - directiveOrder.indexOf(typeB);
 
  }
 

	
 
  // packages/alpinejs/src/utils/dispatch.js
 
  function dispatch(el, name, detail = {}) {
 
    el.dispatchEvent(
 
      new CustomEvent(name, {
 
        detail,
 
        bubbles: true,
 
        // Allows events to pass the shadow DOM barrier.
 
        composed: true,
 
        cancelable: true
 
      })
 
    );
 
  }
 

	
 
  // packages/alpinejs/src/utils/walk.js
 
  function walk(el, callback) {
 
    if (typeof ShadowRoot === "function" && el instanceof ShadowRoot) {
 
      Array.from(el.children).forEach((el2) => walk(el2, callback));
 
      return;
 
    }
 
    let skip = false;
 
    callback(el, () => skip = true);
 
    if (skip)
 
      return;
 
    let node = el.firstElementChild;
 
    while (node) {
 
      walk(node, callback, false);
 
      node = node.nextElementSibling;
 
    }
 
  }
 

	
 
  // packages/alpinejs/src/utils/warn.js
 
  function warn(message, ...args) {
 
    console.warn(`Alpine Warning: ${message}`, ...args);
 
  }
 

	
 
  // packages/alpinejs/src/lifecycle.js
 
  var started = false;
 
  function start() {
 
    if (started)
 
      warn("Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems.");
 
    started = true;
 
    if (!document.body)
 
      warn("Unable to initialize. Trying to load Alpine before `<body>` is available. Did you forget to add `defer` in Alpine's `<script>` tag?");
 
    dispatch(document, "alpine:init");
 
    dispatch(document, "alpine:initializing");
 
    startObservingMutations();
 
    onElAdded((el) => initTree(el, walk));
 
    onElRemoved((el) => destroyTree(el));
 
    onAttributesAdded((el, attrs) => {
 
      directives(el, attrs).forEach((handle) => handle());
 
    });
 
    let outNestedComponents = (el) => !closestRoot(el.parentElement, true);
 
    Array.from(document.querySelectorAll(allSelectors().join(","))).filter(outNestedComponents).forEach((el) => {
 
      initTree(el);
 
    });
 
    dispatch(document, "alpine:initialized");
 
    setTimeout(() => {
 
      warnAboutMissingPlugins();
 
    });
 
  }
 
  var rootSelectorCallbacks = [];
 
  var initSelectorCallbacks = [];
 
  function rootSelectors() {
 
    return rootSelectorCallbacks.map((fn) => fn());
 
  }
 
  function allSelectors() {
 
    return rootSelectorCallbacks.concat(initSelectorCallbacks).map((fn) => fn());
 
  }
 
  function addRootSelector(selectorCallback) {
 
    rootSelectorCallbacks.push(selectorCallback);
 
  }
 
  function addInitSelector(selectorCallback) {
 
    initSelectorCallbacks.push(selectorCallback);
 
  }
 
  function closestRoot(el, includeInitSelectors = false) {
 
    return findClosest(el, (element) => {
 
      const selectors = includeInitSelectors ? allSelectors() : rootSelectors();
 
      if (selectors.some((selector) => element.matches(selector)))
 
        return true;
 
    });
 
  }
 
  function findClosest(el, callback) {
 
    if (!el)
 
      return;
 
    if (callback(el))
 
      return el;
 
    if (el._x_teleportBack)
 
      el = el._x_teleportBack;
 
    if (!el.parentElement)
 
      return;
 
    return findClosest(el.parentElement, callback);
 
  }
 
  function isRoot(el) {
 
    return rootSelectors().some((selector) => el.matches(selector));
 
  }
 
  var initInterceptors2 = [];
 
  function interceptInit(callback) {
 
    initInterceptors2.push(callback);
 
  }
 
  function initTree(el, walker = walk, intercept = () => {
 
  }) {
 
    deferHandlingDirectives(() => {
 
      walker(el, (el2, skip) => {
 
        intercept(el2, skip);
 
        initInterceptors2.forEach((i) => i(el2, skip));
 
        directives(el2, el2.attributes).forEach((handle) => handle());
 
        el2._x_ignore && skip();
 
      });
 
    });
 
  }
 
  function destroyTree(root, walker = walk) {
 
    walker(root, (el) => {
 
      cleanupAttributes(el);
 
      cleanupElement(el);
 
    });
 
  }
 
  function warnAboutMissingPlugins() {
 
    let pluginDirectives = [
 
      ["ui", "dialog", ["[x-dialog], [x-popover]"]],
 
      ["anchor", "anchor", ["[x-anchor]"]],
 
      ["sort", "sort", ["[x-sort]"]]
 
    ];
 
    pluginDirectives.forEach(([plugin2, directive2, selectors]) => {
 
      if (directiveExists(directive2))
 
        return;
 
      selectors.some((selector) => {
 
        if (document.querySelector(selector)) {
 
          warn(`found "${selector}", but missing ${plugin2} plugin`);
 
          return true;
 
        }
 
      });
 
    });
 
  }
 

	
 
  // packages/alpinejs/src/nextTick.js
 
  var tickStack = [];
 
  var isHolding = false;
 
  function nextTick(callback = () => {
 
  }) {
 
    queueMicrotask(() => {
 
      isHolding || setTimeout(() => {
 
        releaseNextTicks();
 
      });
 
    });
 
    return new Promise((res) => {
 
      tickStack.push(() => {
 
        callback();
 
        res();
 
      });
 
    });
 
  }
 
  function releaseNextTicks() {
 
    isHolding = false;
 
    while (tickStack.length)
 
      tickStack.shift()();
 
  }
 
  function holdNextTicks() {
 
    isHolding = true;
 
  }
 

	
 
  // packages/alpinejs/src/utils/classes.js
 
  function setClasses(el, value) {
 
    if (Array.isArray(value)) {
 
      return setClassesFromString(el, value.join(" "));
 
    } else if (typeof value === "object" && value !== null) {
 
      return setClassesFromObject(el, value);
 
    } else if (typeof value === "function") {
 
      return setClasses(el, value());
 
    }
 
    return setClassesFromString(el, value);
 
  }
 
  function setClassesFromString(el, classString) {
 
    let split = (classString2) => classString2.split(" ").filter(Boolean);
 
    let missingClasses = (classString2) => classString2.split(" ").filter((i) => !el.classList.contains(i)).filter(Boolean);
 
    let addClassesAndReturnUndo = (classes) => {
 
      el.classList.add(...classes);
 
      return () => {
 
        el.classList.remove(...classes);
 
      };
 
    };
 
    classString = classString === true ? classString = "" : classString || "";
 
    return addClassesAndReturnUndo(missingClasses(classString));
 
  }
 
  function setClassesFromObject(el, classObject) {
 
    let split = (classString) => classString.split(" ").filter(Boolean);
 
    let forAdd = Object.entries(classObject).flatMap(([classString, bool]) => bool ? split(classString) : false).filter(Boolean);
 
    let forRemove = Object.entries(classObject).flatMap(([classString, bool]) => !bool ? split(classString) : false).filter(Boolean);
 
    let added = [];
 
    let removed = [];
 
    forRemove.forEach((i) => {
 
      if (el.classList.contains(i)) {
 
        el.classList.remove(i);
 
        removed.push(i);
 
      }
 
    });
 
    forAdd.forEach((i) => {
 
      if (!el.classList.contains(i)) {
 
        el.classList.add(i);
 
        added.push(i);
 
      }
 
    });
 
    return () => {
 
      removed.forEach((i) => el.classList.add(i));
 
      added.forEach((i) => el.classList.remove(i));
 
    };
 
  }
 

	
 
  // packages/alpinejs/src/utils/styles.js
 
  function setStyles(el, value) {
 
    if (typeof value === "object" && value !== null) {
 
      return setStylesFromObject(el, value);
 
    }
 
    return setStylesFromString(el, value);
 
  }
 
  function setStylesFromObject(el, value) {
 
    let previousStyles = {};
 
    Object.entries(value).forEach(([key, value2]) => {
 
      previousStyles[key] = el.style[key];
 
      if (!key.startsWith("--")) {
 
        key = kebabCase(key);
 
      }
 
      el.style.setProperty(key, value2);
 
    });
 
    setTimeout(() => {
 
      if (el.style.length === 0) {
 
        el.removeAttribute("style");
 
      }
 
    });
 
    return () => {
 
      setStyles(el, previousStyles);
 
    };
 
  }
 
  function setStylesFromString(el, value) {
 
    let cache = el.getAttribute("style", value);
 
    el.setAttribute("style", value);
 
    return () => {
 
      el.setAttribute("style", cache || "");
 
    };
 
  }
 
  function kebabCase(subject) {
 
    return subject.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
 
  }
 

	
 
  // packages/alpinejs/src/utils/once.js
 
  function once(callback, fallback = () => {
 
  }) {
 
    let called = false;
 
    return function() {
 
      if (!called) {
 
        called = true;
 
        callback.apply(this, arguments);
 
      } else {
 
        fallback.apply(this, arguments);
 
      }
 
    };
 
  }
 

	
 
  // packages/alpinejs/src/directives/x-transition.js
 
  directive("transition", (el, { value, modifiers, expression }, { evaluate: evaluate2 }) => {
 
    if (typeof expression === "function")
 
      expression = evaluate2(expression);
 
    if (expression === false)
 
      return;
 
    if (!expression || typeof expression === "boolean") {
 
      registerTransitionsFromHelper(el, modifiers, value);
 
    } else {
 
      registerTransitionsFromClassString(el, expression, value);
 
    }
 
  });
 
  function registerTransitionsFromClassString(el, classString, stage) {
 
    registerTransitionObject(el, setClasses, "");
 
    let directiveStorageMap = {
 
      "enter": (classes) => {
 
        el._x_transition.enter.during = classes;
 
      },
 
      "enter-start": (classes) => {
 
        el._x_transition.enter.start = classes;
 
      },
 
      "enter-end": (classes) => {
 
        el._x_transition.enter.end = classes;
 
      },
 
      "leave": (classes) => {
 
        el._x_transition.leave.during = classes;
 
      },
 
      "leave-start": (classes) => {
 
        el._x_transition.leave.start = classes;
 
      },
 
      "leave-end": (classes) => {
 
        el._x_transition.leave.end = classes;
 
      }
 
    };
 
    directiveStorageMap[stage](classString);
 
  }
 
  function registerTransitionsFromHelper(el, modifiers, stage) {
 
    registerTransitionObject(el, setStyles);
 
    let doesntSpecify = !modifiers.includes("in") && !modifiers.includes("out") && !stage;
 
    let transitioningIn = doesntSpecify || modifiers.includes("in") || ["enter"].includes(stage);
 
    let transitioningOut = doesntSpecify || modifiers.includes("out") || ["leave"].includes(stage);
 
    if (modifiers.includes("in") && !doesntSpecify) {
 
      modifiers = modifiers.filter((i, index) => index < modifiers.indexOf("out"));
 
    }
 
    if (modifiers.includes("out") && !doesntSpecify) {
 
      modifiers = modifiers.filter((i, index) => index > modifiers.indexOf("out"));
 
    }
 
    let wantsAll = !modifiers.includes("opacity") && !modifiers.includes("scale");
 
    let wantsOpacity = wantsAll || modifiers.includes("opacity");
 
    let wantsScale = wantsAll || modifiers.includes("scale");
 
    let opacityValue = wantsOpacity ? 0 : 1;
 
    let scaleValue = wantsScale ? modifierValue(modifiers, "scale", 95) / 100 : 1;
 
    let delay = modifierValue(modifiers, "delay", 0) / 1e3;
 
    let origin = modifierValue(modifiers, "origin", "center");
 
    let property = "opacity, transform";
 
    let durationIn = modifierValue(modifiers, "duration", 150) / 1e3;
 
    let durationOut = modifierValue(modifiers, "duration", 75) / 1e3;
 
    let easing = `cubic-bezier(0.4, 0.0, 0.2, 1)`;
 
    if (transitioningIn) {
 
      el._x_transition.enter.during = {
 
        transformOrigin: origin,
 
        transitionDelay: `${delay}s`,
 
        transitionProperty: property,
 
        transitionDuration: `${durationIn}s`,
 
        transitionTimingFunction: easing
 
      };
 
      el._x_transition.enter.start = {
 
        opacity: opacityValue,
 
        transform: `scale(${scaleValue})`
 
      };
 
      el._x_transition.enter.end = {
 
        opacity: 1,
 
        transform: `scale(1)`
 
      };
 
    }
 
    if (transitioningOut) {
 
      el._x_transition.leave.during = {
 
        transformOrigin: origin,
 
        transitionDelay: `${delay}s`,
 
        transitionProperty: property,
 
        transitionDuration: `${durationOut}s`,
 
        transitionTimingFunction: easing
 
      };
 
      el._x_transition.leave.start = {
 
        opacity: 1,
 
        transform: `scale(1)`
 
      };
 
      el._x_transition.leave.end = {
 
        opacity: opacityValue,
 
        transform: `scale(${scaleValue})`
 
      };
 
    }
 
  }
 
  function registerTransitionObject(el, setFunction, defaultValue = {}) {
 
    if (!el._x_transition)
 
      el._x_transition = {
 
        enter: { during: defaultValue, start: defaultValue, end: defaultValue },
 
        leave: { during: defaultValue, start: defaultValue, end: defaultValue },
 
        in(before = () => {
 
        }, after = () => {
 
        }) {
 
          transition(el, setFunction, {
 
            during: this.enter.during,
 
            start: this.enter.start,
 
            end: this.enter.end
 
          }, before, after);
 
        },
 
        out(before = () => {
 
        }, after = () => {
 
        }) {
 
          transition(el, setFunction, {
 
            during: this.leave.during,
 
            start: this.leave.start,
 
            end: this.leave.end
 
          }, before, after);
 
        }
 
      };
 
  }
 
  window.Element.prototype._x_toggleAndCascadeWithTransitions = function(el, value, show, hide) {
 
    const nextTick2 = document.visibilityState === "visible" ? requestAnimationFrame : setTimeout;
 
    let clickAwayCompatibleShow = () => nextTick2(show);
 
    if (value) {
 
      if (el._x_transition && (el._x_transition.enter || el._x_transition.leave)) {
 
        el._x_transition.enter && (Object.entries(el._x_transition.enter.during).length || Object.entries(el._x_transition.enter.start).length || Object.entries(el._x_transition.enter.end).length) ? el._x_transition.in(show) : clickAwayCompatibleShow();
 
      } else {
 
        el._x_transition ? el._x_transition.in(show) : clickAwayCompatibleShow();
 
      }
 
      return;
 
    }
 
    el._x_hidePromise = el._x_transition ? new Promise((resolve, reject) => {
 
      el._x_transition.out(() => {
 
      }, () => resolve(hide));
 
      el._x_transitioning && el._x_transitioning.beforeCancel(() => reject({ isFromCancelledTransition: true }));
 
    }) : Promise.resolve(hide);
 
    queueMicrotask(() => {
 
      let closest = closestHide(el);
 
      if (closest) {
 
        if (!closest._x_hideChildren)
 
          closest._x_hideChildren = [];
 
        closest._x_hideChildren.push(el);
 
      } else {
 
        nextTick2(() => {
 
          let hideAfterChildren = (el2) => {
 
            let carry = Promise.all([
 
              el2._x_hidePromise,
 
              ...(el2._x_hideChildren || []).map(hideAfterChildren)
 
            ]).then(([i]) => i?.());
 
            delete el2._x_hidePromise;
 
            delete el2._x_hideChildren;
 
            return carry;
 
          };
 
          hideAfterChildren(el).catch((e) => {
 
            if (!e.isFromCancelledTransition)
 
              throw e;
 
          });
 
        });
 
      }
 
    });
 
  };
 
  function closestHide(el) {
 
    let parent = el.parentNode;
 
    if (!parent)
 
      return;
 
    return parent._x_hidePromise ? parent : closestHide(parent);
 
  }
 
  function transition(el, setFunction, { during, start: start2, end } = {}, before = () => {
 
  }, after = () => {
 
  }) {
 
    if (el._x_transitioning)
 
      el._x_transitioning.cancel();
 
    if (Object.keys(during).length === 0 && Object.keys(start2).length === 0 && Object.keys(end).length === 0) {
 
      before();
 
      after();
 
      return;
 
    }
 
    let undoStart, undoDuring, undoEnd;
 
    performTransition(el, {
 
      start() {
 
        undoStart = setFunction(el, start2);
 
      },
 
      during() {
 
        undoDuring = setFunction(el, during);
 
      },
 
      before,
 
      end() {
 
        undoStart();
 
        undoEnd = setFunction(el, end);
 
      },
 
      after,
 
      cleanup() {
 
        undoDuring();
 
        undoEnd();
 
      }
 
    });
 
  }
 
  function performTransition(el, stages) {
 
    let interrupted, reachedBefore, reachedEnd;
 
    let finish = once(() => {
 
      mutateDom(() => {
 
        interrupted = true;
 
        if (!reachedBefore)
 
          stages.before();
 
        if (!reachedEnd) {
 
          stages.end();
 
          releaseNextTicks();
 
        }
 
        stages.after();
 
        if (el.isConnected)
 
          stages.cleanup();
 
        delete el._x_transitioning;
 
      });
 
    });
 
    el._x_transitioning = {
 
      beforeCancels: [],
 
      beforeCancel(callback) {
 
        this.beforeCancels.push(callback);
 
      },
 
      cancel: once(function() {
 
        while (this.beforeCancels.length) {
 
          this.beforeCancels.shift()();
 
        }
 
        ;
 
        finish();
 
      }),
 
      finish
 
    };
 
    mutateDom(() => {
 
      stages.start();
 
      stages.during();
 
    });
 
    holdNextTicks();
 
    requestAnimationFrame(() => {
 
      if (interrupted)
 
        return;
 
      let duration = Number(getComputedStyle(el).transitionDuration.replace(/,.*/, "").replace("s", "")) * 1e3;
 
      let delay = Number(getComputedStyle(el).transitionDelay.replace(/,.*/, "").replace("s", "")) * 1e3;
 
      if (duration === 0)
 
        duration = Number(getComputedStyle(el).animationDuration.replace("s", "")) * 1e3;
 
      mutateDom(() => {
 
        stages.before();
 
      });
 
      reachedBefore = true;
 
      requestAnimationFrame(() => {
 
        if (interrupted)
 
          return;
 
        mutateDom(() => {
 
          stages.end();
 
        });
 
        releaseNextTicks();
 
        setTimeout(el._x_transitioning.finish, duration + delay);
 
        reachedEnd = true;
 
      });
 
    });
 
  }
 
  function modifierValue(modifiers, key, fallback) {
 
    if (modifiers.indexOf(key) === -1)
 
      return fallback;
 
    const rawValue = modifiers[modifiers.indexOf(key) + 1];
 
    if (!rawValue)
 
      return fallback;
 
    if (key === "scale") {
 
      if (isNaN(rawValue))
 
        return fallback;
 
    }
 
    if (key === "duration" || key === "delay") {
 
      let match = rawValue.match(/([0-9]+)ms/);
 
      if (match)
 
        return match[1];
 
    }
 
    if (key === "origin") {
 
      if (["top", "right", "left", "center", "bottom"].includes(modifiers[modifiers.indexOf(key) + 2])) {
 
        return [rawValue, modifiers[modifiers.indexOf(key) + 2]].join(" ");
 
      }
 
    }
 
    return rawValue;
 
  }
 

	
 
  // packages/alpinejs/src/clone.js
 
  var isCloning = false;
 
  function skipDuringClone(callback, fallback = () => {
 
  }) {
 
    return (...args) => isCloning ? fallback(...args) : callback(...args);
 
  }
 
  function onlyDuringClone(callback) {
 
    return (...args) => isCloning && callback(...args);
 
  }
 
  var interceptors = [];
 
  function interceptClone(callback) {
 
    interceptors.push(callback);
 
  }
 
  function cloneNode(from, to) {
 
    interceptors.forEach((i) => i(from, to));
 
    isCloning = true;
 
    dontRegisterReactiveSideEffects(() => {
 
      initTree(to, (el, callback) => {
 
        callback(el, () => {
 
        });
 
      });
 
    });
 
    isCloning = false;
 
  }
 
  var isCloningLegacy = false;
 
  function clone(oldEl, newEl) {
 
    if (!newEl._x_dataStack)
 
      newEl._x_dataStack = oldEl._x_dataStack;
 
    isCloning = true;
 
    isCloningLegacy = true;
 
    dontRegisterReactiveSideEffects(() => {
 
      cloneTree(newEl);
 
    });
 
    isCloning = false;
 
    isCloningLegacy = false;
 
  }
 
  function cloneTree(el) {
 
    let hasRunThroughFirstEl = false;
 
    let shallowWalker = (el2, callback) => {
 
      walk(el2, (el3, skip) => {
 
        if (hasRunThroughFirstEl && isRoot(el3))
 
          return skip();
 
        hasRunThroughFirstEl = true;
 
        callback(el3, skip);
 
      });
 
    };
 
    initTree(el, shallowWalker);
 
  }
 
  function dontRegisterReactiveSideEffects(callback) {
 
    let cache = effect;
 
    overrideEffect((callback2, el) => {
 
      let storedEffect = cache(callback2);
 
      release(storedEffect);
 
      return () => {
 
      };
 
    });
 
    callback();
 
    overrideEffect(cache);
 
  }
 

	
 
  // packages/alpinejs/src/utils/bind.js
 
  function bind(el, name, value, modifiers = []) {
 
    if (!el._x_bindings)
 
      el._x_bindings = reactive({});
 
    el._x_bindings[name] = value;
 
    name = modifiers.includes("camel") ? camelCase(name) : name;
 
    switch (name) {
 
      case "value":
 
        bindInputValue(el, value);
 
        break;
 
      case "style":
 
        bindStyles(el, value);
 
        break;
 
      case "class":
 
        bindClasses(el, value);
 
        break;
 
      case "selected":
 
      case "checked":
 
        bindAttributeAndProperty(el, name, value);
 
        break;
 
      default:
 
        bindAttribute(el, name, value);
 
        break;
 
    }
 
  }
 
  function bindInputValue(el, value) {
 
    if (el.type === "radio") {
 
      if (el.attributes.value === void 0) {
 
        el.value = value;
 
      }
 
      if (window.fromModel) {
 
        if (typeof value === "boolean") {
 
          el.checked = safeParseBoolean(el.value) === value;
 
        } else {
 
          el.checked = checkedAttrLooseCompare(el.value, value);
 
        }
 
      }
 
    } else if (el.type === "checkbox") {
 
      if (Number.isInteger(value)) {
 
        el.value = value;
 
      } else if (!Array.isArray(value) && typeof value !== "boolean" && ![null, void 0].includes(value)) {
 
        el.value = String(value);
 
      } else {
 
        if (Array.isArray(value)) {
 
          el.checked = value.some((val) => checkedAttrLooseCompare(val, el.value));
 
        } else {
 
          el.checked = !!value;
 
        }
 
      }
 
    } else if (el.tagName === "SELECT") {
 
      updateSelect(el, value);
 
    } else {
 
      if (el.value === value)
 
        return;
 
      el.value = value === void 0 ? "" : value;
 
    }
 
  }
 
  function bindClasses(el, value) {
 
    if (el._x_undoAddedClasses)
 
      el._x_undoAddedClasses();
 
    el._x_undoAddedClasses = setClasses(el, value);
 
  }
 
  function bindStyles(el, value) {
 
    if (el._x_undoAddedStyles)
 
      el._x_undoAddedStyles();
 
    el._x_undoAddedStyles = setStyles(el, value);
 
  }
 
  function bindAttributeAndProperty(el, name, value) {
 
    bindAttribute(el, name, value);
 
    setPropertyIfChanged(el, name, value);
 
  }
 
  function bindAttribute(el, name, value) {
 
    if ([null, void 0, false].includes(value) && attributeShouldntBePreservedIfFalsy(name)) {
 
      el.removeAttribute(name);
 
    } else {
 
      if (isBooleanAttr(name))
 
        value = name;
 
      setIfChanged(el, name, value);
 
    }
 
  }
 
  function setIfChanged(el, attrName, value) {
 
    if (el.getAttribute(attrName) != value) {
 
      el.setAttribute(attrName, value);
 
    }
 
  }
 
  function setPropertyIfChanged(el, propName, value) {
 
    if (el[propName] !== value) {
 
      el[propName] = value;
 
    }
 
  }
 
  function updateSelect(el, value) {
 
    const arrayWrappedValue = [].concat(value).map((value2) => {
 
      return value2 + "";
 
    });
 
    Array.from(el.options).forEach((option) => {
 
      option.selected = arrayWrappedValue.includes(option.value);
 
    });
 
  }
 
  function camelCase(subject) {
 
    return subject.toLowerCase().replace(/-(\w)/g, (match, char) => char.toUpperCase());
 
  }
 
  function checkedAttrLooseCompare(valueA, valueB) {
 
    return valueA == valueB;
 
  }
 
  function safeParseBoolean(rawValue) {
 
    if ([1, "1", "true", "on", "yes", true].includes(rawValue)) {
 
      return true;
 
    }
 
    if ([0, "0", "false", "off", "no", false].includes(rawValue)) {
 
      return false;
 
    }
 
    return rawValue ? Boolean(rawValue) : null;
 
  }
 
  function isBooleanAttr(attrName) {
 
    const booleanAttributes = [
 
      "disabled",
 
      "checked",
 
      "required",
 
      "readonly",
 
      "open",
 
      "selected",
 
      "autofocus",
 
      "itemscope",
 
      "multiple",
 
      "novalidate",
 
      "allowfullscreen",
 
      "allowpaymentrequest",
 
      "formnovalidate",
 
      "autoplay",
 
      "controls",
 
      "loop",
 
      "muted",
 
      "playsinline",
 
      "default",
 
      "ismap",
 
      "reversed",
 
      "async",
 
      "defer",
 
      "nomodule"
 
    ];
 
    return booleanAttributes.includes(attrName);
 
  }
 
  function attributeShouldntBePreservedIfFalsy(name) {
 
    return !["aria-pressed", "aria-checked", "aria-expanded", "aria-selected"].includes(name);
 
  }
 
  function getBinding(el, name, fallback) {
 
    if (el._x_bindings && el._x_bindings[name] !== void 0)
 
      return el._x_bindings[name];
 
    return getAttributeBinding(el, name, fallback);
 
  }
 
  function extractProp(el, name, fallback, extract = true) {
 
    if (el._x_bindings && el._x_bindings[name] !== void 0)
 
      return el._x_bindings[name];
 
    if (el._x_inlineBindings && el._x_inlineBindings[name] !== void 0) {
 
      let binding = el._x_inlineBindings[name];
 
      binding.extract = extract;
 
      return dontAutoEvaluateFunctions(() => {
 
        return evaluate(el, binding.expression);
 
      });
 
    }
 
    return getAttributeBinding(el, name, fallback);
 
  }
 
  function getAttributeBinding(el, name, fallback) {
 
    let attr = el.getAttribute(name);
 
    if (attr === null)
 
      return typeof fallback === "function" ? fallback() : fallback;
 
    if (attr === "")
 
      return true;
 
    if (isBooleanAttr(name)) {
 
      return !![name, "true"].includes(attr);
 
    }
 
    return attr;
 
  }
 

	
 
  // packages/alpinejs/src/utils/debounce.js
 
  function debounce(func, wait) {
 
    var timeout;
 
    return function() {
 
      var context = this, args = arguments;
 
      var later = function() {
 
        timeout = null;
 
        func.apply(context, args);
 
      };
 
      clearTimeout(timeout);
 
      timeout = setTimeout(later, wait);
 
    };
 
  }
 

	
 
  // packages/alpinejs/src/utils/throttle.js
 
  function throttle(func, limit) {
 
    let inThrottle;
 
    return function() {
 
      let context = this, args = arguments;
 
      if (!inThrottle) {
 
        func.apply(context, args);
 
        inThrottle = true;
 
        setTimeout(() => inThrottle = false, limit);
 
      }
 
    };
 
  }
 

	
 
  // packages/alpinejs/src/entangle.js
 
  function entangle({ get: outerGet, set: outerSet }, { get: innerGet, set: innerSet }) {
 
    let firstRun = true;
 
    let outerHash;
 
    let innerHash;
 
    let reference = effect(() => {
 
      let outer = outerGet();
 
      let inner = innerGet();
 
      if (firstRun) {
 
        innerSet(cloneIfObject(outer));
 
        firstRun = false;
 
      } else {
 
        let outerHashLatest = JSON.stringify(outer);
 
        let innerHashLatest = JSON.stringify(inner);
 
        if (outerHashLatest !== outerHash) {
 
          innerSet(cloneIfObject(outer));
 
        } else if (outerHashLatest !== innerHashLatest) {
 
          outerSet(cloneIfObject(inner));
 
        } else {
 
        }
 
      }
 
      outerHash = JSON.stringify(outerGet());
 
      innerHash = JSON.stringify(innerGet());
 
    });
 
    return () => {
 
      release(reference);
 
    };
 
  }
 
  function cloneIfObject(value) {
 
    return typeof value === "object" ? JSON.parse(JSON.stringify(value)) : value;
 
  }
 

	
 
  // packages/alpinejs/src/plugin.js
 
  function plugin(callback) {
 
    let callbacks = Array.isArray(callback) ? callback : [callback];
 
    callbacks.forEach((i) => i(alpine_default));
 
  }
 

	
 
  // packages/alpinejs/src/store.js
 
  var stores = {};
 
  var isReactive = false;
 
  function store(name, value) {
 
    if (!isReactive) {
 
      stores = reactive(stores);
 
      isReactive = true;
 
    }
 
    if (value === void 0) {
 
      return stores[name];
 
    }
 
    stores[name] = value;
 
    if (typeof value === "object" && value !== null && value.hasOwnProperty("init") && typeof value.init === "function") {
 
      stores[name].init();
 
    }
 
    initInterceptors(stores[name]);
 
  }
 
  function getStores() {
 
    return stores;
 
  }
 

	
 
  // packages/alpinejs/src/binds.js
 
  var binds = {};
 
  function bind2(name, bindings) {
 
    let getBindings = typeof bindings !== "function" ? () => bindings : bindings;
 
    if (name instanceof Element) {
 
      return applyBindingsObject(name, getBindings());
 
    } else {
 
      binds[name] = getBindings;
 
    }
 
    return () => {
 
    };
 
  }
 
  function injectBindingProviders(obj) {
 
    Object.entries(binds).forEach(([name, callback]) => {
 
      Object.defineProperty(obj, name, {
 
        get() {
 
          return (...args) => {
 
            return callback(...args);
 
          };
 
        }
 
      });
 
    });
 
    return obj;
 
  }
 
  function applyBindingsObject(el, obj, original) {
 
    let cleanupRunners = [];
 
    while (cleanupRunners.length)
 
      cleanupRunners.pop()();
 
    let attributes = Object.entries(obj).map(([name, value]) => ({ name, value }));
 
    let staticAttributes = attributesOnly(attributes);
 
    attributes = attributes.map((attribute) => {
 
      if (staticAttributes.find((attr) => attr.name === attribute.name)) {
 
        return {
 
          name: `x-bind:${attribute.name}`,
 
          value: `"${attribute.value}"`
 
        };
 
      }
 
      return attribute;
 
    });
 
    directives(el, attributes, original).map((handle) => {
 
      cleanupRunners.push(handle.runCleanups);
 
      handle();
 
    });
 
    return () => {
 
      while (cleanupRunners.length)
 
        cleanupRunners.pop()();
 
    };
 
  }
 

	
 
  // packages/alpinejs/src/datas.js
 
  var datas = {};
 
  function data(name, callback) {
 
    datas[name] = callback;
 
  }
 
  function injectDataProviders(obj, context) {
 
    Object.entries(datas).forEach(([name, callback]) => {
 
      Object.defineProperty(obj, name, {
 
        get() {
 
          return (...args) => {
 
            return callback.bind(context)(...args);
 
          };
 
        },
 
        enumerable: false
 
      });
 
    });
 
    return obj;
 
  }
 

	
 
  // packages/alpinejs/src/alpine.js
 
  var Alpine = {
 
    get reactive() {
 
      return reactive;
 
    },
 
    get release() {
 
      return release;
 
    },
 
    get effect() {
 
      return effect;
 
    },
 
    get raw() {
 
      return raw;
 
    },
 
    version: "3.14.1",
 
    flushAndStopDeferringMutations,
 
    dontAutoEvaluateFunctions,
 
    disableEffectScheduling,
 
    startObservingMutations,
 
    stopObservingMutations,
 
    setReactivityEngine,
 
    onAttributeRemoved,
 
    onAttributesAdded,
 
    closestDataStack,
 
    skipDuringClone,
 
    onlyDuringClone,
 
    addRootSelector,
 
    addInitSelector,
 
    interceptClone,
 
    addScopeToNode,
 
    deferMutations,
 
    mapAttributes,
 
    evaluateLater,
 
    interceptInit,
 
    setEvaluator,
 
    mergeProxies,
 
    extractProp,
 
    findClosest,
 
    onElRemoved,
 
    closestRoot,
 
    destroyTree,
 
    interceptor,
 
    // INTERNAL: not public API and is subject to change without major release.
 
    transition,
 
    // INTERNAL
 
    setStyles,
 
    // INTERNAL
 
    mutateDom,
 
    directive,
 
    entangle,
 
    throttle,
 
    debounce,
 
    evaluate,
 
    initTree,
 
    nextTick,
 
    prefixed: prefix,
 
    prefix: setPrefix,
 
    plugin,
 
    magic,
 
    store,
 
    start,
 
    clone,
 
    // INTERNAL
 
    cloneNode,
 
    // INTERNAL
 
    bound: getBinding,
 
    $data: scope,
 
    watch,
 
    walk,
 
    data,
 
    bind: bind2
 
  };
 
  var alpine_default = Alpine;
 

	
 
  // node_modules/@vue/shared/dist/shared.esm-bundler.js
 
  function makeMap(str, expectsLowerCase) {
 
    const map = /* @__PURE__ */ Object.create(null);
 
    const list = str.split(",");
 
    for (let i = 0; i < list.length; i++) {
 
      map[list[i]] = true;
 
    }
 
    return expectsLowerCase ? (val) => !!map[val.toLowerCase()] : (val) => !!map[val];
 
  }
 
  var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;
 
  var isBooleanAttr2 = /* @__PURE__ */ makeMap(specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`);
 
  var EMPTY_OBJ = true ? Object.freeze({}) : {};
 
  var EMPTY_ARR = true ? Object.freeze([]) : [];
 
  var hasOwnProperty = Object.prototype.hasOwnProperty;
 
  var hasOwn = (val, key) => hasOwnProperty.call(val, key);
 
  var isArray = Array.isArray;
 
  var isMap = (val) => toTypeString(val) === "[object Map]";
 
  var isString = (val) => typeof val === "string";
 
  var isSymbol = (val) => typeof val === "symbol";
 
  var isObject = (val) => val !== null && typeof val === "object";
 
  var objectToString = Object.prototype.toString;
 
  var toTypeString = (value) => objectToString.call(value);
 
  var toRawType = (value) => {
 
    return toTypeString(value).slice(8, -1);
 
  };
 
  var isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key;
 
  var cacheStringFunction = (fn) => {
 
    const cache = /* @__PURE__ */ Object.create(null);
 
    return (str) => {
 
      const hit = cache[str];
 
      return hit || (cache[str] = fn(str));
 
    };
 
  };
 
  var camelizeRE = /-(\w)/g;
 
  var camelize = cacheStringFunction((str) => {
 
    return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : "");
 
  });
 
  var hyphenateRE = /\B([A-Z])/g;
 
  var hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, "-$1").toLowerCase());
 
  var capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1));
 
  var toHandlerKey = cacheStringFunction((str) => str ? `on${capitalize(str)}` : ``);
 
  var hasChanged = (value, oldValue) => value !== oldValue && (value === value || oldValue === oldValue);
 

	
 
  // node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js
 
  var targetMap = /* @__PURE__ */ new WeakMap();
 
  var effectStack = [];
 
  var activeEffect;
 
  var ITERATE_KEY = Symbol(true ? "iterate" : "");
 
  var MAP_KEY_ITERATE_KEY = Symbol(true ? "Map key iterate" : "");
 
  function isEffect(fn) {
 
    return fn && fn._isEffect === true;
 
  }
 
  function effect2(fn, options = EMPTY_OBJ) {
 
    if (isEffect(fn)) {
 
      fn = fn.raw;
 
    }
 
    const effect3 = createReactiveEffect(fn, options);
 
    if (!options.lazy) {
 
      effect3();
 
    }
 
    return effect3;
 
  }
 
  function stop(effect3) {
 
    if (effect3.active) {
 
      cleanup(effect3);
 
      if (effect3.options.onStop) {
 
        effect3.options.onStop();
 
      }
 
      effect3.active = false;
 
    }
 
  }
 
  var uid = 0;
 
  function createReactiveEffect(fn, options) {
 
    const effect3 = function reactiveEffect() {
 
      if (!effect3.active) {
 
        return fn();
 
      }
 
      if (!effectStack.includes(effect3)) {
 
        cleanup(effect3);
 
        try {
 
          enableTracking();
 
          effectStack.push(effect3);
 
          activeEffect = effect3;
 
          return fn();
 
        } finally {
 
          effectStack.pop();
 
          resetTracking();
 
          activeEffect = effectStack[effectStack.length - 1];
 
        }
 
      }
 
    };
 
    effect3.id = uid++;
 
    effect3.allowRecurse = !!options.allowRecurse;
 
    effect3._isEffect = true;
 
    effect3.active = true;
 
    effect3.raw = fn;
 
    effect3.deps = [];
 
    effect3.options = options;
 
    return effect3;
 
  }
 
  function cleanup(effect3) {
 
    const { deps } = effect3;
 
    if (deps.length) {
 
      for (let i = 0; i < deps.length; i++) {
 
        deps[i].delete(effect3);
 
      }
 
      deps.length = 0;
 
    }
 
  }
 
  var shouldTrack = true;
 
  var trackStack = [];
 
  function pauseTracking() {
 
    trackStack.push(shouldTrack);
 
    shouldTrack = false;
 
  }
 
  function enableTracking() {
 
    trackStack.push(shouldTrack);
 
    shouldTrack = true;
 
  }
 
  function resetTracking() {
 
    const last = trackStack.pop();
 
    shouldTrack = last === void 0 ? true : last;
 
  }
 
  function track(target, type, key) {
 
    if (!shouldTrack || activeEffect === void 0) {
 
      return;
 
    }
 
    let depsMap = targetMap.get(target);
 
    if (!depsMap) {
 
      targetMap.set(target, depsMap = /* @__PURE__ */ new Map());
 
    }
 
    let dep = depsMap.get(key);
 
    if (!dep) {
 
      depsMap.set(key, dep = /* @__PURE__ */ new Set());
 
    }
 
    if (!dep.has(activeEffect)) {
 
      dep.add(activeEffect);
 
      activeEffect.deps.push(dep);
 
      if (activeEffect.options.onTrack) {
 
        activeEffect.options.onTrack({
 
          effect: activeEffect,
 
          target,
 
          type,
 
          key
 
        });
 
      }
 
    }
 
  }
 
  function trigger(target, type, key, newValue, oldValue, oldTarget) {
 
    const depsMap = targetMap.get(target);
 
    if (!depsMap) {
 
      return;
 
    }
 
    const effects = /* @__PURE__ */ new Set();
 
    const add2 = (effectsToAdd) => {
 
      if (effectsToAdd) {
 
        effectsToAdd.forEach((effect3) => {
 
          if (effect3 !== activeEffect || effect3.allowRecurse) {
 
            effects.add(effect3);
 
          }
 
        });
 
      }
 
    };
 
    if (type === "clear") {
 
      depsMap.forEach(add2);
 
    } else if (key === "length" && isArray(target)) {
 
      depsMap.forEach((dep, key2) => {
 
        if (key2 === "length" || key2 >= newValue) {
 
          add2(dep);
 
        }
 
      });
 
    } else {
 
      if (key !== void 0) {
 
        add2(depsMap.get(key));
 
      }
 
      switch (type) {
 
        case "add":
 
          if (!isArray(target)) {
 
            add2(depsMap.get(ITERATE_KEY));
 
            if (isMap(target)) {
 
              add2(depsMap.get(MAP_KEY_ITERATE_KEY));
 
            }
 
          } else if (isIntegerKey(key)) {
 
            add2(depsMap.get("length"));
 
          }
 
          break;
 
        case "delete":
 
          if (!isArray(target)) {
 
            add2(depsMap.get(ITERATE_KEY));
 
            if (isMap(target)) {
 
              add2(depsMap.get(MAP_KEY_ITERATE_KEY));
 
            }
 
          }
 
          break;
 
        case "set":
 
          if (isMap(target)) {
 
            add2(depsMap.get(ITERATE_KEY));
 
          }
 
          break;
 
      }
 
    }
 
    const run = (effect3) => {
 
      if (effect3.options.onTrigger) {
 
        effect3.options.onTrigger({
 
          effect: effect3,
 
          target,
 
          key,
 
          type,
 
          newValue,
 
          oldValue,
 
          oldTarget
 
        });
 
      }
 
      if (effect3.options.scheduler) {
 
        effect3.options.scheduler(effect3);
 
      } else {
 
        effect3();
 
      }
 
    };
 
    effects.forEach(run);
 
  }
 
  var isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);
 
  var builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).map((key) => Symbol[key]).filter(isSymbol));
 
  var get2 = /* @__PURE__ */ createGetter();
 
  var readonlyGet = /* @__PURE__ */ createGetter(true);
 
  var arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();
 
  function createArrayInstrumentations() {
 
    const instrumentations = {};
 
    ["includes", "indexOf", "lastIndexOf"].forEach((key) => {
 
      instrumentations[key] = function(...args) {
 
        const arr = toRaw(this);
 
        for (let i = 0, l = this.length; i < l; i++) {
 
          track(arr, "get", i + "");
 
        }
 
        const res = arr[key](...args);
 
        if (res === -1 || res === false) {
 
          return arr[key](...args.map(toRaw));
 
        } else {
 
          return res;
 
        }
 
      };
 
    });
 
    ["push", "pop", "shift", "unshift", "splice"].forEach((key) => {
 
      instrumentations[key] = function(...args) {
 
        pauseTracking();
 
        const res = toRaw(this)[key].apply(this, args);
 
        resetTracking();
 
        return res;
 
      };
 
    });
 
    return instrumentations;
 
  }
 
  function createGetter(isReadonly = false, shallow = false) {
 
    return function get3(target, key, receiver) {
 
      if (key === "__v_isReactive") {
 
        return !isReadonly;
 
      } else if (key === "__v_isReadonly") {
 
        return isReadonly;
 
      } else if (key === "__v_raw" && receiver === (isReadonly ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) {
 
        return target;
 
      }
 
      const targetIsArray = isArray(target);
 
      if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) {
 
        return Reflect.get(arrayInstrumentations, key, receiver);
 
      }
 
      const res = Reflect.get(target, key, receiver);
 
      if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
 
        return res;
 
      }
 
      if (!isReadonly) {
 
        track(target, "get", key);
 
      }
 
      if (shallow) {
 
        return res;
 
      }
 
      if (isRef(res)) {
 
        const shouldUnwrap = !targetIsArray || !isIntegerKey(key);
 
        return shouldUnwrap ? res.value : res;
 
      }
 
      if (isObject(res)) {
 
        return isReadonly ? readonly(res) : reactive2(res);
 
      }
 
      return res;
 
    };
 
  }
 
  var set2 = /* @__PURE__ */ createSetter();
 
  function createSetter(shallow = false) {
 
    return function set3(target, key, value, receiver) {
 
      let oldValue = target[key];
 
      if (!shallow) {
 
        value = toRaw(value);
 
        oldValue = toRaw(oldValue);
 
        if (!isArray(target) && isRef(oldValue) && !isRef(value)) {
 
          oldValue.value = value;
 
          return true;
 
        }
 
      }
 
      const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);
 
      const result = Reflect.set(target, key, value, receiver);
 
      if (target === toRaw(receiver)) {
 
        if (!hadKey) {
 
          trigger(target, "add", key, value);
 
        } else if (hasChanged(value, oldValue)) {
 
          trigger(target, "set", key, value, oldValue);
 
        }
 
      }
 
      return result;
 
    };
 
  }
 
  function deleteProperty(target, key) {
 
    const hadKey = hasOwn(target, key);
 
    const oldValue = target[key];
 
    const result = Reflect.deleteProperty(target, key);
 
    if (result && hadKey) {
 
      trigger(target, "delete", key, void 0, oldValue);
 
    }
 
    return result;
 
  }
 
  function has(target, key) {
 
    const result = Reflect.has(target, key);
 
    if (!isSymbol(key) || !builtInSymbols.has(key)) {
 
      track(target, "has", key);
 
    }
 
    return result;
 
  }
 
  function ownKeys(target) {
 
    track(target, "iterate", isArray(target) ? "length" : ITERATE_KEY);
 
    return Reflect.ownKeys(target);
 
  }
 
  var mutableHandlers = {
 
    get: get2,
 
    set: set2,
 
    deleteProperty,
 
    has,
 
    ownKeys
 
  };
 
  var readonlyHandlers = {
 
    get: readonlyGet,
 
    set(target, key) {
 
      if (true) {
 
        console.warn(`Set operation on key "${String(key)}" failed: target is readonly.`, target);
 
      }
 
      return true;
 
    },
 
    deleteProperty(target, key) {
 
      if (true) {
 
        console.warn(`Delete operation on key "${String(key)}" failed: target is readonly.`, target);
 
      }
 
      return true;
 
    }
 
  };
 
  var toReactive = (value) => isObject(value) ? reactive2(value) : value;
 
  var toReadonly = (value) => isObject(value) ? readonly(value) : value;
 
  var toShallow = (value) => value;
 
  var getProto = (v) => Reflect.getPrototypeOf(v);
 
  function get$1(target, key, isReadonly = false, isShallow = false) {
 
    target = target[
 
      "__v_raw"
 
      /* RAW */
 
    ];
 
    const rawTarget = toRaw(target);
 
    const rawKey = toRaw(key);
 
    if (key !== rawKey) {
 
      !isReadonly && track(rawTarget, "get", key);
 
    }
 
    !isReadonly && track(rawTarget, "get", rawKey);
 
    const { has: has2 } = getProto(rawTarget);
 
    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
 
    if (has2.call(rawTarget, key)) {
 
      return wrap(target.get(key));
 
    } else if (has2.call(rawTarget, rawKey)) {
 
      return wrap(target.get(rawKey));
 
    } else if (target !== rawTarget) {
 
      target.get(key);
 
    }
 
  }
 
  function has$1(key, isReadonly = false) {
 
    const target = this[
 
      "__v_raw"
 
      /* RAW */
 
    ];
 
    const rawTarget = toRaw(target);
 
    const rawKey = toRaw(key);
 
    if (key !== rawKey) {
 
      !isReadonly && track(rawTarget, "has", key);
 
    }
 
    !isReadonly && track(rawTarget, "has", rawKey);
 
    return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
 
  }
 
  function size(target, isReadonly = false) {
 
    target = target[
 
      "__v_raw"
 
      /* RAW */
 
    ];
 
    !isReadonly && track(toRaw(target), "iterate", ITERATE_KEY);
 
    return Reflect.get(target, "size", target);
 
  }
 
  function add(value) {
 
    value = toRaw(value);
 
    const target = toRaw(this);
 
    const proto = getProto(target);
 
    const hadKey = proto.has.call(target, value);
 
    if (!hadKey) {
 
      target.add(value);
 
      trigger(target, "add", value, value);
 
    }
 
    return this;
 
  }
 
  function set$1(key, value) {
 
    value = toRaw(value);
 
    const target = toRaw(this);
 
    const { has: has2, get: get3 } = getProto(target);
 
    let hadKey = has2.call(target, key);
 
    if (!hadKey) {
 
      key = toRaw(key);
 
      hadKey = has2.call(target, key);
 
    } else if (true) {
 
      checkIdentityKeys(target, has2, key);
 
    }
 
    const oldValue = get3.call(target, key);
 
    target.set(key, value);
 
    if (!hadKey) {
 
      trigger(target, "add", key, value);
 
    } else if (hasChanged(value, oldValue)) {
 
      trigger(target, "set", key, value, oldValue);
 
    }
 
    return this;
 
  }
 
  function deleteEntry(key) {
 
    const target = toRaw(this);
 
    const { has: has2, get: get3 } = getProto(target);
 
    let hadKey = has2.call(target, key);
 
    if (!hadKey) {
 
      key = toRaw(key);
 
      hadKey = has2.call(target, key);
 
    } else if (true) {
 
      checkIdentityKeys(target, has2, key);
 
    }
 
    const oldValue = get3 ? get3.call(target, key) : void 0;
 
    const result = target.delete(key);
 
    if (hadKey) {
 
      trigger(target, "delete", key, void 0, oldValue);
 
    }
 
    return result;
 
  }
 
  function clear() {
 
    const target = toRaw(this);
 
    const hadItems = target.size !== 0;
 
    const oldTarget = true ? isMap(target) ? new Map(target) : new Set(target) : void 0;
 
    const result = target.clear();
 
    if (hadItems) {
 
      trigger(target, "clear", void 0, void 0, oldTarget);
 
    }
 
    return result;
 
  }
 
  function createForEach(isReadonly, isShallow) {
 
    return function forEach(callback, thisArg) {
 
      const observed = this;
 
      const target = observed[
 
        "__v_raw"
 
        /* RAW */
 
      ];
 
      const rawTarget = toRaw(target);
 
      const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
 
      !isReadonly && track(rawTarget, "iterate", ITERATE_KEY);
 
      return target.forEach((value, key) => {
 
        return callback.call(thisArg, wrap(value), wrap(key), observed);
 
      });
 
    };
 
  }
 
  function createIterableMethod(method, isReadonly, isShallow) {
 
    return function(...args) {
 
      const target = this[
 
        "__v_raw"
 
        /* RAW */
 
      ];
 
      const rawTarget = toRaw(target);
 
      const targetIsMap = isMap(rawTarget);
 
      const isPair = method === "entries" || method === Symbol.iterator && targetIsMap;
 
      const isKeyOnly = method === "keys" && targetIsMap;
 
      const innerIterator = target[method](...args);
 
      const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
 
      !isReadonly && track(rawTarget, "iterate", isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY);
 
      return {
 
        // iterator protocol
 
        next() {
 
          const { value, done } = innerIterator.next();
 
          return done ? { value, done } : {
 
            value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
 
            done
 
          };
 
        },
 
        // iterable protocol
 
        [Symbol.iterator]() {
 
          return this;
 
        }
 
      };
 
    };
 
  }
 
  function createReadonlyMethod(type) {
 
    return function(...args) {
 
      if (true) {
 
        const key = args[0] ? `on key "${args[0]}" ` : ``;
 
        console.warn(`${capitalize(type)} operation ${key}failed: target is readonly.`, toRaw(this));
 
      }
 
      return type === "delete" ? false : this;
 
    };
 
  }
 
  function createInstrumentations() {
 
    const mutableInstrumentations2 = {
 
      get(key) {
 
        return get$1(this, key);
 
      },
 
      get size() {
 
        return size(this);
 
      },
 
      has: has$1,
 
      add,
 
      set: set$1,
 
      delete: deleteEntry,
 
      clear,
 
      forEach: createForEach(false, false)
 
    };
 
    const shallowInstrumentations2 = {
 
      get(key) {
 
        return get$1(this, key, false, true);
 
      },
 
      get size() {
 
        return size(this);
 
      },
 
      has: has$1,
 
      add,
 
      set: set$1,
 
      delete: deleteEntry,
 
      clear,
 
      forEach: createForEach(false, true)
 
    };
 
    const readonlyInstrumentations2 = {
 
      get(key) {
 
        return get$1(this, key, true);
 
      },
 
      get size() {
 
        return size(this, true);
 
      },
 
      has(key) {
 
        return has$1.call(this, key, true);
 
      },
 
      add: createReadonlyMethod(
 
        "add"
 
        /* ADD */
 
      ),
 
      set: createReadonlyMethod(
 
        "set"
 
        /* SET */
 
      ),
 
      delete: createReadonlyMethod(
 
        "delete"
 
        /* DELETE */
 
      ),
 
      clear: createReadonlyMethod(
 
        "clear"
 
        /* CLEAR */
 
      ),
 
      forEach: createForEach(true, false)
 
    };
 
    const shallowReadonlyInstrumentations2 = {
 
      get(key) {
 
        return get$1(this, key, true, true);
 
      },
 
      get size() {
 
        return size(this, true);
 
      },
 
      has(key) {
 
        return has$1.call(this, key, true);
 
      },
 
      add: createReadonlyMethod(
 
        "add"
 
        /* ADD */
 
      ),
 
      set: createReadonlyMethod(
 
        "set"
 
        /* SET */
 
      ),
 
      delete: createReadonlyMethod(
 
        "delete"
 
        /* DELETE */
 
      ),
 
      clear: createReadonlyMethod(
 
        "clear"
 
        /* CLEAR */
 
      ),
 
      forEach: createForEach(true, true)
 
    };
 
    const iteratorMethods = ["keys", "values", "entries", Symbol.iterator];
 
    iteratorMethods.forEach((method) => {
 
      mutableInstrumentations2[method] = createIterableMethod(method, false, false);
 
      readonlyInstrumentations2[method] = createIterableMethod(method, true, false);
 
      shallowInstrumentations2[method] = createIterableMethod(method, false, true);
 
      shallowReadonlyInstrumentations2[method] = createIterableMethod(method, true, true);
 
    });
 
    return [
 
      mutableInstrumentations2,
 
      readonlyInstrumentations2,
 
      shallowInstrumentations2,
 
      shallowReadonlyInstrumentations2
 
    ];
 
  }
 
  var [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations] = /* @__PURE__ */ createInstrumentations();
 
  function createInstrumentationGetter(isReadonly, shallow) {
 
    const instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;
 
    return (target, key, receiver) => {
 
      if (key === "__v_isReactive") {
 
        return !isReadonly;
 
      } else if (key === "__v_isReadonly") {
 
        return isReadonly;
 
      } else if (key === "__v_raw") {
 
        return target;
 
      }
 
      return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver);
 
    };
 
  }
 
  var mutableCollectionHandlers = {
 
    get: /* @__PURE__ */ createInstrumentationGetter(false, false)
 
  };
 
  var readonlyCollectionHandlers = {
 
    get: /* @__PURE__ */ createInstrumentationGetter(true, false)
 
  };
 
  function checkIdentityKeys(target, has2, key) {
 
    const rawKey = toRaw(key);
 
    if (rawKey !== key && has2.call(target, rawKey)) {
 
      const type = toRawType(target);
 
      console.warn(`Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`);
 
    }
 
  }
 
  var reactiveMap = /* @__PURE__ */ new WeakMap();
 
  var shallowReactiveMap = /* @__PURE__ */ new WeakMap();
 
  var readonlyMap = /* @__PURE__ */ new WeakMap();
 
  var shallowReadonlyMap = /* @__PURE__ */ new WeakMap();
 
  function targetTypeMap(rawType) {
 
    switch (rawType) {
 
      case "Object":
 
      case "Array":
 
        return 1;
 
      case "Map":
 
      case "Set":
 
      case "WeakMap":
 
      case "WeakSet":
 
        return 2;
 
      default:
 
        return 0;
 
    }
 
  }
 
  function getTargetType(value) {
 
    return value[
 
      "__v_skip"
 
      /* SKIP */
 
    ] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value));
 
  }
 
  function reactive2(target) {
 
    if (target && target[
 
      "__v_isReadonly"
 
      /* IS_READONLY */
 
    ]) {
 
      return target;
 
    }
 
    return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);
 
  }
 
  function readonly(target) {
 
    return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap);
 
  }
 
  function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers, proxyMap) {
 
    if (!isObject(target)) {
 
      if (true) {
 
        console.warn(`value cannot be made reactive: ${String(target)}`);
 
      }
 
      return target;
 
    }
 
    if (target[
 
      "__v_raw"
 
      /* RAW */
 
    ] && !(isReadonly && target[
 
      "__v_isReactive"
 
      /* IS_REACTIVE */
 
    ])) {
 
      return target;
 
    }
 
    const existingProxy = proxyMap.get(target);
 
    if (existingProxy) {
 
      return existingProxy;
 
    }
 
    const targetType = getTargetType(target);
 
    if (targetType === 0) {
 
      return target;
 
    }
 
    const proxy = new Proxy(target, targetType === 2 ? collectionHandlers : baseHandlers);
 
    proxyMap.set(target, proxy);
 
    return proxy;
 
  }
 
  function toRaw(observed) {
 
    return observed && toRaw(observed[
 
      "__v_raw"
 
      /* RAW */
 
    ]) || observed;
 
  }
 
  function isRef(r) {
 
    return Boolean(r && r.__v_isRef === true);
 
  }
 

	
 
  // packages/alpinejs/src/magics/$nextTick.js
 
  magic("nextTick", () => nextTick);
 

	
 
  // packages/alpinejs/src/magics/$dispatch.js
 
  magic("dispatch", (el) => dispatch.bind(dispatch, el));
 

	
 
  // packages/alpinejs/src/magics/$watch.js
 
  magic("watch", (el, { evaluateLater: evaluateLater2, cleanup: cleanup2 }) => (key, callback) => {
 
    let evaluate2 = evaluateLater2(key);
 
    let getter = () => {
 
      let value;
 
      evaluate2((i) => value = i);
 
      return value;
 
    };
 
    let unwatch = watch(getter, callback);
 
    cleanup2(unwatch);
 
  });
 

	
 
  // packages/alpinejs/src/magics/$store.js
 
  magic("store", getStores);
 

	
 
  // packages/alpinejs/src/magics/$data.js
 
  magic("data", (el) => scope(el));
 

	
 
  // packages/alpinejs/src/magics/$root.js
 
  magic("root", (el) => closestRoot(el));
 

	
 
  // packages/alpinejs/src/magics/$refs.js
 
  magic("refs", (el) => {
 
    if (el._x_refs_proxy)
 
      return el._x_refs_proxy;
 
    el._x_refs_proxy = mergeProxies(getArrayOfRefObject(el));
 
    return el._x_refs_proxy;
 
  });
 
  function getArrayOfRefObject(el) {
 
    let refObjects = [];
 
    findClosest(el, (i) => {
 
      if (i._x_refs)
 
        refObjects.push(i._x_refs);
 
    });
 
    return refObjects;
 
  }
 

	
 
  // packages/alpinejs/src/ids.js
 
  var globalIdMemo = {};
 
  function findAndIncrementId(name) {
 
    if (!globalIdMemo[name])
 
      globalIdMemo[name] = 0;
 
    return ++globalIdMemo[name];
 
  }
 
  function closestIdRoot(el, name) {
 
    return findClosest(el, (element) => {
 
      if (element._x_ids && element._x_ids[name])
 
        return true;
 
    });
 
  }
 
  function setIdRoot(el, name) {
 
    if (!el._x_ids)
 
      el._x_ids = {};
 
    if (!el._x_ids[name])
 
      el._x_ids[name] = findAndIncrementId(name);
 
  }
 

	
 
  // packages/alpinejs/src/magics/$id.js
 
  magic("id", (el, { cleanup: cleanup2 }) => (name, key = null) => {
 
    let cacheKey = `${name}${key ? `-${key}` : ""}`;
 
    return cacheIdByNameOnElement(el, cacheKey, cleanup2, () => {
 
      let root = closestIdRoot(el, name);
 
      let id = root ? root._x_ids[name] : findAndIncrementId(name);
 
      return key ? `${name}-${id}-${key}` : `${name}-${id}`;
 
    });
 
  });
 
  interceptClone((from, to) => {
 
    if (from._x_id) {
 
      to._x_id = from._x_id;
 
    }
 
  });
 
  function cacheIdByNameOnElement(el, cacheKey, cleanup2, callback) {
 
    if (!el._x_id)
 
      el._x_id = {};
 
    if (el._x_id[cacheKey])
 
      return el._x_id[cacheKey];
 
    let output = callback();
 
    el._x_id[cacheKey] = output;
 
    cleanup2(() => {
 
      delete el._x_id[cacheKey];
 
    });
 
    return output;
 
  }
 

	
 
  // packages/alpinejs/src/magics/$el.js
 
  magic("el", (el) => el);
 

	
 
  // packages/alpinejs/src/magics/index.js
 
  warnMissingPluginMagic("Focus", "focus", "focus");
 
  warnMissingPluginMagic("Persist", "persist", "persist");
 
  function warnMissingPluginMagic(name, magicName, slug) {
 
    magic(magicName, (el) => warn(`You can't use [$${magicName}] without first installing the "${name}" plugin here: https://alpinejs.dev/plugins/${slug}`, el));
 
  }
 

	
 
  // packages/alpinejs/src/directives/x-modelable.js
 
  directive("modelable", (el, { expression }, { effect: effect3, evaluateLater: evaluateLater2, cleanup: cleanup2 }) => {
 
    let func = evaluateLater2(expression);
 
    let innerGet = () => {
 
      let result;
 
      func((i) => result = i);
 
      return result;
 
    };
 
    let evaluateInnerSet = evaluateLater2(`${expression} = __placeholder`);
 
    let innerSet = (val) => evaluateInnerSet(() => {
 
    }, { scope: { "__placeholder": val } });
 
    let initialValue = innerGet();
 
    innerSet(initialValue);
 
    queueMicrotask(() => {
 
      if (!el._x_model)
 
        return;
 
      el._x_removeModelListeners["default"]();
 
      let outerGet = el._x_model.get;
 
      let outerSet = el._x_model.set;
 
      let releaseEntanglement = entangle(
 
        {
 
          get() {
 
            return outerGet();
 
          },
 
          set(value) {
 
            outerSet(value);
 
          }
 
        },
 
        {
 
          get() {
 
            return innerGet();
 
          },
 
          set(value) {
 
            innerSet(value);
 
          }
 
        }
 
      );
 
      cleanup2(releaseEntanglement);
 
    });
 
  });
 

	
 
  // packages/alpinejs/src/directives/x-teleport.js
 
  directive("teleport", (el, { modifiers, expression }, { cleanup: cleanup2 }) => {
 
    if (el.tagName.toLowerCase() !== "template")
 
      warn("x-teleport can only be used on a <template> tag", el);
 
    let target = getTarget(expression);
 
    let clone2 = el.content.cloneNode(true).firstElementChild;
 
    el._x_teleport = clone2;
 
    clone2._x_teleportBack = el;
 
    el.setAttribute("data-teleport-template", true);
 
    clone2.setAttribute("data-teleport-target", true);
 
    if (el._x_forwardEvents) {
 
      el._x_forwardEvents.forEach((eventName) => {
 
        clone2.addEventListener(eventName, (e) => {
 
          e.stopPropagation();
 
          el.dispatchEvent(new e.constructor(e.type, e));
 
        });
 
      });
 
    }
 
    addScopeToNode(clone2, {}, el);
 
    let placeInDom = (clone3, target2, modifiers2) => {
 
      if (modifiers2.includes("prepend")) {
 
        target2.parentNode.insertBefore(clone3, target2);
 
      } else if (modifiers2.includes("append")) {
 
        target2.parentNode.insertBefore(clone3, target2.nextSibling);
 
      } else {
 
        target2.appendChild(clone3);
 
      }
 
    };
 
    mutateDom(() => {
 
      placeInDom(clone2, target, modifiers);
 
      skipDuringClone(() => {
 
        initTree(clone2);
 
        clone2._x_ignore = true;
 
      })();
 
    });
 
    el._x_teleportPutBack = () => {
 
      let target2 = getTarget(expression);
 
      mutateDom(() => {
 
        placeInDom(el._x_teleport, target2, modifiers);
 
      });
 
    };
 
    cleanup2(() => clone2.remove());
 
  });
 
  var teleportContainerDuringClone = document.createElement("div");
 
  function getTarget(expression) {
 
    let target = skipDuringClone(() => {
 
      return document.querySelector(expression);
 
    }, () => {
 
      return teleportContainerDuringClone;
 
    })();
 
    if (!target)
 
      warn(`Cannot find x-teleport element for selector: "${expression}"`);
 
    return target;
 
  }
 

	
 
  // packages/alpinejs/src/directives/x-ignore.js
 
  var handler = () => {
 
  };
 
  handler.inline = (el, { modifiers }, { cleanup: cleanup2 }) => {
 
    modifiers.includes("self") ? el._x_ignoreSelf = true : el._x_ignore = true;
 
    cleanup2(() => {
 
      modifiers.includes("self") ? delete el._x_ignoreSelf : delete el._x_ignore;
 
    });
 
  };
 
  directive("ignore", handler);
 

	
 
  // packages/alpinejs/src/directives/x-effect.js
 
  directive("effect", skipDuringClone((el, { expression }, { effect: effect3 }) => {
 
    effect3(evaluateLater(el, expression));
 
  }));
 

	
 
  // packages/alpinejs/src/utils/on.js
 
  function on(el, event, modifiers, callback) {
 
    let listenerTarget = el;
 
    let handler4 = (e) => callback(e);
 
    let options = {};
 
    let wrapHandler = (callback2, wrapper) => (e) => wrapper(callback2, e);
 
    if (modifiers.includes("dot"))
 
      event = dotSyntax(event);
 
    if (modifiers.includes("camel"))
 
      event = camelCase2(event);
 
    if (modifiers.includes("passive"))
 
      options.passive = true;
 
    if (modifiers.includes("capture"))
 
      options.capture = true;
 
    if (modifiers.includes("window"))
 
      listenerTarget = window;
 
    if (modifiers.includes("document"))
 
      listenerTarget = document;
 
    if (modifiers.includes("debounce")) {
 
      let nextModifier = modifiers[modifiers.indexOf("debounce") + 1] || "invalid-wait";
 
      let wait = isNumeric(nextModifier.split("ms")[0]) ? Number(nextModifier.split("ms")[0]) : 250;
 
      handler4 = debounce(handler4, wait);
 
    }
 
    if (modifiers.includes("throttle")) {
 
      let nextModifier = modifiers[modifiers.indexOf("throttle") + 1] || "invalid-wait";
 
      let wait = isNumeric(nextModifier.split("ms")[0]) ? Number(nextModifier.split("ms")[0]) : 250;
 
      handler4 = throttle(handler4, wait);
 
    }
 
    if (modifiers.includes("prevent"))
 
      handler4 = wrapHandler(handler4, (next, e) => {
 
        e.preventDefault();
 
        next(e);
 
      });
 
    if (modifiers.includes("stop"))
 
      handler4 = wrapHandler(handler4, (next, e) => {
 
        e.stopPropagation();
 
        next(e);
 
      });
 
    if (modifiers.includes("once")) {
 
      handler4 = wrapHandler(handler4, (next, e) => {
 
        next(e);
 
        listenerTarget.removeEventListener(event, handler4, options);
 
      });
 
    }
 
    if (modifiers.includes("away") || modifiers.includes("outside")) {
 
      listenerTarget = document;
 
      handler4 = wrapHandler(handler4, (next, e) => {
 
        if (el.contains(e.target))
 
          return;
 
        if (e.target.isConnected === false)
 
          return;
 
        if (el.offsetWidth < 1 && el.offsetHeight < 1)
 
          return;
 
        if (el._x_isShown === false)
 
          return;
 
        next(e);
 
      });
 
    }
 
    if (modifiers.includes("self"))
 
      handler4 = wrapHandler(handler4, (next, e) => {
 
        e.target === el && next(e);
 
      });
 
    if (isKeyEvent(event) || isClickEvent(event)) {
 
      handler4 = wrapHandler(handler4, (next, e) => {
 
        if (isListeningForASpecificKeyThatHasntBeenPressed(e, modifiers)) {
 
          return;
 
        }
 
        next(e);
 
      });
 
    }
 
    listenerTarget.addEventListener(event, handler4, options);
 
    return () => {
 
      listenerTarget.removeEventListener(event, handler4, options);
 
    };
 
  }
 
  function dotSyntax(subject) {
 
    return subject.replace(/-/g, ".");
 
  }
 
  function camelCase2(subject) {
 
    return subject.toLowerCase().replace(/-(\w)/g, (match, char) => char.toUpperCase());
 
  }
 
  function isNumeric(subject) {
 
    return !Array.isArray(subject) && !isNaN(subject);
 
  }
 
  function kebabCase2(subject) {
 
    if ([" ", "_"].includes(
 
      subject
 
    ))
 
      return subject;
 
    return subject.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[_\s]/, "-").toLowerCase();
 
  }
 
  function isKeyEvent(event) {
 
    return ["keydown", "keyup"].includes(event);
 
  }
 
  function isClickEvent(event) {
 
    return ["contextmenu", "click", "mouse"].some((i) => event.includes(i));
 
  }
 
  function isListeningForASpecificKeyThatHasntBeenPressed(e, modifiers) {
 
    let keyModifiers = modifiers.filter((i) => {
 
      return !["window", "document", "prevent", "stop", "once", "capture", "self", "away", "outside", "passive"].includes(i);
 
    });
 
    if (keyModifiers.includes("debounce")) {
 
      let debounceIndex = keyModifiers.indexOf("debounce");
 
      keyModifiers.splice(debounceIndex, isNumeric((keyModifiers[debounceIndex + 1] || "invalid-wait").split("ms")[0]) ? 2 : 1);
 
    }
 
    if (keyModifiers.includes("throttle")) {
 
      let debounceIndex = keyModifiers.indexOf("throttle");
 
      keyModifiers.splice(debounceIndex, isNumeric((keyModifiers[debounceIndex + 1] || "invalid-wait").split("ms")[0]) ? 2 : 1);
 
    }
 
    if (keyModifiers.length === 0)
 
      return false;
 
    if (keyModifiers.length === 1 && keyToModifiers(e.key).includes(keyModifiers[0]))
 
      return false;
 
    const systemKeyModifiers = ["ctrl", "shift", "alt", "meta", "cmd", "super"];
 
    const selectedSystemKeyModifiers = systemKeyModifiers.filter((modifier) => keyModifiers.includes(modifier));
 
    keyModifiers = keyModifiers.filter((i) => !selectedSystemKeyModifiers.includes(i));
 
    if (selectedSystemKeyModifiers.length > 0) {
 
      const activelyPressedKeyModifiers = selectedSystemKeyModifiers.filter((modifier) => {
 
        if (modifier === "cmd" || modifier === "super")
 
          modifier = "meta";
 
        return e[`${modifier}Key`];
 
      });
 
      if (activelyPressedKeyModifiers.length === selectedSystemKeyModifiers.length) {
 
        if (isClickEvent(e.type))
 
          return false;
 
        if (keyToModifiers(e.key).includes(keyModifiers[0]))
 
          return false;
 
      }
 
    }
 
    return true;
 
  }
 
  function keyToModifiers(key) {
 
    if (!key)
 
      return [];
 
    key = kebabCase2(key);
 
    let modifierToKeyMap = {
 
      "ctrl": "control",
 
      "slash": "/",
 
      "space": " ",
 
      "spacebar": " ",
 
      "cmd": "meta",
 
      "esc": "escape",
 
      "up": "arrow-up",
 
      "down": "arrow-down",
 
      "left": "arrow-left",
 
      "right": "arrow-right",
 
      "period": ".",
 
      "comma": ",",
 
      "equal": "=",
 
      "minus": "-",
 
      "underscore": "_"
 
    };
 
    modifierToKeyMap[key] = key;
 
    return Object.keys(modifierToKeyMap).map((modifier) => {
 
      if (modifierToKeyMap[modifier] === key)
 
        return modifier;
 
    }).filter((modifier) => modifier);
 
  }
 

	
 
  // packages/alpinejs/src/directives/x-model.js
 
  directive("model", (el, { modifiers, expression }, { effect: effect3, cleanup: cleanup2 }) => {
 
    let scopeTarget = el;
 
    if (modifiers.includes("parent")) {
 
      scopeTarget = el.parentNode;
 
    }
 
    let evaluateGet = evaluateLater(scopeTarget, expression);
 
    let evaluateSet;
 
    if (typeof expression === "string") {
 
      evaluateSet = evaluateLater(scopeTarget, `${expression} = __placeholder`);
 
    } else if (typeof expression === "function" && typeof expression() === "string") {
 
      evaluateSet = evaluateLater(scopeTarget, `${expression()} = __placeholder`);
 
    } else {
 
      evaluateSet = () => {
 
      };
 
    }
 
    let getValue = () => {
 
      let result;
 
      evaluateGet((value) => result = value);
 
      return isGetterSetter(result) ? result.get() : result;
 
    };
 
    let setValue = (value) => {
 
      let result;
 
      evaluateGet((value2) => result = value2);
 
      if (isGetterSetter(result)) {
 
        result.set(value);
 
      } else {
 
        evaluateSet(() => {
 
        }, {
 
          scope: { "__placeholder": value }
 
        });
 
      }
 
    };
 
    if (typeof expression === "string" && el.type === "radio") {
 
      mutateDom(() => {
 
        if (!el.hasAttribute("name"))
 
          el.setAttribute("name", expression);
 
      });
 
    }
 
    var event = el.tagName.toLowerCase() === "select" || ["checkbox", "radio"].includes(el.type) || modifiers.includes("lazy") ? "change" : "input";
 
    let removeListener = isCloning ? () => {
 
    } : on(el, event, modifiers, (e) => {
 
      setValue(getInputValue(el, modifiers, e, getValue()));
 
    });
 
    if (modifiers.includes("fill")) {
 
      if ([void 0, null, ""].includes(getValue()) || el.type === "checkbox" && Array.isArray(getValue()) || el.tagName.toLowerCase() === "select" && el.multiple) {
 
        setValue(
 
          getInputValue(el, modifiers, { target: el }, getValue())
 
        );
 
      }
 
    }
 
    if (!el._x_removeModelListeners)
 
      el._x_removeModelListeners = {};
 
    el._x_removeModelListeners["default"] = removeListener;
 
    cleanup2(() => el._x_removeModelListeners["default"]());
 
    if (el.form) {
 
      let removeResetListener = on(el.form, "reset", [], (e) => {
 
        nextTick(() => el._x_model && el._x_model.set(getInputValue(el, modifiers, { target: el }, getValue())));
 
      });
 
      cleanup2(() => removeResetListener());
 
    }
 
    el._x_model = {
 
      get() {
 
        return getValue();
 
      },
 
      set(value) {
 
        setValue(value);
 
      }
 
    };
 
    el._x_forceModelUpdate = (value) => {
 
      if (value === void 0 && typeof expression === "string" && expression.match(/\./))
 
        value = "";
 
      window.fromModel = true;
 
      mutateDom(() => bind(el, "value", value));
 
      delete window.fromModel;
 
    };
 
    effect3(() => {
 
      let value = getValue();
 
      if (modifiers.includes("unintrusive") && document.activeElement.isSameNode(el))
 
        return;
 
      el._x_forceModelUpdate(value);
 
    });
 
  });
 
  function getInputValue(el, modifiers, event, currentValue) {
 
    return mutateDom(() => {
 
      if (event instanceof CustomEvent && event.detail !== void 0)
 
        return event.detail !== null && event.detail !== void 0 ? event.detail : event.target.value;
 
      else if (el.type === "checkbox") {
 
        if (Array.isArray(currentValue)) {
 
          let newValue = null;
 
          if (modifiers.includes("number")) {
 
            newValue = safeParseNumber(event.target.value);
 
          } else if (modifiers.includes("boolean")) {
 
            newValue = safeParseBoolean(event.target.value);
 
          } else {
 
            newValue = event.target.value;
 
          }
 
          return event.target.checked ? currentValue.includes(newValue) ? currentValue : currentValue.concat([newValue]) : currentValue.filter((el2) => !checkedAttrLooseCompare2(el2, newValue));
 
        } else {
 
          return event.target.checked;
 
        }
 
      } else if (el.tagName.toLowerCase() === "select" && el.multiple) {
 
        if (modifiers.includes("number")) {
 
          return Array.from(event.target.selectedOptions).map((option) => {
 
            let rawValue = option.value || option.text;
 
            return safeParseNumber(rawValue);
 
          });
 
        } else if (modifiers.includes("boolean")) {
 
          return Array.from(event.target.selectedOptions).map((option) => {
 
            let rawValue = option.value || option.text;
 
            return safeParseBoolean(rawValue);
 
          });
 
        }
 
        return Array.from(event.target.selectedOptions).map((option) => {
 
          return option.value || option.text;
 
        });
 
      } else {
 
        let newValue;
 
        if (el.type === "radio") {
 
          if (event.target.checked) {
 
            newValue = event.target.value;
 
          } else {
 
            newValue = currentValue;
 
          }
 
        } else {
 
          newValue = event.target.value;
 
        }
 
        if (modifiers.includes("number")) {
 
          return safeParseNumber(newValue);
 
        } else if (modifiers.includes("boolean")) {
 
          return safeParseBoolean(newValue);
 
        } else if (modifiers.includes("trim")) {
 
          return newValue.trim();
 
        } else {
 
          return newValue;
 
        }
 
      }
 
    });
 
  }
 
  function safeParseNumber(rawValue) {
 
    let number = rawValue ? parseFloat(rawValue) : null;
 
    return isNumeric2(number) ? number : rawValue;
 
  }
 
  function checkedAttrLooseCompare2(valueA, valueB) {
 
    return valueA == valueB;
 
  }
 
  function isNumeric2(subject) {
 
    return !Array.isArray(subject) && !isNaN(subject);
 
  }
 
  function isGetterSetter(value) {
 
    return value !== null && typeof value === "object" && typeof value.get === "function" && typeof value.set === "function";
 
  }
 

	
 
  // packages/alpinejs/src/directives/x-cloak.js
 
  directive("cloak", (el) => queueMicrotask(() => mutateDom(() => el.removeAttribute(prefix("cloak")))));
 

	
 
  // packages/alpinejs/src/directives/x-init.js
 
  addInitSelector(() => `[${prefix("init")}]`);
 
  directive("init", skipDuringClone((el, { expression }, { evaluate: evaluate2 }) => {
 
    if (typeof expression === "string") {
 
      return !!expression.trim() && evaluate2(expression, {}, false);
 
    }
 
    return evaluate2(expression, {}, false);
 
  }));
 

	
 
  // packages/alpinejs/src/directives/x-text.js
 
  directive("text", (el, { expression }, { effect: effect3, evaluateLater: evaluateLater2 }) => {
 
    let evaluate2 = evaluateLater2(expression);
 
    effect3(() => {
 
      evaluate2((value) => {
 
        mutateDom(() => {
 
          el.textContent = value;
 
        });
 
      });
 
    });
 
  });
 

	
 
  // packages/alpinejs/src/directives/x-html.js
 
  directive("html", (el, { expression }, { effect: effect3, evaluateLater: evaluateLater2 }) => {
 
    let evaluate2 = evaluateLater2(expression);
 
    effect3(() => {
 
      evaluate2((value) => {
 
        mutateDom(() => {
 
          el.innerHTML = value;
 
          el._x_ignoreSelf = true;
 
          initTree(el);
 
          delete el._x_ignoreSelf;
 
        });
 
      });
 
    });
 
  });
 

	
 
  // packages/alpinejs/src/directives/x-bind.js
 
  mapAttributes(startingWith(":", into(prefix("bind:"))));
 
  var handler2 = (el, { value, modifiers, expression, original }, { effect: effect3, cleanup: cleanup2 }) => {
 
    if (!value) {
 
      let bindingProviders = {};
 
      injectBindingProviders(bindingProviders);
 
      let getBindings = evaluateLater(el, expression);
 
      getBindings((bindings) => {
 
        applyBindingsObject(el, bindings, original);
 
      }, { scope: bindingProviders });
 
      return;
 
    }
 
    if (value === "key")
 
      return storeKeyForXFor(el, expression);
 
    if (el._x_inlineBindings && el._x_inlineBindings[value] && el._x_inlineBindings[value].extract) {
 
      return;
 
    }
 
    let evaluate2 = evaluateLater(el, expression);
 
    effect3(() => evaluate2((result) => {
 
      if (result === void 0 && typeof expression === "string" && expression.match(/\./)) {
 
        result = "";
 
      }
 
      mutateDom(() => bind(el, value, result, modifiers));
 
    }));
 
    cleanup2(() => {
 
      el._x_undoAddedClasses && el._x_undoAddedClasses();
 
      el._x_undoAddedStyles && el._x_undoAddedStyles();
 
    });
 
  };
 
  handler2.inline = (el, { value, modifiers, expression }) => {
 
    if (!value)
 
      return;
 
    if (!el._x_inlineBindings)
 
      el._x_inlineBindings = {};
 
    el._x_inlineBindings[value] = { expression, extract: false };
 
  };
 
  directive("bind", handler2);
 
  function storeKeyForXFor(el, expression) {
 
    el._x_keyExpression = expression;
 
  }
 

	
 
  // packages/alpinejs/src/directives/x-data.js
 
  addRootSelector(() => `[${prefix("data")}]`);
 
  directive("data", (el, { expression }, { cleanup: cleanup2 }) => {
 
    if (shouldSkipRegisteringDataDuringClone(el))
 
      return;
 
    expression = expression === "" ? "{}" : expression;
 
    let magicContext = {};
 
    injectMagics(magicContext, el);
 
    let dataProviderContext = {};
 
    injectDataProviders(dataProviderContext, magicContext);
 
    let data2 = evaluate(el, expression, { scope: dataProviderContext });
 
    if (data2 === void 0 || data2 === true)
 
      data2 = {};
 
    injectMagics(data2, el);
 
    let reactiveData = reactive(data2);
 
    initInterceptors(reactiveData);
 
    let undo = addScopeToNode(el, reactiveData);
 
    reactiveData["init"] && evaluate(el, reactiveData["init"]);
 
    cleanup2(() => {
 
      reactiveData["destroy"] && evaluate(el, reactiveData["destroy"]);
 
      undo();
 
    });
 
  });
 
  interceptClone((from, to) => {
 
    if (from._x_dataStack) {
 
      to._x_dataStack = from._x_dataStack;
 
      to.setAttribute("data-has-alpine-state", true);
 
    }
 
  });
 
  function shouldSkipRegisteringDataDuringClone(el) {
 
    if (!isCloning)
 
      return false;
 
    if (isCloningLegacy)
 
      return true;
 
    return el.hasAttribute("data-has-alpine-state");
 
  }
 

	
 
  // packages/alpinejs/src/directives/x-show.js
 
  directive("show", (el, { modifiers, expression }, { effect: effect3 }) => {
 
    let evaluate2 = evaluateLater(el, expression);
 
    if (!el._x_doHide)
 
      el._x_doHide = () => {
 
        mutateDom(() => {
 
          el.style.setProperty("display", "none", modifiers.includes("important") ? "important" : void 0);
 
        });
 
      };
 
    if (!el._x_doShow)
 
      el._x_doShow = () => {
 
        mutateDom(() => {
 
          if (el.style.length === 1 && el.style.display === "none") {
 
            el.removeAttribute("style");
 
          } else {
 
            el.style.removeProperty("display");
 
          }
 
        });
 
      };
 
    let hide = () => {
 
      el._x_doHide();
 
      el._x_isShown = false;
 
    };
 
    let show = () => {
 
      el._x_doShow();
 
      el._x_isShown = true;
 
    };
 
    let clickAwayCompatibleShow = () => setTimeout(show);
 
    let toggle = once(
 
      (value) => value ? show() : hide(),
 
      (value) => {
 
        if (typeof el._x_toggleAndCascadeWithTransitions === "function") {
 
          el._x_toggleAndCascadeWithTransitions(el, value, show, hide);
 
        } else {
 
          value ? clickAwayCompatibleShow() : hide();
 
        }
 
      }
 
    );
 
    let oldValue;
 
    let firstTime = true;
 
    effect3(() => evaluate2((value) => {
 
      if (!firstTime && value === oldValue)
 
        return;
 
      if (modifiers.includes("immediate"))
 
        value ? clickAwayCompatibleShow() : hide();
 
      toggle(value);
 
      oldValue = value;
 
      firstTime = false;
 
    }));
 
  });
 

	
 
  // packages/alpinejs/src/directives/x-for.js
 
  directive("for", (el, { expression }, { effect: effect3, cleanup: cleanup2 }) => {
 
    let iteratorNames = parseForExpression(expression);
 
    let evaluateItems = evaluateLater(el, iteratorNames.items);
 
    let evaluateKey = evaluateLater(
 
      el,
 
      // the x-bind:key expression is stored for our use instead of evaluated.
 
      el._x_keyExpression || "index"
 
    );
 
    el._x_prevKeys = [];
 
    el._x_lookup = {};
 
    effect3(() => loop(el, iteratorNames, evaluateItems, evaluateKey));
 
    cleanup2(() => {
 
      Object.values(el._x_lookup).forEach((el2) => el2.remove());
 
      delete el._x_prevKeys;
 
      delete el._x_lookup;
 
    });
 
  });
 
  function loop(el, iteratorNames, evaluateItems, evaluateKey) {
 
    let isObject2 = (i) => typeof i === "object" && !Array.isArray(i);
 
    let templateEl = el;
 
    evaluateItems((items) => {
 
      if (isNumeric3(items) && items >= 0) {
 
        items = Array.from(Array(items).keys(), (i) => i + 1);
 
      }
 
      if (items === void 0)
 
        items = [];
 
      let lookup = el._x_lookup;
 
      let prevKeys = el._x_prevKeys;
 
      let scopes = [];
 
      let keys = [];
 
      if (isObject2(items)) {
 
        items = Object.entries(items).map(([key, value]) => {
 
          let scope2 = getIterationScopeVariables(iteratorNames, value, key, items);
 
          evaluateKey((value2) => {
 
            if (keys.includes(value2))
 
              warn("Duplicate key on x-for", el);
 
            keys.push(value2);
 
          }, { scope: { index: key, ...scope2 } });
 
          scopes.push(scope2);
 
        });
 
      } else {
 
        for (let i = 0; i < items.length; i++) {
 
          let scope2 = getIterationScopeVariables(iteratorNames, items[i], i, items);
 
          evaluateKey((value) => {
 
            if (keys.includes(value))
 
              warn("Duplicate key on x-for", el);
 
            keys.push(value);
 
          }, { scope: { index: i, ...scope2 } });
 
          scopes.push(scope2);
 
        }
 
      }
 
      let adds = [];
 
      let moves = [];
 
      let removes = [];
 
      let sames = [];
 
      for (let i = 0; i < prevKeys.length; i++) {
 
        let key = prevKeys[i];
 
        if (keys.indexOf(key) === -1)
 
          removes.push(key);
 
      }
 
      prevKeys = prevKeys.filter((key) => !removes.includes(key));
 
      let lastKey = "template";
 
      for (let i = 0; i < keys.length; i++) {
 
        let key = keys[i];
 
        let prevIndex = prevKeys.indexOf(key);
 
        if (prevIndex === -1) {
 
          prevKeys.splice(i, 0, key);
 
          adds.push([lastKey, i]);
 
        } else if (prevIndex !== i) {
 
          let keyInSpot = prevKeys.splice(i, 1)[0];
 
          let keyForSpot = prevKeys.splice(prevIndex - 1, 1)[0];
 
          prevKeys.splice(i, 0, keyForSpot);
 
          prevKeys.splice(prevIndex, 0, keyInSpot);
 
          moves.push([keyInSpot, keyForSpot]);
 
        } else {
 
          sames.push(key);
 
        }
 
        lastKey = key;
 
      }
 
      for (let i = 0; i < removes.length; i++) {
 
        let key = removes[i];
 
        if (!!lookup[key]._x_effects) {
 
          lookup[key]._x_effects.forEach(dequeueJob);
 
        }
 
        lookup[key].remove();
 
        lookup[key] = null;
 
        delete lookup[key];
 
      }
 
      for (let i = 0; i < moves.length; i++) {
 
        let [keyInSpot, keyForSpot] = moves[i];
 
        let elInSpot = lookup[keyInSpot];
 
        let elForSpot = lookup[keyForSpot];
 
        let marker = document.createElement("div");
 
        mutateDom(() => {
 
          if (!elForSpot)
 
            warn(`x-for ":key" is undefined or invalid`, templateEl, keyForSpot, lookup);
 
          elForSpot.after(marker);
 
          elInSpot.after(elForSpot);
 
          elForSpot._x_currentIfEl && elForSpot.after(elForSpot._x_currentIfEl);
 
          marker.before(elInSpot);
 
          elInSpot._x_currentIfEl && elInSpot.after(elInSpot._x_currentIfEl);
 
          marker.remove();
 
        });
 
        elForSpot._x_refreshXForScope(scopes[keys.indexOf(keyForSpot)]);
 
      }
 
      for (let i = 0; i < adds.length; i++) {
 
        let [lastKey2, index] = adds[i];
 
        let lastEl = lastKey2 === "template" ? templateEl : lookup[lastKey2];
 
        if (lastEl._x_currentIfEl)
 
          lastEl = lastEl._x_currentIfEl;
 
        let scope2 = scopes[index];
 
        let key = keys[index];
 
        let clone2 = document.importNode(templateEl.content, true).firstElementChild;
 
        let reactiveScope = reactive(scope2);
 
        addScopeToNode(clone2, reactiveScope, templateEl);
 
        clone2._x_refreshXForScope = (newScope) => {
 
          Object.entries(newScope).forEach(([key2, value]) => {
 
            reactiveScope[key2] = value;
 
          });
 
        };
 
        mutateDom(() => {
 
          lastEl.after(clone2);
 
          skipDuringClone(() => initTree(clone2))();
 
        });
 
        if (typeof key === "object") {
 
          warn("x-for key cannot be an object, it must be a string or an integer", templateEl);
 
        }
 
        lookup[key] = clone2;
 
      }
 
      for (let i = 0; i < sames.length; i++) {
 
        lookup[sames[i]]._x_refreshXForScope(scopes[keys.indexOf(sames[i])]);
 
      }
 
      templateEl._x_prevKeys = keys;
 
    });
 
  }
 
  function parseForExpression(expression) {
 
    let forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
 
    let stripParensRE = /^\s*\(|\)\s*$/g;
 
    let forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;
 
    let inMatch = expression.match(forAliasRE);
 
    if (!inMatch)
 
      return;
 
    let res = {};
 
    res.items = inMatch[2].trim();
 
    let item = inMatch[1].replace(stripParensRE, "").trim();
 
    let iteratorMatch = item.match(forIteratorRE);
 
    if (iteratorMatch) {
 
      res.item = item.replace(forIteratorRE, "").trim();
 
      res.index = iteratorMatch[1].trim();
 
      if (iteratorMatch[2]) {
 
        res.collection = iteratorMatch[2].trim();
 
      }
 
    } else {
 
      res.item = item;
 
    }
 
    return res;
 
  }
 
  function getIterationScopeVariables(iteratorNames, item, index, items) {
 
    let scopeVariables = {};
 
    if (/^\[.*\]$/.test(iteratorNames.item) && Array.isArray(item)) {
 
      let names = iteratorNames.item.replace("[", "").replace("]", "").split(",").map((i) => i.trim());
 
      names.forEach((name, i) => {
 
        scopeVariables[name] = item[i];
 
      });
 
    } else if (/^\{.*\}$/.test(iteratorNames.item) && !Array.isArray(item) && typeof item === "object") {
 
      let names = iteratorNames.item.replace("{", "").replace("}", "").split(",").map((i) => i.trim());
 
      names.forEach((name) => {
 
        scopeVariables[name] = item[name];
 
      });
 
    } else {
 
      scopeVariables[iteratorNames.item] = item;
 
    }
 
    if (iteratorNames.index)
 
      scopeVariables[iteratorNames.index] = index;
 
    if (iteratorNames.collection)
 
      scopeVariables[iteratorNames.collection] = items;
 
    return scopeVariables;
 
  }
 
  function isNumeric3(subject) {
 
    return !Array.isArray(subject) && !isNaN(subject);
 
  }
 

	
 
  // packages/alpinejs/src/directives/x-ref.js
 
  function handler3() {
 
  }
 
  handler3.inline = (el, { expression }, { cleanup: cleanup2 }) => {
 
    let root = closestRoot(el);
 
    if (!root._x_refs)
 
      root._x_refs = {};
 
    root._x_refs[expression] = el;
 
    cleanup2(() => delete root._x_refs[expression]);
 
  };
 
  directive("ref", handler3);
 

	
 
  // packages/alpinejs/src/directives/x-if.js
 
  directive("if", (el, { expression }, { effect: effect3, cleanup: cleanup2 }) => {
 
    if (el.tagName.toLowerCase() !== "template")
 
      warn("x-if can only be used on a <template> tag", el);
 
    let evaluate2 = evaluateLater(el, expression);
 
    let show = () => {
 
      if (el._x_currentIfEl)
 
        return el._x_currentIfEl;
 
      let clone2 = el.content.cloneNode(true).firstElementChild;
 
      addScopeToNode(clone2, {}, el);
 
      mutateDom(() => {
 
        el.after(clone2);
 
        skipDuringClone(() => initTree(clone2))();
 
      });
 
      el._x_currentIfEl = clone2;
 
      el._x_undoIf = () => {
 
        walk(clone2, (node) => {
 
          if (!!node._x_effects) {
 
            node._x_effects.forEach(dequeueJob);
 
          }
 
        });
 
        clone2.remove();
 
        delete el._x_currentIfEl;
 
      };
 
      return clone2;
 
    };
 
    let hide = () => {
 
      if (!el._x_undoIf)
 
        return;
 
      el._x_undoIf();
 
      delete el._x_undoIf;
 
    };
 
    effect3(() => evaluate2((value) => {
 
      value ? show() : hide();
 
    }));
 
    cleanup2(() => el._x_undoIf && el._x_undoIf());
 
  });
 

	
 
  // packages/alpinejs/src/directives/x-id.js
 
  directive("id", (el, { expression }, { evaluate: evaluate2 }) => {
 
    let names = evaluate2(expression);
 
    names.forEach((name) => setIdRoot(el, name));
 
  });
 
  interceptClone((from, to) => {
 
    if (from._x_ids) {
 
      to._x_ids = from._x_ids;
 
    }
 
  });
 

	
 
  // packages/alpinejs/src/directives/x-on.js
 
  mapAttributes(startingWith("@", into(prefix("on:"))));
 
  directive("on", skipDuringClone((el, { value, modifiers, expression }, { cleanup: cleanup2 }) => {
 
    let evaluate2 = expression ? evaluateLater(el, expression) : () => {
 
    };
 
    if (el.tagName.toLowerCase() === "template") {
 
      if (!el._x_forwardEvents)
 
        el._x_forwardEvents = [];
 
      if (!el._x_forwardEvents.includes(value))
 
        el._x_forwardEvents.push(value);
 
    }
 
    let removeListener = on(el, value, modifiers, (e) => {
 
      evaluate2(() => {
 
      }, { scope: { "$event": e }, params: [e] });
 
    });
 
    cleanup2(() => removeListener());
 
  }));
 

	
 
  // packages/alpinejs/src/directives/index.js
 
  warnMissingPluginDirective("Collapse", "collapse", "collapse");
 
  warnMissingPluginDirective("Intersect", "intersect", "intersect");
 
  warnMissingPluginDirective("Focus", "trap", "focus");
 
  warnMissingPluginDirective("Mask", "mask", "mask");
 
  function warnMissingPluginDirective(name, directiveName, slug) {
 
    directive(directiveName, (el) => warn(`You can't use [x-${directiveName}] without first installing the "${name}" plugin here: https://alpinejs.dev/plugins/${slug}`, el));
 
  }
 

	
 
  // packages/alpinejs/src/index.js
 
  alpine_default.setEvaluator(normalEvaluator);
 
  alpine_default.setReactivityEngine({ reactive: reactive2, effect: effect2, release: stop, raw: toRaw });
 
  var src_default = alpine_default;
 

	
 
  // packages/alpinejs/builds/cdn.js
 
  window.Alpine = src_default;
 
  queueMicrotask(() => {
 
    src_default.start();
 
  });
 
})();
conservancy/supporters/admin.py
Show inline comments
 
from django.contrib import admin
 

	
 
from .models import Supporter
 
from .models import Supporter, SustainerOrder
 

	
 

	
 
@admin.register(Supporter)
 
class SupporterAdmin(admin.ModelAdmin):
 
    list_display = ('display_name', 'display_until_date')
 

	
 

	
 
@admin.register(SustainerOrder)
 
class SustainerOrderAdmin(admin.ModelAdmin):
 
    fields = [
 
        'created_time',
 
        'paid_time',
 
        'name',
 
        'email',
 
        'amount',
 
        'acknowledge_publicly',
 
        'add_to_mailing_list',
 
        'tshirt_size',
 
        'street',
 
        'city',
 
        'state',
 
        'zip_code',
 
        'country',
 
    ]
 

	
 
    readonly_fields = ['created_time', 'paid_time']
 
    list_display = ['created_time', 'name', 'email', 'amount', 'paid']
 
    list_filter = ['paid_time']
conservancy/supporters/forms.py
Show inline comments
 
new file 100644
 
from django import forms
 

	
 
from .models import SustainerOrder
 

	
 
class SustainerForm(forms.ModelForm):
 
    class Meta:
 
        model = SustainerOrder
 
        fields = [
 
            'name',
 
            'email',
 
            'amount',
 
            'acknowledge_publicly',
 
            'add_to_mailing_list',
 
            'tshirt_size',
 
            'street',
 
            'city',
 
            'state',
 
            'zip_code',
 
            'country',
 
        ]
 

	
 
    def __init__(self, *args, **kwargs):
 
        super().__init__(*args, **kwargs)
 
        self.fields['amount'].widget.attrs['style'] = 'width: 5rem'
 
        self.fields['tshirt_size'].widget.attrs['x-model'] = 'tshirt_size'
conservancy/supporters/migrations/0001_initial.py
Show inline comments
 
new file 100644
 
# Generated by Django 4.2.11 on 2024-07-22 05:16
 

	
 
from django.db import migrations, models
 

	
 

	
 
class Migration(migrations.Migration):
 

	
 
    initial = True
 

	
 
    dependencies = []
 

	
 
    operations = [
 
        migrations.CreateModel(
 
            name='Supporter',
 
            fields=[
 
                (
 
                    'id',
 
                    models.AutoField(
 
                        auto_created=True,
 
                        primary_key=True,
 
                        serialize=False,
 
                        verbose_name='ID',
 
                    ),
 
                ),
 
                ('display_name', models.CharField(max_length=200)),
 
                (
 
                    'display_until_date',
 
                    models.DateTimeField(
 
                        verbose_name='date until which this supporter name is displayed'
 
                    ),
 
                ),
 
                ('ledger_entity_id', models.CharField(max_length=200)),
 
            ],
 
            options={
 
                'ordering': ('ledger_entity_id',),
 
            },
 
        ),
 
        migrations.CreateModel(
 
            name='SustainerOrder',
 
            fields=[
 
                (
 
                    'id',
 
                    models.AutoField(
 
                        auto_created=True,
 
                        primary_key=True,
 
                        serialize=False,
 
                        verbose_name='ID',
 
                    ),
 
                ),
 
                ('created_time', models.DateTimeField(auto_now_add=True)),
 
                ('name', models.CharField(max_length=255)),
 
                ('email', models.EmailField(max_length=254)),
 
                ('amount', models.DecimalField(decimal_places=2, max_digits=9)),
 
                ('paid_time', models.DateTimeField(null=True)),
 
                ('acknowledge_publicly', models.BooleanField(default=False)),
 
                ('add_to_mailing_list', models.BooleanField(default=False)),
 
                ('tshirt_size', models.CharField(max_length=50)),
 
                ('street', models.CharField(blank=True, max_length=255)),
 
                ('city', models.CharField(blank=True, max_length=255)),
 
                ('state', models.CharField(blank=True, max_length=255)),
 
                ('zip_code', models.CharField(blank=True, max_length=255)),
 
                ('country', models.CharField(blank=True, max_length=255)),
 
            ],
 
        ),
 
    ]
conservancy/supporters/migrations/__init__.py
Show inline comments
 
new file 100644
conservancy/supporters/models.py
Show inline comments
 
from django.core import validators
 
from django.db import models
 

	
 

	
 
class Supporter(models.Model):
 
    """Conservancy Supporter listing"""
 

	
 
    display_name = models.CharField(max_length=200, blank=False)
 
    display_until_date = models.DateTimeField("date until which this supporter name is displayed")
 
    ledger_entity_id = models.CharField(max_length=200, blank=False)
 

	
 
    def test(self):
 
        return "TESTING"
 
    def __str__(self):
 
        return self.display_name
 

	
 
    class Meta:
 
        ordering = ('ledger_entity_id',)
 

	
 

	
 
class SustainerOrder(models.Model):
 
    TSHIRT_CHOICES = [
 
        (
 
            '',
 
            (("None", "None"),),
 
        ),
 
        (
 
            "Men's",
 
            (
 
                ("Men's S", "Men's S"),
 
                ("Men's M", "Men's M"),
 
                ("Men's L", "Men's L"),
 
                ("Men's XL", "Men's XL"),
 
                ("Men's 2XL", "Men's 2XL"),
 
            ),
 
        ),
 
        (
 
            "Standard women's",
 
            (
 
                ("Standard women's S", "Standard women's S"),
 
                ("Standard women's M", "Standard women's M"),
 
                ("Standard women's L", "Standard women's L"),
 
                ("Standard women's XL", "Standard women's XL"),
 
                ("Standard women's 2XL", "Standard women's 2XL"),
 
            ),
 
        ),
 
        (
 
            "Fitted women's",
 
            (
 
                ("Fitted women's S", "Fitted women's S"),
 
                ("Fitted women's M", "Fitted women's M"),
 
                ("Fitted women's L", "Fitted women's L"),
 
                ("Fitted women's XL", "Fitted women's XL"),
 
                ("Fitted women's 2XL", "Fitted women's 2XL"),
 
            ),
 
        ),
 
    ]
 

	
 
    created_time = models.DateTimeField(auto_now_add=True)
 
    name = models.CharField(max_length=255)
 
    email = models.EmailField()
 
    amount = models.IntegerField(
 
        default=128,
 
        validators=[
 
            validators.MinValueValidator(100),
 
        ])
 
    paid_time = models.DateTimeField(null=True, blank=True)
 
    acknowledge_publicly = models.BooleanField(default=False)
 
    add_to_mailing_list = models.BooleanField(default=False)
 
    tshirt_size = models.CharField(max_length=50, choices=TSHIRT_CHOICES)
 
    street = models.CharField(max_length=255, blank=True)
 
    city = models.CharField(max_length=255, blank=True)
 
    state = models.CharField(max_length=255, blank=True)
 
    zip_code = models.CharField(max_length=255, blank=True)
 
    country = models.CharField(max_length=255, blank=True)
 

	
 
    def __str__(self):
 
        return f'Sustainer order {self.id}: {self.email}'
 

	
 
    def paid(self):
 
        return self.paid_time is not None
conservancy/supporters/templates/supporters/stripe_success.html
Show inline comments
 
new file 100644
 
{% extends "base_conservancy.html" %}
 
{% load static %}
 
{% block subtitle %}Support Conservancy - {% endblock %}
 
{% block category %}sustainer{% endblock %}
 

	
 
{% block content %}
 
  <h1 class="lh-title tc mt4 mb4">Thanks!</h1>
 
{% endblock %}
conservancy/supporters/templates/supporters/sustainers_stripe.html
Show inline comments
 
new file 100644
 
{% extends "base_conservancy.html" %}
 
{% load static %}
 
{% block subtitle %}Support Conservancy - {% endblock %}
 
{% block category %}sustainer{% endblock %}
 

	
 
{% block head %}
 
  {{ block.super }}
 
  <style>
 
   @media screen and (min-width: 40em) {
 
     #sustainer-grid {
 
       display: grid;
 
       grid-template-columns: 2fr 1fr;
 
       grid-template-rows: min-content 1fr;
 
       gap: 1.5rem;
 
     }
 
   }
 
   progress {
 
     background: #ddd;
 
     border: none;
 
   }
 
   progress::-moz-progress-bar {
 
     background: #224c57;
 
   }
 
   progress::-webkit-progress-bar {
 
     background: #ddd;
 
   }
 
   progress::-webkit-progress-value {
 
     background: #224c57;
 
   }
 
  </style>
 
{% endblock %}
 

	
 
{% block content %}
 
  <h1 class="lh-title tc mt4 mb0">Become a Sustainer Now</h1>
 
  <p class="measure-wide center tc">Sustainers help us do our work in a strategic, long-term way.</p>
 

	
 
  <div id="sustainer-grid" class="mv4">
 
    <div style="grid-row: 1 / span 2">
 
      <video controls poster="https://sfconservancy.org/videos/sfc-introduction-video_poster.jpg" class="mb3">
 
        <source src="https://sfconservancy.org/videos/sfc-introduction_1080p.mp4">
 
        <track src="/docs/sfc-introduction-vtt-captions.txt" kind="subtitles" srclang="en" label="English">
 
        <a href="https://sfconservancy.org/videos/sfc-introduction_1080p.mp4"><img src="https://sfconservancy.org/videos/sfc-introduction-video_poster.jpg" alt="Software Freedom Conservancy introduction video"></a><br>
 
        <a href="https://youtu.be/yCCxMfW0LTM">(watch on Youtube)</a>
 
      </video>
 

	
 
      <h3>The wide range of work we engage in is supported by people like you.</h3>
 

	
 
      <p>We are so proud that we're funded by individuals and stay unbeholden to corporate interests and pressures. We stand up for developers, consumers and those who have been historically excluded. We work to make technology truly fair for all. </p>
 

	
 
      <p>Thank you for helping making this work possible:</p>
 

	
 
      <ul>
 
        <li>Standing up for consumer rights in <a href="/copyleft-compliance/">copyleft compliance</a></li>
 
        <li>Supporting <a href="https://outreachy.org">Outreachy</a> with its increasing number of interns</li>
 
        <li>Bringing <a href="/vizio">legal action against prolific license violators</a></li>
 
        <li>Hiring team members to get projects <a href="https://reproducible-builds.org/news/">like Reproducible Builds</a> to continue pushing the forefront of software reproducibility</li>
 
      </ul>
 

	
 
<h3 id="HelpUs">Help us Continue this Work</h3>
 

	
 
<p>We are beyond thankful for the ability to continue our work &mdash; which
 
  only continues due to <strong>your financial contributions</strong>. We
 
  recognize that not everyone has the same financial leeway to donate as they
 
  have in the past. But please consider giving what you can so that our
 
  organization can continue to advocate and support the rights of all
 
  software users. We work hard and efficiently, and accomplish so much with
 
  our small staff. We hope &mdash; through our hard work, creativity, and
 
  passionate dedication &mdash; that we've demonstrated over the years how
 
  Software Freedom Conservancy continues to be the beacon of change for
 
  software freedom that the world needs. <a href="/donate/">Please consider
 
  donating now!</a></p>
 

	
 

	
 
<details id="YearInReview">
 
  <summary>Our Year in Review</summary>
 

	
 
<p>This has been a big year for Software Freedom Conservancy in our tireless
 
efforts to promote ethical technology, increase diversity and inclusion in
 
FOSS, continuing to fight for your rights with <a
 
href="https://sfconservancy.org/copyleft-compliance/">copyleft compliance</a>,
 
and support our incredible <a href="https://sfconservancy.org/members/current/">member projects</a>.
 
Our staff engaged in many invited speaking opportunities, we grew our staff,
 
and we continue to build community around important issues like the software
 
Right to Repair movement. We hosted our first large conference, <a href="https://fossy.us">FOSSY</a>,
 
and while we finalize details for next year, we hope to see you there to join
 
us in community!</p>
 

	
 
<div class="picture-small right">  <img src="https://nextcloud.sfconservancy.org/apps/files_sharing/publicpreview/pnZYsi2CkjscLwc?file=/&fileId=24825&x=1366&y=768&a=true&etag=f4341a40f90786b0356201c21278ee23" alt="SFC lawyers posing outside at the courthouse“ " /></a>
 
<p>SFC lawyers after recent Vizio case- CC BY-SA 4.0</p></div>
 

	
 
<p>Our <a href="https://vizio.sfconservancy.org">lawsuit against Vizio</a>— the first
 
lawsuit of its kind to seek <b>third party beneficiary rights to the
 
complete, corresponding source code under the GPL</b> is progressing!
 
World-changing, public policy litigation requires resources and time, but
 
it's worth every penny so we can build a future where <b>every consumer</b> has
 
access to the source code they need to modify and repair their devices.  At a
 
<a href="https://sfconservancy.org/blog/2023/oct/12/how-i-watched-motion-summary-judgment-hearing/">recent hearing in the case</a>,
 
we presented
 
<a href="https://sfconservancy.org/news/2023/oct/12/transcript-msj-hearing/">our opposition to Vizio's Summary Judgement Motion</a>,
 
our lawyers
 
<a href="https://sfconservancy.org/docs/Transcript_Full_Vizios_MSJ_HearingDeptC-33.231005.pdf">presented the eloquent case</a>
 
that recipients of software under the GPL Agreements <b>can</b> enforce their
 
rights to the corresponding source code themselves, and that right should not
 
be preempted by copyright law. We are the only organization currently taking
 
legal action to protect the GPL Agreements in the USA; your support is
 
critical for us to continue these kinds of efforts.</p>
 

	
 
<p>We have also <a href="https://sfconservancy.org/news/2020/jul/30/refile2020/">once again</a>
 
filed key DMCA exemptions for the following categories:</p>
 

	
 
<ul>
 
  <li>Computer programs for purposes of good-faith security research</li>
 
  <li>"jailbreaking" smart TVs</li>
 
  <li>"jailbreaking" routers</li>
 
  <li>Literary works consisting of compilations of data generated by medical devices or their personal corresponding monitoring systems, to access personal data</li>
 
</ul>
 

	
 
<p>These allow people access (that should be granted in the first place!) to
 
investigate their own devices for issues of license compliance, security,
 
and replacing the firmware on their TVs and routers. It's a key ability to
 
vet and replace software on devices we own and operate, so renewing this
 
exemption each time it comes up is very important for us all. The medical
 
device exemption was submitted by our Executive Director Karen Sandler in
 
partnership with others who are personally affected by proprietary medical
 
technology.</p>
 

	
 
<p>As software based technology becomes more pervasive in our lives, it's vital
 
that we communicate the importance of software freedom to the wider population.
 
In that vein <a href="https://sfconservancy.org/news/2022/may/12/introduction/">we've created a video</a>
 
(narrated by our Executive Director Karen Sandler) that introduces
 
the ideas of software freedom, and specifically what Software Freedom
 
Conservancy does. We also did a lot of public writings about some of the
 
important issues this year. From <a href="https://sfconservancy.org/news/2023/feb/09/kuhn-neo4j-purethink-expert-report/">our perspective on the Neo4j suit</a>
 
to <a href="https://sfconservancy.org/news/2023/aug/15/exit-zoom/">highlighting problematic behavior from proprietary software companies</a> and calling for folks to Exit Zoom. We'd also like to
 
remind you that as a Sustainer, we will provide you with your own <a href="https://bbb.sfconservancy.org">BigBlueButton</a> account so that you can host your own video calls on a FOSS platform. Once
 
you have donated to us, you can fill our the new account signup and your
 
account will be approved.</p>
 

	
 
<div class="picture-small right">
 
  <a href="https://sfconservancy.org/videos/sfc-introduction_1080p.mp4"><img src="https://sfconservancy.org/videos/sfc-introduction-video_poster.jpg" alt="Thumbnail of video showing a tree and Software Freedom" /></a>
 
</div>
 
</details>
 

	
 
<details id="NewStaff">
 
<summary>New staff!</summary>
 
<p>SFC hired two additional employees this year! General Counsel Rick Sanders
 
joins the team to help with our continued legal needs. Rick has over 20 years
 
experience as a intellectual-property litigator. His expertise has been
 
critical in helping our license compliance efforts and helping our organization
 
take on the increasing needs from projects and new initiatives. SFC's new
 
systems administrator is Paul Visscher. With over 20 years experience with
 
Linux and free software, Paul's belief in the power of free software to help
 
people engage with technology in non-exploitative ways fits in perfectly to
 
support our growing organizational needs and mission. Helping make sure we
 
can provide solid FOSS replacements to proprietary technologies for all of us.</p>
 
</details>
 

	
 
<details id="WritingAndSpeaking">
 
  <summary>Writing and Speaking</summary>
 
<p>Our staff has been presenting and speaking about software freedom all year.
 
Our Executive Director Karen Sandler received an honorary doctorate from
 
Katholieke Universiteit Leuven for her incredible work in FOSS leadership, and
 
her advocacy and pursuit of software freedom and rights for all.
 
  In November she spoke at <a href="https://www.sfscon.it/talks/the-history-of-and-path-forward-for-copyleft-and-the-gpl/">SFSCON about "The History of, and Path forward for, Copyleft and the GPL"</a>.</p>
 

	
 
<div class="picture-small right">
 
<video class="small-right" controls="" poster="/videos/2023-02-02_Sandler-Karen_KU-Leuven_Honorary-Doctorate_still.png" id="doctorate_vid">
 
  <source src="/videos/2023-02-02_Sandler-Karen_KU-Leuven_Honorary-Doctorate.mp4">
 
  <track src="/docs/2023-02-02_Sandler-Karen_KU-Leuven_Honorary-Doctorate.en.txt" kind="subtitles" srclang="en" label="English" />
 
  <track src="/docs/2023-02-02_Sandler-Karen_KU-Leuven_Honorary-Doctorate.nl.txt" kind="subtitles" srclang="nl" label="Dutch (NL)" />
 
</video>
 
<p><a href="/videos/2023-02-02_Sandler-Karen_KU-Leuven_Honorary-Doctorate.mp4">Download Karen's talk</a>
 
  or <a href="https://youtu.be/zca7dOU7jfs">watch on YouTube</a></p>
 
</div>
 

	
 
<p>Policy Fellow Bradley M. Kuhn gave many conference talks and also represented SFC at many
 
government hearings and inquiries. Beginning the year at <a href="https://archive.fosdem.org/2023/schedule/speaker/bradley_m_kuhn/">FOSDEM</a>,
 
Bradley (and Karen) led the Legal and Policy DevRoom. He then spoke at SCaLE
 
20x giving a talk titled <a href="https://www.socallinuxexpo.org/scale/20x/presentations/learning-big-failures-improve-foss-advocacy-and-adoption">Learning From the Big Failures To Improve FOSS Advocacy and Adoption</a>.
 
As the host of a keynote discussion at FOSSY, Bradley facilitated a
 
<a href="https://sfconservancy.org/blog/2023/jul/19/rhel-panel-fossy-2023/">
 
community discussion about the RHEL policy change</a>.
 
As a panel member, he was the only representative for the FOSS community on
 
the FTC's discussion <a href="https://sfconservancy.org/news/2023/oct/04/ftc-ai-panel/">“Creative Economy and Generative AI“</a></p>
 

	
 
<p>Our Director of Compliance, Denver Gingerich, spoke at SFSCON talking about what it's really like to <a href="https://www.sfscon.it/talks/how-do-you-really-do-gpl-enforcement/">enforce the GPL</a>. His talk at FOSSY titled <a href="https://2023.fossy.us/schedule/presentation/84/">You don't carry a phone?! Improving societal acceptance of abnormal people</a>
 
was one of the most talked about from our own conference.
 
Pono represented SFC at <a href="https://www.socallinuxexpo.org/scale/19x">SCaLE
 
19x</a> and <a href="https://seagl.org">SeaGL</a>, which was great to be back
 
at community centered conferences.
 
SFC staffers also participate in key meetings to represent community interests
 
in a variety of FOSS related discussions concerning security, governmental use
 
of FOSS and in critical infrastructure discussions and also presented in
 
classroom to educate students about software freedom.</p>
 
</details>
 

	
 

	
 
<details id="Highlights">
 
  <summary>Highlights from some of our projects</summary>
 
  <p>We've raised, administered and/or facilitated $1.8 million to improve
 
software freedom directly! This includes contractors, interns and students,
 
administrators, and grants for creation, distribution and maintenance of free
 
software projects.  Part of the unique position of our organization is the
 
expertise necessary to do this kind of work.</p>
 

	
 
<div class="picture-small right">
 
  <img class="small-right" src="{% static 'img/outreachy-nigeria-1000-celebration.png' %}"
 
alt="Group Picture: Outreachy interns, mentors, and community coordinators gathered to celebrate the 1,000 interns milestone in Lagos, Nigeria." />
 
  <p>Group Picture: Outreachy interns, mentors, and community coordinators gathered to celebrate the 1,000 interns milestone in Lagos, Nigeria.</p>
 
  <p>You can view a <a href="https://diode.zone/w/p/25ifUPw9Lx42nrb14h41Ru">video of the celebration here.</a></p>
 
</div>
 

	
 
<p><b>Outreachy</b> accepted 63 interns in the December 2022 cohort, and 64
 
interns in the May 2023 cohort with over 30 Free and Open Source software
 
communities.  Bringing in new communities in the Open Science and Humanitarian
 
spheres, Outreachy continues to lead the way in providing opportunities to
 
people subject to systemic bias and impacted by underrepresentation in
 
technology. Celebrating our 1000th intern (!!!), there were celebrations
 
featuring alumni and current interns all over the world. </p>
 

	
 
<p><b>OpenWrt</b> released <a href="https://openwrt.org/releases/23.05/notes-23.05.0">version 23.05.0</a>
 
which continued adding hardware support for myriad devices, now supporting over
 
1790 devices, over 200 of which were added since last year! There is also now
 
support for various Rust packages, and major improvements to the core
 
components. OpenWrt remains one of the most important alternative firmware
 
projects, ensuring user rights in the ability to install (free) software on
 
your own devices.</p>
 

	
 

	
 
<p><a href="https://computinginresearch.org/">The Institute for Computing in
 
Research</a> completed it's fifth year, supporting 32 students in 3 cities this
 
summer. Now providing training, education and real world software experience to
 
high school students in 3 cities and exploring additional cities that may join
 
next summer. These research internships are a great way for high school
 
students to get involved in real academic research while also being exposed to
 
the ideas and principles of software freedom.</p>
 

	
 
<p><a href="https://inkscape.org">Inkscape</a> just celebrated their 20th
 
anniversary! Coinciding with their new <a href="https://inkscape.org/news/2023/11/18/big-small-release-inkscape-131-is-out/">1.3.1 release</a>, Inkscape is as active as ever and proving itself one
 
of the most vital free software projects, full of longevity and an ever
 
growing community. This year has been a big year of development, marking some
 
very exciting developments for the project. Creation of a new <a href="https://inkscape.org/*membership/blog/october-bug-accelerator-2023/">bug accelerator program</a>, a migration to <a href="https://inkscape.org/*membership/blog/august-gtk4-migration-tavmjong/">GTK4</a>, another year of <a href="https://inkscape.org/*membership/blog/customizable-canvas-controls/">GSOC participation</a> and new support for <a href="https://inkscape.org/*membership/blog/may-ai-extension-2023/">Adobe Illustrator import</a>!</p>
 

	
 
<p>Our member projects had a range of in person and online events this year.
 
<b>Inkscape</b> hosted an in-person meeting in Bensberg, Germany. A great meeting
 
for the PLC and contributors to get together to plan and work on technical
 
challenges. The first back in-person <b>Selenium</b> <a
 
href="https://seleniumconf.com/">conference</a> was in Chicago this past
 
may</a>. Attendance from over 10 countries, it was an incredible reunion for
 
the project contributors and users to get together. The <b>Git</b>
 
contributor summit was held online this year in September. Topics ranged from
 
ideas of new library support to how to better support for scaling with large
 
code forges and what the new contributor experience is like. A great mix of
 
code related and process related talks. The <a href="https://reproducible-builds.org/">Reproducible Builds</a>
 
annual summit was hosted in Hamburg featuring incredible
 
technical talks, project planning and continues to build the momentum and
 
reach for reproducibility. </p>
 
</details>
 

	
 

	
 
      <h3>Our sustainers</h3>
 

	
 
      <p>Anonymous (100 people), Aurimas Fišeras, Kat Walsh, Richard Wheeler, Karl Ove Hufthammer, Mark Wielaard, Karl Fogel, Richard Fontana, Richard L. Schmeidler, Karen Sandler, Russ Allbery, Christine Webber, Jeremy Allison, J.B. Nicholson, Michael Dexter, Tom Marble, Johannes Krampf, Michael Linksvayer, Jack Hill, Stefano Zacchiroli, Daniel Callahan, Ben Cotton, in memory of Marina Zhurakhinskaya, Jim Radford, Tyng-Ruey Chuang, Francois Marier, Henri Sivonen, Keith Packard, Monica Neumann, Michal Nazarewicz, Bdale Garbee, David Neary, Alexander Bokovoy, Andrew Isaacson, Brian Hart, James Pannacciulli, Sasa Poznanovic, David Batley, David Crossland, Steve Sprang, Bob Murphy, Mark Galassi, James R. Garrison, Bluebird Interactive, David Quist, Patrick Masson, Neil McGovern, Lenore Ramm Hill, Paul Logston, David Arnold, Benjamin Pfaff, Timothy Howes, Britta Gustafson, Wookey, Michael Gulick, Tanu Kaskinen, Jeffrey Layton, Raphaël Hertzog, Will Thompson, Matteo Settenvini, Kevin Krammer, Elana Hashman, Richard Schultz, Charkov Alexey, Donald Craig, Michael Catanzaro, Olav Reinert, Stephen Kitt, Barry Fishman, Luigi Toscano, Steve McIntyre, Cornelia Huck, Jonathan McDowell, Emmanuel Seyman, Mike Crowe, Alexandre Julliard, Ross Vandegrift, Ian Jackson, Alexander Reichle-Schmehl, Sang Engineering, Preston Maness, John Hagemeister, Julien Cristau, Rebecca Sobol, John Hughes, Peter Link, Solomon Peachy, Riccardo Ghetta, Stefano Rivera, Julian Gilbey, Srivats P, JRS System Solutions, Eric Dorland, Matija Nalis, Brett Smith, Dmitry Borodaenko, Johannes Berg, Howard Shih, Nigel Whillier, Peter Maydell, Lars Wirzenius, Stephanie Feingold, Kevin Adler, Matthew Vernon, Stefan Seefeld, scrye.com, Robert Horn, Andreas Bombe, Michael Kuhn, Stephen Waite, Philip Cohn-Cort, Stuart Smith, Michel Machado, Joseph Thompson, Joan Sandler, Sage Ross, Peter Levy, Daniel Gillmor, James Carter, Wilson E. Alvarez, Michael Andreen, Aaron Puchert, Andrew Eikum, Vladimir Michl, Gregory Grossmeier, Josh Triplett, James Blair, Felix Gruber, Claire Connelly, Antoine Amarilli, Kenneth J. Pronovici, Igalia S. L., Karl-Johan Karlsson, David Gibson, Tom Callaway, Steven A. Ovadia, Gerard Ryan, James Garrett, William Norris, Luke Faraone, Christian Gelinek, Chris Neugebauer, David Potter, Paul Fenwick, George Bojanov, Jondale Stratton, Kiatikun Luangkesorn, hmk, Yu Tomita, Jure Varlec, Antonin Houska, Chad Henderson, Adam Batkin, Marc Jeanmougin, Mike Dowling, Nicholas George, Leif Lindholm, Diane Trout, Daniel Walls, Donald Anderson, Darrick Wong, Greg Price, Martin Krafft, Tony Sebro, Matthew Treinish, Jason Baker, Kathy Giori, Brennen Bearnes, Olly Betts, Steven Adger, John Maloney, Gargi Sharma, Andrew Janke, Andy Kittner, Holger Levsen, Jacopo Corbetta, Andy Balaam, Justin W. Flory, Albert Chae, Elias Rudberg, Gene Hightower, Asumu Takikawa, John-Isaac Greant, Ulrich Czekalla, Bob Proulx, Nick Alcock, Geoffrey Knauth, Luke Shumaker, Stephen Hinton, Philip McGrath, Anjandev Momi, Meisam Tabriz, Alex Dryden, Thomas Schwinge, Julia Kreger, nicholas Bishop, Rachel Wonnacott, Benjamin Kraus, David Witten, Pontus Ullgren, Brendan Horan, Alex Karle, Michael Pennisi, Dave Jansen, Kit Aultman, Jason Prince, Frank Eigler, Keyhan Vakil, Daniel Whiting, tam phan, Jon Stumpf, Anna Philips, Anthony Symkowick, Drew Fustini, Anthony Mirabella, Eric Perko, Simon Michael, Rod Nayfield, Joerg Jaspert, Lieven Govaerts, David Harris, BRUST, Alexander Couzens, Amisha Singla, Athul Iddya, kyle Davis, Trace Pearson, Paul Williams, Peter Murray, anne fonteyn</p>
 
    </div>
 

	
 
    <div>
 
      <progress min="0" max="100" value="84.5" class="w-100">84.5%</progress>
 
      <div class="mv3">
 
        <div class="f2 b">$15,558</div>
 
        <div class="f5 b black-50">Remaining of the $100,000 goal</div>
 
      </div>
 
      <div class="mv3">
 
        <div class="f2 b">15 days</div>
 
        <div class="f5 b black-50">Remaining</div>
 
      </div>
 
      <div class="mt4">
 
        <a href="{% url "stripe2" %}">
 
          <button type="submit" class="pointer" style="height: 40px; width: 100%; font-size: 18px; font-weight: bold; color: white; background-color: var(--orange); border-radius: 0.5rem; border: none; border-bottom: 2px solid rgba(0,0,0,0.1);">Become a Sustainer!</button>
 
        </a>
 
      </div>
 

	
 
      <div class="mt3">
 
        <figure>
 
          <img src="/static/img/tshirt-2023.png" alt="Software Freedom Conservancy T-shirt">
 
          <figcaption class="tc black-70" style="margin-top: -20px">Our new Sustainer T-shirt</figcaption>
 
        </figure>
 
      </div>
 
    </div>
 
  </div>
 
{% endblock %}
conservancy/supporters/templates/supporters/sustainers_stripe2.html
Show inline comments
 
new file 100644
 
{% extends "base_conservancy.html" %}
 
{% load static %}
 
{% block subtitle %}Support Conservancy - {% endblock %}
 
{% block category %}sustainer{% endblock %}
 

	
 
{% block head %}
 
  {{ block.super }}
 
  <script defer src="{% static "js/vendor/alpine-3.14.1.js" %}"></script>
 
{% endblock %}
 

	
 
{% block content %}
 
  <h1 class="lh-title tc mt4 mb0">Become a Sustainer Now</h1>
 
  <p class="measure-wide center tc">Sustainers help us do our work in a strategic, long-term way.</p>
 

	
 
  <div class="bg-black-05 pa3 br3 mb4 center" style="max-width: 24rem; border: 1px solid #ccc">
 
    <form id="sustainer" method="post" action="."
 
          x-data="{
 
                    tshirt_size: 'None',
 
                    tshirt_required: function () { return this.tshirt_size !== 'None' },
 
                  }">
 
      {% csrf_token %}
 
      <div class="mb2"><label>Name
 
        <span class="db mt1">{{ form.name }}</span>
 
      </label></div>
 
      <div class="mb2"><label>Email
 
        <span class="db mt1">{{ form.email }}</span>
 
      </label>
 
      <p class="f7 black-60 mt1">To send your receipt</p>
 
      </div>
 
      <div class="mb2"><label>Amount
 
        <span class="db mt1">$ {{ form.amount }}</span>
 
      </label></div>
 
      <div class="mv3"><label class="lh-title"><input type="checkbox"> Acknowledge me on the public <a href="">list of sustainers</a></label></div>
 
      <div class="mv3"><label class="lh-title"><input type="checkbox"> Add me to the low-traffic <a href="https://lists.sfconservancy.org/pipermail/announce/">announcements</a> email list</label></div>
 
      <div class="mv3">
 
        <label>T-shirt:
 
          <!-- Form field has an x-model attribute in forms.py. -->
 
          <span class="db mt1">{{ form.tshirt_size }}</span>
 
        </label>
 
        <p class="f7 black-60 mt1">Sizing:
 
          <a href="https://sfconservancy.org/videos/women-2017-to-2020-t-shirt-sizing.jpg" target="_blank" class="black-60">Women's</a>,
 
          <a href="https://sfconservancy.org/videos/men-2017-to-2020-t-shirt-sizing.jpg" target="_blank" class="black-60">Men's</a></p>
 
      </div>
 
      <!-- Using Alpine.js to show/hide the address based on T-shirt choice. -->
 
      <template x-if="tshirt_required">
 
        <fieldset id="address">
 
          <legend>Postal address</legend>
 
        <div class="mb2"><label>Street
 
          <span class="db mt1">{{ form.street }}</span>
 
        </label></div>
 
        <div class="mb2"><label>City
 
          <span class="db mt1">{{ form.city }}</span>
 
        </label></div>
 
        <div class="mb2"><label>State/Region
 
          <span class="db mt1">{{ form.state }}</span>
 
        </label></div>
 
        <div class="mb2"><label>Zip/Postal
 
          <span class="db mt1">{{ form.zip_code }}</span>
 
        </label></div>
 
        <div class="mb2"><label>Country
 
          <span class="db mt1">{{ form.country }}</span>
 
        </label></div>
 
        </fieldset>
 
      </template>
 

	
 
      <div class="mt3"><button type="submit" style="height: 40px; width: 100%; font-size: 18px; font-weight: bold; color: white; background-color: var(--orange); border-radius: 0.5rem; border: none; border-bottom: 2px solid rgba(0,0,0,0.1);">Pay via Stripe</button></div>
 
    </form>
 
  </div>
 
{% endblock %}
conservancy/supporters/urls.py
Show inline comments
 
from django.urls import path
 
from django.views.generic import TemplateView
 

	
 
from . import views
 

	
 
urlpatterns = [
 
    path('', views.sustainers),
 
    path('banner/', TemplateView.as_view(template_name='supporters/banners.html')),
 
    path('banners/', TemplateView.as_view(template_name='supporters/banners.html')),
 
    path('success/', views.success),
 
    path('webhook/', views.webhook),
 
    path('stripe/', views.sustainers_stripe),
 
    path('stripe2/', views.sustainers_stripe2, name='stripe2'),
 
]
conservancy/supporters/views.py
Show inline comments
 
from datetime import datetime
 
import logging
 

	
 
from django.shortcuts import render
 
from django.http import HttpResponse
 
from django.shortcuts import render, redirect
 
from django.utils import timezone
 
import stripe
 

	
 
from .. import ParameterValidator
 
from .models import Supporter
 
from . import forms
 
from .models import Supporter, SustainerOrder
 

	
 
logger = logging.getLogger(__name__)
 

	
 
def sustainers(request):
 
    with ParameterValidator(request.GET, 'upgrade_id') as validator:
 
        try:
 
            amount_param = float(request.GET['upgrade'])
 
        except (KeyError, ValueError):
 
            validator.fail()
 
        else:
 
            validator.validate('{:.2f}'.format(amount_param))
 
    partial_amount = amount_param if validator.valid else 0
 
    context = {
 
        'partial_amount': partial_amount,
 
        'minimum_amount': 120 - partial_amount,
 
    }
 
    return render(request, "supporters/sustainers.html", context)
 

	
 

	
 
def sponsors(request):
 
    """Conservancy Sponsors Page view
 

	
 
    Performs object queries necessary to render the sponsors page.
 
    """
 
    supporters = Supporter.objects.all().filter(display_until_date__gte=datetime.now())
 
    supporters_count = len(supporters)
 
    anonymous_count  = len(supporters.filter(display_name='Anonymous'))
 
    supporters = supporters.exclude(display_name='Anonymous').order_by('ledger_entity_id')
 
    c = {
 
        'supporters' : supporters,
 
        'supporters_count' : supporters_count,
 
        'anonymous_count' : anonymous_count
 
    }
 
    return render(request, "supporters/sponsors.html", c)
 

	
 

	
 
def create_checkout_session(reference_id, email, amount, base_url):
 
    YOUR_DOMAIN = base_url
 
    try:
 
        checkout_session = stripe.checkout.Session.create(
 
            client_reference_id=str(reference_id),
 
            line_items=[
 
                {
 
                    'price_data': {
 
                        'currency': 'usd',
 
                        'product_data': {'name': 'Contribution'},
 
                        'unit_amount': amount * 100,
 
                    },
 
                    'quantity': 1,
 
                },
 
            ],
 
            customer_email=email,
 
            mode='payment',
 
            success_url=YOUR_DOMAIN + '/sustainer/success/?session_id={CHECKOUT_SESSION_ID}',
 
            cancel_url=YOUR_DOMAIN + '/sustainer/stripe/',
 
        )
 
    except Exception as e:
 
        return str(e)
 
    return checkout_session.url
 

	
 

	
 
def sustainers_stripe(request):
 
    return render(request, 'supporters/sustainers_stripe.html', {})
 

	
 

	
 
def sustainers_stripe2(request):
 
    if request.method == 'POST':
 
        form = forms.SustainerForm(request.POST)
 
        if form.is_valid():
 
            order = form.save()
 
            base_url = f'{request.scheme}://{request.get_host()}'
 
            stripe_checkout_url = create_checkout_session(order.id, order.email, order.amount, base_url)
 
            return redirect(stripe_checkout_url)
 
    else:
 
        form = forms.SustainerForm()
 
    return render(request, 'supporters/sustainers_stripe2.html', {'form': form})
 

	
 

	
 
stripe.api_key = 'sk_test_zaAqrpHmpkXnHQfAs4UWkE3d'
 

	
 
def fulfill_checkout(session_id):
 
    print("Fulfilling Checkout Session", session_id)
 

	
 
    # TODO: Make this function safe to run multiple times,
 
    # even concurrently, with the same session ID
 

	
 
    # TODO: Make sure fulfillment hasn't already been
 
    # peformed for this Checkout Session
 

	
 
    # Retrieve the Checkout Session from the API with line_items expanded
 
    checkout_session = stripe.checkout.Session.retrieve(
 
        session_id,
 
        expand=['line_items'],
 
    )
 

	
 
    # Check the Checkout Session's payment_status property
 
    # to determine if fulfillment should be peformed
 
    if checkout_session.payment_status != 'unpaid':
 
        # TODO: Perform fulfillment of the line items
 

	
 
        # TODO: Record/save fulfillment status for this
 
        # Checkout Session
 
        logger.info(f'Session ID {session_id} PAID!')
 
        try:
 
            order = SustainerOrder.objects.get(id=checkout_session['client_reference_id'], paid_time=None)
 
            order.paid_time=timezone.now()
 
            order.save()
 
            logger.info(f'Marked sustainer order {order.id} (order.email) as paid')
 
        except SustainerOrder.DoesNotExist:
 
            logger.info('No action')
 

	
 

	
 
def success(request):
 
    fulfill_checkout(request.GET['session_id'])
 
    return render(request, 'supporters/stripe_success.html', {})
 

	
 

	
 
def webhook(request):
 
    payload = request.body
 
    sig_header = request.META['HTTP_STRIPE_SIGNATURE']
 
    event = None
 

	
 
    # From webhook dashboard
 
    endpoint_secret = 'whsec_lLy9pqxAAHdl4fwiC0cFg1KwR6y4CvOH'
 

	
 
    try:
 
        event = stripe.Webhook.construct_event(
 
            payload, sig_header, endpoint_secret
 
        )
 
    except ValueError:
 
        # Invalid payload
 
        return HttpResponse(status=400)
 
    except stripe.error.SignatureVerificationError:
 
        # Invalid signature
 
        return HttpResponse(status=400)
 

	
 
    if (
 
            event['type'] == 'checkout.session.completed'
 
            or event['type'] == 'checkout.session.async_payment_succeeded'
 
    ):
 
        fulfill_checkout(event['data']['object']['id'])
 

	
 
    return HttpResponse(status=200)
requirements.txt
Show inline comments
 
# Installed in virtualenv
 
Django==4.2.11
 
# Provided by Debian Bookworm.
 
beautifulsoup4==4.11.2
 
html5lib==1.1
 
django-countries==7.3.2
 
Pillow==9.4.0
 
stripe
...
 
\ No newline at end of file
0 comments (0 inline, 0 general)