| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | (function () { |
| 10 | "use strict"; |
| 11 | |
| 12 | |
| 13 | function toggleDrawer(open) { |
| 14 | var body = document.body; |
| 15 | var isOpen = open === undefined ? !body.classList.contains("drawer-open") : open; |
| 16 | body.classList.toggle("drawer-open", isOpen); |
| 17 | var toggle = document.querySelector("[data-drawer-toggle]"); |
| 18 | if (toggle) toggle.setAttribute("aria-expanded", isOpen ? "true" : "false"); |
| 19 | } |
| 20 | |
| 21 | document.addEventListener("click", function (e) { |
| 22 | var toggle = e.target.closest("[data-drawer-toggle]"); |
| 23 | if (toggle) { |
| 24 | e.preventDefault(); |
| 25 | toggleDrawer(); |
| 26 | return; |
| 27 | } |
| 28 | if (e.target.closest("[data-drawer-close]") || e.target.classList.contains("drawer-backdrop")) { |
| 29 | toggleDrawer(false); |
| 30 | } |
| 31 | }); |
| 32 | |
| 33 | |
| 34 | |
| 35 | |
| 36 | |
| 37 | document.addEventListener("change", function (e) { |
| 38 | var picker = e.target.closest("[data-theme-picker]"); |
| 39 | if (!picker) return; |
| 40 | var opt = picker.options[picker.selectedIndex]; |
| 41 | var root = document.documentElement; |
| 42 | root.setAttribute("data-theme", picker.value); |
| 43 | if (opt && opt.getAttribute("data-scheme")) { |
| 44 | root.style.colorScheme = opt.getAttribute("data-scheme"); |
| 45 | } |
| 46 | if (picker.form) picker.form.submit(); |
| 47 | }); |
| 48 | |
| 49 | |
| 50 | |
| 51 | |
| 52 | |
| 53 | document.addEventListener("click", function (e) { |
| 54 | document.querySelectorAll("details.clone-menu[open], details.branch-menu[open], details[data-menu][open]").forEach(function (d) { |
| 55 | if (!d.contains(e.target)) d.removeAttribute("open"); |
| 56 | }); |
| 57 | }); |
| 58 | |
| 59 | |
| 60 | |
| 61 | |
| 62 | document.querySelectorAll("[data-autosubmit]").forEach(function (el) { |
| 63 | el.addEventListener("change", function () { |
| 64 | if (el.form) el.form.submit(); |
| 65 | }); |
| 66 | }); |
| 67 | |
| 68 | |
| 69 | document.querySelectorAll("[data-label-dropdown]").forEach(function (dd) { |
| 70 | var summaryLabel = dd.querySelector("[data-label-summary]"); |
| 71 | if (!summaryLabel) return; |
| 72 | function sync() { |
| 73 | var checked = dd.querySelectorAll('input[type="checkbox"]:checked'); |
| 74 | summaryLabel.textContent = ""; |
| 75 | if (checked.length === 0) { |
| 76 | summaryLabel.textContent = "Select labels"; |
| 77 | return; |
| 78 | } |
| 79 | checked.forEach(function (cb) { |
| 80 | var name = cb.getAttribute("data-label-name") || cb.value; |
| 81 | var chip = document.createElement("span"); |
| 82 | chip.style.setProperty("--label-color", cb.getAttribute("data-label-color") || "#888"); |
| 83 | var sep = name.indexOf(": "); |
| 84 | if (sep === -1) { |
| 85 | chip.className = "label-chip"; |
| 86 | chip.textContent = name; |
| 87 | } else { |
| 88 | |
| 89 | chip.className = "label-chip label-chip-scoped"; |
| 90 | chip.innerHTML = '<span class="label-scope"></span><span class="label-value"></span>'; |
| 91 | chip.firstChild.textContent = name.slice(0, sep).trim(); |
| 92 | chip.lastChild.textContent = name.slice(sep + 2).trim(); |
| 93 | } |
| 94 | summaryLabel.appendChild(chip); |
| 95 | }); |
| 96 | } |
| 97 | dd.addEventListener("change", sync); |
| 98 | sync(); |
| 99 | }); |
| 100 | |
| 101 | |
| 102 | |
| 103 | |
| 104 | document.querySelectorAll("[data-link-fields]").forEach(function (wrap) { |
| 105 | var slots = Array.prototype.slice.call(wrap.querySelectorAll(".link-slot")); |
| 106 | var addBtn = wrap.querySelector("[data-link-add]"); |
| 107 | |
| 108 | var firstEmptyShown = false; |
| 109 | slots.forEach(function (s) { |
| 110 | if (s.value.trim()) { |
| 111 | s.hidden = false; |
| 112 | } else if (!firstEmptyShown) { |
| 113 | s.hidden = false; |
| 114 | firstEmptyShown = true; |
| 115 | } else { |
| 116 | s.hidden = true; |
| 117 | } |
| 118 | }); |
| 119 | |
| 120 | function mark() { |
| 121 | var lastVisible = null; |
| 122 | slots.forEach(function (s) { |
| 123 | s.classList.remove("last-visible"); |
| 124 | if (!s.hidden) lastVisible = s; |
| 125 | }); |
| 126 | if (lastVisible) lastVisible.classList.add("last-visible"); |
| 127 | if (addBtn) addBtn.hidden = !slots.some(function (s) { return s.hidden; }); |
| 128 | } |
| 129 | if (addBtn) { |
| 130 | addBtn.addEventListener("click", function () { |
| 131 | var next = slots.filter(function (s) { return s.hidden; })[0]; |
| 132 | if (next) { |
| 133 | next.hidden = false; |
| 134 | next.focus(); |
| 135 | } |
| 136 | mark(); |
| 137 | }); |
| 138 | } |
| 139 | mark(); |
| 140 | }); |
| 141 | |
| 142 | |
| 143 | document.addEventListener("click", function (e) { |
| 144 | var btn = e.target.closest("[data-clipboard]"); |
| 145 | if (!btn) return; |
| 146 | e.preventDefault(); |
| 147 | var text = btn.getAttribute("data-clipboard"); |
| 148 | if (navigator.clipboard) { |
| 149 | navigator.clipboard.writeText(text).then(function () { |
| 150 | var old = btn.getAttribute("aria-label") || btn.textContent; |
| 151 | btn.setAttribute("aria-label", "Copied"); |
| 152 | btn.classList.add("copied"); |
| 153 | setTimeout(function () { |
| 154 | btn.setAttribute("aria-label", old); |
| 155 | btn.classList.remove("copied"); |
| 156 | }, 1200); |
| 157 | }); |
| 158 | } |
| 159 | }); |
| 160 | |
| 161 | |
| 162 | document.addEventListener("keydown", function (e) { |
| 163 | |
| 164 | var tag = (e.target.tagName || "").toLowerCase(); |
| 165 | if (tag === "input" || tag === "textarea" || tag === "select" || e.target.isContentEditable) { |
| 166 | if (e.key === "Escape") e.target.blur(); |
| 167 | return; |
| 168 | } |
| 169 | if (e.key === "/") { |
| 170 | var search = document.querySelector('input[type="search"], [data-search-input]'); |
| 171 | if (search) { |
| 172 | e.preventDefault(); |
| 173 | search.focus(); |
| 174 | } |
| 175 | } else if (e.key === "Escape") { |
| 176 | toggleDrawer(false); |
| 177 | document.querySelectorAll("details.clone-menu[open], details.branch-menu[open], details[data-menu][open]").forEach(function (d) { |
| 178 | d.removeAttribute("open"); |
| 179 | }); |
| 180 | } |
| 181 | }); |
| 182 | |
| 183 | |
| 184 | document.querySelectorAll(".asset-upload").forEach(function (form) { |
| 185 | var input = form.querySelector("input[type=file]"); |
| 186 | var zone = form.querySelector(".dropzone"); |
| 187 | if (!input || !zone) return; |
| 188 | var submit = form.querySelector("button[type=submit]"); |
| 189 | if (submit) submit.hidden = true; |
| 190 | input.addEventListener("change", function () { if (input.files.length) form.submit(); }); |
| 191 | ["dragover", "dragenter", "dragleave", "drop"].forEach(function (ev) { |
| 192 | zone.addEventListener(ev, function (e) { |
| 193 | e.preventDefault(); |
| 194 | zone.classList.toggle("drag", ev === "dragover" || ev === "dragenter"); |
| 195 | if (ev === "drop" && e.dataTransfer.files.length) { input.files = e.dataTransfer.files; form.submit(); } |
| 196 | }); |
| 197 | }); |
| 198 | }); |
| 199 | })(); |