{ "version": 3, "sources": ["../../javascript/sidebar.js", "../../../node_modules/sortablejs/modular/sortable.esm.js", "../../javascript/sidebar_dnd.js", "../../javascript/notifications.js", "../../javascript/koz_dropdown.js", "../../javascript/koz_choices_editor.js", "../../javascript/task_modal.js", "../../javascript/block_editor.js", "../../javascript/page_actions.js"], "sourcesContent": ["// Kozado Sidebar JavaScript\n// Handles sidebar interactivity, workspace switching, dropdowns, etc.\n\ndocument.addEventListener('DOMContentLoaded', function() {\n // ============================================\n // SIDEBAR TOGGLE (Collapse/Expand)\n // ============================================\n\n const sidebarToggle = document.getElementById('sidebar-toggle');\n const primarySidebar = document.getElementById('primary-sidebar');\n const navbarLogoSection = document.getElementById('navbar-logo-section');\n\n if (sidebarToggle && primarySidebar && navbarLogoSection) {\n sidebarToggle.addEventListener('click', function() {\n // Toggle both sidebar and navbar logo section\n primarySidebar.classList.toggle('collapsed');\n navbarLogoSection.classList.toggle('collapsed');\n\n // Save preference\n const isCollapsed = primarySidebar.classList.contains('collapsed');\n localStorage.setItem('kozado_sidebar_collapsed', isCollapsed);\n });\n\n // Restore preference\n const savedState = localStorage.getItem('kozado_sidebar_collapsed');\n if (savedState === 'true') {\n primarySidebar.classList.add('collapsed');\n navbarLogoSection.classList.add('collapsed');\n }\n }\n \n // ============================================\n // WORKSPACE DROPDOWN\n // ============================================\n \n const workspaceDropdownBtn = document.getElementById('workspace-dropdown-btn');\n const workspaceDropdown = document.getElementById('workspace-dropdown');\n \n function closeWorkspaceDropdown() {\n if (workspaceDropdown) {\n workspaceDropdown.classList.remove('show');\n workspaceDropdown.classList.add('hidden');\n }\n }\n\n if (workspaceDropdownBtn && workspaceDropdown) {\n workspaceDropdownBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n workspaceDropdown.classList.toggle('show');\n workspaceDropdown.classList.toggle('hidden');\n });\n \n // Close dropdown when clicking outside\n document.addEventListener('click', function(e) {\n if (!workspaceDropdown.contains(e.target) && !workspaceDropdownBtn.contains(e.target)) {\n closeWorkspaceDropdown();\n }\n });\n \n // Workspace switching\n const workspaceSwitchItems = document.querySelectorAll('.workspace-switch-item');\n workspaceSwitchItems.forEach(item => {\n item.addEventListener('click', function() {\n const slug = this.dataset.workspaceSlug;\n if (slug) {\n window.location.href = '/workspaces/' + slug;\n }\n });\n });\n }\n \n // ============================================\n // PROJECT TREE TOGGLE\n // ============================================\n // Handled inline by _sidebar.html.erb (single source of truth for collapse,\n // icon rotation, and localStorage persistence).\n\n\n // ============================================\n // QUICK SEARCH OVERLAY\n // ============================================\n \n const quickSearchBtn = document.getElementById('quick-search-btn');\n const headerSearchBtn = document.getElementById('header-search-btn');\n const searchOverlay = document.getElementById('search-overlay');\n const globalSearchInput = document.getElementById('global-search-input');\n \n function openSearch() {\n if (searchOverlay) {\n searchOverlay.classList.remove('hidden');\n if (globalSearchInput) {\n globalSearchInput.focus();\n }\n }\n }\n \n function closeSearch() {\n if (searchOverlay) {\n searchOverlay.classList.add('hidden');\n if (globalSearchInput) {\n globalSearchInput.value = '';\n }\n }\n }\n \n if (quickSearchBtn) {\n quickSearchBtn.addEventListener('click', openSearch);\n }\n \n if (headerSearchBtn) {\n headerSearchBtn.addEventListener('click', openSearch);\n }\n \n if (searchOverlay) {\n searchOverlay.addEventListener('click', function(e) {\n if (e.target === searchOverlay) {\n closeSearch();\n }\n });\n }\n \n // Keyboard shortcuts\n document.addEventListener('keydown', function(e) {\n // Cmd/Ctrl + K to open search\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault();\n if (searchOverlay && searchOverlay.classList.contains('hidden')) {\n openSearch();\n } else {\n closeSearch();\n }\n }\n \n // Escape to close overlays\n if (e.key === 'Escape') {\n closeSearch();\n closeNotifications();\n closeUserDropdown();\n closeWorkspaceDropdown();\n }\n });\n \n // ============================================\n // NOTIFICATIONS PANEL\n // ============================================\n \n const notificationsBtn = document.getElementById('notifications-btn');\n const notificationsPanel = document.getElementById('notifications-panel');\n \n function closeNotifications() {\n if (notificationsPanel) {\n notificationsPanel.classList.add('hidden');\n }\n }\n \n if (notificationsBtn && notificationsPanel) {\n notificationsBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n notificationsPanel.classList.toggle('hidden');\n });\n \n document.addEventListener('click', function(e) {\n if (!notificationsPanel.contains(e.target) && !notificationsBtn.contains(e.target)) {\n closeNotifications();\n }\n });\n }\n \n // ============================================\n // USER DROPDOWN\n // ============================================\n \n const userDropdownBtn = document.getElementById('user-dropdown-btn');\n const userDropdown = document.getElementById('user-dropdown');\n \n function closeUserDropdown() {\n if (userDropdown) {\n userDropdown.classList.add('hidden');\n }\n }\n \n if (userDropdownBtn && userDropdown) {\n userDropdownBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n userDropdown.classList.toggle('hidden');\n });\n \n document.addEventListener('click', function(e) {\n if (!userDropdown.contains(e.target) && !userDropdownBtn.contains(e.target)) {\n closeUserDropdown();\n }\n });\n }\n \n // ============================================\n // ALERT CLOSE BUTTONS\n // ============================================\n \n const closeAlertButtons = document.querySelectorAll('.close-alert');\n closeAlertButtons.forEach(btn => {\n btn.addEventListener('click', function() {\n const alert = this.closest('.alert');\n if (alert) {\n alert.style.opacity = '0';\n setTimeout(() => alert.remove(), 300);\n }\n });\n });\n \n // ============================================\n // NEW PROJECT BUTTON\n // ============================================\n // Handled inline by the new-project modal in _sidebar.html.erb.\n\n\n // ============================================\n // TOOLTIP INITIALIZATION (if needed)\n // ============================================\n \n // Add tooltips to buttons with title attribute\n const tooltipElements = document.querySelectorAll('[title]');\n tooltipElements.forEach(el => {\n // Could initialize a tooltip library here\n });\n \n console.log('Kozado sidebar initialized');\n});\n", "/**!\n * Sortable 1.15.7\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */\nfunction _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return _arrayLikeToArray(r);\n}\nfunction _defineProperty(e, r, t) {\n return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nfunction _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nfunction _objectWithoutProperties(e, t) {\n if (null == e) return {};\n var o,\n r,\n i = _objectWithoutPropertiesLoose(e, t);\n if (Object.getOwnPropertySymbols) {\n var n = Object.getOwnPropertySymbols(e);\n for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);\n }\n return i;\n}\nfunction _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nfunction _toConsumableArray(r) {\n return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n}\n\nvar version = \"1.15.7\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n return false;\n}\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType && el.host !== el ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\nfunction css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n } while (!selfOnly && (el = el.parentNode));\n }\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n return list;\n }\n return [];\n}\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect();\n\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n } while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n\n /* jshint boss:true */\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n currentChild++;\n }\n i++;\n }\n return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) {\n return -1;\n }\n\n /* jshint boss:true */\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n } while (elem = elem.parentNode);\n return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function (child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n }\n\n // if fromRect != toRect: animate\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) {\n time = _this.options.animation;\n }\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction repaint(target) {\n return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n\n // Add default options from plugin\n _extends(defaults, initialized.defaults);\n });\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\n ghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n\n _silent = false,\n savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return;\n // false when <= IE11\n if (IE11OrLess) {\n return false;\n }\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n }(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n },\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n },\n /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\n _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n },\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n },\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n },\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[expando]._onDragOver(event);\n }\n }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n this.el = el; // root element\n this.options = options = _extends({}, options);\n\n // Export instance\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n // Disabled on Safari: #1571; Enabled on Safari IOS: #2244\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && (!Safari || IOS),\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults);\n\n // Set default options\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n _prepareGroup(options);\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n }\n\n // Bind events\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n sortables.push(this.el);\n\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n // Add animation state manager\n _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n if (!evt.cancelable) return;\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n _saveInputCheckedState(el);\n\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if (dragEl) {\n return;\n }\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n }\n\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) {\n return;\n }\n\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n target = closest(target, options.draggable, el, false);\n if (target && target.animated) {\n return;\n }\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n }\n\n // Get the index of the dragged element within its parent\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable);\n\n // Check filter\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n }\n\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n }\n\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n\n // Drag start event\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n });\n\n // Chosen item\n toggleClass(dragEl, options.chosenClass, true);\n };\n\n // Disable \"draggable\"\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n if (options.supportPointer) {\n on(ownerDocument, 'pointerup', _this._onDrop);\n // Native D&D triggers pointercancel\n !this.nativeDraggable && on(ownerDocument, 'pointercancel', _this._onDrop);\n } else {\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop);\n }\n\n // Make dragEl draggable (must be before delay for FireFox)\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n pluginEvent('delayStart', this, {\n evt: evt\n });\n\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n if (options.supportPointer) {\n on(ownerDocument, 'pointerup', _this._disableDelayedDrag);\n on(ownerDocument, 'pointercancel', _this._disableDelayedDrag);\n } else {\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n }\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'pointerup', this._disableDelayedDrag);\n off(ownerDocument, 'pointercancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n try {\n if (document.selection) {\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n awaitingDragStarted = false;\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n var options = this.options;\n\n // Apply effect\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost();\n\n // Drag start event\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n _hideGhostForTarget();\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n target = parent; // store last element\n }\n /* jshint boss:true */ while (parent = getParentOrHost(parent));\n }\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n // only set the status to dragging, when we are actually dragging\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n this._onDragStart(evt, true);\n }\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options;\n\n // Position absolutely\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl);\n\n // Set transform-origin\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n pluginEvent('setupClone', this);\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.removeAttribute(\"id\");\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n this._hideClone();\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n }\n\n // #1143: IFrame support workaround\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n _this._hideClone();\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true);\n\n // Set proper drop events\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n on(document, 'drop', _this);\n\n // #1276 fix:\n css(dragEl, 'transform', 'translateZ(0)');\n }\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n window.getSelection().removeAllRanges();\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver( /**Event*/evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n if (_silent) return;\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n\n // Capture animation state\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n _this.captureAnimationState();\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n }\n\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n }\n\n // Animation\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n\n // Null lastTarget if it is not inside a previously swapped element\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n }\n\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n // Do not detect for empty insert if already inserted\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n\n // Call when dragEl has been inserted\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n if (revert) {\n parentEl = rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent('revert');\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n return completed(true);\n }\n var elLastChild = lastChild(el, options.draggable);\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n }\n\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n if (target) {\n targetRect = getRect(target);\n }\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) {\n // the last draggable element is not the last node\n el.insertBefore(dragEl, elLastChild.nextSibling);\n } else {\n el.appendChild(dragEl);\n }\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n if (firstChild === dragEl) {\n return completed(false);\n }\n target = firstChild;\n targetRect = getRect(target);\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n }\n\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n parentEl = dragEl.parentNode; // actualization\n\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n changed();\n return completed(true);\n }\n }\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'pointercancel', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop( /**Event*/evt) {\n var el = this.el,\n options = this.options;\n\n // Get the index of the dragged element within its parent\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode;\n\n // Get again after plugin event\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n if (Sortable.eventCanceled) {\n this._nulling();\n return;\n }\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n _cancelNextTick(this.cloneId);\n _cancelNextTick(this._dragStartId);\n\n // Unbind events\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n css(dragEl, 'transform', '');\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n _disableDraggable(dragEl);\n dragEl.style['will-change'] = '';\n\n // Remove classes\n // ghostClass is added in dragStarted\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n toggleClass(dragEl, this.options.chosenClass, false);\n\n // Drag stop event\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n // Remove event\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // drag from one list and drop into another\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n var el = this.el;\n savedInputChecked.forEach(function (checkEl) {\n if (el.contains(checkEl)) {\n checkEl.checked = true;\n }\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent( /**Event*/evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n break;\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n _globalDragOver(evt);\n }\n break;\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n for (; i < n; i++) {\n el = children[i];\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\n option: function option(name, value) {\n var options = this.options;\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n /**\r\n * Destroy\r\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n return;\n }\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return;\n\n // show clone at dragEl or original position\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\nfunction _globalDragOver( /**Event*/evt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n return retVal;\n}\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\nfunction _unsilent() {\n _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n while (i--) {\n sum += str.charCodeAt(i);\n }\n return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n}\n\n// Export utils\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild,\n expando: expando\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\nSortable.get = function (element) {\n return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt;\n\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback);\n\n // Listener for pointer element change\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn;\n\n // New scroll root, set scrollEl\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n var layersOut = 0;\n var currentParent = scrollEl;\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n }\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction Revert() {}\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n this.sortable.animateAll();\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\n multiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\n folding = false,\n // Folding any other time\n dragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n }\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n dataTransfer.setData('Text', data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n });\n\n // Sort multi-drag elements\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n\n sortable.captureAnimationState();\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n }\n\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute);\n\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n }\n\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n activeSortable._showClone(sortable);\n\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children;\n\n // Multi-drag selection\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n (function () {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n var filter = options.filter;\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n // Check if element is draggable\n if (!closest(children[i], options.draggable, parentEl, false)) continue;\n // Check if element is filtered\n var filtered = filter && (typeof filter === 'function' ? filter.call(sortable, evt, children[i], sortable) : filter.split(',').some(function (criteria) {\n return closest(children[i], criteria.trim(), parentEl, false);\n }));\n if (filtered) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvent: evt\n });\n }\n })();\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n }\n }\n\n // Multi-drag drop\n if (dragStarted && this.isMultiDrag) {\n folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n multiDragIndex++;\n });\n\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent('update');\n dispatchSortableEvent('sort');\n }\n }\n }\n\n // Must be done after capturing individual rects (scroll bar)\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n multiDragSortable = toSortable;\n }\n\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n // Only deselect if selection is in this sortable\n if (multiDragSortable !== this.sortable) return;\n\n // Only deselect if target is not item in this sortable\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n multiDragSortable = sortable;\n }\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n\n // multiDragElements will already be sorted if folding\n var newIndex;\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n return key;\n }\n }\n });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n", "// Kozado Sidebar drag-and-drop\n// -----------------------------\n// Lets the team reorder Projects (top-level roots) and Pages in the left\n// sidebar, and drag a page into a different project or under a different page.\n//\n// Containers (each a SortableJS list):\n// #projects-list -> the top-level project roots (reorder only)\n// .project-pages -> a project's direct pages (parent_id = project id)\n// .page-children -> a page's subpages (parent_id = that page id)\n//\n// Pages share one Sortable `group` so they can move between any page container.\n// Projects live in their own group \u2014 they're roots and can only be reordered.\n//\n// On drop we send the destination container's FULL ordered list of ids to\n// PATCH /pages/reorder, which rewrites `position` (and `parent_id` when the\n// container changed). Separate drag-handle classes per list keep nested\n// sortables from fighting over the same mousedown.\n\nimport Sortable from 'sortablejs';\n\ndocument.addEventListener('DOMContentLoaded', function () {\n const sidebar = document.getElementById('primary-sidebar');\n if (!sidebar) return;\n\n function csrfToken() {\n const t = document.querySelector('meta[name=\"csrf-token\"]');\n return t ? t.getAttribute('content') : '';\n }\n\n // null -> top-level project list\n // string-> a page id (the destination parent)\n // undefined -> not a container we manage (bail)\n function parentIdFor(container) {\n if (container.id === 'projects-list') return null;\n if (container.classList.contains('project-pages')) return container.dataset.projectId || null;\n if (container.classList.contains('page-children')) return container.dataset.parentId || null;\n return undefined;\n }\n\n function orderedIdsFor(container) {\n if (container.id === 'projects-list') {\n return Array.from(container.querySelectorAll(':scope > .project-tree-item'))\n .map(function (el) { return el.dataset.projectPageId; });\n }\n return Array.from(container.querySelectorAll(':scope > .page-tree-item'))\n .map(function (el) { return el.dataset.pageId; });\n }\n\n function persist(container) {\n const parentId = parentIdFor(container);\n if (parentId === undefined) return;\n\n const orderedIds = orderedIdsFor(container).filter(Boolean);\n if (!orderedIds.length) return;\n\n fetch('/pages/reorder', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-CSRF-Token': csrfToken(),\n },\n credentials: 'same-origin',\n body: JSON.stringify({ parent_id: parentId, ordered_ids: orderedIds }),\n })\n .then(function (r) { return r.json().then(function (d) { return { ok: r.ok, d: d }; }); })\n .then(function (res) {\n if (!res.ok || !res.d || !res.d.success) {\n const msg = (res.d && res.d.errors) ? res.d.errors.join(', ') : 'Could not save the new order.';\n // The DOM already moved optimistically; reload to restore the\n // server's truth (e.g. a rejected reparent or a permission error).\n window.alert(msg + '\\n\\nReloading to restore the previous order.');\n window.location.reload();\n }\n })\n .catch(function () {\n window.alert('Network error while saving the new order.\\n\\nReloading to restore the previous order.');\n window.location.reload();\n });\n }\n\n const baseOpts = {\n animation: 150,\n fallbackOnBody: true,\n swapThreshold: 0.65,\n ghostClass: 'koz-drag-ghost',\n chosenClass: 'koz-drag-chosen',\n dragClass: 'koz-drag-active',\n };\n\n // \u2500\u2500 Projects: top-level roots, reorder only \u2500\u2500\n const projectsList = document.getElementById('projects-list');\n if (projectsList) {\n Sortable.create(projectsList, Object.assign({}, baseOpts, {\n group: 'sidebar-projects',\n draggable: '.project-tree-item',\n handle: '.project-drag-handle',\n filter: '#add-project-shortcut',\n onEnd: function (evt) { if (evt.to) persist(evt.to); },\n }));\n }\n\n // \u2500\u2500 Pages: one shared group so they cross projects/parents \u2500\u2500\n function initPageContainer(container) {\n Sortable.create(container, Object.assign({}, baseOpts, {\n group: 'sidebar-pages',\n draggable: '.page-tree-item',\n handle: '.page-drag-handle',\n onEnd: function (evt) {\n if (evt.to) persist(evt.to);\n // Source list lost an item \u2014 its remaining order is unchanged, but the\n // moved page's old siblings keep correct asc positions, so we only\n // re-persist `from` when it differs (a genuine reparent).\n if (evt.from && evt.from !== evt.to) persist(evt.from);\n },\n }));\n }\n\n document\n .querySelectorAll('#primary-sidebar .project-pages, #primary-sidebar .page-children')\n .forEach(initPageContainer);\n});\n", "// Kozado \u2014 global Notifications panel.\n//\n// Powers the bell button + panel in the navbar. Reads bootstrap data from\n// #notifications-panel (rendered by application.html.erb), fetches the\n// current user's notifications, paints them into the panel, toggles the\n// red unread dot on the bell, subscribes to the per-user Pusher channel\n// for live additions, and wires the \"Mark all read\" button.\n//\n// The toggle (open/close on bell click, ESC, outside click) is handled by\n// app/javascript/sidebar.js \u2014 this file is only concerned with data and\n// rendering.\n\n(function () {\n function init() {\n var panel = document.getElementById('notifications-panel');\n if (!panel) return;\n\n var currentUserId = parseInt(panel.dataset.currentUserId, 10);\n var pusherKey = panel.dataset.pusherKey;\n var pusherCluster = panel.dataset.pusherCluster || 'us2';\n\n var btn = document.getElementById('notifications-btn');\n var dot = document.getElementById('notifications-unread-dot');\n var listEl = document.getElementById('notifications-list');\n var emptyEl = document.getElementById('notifications-empty');\n var markAllBtn = document.getElementById('notifications-mark-all-read');\n\n if (!currentUserId || !listEl) return;\n\n var notifications = [];\n var unreadCount = 0;\n\n function updateDot() {\n if (!dot) return;\n if (unreadCount > 0) dot.classList.remove('hidden');\n else dot.classList.add('hidden');\n // Mirror the unread count to any listening desktop wrapper (Electron app\n // listens for this via its preload bridge). No-op in regular browsers.\n try {\n window.dispatchEvent(new CustomEvent('kozado:unread-count', { detail: unreadCount }));\n } catch (e) { /* ignore */ }\n }\n\n function updateMarkAllState() {\n if (!markAllBtn) return;\n markAllBtn.disabled = unreadCount === 0;\n }\n\n function escapeHtml(s) {\n return String(s == null ? '' : s)\n .replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"').replace(/'/g, ''');\n }\n\n // Color cue for the actor avatar fallback. Hashing on actor id keeps a\n // user's chip the same color across notifications without needing a\n // server-side color table.\n var GRADIENTS = [\n 'from-brand to-brand-2',\n 'from-purple to-blue',\n 'from-amber to-pink',\n 'from-green to-teal-400',\n 'from-pink to-purple',\n 'from-blue to-cyan-400'\n ];\n function gradientFor(id) {\n var n = (parseInt(id, 10) || 0) % GRADIENTS.length;\n return GRADIENTS[n < 0 ? n + GRADIENTS.length : n];\n }\n\n function renderItem(n) {\n var actor = n.actor || {};\n var initials = escapeHtml(actor.initials || (actor.name ? actor.name.slice(0, 2).toUpperCase() : '\u00B7'));\n var avatar;\n if (actor.image) {\n avatar =\n '
' +\n '' + initials + '' +\n '\"\"' +\n '
';\n } else {\n avatar =\n '
' +\n '' + initials + '' +\n '
';\n }\n\n var unreadDot = n.read\n ? ''\n : '';\n\n var bodyHtml = n.body\n ? '
' + escapeHtml(n.body) + '
'\n : '';\n\n var rowClasses = 'p-4 hover:bg-bg-3 cursor-pointer flex items-start gap-3' +\n (n.read ? '' : ' bg-bg-2/[0.025]');\n\n return (\n '
' +\n avatar +\n '
' +\n '
' + escapeHtml(n.title) + '
' +\n bodyHtml +\n '
' + escapeHtml(n.created_at_human || '') + '
' +\n '
' +\n unreadDot +\n '
'\n );\n }\n\n function render() {\n if (notifications.length === 0) {\n listEl.innerHTML = '
No notifications yet.
';\n return;\n }\n listEl.innerHTML = notifications.map(renderItem).join('');\n }\n\n function applyState(items, count) {\n notifications = Array.isArray(items) ? items : [];\n unreadCount = typeof count === 'number' ? count : notifications.filter(function (n) { return !n.read; }).length;\n render();\n updateDot();\n updateMarkAllState();\n }\n\n function fetchNotifications() {\n return fetch('/api/notifications', {\n credentials: 'same-origin',\n headers: { 'Accept': 'application/json' }\n })\n .then(function (r) { return r.ok ? r.json() : null; })\n .then(function (data) {\n if (!data) return;\n applyState(data.notifications || [], data.unread_count || 0);\n })\n .catch(function () { /* leave whatever's already rendered */ });\n }\n\n // Click handlers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n listEl.addEventListener('click', function (e) {\n var row = e.target.closest('[data-id]');\n if (!row) return;\n var id = row.getAttribute('data-id');\n var url = row.getAttribute('data-url');\n\n // Optimistically mark the row as read in the panel even if the server\n // fire-and-forget call fails \u2014 the next fetch will reconcile.\n var wasUnread = row.querySelector('[aria-label=\"unread\"]') !== null;\n if (wasUnread) {\n var dotSpan = row.querySelector('[aria-label=\"unread\"]');\n if (dotSpan) dotSpan.remove();\n row.classList.remove('bg-bg-2/[0.025]');\n unreadCount = Math.max(0, unreadCount - 1);\n updateDot();\n updateMarkAllState();\n }\n\n fetch('/api/notifications/' + encodeURIComponent(id) + '/mark_read', {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'Accept': 'application/json' }\n }).catch(function () { /* ignore */ });\n\n if (url) window.location.href = url;\n });\n\n if (markAllBtn) {\n markAllBtn.addEventListener('click', function (e) {\n e.stopPropagation();\n if (markAllBtn.disabled) return;\n fetch('/api/notifications/mark_all_read', {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'Accept': 'application/json' }\n })\n .then(function (r) { return r.ok ? r.json() : null; })\n .then(function () {\n // Re-fetch to pick up read_at on each row (and so the order/\n // styling is consistent with what other tabs/devices see).\n return fetchNotifications();\n })\n .catch(function () { /* ignore */ });\n });\n }\n\n // Refresh when the panel is opened so the user sees the freshest list.\n if (btn) {\n btn.addEventListener('click', function () {\n // sidebar.js toggles `.hidden` synchronously on this same click \u2014\n // by the time this handler runs it reflects the new state.\n if (!panel.classList.contains('hidden')) fetchNotifications();\n });\n }\n\n // Live updates via Pusher \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (pusherKey && typeof Pusher !== 'undefined') {\n try {\n var pusher = new Pusher(pusherKey, { cluster: pusherCluster });\n var channel = pusher.subscribe('user-' + currentUserId);\n channel.bind('new-notification', function (data) {\n if (!data || !data.notification) return;\n var n = data.notification;\n notifications.unshift(n);\n if (notifications.length > 50) notifications.length = 50;\n if (!n.read) unreadCount += 1;\n render();\n updateDot();\n updateMarkAllState();\n // Forward to a desktop wrapper (Electron) if one is listening.\n try {\n window.dispatchEvent(new CustomEvent('kozado:notification', {\n detail: {\n title: n.title || 'Kozado',\n body: n.body || '',\n tag: 'notification-' + n.id,\n url: n.url || '',\n unreadCount: unreadCount\n }\n }));\n } catch (e) { /* ignore */ }\n });\n } catch (e) { /* ignore */ }\n }\n\n // Initial paint\n fetchNotifications();\n }\n\n // Loaded with `defer`; DOM is parsed by the time we run.\n init();\n})();\n", "// Kozado custom dropdown + color palette utilities.\n//\n// `window.KozColors` is the canonical 7-color palette mirrored from\n// DataTableColumn::SELECT_COLORS on the server. It powers status chips,\n// column accents, and the color picker UI everywhere selectable colors appear.\n//\n// `window.createKdd()` builds a styled dropdown that renders against the dark\n// canvas. Used as a drop-in replacement for native ' +\n '
' +\n '
' +\n '' +\n '
';\n\n document.body.appendChild(pop);\n\n const search = pop.querySelector('.tm-tag-pop-search');\n const listEl = pop.querySelector('.tm-tag-pop-list');\n const createWrap = pop.querySelector('.tm-tag-pop-create');\n const createBtn = pop.querySelector('.tm-tag-pop-create-btn');\n const createLabel = pop.querySelector('.tm-tag-pop-create-label');\n\n const renderList = () => {\n listEl.innerHTML = '';\n if (!this._boardTags.length) {\n const empty = document.createElement('div');\n empty.className = 'tm-tag-pop-empty';\n empty.textContent = 'No tags on this board yet';\n listEl.appendChild(empty);\n return;\n }\n const checkedIds = new Set(this._taskTags.map(t => t.id));\n this._boardTags.forEach(tag => {\n const row = document.createElement('button');\n row.type = 'button';\n row.className = 'tm-tag-pop-row';\n row.dataset.tagId = tag.id;\n row.dataset.search = tag.name.toLowerCase();\n if (checkedIds.has(tag.id)) row.dataset.checked = 'true';\n const hex = tag.hex || '#8288A8';\n row.innerHTML =\n '' +\n '' + this.escapeHtml(tag.name) + '' +\n '';\n row.addEventListener('click', (e) => {\n e.stopPropagation();\n const willAdd = row.dataset.checked !== 'true';\n this.toggleTag(tag.id, willAdd);\n if (willAdd) row.dataset.checked = 'true'; else delete row.dataset.checked;\n });\n listEl.appendChild(row);\n });\n };\n renderList();\n\n // Filter + show \"Create\" affordance when query is non-empty and doesn't\n // match an existing tag. Reading from the cached board list keeps the\n // popover responsive without a network round-trip per keystroke.\n search.addEventListener('input', () => {\n const q = search.value.trim().toLowerCase();\n let visible = 0;\n let exact = false;\n listEl.querySelectorAll('.tm-tag-pop-row').forEach(r => {\n const match = !q || r.dataset.search.includes(q);\n r.hidden = !match;\n if (match) visible++;\n if (q && r.dataset.search === q) exact = true;\n });\n if (q && !exact) {\n createWrap.classList.remove('hidden');\n createLabel.textContent = 'Create \"' + search.value.trim() + '\"';\n } else {\n createWrap.classList.add('hidden');\n }\n });\n search.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && !createWrap.classList.contains('hidden')) {\n e.preventDefault();\n createBtn.click();\n }\n if (e.key === 'Escape') { e.preventDefault(); this.closeAddTagPopover(); }\n });\n\n createBtn.addEventListener('click', async (e) => {\n e.stopPropagation();\n const name = search.value.trim();\n if (!name) return;\n try {\n const created = await this.createBoardTag(name);\n if (created) {\n this._boardTags.push(created);\n this._boardTags.sort((a, b) => (a.position || 0) - (b.position || 0));\n this.toggleTag(created.id, true);\n search.value = '';\n createWrap.classList.add('hidden');\n renderList();\n }\n } catch (err) {\n console.error('Tag create failed', err);\n alert('Could not create tag.');\n }\n });\n\n // Position relative to anchor \u2014 clamp to viewport edges.\n const rect = anchor.getBoundingClientRect();\n pop.style.top = (rect.bottom + 6) + 'px';\n pop.style.left = Math.max(8, Math.min(window.innerWidth - 248, rect.left)) + 'px';\n\n setTimeout(() => search.focus(), 30);\n\n const outside = (e) => {\n if (pop.contains(e.target)) return;\n this.closeAddTagPopover();\n };\n setTimeout(() => document.addEventListener('click', outside, true), 0);\n this._activeTagPopover = { element: pop, outside };\n },\n\n closeAddTagPopover() {\n if (!this._activeTagPopover) return;\n document.removeEventListener('click', this._activeTagPopover.outside, true);\n this._activeTagPopover.element.remove();\n this._activeTagPopover = null;\n },\n\n async createBoardTag(name) {\n const response = await fetch('/api/tags/create', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': this.csrfToken },\n body: JSON.stringify({\n tag: { task_board_id: this.currentBoardId, name: name, color: 'gray' },\n socket_id: window._pusherSocketId || null\n })\n });\n if (!response.ok) throw new Error('Failed to create tag');\n const tag = await response.json();\n // Keep the page-level TagManager cache in sync so the manager modal\n // shows the new tag without a refresh.\n if (window.TagManager && Array.isArray(window.TagManager.tags)) {\n window.TagManager.tags.push(tag);\n window.TagManager.render();\n }\n return tag;\n },\n\n // Add or remove a single tag from the current task. Builds the resulting\n // tag id list and posts it to /api/tasks/set_tags so the server has the\n // canonical \"tags this task has\" each time.\n async toggleTag(tagId, add) {\n const currentIds = new Set(this._taskTags.map(t => t.id));\n if (add) currentIds.add(tagId); else currentIds.delete(tagId);\n const ids = Array.from(currentIds);\n\n try {\n const response = await fetch('/api/tasks/set_tags', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': this.csrfToken },\n body: JSON.stringify({\n task_id: this.currentTaskId,\n tag_ids: ids,\n socket_id: window._pusherSocketId || null\n })\n });\n if (!response.ok) throw new Error('Failed to update tags');\n const result = await response.json();\n this._taskTags = result.tags || [];\n this.renderTagPills();\n this.flashSaved();\n this.updateCardTagDots(this._taskTags);\n } catch (error) {\n console.error('Error updating tags:', error);\n alert('Could not update tags.');\n }\n },\n\n updateCardTagDots(tags) {\n const taskCard = document.querySelector(`.task-card[data-task-id=\"${this.currentTaskId}\"]`);\n if (!taskCard) return;\n let row = taskCard.querySelector('.task-card-tags');\n if (!tags || !tags.length) {\n if (row) row.remove();\n return;\n }\n if (!row) {\n row = document.createElement('div');\n row.className = 'task-card-tags flex items-center gap-[5px] mb-2 flex-wrap';\n taskCard.insertBefore(row, taskCard.firstChild);\n }\n row.innerHTML = tags.map(t => {\n const hex = t.hex || '#8288A8';\n return '';\n }).join('');\n },\n\n // Pulls the column's color from the .kanban-column dot and writes it to a\n // CSS custom property on the modal shell so the top accent + status badge\n // reflect the lane the task is in.\n applyColumnAccent(columnId, fallbackName) {\n const shell = document.getElementById('task-modal');\n const badge = document.getElementById('task-modal-column-badge');\n if (!shell || !badge) return;\n\n const columnEl = document.querySelector(`.kanban-column[data-column-id=\"${columnId}\"]`);\n const name = (columnEl?.querySelector('.column-name')?.textContent || fallbackName || '\u2014').trim();\n const dotStyle = columnEl?.querySelector('.column-header > span:first-child')?.style.backgroundColor;\n const hex = this.rgbToHex(dotStyle) || '#5B8BFF';\n const c = window.KozColors ? (window.KozColors.byHex(hex) || window.KozColors.byName('blue')) : null;\n\n badge.textContent = name;\n if (c) {\n shell.style.setProperty('--tm-accent', c.hex);\n shell.style.setProperty('--tm-accent-bg', `rgba(${c.rgb},0.13)`);\n shell.style.setProperty('--tm-accent-rim', `rgba(${c.rgb},0.32)`);\n } else {\n shell.style.setProperty('--tm-accent', hex);\n shell.style.setProperty('--tm-accent-bg', hex + '22');\n shell.style.setProperty('--tm-accent-rim', hex + '55');\n }\n },\n\n // Public hook so the column popover can repaint an open modal when the\n // user picks a new color for the column the current task lives in.\n refreshColumnAccent(columnId, _hex) {\n if (!this.currentTaskId) return;\n const card = document.querySelector(`.task-card[data-task-id=\"${this.currentTaskId}\"]`);\n if (!card || String(card.dataset.columnId) !== String(columnId)) return;\n this.applyColumnAccent(columnId, null);\n },\n\n rgbToHex(s) {\n if (!s) return null;\n const m = String(s).match(/rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/);\n if (!m) return null;\n const h = (n) => { const x = parseInt(n, 10).toString(16); return x.length === 1 ? '0' + x : x; };\n return '#' + (h(m[1]) + h(m[2]) + h(m[3])).toUpperCase();\n },\n\n // Snapshot the current board's columns into kdd options (label + accent swatch).\n collectColumnOptions() {\n return Array.from(document.querySelectorAll('.kanban-column')).map(col => {\n const id = col.dataset.columnId;\n const name = (col.querySelector('.column-name')?.textContent || 'Untitled').trim();\n const dot = col.querySelector('.column-header > span:first-child');\n const hex = this.rgbToHex(dot?.style.backgroundColor) || '#5B8BFF';\n return { value: id, label: name, swatch: hex };\n });\n },\n\n buildColumnDropdown(currentColumnId) {\n const host = document.getElementById('task-modal-column-host');\n if (!host) return;\n const options = this.collectColumnOptions();\n\n if (this.kdds.column) {\n this.kdds.column.setOptions(options);\n this.kdds.column.setValue(String(currentColumnId));\n } else {\n host.innerHTML = '';\n this.kdds.column = window.createKdd({\n value: String(currentColumnId),\n options,\n placeholder: 'Select status\u2026',\n onChange: (v) => {\n this.updateTask({ task_column_id: v });\n // Repaint the badge + accent immediately to reflect the new column.\n this.applyColumnAccent(v, null);\n }\n });\n host.appendChild(this.kdds.column.element);\n }\n },\n\n buildMoveBoardDropdown() {\n const host = document.getElementById('task-modal-move-board-host');\n if (!host) return;\n // Note: API for \"other boards\" is not wired in the original module either.\n // We stub with a single placeholder option until that endpoint exists.\n if (this.kdds.moveBoard) return;\n host.innerHTML = '';\n this.kdds.moveBoard = window.createKdd({\n value: '',\n options: [],\n placeholder: 'Select board\u2026',\n onChange: (v) => { if (v) this.moveToBoard(v); }\n });\n host.appendChild(this.kdds.moveBoard.element);\n },\n\n populateAssignees(assignedUsers, members) {\n const container = document.getElementById('task-modal-assignees');\n if (!container) return;\n const assignedIds = assignedUsers.map(u => u.id);\n\n if (!members || members.length === 0) {\n container.innerHTML = '

No workspace members

';\n return;\n }\n\n container.innerHTML = members.map(member => {\n const checked = assignedIds.includes(member.id) ? 'checked' : '';\n const avatar = window.renderAvatar ? window.renderAvatar(member.name, member.image, 6) : '';\n return ``;\n }).join('');\n },\n\n async updateAssignees() {\n const container = document.getElementById('task-modal-assignees');\n const checkedIds = Array.from(container.querySelectorAll('.tm-assignee-checkbox:checked')).map(cb => parseInt(cb.value));\n\n try {\n const response = await fetch('/api/tasks/set_assignees', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': this.csrfToken },\n body: JSON.stringify({\n task_id: this.currentTaskId,\n user_ids: checkedIds,\n socket_id: window._pusherSocketId || null\n })\n });\n if (!response.ok) throw new Error('Failed to update assignees');\n const result = await response.json();\n this.flashSaved();\n this.updateCardAvatars(result.assigned_users || []);\n } catch (error) {\n console.error('Error updating assignees:', error);\n }\n },\n\n updateCardAvatars(assignedUsers) {\n const taskCard = document.querySelector(`.task-card[data-task-id=\"${this.currentTaskId}\"]`);\n if (!taskCard) return;\n const avatarContainer = taskCard.querySelector('.task-avatars');\n if (!avatarContainer) return;\n avatarContainer.innerHTML = assignedUsers.map(u =>\n window.renderAvatar ? window.renderAvatar(u.name, u.image, 6) : ''\n ).join('');\n },\n\n populateCustomFields(fields, fieldValues) {\n const container = document.getElementById('task-modal-custom-fields');\n if (!container) return;\n container.innerHTML = '';\n this.kdds.fields = {};\n // Cache field metadata for the field-options popover.\n this._fields = fields || [];\n\n if (!fields || fields.length === 0) {\n container.innerHTML = '

No custom properties yet

';\n return;\n }\n\n fields.forEach(field => {\n const value = fieldValues?.[field.id]?.value;\n const row = this.buildFieldRow(field, value);\n container.appendChild(row);\n });\n },\n\n // Builds a single field row (label + input) for the side pane. Selects use\n // kdd; checkbox/text/number/date use styled native inputs. Returns the row\n // element so caller can append.\n buildFieldRow(field, rawValue) {\n const row = document.createElement('div');\n row.className = 'tm-field-row';\n row.dataset.fieldId = field.id;\n\n // Label is a button \u2014 clicking opens the field-options popover so the\n // user can rename, edit choices/colors, or delete.\n const labelBtn = document.createElement('button');\n labelBtn.type = 'button';\n labelBtn.className = 'tm-field-label-btn';\n labelBtn.innerHTML =\n '' + this.escapeHtml(field.name) + '' +\n '';\n labelBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.openFieldOptionsPopover(field, labelBtn);\n });\n row.appendChild(labelBtn);\n\n let value = rawValue;\n // Some serialized values may be JSON-encoded (saveFieldValue stringifies\n // before POSTing). Normalize so we can render consistently.\n if (typeof value === 'string') {\n try { const parsed = JSON.parse(value); if (typeof parsed === 'object' || typeof parsed === 'boolean') value = parsed; } catch(_) {}\n }\n\n const persist = (v) => this.saveFieldValue(field.id, v);\n\n if (field.field_type === 'checkbox') {\n const cb = document.createElement('input');\n cb.type = 'checkbox';\n cb.className = 'tm-field-checkbox';\n cb.checked = (value === true || value === 'true' || value === 1 || value === '1');\n cb.addEventListener('change', () => persist(cb.checked));\n row.appendChild(cb);\n\n } else if (field.field_type === 'select') {\n const opts = this.normalizeChoiceOptions(field.options);\n const kdd = window.createKdd({\n value: value || '',\n options: [{ value: '', label: '\u2014 None \u2014' }].concat(opts),\n placeholder: 'Select\u2026',\n onChange: (v) => persist(v)\n });\n this.kdds.fields[field.id] = kdd;\n row.appendChild(kdd.element);\n\n } else if (field.field_type === 'multi_select') {\n const opts = this.normalizeChoiceOptions(field.options);\n const initial = Array.isArray(value) ? value : (value ? [value] : []);\n const kdd = window.createKddMulti({\n values: initial,\n options: opts,\n placeholder: 'Select\u2026',\n onChange: (v) => persist(v)\n });\n this.kdds.fields[field.id] = kdd;\n row.appendChild(kdd.element);\n\n } else if (field.field_type === 'person') {\n // The API doesn't yet feed the modal a member list per field; reuse the\n // workspace members from the assignees pane via a captured snapshot.\n const opts = this.workspaceMemberOptions();\n const kdd = window.createKdd({\n value: value || '',\n options: [{ value: '', label: '\u2014 None \u2014' }].concat(opts),\n placeholder: 'Select person\u2026',\n onChange: (v) => persist(v)\n });\n this.kdds.fields[field.id] = kdd;\n row.appendChild(kdd.element);\n\n } else if (field.field_type === 'date') {\n const input = document.createElement('input');\n input.type = 'date';\n input.className = 'tm-field-input';\n input.value = value || '';\n input.addEventListener('change', () => persist(input.value));\n row.appendChild(input);\n\n } else if (field.field_type === 'number') {\n const input = document.createElement('input');\n input.type = 'number';\n input.className = 'tm-field-input';\n input.value = value == null ? '' : value;\n input.addEventListener('change', () => persist(input.value));\n row.appendChild(input);\n\n } else if (['url', 'email', 'phone'].includes(field.field_type)) {\n // Link-style fields: render as a clickable chip when filled, with a\n // small edit button next to it. Empty state collapses straight to the\n // editable input so the user can start typing immediately.\n row.appendChild(this._buildLinkField(field, value, persist));\n\n } else if (['created_time', 'last_edited_time'].includes(field.field_type)) {\n // Auto-derived: just show a read-only formatted timestamp.\n const display = document.createElement('div');\n display.className = 'tm-field-readonly';\n display.textContent = this._formatAutoTime(value);\n row.appendChild(display);\n\n } else {\n // text + fallback\n const input = document.createElement('input');\n input.type = 'text';\n input.className = 'tm-field-input';\n input.value = value == null ? '' : value;\n input.addEventListener('change', () => persist(input.value));\n row.appendChild(input);\n }\n\n return row;\n },\n\n // Render a URL / email / phone field as a clickable chip when there's a\n // value (with a tiny edit button), or as an open input when empty.\n _buildLinkField(field, value, persist) {\n const wrap = document.createElement('div');\n const renderEditing = (initial) => {\n wrap.innerHTML = '';\n const input = document.createElement('input');\n input.type = field.field_type === 'email' ? 'email'\n : field.field_type === 'phone' ? 'tel'\n : 'url';\n input.className = 'tm-field-input';\n input.placeholder = ({\n url: 'https://example.com',\n email: 'name@example.com',\n phone: '+1 555 0100'\n })[field.field_type] || '';\n input.value = initial || '';\n const commit = () => {\n const v = input.value.trim();\n if (v === (initial || '')) { renderDisplay(initial || ''); return; }\n persist(v);\n renderDisplay(v);\n };\n input.addEventListener('blur', commit);\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') { e.preventDefault(); input.blur(); }\n if (e.key === 'Escape') { e.preventDefault(); renderDisplay(initial || ''); }\n });\n wrap.appendChild(input);\n input.focus();\n };\n const renderDisplay = (v) => {\n wrap.innerHTML = '';\n if (!v) {\n // Empty: render the input directly so a single click puts the user\n // straight into editing mode (no extra \"Add\" hover affordance).\n renderEditing('');\n return;\n }\n const editRow = document.createElement('div');\n editRow.className = 'tm-field-edit-row';\n\n const link = document.createElement('a');\n link.className = 'tm-field-link';\n link.href = this._linkHref(field.field_type, v);\n link.target = field.field_type === 'url' ? '_blank' : '_self';\n link.rel = 'noopener noreferrer';\n link.innerHTML =\n '' +\n ({\n url: '',\n email: '',\n phone: ''\n })[field.field_type] +\n '' + this.escapeHtml(v) + '';\n editRow.appendChild(link);\n\n const editBtn = document.createElement('button');\n editBtn.type = 'button';\n editBtn.className = 'tm-field-edit-btn';\n editBtn.title = 'Edit';\n editBtn.innerHTML = '';\n editBtn.addEventListener('click', (e) => { e.stopPropagation(); renderEditing(v); });\n editRow.appendChild(editBtn);\n\n wrap.appendChild(editRow);\n };\n renderDisplay(value || '');\n return wrap;\n },\n\n _linkHref(type, value) {\n const v = String(value).trim();\n if (type === 'email') return 'mailto:' + v;\n if (type === 'phone') return 'tel:' + v.replace(/[^\\d+]/g, '');\n // URL: prepend https:// if no protocol is present.\n return /^https?:\\/\\//i.test(v) ? v : 'https://' + v;\n },\n\n _formatAutoTime(iso) {\n if (!iso) return '\u2014';\n try {\n const d = new Date(iso);\n if (isNaN(d.getTime())) return '\u2014';\n return d.toLocaleString(undefined, {\n month: 'short', day: 'numeric', year: 'numeric',\n hour: 'numeric', minute: '2-digit'\n });\n } catch (_) { return '\u2014'; }\n },\n\n workspaceMemberOptions() {\n return Array.from(document.querySelectorAll('#task-modal-assignees .tm-assignee')).map(label => {\n const cb = label.querySelector('.tm-assignee-checkbox');\n const name = label.querySelector('.tm-assignee-name')?.textContent?.trim();\n return { value: cb?.value, label: name || 'User' };\n }).filter(o => o.value);\n },\n\n // Convert a field's `options` payload (legacy strings or {label,color} objects)\n // into kdd options with colored swatches. The hex is pulled from KozColors so\n // server and client stay aligned on what each color identifier means.\n normalizeChoiceOptions(rawOptions) {\n return (rawOptions || []).map(o => {\n if (o && typeof o === 'object') {\n const c = window.KozColors ? window.KozColors.byName(o.color) : null;\n return { value: o.label, label: o.label, swatch: c ? c.hex : '#8288A8' };\n }\n const c = window.KozColors ? window.KozColors.byName('gray') : null;\n return { value: o, label: o, swatch: c ? c.hex : '#8288A8' };\n });\n },\n\n // \u2500\u2500 Field-options popover \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Opens when the user clicks a field's label. Lets them rename the field,\n // edit options + colors (for select / multi_select), and delete the field.\n // Mirrors the column popover from the data-table page in shape and feel.\n openFieldOptionsPopover(field, anchor) {\n this.closeFieldOptionsPopover();\n\n const isSelect = field.field_type === 'select' || field.field_type === 'multi_select';\n\n const pop = document.createElement('div');\n pop.className = 'tm-field-popover';\n pop.innerHTML =\n '
' + this.escapeHtml(this.fieldTypeLabel(field.field_type)) + ' property
' +\n '
' +\n '
' +\n '' +\n '' +\n '
' +\n (isSelect\n ? '
' +\n '' +\n '
' +\n '
'\n : '') +\n '
' +\n '
' +\n '' +\n '
' +\n '' +\n '' +\n '
' +\n '
';\n\n const nameInput = pop.querySelector('#tm-fp-name');\n nameInput.value = field.name;\n\n let choicesEditor = null;\n if (isSelect) {\n const host = pop.querySelector('#tm-fp-choices-host');\n const countEl = pop.querySelector('#tm-fp-count');\n // Normalize incoming options to {label, color} for the editor.\n const initial = (field.options || []).map(o => (typeof o === 'object' && o)\n ? { label: o.label || '', color: o.color || 'gray' }\n : { label: String(o), color: 'gray' }\n );\n choicesEditor = window.createChoicesEditor({\n initialChoices: initial,\n onChange: (cs) => { countEl.textContent = String(cs.filter(c => c.label).length); }\n });\n host.appendChild(choicesEditor.element);\n }\n\n pop.querySelector('#tm-fp-cancel').addEventListener('click', () => this.closeFieldOptionsPopover());\n pop.querySelector('#tm-fp-save').addEventListener('click', () => {\n const newName = nameInput.value.trim() || field.name;\n const choices = isSelect ? choicesEditor.getChoices().filter(c => c.label) : null;\n this.updateField(field.id, { name: newName, options: choices });\n });\n pop.querySelector('.tm-field-pop-delete').addEventListener('click', () => {\n if (!confirm('Delete this property? Any saved values for it will be lost.')) return;\n this.deleteField(field.id);\n });\n\n // Position relative to the anchor (the field label button).\n const rect = anchor.getBoundingClientRect();\n document.body.appendChild(pop);\n const popRect = pop.getBoundingClientRect();\n let top = rect.bottom + 6;\n if (top + popRect.height > window.innerHeight - 12) top = Math.max(12, rect.top - popRect.height - 6);\n pop.style.top = top + 'px';\n pop.style.left = Math.max(12, Math.min(window.innerWidth - popRect.width - 12, rect.left - 12)) + 'px';\n\n // Outside-click \u2192 close (but ignore clicks inside the color picker, which\n // is portaled to body and would otherwise count as outside).\n const outside = (e) => {\n if (pop.contains(e.target)) return;\n const picker = document.querySelector('.koz-ce-picker');\n if (picker && picker.contains(e.target)) return;\n this.closeFieldOptionsPopover();\n };\n setTimeout(() => document.addEventListener('click', outside, true), 0);\n\n this._activeFieldPopover = { element: pop, outside };\n setTimeout(() => nameInput.focus(), 30);\n },\n\n closeFieldOptionsPopover() {\n if (!this._activeFieldPopover) return;\n document.removeEventListener('click', this._activeFieldPopover.outside, true);\n this._activeFieldPopover.element.remove();\n this._activeFieldPopover = null;\n if (window.closeChoicesColorPicker) window.closeChoicesColorPicker();\n },\n\n fieldTypeLabel(t) {\n const found = (this.fieldTypeCatalog() || []).find(x => x.value === t);\n return found ? found.label : 'Text';\n },\n\n async updateField(fieldId, patch) {\n try {\n const response = await fetch('/api/task_board_fields/update', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': this.csrfToken },\n body: JSON.stringify({\n task_board_field: Object.assign({ id: fieldId }, patch)\n })\n });\n if (!response.ok) throw new Error('Failed to update field');\n const updated = await response.json();\n\n // Refresh the cached field metadata + the row's UI without re-fetching\n // the whole task. We rebuild only the affected row to preserve other\n // open inputs.\n this._fields = (this._fields || []).map(f => f.id === fieldId ? updated : f);\n this.refreshFieldRow(fieldId);\n this.closeFieldOptionsPopover();\n this.flashSaved();\n } catch (error) {\n console.error('Error updating field:', error);\n alert('Failed to save property changes');\n }\n },\n\n async deleteField(fieldId) {\n try {\n const response = await fetch('/api/task_board_fields/delete', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': this.csrfToken },\n body: JSON.stringify({ task_board_field: { id: fieldId } })\n });\n if (!response.ok) throw new Error('Failed to delete field');\n\n // Remove the row + drop from cache.\n const row = document.querySelector(`.tm-field-row[data-field-id=\"${fieldId}\"]`);\n if (row) row.remove();\n this._fields = (this._fields || []).filter(f => f.id !== fieldId);\n this.closeFieldOptionsPopover();\n this.flashSaved();\n\n // If no fields remain, restore the empty-state line.\n const container = document.getElementById('task-modal-custom-fields');\n if (container && container.children.length === 0) {\n container.innerHTML = '

No custom properties yet

';\n }\n } catch (error) {\n console.error('Error deleting field:', error);\n alert('Failed to delete property');\n }\n },\n\n // Rebuild a single field row \u2014 preserves the existing value where possible.\n // Used after a field's name or choices change.\n refreshFieldRow(fieldId) {\n const row = document.querySelector(`.tm-field-row[data-field-id=\"${fieldId}\"]`);\n if (!row) return;\n const field = (this._fields || []).find(f => f.id === fieldId);\n if (!field) return;\n\n // Pull the current value from the existing row's controller / inputs.\n let currentValue = null;\n const kdd = this.kdds.fields[field.id];\n if (kdd && typeof kdd.getValue === 'function') currentValue = kdd.getValue();\n else if (kdd && typeof kdd.getValues === 'function') currentValue = kdd.getValues();\n else {\n const input = row.querySelector('input.tm-field-input, input.tm-field-checkbox');\n if (input) currentValue = (input.type === 'checkbox') ? input.checked : input.value;\n }\n\n delete this.kdds.fields[field.id];\n const fresh = this.buildFieldRow(field, currentValue);\n row.replaceWith(fresh);\n },\n\n async loadComments() {\n const container = document.getElementById('task-modal-comments');\n container.innerHTML = '

Loading comments\u2026

';\n\n try {\n const response = await fetch(`/api/task_comments/list/${this.currentTaskId}`);\n if (!response.ok) throw new Error('Failed to load comments');\n const comments = await response.json();\n\n if (comments.length === 0) {\n container.innerHTML = '

No comments yet

';\n return;\n }\n\n container.innerHTML = comments.map(comment => {\n const avatar = window.renderAvatar ? window.renderAvatar(comment.user_name, null, 6) : '';\n return `
\n ${avatar}\n
\n
\n ${this.escapeHtml(comment.user_name)}\n ${this.escapeHtml(comment.created_at_formatted || '')}\n
\n
${this.escapeHtml(comment.content)}
\n
\n
`;\n }).join('');\n } catch (error) {\n console.error('Error loading comments:', error);\n container.innerHTML = '

Failed to load comments

';\n }\n },\n\n async addComment() {\n const input = document.getElementById('task-modal-new-comment');\n const content = input.value.trim();\n if (!content) return;\n try {\n const response = await fetch('/api/task_comments/create', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': this.csrfToken },\n body: JSON.stringify({\n task_comment: {\n task_id: this.currentTaskId,\n user_id: window.currentUserId,\n content: content\n }\n })\n });\n if (!response.ok) throw new Error('Failed to add comment');\n input.value = '';\n this.loadComments();\n this._bumpCardCommentCount(1);\n } catch (error) {\n console.error('Error adding comment:', error);\n alert('Failed to add comment');\n }\n },\n\n // Bump the comment-count badge on the kanban card by `delta`. The wrapper\n // span is always present in the DOM (just hidden when zero) so we only\n // need to update the number + visibility.\n _bumpCardCommentCount(delta) {\n const card = document.querySelector(`.task-card[data-task-id=\"${this.currentTaskId}\"]`);\n if (!card) return;\n const wrap = card.querySelector('.task-card-comment-count');\n const numEl = card.querySelector('.task-card-comment-count-num');\n if (!wrap || !numEl) return;\n const next = Math.max(0, (parseInt(numEl.textContent, 10) || 0) + delta);\n numEl.textContent = String(next);\n wrap.classList.toggle('hidden', next === 0);\n },\n\n autoSave() {\n if (this.saveTimeout) clearTimeout(this.saveTimeout);\n document.getElementById('task-modal-save-status')?.classList.add('hidden');\n this.saveTimeout = setTimeout(() => {\n const title = document.getElementById('task-modal-title').value;\n const description = document.getElementById('task-modal-description').value;\n this.updateTask({ name: title, description: description });\n }, 500);\n },\n\n flashSaved() {\n const el = document.getElementById('task-modal-save-status');\n if (!el) return;\n el.classList.remove('hidden');\n setTimeout(() => el.classList.add('hidden'), 1800);\n },\n\n async updateTask(data) {\n try {\n const response = await fetch('/api/tasks/update', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': this.csrfToken },\n body: JSON.stringify({\n task: { id: this.currentTaskId, ...data },\n socket_id: window._pusherSocketId || null\n })\n });\n if (!response.ok) throw new Error('Failed to update task');\n this.flashSaved();\n\n // Mirror the changes onto the kanban card preview so the user doesn't\n // have to refresh to see them. We use stable .task-card-* hooks added\n // in the ERB / buildTaskCard so the lookup is robust.\n const taskCard = document.querySelector(`.task-card[data-task-id=\"${this.currentTaskId}\"]`);\n if (taskCard) {\n if (data.name != null) {\n const titleEl = taskCard.querySelector('.task-card-title');\n if (titleEl) titleEl.textContent = data.name;\n }\n if (data.description != null) {\n this._syncCardDescription(taskCard, data.description);\n }\n }\n if (data.task_column_id) this.moveCardToColumn(data.task_column_id);\n } catch (error) {\n console.error('Error updating task:', error);\n }\n },\n\n // Insert / update / remove the description preview on a task card.\n // Mirrors the server-side rule: truncate to 120 chars, line-clamp to 2.\n // Position: directly after the title, before progress/footer.\n _syncCardDescription(card, descRaw) {\n const desc = (descRaw || '').toString().trim();\n let descEl = card.querySelector('.task-card-desc');\n\n if (!desc) {\n if (descEl) descEl.remove();\n return;\n }\n\n const truncated = desc.length > 120 ? desc.slice(0, 120) : desc;\n if (descEl) {\n descEl.textContent = truncated;\n return;\n }\n\n // No existing description element \u2014 insert one after the title.\n const title = card.querySelector('.task-card-title');\n if (!title) return;\n descEl = document.createElement('div');\n descEl.className = 'task-card-desc text-[12.5px] text-ink-2 leading-[1.5] mb-2.5 line-clamp-2';\n descEl.textContent = truncated;\n title.insertAdjacentElement('afterend', descEl);\n },\n\n moveCardToColumn(columnId) {\n const taskCard = document.querySelector(`.task-card[data-task-id=\"${this.currentTaskId}\"]`);\n const targetContainer = document.querySelector(`.tasks-container[data-column-id=\"${columnId}\"]`);\n if (taskCard && targetContainer) {\n const emptyState = targetContainer.querySelector('.empty-state');\n if (emptyState) emptyState.remove();\n taskCard.dataset.columnId = columnId;\n targetContainer.appendChild(taskCard);\n }\n },\n\n async saveFieldValue(fieldId, value) {\n try {\n const response = await fetch('/api/tasks/save_field_value', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': this.csrfToken },\n body: JSON.stringify({\n task_id: this.currentTaskId,\n field_id: fieldId,\n value: JSON.stringify(value)\n })\n });\n if (!response.ok) throw new Error('Failed to save field value');\n this.flashSaved();\n } catch (error) {\n console.error('Error saving field value:', error);\n }\n },\n\n async moveToBoard(targetBoardId) {\n try {\n const response = await fetch('/api/tasks/move_to_board', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': this.csrfToken },\n body: JSON.stringify({ task_id: this.currentTaskId, target_board_id: targetBoardId })\n });\n if (!response.ok) throw new Error('Failed to move task');\n const taskCard = document.querySelector(`.task-card[data-task-id=\"${this.currentTaskId}\"]`);\n if (taskCard) taskCard.remove();\n this.close();\n alert('Task moved to the other board');\n } catch (error) {\n console.error('Error moving task:', error);\n alert('Failed to move task');\n }\n },\n\n async deleteTask() {\n try {\n const response = await fetch('/api/tasks/delete', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': this.csrfToken },\n body: JSON.stringify({ task: { id: this.currentTaskId }, socket_id: window._pusherSocketId || null })\n });\n if (!response.ok) throw new Error('Failed to delete task');\n const taskCard = document.querySelector(`.task-card[data-task-id=\"${this.currentTaskId}\"]`);\n if (taskCard) taskCard.remove();\n this.close();\n } catch (error) {\n console.error('Error deleting task:', error);\n alert('Failed to delete task');\n }\n },\n\n // \u2500\u2500 Add-property mini modal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n openAddFieldModal() {\n document.getElementById('add-field-modal-overlay').classList.remove('hidden');\n const nameInput = document.getElementById('new-field-name');\n nameInput.value = '';\n delete nameInput.dataset.userTouched;\n // Once the user starts typing, stop suggesting names from the type catalog.\n nameInput.oninput = () => { nameInput.dataset.userTouched = 'true'; };\n\n document.getElementById('new-field-options-container').classList.add('hidden');\n const search = document.getElementById('new-field-type-search');\n if (search) search.value = '';\n this.buildAddFieldTypeDropdown();\n this.buildAddFieldChoicesEditor();\n setTimeout(() => nameInput.focus(), 30);\n },\n\n closeAddFieldModal() {\n document.getElementById('add-field-modal-overlay').classList.add('hidden');\n if (window.closeChoicesColorPicker) window.closeChoicesColorPicker();\n },\n\n // \u2500\u2500 Type picker (Notion-style) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Catalog drives both the Add-property modal's visual list and the\n // friendly labels used elsewhere. Order is intentional \u2014 we lead with the\n // most common types, then group selectors, then link-style types, then\n // auto/system types. Hints are short single-line descriptions.\n fieldTypeCatalog() {\n return [\n { value: 'text', label: 'Text', hint: 'Free-form text', icon: this._typeIconHtml('text') },\n { value: 'number', label: 'Number', hint: 'Numeric value', icon: this._typeIconHtml('number') },\n { value: 'date', label: 'Date', hint: 'A specific day', icon: this._typeIconHtml('date') },\n { value: 'checkbox', label: 'Checkbox', hint: 'Yes / no toggle', icon: this._typeIconHtml('checkbox') },\n { value: 'select', label: 'Select', hint: 'One of a set of colored options', icon: this._typeIconHtml('select') },\n { value: 'multi_select', label: 'Multi-select', hint: 'Many of a set of colored options', icon: this._typeIconHtml('multi_select') },\n { value: 'person', label: 'Person', hint: 'A workspace member', icon: this._typeIconHtml('person') },\n { value: 'url', label: 'URL', hint: 'A clickable link', icon: this._typeIconHtml('url') },\n { value: 'email', label: 'Email', hint: 'An email address (mailto link)', icon: this._typeIconHtml('email') },\n { value: 'phone', label: 'Phone', hint: 'A phone number (tel link)', icon: this._typeIconHtml('phone') },\n { value: 'created_time', label: 'Created time', hint: 'When the task was created', icon: this._typeIconHtml('created_time') },\n { value: 'last_edited_time', label: 'Last edited time', hint: 'When the task was last updated', icon: this._typeIconHtml('last_edited_time') }\n ];\n },\n\n _typeIconHtml(type) {\n // Compact lucide-style SVGs, sized to fit the .tm-type-icon tile.\n const svgs = {\n text: '',\n number: '',\n date: '',\n checkbox: '',\n select: '',\n multi_select: '',\n person: '',\n url: '',\n email: '',\n phone: '',\n created_time: '',\n last_edited_time: ''\n };\n return svgs[type] || svgs.text;\n },\n\n // Builds the Notion-style type picker as a vertical list of clickable rows.\n // Search input filters by label/hint.\n buildAddFieldTypeDropdown() {\n const host = document.getElementById('new-field-type-host');\n if (!host) return;\n host.innerHTML = '';\n this._addFieldType = 'text';\n\n const catalog = this.fieldTypeCatalog();\n const rows = [];\n catalog.forEach(t => {\n const row = document.createElement('button');\n row.type = 'button';\n row.className = 'tm-type-row';\n row.dataset.type = t.value;\n row.dataset.search = (t.label + ' ' + t.hint).toLowerCase();\n row.innerHTML =\n '' + t.icon + '' +\n '' +\n '' + this.escapeHtml(t.label) + '' +\n '' + this.escapeHtml(t.hint) + '' +\n '' +\n '';\n row.addEventListener('click', (e) => {\n e.stopPropagation();\n this._setAddFieldType(t.value);\n });\n host.appendChild(row);\n rows.push(row);\n });\n\n const empty = document.createElement('div');\n empty.className = 'tm-type-empty';\n empty.textContent = 'No matching types';\n empty.hidden = true;\n host.appendChild(empty);\n\n // Search-as-you-type filter \u2014 hides non-matching rows.\n const search = document.getElementById('new-field-type-search');\n if (search) {\n search.value = '';\n search.oninput = () => {\n const q = search.value.trim().toLowerCase();\n let visible = 0;\n rows.forEach(r => {\n const match = !q || r.dataset.search.includes(q);\n r.hidden = !match;\n if (match) visible++;\n });\n empty.hidden = visible > 0;\n };\n }\n\n this._addFieldTypeRows = rows;\n this._setAddFieldType('text');\n },\n\n _setAddFieldType(value) {\n this._addFieldType = value;\n (this._addFieldTypeRows || []).forEach(r => {\n if (r.dataset.type === value) r.dataset.active = 'true';\n else delete r.dataset.active;\n });\n const showOpts = ['select', 'multi_select'].includes(value);\n document.getElementById('new-field-options-container').classList.toggle('hidden', !showOpts);\n\n // If the user hasn't typed a name, suggest one based on the type.\n const nameInput = document.getElementById('new-field-name');\n if (nameInput && !nameInput.dataset.userTouched) {\n const pretty = (this.fieldTypeCatalog().find(t => t.value === value) || {}).label || '';\n nameInput.value = pretty;\n }\n },\n\n buildAddFieldChoicesEditor() {\n const host = document.getElementById('new-field-options-host');\n if (!host) return;\n host.innerHTML = '';\n const countEl = document.getElementById('new-field-options-count');\n this._addFieldChoicesEditor = window.createChoicesEditor({\n initialChoices: [],\n onChange: (cs) => {\n if (countEl) countEl.textContent = String(cs.filter(c => c.label).length);\n }\n });\n host.appendChild(this._addFieldChoicesEditor.element);\n if (countEl) countEl.textContent = '0';\n },\n\n async addField() {\n const name = document.getElementById('new-field-name').value.trim();\n const fieldType = this._addFieldType || 'text';\n\n if (!name) { alert('Please enter a property name'); return; }\n\n const isSelect = ['select', 'multi_select'].includes(fieldType);\n const options = isSelect && this._addFieldChoicesEditor\n ? this._addFieldChoicesEditor.getChoices().filter(c => c.label)\n : [];\n\n try {\n const response = await fetch('/api/task_board_fields/create', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': this.csrfToken },\n body: JSON.stringify({\n task_board_field: {\n task_board_id: this.currentBoardId,\n name, field_type: fieldType, options\n }\n })\n });\n if (!response.ok) throw new Error('Failed to create field');\n const field = await response.json();\n\n const container = document.getElementById('task-modal-custom-fields');\n const empty = container.querySelector('.tm-empty-line');\n if (empty) empty.remove();\n container.appendChild(this.buildFieldRow(field, null));\n this._fields = (this._fields || []).concat([field]);\n this.closeAddFieldModal();\n } catch (error) {\n console.error('Error creating field:', error);\n alert('Failed to create property');\n }\n },\n\n escapeHtml(text) {\n const div = document.createElement('div');\n div.textContent = text == null ? '' : String(text);\n return div.innerHTML;\n }\n};\n\ndocument.addEventListener('DOMContentLoaded', () => { TaskModal.init(); });\nwindow.TaskModal = TaskModal;\n", "// Block Editor Module - Notion-style content editing\nconst BlockEditor = {\n container: null,\n blocksContainer: null,\n titleInput: null,\n pageId: null,\n saveUrl: null,\n csrfToken: null,\n saveTimeout: null,\n currentSlashQuery: '',\n slashStartPos: null,\n draggedBlock: null,\n dropIndicator: null,\n selectionToolbar: null,\n blockActionsMenu: null,\n currentActionsBlock: null,\n\n // Block types that support inline rich-text formatting (innerHTML-based content).\n // `code` is intentionally excluded \u2014 it's preformatted plaintext.\n RICH_TEXT_TYPES: ['text', 'heading1', 'heading2', 'heading3', 'bullet', 'numbered', 'todo', 'quote', 'callout'],\n\n // Block types whose content is a single uploaded asset or external URL,\n // serialized as a `@ {json}` sentinel line and rendered from a\n // dataset.meta blob rather than .block-content.\n MEDIA_TYPES: ['image', 'video', 'audio', 'file', 'bookmark'],\n\n // Notion-style text color palette. `null` value means \"remove color\".\n TEXT_COLORS: [\n { key: 'default', label: 'Default', hex: null },\n { key: 'gray', label: 'Gray', hex: '#9ca3af' },\n { key: 'brown', label: 'Brown', hex: '#a98467' },\n { key: 'orange', label: 'Orange', hex: '#f59e0b' },\n { key: 'yellow', label: 'Yellow', hex: '#eab308' },\n { key: 'green', label: 'Green', hex: '#22c55e' },\n { key: 'blue', label: 'Blue', hex: '#3b82f6' },\n { key: 'purple', label: 'Purple', hex: '#a855f7' },\n { key: 'pink', label: 'Pink', hex: '#ec4899' },\n { key: 'red', label: 'Red', hex: '#ef4444' },\n ],\n\n blockTypes: [\n { type: 'text', label: 'Text', icon: 'type', shortcut: '', description: 'Plain text paragraph' },\n { type: 'heading1', label: 'Heading 1', icon: null, iconText: 'H1', shortcut: '#', description: 'Large heading' },\n { type: 'heading2', label: 'Heading 2', icon: null, iconText: 'H2', shortcut: '##', description: 'Medium heading' },\n { type: 'heading3', label: 'Heading 3', icon: null, iconText: 'H3', shortcut: '###', description: 'Small heading' },\n { type: 'bullet', label: 'Bulleted list', icon: 'list', shortcut: '-', description: 'Unordered list item' },\n { type: 'numbered', label: 'Numbered list', icon: 'list-ordered', shortcut: '1.', description: 'Ordered list item' },\n { type: 'todo', label: 'To-do list', icon: 'square-check', shortcut: '[]', description: 'Checkbox item' },\n { type: 'quote', label: 'Quote', icon: 'quote', shortcut: '>', description: 'Blockquote' },\n { type: 'divider', label: 'Divider', icon: 'minus', shortcut: '---', description: 'Horizontal line' },\n { type: 'callout', label: 'Callout', icon: 'alert-circle', shortcut: '', description: 'Highlighted note' },\n { type: 'code', label: 'Code', icon: 'code', shortcut: '```', description: 'Code block' },\n { type: 'image', label: 'Image', icon: 'image', shortcut: '', description: 'Upload or embed an image' },\n { type: 'video', label: 'Video', icon: 'video', shortcut: '', description: 'Upload a video file' },\n { type: 'audio', label: 'Audio', icon: 'volume-2', shortcut: '', description: 'Upload an audio clip' },\n { type: 'file', label: 'File', icon: 'paperclip', shortcut: '', description: 'Attach any file' },\n { type: 'bookmark', label: 'Web bookmark', icon: 'bookmark', shortcut: '', description: 'Save a link as a card' },\n ],\n\n init() {\n this.container = document.getElementById('block-editor');\n if (!this.container) return;\n\n this.blocksContainer = document.getElementById('page-blocks');\n this.titleInput = document.getElementById('page-title-input');\n this.pageId = this.container.dataset.pageId;\n this.pageUuid = this.container.dataset.pageUuid;\n this.projectId = this.container.dataset.projectId;\n this.saveUrl = this.container.dataset.saveUrl;\n this.createUrl = this.container.dataset.createUrl || '/pages';\n this.uploadMediaUrl = this.container.dataset.uploadMediaUrl;\n\n // Get CSRF token - prefer data attribute, fallback to meta tag\n this.csrfToken = this.container.dataset.csrfToken\n || document.querySelector('meta[name=\"csrf-token\"]')?.getAttribute('content')\n || document.querySelector('input[name=\"authenticity_token\"]')?.value;\n\n // Parse initial content\n const content = this.blocksContainer?.dataset.content || '';\n this.renderBlocks(this.parseMarkdownToBlocks(content));\n\n this.bindEvents();\n },\n\n parseMarkdownToBlocks(md) {\n if (!md || !md.trim()) {\n return [{ type: 'text', content: '', id: this.generateId() }];\n }\n\n const lines = md.split('\\n');\n const blocks = [];\n let inCodeBlock = false;\n let codeContent = [];\n let codeLanguage = '';\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Code block handling\n if (line.startsWith('```')) {\n if (inCodeBlock) {\n blocks.push({ type: 'code', content: codeContent.join('\\n'), language: codeLanguage, id: this.generateId() });\n codeContent = [];\n codeLanguage = '';\n inCodeBlock = false;\n } else {\n inCodeBlock = true;\n codeLanguage = line.slice(3).trim();\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeContent.push(line);\n continue;\n }\n\n // Page link sentinel \u2014 `@page {\"url\":\"...\",\"icon\":\"...\",\"title\":\"...\",\"uuid\":\"...\"}`\n if (line.startsWith('@page ')) {\n try {\n const meta = JSON.parse(line.slice(6));\n if (meta && meta.url) {\n blocks.push({\n type: 'page_link',\n content: '',\n meta: meta,\n id: this.generateId()\n });\n continue;\n }\n } catch (err) { /* fall through to plain text */ }\n }\n\n // Media sentinels \u2014 `@image {json}`, `@video {json}`, etc.\n // Each carries a `meta` blob with at least `url`. Image/video/audio also\n // support `caption`; file has `name`/`size`; bookmark has `title`/`description`.\n let mediaHandled = false;\n for (const sentinel of this.MEDIA_TYPES) {\n const prefix = '@' + sentinel + ' ';\n if (line.startsWith(prefix)) {\n try {\n const meta = JSON.parse(line.slice(prefix.length));\n if (meta && meta.url) {\n blocks.push({ type: sentinel, content: '', meta: meta, id: this.generateId() });\n mediaHandled = true;\n break;\n }\n } catch (err) { /* fall through */ }\n }\n }\n if (mediaHandled) continue;\n\n // GFM pipe table \u2014 a `| \u2026 |` row immediately followed by a separator\n // row (`| --- | :--: |`). Consume the header, alignment, and all\n // contiguous body rows into a single `table` block. Cell text keeps its\n // inline markdown (rendered later).\n if (this.isTableRow(line) && i + 1 < lines.length && this.isTableSeparator(lines[i + 1])) {\n const header = this.splitTableRow(line);\n const align = this.parseTableAlign(lines[i + 1]);\n const rows = [header];\n let j = i + 2;\n while (j < lines.length && this.isTableRow(lines[j]) && !this.isTableSeparator(lines[j])) {\n rows.push(this.splitTableRow(lines[j]));\n j++;\n }\n blocks.push({ type: 'table', rows, align, id: this.generateId() });\n i = j - 1;\n continue;\n }\n\n // Divider\n if (line.match(/^-{3,}$/) || line.match(/^\\*{3,}$/) || line.match(/^_{3,}$/)) {\n blocks.push({ type: 'divider', content: '', id: this.generateId() });\n continue;\n }\n\n // Headings\n if (line.startsWith('### ')) {\n blocks.push({ type: 'heading3', content: this.inlineMarkdownToHtml(line.slice(4)), id: this.generateId() });\n continue;\n }\n if (line.startsWith('## ')) {\n blocks.push({ type: 'heading2', content: this.inlineMarkdownToHtml(line.slice(3)), id: this.generateId() });\n continue;\n }\n if (line.startsWith('# ')) {\n blocks.push({ type: 'heading1', content: this.inlineMarkdownToHtml(line.slice(2)), id: this.generateId() });\n continue;\n }\n\n // To-do items\n if (line.match(/^- \\[[ x]\\] /i)) {\n const checked = line.match(/^- \\[x\\] /i);\n // Keep
and any inline formatting tags intact \u2014 rendered via innerHTML.\n const todoContent = this.inlineMarkdownToHtml(line.slice(6));\n blocks.push({ type: 'todo', content: todoContent, checked: !!checked, id: this.generateId() });\n continue;\n }\n\n // Bullet lists\n if (line.match(/^[-*+] /)) {\n blocks.push({ type: 'bullet', content: this.inlineMarkdownToHtml(line.slice(2)), id: this.generateId() });\n continue;\n }\n\n // Numbered lists\n if (line.match(/^\\d+\\. /)) {\n const match = line.match(/^(\\d+)\\. (.*)$/);\n if (match) {\n blocks.push({ type: 'numbered', content: this.inlineMarkdownToHtml(match[2]), number: parseInt(match[1]), id: this.generateId() });\n }\n continue;\n }\n\n // Callout (distinct marker so it roundtrips regardless of content)\n if (line.startsWith('>! ')) {\n blocks.push({ type: 'callout', content: this.inlineMarkdownToHtml(line.slice(3)), id: this.generateId() });\n continue;\n }\n\n // Quote\n if (line.startsWith('> ')) {\n blocks.push({ type: 'quote', content: this.inlineMarkdownToHtml(line.slice(2)), id: this.generateId() });\n continue;\n }\n\n // Blank line \u2192 preserve as an empty text block so spacing roundtrips.\n if (line.trim() === '') {\n blocks.push({ type: 'text', content: '', id: this.generateId() });\n continue;\n }\n\n blocks.push({ type: 'text', content: this.inlineMarkdownToHtml(line), id: this.generateId() });\n }\n\n // Ensure at least one empty block\n if (blocks.length === 0) {\n blocks.push({ type: 'text', content: '', id: this.generateId() });\n }\n\n return blocks;\n },\n\n // \u2500\u2500 Inline markdown \u2192 HTML \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Converts inline markdown (**bold**, *italic*, `code`, ~~strike~~,\n // [text](url), bare URLs) into the same inline HTML tags the rich editor\n // already emits and round-trips. Any HTML tags already present in the input\n // (e.g. / from a previous save) are passed through untouched, so this\n // is safe to run on already-formatted content. Output is later run through\n // sanitizeRich at render time.\n inlineMarkdownToHtml(text) {\n if (text == null) return '';\n // Split on HTML tags so existing inline marks survive; only the text\n // segments (even indices) get markdown conversion.\n return String(text).split(/(<[^>]+>)/).map((seg, i) =>\n i % 2 === 1 ? seg : this.convertInlineMarkdown(seg)\n ).join('');\n },\n\n convertInlineMarkdown(s) {\n if (!s) return '';\n const stash = [];\n // Shield with a distinctive ASCII token so the marker can't collide with\n // real text and survives HTML-escaping and the mark regexes untouched.\n const hold = (html) => { stash.push(html); return '@@KZHOLD' + (stash.length - 1) + 'KZ@@'; };\n\n // 1) Inline code \u2014 contents escaped, shielded from all other rules.\n s = s.replace(/`([^`]+)`/g, (_, c) =>\n hold('' + this.escapeHtml(c) + ''));\n\n // 2) Links [label](url) \u2014 restrict to safe schemes.\n s = s.replace(/\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g, (_, label, url) => {\n const safe = /^(https?:\\/\\/|\\/|#|mailto:)/i.test(url) ? url : '#';\n return hold('' + this.escapeHtml(label) + '');\n });\n\n // 3) Bare http(s) URLs \u2192 links.\n s = s.replace(/(^|[\\s(])((https?:\\/\\/)[^\\s<>)]+)/g, (_, pre, url) =>\n pre + hold('' + this.escapeHtml(url) + ''));\n\n // 4) Escape what's left, then apply the ASCII-token marks.\n s = this.escapeHtml(s);\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '$1');\n s = s.replace(/__([^_]+)__/g, '$1');\n s = s.replace(/~~([^~]+)~~/g, '$1');\n s = s.replace(/(^|[^*])\\*([^*\\s][^*]*?)\\*/g, '$1$2');\n s = s.replace(/(^|[^_\\w])_([^_\\s][^_]*?)_/g, '$1$2');\n\n // Restore shielded code/link HTML.\n return s.replace(/@@KZHOLD(\\d+)KZ@@/g, (_, n) => stash[+n]);\n },\n\n // \u2500\u2500 GFM table helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n isTableRow(line) {\n return /^\\s*\\|.*\\|\\s*$/.test(line);\n },\n\n // A separator row: cells of optional `:` + dashes, e.g. `| --- | :--: |`.\n isTableSeparator(line) {\n return /^\\s*\\|?\\s*:?-{1,}:?\\s*(\\|\\s*:?-{1,}:?\\s*)*\\|?\\s*$/.test(line) && line.includes('-');\n },\n\n // Split a `| a | b |` row into trimmed cells, honouring escaped `\\|`.\n splitTableRow(line) {\n let s = line.trim().replace(/^\\|/, '').replace(/\\|\\s*$/, '');\n return s.split(/(? c.trim().replace(/\\\\\\|/g, '|'));\n },\n\n parseTableAlign(sepLine) {\n return this.splitTableRow(sepLine).map(c => {\n const left = c.startsWith(':');\n const right = c.endsWith(':');\n if (left && right) return 'center';\n if (right) return 'right';\n if (left) return 'left';\n return null;\n });\n },\n\n blocksToMarkdown() {\n const blockEls = this.blocksContainer.querySelectorAll('.block-line');\n const lines = [];\n\n // Helper: serialize a block's editable content, preserving inline formatting\n // for rich types (innerHTML, sanitized) and falling back to plain text for\n // code blocks. Returns a single line \u2014 newlines are encoded as
.\n const serializeContent = (contentEl, type) => {\n if (!contentEl) return '';\n if (type === 'code') return contentEl.textContent || '';\n const html = this.sanitizeRich(contentEl.innerHTML || '');\n // Any literal newlines from a
/
child shouldn't sneak into a single markdown line.\n return html.replace(/\\r?\\n/g, '');\n };\n\n blockEls.forEach(blockEl => {\n const type = blockEl.dataset.blockType;\n const contentEl = blockEl.querySelector('.block-content');\n const content = serializeContent(contentEl, type);\n\n switch (type) {\n case 'heading1':\n lines.push(`# ${content}`);\n break;\n case 'heading2':\n lines.push(`## ${content}`);\n break;\n case 'heading3':\n lines.push(`### ${content}`);\n break;\n case 'bullet':\n lines.push(`- ${content}`);\n break;\n case 'numbered':\n const num = blockEl.dataset.number || '1';\n lines.push(`${num}. ${content}`);\n break;\n case 'todo':\n const checked = blockEl.querySelector('input[type=\"checkbox\"]')?.checked;\n lines.push(`- [${checked ? 'x' : ' '}] ${content}`);\n break;\n case 'quote':\n lines.push(`> ${content}`);\n break;\n case 'callout':\n lines.push(`>! ${content}`);\n break;\n case 'divider':\n lines.push('---');\n break;\n case 'table': {\n const table = blockEl.querySelector('table');\n if (!table) break;\n const trs = Array.from(table.querySelectorAll('tr'));\n if (!trs.length) break;\n let align = [];\n try { align = JSON.parse(blockEl.dataset.align || '[]'); } catch (_) { align = []; }\n const serRow = (tr) => '| ' + Array.from(tr.children).map(cell => {\n const cellHtml = this.sanitizeRich(cell.innerHTML || '')\n .replace(/\\r?\\n/g, '')\n .replace(/\\|/g, '\\\\|')\n .trim();\n return cellHtml || ' ';\n }).join(' | ') + ' |';\n\n lines.push(serRow(trs[0]));\n const colCount = trs[0].children.length;\n const sep = [];\n for (let c = 0; c < colCount; c++) {\n const a = align[c];\n sep.push(a === 'center' ? ':---:' : a === 'right' ? '---:' : a === 'left' ? ':---' : '---');\n }\n lines.push('| ' + sep.join(' | ') + ' |');\n for (let r = 1; r < trs.length; r++) lines.push(serRow(trs[r]));\n break;\n }\n case 'code':\n const lang = blockEl.dataset.language || '';\n lines.push('```' + lang);\n lines.push(content);\n lines.push('```');\n break;\n case 'page_link':\n if (blockEl.dataset.meta) {\n lines.push('@page ' + blockEl.dataset.meta);\n }\n break;\n case 'image':\n case 'video':\n case 'audio':\n case 'file':\n case 'bookmark': {\n if (!blockEl.dataset.meta) break;\n let meta = {};\n try { meta = JSON.parse(blockEl.dataset.meta); } catch (_) { meta = {}; }\n // Pull the latest user-edited caption back into meta before serialize.\n const cap = blockEl.querySelector('.block-caption');\n if (cap) meta.caption = cap.textContent || '';\n if (meta.url) lines.push('@' + type + ' ' + JSON.stringify(meta));\n break;\n }\n default:\n // Preserve empty text blocks as blank lines so user-inserted spacing\n // survives a save/reload cycle.\n lines.push(content);\n }\n });\n\n return lines.join('\\n');\n },\n\n renderBlocks(blocks) {\n this.blocksContainer.innerHTML = '';\n\n blocks.forEach((block, index) => {\n const blockEl = this.createBlockElement(block, index);\n this.blocksContainer.appendChild(blockEl);\n });\n\n // Ensure there's always at least one block\n if (blocks.length === 0 || this.blocksContainer.children.length === 0) {\n const emptyBlock = this.createBlockElement({ type: 'text', content: '', id: this.generateId() }, 0);\n this.blocksContainer.appendChild(emptyBlock);\n }\n\n this.updateNumberedLists();\n\n // Re-init lucide icons\n if (typeof lucide !== 'undefined') {\n lucide.createIcons();\n }\n },\n\n createBlockElement(block, index) {\n const div = document.createElement('div');\n div.className = 'block-line flex items-start py-1';\n div.dataset.blockId = block.id;\n div.dataset.blockType = block.type;\n\n if (block.type === 'numbered') {\n div.dataset.number = block.number || (index + 1);\n }\n\n if (block.type === 'code') {\n div.dataset.language = block.language || '';\n }\n\n // Add block button (shows on hover - visibility controlled by CSS)\n const addBtn = document.createElement('button');\n addBtn.className = 'add-block-btn p-1 text-ink-3 hover:text-ink-1 hover:bg-bg-3 rounded mr-1 flex-shrink-0';\n addBtn.innerHTML = '';\n addBtn.addEventListener('click', (e) => {\n e.preventDefault();\n this.showBlockMenu(addBtn, div);\n });\n\n // Drag handle: drag to reorder, click to open the block actions menu.\n const dragHandle = document.createElement('button');\n dragHandle.type = 'button';\n dragHandle.className = 'drag-handle p-1 text-ink-3 hover:text-ink-1 hover:bg-bg-3 rounded cursor-grab mr-1 flex-shrink-0';\n dragHandle.innerHTML = '';\n dragHandle.draggable = true;\n dragHandle.title = 'Click for actions, drag to reorder';\n\n // Distinguish click from drag: track mousedown position; if pointer barely\n // moves between mousedown and mouseup, treat as click (and skip drag).\n let mouseDownAt = null;\n dragHandle.addEventListener('mousedown', (e) => {\n mouseDownAt = { x: e.clientX, y: e.clientY };\n div.draggable = true;\n });\n dragHandle.addEventListener('mouseup', () => {\n div.draggable = false;\n });\n\n dragHandle.addEventListener('click', (e) => {\n // Suppress click that follows a drag (browsers fire click after dragend).\n if (mouseDownAt) {\n const dx = Math.abs((e.clientX || 0) - mouseDownAt.x);\n const dy = Math.abs((e.clientY || 0) - mouseDownAt.y);\n mouseDownAt = null;\n if (dx > 4 || dy > 4) return;\n }\n e.preventDefault();\n e.stopPropagation();\n this.showBlockActionsMenu(dragHandle, div);\n });\n\n div.addEventListener('dragstart', (e) => this.handleDragStart(e, div));\n div.addEventListener('dragend', (e) => this.handleDragEnd(e, div));\n div.addEventListener('dragover', (e) => this.handleDragOver(e, div));\n div.addEventListener('dragleave', (e) => this.handleDragLeave(e, div));\n div.addEventListener('drop', (e) => this.handleDrop(e, div));\n\n div.appendChild(addBtn);\n div.appendChild(dragHandle);\n\n // Content area based on block type\n if (block.type === 'divider') {\n const hr = document.createElement('div');\n hr.className = 'flex-1 border-t border-gray-300 my-3';\n div.appendChild(hr);\n } else if (block.type === 'table') {\n this.renderTableBlock(div, block);\n } else if (this.MEDIA_TYPES.includes(block.type)) {\n this.renderMediaBlock(div, block);\n } else if (block.type === 'page_link') {\n const meta = block.meta || {};\n // Persist the meta on the element so blocksToMarkdown can re-emit it.\n div.dataset.meta = JSON.stringify(meta);\n\n const link = document.createElement('a');\n link.href = meta.url || '#';\n link.className = 'flex items-center gap-2.5 flex-1 px-2 py-1.5 rounded-md text-ink-1 hover:bg-white/[0.04] transition-colors no-underline group/page';\n link.innerHTML =\n '' +\n (meta.icon || '\uD83D\uDCC4') +\n '' +\n '' +\n (meta.title ? this.escapeHtml(meta.title) : 'Untitled') +\n '' +\n '';\n div.appendChild(link);\n } else if (block.type === 'todo') {\n const wrapper = document.createElement('div');\n wrapper.className = 'flex items-start flex-1';\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = block.checked || false;\n checkbox.className = 'mt-1 mr-2 w-4 h-4 text-kozado-500 rounded border-gray-300 focus:ring-kozado-500';\n checkbox.addEventListener('change', () => this.scheduleAutoSave());\n\n const content = document.createElement('div');\n content.className = `block-content flex-1 outline-none ${block.checked ? 'line-through text-gray-400' : ''}`;\n content.contentEditable = true;\n content.innerHTML = this.sanitizeRich(block.content || '');\n content.dataset.placeholder = 'To-do item...';\n\n wrapper.appendChild(checkbox);\n wrapper.appendChild(content);\n div.appendChild(wrapper);\n } else {\n const content = document.createElement('div');\n content.className = 'block-content flex-1 outline-none ' + this.getBlockClass(block.type);\n content.contentEditable = true;\n // Code blocks are plaintext only \u2014 keep textContent so any inline tags render literally.\n if (block.type === 'code') {\n content.textContent = block.content || '';\n } else {\n content.innerHTML = this.sanitizeRich(block.content || '');\n }\n content.dataset.placeholder = this.getPlaceholder(block.type);\n\n if (block.type === 'callout') {\n const wrapper = document.createElement('div');\n wrapper.className = 'flex-1 bg-amber-50 border-l-4 border-amber-400 p-3 rounded-r text-gray-900';\n wrapper.appendChild(content);\n div.appendChild(wrapper);\n } else if (block.type === 'code') {\n content.className = 'block-content flex-1 outline-none font-mono text-sm bg-gray-100 p-3 rounded whitespace-pre-wrap';\n div.appendChild(content);\n } else {\n div.appendChild(content);\n }\n }\n\n return div;\n },\n\n getBlockClass(type) {\n const classes = {\n heading1: 'text-3xl font-bold text-ink-0',\n heading2: 'text-2xl font-semibold text-ink-0',\n heading3: 'text-xl font-semibold text-ink-0',\n quote: 'italic',\n bullet: 'ml-4',\n numbered: 'ml-4',\n code: 'font-mono text-sm',\n };\n return classes[type] || '';\n },\n\n getPlaceholder(type) {\n const placeholders = {\n text: \"Type '/' for commands...\",\n heading1: 'Heading 1',\n heading2: 'Heading 2',\n heading3: 'Heading 3',\n bullet: 'List item',\n numbered: 'List item',\n quote: 'Quote',\n callout: 'Callout text...',\n code: 'Code...',\n };\n return placeholders[type] || \"Type '/' for commands...\";\n },\n\n bindEvents() {\n // Title input auto-save\n this.titleInput?.addEventListener('input', () => this.scheduleAutoSave());\n\n // Block content events\n this.blocksContainer.addEventListener('input', (e) => {\n if (e.target.classList.contains('block-content')) {\n this.handleInput(e);\n } else if (e.target.closest('.block-table')) {\n // Editing a table cell \u2014 just persist.\n this.scheduleAutoSave();\n }\n });\n\n this.blocksContainer.addEventListener('keydown', (e) => {\n if (e.target.classList.contains('block-content')) {\n this.handleKeydown(e);\n }\n });\n\n // Paste markdown \u2192 blocks. Without this, pasted markdown lands as raw text\n // in a single contentEditable block (bold/headings/tables unparsed).\n this.blocksContainer.addEventListener('paste', (e) => this.handlePaste(e));\n\n // Block menu item clicks\n document.addEventListener('click', (e) => {\n const menuItem = e.target.closest('.block-menu-item');\n if (menuItem) {\n const type = menuItem.dataset.blockType;\n this.insertBlockType(type);\n this.hideBlockMenu();\n }\n });\n\n // Close menu on outside click\n document.addEventListener('click', (e) => {\n const menu = document.getElementById('block-menu');\n if (menu && !menu.contains(e.target) && !e.target.closest('.add-block-btn')) {\n this.hideBlockMenu();\n }\n // Close block actions menu on outside click\n if (this.blockActionsMenu && !this.blockActionsMenu.classList.contains('hidden')) {\n if (!this.blockActionsMenu.contains(e.target) && !e.target.closest('.drag-handle')) {\n this.hideBlockActionsMenu();\n }\n }\n });\n\n // Block menu filter\n const filterInput = document.getElementById('block-menu-filter');\n filterInput?.addEventListener('input', (e) => {\n this.filterBlockMenu(e.target.value);\n });\n\n // ESC to close menus\n document.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n this.hideBlockMenu();\n this.hideBlockActionsMenu();\n }\n });\n\n // Selection-based formatting toolbar\n this.buildSelectionToolbar();\n document.addEventListener('selectionchange', () => this.updateSelectionToolbar());\n window.addEventListener('scroll', () => this.repositionSelectionToolbar(), true);\n window.addEventListener('resize', () => this.repositionSelectionToolbar());\n\n // Build the block actions menu lazily on first open\n },\n\n handleInput(e) {\n const content = e.target.textContent;\n const blockType = e.target.closest('.block-line')?.dataset.blockType;\n\n // Detect \"/\" command \u2014 but never inside code blocks, where \"/\" is a literal character\n if (blockType !== 'code' && content.includes('/')) {\n const slashIndex = content.lastIndexOf('/');\n const query = content.slice(slashIndex + 1);\n\n if (slashIndex === content.length - 1 || query.length < 15) {\n this.currentSlashQuery = query;\n this.slashStartPos = slashIndex;\n this.showBlockMenuAtCursor(e.target);\n this.filterBlockMenu(query);\n return;\n }\n }\n\n this.hideBlockMenu();\n this.scheduleAutoSave();\n },\n\n // Intercept pastes of markdown text. Multi-line / block-structured markdown\n // is parsed into proper blocks and inserted; a single inline-formatted line\n // is converted to inline HTML at the caret. Plain text and code blocks fall\n // through to the browser's default paste.\n handlePaste(e) {\n const contentEl = e.target.closest && e.target.closest('.block-content');\n if (!contentEl) return; // table cells, captions, etc. \u2192 default paste\n\n const blockLine = contentEl.closest('.block-line');\n const blockType = blockLine?.dataset.blockType;\n if (blockType === 'code') return; // code blocks paste verbatim\n\n const cd = e.clipboardData || window.clipboardData;\n if (!cd) return;\n const text = cd.getData('text/plain');\n if (!text || !text.trim()) return;\n\n if (this.looksLikeBlockMarkdown(text)) {\n e.preventDefault();\n this.hideBlockMenu();\n const blocks = this.parseMarkdownToBlocks(text);\n this.insertParsedBlocks(blockLine, blocks);\n return;\n }\n\n // Single line: convert inline markdown (**bold**, `code`, links\u2026) if any.\n const html = this.sanitizeRich(this.inlineMarkdownToHtml(text));\n if (html !== this.escapeHtml(text)) {\n e.preventDefault();\n document.execCommand('insertHTML', false, html);\n this.scheduleAutoSave();\n }\n // else: plain text with no markdown \u2014 let the browser paste it.\n },\n\n // Heuristic: does this clipboard text contain block-level markdown that\n // should split into multiple blocks?\n looksLikeBlockMarkdown(text) {\n if (/\\r?\\n/.test(text.trim())) return true; // anything multi-line\n return /^\\s*(#{1,6}\\s|[-*+]\\s|\\d+\\.\\s|>\\s|>!\\s|```|\\||-{3,}\\s*$)/.test(text);\n },\n\n // Insert a parsed list of blocks at `blockLine`. If the anchor is an empty\n // text block, the first parsed block replaces it; otherwise everything is\n // inserted after the anchor. Caret lands at the end of the last block.\n insertParsedBlocks(blockLine, blocks) {\n if (!blocks || !blocks.length || !blockLine) return;\n\n const replaceFirst =\n blockLine.dataset.blockType === 'text' && this.blockHasNoTextContent(blockLine);\n\n let anchor = blockLine;\n let lastInserted = null;\n blocks.forEach((b, idx) => {\n const el = this.createBlockElement(b, idx);\n if (idx === 0 && replaceFirst) {\n blockLine.replaceWith(el);\n } else {\n anchor.after(el);\n }\n anchor = el;\n lastInserted = el;\n });\n\n this.updateNumberedLists();\n if (typeof lucide !== 'undefined') lucide.createIcons();\n if (lastInserted && lastInserted.querySelector('.block-content')) {\n this.focusBlockContent(lastInserted, 'end');\n }\n this.scheduleAutoSave();\n },\n\n handleKeydown(e) {\n const blockLine = e.target.closest('.block-line');\n const menu = document.getElementById('block-menu');\n const isMenuVisible = menu && !menu.classList.contains('hidden');\n\n // Handle menu navigation when visible\n if (isMenuVisible) {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n this.navigateMenu(e.key === 'ArrowDown' ? 1 : -1);\n return;\n }\n if (e.key === 'Enter') {\n e.preventDefault();\n const selected = menu.querySelector('.block-menu-item.bg-bg-3');\n if (selected) {\n const type = selected.dataset.blockType;\n // Remove the slash command text\n const content = e.target.textContent;\n e.target.textContent = content.slice(0, this.slashStartPos);\n this.insertBlockType(type);\n }\n this.hideBlockMenu();\n return;\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n this.hideBlockMenu();\n return;\n }\n }\n\n // Enter - create new block\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n const blockType = blockLine.dataset.blockType;\n const isEmpty = e.target.textContent.trim() === '';\n\n // List-style blocks: Enter continues the list; Enter on an empty\n // item exits the list as a plain text block.\n if (blockType === 'todo' || blockType === 'bullet' || blockType === 'numbered') {\n if (isEmpty) {\n const newBlock = this.createBlockElement({\n type: 'text',\n content: '',\n id: this.generateId()\n }, 0);\n blockLine.replaceWith(newBlock);\n const newContent = newBlock.querySelector('.block-content');\n newContent?.focus();\n if (typeof lucide !== 'undefined') lucide.createIcons();\n this.updateNumberedLists();\n this.scheduleAutoSave();\n return;\n }\n this.insertBlockAfter(blockLine, blockType);\n return;\n }\n\n this.insertBlockAfter(blockLine, 'text');\n return;\n }\n\n // ArrowUp / ArrowDown \u2014 move the caret across blocks. Default browser\n // behavior keeps the caret inside the contentEditable, which feels broken\n // when each block is its own editor. We only intercept when the caret is\n // on the first/last visual line, so wrapped paragraphs still navigate\n // line-by-line internally.\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n const target = e.target;\n const goingUp = e.key === 'ArrowUp';\n if (this.isCaretAtEdgeLine(target, goingUp)) {\n const sibling = goingUp\n ? this.findPrevEditableBlock(blockLine)\n : this.findNextEditableBlock(blockLine);\n if (sibling) {\n e.preventDefault();\n this.focusBlockContent(sibling, goingUp ? 'end' : 'start');\n return;\n }\n }\n }\n\n // Backspace on empty block - delete and move to previous\n if (e.key === 'Backspace' && e.target.textContent === '') {\n const prevBlock = blockLine.previousElementSibling;\n if (prevBlock && this.blocksContainer.children.length > 1) {\n e.preventDefault();\n blockLine.remove();\n const prevContent = prevBlock.querySelector('.block-content');\n if (prevContent) {\n prevContent.focus();\n // Move cursor to end\n const range = document.createRange();\n range.selectNodeContents(prevContent);\n range.collapse(false);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n this.scheduleAutoSave();\n }\n return;\n }\n\n // Tab - indent (for lists)\n if (e.key === 'Tab') {\n e.preventDefault();\n // Could implement indentation for lists here\n return;\n }\n },\n\n navigateMenu(direction) {\n const menu = document.getElementById('block-menu');\n const items = Array.from(menu.querySelectorAll('.block-menu-item:not(.hidden)'));\n if (items.length === 0) return;\n\n const current = menu.querySelector('.block-menu-item.bg-bg-3');\n let currentIndex = items.indexOf(current);\n\n if (current) {\n current.classList.remove('bg-bg-3');\n }\n\n currentIndex += direction;\n if (currentIndex < 0) currentIndex = items.length - 1;\n if (currentIndex >= items.length) currentIndex = 0;\n\n items[currentIndex].classList.add('bg-bg-3');\n items[currentIndex].scrollIntoView({ block: 'nearest' });\n },\n\n // Position the slash menu next to the supplied anchor rect, flipping above\n // when there's not enough room below the rect, and clamping into the\n // viewport horizontally. Must be called *after* the menu is unhidden so\n // offsetWidth/offsetHeight are accurate.\n positionBlockMenu(anchorRect) {\n const menu = document.getElementById('block-menu');\n if (!menu) return;\n const margin = 8;\n const w = menu.offsetWidth;\n const h = menu.offsetHeight;\n\n let left = anchorRect.left;\n if (left + w + margin > window.innerWidth) left = Math.max(margin, window.innerWidth - w - margin);\n if (left < margin) left = margin;\n\n // Prefer below; flip above if the menu would overflow the viewport bottom\n // and there's more room above the anchor.\n const spaceBelow = window.innerHeight - anchorRect.bottom - margin;\n const spaceAbove = anchorRect.top - margin;\n let top;\n if (spaceBelow >= h || spaceBelow >= spaceAbove) {\n top = Math.min(anchorRect.bottom + 4, window.innerHeight - h - margin);\n top = Math.max(margin, top);\n } else {\n top = Math.max(margin, anchorRect.top - h - 4);\n }\n\n menu.style.left = `${left}px`;\n menu.style.top = `${top}px`;\n },\n\n showBlockMenu(anchorEl, blockLine) {\n const menu = document.getElementById('block-menu');\n if (!menu) return;\n\n this.currentBlockLine = blockLine;\n\n menu.classList.remove('hidden');\n this.positionBlockMenu(anchorEl.getBoundingClientRect());\n\n // Reset filter\n const filterInput = document.getElementById('block-menu-filter');\n if (filterInput) {\n filterInput.value = '';\n filterInput.focus();\n }\n this.filterBlockMenu('');\n\n // Select first item\n const firstItem = menu.querySelector('.block-menu-item');\n if (firstItem) {\n menu.querySelectorAll('.block-menu-item').forEach(el => el.classList.remove('bg-bg-3'));\n firstItem.classList.add('bg-bg-3');\n }\n },\n\n showBlockMenuAtCursor(contentEl) {\n const menu = document.getElementById('block-menu');\n if (!menu) return;\n\n this.currentBlockLine = contentEl.closest('.block-line');\n\n menu.classList.remove('hidden');\n\n // Anchor on the caret rect when available, else the block-content element.\n const sel = window.getSelection();\n let anchorRect;\n if (sel.rangeCount > 0) {\n anchorRect = sel.getRangeAt(0).getBoundingClientRect();\n if (anchorRect.width === 0 && anchorRect.height === 0) {\n anchorRect = contentEl.getBoundingClientRect();\n }\n } else {\n anchorRect = contentEl.getBoundingClientRect();\n }\n this.positionBlockMenu(anchorRect);\n\n // Select first item\n const firstItem = menu.querySelector('.block-menu-item:not(.hidden)');\n if (firstItem) {\n menu.querySelectorAll('.block-menu-item').forEach(el => el.classList.remove('bg-bg-3'));\n firstItem.classList.add('bg-bg-3');\n }\n },\n\n hideBlockMenu() {\n const menu = document.getElementById('block-menu');\n if (menu) {\n menu.classList.add('hidden');\n }\n this.currentSlashQuery = '';\n this.slashStartPos = null;\n },\n\n filterBlockMenu(query) {\n const menu = document.getElementById('block-menu');\n if (!menu) return;\n\n const items = menu.querySelectorAll('.block-menu-item');\n const lowerQuery = query.toLowerCase();\n\n let firstVisible = null;\n items.forEach(item => {\n const label = item.querySelector('span')?.textContent.toLowerCase() || '';\n const type = item.dataset.blockType.toLowerCase();\n const matches = label.includes(lowerQuery) || type.includes(lowerQuery);\n item.classList.toggle('hidden', !matches);\n item.classList.remove('bg-bg-3');\n if (matches && !firstVisible) {\n firstVisible = item;\n }\n });\n\n if (firstVisible) {\n firstVisible.classList.add('bg-bg-3');\n }\n },\n\n insertBlockType(type) {\n if (!this.currentBlockLine) return;\n\n // Sub-page: create a child page server-side, then insert a page_link block.\n if (type === 'subpage') {\n this.insertSubpageBlock(this.currentBlockLine);\n return;\n }\n\n // Media types: trigger an asynchronous flow (file picker or URL prompt)\n // rather than a same-line type conversion.\n if (this.MEDIA_TYPES.includes(type)) {\n this.insertMediaBlock(this.currentBlockLine, type);\n return;\n }\n\n // Convert current block to the new type\n const content = this.currentBlockLine.querySelector('.block-content');\n const currentContent = content?.textContent || '';\n\n // Remove slash command from content\n let cleanContent = currentContent;\n if (this.slashStartPos !== null) {\n cleanContent = currentContent.slice(0, this.slashStartPos);\n }\n\n const newBlock = this.createBlockElement({\n type: type,\n content: cleanContent,\n id: this.generateId()\n }, 0);\n\n this.currentBlockLine.replaceWith(newBlock);\n\n this.updateNumberedLists();\n\n // Focus the new block's content\n const newContent = newBlock.querySelector('.block-content');\n if (newContent) {\n newContent.focus();\n // Move cursor to end\n const range = document.createRange();\n range.selectNodeContents(newContent);\n range.collapse(false);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n\n // Re-init icons\n if (typeof lucide !== 'undefined') {\n lucide.createIcons();\n }\n\n this.scheduleAutoSave();\n },\n\n async insertSubpageBlock(blockLine) {\n // Strip the slash query from the source block first.\n const content = blockLine.querySelector('.block-content');\n if (content && this.slashStartPos !== null) {\n content.textContent = (content.textContent || '').slice(0, this.slashStartPos);\n }\n\n // Insert a temporary \"creating\u2026\" placeholder right after the source block.\n const placeholder = document.createElement('div');\n placeholder.className = 'flex items-center gap-2 px-2 py-1.5 text-[13px] text-ink-3 italic';\n placeholder.innerHTML = ' Creating sub-page\u2026';\n blockLine.after(placeholder);\n if (typeof lucide !== 'undefined') lucide.createIcons();\n\n try {\n const body = { page: { parent_id: this.pageId, title: 'Untitled' } };\n if (this.projectId) body.page.project_id = this.projectId;\n\n const res = await fetch(this.createUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-CSRF-Token': this.csrfToken\n },\n credentials: 'same-origin',\n body: JSON.stringify(body)\n });\n const data = await res.json();\n\n if (!res.ok || !data.success) {\n placeholder.remove();\n console.error('Failed to create sub-page', data && data.errors);\n return;\n }\n\n const meta = {\n url: data.redirect_url || data.page.url,\n icon: data.page.type_icon_emoji || this.defaultIconForType(data.page.type),\n title: data.page.title || 'Untitled',\n uuid: data.page.uuid\n };\n\n const linkBlock = this.createBlockElement({\n type: 'page_link',\n content: '',\n meta: meta,\n id: this.generateId()\n }, 0);\n\n placeholder.replaceWith(linkBlock);\n\n // Insert a fresh empty text block underneath so typing can continue.\n const followUp = this.createBlockElement({ type: 'text', content: '', id: this.generateId() }, 0);\n linkBlock.after(followUp);\n followUp.querySelector('.block-content')?.focus();\n\n if (typeof lucide !== 'undefined') lucide.createIcons();\n this.scheduleAutoSave();\n } catch (err) {\n placeholder.remove();\n console.error('Sub-page creation failed', err);\n }\n },\n\n defaultIconForType(typeSlug) {\n switch (typeSlug) {\n case 'task_board': return '\uD83D\uDCCB';\n case 'document':\n case 'page': return '\uD83D\uDCC4';\n case 'table':\n case 'spreadsheet':return '\uD83D\uDCCA';\n case 'project': return '\uD83D\uDCC1';\n default: return '\uD83D\uDCDD';\n }\n },\n\n // \u2500\u2500 Media blocks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Render a media block (image / video / audio / file / bookmark) into the\n // supplied .block-line container. The asset metadata lives on\n // div.dataset.meta so blocksToMarkdown can re-emit it.\n renderMediaBlock(div, block) {\n const meta = block.meta || {};\n div.dataset.meta = JSON.stringify(meta);\n\n // No URL yet: render a \"uploading\" placeholder. Used briefly between\n // the user picking a file and the upload completing.\n if (!meta.url) {\n const ph = document.createElement('div');\n ph.className = 'flex items-center gap-2 flex-1 px-3 py-2 text-[13px] text-ink-3 italic bg-bg-3 rounded';\n ph.innerHTML = ' Uploading\u2026';\n div.appendChild(ph);\n return;\n }\n\n if (block.type === 'image') {\n const fig = document.createElement('figure');\n fig.className = 'flex-1 my-1';\n const img = document.createElement('img');\n img.src = meta.url;\n img.alt = meta.caption || meta.name || 'Image';\n img.className = 'max-w-full max-h-[600px] rounded-md block';\n img.loading = 'lazy';\n fig.appendChild(img);\n fig.appendChild(this.buildCaption(meta.caption));\n div.appendChild(fig);\n return;\n }\n\n if (block.type === 'video') {\n const fig = document.createElement('figure');\n fig.className = 'flex-1 my-1';\n const video = document.createElement('video');\n video.src = meta.url;\n video.controls = true;\n video.className = 'max-w-full max-h-[600px] rounded-md block bg-black';\n fig.appendChild(video);\n fig.appendChild(this.buildCaption(meta.caption));\n div.appendChild(fig);\n return;\n }\n\n if (block.type === 'audio') {\n const fig = document.createElement('figure');\n fig.className = 'flex-1 my-1';\n const audio = document.createElement('audio');\n audio.src = meta.url;\n audio.controls = true;\n audio.className = 'w-full block';\n fig.appendChild(audio);\n fig.appendChild(this.buildCaption(meta.caption));\n div.appendChild(fig);\n return;\n }\n\n if (block.type === 'file') {\n const link = document.createElement('a');\n link.href = meta.url;\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.className = 'flex items-center gap-3 flex-1 px-3 py-2 rounded-md border border-line bg-bg-3 hover:bg-bg-2 no-underline text-ink-1 transition-colors';\n const sizeStr = meta.size ? this.formatFileSize(meta.size) : '';\n link.innerHTML =\n '' +\n '' + this.escapeHtml(meta.name || meta.url) + '' +\n (sizeStr ? '' + this.escapeHtml(sizeStr) + '' : '') +\n '';\n div.appendChild(link);\n return;\n }\n\n if (block.type === 'bookmark') {\n const link = document.createElement('a');\n // Defense-in-depth: even if a bad URL was somehow persisted, only\n // honour http(s) hrefs to avoid `javascript:` / `data:` XSS at render.\n const safeHref = /^https?:\\/\\//i.test(meta.url || '') ? meta.url : '#';\n link.href = safeHref;\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.className = 'flex items-start gap-3 flex-1 p-3 rounded-md border border-line bg-bg-3 hover:bg-bg-2 no-underline text-ink-1 transition-colors';\n let host = '';\n try { host = new URL(meta.url).host; } catch (_) { host = meta.url; }\n link.innerHTML =\n '' +\n '
' +\n '
' + this.escapeHtml(meta.title || host || meta.url) + '
' +\n (meta.description ? '
' + this.escapeHtml(meta.description) + '
' : '') +\n '
' + this.escapeHtml(host || meta.url) + '
' +\n '
' +\n '';\n div.appendChild(link);\n return;\n }\n },\n\n // \u2500\u2500 Table block \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Render a `table` block as a real, editable HTML table. The alignment\n // array is stashed on dataset so blocksToMarkdown can rebuild the GFM\n // separator row. Cells are contentEditable; their inline markdown was\n // already converted at parse time.\n renderTableBlock(div, block) {\n const rows = Array.isArray(block.rows) ? block.rows : [];\n const align = Array.isArray(block.align) ? block.align : [];\n div.dataset.align = JSON.stringify(align);\n\n const wrap = document.createElement('div');\n wrap.className = 'flex-1 my-2 overflow-x-auto';\n\n const table = document.createElement('table');\n table.className = 'block-table border-collapse w-full text-sm';\n\n const alignClass = (i) =>\n align[i] === 'center' ? 'text-center' : align[i] === 'right' ? 'text-right' : 'text-left';\n\n if (rows.length) {\n const thead = document.createElement('thead');\n const htr = document.createElement('tr');\n rows[0].forEach((text, i) => {\n const th = document.createElement('th');\n th.className = 'border border-line px-3 py-1.5 align-top font-semibold bg-bg-3 ' + alignClass(i);\n th.contentEditable = 'true';\n th.innerHTML = this.sanitizeRich(this.inlineMarkdownToHtml(text || ''));\n htr.appendChild(th);\n });\n thead.appendChild(htr);\n table.appendChild(thead);\n\n const tbody = document.createElement('tbody');\n for (let r = 1; r < rows.length; r++) {\n const tr = document.createElement('tr');\n // Pad/truncate to the header column count so the grid stays rectangular.\n for (let c = 0; c < rows[0].length; c++) {\n const td = document.createElement('td');\n td.className = 'border border-line px-3 py-1.5 align-top ' + alignClass(c);\n td.contentEditable = 'true';\n td.innerHTML = this.sanitizeRich(this.inlineMarkdownToHtml(rows[r][c] || ''));\n tr.appendChild(td);\n }\n tbody.appendChild(tr);\n }\n table.appendChild(tbody);\n }\n\n wrap.appendChild(table);\n div.appendChild(wrap);\n },\n\n buildCaption(initial) {\n const cap = document.createElement('figcaption');\n cap.className = 'block-caption text-[13px] text-ink-3 italic mt-1.5 outline-none';\n cap.contentEditable = true;\n cap.textContent = initial || '';\n cap.dataset.placeholder = 'Add a caption\u2026';\n cap.addEventListener('input', () => this.scheduleAutoSave());\n return cap;\n },\n\n formatFileSize(bytes) {\n if (!bytes) return '';\n const units = ['B', 'KB', 'MB', 'GB'];\n let i = 0;\n let n = bytes;\n while (n >= 1024 && i < units.length - 1) { n /= 1024; i++; }\n return (i === 0 ? Math.round(n) : n.toFixed(1)) + ' ' + units[i];\n },\n\n // Begin inserting a media block. For uploadable types this opens a file\n // picker; for `bookmark` it prompts for a URL. The current block line is\n // either replaced (if empty) or used as the anchor for an `after()` insert.\n insertMediaBlock(blockLine, type) {\n // Strip any \"/query\" the user typed before triggering the menu.\n const content = blockLine.querySelector('.block-content');\n if (content && this.slashStartPos !== null) {\n content.textContent = (content.textContent || '').slice(0, this.slashStartPos);\n }\n\n if (type === 'bookmark') {\n const raw = window.prompt('Enter URL', 'https://');\n if (!raw || !raw.trim()) return;\n const url = raw.trim();\n // Reject anything that isn't an http(s) URL \u2014 a `javascript:` or `data:`\n // href in an `` would be an XSS vector when the bookmark is rendered.\n if (!/^https?:\\/\\//i.test(url)) {\n window.alert('Please enter a URL starting with http:// or https://');\n return;\n }\n this.insertReadyMediaBlock(blockLine, type, { url, title: '', description: '' });\n return;\n }\n\n const input = document.createElement('input');\n input.type = 'file';\n if (type === 'image') input.accept = 'image/*';\n if (type === 'video') input.accept = 'video/*';\n if (type === 'audio') input.accept = 'audio/*';\n // type === 'file' accepts anything\n\n input.addEventListener('change', () => {\n const file = input.files && input.files[0];\n if (!file) return;\n this.uploadMediaForBlock(blockLine, type, file);\n });\n input.click();\n },\n\n // Place a fully-formed media block (with known meta) into the editor.\n insertReadyMediaBlock(blockLine, type, meta) {\n const isEmpty = this.blockHasNoTextContent(blockLine);\n const newBlock = this.createBlockElement({\n type, content: '', meta, id: this.generateId()\n }, 0);\n\n if (isEmpty) {\n blockLine.replaceWith(newBlock);\n } else {\n blockLine.after(newBlock);\n }\n\n // Ensure there's a fresh empty text block right after for continued typing.\n if (!newBlock.nextElementSibling) {\n const followUp = this.createBlockElement({ type: 'text', content: '', id: this.generateId() }, 0);\n newBlock.after(followUp);\n followUp.querySelector('.block-content')?.focus();\n }\n\n if (typeof lucide !== 'undefined') lucide.createIcons();\n this.scheduleAutoSave();\n },\n\n blockHasNoTextContent(blockLine) {\n const c = blockLine.querySelector('.block-content');\n if (!c) return false;\n return !c.textContent.trim();\n },\n\n // Upload a chosen file, showing a placeholder block while it's in flight.\n async uploadMediaForBlock(sourceBlockLine, type, file) {\n if (!this.uploadMediaUrl) {\n console.error('Block editor: data-upload-media-url is not configured');\n return;\n }\n\n const isEmpty = this.blockHasNoTextContent(sourceBlockLine);\n const placeholder = this.createBlockElement({\n type, content: '', meta: {}, id: this.generateId()\n }, 0);\n\n if (isEmpty) {\n sourceBlockLine.replaceWith(placeholder);\n } else {\n sourceBlockLine.after(placeholder);\n }\n if (typeof lucide !== 'undefined') lucide.createIcons();\n\n const fd = new FormData();\n fd.append('file', file);\n\n try {\n const res = await fetch(this.uploadMediaUrl, {\n method: 'POST',\n headers: {\n 'X-CSRF-Token': this.csrfToken,\n 'Accept': 'application/json'\n },\n credentials: 'same-origin',\n body: fd\n });\n const data = await res.json();\n\n if (!res.ok || !data.success) {\n placeholder.remove();\n window.alert((data && data.error) || 'Upload failed');\n return;\n }\n\n const meta = {\n url: data.url,\n name: data.name,\n size: data.size,\n content_type: data.content_type\n };\n\n const finalBlock = this.createBlockElement({\n type, content: '', meta, id: this.generateId()\n }, 0);\n placeholder.replaceWith(finalBlock);\n\n // Insert a follow-up empty text block underneath if the editor doesn't\n // already have one \u2014 keeps typing flow uninterrupted.\n if (!finalBlock.nextElementSibling) {\n const followUp = this.createBlockElement({ type: 'text', content: '', id: this.generateId() }, 0);\n finalBlock.after(followUp);\n }\n\n if (typeof lucide !== 'undefined') lucide.createIcons();\n this.scheduleAutoSave();\n } catch (err) {\n placeholder.remove();\n console.error('Media upload failed', err);\n window.alert('Upload failed');\n }\n },\n\n escapeHtml(s) {\n return String(s)\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"');\n },\n\n insertBlockAfter(blockLine, type = 'text') {\n const newBlock = this.createBlockElement({\n type: type,\n content: '',\n id: this.generateId()\n }, 0);\n\n if (blockLine) {\n blockLine.after(newBlock);\n } else {\n this.blocksContainer.appendChild(newBlock);\n }\n\n this.updateNumberedLists();\n\n // Focus the new block\n const content = newBlock.querySelector('.block-content');\n if (content) {\n content.focus();\n }\n\n // Re-init icons\n if (typeof lucide !== 'undefined') {\n lucide.createIcons();\n }\n\n this.scheduleAutoSave();\n },\n\n scheduleAutoSave() {\n if (this.saveTimeout) {\n clearTimeout(this.saveTimeout);\n }\n this.saveTimeout = setTimeout(() => this.saveContent(), 1000);\n },\n\n async saveContent() {\n if (!this.saveUrl || !this.csrfToken) return;\n\n const content = this.blocksToMarkdown();\n const title = (this.titleInput?.value || '').trim();\n\n try {\n const response = await fetch(this.saveUrl, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': this.csrfToken\n },\n body: JSON.stringify({ content, title })\n });\n\n if (response.ok) {\n // Show save indicator briefly\n const indicator = document.getElementById('save-indicator');\n if (indicator) {\n indicator.classList.remove('hidden');\n setTimeout(() => indicator.classList.add('hidden'), 2000);\n }\n\n // Sync the sidebar row + breadcrumb when the title changes, so the user\n // doesn't have to refresh to see the new name.\n if (title && title !== this._lastSyncedTitle) {\n this._lastSyncedTitle = title;\n if (window.KozadoSidebar && this.pageId) {\n window.KozadoSidebar.updatePage(this.pageId, { title: title });\n }\n var crumb = document.querySelector('#page-breadcrumb-current');\n if (crumb) crumb.textContent = title;\n if (typeof document !== 'undefined') document.title = title + ' \u00B7 Kozado';\n }\n }\n } catch (error) {\n console.error('Failed to save:', error);\n }\n },\n\n generateId() {\n return 'block-' + Math.random().toString(36).substr(2, 9);\n },\n\n // \u2500\u2500 Rich-text content helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Allowed inline formatting tags. `style` is permitted so execCommand-\n // produced color spans (e.g. ``) round-trip.\n sanitizeRich(html) {\n if (!window.DOMPurify) return html;\n return window.DOMPurify.sanitize(html, {\n ALLOWED_TAGS: ['b', 'strong', 'i', 'em', 'u', 's', 'strike', 'br', 'a', 'span', 'mark', 'code', 'font'],\n ALLOWED_ATTR: ['href', 'target', 'rel', 'class', 'style', 'color']\n });\n },\n\n // \u2500\u2500 Selection toolbar (inline formatting) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Floating pill that appears above the current selection inside any\n // .block-content. Uses document.execCommand for formatting commands \u2014\n // deprecated but adequate for this surface and consistent with the\n // table-cell editor.\n buildSelectionToolbar() {\n if (this.selectionToolbar) return;\n const bar = document.createElement('div');\n bar.id = 'block-selection-toolbar';\n bar.className = 'hidden fixed z-[60] flex items-center gap-px p-1 bg-canvas border border-line rounded-lg shadow-2xl';\n\n const btn = (cmd, inner, title) =>\n ``;\n\n bar.innerHTML =\n btn('bold', 'B', 'Bold (\u2318B)') +\n btn('italic', 'I', 'Italic (\u2318I)') +\n btn('underline', 'U', 'Underline (\u2318U)') +\n btn('strikeThrough', 'S', 'Strikethrough') +\n '' +\n `` +\n '' +\n btn('createLink', '', 'Add link');\n\n // Color popover (built once, toggled by the color button)\n const palette = document.createElement('div');\n palette.className = 'hidden absolute top-full left-0 mt-1 p-2 bg-canvas border border-line rounded-lg shadow-2xl';\n palette.dataset.colorPalette = '';\n palette.innerHTML =\n '
Text color
' +\n '
' +\n this.TEXT_COLORS.map(c =>\n ``\n ).join('') +\n '
';\n bar.appendChild(palette);\n\n // Keep selection on mousedown\n bar.addEventListener('mousedown', (e) => {\n if (e.target.closest('button')) e.preventDefault();\n });\n\n bar.addEventListener('click', (e) => {\n const colorBtn = e.target.closest('[data-color]');\n if (colorBtn) {\n e.preventDefault();\n const hex = colorBtn.dataset.color;\n this.applyTextColor(hex);\n palette.classList.add('hidden');\n return;\n }\n\n const fmtBtn = e.target.closest('[data-fmt-cmd]');\n if (!fmtBtn) return;\n e.preventDefault();\n const cmd = fmtBtn.dataset.fmtCmd;\n if (cmd === 'color') {\n palette.classList.toggle('hidden');\n return;\n }\n palette.classList.add('hidden');\n if (cmd === 'createLink') {\n const url = window.prompt('Enter URL', 'https://');\n if (!url) return;\n document.execCommand('createLink', false, url);\n // Decorate inserted links so they're styled and open in new tab.\n const block = this.getSelectionBlock();\n block?.querySelectorAll('a').forEach(a => {\n if (!a.target) a.target = '_blank';\n if (!a.rel) a.rel = 'noopener noreferrer';\n if (!a.className) a.className = 'text-brand hover:underline';\n });\n } else {\n document.execCommand(cmd, false, null);\n }\n this.updateToolbarActiveStates();\n this.scheduleAutoSave();\n });\n\n document.body.appendChild(bar);\n this.selectionToolbar = bar;\n this.colorPalette = palette;\n },\n\n // Returns the .block-content element holding the current selection, if\n // any, and only when that block belongs to this editor and supports\n // rich text. Otherwise returns null.\n getSelectionBlock() {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0 || sel.isCollapsed) return null;\n\n const range = sel.getRangeAt(0);\n let node = range.commonAncestorContainer;\n if (node.nodeType === Node.TEXT_NODE) node = node.parentNode;\n\n const block = node.closest && node.closest('.block-content');\n if (!block) return null;\n\n const blockLine = block.closest('.block-line');\n if (!blockLine || !this.blocksContainer.contains(blockLine)) return null;\n\n const type = blockLine.dataset.blockType;\n if (!this.RICH_TEXT_TYPES.includes(type)) return null;\n\n return block;\n },\n\n updateSelectionToolbar() {\n const block = this.getSelectionBlock();\n if (!block) {\n this.hideSelectionToolbar();\n return;\n }\n this.showSelectionToolbar();\n this.repositionSelectionToolbar();\n this.updateToolbarActiveStates();\n },\n\n showSelectionToolbar() {\n if (!this.selectionToolbar) return;\n this.selectionToolbar.classList.remove('hidden');\n },\n\n hideSelectionToolbar() {\n if (!this.selectionToolbar) return;\n this.selectionToolbar.classList.add('hidden');\n if (this.colorPalette) this.colorPalette.classList.add('hidden');\n },\n\n repositionSelectionToolbar() {\n if (!this.selectionToolbar || this.selectionToolbar.classList.contains('hidden')) return;\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const rect = sel.getRangeAt(0).getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) return;\n const bar = this.selectionToolbar;\n const top = Math.max(8, rect.top - bar.offsetHeight - 8);\n const left = Math.max(8, Math.min(window.innerWidth - bar.offsetWidth - 8, rect.left + rect.width / 2 - bar.offsetWidth / 2));\n bar.style.top = top + 'px';\n bar.style.left = left + 'px';\n },\n\n updateToolbarActiveStates() {\n if (!this.selectionToolbar) return;\n ['bold', 'italic', 'underline', 'strikeThrough'].forEach(cmd => {\n let on = false;\n try { on = document.queryCommandState(cmd); } catch (_) {}\n const btn = this.selectionToolbar.querySelector(`[data-fmt-cmd=\"${cmd}\"]`);\n if (btn) btn.dataset.active = on ? 'true' : 'false';\n });\n },\n\n applyTextColor(hex) {\n if (hex && hex.length) {\n document.execCommand('foreColor', false, hex);\n this.scheduleAutoSave();\n return;\n }\n\n // \"Default\" color \u2014 strip inline color from any element that intersects\n // the current selection. execCommand('foreColor', 'inherit'/'') is broken\n // across browsers (some apply a default red), so we do it manually.\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = this.getSelectionBlock();\n if (!block) return;\n\n const intersects = (el) => {\n try { return range.intersectsNode(el); } catch (_) { return false; }\n };\n\n block.querySelectorAll('[style*=\"color\"]').forEach(el => {\n if (!intersects(el)) return;\n el.style.color = '';\n if (!el.getAttribute('style')) el.removeAttribute('style');\n // Unwrap empty-shell spans (no attrs, no class) so we don't leave noise.\n if (el.tagName === 'SPAN' && !el.attributes.length) {\n const parent = el.parentNode;\n while (el.firstChild) parent.insertBefore(el.firstChild, el);\n parent.removeChild(el);\n }\n });\n block.querySelectorAll('font[color]').forEach(el => {\n if (!intersects(el)) return;\n el.removeAttribute('color');\n if (!el.attributes.length) {\n const parent = el.parentNode;\n while (el.firstChild) parent.insertBefore(el.firstChild, el);\n parent.removeChild(el);\n }\n });\n this.scheduleAutoSave();\n },\n\n // \u2500\u2500 Block actions menu (drag handle click) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Notion-style: click the grip icon to open a small popover with\n // Delete / Duplicate / Turn Into options.\n buildBlockActionsMenu() {\n if (this.blockActionsMenu) return;\n const menu = document.createElement('div');\n menu.id = 'block-actions-menu';\n menu.className = 'hidden fixed z-[60] w-56 bg-canvas border border-line rounded-xl shadow-2xl py-1 text-[13px]';\n\n const item = (action, icon, label, hint) =>\n ``;\n\n const turnIntoTypes = [\n { type: 'text', label: 'Text', icon: 'type' },\n { type: 'heading1', label: 'Heading 1', icon: 'heading-1' },\n { type: 'heading2', label: 'Heading 2', icon: 'heading-2' },\n { type: 'heading3', label: 'Heading 3', icon: 'heading-3' },\n { type: 'bullet', label: 'Bulleted list', icon: 'list' },\n { type: 'numbered', label: 'Numbered list', icon: 'list-ordered' },\n { type: 'todo', label: 'To-do list', icon: 'square-check' },\n { type: 'quote', label: 'Quote', icon: 'quote' },\n { type: 'callout', label: 'Callout', icon: 'alert-circle' },\n { type: 'code', label: 'Code', icon: 'code' },\n { type: 'divider', label: 'Divider', icon: 'minus' },\n ];\n\n menu.innerHTML =\n item('delete', 'trash-2', 'Delete', 'Del') +\n item('duplicate', 'copy', 'Duplicate', '\u2318D') +\n '
' +\n '
Turn into
' +\n '
' +\n turnIntoTypes.map(t =>\n ``\n ).join('') +\n '
';\n\n menu.addEventListener('click', (e) => {\n const btn = e.target.closest('[data-action]');\n if (!btn) return;\n e.preventDefault();\n e.stopPropagation();\n const action = btn.dataset.action;\n const blockLine = this.currentActionsBlock;\n if (!blockLine) return;\n if (action === 'delete') {\n this.deleteBlock(blockLine);\n } else if (action === 'duplicate') {\n this.duplicateBlock(blockLine);\n } else if (action === 'turn-into') {\n this.turnIntoType(blockLine, btn.dataset.type);\n }\n this.hideBlockActionsMenu();\n });\n\n document.body.appendChild(menu);\n this.blockActionsMenu = menu;\n },\n\n showBlockActionsMenu(anchorEl, blockLine) {\n this.buildBlockActionsMenu();\n const menu = this.blockActionsMenu;\n this.currentActionsBlock = blockLine;\n\n // Position to the right of the drag handle, clamped to viewport.\n const rect = anchorEl.getBoundingClientRect();\n menu.classList.remove('hidden');\n // After unhide, compute size to clamp.\n const w = menu.offsetWidth;\n const h = menu.offsetHeight;\n let left = rect.right + 6;\n let top = rect.top;\n if (left + w + 8 > window.innerWidth) left = Math.max(8, rect.left - w - 6);\n if (top + h + 8 > window.innerHeight) top = Math.max(8, window.innerHeight - h - 8);\n menu.style.left = left + 'px';\n menu.style.top = top + 'px';\n\n // Re-init lucide icons for the freshly-rendered icons.\n if (typeof lucide !== 'undefined') lucide.createIcons();\n },\n\n hideBlockActionsMenu() {\n if (!this.blockActionsMenu) return;\n this.blockActionsMenu.classList.add('hidden');\n this.currentActionsBlock = null;\n },\n\n deleteBlock(blockLine) {\n if (!blockLine || !blockLine.parentNode) return;\n // Don't leave the editor with zero blocks \u2014 replace with an empty text block.\n const isOnly = this.blocksContainer.children.length <= 1;\n if (isOnly) {\n const empty = this.createBlockElement({ type: 'text', content: '', id: this.generateId() }, 0);\n blockLine.replaceWith(empty);\n empty.querySelector('.block-content')?.focus();\n } else {\n const focusTarget = blockLine.previousElementSibling || blockLine.nextElementSibling;\n blockLine.remove();\n focusTarget?.querySelector('.block-content')?.focus();\n }\n this.updateNumberedLists();\n if (typeof lucide !== 'undefined') lucide.createIcons();\n this.scheduleAutoSave();\n },\n\n duplicateBlock(blockLine) {\n if (!blockLine) return;\n const type = blockLine.dataset.blockType;\n const contentEl = blockLine.querySelector('.block-content');\n const block = {\n type,\n id: this.generateId(),\n content: ''\n };\n if (contentEl) {\n block.content = type === 'code' ? (contentEl.textContent || '') : this.sanitizeRich(contentEl.innerHTML || '');\n }\n if (type === 'code') block.language = blockLine.dataset.language || '';\n if (type === 'numbered') block.number = parseInt(blockLine.dataset.number || '1', 10);\n if (type === 'todo') {\n const cb = blockLine.querySelector('input[type=\"checkbox\"]');\n block.checked = !!(cb && cb.checked);\n }\n if (type === 'page_link' && blockLine.dataset.meta) {\n try { block.meta = JSON.parse(blockLine.dataset.meta); } catch (_) { block.meta = {}; }\n }\n if (this.MEDIA_TYPES.includes(type) && blockLine.dataset.meta) {\n try { block.meta = JSON.parse(blockLine.dataset.meta); } catch (_) { block.meta = {}; }\n // Pull the latest caption back into meta \u2014 the user may have edited it\n // since the last save.\n const cap = blockLine.querySelector('.block-caption');\n if (cap) block.meta.caption = cap.textContent || '';\n }\n\n const newBlock = this.createBlockElement(block, 0);\n blockLine.after(newBlock);\n this.updateNumberedLists();\n if (typeof lucide !== 'undefined') lucide.createIcons();\n newBlock.querySelector('.block-content')?.focus();\n this.scheduleAutoSave();\n },\n\n // Convert a block to a new type, preserving inline-formatted content\n // when the source had any. Source/target may be any rich type, code,\n // or divider. page_link is intentionally not a turn-into target.\n turnIntoType(blockLine, newType) {\n if (!blockLine || !newType) return;\n const oldType = blockLine.dataset.blockType;\n if (oldType === newType) return;\n // Media blocks have no .block-content to convert from; \"Turn into\" would\n // silently drop the asset. Force the user to Delete + re-add instead.\n if (this.MEDIA_TYPES.includes(oldType)) return;\n\n const contentEl = blockLine.querySelector('.block-content');\n let html = '';\n if (contentEl) {\n html = oldType === 'code'\n ? this.escapeHtml(contentEl.textContent || '')\n : this.sanitizeRich(contentEl.innerHTML || '');\n }\n // When converting INTO code, we want plaintext only.\n if (newType === 'code') {\n const tmp = document.createElement('div');\n tmp.innerHTML = html;\n html = tmp.textContent || '';\n }\n if (newType === 'divider') html = '';\n\n const block = {\n type: newType,\n id: this.generateId(),\n content: html\n };\n if (newType === 'todo') {\n const cb = blockLine.querySelector('input[type=\"checkbox\"]');\n block.checked = !!(cb && cb.checked);\n }\n\n const replacement = this.createBlockElement(block, 0);\n blockLine.replaceWith(replacement);\n this.updateNumberedLists();\n if (typeof lucide !== 'undefined') lucide.createIcons();\n replacement.querySelector('.block-content')?.focus();\n this.scheduleAutoSave();\n },\n\n // Drag and drop handlers\n handleDragStart(e, blockLine) {\n this.draggedBlock = blockLine;\n blockLine.classList.add('opacity-50', 'bg-gray-100');\n\n // Create drop indicator if it doesn't exist\n if (!this.dropIndicator) {\n this.dropIndicator = document.createElement('div');\n this.dropIndicator.className = 'drop-indicator h-1 bg-kozado-500 rounded-full mx-8 my-1 hidden';\n }\n\n // Set drag data\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', blockLine.dataset.blockId);\n\n // Use a slight delay to allow the drag image to be captured\n setTimeout(() => {\n blockLine.classList.add('dragging');\n }, 0);\n },\n\n handleDragEnd(_e, blockLine) {\n blockLine.draggable = false;\n blockLine.classList.remove('opacity-50', 'bg-gray-100', 'dragging');\n\n // Remove drop indicator\n if (this.dropIndicator && this.dropIndicator.parentNode) {\n this.dropIndicator.remove();\n }\n\n // Remove all drag-over styling\n this.blocksContainer.querySelectorAll('.block-line').forEach(block => {\n block.classList.remove('drag-over-top', 'drag-over-bottom');\n });\n\n this.draggedBlock = null;\n },\n\n handleDragOver(e, blockLine) {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n\n if (!this.draggedBlock || this.draggedBlock === blockLine) return;\n\n // Determine if we're in the top or bottom half of the target block\n const rect = blockLine.getBoundingClientRect();\n const midY = rect.top + rect.height / 2;\n const isTopHalf = e.clientY < midY;\n\n // Clear previous indicators\n this.blocksContainer.querySelectorAll('.block-line').forEach(block => {\n block.classList.remove('drag-over-top', 'drag-over-bottom');\n });\n\n // Add indicator to current target\n if (isTopHalf) {\n blockLine.classList.add('drag-over-top');\n } else {\n blockLine.classList.add('drag-over-bottom');\n }\n },\n\n handleDragLeave(e, blockLine) {\n // Only remove if we're actually leaving the element\n const relatedTarget = e.relatedTarget;\n if (!blockLine.contains(relatedTarget)) {\n blockLine.classList.remove('drag-over-top', 'drag-over-bottom');\n }\n },\n\n handleDrop(e, blockLine) {\n e.preventDefault();\n\n if (!this.draggedBlock || this.draggedBlock === blockLine) return;\n\n // Determine drop position\n const rect = blockLine.getBoundingClientRect();\n const midY = rect.top + rect.height / 2;\n const dropBefore = e.clientY < midY;\n\n // Move the dragged block\n if (dropBefore) {\n blockLine.parentNode.insertBefore(this.draggedBlock, blockLine);\n } else {\n blockLine.parentNode.insertBefore(this.draggedBlock, blockLine.nextSibling);\n }\n\n // Update numbered list numbers if needed\n this.updateNumberedLists();\n\n // Clear styling\n this.blocksContainer.querySelectorAll('.block-line').forEach(block => {\n block.classList.remove('drag-over-top', 'drag-over-bottom');\n });\n\n // Trigger auto-save\n this.scheduleAutoSave();\n },\n\n // True when the caret is on the first (or last) visual line of `el`.\n // For an empty contentEditable the caret rect can be (0,0); fall back to\n // treating that as \"at the edge\" so navigation still works.\n isCaretAtEdgeLine(el, top) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return true;\n const range = sel.getRangeAt(0).cloneRange();\n range.collapse(true);\n let caretRect = range.getBoundingClientRect();\n if (caretRect.top === 0 && caretRect.bottom === 0 && caretRect.left === 0) {\n // Empty / no measurable rect \u2014 treat as on the edge line.\n return true;\n }\n const elRect = el.getBoundingClientRect();\n // Allow ~half a line of slack so descenders/line-height padding don't\n // misclassify the first/last line.\n const lineHeight = parseFloat(getComputedStyle(el).lineHeight) || 20;\n const slack = lineHeight / 2;\n return top\n ? caretRect.top - elRect.top < slack\n : elRect.bottom - caretRect.bottom < slack;\n },\n\n findPrevEditableBlock(blockLine) {\n let el = blockLine?.previousElementSibling;\n while (el && !el.querySelector?.('.block-content')) el = el.previousElementSibling;\n return el || null;\n },\n\n findNextEditableBlock(blockLine) {\n let el = blockLine?.nextElementSibling;\n while (el && !el.querySelector?.('.block-content')) el = el.nextElementSibling;\n return el || null;\n },\n\n focusBlockContent(blockLine, position) {\n const content = blockLine.querySelector('.block-content');\n if (!content) return;\n content.focus();\n const range = document.createRange();\n range.selectNodeContents(content);\n range.collapse(position !== 'end');\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n },\n\n updateNumberedLists() {\n // Re-number all numbered list items\n let number = 1;\n this.blocksContainer.querySelectorAll('.block-line').forEach(block => {\n if (block.dataset.blockType === 'numbered') {\n block.dataset.number = number;\n const content = block.querySelector('.block-content');\n if (content) {\n content.dataset.number = number;\n }\n number++;\n } else {\n // Reset counter when we hit a non-numbered block\n number = 1;\n }\n });\n }\n};\n\n// Initialize on DOM load\ndocument.addEventListener('DOMContentLoaded', () => {\n BlockEditor.init();\n});\n\n// Export for use in other scripts\nwindow.BlockEditor = BlockEditor;\n", "// Page actions menu controller \u2014 drives the floating \u2022\u2022\u2022 menu rendered by\n// shared/_page_actions_menu.html.erb and the move-to picker rendered by\n// shared/_move_to_modal.html.erb. Triggers (sidebar rows, show-page buttons)\n// just need [data-page-actions-trigger] + the data-page-* attributes the\n// partial documents at the top.\n//\n// Why a single shared menu element instead of per-trigger dropdowns:\n// - One DOM tree, one set of event listeners, no duplicate ids when the\n// sidebar renders dozens of page rows.\n// - Positioning is handled by JS, so the menu can fly out of overflow:hidden\n// sidebars without clipping.\n// - Keeps the show-page dropdowns lightweight \u2014 they delegate their actions\n// section to this controller and only own their cover/icon affordances.\n\ndocument.addEventListener('DOMContentLoaded', function () {\n const menu = document.getElementById('page-actions-menu');\n const modal = document.getElementById('move-to-modal');\n if (!menu) return; // Layout-rendered partial absent \u2014 bail silently.\n\n const csrf = (document.querySelector('meta[name=\"csrf-token\"]') || {}).content || '';\n\n // \u2500\u2500 Active context (whichever trigger most recently opened the menu) \u2500\u2500\u2500\n let active = null;\n let activeTriggerEl = null;\n\n function readContext(trigger) {\n return {\n pageId: trigger.dataset.pageId,\n pageTitle: trigger.dataset.pageTitle || 'Untitled',\n pageIcon: trigger.dataset.pageIcon || '\uD83D\uDCC4',\n pageUrl: trigger.dataset.pageUrl,\n starred: trigger.dataset.pageStarred === 'true',\n updateUrl: trigger.dataset.pageUpdateUrl,\n deleteUrl: trigger.dataset.pageDeleteUrl,\n duplicateUrl: trigger.dataset.pageDuplicateUrl,\n starUrl: trigger.dataset.pageToggleStarUrl,\n renameMode: trigger.dataset.renameMode || 'title-input',\n };\n }\n\n // \u2500\u2500 Toast (reused for every action's feedback) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // The show pages have their own #page-toast; for the sidebar we mint a\n // lightweight portable toast so feedback is uniform regardless of where\n // the user invoked the action.\n function showToast(msg, kind) {\n const existing = document.getElementById('koz-portable-toast');\n if (existing) existing.remove();\n const toast = document.createElement('div');\n toast.id = 'koz-portable-toast';\n const accent = kind === 'error' ? '#FF6B9E' : '#45D69B';\n toast.style.cssText =\n 'position:fixed;bottom:20px;right:20px;z-index:200;' +\n 'display:flex;align-items:center;gap:10px;' +\n 'padding:10px 14px;border-radius:10px;' +\n 'background:rgba(11,15,30,0.92);backdrop-filter:blur(12px);' +\n 'border:1px solid rgba(255,255,255,0.12);' +\n 'border-left:2px solid ' + accent + ';' +\n 'color:#F4F6FB;font-size:13px;font-weight:500;' +\n 'box-shadow:0 16px 32px -12px rgba(0,0,0,0.5);' +\n 'animation:fade-in 0.18s ease-out;';\n toast.textContent = msg;\n document.body.appendChild(toast);\n setTimeout(function () { toast.remove(); }, 2200);\n }\n\n // \u2500\u2500 Open / close / position \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function openMenu(trigger) {\n activeTriggerEl = trigger;\n active = readContext(trigger);\n\n // Update the active label strip.\n const iconEl = document.getElementById('pam-active-icon');\n const titleEl = document.getElementById('pam-active-title');\n if (iconEl) iconEl.textContent = active.pageIcon;\n if (titleEl) titleEl.textContent = active.pageTitle;\n\n // Favorite label flips based on current state.\n const favLbl = document.getElementById('pam-favorite-label');\n if (favLbl) favLbl.textContent = active.starred ? 'Remove from Favorites' : 'Add to Favorites';\n\n // Reveal first to measure, then position.\n menu.classList.remove('hidden');\n positionMenu(trigger);\n\n // Re-init lucide icons inside the menu (they may not have rendered yet).\n if (window.lucide && window.lucide.createIcons) window.lucide.createIcons();\n }\n\n function closeMenu() {\n menu.classList.add('hidden');\n activeTriggerEl = null;\n }\n\n function positionMenu(trigger) {\n const rect = trigger.getBoundingClientRect();\n const menuRect = menu.getBoundingClientRect();\n const margin = 6;\n\n // Prefer placing the menu's top-left near the trigger's bottom-right.\n let left = rect.right - menuRect.width; // right-align with trigger\n let top = rect.bottom + margin;\n\n // Flip horizontally if it would overflow the left edge.\n if (left < 8) left = rect.left;\n\n // Flip vertically if it would overflow the bottom edge.\n if (top + menuRect.height > window.innerHeight - 8) {\n top = rect.top - menuRect.height - margin;\n }\n\n // Clamp so it never sits off-screen even on tiny viewports.\n left = Math.max(8, Math.min(left, window.innerWidth - menuRect.width - 8));\n top = Math.max(8, Math.min(top, window.innerHeight - menuRect.height - 8));\n\n menu.style.left = left + 'px';\n menu.style.top = top + 'px';\n }\n\n // \u2500\u2500 Trigger delegation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n document.addEventListener('click', function (e) {\n const trigger = e.target.closest('[data-page-actions-trigger]');\n if (trigger) {\n e.preventDefault();\n e.stopPropagation();\n // Toggle if same trigger; otherwise reopen on the new trigger.\n if (activeTriggerEl === trigger && !menu.classList.contains('hidden')) {\n closeMenu();\n } else {\n openMenu(trigger);\n }\n return;\n }\n // Click anywhere else closes the menu (but not the modal).\n if (!menu.contains(e.target)) closeMenu();\n });\n\n // Reposition on scroll/resize so the menu stays attached while open.\n window.addEventListener('scroll', function () { if (activeTriggerEl) positionMenu(activeTriggerEl); }, true);\n window.addEventListener('resize', function () { if (activeTriggerEl) positionMenu(activeTriggerEl); });\n\n // Esc closes either the menu or the modal.\n document.addEventListener('keydown', function (e) {\n if (e.key === 'Escape') {\n if (modal && !modal.classList.contains('hidden')) closeModal();\n else if (!menu.classList.contains('hidden')) closeMenu();\n }\n });\n\n // \u2500\u2500 Action dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n menu.addEventListener('click', function (e) {\n const item = e.target.closest('[data-action]');\n if (!item || !active) return;\n const action = item.dataset.action;\n\n switch (action) {\n case 'favorite': return doFavorite();\n case 'copy-link': return doCopyLink();\n case 'duplicate': return doDuplicate();\n case 'rename': return doRename();\n case 'move': return openModal();\n case 'open-tab': return doOpenTab();\n case 'delete': return doDelete();\n }\n });\n\n async function doFavorite() {\n if (!active.starUrl) { showToast('No star endpoint', 'error'); closeMenu(); return; }\n try {\n const res = await fetch(active.starUrl, {\n method: 'POST',\n headers: { 'Accept': 'application/json', 'X-CSRF-Token': csrf },\n credentials: 'same-origin'\n });\n const data = await res.json().catch(function () { return {}; });\n if (res.ok && data.success) {\n const nowStarred = !!data.is_starred;\n showToast(nowStarred ? 'Added to Favorites' : 'Removed from Favorites');\n // Reflect new state on the trigger so a second open shows the right label.\n if (activeTriggerEl) activeTriggerEl.dataset.pageStarred = nowStarred ? 'true' : 'false';\n // Mirror to a separate star button on the same page if present.\n const starBtn = document.getElementById('star-btn');\n if (starBtn && starBtn.dataset.toggleUrl === active.starUrl) {\n starBtn.dataset.starred = nowStarred ? 'true' : 'false';\n const ic = starBtn.querySelector('svg');\n if (ic) {\n ic.classList.toggle('text-amber', nowStarred);\n ic.classList.toggle('fill-amber', nowStarred);\n }\n }\n } else {\n showToast('Could not update', 'error');\n }\n } catch (err) {\n console.error('Favorite failed', err);\n showToast('Network error', 'error');\n }\n closeMenu();\n }\n\n function doCopyLink() {\n const url = active.pageUrl ? new URL(active.pageUrl, window.location.origin).toString() : window.location.href;\n if (navigator.clipboard && navigator.clipboard.writeText) {\n navigator.clipboard.writeText(url).then(function () {\n showToast('Link copied');\n }).catch(function () { showToast('Could not copy', 'error'); });\n } else {\n // Fallback for non-secure-context (rare in modern Rails dev, but not unheard of).\n const ta = document.createElement('textarea');\n ta.value = url; ta.style.position = 'fixed'; ta.style.opacity = '0';\n document.body.appendChild(ta); ta.select();\n try { document.execCommand('copy'); showToast('Link copied'); }\n catch (e) { showToast('Could not copy', 'error'); }\n document.body.removeChild(ta);\n }\n closeMenu();\n }\n\n async function doDuplicate() {\n if (!active.duplicateUrl) { showToast('Cannot duplicate', 'error'); closeMenu(); return; }\n try {\n const res = await fetch(active.duplicateUrl, {\n method: 'POST',\n headers: { 'Accept': 'application/json', 'X-CSRF-Token': csrf },\n credentials: 'same-origin'\n });\n const data = await res.json().catch(function () { return {}; });\n if (res.ok && data.success && data.redirect_url) {\n showToast('Duplicated \u2014 opening copy\u2026');\n setTimeout(function () { window.location.href = data.redirect_url; }, 350);\n } else {\n showToast((data.errors && data.errors[0]) || 'Could not duplicate', 'error');\n }\n } catch (err) {\n console.error('Duplicate failed', err);\n showToast('Network error', 'error');\n }\n closeMenu();\n }\n\n function doRename() {\n if (active.renameMode === 'title-input') {\n // On the page show: focus the existing title input and select its text.\n // The block editor's auto-save catches the blur.\n const input = document.getElementById('page-title-input');\n if (input) {\n input.focus();\n input.select();\n } else {\n showToast('No title field to focus', 'error');\n }\n } else if (active.renameMode === 'inline' && activeTriggerEl) {\n startInlineRename(activeTriggerEl);\n }\n closeMenu();\n }\n\n // Replace the sidebar row's link with a text input. On commit (Enter / blur),\n // PATCH the page and update the link's label without a page reload.\n function startInlineRename(trigger) {\n const row = trigger.closest('.page-tree-item');\n if (!row) return;\n const link = row.querySelector('a');\n if (!link) return;\n\n const labelSpan = link.querySelector('span.truncate');\n const currentTitle = labelSpan ? labelSpan.textContent.trim() : (active.pageTitle || '');\n\n const input = document.createElement('input');\n input.type = 'text';\n input.value = currentTitle;\n input.className = 'sidebar-rename-input';\n link.style.display = 'none';\n link.parentNode.insertBefore(input, link);\n input.focus();\n input.select();\n\n let committed = false;\n async function commit() {\n if (committed) return;\n committed = true;\n const newTitle = input.value.trim();\n input.remove();\n link.style.display = '';\n if (!newTitle || newTitle === currentTitle) return;\n try {\n const res = await fetch(active.updateUrl, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-Token': csrf },\n credentials: 'same-origin',\n body: JSON.stringify({ page: { title: newTitle } })\n });\n const data = await res.json().catch(function () { return {}; });\n if (res.ok && data.success) {\n if (labelSpan) labelSpan.textContent = newTitle;\n if (trigger) trigger.dataset.pageTitle = newTitle;\n showToast('Renamed');\n // The slug changed too; if the user clicks the link next, the\n // server-side controller redirects to the canonical URL.\n if (data.page && data.page.url) link.setAttribute('href', data.page.url);\n } else {\n showToast('Could not rename', 'error');\n }\n } catch (err) {\n console.error('Rename failed', err);\n showToast('Network error', 'error');\n }\n }\n function cancel() {\n if (committed) return;\n committed = true;\n input.remove();\n link.style.display = '';\n }\n input.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') { e.preventDefault(); commit(); }\n if (e.key === 'Escape') { e.preventDefault(); cancel(); }\n });\n input.addEventListener('blur', commit);\n }\n\n function doOpenTab() {\n if (active.pageUrl) window.open(active.pageUrl, '_blank', 'noopener');\n closeMenu();\n }\n\n async function doDelete() {\n closeMenu();\n if (!active.deleteUrl) { showToast('Cannot delete', 'error'); return; }\n if (!confirm('Move \"' + active.pageTitle + '\" to trash? This will also remove every sub-page underneath it.')) return;\n try {\n const res = await fetch(active.deleteUrl, {\n method: 'DELETE',\n headers: { 'Accept': 'application/json', 'X-CSRF-Token': csrf },\n credentials: 'same-origin'\n });\n const data = await res.json().catch(function () { return {}; });\n if (res.ok && data.success) {\n // If we're currently looking at the deleted page, follow the redirect.\n const onThisPage = window.location.pathname === active.pageUrl;\n if (onThisPage && data.redirect_url) {\n window.location.href = data.redirect_url;\n } else {\n // Otherwise just yank the row from the sidebar without reloading.\n const row = activeTriggerEl && activeTriggerEl.closest('.page-tree-item');\n if (row) row.remove();\n showToast('Moved to Trash');\n }\n } else {\n showToast('Could not delete', 'error');\n }\n } catch (err) {\n console.error('Delete failed', err);\n showToast('Network error', 'error');\n }\n }\n\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n // MOVE-TO MODAL\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n if (!modal) return;\n\n const backdrop = document.getElementById('move-to-backdrop');\n const closeBtn = document.getElementById('move-to-close');\n const searchEl = document.getElementById('move-to-search');\n const listEl = document.getElementById('move-to-list');\n const emptyEl = document.getElementById('move-to-empty');\n const subjectEl = document.getElementById('move-to-subject');\n const countEl = document.getElementById('move-to-count');\n const allRows = function () { return Array.from(listEl.querySelectorAll('.move-to-row')); };\n\n function openModal() {\n closeMenu();\n if (!active) return;\n\n subjectEl.textContent = 'Moving \"' + active.pageTitle + '\"';\n\n // Mark invalid destinations: self + every descendant of the page being moved.\n // We fetch descendants by walking the page-tree-item DOM in the sidebar \u2014 this\n // is fast (no roundtrip) and accurate as long as the sidebar shows the page\n // tree (which it does on every authenticated screen).\n const invalidIds = new Set([String(active.pageId)]);\n const sidebarRow = document.querySelector('.page-tree-item[data-page-id=\"' + active.pageId + '\"]');\n if (sidebarRow) {\n sidebarRow.querySelectorAll('.page-tree-item').forEach(function (el) {\n invalidIds.add(String(el.dataset.pageId));\n });\n }\n\n // Reset filter state, mark current parent + invalid targets, count visible.\n let visible = 0;\n allRows().forEach(function (row) {\n const id = row.dataset.targetId;\n const invalid = invalidIds.has(String(id));\n row.dataset.disabled = invalid ? 'true' : 'false';\n row.classList.remove('is-active', 'is-current');\n row.style.display = '';\n // Mark the current parent visually so users know where the page lives now.\n if (activeTriggerEl && activeTriggerEl.dataset.parentId === id) row.classList.add('is-current');\n if (!invalid) visible++;\n });\n refreshCount(visible);\n\n searchEl.value = '';\n showAllGroups();\n modal.classList.remove('hidden');\n setTimeout(function () { searchEl.focus(); }, 30);\n if (window.lucide && window.lucide.createIcons) window.lucide.createIcons();\n }\n\n function closeModal() {\n modal.classList.add('hidden');\n }\n\n function refreshCount(n) {\n if (!countEl) return;\n countEl.textContent = n + ' destination' + (n === 1 ? '' : 's');\n }\n\n // Hide group labels whose every row is filtered out.\n function showAllGroups() {\n listEl.querySelectorAll('.move-to-group-label').forEach(function (l) { l.style.display = ''; });\n }\n function recomputeGroupVisibility() {\n const labels = listEl.querySelectorAll('.move-to-group-label');\n labels.forEach(function (label) {\n const groupName = label.dataset.group;\n const anyVisible = listEl.querySelectorAll(\n '.move-to-row[data-target-project=\"' + cssEscape(groupName) + '\"]'\n );\n let shown = 0;\n anyVisible.forEach(function (r) { if (r.style.display !== 'none') shown++; });\n label.style.display = shown ? '' : 'none';\n });\n }\n\n // Light CSS.escape polyfill \u2014 modern browsers support CSS.escape, but we\n // route through this helper anyway so the call sites stay readable.\n function cssEscape(v) {\n if (window.CSS && CSS.escape) return CSS.escape(v);\n return String(v).replace(/([\"\\\\])/g, '\\\\$1');\n }\n\n // Search filter \u2014 case-insensitive substring on title; empty query restores all.\n if (searchEl) {\n searchEl.addEventListener('input', function () {\n const q = searchEl.value.trim().toLowerCase();\n let visible = 0;\n let firstActive = null;\n allRows().forEach(function (row) {\n const title = (row.dataset.targetTitle || '').toLowerCase();\n const proj = (row.dataset.targetProject || '').toLowerCase();\n const matches = !q || title.indexOf(q) !== -1 || proj.indexOf(q) !== -1;\n const disabled = row.dataset.disabled === 'true';\n const show = matches && !disabled;\n row.style.display = show ? '' : 'none';\n row.classList.remove('is-active');\n if (show) {\n visible++;\n if (!firstActive) firstActive = row;\n }\n });\n if (firstActive) firstActive.classList.add('is-active');\n if (emptyEl) emptyEl.classList.toggle('hidden', visible > 0);\n recomputeGroupVisibility();\n refreshCount(visible);\n });\n\n // Keyboard navigation through the visible rows.\n searchEl.addEventListener('keydown', function (e) {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp' && e.key !== 'Enter') return;\n const visibleRows = allRows().filter(function (r) {\n return r.style.display !== 'none' && r.dataset.disabled !== 'true';\n });\n if (visibleRows.length === 0) return;\n const currentIdx = visibleRows.findIndex(function (r) { return r.classList.contains('is-active'); });\n if (e.key === 'Enter') {\n e.preventDefault();\n const target = currentIdx >= 0 ? visibleRows[currentIdx] : visibleRows[0];\n target.click();\n return;\n }\n e.preventDefault();\n let next;\n if (e.key === 'ArrowDown') next = currentIdx < visibleRows.length - 1 ? currentIdx + 1 : 0;\n else next = currentIdx > 0 ? currentIdx - 1 : visibleRows.length - 1;\n visibleRows.forEach(function (r) { r.classList.remove('is-active'); });\n visibleRows[next].classList.add('is-active');\n visibleRows[next].scrollIntoView({ block: 'nearest' });\n });\n }\n\n // Hover sets the active row (so keyboard + mouse stay in sync).\n if (listEl) {\n listEl.addEventListener('mouseover', function (e) {\n const row = e.target.closest('.move-to-row');\n if (!row || row.dataset.disabled === 'true') return;\n allRows().forEach(function (r) { r.classList.remove('is-active'); });\n row.classList.add('is-active');\n });\n\n // Click commits the move via PATCH /pages/:id with parent_id.\n listEl.addEventListener('click', function (e) {\n const row = e.target.closest('.move-to-row');\n if (!row || row.dataset.disabled === 'true') return;\n commitMove(row);\n });\n }\n\n if (closeBtn) closeBtn.addEventListener('click', closeModal);\n if (backdrop) backdrop.addEventListener('click', closeModal);\n\n async function commitMove(row) {\n if (!active || !active.updateUrl) return;\n const targetId = row.dataset.targetId;\n const targetTitle = row.dataset.targetTitle;\n try {\n const res = await fetch(active.updateUrl, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-Token': csrf },\n credentials: 'same-origin',\n body: JSON.stringify({ page: { parent_id: targetId } })\n });\n const data = await res.json().catch(function () { return {}; });\n if (res.ok && data.success) {\n showToast('Moved to ' + targetTitle);\n closeModal();\n // Reload so the sidebar tree + breadcrumbs reflect the new parenting.\n // Reparenting touches multiple panes (sidebar, breadcrumb, unlinked\n // sub-pages section) so a clean reload is more reliable than trying to\n // patch every region in place.\n setTimeout(function () { window.location.reload(); }, 350);\n } else {\n showToast((data.errors && data.errors[0]) || 'Could not move', 'error');\n }\n } catch (err) {\n console.error('Move failed', err);\n showToast('Network error', 'error');\n }\n }\n});\n"], "mappings": "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", "names": ["sidebarToggle", "primarySidebar", "navbarLogoSection", "isCollapsed", "workspaceDropdownBtn", "workspaceDropdown", "closeWorkspaceDropdown", "e", "item", "slug", "quickSearchBtn", "headerSearchBtn", "searchOverlay", "globalSearchInput", "openSearch", "closeSearch", "closeNotifications", "closeUserDropdown", "notificationsBtn", "notificationsPanel", "userDropdownBtn", "userDropdown", "btn", "alert", "el", "_defineProperty", "e", "r", "t", "_toPropertyKey", "_extends", "n", "ownKeys", "e", "r", "t", "_objectSpread2", "_defineProperty", "_objectWithoutProperties", "o", "_objectWithoutPropertiesLoose", "n", "_toPrimitive", "r", "e", "i", "_toPropertyKey", "_typeof", "o", "version", "userAgent", "pattern", "IE11OrLess", "Edge", "FireFox", "Safari", "IOS", "ChromeForAndroid", "captureMode", "on", "el", "event", "fn", "off", "matches", "selector", "getParentOrHost", "closest", "ctx", "includeCTX", "R_SPACE", "toggleClass", "name", "state", "className", "css", "prop", "val", "style", "matrix", "selfOnly", "appliedTransforms", "transform", "matrixFn", "find", "tagName", "iterator", "list", "n", "getWindowScrollingElement", "scrollingElement", "getRect", "relativeToContainingBlock", "relativeToNonStaticParent", "undoScale", "container", "elRect", "top", "left", "bottom", "right", "height", "width", "containerRect", "elMatrix", "scaleX", "scaleY", "isScrolledPast", "elSide", "parentSide", "parent", "getParentAutoScrollElement", "elSideVal", "parentSideVal", "visible", "getChild", "childNum", "options", "includeDragEl", "currentChild", "i", "children", "Sortable", "lastChild", "last", "index", "getRelativeScrollOffset", "offsetLeft", "offsetTop", "winScroller", "indexOfObject", "arr", "obj", "key", "includeSelf", "elem", "gotSelf", "elemCSS", "extend", "dst", "src", "isRectEqual", "rect1", "rect2", "_throttleTimeout", "throttle", "callback", "ms", "args", "_this", "cancelThrottle", "scrollBy", "x", "y", "clone", "Polymer", "$", "getChildContainingRectFromElement", "container", "options", "ghostEl", "rect", "child", "_rect$left", "_rect$top", "_rect$right", "_rect$bottom", "closest", "childRect", "getRect", "expando", "AnimationStateManager", "animationStates", "animationCallbackId", "children", "css", "Sortable", "fromRect", "_objectSpread2", "childMatrix", "matrix", "state", "target", "indexOfObject", "callback", "_this", "animating", "animationTime", "time", "toRect", "prevFromRect", "prevToRect", "animatingRect", "targetMatrix", "isRectEqual", "calculateRealTime", "currentRect", "duration", "elMatrix", "scaleX", "scaleY", "translateX", "translateY", "repaint", "plugins", "defaults", "PluginManager", "plugin", "option", "p", "eventName", "sortable", "evt", "eventNameGlobal", "el", "pluginName", "initialized", "_extends", "modified", "name", "eventProperties", "value", "modifiedValue", "dispatchEvent", "_ref", "rootEl", "targetEl", "cloneEl", "toEl", "fromEl", "oldIndex", "newIndex", "oldDraggableIndex", "newDraggableIndex", "originalEvent", "putSortable", "extraEventProperties", "onName", "IE11OrLess", "Edge", "allEventProperties", "_excluded", "pluginEvent", "data", "_objectWithoutProperties", "dragEl", "parentEl", "nextEl", "lastDownEl", "cloneHidden", "moved", "_hideGhostForTarget", "_unhideGhostForTarget", "_dispatchEvent", "info", "activeGroup", "awaitingDragStarted", "ignoreNextClick", "sortables", "tapEvt", "touchEvt", "lastDx", "lastDy", "tapDistanceLeft", "tapDistanceTop", "lastTarget", "lastDirection", "pastFirstInvertThresh", "isCircumstantialInvert", "targetMoveDistance", "ghostRelativeParent", "ghostRelativeParentInitialScroll", "_silent", "savedInputChecked", "documentExists", "PositionGhostAbsolutely", "IOS", "CSSFloatProperty", "supportDraggable", "ChromeForAndroid", "supportCssPointerEvents", "_detectDirection", "elCSS", "elWidth", "child1", "getChild", "child2", "firstChildCSS", "secondChildCSS", "firstChildWidth", "secondChildWidth", "touchingSideChild2", "_dragElInRowColumn", "dragRect", "targetRect", "vertical", "dragElS1Opp", "dragElS2Opp", "dragElOppLength", "targetS1Opp", "targetS2Opp", "targetOppLength", "_detectNearestEmptySortable", "x", "y", "ret", "threshold", "lastChild", "insideHorizontally", "insideVertically", "_prepareGroup", "toFn", "pull", "to", "from", "sameGroup", "otherGroup", "group", "originalGroup", "_typeof", "nearestEmptyInsertDetectEvent", "nearest", "event", "_checkOutsideTargetEl", "dataTransfer", "Safari", "fn", "on", "preventOnFilter", "type", "touch", "originalTarget", "filter", "_saveInputCheckedState", "index", "criteria", "ownerDocument", "dragStartFn", "FireFox", "toggleClass", "find", "_disableDraggable", "off", "_nextTick", "fallback", "parent", "inserted", "getParentOrHost", "fallbackTolerance", "fallbackOffset", "ghostMatrix", "relativeScrollOffset", "getRelativeScrollOffset", "dx", "dy", "cssMatrix", "getWindowScrollingElement", "clone", "revert", "activeSortable", "isOwner", "canSort", "fromSortable", "completedFired", "dragOverEvent", "extra", "completed", "after", "_onMove", "changed", "capture", "insertion", "elLastChild", "_ghostIsLast", "_ghostIsFirst", "firstChild", "direction", "targetBeforeFirstSwap", "differentLevel", "differentRowCol", "side1", "scrolledPastTop", "isScrolledPast", "scrollBefore", "_getSwapDirection", "sibling", "dragIndex", "nextSibling", "moveVector", "_unsilent", "scrollBy", "_cancelNextTick", "checkEl", "_globalDragOver", "order", "n", "_generateId", "useAnimation", "items", "id", "i", "store", "selector", "willInsertAfter", "onMoveFn", "retVal", "firstElRect", "childContainingRect", "spacer", "lastElRect", "swapThreshold", "invertedSwapThreshold", "invertSwap", "isLastTarget", "mouseOnAxis", "targetLength", "targetS1", "targetS2", "invert", "_getInsertDirection", "str", "sum", "root", "inputs", "idx", "extend", "throttle", "element", "_len", "_key", "version", "autoScrolls", "scrollEl", "scrollRootEl", "scrolling", "lastAutoScrollX", "lastAutoScrollY", "touchEvt$1", "pointerElemChangedInterval", "AutoScrollPlugin", "AutoScroll", "_ref2", "clearPointerElemChangedInterval", "clearAutoScrolls", "cancelThrottle", "elem", "autoScroll", "ogElemScroller", "getParentAutoScrollElement", "newElem", "isFallback", "sens", "speed", "winScroller", "scrollThisInstance", "scrollCustomFn", "layersOut", "currentParent", "top", "bottom", "left", "right", "width", "height", "canScrollX", "canScrollY", "scrollWidth", "scrollHeight", "scrollPosX", "scrollPosY", "vx", "vy", "scrollOffsetY", "scrollOffsetX", "drop", "dispatchSortableEvent", "hideGhostForTarget", "unhideGhostForTarget", "toSortable", "Revert", "_ref3", "Remove", "_ref4", "parentSortable", "Sortable", "AutoScrollPlugin", "Remove", "Revert", "sortable_esm_default", "csrfToken", "t", "parentIdFor", "container", "orderedIdsFor", "el", "persist", "parentId", "orderedIds", "r", "d", "res", "msg", "baseOpts", "projectsList", "sortable_esm_default", "evt", "initPageContainer", "init", "panel", "currentUserId", "pusherKey", "pusherCluster", "btn", "dot", "listEl", "emptyEl", "markAllBtn", "notifications", "unreadCount", "updateDot", "updateMarkAllState", "escapeHtml", "s", "GRADIENTS", "gradientFor", "id", "n", "renderItem", "actor", "initials", "avatar", "unreadDot", "bodyHtml", "rowClasses", "render", "applyState", "items", "count", "fetchNotifications", "r", "data", "e", "row", "url", "wasUnread", "dotSpan", "pusher", "channel", "COLORS", "BY_NAME", "BY_HEX", "c", "name", "hex", "colorOrHex", "escapeHtml", "s", "opts", "value", "options", "onChange", "placeholder", "wrap", "trigger", "labelEl", "panel", "optionInner", "o", "bits", "sw", "renderTrigger", "found", "renderPanel", "empty", "item", "isActive", "e", "choose", "outsideHandler", "open", "close", "v", "values", "chipBox", "chev", "renderChips", "active", "idx", "escapeHtml", "s", "colorList", "colorByName", "n", "activePicker", "closeColorPicker", "openColorPicker", "anchor", "currentColor", "onPick", "picker", "c", "dot", "e", "rect", "pickerRect", "outside", "opts", "onChange", "compact", "root", "listEl", "addBtn", "addChoice", "emit", "getChoices", "row", "out", "applySwatchStyle", "el", "color", "buildRow", "choice", "label", "grip", "swatch", "newColor", "input", "removeRow", "del", "wireDrag", "focusPrev", "prev", "i", "dragSrc", "before", "initial", "palette", "current", "nextColor", "setChoices", "arr", "normalized", "empty", "TaskModal", "e", "taskId", "boardId", "response", "task", "overlay", "error", "taskTags", "boardTags", "container", "tag", "hex", "pill", "btn", "anchor", "pop", "search", "listEl", "createWrap", "createBtn", "createLabel", "renderList", "empty", "checkedIds", "t", "row", "willAdd", "q", "visible", "exact", "r", "match", "name", "created", "a", "err", "rect", "outside", "tagId", "add", "currentIds", "ids", "result", "tags", "taskCard", "columnId", "fallbackName", "shell", "badge", "columnEl", "dotStyle", "c", "_hex", "card", "s", "m", "h", "n", "x", "col", "id", "dot", "currentColumnId", "host", "options", "v", "assignedUsers", "members", "assignedIds", "u", "member", "checked", "avatar", "cb", "avatarContainer", "fields", "fieldValues", "field", "value", "rawValue", "labelBtn", "parsed", "persist", "opts", "kdd", "initial", "input", "display", "wrap", "renderEditing", "commit", "renderDisplay", "editRow", "link", "editBtn", "type", "iso", "d", "label", "o", "rawOptions", "isSelect", "nameInput", "choicesEditor", "countEl", "cs", "newName", "choices", "popRect", "top", "picker", "found", "fieldId", "patch", "updated", "f", "currentValue", "fresh", "comments", "comment", "content", "delta", "numEl", "next", "title", "description", "el", "data", "titleEl", "descRaw", "desc", "descEl", "truncated", "targetContainer", "emptyState", "targetBoardId", "svgs", "catalog", "rows", "showOpts", "pretty", "fieldType", "text", "div", "BlockEditor", "content", "md", "lines", "blocks", "inCodeBlock", "codeContent", "codeLanguage", "i", "line", "meta", "mediaHandled", "sentinel", "prefix", "header", "align", "rows", "j", "checked", "todoContent", "match", "text", "seg", "s", "stash", "hold", "html", "_", "c", "label", "url", "safe", "pre", "n", "sepLine", "left", "right", "blockEls", "serializeContent", "contentEl", "type", "blockEl", "num", "table", "trs", "serRow", "tr", "cell", "colCount", "sep", "a", "r", "lang", "cap", "block", "index", "emptyBlock", "div", "addBtn", "e", "dragHandle", "mouseDownAt", "dx", "dy", "hr", "link", "wrapper", "checkbox", "menuItem", "menu", "slashIndex", "query", "blockLine", "cd", "replaceFirst", "anchor", "lastInserted", "b", "idx", "el", "selected", "blockType", "isEmpty", "newBlock", "target", "goingUp", "sibling", "prevBlock", "prevContent", "range", "sel", "direction", "items", "current", "currentIndex", "anchorRect", "margin", "w", "h", "spaceBelow", "spaceAbove", "top", "anchorEl", "filterInput", "firstItem", "lowerQuery", "firstVisible", "item", "matches", "currentContent", "cleanContent", "newContent", "placeholder", "body", "res", "data", "linkBlock", "followUp", "err", "typeSlug", "ph", "fig", "img", "video", "audio", "sizeStr", "safeHref", "host", "wrap", "alignClass", "thead", "htr", "th", "tbody", "td", "initial", "bytes", "units", "raw", "input", "file", "sourceBlockLine", "fd", "finalBlock", "title", "indicator", "crumb", "error", "bar", "btn", "cmd", "inner", "palette", "colorBtn", "hex", "fmtBtn", "node", "rect", "on", "intersects", "parent", "action", "icon", "hint", "turnIntoTypes", "t", "empty", "focusTarget", "cb", "newType", "oldType", "tmp", "replacement", "_e", "midY", "isTopHalf", "relatedTarget", "caretRect", "elRect", "slack", "position", "number", "menu", "modal", "csrf", "active", "activeTriggerEl", "readContext", "trigger", "showToast", "msg", "kind", "existing", "toast", "accent", "openMenu", "iconEl", "titleEl", "favLbl", "positionMenu", "closeMenu", "rect", "menuRect", "margin", "left", "top", "e", "closeModal", "item", "doFavorite", "doCopyLink", "doDuplicate", "doRename", "openModal", "doOpenTab", "doDelete", "res", "data", "nowStarred", "starBtn", "ic", "err", "url", "ta", "input", "startInlineRename", "row", "link", "labelSpan", "currentTitle", "committed", "commit", "newTitle", "cancel", "backdrop", "closeBtn", "searchEl", "listEl", "emptyEl", "subjectEl", "countEl", "allRows", "invalidIds", "sidebarRow", "el", "visible", "id", "invalid", "refreshCount", "showAllGroups", "n", "l", "recomputeGroupVisibility", "label", "groupName", "anyVisible", "cssEscape", "shown", "r", "v", "q", "firstActive", "title", "proj", "matches", "disabled", "show", "visibleRows", "currentIdx", "next", "commitMove", "targetId", "targetTitle"] }