runtimeBootstrapJs top-level constant

String const runtimeBootstrapJs

Implementation

const String runtimeBootstrapJs = r'''
function bindGroupItemClicks() {
  document.addEventListener('click', function(e) {
    const item = findClosest(e.target, '[data-arcane-group][data-arcane-value]');
    if (!item) return;
    if (item.hasAttribute('data-arcane-action')) return;
    if (item.tagName === 'INPUT') return;
    const groupId = item.getAttribute('data-arcane-group');
    const root = groupRoot(groupId);
    if (!root || root === item) return;
    const value = item.getAttribute('data-arcane-value');
    const mode = root.getAttribute('data-arcane-group-mode') || 'single';
    if (item.getAttribute('data-arcane-disabled') === 'true') return;
    if (mode === 'multi') toggleGroupValue(groupId, value);
    else setGroupValue(groupId, value);
    if (root.getAttribute('data-arcane-group-close-surface') === 'true') {
      const surf = withinSurface(item);
      if (surf) closeSurface(surfaceType(surf), surfaceId(surf));
    }
  }, true);
}

function bindNativeInputs() {
  document.addEventListener('change', function(e) {
    const inp = e.target;
    if (!inp || !inp.matches) return;
    if (inp.matches('input[data-arcane-group][data-arcane-value]')) {
      const groupId = inp.getAttribute('data-arcane-group');
      const value = inp.getAttribute('data-arcane-value');
      const mode = groupMode(groupId);
      if (mode === 'multi') {
        if (inp.checked) {
          const cur = groupValues(groupId);
          if (cur.indexOf(value) < 0) setGroupRawValues(groupId, cur.concat([value]));
        } else {
          const cur = groupValues(groupId);
          const idx = cur.indexOf(value);
          if (idx >= 0) {
            const next = cur.slice();
            next.splice(idx, 1);
            setGroupRawValues(groupId, next);
          }
        }
      } else if (inp.checked) {
        setGroupValue(groupId, value);
      }
    }
    if (inp.matches('select[data-arcane-group]')) {
      const groupId = inp.getAttribute('data-arcane-group');
      const mode = groupMode(groupId);
      if (mode === 'multi') {
        const values = [];
        for (let i = 0; i < inp.options.length; i++) {
          if (inp.options[i].selected) values.push(inp.options[i].value);
        }
        setGroupRawValues(groupId, values);
      } else {
        setGroupValue(groupId, inp.value);
      }
    }
  }, true);
}

function bindOutsideTabs() {
  document.addEventListener('click', function(e) {
    const tab = findClosest(e.target, '[data-arcane-tab][data-arcane-tabs-group]');
    if (!tab) return;
    if (tab.hasAttribute('data-arcane-action')) return;
    if (tab.getAttribute('data-arcane-disabled') === 'true') return;
    const groupId = tab.getAttribute('data-arcane-tabs-group');
    const tabId = tab.getAttribute('data-arcane-tab');
    activateTab(groupId, tabId);
  }, true);
}

function bindAccordions() {
  document.addEventListener('click', function(e) {
    const trigger = findClosest(e.target, '[data-arcane-panel-group][data-arcane-panel]');
    if (!trigger) return;
    if (trigger.hasAttribute('data-arcane-action')) return;
    if (trigger.getAttribute('data-arcane-disabled') === 'true') return;
    const groupId = trigger.getAttribute('data-arcane-panel-group');
    const panelId = trigger.getAttribute('data-arcane-panel');
    togglePanel(groupId, panelId);
  }, true);
}

function bindCarousels() {
  const carousels = document.querySelectorAll('[data-arcane-carousel][data-arcane-carousel-autoplay]');
  for (let i = 0; i < carousels.length; i++) {
    startCarouselAutoplay(carousels[i]);
  }
}

function bindContextMenus() {
  document.addEventListener('contextmenu', function(e) {
    const trigger = findActionTarget(e.target, 'data-arcane-context-trigger');
    if (!trigger) return;
    e.preventDefault();
    const targetId = trigger.getAttribute('data-arcane-context-trigger');
    const surface = querySurface('context-menu', targetId);
    if (!surface) return;
    surface._arcaneContextX = e.clientX;
    surface._arcaneContextY = e.clientY;
    surface.style.position = 'fixed';
    surface.style.top = e.clientY + 'px';
    surface.style.left = e.clientX + 'px';
    openSurface('context-menu', targetId, { trigger: trigger, skipAnchorListener: true });
  }, true);
}

function hydrateInitialState() {
  hydrateThemeFromStorage();
  const surfaces = document.querySelectorAll('[data-arcane-surface][data-arcane-state="closed"]');
  for (let i = 0; i < surfaces.length; i++) {
    surfaces[i].setAttribute('hidden', '');
    surfaces[i].setAttribute('aria-hidden', 'true');
  }
  const opens = document.querySelectorAll('[data-arcane-surface][data-arcane-state="open"]');
  for (let i = 0; i < opens.length; i++) {
    const el = opens[i];
    el.removeAttribute('hidden');
    el.setAttribute('aria-hidden', 'false');
    ARCANE.stack.push({
      type: el.getAttribute('data-arcane-surface'),
      id: el.getAttribute('data-arcane-id'),
      el: el
    });
  }
}

function arcaneInit() {
  if (ARCANE._initialized) return;
  ARCANE._initialized = true;

  document.addEventListener('click', onDocumentClick, false);
  document.addEventListener('change', onDocumentChange, false);
  document.addEventListener('input', onDocumentInput, false);
  document.addEventListener('submit', onDocumentSubmit, false);
  document.addEventListener('dblclick', onDocumentDblClick, false);
  document.addEventListener('contextmenu', onDocumentContextMenu, false);
  document.addEventListener('keydown', onDocumentKeyDown, false);
  document.addEventListener('pointerover', onPointerOver, false);
  document.addEventListener('pointerout', onPointerOut, false);
  document.addEventListener('focusin', onFocusIn, false);
  document.addEventListener('focusout', onFocusOut, false);

  bindGroupItemClicks();
  bindNativeInputs();
  bindOutsideTabs();
  bindAccordions();
  bindContextMenus();
  bindCarousels();
  bindSliders();
  bindCommandKeyboard();
  bindCalendars();
  bindTimePickers();
  hydrateInitialState();

  fireEvent(document, 'arcane:ready', {});
}

if (document.readyState === 'loading') {
  document.addEventListener('DOMContentLoaded', arcaneInit);
} else {
  arcaneInit();
}

ARCANE.init = arcaneInit;
''';