\n const ul = vl.params.ul;\n vl.$ul = ul ? $(vl.params.ul) : vl.$el.children('ul');\n if (vl.$ul.length === 0 && vl.params.createUl) {\n vl.$el.append('');\n vl.$ul = vl.$el.children('ul');\n }\n vl.ul = vl.$ul[0];\n let $itemsWrapEl;\n if (!vl.ul && !vl.params.createUl) $itemsWrapEl = vl.$el;else $itemsWrapEl = vl.$ul;\n extend(vl, {\n $itemsWrapEl,\n itemsWrapEl: $itemsWrapEl[0],\n // DOM cached items\n domCache: {},\n // Temporary DOM Element\n tempDomElement: document.createElement('ul'),\n // Last repain position\n lastRepaintY: null,\n // Fragment\n fragment: document.createDocumentFragment(),\n // Props\n pageHeight: undefined,\n rowsPerScreen: undefined,\n rowsBefore: undefined,\n rowsAfter: undefined,\n rowsToRender: undefined,\n maxBufferHeight: 0,\n listHeight: undefined,\n dynamicHeight: typeof vl.params.height === 'function',\n autoHeight: vl.params.height === 'auto'\n });\n\n // Install Modules\n vl.useModules();\n\n // Attach events\n const handleScrollBound = vl.handleScroll.bind(vl);\n const handleResizeBound = vl.handleResize.bind(vl);\n let $pageEl;\n let $tabEl;\n let $panelEl;\n let $popupEl;\n vl.attachEvents = function attachEvents() {\n $pageEl = vl.$el.parents('.page').eq(0);\n $tabEl = vl.$el.parents('.tab').filter(tabEl => {\n return $(tabEl).parent('.tabs').parent('.tabs-animated-wrap, swiper-container.tabs').length === 0;\n }).eq(0);\n $panelEl = vl.$el.parents('.panel').eq(0);\n $popupEl = vl.$el.parents('.popup').eq(0);\n vl.$scrollableParentEl.on('scroll', handleScrollBound);\n if ($pageEl.length) $pageEl.on('page:reinit', handleResizeBound);\n if ($tabEl.length) $tabEl.on('tab:show', handleResizeBound);\n if ($panelEl.length) $panelEl.on('panel:open', handleResizeBound);\n if ($popupEl.length) $popupEl.on('popup:open', handleResizeBound);\n app.on('resize', handleResizeBound);\n };\n vl.detachEvents = function attachEvents() {\n vl.$scrollableParentEl.off('scroll', handleScrollBound);\n if ($pageEl.length) $pageEl.off('page:reinit', handleResizeBound);\n if ($tabEl.length) $tabEl.off('tab:show', handleResizeBound);\n if ($panelEl.length) $panelEl.off('panel:open', handleResizeBound);\n if ($popupEl.length) $popupEl.off('popup:open', handleResizeBound);\n app.off('resize', handleResizeBound);\n };\n // Init\n vl.init();\n return vl;\n }\n setListSize(autoHeightRerender) {\n const vl = this;\n const items = vl.filteredItems || vl.items;\n if (!autoHeightRerender) {\n vl.pageHeight = vl.$scrollableParentEl[0].offsetHeight;\n }\n if (vl.dynamicHeight) {\n vl.listHeight = 0;\n vl.heights = [];\n for (let i = 0; i < items.length; i += 1) {\n const itemHeight = vl.params.height(items[i]);\n vl.listHeight += itemHeight;\n vl.heights.push(itemHeight);\n }\n } else if (vl.autoHeight) {\n vl.listHeight = 0;\n if (!vl.heights) vl.heights = [];\n if (!vl.heightsCalculated) vl.heightsCalculated = [];\n const renderedItems = {};\n vl.$itemsWrapEl.find(`[data-virtual-list-index]`).forEach(el => {\n renderedItems[parseInt(el.getAttribute('data-virtual-list-index'), 10)] = el;\n });\n for (let i = 0; i < items.length; i += 1) {\n const itemIndex = vl.items.indexOf(items[i]);\n const renderedItem = renderedItems[itemIndex];\n if (renderedItem) {\n if (!vl.heightsCalculated.includes(itemIndex)) {\n vl.heights[itemIndex] = renderedItem.offsetHeight;\n vl.heightsCalculated.push(itemIndex);\n }\n }\n if (typeof vl.heights[i] === 'undefined') {\n vl.heights[itemIndex] = 40;\n }\n vl.listHeight += vl.heights[itemIndex];\n }\n } else {\n vl.listHeight = Math.ceil(items.length / vl.params.cols) * vl.params.height;\n vl.rowsPerScreen = Math.ceil(vl.pageHeight / vl.params.height);\n vl.rowsBefore = vl.params.rowsBefore || vl.rowsPerScreen * 2;\n vl.rowsAfter = vl.params.rowsAfter || vl.rowsPerScreen;\n vl.rowsToRender = vl.rowsPerScreen + vl.rowsBefore + vl.rowsAfter;\n vl.maxBufferHeight = vl.rowsBefore / 2 * vl.params.height;\n }\n if (vl.updatableScroll || vl.params.setListHeight) {\n vl.$itemsWrapEl.css({\n height: `${vl.listHeight}px`\n });\n }\n }\n render(force, forceScrollTop) {\n const vl = this;\n if (force) vl.lastRepaintY = null;\n let scrollTop = -(vl.$el[0].getBoundingClientRect().top - vl.$scrollableParentEl[0].getBoundingClientRect().top);\n if (typeof forceScrollTop !== 'undefined') scrollTop = forceScrollTop;\n if (vl.lastRepaintY === null || Math.abs(scrollTop - vl.lastRepaintY) > vl.maxBufferHeight || !vl.updatableScroll && vl.$scrollableParentEl[0].scrollTop + vl.pageHeight >= vl.$scrollableParentEl[0].scrollHeight) {\n vl.lastRepaintY = scrollTop;\n } else {\n return;\n }\n const items = vl.filteredItems || vl.items;\n let fromIndex;\n let toIndex;\n let heightBeforeFirstItem = 0;\n let heightBeforeLastItem = 0;\n if (vl.dynamicHeight || vl.autoHeight) {\n let itemTop = 0;\n let itemHeight;\n vl.maxBufferHeight = vl.pageHeight;\n for (let j = 0; j < vl.heights.length; j += 1) {\n itemHeight = vl.heights[j];\n if (typeof fromIndex === 'undefined') {\n if (itemTop + itemHeight >= scrollTop - vl.pageHeight * 2 * vl.params.dynamicHeightBufferSize) fromIndex = j;else heightBeforeFirstItem += itemHeight;\n }\n if (typeof toIndex === 'undefined') {\n if (itemTop + itemHeight >= scrollTop + vl.pageHeight * 2 * vl.params.dynamicHeightBufferSize || j === vl.heights.length - 1) toIndex = j + 1;\n heightBeforeLastItem += itemHeight;\n }\n itemTop += itemHeight;\n }\n toIndex = Math.min(toIndex, items.length);\n } else {\n fromIndex = (parseInt(scrollTop / vl.params.height, 10) - vl.rowsBefore) * vl.params.cols;\n if (fromIndex < 0) {\n fromIndex = 0;\n }\n toIndex = Math.min(fromIndex + vl.rowsToRender * vl.params.cols, items.length);\n }\n let topPosition;\n const renderExternalItems = [];\n vl.reachEnd = false;\n let i;\n for (i = fromIndex; i < toIndex; i += 1) {\n let itemEl;\n // Define real item index\n const index = vl.items.indexOf(items[i]);\n if (i === fromIndex) vl.currentFromIndex = index;\n if (i === toIndex - 1) vl.currentToIndex = index;\n if (vl.filteredItems) {\n if (vl.items[index] === vl.filteredItems[vl.filteredItems.length - 1]) vl.reachEnd = true;\n } else if (index === vl.items.length - 1) vl.reachEnd = true;\n\n // Find items\n if (vl.params.renderExternal) {\n renderExternalItems.push(items[i]);\n } else if (vl.domCache[index]) {\n itemEl = vl.domCache[index];\n itemEl.f7VirtualListIndex = index;\n } else {\n if (vl.renderItem) {\n vl.tempDomElement.innerHTML = vl.renderItem(items[i], index).trim();\n } else {\n vl.tempDomElement.innerHTML = items[i].toString().trim();\n }\n itemEl = vl.tempDomElement.childNodes[0];\n if (vl.params.cache) vl.domCache[index] = itemEl;\n itemEl.f7VirtualListIndex = index;\n }\n\n // Set item top position\n if (i === fromIndex) {\n if (vl.dynamicHeight || vl.autoHeight) {\n topPosition = heightBeforeFirstItem;\n } else {\n topPosition = i * vl.params.height / vl.params.cols;\n }\n }\n if (!vl.params.renderExternal) {\n itemEl.style.top = `${topPosition}px`;\n\n // Before item insert\n vl.emit('local::itemBeforeInsert vlItemBeforeInsert', vl, itemEl, items[i]);\n\n // Append item to fragment\n vl.fragment.appendChild(itemEl);\n }\n }\n\n // Update list height with not updatable scroll\n if (!vl.updatableScroll) {\n if (vl.dynamicHeight || vl.autoHeight) {\n vl.itemsWrapEl.style.height = `${heightBeforeLastItem}px`;\n } else {\n vl.itemsWrapEl.style.height = `${i * vl.params.height / vl.params.cols}px`;\n }\n }\n\n // Update list html\n if (vl.params.renderExternal) {\n if (items && items.length === 0) {\n vl.reachEnd = true;\n }\n } else {\n vl.emit('local::beforeClear vlBeforeClear', vl, vl.fragment);\n vl.itemsWrapEl.innerHTML = '';\n vl.emit('local::itemsBeforeInsert vlItemsBeforeInsert', vl, vl.fragment);\n if (items && items.length === 0) {\n vl.reachEnd = true;\n if (vl.params.emptyTemplate) vl.itemsWrapEl.innerHTML = vl.params.emptyTemplate;\n } else {\n vl.itemsWrapEl.appendChild(vl.fragment);\n }\n vl.emit('local::itemsAfterInsert vlItemsAfterInsert', vl, vl.fragment);\n }\n if (typeof forceScrollTop !== 'undefined' && force) {\n vl.$scrollableParentEl.scrollTop(forceScrollTop, 0);\n }\n if (vl.params.renderExternal) {\n vl.params.renderExternal(vl, {\n fromIndex,\n toIndex,\n listHeight: vl.listHeight,\n topPosition,\n items: renderExternalItems\n });\n }\n if (vl.autoHeight) {\n requestAnimationFrame(() => {\n vl.setListSize(true);\n });\n }\n }\n\n // Filter\n filterItems(indexes, resetScrollTop) {\n if (resetScrollTop === void 0) {\n resetScrollTop = true;\n }\n const vl = this;\n vl.filteredItems = [];\n for (let i = 0; i < indexes.length; i += 1) {\n vl.filteredItems.push(vl.items[indexes[i]]);\n }\n if (resetScrollTop) {\n vl.$scrollableParentEl[0].scrollTop = 0;\n }\n vl.update();\n }\n resetFilter() {\n const vl = this;\n if (vl.params.showFilteredItemsOnly) {\n vl.filteredItems = [];\n } else {\n vl.filteredItems = null;\n delete vl.filteredItems;\n }\n vl.update();\n }\n scrollToItem(index) {\n const vl = this;\n if (index > vl.items.length) return false;\n let itemTop = 0;\n if (vl.dynamicHeight || vl.autoHeight) {\n for (let i = 0; i < index; i += 1) {\n itemTop += vl.heights[i];\n }\n } else {\n itemTop = index * vl.params.height;\n }\n const listTop = vl.$el[0].offsetTop;\n vl.render(true, listTop + itemTop - parseInt(vl.$scrollableParentEl.css('padding-top'), 10));\n return true;\n }\n handleScroll() {\n const vl = this;\n vl.render();\n }\n\n // Handle resize event\n isVisible() {\n const vl = this;\n return !!(vl.el.offsetWidth || vl.el.offsetHeight || vl.el.getClientRects().length);\n }\n handleResize() {\n const vl = this;\n if (vl.isVisible()) {\n vl.heightsCalculated = [];\n vl.setListSize();\n vl.render(true);\n }\n }\n\n // Append\n appendItems(items) {\n const vl = this;\n for (let i = 0; i < items.length; i += 1) {\n vl.items.push(items[i]);\n }\n vl.update();\n }\n appendItem(item) {\n const vl = this;\n vl.appendItems([item]);\n }\n\n // Replace\n replaceAllItems(items) {\n const vl = this;\n vl.items = items;\n delete vl.filteredItems;\n vl.domCache = {};\n vl.update();\n }\n replaceItem(index, item) {\n const vl = this;\n vl.items[index] = item;\n if (vl.params.cache) delete vl.domCache[index];\n vl.update();\n }\n\n // Prepend\n prependItems(items) {\n const vl = this;\n for (let i = items.length - 1; i >= 0; i -= 1) {\n vl.items.unshift(items[i]);\n }\n if (vl.params.cache) {\n const newCache = {};\n Object.keys(vl.domCache).forEach(cached => {\n newCache[parseInt(cached, 10) + items.length] = vl.domCache[cached];\n });\n vl.domCache = newCache;\n }\n vl.update();\n }\n prependItem(item) {\n const vl = this;\n vl.prependItems([item]);\n }\n\n // Move\n moveItem(from, to) {\n const vl = this;\n const fromIndex = from;\n let toIndex = to;\n if (fromIndex === toIndex) return;\n // remove item from array\n const item = vl.items.splice(fromIndex, 1)[0];\n if (toIndex >= vl.items.length) {\n // Add item to the end\n vl.items.push(item);\n toIndex = vl.items.length - 1;\n } else {\n // Add item to new index\n vl.items.splice(toIndex, 0, item);\n }\n // Update cache\n if (vl.params.cache) {\n const newCache = {};\n Object.keys(vl.domCache).forEach(cached => {\n const cachedIndex = parseInt(cached, 10);\n const leftIndex = fromIndex < toIndex ? fromIndex : toIndex;\n const rightIndex = fromIndex < toIndex ? toIndex : fromIndex;\n const indexShift = fromIndex < toIndex ? -1 : 1;\n if (cachedIndex < leftIndex || cachedIndex > rightIndex) newCache[cachedIndex] = vl.domCache[cachedIndex];\n if (cachedIndex === leftIndex) newCache[rightIndex] = vl.domCache[cachedIndex];\n if (cachedIndex > leftIndex && cachedIndex <= rightIndex) newCache[cachedIndex + indexShift] = vl.domCache[cachedIndex];\n });\n vl.domCache = newCache;\n }\n vl.update();\n }\n\n // Insert before\n insertItemBefore(index, item) {\n const vl = this;\n if (index === 0) {\n vl.prependItem(item);\n return;\n }\n if (index >= vl.items.length) {\n vl.appendItem(item);\n return;\n }\n vl.items.splice(index, 0, item);\n // Update cache\n if (vl.params.cache) {\n const newCache = {};\n Object.keys(vl.domCache).forEach(cached => {\n const cachedIndex = parseInt(cached, 10);\n if (cachedIndex >= index) {\n newCache[cachedIndex + 1] = vl.domCache[cachedIndex];\n }\n });\n vl.domCache = newCache;\n }\n vl.update();\n }\n\n // Delete\n deleteItems(indexes) {\n const vl = this;\n let prevIndex;\n let indexShift = 0;\n for (let i = 0; i < indexes.length; i += 1) {\n let index = indexes[i];\n if (typeof prevIndex !== 'undefined') {\n if (index > prevIndex) {\n indexShift = -i;\n }\n }\n index += indexShift;\n prevIndex = indexes[i];\n // Delete item\n const deletedItem = vl.items.splice(index, 1)[0];\n\n // Delete from filtered\n if (vl.filteredItems && vl.filteredItems.indexOf(deletedItem) >= 0) {\n vl.filteredItems.splice(vl.filteredItems.indexOf(deletedItem), 1);\n }\n // Update cache\n if (vl.params.cache) {\n const newCache = {};\n Object.keys(vl.domCache).forEach(cached => {\n const cachedIndex = parseInt(cached, 10);\n if (cachedIndex === index) {\n delete vl.domCache[index];\n } else if (parseInt(cached, 10) > index) {\n newCache[cachedIndex - 1] = vl.domCache[cached];\n } else {\n newCache[cachedIndex] = vl.domCache[cached];\n }\n });\n vl.domCache = newCache;\n }\n }\n vl.update();\n }\n deleteAllItems() {\n const vl = this;\n vl.items = [];\n delete vl.filteredItems;\n if (vl.params.cache) vl.domCache = {};\n vl.update();\n }\n deleteItem(index) {\n const vl = this;\n vl.deleteItems([index]);\n }\n\n // Clear cache\n clearCache() {\n const vl = this;\n vl.domCache = {};\n }\n\n // Update Virtual List\n update(deleteCache) {\n const vl = this;\n if (deleteCache && vl.params.cache) {\n vl.domCache = {};\n }\n vl.heightsCalculated = [];\n vl.setListSize();\n vl.render(true);\n }\n init() {\n const vl = this;\n vl.attachEvents();\n vl.setListSize();\n vl.render();\n }\n destroy() {\n let vl = this;\n vl.detachEvents();\n vl.$el[0].f7VirtualList = null;\n delete vl.$el[0].f7VirtualList;\n deleteProps(vl);\n vl = null;\n }\n}\nexport default VirtualList;","import VirtualList from './virtual-list-class.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nexport default {\n name: 'virtualList',\n static: {\n VirtualList\n },\n create() {\n const app = this;\n app.virtualList = ConstructorMethods({\n defaultSelector: '.virtual-list',\n constructor: VirtualList,\n app,\n domProp: 'f7VirtualList'\n });\n }\n};","import $ from '../../shared/dom7.js';\nimport { extend, deleteProps } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\nimport { getSupport } from '../../shared/get-support.js';\nclass ListIndex extends Framework7Class {\n constructor(app, params) {\n if (params === void 0) {\n params = {};\n }\n super(params, [app]);\n const index = this;\n const defaults = {\n el: null,\n // where to render indexes\n listEl: null,\n // list el to generate indexes\n indexes: 'auto',\n // or array of indexes\n iosItemHeight: 14,\n mdItemHeight: 14,\n scrollList: true,\n label: false,\n // eslint-disable-next-line\n renderItem(itemContent, itemIndex) {\n return `\n - ${itemContent}
\n `.trim();\n },\n renderSkipPlaceholder() {\n return '';\n },\n on: {}\n };\n\n // Extend defaults with modules params\n index.useModulesParams(defaults);\n index.params = extend(defaults, params);\n let $el;\n let $listEl;\n let $pageContentEl;\n let $ul;\n if (index.params.el) {\n $el = $(index.params.el);\n } else {\n return index;\n }\n if ($el[0].f7ListIndex) {\n return $el[0].f7ListIndex;\n }\n $ul = $el.find('ul');\n if ($ul.length === 0) {\n $ul = $('');\n $el.append($ul);\n }\n if (index.params.listEl) {\n $listEl = $(index.params.listEl);\n }\n if (index.params.indexes === 'auto' && !$listEl) {\n return index;\n }\n if ($listEl) {\n $pageContentEl = $listEl.parents('.page-content').eq(0);\n } else {\n $pageContentEl = $el.siblings('.page-content').eq(0);\n if ($pageContentEl.length === 0) {\n $pageContentEl = $el.parents('.page').eq(0).find('.page-content').eq(0);\n }\n }\n $el[0].f7ListIndex = index;\n extend(index, {\n app,\n $el,\n el: $el && $el[0],\n $ul,\n ul: $ul && $ul[0],\n $listEl,\n listEl: $listEl && $listEl[0],\n $pageContentEl,\n pageContentEl: $pageContentEl && $pageContentEl[0],\n indexes: params.indexes,\n height: 0,\n skipRate: 0\n });\n\n // Install Modules\n index.useModules();\n\n // Attach events\n function handleResize() {\n const height = {\n index\n };\n index.calcSize();\n if (height !== index.height) {\n index.render();\n }\n }\n function handleClick(e) {\n const $clickedLi = $(e.target).closest('li');\n if (!$clickedLi.length) return;\n let itemIndex = $clickedLi.index();\n if (index.skipRate > 0) {\n const percentage = itemIndex / ($clickedLi.siblings('li').length - 1);\n itemIndex = Math.round((index.indexes.length - 1) * percentage);\n }\n const itemContent = index.indexes[itemIndex];\n index.$el.trigger('listindex:click', {\n content: itemContent,\n index: itemIndex\n });\n index.emit('local::click listIndexClick', index, itemContent, itemIndex);\n index.$el.trigger('listindex:select', {\n content: itemContent,\n index: itemIndex\n });\n index.emit('local::select listIndexSelect', index, itemContent, itemIndex);\n if (index.$listEl && index.params.scrollList) {\n index.scrollListToIndex(itemContent, itemIndex);\n }\n }\n const touchesStart = {};\n let isTouched;\n let isMoved;\n let topPoint;\n let bottomPoint;\n let $labelEl;\n let previousIndex = null;\n function handleTouchStart(e) {\n const $children = $ul.children();\n if (!$children.length) return;\n topPoint = $children[0].getBoundingClientRect().top;\n bottomPoint = $children[$children.length - 1].getBoundingClientRect().top + $children[0].offsetHeight;\n touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n isTouched = true;\n isMoved = false;\n previousIndex = null;\n }\n function handleTouchMove(e) {\n if (!isTouched) return;\n if (!isMoved && index.params.label) {\n $labelEl = $('');\n $el.append($labelEl);\n }\n isMoved = true;\n const pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n e.preventDefault();\n let percentage = (pageY - topPoint) / (bottomPoint - topPoint);\n percentage = Math.min(Math.max(percentage, 0), 1);\n const itemIndex = Math.round((index.indexes.length - 1) * percentage);\n const itemContent = index.indexes[itemIndex];\n const ulHeight = bottomPoint - topPoint;\n const bubbleBottom = (index.height - ulHeight) / 2 + (1 - percentage) * ulHeight;\n if (itemIndex !== previousIndex) {\n if (index.params.label) {\n $labelEl.html(itemContent).transform(`translateY(-${bubbleBottom}px)`);\n }\n if (index.$listEl && index.params.scrollList) {\n index.scrollListToIndex(itemContent, itemIndex);\n }\n }\n previousIndex = itemIndex;\n index.$el.trigger('listindex:select');\n index.emit('local::select listIndexSelect', index, itemContent, itemIndex);\n }\n function handleTouchEnd() {\n if (!isTouched) return;\n isTouched = false;\n isMoved = false;\n if (index.params.label) {\n if ($labelEl) $labelEl.remove();\n $labelEl = undefined;\n }\n }\n const passiveListener = getSupport().passiveListener ? {\n passive: true\n } : false;\n index.attachEvents = function attachEvents() {\n $el.parents('.tab').on('tab:show', handleResize);\n $el.parents('.page').on('page:reinit', handleResize);\n $el.parents('.panel').on('panel:open', handleResize);\n $el.parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast').on('modal:open', handleResize);\n app.on('resize', handleResize);\n $el.on('click', handleClick);\n $el.on(app.touchEvents.start, handleTouchStart, passiveListener);\n app.on('touchmove:active', handleTouchMove);\n app.on('touchend:passive', handleTouchEnd);\n };\n index.detachEvents = function attachEvents() {\n $el.parents('.tab').off('tab:show', handleResize);\n $el.parents('.page').off('page:reinit', handleResize);\n $el.parents('.panel').off('panel:open', handleResize);\n $el.parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast').off('modal:open', handleResize);\n app.off('resize', handleResize);\n $el.off('click', handleClick);\n $el.off(app.touchEvents.start, handleTouchStart, passiveListener);\n app.off('touchmove:active', handleTouchMove);\n app.off('touchend:passive', handleTouchEnd);\n };\n // Init\n index.init();\n return index;\n }\n // eslint-disable-next-line\n scrollListToIndex(itemContent, itemIndex) {\n const index = this;\n const {\n $listEl,\n $pageContentEl,\n app\n } = index;\n if (!$listEl || !$pageContentEl || $pageContentEl.length === 0) return index;\n let $scrollToEl;\n $listEl.find('.list-group-title').each(el => {\n if ($scrollToEl) return;\n const $el = $(el);\n if ($el.text() === itemContent) {\n $scrollToEl = $el;\n }\n });\n if (!$scrollToEl || $scrollToEl.length === 0) return index;\n const parentTop = $scrollToEl.parent().offset().top;\n let paddingTop = parseInt($pageContentEl.css('padding-top'), 10);\n const scrollTop = $pageContentEl[0].scrollTop;\n const scrollToElTop = $scrollToEl.offset().top;\n if ($pageContentEl.parents('.page-with-navbar-large').length) {\n const navbarInnerEl = app.navbar.getElByPage($pageContentEl.parents('.page-with-navbar-large').eq(0));\n const $titleLargeEl = $(navbarInnerEl).find('.title-large');\n if ($titleLargeEl.length) {\n paddingTop -= $titleLargeEl[0].offsetHeight || 0;\n }\n }\n if (parentTop <= paddingTop) {\n $pageContentEl.scrollTop(parentTop + scrollTop - paddingTop);\n } else {\n $pageContentEl.scrollTop(scrollToElTop + scrollTop - paddingTop);\n }\n return index;\n }\n renderSkipPlaceholder() {\n const index = this;\n return index.params.renderSkipPlaceholder.call(index);\n }\n renderItem(itemContent, itemIndex) {\n const index = this;\n return index.params.renderItem.call(index, itemContent, itemIndex);\n }\n render() {\n const index = this;\n const {\n $ul,\n indexes,\n skipRate\n } = index;\n let wasSkipped;\n const html = indexes.map((itemContent, itemIndex) => {\n if (itemIndex % skipRate !== 0 && skipRate > 0) {\n wasSkipped = true;\n return '';\n }\n let itemHtml = index.renderItem(itemContent, itemIndex);\n if (wasSkipped) {\n itemHtml = index.renderSkipPlaceholder() + itemHtml;\n }\n wasSkipped = false;\n return itemHtml;\n }).join('');\n $ul.html(html);\n return index;\n }\n calcSize() {\n const index = this;\n const {\n app,\n params,\n el,\n indexes\n } = index;\n const height = el.offsetHeight;\n const itemHeight = params[`${app.theme}ItemHeight`];\n const maxItems = Math.floor(height / itemHeight);\n const items = indexes.length;\n let skipRate = 0;\n if (items > maxItems) {\n skipRate = Math.ceil((items * 2 - 1) / maxItems);\n }\n index.height = height;\n index.skipRate = skipRate;\n return index;\n }\n calcIndexes() {\n const index = this;\n if (index.params.indexes === 'auto') {\n index.indexes = [];\n index.$listEl.find('.list-group-title').each(el => {\n const elContent = $(el).text();\n if (index.indexes.indexOf(elContent) < 0) {\n index.indexes.push(elContent);\n }\n });\n } else {\n index.indexes = index.params.indexes;\n }\n return index;\n }\n update() {\n const index = this;\n index.calcIndexes();\n index.calcSize();\n index.render();\n return index;\n }\n init() {\n const index = this;\n index.calcIndexes();\n index.calcSize();\n index.render();\n index.attachEvents();\n }\n destroy() {\n let index = this;\n index.$el.trigger('listindex:beforedestroy', index);\n index.emit('local::beforeDestroy listIndexBeforeDestroy');\n index.detachEvents();\n if (index.$el[0]) {\n index.$el[0].f7ListIndex = null;\n delete index.$el[0].f7ListIndex;\n }\n deleteProps(index);\n index = null;\n }\n}\nexport default ListIndex;","import $ from '../../shared/dom7.js';\nimport { extend } from '../../shared/utils.js';\nimport ListIndex from './list-index-class.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nexport default {\n name: 'listIndex',\n static: {\n ListIndex\n },\n create() {\n const app = this;\n app.listIndex = ConstructorMethods({\n defaultSelector: '.list-index',\n constructor: ListIndex,\n app,\n domProp: 'f7ListIndex'\n });\n },\n on: {\n tabMounted(tabEl) {\n const app = this;\n $(tabEl).find('.list-index-init').each(listIndexEl => {\n const params = extend($(listIndexEl).dataset(), {\n el: listIndexEl\n });\n app.listIndex.create(params);\n });\n },\n tabBeforeRemove(tabEl) {\n $(tabEl).find('.list-index-init').each(listIndexEl => {\n if (listIndexEl.f7ListIndex) listIndexEl.f7ListIndex.destroy();\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.list-index-init').each(listIndexEl => {\n const params = extend($(listIndexEl).dataset(), {\n el: listIndexEl\n });\n app.listIndex.create(params);\n });\n },\n pageBeforeRemove(page) {\n page.$el.find('.list-index-init').each(listIndexEl => {\n if (listIndexEl.f7ListIndex) listIndexEl.f7ListIndex.destroy();\n });\n }\n },\n vnode: {\n 'list-index-init': {\n insert(vnode) {\n const app = this;\n const listIndexEl = vnode.elm;\n const params = extend($(listIndexEl).dataset(), {\n el: listIndexEl\n });\n app.listIndex.create(params);\n },\n destroy(vnode) {\n const listIndexEl = vnode.elm;\n if (listIndexEl.f7ListIndex) listIndexEl.f7ListIndex.destroy();\n }\n }\n }\n};","import $ from '../../shared/dom7.js';\nimport { extend } from '../../shared/utils.js';\nconst Tab = {\n show() {\n const app = this;\n let tabEl;\n let tabLinkEl;\n let animate;\n let tabRoute;\n let animatedInit;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (args.length === 1 && args[0] && args[0].constructor === Object) {\n tabEl = args[0].tabEl;\n tabLinkEl = args[0].tabLinkEl;\n animate = args[0].animate;\n tabRoute = args[0].tabRoute;\n animatedInit = args[0].animatedInit;\n } else {\n [tabEl, tabLinkEl, animate, tabRoute] = args;\n if (typeof args[1] === 'boolean') {\n [tabEl, animate, tabLinkEl, tabRoute] = args;\n if (args.length > 2 && tabLinkEl.constructor === Object) {\n [tabEl, animate, tabRoute, tabLinkEl] = args;\n }\n }\n }\n if (typeof animate === 'undefined') animate = true;\n const $newTabEl = $(tabEl);\n if (tabRoute && $newTabEl[0]) {\n $newTabEl[0].f7TabRoute = tabRoute;\n }\n if (!animatedInit && ($newTabEl.length === 0 || $newTabEl.hasClass('tab-active'))) {\n return {\n $newTabEl,\n newTabEl: $newTabEl[0]\n };\n }\n let $tabLinkEl;\n if (tabLinkEl) $tabLinkEl = $(tabLinkEl);\n const $tabsEl = $newTabEl.parent('.tabs');\n if ($tabsEl.length === 0) {\n return {\n $newTabEl,\n newTabEl: $newTabEl[0]\n };\n }\n\n // Release swipeouts in hidden tabs\n if (app.swipeout) app.swipeout.allowOpen = true;\n\n // Animated tabs\n const tabsChangedCallbacks = [];\n function onTabsChanged(callback) {\n tabsChangedCallbacks.push(callback);\n }\n function tabsChanged() {\n tabsChangedCallbacks.forEach(callback => {\n callback();\n });\n }\n let animated = false;\n if ($tabsEl.parent().hasClass('tabs-animated-wrap')) {\n $tabsEl.parent()[animate ? 'removeClass' : 'addClass']('not-animated');\n const transitionDuration = parseFloat($tabsEl.css('transition-duration').replace(',', '.'));\n if (animate && transitionDuration) {\n $tabsEl.transitionEnd(tabsChanged);\n animated = true;\n }\n const tabsTranslate = (app.rtl ? $newTabEl.index() : -$newTabEl.index()) * 100;\n $tabsEl.transform(`translate3d(${tabsTranslate}%,0,0)`);\n }\n\n // Swipeable tabs\n let swiper;\n if ($tabsEl[0].nodeName.toLowerCase() === 'swiper-container' && app.swiper) {\n swiper = $tabsEl[0].swiper;\n const newTabIndex = swiper.slides.indexOf($newTabEl[0]);\n if (swiper && swiper.activeIndex !== newTabIndex) {\n animated = true;\n swiper.once('slideChangeTransitionEnd', () => {\n tabsChanged();\n }).slideTo(newTabIndex, animate ? undefined : 0);\n } else if (swiper && swiper.animating) {\n animated = true;\n swiper.once('slideChangeTransitionEnd', () => {\n tabsChanged();\n });\n }\n }\n\n // Remove active class from old tabs\n const $oldTabEl = $tabsEl.children('.tab-active');\n $oldTabEl.removeClass('tab-active');\n if (!animatedInit && (!swiper || swiper && !swiper.animating || swiper && tabRoute)) {\n if ($oldTabEl.hasClass('view') && $oldTabEl.children('.page').length) {\n $oldTabEl.children('.page').each(pageEl => {\n $(pageEl).trigger('page:tabhide');\n app.emit('pageTabHide', pageEl);\n });\n }\n $oldTabEl.trigger('tab:hide');\n app.emit('tabHide', $oldTabEl[0]);\n }\n\n // Trigger 'show' event on new tab\n $newTabEl.addClass('tab-active');\n if (!animatedInit && (!swiper || swiper && !swiper.animating || swiper && tabRoute)) {\n if ($newTabEl.hasClass('view') && $newTabEl.children('.page').length) {\n $newTabEl.children('.page').each(pageEl => {\n $(pageEl).trigger('page:tabshow');\n app.emit('pageTabShow', pageEl);\n });\n }\n $newTabEl.trigger('tab:show');\n app.emit('tabShow', $newTabEl[0]);\n }\n\n // Find related link for new tab\n if (!$tabLinkEl) {\n // Search by id\n if (typeof tabEl === 'string') $tabLinkEl = $(`.tab-link[href=\"${tabEl}\"]`);else $tabLinkEl = $(`.tab-link[href=\"#${$newTabEl.attr('id')}\"]`);\n // Search by data-tab\n if (!$tabLinkEl || $tabLinkEl && $tabLinkEl.length === 0) {\n $('[data-tab]').each(el => {\n if ($newTabEl.is($(el).attr('data-tab'))) $tabLinkEl = $(el);\n });\n }\n if (tabRoute && (!$tabLinkEl || $tabLinkEl && $tabLinkEl.length === 0)) {\n $tabLinkEl = $(`[data-route-tab-id=\"${tabRoute.route.tab.id}\"]`);\n if ($tabLinkEl.length === 0) {\n $tabLinkEl = $(`.tab-link[href=\"${tabRoute.url}\"]`);\n }\n }\n if ($tabLinkEl.length > 1 && $newTabEl.parents('.page').length) {\n // eslint-disable-next-line\n $tabLinkEl = $tabLinkEl.filter(tabLinkElement => {\n return $(tabLinkElement).parents('.page')[0] === $newTabEl.parents('.page')[0];\n });\n if (app.theme === 'ios' && $tabLinkEl.length === 0 && tabRoute) {\n const $pageEl = $newTabEl.parents('.page');\n const $navbarEl = $(app.navbar.getElByPage($pageEl));\n $tabLinkEl = $navbarEl.find(`[data-route-tab-id=\"${tabRoute.route.tab.id}\"]`);\n if ($tabLinkEl.length === 0) {\n $tabLinkEl = $navbarEl.find(`.tab-link[href=\"${tabRoute.url}\"]`);\n }\n }\n }\n }\n if ($tabLinkEl.length > 0) {\n // Find related link for old tab\n let $oldTabLinkEl;\n if ($oldTabEl && $oldTabEl.length > 0) {\n // Search by id\n const oldTabId = $oldTabEl.attr('id');\n if (oldTabId) {\n $oldTabLinkEl = $(`.tab-link[href=\"#${oldTabId}\"]`);\n // Search by data-route-tab-id\n if (!$oldTabLinkEl || $oldTabLinkEl && $oldTabLinkEl.length === 0) {\n $oldTabLinkEl = $(`.tab-link[data-route-tab-id=\"${oldTabId}\"]`);\n }\n }\n // Search by data-tab\n if (!$oldTabLinkEl || $oldTabLinkEl && $oldTabLinkEl.length === 0) {\n $('[data-tab]').each(tabLinkElement => {\n if ($oldTabEl.is($(tabLinkElement).attr('data-tab'))) $oldTabLinkEl = $(tabLinkElement);\n });\n }\n if (!$oldTabLinkEl || $oldTabLinkEl && $oldTabLinkEl.length === 0) {\n $oldTabLinkEl = $tabLinkEl.siblings('.tab-link-active');\n }\n } else if (tabRoute) {\n $oldTabLinkEl = $tabLinkEl.siblings('.tab-link-active');\n }\n if ($oldTabLinkEl && $oldTabLinkEl.length > 1 && $oldTabEl && $oldTabEl.parents('.page').length) {\n // eslint-disable-next-line\n $oldTabLinkEl = $oldTabLinkEl.filter(tabLinkElement => {\n return $(tabLinkElement).parents('.page')[0] === $oldTabEl.parents('.page')[0];\n });\n }\n if ($oldTabLinkEl && $oldTabLinkEl.length > 0) $oldTabLinkEl.removeClass('tab-link-active');\n\n // Update links' classes\n if ($tabLinkEl && $tabLinkEl.length > 0) {\n $tabLinkEl.addClass('tab-link-active');\n // Material Highlight\n const $tabbarEl = $tabLinkEl.parents('.tabbar, .tabbar-icons');\n const hasHighlight = app.toolbar && $tabbarEl.length > 0 && ($tabbarEl.hasClass('tabbar-highlight') || app.theme !== 'ios');\n if (hasHighlight) {\n app.toolbar.setHighlight($tabbarEl);\n }\n }\n }\n return {\n $newTabEl,\n newTabEl: $newTabEl[0],\n $oldTabEl,\n oldTabEl: $oldTabEl[0],\n onTabsChanged,\n animated\n };\n }\n};\nexport default {\n name: 'tabs',\n create() {\n const app = this;\n extend(app, {\n tab: {\n show: Tab.show.bind(app)\n }\n });\n },\n on: {\n 'pageInit tabMounted': function onInit(pageOrTabEl) {\n const $el = $(pageOrTabEl.el || pageOrTabEl);\n const animatedTabEl = $el.find('.tabs-animated-wrap > .tabs > .tab-active')[0];\n if (!animatedTabEl) return;\n const app = this;\n app.tab.show({\n tabEl: animatedTabEl,\n animatedInit: true,\n animate: false\n });\n }\n },\n clicks: {\n '.tab-link': function tabLinkClick($clickedEl, data) {\n if (data === void 0) {\n data = {};\n }\n if ($clickedEl.attr('href') && $clickedEl.attr('href').indexOf('#') === 0 || $clickedEl.attr('data-tab')) {\n const app = this;\n app.tab.show({\n tabEl: data.tab || $clickedEl.attr('href'),\n tabLinkEl: $clickedEl,\n animate: data.animate\n });\n }\n }\n }\n};","import $ from '../../shared/dom7.js';\nimport { extend, now, nextFrame } from '../../shared/utils.js';\nfunction swipePanel(panel) {\n const app = panel.app;\n if (panel.swipeInitialized) {\n return;\n }\n extend(panel, {\n swipeable: true,\n swipeInitialized: true\n });\n const params = panel.params;\n const {\n $el,\n $backdropEl,\n side,\n effect\n } = panel;\n let otherPanel;\n let isTouched;\n let isGestureStarted;\n let isMoved;\n let isScrolling;\n let isInterrupted;\n const touchesStart = {};\n let touchStartTime;\n let touchesDiff;\n let translate;\n let backdropOpacity;\n let panelWidth;\n let direction;\n let $viewEl;\n let touchMoves = 0;\n function handleTouchStart(e) {\n if (!panel.swipeable || isGestureStarted) return;\n if (!app.panel.allowOpen || !params.swipe && !params.swipeOnlyClose || isTouched) return;\n if ($('.modal-in:not(.toast):not(.notification), .photo-browser-in').length > 0) return;\n otherPanel = app.panel.get(side === 'left' ? 'right' : 'left') || {};\n const otherPanelOpened = otherPanel.opened && otherPanel.$el && !otherPanel.$el.hasClass('panel-in-breakpoint');\n if (!panel.opened && otherPanelOpened) {\n return;\n }\n if (!params.swipeOnlyClose) {\n if (otherPanelOpened) return;\n }\n if (e.target && e.target.nodeName.toLowerCase() === 'input' && e.target.type === 'range') return;\n if ($(e.target).closest('.range-slider, swiper-container.tabs, .calendar-months, .no-swipe-panel, .card-opened').length > 0) return;\n touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n if (params.swipeOnlyClose && !panel.opened) {\n return;\n }\n if (params.swipeActiveArea && !panel.opened) {\n if (side === 'left') {\n if (touchesStart.x > params.swipeActiveArea) return;\n }\n if (side === 'right') {\n if (touchesStart.x < app.width - params.swipeActiveArea) return;\n }\n }\n touchMoves = 0;\n $viewEl = $(panel.getViewEl());\n isMoved = false;\n isTouched = true;\n isScrolling = undefined;\n isInterrupted = false;\n touchStartTime = now();\n direction = undefined;\n }\n function handleTouchMove(e) {\n if (!isTouched || isGestureStarted || isInterrupted) return;\n touchMoves += 1;\n if (touchMoves < 2) return;\n if (e.f7PreventSwipePanel || app.preventSwipePanelBySwipeBack || app.preventSwipePanel) {\n isTouched = false;\n return;\n }\n const pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n const pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n if (typeof isScrolling === 'undefined') {\n isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));\n }\n if (isScrolling) {\n isTouched = false;\n return;\n }\n if (!direction) {\n if (pageX > touchesStart.x) {\n direction = 'to-right';\n } else {\n direction = 'to-left';\n }\n if (params.swipeActiveArea > 0 && !panel.opened) {\n if (side === 'left' && touchesStart.x > params.swipeActiveArea) {\n isTouched = false;\n return;\n }\n if (side === 'right' && touchesStart.x < app.width - params.swipeActiveArea) {\n isTouched = false;\n return;\n }\n }\n if ($el.hasClass('panel-in-breakpoint')) {\n isTouched = false;\n return;\n }\n if (side === 'left' && direction === 'to-left' && !$el.hasClass('panel-in') || side === 'right' && direction === 'to-right' && !$el.hasClass('panel-in')) {\n isTouched = false;\n return;\n }\n }\n let threshold = panel.opened ? 0 : -params.swipeThreshold;\n if (side === 'right') threshold = -threshold;\n if (!isMoved) {\n if (!panel.opened) {\n panel.insertToRoot();\n $el.addClass('panel-in-swipe');\n if ($backdropEl) $backdropEl.css('visibility', 'visible');\n $el.trigger('panel:swipeopen');\n panel.emit('local::swipeOpen panelSwipeOpen', panel);\n }\n panelWidth = $el[0].offsetWidth;\n if (effect === 'reveal' && $el.hasClass('panel-in-collapsed')) {\n panelWidth -= parseFloat($viewEl.css(`margin-${side}`));\n }\n $el.transition(0);\n }\n isMoved = true;\n if (e.cancelable) {\n e.preventDefault();\n }\n touchesDiff = pageX - touchesStart.x + threshold;\n const startTranslate = effect === 'floating' ? 8 : 0;\n if (side === 'right') {\n if (effect === 'cover' || effect === 'push' || effect === 'floating') {\n translate = touchesDiff + (panel.opened ? startTranslate : panelWidth);\n if (translate < 0 - startTranslate) translate = -startTranslate;\n if (translate > panelWidth) {\n translate = panelWidth;\n }\n } else {\n translate = touchesDiff - (panel.opened ? panelWidth : 0);\n if (translate > 0) translate = 0;\n if (translate < -panelWidth) {\n translate = -panelWidth;\n }\n }\n } else {\n translate = touchesDiff + (panel.opened ? panelWidth : startTranslate);\n if (translate < 0) translate = 0;\n if (translate > panelWidth + startTranslate) {\n translate = panelWidth + startTranslate;\n }\n }\n const noFollowProgress = Math.abs(translate / panelWidth);\n if (effect === 'reveal') {\n if (!params.swipeNoFollow) {\n $viewEl.transform(`translate3d(${translate}px,0,0)`).transition(0);\n if ($backdropEl) $backdropEl.transform(`translate3d(${translate}px,0,0)`).transition(0);\n }\n $el.trigger('panel:swipe', Math.abs(translate / panelWidth));\n panel.emit('local::swipe panelSwipe', panel, Math.abs(translate / panelWidth));\n } else {\n if (side === 'left') translate -= panelWidth;\n if (!params.swipeNoFollow) {\n backdropOpacity = 1 - Math.abs(translate / panelWidth);\n if ($backdropEl) {\n $backdropEl.transition(0);\n $backdropEl.css({\n opacity: backdropOpacity\n });\n }\n $el.transform(`translate3d(${translate}px,0,0)`).transition(0);\n if (effect === 'push') {\n const viewTranslate = side === 'left' ? translate + panelWidth : translate - panelWidth;\n $viewEl.transform(`translate3d(${viewTranslate}px,0,0)`).transition(0);\n if ($backdropEl) {\n $backdropEl.transform(`translate3d(${viewTranslate}px,0,0)`).transition(0);\n }\n }\n }\n $el.trigger('panel:swipe', Math.abs(translate / panelWidth));\n panel.emit('local::swipe panelSwipe', panel, Math.abs(translate / panelWidth));\n }\n if (params.swipeNoFollow) {\n const stateChanged = panel.opened && noFollowProgress === 0 || !panel.opened && noFollowProgress === 1;\n if (stateChanged) {\n isInterrupted = true;\n // eslint-disable-next-line\n handleTouchEnd(e);\n }\n }\n }\n function handleTouchEnd(e) {\n if (!isTouched || !isMoved) {\n isTouched = false;\n isMoved = false;\n return;\n }\n const isGesture = e.type === 'gesturestart' || isGestureStarted;\n isTouched = false;\n isMoved = false;\n const timeDiff = new Date().getTime() - touchStartTime;\n let action;\n const startTranslate = effect === 'floating' ? side === 'left' ? 8 : -8 : 0;\n const edge = (translate === startTranslate || Math.abs(translate) === panelWidth) && !params.swipeNoFollow;\n const threshold = params.swipeThreshold || 0;\n if (isGesture) {\n action = 'reset';\n } else if (!panel.opened) {\n if (Math.abs(touchesDiff) < threshold) {\n action = 'reset';\n } else if (effect === 'cover' || effect === 'push' || effect === 'floating') {\n if (translate === 0 + startTranslate) {\n action = 'swap'; // open\n } else if (timeDiff < 300 && Math.abs(translate) > 0) {\n action = 'swap'; // open\n } else if (timeDiff >= 300 && Math.abs(translate) < panelWidth / 2) {\n action = 'swap'; // open\n } else {\n action = 'reset'; // close\n }\n } else if (translate === 0) {\n action = 'reset';\n } else if (timeDiff < 300 && Math.abs(translate) > 0 || timeDiff >= 300 && Math.abs(translate) >= panelWidth / 2) {\n action = 'swap';\n } else {\n action = 'reset';\n }\n } else if (effect === 'cover' || effect === 'push' || effect === 'floating') {\n if (translate === 0) {\n action = 'reset'; // open\n } else if (timeDiff < 300 && Math.abs(translate) > 0) {\n action = 'swap'; // open\n } else if (timeDiff >= 300 && Math.abs(translate) < panelWidth / 2) {\n action = 'reset'; // open\n } else {\n action = 'swap'; // close\n }\n } else if (translate === -panelWidth) {\n action = 'reset';\n } else if (timeDiff < 300 && Math.abs(translate) >= 0 || timeDiff >= 300 && Math.abs(translate) <= panelWidth / 2) {\n if (side === 'left' && translate === panelWidth) action = 'reset';else action = 'swap';\n } else {\n action = 'reset';\n }\n if (action === 'swap') {\n if (panel.opened) {\n panel.close(!edge);\n } else {\n panel.open(!edge);\n }\n }\n let removePanelInClass = true;\n if (action === 'reset') {\n if (!panel.opened) {\n if (edge) {\n // edge position\n $el.removeClass('panel-in-swipe');\n } else {\n removePanelInClass = false;\n const target = effect === 'reveal' ? $viewEl : $el;\n panel.setStateClasses('before-closing');\n target.transitionEnd(() => {\n if ($el.hasClass('panel-in')) return;\n $el.removeClass('panel-in-swipe');\n panel.setStateClasses('after-closing');\n });\n }\n }\n }\n if (effect === 'reveal' || effect === 'push') {\n nextFrame(() => {\n $viewEl.transition('');\n $viewEl.transform('');\n });\n }\n if (removePanelInClass) {\n $el.removeClass('panel-in-swipe');\n }\n $el.transition('').transform('');\n if ($backdropEl) {\n $backdropEl.transform('').transition('').css({\n opacity: '',\n visibility: ''\n });\n }\n }\n function handleGestureStart(e) {\n isGestureStarted = true;\n handleTouchEnd(e);\n }\n function handleGestureEnd() {\n isGestureStarted = false;\n }\n\n // Add Events\n app.on('touchstart:passive', handleTouchStart);\n app.on('touchmove:active', handleTouchMove);\n app.on('touchend:passive', handleTouchEnd);\n app.on('gesturestart', handleGestureStart);\n app.on('gestureend', handleGestureEnd);\n panel.on('panelDestroy', () => {\n app.off('touchstart:passive', handleTouchStart);\n app.off('touchmove:active', handleTouchMove);\n app.off('touchend:passive', handleTouchEnd);\n app.off('gesturestart', handleGestureStart);\n app.off('gestureend', handleGestureEnd);\n });\n}\nexport default swipePanel;","import $ from '../../shared/dom7.js';\nimport { extend, nextFrame } from '../../shared/utils.js';\nimport { getSupport } from '../../shared/get-support.js';\nfunction resizablePanel(panel) {\n const app = panel.app;\n const support = getSupport();\n if (panel.resizableInitialized) return;\n extend(panel, {\n resizable: true,\n resizableWidth: null,\n resizableInitialized: true\n });\n const $htmlEl = $('html');\n const {\n $el,\n $backdropEl,\n side,\n effect\n } = panel;\n if (!$el) return;\n let isTouched;\n let isMoved;\n const touchesStart = {};\n let touchesDiff;\n let panelWidth;\n let $viewEl;\n let panelMinWidth;\n let panelMaxWidth;\n let visibleByBreakpoint;\n const isPushingPanel = effect !== 'cover' && effect !== 'floating';\n function transformCSSWidth(v) {\n if (!v) return null;\n if (v.indexOf('%') >= 0 || v.indexOf('vw') >= 0) {\n return parseInt(v, 10) / 100 * app.width;\n }\n const newV = parseInt(v, 10);\n if (Number.isNaN(newV)) return null;\n return newV;\n }\n function isResizable() {\n return panel.resizable && $el.hasClass('panel-resizable');\n }\n function handleTouchStart(e) {\n if (!isResizable()) return;\n touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n isMoved = false;\n isTouched = true;\n panelMinWidth = transformCSSWidth($el.css('min-width'));\n panelMaxWidth = transformCSSWidth($el.css('max-width'));\n visibleByBreakpoint = $el.hasClass('panel-in-breakpoint');\n }\n function handleTouchMove(e) {\n if (!isTouched) return;\n const pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n if (!isMoved) {\n panelWidth = $el[0].offsetWidth;\n $el.transition(0);\n $el.addClass('panel-resizing');\n $htmlEl.css('cursor', 'col-resize');\n if (isPushingPanel || visibleByBreakpoint) {\n $viewEl = $(panel.getViewEl());\n if (panel.$containerEl && panel.$containerEl.hasClass('page')) {\n $viewEl.add(panel.$containerEl.children('.page-content, .tabs, .fab'));\n }\n }\n if (isPushingPanel && !visibleByBreakpoint) {\n $backdropEl.transition(0);\n $viewEl.transition(0);\n }\n }\n isMoved = true;\n e.preventDefault();\n touchesDiff = pageX - touchesStart.x;\n let newPanelWidth = side === 'left' ? panelWidth + touchesDiff : panelWidth - touchesDiff;\n if (panelMinWidth && !Number.isNaN(panelMinWidth)) {\n newPanelWidth = Math.max(newPanelWidth, panelMinWidth);\n }\n if (panelMaxWidth && !Number.isNaN(panelMaxWidth)) {\n newPanelWidth = Math.min(newPanelWidth, panelMaxWidth);\n }\n newPanelWidth = Math.min(Math.max(newPanelWidth, 0), app.width);\n panel.resizableWidth = newPanelWidth;\n $el[0].style.width = `${newPanelWidth}px`;\n if (isPushingPanel && !visibleByBreakpoint) {\n if ($viewEl) {\n $viewEl.transform(`translate3d(${side === 'left' ? newPanelWidth : -newPanelWidth}px, 0, 0)`);\n }\n if ($backdropEl) {\n $backdropEl.transform(`translate3d(${side === 'left' ? newPanelWidth : -newPanelWidth}px, 0, 0)`);\n }\n } else if (visibleByBreakpoint && $viewEl) {\n $viewEl.css(`margin-${side}`, `${newPanelWidth}px`);\n }\n $el.trigger('panel:resize', newPanelWidth);\n panel.emit('local::resize panelResize', panel, newPanelWidth);\n }\n function handleTouchEnd() {\n $('html').css('cursor', '');\n if (!isTouched || !isMoved) {\n isTouched = false;\n isMoved = false;\n return;\n }\n isTouched = false;\n isMoved = false;\n $htmlEl[0].style.setProperty(`--f7-panel-${side}-width`, `${panel.resizableWidth}px`);\n $el[0].style.width = '';\n if (isPushingPanel && !visibleByBreakpoint) {\n $viewEl.transform('');\n $backdropEl.transform('');\n }\n $el.removeClass('panel-resizing');\n nextFrame(() => {\n $el.transition('');\n if (isPushingPanel) {\n $backdropEl.transition('');\n if ($viewEl) $viewEl.transition('');\n }\n });\n }\n function handleResize() {\n if (!panel.opened || !panel.resizableWidth) return;\n panelMinWidth = transformCSSWidth($el.css('min-width'));\n panelMaxWidth = transformCSSWidth($el.css('max-width'));\n if (panelMinWidth && !Number.isNaN(panelMinWidth) && panel.resizableWidth < panelMinWidth) {\n panel.resizableWidth = Math.max(panel.resizableWidth, panelMinWidth);\n }\n if (panelMaxWidth && !Number.isNaN(panelMaxWidth) && panel.resizableWidth > panelMaxWidth) {\n panel.resizableWidth = Math.min(panel.resizableWidth, panelMaxWidth);\n }\n panel.resizableWidth = Math.min(Math.max(panel.resizableWidth, 0), app.width);\n $htmlEl[0].style.setProperty(`--f7-panel-${side}-width`, `${panel.resizableWidth}px`);\n }\n if (panel.$el.find('.panel-resize-handler').length === 0) {\n panel.$el.append('');\n }\n panel.$resizeHandlerEl = panel.$el.children('.panel-resize-handler');\n $el.addClass('panel-resizable');\n\n // Add Events\n const passive = support.passiveListener ? {\n passive: true\n } : false;\n panel.$el.on(app.touchEvents.start, '.panel-resize-handler', handleTouchStart, passive);\n app.on('touchmove:active', handleTouchMove);\n app.on('touchend:passive', handleTouchEnd);\n app.on('resize', handleResize);\n panel.on('beforeOpen', handleResize);\n panel.once('panelDestroy', () => {\n $el.removeClass('panel-resizable');\n panel.$resizeHandlerEl.remove();\n panel.$el.off(app.touchEvents.start, '.panel-resize-handler', handleTouchStart, passive);\n app.off('touchmove:active', handleTouchMove);\n app.off('touchend:passive', handleTouchEnd);\n app.off('resize', handleResize);\n panel.off('beforeOpen', handleResize);\n });\n}\nexport default resizablePanel;","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom7.js';\nimport { extend, deleteProps } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\nimport swipePanel from './swipe-panel.js';\nimport resizablePanel from './resizable-panel.js';\nclass Panel extends Framework7Class {\n constructor(app, params) {\n if (params === void 0) {\n params = {};\n }\n const extendedParams = extend({\n on: {}\n }, app.params.panel, params);\n super(extendedParams, [app]);\n const panel = this;\n panel.params = extendedParams;\n panel.$containerEl = panel.params.containerEl ? $(panel.params.containerEl).eq(0) : app.$el;\n panel.containerEl = panel.$containerEl[0];\n if (!panel.containerEl) {\n panel.$containerEl = app.$el;\n panel.containerEl = app.$el[0];\n }\n let $el;\n if (panel.params.el) {\n $el = $(panel.params.el).eq(0);\n } else if (panel.params.content) {\n $el = $(panel.params.content).filter(node => node.nodeType === 1).eq(0);\n }\n if ($el.length === 0) return panel;\n if ($el[0].f7Panel) return $el[0].f7Panel;\n $el[0].f7Panel = panel;\n let {\n side,\n effect,\n resizable\n } = panel.params;\n if (typeof side === 'undefined') side = $el.hasClass('panel-left') ? 'left' : 'right';\n if (typeof effect === 'undefined')\n // eslint-disable-next-line\n effect = $el.hasClass('panel-cover') ? 'cover' : $el.hasClass('panel-push') ? 'push' : $el.hasClass('panel-floating') ? 'floating' : 'reveal';\n if (typeof resizable === 'undefined') resizable = $el.hasClass('panel-resizable');\n let $backdropEl;\n if (panel.params.backdrop && panel.params.backdropEl) {\n $backdropEl = $(panel.params.backdropEl);\n } else if (panel.params.backdrop) {\n $backdropEl = panel.$containerEl.children('.panel-backdrop');\n if ($backdropEl.length === 0) {\n $backdropEl = $('');\n panel.$containerEl.prepend($backdropEl);\n }\n }\n extend(panel, {\n app,\n side,\n effect,\n resizable,\n $el,\n el: $el[0],\n opened: false,\n $backdropEl,\n backdropEl: $backdropEl && $backdropEl[0]\n });\n\n // Install Modules\n panel.useModules();\n\n // Init\n panel.init();\n return panel;\n }\n getViewEl() {\n const panel = this;\n let viewEl;\n if (panel.$containerEl.children('.views').length > 0) {\n viewEl = panel.$containerEl.children('.views')[0];\n } else {\n viewEl = panel.$containerEl.children('.view')[0];\n }\n return viewEl;\n }\n setStateClasses(state) {\n const panel = this;\n const {\n side,\n el,\n effect\n } = panel;\n const viewEl = panel.getViewEl();\n const panelInView = viewEl && viewEl.contains(el);\n const $targetEl = !viewEl || panelInView ? panel.$containerEl : $('html');\n if (state === 'open') {\n $targetEl.addClass(`with-panel with-panel-${panel.side}-${panel.effect}`);\n }\n if (state === 'before-closing') {\n $targetEl.addClass('with-panel-closing');\n }\n if (state === 'closing') {\n $targetEl.addClass('with-panel-closing');\n $targetEl.removeClass(`with-panel with-panel-${panel.side}-${panel.effect}`);\n }\n if (state === 'after-closing') {\n $targetEl.removeClass('with-panel-closing');\n }\n if (state === 'closed') {\n $targetEl.removeClass(`with-panel-${side}-${effect}`);\n }\n }\n enableVisibleBreakpoint() {\n const panel = this;\n panel.visibleBreakpointDisabled = false;\n panel.setVisibleBreakpoint();\n return panel;\n }\n disableVisibleBreakpoint() {\n const panel = this;\n panel.visibleBreakpointDisabled = true;\n panel.setVisibleBreakpoint();\n return panel;\n }\n toggleVisibleBreakpoint() {\n const panel = this;\n panel.visibleBreakpointDisabled = !panel.visibleBreakpointDisabled;\n panel.setVisibleBreakpoint();\n return panel;\n }\n setVisibleBreakpoint(emitEvents) {\n if (emitEvents === void 0) {\n emitEvents = true;\n }\n const panel = this;\n const app = panel.app;\n if (!panel.visibleBreakpointResizeHandler) {\n panel.visibleBreakpointResizeHandler = function visibleBreakpointResizeHandler() {\n panel.setVisibleBreakpoint();\n };\n app.on('resize', panel.visibleBreakpointResizeHandler);\n }\n const {\n side,\n $el,\n $containerEl,\n params,\n visibleBreakpointDisabled\n } = panel;\n const breakpoint = params.visibleBreakpoint;\n const $viewEl = $(panel.getViewEl());\n const wasVisible = $el.hasClass('panel-in-breakpoint');\n if ($containerEl && $containerEl.hasClass('page')) {\n $viewEl.add($containerEl.children('.page-content, .tabs, .fab'));\n }\n if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null && !visibleBreakpointDisabled) {\n if (!wasVisible) {\n panel.setStateClasses('closed');\n $el.addClass('panel-in-breakpoint').removeClass('panel-in panel-in-collapsed');\n panel.onOpen(false);\n panel.onOpened();\n $viewEl.css({\n [`margin-${side}`]: `${$el.width()}px`\n });\n app.allowPanelOpen = true;\n if (emitEvents) {\n panel.emit('local::breakpoint panelBreakpoint', panel);\n panel.$el.trigger('panel:breakpoint');\n }\n } else {\n $viewEl.css({\n [`margin-${side}`]: `${$el.width()}px`\n });\n }\n } else if (wasVisible) {\n $el.removeClass('panel-in-breakpoint panel-in');\n panel.onClose();\n panel.onClosed();\n $viewEl.css({\n [`margin-${side}`]: ''\n });\n if (emitEvents) {\n panel.emit('local::breakpoint panelBreakpoint', panel);\n panel.$el.trigger('panel:breakpoint');\n }\n }\n }\n enableCollapsedBreakpoint() {\n const panel = this;\n panel.collapsedBreakpointDisabled = false;\n panel.setCollapsedBreakpoint();\n return panel;\n }\n disableCollapsedBreakpoint() {\n const panel = this;\n panel.collapsedBreakpointDisabled = true;\n panel.setCollapsedBreakpoint();\n return panel;\n }\n toggleCollapsedBreakpoint() {\n const panel = this;\n panel.collapsedBreakpointDisabled = !panel.collapsedBreakpointDisabled;\n panel.setCollapsedBreakpoint();\n return panel;\n }\n setCollapsedBreakpoint(emitEvents) {\n if (emitEvents === void 0) {\n emitEvents = true;\n }\n const panel = this;\n const app = panel.app;\n if (!panel.collapsedBreakpointResizeHandler) {\n panel.collapsedBreakpointResizeHandler = function collapsedBreakpointResizeHandler() {\n panel.setCollapsedBreakpoint();\n };\n app.on('resize', panel.collapsedBreakpointResizeHandler);\n }\n const {\n $el,\n params,\n collapsedBreakpointDisabled\n } = panel;\n if ($el.hasClass('panel-in-breakpoint')) return;\n const breakpoint = params.collapsedBreakpoint;\n const wasVisible = $el.hasClass('panel-in-collapsed');\n if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null && !collapsedBreakpointDisabled) {\n if (!wasVisible) {\n panel.setStateClasses('closed');\n $el.addClass('panel-in-collapsed').removeClass('panel-in');\n panel.collapsed = true;\n app.allowPanelOpen = true;\n if (emitEvents) {\n panel.emit('local::collapsedBreakpoint panelCollapsedBreakpoint', panel);\n panel.$el.trigger('panel:collapsedbreakpoint');\n }\n }\n } else if (wasVisible) {\n $el.removeClass('panel-in-collapsed panel-in');\n panel.collapsed = false;\n if (emitEvents) {\n panel.emit('local::collapsedBreakpoint panelCollapsedBreakpoint', panel);\n panel.$el.trigger('panel:collapsedbreakpoint');\n }\n }\n }\n enableResizable() {\n const panel = this;\n if (panel.resizableInitialized) {\n panel.resizable = true;\n panel.$el.addClass('panel-resizable');\n } else {\n resizablePanel(panel);\n }\n return panel;\n }\n disableResizable() {\n const panel = this;\n panel.resizable = false;\n panel.$el.removeClass('panel-resizable');\n return panel;\n }\n enableSwipe() {\n const panel = this;\n if (panel.swipeInitialized) {\n panel.swipeable = true;\n } else {\n swipePanel(panel);\n }\n return panel;\n }\n disableSwipe() {\n const panel = this;\n panel.swipeable = false;\n return panel;\n }\n onOpen(modifyHtmlClasses) {\n if (modifyHtmlClasses === void 0) {\n modifyHtmlClasses = true;\n }\n const panel = this;\n // eslint-disable-next-line\n panel._openTransitionStarted = false;\n const app = panel.app;\n panel.opened = true;\n app.panel.allowOpen = false;\n panel.$el.trigger('panel:beforeopen');\n panel.emit('local::beforeOpen panelBeforeOpen', panel);\n if (modifyHtmlClasses) {\n panel.setStateClasses('open');\n }\n panel.$el.trigger('panel:open');\n panel.emit('local::open panelOpen', panel);\n }\n onOpened() {\n const panel = this;\n const app = panel.app;\n app.panel.allowOpen = true;\n panel.$el.trigger('panel:opened');\n panel.emit('local::opened panelOpened', panel);\n }\n onClose() {\n const panel = this;\n const app = panel.app;\n panel.opened = false;\n app.panel.allowOpen = false;\n panel.$el.trigger('panel:beforeclose');\n panel.emit('local::beforeClose panelBeforeClose', panel);\n panel.setStateClasses('closing');\n panel.$el.trigger('panel:close');\n panel.emit('local::close panelClose', panel);\n }\n onClosed() {\n const panel = this;\n const app = panel.app;\n app.panel.allowOpen = true;\n panel.setStateClasses('after-closing');\n panel.$el.removeClass('panel-out');\n if (panel.$backdropEl) {\n const otherPanel = app.panel.get('.panel-in');\n const shouldHideBackdrop = !otherPanel || otherPanel && !otherPanel.$backdropEl;\n if (shouldHideBackdrop) {\n panel.$backdropEl.removeClass('panel-backdrop-in');\n }\n }\n panel.$el.trigger('panel:closed');\n panel.emit('local::closed panelClosed', panel);\n }\n toggle(animate) {\n if (animate === void 0) {\n animate = true;\n }\n const panel = this;\n const breakpoint = panel.params.visibleBreakpoint;\n const app = panel.app;\n if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null) {\n return panel.toggleVisibleBreakpoint();\n }\n if (panel.opened) panel.close(animate);else panel.open(animate);\n return panel;\n }\n insertToRoot() {\n const panel = this;\n const document = getDocument();\n const {\n $el,\n $backdropEl,\n $containerEl\n } = panel;\n const $panelParentEl = $el.parent();\n const wasInDom = $el.parents(document).length > 0;\n if (!$panelParentEl.is($containerEl) || $el.prevAll('.views, .view').length) {\n const $insertBeforeEl = $containerEl.children('.panel, .views, .view').eq(0);\n const $insertAfterEl = $containerEl.children('.panel-backdrop').eq(0);\n if ($insertBeforeEl.length) {\n $el.insertBefore($insertBeforeEl);\n } else if ($insertAfterEl) {\n $el.insertBefore($insertAfterEl);\n } else {\n $containerEl.prepend($el);\n }\n if ($backdropEl && $backdropEl.length && (!$backdropEl.parent().is($containerEl) && $backdropEl.nextAll('.panel').length === 0 || $backdropEl.parent().is($containerEl) && $backdropEl.nextAll('.panel').length === 0)) {\n $backdropEl.insertBefore($el);\n }\n panel.once('panelClosed', () => {\n if (wasInDom) {\n $panelParentEl.append($el);\n } else {\n $el.remove();\n }\n });\n }\n }\n open(animate) {\n if (animate === void 0) {\n animate = true;\n }\n const panel = this;\n const app = panel.app;\n if (!app.panel.allowOpen) return false;\n const {\n effect,\n $el,\n $backdropEl,\n opened,\n $containerEl\n } = panel;\n if (!$el || $el.hasClass('panel-in')) {\n return panel;\n }\n panel.insertToRoot();\n\n // Ignore if opened\n if (opened || $el.hasClass('panel-in-breakpoint') || $el.hasClass('panel-in')) return false;\n\n // Close if some panel is opened\n const otherOpenedPanel = app.panel.get('.panel-in');\n if (otherOpenedPanel && otherOpenedPanel !== panel) {\n otherOpenedPanel.close(animate);\n }\n $el[animate ? 'removeClass' : 'addClass']('not-animated');\n $el.addClass('panel-in');\n if ($backdropEl) {\n $backdropEl.addClass('panel-backdrop-in');\n $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');\n }\n if (['cover', 'push', 'floating'].includes(panel.effect)) {\n /* eslint no-underscore-dangle: [\"error\", { \"allow\": [\"_clientLeft\"] }] */\n panel._clientLeft = $el[0].clientLeft;\n }\n\n // Transitionend\n const $viewEl = $(panel.getViewEl());\n if ($containerEl && $containerEl.hasClass('page')) {\n $viewEl.add($containerEl.children('.page-content, .tabs'));\n }\n const transitionEndTarget = effect === 'reveal' ? $viewEl : $el;\n function panelTransitionStart() {\n transitionEndTarget.transitionStart(() => {\n // eslint-disable-next-line\n panel._openTransitionStarted = true;\n });\n }\n function panelTransitionEnd() {\n transitionEndTarget.transitionEnd(e => {\n if ($(e.target).is(transitionEndTarget)) {\n if ($el.hasClass('panel-out')) {\n panel.onClosed();\n } else {\n panel.onOpened();\n }\n } else panelTransitionEnd();\n });\n }\n if (animate) {\n if ($backdropEl) {\n $backdropEl.removeClass('not-animated');\n }\n panelTransitionStart();\n panelTransitionEnd();\n $el.removeClass('panel-out not-animated').addClass('panel-in');\n panel.onOpen();\n } else {\n if ($backdropEl) {\n $backdropEl.addClass('not-animated');\n }\n $el.removeClass('panel-out').addClass('panel-in not-animated');\n panel.onOpen();\n panel.onOpened();\n // eslint-disable-next-line\n panel._openTransitionStarted = true;\n }\n return true;\n }\n close(animate) {\n if (animate === void 0) {\n animate = true;\n }\n const panel = this;\n const {\n effect,\n $el,\n $backdropEl,\n opened,\n $containerEl\n } = panel;\n if (!opened || $el.hasClass('panel-in-breakpoint') || !$el.hasClass('panel-in')) return panel;\n $el[animate ? 'removeClass' : 'addClass']('not-animated');\n if ($backdropEl) {\n $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');\n }\n const $viewEl = $(panel.getViewEl());\n if ($containerEl && $containerEl.hasClass('page')) {\n $viewEl.add($containerEl.children('.page-content, .tabs'));\n }\n const transitionEndTarget = effect === 'reveal' ? $viewEl : $el;\n // eslint-disable-next-line\n if (!panel._openTransitionStarted) {\n // eslint-disable-next-line\n animate = false;\n }\n function transitionEnd() {\n if ($el.hasClass('panel-out')) {\n panel.onClosed();\n } else if ($el.hasClass('panel-in')) {\n panel.onOpened();\n }\n panel.setStateClasses('after-closing');\n }\n if (animate) {\n transitionEndTarget.transitionEnd(() => {\n transitionEnd();\n });\n $el.removeClass('panel-in').addClass('panel-out');\n // Emit close\n panel.onClose();\n } else {\n $el.addClass('not-animated').removeClass('panel-in').addClass('panel-out');\n // Emit close\n panel.onClose();\n panel.onClosed();\n }\n return panel;\n }\n init() {\n const panel = this;\n // const app = panel.app;\n if (typeof panel.params.visibleBreakpoint !== 'undefined') {\n panel.setVisibleBreakpoint();\n }\n if (typeof panel.params.collapsedBreakpoint !== 'undefined') {\n panel.setCollapsedBreakpoint();\n }\n if (panel.params.swipe) {\n panel.enableSwipe();\n }\n if (panel.resizable) {\n panel.enableResizable();\n }\n }\n destroy() {\n let panel = this;\n const app = panel.app;\n const {\n $containerEl\n } = panel;\n if (!panel.$el) {\n // Panel already destroyed\n return;\n }\n panel.emit('local::beforeDestroy panelBeforeDestroy', panel);\n panel.$el.trigger('panel:beforedestroy');\n if (panel.visibleBreakpointResizeHandler) {\n app.off('resize', panel.visibleBreakpointResizeHandler);\n }\n if (panel.collapsedBreakpointResizeHandler) {\n app.off('resize', panel.collapsedBreakpointResizeHandler);\n }\n if (panel.$el.hasClass('panel-in-breakpoint') || panel.$el.hasClass('panel-in-collapsed')) {\n const $viewEl = $(panel.getViewEl());\n if ($containerEl && $containerEl.hasClass('page')) {\n $viewEl.add($containerEl.children('.page-content, .tabs'));\n }\n panel.$el.removeClass('panel-in-breakpoint panel-in-collapsed panel-in');\n $viewEl.css({\n [`margin-${panel.side}`]: ''\n });\n panel.emit('local::breakpoint panelBreakpoint', panel);\n panel.$el.trigger('panel:breakpoint');\n }\n panel.$el.trigger('panel:destroy');\n panel.emit('local::destroy panelDestroy', panel);\n if (panel.el) {\n panel.el.f7Panel = null;\n delete panel.el.f7Panel;\n }\n deleteProps(panel);\n panel = null;\n }\n}\nexport default Panel;","import $ from '../../shared/dom7.js';\nimport { extend } from '../../shared/utils.js';\nimport Panel from './panel-class.js';\nexport default {\n name: 'panel',\n params: {\n panel: {\n opened: undefined,\n // default based on panel-in class\n side: undefined,\n // default based on panel class\n effect: undefined,\n // default based on panel class\n resizable: undefined,\n // default based on panel-resizable class\n backdrop: true,\n backdropEl: undefined,\n visibleBreakpoint: undefined,\n collapsedBreakpoint: undefined,\n swipe: false,\n // or true\n swipeNoFollow: false,\n // or true\n swipeOnlyClose: false,\n swipeActiveArea: 0,\n swipeThreshold: 0,\n closeByBackdropClick: true,\n containerEl: undefined\n }\n },\n static: {\n Panel\n },\n create() {\n const app = this;\n extend(app, {\n panel: {\n allowOpen: true,\n create(params) {\n return new Panel(app, params);\n },\n get(el) {\n if (el === void 0) {\n el = '.panel';\n }\n if (el instanceof Panel) return el;\n if (el === 'left' || el === 'right') el = `.panel-${el}`; // eslint-disable-line\n const $el = $(el);\n if ($el.length === 0 || $el.length > 1) return undefined;\n return $el[0].f7Panel;\n },\n destroy(el) {\n if (el === void 0) {\n el = '.panel';\n }\n const panel = app.panel.get(el);\n if (panel && panel.destroy) return panel.destroy();\n return undefined;\n },\n open(el, animate) {\n if (el === void 0) {\n el = '.panel';\n }\n if (el === 'left' || el === 'right') el = `.panel-${el}`; // eslint-disable-line\n let panel = app.panel.get(el);\n if (panel && panel.open) return panel.open(animate);\n if (!panel) {\n panel = app.panel.create({\n el\n });\n return panel.open(animate);\n }\n return undefined;\n },\n close(el, animate) {\n if (el === void 0) {\n el = '.panel-in';\n }\n if (el === 'left' || el === 'right') el = `.panel-${el}`; // eslint-disable-line\n let panel = app.panel.get(el);\n if (panel && panel.open) return panel.close(animate);\n if (!panel) {\n panel = app.panel.create({\n el\n });\n return panel.close(animate);\n }\n return undefined;\n },\n toggle(el, animate) {\n if (el === void 0) {\n el = '.panel';\n }\n if (el === 'left' || el === 'right') el = `.panel-${el}`; // eslint-disable-line\n let panel = app.panel.get(el);\n if (panel && panel.toggle) return panel.toggle(animate);\n if (!panel) {\n panel = app.panel.create({\n el\n });\n return panel.toggle(animate);\n }\n return undefined;\n }\n }\n });\n },\n on: {\n init() {\n const app = this;\n $('.panel-init').each(panelEl => {\n const params = Object.assign({\n el: panelEl\n }, $(panelEl).dataset() || {});\n app.panel.create(params);\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.panel-init').each(panelEl => {\n const params = Object.assign({\n el: panelEl\n }, $(panelEl).dataset() || {});\n app.panel.create(params);\n });\n },\n pageBeforeRemove(page) {\n const app = this;\n page.$el.find('.panel-init').each(panelEl => {\n const panel = app.panel.get(panelEl);\n if (panel && panel.destroy) panel.destroy();\n });\n }\n },\n vnode: {\n 'panel-init': {\n insert(vnode) {\n const app = this;\n const panelEl = vnode.elm;\n const params = Object.assign({\n el: panelEl\n }, $(panelEl).dataset() || {});\n app.panel.create(params);\n },\n destroy(vnode) {\n const app = this;\n const panelEl = vnode.elm;\n const panel = app.panel.get(panelEl);\n if (panel && panel.destroy) panel.destroy();\n }\n }\n },\n clicks: {\n '.panel-open': function open(clickedEl, data) {\n if (data === void 0) {\n data = {};\n }\n const app = this;\n app.panel.open(data.panel, data.animate);\n },\n '.panel-close': function close(clickedEl, data) {\n if (data === void 0) {\n data = {};\n }\n const app = this;\n app.panel.close(data.panel, data.animate);\n },\n '.panel-toggle': function close(clickedEl, data) {\n if (data === void 0) {\n data = {};\n }\n const app = this;\n app.panel.toggle(data.panel, data.animate);\n },\n '.panel-backdrop': function close() {\n const app = this;\n const $panelEl = $('.panel-in:not(.panel-out)');\n if (!$panelEl.length) return;\n const instance = $panelEl[0] && $panelEl[0].f7Panel;\n $panelEl.trigger('panel:backdrop-click');\n if (instance) {\n instance.emit('backdropClick', instance);\n }\n app.emit('panelBackdropClick', instance || $panelEl[0]);\n if (instance && instance.params.closeByBackdropClick === false) return;\n if (app.params.panel.closeByBackdropClick) app.panel.close();\n }\n }\n};","/* eslint no-param-reassign: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport { bindMethods } from '../../shared/utils.js';\nimport { getSupport } from '../../shared/get-support.js';\nimport { getDevice } from '../../shared/get-device.js';\nimport $ from '../../shared/dom7.js';\nconst CardExpandable = {\n open(cardEl, animate) {\n if (cardEl === void 0) {\n cardEl = '.card-expandable';\n }\n if (animate === void 0) {\n animate = true;\n }\n const app = this;\n const device = getDevice();\n const document = getDocument();\n const support = getSupport();\n const $cardEl = $(cardEl).eq(0);\n if (!$cardEl || !$cardEl.length) return;\n if ($cardEl.hasClass('card-opened') || $cardEl.hasClass('card-opening') || $cardEl.hasClass('card-closing')) return;\n const $pageEl = $cardEl.parents('.page').eq(0);\n if (!$pageEl.length) return;\n if ($pageEl.find('.card-opened').length) {\n return;\n }\n let prevented;\n function prevent() {\n prevented = true;\n }\n $cardEl.trigger('card:beforeopen', {\n prevent\n });\n app.emit('cardBeforeOpen', $cardEl[0], prevent);\n if (prevented) return;\n const cardParams = Object.assign({\n animate\n }, app.params.card, $cardEl.dataset());\n const $pageContentEl = $cardEl.parents('.page-content');\n let $backdropEl;\n if ($cardEl.attr('data-backdrop-el')) {\n $backdropEl = $($cardEl.attr('data-backdrop-el'));\n }\n if (!$backdropEl && cardParams.backdrop) {\n $backdropEl = $pageContentEl.find('.card-backdrop');\n if (!$backdropEl.length) {\n $backdropEl = $('');\n $pageContentEl.append($backdropEl);\n }\n }\n let $navbarEl;\n let $toolbarEl;\n if (cardParams.hideNavbarOnOpen) {\n $navbarEl = $pageEl.children('.navbar');\n if (!$navbarEl.length) {\n if ($pageEl[0].f7Page) $navbarEl = $pageEl[0].f7Page.$navbarEl;\n }\n }\n if (cardParams.hideToolbarOnOpen) {\n $toolbarEl = $pageEl.children('.toolbar');\n if (!$toolbarEl.length) {\n $toolbarEl = $pageEl.parents('.view').children('.toolbar');\n }\n if (!$toolbarEl.length) {\n $toolbarEl = $pageEl.parents('.views').children('.toolbar');\n }\n }\n const currTransform = $cardEl.css('transform');\n let hasTransform;\n if (currTransform && currTransform.match(/[2-9]/)) {\n hasTransform = true;\n }\n const $cardContentEl = $cardEl.children('.card-content');\n const $cardSizeEl = $(document.createElement('div')).addClass('card-expandable-size');\n $cardEl.append($cardSizeEl);\n let cardWidth = $cardEl[0].offsetWidth;\n let cardHeight = $cardEl[0].offsetHeight;\n let pageWidth = $pageEl[0].offsetWidth;\n let pageHeight = $pageEl[0].offsetHeight;\n let maxWidth = $cardSizeEl[0].offsetWidth || pageWidth;\n let maxHeight = $cardSizeEl[0].offsetHeight || pageHeight;\n let statusbarHeight;\n if ($navbarEl && !cardParams.hideStatusbarOnOpen && maxHeight === pageHeight) {\n statusbarHeight = parseInt($navbarEl.css('--f7-safe-area-top'), 10);\n if (Number.isNaN(statusbarHeight)) statusbarHeight = 0;\n }\n if (statusbarHeight) {\n maxHeight -= statusbarHeight;\n }\n let scaleX = maxWidth / cardWidth;\n let scaleY = maxHeight / cardHeight;\n let offset = $cardEl.offset();\n let pageOffset = $pageEl.offset();\n if (statusbarHeight) {\n pageOffset.top += statusbarHeight / 2;\n }\n offset.left -= pageOffset.left;\n let cardLeftOffset;\n let cardTopOffset;\n if (hasTransform) {\n const transformValues = currTransform.replace(/matrix\\(|\\)/g, '').split(',').map(el => el.trim());\n if (transformValues && transformValues.length > 1) {\n const scale = parseFloat(transformValues[0]);\n cardLeftOffset = offset.left - cardWidth * (1 - scale) / 2;\n cardTopOffset = offset.top - pageOffset.top - cardHeight * (1 - scale) / 2;\n if (app.rtl) cardLeftOffset -= $cardEl[0].scrollLeft;\n } else {\n cardLeftOffset = $cardEl[0].offsetLeft;\n cardTopOffset = $cardEl[0].offsetTop - ($pageContentEl.length ? $pageContentEl[0].scrollTop : 0);\n }\n } else {\n cardLeftOffset = offset.left;\n cardTopOffset = offset.top - pageOffset.top;\n if (app.rtl) cardLeftOffset -= $cardEl[0].scrollLeft;\n }\n cardLeftOffset -= (pageWidth - maxWidth) / 2;\n cardTopOffset -= (pageHeight - maxHeight) / 2;\n let cardRightOffset = maxWidth - cardWidth - cardLeftOffset;\n if (app.rtl) {\n [cardLeftOffset, cardRightOffset] = [cardRightOffset, cardLeftOffset];\n }\n let cardBottomOffset = maxHeight - cardHeight - cardTopOffset;\n let translateX = (cardRightOffset - cardLeftOffset) / 2;\n let translateY = (cardBottomOffset - cardTopOffset) / 2;\n if (cardParams.hideNavbarOnOpen && $navbarEl && $navbarEl.length) {\n if ($navbarEl.closest('.navbar-hidden').length) {\n // Was hidden\n $cardEl[0].f7KeepNavbarOnClose = true;\n } else {\n delete $cardEl[0].f7KeepNavbarOnClose;\n app.navbar.hide($navbarEl, cardParams.animate, cardParams.hideStatusbarOnOpen, true);\n }\n }\n if (cardParams.hideToolbarOnOpen && $toolbarEl && $toolbarEl.length) {\n if ($toolbarEl.closest('.toolbar-hidden').length) {\n // Was hidden\n $cardEl[0].f7KeepToolbarOnClose = true;\n } else {\n delete $cardEl[0].f7KeepToolbarOnClose;\n app.toolbar.hide($toolbarEl, cardParams.animate);\n }\n }\n if ($backdropEl) {\n $backdropEl.removeClass('card-backdrop-out').addClass('card-backdrop-in');\n }\n $cardEl.removeClass('card-transitioning');\n if (cardParams.animate) {\n $cardEl.addClass('card-opening');\n }\n $cardEl.trigger('card:open');\n app.emit('cardOpen', $cardEl[0]);\n function transitionEnd() {\n $pageEl.addClass('page-with-card-opened');\n if (device.ios && $pageContentEl.length) {\n $pageContentEl.css('height', `${$pageContentEl[0].offsetHeight + 1}px`);\n setTimeout(() => {\n $pageContentEl.css('height', '');\n });\n }\n $cardEl.addClass('card-opened');\n $cardEl.removeClass('card-opening');\n $cardEl.trigger('card:opened');\n app.emit('cardOpened', $cardEl[0], $pageEl[0]);\n }\n $cardContentEl.css({\n width: `${maxWidth}px`,\n height: `${maxHeight}px`\n }).transform(`translate3d(${app.rtl ? cardLeftOffset + translateX : -cardLeftOffset - translateX}px, 0px, 0) scale(${1 / scaleX}, ${1 / scaleY})`);\n $cardEl.transform(`translate3d(${app.rtl ? -translateX : translateX}px, ${translateY}px, 0) scale(${scaleX}, ${scaleY})`);\n if (cardParams.animate) {\n $cardEl.transitionEnd(() => {\n transitionEnd();\n });\n } else {\n transitionEnd();\n }\n function onResize() {\n $cardEl.removeClass('card-transitioning');\n cardWidth = $cardEl[0].offsetWidth;\n cardHeight = $cardEl[0].offsetHeight;\n pageWidth = $pageEl[0].offsetWidth;\n pageHeight = $pageEl[0].offsetHeight;\n maxWidth = $cardSizeEl[0].offsetWidth || pageWidth;\n maxHeight = $cardSizeEl[0].offsetHeight || pageHeight;\n statusbarHeight = 0;\n if ($navbarEl && !cardParams.hideStatusbarOnOpen && maxHeight === pageHeight) {\n statusbarHeight = parseInt($navbarEl.css('--f7-safe-area-top'), 10);\n if (Number.isNaN(statusbarHeight)) statusbarHeight = 0;\n }\n if (statusbarHeight) {\n maxHeight -= statusbarHeight;\n }\n scaleX = maxWidth / cardWidth;\n scaleY = maxHeight / cardHeight;\n $cardEl.transform('translate3d(0px, 0px, 0) scale(1)');\n offset = $cardEl.offset();\n pageOffset = $pageEl.offset();\n if (statusbarHeight) {\n pageOffset.top += statusbarHeight / 2;\n }\n offset.left -= pageOffset.left;\n offset.top -= pageOffset.top;\n cardLeftOffset = offset.left - (pageWidth - maxWidth) / 2;\n if (app.rtl) cardLeftOffset -= $cardEl[0].scrollLeft;\n cardTopOffset = offset.top - (pageHeight - maxHeight) / 2;\n cardRightOffset = maxWidth - cardWidth - cardLeftOffset;\n cardBottomOffset = maxHeight - cardHeight - cardTopOffset;\n if (app.rtl) {\n [cardLeftOffset, cardRightOffset] = [cardRightOffset, cardLeftOffset];\n }\n translateX = (cardRightOffset - cardLeftOffset) / 2;\n translateY = (cardBottomOffset - cardTopOffset) / 2;\n $cardEl.transform(`translate3d(${app.rtl ? -translateX : translateX}px, ${translateY}px, 0) scale(${scaleX}, ${scaleY})`);\n $cardContentEl.css({\n width: `${maxWidth}px`,\n height: `${maxHeight}px`\n }).transform(`translate3d(${app.rtl ? cardLeftOffset + translateX : -cardLeftOffset - translateX}px, 0px, 0) scale(${1 / scaleX}, ${1 / scaleY})`);\n }\n let cardScrollTop;\n let isTouched;\n let isMoved;\n let touchStartX;\n let touchStartY;\n let touchEndX;\n let touchEndY;\n let isScrolling;\n let progress;\n let isV;\n let isH;\n let $cardScrollableEl;\n function onTouchStart(e) {\n if (!$(e.target).closest($cardEl).length || !e.isTrusted) return;\n if (!$cardEl.hasClass('card-opened')) return;\n $cardScrollableEl = $cardEl.find(cardParams.scrollableEl);\n if ($cardScrollableEl[0] && $cardScrollableEl[0] !== $cardContentEl[0] && !$cardScrollableEl[0].contains(e.target)) {\n cardScrollTop = 0;\n } else {\n cardScrollTop = $cardScrollableEl.scrollTop();\n }\n isTouched = true;\n touchStartX = e.targetTouches[0].pageX;\n touchStartY = e.targetTouches[0].pageY;\n isScrolling = undefined;\n isV = false;\n isH = false;\n }\n function onTouchMove(e) {\n if (!isTouched || !e.isTrusted) return;\n touchEndX = e.targetTouches[0].pageX;\n touchEndY = e.targetTouches[0].pageY;\n if (typeof isScrolling === 'undefined') {\n isScrolling = !!(isScrolling || Math.abs(touchEndY - touchStartY) > Math.abs(touchEndX - touchStartX));\n }\n if (!isH && !isV) {\n if (!isScrolling && e.targetTouches[0].clientX <= 50) {\n isH = true;\n } else {\n isV = true;\n }\n }\n if (!(isH || isV) || isV && cardScrollTop !== 0) {\n isTouched = true;\n isMoved = true;\n return;\n }\n if (!isMoved) {\n $cardEl.removeClass('card-transitioning');\n }\n isMoved = true;\n progress = isV ? Math.max((touchEndY - touchStartY) / 150, 0) : Math.max((touchEndX - touchStartX) / (cardWidth / 2), 0);\n if (progress > 0 && isV || isH) {\n if (isV && device.ios && $cardScrollableEl[0] === $cardContentEl[0]) {\n $cardScrollableEl.css('-webkit-overflow-scrolling', 'auto');\n $cardScrollableEl.scrollTop(0);\n }\n e.preventDefault();\n }\n if (progress > 1) progress **= 0.3;\n if (progress > (isV ? 1.3 : 1.1)) {\n isTouched = false;\n isMoved = false;\n app.card.close($cardEl);\n } else {\n $cardEl.transform(`translate3d(${app.rtl ? -translateX : translateX}px, ${translateY}px, 0) scale(${scaleX * (1 - progress * 0.2)}, ${scaleY * (1 - progress * 0.2)})`);\n }\n }\n function onTouchEnd(e) {\n if (!isTouched || !isMoved || !e.isTrusted) return;\n isTouched = false;\n isMoved = false;\n if (device.ios) {\n $cardScrollableEl.css('-webkit-overflow-scrolling', '');\n }\n if (progress >= 0.8) {\n app.card.close($cardEl);\n } else {\n $cardEl.addClass('card-transitioning').transform(`translate3d(${app.rtl ? -translateX : translateX}px, ${translateY}px, 0) scale(${scaleX}, ${scaleY})`);\n }\n }\n $cardEl[0].detachEventHandlers = function detachEventHandlers() {\n app.off('resize', onResize);\n if (support.touch && cardParams.swipeToClose) {\n app.off('touchstart:passive', onTouchStart);\n app.off('touchmove:active', onTouchMove);\n app.off('touchend:passive', onTouchEnd);\n }\n };\n app.on('resize', onResize);\n if (support.touch && cardParams.swipeToClose) {\n app.on('touchstart:passive', onTouchStart);\n app.on('touchmove:active', onTouchMove);\n app.on('touchend:passive', onTouchEnd);\n }\n },\n close(cardEl, animate) {\n if (cardEl === void 0) {\n cardEl = '.card-expandable.card-opened';\n }\n if (animate === void 0) {\n animate = true;\n }\n const app = this;\n const device = getDevice();\n const $cardEl = $(cardEl).eq(0);\n if (!$cardEl || !$cardEl.length) return;\n if (!$cardEl.hasClass('card-opened') || $cardEl.hasClass('card-opening') || $cardEl.hasClass('card-closing')) return;\n const $cardContentEl = $cardEl.children('.card-content');\n const $pageContentEl = $cardEl.parents('.page-content');\n const $pageEl = $cardEl.parents('.page').eq(0);\n if (!$pageEl.length) return;\n const cardParams = Object.assign({\n animate\n }, app.params.card, $cardEl.dataset());\n const $cardScrollableEl = $cardEl.find(cardParams.scrollableEl);\n let $navbarEl;\n let $toolbarEl;\n let $backdropEl;\n if ($cardEl.attr('data-backdrop-el')) {\n $backdropEl = $($cardEl.attr('data-backdrop-el'));\n }\n if (cardParams.backdrop) {\n $backdropEl = $cardEl.parents('.page-content').find('.card-backdrop');\n }\n if (cardParams.hideNavbarOnOpen) {\n $navbarEl = $pageEl.children('.navbar');\n if (!$navbarEl.length) {\n if ($pageEl[0].f7Page) $navbarEl = $pageEl[0].f7Page.$navbarEl;\n }\n if ($navbarEl && $navbarEl.length && !$cardEl[0].f7KeepNavbarOnClose) {\n app.navbar.show($navbarEl, cardParams.animate, true);\n }\n }\n if (cardParams.hideToolbarOnOpen) {\n $toolbarEl = $pageEl.children('.toolbar');\n if (!$toolbarEl.length) {\n $toolbarEl = $pageEl.parents('.view').children('.toolbar');\n }\n if (!$toolbarEl.length) {\n $toolbarEl = $pageEl.parents('.views').children('.toolbar');\n }\n if ($toolbarEl && $toolbarEl.length && !$cardEl[0].f7KeepToolbarOnClose) {\n app.toolbar.show($toolbarEl, cardParams.animate);\n }\n }\n $pageEl.removeClass('page-with-card-opened');\n if (device.ios && $pageContentEl.length) {\n $pageContentEl.css('height', `${$pageContentEl[0].offsetHeight + 1}px`);\n setTimeout(() => {\n $pageContentEl.css('height', '');\n });\n }\n if ($backdropEl && $backdropEl.length) {\n $backdropEl.removeClass('card-backdrop-in').addClass('card-backdrop-out');\n }\n $cardEl.removeClass('card-opened card-transitioning');\n if (cardParams.animate) {\n $cardEl.addClass('card-closing');\n } else {\n $cardEl.addClass('card-no-transition');\n }\n $cardEl.transform('');\n $cardEl.trigger('card:close');\n app.emit('cardClose', $cardEl[0], $pageEl[0]);\n const animateWidth = $cardEl.hasClass('card-expandable-animate-width');\n function transitionEnd() {\n if (!animateWidth) {\n $cardContentEl.css({\n width: '',\n height: ''\n });\n }\n if ($backdropEl && $backdropEl.length) {\n $backdropEl.removeClass('card-backdrop-in card-backdrop-out');\n }\n $cardEl.removeClass('card-closing card-no-transition');\n $cardEl.trigger('card:closed');\n $cardEl.find('.card-expandable-size').remove();\n app.emit('cardClosed', $cardEl[0], $pageEl[0]);\n }\n if (animateWidth) {\n $cardContentEl.css({\n width: '',\n height: ''\n });\n }\n $cardContentEl.transform('').scrollTop(0, animate ? 300 : 0);\n if ($cardScrollableEl.length && $cardScrollableEl[0] !== $cardContentEl[0]) {\n $cardScrollableEl.scrollTop(0, animate ? 300 : 0);\n }\n if (animate) {\n $cardContentEl.transitionEnd(() => {\n transitionEnd();\n });\n } else {\n transitionEnd();\n }\n if ($cardEl[0].detachEventHandlers) {\n $cardEl[0].detachEventHandlers();\n delete $cardEl[0].detachEventHandlers;\n }\n },\n toggle(cardEl, animate) {\n if (cardEl === void 0) {\n cardEl = '.card-expandable';\n }\n const app = this;\n const $cardEl = $(cardEl).eq(0);\n if (!$cardEl.length) return;\n if ($cardEl.hasClass('card-opened')) {\n app.card.close($cardEl, animate);\n } else {\n app.card.open($cardEl, animate);\n }\n }\n};\nexport default {\n name: 'card',\n params: {\n card: {\n hideNavbarOnOpen: true,\n hideStatusbarOnOpen: true,\n hideToolbarOnOpen: true,\n scrollableEl: '.card-content',\n swipeToClose: true,\n closeByBackdropClick: true,\n backdrop: true\n }\n },\n create() {\n const app = this;\n bindMethods(app, {\n card: CardExpandable\n });\n },\n on: {\n pageBeforeIn(page) {\n const app = this;\n if (app.params.card.hideNavbarOnOpen && page.navbarEl && page.$el.find('.card-opened.card-expandable').length) {\n app.navbar.hide(page.navbarEl, true, app.params.card.hideStatusbarOnOpen, true);\n }\n if (app.params.card.hideToolbarOnOpen && page.$el.find('.card-opened.card-expandable').length) {\n let $toolbarEl = page.$el.children('.toolbar');\n if (!$toolbarEl.length) {\n $toolbarEl = page.$el.parents('.view').children('.toolbar');\n }\n if (!$toolbarEl.length) {\n $toolbarEl = page.$el.parents('.views').children('.toolbar');\n }\n if ($toolbarEl && $toolbarEl.length) {\n app.toolbar.hide($toolbarEl);\n }\n }\n }\n },\n clicks: {\n '.card-close': function closeCard($clickedEl, data) {\n const app = this;\n app.card.close(data.card, data.animate);\n },\n '.card-open': function closeCard($clickedEl, data) {\n const app = this;\n app.card.open(data.card, data.animate);\n },\n '.card-expandable': function toggleExpandableCard($clickedEl, data, e) {\n const app = this;\n if ($clickedEl.hasClass('card-opened') || $clickedEl.hasClass('card-opening') || $clickedEl.hasClass('card-closing')) return;\n if ($(e.target).closest('.card-prevent-open, .card-close').length) return;\n app.card.open($clickedEl);\n },\n '.card-backdrop-in': function onBackdropClick() {\n const app = this;\n let needToClose = false;\n if (app.params.card.closeByBackdropClick) needToClose = true;\n const $openedCardEl = $('.card-opened');\n if (!$openedCardEl.length) return;\n if ($openedCardEl.attr('data-close-by-backdrop-click') === 'true') {\n needToClose = true;\n } else if ($openedCardEl.attr('data-close-by-backdrop-click') === 'false') {\n needToClose = false;\n }\n if (needToClose) app.card.close($openedCardEl);\n }\n }\n};","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom7.js';\nimport { extend, serializeObject } from '../../shared/utils.js';\n\n// Form Data\nconst FormData = {\n store(form, data) {\n const app = this;\n const window = getWindow();\n let formId = form;\n const $formEl = $(form);\n if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {\n formId = $formEl.attr('id');\n }\n // Store form data in app.formsData\n app.form.data[`form-${formId}`] = data;\n\n // Store form data in local storage also\n window.localStorage[`f7form-${formId}`] = JSON.stringify(data);\n },\n get(form) {\n const app = this;\n const window = getWindow();\n let formId = form;\n const $formEl = $(form);\n if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {\n formId = $formEl.attr('id');\n }\n if (window.localStorage[`f7form-${formId}`]) {\n return JSON.parse(window.localStorage[`f7form-${formId}`]);\n }\n if (app.form.data[`form-${formId}`]) {\n return app.form.data[`form-${formId}`];\n }\n return undefined;\n },\n remove(form) {\n const app = this;\n const window = getWindow();\n let formId = form;\n const $formEl = $(form);\n if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {\n formId = $formEl.attr('id');\n }\n\n // Delete form data from app.formsData\n if (app.form.data[`form-${formId}`]) {\n app.form.data[`form-${formId}`] = '';\n delete app.form.data[`form-${formId}`];\n }\n\n // Delete form data from local storage also\n if (window.localStorage[`f7form-${formId}`]) {\n window.localStorage[`f7form-${formId}`] = '';\n window.localStorage.removeItem(`f7form-${formId}`);\n }\n }\n};\n\n// Form Storage\nconst FormStorage = {\n init(formEl) {\n const app = this;\n const $formEl = $(formEl);\n const formId = $formEl.attr('id');\n if (!formId) return;\n const initialData = app.form.getFormData(formId);\n if (initialData) {\n app.form.fillFromData($formEl, initialData);\n }\n function store() {\n const data = app.form.convertToData($formEl);\n if (!data) return;\n app.form.storeFormData(formId, data);\n $formEl.trigger('form:storedata', data);\n app.emit('formStoreData', $formEl[0], data);\n }\n $formEl.on('change submit', store);\n },\n destroy(formEl) {\n const $formEl = $(formEl);\n $formEl.off('change submit');\n }\n};\n\n// Form To/From Data\nfunction formToData(formEl) {\n const app = this;\n const $formEl = $(formEl).eq(0);\n if ($formEl.length === 0) return undefined;\n\n // Form data\n const data = {};\n\n // Skip input types\n const skipTypes = ['submit', 'image', 'button', 'file'];\n const skipNames = [];\n $formEl.find('input, select, textarea').each(inputEl => {\n const $inputEl = $(inputEl);\n if ($inputEl.hasClass('ignore-store-data') || $inputEl.hasClass('no-store-data')) {\n return;\n }\n const name = $inputEl.attr('name');\n const type = $inputEl.attr('type');\n const tag = inputEl.nodeName.toLowerCase();\n if (skipTypes.indexOf(type) >= 0) return;\n if (skipNames.indexOf(name) >= 0 || !name) return;\n if (tag === 'select' && $inputEl.prop('multiple')) {\n skipNames.push(name);\n data[name] = [];\n $formEl.find(`select[name=\"${name}\"] option`).each(el => {\n if (el.selected) data[name].push(el.value);\n });\n } else {\n switch (type) {\n case 'checkbox':\n skipNames.push(name);\n data[name] = [];\n $formEl.find(`input[name=\"${name}\"]`).each(el => {\n if (el.checked) data[name].push(el.value);\n });\n break;\n case 'radio':\n skipNames.push(name);\n $formEl.find(`input[name=\"${name}\"]`).each(el => {\n if (el.checked) data[name] = el.value;\n });\n break;\n default:\n data[name] = $inputEl.val();\n break;\n }\n }\n });\n $formEl.trigger('form:todata', data);\n app.emit('formToData', $formEl[0], data);\n return data;\n}\nfunction formFromData(formEl, formData) {\n const app = this;\n const $formEl = $(formEl).eq(0);\n if (!$formEl.length) return;\n let data = formData;\n const formId = $formEl.attr('id');\n if (!data && formId) {\n data = app.form.getFormData(formId);\n }\n if (!data) return;\n\n // Skip input types\n const skipTypes = ['submit', 'image', 'button', 'file'];\n const skipNames = [];\n $formEl.find('input, select, textarea').each(inputEl => {\n const $inputEl = $(inputEl);\n if ($inputEl.hasClass('ignore-store-data') || $inputEl.hasClass('no-store-data')) {\n return;\n }\n const name = $inputEl.attr('name');\n const type = $inputEl.attr('type');\n const tag = inputEl.nodeName.toLowerCase();\n if (typeof data[name] === 'undefined' || data[name] === null) return;\n if (skipTypes.indexOf(type) >= 0) return;\n if (skipNames.indexOf(name) >= 0 || !name) return;\n if (tag === 'select' && $inputEl.prop('multiple')) {\n skipNames.push(name);\n $formEl.find(`select[name=\"${name}\"] option`).each(el => {\n const selectEl = el;\n if (data[name].indexOf(el.value) >= 0) selectEl.selected = true;else selectEl.selected = false;\n });\n } else {\n switch (type) {\n case 'checkbox':\n skipNames.push(name);\n $formEl.find(`input[name=\"${name}\"]`).each(el => {\n const checkboxEl = el;\n if (data[name].indexOf(el.value) >= 0) checkboxEl.checked = true;else checkboxEl.checked = false;\n });\n break;\n case 'radio':\n skipNames.push(name);\n $formEl.find(`input[name=\"${name}\"]`).each(el => {\n const radioEl = el;\n if (data[name] === el.value) radioEl.checked = true;else radioEl.checked = false;\n });\n break;\n default:\n $inputEl.val(data[name]);\n break;\n }\n }\n if (tag === 'select' || tag === 'input' || tag === 'textarea') {\n $inputEl.trigger('change', 'fromdata');\n }\n });\n $formEl.trigger('form:fromdata', data);\n app.emit('formFromData', $formEl[0], data);\n}\nfunction initAjaxForm() {\n const app = this;\n const window = getWindow();\n const document = getDocument();\n function onSubmitChange(e, fromData) {\n const $formEl = $(this);\n if (e.type === 'change' && !$formEl.hasClass('form-ajax-submit-onchange')) return;\n if (e.type === 'submit') e.preventDefault();\n if (e.type === 'change' && fromData === 'fromdata') return;\n const method = ($formEl.attr('method') || 'GET').toUpperCase();\n const contentType = $formEl.attr('enctype') || $formEl.prop('enctype');\n let url = $formEl.attr('action');\n if (!url) return;\n let data;\n if (method === 'POST') {\n if (contentType === 'application/x-www-form-urlencoded' || contentType === 'application/json') {\n data = app.form.convertToData($formEl[0]);\n if (contentType === 'application/json') {\n data = JSON.stringify(data);\n }\n } else {\n data = new window.FormData($formEl[0]);\n }\n } else {\n data = serializeObject(app.form.convertToData($formEl[0]));\n if (url.includes('?')) {\n url += `&${data}`;\n } else {\n url += `?${data}`;\n }\n }\n $formEl.trigger('formajax:beforesend', {\n data\n });\n app.emit('formAjaxBeforeSend', $formEl[0], data);\n fetch(url, {\n method,\n headers: {\n 'Content-Type': contentType || 'application/x-www-form-urlencoded'\n },\n ...(method === 'POST' || method === 'PUT' ? {\n body: data\n } : {})\n }).then(response => {\n $formEl.trigger('formajax:complete', {\n data,\n response\n });\n app.emit('formAjaxComplete', $formEl[0], data, response);\n $formEl.trigger('formajax:success', {\n data,\n response\n });\n app.emit('formAjaxSuccess', $formEl[0], data, response);\n }).catch(error => {\n $formEl.trigger('formajax:error', {\n data,\n error\n });\n app.emit('formAjaxError', $formEl[0], data, error);\n });\n }\n $(document).on('submit change', 'form.form-ajax-submit, form.form-ajax-submit-onchange', onSubmitChange);\n}\nexport default {\n name: 'form',\n create() {\n const app = this;\n extend(app, {\n form: {\n data: {},\n storeFormData: FormData.store.bind(app),\n getFormData: FormData.get.bind(app),\n removeFormData: FormData.remove.bind(app),\n convertToData: formToData.bind(app),\n fillFromData: formFromData.bind(app),\n storage: {\n init: FormStorage.init.bind(app),\n destroy: FormStorage.destroy.bind(app)\n }\n }\n });\n },\n on: {\n init() {\n const app = this;\n initAjaxForm.call(app);\n },\n tabBeforeRemove(tabEl) {\n const app = this;\n $(tabEl).find('.form-store-data').each(formEl => {\n app.form.storage.destroy(formEl);\n });\n },\n tabMounted(tabEl) {\n const app = this;\n $(tabEl).find('.form-store-data').each(formEl => {\n app.form.storage.init(formEl);\n });\n },\n pageBeforeRemove(page) {\n const app = this;\n page.$el.find('.form-store-data').each(formEl => {\n app.form.storage.destroy(formEl);\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.form-store-data').each(formEl => {\n app.form.storage.init(formEl);\n });\n }\n }\n};","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom7.js';\nimport { bindMethods } from '../../shared/utils.js';\nimport { getDevice } from '../../shared/get-device.js';\nconst Input = {\n ignoreTypes: ['checkbox', 'button', 'submit', 'range', 'radio', 'image'],\n createTextareaResizableShadow() {\n const document = getDocument();\n const $shadowEl = $(document.createElement('textarea'));\n $shadowEl.addClass('textarea-resizable-shadow');\n $shadowEl.prop({\n disabled: true,\n readonly: true\n });\n Input.textareaResizableShadow = $shadowEl;\n },\n textareaResizableShadow: undefined,\n resizeTextarea(textareaEl) {\n const app = this;\n const window = getWindow();\n const $textareaEl = $(textareaEl);\n if (!Input.textareaResizableShadow) {\n Input.createTextareaResizableShadow();\n }\n const $shadowEl = Input.textareaResizableShadow;\n if (!$textareaEl.length) return;\n if (!$textareaEl.hasClass('resizable')) return;\n if (Input.textareaResizableShadow.parents().length === 0) {\n app.$el.append($shadowEl);\n }\n const styles = window.getComputedStyle($textareaEl[0]);\n 'padding-top padding-bottom padding-left padding-right margin-left margin-right margin-top margin-bottom width font-size font-family font-style font-weight line-height font-variant text-transform letter-spacing border box-sizing display'.split(' ').forEach(style => {\n let styleValue = styles[style];\n if ('font-size line-height letter-spacing width'.split(' ').indexOf(style) >= 0) {\n styleValue = styleValue.replace(',', '.');\n }\n $shadowEl.css(style, styleValue);\n });\n const currentHeight = $textareaEl[0].clientHeight;\n $shadowEl.val('');\n const initialHeight = $shadowEl[0].scrollHeight;\n $shadowEl.val($textareaEl.val());\n $shadowEl.css('height', 0);\n const scrollHeight = $shadowEl[0].scrollHeight;\n if (currentHeight !== scrollHeight) {\n if (scrollHeight > initialHeight) {\n $textareaEl.css('height', `${scrollHeight}px`);\n } else if (scrollHeight < currentHeight) {\n $textareaEl.css('height', '');\n }\n if (scrollHeight > initialHeight || scrollHeight < currentHeight) {\n $textareaEl.trigger('textarea:resize', {\n initialHeight,\n currentHeight,\n scrollHeight\n });\n app.emit('textareaResize', {\n initialHeight,\n currentHeight,\n scrollHeight\n });\n }\n }\n },\n validate(inputEl) {\n const $inputEl = $(inputEl);\n if (!$inputEl.length) return true;\n const $itemInputEl = $inputEl.parents('.item-input');\n const $inputWrapEl = $inputEl.parents('.input');\n function unsetReadonly() {\n if ($inputEl[0].f7ValidateReadonly) {\n $inputEl[0].readOnly = false;\n }\n }\n function setReadonly() {\n if ($inputEl[0].f7ValidateReadonly) {\n $inputEl[0].readOnly = true;\n }\n }\n unsetReadonly();\n const validity = $inputEl[0].validity;\n const validationMessage = $inputEl.dataset().errorMessage || $inputEl[0].validationMessage || '';\n if (!validity) {\n setReadonly();\n return true;\n }\n if (!validity.valid) {\n let $errorEl = $inputEl.nextAll('.item-input-error-message, .input-error-message');\n if (validationMessage) {\n if ($errorEl.length === 0) {\n $errorEl = $(``);\n $errorEl.insertAfter($inputEl);\n }\n $errorEl.text(validationMessage);\n }\n if ($errorEl.length > 0) {\n $itemInputEl.addClass('item-input-with-error-message');\n $inputWrapEl.addClass('input-with-error-message');\n }\n $itemInputEl.addClass('item-input-invalid');\n $inputWrapEl.addClass('input-invalid');\n $inputEl.addClass('input-invalid');\n setReadonly();\n return false;\n }\n $itemInputEl.removeClass('item-input-invalid item-input-with-error-message');\n $inputWrapEl.removeClass('input-invalid input-with-error-message');\n $inputEl.removeClass('input-invalid');\n setReadonly();\n return true;\n },\n validateInputs(el) {\n const app = this;\n const validates = $(el).find('input, textarea, select').map(inputEl => app.input.validate(inputEl));\n return validates.indexOf(false) < 0;\n },\n focus(inputEl) {\n const $inputEl = $(inputEl);\n const type = $inputEl.attr('type');\n if (Input.ignoreTypes.indexOf(type) >= 0) return;\n $inputEl.parents('.item-input').addClass('item-input-focused');\n $inputEl.parents('.input').addClass('input-focused');\n $inputEl.addClass('input-focused');\n },\n blur(inputEl) {\n const $inputEl = $(inputEl);\n $inputEl.parents('.item-input').removeClass('item-input-focused');\n $inputEl.parents('.input').removeClass('input-focused');\n $inputEl.removeClass('input-focused');\n },\n checkEmptyState(inputEl) {\n const app = this;\n let $inputEl = $(inputEl);\n if (!$inputEl.is('input, select, textarea, .item-input [contenteditable]')) {\n $inputEl = $inputEl.find('input, select, textarea, .item-input [contenteditable]').eq(0);\n }\n if (!$inputEl.length) return;\n const isContentEditable = $inputEl[0].hasAttribute('contenteditable');\n let value;\n if (isContentEditable) {\n if ($inputEl.find('.text-editor-placeholder').length) value = '';else value = $inputEl.html();\n } else {\n value = $inputEl.val();\n }\n const $itemInputEl = $inputEl.parents('.item-input');\n const $inputWrapEl = $inputEl.parents('.input');\n if (value && typeof value === 'string' && value.trim() !== '' || Array.isArray(value) && value.length > 0) {\n $itemInputEl.addClass('item-input-with-value');\n $inputWrapEl.addClass('input-with-value');\n $inputEl.addClass('input-with-value');\n $inputEl.trigger('input:notempty');\n app.emit('inputNotEmpty', $inputEl[0]);\n } else {\n $itemInputEl.removeClass('item-input-with-value');\n $inputWrapEl.removeClass('input-with-value');\n $inputEl.removeClass('input-with-value');\n $inputEl.trigger('input:empty');\n app.emit('inputEmpty', $inputEl[0]);\n }\n },\n scrollIntoView(inputEl, duration, centered, force) {\n if (duration === void 0) {\n duration = 0;\n }\n const $inputEl = $(inputEl);\n const $scrollableEl = $inputEl.parents('.page-content, .panel, .card-expandable .card-content').eq(0);\n if (!$scrollableEl.length) {\n return false;\n }\n const contentHeight = $scrollableEl[0].offsetHeight;\n const contentScrollTop = $scrollableEl[0].scrollTop;\n const contentPaddingTop = parseInt($scrollableEl.css('padding-top'), 10);\n const contentPaddingBottom = parseInt($scrollableEl.css('padding-bottom'), 10);\n const contentOffsetTop = $scrollableEl.offset().top - contentScrollTop;\n const inputOffsetTop = $inputEl.offset().top - contentOffsetTop;\n const inputHeight = $inputEl[0].offsetHeight;\n const min = inputOffsetTop + contentScrollTop - contentPaddingTop;\n const max = inputOffsetTop + contentScrollTop - contentHeight + contentPaddingBottom + inputHeight;\n const centeredPosition = min + (max - min) / 2;\n if (contentScrollTop > min) {\n $scrollableEl.scrollTop(centered ? centeredPosition : min, duration);\n return true;\n }\n if (contentScrollTop < max) {\n $scrollableEl.scrollTop(centered ? centeredPosition : max, duration);\n return true;\n }\n if (force) {\n $scrollableEl.scrollTop(centered ? centeredPosition : max, duration);\n }\n return false;\n },\n init() {\n const app = this;\n const device = getDevice();\n const window = getWindow();\n const document = getDocument();\n Input.createTextareaResizableShadow();\n function onFocus() {\n const inputEl = this;\n if (app.params.input.scrollIntoViewOnFocus) {\n if (device.android) {\n $(window).once('resize', () => {\n if (document && document.activeElement === inputEl) {\n app.input.scrollIntoView(inputEl, app.params.input.scrollIntoViewDuration, app.params.input.scrollIntoViewCentered, app.params.input.scrollIntoViewAlways);\n }\n });\n } else {\n app.input.scrollIntoView(inputEl, app.params.input.scrollIntoViewDuration, app.params.input.scrollIntoViewCentered, app.params.input.scrollIntoViewAlways);\n }\n }\n app.input.focus(inputEl);\n }\n function onBlur() {\n const $inputEl = $(this);\n const tag = $inputEl[0].nodeName.toLowerCase();\n app.input.blur($inputEl);\n if ($inputEl.dataset().validate || $inputEl.attr('validate') !== null || $inputEl.attr('data-validate-on-blur') !== null) {\n app.input.validate($inputEl);\n }\n // Resize textarea\n if (tag === 'textarea' && $inputEl.hasClass('resizable')) {\n if (Input.textareaResizableShadow) Input.textareaResizableShadow.remove();\n }\n }\n function onChange() {\n const $inputEl = $(this);\n const type = $inputEl.attr('type');\n const tag = $inputEl[0].nodeName.toLowerCase();\n const isContentEditable = $inputEl[0].hasAttribute('contenteditable');\n if (Input.ignoreTypes.indexOf(type) >= 0) return;\n\n // Check Empty State\n app.input.checkEmptyState($inputEl);\n if (isContentEditable) return;\n\n // Check validation\n if ($inputEl.attr('data-validate-on-blur') === null && ($inputEl.dataset().validate || $inputEl.attr('validate') !== null)) {\n app.input.validate($inputEl);\n }\n\n // Resize textarea\n if (tag === 'textarea' && $inputEl.hasClass('resizable')) {\n app.input.resizeTextarea($inputEl);\n }\n }\n function onInvalid(e) {\n const $inputEl = $(this);\n if ($inputEl.attr('data-validate-on-blur') === null && ($inputEl.dataset().validate || $inputEl.attr('validate') !== null)) {\n e.preventDefault();\n app.input.validate($inputEl);\n }\n }\n function clearInput() {\n const $clicked = $(this);\n const $inputEl = $clicked.siblings('input, textarea').eq(0);\n const previousValue = $inputEl.val();\n $inputEl.val('').trigger('input change').focus().trigger('input:clear', previousValue);\n app.emit('inputClear', previousValue);\n }\n function preventDefault(e) {\n e.preventDefault();\n }\n $(document).on('click', '.input-clear-button', clearInput);\n $(document).on('mousedown', '.input-clear-button', preventDefault);\n $(document).on('change input', 'input, textarea, select, .item-input [contenteditable]', onChange, true);\n $(document).on('focus', 'input, textarea, select, .item-input [contenteditable]', onFocus, true);\n $(document).on('blur', 'input, textarea, select, .item-input [contenteditable]', onBlur, true);\n $(document).on('invalid', 'input, textarea, select', onInvalid, true);\n }\n};\nexport default {\n name: 'input',\n params: {\n input: {\n scrollIntoViewOnFocus: undefined,\n scrollIntoViewCentered: false,\n scrollIntoViewDuration: 0,\n scrollIntoViewAlways: false\n }\n },\n create() {\n const app = this;\n if (typeof app.params.input.scrollIntoViewOnFocus === 'undefined') {\n app.params.input.scrollIntoViewOnFocus = getDevice().android;\n }\n bindMethods(app, {\n input: Input\n });\n },\n on: {\n init() {\n const app = this;\n app.input.init();\n },\n tabMounted(tabEl) {\n const app = this;\n const $tabEl = $(tabEl);\n $tabEl.find('.item-input, .input').each(itemInputEl => {\n const $itemInputEl = $(itemInputEl);\n $itemInputEl.find('input, select, textarea, [contenteditable]').each(inputEl => {\n const $inputEl = $(inputEl);\n if (Input.ignoreTypes.indexOf($inputEl.attr('type')) >= 0) return;\n app.input.checkEmptyState($inputEl);\n });\n });\n $tabEl.find('textarea.resizable').each(textareaEl => {\n app.input.resizeTextarea(textareaEl);\n });\n },\n pageInit(page) {\n const app = this;\n const $pageEl = page.$el;\n $pageEl.find('.item-input, .input').each(itemInputEl => {\n const $itemInputEl = $(itemInputEl);\n $itemInputEl.find('input, select, textarea, [contenteditable]').each(inputEl => {\n const $inputEl = $(inputEl);\n if (Input.ignoreTypes.indexOf($inputEl.attr('type')) >= 0) return;\n app.input.checkEmptyState($inputEl);\n });\n });\n $pageEl.find('textarea.resizable').each(textareaEl => {\n app.input.resizeTextarea(textareaEl);\n });\n },\n 'panelBreakpoint panelCollapsedBreakpoint panelResize panelOpen panelSwipeOpen resize viewMasterDetailBreakpoint': function onPanelOpen(instance) {\n const app = this;\n if (instance && instance.$el) {\n instance.$el.find('textarea.resizable').each(textareaEl => {\n app.input.resizeTextarea(textareaEl);\n });\n } else {\n $('textarea.resizable').each(textareaEl => {\n app.input.resizeTextarea(textareaEl);\n });\n }\n }\n }\n};","import $ from '../../shared/dom7.js';\nimport { extend, now, nextTick, deleteProps } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\nimport { getSupport } from '../../shared/get-support.js';\nclass Toggle extends Framework7Class {\n constructor(app, params) {\n if (params === void 0) {\n params = {};\n }\n super(params, [app]);\n const toggle = this;\n const support = getSupport();\n const defaults = {};\n\n // Extend defaults with modules params\n toggle.useModulesParams(defaults);\n toggle.params = extend(defaults, params);\n const el = toggle.params.el;\n if (!el) return toggle;\n const $el = $(el);\n if ($el.length === 0) return toggle;\n if ($el[0].f7Toggle) return $el[0].f7Toggle;\n const $inputEl = $el.children('input[type=\"checkbox\"]');\n extend(toggle, {\n app,\n $el,\n el: $el[0],\n $inputEl,\n inputEl: $inputEl[0],\n disabled: $el.hasClass('disabled') || $inputEl.hasClass('disabled') || $inputEl.attr('disabled') || $inputEl[0].disabled\n });\n Object.defineProperty(toggle, 'checked', {\n enumerable: true,\n configurable: true,\n set(checked) {\n if (!toggle || typeof toggle.$inputEl === 'undefined') return;\n if (toggle.checked === checked) return;\n $inputEl[0].checked = checked;\n toggle.$inputEl.trigger('change');\n },\n get() {\n return $inputEl[0].checked;\n }\n });\n $el[0].f7Toggle = toggle;\n let isTouched;\n const touchesStart = {};\n let isScrolling;\n let touchesDiff;\n let toggleWidth;\n let touchStartTime;\n let touchStartChecked;\n function handleTouchStart(e) {\n if (isTouched || toggle.disabled) return;\n touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n touchesDiff = 0;\n isTouched = true;\n isScrolling = undefined;\n touchStartTime = now();\n touchStartChecked = toggle.checked;\n toggleWidth = $el[0].offsetWidth;\n nextTick(() => {\n if (isTouched) {\n $el.addClass('toggle-active-state');\n }\n });\n }\n function handleTouchMove(e) {\n if (!isTouched || toggle.disabled) return;\n const pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n const pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n const inverter = app.rtl ? -1 : 1;\n if (typeof isScrolling === 'undefined') {\n isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));\n }\n if (isScrolling) {\n isTouched = false;\n return;\n }\n e.preventDefault();\n touchesDiff = pageX - touchesStart.x;\n let changed;\n if (touchesDiff * inverter < 0 && Math.abs(touchesDiff) > toggleWidth / 3 && touchStartChecked) {\n changed = true;\n }\n if (touchesDiff * inverter > 0 && Math.abs(touchesDiff) > toggleWidth / 3 && !touchStartChecked) {\n changed = true;\n }\n if (changed) {\n touchesStart.x = pageX;\n toggle.checked = !touchStartChecked;\n touchStartChecked = !touchStartChecked;\n }\n }\n function handleTouchEnd() {\n if (!isTouched || toggle.disabled) {\n if (isScrolling) $el.removeClass('toggle-active-state');\n isTouched = false;\n return;\n }\n const inverter = app.rtl ? -1 : 1;\n isTouched = false;\n $el.removeClass('toggle-active-state');\n let changed;\n if (now() - touchStartTime < 300) {\n if (touchesDiff * inverter < 0 && touchStartChecked) {\n changed = true;\n }\n if (touchesDiff * inverter > 0 && !touchStartChecked) {\n changed = true;\n }\n if (changed) {\n toggle.checked = !touchStartChecked;\n }\n }\n }\n function handleInputChange() {\n toggle.$el.trigger('toggle:change');\n toggle.emit('local::change toggleChange', toggle);\n }\n toggle.attachEvents = function attachEvents() {\n const passive = support.passiveListener ? {\n passive: true\n } : false;\n $el.on(app.touchEvents.start, handleTouchStart, passive);\n app.on('touchmove', handleTouchMove);\n app.on('touchend:passive', handleTouchEnd);\n toggle.$inputEl.on('change', handleInputChange);\n };\n toggle.detachEvents = function detachEvents() {\n const passive = support.passiveListener ? {\n passive: true\n } : false;\n $el.off(app.touchEvents.start, handleTouchStart, passive);\n app.off('touchmove', handleTouchMove);\n app.off('touchend:passive', handleTouchEnd);\n toggle.$inputEl.off('change', handleInputChange);\n };\n\n // Install Modules\n toggle.useModules();\n\n // Init\n toggle.init();\n }\n toggle() {\n const toggle = this;\n toggle.checked = !toggle.checked;\n }\n init() {\n const toggle = this;\n toggle.attachEvents();\n }\n destroy() {\n let toggle = this;\n toggle.$el.trigger('toggle:beforedestroy');\n toggle.emit('local::beforeDestroy toggleBeforeDestroy', toggle);\n delete toggle.$el[0].f7Toggle;\n toggle.detachEvents();\n deleteProps(toggle);\n toggle = null;\n }\n}\nexport default Toggle;","import $ from '../../shared/dom7.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nimport Toggle from './toggle-class.js';\nexport default {\n name: 'toggle',\n create() {\n const app = this;\n app.toggle = ConstructorMethods({\n defaultSelector: '.toggle',\n constructor: Toggle,\n app,\n domProp: 'f7Toggle'\n });\n },\n static: {\n Toggle\n },\n on: {\n tabMounted(tabEl) {\n const app = this;\n $(tabEl).find('.toggle-init').each(toggleEl => app.toggle.create({\n el: toggleEl\n }));\n },\n tabBeforeRemove(tabEl) {\n $(tabEl).find('.toggle-init').each(toggleEl => {\n if (toggleEl.f7Toggle) toggleEl.f7Toggle.destroy();\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.toggle-init').each(toggleEl => app.toggle.create({\n el: toggleEl\n }));\n },\n pageBeforeRemove(page) {\n page.$el.find('.toggle-init').each(toggleEl => {\n if (toggleEl.f7Toggle) toggleEl.f7Toggle.destroy();\n });\n }\n },\n vnode: {\n 'toggle-init': {\n insert(vnode) {\n const app = this;\n const toggleEl = vnode.elm;\n app.toggle.create({\n el: toggleEl\n });\n },\n destroy(vnode) {\n const toggleEl = vnode.elm;\n if (toggleEl.f7Toggle) toggleEl.f7Toggle.destroy();\n }\n }\n }\n};","import $ from '../../shared/dom7.js';\nimport { extend, nextTick, deleteProps } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\nimport { getSupport } from '../../shared/get-support.js';\nclass Range extends Framework7Class {\n constructor(app, params) {\n super(params, [app]);\n const range = this;\n const support = getSupport();\n const defaults = {\n el: null,\n inputEl: null,\n dual: false,\n step: 1,\n label: false,\n min: 0,\n max: 100,\n value: 0,\n draggableBar: true,\n vertical: false,\n verticalReversed: false,\n formatLabel: null,\n scale: false,\n scaleSteps: 5,\n scaleSubSteps: 0,\n formatScaleLabel: null,\n limitKnobPosition: app.theme === 'ios'\n };\n\n // Extend defaults with modules params\n range.useModulesParams(defaults);\n range.params = extend(defaults, params);\n const el = range.params.el;\n if (!el) return range;\n const $el = $(el);\n if ($el.length === 0) return range;\n if ($el[0].f7Range) return $el[0].f7Range;\n const dataset = $el.dataset();\n 'step min max value scaleSteps scaleSubSteps'.split(' ').forEach(paramName => {\n if (typeof params[paramName] === 'undefined' && typeof dataset[paramName] !== 'undefined') {\n range.params[paramName] = parseFloat(dataset[paramName]);\n }\n });\n 'dual label vertical verticalReversed scale'.split(' ').forEach(paramName => {\n if (typeof params[paramName] === 'undefined' && typeof dataset[paramName] !== 'undefined') {\n range.params[paramName] = dataset[paramName];\n }\n });\n if (!range.params.value) {\n if (typeof dataset.value !== 'undefined') range.params.value = dataset.value;\n if (typeof dataset.valueLeft !== 'undefined' && typeof dataset.valueRight !== 'undefined') {\n range.params.value = [parseFloat(dataset.valueLeft), parseFloat(dataset.valueRight)];\n }\n }\n let $inputEl;\n if (!range.params.dual) {\n if (range.params.inputEl) {\n $inputEl = $(range.params.inputEl);\n } else if ($el.find('input[type=\"range\"]').length) {\n $inputEl = $el.find('input[type=\"range\"]').eq(0);\n }\n }\n const {\n dual,\n step,\n label,\n min,\n max,\n value,\n vertical,\n verticalReversed,\n scale,\n scaleSteps,\n scaleSubSteps,\n limitKnobPosition\n } = range.params;\n extend(range, {\n app,\n $el,\n el: $el[0],\n $inputEl,\n inputEl: $inputEl ? $inputEl[0] : undefined,\n dual,\n step,\n label,\n min,\n max,\n value,\n previousValue: value,\n vertical,\n verticalReversed,\n scale,\n scaleSteps,\n scaleSubSteps,\n limitKnobPosition\n });\n if ($inputEl) {\n 'step min max'.split(' ').forEach(paramName => {\n if (!params[paramName] && $inputEl.attr(paramName)) {\n range.params[paramName] = parseFloat($inputEl.attr(paramName));\n range[paramName] = parseFloat($inputEl.attr(paramName));\n }\n });\n if (typeof $inputEl.val() !== 'undefined') {\n range.params.value = parseFloat($inputEl.val());\n range.value = parseFloat($inputEl.val());\n }\n }\n\n // Dual\n if (range.dual) {\n $el.addClass('range-slider-dual');\n }\n if (range.label) {\n $el.addClass('range-slider-label');\n }\n\n // Vertical\n if (range.vertical) {\n $el.addClass('range-slider-vertical');\n if (range.verticalReversed) {\n $el.addClass('range-slider-vertical-reversed');\n }\n } else {\n $el.addClass('range-slider-horizontal');\n }\n\n // Check for layout\n const $barEl = $('');\n const $barActiveEl = $('');\n $barEl.append($barActiveEl);\n\n // Create Knobs\n // prettier-ignore\n const knobHTML = `\n \n
\n ${range.label ? '
' : ''}\n
\n `;\n const knobs = [$(knobHTML)];\n if (range.dual) {\n knobs.push($(knobHTML));\n }\n $el.append($barEl);\n knobs.forEach($knobEl => {\n $el.append($knobEl);\n });\n\n // Labels\n const labels = [];\n if (range.label) {\n labels.push(knobs[0].find('.range-knob-label'));\n if (range.dual) {\n labels.push(knobs[1].find('.range-knob-label'));\n }\n }\n\n // Scale\n let $scaleEl;\n if (range.scale && range.scaleSteps >= 1) {\n $scaleEl = $(`\n \n ${range.renderScale()}\n
\n `);\n $el.append($scaleEl);\n }\n extend(range, {\n knobs,\n labels,\n $barEl,\n $barActiveEl,\n $scaleEl\n });\n $el[0].f7Range = range;\n\n // Touch Events\n let isTouched;\n const touchesStart = {};\n let isScrolling;\n let rangeOffset;\n let rangeOffsetLeft;\n let rangeOffsetTop;\n let $touchedKnobEl;\n let dualValueIndex;\n let valueChangedByTouch;\n let targetTouchIdentifier;\n function onTouchChange() {\n valueChangedByTouch = true;\n }\n function handleTouchStart(e) {\n if (isTouched) return;\n if (!range.params.draggableBar) {\n if ($(e.target).closest('.range-knob').length === 0) {\n return;\n }\n }\n valueChangedByTouch = false;\n touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n if (e.type === 'touchstart') {\n targetTouchIdentifier = e.targetTouches[0].identifier;\n }\n isTouched = true;\n isScrolling = undefined;\n rangeOffset = $el.offset();\n rangeOffsetLeft = rangeOffset.left;\n rangeOffsetTop = rangeOffset.top;\n let progress;\n if (range.vertical) {\n progress = (touchesStart.y - rangeOffsetTop) / range.rangeHeight;\n if (!range.verticalReversed) progress = 1 - progress;\n } else if (range.app.rtl) {\n progress = (rangeOffsetLeft + range.rangeWidth - touchesStart.x) / range.rangeWidth;\n } else {\n progress = (touchesStart.x - rangeOffsetLeft) / range.rangeWidth;\n }\n let newValue = progress * (range.max - range.min) + range.min;\n if (range.dual) {\n if (Math.abs(range.value[0] - newValue) < Math.abs(range.value[1] - newValue)) {\n dualValueIndex = 0;\n $touchedKnobEl = range.knobs[0];\n newValue = [newValue, range.value[1]];\n } else {\n dualValueIndex = 1;\n $touchedKnobEl = range.knobs[1];\n newValue = [range.value[0], newValue];\n }\n } else {\n $touchedKnobEl = range.knobs[0];\n newValue = progress * (range.max - range.min) + range.min;\n }\n nextTick(() => {\n if (isTouched) $touchedKnobEl.addClass('range-knob-active-state');\n }, 70);\n range.on('change', onTouchChange);\n range.setValue(newValue, true);\n }\n function handleTouchMove(e) {\n if (!isTouched) return;\n let pageX;\n let pageY;\n if (e.type === 'touchmove') {\n for (let i = 0; i < e.targetTouches.length; i += 1) {\n if (e.targetTouches[i].identifier === targetTouchIdentifier) {\n pageX = e.targetTouches[i].pageX;\n pageY = e.targetTouches[i].pageY;\n }\n }\n } else {\n pageX = e.pageX;\n pageY = e.pageY;\n }\n if (typeof pageX === 'undefined' && typeof pageY === 'undefined') return;\n if (typeof isScrolling === 'undefined' && !range.vertical) {\n isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));\n }\n if (isScrolling) {\n isTouched = false;\n return;\n }\n e.preventDefault();\n let progress;\n if (range.vertical) {\n progress = (pageY - rangeOffsetTop) / range.rangeHeight;\n if (!range.verticalReversed) progress = 1 - progress;\n } else if (range.app.rtl) {\n progress = (rangeOffsetLeft + range.rangeWidth - pageX) / range.rangeWidth;\n } else {\n progress = (pageX - rangeOffsetLeft) / range.rangeWidth;\n }\n let newValue = progress * (range.max - range.min) + range.min;\n if (range.dual) {\n let leftValue;\n let rightValue;\n if (dualValueIndex === 0) {\n leftValue = newValue;\n rightValue = range.value[1];\n if (leftValue > rightValue) {\n rightValue = leftValue;\n }\n } else {\n leftValue = range.value[0];\n rightValue = newValue;\n if (rightValue < leftValue) {\n leftValue = rightValue;\n }\n }\n newValue = [leftValue, rightValue];\n }\n range.setValue(newValue, true);\n }\n function handleTouchEnd(e) {\n if (e.type === 'touchend') {\n let touchEnded;\n for (let i = 0; i < e.changedTouches.length; i += 1) {\n if (e.changedTouches[i].identifier === targetTouchIdentifier) touchEnded = true;\n }\n if (!touchEnded) return;\n }\n if (!isTouched) {\n if (isScrolling) $touchedKnobEl.removeClass('range-knob-active-state');\n isTouched = false;\n return;\n }\n range.off('change', onTouchChange);\n isTouched = false;\n $touchedKnobEl.removeClass('range-knob-active-state');\n if (valueChangedByTouch && range.$inputEl && !range.dual) {\n range.$inputEl.trigger('change');\n }\n valueChangedByTouch = false;\n if (typeof range.previousValue !== 'undefined') {\n if (range.dual && (range.previousValue[0] !== range.value[0] || range.previousValue[1] !== range.value[1]) || !range.dual && range.previousValue !== range.value) {\n range.$el.trigger('range:changed', range.value);\n range.emit('local::changed rangeChanged', range, range.value);\n }\n }\n }\n function handleResize() {\n range.calcSize();\n range.layout();\n }\n let parentModals;\n let parentPanel;\n let parentPage;\n range.attachEvents = function attachEvents() {\n const passive = support.passiveListener ? {\n passive: true\n } : false;\n range.$el.on(app.touchEvents.start, handleTouchStart, passive);\n app.on('touchmove', handleTouchMove);\n app.on('touchend:passive', handleTouchEnd);\n app.on('tabShow', handleResize);\n app.on('resize', handleResize);\n parentModals = range.$el.parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast');\n parentModals.on('modal:open', handleResize);\n parentPanel = range.$el.parents('.panel');\n parentPanel.on('panel:open panel:resize', handleResize);\n parentPage = range.$el.parents('.page').eq(0);\n parentPage.on('page:reinit', handleResize);\n };\n range.detachEvents = function detachEvents() {\n const passive = support.passiveListener ? {\n passive: true\n } : false;\n range.$el.off(app.touchEvents.start, handleTouchStart, passive);\n app.off('touchmove', handleTouchMove);\n app.off('touchend:passive', handleTouchEnd);\n app.off('tabShow', handleResize);\n app.off('resize', handleResize);\n if (parentModals) {\n parentModals.off('modal:open', handleResize);\n }\n if (parentPanel) {\n parentPanel.off('panel:open panel:resize', handleResize);\n }\n if (parentPage) {\n parentPage.off('page:reinit', handleResize);\n }\n parentModals = null;\n parentPanel = null;\n parentPage = null;\n };\n\n // Install Modules\n range.useModules();\n\n // Init\n range.init();\n return range;\n }\n calcSize() {\n const range = this;\n if (range.vertical) {\n const height = range.$el.outerHeight();\n if (height === 0) return;\n range.rangeHeight = height;\n range.knobHeight = range.knobs[0].outerHeight();\n } else {\n const width = range.$el.outerWidth();\n if (width === 0) return;\n range.rangeWidth = width;\n range.knobWidth = range.knobs[0].outerWidth();\n }\n }\n layout() {\n const range = this;\n const {\n app,\n knobWidth,\n knobHeight,\n rangeWidth,\n rangeHeight,\n min,\n max,\n knobs,\n $barActiveEl,\n value,\n label,\n labels,\n vertical,\n verticalReversed,\n limitKnobPosition\n } = range;\n const knobSize = vertical ? knobHeight : knobWidth;\n const rangeSize = vertical ? rangeHeight : rangeWidth;\n // eslint-disable-next-line\n const positionProperty = vertical ? verticalReversed ? 'top' : 'bottom' : app.rtl ? 'right' : 'left';\n if (range.dual) {\n const progress = [(value[0] - min) / (max - min), (value[1] - min) / (max - min)];\n $barActiveEl.css({\n [positionProperty]: `${progress[0] * 100}%`,\n [vertical ? 'height' : 'width']: `${(progress[1] - progress[0]) * 100}%`\n });\n knobs.forEach(($knobEl, knobIndex) => {\n let startPos = rangeSize * progress[knobIndex];\n if (limitKnobPosition) {\n const realStartPos = rangeSize * progress[knobIndex] - knobSize / 2;\n if (realStartPos < 0) startPos = knobSize / 2;\n if (realStartPos + knobSize > rangeSize) startPos = rangeSize - knobSize / 2;\n }\n $knobEl.css(positionProperty, `${startPos}px`);\n if (label) labels[knobIndex].text(range.formatLabel(value[knobIndex], labels[knobIndex][0]));\n });\n } else {\n const progress = (value - min) / (max - min);\n $barActiveEl.css(vertical ? 'height' : 'width', `${progress * 100}%`);\n let startPos = rangeSize * progress;\n if (limitKnobPosition) {\n const realStartPos = rangeSize * progress - knobSize / 2;\n if (realStartPos < 0) startPos = knobSize / 2;\n if (realStartPos + knobSize > rangeSize) startPos = rangeSize - knobSize / 2;\n }\n knobs[0].css(positionProperty, `${startPos}px`);\n if (label) labels[0].text(range.formatLabel(value, labels[0][0]));\n }\n if (range.dual && value.indexOf(min) >= 0 || !range.dual && value === min) {\n range.$el.addClass('range-slider-min');\n } else {\n range.$el.removeClass('range-slider-min');\n }\n if (range.dual && value.indexOf(max) >= 0 || !range.dual && value === max) {\n range.$el.addClass('range-slider-max');\n } else {\n range.$el.removeClass('range-slider-max');\n }\n }\n setValue(newValue, byTouchMove) {\n const range = this;\n const {\n step,\n min,\n max\n } = range;\n let valueChanged;\n let oldValue;\n if (range.dual) {\n oldValue = [range.value[0], range.value[1]];\n let newValues = newValue;\n if (!Array.isArray(newValues)) newValues = [newValue, newValue];\n if (newValue[0] > newValue[1]) {\n newValues = [newValues[0], newValues[0]];\n }\n newValues = newValues.map(value => Math.max(Math.min(Math.round(value / step) * step, max), min));\n if (newValues[0] === range.value[0] && newValues[1] === range.value[1]) {\n return range;\n }\n newValues.forEach((value, valueIndex) => {\n range.value[valueIndex] = value;\n });\n valueChanged = oldValue[0] !== newValues[0] || oldValue[1] !== newValues[1];\n range.layout();\n } else {\n oldValue = range.value;\n const value = Math.max(Math.min(Math.round(newValue / step) * step, max), min);\n range.value = value;\n range.layout();\n valueChanged = oldValue !== value;\n }\n if (valueChanged) {\n range.previousValue = oldValue;\n }\n // Events\n if (!valueChanged) return range;\n range.$el.trigger('range:change', range.value);\n if (range.$inputEl && !range.dual) {\n range.$inputEl.val(range.value);\n if (!byTouchMove) {\n range.$inputEl.trigger('input change');\n } else {\n range.$inputEl.trigger('input');\n }\n }\n if (!byTouchMove) {\n range.$el.trigger('range:changed', range.value);\n range.emit('local::changed rangeChanged', range, range.value);\n }\n range.emit('local::change rangeChange', range, range.value);\n return range;\n }\n getValue() {\n return this.value;\n }\n formatLabel(value, labelEl) {\n const range = this;\n if (range.params.formatLabel) return range.params.formatLabel.call(range, value, labelEl);\n return value;\n }\n formatScaleLabel(value) {\n const range = this;\n if (range.params.formatScaleLabel) return range.params.formatScaleLabel.call(range, value);\n return value;\n }\n renderScale() {\n const range = this;\n const {\n app,\n verticalReversed,\n vertical\n } = range;\n\n // eslint-disable-next-line\n const positionProperty = vertical ? verticalReversed ? 'top' : 'bottom' : app.rtl ? 'right' : 'left';\n let html = '';\n Array.from({\n length: range.scaleSteps + 1\n }).forEach((scaleEl, index) => {\n const scaleStepValue = (range.max - range.min) / range.scaleSteps;\n const scaleValue = range.min + scaleStepValue * index;\n const progress = (scaleValue - range.min) / (range.max - range.min);\n html += `${range.formatScaleLabel(scaleValue)}
`;\n if (range.scaleSubSteps && range.scaleSubSteps > 1 && index < range.scaleSteps) {\n Array.from({\n length: range.scaleSubSteps - 1\n }).forEach((subStepEl, subIndex) => {\n const subStep = scaleStepValue / range.scaleSubSteps;\n const scaleSubValue = scaleValue + subStep * (subIndex + 1);\n const subProgress = (scaleSubValue - range.min) / (range.max - range.min);\n html += ``;\n });\n }\n });\n return html;\n }\n updateScale() {\n const range = this;\n if (!range.scale || range.scaleSteps < 1) {\n if (range.$scaleEl) range.$scaleEl.remove();\n delete range.$scaleEl;\n return;\n }\n if (!range.$scaleEl) {\n range.$scaleEl = $('');\n range.$el.append(range.$scaleEl);\n }\n range.$scaleEl.html(range.renderScale());\n }\n init() {\n const range = this;\n range.calcSize();\n range.layout();\n range.attachEvents();\n return range;\n }\n destroy() {\n let range = this;\n range.$el.trigger('range:beforedestroy');\n range.emit('local::beforeDestroy rangeBeforeDestroy', range);\n delete range.$el[0].f7Range;\n range.detachEvents();\n deleteProps(range);\n range = null;\n }\n}\nexport default Range;","import $ from '../../shared/dom7.js';\nimport { extend } from '../../shared/utils.js';\nimport Range from './range-class.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nexport default {\n name: 'range',\n create() {\n const app = this;\n app.range = extend(ConstructorMethods({\n defaultSelector: '.range-slider',\n constructor: Range,\n app,\n domProp: 'f7Range'\n }), {\n getValue(el) {\n if (el === void 0) {\n el = '.range-slider';\n }\n const range = app.range.get(el);\n if (range) return range.getValue();\n return undefined;\n },\n setValue(el, value) {\n if (el === void 0) {\n el = '.range-slider';\n }\n const range = app.range.get(el);\n if (range) return range.setValue(value);\n return undefined;\n }\n });\n },\n static: {\n Range\n },\n on: {\n tabMounted(tabEl) {\n const app = this;\n $(tabEl).find('.range-slider-init').each(rangeEl => new Range(app, {\n el: rangeEl\n }));\n },\n tabBeforeRemove(tabEl) {\n $(tabEl).find('.range-slider-init').each(rangeEl => {\n if (rangeEl.f7Range) rangeEl.f7Range.destroy();\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.range-slider-init').each(rangeEl => new Range(app, {\n el: rangeEl\n }));\n },\n pageBeforeRemove(page) {\n page.$el.find('.range-slider-init').each(rangeEl => {\n if (rangeEl.f7Range) rangeEl.f7Range.destroy();\n });\n }\n },\n vnode: {\n 'range-slider-init': {\n insert(vnode) {\n const rangeEl = vnode.elm;\n const app = this;\n app.range.create({\n el: rangeEl\n });\n },\n destroy(vnode) {\n const rangeEl = vnode.elm;\n if (rangeEl.f7Range) rangeEl.f7Range.destroy();\n }\n }\n }\n};","/* eslint no-control-regex: \"off\" */\nconst defaultDiacriticsRemovalap = [{\n base: 'A',\n letters: '\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F'\n}, {\n base: 'AA',\n letters: '\\uA732'\n}, {\n base: 'AE',\n letters: '\\u00C6\\u01FC\\u01E2'\n}, {\n base: 'AO',\n letters: '\\uA734'\n}, {\n base: 'AU',\n letters: '\\uA736'\n}, {\n base: 'AV',\n letters: '\\uA738\\uA73A'\n}, {\n base: 'AY',\n letters: '\\uA73C'\n}, {\n base: 'B',\n letters: '\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181'\n}, {\n base: 'C',\n letters: '\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E'\n}, {\n base: 'D',\n letters: '\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779'\n}, {\n base: 'DZ',\n letters: '\\u01F1\\u01C4'\n}, {\n base: 'Dz',\n letters: '\\u01F2\\u01C5'\n}, {\n base: 'E',\n letters: '\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E'\n}, {\n base: 'F',\n letters: '\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B'\n}, {\n base: 'G',\n letters: '\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E'\n}, {\n base: 'H',\n letters: '\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D'\n}, {\n base: 'I',\n letters: '\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197'\n}, {\n base: 'J',\n letters: '\\u004A\\u24BF\\uFF2A\\u0134\\u0248'\n}, {\n base: 'K',\n letters: '\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2'\n}, {\n base: 'L',\n letters: '\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780'\n}, {\n base: 'LJ',\n letters: '\\u01C7'\n}, {\n base: 'Lj',\n letters: '\\u01C8'\n}, {\n base: 'M',\n letters: '\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C'\n}, {\n base: 'N',\n letters: '\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4'\n}, {\n base: 'NJ',\n letters: '\\u01CA'\n}, {\n base: 'Nj',\n letters: '\\u01CB'\n}, {\n base: 'O',\n letters: '\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C'\n}, {\n base: 'OI',\n letters: '\\u01A2'\n}, {\n base: 'OO',\n letters: '\\uA74E'\n}, {\n base: 'OU',\n letters: '\\u0222'\n}, {\n base: 'OE',\n letters: '\\u008C\\u0152'\n}, {\n base: 'oe',\n letters: '\\u009C\\u0153'\n}, {\n base: 'P',\n letters: '\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754'\n}, {\n base: 'Q',\n letters: '\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A'\n}, {\n base: 'R',\n letters: '\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782'\n}, {\n base: 'S',\n letters: '\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784'\n}, {\n base: 'T',\n letters: '\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786'\n}, {\n base: 'TZ',\n letters: '\\uA728'\n}, {\n base: 'U',\n letters: '\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244'\n}, {\n base: 'V',\n letters: '\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245'\n}, {\n base: 'VY',\n letters: '\\uA760'\n}, {\n base: 'W',\n letters: '\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72'\n}, {\n base: 'X',\n letters: '\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C'\n}, {\n base: 'Y',\n letters: '\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE'\n}, {\n base: 'Z',\n letters: '\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762'\n}, {\n base: 'a',\n letters: '\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250'\n}, {\n base: 'aa',\n letters: '\\uA733'\n}, {\n base: 'ae',\n letters: '\\u00E6\\u01FD\\u01E3'\n}, {\n base: 'ao',\n letters: '\\uA735'\n}, {\n base: 'au',\n letters: '\\uA737'\n}, {\n base: 'av',\n letters: '\\uA739\\uA73B'\n}, {\n base: 'ay',\n letters: '\\uA73D'\n}, {\n base: 'b',\n letters: '\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253'\n}, {\n base: 'c',\n letters: '\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184'\n}, {\n base: 'd',\n letters: '\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A'\n}, {\n base: 'dz',\n letters: '\\u01F3\\u01C6'\n}, {\n base: 'e',\n letters: '\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD'\n}, {\n base: 'f',\n letters: '\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C'\n}, {\n base: 'g',\n letters: '\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F'\n}, {\n base: 'h',\n letters: '\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265'\n}, {\n base: 'hv',\n letters: '\\u0195'\n}, {\n base: 'i',\n letters: '\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131'\n}, {\n base: 'j',\n letters: '\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249'\n}, {\n base: 'k',\n letters: '\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3'\n}, {\n base: 'l',\n letters: '\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747'\n}, {\n base: 'lj',\n letters: '\\u01C9'\n}, {\n base: 'm',\n letters: '\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F'\n}, {\n base: 'n',\n letters: '\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5'\n}, {\n base: 'nj',\n letters: '\\u01CC'\n}, {\n base: 'o',\n letters: '\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275'\n}, {\n base: 'oi',\n letters: '\\u01A3'\n}, {\n base: 'ou',\n letters: '\\u0223'\n}, {\n base: 'oo',\n letters: '\\uA74F'\n}, {\n base: 'p',\n letters: '\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755'\n}, {\n base: 'q',\n letters: '\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759'\n}, {\n base: 'r',\n letters: '\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783'\n}, {\n base: 's',\n letters: '\\u0073\\u24E2\\uFF53\\u00DF\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B'\n}, {\n base: 't',\n letters: '\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787'\n}, {\n base: 'tz',\n letters: '\\uA729'\n}, {\n base: 'u',\n letters: '\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289'\n}, {\n base: 'v',\n letters: '\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C'\n}, {\n base: 'vy',\n letters: '\\uA761'\n}, {\n base: 'w',\n letters: '\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73'\n}, {\n base: 'x',\n letters: '\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D'\n}, {\n base: 'y',\n letters: '\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF'\n}, {\n base: 'z',\n letters: '\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763'\n}];\nconst diacriticsMap = {};\nfor (let i = 0; i < defaultDiacriticsRemovalap.length; i += 1) {\n const letters = defaultDiacriticsRemovalap[i].letters;\n for (let j = 0; j < letters.length; j += 1) {\n diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base;\n }\n}\nfunction removeDiacritics(str) {\n return str.replace(/[^\\u0000-\\u007E]/g, a => diacriticsMap[a] || a);\n}\nexport default removeDiacritics;","import $ from '../../shared/dom7.js';\nimport { extend, deleteProps } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\nclass Stepper extends Framework7Class {\n constructor(app, params) {\n super(params, [app]);\n const stepper = this;\n const defaults = {\n el: null,\n inputEl: null,\n valueEl: null,\n value: 0,\n formatValue: null,\n step: 1,\n min: 0,\n max: 100,\n watchInput: true,\n autorepeat: false,\n autorepeatDynamic: false,\n wraps: false,\n manualInputMode: false,\n decimalPoint: 4,\n buttonsEndInputMode: true\n };\n\n // Extend defaults with modules params\n stepper.useModulesParams(defaults);\n stepper.params = extend(defaults, params);\n if (stepper.params.value < stepper.params.min) {\n stepper.params.value = stepper.params.min;\n }\n if (stepper.params.value > stepper.params.max) {\n stepper.params.value = stepper.params.max;\n }\n const el = stepper.params.el;\n if (!el) return stepper;\n const $el = $(el);\n if ($el.length === 0) return stepper;\n if ($el[0].f7Stepper) return $el[0].f7Stepper;\n let $inputEl;\n if (stepper.params.inputEl) {\n $inputEl = $(stepper.params.inputEl);\n } else if ($el.find('.stepper-input-wrap').find('input, textarea').length) {\n $inputEl = $el.find('.stepper-input-wrap').find('input, textarea').eq(0);\n }\n if ($inputEl && $inputEl.length) {\n 'step min max'.split(' ').forEach(paramName => {\n if (!params[paramName] && $inputEl.attr(paramName)) {\n stepper.params[paramName] = parseFloat($inputEl.attr(paramName));\n }\n });\n const decimalPoint = parseInt(stepper.params.decimalPoint, 10);\n if (Number.isNaN(decimalPoint)) {\n stepper.params.decimalPoint = 0;\n } else {\n stepper.params.decimalPoint = decimalPoint;\n }\n const inputValue = parseFloat($inputEl.val());\n if (typeof params.value === 'undefined' && !Number.isNaN(inputValue) && (inputValue || inputValue === 0)) {\n stepper.params.value = inputValue;\n }\n }\n let $valueEl;\n if (stepper.params.valueEl) {\n $valueEl = $(stepper.params.valueEl);\n } else if ($el.find('.stepper-value').length) {\n $valueEl = $el.find('.stepper-value').eq(0);\n }\n const $buttonPlusEl = $el.find('.stepper-button-plus');\n const $buttonMinusEl = $el.find('.stepper-button-minus');\n const {\n step,\n min,\n max,\n value,\n decimalPoint\n } = stepper.params;\n extend(stepper, {\n app,\n $el,\n el: $el[0],\n $buttonPlusEl,\n buttonPlusEl: $buttonPlusEl[0],\n $buttonMinusEl,\n buttonMinusEl: $buttonMinusEl[0],\n $inputEl,\n inputEl: $inputEl ? $inputEl[0] : undefined,\n $valueEl,\n valueEl: $valueEl ? $valueEl[0] : undefined,\n step,\n min,\n max,\n value,\n decimalPoint,\n typeModeChanged: false\n });\n $el[0].f7Stepper = stepper;\n\n // Handle Events\n const touchesStart = {};\n let isTouched;\n let isScrolling;\n let preventButtonClick;\n let intervalId;\n let timeoutId;\n let autorepeatAction = null;\n let autorepeatInAction = false;\n let manualInput = false;\n function dynamicRepeat(current, progressions, startsIn, progressionStep, repeatEvery, action) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n if (current === 1) {\n preventButtonClick = true;\n autorepeatInAction = true;\n }\n clearInterval(intervalId);\n action();\n intervalId = setInterval(() => {\n action();\n }, repeatEvery);\n if (current < progressions) {\n dynamicRepeat(current + 1, progressions, startsIn, progressionStep, repeatEvery / 2, action);\n }\n }, current === 1 ? startsIn : progressionStep);\n }\n function onTouchStart(e) {\n if (isTouched) return;\n if (manualInput) {\n return;\n }\n if ($(e.target).closest($buttonPlusEl).length) {\n autorepeatAction = 'increment';\n } else if ($(e.target).closest($buttonMinusEl).length) {\n autorepeatAction = 'decrement';\n }\n if (!autorepeatAction) return;\n touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n isTouched = true;\n isScrolling = undefined;\n const progressions = stepper.params.autorepeatDynamic ? 4 : 1;\n dynamicRepeat(1, progressions, 500, 1000, 300, () => {\n stepper[autorepeatAction]();\n });\n }\n function onTouchMove(e) {\n if (!isTouched) return;\n if (manualInput) {\n return;\n }\n const pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n const pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n if (typeof isScrolling === 'undefined' && !autorepeatInAction) {\n isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));\n }\n const distance = ((pageX - touchesStart.x) ** 2 + (pageY - touchesStart.y) ** 2) ** 0.5;\n if (isScrolling || distance > 20) {\n isTouched = false;\n clearTimeout(timeoutId);\n clearInterval(intervalId);\n }\n }\n function onTouchEnd() {\n clearTimeout(timeoutId);\n clearInterval(intervalId);\n autorepeatAction = null;\n autorepeatInAction = false;\n isTouched = false;\n }\n function onMinusClick() {\n if (manualInput) {\n if (stepper.params.buttonsEndInputMode) {\n manualInput = false;\n stepper.endTypeMode(true);\n }\n return;\n }\n if (preventButtonClick) {\n preventButtonClick = false;\n return;\n }\n stepper.decrement(true);\n }\n function onPlusClick() {\n if (manualInput) {\n if (stepper.params.buttonsEndInputMode) {\n manualInput = false;\n stepper.endTypeMode(true);\n }\n return;\n }\n if (preventButtonClick) {\n preventButtonClick = false;\n return;\n }\n stepper.increment(true);\n }\n function onInputClick(e) {\n if (!e.target.readOnly && stepper.params.manualInputMode) {\n manualInput = true;\n if (typeof e.target.selectionStart === 'number') {\n e.target.selectionStart = e.target.value.length;\n e.target.selectionEnd = e.target.value.length;\n }\n }\n }\n function onInputKey(e) {\n if (e.keyCode === 13 || e.which === 13) {\n e.preventDefault();\n manualInput = false;\n stepper.endTypeMode();\n }\n }\n function onInputBlur() {\n manualInput = false;\n stepper.endTypeMode(true);\n }\n function onInput(e) {\n if (manualInput) {\n stepper.typeValue(e.target.value);\n return;\n }\n if (e.detail && e.detail.sentByF7Stepper) return;\n stepper.setValue(e.target.value, true);\n }\n stepper.attachEvents = function attachEvents() {\n $buttonMinusEl.on('click', onMinusClick);\n $buttonPlusEl.on('click', onPlusClick);\n if (stepper.params.watchInput && $inputEl && $inputEl.length) {\n $inputEl.on('input', onInput);\n $inputEl.on('click', onInputClick);\n $inputEl.on('blur', onInputBlur);\n $inputEl.on('keyup', onInputKey);\n }\n if (stepper.params.autorepeat) {\n app.on('touchstart:passive', onTouchStart);\n app.on('touchmove:active', onTouchMove);\n app.on('touchend:passive', onTouchEnd);\n }\n };\n stepper.detachEvents = function detachEvents() {\n $buttonMinusEl.off('click', onMinusClick);\n $buttonPlusEl.off('click', onPlusClick);\n if (stepper.params.watchInput && $inputEl && $inputEl.length) {\n $inputEl.off('input', onInput);\n $inputEl.off('click', onInputClick);\n $inputEl.off('blur', onInputBlur);\n $inputEl.off('keyup', onInputKey);\n }\n };\n\n // Install Modules\n stepper.useModules();\n\n // Init\n stepper.init();\n return stepper;\n }\n minus() {\n return this.decrement();\n }\n plus() {\n return this.increment();\n }\n decrement() {\n const stepper = this;\n return stepper.setValue(stepper.value - stepper.step, false, true);\n }\n increment() {\n const stepper = this;\n return stepper.setValue(stepper.value + stepper.step, false, true);\n }\n setValue(newValue, forceUpdate, withWraps) {\n const stepper = this;\n const {\n step,\n min,\n max\n } = stepper;\n const oldValue = stepper.value;\n let value = Math.round(newValue / step) * step;\n if (stepper.params.wraps && withWraps) {\n if (value > max) value = min;\n if (value < min) value = max;\n } else {\n value = Math.max(Math.min(value, max), min);\n }\n if (Number.isNaN(value)) {\n value = oldValue;\n }\n stepper.value = value;\n const valueChanged = oldValue !== value;\n\n // Events\n if (!valueChanged && !forceUpdate) return stepper;\n stepper.$el.trigger('stepper:change', stepper.value);\n const formattedValue = stepper.formatValue(stepper.value);\n if (stepper.$inputEl && stepper.$inputEl.length) {\n stepper.$inputEl.val(formattedValue);\n stepper.$inputEl.trigger('input change', {\n sentByF7Stepper: true\n });\n }\n if (stepper.$valueEl && stepper.$valueEl.length) {\n stepper.$valueEl.html(formattedValue);\n }\n stepper.emit('local::change stepperChange', stepper, stepper.value);\n return stepper;\n }\n endTypeMode(noBlur) {\n const stepper = this;\n const {\n min,\n max\n } = stepper;\n let value = parseFloat(stepper.value);\n if (Number.isNaN(value)) value = 0;\n value = Math.max(Math.min(value, max), min);\n stepper.value = value;\n if (!stepper.typeModeChanged) {\n if (stepper.$inputEl && stepper.$inputEl.length && !noBlur) {\n stepper.$inputEl.blur();\n }\n return stepper;\n }\n stepper.typeModeChanged = false;\n stepper.$el.trigger('stepper:change', stepper.value);\n const formattedValue = stepper.formatValue(stepper.value);\n if (stepper.$inputEl && stepper.$inputEl.length) {\n stepper.$inputEl.val(formattedValue);\n stepper.$inputEl.trigger('input change', {\n sentByF7Stepper: true\n });\n if (!noBlur) stepper.$inputEl.blur();\n }\n if (stepper.$valueEl && stepper.$valueEl.length) {\n stepper.$valueEl.html(formattedValue);\n }\n stepper.emit('local::change stepperChange', stepper, stepper.value);\n return stepper;\n }\n typeValue(value) {\n const stepper = this;\n stepper.typeModeChanged = true;\n let inputTxt = String(value);\n if (inputTxt.length === 1 && inputTxt === '-') return stepper;\n if (inputTxt.lastIndexOf('.') + 1 === inputTxt.length || inputTxt.lastIndexOf(',') + 1 === inputTxt.length) {\n if (inputTxt.lastIndexOf('.') !== inputTxt.indexOf('.') || inputTxt.lastIndexOf(',') !== inputTxt.indexOf(',')) {\n inputTxt = inputTxt.slice(0, -1);\n stepper.value = inputTxt;\n stepper.$inputEl.val(stepper.value);\n return stepper;\n }\n } else {\n let newValue = parseFloat(inputTxt.replace(',', '.'));\n if (newValue === 0) {\n stepper.value = inputTxt.replace(',', '.');\n stepper.$inputEl.val(stepper.value);\n return stepper;\n }\n if (Number.isNaN(newValue)) {\n stepper.value = 0;\n stepper.$inputEl.val(stepper.value);\n return stepper;\n }\n const powVal = 10 ** stepper.params.decimalPoint;\n newValue = Math.round(newValue * powVal).toFixed(stepper.params.decimalPoint + 1) / powVal;\n stepper.value = parseFloat(String(newValue).replace(',', '.'));\n stepper.$inputEl.val(stepper.value);\n return stepper;\n }\n stepper.value = inputTxt;\n stepper.$inputEl.val(inputTxt);\n return stepper;\n }\n getValue() {\n return this.value;\n }\n formatValue(value) {\n const stepper = this;\n if (!stepper.params.formatValue) return value;\n return stepper.params.formatValue.call(stepper, value);\n }\n init() {\n const stepper = this;\n stepper.attachEvents();\n if (stepper.$valueEl && stepper.$valueEl.length) {\n const formattedValue = stepper.formatValue(stepper.value);\n stepper.$valueEl.html(formattedValue);\n }\n return stepper;\n }\n destroy() {\n let stepper = this;\n stepper.$el.trigger('stepper:beforedestroy');\n stepper.emit('local::beforeDestroy stepperBeforeDestroy', stepper);\n delete stepper.$el[0].f7Stepper;\n stepper.detachEvents();\n deleteProps(stepper);\n stepper = null;\n }\n}\nexport default Stepper;","import $ from '../../shared/dom7.js';\nimport { extend } from '../../shared/utils.js';\nimport Stepper from './stepper-class.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nexport default {\n name: 'stepper',\n create() {\n const app = this;\n app.stepper = extend(ConstructorMethods({\n defaultSelector: '.stepper',\n constructor: Stepper,\n app,\n domProp: 'f7Stepper'\n }), {\n getValue(el) {\n if (el === void 0) {\n el = '.stepper';\n }\n const stepper = app.stepper.get(el);\n if (stepper) return stepper.getValue();\n return undefined;\n },\n setValue(el, value) {\n if (el === void 0) {\n el = '.stepper';\n }\n const stepper = app.stepper.get(el);\n if (stepper) return stepper.setValue(value);\n return undefined;\n }\n });\n },\n static: {\n Stepper\n },\n on: {\n tabMounted(tabEl) {\n const app = this;\n $(tabEl).find('.stepper-init').each(stepperEl => {\n const dataset = $(stepperEl).dataset();\n app.stepper.create(extend({\n el: stepperEl\n }, dataset || {}));\n });\n },\n tabBeforeRemove(tabEl) {\n $(tabEl).find('.stepper-init').each(stepperEl => {\n if (stepperEl.f7Stepper) stepperEl.f7Stepper.destroy();\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.stepper-init').each(stepperEl => {\n const dataset = $(stepperEl).dataset();\n app.stepper.create(extend({\n el: stepperEl\n }, dataset || {}));\n });\n },\n pageBeforeRemove(page) {\n page.$el.find('.stepper-init').each(stepperEl => {\n if (stepperEl.f7Stepper) stepperEl.f7Stepper.destroy();\n });\n }\n },\n vnode: {\n 'stepper-init': {\n insert(vnode) {\n const app = this;\n const stepperEl = vnode.elm;\n const dataset = $(stepperEl).dataset();\n app.stepper.create(extend({\n el: stepperEl\n }, dataset || {}));\n },\n destroy(vnode) {\n const stepperEl = vnode.elm;\n if (stepperEl.f7Stepper) stepperEl.f7Stepper.destroy();\n }\n }\n }\n};","import $ from '../../shared/dom7.js';\nimport { extend, deleteProps, id, nextTick } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\nimport removeDiacritics from '../searchbar/remove-diacritics.js';\n\n/** @jsx $jsx */\nimport $jsx from '../../shared/$jsx.js';\nclass SmartSelect extends Framework7Class {\n constructor(app, params) {\n if (params === void 0) {\n params = {};\n }\n super(params, [app]);\n const ss = this;\n const defaults = extend({\n on: {}\n }, app.params.smartSelect);\n\n // Extend defaults with modules params\n ss.useModulesParams(defaults);\n ss.params = extend({}, defaults, params);\n ss.app = app;\n const $el = $(ss.params.el).eq(0);\n if ($el.length === 0) return ss;\n if ($el[0].f7SmartSelect) return $el[0].f7SmartSelect;\n const $selectEl = $el.find('select').eq(0);\n if ($selectEl.length === 0) return ss;\n let $valueEl;\n if (ss.params.setValueText) {\n $valueEl = $(ss.params.valueEl);\n if ($valueEl.length === 0) {\n $valueEl = $el.find('.item-after');\n }\n if ($valueEl.length === 0) {\n $valueEl = $('');\n $valueEl.insertAfter($el.find('.item-title'));\n }\n }\n\n // Url\n let url = params.url;\n if (!url) {\n if ($el.attr('href') && $el.attr('href') !== '#') url = $el.attr('href');else if ($selectEl.attr('name')) url = `${$selectEl.attr('name').toLowerCase()}-select/`;\n }\n if (!url) url = ss.params.url;\n const multiple = $selectEl[0].multiple;\n const inputType = multiple ? 'checkbox' : 'radio';\n const selectId = id();\n extend(ss, {\n $el,\n el: $el[0],\n $selectEl,\n selectEl: $selectEl[0],\n $valueEl,\n valueEl: $valueEl && $valueEl[0],\n url,\n multiple,\n inputType,\n id: selectId,\n inputName: `${inputType}-${selectId}`,\n selectName: $selectEl.attr('name'),\n maxLength: $selectEl.attr('maxlength') || params.maxLength\n });\n $el[0].f7SmartSelect = ss;\n\n // Events\n function onClick() {\n ss.open();\n }\n function onChange() {\n const value = ss.$selectEl.val();\n ss.$el.trigger('smartselect:change', value);\n ss.emit('local::change smartSelectChange', ss, value);\n if (ss.vl) {\n ss.vl.clearCache();\n }\n ss.setValueText();\n }\n ss.attachEvents = function attachEvents() {\n $el.on('click', onClick);\n $el.on('change', 'select', onChange);\n };\n ss.detachEvents = function detachEvents() {\n $el.off('click', onClick);\n $el.off('change', 'select', onChange);\n };\n function handleInputChange() {\n let optionEl;\n let text;\n const inputEl = this;\n const value = inputEl.value;\n let optionText = [];\n let displayAs;\n if (inputEl.type === 'checkbox') {\n for (let i = 0; i < ss.selectEl.options.length; i += 1) {\n optionEl = ss.selectEl.options[i];\n if (optionEl.value === value) {\n optionEl.selected = inputEl.checked;\n }\n if (optionEl.selected) {\n displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-value-as');\n text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;\n optionText.push(text.trim());\n }\n }\n if (ss.maxLength) {\n ss.checkMaxLength();\n }\n } else {\n optionEl = ss.$selectEl.find(`option[value=\"${value}\"]`)[0];\n if (!optionEl) {\n optionEl = ss.$selectEl.find('option').filter(optEl => optEl.value === value)[0];\n }\n displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-as');\n text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;\n optionText = [text];\n ss.selectEl.value = value;\n }\n ss.$selectEl.trigger('change');\n if (ss.params.setValueText) {\n ss.formatValueTextContent(optionText);\n }\n if (ss.params.closeOnSelect && ss.inputType === 'radio') {\n ss.close();\n }\n }\n ss.attachInputsEvents = function attachInputsEvents() {\n ss.$containerEl.on('change', 'input[type=\"checkbox\"], input[type=\"radio\"]', handleInputChange);\n };\n ss.detachInputsEvents = function detachInputsEvents() {\n ss.$containerEl.off('change', 'input[type=\"checkbox\"], input[type=\"radio\"]', handleInputChange);\n };\n\n // Install Modules\n ss.useModules();\n\n // Init\n ss.init();\n return ss;\n }\n setValue(value) {\n const ss = this;\n let newValue = value;\n let optionText = [];\n let optionEl;\n let displayAs;\n let text;\n if (ss.multiple) {\n if (!Array.isArray(newValue)) newValue = [newValue];\n for (let i = 0; i < ss.selectEl.options.length; i += 1) {\n optionEl = ss.selectEl.options[i];\n if (newValue.indexOf(optionEl.value) >= 0) {\n optionEl.selected = true;\n } else {\n optionEl.selected = false;\n }\n if (optionEl.selected) {\n displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-value-as');\n text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;\n optionText.push(text.trim());\n }\n }\n } else {\n optionEl = ss.$selectEl.find(`option[value=\"${newValue}\"]`)[0];\n if (optionEl) {\n displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-as');\n text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;\n optionText = [text];\n }\n ss.selectEl.value = newValue;\n }\n if (ss.params.setValueText) {\n ss.formatValueTextContent(optionText);\n }\n ss.$selectEl.trigger('change');\n return ss;\n }\n unsetValue() {\n const ss = this;\n if (ss.params.setValueText) {\n ss.formatValueTextContent([]);\n }\n ss.$selectEl.find('option').each(optionEl => {\n optionEl.selected = false;\n optionEl.checked = false;\n });\n ss.$selectEl[0].value = null;\n if (ss.$containerEl) {\n ss.$containerEl.find(`input[name=\"${ss.inputName}\"][type=\"checkbox\"], input[name=\"${ss.inputName}\"][type=\"radio\"]`).prop('checked', false);\n }\n ss.$selectEl.trigger('change');\n }\n getValue() {\n const ss = this;\n return ss.$selectEl.val();\n }\n get view() {\n const {\n params,\n $el\n } = this;\n let view;\n if (params.view) {\n view = params.view;\n }\n if (!view) {\n view = $el.parents('.view').length && $el.parents('.view')[0].f7View;\n }\n if (!view && params.openIn === 'page') {\n throw Error('Smart Select requires initialized View');\n }\n return view;\n }\n checkMaxLength() {\n const ss = this;\n const $containerEl = ss.$containerEl;\n if (ss.selectEl.selectedOptions.length >= ss.maxLength) {\n $containerEl.find('input[type=\"checkbox\"]').each(inputEl => {\n if (!inputEl.checked) {\n $(inputEl).parents('li').addClass('disabled');\n } else {\n $(inputEl).parents('li').removeClass('disabled');\n }\n });\n } else {\n $containerEl.find('.disabled').removeClass('disabled');\n }\n }\n formatValueTextContent(values) {\n const ss = this;\n const valueFormatted = ss.formatValueText(values);\n if (valueFormatted.includes('<') && valueFormatted.includes('>')) {\n ss.$valueEl.html(valueFormatted);\n } else {\n ss.$valueEl.text(valueFormatted);\n }\n }\n formatValueText(values) {\n const ss = this;\n let textValue;\n if (ss.params.formatValueText) {\n textValue = ss.params.formatValueText.call(ss, values, ss);\n } else {\n textValue = values.join(', ');\n }\n return textValue;\n }\n setValueText(value) {\n const ss = this;\n let valueArray = [];\n if (typeof value !== 'undefined') {\n if (Array.isArray(value)) {\n valueArray = value;\n } else {\n valueArray = [value];\n }\n } else {\n ss.$selectEl.find('option').each(optionEl => {\n const $optionEl = $(optionEl);\n if (optionEl.selected) {\n const displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $optionEl.data('display-value-as');\n if (displayAs && typeof displayAs !== 'undefined') {\n valueArray.push(displayAs);\n } else {\n valueArray.push(optionEl.textContent.trim());\n }\n }\n });\n }\n if (ss.params.setValueText) {\n ss.formatValueTextContent(valueArray);\n }\n }\n getItemsData() {\n const ss = this;\n const theme = ss.app.theme;\n const items = [];\n let previousGroupEl;\n ss.$selectEl.find('option').each(optionEl => {\n const $optionEl = $(optionEl);\n const optionData = $optionEl.dataset();\n const optionImage = optionData.optionImage || ss.params.optionImage;\n const optionIcon = optionData.optionIcon || ss.params.optionIcon;\n const optionIconIos = theme === 'ios' && (optionData.optionIconIos || ss.params.optionIconIos);\n const optionIconMd = theme === 'md' && (optionData.optionIconMd || ss.params.optionIconMd);\n const optionInputIconPosition = optionData.inputIconPosition || ss.params.inputIconPosition || '';\n const optionHasMedia = optionImage || optionIcon || optionIconIos || optionIconMd;\n const optionColor = optionData.optionColor;\n let optionClassName = optionData.optionClass || '';\n if ($optionEl[0].disabled) optionClassName += ' disabled';\n const optionGroupEl = $optionEl.parent('optgroup')[0];\n const optionGroupLabel = optionGroupEl && optionGroupEl.label;\n let optionIsLabel = false;\n if (optionGroupEl && optionGroupEl !== previousGroupEl) {\n optionIsLabel = true;\n previousGroupEl = optionGroupEl;\n items.push({\n groupLabel: optionGroupLabel,\n isLabel: optionIsLabel\n });\n }\n items.push({\n value: $optionEl[0].value,\n text: $optionEl[0].textContent.trim(),\n selected: $optionEl[0].selected,\n groupEl: optionGroupEl,\n groupLabel: optionGroupLabel,\n image: optionImage,\n icon: optionIcon,\n iconIos: optionIconIos,\n iconMd: optionIconMd,\n inputIconPosition: optionInputIconPosition,\n color: optionColor,\n className: optionClassName,\n disabled: $optionEl[0].disabled,\n id: ss.id,\n hasMedia: optionHasMedia,\n checkbox: ss.inputType === 'checkbox',\n radio: ss.inputType === 'radio',\n inputName: ss.inputName,\n inputType: ss.inputType\n });\n });\n ss.items = items;\n return items;\n }\n renderSearchbar() {\n const ss = this;\n if (ss.params.renderSearchbar) return ss.params.renderSearchbar.call(ss);\n return $jsx(\"form\", {\n class: \"searchbar\"\n }, $jsx(\"div\", {\n class: \"searchbar-inner\"\n }, $jsx(\"div\", {\n class: \"searchbar-input-wrap\"\n }, $jsx(\"input\", {\n type: \"search\",\n spellcheck: ss.params.searchbarSpellcheck || 'false',\n placeholder: ss.params.searchbarPlaceholder\n }), $jsx(\"i\", {\n class: \"searchbar-icon\"\n }), $jsx(\"span\", {\n class: \"input-clear-button\"\n })), ss.params.searchbarDisableButton && $jsx(\"span\", {\n class: \"searchbar-disable-button\"\n }, ss.params.searchbarDisableText)));\n }\n renderItem(item, index) {\n const ss = this;\n if (ss.params.renderItem) return ss.params.renderItem.call(ss, item, index);\n function getIconContent(iconValue) {\n if (iconValue === void 0) {\n iconValue = '';\n }\n if (iconValue.indexOf(':') >= 0) {\n return iconValue.split(':')[1];\n }\n return '';\n }\n function getIconClass(iconValue) {\n if (iconValue === void 0) {\n iconValue = '';\n }\n if (iconValue.indexOf(':') >= 0) {\n let className = iconValue.split(':')[0];\n if (className === 'f7') className = 'f7-icons';\n if (className === 'material') className = 'material-icons';\n return className;\n }\n return iconValue;\n }\n let itemHtml;\n if (item.isLabel) {\n itemHtml = `- ${item.groupLabel}
`;\n } else {\n let selected = item.selected;\n let disabled;\n if (ss.params.virtualList) {\n const ssValue = ss.getValue();\n selected = ss.multiple ? ssValue.indexOf(item.value) >= 0 : ssValue === item.value;\n if (ss.multiple) {\n disabled = ss.multiple && !selected && ssValue.length === parseInt(ss.maxLength, 10);\n }\n }\n const {\n icon,\n iconIos,\n iconMd\n } = item;\n const hasIcon = icon || iconIos || iconMd;\n const iconContent = getIconContent(icon || iconIos || iconMd || '');\n const iconClass = getIconClass(icon || iconIos || iconMd || '');\n itemHtml = $jsx(\"li\", {\n class: `${item.className || ''}${disabled ? ' disabled' : ''}`\n }, $jsx(\"label\", {\n class: `item-${item.inputType} ${item.inputIconPosition ? `item-${item.inputType}-icon-${item.inputIconPosition}` : ''} item-content`\n }, $jsx(\"input\", {\n type: item.inputType,\n name: item.inputName,\n value: item.value,\n _checked: selected\n }), $jsx(\"i\", {\n class: `icon icon-${item.inputType}`\n }), item.hasMedia && $jsx(\"div\", {\n class: \"item-media\"\n }, hasIcon && $jsx(\"i\", {\n class: `icon ${iconClass}`\n }, iconContent), item.image && $jsx(\"img\", {\n src: item.image\n })), $jsx(\"div\", {\n class: \"item-inner\"\n }, $jsx(\"div\", {\n class: `item-title${item.color ? ` text-color-${item.color}` : ''}`\n }, item.text))));\n }\n return itemHtml;\n }\n renderItems() {\n const ss = this;\n if (ss.params.renderItems) return ss.params.renderItems.call(ss, ss.items);\n const itemsHtml = `\n ${ss.items.map((item, index) => `${ss.renderItem(item, index)}`).join('')}\n `;\n return itemsHtml;\n }\n renderPage() {\n const ss = this;\n if (ss.params.renderPage) return ss.params.renderPage.call(ss, ss.items);\n let pageTitle = ss.params.pageTitle;\n if (typeof pageTitle === 'undefined') {\n const $itemTitleEl = ss.$el.find('.item-title');\n pageTitle = $itemTitleEl.length ? $itemTitleEl.text().trim() : '';\n }\n const cssClass = ss.params.cssClass;\n return $jsx(\"div\", {\n class: `page smart-select-page ${cssClass}`,\n \"data-name\": \"smart-select-page\",\n \"data-select-name\": ss.selectName\n }, $jsx(\"div\", {\n class: `navbar ${ss.params.navbarColorTheme ? `color-${ss.params.navbarColorTheme}` : ''}`\n }, $jsx(\"div\", {\n class: \"navbar-bg\"\n }), $jsx(\"div\", {\n class: `navbar-inner sliding ${ss.params.navbarColorTheme ? `color-${ss.params.navbarColorTheme}` : ''}`\n }, $jsx(\"div\", {\n class: \"left\"\n }, $jsx(\"a\", {\n class: \"link back\"\n }, $jsx(\"i\", {\n class: \"icon icon-back\"\n }), $jsx(\"span\", {\n class: \"if-not-md\"\n }, ss.params.pageBackLinkText))), pageTitle && $jsx(\"div\", {\n class: \"title\"\n }, pageTitle), ss.params.searchbar && $jsx(\"div\", {\n class: \"subnavbar\"\n }, ss.renderSearchbar()))), ss.params.searchbar && $jsx(\"div\", {\n class: \"searchbar-backdrop\"\n }), $jsx(\"div\", {\n class: \"page-content\"\n }, $jsx(\"div\", {\n class: `list list-outline-ios list-strong-ios list-dividers-ios smart-select-list-${ss.id} ${ss.params.virtualList ? ' virtual-list' : ''} ${ss.params.formColorTheme ? `color-${ss.params.formColorTheme}` : ''}`\n }, $jsx(\"ul\", null, !ss.params.virtualList && ss.renderItems(ss.items)))));\n }\n renderPopup() {\n const ss = this;\n if (ss.params.renderPopup) return ss.params.renderPopup.call(ss, ss.items);\n let pageTitle = ss.params.pageTitle;\n if (typeof pageTitle === 'undefined') {\n const $itemTitleEl = ss.$el.find('.item-title');\n pageTitle = $itemTitleEl.length ? $itemTitleEl.text().trim() : '';\n }\n const cssClass = ss.params.cssClass || '';\n return $jsx(\"div\", {\n class: `popup smart-select-popup ${cssClass} ${ss.params.popupTabletFullscreen ? 'popup-tablet-fullscreen' : ''}`,\n \"data-select-name\": ss.selectName\n }, $jsx(\"div\", {\n class: \"view\"\n }, $jsx(\"div\", {\n class: `page smart-select-page ${ss.params.searchbar ? 'page-with-subnavbar' : ''}`,\n \"data-name\": \"smart-select-page\"\n }, $jsx(\"div\", {\n class: `navbar ${ss.params.navbarColorTheme ? `color-${ss.params.navbarColorTheme}` : ''}`\n }, $jsx(\"div\", {\n class: \"navbar-bg\"\n }), $jsx(\"div\", {\n class: \"navbar-inner sliding\"\n }, pageTitle && $jsx(\"div\", {\n class: \"title\"\n }, pageTitle), $jsx(\"div\", {\n class: \"right\"\n }, $jsx(\"a\", {\n class: \"link popup-close\",\n \"data-popup\": `.smart-select-popup[data-select-name='${ss.selectName}']`\n }, ss.params.popupCloseLinkText)), ss.params.searchbar && $jsx(\"div\", {\n class: \"subnavbar\"\n }, ss.renderSearchbar()))), ss.params.searchbar && $jsx(\"div\", {\n class: \"searchbar-backdrop\"\n }), $jsx(\"div\", {\n class: \"page-content\"\n }, $jsx(\"div\", {\n class: `list list-outline-ios list-strong-ios list-dividers-ios smart-select-list-${ss.id} ${ss.params.virtualList ? ' virtual-list' : ''} ${ss.params.formColorTheme ? `color-${ss.params.formColorTheme}` : ''}`\n }, $jsx(\"ul\", null, !ss.params.virtualList && ss.renderItems(ss.items)))))));\n }\n renderSheet() {\n const ss = this;\n if (ss.params.renderSheet) return ss.params.renderSheet.call(ss, ss.items);\n const cssClass = ss.params.cssClass;\n // prettier-ignore\n return $jsx(\"div\", {\n class: `sheet-modal smart-select-sheet ${cssClass}`,\n \"data-select-name\": ss.selectName\n }, $jsx(\"div\", {\n class: `toolbar toolbar-top ${ss.params.toolbarColorTheme ? `color-${ss.params.toolbarColorTheme}` : ''}`\n }, $jsx(\"div\", {\n class: \"toolbar-inner\"\n }, $jsx(\"div\", {\n class: \"left\"\n }), $jsx(\"div\", {\n class: \"right\"\n }, $jsx(\"a\", {\n class: \"link sheet-close\"\n }, ss.params.sheetCloseLinkText)))), $jsx(\"div\", {\n class: \"sheet-modal-inner\"\n }, $jsx(\"div\", {\n class: \"page-content\"\n }, $jsx(\"div\", {\n class: `list list-strong-ios list-dividers-ios smart-select-list-${ss.id} ${ss.params.virtualList ? ' virtual-list' : ''} ${ss.params.formColorTheme ? `color-${ss.params.formColorTheme}` : ''}`\n }, $jsx(\"ul\", null, !ss.params.virtualList && ss.renderItems(ss.items))))));\n }\n renderPopover() {\n const ss = this;\n if (ss.params.renderPopover) return ss.params.renderPopover.call(ss, ss.items);\n const cssClass = ss.params.cssClass;\n // prettier-ignore\n return $jsx(\"div\", {\n class: `popover smart-select-popover ${cssClass}`,\n \"data-select-name\": ss.selectName\n }, $jsx(\"div\", {\n class: \"popover-inner\"\n }, $jsx(\"div\", {\n class: `list list-strong-ios list-dividers-ios smart-select-list-${ss.id} ${ss.params.virtualList ? ' virtual-list' : ''} ${ss.params.formColorTheme ? `color-${ss.params.formColorTheme}` : ''}`\n }, $jsx(\"ul\", null, !ss.params.virtualList && ss.renderItems(ss.items)))));\n }\n scrollToSelectedItem() {\n const ss = this;\n const {\n params,\n $containerEl\n } = ss;\n if (!ss.opened) return ss;\n if (params.virtualList) {\n let selectedIndex;\n ss.vl.items.forEach((item, index) => {\n if (typeof selectedIndex === 'undefined' && item.selected) {\n selectedIndex = index;\n }\n });\n if (typeof selectedIndex !== 'undefined') {\n ss.vl.scrollToItem(selectedIndex);\n }\n } else {\n const $selectedItemEl = $containerEl.find('input:checked').parents('li');\n if (!$selectedItemEl.length) return ss;\n const $scrollableEl = $containerEl.find('.page-content, .popover-inner');\n if (!$scrollableEl.length) return ss;\n $scrollableEl.scrollTop($selectedItemEl.offset().top - $scrollableEl.offset().top - parseInt($scrollableEl.css('padding-top'), 10));\n }\n return ss;\n }\n onOpen(type, containerEl) {\n const ss = this;\n const app = ss.app;\n const $containerEl = $(containerEl);\n ss.$containerEl = $containerEl;\n ss.openedIn = type;\n ss.opened = true;\n\n // Init VL\n if (ss.params.virtualList) {\n ss.vl = app.virtualList.create({\n el: $containerEl.find('.virtual-list'),\n items: ss.items,\n renderItem: ss.renderItem.bind(ss),\n height: ss.params.virtualListHeight,\n searchByItem(query, item) {\n if (item.text && removeDiacritics(item.text).toLowerCase().indexOf(query.trim().toLowerCase()) >= 0) return true;\n return false;\n }\n });\n }\n if (ss.params.scrollToSelectedItem) {\n ss.scrollToSelectedItem();\n }\n\n // Init SB\n if (ss.params.searchbar) {\n let $searchbarEl = $containerEl.find('.searchbar');\n if (type === 'page' && app.theme === 'ios') {\n $searchbarEl = $(app.navbar.getElByPage($containerEl)).find('.searchbar');\n }\n if (ss.params.appendSearchbarNotFound && (type === 'page' || type === 'popup')) {\n let $notFoundEl = null;\n if (typeof ss.params.appendSearchbarNotFound === 'string') {\n $notFoundEl = $(`${ss.params.appendSearchbarNotFound}
`);\n } else if (typeof ss.params.appendSearchbarNotFound === 'boolean') {\n $notFoundEl = $('Nothing found
');\n } else {\n $notFoundEl = ss.params.appendSearchbarNotFound;\n }\n if ($notFoundEl) {\n $containerEl.find('.page-content').append($notFoundEl[0]);\n }\n }\n const searchbarParams = extend({\n el: $searchbarEl,\n backdropEl: $containerEl.find('.searchbar-backdrop'),\n searchContainer: `.smart-select-list-${ss.id}`,\n searchIn: '.item-title'\n }, typeof ss.params.searchbar === 'object' ? ss.params.searchbar : {});\n ss.searchbar = app.searchbar.create(searchbarParams);\n }\n\n // Check for max length\n if (ss.maxLength) {\n ss.checkMaxLength();\n }\n\n // Close on select\n if (ss.params.closeOnSelect) {\n ss.$containerEl.find(`input[type=\"radio\"][name=\"${ss.inputName}\"]:checked`).parents('label').once('click', () => {\n ss.close();\n });\n }\n\n // Attach input events\n ss.attachInputsEvents();\n ss.$el.trigger('smartselect:open');\n ss.emit('local::open smartSelectOpen', ss);\n }\n onOpened() {\n const ss = this;\n ss.$el.trigger('smartselect:opened');\n ss.emit('local::opened smartSelectOpened', ss);\n }\n onClose() {\n const ss = this;\n if (ss.destroyed) return;\n\n // Destroy VL\n if (ss.vl && ss.vl.destroy) {\n ss.vl.destroy();\n ss.vl = null;\n delete ss.vl;\n }\n\n // Destroy SB\n if (ss.searchbar && ss.searchbar.destroy) {\n ss.searchbar.destroy();\n ss.searchbar = null;\n delete ss.searchbar;\n }\n // Detach events\n ss.detachInputsEvents();\n ss.$el.trigger('smartselect:close');\n ss.emit('local::close smartSelectClose', ss);\n }\n onClosed() {\n const ss = this;\n if (ss.destroyed) return;\n ss.opened = false;\n ss.$containerEl = null;\n delete ss.$containerEl;\n ss.$el.trigger('smartselect:closed');\n ss.emit('local::closed smartSelectClosed', ss);\n }\n openPage() {\n const ss = this;\n if (ss.opened) return ss;\n ss.getItemsData();\n const pageHtml = ss.renderPage(ss.items);\n ss.view.router.navigate({\n url: ss.url,\n route: {\n content: pageHtml,\n path: ss.url,\n on: {\n pageBeforeIn(e, page) {\n ss.onOpen('page', page.el);\n },\n pageAfterIn(e, page) {\n ss.onOpened('page', page.el);\n },\n pageBeforeOut(e, page) {\n ss.onClose('page', page.el);\n },\n pageAfterOut(e, page) {\n ss.onClosed('page', page.el);\n }\n }\n }\n });\n return ss;\n }\n openPopup() {\n const ss = this;\n if (ss.opened) return ss;\n ss.getItemsData();\n const popupHtml = ss.renderPopup(ss.items);\n const popupParams = {\n content: popupHtml,\n push: ss.params.popupPush,\n swipeToClose: ss.params.popupSwipeToClose,\n closeByBackdropClick: ss.params.closeByBackdropClick,\n on: {\n popupOpen(popup) {\n ss.onOpen('popup', popup.el);\n },\n popupOpened(popup) {\n ss.onOpened('popup', popup.el);\n },\n popupClose(popup) {\n ss.onClose('popup', popup.el);\n },\n popupClosed(popup) {\n ss.onClosed('popup', popup.el);\n }\n }\n };\n if (ss.params.routableModals && ss.view) {\n ss.view.router.navigate({\n url: ss.url,\n route: {\n path: ss.url,\n popup: popupParams\n }\n });\n } else {\n ss.modal = ss.app.popup.create(popupParams).open();\n }\n return ss;\n }\n openSheet() {\n const ss = this;\n if (ss.opened) return ss;\n ss.getItemsData();\n const sheetHtml = ss.renderSheet(ss.items);\n const sheetParams = {\n content: sheetHtml,\n backdrop: ss.params.sheetBackdrop,\n scrollToEl: ss.$el,\n closeByOutsideClick: true,\n push: ss.params.sheetPush,\n swipeToClose: ss.params.sheetSwipeToClose,\n closeByBackdropClick: ss.params.closeByBackdropClick,\n on: {\n sheetOpen(sheet) {\n ss.onOpen('sheet', sheet.el);\n },\n sheetOpened(sheet) {\n ss.onOpened('sheet', sheet.el);\n },\n sheetClose(sheet) {\n ss.onClose('sheet', sheet.el);\n },\n sheetClosed(sheet) {\n ss.onClosed('sheet', sheet.el);\n }\n }\n };\n if (ss.params.routableModals && ss.view) {\n ss.view.router.navigate({\n url: ss.url,\n route: {\n path: ss.url,\n sheet: sheetParams\n }\n });\n } else {\n ss.modal = ss.app.sheet.create(sheetParams).open();\n }\n return ss;\n }\n openPopover() {\n const ss = this;\n if (ss.opened) return ss;\n ss.getItemsData();\n const popoverHtml = ss.renderPopover(ss.items);\n const popoverParams = {\n content: popoverHtml,\n targetEl: ss.$el,\n closeByBackdropClick: ss.params.closeByBackdropClick,\n on: {\n popoverOpen(popover) {\n ss.onOpen('popover', popover.el);\n },\n popoverOpened(popover) {\n ss.onOpened('popover', popover.el);\n },\n popoverClose(popover) {\n ss.onClose('popover', popover.el);\n },\n popoverClosed(popover) {\n ss.onClosed('popover', popover.el);\n }\n }\n };\n if (ss.params.routableModals && ss.view) {\n ss.view.router.navigate({\n url: ss.url,\n route: {\n path: ss.url,\n popover: popoverParams\n }\n });\n } else {\n ss.modal = ss.app.popover.create(popoverParams).open();\n }\n return ss;\n }\n open(type) {\n const ss = this;\n if (ss.opened) return ss;\n let prevented = false;\n function prevent() {\n prevented = true;\n }\n if (ss.$el) {\n ss.$el.trigger('smartselect:beforeopen', {\n prevent\n });\n }\n ss.emit('local::beforeOpen smartSelectBeforeOpen', ss, prevent);\n if (prevented) return ss;\n const openIn = type || ss.params.openIn;\n ss[`open${openIn.split('').map((el, index) => {\n if (index === 0) return el.toUpperCase();\n return el;\n }).join('')}`]();\n return ss;\n }\n close() {\n const ss = this;\n if (!ss.opened) return ss;\n if (ss.params.routableModals && ss.view || ss.openedIn === 'page') {\n ss.view.router.back();\n } else {\n ss.modal.once('modalClosed', () => {\n nextTick(() => {\n if (ss.destroyed) return;\n ss.modal.destroy();\n delete ss.modal;\n });\n });\n ss.modal.close();\n }\n return ss;\n }\n init() {\n const ss = this;\n ss.attachEvents();\n ss.setValueText();\n }\n destroy() {\n const ss = this;\n ss.emit('local::beforeDestroy smartSelectBeforeDestroy', ss);\n ss.$el.trigger('smartselect:beforedestroy');\n ss.detachEvents();\n delete ss.$el[0].f7SmartSelect;\n deleteProps(ss);\n ss.destroyed = true;\n }\n}\nexport default SmartSelect;","import $ from '../../shared/dom7.js';\nimport { extend } from '../../shared/utils.js';\nimport SmartSelect from './smart-select-class.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nexport default {\n name: 'smartSelect',\n params: {\n smartSelect: {\n el: undefined,\n valueEl: undefined,\n setValueText: true,\n formatValueText: null,\n openIn: 'page',\n // or 'popup' or 'sheet' or 'popover'\n popupPush: false,\n popupSwipeToClose: undefined,\n // defaults to app\n sheetPush: false,\n sheetSwipeToClose: undefined,\n // defaults to app\n sheetBackdrop: false,\n pageTitle: undefined,\n pageBackLinkText: 'Back',\n popupCloseLinkText: 'Close',\n popupTabletFullscreen: false,\n closeByBackdropClick: true,\n sheetCloseLinkText: 'Done',\n searchbar: false,\n searchbarPlaceholder: 'Search',\n searchbarDisableText: 'Cancel',\n searchbarDisableButton: true,\n searchbarSpellcheck: false,\n closeOnSelect: false,\n virtualList: false,\n virtualListHeight: undefined,\n scrollToSelectedItem: false,\n formColorTheme: undefined,\n navbarColorTheme: undefined,\n routableModals: false,\n url: 'select/',\n inputIconPosition: 'start',\n cssClass: '',\n /*\n Custom render functions\n */\n renderPage: undefined,\n renderPopup: undefined,\n renderSheet: undefined,\n renderPopover: undefined,\n renderItems: undefined,\n renderItem: undefined,\n renderSearchbar: undefined\n }\n },\n static: {\n SmartSelect\n },\n create() {\n const app = this;\n app.smartSelect = extend(ConstructorMethods({\n defaultSelector: '.smart-select',\n constructor: SmartSelect,\n app,\n domProp: 'f7SmartSelect'\n }), {\n open(smartSelectEl) {\n const ss = app.smartSelect.get(smartSelectEl);\n if (ss && ss.open) return ss.open();\n return undefined;\n },\n close(smartSelectEl) {\n const ss = app.smartSelect.get(smartSelectEl);\n if (ss && ss.close) return ss.close();\n return undefined;\n }\n });\n },\n on: {\n tabMounted(tabEl) {\n const app = this;\n $(tabEl).find('.smart-select-init').each(smartSelectEl => {\n app.smartSelect.create(extend({\n el: smartSelectEl\n }, $(smartSelectEl).dataset()));\n });\n },\n tabBeforeRemove(tabEl) {\n $(tabEl).find('.smart-select-init').each(smartSelectEl => {\n if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {\n smartSelectEl.f7SmartSelect.destroy();\n }\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.smart-select-init').each(smartSelectEl => {\n app.smartSelect.create(extend({\n el: smartSelectEl\n }, $(smartSelectEl).dataset()));\n });\n },\n pageBeforeRemove(page) {\n page.$el.find('.smart-select-init').each(smartSelectEl => {\n if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {\n smartSelectEl.f7SmartSelect.destroy();\n }\n });\n }\n },\n clicks: {\n '.smart-select': function open($clickedEl, data) {\n const app = this;\n if (!$clickedEl[0].f7SmartSelect) {\n const ss = app.smartSelect.create(extend({\n el: $clickedEl\n }, data));\n ss.open();\n }\n }\n },\n vnode: {\n 'smart-select-init': {\n insert(vnode) {\n const app = this;\n const smartSelectEl = vnode.elm;\n app.smartSelect.create(extend({\n el: smartSelectEl\n }, $(smartSelectEl).dataset()));\n },\n destroy(vnode) {\n const smartSelectEl = vnode.elm;\n if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {\n smartSelectEl.f7SmartSelect.destroy();\n }\n }\n }\n }\n};","import { extend, nextTick, deleteProps } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\nimport $ from '../../shared/dom7.js';\nimport { getDevice } from '../../shared/get-device.js';\nimport { getSupport } from '../../shared/get-support.js';\n/** @jsx $jsx */\nimport $jsx from '../../shared/$jsx.js';\nclass Calendar extends Framework7Class {\n constructor(app, params) {\n if (params === void 0) {\n params = {};\n }\n super(params, [app]);\n const calendar = this;\n calendar.params = extend({}, app.params.calendar, params);\n let $containerEl;\n if (calendar.params.containerEl) {\n $containerEl = $(calendar.params.containerEl);\n if ($containerEl.length === 0) return calendar;\n }\n let $inputEl;\n if (calendar.params.inputEl) {\n $inputEl = $(calendar.params.inputEl);\n }\n const isHorizontal = calendar.params.direction === 'horizontal';\n let inverter = 1;\n if (isHorizontal) {\n inverter = app.rtl ? -1 : 1;\n }\n extend(calendar, {\n app,\n $containerEl,\n containerEl: $containerEl && $containerEl[0],\n inline: $containerEl && $containerEl.length > 0,\n $inputEl,\n inputEl: $inputEl && $inputEl[0],\n initialized: false,\n opened: false,\n url: calendar.params.url,\n isHorizontal,\n inverter,\n animating: false,\n allowTouchMove: true,\n hasTimePicker: calendar.params.timePicker && !calendar.params.rangePicker && !calendar.params.multiple\n });\n calendar.dayFormatter = date => {\n const formatter = new Intl.DateTimeFormat(calendar.params.locale, {\n day: 'numeric'\n });\n return formatter.format(date).replace(/日/, '');\n };\n calendar.monthFormatter = date => {\n const formatter = new Intl.DateTimeFormat(calendar.params.locale, {\n month: 'long'\n });\n return formatter.format(date);\n };\n calendar.yearFormatter = date => {\n const formatter = new Intl.DateTimeFormat(calendar.params.locale, {\n year: 'numeric'\n });\n return formatter.format(date);\n };\n calendar.timeSelectorFormatter = date => {\n const formatter = new Intl.DateTimeFormat(calendar.params.locale, calendar.params.timePickerFormat);\n return formatter.format(date);\n };\n const timeFormatCheckDate = calendar.timeSelectorFormatter(new Date()).toLowerCase();\n calendar.is12HoursFormat = timeFormatCheckDate.indexOf('pm') >= 0 || timeFormatCheckDate.indexOf('am') >= 0;\n\n // Auto names\n let {\n monthNames,\n monthNamesShort,\n dayNames,\n dayNamesShort\n } = calendar.params;\n const {\n monthNamesIntl,\n monthNamesShortIntl,\n dayNamesIntl,\n dayNamesShortIntl\n } = calendar.getIntlNames();\n if (monthNames === 'auto') monthNames = monthNamesIntl;\n if (monthNamesShort === 'auto') monthNamesShort = monthNamesShortIntl;\n if (dayNames === 'auto') dayNames = dayNamesIntl;\n if (dayNamesShort === 'auto') dayNamesShort = dayNamesShortIntl;\n extend(calendar, {\n monthNames,\n monthNamesShort,\n dayNames,\n dayNamesShort\n });\n function onInputClick() {\n calendar.open();\n }\n function onInputFocus(e) {\n e.preventDefault();\n }\n function onInputClear() {\n calendar.setValue([]);\n if (calendar.opened) {\n calendar.update();\n }\n }\n function onHtmlClick(e) {\n const $targetEl = $(e.target);\n if (calendar.destroyed || !calendar.params) return;\n if (calendar.isPopover()) return;\n if (!calendar.opened || calendar.closing) return;\n if ($targetEl.closest('[class*=\"backdrop\"]').length) return;\n if (calendar.monthPickerPopover || calendar.yearPickerPopover || calendar.timePickerPopover) return;\n if ($inputEl && $inputEl.length > 0) {\n if ($targetEl[0] !== $inputEl[0] && $targetEl.closest('.sheet-modal, .calendar-modal').length === 0) {\n calendar.close();\n }\n } else if ($(e.target).closest('.sheet-modal, .calendar-modal').length === 0) {\n calendar.close();\n }\n }\n\n // Events\n extend(calendar, {\n attachInputEvents() {\n calendar.$inputEl.on('click', onInputClick);\n calendar.$inputEl.on('input:clear', onInputClear);\n if (calendar.params.inputReadOnly) {\n calendar.$inputEl.on('focus mousedown', onInputFocus);\n if (calendar.$inputEl[0]) {\n calendar.$inputEl[0].f7ValidateReadonly = true;\n }\n }\n },\n detachInputEvents() {\n calendar.$inputEl.off('click', onInputClick);\n calendar.$inputEl.off('input:clear', onInputClear);\n if (calendar.params.inputReadOnly) {\n calendar.$inputEl.off('focus mousedown', onInputFocus);\n if (calendar.$inputEl[0]) {\n delete calendar.$inputEl[0].f7ValidateReadonly;\n }\n }\n },\n attachHtmlEvents() {\n app.on('click', onHtmlClick);\n },\n detachHtmlEvents() {\n app.off('click', onHtmlClick);\n }\n });\n calendar.attachCalendarEvents = function attachCalendarEvents() {\n let allowItemClick = true;\n let isTouched;\n let isMoved;\n let touchStartX;\n let touchStartY;\n let touchCurrentX;\n let touchCurrentY;\n let touchStartTime;\n let touchEndTime;\n let currentTranslate;\n let wrapperWidth;\n let wrapperHeight;\n let percentage;\n let touchesDiff;\n let isScrolling;\n const {\n $el,\n $wrapperEl\n } = calendar;\n function handleTouchStart(e) {\n if (isMoved || isTouched || !e.isTrusted) return;\n isTouched = true;\n touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchCurrentX = touchStartX;\n touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n touchCurrentY = touchStartY;\n touchStartTime = new Date().getTime();\n percentage = 0;\n allowItemClick = true;\n isScrolling = undefined;\n currentTranslate = calendar.monthsTranslate;\n }\n function handleTouchMove(e) {\n if (!isTouched || !e.isTrusted) return;\n const {\n isHorizontal: isH\n } = calendar;\n touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n if (typeof isScrolling === 'undefined') {\n isScrolling = !!(isScrolling || Math.abs(touchCurrentY - touchStartY) > Math.abs(touchCurrentX - touchStartX));\n }\n if (isH && isScrolling || !calendar.allowTouchMove) {\n isTouched = false;\n return;\n }\n e.preventDefault();\n if (calendar.animating) {\n isTouched = false;\n return;\n }\n allowItemClick = false;\n if (!isMoved) {\n // First move\n isMoved = true;\n wrapperWidth = $wrapperEl[0].offsetWidth;\n wrapperHeight = $wrapperEl[0].offsetHeight;\n $wrapperEl.transition(0);\n }\n touchesDiff = isH ? touchCurrentX - touchStartX : touchCurrentY - touchStartY;\n percentage = touchesDiff / (isH ? wrapperWidth : wrapperHeight);\n currentTranslate = (calendar.monthsTranslate * calendar.inverter + percentage) * 100;\n\n // Transform wrapper\n $wrapperEl.transform(`translate3d(${isH ? currentTranslate : 0}%, ${isH ? 0 : currentTranslate}%, 0)`);\n }\n function handleTouchEnd(e) {\n if (!isTouched || !isMoved || !e.isTrusted) {\n isTouched = false;\n isMoved = false;\n return;\n }\n isTouched = false;\n isMoved = false;\n touchEndTime = new Date().getTime();\n if (touchEndTime - touchStartTime < 300) {\n if (Math.abs(touchesDiff) < 10) {\n calendar.resetMonth();\n } else if (touchesDiff >= 10) {\n if (app.rtl) calendar.nextMonth();else calendar.prevMonth();\n } else if (app.rtl) calendar.prevMonth();else calendar.nextMonth();\n } else if (percentage <= -0.5) {\n if (app.rtl) calendar.prevMonth();else calendar.nextMonth();\n } else if (percentage >= 0.5) {\n if (app.rtl) calendar.nextMonth();else calendar.prevMonth();\n } else {\n calendar.resetMonth();\n }\n\n // Allow click\n setTimeout(() => {\n allowItemClick = true;\n }, 100);\n }\n function handleDayClick(e) {\n if (!allowItemClick) return;\n let $dayEl = $(e.target).parents('.calendar-day');\n if ($dayEl.length === 0 && $(e.target).hasClass('calendar-day')) {\n $dayEl = $(e.target);\n }\n if ($dayEl.length === 0) return;\n if ($dayEl.hasClass('calendar-day-disabled')) return;\n if (!calendar.params.rangePicker) {\n if ($dayEl.hasClass('calendar-day-next')) calendar.nextMonth();\n if ($dayEl.hasClass('calendar-day-prev')) calendar.prevMonth();\n }\n const dateYear = parseInt($dayEl.attr('data-year'), 10);\n const dateMonth = parseInt($dayEl.attr('data-month'), 10);\n const dateDay = parseInt($dayEl.attr('data-day'), 10);\n calendar.emit('local::dayClick calendarDayClick', calendar, $dayEl[0], dateYear, dateMonth, dateDay);\n if (!$dayEl.hasClass('calendar-day-selected') || calendar.params.multiple || calendar.params.rangePicker) {\n const valueToAdd = new Date(dateYear, dateMonth, dateDay, 0, 0, 0);\n if (calendar.hasTimePicker) {\n if (calendar.value && calendar.value[0]) {\n valueToAdd.setHours(calendar.value[0].getHours(), calendar.value[0].getMinutes());\n } else {\n valueToAdd.setHours(new Date().getHours(), new Date().getMinutes());\n }\n }\n calendar.addValue(valueToAdd);\n }\n if (calendar.params.closeOnSelect) {\n if (calendar.params.rangePicker && calendar.value.length === 2 || !calendar.params.rangePicker) {\n calendar.close();\n }\n }\n }\n function onNextMonthClick() {\n calendar.nextMonth();\n }\n function onPrevMonthClick() {\n calendar.prevMonth();\n }\n function onNextYearClick() {\n calendar.nextYear();\n }\n function onPrevYearClick() {\n calendar.prevYear();\n }\n function onMonthSelectorClick() {\n calendar.openMonthPicker();\n }\n function onYearSelectorClick() {\n calendar.openYearPicker();\n }\n function onTimeSelectorClick() {\n calendar.openTimePicker();\n }\n const passiveListener = app.touchEvents.start === 'touchstart' && getSupport().passiveListener ? {\n passive: true,\n capture: false\n } : false;\n // Selectors clicks\n $el.find('.calendar-prev-month-button').on('click', onPrevMonthClick);\n $el.find('.calendar-next-month-button').on('click', onNextMonthClick);\n $el.find('.calendar-prev-year-button').on('click', onPrevYearClick);\n $el.find('.calendar-next-year-button').on('click', onNextYearClick);\n if (calendar.params.monthPicker) {\n $el.find('.current-month-value').on('click', onMonthSelectorClick);\n }\n if (calendar.params.yearPicker) {\n $el.find('.current-year-value').on('click', onYearSelectorClick);\n }\n if (calendar.hasTimePicker) {\n $el.find('.calendar-time-selector a').on('click', onTimeSelectorClick);\n }\n // Day clicks\n $wrapperEl.on('click', handleDayClick);\n // Touch events\n if (calendar.params.touchMove) {\n $wrapperEl.on(app.touchEvents.start, handleTouchStart, passiveListener);\n app.on('touchmove:active', handleTouchMove);\n app.on('touchend:passive', handleTouchEnd);\n }\n calendar.detachCalendarEvents = function detachCalendarEvents() {\n $el.find('.calendar-prev-month-button').off('click', onPrevMonthClick);\n $el.find('.calendar-next-month-button').off('click', onNextMonthClick);\n $el.find('.calendar-prev-year-button').off('click', onPrevYearClick);\n $el.find('.calendar-next-year-button').off('click', onNextYearClick);\n if (calendar.params.monthPicker) {\n $el.find('.current-month-value').off('click', onMonthSelectorClick);\n }\n if (calendar.params.yearPicker) {\n $el.find('.current-year-value').off('click', onYearSelectorClick);\n }\n if (calendar.hasTimePicker) {\n $el.find('.calendar-time-selector a').off('click', onTimeSelectorClick);\n }\n $wrapperEl.off('click', handleDayClick);\n if (calendar.params.touchMove) {\n $wrapperEl.off(app.touchEvents.start, handleTouchStart, passiveListener);\n app.off('touchmove:active', handleTouchMove);\n app.off('touchend:passive', handleTouchEnd);\n }\n };\n };\n calendar.init();\n return calendar;\n }\n get view() {\n const {\n $inputEl,\n app,\n params\n } = this;\n let view;\n if (params.view) {\n view = params.view;\n } else if ($inputEl) {\n view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;\n }\n if (!view) view = app.views.main;\n return view;\n }\n getIntlNames() {\n const calendar = this;\n const locale = calendar.params.locale;\n const monthNamesIntl = [];\n const monthNamesShortIntl = [];\n const dayNamesIntl = [];\n const dayNamesShortIntl = [];\n const formatterMonthNames = new Intl.DateTimeFormat(locale, {\n month: 'long'\n });\n const formatterMonthNamesShort = new Intl.DateTimeFormat(locale, {\n month: 'short'\n });\n const formatterDayNames = new Intl.DateTimeFormat(locale, {\n weekday: 'long'\n });\n const formatterDayNamesShort = new Intl.DateTimeFormat(locale, {\n weekday: 'short'\n });\n let year;\n let yearStarted;\n let yearEnded;\n for (let i = 0; i < 24; i += 1) {\n const date = new Date().setMonth(i, 1);\n const currentYear = calendar.yearFormatter(date);\n if (year && currentYear !== year) {\n if (yearStarted) yearEnded = true;\n yearStarted = true;\n year = currentYear;\n }\n if (!year) {\n year = currentYear;\n }\n if (yearStarted && year === currentYear && !yearEnded) {\n monthNamesIntl.push(formatterMonthNames.format(date));\n monthNamesShortIntl.push(formatterMonthNamesShort.format(date));\n }\n }\n const weekDay = new Date().getDay();\n for (let i = 0; i < 7; i += 1) {\n const date = new Date().getTime() + (i - weekDay) * 24 * 60 * 60 * 1000;\n dayNamesIntl.push(formatterDayNames.format(date));\n dayNamesShortIntl.push(formatterDayNamesShort.format(date));\n }\n return {\n monthNamesIntl,\n monthNamesShortIntl,\n dayNamesIntl,\n dayNamesShortIntl\n };\n }\n normalizeDate(date) {\n const calendar = this;\n const d = new Date(date);\n if (calendar.hasTimePicker) {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes());\n }\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n }\n normalizeValues(values) {\n const calendar = this;\n let newValues = [];\n if (values && Array.isArray(values)) {\n newValues = values.map(val => calendar.normalizeDate(val));\n }\n return newValues;\n }\n initInput() {\n const calendar = this;\n if (!calendar.$inputEl) return;\n if (calendar.params.inputReadOnly) calendar.$inputEl.prop('readOnly', true);\n }\n isPopover() {\n const calendar = this;\n const {\n app,\n modal,\n params\n } = calendar;\n const device = getDevice();\n if (params.openIn === 'sheet') return false;\n if (modal && modal.type !== 'popover') return false;\n if (!calendar.inline && calendar.inputEl) {\n if (params.openIn === 'popover') return true;\n if (device.ios) {\n return !!device.ipad;\n }\n if (app.width >= 768) {\n return true;\n }\n }\n return false;\n }\n formatDate(d) {\n const calendar = this;\n const date = new Date(d);\n const year = date.getFullYear();\n const month = date.getMonth();\n const month1 = month + 1;\n const day = date.getDate();\n const weekDay = date.getDay();\n const {\n monthNames,\n monthNamesShort,\n dayNames,\n dayNamesShort\n } = calendar;\n const {\n dateFormat,\n locale\n } = calendar.params;\n function twoDigits(number) {\n return number < 10 ? `0${number}` : number;\n }\n if (typeof dateFormat === 'string') {\n const tokens = {\n yyyy: year,\n yy: String(year).substring(2),\n mm: twoDigits(month1),\n m: month1,\n MM: monthNames[month],\n M: monthNamesShort[month],\n dd: twoDigits(day),\n d: day,\n DD: dayNames[weekDay],\n D: dayNamesShort[weekDay]\n };\n if (calendar.params.timePicker) {\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n let hours12 = hours;\n if (hours > 12) hours12 = hours - 12;\n if (hours === 0) hours12 = 12;\n const a = hours >= 12 && hours !== 0 ? 'pm' : 'am';\n Object.assign(tokens, {\n HH: twoDigits(hours),\n H: hours,\n hh: twoDigits(hours12),\n h: hours12,\n ss: twoDigits(seconds),\n s: seconds,\n ':mm': twoDigits(minutes),\n ':m': minutes,\n a,\n A: a.toUpperCase()\n });\n }\n const regexp = new RegExp(Object.keys(tokens).map(t => `(${t})`).join('|'), 'g');\n return dateFormat.replace(regexp, token => {\n if (token in tokens) return tokens[token];\n return token;\n });\n }\n if (typeof dateFormat === 'function') {\n return dateFormat(date);\n }\n // Intl Object\n const formatter = new Intl.DateTimeFormat(locale, dateFormat);\n return formatter.format(date);\n }\n formatValue() {\n const calendar = this;\n const {\n value\n } = calendar;\n if (calendar.params.formatValue) {\n return calendar.params.formatValue.call(calendar, value);\n }\n return value.map(v => calendar.formatDate(v)).join(calendar.params.rangePicker ? ' - ' : ', ');\n }\n addValue(newValue) {\n const calendar = this;\n const {\n multiple,\n rangePicker,\n rangePickerMinDays,\n rangePickerMaxDays\n } = calendar.params;\n if (multiple) {\n if (!calendar.value) calendar.value = [];\n let inValuesIndex;\n for (let i = 0; i < calendar.value.length; i += 1) {\n if (new Date(newValue).getTime() === new Date(calendar.value[i]).getTime()) {\n inValuesIndex = i;\n }\n }\n if (typeof inValuesIndex === 'undefined') {\n calendar.value.push(newValue);\n } else {\n calendar.value.splice(inValuesIndex, 1);\n }\n calendar.updateValue();\n } else if (rangePicker) {\n if (!calendar.value) calendar.value = [];\n if (calendar.value.length === 2 || calendar.value.length === 0) {\n calendar.value = [];\n }\n if (calendar.value.length === 0 || Math.abs(calendar.value[0].getTime() - newValue.getTime()) >= (rangePickerMinDays - 1) * 60 * 60 * 24 * 1000 && (rangePickerMaxDays === 0 || Math.abs(calendar.value[0].getTime() - newValue.getTime()) <= (rangePickerMaxDays - 1) * 60 * 60 * 24 * 1000)) calendar.value.push(newValue);else calendar.value = [];\n calendar.value.sort((a, b) => a - b);\n calendar.updateValue();\n } else {\n calendar.value = [newValue];\n calendar.updateValue();\n }\n }\n setValue(values) {\n const calendar = this;\n const currentValue = calendar.value;\n if (Array.isArray(currentValue) && Array.isArray(values) && currentValue.length === values.length) {\n let equal = true;\n currentValue.forEach((v, index) => {\n if (v !== values[index]) equal = false;\n });\n if (equal) return;\n }\n calendar.value = values;\n calendar.updateValue();\n }\n getValue() {\n const calendar = this;\n return calendar.value;\n }\n updateValue(onlyHeader) {\n const calendar = this;\n const {\n $el,\n $wrapperEl,\n $inputEl,\n value,\n params\n } = calendar;\n let i;\n if ($el && $el.length > 0) {\n $wrapperEl.find('.calendar-day-selected').removeClass('calendar-day-selected calendar-day-selected-range calendar-day-selected-left calendar-day-selected-right');\n let valueDate;\n if (params.rangePicker && value.length === 2) {\n const leftDate = new Date(value[0]).getTime();\n const rightDate = new Date(value[1]).getTime();\n for (i = leftDate; i <= rightDate; i += 24 * 60 * 60 * 1000) {\n valueDate = new Date(i);\n let addClass = 'calendar-day-selected';\n if (leftDate !== rightDate) {\n if (i !== leftDate && i !== rightDate) {\n addClass += ' calendar-day-selected-range';\n }\n if (i === leftDate) {\n addClass += ' calendar-day-selected-left';\n }\n if (i === rightDate) {\n addClass += ' calendar-day-selected-right';\n }\n }\n $wrapperEl.find(`.calendar-day[data-date=\"${valueDate.getFullYear()}-${valueDate.getMonth()}-${valueDate.getDate()}\"]`).addClass(addClass);\n }\n valueDate = new Date(leftDate);\n $wrapperEl.find(`.calendar-day[data-date=\"${valueDate.getFullYear()}-${valueDate.getMonth()}-${valueDate.getDate()}\"]`).removeClass('calendar-day-selected-range').addClass('calendar-day-selected calendar-day-selected-left');\n valueDate = new Date(rightDate);\n $wrapperEl.find(`.calendar-day[data-date=\"${valueDate.getFullYear()}-${valueDate.getMonth()}-${valueDate.getDate()}\"]`).removeClass('calendar-day-selected-range').addClass('calendar-day-selected calendar-day-selected-right');\n } else {\n for (i = 0; i < calendar.value.length; i += 1) {\n valueDate = new Date(value[i]);\n $wrapperEl.find(`.calendar-day[data-date=\"${valueDate.getFullYear()}-${valueDate.getMonth()}-${valueDate.getDate()}\"]`).addClass('calendar-day-selected');\n }\n }\n }\n if (!onlyHeader) {\n calendar.emit('local::change calendarChange', calendar, value);\n }\n if ($el && $el.length > 0 && calendar.hasTimePicker) {\n $el.find('.calendar-time-selector a').text(value && value.length ? calendar.timeSelectorFormatter(value[0]) : calendar.params.timePickerPlaceholder);\n }\n if ($inputEl && $inputEl.length || params.header) {\n const inputValue = calendar.formatValue(value);\n if (params.header && $el && $el.length) {\n $el.find('.calendar-selected-date').text(inputValue);\n }\n if ($inputEl && $inputEl.length && !onlyHeader) {\n $inputEl.val(inputValue);\n $inputEl.trigger('change');\n }\n }\n }\n updateCurrentMonthYear(dir) {\n const calendar = this;\n const {\n $months,\n $el,\n monthNames\n } = calendar;\n let currentLocaleMonth;\n let currentLocaleYear;\n if (typeof dir === 'undefined') {\n calendar.currentMonth = parseInt($months.eq(1).attr('data-month'), 10);\n calendar.currentYear = parseInt($months.eq(1).attr('data-year'), 10);\n currentLocaleMonth = $months.eq(1).attr('data-locale-month');\n currentLocaleYear = $months.eq(1).attr('data-locale-year');\n } else {\n calendar.currentMonth = parseInt($months.eq(dir === 'next' ? $months.length - 1 : 0).attr('data-month'), 10);\n calendar.currentYear = parseInt($months.eq(dir === 'next' ? $months.length - 1 : 0).attr('data-year'), 10);\n currentLocaleMonth = $months.eq(dir === 'next' ? $months.length - 1 : 0).attr('data-locale-month');\n currentLocaleYear = $months.eq(dir === 'next' ? $months.length - 1 : 0).attr('data-locale-year');\n }\n $el.find('.current-month-value').text(monthNames[currentLocaleMonth]);\n $el.find('.current-year-value').text(currentLocaleYear);\n }\n update() {\n const calendar = this;\n const {\n currentYear,\n currentMonth,\n $wrapperEl\n } = calendar;\n const currentDate = new Date(currentYear, currentMonth);\n const prevMonthHtml = calendar.renderMonth(currentDate, 'prev');\n const currentMonthHtml = calendar.renderMonth(currentDate);\n const nextMonthHtml = calendar.renderMonth(currentDate, 'next');\n $wrapperEl.transition(0).html(`${prevMonthHtml}${currentMonthHtml}${nextMonthHtml}`).transform('translate3d(0,0,0)');\n calendar.$months = $wrapperEl.find('.calendar-month');\n calendar.monthsTranslate = 0;\n calendar.setMonthsTranslate();\n calendar.$months.each(monthEl => {\n calendar.emit('local::monthAdd calendarMonthAdd', monthEl);\n });\n }\n onMonthChangeStart(dir) {\n const calendar = this;\n const {\n $months,\n currentYear,\n currentMonth\n } = calendar;\n calendar.updateCurrentMonthYear(dir);\n $months.removeClass('calendar-month-current calendar-month-prev calendar-month-next');\n const currentIndex = dir === 'next' ? $months.length - 1 : 0;\n $months.eq(currentIndex).addClass('calendar-month-current');\n $months.eq(dir === 'next' ? currentIndex - 1 : currentIndex + 1).addClass(dir === 'next' ? 'calendar-month-prev' : 'calendar-month-next');\n calendar.emit('local::monthYearChangeStart calendarMonthYearChangeStart', calendar, currentYear, currentMonth);\n }\n onMonthChangeEnd(dir, rebuildBoth) {\n const calendar = this;\n const {\n currentYear,\n currentMonth,\n $wrapperEl,\n monthsTranslate\n } = calendar;\n calendar.animating = false;\n let nextMonthHtml;\n let prevMonthHtml;\n let currentMonthHtml;\n $wrapperEl.find('.calendar-month:not(.calendar-month-prev):not(.calendar-month-current):not(.calendar-month-next)').remove();\n if (typeof dir === 'undefined') {\n dir = 'next'; // eslint-disable-line\n rebuildBoth = true; // eslint-disable-line\n }\n\n if (!rebuildBoth) {\n currentMonthHtml = calendar.renderMonth(new Date(currentYear, currentMonth), dir);\n } else {\n $wrapperEl.find('.calendar-month-next, .calendar-month-prev').remove();\n prevMonthHtml = calendar.renderMonth(new Date(currentYear, currentMonth), 'prev');\n nextMonthHtml = calendar.renderMonth(new Date(currentYear, currentMonth), 'next');\n }\n if (dir === 'next' || rebuildBoth) {\n $wrapperEl.append(currentMonthHtml || nextMonthHtml);\n }\n if (dir === 'prev' || rebuildBoth) {\n $wrapperEl.prepend(currentMonthHtml || prevMonthHtml);\n }\n const $months = $wrapperEl.find('.calendar-month');\n calendar.$months = $months;\n calendar.setMonthsTranslate(monthsTranslate);\n calendar.emit('local::monthAdd calendarMonthAdd', calendar, dir === 'next' ? $months.eq($months.length - 1)[0] : $months.eq(0)[0]);\n calendar.emit('local::monthYearChangeEnd calendarMonthYearChangeEnd', calendar, currentYear, currentMonth);\n }\n setMonthsTranslate(translate) {\n const calendar = this;\n const {\n $months,\n isHorizontal: isH,\n inverter\n } = calendar;\n // eslint-disable-next-line\n translate = translate || calendar.monthsTranslate || 0;\n if (typeof calendar.monthsTranslate === 'undefined') {\n calendar.monthsTranslate = translate;\n }\n $months.removeClass('calendar-month-current calendar-month-prev calendar-month-next');\n const prevMonthTranslate = -(translate + 1) * 100 * inverter;\n const currentMonthTranslate = -translate * 100 * inverter;\n const nextMonthTranslate = -(translate - 1) * 100 * inverter;\n $months.eq(0).transform(`translate3d(${isH ? prevMonthTranslate : 0}%, ${isH ? 0 : prevMonthTranslate}%, 0)`).addClass('calendar-month-prev');\n $months.eq(1).transform(`translate3d(${isH ? currentMonthTranslate : 0}%, ${isH ? 0 : currentMonthTranslate}%, 0)`).addClass('calendar-month-current');\n $months.eq(2).transform(`translate3d(${isH ? nextMonthTranslate : 0}%, ${isH ? 0 : nextMonthTranslate}%, 0)`).addClass('calendar-month-next');\n }\n nextMonth(transition) {\n const calendar = this;\n const {\n params,\n $wrapperEl,\n inverter,\n isHorizontal: isH\n } = calendar;\n if (typeof transition === 'undefined' || typeof transition === 'object') {\n transition = ''; // eslint-disable-line\n if (!params.animate) transition = 0; // eslint-disable-line\n }\n\n const nextMonth = parseInt(calendar.$months.eq(calendar.$months.length - 1).attr('data-month'), 10);\n const nextYear = parseInt(calendar.$months.eq(calendar.$months.length - 1).attr('data-year'), 10);\n const nextDate = new Date(nextYear, nextMonth);\n const nextDateTime = nextDate.getTime();\n const transitionEndCallback = !calendar.animating;\n if (params.maxDate) {\n if (nextDateTime > new Date(params.maxDate).getTime()) {\n calendar.resetMonth();\n return;\n }\n }\n calendar.monthsTranslate -= 1;\n if (nextMonth === calendar.currentMonth) {\n const nextMonthTranslate = -calendar.monthsTranslate * 100 * inverter;\n const nextMonthHtml = $(calendar.renderMonth(nextDateTime, 'next')).transform(`translate3d(${isH ? nextMonthTranslate : 0}%, ${isH ? 0 : nextMonthTranslate}%, 0)`).addClass('calendar-month-next');\n $wrapperEl.append(nextMonthHtml[0]);\n calendar.$months = $wrapperEl.find('.calendar-month');\n calendar.emit('local::monthAdd calendarMonthAdd', calendar.$months.eq(calendar.$months.length - 1)[0]);\n }\n calendar.animating = true;\n calendar.onMonthChangeStart('next');\n const translate = calendar.monthsTranslate * 100 * inverter;\n $wrapperEl.transition(transition).transform(`translate3d(${isH ? translate : 0}%, ${isH ? 0 : translate}%, 0)`);\n if (transitionEndCallback) {\n $wrapperEl.transitionEnd(() => {\n calendar.onMonthChangeEnd('next');\n });\n }\n if (!params.animate) {\n calendar.onMonthChangeEnd('next');\n }\n }\n prevMonth(transition) {\n const calendar = this;\n const {\n params,\n $wrapperEl,\n inverter,\n isHorizontal: isH\n } = calendar;\n if (typeof transition === 'undefined' || typeof transition === 'object') {\n transition = ''; // eslint-disable-line\n if (!params.animate) transition = 0; // eslint-disable-line\n }\n\n const prevMonth = parseInt(calendar.$months.eq(0).attr('data-month'), 10);\n const prevYear = parseInt(calendar.$months.eq(0).attr('data-year'), 10);\n const prevDate = new Date(prevYear, prevMonth + 1, -1);\n const prevDateTime = prevDate.getTime();\n const transitionEndCallback = !calendar.animating;\n if (params.minDate) {\n let minDate = new Date(params.minDate);\n minDate = new Date(minDate.getFullYear(), minDate.getMonth(), 1);\n if (prevDateTime < minDate.getTime()) {\n calendar.resetMonth();\n return;\n }\n }\n calendar.monthsTranslate += 1;\n if (prevMonth === calendar.currentMonth) {\n const prevMonthTranslate = -calendar.monthsTranslate * 100 * inverter;\n const prevMonthHtml = $(calendar.renderMonth(prevDateTime, 'prev')).transform(`translate3d(${isH ? prevMonthTranslate : 0}%, ${isH ? 0 : prevMonthTranslate}%, 0)`).addClass('calendar-month-prev');\n $wrapperEl.prepend(prevMonthHtml[0]);\n calendar.$months = $wrapperEl.find('.calendar-month');\n calendar.emit('local::monthAdd calendarMonthAdd', calendar.$months.eq(0)[0]);\n }\n calendar.animating = true;\n calendar.onMonthChangeStart('prev');\n const translate = calendar.monthsTranslate * 100 * inverter;\n $wrapperEl.transition(transition).transform(`translate3d(${isH ? translate : 0}%, ${isH ? 0 : translate}%, 0)`);\n if (transitionEndCallback) {\n $wrapperEl.transitionEnd(() => {\n calendar.onMonthChangeEnd('prev');\n });\n }\n if (!params.animate) {\n calendar.onMonthChangeEnd('prev');\n }\n }\n resetMonth(transition) {\n if (transition === void 0) {\n transition = '';\n }\n const calendar = this;\n const {\n $wrapperEl,\n inverter,\n isHorizontal: isH,\n monthsTranslate\n } = calendar;\n const translate = monthsTranslate * 100 * inverter;\n $wrapperEl.transition(transition).transform(`translate3d(${isH ? translate : 0}%, ${isH ? 0 : translate}%, 0)`);\n }\n // eslint-disable-next-line\n setYearMonth(year, month, transition) {\n const calendar = this;\n const {\n params,\n isHorizontal: isH,\n $wrapperEl,\n inverter\n } = calendar;\n // eslint-disable-next-line\n if (typeof year === 'undefined') year = calendar.currentYear;\n // eslint-disable-next-line\n if (typeof month === 'undefined') month = calendar.currentMonth;\n if (typeof transition === 'undefined' || typeof transition === 'object') {\n // eslint-disable-next-line\n transition = '';\n // eslint-disable-next-line\n if (!params.animate) transition = 0;\n }\n let targetDate;\n if (year < calendar.currentYear) {\n targetDate = new Date(year, month + 1, -1).getTime();\n } else {\n targetDate = new Date(year, month).getTime();\n }\n if (params.maxDate && targetDate > new Date(params.maxDate).getTime()) {\n return false;\n }\n if (params.minDate) {\n let minDate = new Date(params.minDate);\n minDate = new Date(minDate.getFullYear(), minDate.getMonth(), 1);\n if (targetDate < minDate.getTime()) {\n return false;\n }\n }\n const currentDate = new Date(calendar.currentYear, calendar.currentMonth).getTime();\n const dir = targetDate > currentDate ? 'next' : 'prev';\n const newMonthHTML = calendar.renderMonth(new Date(year, month));\n calendar.monthsTranslate = calendar.monthsTranslate || 0;\n const prevTranslate = calendar.monthsTranslate;\n let monthTranslate;\n const transitionEndCallback = !calendar.animating && transition !== 0;\n if (targetDate > currentDate) {\n // To next\n calendar.monthsTranslate -= 1;\n if (!calendar.animating) calendar.$months.eq(calendar.$months.length - 1).remove();\n $wrapperEl.append(newMonthHTML);\n calendar.$months = $wrapperEl.find('.calendar-month');\n monthTranslate = -(prevTranslate - 1) * 100 * inverter;\n calendar.$months.eq(calendar.$months.length - 1).transform(`translate3d(${isH ? monthTranslate : 0}%, ${isH ? 0 : monthTranslate}%, 0)`).addClass('calendar-month-next');\n } else {\n // To prev\n calendar.monthsTranslate += 1;\n if (!calendar.animating) calendar.$months.eq(0).remove();\n $wrapperEl.prepend(newMonthHTML);\n calendar.$months = $wrapperEl.find('.calendar-month');\n monthTranslate = -(prevTranslate + 1) * 100 * inverter;\n calendar.$months.eq(0).transform(`translate3d(${isH ? monthTranslate : 0}%, ${isH ? 0 : monthTranslate}%, 0)`).addClass('calendar-month-prev');\n }\n calendar.emit('local::monthAdd calendarMonthAdd', dir === 'next' ? calendar.$months.eq(calendar.$months.length - 1)[0] : calendar.$months.eq(0)[0]);\n calendar.animating = true;\n calendar.onMonthChangeStart(dir);\n const wrapperTranslate = calendar.monthsTranslate * 100 * inverter;\n $wrapperEl.transition(transition).transform(`translate3d(${isH ? wrapperTranslate : 0}%, ${isH ? 0 : wrapperTranslate}%, 0)`);\n if (transitionEndCallback) {\n $wrapperEl.transitionEnd(() => {\n calendar.onMonthChangeEnd(dir, true);\n });\n }\n if (!params.animate || transition === 0) {\n calendar.onMonthChangeEnd(dir, true);\n }\n }\n nextYear() {\n const calendar = this;\n calendar.setYearMonth(calendar.currentYear + 1);\n }\n prevYear() {\n const calendar = this;\n calendar.setYearMonth(calendar.currentYear - 1);\n }\n // eslint-disable-next-line\n dateInRange(dayDate, range) {\n let match = false;\n let i;\n if (!range) return false;\n if (Array.isArray(range)) {\n for (i = 0; i < range.length; i += 1) {\n if (range[i].from || range[i].to) {\n if (range[i].from && range[i].to) {\n if (dayDate <= new Date(range[i].to).getTime() && dayDate >= new Date(range[i].from).getTime()) {\n match = true;\n }\n } else if (range[i].from) {\n if (dayDate >= new Date(range[i].from).getTime()) {\n match = true;\n }\n } else if (range[i].to) {\n if (dayDate <= new Date(range[i].to).getTime()) {\n match = true;\n }\n }\n } else if (range[i].date) {\n if (dayDate === new Date(range[i].date).getTime()) {\n match = true;\n }\n } else if (dayDate === new Date(range[i]).getTime()) {\n match = true;\n }\n }\n } else if (range.from || range.to) {\n if (range.from && range.to) {\n if (dayDate <= new Date(range.to).getTime() && dayDate >= new Date(range.from).getTime()) {\n match = true;\n }\n } else if (range.from) {\n if (dayDate >= new Date(range.from).getTime()) {\n match = true;\n }\n } else if (range.to) {\n if (dayDate <= new Date(range.to).getTime()) {\n match = true;\n }\n }\n } else if (range.date) {\n match = dayDate === new Date(range.date).getTime();\n } else if (typeof range === 'function') {\n match = range(new Date(dayDate));\n }\n return match;\n }\n // eslint-disable-next-line\n daysInMonth(date) {\n const d = new Date(date);\n return new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();\n }\n renderMonths(date) {\n const calendar = this;\n if (calendar.params.renderMonths) {\n return calendar.params.renderMonths.call(calendar, date);\n }\n return $jsx(\"div\", {\n class: \"calendar-months-wrapper\"\n }, calendar.renderMonth(date, 'prev'), calendar.renderMonth(date), calendar.renderMonth(date, 'next'));\n }\n renderMonth(d, offset) {\n const calendar = this;\n const {\n params,\n value\n } = calendar;\n if (params.renderMonth) {\n return params.renderMonth.call(calendar, d, offset);\n }\n let date = new Date(d);\n let year = date.getFullYear();\n let month = date.getMonth();\n let localeMonth = calendar.monthNames.indexOf(calendar.monthFormatter(date));\n if (localeMonth < 0) localeMonth = month;\n let localeYear = calendar.yearFormatter(date);\n if (offset === 'next') {\n if (month === 11) date = new Date(year + 1, 0);else date = new Date(year, month + 1, 1);\n }\n if (offset === 'prev') {\n if (month === 0) date = new Date(year - 1, 11);else date = new Date(year, month - 1, 1);\n }\n if (offset === 'next' || offset === 'prev') {\n month = date.getMonth();\n year = date.getFullYear();\n localeMonth = calendar.monthNames.indexOf(calendar.monthFormatter(date));\n if (localeMonth < 0) localeMonth = month;\n localeYear = calendar.yearFormatter(date);\n }\n const currentValues = [];\n const today = new Date().setHours(0, 0, 0, 0);\n const minDate = params.minDate ? new Date(params.minDate).getTime() : null;\n const maxDate = params.maxDate ? new Date(params.maxDate).getTime() : null;\n const rows = 6;\n const cols = 7;\n const daysInPrevMonth = calendar.daysInMonth(new Date(date.getFullYear(), date.getMonth()).getTime() - 10 * 24 * 60 * 60 * 1000);\n const daysInMonth = calendar.daysInMonth(date);\n const minDayNumber = params.firstDay === 6 ? 0 : 1;\n let monthHtml = '';\n let dayIndex = 0 + (params.firstDay - 1);\n let disabled;\n let hasEvents;\n let firstDayOfMonthIndex = new Date(date.getFullYear(), date.getMonth()).getDay();\n if (firstDayOfMonthIndex === 0) firstDayOfMonthIndex = 7;\n if (value && value.length) {\n for (let i = 0; i < value.length; i += 1) {\n currentValues.push(new Date(value[i]).setHours(0, 0, 0, 0));\n }\n }\n for (let row = 1; row <= rows; row += 1) {\n let rowHtml = '';\n for (let col = 1; col <= cols; col += 1) {\n dayIndex += 1;\n let dayDate;\n let dayNumber = dayIndex - firstDayOfMonthIndex;\n let addClass = '';\n if (row === 1 && col === 1 && dayNumber > minDayNumber && params.firstDay !== 1) {\n dayIndex -= 7;\n dayNumber = dayIndex - firstDayOfMonthIndex;\n }\n const weekDayIndex = col - 1 + params.firstDay > 6 ? col - 1 - 7 + params.firstDay : col - 1 + params.firstDay;\n if (dayNumber < 0) {\n dayNumber = daysInPrevMonth + dayNumber + 1;\n addClass += ' calendar-day-prev';\n dayDate = new Date(month - 1 < 0 ? year - 1 : year, month - 1 < 0 ? 11 : month - 1, dayNumber).getTime();\n } else {\n dayNumber += 1;\n if (dayNumber > daysInMonth) {\n dayNumber -= daysInMonth;\n addClass += ' calendar-day-next';\n dayDate = new Date(month + 1 > 11 ? year + 1 : year, month + 1 > 11 ? 0 : month + 1, dayNumber).getTime();\n } else {\n dayDate = new Date(year, month, dayNumber).getTime();\n }\n }\n // Today\n if (dayDate === today) addClass += ' calendar-day-today';\n\n // Selected\n if (params.rangePicker && currentValues.length === 2) {\n if (dayDate >= currentValues[0] && dayDate <= currentValues[1]) {\n addClass += ' calendar-day-selected';\n }\n if (currentValues[0] !== currentValues[1]) {\n if (dayDate > currentValues[0] && dayDate < currentValues[1]) {\n addClass += ' calendar-day-selected-range';\n }\n if (dayDate === currentValues[0]) {\n addClass += ' calendar-day-selected-left';\n }\n if (dayDate === currentValues[1]) {\n addClass += ' calendar-day-selected-right';\n }\n }\n } else if (currentValues.indexOf(dayDate) >= 0) addClass += ' calendar-day-selected';\n // Weekend\n if (params.weekendDays.indexOf(weekDayIndex) >= 0) {\n addClass += ' calendar-day-weekend';\n }\n // Events\n let eventsHtml = '';\n hasEvents = false;\n if (params.events) {\n if (calendar.dateInRange(dayDate, params.events)) {\n hasEvents = true;\n }\n }\n if (hasEvents) {\n addClass += ' calendar-day-has-events';\n // prettier-ignore\n eventsHtml = `\n \n \n \n `;\n if (Array.isArray(params.events)) {\n const eventDots = [];\n params.events.forEach(ev => {\n const color = ev.color || '';\n if (eventDots.indexOf(color) < 0 && calendar.dateInRange(dayDate, ev)) {\n eventDots.push(color);\n }\n });\n // prettier-ignore\n eventsHtml = `\n \n ${eventDots.map(color => `\n \n `.trim()).join('')}\n \n `;\n }\n }\n // Custom Ranges\n if (params.rangesClasses) {\n for (let k = 0; k < params.rangesClasses.length; k += 1) {\n if (calendar.dateInRange(dayDate, params.rangesClasses[k].range)) {\n addClass += ` ${params.rangesClasses[k].cssClass}`;\n }\n }\n }\n // Disabled\n disabled = false;\n if (minDate && dayDate < minDate || maxDate && dayDate > maxDate) {\n disabled = true;\n }\n if (params.disabled) {\n if (calendar.dateInRange(dayDate, params.disabled)) {\n disabled = true;\n }\n }\n if (disabled) {\n addClass += ' calendar-day-disabled';\n }\n dayDate = new Date(dayDate);\n const dayYear = dayDate.getFullYear();\n const dayMonth = dayDate.getMonth();\n const dayNumberDisplay = calendar.dayFormatter(dayDate);\n // prettier-ignore\n rowHtml += `\n \n ${dayNumberDisplay}${eventsHtml}\n
`.trim();\n }\n monthHtml += `${rowHtml}
`;\n }\n monthHtml = `${monthHtml}
`;\n return monthHtml;\n }\n renderWeekHeader() {\n const calendar = this;\n if (calendar.params.renderWeekHeader) {\n return calendar.params.renderWeekHeader.call(calendar);\n }\n const {\n params\n } = calendar;\n let weekDaysHtml = '';\n for (let i = 0; i < 7; i += 1) {\n const dayIndex = i + params.firstDay > 6 ? i - 7 + params.firstDay : i + params.firstDay;\n const dayName = calendar.dayNamesShort[dayIndex];\n weekDaysHtml += `${dayName}
`;\n }\n return $jsx(\"div\", {\n class: \"calendar-week-header\"\n }, weekDaysHtml);\n }\n renderMonthSelector() {\n const calendar = this;\n if (calendar.params.renderMonthSelector) {\n return calendar.params.renderMonthSelector.call(calendar);\n }\n return $jsx(\"div\", {\n class: \"calendar-month-selector\"\n }, $jsx(\"a\", {\n class: \"link icon-only calendar-prev-month-button\"\n }, $jsx(\"i\", {\n class: \"icon icon-prev\"\n })), calendar.params.monthPicker ? $jsx(\"a\", {\n class: \"current-month-value link\"\n }) : $jsx(\"span\", {\n class: \"current-month-value\"\n }), $jsx(\"a\", {\n class: \"link icon-only calendar-next-month-button\"\n }, $jsx(\"i\", {\n class: \"icon icon-next\"\n })));\n }\n renderYearSelector() {\n const calendar = this;\n if (calendar.params.renderYearSelector) {\n return calendar.params.renderYearSelector.call(calendar);\n }\n return $jsx(\"div\", {\n class: \"calendar-year-selector\"\n }, $jsx(\"a\", {\n class: \"link icon-only calendar-prev-year-button\"\n }, $jsx(\"i\", {\n class: \"icon icon-prev\"\n })), calendar.params.yearPicker ? $jsx(\"a\", {\n class: \"current-year-value link\"\n }) : $jsx(\"span\", {\n class: \"current-year-value\"\n }), $jsx(\"a\", {\n class: \"link icon-only calendar-next-year-button\"\n }, $jsx(\"i\", {\n class: \"icon icon-next\"\n })));\n }\n\n // eslint-disable-next-line\n renderTimeSelector() {\n const calendar = this;\n const value = calendar.value && calendar.value[0];\n let timeString;\n if (value) timeString = calendar.timeSelectorFormatter(value);\n return $jsx(\"div\", {\n class: \"calendar-time-selector\"\n }, $jsx(\"span\", null, calendar.params.timePickerLabel), $jsx(\"a\", {\n class: \"link\"\n }, timeString || calendar.params.timePickerPlaceholder));\n }\n renderHeader() {\n const calendar = this;\n if (calendar.params.renderHeader) {\n return calendar.params.renderHeader.call(calendar);\n }\n return $jsx(\"div\", {\n class: \"calendar-header\"\n }, $jsx(\"div\", {\n class: \"calendar-selected-date\"\n }, calendar.params.headerPlaceholder));\n }\n renderFooter() {\n const calendar = this;\n const app = calendar.app;\n if (calendar.params.renderFooter) {\n return calendar.params.renderFooter.call(calendar);\n }\n return $jsx(\"div\", {\n class: \"calendar-footer\"\n }, $jsx(\"a\", {\n class: `${app.theme === 'md' ? 'button button-round' : 'link'} calendar-close sheet-close popover-close`\n }, calendar.params.toolbarCloseText));\n }\n renderToolbar() {\n const calendar = this;\n if (calendar.params.renderToolbar) {\n return calendar.params.renderToolbar.call(calendar, calendar);\n }\n // prettier-ignore\n return $jsx(\"div\", {\n class: \"toolbar toolbar-top\"\n }, $jsx(\"div\", {\n class: \"toolbar-inner\"\n }, calendar.params.monthSelector ? calendar.renderMonthSelector() : '', calendar.params.yearSelector ? calendar.renderYearSelector() : ''));\n }\n // eslint-disable-next-line\n renderInline() {\n const calendar = this;\n const {\n cssClass,\n toolbar,\n header,\n footer,\n rangePicker,\n weekHeader\n } = calendar.params;\n const {\n value,\n hasTimePicker\n } = calendar;\n const date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);\n return $jsx(\"div\", {\n class: `calendar calendar-inline ${rangePicker ? 'calendar-range' : ''} ${cssClass || ''}`\n }, header && calendar.renderHeader(), toolbar && calendar.renderToolbar(), weekHeader && calendar.renderWeekHeader(), $jsx(\"div\", {\n class: \"calendar-months\"\n }, calendar.renderMonths(date)), hasTimePicker && calendar.renderTimeSelector(), footer && calendar.renderFooter());\n }\n renderCustomModal() {\n const calendar = this;\n const {\n cssClass,\n toolbar,\n header,\n footer,\n rangePicker,\n weekHeader\n } = calendar.params;\n const {\n value,\n hasTimePicker\n } = calendar;\n const date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);\n return $jsx(\"div\", {\n class: `calendar calendar-modal ${rangePicker ? 'calendar-range' : ''} ${cssClass || ''}`\n }, header && calendar.renderHeader(), toolbar && calendar.renderToolbar(), weekHeader && calendar.renderWeekHeader(), $jsx(\"div\", {\n class: \"calendar-months\"\n }, calendar.renderMonths(date)), hasTimePicker && calendar.renderTimeSelector(), footer && calendar.renderFooter());\n }\n renderSheet() {\n const calendar = this;\n const {\n cssClass,\n toolbar,\n header,\n footer,\n rangePicker,\n weekHeader\n } = calendar.params;\n const {\n value,\n hasTimePicker\n } = calendar;\n const date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);\n return $jsx(\"div\", {\n class: `sheet-modal calendar calendar-sheet ${rangePicker ? 'calendar-range' : ''} ${cssClass || ''}`\n }, header && calendar.renderHeader(), toolbar && calendar.renderToolbar(), weekHeader && calendar.renderWeekHeader(), $jsx(\"div\", {\n class: \"sheet-modal-inner calendar-months\"\n }, calendar.renderMonths(date)), hasTimePicker && calendar.renderTimeSelector(), footer && calendar.renderFooter());\n }\n renderPopover() {\n const calendar = this;\n const {\n cssClass,\n toolbar,\n header,\n footer,\n rangePicker,\n weekHeader\n } = calendar.params;\n const {\n value,\n hasTimePicker\n } = calendar;\n const date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);\n return $jsx(\"div\", {\n class: \"popover calendar-popover\"\n }, $jsx(\"div\", {\n class: \"popover-inner\"\n }, $jsx(\"div\", {\n class: `calendar ${rangePicker ? 'calendar-range' : ''} ${cssClass || ''}`\n }, header && calendar.renderHeader(), toolbar && calendar.renderToolbar(), weekHeader && calendar.renderWeekHeader(), $jsx(\"div\", {\n class: \"calendar-months\"\n }, calendar.renderMonths(date)), hasTimePicker && calendar.renderTimeSelector(), footer && calendar.renderFooter())));\n }\n render() {\n const calendar = this;\n const {\n params\n } = calendar;\n if (params.render) return params.render.call(calendar);\n if (!calendar.inline) {\n let modalType = params.openIn;\n if (modalType === 'auto') modalType = calendar.isPopover() ? 'popover' : 'sheet';\n if (modalType === 'popover') return calendar.renderPopover();\n if (modalType === 'sheet') return calendar.renderSheet();\n return calendar.renderCustomModal();\n }\n return calendar.renderInline();\n }\n openMonthPicker() {\n const calendar = this;\n const {\n $el,\n app\n } = calendar;\n if (!$el || !$el.length) return;\n $el.append('');\n calendar.monthPickerPopover = app.popover.create({\n el: $el.find('.calendar-month-picker-popover'),\n targetEl: $el.find('.calendar-month-selector'),\n backdrop: true,\n backdropUnique: true,\n on: {\n close() {\n calendar.closeMonthPicker();\n },\n closed() {\n if (calendar.monthPickerPopover.$el) calendar.monthPickerPopover.$el.remove();\n calendar.monthPickerPopover.destroy();\n if (calendar.monthPickerInstance) {\n calendar.monthPickerInstance.close();\n calendar.monthPickerInstance.destroy();\n }\n delete calendar.monthPickerInstance;\n delete calendar.monthPickerPopover;\n }\n }\n });\n calendar.monthPickerPopover.open();\n const localeMonth = parseInt(calendar.$el.find('.calendar-month-current').attr('data-locale-month'), 10);\n const values = [];\n const displayValues = [];\n calendar.monthNames.forEach((m, index) => {\n values.push(index);\n displayValues.push(m);\n });\n calendar.monthPickerInstance = app.picker.create({\n containerEl: calendar.monthPickerPopover.$el.find('.calendar-month-picker'),\n value: [localeMonth],\n toolbar: calendar.params.monthPickerToolbar,\n rotateEffect: false,\n toolbarCloseText: calendar.params.monthPickerCloseText,\n cols: [{\n values,\n displayValues\n }]\n });\n }\n closeMonthPicker() {\n const calendar = this;\n if (calendar.monthPickerPopover && calendar.monthPickerPopover.opened) calendar.monthPickerPopover.close();\n const index = calendar.monthPickerInstance.value[0];\n const localeMonthIndex = parseInt(calendar.$el.find('.calendar-month-current').attr('data-locale-month'), 10);\n const monthIndex = calendar.currentMonth;\n const diff = localeMonthIndex - monthIndex;\n const diffIndex = index - diff;\n calendar.setYearMonth(calendar.currentYear, diffIndex, 0);\n }\n openYearPicker() {\n const calendar = this;\n const {\n $el,\n app\n } = calendar;\n if (!$el || !$el.length) return;\n $el.append('');\n calendar.yearPickerPopover = app.popover.create({\n el: $el.find('.calendar-year-picker-popover'),\n targetEl: $el.find('.calendar-year-selector'),\n backdrop: true,\n backdropUnique: true,\n on: {\n close() {\n calendar.closeYearPicker();\n },\n closed() {\n if (calendar.yearPickerPopover.$el) calendar.yearPickerPopover.$el.remove();\n calendar.yearPickerPopover.destroy();\n if (calendar.yearPickerInstance) {\n calendar.yearPickerInstance.close();\n calendar.yearPickerInstance.destroy();\n }\n delete calendar.yearPickerInstance;\n delete calendar.yearPickerPopover;\n }\n }\n });\n calendar.yearPickerPopover.open();\n const currentYear = calendar.currentYear;\n let yearMin = calendar.params.yearPickerMin || new Date().getFullYear() - 100;\n if (calendar.params.minDate) {\n yearMin = Math.max(yearMin, new Date(calendar.params.minDate).getFullYear());\n }\n let yearMax = calendar.params.yearPickerMax || new Date().getFullYear() + 100;\n if (calendar.params.maxDate) {\n yearMax = Math.min(yearMax, new Date(calendar.params.maxDate).getFullYear());\n }\n const years = [];\n for (let i = yearMin; i <= yearMax; i += 1) {\n years.push(i);\n }\n calendar.yearPickerInstance = app.picker.create({\n containerEl: calendar.yearPickerPopover.$el.find('.calendar-year-picker'),\n value: [currentYear],\n toolbar: calendar.params.yearPickerToolbar,\n rotateEffect: false,\n toolbarCloseText: calendar.params.yearPickerCloseText,\n cols: [{\n values: years\n }]\n });\n }\n closeYearPicker() {\n const calendar = this;\n if (calendar.yearPickerPopover && calendar.yearPickerPopover.opened) calendar.yearPickerPopover.close();\n calendar.setYearMonth(calendar.yearPickerInstance.value[0], undefined, 0);\n }\n openTimePicker() {\n const calendar = this;\n const {\n $el,\n app,\n is12HoursFormat\n } = calendar;\n if (!$el || !$el.length) return;\n $el.append('');\n const hoursArr = [];\n const minutesArr = [];\n const hoursMin = is12HoursFormat ? 1 : 0;\n const hoursMax = is12HoursFormat ? 12 : 23;\n for (let i = hoursMin; i <= hoursMax; i += 1) {\n hoursArr.push(i);\n }\n for (let i = 0; i <= 59; i += 1) {\n minutesArr.push(i);\n }\n let value;\n if (calendar.value && calendar.value.length) {\n value = [calendar.value[0].getHours(), calendar.value[0].getMinutes()];\n } else {\n value = [new Date().getHours(), new Date().getMinutes()];\n }\n if (is12HoursFormat) {\n value.push(value[0] < 12 ? 'AM' : 'PM');\n if (value[0] > 12) value[0] -= 12;\n if (value[0] === 0) value[0] = 12;\n }\n calendar.timePickerPopover = app.popover.create({\n el: $el.find('.calendar-time-picker-popover'),\n targetEl: $el.find('.calendar-time-selector .link'),\n backdrop: true,\n backdropUnique: true,\n on: {\n close() {\n calendar.closeTimePicker();\n },\n closed() {\n if (calendar.timePickerPopover.$el) calendar.timePickerPopover.$el.remove();\n calendar.timePickerPopover.destroy();\n if (calendar.timePickerInstance) {\n calendar.timePickerInstance.close();\n calendar.timePickerInstance.destroy();\n }\n delete calendar.timePickerInstance;\n delete calendar.timePickerPopover;\n }\n }\n });\n calendar.timePickerPopover.open();\n calendar.timePickerInstance = app.picker.create({\n containerEl: calendar.timePickerPopover.$el.find('.calendar-time-picker'),\n value,\n toolbar: calendar.params.timePickerToolbar,\n rotateEffect: false,\n toolbarCloseText: calendar.params.timePickerCloseText,\n cols: [{\n values: hoursArr\n }, {\n divider: true,\n content: ':'\n }, {\n values: minutesArr,\n displayValues: minutesArr.map(m => m < 10 ? `0${m}` : m)\n }, ...(is12HoursFormat ? [{\n values: ['AM', 'PM']\n }] : [])]\n });\n }\n closeTimePicker() {\n const calendar = this;\n const {\n is12HoursFormat\n } = calendar;\n if (calendar.timePickerInstance) {\n const timePickerValue = calendar.timePickerInstance.value;\n let hours = parseInt(timePickerValue[0], 10);\n const minutes = parseInt(timePickerValue[1], 10);\n const period = calendar.timePickerInstance.value[2];\n if (is12HoursFormat) {\n if (period === 'AM' && hours === 12) {\n hours = 0;\n } else if (period === 'PM' && hours !== 12) {\n hours += 12;\n }\n }\n let value = calendar.value && calendar.value.length && calendar.value[0];\n if (!value) {\n value = new Date();\n value.setHours(hours, minutes, 0, 0);\n } else {\n value = new Date(value);\n value.setHours(hours, minutes);\n }\n calendar.setValue([value]);\n if (calendar.timePickerPopover && calendar.timePickerPopover.opened) calendar.timePickerPopover.close();\n }\n }\n onOpen() {\n const calendar = this;\n const {\n initialized,\n $el,\n app,\n $inputEl,\n inline,\n value,\n params\n } = calendar;\n calendar.closing = false;\n calendar.opened = true;\n calendar.opening = true;\n\n // Init main events\n calendar.attachCalendarEvents();\n const updateValue = !value && params.value;\n\n // Set value\n if (!initialized) {\n if (value) calendar.setValue(value, 0);else if (params.value) {\n calendar.setValue(calendar.normalizeValues(params.value), 0);\n }\n } else if (value) {\n calendar.setValue(value, 0);\n }\n\n // Update current month and year\n calendar.updateCurrentMonthYear();\n\n // Set initial translate\n calendar.monthsTranslate = 0;\n calendar.setMonthsTranslate();\n\n // Update input value\n if (updateValue) calendar.updateValue();else if (params.header && value) {\n calendar.updateValue(true);\n }\n\n // Extra focus\n if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {\n $inputEl.trigger('focus');\n }\n calendar.initialized = true;\n calendar.$months.each(monthEl => {\n calendar.emit('local::monthAdd calendarMonthAdd', monthEl);\n });\n\n // Trigger events\n if ($el) {\n $el.trigger('calendar:open');\n }\n if ($inputEl) {\n $inputEl.trigger('calendar:open');\n }\n calendar.emit('local::open calendarOpen', calendar);\n }\n onOpened() {\n const calendar = this;\n calendar.opening = false;\n if (calendar.$el) {\n calendar.$el.trigger('calendar:opened');\n }\n if (calendar.$inputEl) {\n calendar.$inputEl.trigger('calendar:opened');\n }\n calendar.emit('local::opened calendarOpened', calendar);\n }\n onClose() {\n const calendar = this;\n const app = calendar.app;\n calendar.opening = false;\n calendar.closing = true;\n if (calendar.$inputEl) {\n if (app.theme === 'md') {\n calendar.$inputEl.trigger('blur');\n } else {\n const validate = calendar.$inputEl.attr('validate');\n const required = calendar.$inputEl.attr('required');\n if (validate && required) {\n app.input.validate(calendar.$inputEl);\n }\n }\n }\n if (calendar.detachCalendarEvents) {\n calendar.detachCalendarEvents();\n }\n if (calendar.$el) {\n calendar.$el.trigger('calendar:close');\n }\n if (calendar.$inputEl) {\n calendar.$inputEl.trigger('calendar:close');\n }\n calendar.emit('local::close calendarClose', calendar);\n }\n onClosed() {\n const calendar = this;\n calendar.opened = false;\n calendar.closing = false;\n if (!calendar.inline) {\n nextTick(() => {\n if (calendar.modal && calendar.modal.el && calendar.modal.destroy) {\n if (!calendar.params.routableModals) {\n calendar.modal.destroy();\n }\n }\n delete calendar.modal;\n });\n }\n if (calendar.timePickerInstance) {\n if (calendar.timePickerInstance.destroy) calendar.timePickerInstance.destroy();\n delete calendar.timePickerInstance;\n }\n if (calendar.$el) {\n calendar.$el.trigger('calendar:closed');\n }\n if (calendar.$inputEl) {\n calendar.$inputEl.trigger('calendar:closed');\n }\n calendar.emit('local::closed calendarClosed', calendar);\n }\n open() {\n const calendar = this;\n const {\n app,\n opened,\n inline,\n $inputEl,\n params\n } = calendar;\n if (opened) return;\n if (inline) {\n calendar.$el = $(calendar.render());\n calendar.$el[0].f7Calendar = calendar;\n calendar.$wrapperEl = calendar.$el.find('.calendar-months-wrapper');\n calendar.$months = calendar.$wrapperEl.find('.calendar-month');\n calendar.$containerEl.append(calendar.$el);\n calendar.onOpen();\n calendar.onOpened();\n return;\n }\n let modalType = params.openIn;\n if (modalType === 'auto') {\n modalType = calendar.isPopover() ? 'popover' : 'sheet';\n }\n const modalContent = calendar.render();\n const modalParams = {\n targetEl: $inputEl,\n scrollToEl: params.scrollToInput ? $inputEl : undefined,\n content: modalContent,\n backdrop: params.backdrop === true || (modalType === 'popover' || modalType === 'customModal') && app.params.popover.backdrop !== false && params.backdrop !== false,\n closeByBackdropClick: params.closeByBackdropClick,\n on: {\n open() {\n const modal = this;\n calendar.modal = modal;\n calendar.$el = modalType === 'popover' ? modal.$el.find('.calendar') : modal.$el;\n calendar.$wrapperEl = calendar.$el.find('.calendar-months-wrapper');\n calendar.$months = calendar.$wrapperEl.find('.calendar-month');\n calendar.$el[0].f7Calendar = calendar;\n if (modalType === 'customModal') {\n $(calendar.$el).find('.calendar-close').once('click', () => {\n calendar.close();\n });\n }\n calendar.onOpen();\n },\n opened() {\n calendar.onOpened();\n },\n close() {\n calendar.onClose();\n },\n closed() {\n calendar.onClosed();\n }\n }\n };\n if (modalType === 'sheet') {\n modalParams.push = params.sheetPush;\n modalParams.swipeToClose = params.sheetSwipeToClose;\n }\n if (params.routableModals && calendar.view) {\n calendar.view.router.navigate({\n url: calendar.url,\n route: {\n path: calendar.url,\n [modalType]: modalParams\n }\n });\n } else {\n calendar.modal = app[modalType].create(modalParams);\n calendar.modal.open();\n }\n }\n close() {\n const calendar = this;\n const {\n opened,\n inline\n } = calendar;\n if (!opened) return;\n if (inline) {\n calendar.onClose();\n calendar.onClosed();\n return;\n }\n if (calendar.params.routableModals && calendar.view) {\n calendar.view.router.back();\n } else {\n calendar.modal.close();\n }\n }\n init() {\n const calendar = this;\n calendar.initInput();\n if (calendar.inline) {\n calendar.open();\n calendar.emit('local::init calendarInit', calendar);\n return;\n }\n if (!calendar.initialized && calendar.params.value) {\n calendar.setValue(calendar.normalizeValues(calendar.params.value));\n }\n\n // Attach input Events\n if (calendar.$inputEl) {\n calendar.attachInputEvents();\n }\n if (calendar.params.closeByOutsideClick) {\n calendar.attachHtmlEvents();\n }\n calendar.emit('local::init calendarInit', calendar);\n }\n destroy() {\n const calendar = this;\n if (calendar.destroyed) return;\n const {\n $el\n } = calendar;\n calendar.emit('local::beforeDestroy calendarBeforeDestroy', calendar);\n if ($el) $el.trigger('calendar:beforedestroy');\n calendar.close();\n\n // Detach Events\n if (calendar.$inputEl) {\n calendar.detachInputEvents();\n }\n if (calendar.params.closeByOutsideClick) {\n calendar.detachHtmlEvents();\n }\n if (calendar.timePickerInstance) {\n if (calendar.timePickerInstance.destroy) calendar.timePickerInstance.destroy();\n delete calendar.timePickerInstance;\n }\n if ($el && $el.length) delete calendar.$el[0].f7Calendar;\n deleteProps(calendar);\n calendar.destroyed = true;\n }\n}\nexport default Calendar;","import ConstructorMethods from '../../shared/constructor-methods.js';\nimport Calendar from './calendar-class.js';\nimport $ from '../../shared/dom7.js';\nexport default {\n name: 'calendar',\n static: {\n Calendar\n },\n create() {\n const app = this;\n app.calendar = ConstructorMethods({\n defaultSelector: '.calendar',\n constructor: Calendar,\n app,\n domProp: 'f7Calendar'\n });\n app.calendar.close = function close(el) {\n if (el === void 0) {\n el = '.calendar';\n }\n const $el = $(el);\n if ($el.length === 0) return;\n const calendar = $el[0].f7Calendar;\n if (!calendar || calendar && !calendar.opened) return;\n calendar.close();\n };\n },\n params: {\n calendar: {\n // Calendar settings\n dateFormat: undefined,\n monthNames: 'auto',\n monthNamesShort: 'auto',\n dayNames: 'auto',\n dayNamesShort: 'auto',\n locale: undefined,\n firstDay: 1,\n // First day of the week, Monday\n weekendDays: [0, 6],\n // Sunday and Saturday\n multiple: false,\n rangePicker: false,\n rangePickerMinDays: 1,\n // when calendar is used as rangePicker\n rangePickerMaxDays: 0,\n // when calendar is used as rangePicker, 0 means unlimited\n direction: 'horizontal',\n // or 'vertical'\n minDate: null,\n maxDate: null,\n disabled: null,\n // dates range of disabled days\n events: null,\n // dates range of days with events\n rangesClasses: null,\n // array with custom classes date ranges\n touchMove: true,\n animate: true,\n closeOnSelect: false,\n monthSelector: true,\n monthPicker: true,\n monthPickerToolbar: true,\n monthPickerCloseText: 'Done',\n yearSelector: true,\n yearPicker: true,\n yearPickerToolbar: true,\n yearPickerMin: undefined,\n yearPickerMax: undefined,\n yearPickerCloseText: 'Done',\n timePicker: false,\n timePickerToolbar: true,\n timePickerLabel: 'Time',\n timePickerFormat: {\n hour: 'numeric',\n minute: 'numeric'\n },\n timePickerPlaceholder: 'Select time',\n timePickerCloseText: 'Done',\n weekHeader: true,\n value: null,\n // Common opener settings\n containerEl: null,\n openIn: 'auto',\n // or 'popover' or 'sheet' or 'customModal'\n sheetPush: false,\n sheetSwipeToClose: undefined,\n formatValue: null,\n inputEl: null,\n inputReadOnly: true,\n closeByOutsideClick: true,\n scrollToInput: true,\n header: false,\n headerPlaceholder: 'Select date',\n toolbar: true,\n toolbarCloseText: 'Done',\n footer: false,\n cssClass: null,\n routableModals: false,\n view: null,\n url: 'date/',\n backdrop: null,\n closeByBackdropClick: true,\n // Render functions\n renderWeekHeader: null,\n renderMonths: null,\n renderMonth: null,\n renderMonthSelector: null,\n renderYearSelector: null,\n renderHeader: null,\n renderFooter: null,\n renderToolbar: null,\n renderInline: null,\n renderPopover: null,\n renderSheet: null,\n render: null\n }\n }\n};","import $ from '../../shared/dom7.js';\nexport default function pickerColumn(colEl, updateItems) {\n const picker = this;\n // const app = picker.app;\n const $colEl = $(colEl);\n const colIndex = $colEl.index();\n const col = picker.cols[colIndex];\n if (col.divider) return;\n col.$el = $colEl;\n col.el = $colEl[0];\n col.$itemsEl = col.$el.find('.picker-items');\n col.items = col.$itemsEl.find('.picker-item');\n let itemHeight;\n let colHeight;\n col.replaceValues = function replaceColValues(values, displayValues) {\n col.detachEvents();\n col.values = values;\n col.displayValues = displayValues;\n col.$itemsEl.html(picker.renderColumn(col, true));\n col.items = col.$itemsEl.find('.picker-item');\n col.calcSize();\n col.setValue(col.values[0], true);\n col.attachEvents();\n };\n col.calcSize = function calcColSize() {\n colHeight = col.$el[0].offsetHeight;\n itemHeight = col.items[0].offsetHeight;\n const hadPadding = col.el.style.getPropertyValue('--f7-picker-scroll-padding');\n col.el.style.setProperty('--f7-picker-scroll-padding', `${(colHeight - itemHeight) / 2}px`);\n if (!hadPadding) {\n col.$itemsEl[0].scrollTop = 0;\n }\n };\n col.setValue = function setColValue(newValue, valueCallbacks) {\n const newActiveIndex = col.$itemsEl.find(`.picker-item[data-picker-value=\"${newValue}\"]`).index();\n if (typeof newActiveIndex === 'undefined' || newActiveIndex === -1) {\n return;\n }\n const newScrollTop = newActiveIndex * itemHeight;\n col.$itemsEl[0].scrollTop = newScrollTop;\n\n // Update items\n col.updateItems(newActiveIndex, newScrollTop, valueCallbacks);\n };\n col.updateItems = function updateColItems(activeIndex, scrollTop, valueCallbacks) {\n if (typeof scrollTop === 'undefined') {\n // eslint-disable-next-line\n scrollTop = col.$itemsEl[0].scrollTop;\n }\n\n /* eslint-disable no-param-reassign */\n if (typeof activeIndex === 'undefined') {\n activeIndex = Math.round(scrollTop / itemHeight);\n }\n if (activeIndex < 0) activeIndex = 0;\n if (activeIndex >= col.items.length) activeIndex = col.items.length - 1;\n /* eslint-enable no-param-reassign */\n const previousActiveIndex = col.activeIndex;\n col.activeIndex = activeIndex;\n col.$itemsEl.find('.picker-item-selected').removeClass('picker-item-selected');\n const selectedItem = col.items.eq(activeIndex);\n selectedItem.addClass('picker-item-selected').children().transform('');\n // Set 3D rotate effect\n if (picker.params.rotateEffect) {\n col.items.each(itemEl => {\n const $itemEl = $(itemEl);\n const itemOffset = itemEl.offsetTop - (colHeight - itemHeight) / 2 - scrollTop;\n const percentage = itemOffset / itemHeight;\n const itemsFit = Math.ceil(col.height / itemHeight / 2) + 1;\n let angle = -24 * percentage;\n if (angle > 180) angle = 180;\n if (angle < -180) angle = -180;\n if (Math.abs(percentage) > itemsFit) {\n $itemEl.addClass('picker-item-far');\n } else {\n $itemEl.removeClass('picker-item-far');\n }\n $itemEl.children('span').transform(`translate3d(0, ${-percentage * itemHeight}px, -100px) rotateX(${angle}deg)`);\n });\n }\n if (valueCallbacks || typeof valueCallbacks === 'undefined') {\n // Update values\n col.value = selectedItem.attr('data-picker-value');\n col.displayValue = col.displayValues ? col.displayValues[activeIndex] : col.value;\n // On change callback\n if (previousActiveIndex !== activeIndex) {\n if (col.onChange) {\n col.onChange(picker, col.value, col.displayValue);\n }\n picker.updateValue();\n }\n }\n };\n function handleScroll() {\n col.updateItems();\n }\n function handleClick() {\n const value = $(this).attr('data-picker-value');\n col.setValue(value);\n }\n col.attachEvents = function attachColEvents() {\n col.$itemsEl.on('scroll', handleScroll);\n col.items.on('click', handleClick);\n };\n col.detachEvents = function detachColEvents() {\n col.items.off('click', handleClick);\n };\n col.init = function initCol() {\n col.calcSize();\n if (colIndex === 0) col.$el.addClass('picker-column-first');\n if (colIndex === picker.cols.length - 1) col.$el.addClass('picker-column-last');\n if (picker.params.freeMode) col.$el.addClass('picker-column-free-mode');\n // Update items on init\n if (updateItems) col.updateItems(0);\n col.attachEvents();\n };\n col.destroy = function destroyCol() {\n col.detachEvents();\n };\n col.init();\n}","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom7.js';\nimport { extend, nextTick, deleteProps } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\nimport { getDevice } from '../../shared/get-device.js';\nimport pickerColumn from './picker-column.js';\n\n/** @jsx $jsx */\nimport $jsx from '../../shared/$jsx.js';\nclass Picker extends Framework7Class {\n constructor(app, params) {\n if (params === void 0) {\n params = {};\n }\n super(params, [app]);\n const picker = this;\n const device = getDevice();\n const window = getWindow();\n picker.params = extend({}, app.params.picker, params);\n let $containerEl;\n if (picker.params.containerEl) {\n $containerEl = $(picker.params.containerEl);\n if ($containerEl.length === 0) return picker;\n }\n let $inputEl;\n if (picker.params.inputEl) {\n $inputEl = $(picker.params.inputEl);\n }\n let $scrollToEl = picker.params.scrollToInput ? $inputEl : undefined;\n if (picker.params.scrollToEl) {\n const scrollToEl = $(picker.params.scrollToEl);\n if (scrollToEl.length > 0) {\n $scrollToEl = scrollToEl;\n }\n }\n extend(picker, {\n app,\n $containerEl,\n containerEl: $containerEl && $containerEl[0],\n inline: $containerEl && $containerEl.length > 0,\n needsOriginFix: device.ios || window.navigator.userAgent.toLowerCase().indexOf('safari') >= 0 && window.navigator.userAgent.toLowerCase().indexOf('chrome') < 0 && !device.android,\n cols: [],\n $inputEl,\n inputEl: $inputEl && $inputEl[0],\n $scrollToEl,\n initialized: false,\n opened: false,\n url: picker.params.url\n });\n function onResize() {\n picker.resizeCols();\n }\n function onInputClick() {\n picker.open();\n }\n function onInputFocus(e) {\n e.preventDefault();\n }\n let htmlTouchStartTarget = null;\n function onHtmlTouchStart(e) {\n htmlTouchStartTarget = e.target;\n }\n function onHtmlClick(e) {\n if (picker.destroyed || !picker.params) return;\n const $targetEl = $(e.target);\n if (picker.isPopover()) return;\n if (!picker.opened || picker.closing) return;\n if ($targetEl.closest('[class*=\"backdrop\"]').length) return;\n if ($inputEl && $inputEl.length > 0) {\n if (htmlTouchStartTarget === e.target && $targetEl[0] !== $inputEl[0] && $targetEl.closest('.sheet-modal').length === 0) {\n picker.close();\n }\n } else if ($(e.target).closest('.sheet-modal').length === 0) {\n picker.close();\n }\n }\n\n // Events\n extend(picker, {\n attachResizeEvent() {\n app.on('resize', onResize);\n },\n detachResizeEvent() {\n app.off('resize', onResize);\n },\n attachInputEvents() {\n picker.$inputEl.on('click', onInputClick);\n if (picker.params.inputReadOnly) {\n picker.$inputEl.on('focus mousedown', onInputFocus);\n if (picker.$inputEl[0]) {\n picker.$inputEl[0].f7ValidateReadonly = true;\n }\n }\n },\n detachInputEvents() {\n picker.$inputEl.off('click', onInputClick);\n if (picker.params.inputReadOnly) {\n picker.$inputEl.off('focus mousedown', onInputFocus);\n if (picker.$inputEl[0]) {\n delete picker.$inputEl[0].f7ValidateReadonly;\n }\n }\n },\n attachHtmlEvents() {\n app.on('click', onHtmlClick);\n app.on('touchstart', onHtmlTouchStart);\n },\n detachHtmlEvents() {\n app.off('click', onHtmlClick);\n app.off('touchstart', onHtmlTouchStart);\n }\n });\n picker.init();\n return picker;\n }\n get view() {\n const {\n app,\n params,\n $inputEl\n } = this;\n let view;\n if (params.view) {\n view = params.view;\n } else if ($inputEl) {\n view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;\n }\n if (!view) view = app.views.main;\n return view;\n }\n initInput() {\n const picker = this;\n if (!picker.$inputEl) return;\n if (picker.params.inputReadOnly) picker.$inputEl.prop('readOnly', true);\n }\n resizeCols() {\n const picker = this;\n if (!picker.opened) return;\n for (let i = 0; i < picker.cols.length; i += 1) {\n if (!picker.cols[i].divider) {\n picker.cols[i].calcSize();\n picker.cols[i].setValue(picker.cols[i].value, false);\n }\n }\n }\n isPopover() {\n const picker = this;\n const {\n app,\n modal,\n params\n } = picker;\n const device = getDevice();\n if (params.openIn === 'sheet') return false;\n if (modal && modal.type !== 'popover') return false;\n if (!picker.inline && picker.inputEl) {\n if (params.openIn === 'popover') return true;\n if (device.ios) {\n return !!device.ipad;\n }\n if (app.width >= 768) {\n return true;\n }\n }\n return false;\n }\n formatValue() {\n const picker = this;\n const {\n value,\n displayValue\n } = picker;\n if (picker.params.formatValue) {\n return picker.params.formatValue.call(picker, value, displayValue);\n }\n return value.join(' ');\n }\n setValue(values) {\n const picker = this;\n let valueIndex = 0;\n if (picker.cols.length === 0) {\n picker.value = values;\n picker.updateValue(values);\n return;\n }\n for (let i = 0; i < picker.cols.length; i += 1) {\n if (picker.cols[i] && !picker.cols[i].divider) {\n picker.cols[i].setValue(values[valueIndex]);\n valueIndex += 1;\n }\n }\n }\n getValue() {\n const picker = this;\n return picker.value;\n }\n updateValue(forceValues) {\n const picker = this;\n const newValue = forceValues || [];\n const newDisplayValue = [];\n let column;\n if (picker.cols.length === 0) {\n const noDividerColumns = picker.params.cols.filter(c => !c.divider);\n for (let i = 0; i < noDividerColumns.length; i += 1) {\n column = noDividerColumns[i];\n if (column.displayValues !== undefined && column.values !== undefined && column.values.indexOf(newValue[i]) !== -1) {\n newDisplayValue.push(column.displayValues[column.values.indexOf(newValue[i])]);\n } else {\n newDisplayValue.push(newValue[i]);\n }\n }\n } else {\n for (let i = 0; i < picker.cols.length; i += 1) {\n if (!picker.cols[i].divider) {\n newValue.push(picker.cols[i].value);\n newDisplayValue.push(picker.cols[i].displayValue);\n }\n }\n }\n if (newValue.indexOf(undefined) >= 0) {\n return;\n }\n picker.value = newValue;\n picker.displayValue = newDisplayValue;\n picker.emit('local::change pickerChange', picker, picker.value, picker.displayValue);\n if (picker.inputEl) {\n picker.$inputEl.val(picker.formatValue());\n picker.$inputEl.trigger('change');\n }\n }\n initColumn(colEl, updateItems) {\n const picker = this;\n pickerColumn.call(picker, colEl, updateItems);\n }\n // eslint-disable-next-line\n destroyColumn(colEl) {\n const picker = this;\n const $colEl = $(colEl);\n const index = $colEl.index();\n if (picker.cols[index] && picker.cols[index].destroy) {\n picker.cols[index].destroy();\n }\n }\n renderToolbar() {\n const picker = this;\n if (picker.params.renderToolbar) return picker.params.renderToolbar.call(picker, picker);\n return $jsx(\"div\", {\n class: \"toolbar toolbar-top\"\n }, $jsx(\"div\", {\n class: \"toolbar-inner\"\n }, $jsx(\"div\", {\n class: \"left\"\n }), $jsx(\"div\", {\n class: \"right\"\n }, $jsx(\"a\", {\n class: \"link sheet-close popover-close\"\n }, picker.params.toolbarCloseText))));\n }\n // eslint-disable-next-line\n renderColumn(col, onlyItems) {\n const colClasses = `picker-column ${col.textAlign ? `picker-column-${col.textAlign}` : ''} ${col.cssClass || ''}`;\n let columnHtml;\n let columnItemsHtml;\n if (col.divider) {\n // prettier-ignore\n columnHtml = `\n ${col.content}
\n `;\n } else {\n // prettier-ignore\n columnItemsHtml = col.values.map((value, index) => `\n \n ${col.displayValues ? col.displayValues[index] : value}\n
\n `).join('');\n // prettier-ignore\n columnHtml = `\n \n `;\n }\n return onlyItems ? columnItemsHtml.trim() : columnHtml.trim();\n }\n renderInline() {\n const picker = this;\n const {\n rotateEffect,\n cssClass,\n toolbar\n } = picker.params;\n const inlineHtml = $jsx(\"div\", {\n class: `picker picker-inline ${rotateEffect ? 'picker-3d' : ''} ${cssClass || ''}`\n }, toolbar && picker.renderToolbar(), $jsx(\"div\", {\n class: \"picker-columns\"\n }, picker.cols.map(col => picker.renderColumn(col)), $jsx(\"div\", {\n class: \"picker-center-highlight\"\n })));\n return inlineHtml;\n }\n renderSheet() {\n const picker = this;\n const {\n rotateEffect,\n cssClass,\n toolbar\n } = picker.params;\n const sheetHtml = $jsx(\"div\", {\n class: `sheet-modal picker picker-sheet ${rotateEffect ? 'picker-3d' : ''} ${cssClass || ''}`\n }, toolbar && picker.renderToolbar(), $jsx(\"div\", {\n class: \"sheet-modal-inner picker-columns\"\n }, picker.cols.map(col => picker.renderColumn(col)), $jsx(\"div\", {\n class: \"picker-center-highlight\"\n })));\n return sheetHtml;\n }\n renderPopover() {\n const picker = this;\n const {\n rotateEffect,\n cssClass,\n toolbar\n } = picker.params;\n const popoverHtml = $jsx(\"div\", {\n class: \"popover picker-popover\"\n }, $jsx(\"div\", {\n class: \"popover-inner\"\n }, $jsx(\"div\", {\n class: `picker ${rotateEffect ? 'picker-3d' : ''} ${cssClass || ''}`\n }, toolbar && picker.renderToolbar(), $jsx(\"div\", {\n class: \"picker-columns\"\n }, picker.cols.map(col => picker.renderColumn(col)), $jsx(\"div\", {\n class: \"picker-center-highlight\"\n })))));\n return popoverHtml;\n }\n render() {\n const picker = this;\n if (picker.params.render) return picker.params.render.call(picker);\n if (!picker.inline) {\n if (picker.isPopover()) return picker.renderPopover();\n return picker.renderSheet();\n }\n return picker.renderInline();\n }\n onOpen() {\n const picker = this;\n const {\n initialized,\n $el,\n app,\n $inputEl,\n inline,\n value,\n params\n } = picker;\n picker.opened = true;\n picker.closing = false;\n picker.opening = true;\n\n // Init main events\n picker.attachResizeEvent();\n\n // Init cols\n $el.find('.picker-column').each(colEl => {\n let updateItems = true;\n if (!initialized && params.value || initialized && value) {\n updateItems = false;\n }\n picker.initColumn(colEl, updateItems);\n });\n\n // Set value\n if (!initialized) {\n if (value) picker.setValue(value);else if (params.value) {\n picker.setValue(params.value);\n }\n } else if (value) {\n picker.setValue(value);\n }\n\n // Extra focus\n if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {\n $inputEl.trigger('focus');\n }\n picker.initialized = true;\n\n // Trigger events\n if ($el) {\n $el.trigger('picker:open');\n }\n if ($inputEl) {\n $inputEl.trigger('picker:open');\n }\n picker.emit('local::open pickerOpen', picker);\n }\n onOpened() {\n const picker = this;\n picker.opening = false;\n if (picker.$el) {\n picker.$el.trigger('picker:opened');\n }\n if (picker.$inputEl) {\n picker.$inputEl.trigger('picker:opened');\n }\n picker.emit('local::opened pickerOpened', picker);\n }\n onClose() {\n const picker = this;\n const app = picker.app;\n picker.opening = false;\n picker.closing = true;\n\n // Detach events\n picker.detachResizeEvent();\n picker.cols.forEach(col => {\n if (col.destroy) col.destroy();\n });\n if (picker.$inputEl) {\n if (app.theme === 'md') {\n picker.$inputEl.trigger('blur');\n } else {\n const validate = picker.$inputEl.attr('validate');\n const required = picker.$inputEl.attr('required');\n if (validate && required) {\n app.input.validate(picker.$inputEl);\n }\n }\n }\n if (picker.$el) {\n picker.$el.trigger('picker:close');\n }\n if (picker.$inputEl) {\n picker.$inputEl.trigger('picker:close');\n }\n picker.emit('local::close pickerClose', picker);\n }\n onClosed() {\n const picker = this;\n picker.opened = false;\n picker.closing = false;\n if (!picker.inline) {\n nextTick(() => {\n if (picker.modal && picker.modal.el && picker.modal.destroy) {\n if (!picker.params.routableModals) {\n picker.modal.destroy();\n }\n }\n delete picker.modal;\n });\n }\n if (picker.$el) {\n picker.$el.trigger('picker:closed');\n }\n if (picker.$inputEl) {\n picker.$inputEl.trigger('picker:closed');\n }\n picker.emit('local::closed pickerClosed', picker);\n }\n open() {\n const picker = this;\n const {\n app,\n opened,\n inline,\n $inputEl,\n $scrollToEl,\n params\n } = picker;\n if (opened) return;\n if (picker.cols.length === 0 && params.cols.length) {\n params.cols.forEach(col => {\n picker.cols.push(col);\n });\n }\n if (inline) {\n picker.$el = $(picker.render());\n picker.$el[0].f7Picker = picker;\n picker.$containerEl.append(picker.$el);\n picker.onOpen();\n picker.onOpened();\n return;\n }\n const isPopover = picker.isPopover();\n const modalType = isPopover ? 'popover' : 'sheet';\n const modalParams = {\n targetEl: $inputEl,\n scrollToEl: $scrollToEl,\n content: picker.render(),\n backdrop: typeof params.backdrop !== 'undefined' ? params.backdrop : isPopover,\n on: {\n open() {\n const modal = this;\n picker.modal = modal;\n picker.$el = isPopover ? modal.$el.find('.picker') : modal.$el;\n picker.$el[0].f7Picker = picker;\n picker.onOpen();\n },\n opened() {\n picker.onOpened();\n },\n close() {\n picker.onClose();\n },\n closed() {\n picker.onClosed();\n }\n }\n };\n if (modalType === 'sheet') {\n modalParams.push = params.sheetPush;\n modalParams.swipeToClose = params.sheetSwipeToClose;\n }\n if (params.routableModals && picker.view) {\n picker.view.router.navigate({\n url: picker.url,\n route: {\n path: picker.url,\n [modalType]: modalParams\n }\n });\n } else {\n picker.modal = app[modalType].create(modalParams);\n picker.modal.open();\n }\n }\n close() {\n const picker = this;\n const {\n opened,\n inline\n } = picker;\n if (!opened) return;\n if (inline) {\n picker.onClose();\n picker.onClosed();\n return;\n }\n if (picker.params.routableModals && picker.view) {\n picker.view.router.back();\n } else {\n picker.modal.close();\n }\n }\n init() {\n const picker = this;\n picker.initInput();\n if (picker.inline) {\n picker.open();\n picker.emit('local::init pickerInit', picker);\n return;\n }\n if (!picker.initialized && picker.params.value) {\n picker.setValue(picker.params.value);\n }\n\n // Attach input Events\n if (picker.$inputEl) {\n picker.attachInputEvents();\n }\n if (picker.params.closeByOutsideClick) {\n picker.attachHtmlEvents();\n }\n picker.emit('local::init pickerInit', picker);\n }\n destroy() {\n const picker = this;\n if (picker.destroyed) return;\n const {\n $el\n } = picker;\n picker.emit('local::beforeDestroy pickerBeforeDestroy', picker);\n if ($el) $el.trigger('picker:beforedestroy');\n picker.close();\n\n // Detach Events\n if (picker.$inputEl) {\n picker.detachInputEvents();\n }\n if (picker.params.closeByOutsideClick) {\n picker.detachHtmlEvents();\n }\n if ($el && $el.length) delete picker.$el[0].f7Picker;\n deleteProps(picker);\n picker.destroyed = true;\n }\n}\nexport default Picker;","import $ from '../../shared/dom7.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nimport Picker from './picker-class.js';\nexport default {\n name: 'picker',\n static: {\n Picker\n },\n create() {\n const app = this;\n app.picker = ConstructorMethods({\n defaultSelector: '.picker',\n constructor: Picker,\n app,\n domProp: 'f7Picker'\n });\n app.picker.close = function close(el) {\n if (el === void 0) {\n el = '.picker';\n }\n const $el = $(el);\n if ($el.length === 0) return;\n const picker = $el[0].f7Picker;\n if (!picker || picker && !picker.opened) return;\n picker.close();\n };\n },\n params: {\n picker: {\n // Picker settings\n rotateEffect: false,\n freeMode: false,\n cols: [],\n // Common opener settings\n containerEl: null,\n openIn: 'auto',\n // or 'popover' or 'sheet'\n sheetPush: false,\n sheetSwipeToClose: undefined,\n backdrop: undefined,\n // uses Popover or Sheet defaults\n formatValue: null,\n inputEl: null,\n inputReadOnly: true,\n closeByOutsideClick: true,\n scrollToInput: true,\n scrollToEl: undefined,\n toolbar: true,\n toolbarCloseText: 'Done',\n cssClass: null,\n routableModals: false,\n view: null,\n url: 'select/',\n // Render functions\n renderToolbar: null,\n render: null\n }\n }\n};","import $ from '../../shared/dom7.js';\nimport { bindMethods } from '../../shared/utils.js';\nconst InfiniteScroll = {\n handle(el, e) {\n const app = this;\n const $el = $(el);\n const scrollTop = $el[0].scrollTop;\n const scrollHeight = $el[0].scrollHeight;\n const height = $el[0].offsetHeight;\n let distance = $el[0].getAttribute('data-infinite-distance');\n const virtualListContainer = $el.find('.virtual-list');\n let virtualList;\n const onTop = $el.hasClass('infinite-scroll-top');\n if (!distance) distance = 50;\n if (typeof distance === 'string' && distance.indexOf('%') >= 0) {\n distance = parseInt(distance, 10) / 100 * height;\n }\n if (distance > height) distance = height;\n if (onTop) {\n if (scrollTop < distance) {\n $el.trigger('infinite', e);\n app.emit('infinite', $el[0], e);\n }\n } else if (scrollTop + height >= scrollHeight - distance) {\n if (virtualListContainer.length > 0) {\n virtualList = virtualListContainer.eq(-1)[0].f7VirtualList;\n if (virtualList && !virtualList.reachEnd && !virtualList.params.updatableScroll) {\n return;\n }\n }\n $el.trigger('infinite', e);\n app.emit('infinite', $el[0], e);\n }\n },\n create(el) {\n const $el = $(el);\n const app = this;\n function scrollHandler(e) {\n app.infiniteScroll.handle(this, e);\n }\n $el.each(element => {\n element.f7InfiniteScrollHandler = scrollHandler;\n element.addEventListener('scroll', element.f7InfiniteScrollHandler);\n });\n },\n destroy(el) {\n const $el = $(el);\n $el.each(element => {\n element.removeEventListener('scroll', element.f7InfiniteScrollHandler);\n delete element.f7InfiniteScrollHandler;\n });\n }\n};\nexport default {\n name: 'infiniteScroll',\n create() {\n const app = this;\n bindMethods(app, {\n infiniteScroll: InfiniteScroll\n });\n },\n on: {\n tabMounted(tabEl) {\n const app = this;\n const $tabEl = $(tabEl);\n const $isEls = $tabEl.find('.infinite-scroll-content');\n if ($tabEl.is('.infinite-scroll-content')) $isEls.add($tabEl);\n $isEls.each(el => {\n app.infiniteScroll.create(el);\n });\n },\n tabBeforeRemove(tabEl) {\n const $tabEl = $(tabEl);\n const app = this;\n const $isEls = $tabEl.find('.infinite-scroll-content');\n if ($tabEl.is('.infinite-scroll-content')) $isEls.add($tabEl);\n $isEls.each(el => {\n app.infiniteScroll.destroy(el);\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.infinite-scroll-content').each(el => {\n app.infiniteScroll.create(el);\n });\n },\n pageBeforeRemove(page) {\n const app = this;\n page.$el.find('.infinite-scroll-content').each(el => {\n app.infiniteScroll.destroy(el);\n });\n }\n }\n};","import $ from '../../shared/dom7.js';\nimport { deleteProps } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\nimport { getSupport } from '../../shared/get-support.js';\nimport { getDevice } from '../../shared/get-device.js';\nclass PullToRefresh extends Framework7Class {\n constructor(app, el) {\n super({}, [app]);\n const ptr = this;\n const device = getDevice();\n const support = getSupport();\n const $el = $(el);\n const $preloaderEl = $el.find('.ptr-preloader');\n ptr.$el = $el;\n ptr.el = $el[0];\n ptr.app = app;\n ptr.bottom = ptr.$el.hasClass('ptr-bottom');\n\n // Extend defaults with modules params\n ptr.useModulesParams({});\n const isMaterial = app.theme === 'md';\n const isIos = app.theme === 'ios';\n\n // Done\n ptr.done = function done() {\n const $transitionTarget = isMaterial ? $preloaderEl : $el;\n const onTranstionEnd = e => {\n if ($(e.target).closest($preloaderEl).length) return;\n $el.removeClass('ptr-transitioning ptr-pull-up ptr-pull-down ptr-closing');\n $el.trigger('ptr:done');\n ptr.emit('local::done ptrDone', $el[0]);\n $transitionTarget.off('transitionend', onTranstionEnd);\n };\n $transitionTarget.on('transitionend', onTranstionEnd);\n $el.removeClass('ptr-refreshing').addClass('ptr-transitioning ptr-closing');\n return ptr;\n };\n ptr.refresh = function refresh() {\n if ($el.hasClass('ptr-refreshing')) return ptr;\n $el.addClass('ptr-transitioning ptr-refreshing');\n $el.trigger('ptr:refresh', ptr.done);\n ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);\n return ptr;\n };\n\n // Mousewheel\n ptr.mousewheel = $el.attr('data-ptr-mousewheel') === 'true';\n\n // Events handling\n let touchId;\n let isTouched;\n let isMoved;\n const touchesStart = {};\n let isScrolling;\n let touchesDiff;\n let refresh = false;\n let useTranslate = false;\n let forceUseTranslate = false;\n let startTranslate = 0;\n let translate;\n let scrollTop;\n let wasScrolled;\n let triggerDistance;\n let dynamicTriggerDistance;\n let pullStarted;\n let hasNavbar = false;\n let scrollHeight;\n let offsetHeight;\n let maxScrollTop;\n const $pageEl = $el.parents('.page');\n if ($pageEl.find('.navbar').length > 0 || $pageEl.parents('.view').children('.navbars').length > 0) hasNavbar = true;\n if ($pageEl.hasClass('no-navbar')) hasNavbar = false;\n if (!ptr.bottom) {\n const pageNavbarEl = app.navbar.getElByPage($pageEl[0]);\n if (pageNavbarEl) {\n const $pageNavbarEl = $(pageNavbarEl);\n const isLargeTransparent = $pageNavbarEl.hasClass('navbar-large-transparent') || $pageNavbarEl.hasClass('navbar-large') && $pageNavbarEl.hasClass('navbar-transparent');\n const isTransparent = $pageNavbarEl.hasClass('navbar-transparent') && !$pageNavbarEl.hasClass('navbar-large');\n if (isLargeTransparent) {\n $el.addClass('ptr-with-navbar-large-transparent');\n } else if (isTransparent) {\n $el.addClass('ptr-with-navbar-transparent');\n }\n }\n }\n if (!hasNavbar && !ptr.bottom) $el.addClass('ptr-no-navbar');\n\n // Define trigger distance\n if ($el.attr('data-ptr-distance')) {\n dynamicTriggerDistance = true;\n } else if (isMaterial) {\n triggerDistance = 66;\n } else if (isIos) {\n triggerDistance = 44;\n }\n function setPreloaderProgress(progress) {\n if (progress === void 0) {\n progress = 0;\n }\n const $bars = $preloaderEl.find('.preloader-inner-line');\n const perBarProgress = 1 / $bars.length;\n $bars.forEach((barEl, barIndex) => {\n const barProgress = (progress - barIndex * perBarProgress) / perBarProgress;\n barEl.style.opacity = Math.max(Math.min(barProgress, 1), 0) * 0.27;\n });\n }\n function unsetPreloaderProgress() {\n $preloaderEl.find('.preloader-inner-line').css('opacity', '');\n }\n function handleTouchStart(e) {\n if (!e.isTrusted) return;\n if (isTouched) {\n if (device.os === 'android') {\n if ('targetTouches' in e && e.targetTouches.length > 1) return;\n } else return;\n }\n if ($el.hasClass('ptr-refreshing')) {\n return;\n }\n if ($(e.target).closest('.sortable-handler, .ptr-ignore, .card-expandable.card-opened').length) return;\n isMoved = false;\n pullStarted = false;\n isTouched = true;\n isScrolling = undefined;\n wasScrolled = undefined;\n if (e.type === 'touchstart') touchId = e.targetTouches[0].identifier;\n touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n }\n function handleTouchMove(e) {\n if (!isTouched || !e.isTrusted) return;\n let pageX;\n let pageY;\n let touch;\n if (e.type === 'touchmove') {\n if (touchId && e.touches) {\n for (let i = 0; i < e.touches.length; i += 1) {\n if (e.touches[i].identifier === touchId) {\n touch = e.touches[i];\n }\n }\n }\n if (!touch) touch = e.targetTouches[0];\n pageX = touch.pageX;\n pageY = touch.pageY;\n } else {\n pageX = e.pageX;\n pageY = e.pageY;\n }\n if (!pageX || !pageY) return;\n if (typeof isScrolling === 'undefined') {\n isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));\n }\n if (!isScrolling) {\n isTouched = false;\n return;\n }\n scrollTop = $el[0].scrollTop;\n if (!isMoved) {\n $el.removeClass('ptr-transitioning');\n if (isIos) {\n setPreloaderProgress(0);\n }\n let targetIsScrollable;\n scrollHeight = $el[0].scrollHeight;\n offsetHeight = $el[0].offsetHeight;\n if (ptr.bottom) {\n maxScrollTop = scrollHeight - offsetHeight;\n }\n if (scrollTop > scrollHeight) {\n isTouched = false;\n return;\n }\n const $ptrWatchScrollable = $(e.target).closest('.ptr-watch-scroll');\n if ($ptrWatchScrollable.length) {\n $ptrWatchScrollable.each(ptrScrollableEl => {\n if (ptrScrollableEl === el) return;\n if (ptrScrollableEl.scrollHeight > ptrScrollableEl.offsetHeight && $(ptrScrollableEl).css('overflow') === 'auto' && (!ptr.bottom && ptrScrollableEl.scrollTop > 0 || ptr.bottom && ptrScrollableEl.scrollTop < ptrScrollableEl.scrollHeight - ptrScrollableEl.offsetHeight)) {\n targetIsScrollable = true;\n }\n });\n }\n if (targetIsScrollable) {\n isTouched = false;\n return;\n }\n if (dynamicTriggerDistance) {\n triggerDistance = $el.attr('data-ptr-distance');\n if (triggerDistance.indexOf('%') >= 0) triggerDistance = scrollHeight * parseInt(triggerDistance, 10) / 100;\n }\n startTranslate = $el.hasClass('ptr-refreshing') ? triggerDistance : 0;\n if (scrollHeight === offsetHeight || device.os !== 'ios' || isMaterial) {\n useTranslate = true;\n } else {\n useTranslate = false;\n }\n forceUseTranslate = false;\n }\n isMoved = true;\n touchesDiff = pageY - touchesStart.y;\n if (typeof wasScrolled === 'undefined' && (ptr.bottom ? scrollTop !== maxScrollTop : scrollTop !== 0)) wasScrolled = true;\n const ptrStarted = ptr.bottom ? touchesDiff < 0 && scrollTop >= maxScrollTop || scrollTop > maxScrollTop : touchesDiff > 0 && scrollTop <= 0 || scrollTop < 0;\n if (ptrStarted) {\n // iOS 8 fix\n if (device.os === 'ios' && parseInt(device.osVersion.split('.')[0], 10) > 7) {\n if (!ptr.bottom && scrollTop === 0 && !wasScrolled) useTranslate = true;\n if (ptr.bottom && scrollTop === maxScrollTop && !wasScrolled) useTranslate = true;\n }\n if (!useTranslate && ptr.bottom && !isMaterial) {\n $el.css('-webkit-overflow-scrolling', 'auto');\n $el.scrollTop(maxScrollTop);\n forceUseTranslate = true;\n }\n if (useTranslate || forceUseTranslate) {\n if (e.cancelable) {\n e.preventDefault();\n }\n translate = (ptr.bottom ? -1 * Math.abs(touchesDiff) ** 0.85 : touchesDiff ** 0.85) + startTranslate;\n if (isMaterial) {\n $preloaderEl.transform(`translate3d(0,${translate}px,0)`).find('.ptr-arrow').transform(`rotate(${180 * (Math.abs(touchesDiff) / 66) + 100}deg)`);\n } else {\n // eslint-disable-next-line\n if (ptr.bottom || isIos) {\n $el.children().transform(`translate3d(0,${translate}px,0)`);\n } else {\n // eslint-disable-next-line\n $el.transform(`translate3d(0,${translate}px,0)`);\n }\n if (isIos) {\n $preloaderEl.transform(`translate3d(0,0px,0)`);\n }\n }\n } else if (isIos && !ptr.bottom) {\n $preloaderEl.transform(`translate3d(0,${scrollTop}px,0)`);\n }\n let progress;\n if (isIos && !refresh) {\n progress = useTranslate || forceUseTranslate ? Math.abs(touchesDiff) ** 0.85 / triggerDistance : Math.abs(touchesDiff) / (triggerDistance * 2);\n setPreloaderProgress(progress);\n }\n if ((useTranslate || forceUseTranslate) && Math.abs(touchesDiff) ** 0.85 > triggerDistance || !useTranslate && Math.abs(touchesDiff) >= triggerDistance * 2) {\n refresh = true;\n $el.addClass('ptr-pull-up').removeClass('ptr-pull-down');\n unsetPreloaderProgress();\n } else {\n refresh = false;\n $el.removeClass('ptr-pull-up').addClass('ptr-pull-down');\n }\n if (!pullStarted) {\n $el.trigger('ptr:pullstart');\n ptr.emit('local::pullStart ptrPullStart', $el[0]);\n pullStarted = true;\n }\n $el.trigger('ptr:pullmove', {\n event: e,\n scrollTop,\n translate,\n touchesDiff\n });\n ptr.emit('local::pullMove ptrPullMove', $el[0], {\n event: e,\n scrollTop,\n translate,\n touchesDiff\n });\n } else {\n pullStarted = false;\n $el.removeClass('ptr-pull-up ptr-pull-down');\n refresh = false;\n }\n }\n function handleTouchEnd(e) {\n if (!e.isTrusted) return;\n if (e.type === 'touchend' && e.changedTouches && e.changedTouches.length > 0 && touchId) {\n if (e.changedTouches[0].identifier !== touchId) {\n isTouched = false;\n isScrolling = false;\n isMoved = false;\n touchId = null;\n return;\n }\n }\n if (!isTouched || !isMoved) {\n isTouched = false;\n isMoved = false;\n return;\n }\n if (translate) {\n $el.addClass('ptr-transitioning');\n translate = 0;\n }\n if (isMaterial) {\n $preloaderEl.transform('').find('.ptr-arrow').transform('');\n } else {\n $preloaderEl.transform('');\n if (ptr.bottom || isIos) {\n $el.children().transform('');\n } else {\n $el.transform('');\n }\n }\n if (!useTranslate && ptr.bottom && !isMaterial) {\n $el.css('-webkit-overflow-scrolling', '');\n }\n if (refresh) {\n $el.addClass('ptr-refreshing');\n $el.trigger('ptr:refresh', ptr.done);\n ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);\n } else {\n $el.removeClass('ptr-pull-down');\n }\n isTouched = false;\n isMoved = false;\n if (pullStarted) {\n $el.trigger('ptr:pullend');\n ptr.emit('local::pullEnd ptrPullEnd', $el[0]);\n }\n }\n let mousewheelTimeout;\n let mousewheelMoved;\n let mousewheelAllow = true;\n let mousewheelTranslate = 0;\n function handleMouseWheelRelease() {\n mousewheelAllow = true;\n mousewheelMoved = false;\n mousewheelTranslate = 0;\n if (translate) {\n $el.addClass('ptr-transitioning');\n translate = 0;\n }\n if (isMaterial) {\n $preloaderEl.transform('').find('.ptr-arrow').transform('');\n } else {\n $preloaderEl.transform('');\n if (ptr.bottom) {\n $el.children().transform('');\n } else {\n $el.transform('');\n }\n }\n if (refresh) {\n $el.addClass('ptr-refreshing');\n $el.trigger('ptr:refresh', ptr.done);\n ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);\n } else {\n $el.removeClass('ptr-pull-down');\n }\n if (pullStarted) {\n $el.trigger('ptr:pullend');\n ptr.emit('local::pullEnd ptrPullEnd', $el[0]);\n }\n }\n function handleMouseWheel(e) {\n if (!mousewheelAllow) return;\n const {\n deltaX,\n deltaY\n } = e;\n if (Math.abs(deltaX) > Math.abs(deltaY)) return;\n if ($el.hasClass('ptr-refreshing')) {\n return;\n }\n if ($(e.target).closest('.sortable-handler, .ptr-ignore, .card-expandable.card-opened').length) return;\n clearTimeout(mousewheelTimeout);\n scrollTop = $el[0].scrollTop;\n if (!mousewheelMoved) {\n $el.removeClass('ptr-transitioning');\n if (isIos) {\n setPreloaderProgress(0);\n }\n let targetIsScrollable;\n scrollHeight = $el[0].scrollHeight;\n offsetHeight = $el[0].offsetHeight;\n if (ptr.bottom) {\n maxScrollTop = scrollHeight - offsetHeight;\n }\n if (scrollTop > scrollHeight) {\n mousewheelAllow = false;\n return;\n }\n const $ptrWatchScrollable = $(e.target).closest('.ptr-watch-scroll');\n if ($ptrWatchScrollable.length) {\n $ptrWatchScrollable.each(ptrScrollableEl => {\n if (ptrScrollableEl === el) return;\n if (ptrScrollableEl.scrollHeight > ptrScrollableEl.offsetHeight && $(ptrScrollableEl).css('overflow') === 'auto' && (!ptr.bottom && ptrScrollableEl.scrollTop > 0 || ptr.bottom && ptrScrollableEl.scrollTop < ptrScrollableEl.scrollHeight - ptrScrollableEl.offsetHeight)) {\n targetIsScrollable = true;\n }\n });\n }\n if (targetIsScrollable) {\n mousewheelAllow = false;\n return;\n }\n if (dynamicTriggerDistance) {\n triggerDistance = $el.attr('data-ptr-distance');\n if (triggerDistance.indexOf('%') >= 0) triggerDistance = scrollHeight * parseInt(triggerDistance, 10) / 100;\n }\n }\n isMoved = true;\n mousewheelTranslate -= deltaY;\n touchesDiff = mousewheelTranslate; // pageY - touchesStart.y;\n\n if (typeof wasScrolled === 'undefined' && (ptr.bottom ? scrollTop !== maxScrollTop : scrollTop !== 0)) wasScrolled = true;\n const ptrStarted = ptr.bottom ? touchesDiff < 0 && scrollTop >= maxScrollTop || scrollTop > maxScrollTop : touchesDiff > 0 && scrollTop <= 0 || scrollTop < 0;\n if (ptrStarted) {\n if (e.cancelable) {\n e.preventDefault();\n }\n translate = touchesDiff;\n if (Math.abs(translate) > triggerDistance) {\n translate = triggerDistance + (Math.abs(translate) - triggerDistance) ** 0.7;\n if (ptr.bottom) translate = -translate;\n }\n if (isMaterial) {\n $preloaderEl.transform(`translate3d(0,${translate}px,0)`).find('.ptr-arrow').transform(`rotate(${180 * (Math.abs(touchesDiff) / 66) + 100}deg)`);\n } else {\n // eslint-disable-next-line\n if (ptr.bottom) {\n $el.children().transform(`translate3d(0,${translate}px,0)`);\n } else {\n $el.transform(`translate3d(0,${translate}px,0)`);\n if (isIos) {\n $preloaderEl.transform(`translate3d(0,${-translate}px,0)`);\n }\n }\n }\n let progress;\n if (isIos && !refresh) {\n progress = Math.abs(translate) / triggerDistance;\n setPreloaderProgress(progress);\n }\n if (Math.abs(translate) > triggerDistance) {\n refresh = true;\n $el.addClass('ptr-pull-up').removeClass('ptr-pull-down');\n unsetPreloaderProgress();\n } else {\n refresh = false;\n $el.removeClass('ptr-pull-up').addClass('ptr-pull-down');\n }\n if (!pullStarted) {\n $el.trigger('ptr:pullstart');\n ptr.emit('local::pullStart ptrPullStart', $el[0]);\n pullStarted = true;\n }\n $el.trigger('ptr:pullmove', {\n event: e,\n scrollTop,\n translate,\n touchesDiff\n });\n ptr.emit('local::pullMove ptrPullMove', $el[0], {\n event: e,\n scrollTop,\n translate,\n touchesDiff\n });\n } else {\n pullStarted = false;\n $el.removeClass('ptr-pull-up ptr-pull-down');\n refresh = false;\n }\n mousewheelTimeout = setTimeout(handleMouseWheelRelease, 300);\n }\n if (!$pageEl.length || !$el.length) return ptr;\n $el[0].f7PullToRefresh = ptr;\n\n // Events\n ptr.attachEvents = function attachEvents() {\n const passive = support.passiveListener ? {\n passive: true\n } : false;\n $el.on(app.touchEvents.start, handleTouchStart, passive);\n app.on('touchmove:active', handleTouchMove);\n app.on('touchend:passive', handleTouchEnd);\n if (ptr.mousewheel && !ptr.bottom) {\n $el.on('wheel', handleMouseWheel);\n }\n };\n ptr.detachEvents = function detachEvents() {\n const passive = support.passiveListener ? {\n passive: true\n } : false;\n $el.off(app.touchEvents.start, handleTouchStart, passive);\n app.off('touchmove:active', handleTouchMove);\n app.off('touchend:passive', handleTouchEnd);\n if (ptr.mousewheel && !ptr.bottom) {\n $el.off('wheel', handleMouseWheel);\n }\n };\n\n // Install Modules\n ptr.useModules();\n\n // Init\n ptr.init();\n return ptr;\n }\n init() {\n const ptr = this;\n ptr.attachEvents();\n }\n destroy() {\n let ptr = this;\n ptr.emit('local::beforeDestroy ptrBeforeDestroy', ptr);\n ptr.$el.trigger('ptr:beforedestroy');\n delete ptr.el.f7PullToRefresh;\n ptr.detachEvents();\n deleteProps(ptr);\n ptr = null;\n }\n}\nexport default PullToRefresh;","import $ from '../../shared/dom7.js';\nimport { extend } from '../../shared/utils.js';\nimport PullToRefresh from './pull-to-refresh-class.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nexport default {\n name: 'pullToRefresh',\n create() {\n const app = this;\n app.ptr = extend(ConstructorMethods({\n defaultSelector: '.ptr-content',\n constructor: PullToRefresh,\n app,\n domProp: 'f7PullToRefresh'\n }), {\n done(el) {\n const ptr = app.ptr.get(el);\n if (ptr) return ptr.done();\n return undefined;\n },\n refresh(el) {\n const ptr = app.ptr.get(el);\n if (ptr) return ptr.refresh();\n return undefined;\n }\n });\n },\n static: {\n PullToRefresh\n },\n on: {\n tabMounted(tabEl) {\n const app = this;\n const $tabEl = $(tabEl);\n const $ptrEls = $tabEl.find('.ptr-content');\n if ($tabEl.is('.ptr-content')) $ptrEls.add($tabEl);\n $ptrEls.each(el => {\n app.ptr.create(el);\n });\n },\n tabBeforeRemove(tabEl) {\n const $tabEl = $(tabEl);\n const app = this;\n const $ptrEls = $tabEl.find('.ptr-content');\n if ($tabEl.is('.ptr-content')) $ptrEls.add($tabEl);\n $ptrEls.each(el => {\n app.ptr.destroy(el);\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.ptr-content').each(el => {\n app.ptr.create(el);\n });\n },\n pageBeforeRemove(page) {\n const app = this;\n page.$el.find('.ptr-content').each(el => {\n app.ptr.destroy(el);\n });\n }\n }\n};","import $ from '../../shared/dom7.js';\nimport { extend, deleteProps } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\nclass DataTable extends Framework7Class {\n constructor(app, params) {\n if (params === void 0) {\n params = {};\n }\n super(params, [app]);\n const table = this;\n const defaults = {};\n\n // Extend defaults with modules params\n table.useModulesParams(defaults);\n table.params = extend(defaults, params);\n\n // El\n const $el = $(table.params.el);\n if ($el.length === 0) return undefined;\n table.$el = $el;\n table.el = $el[0];\n if (table.$el[0].f7DataTable) {\n const instance = table.$el[0].f7DataTable;\n table.destroy();\n return instance;\n }\n table.$el[0].f7DataTable = table;\n extend(table, {\n collapsible: $el.hasClass('data-table-collapsible'),\n // Headers\n $headerEl: $el.find('.data-table-header'),\n $headerSelectedEl: $el.find('.data-table-header-selected')\n });\n\n // Events\n function handleChange(e) {\n if (e.detail && e.detail.sentByF7DataTable) {\n // Scripted event, don't do anything\n return;\n }\n const $inputEl = $(this);\n const checked = $inputEl[0].checked;\n const columnIndex = $inputEl.parents('td,th').index();\n if ($inputEl.parents('thead').length > 0) {\n if (columnIndex === 0) {\n $el.find('tbody tr')[checked ? 'addClass' : 'removeClass']('data-table-row-selected');\n }\n $el.find(`tbody tr td:nth-child(${columnIndex + 1}) input`).prop('checked', checked).trigger('change', {\n sentByF7DataTable: true\n });\n $inputEl.prop('indeterminate', false);\n } else {\n if (columnIndex === 0) {\n $inputEl.parents('tr')[checked ? 'addClass' : 'removeClass']('data-table-row-selected');\n }\n const checkedRows = $el.find(`tbody .checkbox-cell:nth-child(${columnIndex + 1}) input[type=\"checkbox\"]:checked`).length;\n const totalRows = $el.find('tbody tr').length;\n const $headCheckboxEl = $el.find(`thead .checkbox-cell:nth-child(${columnIndex + 1}) input[type=\"checkbox\"]`);\n if (!checked) {\n $headCheckboxEl.prop('checked', false);\n } else if (checkedRows === totalRows) {\n $headCheckboxEl.prop('checked', true).trigger('change', {\n sentByF7DataTable: true\n });\n }\n $headCheckboxEl.prop('indeterminate', checkedRows > 0 && checkedRows < totalRows);\n }\n table.checkSelectedHeader();\n }\n function handleSortableClick() {\n const $cellEl = $(this);\n const isActive = $cellEl.hasClass('sortable-cell-active');\n const currentSort = $cellEl.hasClass('sortable-desc') ? 'desc' : 'asc';\n let newSort;\n if (isActive) {\n newSort = currentSort === 'desc' ? 'asc' : 'desc';\n $cellEl.removeClass('sortable-desc sortable-asc').addClass(`sortable-${newSort}`);\n } else {\n $el.find('thead .sortable-cell-active').removeClass('sortable-cell-active');\n $cellEl.addClass('sortable-cell-active');\n newSort = currentSort;\n }\n $cellEl.trigger('datatable:sort', newSort);\n table.emit('local::sort dataTableSort', table, newSort);\n }\n table.attachEvents = function attachEvents() {\n table.$el.on('change', '.checkbox-cell input[type=\"checkbox\"]', handleChange);\n table.$el.find('thead .sortable-cell').on('click', handleSortableClick);\n };\n table.detachEvents = function detachEvents() {\n table.$el.off('change', '.checkbox-cell input[type=\"checkbox\"]', handleChange);\n table.$el.find('thead .sortable-cell').off('click', handleSortableClick);\n };\n\n // Install Modules\n table.useModules();\n\n // Init\n table.init();\n return table;\n }\n setCollapsibleLabels() {\n const table = this;\n if (!table.collapsible) return;\n table.$el.find('tbody td:not(.checkbox-cell)').each(el => {\n const $el = $(el);\n const elIndex = $el.index();\n const collapsibleTitle = $el.attr('data-collapsible-title');\n if (!collapsibleTitle && collapsibleTitle !== '') {\n $el.attr('data-collapsible-title', table.$el.find('thead th').eq(elIndex).text());\n }\n });\n }\n checkSelectedHeader() {\n const table = this;\n if (table.$headerEl.length > 0 && table.$headerSelectedEl.length > 0) {\n const checkedItems = table.$el.find('tbody .checkbox-cell input:checked').length;\n table.$el[checkedItems > 0 ? 'addClass' : 'removeClass']('data-table-has-checked');\n table.$headerSelectedEl.find('.data-table-selected-count').text(checkedItems);\n }\n }\n init() {\n const table = this;\n table.attachEvents();\n table.setCollapsibleLabels();\n table.checkSelectedHeader();\n }\n destroy() {\n let table = this;\n table.$el.trigger('datatable:beforedestroy');\n table.emit('local::beforeDestroy dataTableBeforeDestroy', table);\n table.detachEvents();\n if (table.$el[0]) {\n table.$el[0].f7DataTable = null;\n delete table.$el[0].f7DataTable;\n }\n deleteProps(table);\n table = null;\n }\n}\nexport default DataTable;","import $ from '../../shared/dom7.js';\nimport DataTable from './data-table-class.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nexport default {\n name: 'dataTable',\n static: {\n DataTable\n },\n create() {\n const app = this;\n app.dataTable = ConstructorMethods({\n defaultSelector: '.data-table',\n constructor: DataTable,\n app,\n domProp: 'f7DataTable'\n });\n },\n on: {\n tabBeforeRemove(tabEl) {\n const app = this;\n $(tabEl).find('.data-table-init').each(tableEl => {\n app.dataTable.destroy(tableEl);\n });\n },\n tabMounted(tabEl) {\n const app = this;\n $(tabEl).find('.data-table-init').each(tableEl => {\n app.dataTable.create({\n el: tableEl\n });\n });\n },\n pageBeforeRemove(page) {\n const app = this;\n page.$el.find('.data-table-init').each(tableEl => {\n app.dataTable.destroy(tableEl);\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.data-table-init').each(tableEl => {\n app.dataTable.create({\n el: tableEl\n });\n });\n }\n },\n vnode: {\n 'data-table-init': {\n insert(vnode) {\n const app = this;\n const tableEl = vnode.elm;\n app.dataTable.create({\n el: tableEl\n });\n },\n destroy(vnode) {\n const app = this;\n const tableEl = vnode.elm;\n app.dataTable.destroy(tableEl);\n }\n }\n }\n};","import $ from '../../shared/dom7.js';\nimport { bindMethods, getTranslate, nextFrame } from '../../shared/utils.js';\nconst Fab = {\n morphOpen(fabEl, targetEl) {\n const app = this;\n const $fabEl = $(fabEl);\n const $targetEl = $(targetEl);\n if ($targetEl.length === 0) return;\n $targetEl.transition(0).addClass('fab-morph-target-visible');\n const target = {\n width: $targetEl[0].offsetWidth,\n height: $targetEl[0].offsetHeight,\n offset: $targetEl.offset(),\n borderRadius: $targetEl.css('border-radius'),\n zIndex: $targetEl.css('z-index')\n };\n const fab = {\n width: $fabEl[0].offsetWidth,\n height: $fabEl[0].offsetHeight,\n offset: $fabEl.offset(),\n translateX: getTranslate($fabEl[0], 'x'),\n translateY: getTranslate($fabEl[0], 'y')\n };\n $fabEl[0].f7FabMorphData = {\n $targetEl,\n target,\n fab\n };\n const diffX = fab.offset.left + fab.width / 2 - (target.offset.left + target.width / 2) - fab.translateX;\n const diffY = fab.offset.top + fab.height / 2 - (target.offset.top + target.height / 2) - fab.translateY;\n const scaleX = target.width / fab.width;\n const scaleY = target.height / fab.height;\n let borderRadius = Math.ceil(parseInt(target.borderRadius, 10) / Math.max(scaleX, scaleY));\n if (borderRadius > 0) borderRadius += 2;\n $fabEl[0].f7FabMorphResizeHandler = function resizeHandler() {\n $fabEl.transition(0).transform('');\n $targetEl.transition(0);\n target.width = $targetEl[0].offsetWidth;\n target.height = $targetEl[0].offsetHeight;\n target.offset = $targetEl.offset();\n fab.offset = $fabEl.offset();\n const diffXNew = fab.offset.left + fab.width / 2 - (target.offset.left + target.width / 2) - fab.translateX;\n const diffYNew = fab.offset.top + fab.height / 2 - (target.offset.top + target.height / 2) - fab.translateY;\n const scaleXNew = target.width / fab.width;\n const scaleYNew = target.height / fab.height;\n $fabEl.transform(`translate3d(${-diffXNew}px, ${-diffYNew}px, 0) scale(${scaleXNew}, ${scaleYNew})`);\n };\n $targetEl.css('opacity', 0).transform(`scale(${1 / scaleX}, ${1 / scaleY})`);\n $fabEl.addClass('fab-opened').css('z-index', target.zIndex - 1).transform(`translate3d(${-diffX}px, ${-diffY}px, 0)`);\n $fabEl.transitionEnd(() => {\n $targetEl.transition('');\n nextFrame(() => {\n $targetEl.css('opacity', 1).transform('scale(1,1)');\n $fabEl.transform(`translate3d(${-diffX}px, ${-diffY}px, 0) scale(${scaleX}, ${scaleY})`).css('border-radius', `${borderRadius}px`).css('box-shadow', 'none').css('opacity', '0');\n });\n app.on('resize', $fabEl[0].f7FabMorphResizeHandler);\n if ($targetEl.parents('.page-content').length > 0) {\n $targetEl.parents('.page-content').on('scroll', $fabEl[0].f7FabMorphResizeHandler);\n }\n });\n },\n morphClose(fabEl) {\n const app = this;\n const $fabEl = $(fabEl);\n const morphData = $fabEl[0].f7FabMorphData;\n if (!morphData) return;\n const {\n $targetEl,\n target,\n fab\n } = morphData;\n if ($targetEl.length === 0) return;\n const diffX = fab.offset.left + fab.width / 2 - (target.offset.left + target.width / 2) - fab.translateX;\n const diffY = fab.offset.top + fab.height / 2 - (target.offset.top + target.height / 2) - fab.translateY;\n const scaleX = target.width / fab.width;\n const scaleY = target.height / fab.height;\n app.off('resize', $fabEl[0].f7FabMorphResizeHandler);\n if ($targetEl.parents('.page-content').length > 0) {\n $targetEl.parents('.page-content').off('scroll', $fabEl[0].f7FabMorphResizeHandler);\n }\n $targetEl.css('opacity', 0).transform(`scale(${1 / scaleX}, ${1 / scaleY})`);\n $fabEl.transition('').css('box-shadow', '').css('border-radius', '').css('opacity', '1').transform(`translate3d(${-diffX}px, ${-diffY}px, 0)`);\n $fabEl.transitionEnd(() => {\n $fabEl.css('z-index', '').removeClass('fab-opened').transform('');\n nextFrame(() => {\n $fabEl.transitionEnd(() => {\n $targetEl.removeClass('fab-morph-target-visible').css('opacity', '').transform('').transition('');\n });\n });\n });\n },\n open(fabEl, targetEl) {\n const app = this;\n const $fabEl = $(fabEl).eq(0);\n const $buttonsEl = $fabEl.find('.fab-buttons');\n if (!$fabEl.length) return;\n if ($fabEl.hasClass('fab-opened')) return;\n if (!$buttonsEl.length && !$fabEl.hasClass('fab-morph')) return;\n if (app.fab.openedEl) {\n if (app.fab.openedEl === $fabEl[0]) return;\n app.fab.close(app.fab.openedEl);\n }\n app.fab.openedEl = $fabEl[0];\n if ($fabEl.hasClass('fab-morph')) {\n app.fab.morphOpen($fabEl, targetEl || $fabEl.attr('data-morph-to'));\n } else {\n $fabEl.addClass('fab-opened');\n }\n $fabEl.siblings('.fab-backdrop').addClass('backdrop-in');\n $fabEl.trigger('fab:open');\n },\n close(fabEl) {\n if (fabEl === void 0) {\n fabEl = '.fab-opened';\n }\n const app = this;\n const $fabEl = $(fabEl).eq(0);\n const $buttonsEl = $fabEl.find('.fab-buttons');\n if (!$fabEl.length) return;\n if (!$fabEl.hasClass('fab-opened')) return;\n if (!$buttonsEl.length && !$fabEl.hasClass('fab-morph')) return;\n app.fab.openedEl = null;\n if ($fabEl.hasClass('fab-morph')) {\n app.fab.morphClose($fabEl);\n } else {\n $fabEl.removeClass('fab-opened');\n }\n $fabEl.siblings('.fab-backdrop').removeClass('backdrop-in');\n $fabEl.trigger('fab:close');\n },\n toggle(fabEl) {\n const app = this;\n const $fabEl = $(fabEl);\n if (!$fabEl.hasClass('fab-opened')) app.fab.open(fabEl);else app.fab.close(fabEl);\n }\n};\nexport default {\n name: 'fab',\n create() {\n const app = this;\n bindMethods(app, {\n fab: {\n openedEl: null,\n ...Fab\n }\n });\n },\n clicks: {\n '.fab > a': function open($clickedEl) {\n const app = this;\n app.fab.toggle($clickedEl.parents('.fab'));\n },\n '.fab-open': function open($clickedEl, data) {\n if (data === void 0) {\n data = {};\n }\n const app = this;\n app.fab.open(data.fab);\n },\n '.fab-close': function close($clickedEl, data) {\n if (data === void 0) {\n data = {};\n }\n const app = this;\n app.fab.close(data.fab);\n },\n '.fab-backdrop': function close() {\n const app = this;\n app.fab.close();\n }\n }\n};","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom7.js';\nimport { extend, nextTick, deleteProps } from '../../shared/utils.js';\nimport FrameworkClass from '../../shared/class.js';\nimport { getDevice } from '../../shared/get-device.js';\nimport removeDiacritics from './remove-diacritics.js';\nclass Searchbar extends FrameworkClass {\n constructor(app, params) {\n if (params === void 0) {\n params = {};\n }\n super(params, [app]);\n const sb = this;\n const defaults = {\n el: undefined,\n inputEl: undefined,\n inputEvents: 'change input compositionend',\n disableButton: true,\n disableButtonEl: undefined,\n backdropEl: undefined,\n searchContainer: undefined,\n // container to search, HTMLElement or CSS selector\n searchItem: 'li',\n // single item selector, CSS selector\n searchIn: undefined,\n // where to search in item, CSS selector\n searchGroup: '.list-group',\n searchGroupTitle: '.list-group-title',\n ignore: '.searchbar-ignore',\n foundEl: '.searchbar-found',\n notFoundEl: '.searchbar-not-found',\n hideOnEnableEl: '.searchbar-hide-on-enable',\n hideOnSearchEl: '.searchbar-hide-on-search',\n backdrop: true,\n removeDiacritics: true,\n customSearch: false,\n hideGroupTitles: true,\n hideGroups: true,\n disableOnBackdropClick: true,\n expandable: false,\n inline: false\n };\n\n // Extend defaults with modules params\n sb.useModulesParams(defaults);\n sb.params = extend(defaults, params);\n const $el = $(sb.params.el);\n if ($el.length === 0) return sb;\n if ($el[0].f7Searchbar) return $el[0].f7Searchbar;\n $el[0].f7Searchbar = sb;\n let $pageEl;\n const $navbarEl = $el.parents('.navbar');\n if ($el.parents('.page').length > 0) {\n $pageEl = $el.parents('.page');\n } else if ($navbarEl.length > 0) {\n $pageEl = $(app.navbar.getPageByEl($navbarEl[0]));\n if (!$pageEl.length) {\n const $currentPageEl = $el.parents('.view').find('.page-current');\n if ($currentPageEl[0] && $currentPageEl[0].f7Page && $currentPageEl[0].f7Page.navbarEl === $navbarEl[0]) {\n $pageEl = $currentPageEl;\n }\n }\n }\n let $foundEl;\n if (params.foundEl) {\n $foundEl = $(params.foundEl);\n } else if (typeof sb.params.foundEl === 'string' && $pageEl) {\n $foundEl = $pageEl.find(sb.params.foundEl);\n }\n let $notFoundEl;\n if (params.notFoundEl) {\n $notFoundEl = $(params.notFoundEl);\n } else if (typeof sb.params.notFoundEl === 'string' && $pageEl) {\n $notFoundEl = $pageEl.find(sb.params.notFoundEl);\n }\n let $hideOnEnableEl;\n if (params.hideOnEnableEl) {\n $hideOnEnableEl = $(params.hideOnEnableEl);\n } else if (typeof sb.params.hideOnEnableEl === 'string' && $pageEl) {\n $hideOnEnableEl = $pageEl.find(sb.params.hideOnEnableEl);\n }\n let $hideOnSearchEl;\n if (params.hideOnSearchEl) {\n $hideOnSearchEl = $(params.hideOnSearchEl);\n } else if (typeof sb.params.hideOnSearchEl === 'string' && $pageEl) {\n $hideOnSearchEl = $pageEl.find(sb.params.hideOnSearchEl);\n }\n const expandable = sb.params.expandable || $el.hasClass('searchbar-expandable');\n const inline = sb.params.inline || $el.hasClass('searchbar-inline');\n if (typeof sb.params.backdrop === 'undefined') {\n sb.params.backdrop = !inline;\n }\n let $backdropEl;\n if (sb.params.backdrop) {\n if (sb.params.backdropEl) {\n $backdropEl = $(sb.params.backdropEl);\n } else if ($pageEl && $pageEl.length > 0) {\n $backdropEl = $pageEl.find('.searchbar-backdrop');\n } else {\n $backdropEl = $el.siblings('.searchbar-backdrop');\n }\n if ($backdropEl.length === 0) {\n $backdropEl = $('');\n if ($pageEl && $pageEl.length) {\n if ($el.parents($pageEl).length > 0 && $navbarEl && $el.parents($navbarEl).length === 0) {\n $backdropEl.insertBefore($el);\n } else {\n $backdropEl.insertBefore($pageEl.find('.page-content').eq(0));\n }\n } else {\n $backdropEl.insertBefore($el);\n }\n }\n }\n let $searchContainer;\n if (sb.params.searchContainer) {\n $searchContainer = $(sb.params.searchContainer);\n }\n let $inputEl;\n if (sb.params.inputEl) {\n $inputEl = $(sb.params.inputEl);\n } else {\n $inputEl = $el.find('input[type=\"search\"]').eq(0);\n }\n let $disableButtonEl;\n if (sb.params.disableButton) {\n if (sb.params.disableButtonEl) {\n $disableButtonEl = $(sb.params.disableButtonEl);\n } else {\n $disableButtonEl = $el.find('.searchbar-disable-button');\n }\n }\n extend(sb, {\n app,\n view: app.views.get($el.parents('.view')),\n $el,\n el: $el[0],\n $backdropEl,\n backdropEl: $backdropEl && $backdropEl[0],\n $searchContainer,\n searchContainer: $searchContainer && $searchContainer[0],\n $inputEl,\n inputEl: $inputEl[0],\n $disableButtonEl,\n disableButtonEl: $disableButtonEl && $disableButtonEl[0],\n disableButtonHasMargin: false,\n $pageEl,\n pageEl: $pageEl && $pageEl[0],\n $navbarEl,\n navbarEl: $navbarEl && $navbarEl[0],\n $foundEl,\n foundEl: $foundEl && $foundEl[0],\n $notFoundEl,\n notFoundEl: $notFoundEl && $notFoundEl[0],\n $hideOnEnableEl,\n hideOnEnableEl: $hideOnEnableEl && $hideOnEnableEl[0],\n $hideOnSearchEl,\n hideOnSearchEl: $hideOnSearchEl && $hideOnSearchEl[0],\n previousQuery: '',\n query: '',\n isVirtualList: $searchContainer && $searchContainer.hasClass('virtual-list'),\n virtualList: undefined,\n enabled: false,\n expandable,\n inline\n });\n\n // Events\n function preventSubmit(e) {\n e.preventDefault();\n }\n function onInputFocus(e) {\n sb.enable(e);\n sb.$el.addClass('searchbar-focused');\n }\n function onInputBlur() {\n sb.$el.removeClass('searchbar-focused');\n }\n function onInputChange() {\n const value = sb.$inputEl.val().trim();\n if (sb.$searchContainer && sb.$searchContainer.length > 0 && (sb.params.searchIn || sb.isVirtualList || sb.params.searchIn === sb.params.searchItem) || sb.params.customSearch) {\n sb.search(value, true);\n }\n }\n function onInputClear(e, previousValue) {\n sb.$el.trigger('searchbar:clear', previousValue);\n sb.emit('local::clear searchbarClear', sb, previousValue);\n }\n function disableOnClick(e) {\n sb.disable(e);\n }\n function onPageBeforeOut() {\n if (!sb || sb && !sb.$el) return;\n if (sb.enabled) {\n sb.$el.removeClass('searchbar-enabled');\n if (sb.expandable) {\n sb.$el.parents('.navbar').removeClass('with-searchbar-expandable-enabled with-searchbar-expandable-enabled-no-transition');\n }\n }\n }\n function onPageBeforeIn() {\n if (!sb || sb && !sb.$el) return;\n if (sb.enabled) {\n sb.$el.addClass('searchbar-enabled');\n if (sb.expandable) {\n sb.$el.parents('.navbar').addClass('with-searchbar-expandable-enabled-no-transition');\n }\n }\n }\n sb.attachEvents = function attachEvents() {\n $el.on('submit', preventSubmit);\n if (sb.params.disableButton) {\n sb.$disableButtonEl.on('click', disableOnClick);\n }\n if (sb.params.disableOnBackdropClick && sb.$backdropEl) {\n sb.$backdropEl.on('click', disableOnClick);\n }\n if (sb.expandable && app.theme === 'ios' && sb.view && $navbarEl.length && sb.$pageEl) {\n sb.$pageEl.on('page:beforeout', onPageBeforeOut);\n sb.$pageEl.on('page:beforein', onPageBeforeIn);\n }\n sb.$inputEl.on('focus', onInputFocus);\n sb.$inputEl.on('blur', onInputBlur);\n sb.$inputEl.on(sb.params.inputEvents, onInputChange);\n sb.$inputEl.on('input:clear', onInputClear);\n };\n sb.detachEvents = function detachEvents() {\n $el.off('submit', preventSubmit);\n if (sb.params.disableButton) {\n sb.$disableButtonEl.off('click', disableOnClick);\n }\n if (sb.params.disableOnBackdropClick && sb.$backdropEl) {\n sb.$backdropEl.off('click', disableOnClick);\n }\n if (sb.expandable && app.theme === 'ios' && sb.view && $navbarEl.length && sb.$pageEl) {\n sb.$pageEl.off('page:beforeout', onPageBeforeOut);\n sb.$pageEl.off('page:beforein', onPageBeforeIn);\n }\n sb.$inputEl.off('focus', onInputFocus);\n sb.$inputEl.off('blur', onInputBlur);\n sb.$inputEl.off(sb.params.inputEvents, onInputChange);\n sb.$inputEl.off('input:clear', onInputClear);\n };\n\n // Install Modules\n sb.useModules();\n\n // Init\n sb.init();\n return sb;\n }\n clear(e) {\n const sb = this;\n if (!sb.query && e && $(e.target).hasClass('searchbar-clear')) {\n sb.disable();\n return sb;\n }\n const previousQuery = sb.value;\n sb.$inputEl.val('').trigger('change').focus();\n sb.$el.trigger('searchbar:clear', previousQuery);\n sb.emit('local::clear searchbarClear', sb, previousQuery);\n return sb;\n }\n setDisableButtonMargin() {\n const sb = this;\n if (sb.expandable) return;\n const app = sb.app;\n sb.$disableButtonEl.transition(0).show();\n sb.$disableButtonEl.css(`margin-${app.rtl ? 'left' : 'right'}`, `${-sb.disableButtonEl.offsetWidth}px`);\n /* eslint no-underscore-dangle: [\"error\", { \"allow\": [\"_clientLeft\"] }] */\n sb._clientLeft = sb.$disableButtonEl[0].clientLeft;\n sb.$disableButtonEl.transition('');\n sb.disableButtonHasMargin = true;\n }\n enable(setFocus) {\n const sb = this;\n if (sb.enabled) return sb;\n const app = sb.app;\n const document = getDocument();\n const device = getDevice();\n sb.enabled = true;\n function enable() {\n if (sb.$backdropEl && (sb.$searchContainer && sb.$searchContainer.length || sb.params.customSearch) && !sb.$el.hasClass('searchbar-enabled') && !sb.query) {\n sb.backdropShow();\n }\n sb.$el.addClass('searchbar-enabled');\n if (!sb.$disableButtonEl || sb.$disableButtonEl && sb.$disableButtonEl.length === 0) {\n sb.$el.addClass('searchbar-enabled-no-disable-button');\n }\n if (!sb.expandable && sb.$disableButtonEl && sb.$disableButtonEl.length > 0 && app.theme !== 'md') {\n if (!sb.disableButtonHasMargin) {\n sb.setDisableButtonMargin();\n }\n sb.$disableButtonEl.css(`margin-${app.rtl ? 'left' : 'right'}`, '0px');\n }\n if (sb.expandable) {\n const $navbarEl = sb.$el.parents('.navbar');\n if ($navbarEl.hasClass('navbar-large') && sb.$pageEl) {\n const $pageContentEl = sb.$pageEl.find('.page-content');\n const $titleLargeEl = $navbarEl.find('.title-large');\n $pageContentEl.addClass('with-searchbar-expandable-enabled');\n if ($navbarEl.hasClass('navbar-large') && $navbarEl.hasClass('navbar-large-collapsed') && $titleLargeEl.length && $pageContentEl.length) {\n $pageContentEl.transition(0);\n $pageContentEl[0].scrollTop -= $titleLargeEl[0].offsetHeight;\n setTimeout(() => {\n $pageContentEl.transition('');\n }, 200);\n }\n }\n if (app.theme === 'md' && $navbarEl.length) {\n $navbarEl.addClass('with-searchbar-expandable-enabled');\n } else {\n $navbarEl.addClass('with-searchbar-expandable-enabled');\n if ($navbarEl.hasClass('navbar-large')) {\n $navbarEl.addClass('navbar-large-collapsed');\n }\n }\n }\n if (sb.$hideOnEnableEl) sb.$hideOnEnableEl.addClass('hidden-by-searchbar');\n sb.$el.trigger('searchbar:enable');\n sb.emit('local::enable searchbarEnable', sb);\n }\n let needsFocus = false;\n if (setFocus === true) {\n if (document.activeElement !== sb.inputEl) {\n needsFocus = true;\n }\n }\n const isIos = device.ios && app.theme === 'ios';\n if (isIos) {\n if (sb.expandable) {\n if (needsFocus) sb.$inputEl.focus();\n enable();\n } else {\n if (needsFocus) sb.$inputEl.focus();\n if (setFocus && (setFocus.type === 'focus' || setFocus === true)) {\n nextTick(() => {\n enable();\n }, 400);\n } else {\n enable();\n }\n }\n } else {\n if (needsFocus) sb.$inputEl.focus();\n if (app.theme === 'md' && sb.expandable) {\n sb.$el.parents('.page, .view, .navbar-inner, .navbar').scrollLeft(app.rtl ? 100 : 0);\n }\n enable();\n }\n return sb;\n }\n disable() {\n const sb = this;\n if (!sb.enabled) return sb;\n const app = sb.app;\n sb.$inputEl.val('').trigger('change');\n sb.$el.removeClass('searchbar-enabled searchbar-focused searchbar-enabled-no-disable-button');\n if (sb.expandable) {\n const $navbarEl = sb.$el.parents('.navbar');\n const $pageContentEl = sb.$pageEl && sb.$pageEl.find('.page-content');\n if ($navbarEl.hasClass('navbar-large') && $pageContentEl.length) {\n const $titleLargeEl = $navbarEl.find('.title-large');\n sb.$el.transitionEnd(() => {\n $pageContentEl.removeClass('with-searchbar-expandable-closing');\n });\n if ($navbarEl.hasClass('navbar-large') && $navbarEl.hasClass('navbar-large-collapsed') && $titleLargeEl.length) {\n const scrollTop = $pageContentEl[0].scrollTop;\n const titleLargeHeight = $titleLargeEl[0].offsetHeight;\n if (scrollTop > titleLargeHeight) {\n $pageContentEl.transition(0);\n $pageContentEl[0].scrollTop = scrollTop + titleLargeHeight;\n setTimeout(() => {\n $pageContentEl.transition('');\n }, 200);\n }\n }\n $pageContentEl.removeClass('with-searchbar-expandable-enabled').addClass('with-searchbar-expandable-closing');\n }\n if (app.theme === 'md' && $navbarEl.length) {\n $navbarEl.removeClass('with-searchbar-expandable-enabled with-searchbar-expandable-enabled-no-transition').addClass('with-searchbar-expandable-closing');\n sb.$el.transitionEnd(() => {\n $navbarEl.removeClass('with-searchbar-expandable-closing');\n });\n } else {\n $navbarEl.removeClass('with-searchbar-expandable-enabled with-searchbar-expandable-enabled-no-transition').addClass('with-searchbar-expandable-closing');\n sb.$el.transitionEnd(() => {\n $navbarEl.removeClass('with-searchbar-expandable-closing');\n });\n if (sb.$pageEl) {\n sb.$pageEl.find('.page-content').trigger('scroll');\n }\n }\n }\n if (!sb.expandable && sb.$disableButtonEl && sb.$disableButtonEl.length > 0 && app.theme !== 'md') {\n sb.$disableButtonEl.css(`margin-${app.rtl ? 'left' : 'right'}`, `${-sb.disableButtonEl.offsetWidth}px`);\n }\n if (sb.$backdropEl && (sb.$searchContainer && sb.$searchContainer.length || sb.params.customSearch)) {\n sb.backdropHide();\n }\n sb.enabled = false;\n sb.$inputEl.blur();\n if (sb.$hideOnEnableEl) sb.$hideOnEnableEl.removeClass('hidden-by-searchbar');\n sb.$el.trigger('searchbar:disable');\n sb.emit('local::disable searchbarDisable', sb);\n return sb;\n }\n toggle() {\n const sb = this;\n if (sb.enabled) sb.disable();else sb.enable(true);\n return sb;\n }\n backdropShow() {\n const sb = this;\n if (sb.$backdropEl) {\n sb.$backdropEl.addClass('searchbar-backdrop-in');\n }\n return sb;\n }\n backdropHide() {\n const sb = this;\n if (sb.$backdropEl) {\n sb.$backdropEl.removeClass('searchbar-backdrop-in');\n }\n return sb;\n }\n search(query, internal) {\n const sb = this;\n sb.previousQuery = sb.query || '';\n if (query === sb.previousQuery) return sb;\n if (!internal) {\n if (!sb.enabled) {\n sb.enable();\n }\n sb.$inputEl.val(query);\n sb.$inputEl.trigger('input');\n }\n sb.query = query;\n sb.value = query;\n const {\n $searchContainer,\n $el,\n $foundEl,\n $notFoundEl,\n $hideOnSearchEl,\n isVirtualList\n } = sb;\n\n // Hide on search element\n if (query.length > 0 && $hideOnSearchEl) {\n $hideOnSearchEl.addClass('hidden-by-searchbar');\n } else if ($hideOnSearchEl) {\n $hideOnSearchEl.removeClass('hidden-by-searchbar');\n }\n // Add active/inactive classes on overlay\n if ($searchContainer && $searchContainer.length && $el.hasClass('searchbar-enabled') || sb.params.customSearch && $el.hasClass('searchbar-enabled')) {\n if (query.length === 0) {\n sb.backdropShow();\n } else {\n sb.backdropHide();\n }\n }\n if (sb.params.customSearch) {\n $el.trigger('searchbar:search', {\n query,\n previousQuery: sb.previousQuery\n });\n sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery);\n return sb;\n }\n let foundItems = [];\n let vlQuery;\n if (isVirtualList) {\n sb.virtualList = $searchContainer[0].f7VirtualList;\n if (query.trim() === '') {\n sb.virtualList.resetFilter();\n if ($notFoundEl) $notFoundEl.hide();\n if ($foundEl) $foundEl.show();\n $el.trigger('searchbar:search', {\n query,\n previousQuery: sb.previousQuery\n });\n sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery);\n return sb;\n }\n vlQuery = sb.params.removeDiacritics ? removeDiacritics(query) : query;\n if (sb.virtualList.params.searchAll) {\n foundItems = sb.virtualList.params.searchAll(vlQuery, sb.virtualList.items) || [];\n } else if (sb.virtualList.params.searchByItem) {\n for (let i = 0; i < sb.virtualList.items.length; i += 1) {\n if (sb.virtualList.params.searchByItem(vlQuery, sb.virtualList.items[i], i)) {\n foundItems.push(i);\n }\n }\n }\n } else {\n let values;\n if (sb.params.removeDiacritics) values = removeDiacritics(query.trim().toLowerCase()).split(' ');else {\n values = query.trim().toLowerCase().split(' ');\n }\n $searchContainer.find(sb.params.searchItem).removeClass('hidden-by-searchbar').each(itemEl => {\n const $itemEl = $(itemEl);\n let compareWithText = [];\n let $searchIn = sb.params.searchIn ? $itemEl.find(sb.params.searchIn) : $itemEl;\n if (sb.params.searchIn === sb.params.searchItem) {\n $searchIn = $itemEl;\n }\n $searchIn.each(searchInEl => {\n let itemText = $(searchInEl).text().trim().toLowerCase();\n if (sb.params.removeDiacritics) itemText = removeDiacritics(itemText);\n compareWithText.push(itemText);\n });\n compareWithText = compareWithText.join(' ');\n let wordsMatch = 0;\n for (let i = 0; i < values.length; i += 1) {\n if (compareWithText.indexOf(values[i]) >= 0) wordsMatch += 1;\n }\n if (wordsMatch !== values.length && !(sb.params.ignore && $itemEl.is(sb.params.ignore))) {\n $itemEl.addClass('hidden-by-searchbar');\n } else {\n foundItems.push($itemEl[0]);\n }\n });\n if (sb.params.hideGroupTitles) {\n $searchContainer.find(sb.params.searchGroupTitle).each(titleEl => {\n const $titleEl = $(titleEl);\n const $nextElements = $titleEl.nextAll(sb.params.searchItem);\n let hide = true;\n for (let i = 0; i < $nextElements.length; i += 1) {\n const $nextEl = $nextElements.eq(i);\n if ($nextEl.is(sb.params.searchGroupTitle)) break;\n if (!$nextEl.hasClass('hidden-by-searchbar')) {\n hide = false;\n }\n }\n const ignore = sb.params.ignore && $titleEl.is(sb.params.ignore);\n if (hide && !ignore) $titleEl.addClass('hidden-by-searchbar');else $titleEl.removeClass('hidden-by-searchbar');\n });\n }\n if (sb.params.hideGroups) {\n $searchContainer.find(sb.params.searchGroup).each(groupEl => {\n const $groupEl = $(groupEl);\n const ignore = sb.params.ignore && $groupEl.is(sb.params.ignore);\n // eslint-disable-next-line\n const notHidden = $groupEl.find(sb.params.searchItem).filter(el => {\n return !$(el).hasClass('hidden-by-searchbar');\n });\n if (notHidden.length === 0 && !ignore) {\n $groupEl.addClass('hidden-by-searchbar');\n } else {\n $groupEl.removeClass('hidden-by-searchbar');\n }\n });\n }\n }\n if (foundItems.length === 0) {\n if ($notFoundEl) $notFoundEl.show();\n if ($foundEl) $foundEl.hide();\n } else {\n if ($notFoundEl) $notFoundEl.hide();\n if ($foundEl) $foundEl.show();\n }\n if (isVirtualList && sb.virtualList) {\n sb.virtualList.filterItems(foundItems);\n }\n $el.trigger('searchbar:search', {\n query,\n previousQuery: sb.previousQuery,\n foundItems\n });\n sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery, foundItems);\n return sb;\n }\n init() {\n const sb = this;\n if (sb.expandable && sb.$el) sb.$el.addClass('searchbar-expandable');\n if (sb.inline && sb.$el) sb.$el.addClass('searchbar-inline');\n sb.attachEvents();\n }\n destroy() {\n const sb = this;\n sb.emit('local::beforeDestroy searchbarBeforeDestroy', sb);\n sb.$el.trigger('searchbar:beforedestroy');\n sb.detachEvents();\n if (sb.$el[0]) {\n sb.$el[0].f7Searchbar = null;\n delete sb.$el[0].f7Searchbar;\n }\n deleteProps(sb);\n }\n}\nexport default Searchbar;","import $ from '../../shared/dom7.js';\nimport { extend } from '../../shared/utils.js';\nimport Searchbar from './searchbar-class.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nexport default {\n name: 'searchbar',\n static: {\n Searchbar\n },\n create() {\n const app = this;\n app.searchbar = ConstructorMethods({\n defaultSelector: '.searchbar',\n constructor: Searchbar,\n app,\n domProp: 'f7Searchbar',\n addMethods: 'clear enable disable toggle search'.split(' ')\n });\n },\n on: {\n tabMounted(tabEl) {\n const app = this;\n $(tabEl).find('.searchbar-init').each(searchbarEl => {\n const $searchbarEl = $(searchbarEl);\n app.searchbar.create(extend($searchbarEl.dataset(), {\n el: searchbarEl\n }));\n });\n },\n tabBeforeRemove(tabEl) {\n $(tabEl).find('.searchbar-init').each(searchbarEl => {\n if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {\n searchbarEl.f7Searchbar.destroy();\n }\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.searchbar-init').each(searchbarEl => {\n const $searchbarEl = $(searchbarEl);\n app.searchbar.create(extend($searchbarEl.dataset(), {\n el: searchbarEl\n }));\n });\n if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {\n page.$navbarEl.find('.searchbar-init').each(searchbarEl => {\n const $searchbarEl = $(searchbarEl);\n app.searchbar.create(extend($searchbarEl.dataset(), {\n el: searchbarEl\n }));\n });\n }\n },\n pageBeforeRemove(page) {\n const app = this;\n page.$el.find('.searchbar-init').each(searchbarEl => {\n if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {\n searchbarEl.f7Searchbar.destroy();\n }\n });\n if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {\n page.$navbarEl.find('.searchbar-init').each(searchbarEl => {\n if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {\n searchbarEl.f7Searchbar.destroy();\n }\n });\n }\n }\n },\n clicks: {\n '.searchbar-clear': function clear($clickedEl, data) {\n if (data === void 0) {\n data = {};\n }\n const app = this;\n const sb = app.searchbar.get(data.searchbar);\n if (sb) sb.clear();\n },\n '.searchbar-enable': function enable($clickedEl, data) {\n if (data === void 0) {\n data = {};\n }\n const app = this;\n const sb = app.searchbar.get(data.searchbar);\n if (sb) sb.enable(true);\n },\n '.searchbar-disable': function disable($clickedEl, data) {\n if (data === void 0) {\n data = {};\n }\n const app = this;\n const sb = app.searchbar.get(data.searchbar);\n if (sb) sb.disable();\n },\n '.searchbar-toggle': function toggle($clickedEl, data) {\n if (data === void 0) {\n data = {};\n }\n const app = this;\n const sb = app.searchbar.get(data.searchbar);\n if (sb) sb.toggle();\n }\n },\n vnode: {\n 'searchbar-init': {\n insert(vnode) {\n const app = this;\n const searchbarEl = vnode.elm;\n const $searchbarEl = $(searchbarEl);\n app.searchbar.create(extend($searchbarEl.dataset(), {\n el: searchbarEl\n }));\n },\n destroy(vnode) {\n const searchbarEl = vnode.elm;\n if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {\n searchbarEl.f7Searchbar.destroy();\n }\n }\n }\n }\n};","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport $ from '../../shared/dom7.js';\nimport { extend, deleteProps } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\n/** @jsx $jsx */\nimport $jsx from '../../shared/$jsx.js';\nclass Messages extends Framework7Class {\n constructor(app, params) {\n if (params === void 0) {\n params = {};\n }\n super(params, [app]);\n const m = this;\n const defaults = {\n autoLayout: true,\n messages: [],\n newMessagesFirst: false,\n scrollMessages: true,\n scrollMessagesOnEdge: true,\n firstMessageRule: undefined,\n lastMessageRule: undefined,\n tailMessageRule: undefined,\n sameNameMessageRule: undefined,\n sameHeaderMessageRule: undefined,\n sameFooterMessageRule: undefined,\n sameAvatarMessageRule: undefined,\n customClassMessageRule: undefined,\n renderMessage: undefined\n };\n\n // Extend defaults with modules params\n m.useModulesParams(defaults);\n m.params = extend(defaults, params);\n const $el = $(params.el).eq(0);\n if ($el.length === 0) return m;\n if ($el[0].f7Messages) return $el[0].f7Messages;\n $el[0].f7Messages = m;\n const $pageContentEl = $el.closest('.page-content').eq(0);\n extend(m, {\n messages: m.params.messages,\n $el,\n el: $el[0],\n $pageContentEl,\n pageContentEl: $pageContentEl[0]\n });\n // Install Modules\n m.useModules();\n\n // Init\n m.init();\n return m;\n }\n // eslint-disable-next-line\n getMessageData(messageEl) {\n const $messageEl = $(messageEl);\n const data = {\n name: $messageEl.find('.message-name').html(),\n header: $messageEl.find('.message-header').html(),\n textHeader: $messageEl.find('.message-text-header').html(),\n textFooter: $messageEl.find('.message-text-footer').html(),\n footer: $messageEl.find('.message-footer').html(),\n isTitle: $messageEl.hasClass('messages-title'),\n type: $messageEl.hasClass('message-sent') ? 'sent' : 'received',\n text: $messageEl.find('.message-text').html(),\n image: $messageEl.find('.message-image').html(),\n imageSrc: $messageEl.find('.message-image img').attr('src'),\n typing: $messageEl.hasClass('message-typing')\n };\n if (data.isTitle) {\n data.text = $messageEl.html();\n }\n if (data.text && data.textHeader) {\n data.text = data.text.replace(``, '');\n }\n if (data.text && data.textFooter) {\n data.text = data.text.replace(``, '');\n }\n let avatar = $messageEl.find('.message-avatar').css('background-image');\n if (avatar === 'none' || avatar === '') avatar = undefined;\n if (avatar && typeof avatar === 'string') {\n avatar = avatar.replace('url(', '').replace(')', '').replace(/\"/g, '').replace(/'/g, '');\n } else {\n avatar = undefined;\n }\n data.avatar = avatar;\n return data;\n }\n getMessagesData() {\n const m = this;\n const data = [];\n m.$el.find('.message, .messages-title').each(messageEl => {\n data.push(m.getMessageData(messageEl));\n });\n return data;\n }\n renderMessage(messageToRender) {\n const m = this;\n const message = extend({\n type: 'sent',\n attrs: {}\n }, messageToRender);\n if (m.params.renderMessage) {\n return m.params.renderMessage.call(m, message);\n }\n if (message.isTitle) {\n return `${message.text}
`;\n }\n return $jsx(\"div\", _extends({\n class: `message message-${message.type} ${message.isTyping ? 'message-typing' : ''} ${message.cssClass || ''}`\n }, message.attrs), message.avatar && $jsx(\"div\", {\n class: \"message-avatar\",\n style: `background-image:url(${message.avatar})`\n }), $jsx(\"div\", {\n class: \"message-content\"\n }, message.name && $jsx(\"div\", {\n class: \"message-name\"\n }, message.name), message.header && $jsx(\"div\", {\n class: \"message-header\"\n }, message.header), $jsx(\"div\", {\n class: \"message-bubble\"\n }, message.textHeader && $jsx(\"div\", {\n class: \"message-text-header\"\n }, message.textHeader), message.image && $jsx(\"div\", {\n class: \"message-image\"\n }, message.image), message.imageSrc && !message.image && $jsx(\"div\", {\n class: \"message-image\"\n }, $jsx(\"img\", {\n src: message.imageSrc\n })), (message.text || message.isTyping) && $jsx(\"div\", {\n class: \"message-text\"\n }, message.text || '', message.isTyping && $jsx(\"div\", {\n class: \"message-typing-indicator\"\n }, $jsx(\"div\", null), $jsx(\"div\", null), $jsx(\"div\", null))), message.textFooter && $jsx(\"div\", {\n class: \"message-text-footer\"\n }, message.textFooter)), message.footer && $jsx(\"div\", {\n class: \"message-footer\"\n }, message.footer)));\n }\n renderMessages(messagesToRender, method) {\n if (messagesToRender === void 0) {\n messagesToRender = this.messages;\n }\n if (method === void 0) {\n method = this.params.newMessagesFirst ? 'prepend' : 'append';\n }\n const m = this;\n const html = messagesToRender.map(message => m.renderMessage(message)).join('');\n m.$el[method](html);\n }\n isFirstMessage() {\n const m = this;\n if (m.params.firstMessageRule) return m.params.firstMessageRule(...arguments);\n return false;\n }\n isLastMessage() {\n const m = this;\n if (m.params.lastMessageRule) return m.params.lastMessageRule(...arguments);\n return false;\n }\n isTailMessage() {\n const m = this;\n if (m.params.tailMessageRule) return m.params.tailMessageRule(...arguments);\n return false;\n }\n isSameNameMessage() {\n const m = this;\n if (m.params.sameNameMessageRule) return m.params.sameNameMessageRule(...arguments);\n return false;\n }\n isSameHeaderMessage() {\n const m = this;\n if (m.params.sameHeaderMessageRule) return m.params.sameHeaderMessageRule(...arguments);\n return false;\n }\n isSameFooterMessage() {\n const m = this;\n if (m.params.sameFooterMessageRule) return m.params.sameFooterMessageRule(...arguments);\n return false;\n }\n isSameAvatarMessage() {\n const m = this;\n if (m.params.sameAvatarMessageRule) return m.params.sameAvatarMessageRule(...arguments);\n return false;\n }\n isCustomClassMessage() {\n const m = this;\n if (m.params.customClassMessageRule) return m.params.customClassMessageRule(...arguments);\n return undefined;\n }\n layout() {\n const m = this;\n m.$el.find('.message, .messages-title').each((messageEl, index) => {\n const $messageEl = $(messageEl);\n if (!m.messages) {\n m.messages = m.getMessagesData();\n }\n const classes = [];\n const message = m.messages[index];\n const previousMessage = m.messages[index - 1];\n const nextMessage = m.messages[index + 1];\n if (m.isFirstMessage(message, previousMessage, nextMessage)) {\n classes.push('message-first');\n }\n if (m.isLastMessage(message, previousMessage, nextMessage)) {\n classes.push('message-last');\n }\n if (m.isTailMessage(message, previousMessage, nextMessage)) {\n classes.push('message-tail');\n }\n if (m.isSameNameMessage(message, previousMessage, nextMessage)) {\n classes.push('message-same-name');\n }\n if (m.isSameHeaderMessage(message, previousMessage, nextMessage)) {\n classes.push('message-same-header');\n }\n if (m.isSameFooterMessage(message, previousMessage, nextMessage)) {\n classes.push('message-same-footer');\n }\n if (m.isSameAvatarMessage(message, previousMessage, nextMessage)) {\n classes.push('message-same-avatar');\n }\n let customMessageClasses = m.isCustomClassMessage(message, previousMessage, nextMessage);\n if (customMessageClasses && customMessageClasses.length) {\n if (typeof customMessageClasses === 'string') {\n customMessageClasses = customMessageClasses.split(' ');\n }\n customMessageClasses.forEach(customClass => {\n classes.push(customClass);\n });\n }\n $messageEl.removeClass('message-first message-last message-tail message-same-name message-same-header message-same-footer message-same-avatar');\n classes.forEach(className => {\n $messageEl.addClass(className);\n });\n });\n }\n clear() {\n const m = this;\n m.messages = [];\n m.$el.html('');\n }\n removeMessage(messageToRemove, layout) {\n if (layout === void 0) {\n layout = true;\n }\n const m = this;\n // Index or El\n let index;\n let $el;\n if (typeof messageToRemove === 'number') {\n index = messageToRemove;\n $el = m.$el.find('.message, .messages-title').eq(index);\n } else if (m.messages && m.messages.indexOf(messageToRemove) >= 0) {\n index = m.messages.indexOf(messageToRemove);\n $el = m.$el.children().eq(index);\n } else {\n $el = $(messageToRemove);\n index = $el.index();\n }\n if ($el.length === 0) {\n return m;\n }\n $el.remove();\n m.messages.splice(index, 1);\n if (m.params.autoLayout && layout) m.layout();\n return m;\n }\n removeMessages(messagesToRemove, layout) {\n if (layout === void 0) {\n layout = true;\n }\n const m = this;\n if (Array.isArray(messagesToRemove)) {\n const messagesToRemoveEls = [];\n messagesToRemove.forEach(messageToRemoveIndex => {\n messagesToRemoveEls.push(m.$el.find('.message, .messages-title').eq(messageToRemoveIndex));\n });\n messagesToRemoveEls.forEach(messageToRemove => {\n m.removeMessage(messageToRemove, false);\n });\n } else {\n $(messagesToRemove).each(messageToRemove => {\n m.removeMessage(messageToRemove, false);\n });\n }\n if (m.params.autoLayout && layout) m.layout();\n return m;\n }\n addMessage() {\n const m = this;\n let messageToAdd;\n let animate;\n let method;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (typeof args[1] === 'boolean') {\n [messageToAdd, animate, method] = args;\n } else {\n [messageToAdd, method, animate] = args;\n }\n if (typeof animate === 'undefined') {\n animate = true;\n }\n if (typeof method === 'undefined') {\n method = m.params.newMessagesFirst ? 'prepend' : 'append';\n }\n return m.addMessages([messageToAdd], animate, method);\n }\n setScrollData() {\n const m = this;\n // Define scroll positions before new messages added\n const scrollHeightBefore = m.pageContentEl.scrollHeight;\n const heightBefore = m.pageContentEl.offsetHeight;\n const scrollBefore = m.pageContentEl.scrollTop;\n m.scrollData = {\n scrollHeightBefore,\n heightBefore,\n scrollBefore\n };\n return {\n scrollHeightBefore,\n heightBefore,\n scrollBefore\n };\n }\n addMessages() {\n const m = this;\n let messagesToAdd;\n let animate;\n let method;\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n if (typeof args[1] === 'boolean') {\n [messagesToAdd, animate, method] = args;\n } else {\n [messagesToAdd, method, animate] = args;\n }\n if (typeof animate === 'undefined') {\n animate = true;\n }\n if (typeof method === 'undefined') {\n method = m.params.newMessagesFirst ? 'prepend' : 'append';\n }\n const {\n scrollHeightBefore,\n scrollBefore\n } = m.setScrollData();\n\n // Add message to DOM and data\n let messagesHTML = '';\n const typingMessage = m.messages.filter(el => el.isTyping)[0];\n messagesToAdd.forEach(messageToAdd => {\n if (typingMessage) {\n if (method === 'append') {\n m.messages.splice(m.messages.indexOf(typingMessage), 0, messageToAdd);\n } else {\n m.messages.splice(m.messages.indexOf(typingMessage) + 1, 0, messageToAdd);\n }\n } else {\n m.messages[method === 'append' ? 'push' : 'unshift'](messageToAdd);\n }\n messagesHTML += m.renderMessage(messageToAdd);\n });\n const $messagesEls = $(messagesHTML);\n if (animate) {\n if (method === 'append' && !m.params.newMessagesFirst) {\n $messagesEls.addClass('message-appear-from-bottom');\n }\n if (method === 'prepend' && m.params.newMessagesFirst) {\n $messagesEls.addClass('message-appear-from-top');\n }\n }\n if (typingMessage) {\n if (method === 'append') {\n $messagesEls.insertBefore(m.$el.find('.message-typing'));\n } else {\n $messagesEls.insertAfter(m.$el.find('.message-typing'));\n }\n } else {\n m.$el[method]($messagesEls);\n }\n\n // Layout\n if (m.params.autoLayout) m.layout();\n if (method === 'prepend' && !typingMessage) {\n m.pageContentEl.scrollTop = scrollBefore + (m.pageContentEl.scrollHeight - scrollHeightBefore);\n }\n if (m.params.scrollMessages && (method === 'append' && !m.params.newMessagesFirst || method === 'prepend' && m.params.newMessagesFirst && !typingMessage)) {\n m.scrollWithEdgeCheck(animate);\n }\n return m;\n }\n showTyping(message) {\n if (message === void 0) {\n message = {};\n }\n const m = this;\n const typingMessage = m.messages.filter(el => el.isTyping)[0];\n if (typingMessage) {\n m.removeMessage(m.messages.indexOf(typingMessage));\n }\n m.addMessage(extend({\n type: 'received',\n isTyping: true\n }, message));\n return m;\n }\n hideTyping() {\n const m = this;\n let typingMessageIndex;\n let typingFound;\n m.messages.forEach((message, index) => {\n if (message.isTyping) typingMessageIndex = index;\n });\n if (typeof typingMessageIndex !== 'undefined') {\n if (m.$el.find('.message').eq(typingMessageIndex).hasClass('message-typing')) {\n typingFound = true;\n m.removeMessage(typingMessageIndex);\n }\n }\n if (!typingFound) {\n const $typingMessageEl = m.$el.find('.message-typing');\n if ($typingMessageEl.length) {\n m.removeMessage($typingMessageEl);\n }\n }\n return m;\n }\n scrollWithEdgeCheck(animate) {\n const m = this;\n const {\n scrollBefore,\n scrollHeightBefore,\n heightBefore\n } = m.scrollData;\n if (m.params.scrollMessagesOnEdge) {\n let onEdge = false;\n if (m.params.newMessagesFirst && scrollBefore === 0) {\n onEdge = true;\n }\n if (!m.params.newMessagesFirst && scrollBefore - (scrollHeightBefore - heightBefore) >= -10) {\n onEdge = true;\n }\n if (onEdge) m.scroll(animate ? undefined : 0);\n } else {\n m.scroll(animate ? undefined : 0);\n }\n }\n scroll(duration, scrollTop) {\n if (duration === void 0) {\n duration = 300;\n }\n const m = this;\n const currentScroll = m.pageContentEl.scrollTop;\n let newScrollTop;\n if (typeof scrollTop !== 'undefined') newScrollTop = scrollTop;else {\n newScrollTop = m.params.newMessagesFirst ? 0 : m.pageContentEl.scrollHeight - m.pageContentEl.offsetHeight;\n if (newScrollTop === currentScroll) return m;\n }\n m.$pageContentEl.scrollTop(newScrollTop, duration);\n return m;\n }\n init() {\n const m = this;\n if (!m.messages || m.messages.length === 0) {\n m.messages = m.getMessagesData();\n }\n if (m.params.messages && m.params.messages.length) {\n m.renderMessages();\n }\n if (m.params.autoLayout) m.layout();\n if (m.params.scrollMessages) m.scroll(0);\n }\n destroy() {\n const m = this;\n m.emit('local::beforeDestroy messagesBeforeDestroy', m);\n m.$el.trigger('messages:beforedestroy');\n if (m.$el[0]) {\n m.$el[0].f7Messages = null;\n delete m.$el[0].f7Messages;\n }\n deleteProps(m);\n }\n}\nexport default Messages;","import $ from '../../shared/dom7.js';\nimport Messages from './messages-class.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nexport default {\n name: 'messages',\n static: {\n Messages\n },\n create() {\n const app = this;\n app.messages = ConstructorMethods({\n defaultSelector: '.messages',\n constructor: Messages,\n app,\n domProp: 'f7Messages',\n addMethods: 'renderMessages layout scroll clear removeMessage removeMessages addMessage addMessages'.split(' ')\n });\n },\n on: {\n tabBeforeRemove(tabEl) {\n const app = this;\n $(tabEl).find('.messages-init').each(messagesEl => {\n app.messages.destroy(messagesEl);\n });\n },\n tabMounted(tabEl) {\n const app = this;\n $(tabEl).find('.messages-init').each(messagesEl => {\n app.messages.create({\n el: messagesEl\n });\n });\n },\n pageBeforeRemove(page) {\n const app = this;\n page.$el.find('.messages-init').each(messagesEl => {\n app.messages.destroy(messagesEl);\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.messages-init').each(messagesEl => {\n app.messages.create({\n el: messagesEl\n });\n });\n }\n },\n vnode: {\n 'messages-init': {\n insert(vnode) {\n const app = this;\n const messagesEl = vnode.elm;\n app.messages.create({\n el: messagesEl\n });\n },\n destroy(vnode) {\n const app = this;\n const messagesEl = vnode.elm;\n app.messages.destroy(messagesEl);\n }\n }\n }\n};","import $ from '../../shared/dom7.js';\nimport { extend, deleteProps } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\nclass Messagebar extends Framework7Class {\n constructor(app, params) {\n if (params === void 0) {\n params = {};\n }\n super(params, [app]);\n const messagebar = this;\n const defaults = {\n top: false,\n topOffset: 0,\n bottomOffset: 0,\n attachments: [],\n renderAttachments: undefined,\n renderAttachment: undefined,\n maxHeight: null,\n resizePage: true\n };\n\n // Extend defaults with modules params\n messagebar.useModulesParams(defaults);\n messagebar.params = extend(defaults, params);\n\n // El\n const $el = $(messagebar.params.el);\n if ($el.length === 0) return messagebar;\n if ($el[0].f7Messagebar) return $el[0].f7Messagebar;\n $el[0].f7Messagebar = messagebar;\n\n // Page and PageContent\n const $pageEl = $el.parents('.page').eq(0);\n const $pageContentEl = $pageEl.find('.page-content').eq(0);\n\n // Area\n const $areaEl = $el.find('.messagebar-area');\n\n // Textarea\n let $textareaEl;\n if (messagebar.params.textareaEl) {\n $textareaEl = $(messagebar.params.textareaEl);\n } else {\n $textareaEl = $el.find('textarea');\n }\n\n // Attachments & Library\n const $attachmentsEl = $el.find('.messagebar-attachments');\n const $sheetEl = $el.find('.messagebar-sheet');\n if (messagebar.params.top) {\n $el.addClass('messagebar-top');\n }\n extend(messagebar, {\n $el,\n el: $el[0],\n $areaEl,\n areaEl: $areaEl[0],\n $textareaEl,\n textareaEl: $textareaEl[0],\n $attachmentsEl,\n attachmentsEl: $attachmentsEl[0],\n attachmentsVisible: $attachmentsEl.hasClass('messagebar-attachments-visible'),\n $sheetEl,\n sheetEl: $sheetEl[0],\n sheetVisible: $sheetEl.hasClass('messagebar-sheet-visible'),\n $pageEl,\n pageEl: $pageEl[0],\n $pageContentEl,\n pageContentEl: $pageContentEl,\n top: $el.hasClass('messagebar-top') || messagebar.params.top,\n attachments: []\n });\n\n // Events\n function onAppResize() {\n if (messagebar.params.resizePage) {\n messagebar.resizePage();\n }\n }\n function onSubmit(e) {\n e.preventDefault();\n }\n function onAttachmentClick(e) {\n const index = $(this).index();\n if ($(e.target).closest('.messagebar-attachment-delete').length) {\n $(this).trigger('messagebar:attachmentdelete', index);\n messagebar.emit('local::attachmentDelete messagebarAttachmentDelete', messagebar, this, index);\n } else {\n $(this).trigger('messagebar:attachmentclick', index);\n messagebar.emit('local::attachmentClick messagebarAttachmentClick', messagebar, this, index);\n }\n }\n function onTextareaChange() {\n messagebar.checkEmptyState();\n messagebar.$el.trigger('messagebar:change');\n messagebar.emit('local::change messagebarChange', messagebar);\n }\n function onTextareaFocus() {\n messagebar.sheetHide();\n messagebar.$el.addClass('messagebar-focused');\n messagebar.$el.trigger('messagebar:focus');\n messagebar.emit('local::focus messagebarFocus', messagebar);\n }\n function onTextareaBlur() {\n messagebar.$el.removeClass('messagebar-focused');\n messagebar.$el.trigger('messagebar:blur');\n messagebar.emit('local::blur messagebarBlur', messagebar);\n }\n messagebar.attachEvents = function attachEvents() {\n $el.on('textarea:resize', onAppResize);\n $el.on('submit', onSubmit);\n $el.on('click', '.messagebar-attachment', onAttachmentClick);\n $textareaEl.on('change input', onTextareaChange);\n $textareaEl.on('focus', onTextareaFocus);\n $textareaEl.on('blur', onTextareaBlur);\n app.on('resize', onAppResize);\n };\n messagebar.detachEvents = function detachEvents() {\n $el.off('textarea:resize', onAppResize);\n $el.off('submit', onSubmit);\n $el.off('click', '.messagebar-attachment', onAttachmentClick);\n $textareaEl.off('change input', onTextareaChange);\n $textareaEl.off('focus', onTextareaFocus);\n $textareaEl.off('blur', onTextareaBlur);\n app.off('resize', onAppResize);\n };\n\n // Install Modules\n messagebar.useModules();\n\n // Init\n messagebar.init();\n return messagebar;\n }\n focus() {\n const messagebar = this;\n messagebar.$textareaEl.focus();\n return messagebar;\n }\n blur() {\n const messagebar = this;\n messagebar.$textareaEl.blur();\n return messagebar;\n }\n clear() {\n const messagebar = this;\n messagebar.$textareaEl.val('').trigger('change');\n return messagebar;\n }\n getValue() {\n const messagebar = this;\n return messagebar.$textareaEl.val().trim();\n }\n setValue(value) {\n const messagebar = this;\n messagebar.$textareaEl.val(value).trigger('change');\n return messagebar;\n }\n setPlaceholder(placeholder) {\n const messagebar = this;\n messagebar.$textareaEl.attr('placeholder', placeholder);\n return messagebar;\n }\n resizePage() {\n const messagebar = this;\n const {\n params,\n $el,\n top,\n $pageEl,\n $pageContentEl,\n $areaEl,\n $textareaEl,\n $sheetEl,\n $attachmentsEl\n } = messagebar;\n const elHeight = $el[0].offsetHeight;\n let maxHeight = params.maxHeight;\n if (top) {\n /*\n Disable at the moment\n const requiredPaddingTop = elHeight + params.topOffset;\n const currentPaddingTop = parseInt($pageContentEl.css('padding-top'), 10);\n if (requiredPaddingTop !== currentPaddingTop) {\n if (!maxHeight) {\n maxHeight = $pageEl[0].offsetHeight - currentPaddingTop - $sheetEl.outerHeight() - $attachmentsEl.outerHeight() - parseInt($areaEl.css('margin-top'), 10) - parseInt($areaEl.css('margin-bottom'), 10);\n }\n $textareaEl.css('max-height', `${maxHeight}px`);\n $pageContentEl.css('padding-top', `${requiredPaddingTop}px`);\n $el.trigger('messagebar:resizePage');\n messagebar.emit('local::resizepage messagebarResizePage');\n }\n */\n } else {\n const currentPaddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);\n const requiredPaddingBottom = elHeight + params.bottomOffset;\n if (requiredPaddingBottom !== currentPaddingBottom && $pageContentEl.length) {\n const currentPaddingTop = parseInt($pageContentEl.css('padding-top'), 10);\n const pageScrollHeight = $pageContentEl[0].scrollHeight;\n const pageOffsetHeight = $pageContentEl[0].offsetHeight;\n const pageScrollTop = $pageContentEl[0].scrollTop;\n const scrollOnBottom = pageScrollTop === pageScrollHeight - pageOffsetHeight;\n if (!maxHeight) {\n maxHeight = $pageEl[0].offsetHeight - currentPaddingTop - $sheetEl.outerHeight() - $attachmentsEl.outerHeight() - parseInt($areaEl.css('margin-top'), 10) - parseInt($areaEl.css('margin-bottom'), 10);\n }\n $textareaEl.css('max-height', `${maxHeight}px`);\n $pageContentEl.css('padding-bottom', `${requiredPaddingBottom}px`);\n if (scrollOnBottom) {\n $pageContentEl.scrollTop($pageContentEl[0].scrollHeight - pageOffsetHeight);\n }\n $el.trigger('messagebar:resizepage');\n messagebar.emit('local::resizePage messagebarResizePage', messagebar);\n }\n }\n }\n checkEmptyState() {\n const messagebar = this;\n const {\n $el,\n $textareaEl\n } = messagebar;\n const value = $textareaEl.val().trim();\n if (value && value.length) {\n $el.addClass('messagebar-with-value');\n } else {\n $el.removeClass('messagebar-with-value');\n }\n }\n attachmentsCreate(innerHTML) {\n if (innerHTML === void 0) {\n innerHTML = '';\n }\n const messagebar = this;\n const $attachmentsEl = $(`${innerHTML}
`);\n $attachmentsEl.insertBefore(messagebar.$textareaEl);\n extend(messagebar, {\n $attachmentsEl,\n attachmentsEl: $attachmentsEl[0]\n });\n return messagebar;\n }\n attachmentsShow(innerHTML) {\n if (innerHTML === void 0) {\n innerHTML = '';\n }\n const messagebar = this;\n messagebar.$attachmentsEl = messagebar.$el.find('.messagebar-attachments');\n if (messagebar.$attachmentsEl.length === 0) {\n messagebar.attachmentsCreate(innerHTML);\n }\n messagebar.$el.addClass('messagebar-attachments-visible');\n messagebar.attachmentsVisible = true;\n if (messagebar.params.resizePage) {\n messagebar.resizePage();\n }\n return messagebar;\n }\n attachmentsHide() {\n const messagebar = this;\n messagebar.$el.removeClass('messagebar-attachments-visible');\n messagebar.attachmentsVisible = false;\n if (messagebar.params.resizePage) {\n messagebar.resizePage();\n }\n return messagebar;\n }\n attachmentsToggle() {\n const messagebar = this;\n if (messagebar.attachmentsVisible) {\n messagebar.attachmentsHide();\n } else {\n messagebar.attachmentsShow();\n }\n return messagebar;\n }\n renderAttachment(attachment) {\n const messagebar = this;\n if (messagebar.params.renderAttachment) {\n return messagebar.params.renderAttachment.call(messagebar, attachment);\n }\n return `\n \n

\n
\n
\n `;\n }\n renderAttachments() {\n const messagebar = this;\n let html;\n if (messagebar.params.renderAttachments) {\n html = messagebar.params.renderAttachments.call(messagebar, messagebar.attachments);\n } else {\n html = `${messagebar.attachments.map(attachment => messagebar.renderAttachment(attachment)).join('')}`;\n }\n if (messagebar.$attachmentsEl.length === 0) {\n messagebar.attachmentsCreate(html);\n } else {\n messagebar.$attachmentsEl.html(html);\n }\n }\n sheetCreate(innerHTML) {\n if (innerHTML === void 0) {\n innerHTML = '';\n }\n const messagebar = this;\n const $sheetEl = $(`${innerHTML}
`);\n messagebar.$el.append($sheetEl);\n extend(messagebar, {\n $sheetEl,\n sheetEl: $sheetEl[0]\n });\n return messagebar;\n }\n sheetShow(innerHTML) {\n if (innerHTML === void 0) {\n innerHTML = '';\n }\n const messagebar = this;\n messagebar.$sheetEl = messagebar.$el.find('.messagebar-sheet');\n if (messagebar.$sheetEl.length === 0) {\n messagebar.sheetCreate(innerHTML);\n }\n messagebar.$el.addClass('messagebar-sheet-visible');\n messagebar.sheetVisible = true;\n if (messagebar.params.resizePage) {\n messagebar.resizePage();\n }\n return messagebar;\n }\n sheetHide() {\n const messagebar = this;\n messagebar.$el.removeClass('messagebar-sheet-visible');\n messagebar.sheetVisible = false;\n if (messagebar.params.resizePage) {\n messagebar.resizePage();\n }\n return messagebar;\n }\n sheetToggle() {\n const messagebar = this;\n if (messagebar.sheetVisible) {\n messagebar.sheetHide();\n } else {\n messagebar.sheetShow();\n }\n return messagebar;\n }\n init() {\n const messagebar = this;\n messagebar.attachEvents();\n messagebar.checkEmptyState();\n return messagebar;\n }\n destroy() {\n const messagebar = this;\n messagebar.emit('local::beforeDestroy messagebarBeforeDestroy', messagebar);\n messagebar.$el.trigger('messagebar:beforedestroy');\n messagebar.detachEvents();\n if (messagebar.$el[0]) {\n messagebar.$el[0].f7Messagebar = null;\n delete messagebar.$el[0].f7Messagebar;\n }\n deleteProps(messagebar);\n }\n}\nexport default Messagebar;","import $ from '../../shared/dom7.js';\nimport { extend } from '../../shared/utils.js';\nimport Messagebar from './messagebar-class.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nexport default {\n name: 'messagebar',\n static: {\n Messagebar\n },\n create() {\n const app = this;\n app.messagebar = ConstructorMethods({\n defaultSelector: '.messagebar',\n constructor: Messagebar,\n app,\n domProp: 'f7Messagebar',\n addMethods: 'clear getValue setValue setPlaceholder resizePage focus blur attachmentsCreate attachmentsShow attachmentsHide attachmentsToggle renderAttachments sheetCreate sheetShow sheetHide sheetToggle'.split(' ')\n });\n },\n on: {\n tabBeforeRemove(tabEl) {\n const app = this;\n $(tabEl).find('.messagebar-init').each(messagebarEl => {\n app.messagebar.destroy(messagebarEl);\n });\n },\n tabMounted(tabEl) {\n const app = this;\n $(tabEl).find('.messagebar-init').each(messagebarEl => {\n app.messagebar.create(extend({\n el: messagebarEl\n }, $(messagebarEl).dataset()));\n });\n },\n pageBeforeRemove(page) {\n const app = this;\n page.$el.find('.messagebar-init').each(messagebarEl => {\n app.messagebar.destroy(messagebarEl);\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.messagebar-init').each(messagebarEl => {\n app.messagebar.create(extend({\n el: messagebarEl\n }, $(messagebarEl).dataset()));\n });\n }\n },\n vnode: {\n 'messagebar-init': {\n insert(vnode) {\n const app = this;\n const messagebarEl = vnode.elm;\n app.messagebar.create(extend({\n el: messagebarEl\n }, $(messagebarEl).dataset()));\n },\n destroy(vnode) {\n const app = this;\n const messagebarEl = vnode.elm;\n app.messagebar.destroy(messagebarEl);\n }\n }\n }\n};","/**\n * SSR Window 4.0.2\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: December 13, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object;\n}\nfunction extend(target, src) {\n if (target === void 0) {\n target = {};\n }\n if (src === void 0) {\n src = {};\n }\n Object.keys(src).forEach(key => {\n if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {\n extend(target[key], src[key]);\n }\n });\n}\nconst ssrDocument = {\n body: {},\n addEventListener() {},\n removeEventListener() {},\n activeElement: {\n blur() {},\n nodeName: ''\n },\n querySelector() {\n return null;\n },\n querySelectorAll() {\n return [];\n },\n getElementById() {\n return null;\n },\n createEvent() {\n return {\n initEvent() {}\n };\n },\n createElement() {\n return {\n children: [],\n childNodes: [],\n style: {},\n setAttribute() {},\n getElementsByTagName() {\n return [];\n }\n };\n },\n createElementNS() {\n return {};\n },\n importNode() {\n return null;\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: ''\n }\n};\nfunction getDocument() {\n const doc = typeof document !== 'undefined' ? document : {};\n extend(doc, ssrDocument);\n return doc;\n}\nconst ssrWindow = {\n document: ssrDocument,\n navigator: {\n userAgent: ''\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: ''\n },\n history: {\n replaceState() {},\n pushState() {},\n go() {},\n back() {}\n },\n CustomEvent: function CustomEvent() {\n return this;\n },\n addEventListener() {},\n removeEventListener() {},\n getComputedStyle() {\n return {\n getPropertyValue() {\n return '';\n }\n };\n },\n Image() {},\n Date() {},\n screen: {},\n setTimeout() {},\n clearTimeout() {},\n matchMedia() {\n return {};\n },\n requestAnimationFrame(callback) {\n if (typeof setTimeout === 'undefined') {\n callback();\n return null;\n }\n return setTimeout(callback, 0);\n },\n cancelAnimationFrame(id) {\n if (typeof setTimeout === 'undefined') {\n return;\n }\n clearTimeout(id);\n }\n};\nfunction getWindow() {\n const win = typeof window !== 'undefined' ? window : {};\n extend(win, ssrWindow);\n return win;\n}\n\nexport { getWindow as a, getDocument as g };\n","import { a as getWindow, g as getDocument } from './ssr-window.esm.mjs';\n\nfunction deleteProps(obj) {\n const object = obj;\n Object.keys(object).forEach(key => {\n try {\n object[key] = null;\n } catch (e) {\n // no getter for object\n }\n try {\n delete object[key];\n } catch (e) {\n // something got wrong\n }\n });\n}\nfunction nextTick(callback, delay) {\n if (delay === void 0) {\n delay = 0;\n }\n return setTimeout(callback, delay);\n}\nfunction now() {\n return Date.now();\n}\nfunction getComputedStyle(el) {\n const window = getWindow();\n let style;\n if (window.getComputedStyle) {\n style = window.getComputedStyle(el, null);\n }\n if (!style && el.currentStyle) {\n style = el.currentStyle;\n }\n if (!style) {\n style = el.style;\n }\n return style;\n}\nfunction getTranslate(el, axis) {\n if (axis === void 0) {\n axis = 'x';\n }\n const window = getWindow();\n let matrix;\n let curTransform;\n let transformMatrix;\n const curStyle = getComputedStyle(el);\n if (window.WebKitCSSMatrix) {\n curTransform = curStyle.transform || curStyle.webkitTransform;\n if (curTransform.split(',').length > 6) {\n curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', ');\n }\n // Some old versions of Webkit choke when 'none' is passed; pass\n // empty string instead in this case\n transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n } else {\n transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n matrix = transformMatrix.toString().split(',');\n }\n if (axis === 'x') {\n // Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;\n // Crazy IE10 Matrix\n else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);\n // Normal Browsers\n else curTransform = parseFloat(matrix[4]);\n }\n if (axis === 'y') {\n // Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;\n // Crazy IE10 Matrix\n else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);\n // Normal Browsers\n else curTransform = parseFloat(matrix[5]);\n }\n return curTransform || 0;\n}\nfunction isObject(o) {\n return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';\n}\nfunction isNode(node) {\n // eslint-disable-next-line\n if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {\n return node instanceof HTMLElement;\n }\n return node && (node.nodeType === 1 || node.nodeType === 11);\n}\nfunction extend() {\n const to = Object(arguments.length <= 0 ? undefined : arguments[0]);\n const noExtend = ['__proto__', 'constructor', 'prototype'];\n for (let i = 1; i < arguments.length; i += 1) {\n const nextSource = i < 0 || arguments.length <= i ? undefined : arguments[i];\n if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {\n const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0);\n for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n const nextKey = keysArray[nextIndex];\n const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n if (desc !== undefined && desc.enumerable) {\n if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n if (nextSource[nextKey].__swiper__) {\n to[nextKey] = nextSource[nextKey];\n } else {\n extend(to[nextKey], nextSource[nextKey]);\n }\n } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n to[nextKey] = {};\n if (nextSource[nextKey].__swiper__) {\n to[nextKey] = nextSource[nextKey];\n } else {\n extend(to[nextKey], nextSource[nextKey]);\n }\n } else {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n }\n return to;\n}\nfunction setCSSProperty(el, varName, varValue) {\n el.style.setProperty(varName, varValue);\n}\nfunction animateCSSModeScroll(_ref) {\n let {\n swiper,\n targetPosition,\n side\n } = _ref;\n const window = getWindow();\n const startPosition = -swiper.translate;\n let startTime = null;\n let time;\n const duration = swiper.params.speed;\n swiper.wrapperEl.style.scrollSnapType = 'none';\n window.cancelAnimationFrame(swiper.cssModeFrameID);\n const dir = targetPosition > startPosition ? 'next' : 'prev';\n const isOutOfBound = (current, target) => {\n return dir === 'next' && current >= target || dir === 'prev' && current <= target;\n };\n const animate = () => {\n time = new Date().getTime();\n if (startTime === null) {\n startTime = time;\n }\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);\n if (isOutOfBound(currentPosition, targetPosition)) {\n currentPosition = targetPosition;\n }\n swiper.wrapperEl.scrollTo({\n [side]: currentPosition\n });\n if (isOutOfBound(currentPosition, targetPosition)) {\n swiper.wrapperEl.style.overflow = 'hidden';\n swiper.wrapperEl.style.scrollSnapType = '';\n setTimeout(() => {\n swiper.wrapperEl.style.overflow = '';\n swiper.wrapperEl.scrollTo({\n [side]: currentPosition\n });\n });\n window.cancelAnimationFrame(swiper.cssModeFrameID);\n return;\n }\n swiper.cssModeFrameID = window.requestAnimationFrame(animate);\n };\n animate();\n}\nfunction getSlideTransformEl(slideEl) {\n return slideEl.querySelector('.swiper-slide-transform') || slideEl.shadowRoot && slideEl.shadowRoot.querySelector('.swiper-slide-transform') || slideEl;\n}\nfunction elementChildren(element, selector) {\n if (selector === void 0) {\n selector = '';\n }\n return [...element.children].filter(el => el.matches(selector));\n}\nfunction createElement(tag, classes) {\n if (classes === void 0) {\n classes = [];\n }\n const el = document.createElement(tag);\n el.classList.add(...(Array.isArray(classes) ? classes : [classes]));\n return el;\n}\nfunction elementOffset(el) {\n const window = getWindow();\n const document = getDocument();\n const box = el.getBoundingClientRect();\n const body = document.body;\n const clientTop = el.clientTop || body.clientTop || 0;\n const clientLeft = el.clientLeft || body.clientLeft || 0;\n const scrollTop = el === window ? window.scrollY : el.scrollTop;\n const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n return {\n top: box.top + scrollTop - clientTop,\n left: box.left + scrollLeft - clientLeft\n };\n}\nfunction elementPrevAll(el, selector) {\n const prevEls = [];\n while (el.previousElementSibling) {\n const prev = el.previousElementSibling; // eslint-disable-line\n if (selector) {\n if (prev.matches(selector)) prevEls.push(prev);\n } else prevEls.push(prev);\n el = prev;\n }\n return prevEls;\n}\nfunction elementNextAll(el, selector) {\n const nextEls = [];\n while (el.nextElementSibling) {\n const next = el.nextElementSibling; // eslint-disable-line\n if (selector) {\n if (next.matches(selector)) nextEls.push(next);\n } else nextEls.push(next);\n el = next;\n }\n return nextEls;\n}\nfunction elementStyle(el, prop) {\n const window = getWindow();\n return window.getComputedStyle(el, null).getPropertyValue(prop);\n}\nfunction elementIndex(el) {\n let child = el;\n let i;\n if (child) {\n i = 0;\n // eslint-disable-next-line\n while ((child = child.previousSibling) !== null) {\n if (child.nodeType === 1) i += 1;\n }\n return i;\n }\n return undefined;\n}\nfunction elementParents(el, selector) {\n const parents = []; // eslint-disable-line\n let parent = el.parentElement; // eslint-disable-line\n while (parent) {\n if (selector) {\n if (parent.matches(selector)) parents.push(parent);\n } else {\n parents.push(parent);\n }\n parent = parent.parentElement;\n }\n return parents;\n}\nfunction elementTransitionEnd(el, callback) {\n function fireCallBack(e) {\n if (e.target !== el) return;\n callback.call(el, e);\n el.removeEventListener('transitionend', fireCallBack);\n }\n if (callback) {\n el.addEventListener('transitionend', fireCallBack);\n }\n}\nfunction elementOuterSize(el, size, includeMargins) {\n const window = getWindow();\n if (includeMargins) {\n return el[size === 'width' ? 'offsetWidth' : 'offsetHeight'] + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-right' : 'margin-top')) + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-left' : 'margin-bottom'));\n }\n return el.offsetWidth;\n}\n\nexport { elementParents as a, elementOffset as b, createElement as c, now as d, elementChildren as e, elementOuterSize as f, elementIndex as g, getTranslate as h, elementTransitionEnd as i, isObject as j, getSlideTransformEl as k, elementStyle as l, elementNextAll as m, nextTick as n, elementPrevAll as o, animateCSSModeScroll as p, extend as q, deleteProps as r, setCSSProperty as s };\n","import { a as getWindow, g as getDocument } from './ssr-window.esm.mjs';\nimport { a as elementParents, l as elementStyle, e as elementChildren, s as setCSSProperty, f as elementOuterSize, m as elementNextAll, o as elementPrevAll, h as getTranslate, p as animateCSSModeScroll, n as nextTick, d as now, q as extend, g as elementIndex, c as createElement, r as deleteProps } from './utils.mjs';\n\nlet support;\nfunction calcSupport() {\n const window = getWindow();\n const document = getDocument();\n return {\n smoothScroll: document.documentElement && document.documentElement.style && 'scrollBehavior' in document.documentElement.style,\n touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch)\n };\n}\nfunction getSupport() {\n if (!support) {\n support = calcSupport();\n }\n return support;\n}\n\nlet deviceCached;\nfunction calcDevice(_temp) {\n let {\n userAgent\n } = _temp === void 0 ? {} : _temp;\n const support = getSupport();\n const window = getWindow();\n const platform = window.navigator.platform;\n const ua = userAgent || window.navigator.userAgent;\n const device = {\n ios: false,\n android: false\n };\n const screenWidth = window.screen.width;\n const screenHeight = window.screen.height;\n const android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n let ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n const ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n const iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n const windows = platform === 'Win32';\n let macos = platform === 'MacIntel';\n\n // iPadOs 13 fix\n const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];\n if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) {\n ipad = ua.match(/(Version)\\/([\\d.]+)/);\n if (!ipad) ipad = [0, 1, '13_0_0'];\n macos = false;\n }\n\n // Android\n if (android && !windows) {\n device.os = 'android';\n device.android = true;\n }\n if (ipad || iphone || ipod) {\n device.os = 'ios';\n device.ios = true;\n }\n\n // Export object\n return device;\n}\nfunction getDevice(overrides) {\n if (overrides === void 0) {\n overrides = {};\n }\n if (!deviceCached) {\n deviceCached = calcDevice(overrides);\n }\n return deviceCached;\n}\n\nlet browser;\nfunction calcBrowser() {\n const window = getWindow();\n let needPerspectiveFix = false;\n function isSafari() {\n const ua = window.navigator.userAgent.toLowerCase();\n return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;\n }\n if (isSafari()) {\n const ua = String(window.navigator.userAgent);\n if (ua.includes('Version/')) {\n const [major, minor] = ua.split('Version/')[1].split(' ')[0].split('.').map(num => Number(num));\n needPerspectiveFix = major < 16 || major === 16 && minor < 2;\n }\n }\n return {\n isSafari: needPerspectiveFix || isSafari(),\n needPerspectiveFix,\n isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent)\n };\n}\nfunction getBrowser() {\n if (!browser) {\n browser = calcBrowser();\n }\n return browser;\n}\n\nfunction Resize(_ref) {\n let {\n swiper,\n on,\n emit\n } = _ref;\n const window = getWindow();\n let observer = null;\n let animationFrame = null;\n const resizeHandler = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n emit('beforeResize');\n emit('resize');\n };\n const createObserver = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n observer = new ResizeObserver(entries => {\n animationFrame = window.requestAnimationFrame(() => {\n const {\n width,\n height\n } = swiper;\n let newWidth = width;\n let newHeight = height;\n entries.forEach(_ref2 => {\n let {\n contentBoxSize,\n contentRect,\n target\n } = _ref2;\n if (target && target !== swiper.el) return;\n newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;\n newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;\n });\n if (newWidth !== width || newHeight !== height) {\n resizeHandler();\n }\n });\n });\n observer.observe(swiper.el);\n };\n const removeObserver = () => {\n if (animationFrame) {\n window.cancelAnimationFrame(animationFrame);\n }\n if (observer && observer.unobserve && swiper.el) {\n observer.unobserve(swiper.el);\n observer = null;\n }\n };\n const orientationChangeHandler = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n emit('orientationchange');\n };\n on('init', () => {\n if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {\n createObserver();\n return;\n }\n window.addEventListener('resize', resizeHandler);\n window.addEventListener('orientationchange', orientationChangeHandler);\n });\n on('destroy', () => {\n removeObserver();\n window.removeEventListener('resize', resizeHandler);\n window.removeEventListener('orientationchange', orientationChangeHandler);\n });\n}\n\nfunction Observer(_ref) {\n let {\n swiper,\n extendParams,\n on,\n emit\n } = _ref;\n const observers = [];\n const window = getWindow();\n const attach = function (target, options) {\n if (options === void 0) {\n options = {};\n }\n const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n const observer = new ObserverFunc(mutations => {\n // The observerUpdate event should only be triggered\n // once despite the number of mutations. Additional\n // triggers are redundant and are very costly\n if (swiper.__preventObserver__) return;\n if (mutations.length === 1) {\n emit('observerUpdate', mutations[0]);\n return;\n }\n const observerUpdate = function observerUpdate() {\n emit('observerUpdate', mutations[0]);\n };\n if (window.requestAnimationFrame) {\n window.requestAnimationFrame(observerUpdate);\n } else {\n window.setTimeout(observerUpdate, 0);\n }\n });\n observer.observe(target, {\n attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n childList: typeof options.childList === 'undefined' ? true : options.childList,\n characterData: typeof options.characterData === 'undefined' ? true : options.characterData\n });\n observers.push(observer);\n };\n const init = () => {\n if (!swiper.params.observer) return;\n if (swiper.params.observeParents) {\n const containerParents = elementParents(swiper.hostEl);\n for (let i = 0; i < containerParents.length; i += 1) {\n attach(containerParents[i]);\n }\n }\n // Observe container\n attach(swiper.hostEl, {\n childList: swiper.params.observeSlideChildren\n });\n\n // Observe wrapper\n attach(swiper.wrapperEl, {\n attributes: false\n });\n };\n const destroy = () => {\n observers.forEach(observer => {\n observer.disconnect();\n });\n observers.splice(0, observers.length);\n };\n extendParams({\n observer: false,\n observeParents: false,\n observeSlideChildren: false\n });\n on('init', init);\n on('destroy', destroy);\n}\n\n/* eslint-disable no-underscore-dangle */\n\nvar eventsEmitter = {\n on(events, handler, priority) {\n const self = this;\n if (!self.eventsListeners || self.destroyed) return self;\n if (typeof handler !== 'function') return self;\n const method = priority ? 'unshift' : 'push';\n events.split(' ').forEach(event => {\n if (!self.eventsListeners[event]) self.eventsListeners[event] = [];\n self.eventsListeners[event][method](handler);\n });\n return self;\n },\n once(events, handler, priority) {\n const self = this;\n if (!self.eventsListeners || self.destroyed) return self;\n if (typeof handler !== 'function') return self;\n function onceHandler() {\n self.off(events, onceHandler);\n if (onceHandler.__emitterProxy) {\n delete onceHandler.__emitterProxy;\n }\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n handler.apply(self, args);\n }\n onceHandler.__emitterProxy = handler;\n return self.on(events, onceHandler, priority);\n },\n onAny(handler, priority) {\n const self = this;\n if (!self.eventsListeners || self.destroyed) return self;\n if (typeof handler !== 'function') return self;\n const method = priority ? 'unshift' : 'push';\n if (self.eventsAnyListeners.indexOf(handler) < 0) {\n self.eventsAnyListeners[method](handler);\n }\n return self;\n },\n offAny(handler) {\n const self = this;\n if (!self.eventsListeners || self.destroyed) return self;\n if (!self.eventsAnyListeners) return self;\n const index = self.eventsAnyListeners.indexOf(handler);\n if (index >= 0) {\n self.eventsAnyListeners.splice(index, 1);\n }\n return self;\n },\n off(events, handler) {\n const self = this;\n if (!self.eventsListeners || self.destroyed) return self;\n if (!self.eventsListeners) return self;\n events.split(' ').forEach(event => {\n if (typeof handler === 'undefined') {\n self.eventsListeners[event] = [];\n } else if (self.eventsListeners[event]) {\n self.eventsListeners[event].forEach((eventHandler, index) => {\n if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {\n self.eventsListeners[event].splice(index, 1);\n }\n });\n }\n });\n return self;\n },\n emit() {\n const self = this;\n if (!self.eventsListeners || self.destroyed) return self;\n if (!self.eventsListeners) return self;\n let events;\n let data;\n let context;\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n events = args[0];\n data = args.slice(1, args.length);\n context = self;\n } else {\n events = args[0].events;\n data = args[0].data;\n context = args[0].context || self;\n }\n data.unshift(context);\n const eventsArray = Array.isArray(events) ? events : events.split(' ');\n eventsArray.forEach(event => {\n if (self.eventsAnyListeners && self.eventsAnyListeners.length) {\n self.eventsAnyListeners.forEach(eventHandler => {\n eventHandler.apply(context, [event, ...data]);\n });\n }\n if (self.eventsListeners && self.eventsListeners[event]) {\n self.eventsListeners[event].forEach(eventHandler => {\n eventHandler.apply(context, data);\n });\n }\n });\n return self;\n }\n};\n\nfunction updateSize() {\n const swiper = this;\n let width;\n let height;\n const el = swiper.el;\n if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {\n width = swiper.params.width;\n } else {\n width = el.clientWidth;\n }\n if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n height = swiper.params.height;\n } else {\n height = el.clientHeight;\n }\n if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {\n return;\n }\n\n // Subtract paddings\n width = width - parseInt(elementStyle(el, 'padding-left') || 0, 10) - parseInt(elementStyle(el, 'padding-right') || 0, 10);\n height = height - parseInt(elementStyle(el, 'padding-top') || 0, 10) - parseInt(elementStyle(el, 'padding-bottom') || 0, 10);\n if (Number.isNaN(width)) width = 0;\n if (Number.isNaN(height)) height = 0;\n Object.assign(swiper, {\n width,\n height,\n size: swiper.isHorizontal() ? width : height\n });\n}\n\nfunction updateSlides() {\n const swiper = this;\n function getDirectionLabel(property) {\n if (swiper.isHorizontal()) {\n return property;\n }\n // prettier-ignore\n return {\n 'width': 'height',\n 'margin-top': 'margin-left',\n 'margin-bottom ': 'margin-right',\n 'margin-left': 'margin-top',\n 'margin-right': 'margin-bottom',\n 'padding-left': 'padding-top',\n 'padding-right': 'padding-bottom',\n 'marginRight': 'marginBottom'\n }[property];\n }\n function getDirectionPropertyValue(node, label) {\n return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);\n }\n const params = swiper.params;\n const {\n wrapperEl,\n slidesEl,\n size: swiperSize,\n rtlTranslate: rtl,\n wrongRTL\n } = swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n const slides = elementChildren(slidesEl, `.${swiper.params.slideClass}, swiper-slide`);\n const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n let snapGrid = [];\n const slidesGrid = [];\n const slidesSizesGrid = [];\n let offsetBefore = params.slidesOffsetBefore;\n if (typeof offsetBefore === 'function') {\n offsetBefore = params.slidesOffsetBefore.call(swiper);\n }\n let offsetAfter = params.slidesOffsetAfter;\n if (typeof offsetAfter === 'function') {\n offsetAfter = params.slidesOffsetAfter.call(swiper);\n }\n const previousSnapGridLength = swiper.snapGrid.length;\n const previousSlidesGridLength = swiper.slidesGrid.length;\n let spaceBetween = params.spaceBetween;\n let slidePosition = -offsetBefore;\n let prevSlideSize = 0;\n let index = 0;\n if (typeof swiperSize === 'undefined') {\n return;\n }\n if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;\n } else if (typeof spaceBetween === 'string') {\n spaceBetween = parseFloat(spaceBetween);\n }\n swiper.virtualSize = -spaceBetween;\n\n // reset margins\n slides.forEach(slideEl => {\n if (rtl) {\n slideEl.style.marginLeft = '';\n } else {\n slideEl.style.marginRight = '';\n }\n slideEl.style.marginBottom = '';\n slideEl.style.marginTop = '';\n });\n\n // reset cssMode offsets\n if (params.centeredSlides && params.cssMode) {\n setCSSProperty(wrapperEl, '--swiper-centered-offset-before', '');\n setCSSProperty(wrapperEl, '--swiper-centered-offset-after', '');\n }\n const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n if (gridEnabled) {\n swiper.grid.initSlides(slidesLength);\n }\n\n // Calc slides\n let slideSize;\n const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => {\n return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n }).length > 0;\n for (let i = 0; i < slidesLength; i += 1) {\n slideSize = 0;\n let slide;\n if (slides[i]) slide = slides[i];\n if (gridEnabled) {\n swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel);\n }\n if (slides[i] && elementStyle(slide, 'display') === 'none') continue; // eslint-disable-line\n\n if (params.slidesPerView === 'auto') {\n if (shouldResetSlideSize) {\n slides[i].style[getDirectionLabel('width')] = ``;\n }\n const slideStyles = getComputedStyle(slide);\n const currentTransform = slide.style.transform;\n const currentWebKitTransform = slide.style.webkitTransform;\n if (currentTransform) {\n slide.style.transform = 'none';\n }\n if (currentWebKitTransform) {\n slide.style.webkitTransform = 'none';\n }\n if (params.roundLengths) {\n slideSize = swiper.isHorizontal() ? elementOuterSize(slide, 'width', true) : elementOuterSize(slide, 'height', true);\n } else {\n // eslint-disable-next-line\n const width = getDirectionPropertyValue(slideStyles, 'width');\n const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');\n const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');\n const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');\n const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');\n const boxSizing = slideStyles.getPropertyValue('box-sizing');\n if (boxSizing && boxSizing === 'border-box') {\n slideSize = width + marginLeft + marginRight;\n } else {\n const {\n clientWidth,\n offsetWidth\n } = slide;\n slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);\n }\n }\n if (currentTransform) {\n slide.style.transform = currentTransform;\n }\n if (currentWebKitTransform) {\n slide.style.webkitTransform = currentWebKitTransform;\n }\n if (params.roundLengths) slideSize = Math.floor(slideSize);\n } else {\n slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;\n if (params.roundLengths) slideSize = Math.floor(slideSize);\n if (slides[i]) {\n slides[i].style[getDirectionLabel('width')] = `${slideSize}px`;\n }\n }\n if (slides[i]) {\n slides[i].swiperSlideSize = slideSize;\n }\n slidesSizesGrid.push(slideSize);\n if (params.centeredSlides) {\n slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n slidesGrid.push(slidePosition);\n } else {\n if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n slidesGrid.push(slidePosition);\n slidePosition = slidePosition + slideSize + spaceBetween;\n }\n swiper.virtualSize += slideSize + spaceBetween;\n prevSlideSize = slideSize;\n index += 1;\n }\n swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n wrapperEl.style.width = `${swiper.virtualSize + spaceBetween}px`;\n }\n if (params.setWrapperSize) {\n wrapperEl.style[getDirectionLabel('width')] = `${swiper.virtualSize + spaceBetween}px`;\n }\n if (gridEnabled) {\n swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel);\n }\n\n // Remove last grid elements depending on width\n if (!params.centeredSlides) {\n const newSlidesGrid = [];\n for (let i = 0; i < snapGrid.length; i += 1) {\n let slidesGridItem = snapGrid[i];\n if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n if (snapGrid[i] <= swiper.virtualSize - swiperSize) {\n newSlidesGrid.push(slidesGridItem);\n }\n }\n snapGrid = newSlidesGrid;\n if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {\n snapGrid.push(swiper.virtualSize - swiperSize);\n }\n }\n if (isVirtual && params.loop) {\n const size = slidesSizesGrid[0] + spaceBetween;\n if (params.slidesPerGroup > 1) {\n const groups = Math.ceil((swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup);\n const groupSize = size * params.slidesPerGroup;\n for (let i = 0; i < groups; i += 1) {\n snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize);\n }\n }\n for (let i = 0; i < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; i += 1) {\n if (params.slidesPerGroup === 1) {\n snapGrid.push(snapGrid[snapGrid.length - 1] + size);\n }\n slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size);\n swiper.virtualSize += size;\n }\n }\n if (snapGrid.length === 0) snapGrid = [0];\n if (spaceBetween !== 0) {\n const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');\n slides.filter((_, slideIndex) => {\n if (!params.cssMode || params.loop) return true;\n if (slideIndex === slides.length - 1) {\n return false;\n }\n return true;\n }).forEach(slideEl => {\n slideEl.style[key] = `${spaceBetween}px`;\n });\n }\n if (params.centeredSlides && params.centeredSlidesBounds) {\n let allSlidesSize = 0;\n slidesSizesGrid.forEach(slideSizeValue => {\n allSlidesSize += slideSizeValue + (spaceBetween || 0);\n });\n allSlidesSize -= spaceBetween;\n const maxSnap = allSlidesSize - swiperSize;\n snapGrid = snapGrid.map(snap => {\n if (snap <= 0) return -offsetBefore;\n if (snap > maxSnap) return maxSnap + offsetAfter;\n return snap;\n });\n }\n if (params.centerInsufficientSlides) {\n let allSlidesSize = 0;\n slidesSizesGrid.forEach(slideSizeValue => {\n allSlidesSize += slideSizeValue + (spaceBetween || 0);\n });\n allSlidesSize -= spaceBetween;\n if (allSlidesSize < swiperSize) {\n const allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n snapGrid.forEach((snap, snapIndex) => {\n snapGrid[snapIndex] = snap - allSlidesOffset;\n });\n slidesGrid.forEach((snap, snapIndex) => {\n slidesGrid[snapIndex] = snap + allSlidesOffset;\n });\n }\n }\n Object.assign(swiper, {\n slides,\n snapGrid,\n slidesGrid,\n slidesSizesGrid\n });\n if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n setCSSProperty(wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n setCSSProperty(wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`);\n const addToSnapGrid = -swiper.snapGrid[0];\n const addToSlidesGrid = -swiper.slidesGrid[0];\n swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid);\n swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid);\n }\n if (slidesLength !== previousSlidesLength) {\n swiper.emit('slidesLengthChange');\n }\n if (snapGrid.length !== previousSnapGridLength) {\n if (swiper.params.watchOverflow) swiper.checkOverflow();\n swiper.emit('snapGridLengthChange');\n }\n if (slidesGrid.length !== previousSlidesGridLength) {\n swiper.emit('slidesGridLengthChange');\n }\n if (params.watchSlidesProgress) {\n swiper.updateSlidesOffset();\n }\n if (!isVirtual && !params.cssMode && (params.effect === 'slide' || params.effect === 'fade')) {\n const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`;\n const hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass);\n if (slidesLength <= params.maxBackfaceHiddenSlides) {\n if (!hasClassBackfaceClassAdded) swiper.el.classList.add(backFaceHiddenClass);\n } else if (hasClassBackfaceClassAdded) {\n swiper.el.classList.remove(backFaceHiddenClass);\n }\n }\n}\n\nfunction updateAutoHeight(speed) {\n const swiper = this;\n const activeSlides = [];\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n let newHeight = 0;\n let i;\n if (typeof speed === 'number') {\n swiper.setTransition(speed);\n } else if (speed === true) {\n swiper.setTransition(swiper.params.speed);\n }\n const getSlideByIndex = index => {\n if (isVirtual) {\n return swiper.slides[swiper.getSlideIndexByData(index)];\n }\n return swiper.slides[index];\n };\n // Find slides currently in view\n if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n if (swiper.params.centeredSlides) {\n (swiper.visibleSlides || []).forEach(slide => {\n activeSlides.push(slide);\n });\n } else {\n for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n const index = swiper.activeIndex + i;\n if (index > swiper.slides.length && !isVirtual) break;\n activeSlides.push(getSlideByIndex(index));\n }\n }\n } else {\n activeSlides.push(getSlideByIndex(swiper.activeIndex));\n }\n\n // Find new height from highest slide in view\n for (i = 0; i < activeSlides.length; i += 1) {\n if (typeof activeSlides[i] !== 'undefined') {\n const height = activeSlides[i].offsetHeight;\n newHeight = height > newHeight ? height : newHeight;\n }\n }\n\n // Update Height\n if (newHeight || newHeight === 0) swiper.wrapperEl.style.height = `${newHeight}px`;\n}\n\nfunction updateSlidesOffset() {\n const swiper = this;\n const slides = swiper.slides;\n // eslint-disable-next-line\n const minusOffset = swiper.isElement ? swiper.isHorizontal() ? swiper.wrapperEl.offsetLeft : swiper.wrapperEl.offsetTop : 0;\n for (let i = 0; i < slides.length; i += 1) {\n slides[i].swiperSlideOffset = (swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) - minusOffset - swiper.cssOverflowAdjustment();\n }\n}\n\nfunction updateSlidesProgress(translate) {\n if (translate === void 0) {\n translate = this && this.translate || 0;\n }\n const swiper = this;\n const params = swiper.params;\n const {\n slides,\n rtlTranslate: rtl,\n snapGrid\n } = swiper;\n if (slides.length === 0) return;\n if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n let offsetCenter = -translate;\n if (rtl) offsetCenter = translate;\n\n // Visible Slides\n slides.forEach(slideEl => {\n slideEl.classList.remove(params.slideVisibleClass);\n });\n swiper.visibleSlidesIndexes = [];\n swiper.visibleSlides = [];\n let spaceBetween = params.spaceBetween;\n if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;\n } else if (typeof spaceBetween === 'string') {\n spaceBetween = parseFloat(spaceBetween);\n }\n for (let i = 0; i < slides.length; i += 1) {\n const slide = slides[i];\n let slideOffset = slide.swiperSlideOffset;\n if (params.cssMode && params.centeredSlides) {\n slideOffset -= slides[0].swiperSlideOffset;\n }\n const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);\n const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);\n const slideBefore = -(offsetCenter - slideOffset);\n const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;\n if (isVisible) {\n swiper.visibleSlides.push(slide);\n swiper.visibleSlidesIndexes.push(i);\n slides[i].classList.add(params.slideVisibleClass);\n }\n slide.progress = rtl ? -slideProgress : slideProgress;\n slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;\n }\n}\n\nfunction updateProgress(translate) {\n const swiper = this;\n if (typeof translate === 'undefined') {\n const multiplier = swiper.rtlTranslate ? -1 : 1;\n // eslint-disable-next-line\n translate = swiper && swiper.translate && swiper.translate * multiplier || 0;\n }\n const params = swiper.params;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n let {\n progress,\n isBeginning,\n isEnd,\n progressLoop\n } = swiper;\n const wasBeginning = isBeginning;\n const wasEnd = isEnd;\n if (translatesDiff === 0) {\n progress = 0;\n isBeginning = true;\n isEnd = true;\n } else {\n progress = (translate - swiper.minTranslate()) / translatesDiff;\n const isBeginningRounded = Math.abs(translate - swiper.minTranslate()) < 1;\n const isEndRounded = Math.abs(translate - swiper.maxTranslate()) < 1;\n isBeginning = isBeginningRounded || progress <= 0;\n isEnd = isEndRounded || progress >= 1;\n if (isBeginningRounded) progress = 0;\n if (isEndRounded) progress = 1;\n }\n if (params.loop) {\n const firstSlideIndex = swiper.getSlideIndexByData(0);\n const lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1);\n const firstSlideTranslate = swiper.slidesGrid[firstSlideIndex];\n const lastSlideTranslate = swiper.slidesGrid[lastSlideIndex];\n const translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1];\n const translateAbs = Math.abs(translate);\n if (translateAbs >= firstSlideTranslate) {\n progressLoop = (translateAbs - firstSlideTranslate) / translateMax;\n } else {\n progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax;\n }\n if (progressLoop > 1) progressLoop -= 1;\n }\n Object.assign(swiper, {\n progress,\n progressLoop,\n isBeginning,\n isEnd\n });\n if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);\n if (isBeginning && !wasBeginning) {\n swiper.emit('reachBeginning toEdge');\n }\n if (isEnd && !wasEnd) {\n swiper.emit('reachEnd toEdge');\n }\n if (wasBeginning && !isBeginning || wasEnd && !isEnd) {\n swiper.emit('fromEdge');\n }\n swiper.emit('progress', progress);\n}\n\nfunction updateSlidesClasses() {\n const swiper = this;\n const {\n slides,\n params,\n slidesEl,\n activeIndex\n } = swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n const getFilteredSlide = selector => {\n return elementChildren(slidesEl, `.${params.slideClass}${selector}, swiper-slide${selector}`)[0];\n };\n slides.forEach(slideEl => {\n slideEl.classList.remove(params.slideActiveClass, params.slideNextClass, params.slidePrevClass);\n });\n let activeSlide;\n if (isVirtual) {\n if (params.loop) {\n let slideIndex = activeIndex - swiper.virtual.slidesBefore;\n if (slideIndex < 0) slideIndex = swiper.virtual.slides.length + slideIndex;\n if (slideIndex >= swiper.virtual.slides.length) slideIndex -= swiper.virtual.slides.length;\n activeSlide = getFilteredSlide(`[data-swiper-slide-index=\"${slideIndex}\"]`);\n } else {\n activeSlide = getFilteredSlide(`[data-swiper-slide-index=\"${activeIndex}\"]`);\n }\n } else {\n activeSlide = slides[activeIndex];\n }\n if (activeSlide) {\n // Active classes\n activeSlide.classList.add(params.slideActiveClass);\n\n // Next Slide\n let nextSlide = elementNextAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];\n if (params.loop && !nextSlide) {\n nextSlide = slides[0];\n }\n if (nextSlide) {\n nextSlide.classList.add(params.slideNextClass);\n }\n // Prev Slide\n let prevSlide = elementPrevAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];\n if (params.loop && !prevSlide === 0) {\n prevSlide = slides[slides.length - 1];\n }\n if (prevSlide) {\n prevSlide.classList.add(params.slidePrevClass);\n }\n }\n swiper.emitSlidesClasses();\n}\n\nconst processLazyPreloader = (swiper, imageEl) => {\n if (!swiper || swiper.destroyed || !swiper.params) return;\n const slideSelector = () => swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;\n const slideEl = imageEl.closest(slideSelector());\n if (slideEl) {\n let lazyEl = slideEl.querySelector(`.${swiper.params.lazyPreloaderClass}`);\n if (!lazyEl && swiper.isElement) {\n if (slideEl.shadowRoot) {\n lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);\n } else {\n // init later\n requestAnimationFrame(() => {\n if (slideEl.shadowRoot) {\n lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);\n if (lazyEl) lazyEl.remove();\n }\n });\n }\n }\n if (lazyEl) lazyEl.remove();\n }\n};\nconst unlazy = (swiper, index) => {\n if (!swiper.slides[index]) return;\n const imageEl = swiper.slides[index].querySelector('[loading=\"lazy\"]');\n if (imageEl) imageEl.removeAttribute('loading');\n};\nconst preload = swiper => {\n if (!swiper || swiper.destroyed || !swiper.params) return;\n let amount = swiper.params.lazyPreloadPrevNext;\n const len = swiper.slides.length;\n if (!len || !amount || amount < 0) return;\n amount = Math.min(amount, len);\n const slidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView);\n const activeIndex = swiper.activeIndex;\n if (swiper.params.grid && swiper.params.grid.rows > 1) {\n const activeColumn = activeIndex;\n const preloadColumns = [activeColumn - amount];\n preloadColumns.push(...Array.from({\n length: amount\n }).map((_, i) => {\n return activeColumn + slidesPerView + i;\n }));\n swiper.slides.forEach((slideEl, i) => {\n if (preloadColumns.includes(slideEl.column)) unlazy(swiper, i);\n });\n return;\n }\n const slideIndexLastInView = activeIndex + slidesPerView - 1;\n if (swiper.params.rewind || swiper.params.loop) {\n for (let i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) {\n const realIndex = (i % len + len) % len;\n if (realIndex < activeIndex || realIndex > slideIndexLastInView) unlazy(swiper, realIndex);\n }\n } else {\n for (let i = Math.max(activeIndex - amount, 0); i <= Math.min(slideIndexLastInView + amount, len - 1); i += 1) {\n if (i !== activeIndex && (i > slideIndexLastInView || i < activeIndex)) {\n unlazy(swiper, i);\n }\n }\n }\n};\n\nfunction getActiveIndexByTranslate(swiper) {\n const {\n slidesGrid,\n params\n } = swiper;\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n let activeIndex;\n for (let i = 0; i < slidesGrid.length; i += 1) {\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {\n activeIndex = i;\n } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n activeIndex = i + 1;\n }\n } else if (translate >= slidesGrid[i]) {\n activeIndex = i;\n }\n }\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;\n }\n return activeIndex;\n}\nfunction updateActiveIndex(newActiveIndex) {\n const swiper = this;\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n const {\n snapGrid,\n params,\n activeIndex: previousIndex,\n realIndex: previousRealIndex,\n snapIndex: previousSnapIndex\n } = swiper;\n let activeIndex = newActiveIndex;\n let snapIndex;\n const getVirtualRealIndex = aIndex => {\n let realIndex = aIndex - swiper.virtual.slidesBefore;\n if (realIndex < 0) {\n realIndex = swiper.virtual.slides.length + realIndex;\n }\n if (realIndex >= swiper.virtual.slides.length) {\n realIndex -= swiper.virtual.slides.length;\n }\n return realIndex;\n };\n if (typeof activeIndex === 'undefined') {\n activeIndex = getActiveIndexByTranslate(swiper);\n }\n if (snapGrid.indexOf(translate) >= 0) {\n snapIndex = snapGrid.indexOf(translate);\n } else {\n const skip = Math.min(params.slidesPerGroupSkip, activeIndex);\n snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);\n }\n if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n if (activeIndex === previousIndex) {\n if (snapIndex !== previousSnapIndex) {\n swiper.snapIndex = snapIndex;\n swiper.emit('snapIndexChange');\n }\n if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {\n swiper.realIndex = getVirtualRealIndex(activeIndex);\n }\n return;\n }\n // Get real index\n let realIndex;\n if (swiper.virtual && params.virtual.enabled && params.loop) {\n realIndex = getVirtualRealIndex(activeIndex);\n } else if (swiper.slides[activeIndex]) {\n realIndex = parseInt(swiper.slides[activeIndex].getAttribute('data-swiper-slide-index') || activeIndex, 10);\n } else {\n realIndex = activeIndex;\n }\n Object.assign(swiper, {\n previousSnapIndex,\n snapIndex,\n previousRealIndex,\n realIndex,\n previousIndex,\n activeIndex\n });\n if (swiper.initialized) {\n preload(swiper);\n }\n swiper.emit('activeIndexChange');\n swiper.emit('snapIndexChange');\n if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n if (previousRealIndex !== realIndex) {\n swiper.emit('realIndexChange');\n }\n swiper.emit('slideChange');\n }\n}\n\nfunction updateClickedSlide(el, path) {\n const swiper = this;\n const params = swiper.params;\n let slide = el.closest(`.${params.slideClass}, swiper-slide`);\n if (!slide && swiper.isElement && path && path.length > 1 && path.includes(el)) {\n [...path.slice(path.indexOf(el) + 1, path.length)].forEach(pathEl => {\n if (!slide && pathEl.matches && pathEl.matches(`.${params.slideClass}, swiper-slide`)) {\n slide = pathEl;\n }\n });\n }\n let slideFound = false;\n let slideIndex;\n if (slide) {\n for (let i = 0; i < swiper.slides.length; i += 1) {\n if (swiper.slides[i] === slide) {\n slideFound = true;\n slideIndex = i;\n break;\n }\n }\n }\n if (slide && slideFound) {\n swiper.clickedSlide = slide;\n if (swiper.virtual && swiper.params.virtual.enabled) {\n swiper.clickedIndex = parseInt(slide.getAttribute('data-swiper-slide-index'), 10);\n } else {\n swiper.clickedIndex = slideIndex;\n }\n } else {\n swiper.clickedSlide = undefined;\n swiper.clickedIndex = undefined;\n return;\n }\n if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {\n swiper.slideToClickedSlide();\n }\n}\n\nvar update = {\n updateSize,\n updateSlides,\n updateAutoHeight,\n updateSlidesOffset,\n updateSlidesProgress,\n updateProgress,\n updateSlidesClasses,\n updateActiveIndex,\n updateClickedSlide\n};\n\nfunction getSwiperTranslate(axis) {\n if (axis === void 0) {\n axis = this.isHorizontal() ? 'x' : 'y';\n }\n const swiper = this;\n const {\n params,\n rtlTranslate: rtl,\n translate,\n wrapperEl\n } = swiper;\n if (params.virtualTranslate) {\n return rtl ? -translate : translate;\n }\n if (params.cssMode) {\n return translate;\n }\n let currentTranslate = getTranslate(wrapperEl, axis);\n currentTranslate += swiper.cssOverflowAdjustment();\n if (rtl) currentTranslate = -currentTranslate;\n return currentTranslate || 0;\n}\n\nfunction setTranslate(translate, byController) {\n const swiper = this;\n const {\n rtlTranslate: rtl,\n params,\n wrapperEl,\n progress\n } = swiper;\n let x = 0;\n let y = 0;\n const z = 0;\n if (swiper.isHorizontal()) {\n x = rtl ? -translate : translate;\n } else {\n y = translate;\n }\n if (params.roundLengths) {\n x = Math.floor(x);\n y = Math.floor(y);\n }\n swiper.previousTranslate = swiper.translate;\n swiper.translate = swiper.isHorizontal() ? x : y;\n if (params.cssMode) {\n wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n } else if (!params.virtualTranslate) {\n if (swiper.isHorizontal()) {\n x -= swiper.cssOverflowAdjustment();\n } else {\n y -= swiper.cssOverflowAdjustment();\n }\n wrapperEl.style.transform = `translate3d(${x}px, ${y}px, ${z}px)`;\n }\n\n // Check if we need to update progress\n let newProgress;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (translate - swiper.minTranslate()) / translatesDiff;\n }\n if (newProgress !== progress) {\n swiper.updateProgress(translate);\n }\n swiper.emit('setTranslate', swiper.translate, byController);\n}\n\nfunction minTranslate() {\n return -this.snapGrid[0];\n}\n\nfunction maxTranslate() {\n return -this.snapGrid[this.snapGrid.length - 1];\n}\n\nfunction translateTo(translate, speed, runCallbacks, translateBounds, internal) {\n if (translate === void 0) {\n translate = 0;\n }\n if (speed === void 0) {\n speed = this.params.speed;\n }\n if (runCallbacks === void 0) {\n runCallbacks = true;\n }\n if (translateBounds === void 0) {\n translateBounds = true;\n }\n const swiper = this;\n const {\n params,\n wrapperEl\n } = swiper;\n if (swiper.animating && params.preventInteractionOnTransition) {\n return false;\n }\n const minTranslate = swiper.minTranslate();\n const maxTranslate = swiper.maxTranslate();\n let newTranslate;\n if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate;\n\n // Update progress\n swiper.updateProgress(newTranslate);\n if (params.cssMode) {\n const isH = swiper.isHorizontal();\n if (speed === 0) {\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;\n } else {\n if (!swiper.support.smoothScroll) {\n animateCSSModeScroll({\n swiper,\n targetPosition: -newTranslate,\n side: isH ? 'left' : 'top'\n });\n return true;\n }\n wrapperEl.scrollTo({\n [isH ? 'left' : 'top']: -newTranslate,\n behavior: 'smooth'\n });\n }\n return true;\n }\n if (speed === 0) {\n swiper.setTransition(0);\n swiper.setTranslate(newTranslate);\n if (runCallbacks) {\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.emit('transitionEnd');\n }\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(newTranslate);\n if (runCallbacks) {\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.emit('transitionStart');\n }\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onTranslateToWrapperTransitionEnd) {\n swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) return;\n if (e.target !== this) return;\n swiper.wrapperEl.removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n swiper.onTranslateToWrapperTransitionEnd = null;\n delete swiper.onTranslateToWrapperTransitionEnd;\n if (runCallbacks) {\n swiper.emit('transitionEnd');\n }\n };\n }\n swiper.wrapperEl.addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n }\n }\n return true;\n}\n\nvar translate = {\n getTranslate: getSwiperTranslate,\n setTranslate,\n minTranslate,\n maxTranslate,\n translateTo\n};\n\nfunction setTransition(duration, byController) {\n const swiper = this;\n if (!swiper.params.cssMode) {\n swiper.wrapperEl.style.transitionDuration = `${duration}ms`;\n swiper.wrapperEl.style.transitionDelay = duration === 0 ? `0ms` : '';\n }\n swiper.emit('setTransition', duration, byController);\n}\n\nfunction transitionEmit(_ref) {\n let {\n swiper,\n runCallbacks,\n direction,\n step\n } = _ref;\n const {\n activeIndex,\n previousIndex\n } = swiper;\n let dir = direction;\n if (!dir) {\n if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';\n }\n swiper.emit(`transition${step}`);\n if (runCallbacks && activeIndex !== previousIndex) {\n if (dir === 'reset') {\n swiper.emit(`slideResetTransition${step}`);\n return;\n }\n swiper.emit(`slideChangeTransition${step}`);\n if (dir === 'next') {\n swiper.emit(`slideNextTransition${step}`);\n } else {\n swiper.emit(`slidePrevTransition${step}`);\n }\n }\n}\n\nfunction transitionStart(runCallbacks, direction) {\n if (runCallbacks === void 0) {\n runCallbacks = true;\n }\n const swiper = this;\n const {\n params\n } = swiper;\n if (params.cssMode) return;\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n transitionEmit({\n swiper,\n runCallbacks,\n direction,\n step: 'Start'\n });\n}\n\nfunction transitionEnd(runCallbacks, direction) {\n if (runCallbacks === void 0) {\n runCallbacks = true;\n }\n const swiper = this;\n const {\n params\n } = swiper;\n swiper.animating = false;\n if (params.cssMode) return;\n swiper.setTransition(0);\n transitionEmit({\n swiper,\n runCallbacks,\n direction,\n step: 'End'\n });\n}\n\nvar transition = {\n setTransition,\n transitionStart,\n transitionEnd\n};\n\nfunction slideTo(index, speed, runCallbacks, internal, initial) {\n if (index === void 0) {\n index = 0;\n }\n if (speed === void 0) {\n speed = this.params.speed;\n }\n if (runCallbacks === void 0) {\n runCallbacks = true;\n }\n if (typeof index === 'string') {\n index = parseInt(index, 10);\n }\n const swiper = this;\n let slideIndex = index;\n if (slideIndex < 0) slideIndex = 0;\n const {\n params,\n snapGrid,\n slidesGrid,\n previousIndex,\n activeIndex,\n rtlTranslate: rtl,\n wrapperEl,\n enabled\n } = swiper;\n if (swiper.animating && params.preventInteractionOnTransition || !enabled && !internal && !initial) {\n return false;\n }\n const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);\n let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);\n if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n const translate = -snapGrid[snapIndex];\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n for (let i = 0; i < slidesGrid.length; i += 1) {\n const normalizedTranslate = -Math.floor(translate * 100);\n const normalizedGrid = Math.floor(slidesGrid[i] * 100);\n const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {\n slideIndex = i;\n } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {\n slideIndex = i + 1;\n }\n } else if (normalizedTranslate >= normalizedGrid) {\n slideIndex = i;\n }\n }\n }\n // Directions locks\n if (swiper.initialized && slideIndex !== activeIndex) {\n if (!swiper.allowSlideNext && (rtl ? translate > swiper.translate && translate > swiper.minTranslate() : translate < swiper.translate && translate < swiper.minTranslate())) {\n return false;\n }\n if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {\n if ((activeIndex || 0) !== slideIndex) {\n return false;\n }\n }\n }\n if (slideIndex !== (previousIndex || 0) && runCallbacks) {\n swiper.emit('beforeSlideChangeStart');\n }\n\n // Update progress\n swiper.updateProgress(translate);\n let direction;\n if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset';\n\n // Update Index\n if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) {\n swiper.updateActiveIndex(slideIndex);\n // Update Height\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n swiper.updateSlidesClasses();\n if (params.effect !== 'slide') {\n swiper.setTranslate(translate);\n }\n if (direction !== 'reset') {\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n }\n return false;\n }\n if (params.cssMode) {\n const isH = swiper.isHorizontal();\n const t = rtl ? translate : -translate;\n if (speed === 0) {\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n if (isVirtual) {\n swiper.wrapperEl.style.scrollSnapType = 'none';\n swiper._immediateVirtual = true;\n }\n if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) {\n swiper._cssModeVirtualInitialSet = true;\n requestAnimationFrame(() => {\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n });\n } else {\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n }\n if (isVirtual) {\n requestAnimationFrame(() => {\n swiper.wrapperEl.style.scrollSnapType = '';\n swiper._immediateVirtual = false;\n });\n }\n } else {\n if (!swiper.support.smoothScroll) {\n animateCSSModeScroll({\n swiper,\n targetPosition: t,\n side: isH ? 'left' : 'top'\n });\n return true;\n }\n wrapperEl.scrollTo({\n [isH ? 'left' : 'top']: t,\n behavior: 'smooth'\n });\n }\n return true;\n }\n swiper.setTransition(speed);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n if (speed === 0) {\n swiper.transitionEnd(runCallbacks, direction);\n } else if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onSlideToWrapperTransitionEnd) {\n swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) return;\n if (e.target !== this) return;\n swiper.wrapperEl.removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n swiper.onSlideToWrapperTransitionEnd = null;\n delete swiper.onSlideToWrapperTransitionEnd;\n swiper.transitionEnd(runCallbacks, direction);\n };\n }\n swiper.wrapperEl.addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n }\n return true;\n}\n\nfunction slideToLoop(index, speed, runCallbacks, internal) {\n if (index === void 0) {\n index = 0;\n }\n if (speed === void 0) {\n speed = this.params.speed;\n }\n if (runCallbacks === void 0) {\n runCallbacks = true;\n }\n if (typeof index === 'string') {\n const indexAsNumber = parseInt(index, 10);\n index = indexAsNumber;\n }\n const swiper = this;\n let newIndex = index;\n if (swiper.params.loop) {\n if (swiper.virtual && swiper.params.virtual.enabled) {\n // eslint-disable-next-line\n newIndex = newIndex + swiper.virtual.slidesBefore;\n } else {\n newIndex = swiper.getSlideIndexByData(newIndex);\n }\n }\n return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n}\n\n/* eslint no-unused-vars: \"off\" */\nfunction slideNext(speed, runCallbacks, internal) {\n if (speed === void 0) {\n speed = this.params.speed;\n }\n if (runCallbacks === void 0) {\n runCallbacks = true;\n }\n const swiper = this;\n const {\n enabled,\n params,\n animating\n } = swiper;\n if (!enabled) return swiper;\n let perGroup = params.slidesPerGroup;\n if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);\n }\n const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n if (params.loop) {\n if (animating && !isVirtual && params.loopPreventsSliding) return false;\n swiper.loopFix({\n direction: 'next'\n });\n // eslint-disable-next-line\n swiper._clientLeft = swiper.wrapperEl.clientLeft;\n if (swiper.activeIndex === swiper.slides.length - 1 && params.cssMode) {\n requestAnimationFrame(() => {\n swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n });\n return true;\n }\n }\n if (params.rewind && swiper.isEnd) {\n return swiper.slideTo(0, speed, runCallbacks, internal);\n }\n return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}\n\n/* eslint no-unused-vars: \"off\" */\nfunction slidePrev(speed, runCallbacks, internal) {\n if (speed === void 0) {\n speed = this.params.speed;\n }\n if (runCallbacks === void 0) {\n runCallbacks = true;\n }\n const swiper = this;\n const {\n params,\n snapGrid,\n slidesGrid,\n rtlTranslate,\n enabled,\n animating\n } = swiper;\n if (!enabled) return swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n if (params.loop) {\n if (animating && !isVirtual && params.loopPreventsSliding) return false;\n swiper.loopFix({\n direction: 'prev'\n });\n // eslint-disable-next-line\n swiper._clientLeft = swiper.wrapperEl.clientLeft;\n }\n const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n function normalize(val) {\n if (val < 0) return -Math.floor(Math.abs(val));\n return Math.floor(val);\n }\n const normalizedTranslate = normalize(translate);\n const normalizedSnapGrid = snapGrid.map(val => normalize(val));\n let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n if (typeof prevSnap === 'undefined' && params.cssMode) {\n let prevSnapIndex;\n snapGrid.forEach((snap, snapIndex) => {\n if (normalizedTranslate >= snap) {\n // prevSnap = snap;\n prevSnapIndex = snapIndex;\n }\n });\n if (typeof prevSnapIndex !== 'undefined') {\n prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];\n }\n }\n let prevIndex = 0;\n if (typeof prevSnap !== 'undefined') {\n prevIndex = slidesGrid.indexOf(prevSnap);\n if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;\n if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n prevIndex = Math.max(prevIndex, 0);\n }\n }\n if (params.rewind && swiper.isBeginning) {\n const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;\n return swiper.slideTo(lastIndex, speed, runCallbacks, internal);\n } else if (params.loop && swiper.activeIndex === 0 && params.cssMode) {\n requestAnimationFrame(() => {\n swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n });\n return true;\n }\n return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}\n\n/* eslint no-unused-vars: \"off\" */\nfunction slideReset(speed, runCallbacks, internal) {\n if (speed === void 0) {\n speed = this.params.speed;\n }\n if (runCallbacks === void 0) {\n runCallbacks = true;\n }\n const swiper = this;\n return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}\n\n/* eslint no-unused-vars: \"off\" */\nfunction slideToClosest(speed, runCallbacks, internal, threshold) {\n if (speed === void 0) {\n speed = this.params.speed;\n }\n if (runCallbacks === void 0) {\n runCallbacks = true;\n }\n if (threshold === void 0) {\n threshold = 0.5;\n }\n const swiper = this;\n let index = swiper.activeIndex;\n const skip = Math.min(swiper.params.slidesPerGroupSkip, index);\n const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n if (translate >= swiper.snapGrid[snapIndex]) {\n // The current translate is on or after the current snap index, so the choice\n // is between the current index and the one after it.\n const currentSnap = swiper.snapGrid[snapIndex];\n const nextSnap = swiper.snapGrid[snapIndex + 1];\n if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {\n index += swiper.params.slidesPerGroup;\n }\n } else {\n // The current translate is before the current snap index, so the choice\n // is between the current index and the one before it.\n const prevSnap = swiper.snapGrid[snapIndex - 1];\n const currentSnap = swiper.snapGrid[snapIndex];\n if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {\n index -= swiper.params.slidesPerGroup;\n }\n }\n index = Math.max(index, 0);\n index = Math.min(index, swiper.slidesGrid.length - 1);\n return swiper.slideTo(index, speed, runCallbacks, internal);\n}\n\nfunction slideToClickedSlide() {\n const swiper = this;\n const {\n params,\n slidesEl\n } = swiper;\n const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n let slideToIndex = swiper.clickedIndex;\n let realIndex;\n const slideSelector = swiper.isElement ? `swiper-slide` : `.${params.slideClass}`;\n if (params.loop) {\n if (swiper.animating) return;\n realIndex = parseInt(swiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);\n if (params.centeredSlides) {\n if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) {\n swiper.loopFix();\n slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index=\"${realIndex}\"]`)[0]);\n nextTick(() => {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n swiper.loopFix();\n slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index=\"${realIndex}\"]`)[0]);\n nextTick(() => {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else {\n swiper.slideTo(slideToIndex);\n }\n}\n\nvar slide = {\n slideTo,\n slideToLoop,\n slideNext,\n slidePrev,\n slideReset,\n slideToClosest,\n slideToClickedSlide\n};\n\nfunction loopCreate(slideRealIndex) {\n const swiper = this;\n const {\n params,\n slidesEl\n } = swiper;\n if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;\n const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);\n slides.forEach((el, index) => {\n el.setAttribute('data-swiper-slide-index', index);\n });\n swiper.loopFix({\n slideRealIndex,\n direction: params.centeredSlides ? undefined : 'next'\n });\n}\n\nfunction loopFix(_temp) {\n let {\n slideRealIndex,\n slideTo = true,\n direction,\n setTranslate,\n activeSlideIndex,\n byController,\n byMousewheel\n } = _temp === void 0 ? {} : _temp;\n const swiper = this;\n if (!swiper.params.loop) return;\n swiper.emit('beforeLoopFix');\n const {\n slides,\n allowSlidePrev,\n allowSlideNext,\n slidesEl,\n params\n } = swiper;\n swiper.allowSlidePrev = true;\n swiper.allowSlideNext = true;\n if (swiper.virtual && params.virtual.enabled) {\n if (slideTo) {\n if (!params.centeredSlides && swiper.snapIndex === 0) {\n swiper.slideTo(swiper.virtual.slides.length, 0, false, true);\n } else if (params.centeredSlides && swiper.snapIndex < params.slidesPerView) {\n swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true);\n } else if (swiper.snapIndex === swiper.snapGrid.length - 1) {\n swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true);\n }\n }\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n swiper.emit('loopFix');\n return;\n }\n const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10));\n let loopedSlides = params.loopedSlides || slidesPerView;\n if (loopedSlides % params.slidesPerGroup !== 0) {\n loopedSlides += params.slidesPerGroup - loopedSlides % params.slidesPerGroup;\n }\n swiper.loopedSlides = loopedSlides;\n const prependSlidesIndexes = [];\n const appendSlidesIndexes = [];\n let activeIndex = swiper.activeIndex;\n if (typeof activeSlideIndex === 'undefined') {\n activeSlideIndex = swiper.getSlideIndex(swiper.slides.filter(el => el.classList.contains(params.slideActiveClass))[0]);\n } else {\n activeIndex = activeSlideIndex;\n }\n const isNext = direction === 'next' || !direction;\n const isPrev = direction === 'prev' || !direction;\n let slidesPrepended = 0;\n let slidesAppended = 0;\n // prepend last slides before start\n if (activeSlideIndex < loopedSlides) {\n slidesPrepended = Math.max(loopedSlides - activeSlideIndex, params.slidesPerGroup);\n for (let i = 0; i < loopedSlides - activeSlideIndex; i += 1) {\n const index = i - Math.floor(i / slides.length) * slides.length;\n prependSlidesIndexes.push(slides.length - index - 1);\n }\n } else if (activeSlideIndex /* + slidesPerView */ > swiper.slides.length - loopedSlides * 2) {\n slidesAppended = Math.max(activeSlideIndex - (swiper.slides.length - loopedSlides * 2), params.slidesPerGroup);\n for (let i = 0; i < slidesAppended; i += 1) {\n const index = i - Math.floor(i / slides.length) * slides.length;\n appendSlidesIndexes.push(index);\n }\n }\n if (isPrev) {\n prependSlidesIndexes.forEach(index => {\n swiper.slides[index].swiperLoopMoveDOM = true;\n slidesEl.prepend(swiper.slides[index]);\n swiper.slides[index].swiperLoopMoveDOM = false;\n });\n }\n if (isNext) {\n appendSlidesIndexes.forEach(index => {\n swiper.slides[index].swiperLoopMoveDOM = true;\n slidesEl.append(swiper.slides[index]);\n swiper.slides[index].swiperLoopMoveDOM = false;\n });\n }\n swiper.recalcSlides();\n if (params.slidesPerView === 'auto') {\n swiper.updateSlides();\n }\n if (params.watchSlidesProgress) {\n swiper.updateSlidesOffset();\n }\n if (slideTo) {\n if (prependSlidesIndexes.length > 0 && isPrev) {\n if (typeof slideRealIndex === 'undefined') {\n const currentSlideTranslate = swiper.slidesGrid[activeIndex];\n const newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended];\n const diff = newSlideTranslate - currentSlideTranslate;\n if (byMousewheel) {\n swiper.setTranslate(swiper.translate - diff);\n } else {\n swiper.slideTo(activeIndex + slidesPrepended, 0, false, true);\n if (setTranslate) {\n swiper.touches[swiper.isHorizontal() ? 'startX' : 'startY'] += diff;\n swiper.touchEventsData.currentTranslate = swiper.translate;\n }\n }\n } else {\n if (setTranslate) {\n swiper.slideToLoop(slideRealIndex, 0, false, true);\n swiper.touchEventsData.currentTranslate = swiper.translate;\n }\n }\n } else if (appendSlidesIndexes.length > 0 && isNext) {\n if (typeof slideRealIndex === 'undefined') {\n const currentSlideTranslate = swiper.slidesGrid[activeIndex];\n const newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended];\n const diff = newSlideTranslate - currentSlideTranslate;\n if (byMousewheel) {\n swiper.setTranslate(swiper.translate - diff);\n } else {\n swiper.slideTo(activeIndex - slidesAppended, 0, false, true);\n if (setTranslate) {\n swiper.touches[swiper.isHorizontal() ? 'startX' : 'startY'] += diff;\n swiper.touchEventsData.currentTranslate = swiper.translate;\n }\n }\n } else {\n swiper.slideToLoop(slideRealIndex, 0, false, true);\n }\n }\n }\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n if (swiper.controller && swiper.controller.control && !byController) {\n const loopParams = {\n slideRealIndex,\n direction,\n setTranslate,\n activeSlideIndex,\n byController: true\n };\n if (Array.isArray(swiper.controller.control)) {\n swiper.controller.control.forEach(c => {\n if (!c.destroyed && c.params.loop) c.loopFix({\n ...loopParams,\n slideTo: c.params.slidesPerView === params.slidesPerView ? slideTo : false\n });\n });\n } else if (swiper.controller.control instanceof swiper.constructor && swiper.controller.control.params.loop) {\n swiper.controller.control.loopFix({\n ...loopParams,\n slideTo: swiper.controller.control.params.slidesPerView === params.slidesPerView ? slideTo : false\n });\n }\n }\n swiper.emit('loopFix');\n}\n\nfunction loopDestroy() {\n const swiper = this;\n const {\n params,\n slidesEl\n } = swiper;\n if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;\n swiper.recalcSlides();\n const newSlidesOrder = [];\n swiper.slides.forEach(slideEl => {\n const index = typeof slideEl.swiperSlideIndex === 'undefined' ? slideEl.getAttribute('data-swiper-slide-index') * 1 : slideEl.swiperSlideIndex;\n newSlidesOrder[index] = slideEl;\n });\n swiper.slides.forEach(slideEl => {\n slideEl.removeAttribute('data-swiper-slide-index');\n });\n newSlidesOrder.forEach(slideEl => {\n slidesEl.append(slideEl);\n });\n swiper.recalcSlides();\n swiper.slideTo(swiper.realIndex, 0);\n}\n\nvar loop = {\n loopCreate,\n loopFix,\n loopDestroy\n};\n\nfunction setGrabCursor(moving) {\n const swiper = this;\n if (!swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;\n const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n if (swiper.isElement) {\n swiper.__preventObserver__ = true;\n }\n el.style.cursor = 'move';\n el.style.cursor = moving ? 'grabbing' : 'grab';\n if (swiper.isElement) {\n requestAnimationFrame(() => {\n swiper.__preventObserver__ = false;\n });\n }\n}\n\nfunction unsetGrabCursor() {\n const swiper = this;\n if (swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {\n return;\n }\n if (swiper.isElement) {\n swiper.__preventObserver__ = true;\n }\n swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n if (swiper.isElement) {\n requestAnimationFrame(() => {\n swiper.__preventObserver__ = false;\n });\n }\n}\n\nvar grabCursor = {\n setGrabCursor,\n unsetGrabCursor\n};\n\n// Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\nfunction closestElement(selector, base) {\n if (base === void 0) {\n base = this;\n }\n function __closestFrom(el) {\n if (!el || el === getDocument() || el === getWindow()) return null;\n if (el.assignedSlot) el = el.assignedSlot;\n const found = el.closest(selector);\n if (!found && !el.getRootNode) {\n return null;\n }\n return found || __closestFrom(el.getRootNode().host);\n }\n return __closestFrom(base);\n}\nfunction onTouchStart(event) {\n const swiper = this;\n const document = getDocument();\n const window = getWindow();\n const data = swiper.touchEventsData;\n data.evCache.push(event);\n const {\n params,\n touches,\n enabled\n } = swiper;\n if (!enabled) return;\n if (!params.simulateTouch && event.pointerType === 'mouse') return;\n if (swiper.animating && params.preventInteractionOnTransition) {\n return;\n }\n if (!swiper.animating && params.cssMode && params.loop) {\n swiper.loopFix();\n }\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n let targetEl = e.target;\n if (params.touchEventsTarget === 'wrapper') {\n if (!swiper.wrapperEl.contains(targetEl)) return;\n }\n if ('which' in e && e.which === 3) return;\n if ('button' in e && e.button > 0) return;\n if (data.isTouched && data.isMoved) return;\n\n // change target el for shadow root component\n const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';\n // eslint-disable-next-line\n const eventPath = event.composedPath ? event.composedPath() : event.path;\n if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) {\n targetEl = eventPath[0];\n }\n const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`;\n const isTargetShadow = !!(e.target && e.target.shadowRoot);\n\n // use closestElement for shadow root element to get the actual closest for nested shadow root element\n if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, targetEl) : targetEl.closest(noSwipingSelector))) {\n swiper.allowClick = true;\n return;\n }\n if (params.swipeHandler) {\n if (!targetEl.closest(params.swipeHandler)) return;\n }\n touches.currentX = e.pageX;\n touches.currentY = e.pageY;\n const startX = touches.currentX;\n const startY = touches.currentY;\n\n // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore\n\n const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {\n if (edgeSwipeDetection === 'prevent') {\n event.preventDefault();\n } else {\n return;\n }\n }\n Object.assign(data, {\n isTouched: true,\n isMoved: false,\n allowTouchCallbacks: true,\n isScrolling: undefined,\n startMoving: undefined\n });\n touches.startX = startX;\n touches.startY = startY;\n data.touchStartTime = now();\n swiper.allowClick = true;\n swiper.updateSize();\n swiper.swipeDirection = undefined;\n if (params.threshold > 0) data.allowThresholdMove = false;\n let preventDefault = true;\n if (targetEl.matches(data.focusableElements)) {\n preventDefault = false;\n if (targetEl.nodeName === 'SELECT') {\n data.isTouched = false;\n }\n }\n if (document.activeElement && document.activeElement.matches(data.focusableElements) && document.activeElement !== targetEl) {\n document.activeElement.blur();\n }\n const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !targetEl.isContentEditable) {\n e.preventDefault();\n }\n if (params.freeMode && params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) {\n swiper.freeMode.onTouchStart();\n }\n swiper.emit('touchStart', e);\n}\n\nfunction onTouchMove(event) {\n const document = getDocument();\n const swiper = this;\n const data = swiper.touchEventsData;\n const {\n params,\n touches,\n rtlTranslate: rtl,\n enabled\n } = swiper;\n if (!enabled) return;\n if (!params.simulateTouch && event.pointerType === 'mouse') return;\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n if (!data.isTouched) {\n if (data.startMoving && data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n return;\n }\n const pointerIndex = data.evCache.findIndex(cachedEv => cachedEv.pointerId === e.pointerId);\n if (pointerIndex >= 0) data.evCache[pointerIndex] = e;\n const targetTouch = data.evCache.length > 1 ? data.evCache[0] : e;\n const pageX = targetTouch.pageX;\n const pageY = targetTouch.pageY;\n if (e.preventedByNestedSwiper) {\n touches.startX = pageX;\n touches.startY = pageY;\n return;\n }\n if (!swiper.allowTouchMove) {\n if (!e.target.matches(data.focusableElements)) {\n swiper.allowClick = false;\n }\n if (data.isTouched) {\n Object.assign(touches, {\n startX: pageX,\n startY: pageY,\n prevX: swiper.touches.currentX,\n prevY: swiper.touches.currentY,\n currentX: pageX,\n currentY: pageY\n });\n data.touchStartTime = now();\n }\n return;\n }\n if (params.touchReleaseOnEdges && !params.loop) {\n if (swiper.isVertical()) {\n // Vertical\n if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {\n data.isTouched = false;\n data.isMoved = false;\n return;\n }\n } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {\n return;\n }\n }\n if (document.activeElement) {\n if (e.target === document.activeElement && e.target.matches(data.focusableElements)) {\n data.isMoved = true;\n swiper.allowClick = false;\n return;\n }\n }\n if (data.allowTouchCallbacks) {\n swiper.emit('touchMove', e);\n }\n if (e.targetTouches && e.targetTouches.length > 1) return;\n touches.currentX = pageX;\n touches.currentY = pageY;\n const diffX = touches.currentX - touches.startX;\n const diffY = touches.currentY - touches.startY;\n if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;\n if (typeof data.isScrolling === 'undefined') {\n let touchAngle;\n if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {\n data.isScrolling = false;\n } else {\n // eslint-disable-next-line\n if (diffX * diffX + diffY * diffY >= 25) {\n touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;\n data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;\n }\n }\n }\n if (data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n if (typeof data.startMoving === 'undefined') {\n if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n data.startMoving = true;\n }\n }\n if (data.isScrolling || swiper.zoom && swiper.params.zoom && swiper.params.zoom.enabled && data.evCache.length > 1) {\n data.isTouched = false;\n return;\n }\n if (!data.startMoving) {\n return;\n }\n swiper.allowClick = false;\n if (!params.cssMode && e.cancelable) {\n e.preventDefault();\n }\n if (params.touchMoveStopPropagation && !params.nested) {\n e.stopPropagation();\n }\n let diff = swiper.isHorizontal() ? diffX : diffY;\n let touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY;\n if (params.oneWayMovement) {\n diff = Math.abs(diff) * (rtl ? 1 : -1);\n touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1);\n }\n touches.diff = diff;\n diff *= params.touchRatio;\n if (rtl) {\n diff = -diff;\n touchesDiff = -touchesDiff;\n }\n const prevTouchesDirection = swiper.touchesDirection;\n swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n swiper.touchesDirection = touchesDiff > 0 ? 'prev' : 'next';\n const isLoop = swiper.params.loop && !params.cssMode;\n const allowLoopFix = swiper.swipeDirection === 'next' && swiper.allowSlideNext || swiper.swipeDirection === 'prev' && swiper.allowSlidePrev;\n if (!data.isMoved) {\n if (isLoop && allowLoopFix) {\n swiper.loopFix({\n direction: swiper.swipeDirection\n });\n }\n data.startTranslate = swiper.getTranslate();\n swiper.setTransition(0);\n if (swiper.animating) {\n const evt = new window.CustomEvent('transitionend', {\n bubbles: true,\n cancelable: true\n });\n swiper.wrapperEl.dispatchEvent(evt);\n }\n data.allowMomentumBounce = false;\n // Grab Cursor\n if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n swiper.setGrabCursor(true);\n }\n swiper.emit('sliderFirstMove', e);\n }\n let loopFixed;\n if (data.isMoved && prevTouchesDirection !== swiper.touchesDirection && isLoop && allowLoopFix && Math.abs(diff) >= 1) {\n // need another loop fix\n swiper.loopFix({\n direction: swiper.swipeDirection,\n setTranslate: true\n });\n loopFixed = true;\n }\n swiper.emit('sliderMove', e);\n data.isMoved = true;\n data.currentTranslate = diff + data.startTranslate;\n let disableParentSwiper = true;\n let resistanceRatio = params.resistanceRatio;\n if (params.touchReleaseOnEdges) {\n resistanceRatio = 0;\n }\n if (diff > 0) {\n if (isLoop && allowLoopFix && !loopFixed && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.size / 2 : swiper.minTranslate())) {\n swiper.loopFix({\n direction: 'prev',\n setTranslate: true,\n activeSlideIndex: 0\n });\n }\n if (data.currentTranslate > swiper.minTranslate()) {\n disableParentSwiper = false;\n if (params.resistance) {\n data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n }\n }\n } else if (diff < 0) {\n if (isLoop && allowLoopFix && !loopFixed && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.size / 2 : swiper.maxTranslate())) {\n swiper.loopFix({\n direction: 'next',\n setTranslate: true,\n activeSlideIndex: swiper.slides.length - (params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10)))\n });\n }\n if (data.currentTranslate < swiper.maxTranslate()) {\n disableParentSwiper = false;\n if (params.resistance) {\n data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n }\n }\n }\n if (disableParentSwiper) {\n e.preventedByNestedSwiper = true;\n }\n\n // Directions locks\n if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {\n data.currentTranslate = data.startTranslate;\n }\n if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {\n data.currentTranslate = data.startTranslate;\n }\n if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {\n data.currentTranslate = data.startTranslate;\n }\n\n // Threshold\n if (params.threshold > 0) {\n if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n if (!data.allowThresholdMove) {\n data.allowThresholdMove = true;\n touches.startX = touches.currentX;\n touches.startY = touches.currentY;\n data.currentTranslate = data.startTranslate;\n touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;\n return;\n }\n } else {\n data.currentTranslate = data.startTranslate;\n return;\n }\n }\n if (!params.followFinger || params.cssMode) return;\n\n // Update active index in free mode\n if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n if (params.freeMode && params.freeMode.enabled && swiper.freeMode) {\n swiper.freeMode.onTouchMove();\n }\n // Update progress\n swiper.updateProgress(data.currentTranslate);\n // Update translate\n swiper.setTranslate(data.currentTranslate);\n}\n\nfunction onTouchEnd(event) {\n const swiper = this;\n const data = swiper.touchEventsData;\n const pointerIndex = data.evCache.findIndex(cachedEv => cachedEv.pointerId === event.pointerId);\n if (pointerIndex >= 0) {\n data.evCache.splice(pointerIndex, 1);\n }\n if (['pointercancel', 'pointerout', 'pointerleave', 'contextmenu'].includes(event.type)) {\n const proceed = ['pointercancel', 'contextmenu'].includes(event.type) && (swiper.browser.isSafari || swiper.browser.isWebView);\n if (!proceed) {\n return;\n }\n }\n const {\n params,\n touches,\n rtlTranslate: rtl,\n slidesGrid,\n enabled\n } = swiper;\n if (!enabled) return;\n if (!params.simulateTouch && event.pointerType === 'mouse') return;\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n if (data.allowTouchCallbacks) {\n swiper.emit('touchEnd', e);\n }\n data.allowTouchCallbacks = false;\n if (!data.isTouched) {\n if (data.isMoved && params.grabCursor) {\n swiper.setGrabCursor(false);\n }\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n // Return Grab Cursor\n if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n swiper.setGrabCursor(false);\n }\n\n // Time diff\n const touchEndTime = now();\n const timeDiff = touchEndTime - data.touchStartTime;\n\n // Tap, doubleTap, Click\n if (swiper.allowClick) {\n const pathTree = e.path || e.composedPath && e.composedPath();\n swiper.updateClickedSlide(pathTree && pathTree[0] || e.target, pathTree);\n swiper.emit('tap click', e);\n if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n swiper.emit('doubleTap doubleClick', e);\n }\n }\n data.lastClickTime = now();\n nextTick(() => {\n if (!swiper.destroyed) swiper.allowClick = true;\n });\n if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n let currentPos;\n if (params.followFinger) {\n currentPos = rtl ? swiper.translate : -swiper.translate;\n } else {\n currentPos = -data.currentTranslate;\n }\n if (params.cssMode) {\n return;\n }\n if (params.freeMode && params.freeMode.enabled) {\n swiper.freeMode.onTouchEnd({\n currentPos\n });\n return;\n }\n\n // Find current slide\n let stopIndex = 0;\n let groupSize = swiper.slidesSizesGrid[0];\n for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {\n const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n if (typeof slidesGrid[i + increment] !== 'undefined') {\n if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {\n stopIndex = i;\n groupSize = slidesGrid[i + increment] - slidesGrid[i];\n }\n } else if (currentPos >= slidesGrid[i]) {\n stopIndex = i;\n groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n }\n }\n let rewindFirstIndex = null;\n let rewindLastIndex = null;\n if (params.rewind) {\n if (swiper.isBeginning) {\n rewindLastIndex = params.virtual && params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;\n } else if (swiper.isEnd) {\n rewindFirstIndex = 0;\n }\n }\n // Find current slide size\n const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n if (timeDiff > params.longSwipesMs) {\n // Long touches\n if (!params.longSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (swiper.swipeDirection === 'next') {\n if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);else swiper.slideTo(stopIndex);\n }\n if (swiper.swipeDirection === 'prev') {\n if (ratio > 1 - params.longSwipesRatio) {\n swiper.slideTo(stopIndex + increment);\n } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) {\n swiper.slideTo(rewindLastIndex);\n } else {\n swiper.slideTo(stopIndex);\n }\n }\n } else {\n // Short swipes\n if (!params.shortSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n if (!isNavButtonTarget) {\n if (swiper.swipeDirection === 'next') {\n swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);\n }\n if (swiper.swipeDirection === 'prev') {\n swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);\n }\n } else if (e.target === swiper.navigation.nextEl) {\n swiper.slideTo(stopIndex + increment);\n } else {\n swiper.slideTo(stopIndex);\n }\n }\n}\n\nfunction onResize() {\n const swiper = this;\n const {\n params,\n el\n } = swiper;\n if (el && el.offsetWidth === 0) return;\n\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Save locks\n const {\n allowSlideNext,\n allowSlidePrev,\n snapGrid\n } = swiper;\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n // Disable locks on resize\n swiper.allowSlideNext = true;\n swiper.allowSlidePrev = true;\n swiper.updateSize();\n swiper.updateSlides();\n swiper.updateSlidesClasses();\n const isVirtualLoop = isVirtual && params.loop;\n if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides && !isVirtualLoop) {\n swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n if (swiper.params.loop && !isVirtual) {\n swiper.slideToLoop(swiper.realIndex, 0, false, true);\n } else {\n swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n }\n if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n clearTimeout(swiper.autoplay.resizeTimeout);\n swiper.autoplay.resizeTimeout = setTimeout(() => {\n if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n swiper.autoplay.resume();\n }\n }, 500);\n }\n // Return locks after resize\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n}\n\nfunction onClick(e) {\n const swiper = this;\n if (!swiper.enabled) return;\n if (!swiper.allowClick) {\n if (swiper.params.preventClicks) e.preventDefault();\n if (swiper.params.preventClicksPropagation && swiper.animating) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n }\n}\n\nfunction onScroll() {\n const swiper = this;\n const {\n wrapperEl,\n rtlTranslate,\n enabled\n } = swiper;\n if (!enabled) return;\n swiper.previousTranslate = swiper.translate;\n if (swiper.isHorizontal()) {\n swiper.translate = -wrapperEl.scrollLeft;\n } else {\n swiper.translate = -wrapperEl.scrollTop;\n }\n // eslint-disable-next-line\n if (swiper.translate === 0) swiper.translate = 0;\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n let newProgress;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;\n }\n if (newProgress !== swiper.progress) {\n swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);\n }\n swiper.emit('setTranslate', swiper.translate, false);\n}\n\nfunction onLoad(e) {\n const swiper = this;\n processLazyPreloader(swiper, e.target);\n if (swiper.params.cssMode || swiper.params.slidesPerView !== 'auto' && !swiper.params.autoHeight) {\n return;\n }\n swiper.update();\n}\n\nlet dummyEventAttached = false;\nfunction dummyEventListener() {}\nconst events = (swiper, method) => {\n const document = getDocument();\n const {\n params,\n el,\n wrapperEl,\n device\n } = swiper;\n const capture = !!params.nested;\n const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n const swiperMethod = method;\n\n // Touch Events\n el[domMethod]('pointerdown', swiper.onTouchStart, {\n passive: false\n });\n document[domMethod]('pointermove', swiper.onTouchMove, {\n passive: false,\n capture\n });\n document[domMethod]('pointerup', swiper.onTouchEnd, {\n passive: true\n });\n document[domMethod]('pointercancel', swiper.onTouchEnd, {\n passive: true\n });\n document[domMethod]('pointerout', swiper.onTouchEnd, {\n passive: true\n });\n document[domMethod]('pointerleave', swiper.onTouchEnd, {\n passive: true\n });\n document[domMethod]('contextmenu', swiper.onTouchEnd, {\n passive: true\n });\n\n // Prevent Links Clicks\n if (params.preventClicks || params.preventClicksPropagation) {\n el[domMethod]('click', swiper.onClick, true);\n }\n if (params.cssMode) {\n wrapperEl[domMethod]('scroll', swiper.onScroll);\n }\n\n // Resize handler\n if (params.updateOnWindowResize) {\n swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true);\n } else {\n swiper[swiperMethod]('observerUpdate', onResize, true);\n }\n\n // Images loader\n el[domMethod]('load', swiper.onLoad, {\n capture: true\n });\n};\nfunction attachEvents() {\n const swiper = this;\n const document = getDocument();\n const {\n params\n } = swiper;\n swiper.onTouchStart = onTouchStart.bind(swiper);\n swiper.onTouchMove = onTouchMove.bind(swiper);\n swiper.onTouchEnd = onTouchEnd.bind(swiper);\n if (params.cssMode) {\n swiper.onScroll = onScroll.bind(swiper);\n }\n swiper.onClick = onClick.bind(swiper);\n swiper.onLoad = onLoad.bind(swiper);\n if (!dummyEventAttached) {\n document.addEventListener('touchstart', dummyEventListener);\n dummyEventAttached = true;\n }\n events(swiper, 'on');\n}\nfunction detachEvents() {\n const swiper = this;\n events(swiper, 'off');\n}\nvar events$1 = {\n attachEvents,\n detachEvents\n};\n\nconst isGridEnabled = (swiper, params) => {\n return swiper.grid && params.grid && params.grid.rows > 1;\n};\nfunction setBreakpoint() {\n const swiper = this;\n const {\n realIndex,\n initialized,\n params,\n el\n } = swiper;\n const breakpoints = params.breakpoints;\n if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return;\n\n // Get breakpoint for window width and update parameters\n const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);\n if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n const breakpointParams = breakpointOnlyParams || swiper.originalParams;\n const wasMultiRow = isGridEnabled(swiper, params);\n const isMultiRow = isGridEnabled(swiper, breakpointParams);\n const wasEnabled = params.enabled;\n if (wasMultiRow && !isMultiRow) {\n el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`);\n swiper.emitContainerClasses();\n } else if (!wasMultiRow && isMultiRow) {\n el.classList.add(`${params.containerModifierClass}grid`);\n if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') {\n el.classList.add(`${params.containerModifierClass}grid-column`);\n }\n swiper.emitContainerClasses();\n }\n\n // Toggle navigation, pagination, scrollbar\n ['navigation', 'pagination', 'scrollbar'].forEach(prop => {\n if (typeof breakpointParams[prop] === 'undefined') return;\n const wasModuleEnabled = params[prop] && params[prop].enabled;\n const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled;\n if (wasModuleEnabled && !isModuleEnabled) {\n swiper[prop].disable();\n }\n if (!wasModuleEnabled && isModuleEnabled) {\n swiper[prop].enable();\n }\n });\n const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;\n const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n const wasLoop = params.loop;\n if (directionChanged && initialized) {\n swiper.changeDirection();\n }\n extend(swiper.params, breakpointParams);\n const isEnabled = swiper.params.enabled;\n const hasLoop = swiper.params.loop;\n Object.assign(swiper, {\n allowTouchMove: swiper.params.allowTouchMove,\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev\n });\n if (wasEnabled && !isEnabled) {\n swiper.disable();\n } else if (!wasEnabled && isEnabled) {\n swiper.enable();\n }\n swiper.currentBreakpoint = breakpoint;\n swiper.emit('_beforeBreakpoint', breakpointParams);\n if (initialized) {\n if (needsReLoop) {\n swiper.loopDestroy();\n swiper.loopCreate(realIndex);\n swiper.updateSlides();\n } else if (!wasLoop && hasLoop) {\n swiper.loopCreate(realIndex);\n swiper.updateSlides();\n } else if (wasLoop && !hasLoop) {\n swiper.loopDestroy();\n }\n }\n swiper.emit('breakpoint', breakpointParams);\n}\n\nfunction getBreakpoint(breakpoints, base, containerEl) {\n if (base === void 0) {\n base = 'window';\n }\n if (!breakpoints || base === 'container' && !containerEl) return undefined;\n let breakpoint = false;\n const window = getWindow();\n const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n const points = Object.keys(breakpoints).map(point => {\n if (typeof point === 'string' && point.indexOf('@') === 0) {\n const minRatio = parseFloat(point.substr(1));\n const value = currentHeight * minRatio;\n return {\n value,\n point\n };\n }\n return {\n value: point,\n point\n };\n });\n points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));\n for (let i = 0; i < points.length; i += 1) {\n const {\n point,\n value\n } = points[i];\n if (base === 'window') {\n if (window.matchMedia(`(min-width: ${value}px)`).matches) {\n breakpoint = point;\n }\n } else if (value <= containerEl.clientWidth) {\n breakpoint = point;\n }\n }\n return breakpoint || 'max';\n}\n\nvar breakpoints = {\n setBreakpoint,\n getBreakpoint\n};\n\nfunction prepareClasses(entries, prefix) {\n const resultClasses = [];\n entries.forEach(item => {\n if (typeof item === 'object') {\n Object.keys(item).forEach(classNames => {\n if (item[classNames]) {\n resultClasses.push(prefix + classNames);\n }\n });\n } else if (typeof item === 'string') {\n resultClasses.push(prefix + item);\n }\n });\n return resultClasses;\n}\nfunction addClasses() {\n const swiper = this;\n const {\n classNames,\n params,\n rtl,\n el,\n device\n } = swiper;\n // prettier-ignore\n const suffixes = prepareClasses(['initialized', params.direction, {\n 'free-mode': swiper.params.freeMode && params.freeMode.enabled\n }, {\n 'autoheight': params.autoHeight\n }, {\n 'rtl': rtl\n }, {\n 'grid': params.grid && params.grid.rows > 1\n }, {\n 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column'\n }, {\n 'android': device.android\n }, {\n 'ios': device.ios\n }, {\n 'css-mode': params.cssMode\n }, {\n 'centered': params.cssMode && params.centeredSlides\n }, {\n 'watch-progress': params.watchSlidesProgress\n }], params.containerModifierClass);\n classNames.push(...suffixes);\n el.classList.add(...classNames);\n swiper.emitContainerClasses();\n}\n\nfunction removeClasses() {\n const swiper = this;\n const {\n el,\n classNames\n } = swiper;\n el.classList.remove(...classNames);\n swiper.emitContainerClasses();\n}\n\nvar classes = {\n addClasses,\n removeClasses\n};\n\nfunction checkOverflow() {\n const swiper = this;\n const {\n isLocked: wasLocked,\n params\n } = swiper;\n const {\n slidesOffsetBefore\n } = params;\n if (slidesOffsetBefore) {\n const lastSlideIndex = swiper.slides.length - 1;\n const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;\n swiper.isLocked = swiper.size > lastSlideRightEdge;\n } else {\n swiper.isLocked = swiper.snapGrid.length === 1;\n }\n if (params.allowSlideNext === true) {\n swiper.allowSlideNext = !swiper.isLocked;\n }\n if (params.allowSlidePrev === true) {\n swiper.allowSlidePrev = !swiper.isLocked;\n }\n if (wasLocked && wasLocked !== swiper.isLocked) {\n swiper.isEnd = false;\n }\n if (wasLocked !== swiper.isLocked) {\n swiper.emit(swiper.isLocked ? 'lock' : 'unlock');\n }\n}\nvar checkOverflow$1 = {\n checkOverflow\n};\n\nvar defaults = {\n init: true,\n direction: 'horizontal',\n oneWayMovement: false,\n touchEventsTarget: 'wrapper',\n initialSlide: 0,\n speed: 300,\n cssMode: false,\n updateOnWindowResize: true,\n resizeObserver: true,\n nested: false,\n createElements: false,\n enabled: true,\n focusableElements: 'input, select, option, textarea, button, video, label',\n // Overrides\n width: null,\n height: null,\n //\n preventInteractionOnTransition: false,\n // ssr\n userAgent: null,\n url: null,\n // To support iOS's swipe-to-go-back gesture (when being used in-app).\n edgeSwipeDetection: false,\n edgeSwipeThreshold: 20,\n // Autoheight\n autoHeight: false,\n // Set wrapper width\n setWrapperSize: false,\n // Virtual Translate\n virtualTranslate: false,\n // Effects\n effect: 'slide',\n // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n // Breakpoints\n breakpoints: undefined,\n breakpointsBase: 'window',\n // Slides grid\n spaceBetween: 0,\n slidesPerView: 1,\n slidesPerGroup: 1,\n slidesPerGroupSkip: 0,\n slidesPerGroupAuto: false,\n centeredSlides: false,\n centeredSlidesBounds: false,\n slidesOffsetBefore: 0,\n // in px\n slidesOffsetAfter: 0,\n // in px\n normalizeSlideIndex: true,\n centerInsufficientSlides: false,\n // Disable swiper and hide navigation when container not overflow\n watchOverflow: true,\n // Round length\n roundLengths: false,\n // Touches\n touchRatio: 1,\n touchAngle: 45,\n simulateTouch: true,\n shortSwipes: true,\n longSwipes: true,\n longSwipesRatio: 0.5,\n longSwipesMs: 300,\n followFinger: true,\n allowTouchMove: true,\n threshold: 5,\n touchMoveStopPropagation: false,\n touchStartPreventDefault: true,\n touchStartForcePreventDefault: false,\n touchReleaseOnEdges: false,\n // Unique Navigation Elements\n uniqueNavElements: true,\n // Resistance\n resistance: true,\n resistanceRatio: 0.85,\n // Progress\n watchSlidesProgress: false,\n // Cursor\n grabCursor: false,\n // Clicks\n preventClicks: true,\n preventClicksPropagation: true,\n slideToClickedSlide: false,\n // loop\n loop: false,\n loopedSlides: null,\n loopPreventsSliding: true,\n // rewind\n rewind: false,\n // Swiping/no swiping\n allowSlidePrev: true,\n allowSlideNext: true,\n swipeHandler: null,\n // '.swipe-handler',\n noSwiping: true,\n noSwipingClass: 'swiper-no-swiping',\n noSwipingSelector: null,\n // Passive Listeners\n passiveListeners: true,\n maxBackfaceHiddenSlides: 10,\n // NS\n containerModifierClass: 'swiper-',\n // NEW\n slideClass: 'swiper-slide',\n slideActiveClass: 'swiper-slide-active',\n slideVisibleClass: 'swiper-slide-visible',\n slideNextClass: 'swiper-slide-next',\n slidePrevClass: 'swiper-slide-prev',\n wrapperClass: 'swiper-wrapper',\n lazyPreloaderClass: 'swiper-lazy-preloader',\n lazyPreloadPrevNext: 0,\n // Callbacks\n runCallbacksOnInit: true,\n // Internals\n _emitClasses: false\n};\n\nfunction moduleExtendParams(params, allModulesParams) {\n return function extendParams(obj) {\n if (obj === void 0) {\n obj = {};\n }\n const moduleParamName = Object.keys(obj)[0];\n const moduleParams = obj[moduleParamName];\n if (typeof moduleParams !== 'object' || moduleParams === null) {\n extend(allModulesParams, obj);\n return;\n }\n if (params[moduleParamName] === true) {\n params[moduleParamName] = {\n enabled: true\n };\n }\n if (moduleParamName === 'navigation' && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].prevEl && !params[moduleParamName].nextEl) {\n params[moduleParamName].auto = true;\n }\n if (['pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].el) {\n params[moduleParamName].auto = true;\n }\n if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n extend(allModulesParams, obj);\n return;\n }\n if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n params[moduleParamName].enabled = true;\n }\n if (!params[moduleParamName]) params[moduleParamName] = {\n enabled: false\n };\n extend(allModulesParams, obj);\n };\n}\n\n/* eslint no-param-reassign: \"off\" */\nconst prototypes = {\n eventsEmitter,\n update,\n translate,\n transition,\n slide,\n loop,\n grabCursor,\n events: events$1,\n breakpoints,\n checkOverflow: checkOverflow$1,\n classes\n};\nconst extendedDefaults = {};\nclass Swiper {\n constructor() {\n let el;\n let params;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {\n params = args[0];\n } else {\n [el, params] = args;\n }\n if (!params) params = {};\n params = extend({}, params);\n if (el && !params.el) params.el = el;\n const document = getDocument();\n if (params.el && typeof params.el === 'string' && document.querySelectorAll(params.el).length > 1) {\n const swipers = [];\n document.querySelectorAll(params.el).forEach(containerEl => {\n const newParams = extend({}, params, {\n el: containerEl\n });\n swipers.push(new Swiper(newParams));\n });\n // eslint-disable-next-line no-constructor-return\n return swipers;\n }\n\n // Swiper Instance\n const swiper = this;\n swiper.__swiper__ = true;\n swiper.support = getSupport();\n swiper.device = getDevice({\n userAgent: params.userAgent\n });\n swiper.browser = getBrowser();\n swiper.eventsListeners = {};\n swiper.eventsAnyListeners = [];\n swiper.modules = [...swiper.__modules__];\n if (params.modules && Array.isArray(params.modules)) {\n swiper.modules.push(...params.modules);\n }\n const allModulesParams = {};\n swiper.modules.forEach(mod => {\n mod({\n params,\n swiper,\n extendParams: moduleExtendParams(params, allModulesParams),\n on: swiper.on.bind(swiper),\n once: swiper.once.bind(swiper),\n off: swiper.off.bind(swiper),\n emit: swiper.emit.bind(swiper)\n });\n });\n\n // Extend defaults with modules params\n const swiperParams = extend({}, defaults, allModulesParams);\n\n // Extend defaults with passed params\n swiper.params = extend({}, swiperParams, extendedDefaults, params);\n swiper.originalParams = extend({}, swiper.params);\n swiper.passedParams = extend({}, params);\n\n // add event listeners\n if (swiper.params && swiper.params.on) {\n Object.keys(swiper.params.on).forEach(eventName => {\n swiper.on(eventName, swiper.params.on[eventName]);\n });\n }\n if (swiper.params && swiper.params.onAny) {\n swiper.onAny(swiper.params.onAny);\n }\n\n // Extend Swiper\n Object.assign(swiper, {\n enabled: swiper.params.enabled,\n el,\n // Classes\n classNames: [],\n // Slides\n slides: [],\n slidesGrid: [],\n snapGrid: [],\n slidesSizesGrid: [],\n // isDirection\n isHorizontal() {\n return swiper.params.direction === 'horizontal';\n },\n isVertical() {\n return swiper.params.direction === 'vertical';\n },\n // Indexes\n activeIndex: 0,\n realIndex: 0,\n //\n isBeginning: true,\n isEnd: false,\n // Props\n translate: 0,\n previousTranslate: 0,\n progress: 0,\n velocity: 0,\n animating: false,\n cssOverflowAdjustment() {\n // Returns 0 unless `translate` is > 2**23\n // Should be subtracted from css values to prevent overflow\n return Math.trunc(this.translate / 2 ** 23) * 2 ** 23;\n },\n // Locks\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n // Touch Events\n touchEventsData: {\n isTouched: undefined,\n isMoved: undefined,\n allowTouchCallbacks: undefined,\n touchStartTime: undefined,\n isScrolling: undefined,\n currentTranslate: undefined,\n startTranslate: undefined,\n allowThresholdMove: undefined,\n // Form elements to match\n focusableElements: swiper.params.focusableElements,\n // Last click time\n lastClickTime: 0,\n clickTimeout: undefined,\n // Velocities\n velocities: [],\n allowMomentumBounce: undefined,\n startMoving: undefined,\n evCache: []\n },\n // Clicks\n allowClick: true,\n // Touches\n allowTouchMove: swiper.params.allowTouchMove,\n touches: {\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n diff: 0\n },\n // Images\n imagesToLoad: [],\n imagesLoaded: 0\n });\n swiper.emit('_swiper');\n\n // Init\n if (swiper.params.init) {\n swiper.init();\n }\n\n // Return app instance\n // eslint-disable-next-line no-constructor-return\n return swiper;\n }\n getSlideIndex(slideEl) {\n const {\n slidesEl,\n params\n } = this;\n const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);\n const firstSlideIndex = elementIndex(slides[0]);\n return elementIndex(slideEl) - firstSlideIndex;\n }\n getSlideIndexByData(index) {\n return this.getSlideIndex(this.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === index)[0]);\n }\n recalcSlides() {\n const swiper = this;\n const {\n slidesEl,\n params\n } = swiper;\n swiper.slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);\n }\n enable() {\n const swiper = this;\n if (swiper.enabled) return;\n swiper.enabled = true;\n if (swiper.params.grabCursor) {\n swiper.setGrabCursor();\n }\n swiper.emit('enable');\n }\n disable() {\n const swiper = this;\n if (!swiper.enabled) return;\n swiper.enabled = false;\n if (swiper.params.grabCursor) {\n swiper.unsetGrabCursor();\n }\n swiper.emit('disable');\n }\n setProgress(progress, speed) {\n const swiper = this;\n progress = Math.min(Math.max(progress, 0), 1);\n const min = swiper.minTranslate();\n const max = swiper.maxTranslate();\n const current = (max - min) * progress + min;\n swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n emitContainerClasses() {\n const swiper = this;\n if (!swiper.params._emitClasses || !swiper.el) return;\n const cls = swiper.el.className.split(' ').filter(className => {\n return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;\n });\n swiper.emit('_containerClasses', cls.join(' '));\n }\n getSlideClasses(slideEl) {\n const swiper = this;\n if (swiper.destroyed) return '';\n return slideEl.className.split(' ').filter(className => {\n return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;\n }).join(' ');\n }\n emitSlidesClasses() {\n const swiper = this;\n if (!swiper.params._emitClasses || !swiper.el) return;\n const updates = [];\n swiper.slides.forEach(slideEl => {\n const classNames = swiper.getSlideClasses(slideEl);\n updates.push({\n slideEl,\n classNames\n });\n swiper.emit('_slideClass', slideEl, classNames);\n });\n swiper.emit('_slideClasses', updates);\n }\n slidesPerViewDynamic(view, exact) {\n if (view === void 0) {\n view = 'current';\n }\n if (exact === void 0) {\n exact = false;\n }\n const swiper = this;\n const {\n params,\n slides,\n slidesGrid,\n slidesSizesGrid,\n size: swiperSize,\n activeIndex\n } = swiper;\n let spv = 1;\n if (typeof params.slidesPerView === 'number') return params.slidesPerView;\n if (params.centeredSlides) {\n let slideSize = slides[activeIndex] ? slides[activeIndex].swiperSlideSize : 0;\n let breakLoop;\n for (let i = activeIndex + 1; i < slides.length; i += 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) breakLoop = true;\n }\n }\n for (let i = activeIndex - 1; i >= 0; i -= 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) breakLoop = true;\n }\n }\n } else {\n // eslint-disable-next-line\n if (view === 'current') {\n for (let i = activeIndex + 1; i < slides.length; i += 1) {\n const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;\n if (slideInView) {\n spv += 1;\n }\n }\n } else {\n // previous\n for (let i = activeIndex - 1; i >= 0; i -= 1) {\n const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;\n if (slideInView) {\n spv += 1;\n }\n }\n }\n }\n return spv;\n }\n update() {\n const swiper = this;\n if (!swiper || swiper.destroyed) return;\n const {\n snapGrid,\n params\n } = swiper;\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n [...swiper.el.querySelectorAll('[loading=\"lazy\"]')].forEach(imageEl => {\n if (imageEl.complete) {\n processLazyPreloader(swiper, imageEl);\n }\n });\n swiper.updateSize();\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n function setTranslate() {\n const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());\n swiper.setTranslate(newTranslate);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n let translated;\n if (params.freeMode && params.freeMode.enabled && !params.cssMode) {\n setTranslate();\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n } else {\n if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !params.centeredSlides) {\n const slides = swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides;\n translated = swiper.slideTo(slides.length - 1, 0, false, true);\n } else {\n translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n if (!translated) {\n setTranslate();\n }\n }\n if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n swiper.emit('update');\n }\n changeDirection(newDirection, needUpdate) {\n if (needUpdate === void 0) {\n needUpdate = true;\n }\n const swiper = this;\n const currentDirection = swiper.params.direction;\n if (!newDirection) {\n // eslint-disable-next-line\n newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n }\n if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {\n return swiper;\n }\n swiper.el.classList.remove(`${swiper.params.containerModifierClass}${currentDirection}`);\n swiper.el.classList.add(`${swiper.params.containerModifierClass}${newDirection}`);\n swiper.emitContainerClasses();\n swiper.params.direction = newDirection;\n swiper.slides.forEach(slideEl => {\n if (newDirection === 'vertical') {\n slideEl.style.width = '';\n } else {\n slideEl.style.height = '';\n }\n });\n swiper.emit('changeDirection');\n if (needUpdate) swiper.update();\n return swiper;\n }\n changeLanguageDirection(direction) {\n const swiper = this;\n if (swiper.rtl && direction === 'rtl' || !swiper.rtl && direction === 'ltr') return;\n swiper.rtl = direction === 'rtl';\n swiper.rtlTranslate = swiper.params.direction === 'horizontal' && swiper.rtl;\n if (swiper.rtl) {\n swiper.el.classList.add(`${swiper.params.containerModifierClass}rtl`);\n swiper.el.dir = 'rtl';\n } else {\n swiper.el.classList.remove(`${swiper.params.containerModifierClass}rtl`);\n swiper.el.dir = 'ltr';\n }\n swiper.update();\n }\n mount(element) {\n const swiper = this;\n if (swiper.mounted) return true;\n\n // Find el\n let el = element || swiper.params.el;\n if (typeof el === 'string') {\n el = document.querySelector(el);\n }\n if (!el) {\n return false;\n }\n el.swiper = swiper;\n if (el.parentNode && el.parentNode.host && el.parentNode.host.nodeName === 'SWIPER-CONTAINER') {\n swiper.isElement = true;\n }\n const getWrapperSelector = () => {\n return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n };\n const getWrapper = () => {\n if (el && el.shadowRoot && el.shadowRoot.querySelector) {\n const res = el.shadowRoot.querySelector(getWrapperSelector());\n // Children needs to return slot items\n return res;\n }\n return elementChildren(el, getWrapperSelector())[0];\n };\n // Find Wrapper\n let wrapperEl = getWrapper();\n if (!wrapperEl && swiper.params.createElements) {\n wrapperEl = createElement('div', swiper.params.wrapperClass);\n el.append(wrapperEl);\n elementChildren(el, `.${swiper.params.slideClass}`).forEach(slideEl => {\n wrapperEl.append(slideEl);\n });\n }\n Object.assign(swiper, {\n el,\n wrapperEl,\n slidesEl: swiper.isElement && !el.parentNode.host.slideSlots ? el.parentNode.host : wrapperEl,\n hostEl: swiper.isElement ? el.parentNode.host : el,\n mounted: true,\n // RTL\n rtl: el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl',\n rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl'),\n wrongRTL: elementStyle(wrapperEl, 'display') === '-webkit-box'\n });\n return true;\n }\n init(el) {\n const swiper = this;\n if (swiper.initialized) return swiper;\n const mounted = swiper.mount(el);\n if (mounted === false) return swiper;\n swiper.emit('beforeInit');\n\n // Set breakpoint\n if (swiper.params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Add Classes\n swiper.addClasses();\n\n // Update size\n swiper.updateSize();\n\n // Update slides\n swiper.updateSlides();\n if (swiper.params.watchOverflow) {\n swiper.checkOverflow();\n }\n\n // Set Grab Cursor\n if (swiper.params.grabCursor && swiper.enabled) {\n swiper.setGrabCursor();\n }\n\n // Slide To Initial Slide\n if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {\n swiper.slideTo(swiper.params.initialSlide + swiper.virtual.slidesBefore, 0, swiper.params.runCallbacksOnInit, false, true);\n } else {\n swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n }\n\n // Create loop\n if (swiper.params.loop) {\n swiper.loopCreate();\n }\n\n // Attach events\n swiper.attachEvents();\n const lazyElements = [...swiper.el.querySelectorAll('[loading=\"lazy\"]')];\n if (swiper.isElement) {\n lazyElements.push(...swiper.hostEl.querySelectorAll('[loading=\"lazy\"]'));\n }\n lazyElements.forEach(imageEl => {\n if (imageEl.complete) {\n processLazyPreloader(swiper, imageEl);\n } else {\n imageEl.addEventListener('load', e => {\n processLazyPreloader(swiper, e.target);\n });\n }\n });\n preload(swiper);\n\n // Init Flag\n swiper.initialized = true;\n preload(swiper);\n\n // Emit\n swiper.emit('init');\n swiper.emit('afterInit');\n return swiper;\n }\n destroy(deleteInstance, cleanStyles) {\n if (deleteInstance === void 0) {\n deleteInstance = true;\n }\n if (cleanStyles === void 0) {\n cleanStyles = true;\n }\n const swiper = this;\n const {\n params,\n el,\n wrapperEl,\n slides\n } = swiper;\n if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n return null;\n }\n swiper.emit('beforeDestroy');\n\n // Init Flag\n swiper.initialized = false;\n\n // Detach events\n swiper.detachEvents();\n\n // Destroy loop\n if (params.loop) {\n swiper.loopDestroy();\n }\n\n // Cleanup styles\n if (cleanStyles) {\n swiper.removeClasses();\n el.removeAttribute('style');\n wrapperEl.removeAttribute('style');\n if (slides && slides.length) {\n slides.forEach(slideEl => {\n slideEl.classList.remove(params.slideVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass);\n slideEl.removeAttribute('style');\n slideEl.removeAttribute('data-swiper-slide-index');\n });\n }\n }\n swiper.emit('destroy');\n\n // Detach emitter events\n Object.keys(swiper.eventsListeners).forEach(eventName => {\n swiper.off(eventName);\n });\n if (deleteInstance !== false) {\n swiper.el.swiper = null;\n deleteProps(swiper);\n }\n swiper.destroyed = true;\n return null;\n }\n static extendDefaults(newDefaults) {\n extend(extendedDefaults, newDefaults);\n }\n static get extendedDefaults() {\n return extendedDefaults;\n }\n static get defaults() {\n return defaults;\n }\n static installModule(mod) {\n if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n const modules = Swiper.prototype.__modules__;\n if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n modules.push(mod);\n }\n }\n static use(module) {\n if (Array.isArray(module)) {\n module.forEach(m => Swiper.installModule(m));\n return Swiper;\n }\n Swiper.installModule(module);\n return Swiper;\n }\n}\nObject.keys(prototypes).forEach(prototypeGroup => {\n Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => {\n Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n });\n});\nSwiper.use([Resize, Observer]);\n\nexport { Swiper as S, defaults as d };\n","import { e as elementChildren, c as createElement } from './utils.mjs';\n\nfunction createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n if (swiper.params.createElements) {\n Object.keys(checkProps).forEach(key => {\n if (!params[key] && params.auto === true) {\n let element = elementChildren(swiper.el, `.${checkProps[key]}`)[0];\n if (!element) {\n element = createElement('div', checkProps[key]);\n element.className = checkProps[key];\n swiper.el.append(element);\n }\n params[key] = element;\n originalParams[key] = element;\n }\n });\n }\n return params;\n}\n\nexport { createElementIfNotDefined as c };\n","function classesToSelector(classes) {\n if (classes === void 0) {\n classes = '';\n }\n return `.${classes.trim().replace(/([\\.:!+\\/])/g, '\\\\$1') // eslint-disable-line\n .replace(/ /g, '.')}`;\n}\n\nexport { classesToSelector as c };\n","function appendSlide(slides) {\n const swiper = this;\n const {\n params,\n slidesEl\n } = swiper;\n if (params.loop) {\n swiper.loopDestroy();\n }\n const appendElement = slideEl => {\n if (typeof slideEl === 'string') {\n const tempDOM = document.createElement('div');\n tempDOM.innerHTML = slideEl;\n slidesEl.append(tempDOM.children[0]);\n tempDOM.innerHTML = '';\n } else {\n slidesEl.append(slideEl);\n }\n };\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) appendElement(slides[i]);\n }\n } else {\n appendElement(slides);\n }\n swiper.recalcSlides();\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer || swiper.isElement) {\n swiper.update();\n }\n}\n\nfunction prependSlide(slides) {\n const swiper = this;\n const {\n params,\n activeIndex,\n slidesEl\n } = swiper;\n if (params.loop) {\n swiper.loopDestroy();\n }\n let newActiveIndex = activeIndex + 1;\n const prependElement = slideEl => {\n if (typeof slideEl === 'string') {\n const tempDOM = document.createElement('div');\n tempDOM.innerHTML = slideEl;\n slidesEl.prepend(tempDOM.children[0]);\n tempDOM.innerHTML = '';\n } else {\n slidesEl.prepend(slideEl);\n }\n };\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) prependElement(slides[i]);\n }\n newActiveIndex = activeIndex + slides.length;\n } else {\n prependElement(slides);\n }\n swiper.recalcSlides();\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer || swiper.isElement) {\n swiper.update();\n }\n swiper.slideTo(newActiveIndex, 0, false);\n}\n\nfunction addSlide(index, slides) {\n const swiper = this;\n const {\n params,\n activeIndex,\n slidesEl\n } = swiper;\n let activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.recalcSlides();\n }\n const baseLength = swiper.slides.length;\n if (index <= 0) {\n swiper.prependSlide(slides);\n return;\n }\n if (index >= baseLength) {\n swiper.appendSlide(slides);\n return;\n }\n let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;\n const slidesBuffer = [];\n for (let i = baseLength - 1; i >= index; i -= 1) {\n const currentSlide = swiper.slides[i];\n currentSlide.remove();\n slidesBuffer.unshift(currentSlide);\n }\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) slidesEl.append(slides[i]);\n }\n newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;\n } else {\n slidesEl.append(slides);\n }\n for (let i = 0; i < slidesBuffer.length; i += 1) {\n slidesEl.append(slidesBuffer[i]);\n }\n swiper.recalcSlides();\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer || swiper.isElement) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n}\n\nfunction removeSlide(slidesIndexes) {\n const swiper = this;\n const {\n params,\n activeIndex\n } = swiper;\n let activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n }\n let newActiveIndex = activeIndexBuffer;\n let indexToRemove;\n if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n for (let i = 0; i < slidesIndexes.length; i += 1) {\n indexToRemove = slidesIndexes[i];\n if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove();\n if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n }\n newActiveIndex = Math.max(newActiveIndex, 0);\n } else {\n indexToRemove = slidesIndexes;\n if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove();\n if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n newActiveIndex = Math.max(newActiveIndex, 0);\n }\n swiper.recalcSlides();\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer || swiper.isElement) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n}\n\nfunction removeAllSlides() {\n const swiper = this;\n const slidesIndexes = [];\n for (let i = 0; i < swiper.slides.length; i += 1) {\n slidesIndexes.push(i);\n }\n swiper.removeSlide(slidesIndexes);\n}\n\nfunction Manipulation(_ref) {\n let {\n swiper\n } = _ref;\n Object.assign(swiper, {\n appendSlide: appendSlide.bind(swiper),\n prependSlide: prependSlide.bind(swiper),\n addSlide: addSlide.bind(swiper),\n removeSlide: removeSlide.bind(swiper),\n removeAllSlides: removeAllSlides.bind(swiper)\n });\n}\n\nexport { Manipulation as default };\n","function effectInit(params) {\n const {\n effect,\n swiper,\n on,\n setTranslate,\n setTransition,\n overwriteParams,\n perspective,\n recreateShadows,\n getEffectParams\n } = params;\n on('beforeInit', () => {\n if (swiper.params.effect !== effect) return;\n swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`);\n if (perspective && perspective()) {\n swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);\n }\n const overwriteParamsResult = overwriteParams ? overwriteParams() : {};\n Object.assign(swiper.params, overwriteParamsResult);\n Object.assign(swiper.originalParams, overwriteParamsResult);\n });\n on('setTranslate', () => {\n if (swiper.params.effect !== effect) return;\n setTranslate();\n });\n on('setTransition', (_s, duration) => {\n if (swiper.params.effect !== effect) return;\n setTransition(duration);\n });\n on('transitionEnd', () => {\n if (swiper.params.effect !== effect) return;\n if (recreateShadows) {\n if (!getEffectParams || !getEffectParams().slideShadows) return;\n // remove shadows\n swiper.slides.forEach(slideEl => {\n slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => shadowEl.remove());\n });\n // create new one\n recreateShadows();\n }\n });\n let requireUpdateOnVirtual;\n on('virtualUpdate', () => {\n if (swiper.params.effect !== effect) return;\n if (!swiper.slides.length) {\n requireUpdateOnVirtual = true;\n }\n requestAnimationFrame(() => {\n if (requireUpdateOnVirtual && swiper.slides && swiper.slides.length) {\n setTranslate();\n requireUpdateOnVirtual = false;\n }\n });\n });\n}\n\nexport { effectInit as e };\n","import { k as getSlideTransformEl } from './utils.mjs';\n\nfunction effectTarget(effectParams, slideEl) {\n const transformEl = getSlideTransformEl(slideEl);\n if (transformEl !== slideEl) {\n transformEl.style.backfaceVisibility = 'hidden';\n transformEl.style['-webkit-backface-visibility'] = 'hidden';\n }\n return transformEl;\n}\n\nexport { effectTarget as e };\n","import { i as elementTransitionEnd } from './utils.mjs';\n\nfunction effectVirtualTransitionEnd(_ref) {\n let {\n swiper,\n duration,\n transformElements,\n allSlides\n } = _ref;\n const {\n activeIndex\n } = swiper;\n const getSlide = el => {\n if (!el.parentElement) {\n // assume shadow root\n const slide = swiper.slides.filter(slideEl => slideEl.shadowRoot && slideEl.shadowRoot === el.parentNode)[0];\n return slide;\n }\n return el.parentElement;\n };\n if (swiper.params.virtualTranslate && duration !== 0) {\n let eventTriggered = false;\n let transitionEndTarget;\n if (allSlides) {\n transitionEndTarget = transformElements;\n } else {\n transitionEndTarget = transformElements.filter(transformEl => {\n const el = transformEl.classList.contains('swiper-slide-transform') ? getSlide(transformEl) : transformEl;\n return swiper.getSlideIndex(el) === activeIndex;\n });\n }\n transitionEndTarget.forEach(el => {\n elementTransitionEnd(el, () => {\n if (eventTriggered) return;\n if (!swiper || swiper.destroyed) return;\n eventTriggered = true;\n swiper.animating = false;\n const evt = new window.CustomEvent('transitionend', {\n bubbles: true,\n cancelable: true\n });\n swiper.wrapperEl.dispatchEvent(evt);\n });\n });\n }\n}\n\nexport { effectVirtualTransitionEnd as e };\n","import { k as getSlideTransformEl, c as createElement } from './utils.mjs';\n\nfunction createShadow(suffix, slideEl, side) {\n const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}${suffix ? ` swiper-slide-shadow-${suffix}` : ''}`;\n const shadowContainer = getSlideTransformEl(slideEl);\n let shadowEl = shadowContainer.querySelector(`.${shadowClass.split(' ').join('.')}`);\n if (!shadowEl) {\n shadowEl = createElement('div', shadowClass.split(' '));\n shadowContainer.append(shadowEl);\n }\n return shadowEl;\n}\n\nexport { createShadow as c };\n","/**\n * Swiper 10.3.1\n * Most modern mobile touch slider and framework with hardware accelerated transitions\n * https://swiperjs.com\n *\n * Copyright 2014-2023 Vladimir Kharlampidi\n *\n * Released under the MIT License\n *\n * Released on: September 28, 2023\n */\n\nimport { S as Swiper } from './shared/swiper-core.mjs';\nimport Virtual from './modules/virtual.mjs';\nimport Keyboard from './modules/keyboard.mjs';\nimport Mousewheel from './modules/mousewheel.mjs';\nimport Navigation from './modules/navigation.mjs';\nimport Pagination from './modules/pagination.mjs';\nimport Scrollbar from './modules/scrollbar.mjs';\nimport Parallax from './modules/parallax.mjs';\nimport Zoom from './modules/zoom.mjs';\nimport Controller from './modules/controller.mjs';\nimport A11y from './modules/a11y.mjs';\nimport History from './modules/history.mjs';\nimport HashNavigation from './modules/hash-navigation.mjs';\nimport Autoplay from './modules/autoplay.mjs';\nimport Thumb from './modules/thumbs.mjs';\nimport freeMode from './modules/free-mode.mjs';\nimport Grid from './modules/grid.mjs';\nimport Manipulation from './modules/manipulation.mjs';\nimport EffectFade from './modules/effect-fade.mjs';\nimport EffectCube from './modules/effect-cube.mjs';\nimport EffectFlip from './modules/effect-flip.mjs';\nimport EffectCoverflow from './modules/effect-coverflow.mjs';\nimport EffectCreative from './modules/effect-creative.mjs';\nimport EffectCards from './modules/effect-cards.mjs';\n\n// Swiper Class\nconst modules = [Virtual, Keyboard, Mousewheel, Navigation, Pagination, Scrollbar, Parallax, Zoom, Controller, A11y, History, HashNavigation, Autoplay, Thumb, freeMode, Grid, Manipulation, EffectFade, EffectCube, EffectFlip, EffectCoverflow, EffectCreative, EffectCards];\nSwiper.use(modules);\n\nexport { Swiper, Swiper as default };\n","import { g as getDocument } from '../shared/ssr-window.esm.mjs';\nimport { s as setCSSProperty, e as elementChildren, c as createElement } from '../shared/utils.mjs';\n\nfunction Virtual(_ref) {\n let {\n swiper,\n extendParams,\n on,\n emit\n } = _ref;\n extendParams({\n virtual: {\n enabled: false,\n slides: [],\n cache: true,\n renderSlide: null,\n renderExternal: null,\n renderExternalUpdate: true,\n addSlidesBefore: 0,\n addSlidesAfter: 0\n }\n });\n let cssModeTimeout;\n const document = getDocument();\n swiper.virtual = {\n cache: {},\n from: undefined,\n to: undefined,\n slides: [],\n offset: 0,\n slidesGrid: []\n };\n const tempDOM = document.createElement('div');\n function renderSlide(slide, index) {\n const params = swiper.params.virtual;\n if (params.cache && swiper.virtual.cache[index]) {\n return swiper.virtual.cache[index];\n }\n // eslint-disable-next-line\n let slideEl;\n if (params.renderSlide) {\n slideEl = params.renderSlide.call(swiper, slide, index);\n if (typeof slideEl === 'string') {\n tempDOM.innerHTML = slideEl;\n slideEl = tempDOM.children[0];\n }\n } else if (swiper.isElement) {\n slideEl = createElement('swiper-slide');\n } else {\n slideEl = createElement('div', swiper.params.slideClass);\n }\n slideEl.setAttribute('data-swiper-slide-index', index);\n if (!params.renderSlide) {\n slideEl.innerHTML = slide;\n }\n if (params.cache) {\n swiper.virtual.cache[index] = slideEl;\n }\n return slideEl;\n }\n function update(force) {\n const {\n slidesPerView,\n slidesPerGroup,\n centeredSlides,\n loop: isLoop\n } = swiper.params;\n const {\n addSlidesBefore,\n addSlidesAfter\n } = swiper.params.virtual;\n const {\n from: previousFrom,\n to: previousTo,\n slides,\n slidesGrid: previousSlidesGrid,\n offset: previousOffset\n } = swiper.virtual;\n if (!swiper.params.cssMode) {\n swiper.updateActiveIndex();\n }\n const activeIndex = swiper.activeIndex || 0;\n let offsetProp;\n if (swiper.rtlTranslate) offsetProp = 'right';else offsetProp = swiper.isHorizontal() ? 'left' : 'top';\n let slidesAfter;\n let slidesBefore;\n if (centeredSlides) {\n slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;\n slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;\n } else {\n slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;\n slidesBefore = (isLoop ? slidesPerView : slidesPerGroup) + addSlidesBefore;\n }\n let from = activeIndex - slidesBefore;\n let to = activeIndex + slidesAfter;\n if (!isLoop) {\n from = Math.max(from, 0);\n to = Math.min(to, slides.length - 1);\n }\n let offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n if (isLoop && activeIndex >= slidesBefore) {\n from -= slidesBefore;\n if (!centeredSlides) offset += swiper.slidesGrid[0];\n } else if (isLoop && activeIndex < slidesBefore) {\n from = -slidesBefore;\n if (centeredSlides) offset += swiper.slidesGrid[0];\n }\n Object.assign(swiper.virtual, {\n from,\n to,\n offset,\n slidesGrid: swiper.slidesGrid,\n slidesBefore,\n slidesAfter\n });\n function onRendered() {\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n emit('virtualUpdate');\n }\n if (previousFrom === from && previousTo === to && !force) {\n if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n swiper.slides.forEach(slideEl => {\n slideEl.style[offsetProp] = `${offset - Math.abs(swiper.cssOverflowAdjustment())}px`;\n });\n }\n swiper.updateProgress();\n emit('virtualUpdate');\n return;\n }\n if (swiper.params.virtual.renderExternal) {\n swiper.params.virtual.renderExternal.call(swiper, {\n offset,\n from,\n to,\n slides: function getSlides() {\n const slidesToRender = [];\n for (let i = from; i <= to; i += 1) {\n slidesToRender.push(slides[i]);\n }\n return slidesToRender;\n }()\n });\n if (swiper.params.virtual.renderExternalUpdate) {\n onRendered();\n } else {\n emit('virtualUpdate');\n }\n return;\n }\n const prependIndexes = [];\n const appendIndexes = [];\n const getSlideIndex = index => {\n let slideIndex = index;\n if (index < 0) {\n slideIndex = slides.length + index;\n } else if (slideIndex >= slides.length) {\n // eslint-disable-next-line\n slideIndex = slideIndex - slides.length;\n }\n return slideIndex;\n };\n if (force) {\n swiper.slides.filter(el => el.matches(`.${swiper.params.slideClass}, swiper-slide`)).forEach(slideEl => {\n slideEl.remove();\n });\n } else {\n for (let i = previousFrom; i <= previousTo; i += 1) {\n if (i < from || i > to) {\n const slideIndex = getSlideIndex(i);\n swiper.slides.filter(el => el.matches(`.${swiper.params.slideClass}[data-swiper-slide-index=\"${slideIndex}\"], swiper-slide[data-swiper-slide-index=\"${slideIndex}\"]`)).forEach(slideEl => {\n slideEl.remove();\n });\n }\n }\n }\n const loopFrom = isLoop ? -slides.length : 0;\n const loopTo = isLoop ? slides.length * 2 : slides.length;\n for (let i = loopFrom; i < loopTo; i += 1) {\n if (i >= from && i <= to) {\n const slideIndex = getSlideIndex(i);\n if (typeof previousTo === 'undefined' || force) {\n appendIndexes.push(slideIndex);\n } else {\n if (i > previousTo) appendIndexes.push(slideIndex);\n if (i < previousFrom) prependIndexes.push(slideIndex);\n }\n }\n }\n appendIndexes.forEach(index => {\n swiper.slidesEl.append(renderSlide(slides[index], index));\n });\n if (isLoop) {\n for (let i = prependIndexes.length - 1; i >= 0; i -= 1) {\n const index = prependIndexes[i];\n swiper.slidesEl.prepend(renderSlide(slides[index], index));\n }\n } else {\n prependIndexes.sort((a, b) => b - a);\n prependIndexes.forEach(index => {\n swiper.slidesEl.prepend(renderSlide(slides[index], index));\n });\n }\n elementChildren(swiper.slidesEl, '.swiper-slide, swiper-slide').forEach(slideEl => {\n slideEl.style[offsetProp] = `${offset - Math.abs(swiper.cssOverflowAdjustment())}px`;\n });\n onRendered();\n }\n function appendSlide(slides) {\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) swiper.virtual.slides.push(slides[i]);\n }\n } else {\n swiper.virtual.slides.push(slides);\n }\n update(true);\n }\n function prependSlide(slides) {\n const activeIndex = swiper.activeIndex;\n let newActiveIndex = activeIndex + 1;\n let numberOfNewSlides = 1;\n if (Array.isArray(slides)) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) swiper.virtual.slides.unshift(slides[i]);\n }\n newActiveIndex = activeIndex + slides.length;\n numberOfNewSlides = slides.length;\n } else {\n swiper.virtual.slides.unshift(slides);\n }\n if (swiper.params.virtual.cache) {\n const cache = swiper.virtual.cache;\n const newCache = {};\n Object.keys(cache).forEach(cachedIndex => {\n const cachedEl = cache[cachedIndex];\n const cachedElIndex = cachedEl.getAttribute('data-swiper-slide-index');\n if (cachedElIndex) {\n cachedEl.setAttribute('data-swiper-slide-index', parseInt(cachedElIndex, 10) + numberOfNewSlides);\n }\n newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cachedEl;\n });\n swiper.virtual.cache = newCache;\n }\n update(true);\n swiper.slideTo(newActiveIndex, 0);\n }\n function removeSlide(slidesIndexes) {\n if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;\n let activeIndex = swiper.activeIndex;\n if (Array.isArray(slidesIndexes)) {\n for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) {\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes[i]];\n // shift cache indexes\n Object.keys(swiper.virtual.cache).forEach(key => {\n if (key > slidesIndexes) {\n swiper.virtual.cache[key - 1] = swiper.virtual.cache[key];\n swiper.virtual.cache[key - 1].setAttribute('data-swiper-slide-index', key - 1);\n delete swiper.virtual.cache[key];\n }\n });\n }\n swiper.virtual.slides.splice(slidesIndexes[i], 1);\n if (slidesIndexes[i] < activeIndex) activeIndex -= 1;\n activeIndex = Math.max(activeIndex, 0);\n }\n } else {\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes];\n // shift cache indexes\n Object.keys(swiper.virtual.cache).forEach(key => {\n if (key > slidesIndexes) {\n swiper.virtual.cache[key - 1] = swiper.virtual.cache[key];\n swiper.virtual.cache[key - 1].setAttribute('data-swiper-slide-index', key - 1);\n delete swiper.virtual.cache[key];\n }\n });\n }\n swiper.virtual.slides.splice(slidesIndexes, 1);\n if (slidesIndexes < activeIndex) activeIndex -= 1;\n activeIndex = Math.max(activeIndex, 0);\n }\n update(true);\n swiper.slideTo(activeIndex, 0);\n }\n function removeAllSlides() {\n swiper.virtual.slides = [];\n if (swiper.params.virtual.cache) {\n swiper.virtual.cache = {};\n }\n update(true);\n swiper.slideTo(0, 0);\n }\n on('beforeInit', () => {\n if (!swiper.params.virtual.enabled) return;\n let domSlidesAssigned;\n if (typeof swiper.passedParams.virtual.slides === 'undefined') {\n const slides = [...swiper.slidesEl.children].filter(el => el.matches(`.${swiper.params.slideClass}, swiper-slide`));\n if (slides && slides.length) {\n swiper.virtual.slides = [...slides];\n domSlidesAssigned = true;\n slides.forEach((slideEl, slideIndex) => {\n slideEl.setAttribute('data-swiper-slide-index', slideIndex);\n swiper.virtual.cache[slideIndex] = slideEl;\n slideEl.remove();\n });\n }\n }\n if (!domSlidesAssigned) {\n swiper.virtual.slides = swiper.params.virtual.slides;\n }\n swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n update();\n });\n on('setTranslate', () => {\n if (!swiper.params.virtual.enabled) return;\n if (swiper.params.cssMode && !swiper._immediateVirtual) {\n clearTimeout(cssModeTimeout);\n cssModeTimeout = setTimeout(() => {\n update();\n }, 100);\n } else {\n update();\n }\n });\n on('init update resize', () => {\n if (!swiper.params.virtual.enabled) return;\n if (swiper.params.cssMode) {\n setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`);\n }\n });\n Object.assign(swiper.virtual, {\n appendSlide,\n prependSlide,\n removeSlide,\n removeAllSlides,\n update\n });\n}\n\nexport { Virtual as default };\n","import { g as getDocument, a as getWindow } from '../shared/ssr-window.esm.mjs';\nimport { a as elementParents, b as elementOffset } from '../shared/utils.mjs';\n\n/* eslint-disable consistent-return */\nfunction Keyboard(_ref) {\n let {\n swiper,\n extendParams,\n on,\n emit\n } = _ref;\n const document = getDocument();\n const window = getWindow();\n swiper.keyboard = {\n enabled: false\n };\n extendParams({\n keyboard: {\n enabled: false,\n onlyInViewport: true,\n pageUpDown: true\n }\n });\n function handle(event) {\n if (!swiper.enabled) return;\n const {\n rtlTranslate: rtl\n } = swiper;\n let e = event;\n if (e.originalEvent) e = e.originalEvent; // jquery fix\n const kc = e.keyCode || e.charCode;\n const pageUpDown = swiper.params.keyboard.pageUpDown;\n const isPageUp = pageUpDown && kc === 33;\n const isPageDown = pageUpDown && kc === 34;\n const isArrowLeft = kc === 37;\n const isArrowRight = kc === 39;\n const isArrowUp = kc === 38;\n const isArrowDown = kc === 40;\n // Directions locks\n if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) {\n return false;\n }\n if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) {\n return false;\n }\n if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n return undefined;\n }\n if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) {\n return undefined;\n }\n if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) {\n let inView = false;\n // Check that swiper should be inside of visible area of window\n if (elementParents(swiper.el, `.${swiper.params.slideClass}, swiper-slide`).length > 0 && elementParents(swiper.el, `.${swiper.params.slideActiveClass}`).length === 0) {\n return undefined;\n }\n const el = swiper.el;\n const swiperWidth = el.clientWidth;\n const swiperHeight = el.clientHeight;\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const swiperOffset = elementOffset(el);\n if (rtl) swiperOffset.left -= el.scrollLeft;\n const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]];\n for (let i = 0; i < swiperCoord.length; i += 1) {\n const point = swiperCoord[i];\n if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {\n if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n inView = true;\n }\n }\n if (!inView) return undefined;\n }\n if (swiper.isHorizontal()) {\n if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {\n if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n }\n if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext();\n if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev();\n } else {\n if (isPageUp || isPageDown || isArrowUp || isArrowDown) {\n if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n }\n if (isPageDown || isArrowDown) swiper.slideNext();\n if (isPageUp || isArrowUp) swiper.slidePrev();\n }\n emit('keyPress', kc);\n return undefined;\n }\n function enable() {\n if (swiper.keyboard.enabled) return;\n document.addEventListener('keydown', handle);\n swiper.keyboard.enabled = true;\n }\n function disable() {\n if (!swiper.keyboard.enabled) return;\n document.removeEventListener('keydown', handle);\n swiper.keyboard.enabled = false;\n }\n on('init', () => {\n if (swiper.params.keyboard.enabled) {\n enable();\n }\n });\n on('destroy', () => {\n if (swiper.keyboard.enabled) {\n disable();\n }\n });\n Object.assign(swiper.keyboard, {\n enable,\n disable\n });\n}\n\nexport { Keyboard as default };\n","import { a as getWindow } from '../shared/ssr-window.esm.mjs';\nimport { n as nextTick, d as now } from '../shared/utils.mjs';\n\n/* eslint-disable consistent-return */\nfunction Mousewheel(_ref) {\n let {\n swiper,\n extendParams,\n on,\n emit\n } = _ref;\n const window = getWindow();\n extendParams({\n mousewheel: {\n enabled: false,\n releaseOnEdges: false,\n invert: false,\n forceToAxis: false,\n sensitivity: 1,\n eventsTarget: 'container',\n thresholdDelta: null,\n thresholdTime: null,\n noMousewheelClass: 'swiper-no-mousewheel'\n }\n });\n swiper.mousewheel = {\n enabled: false\n };\n let timeout;\n let lastScrollTime = now();\n let lastEventBeforeSnap;\n const recentWheelEvents = [];\n function normalize(e) {\n // Reasonable defaults\n const PIXEL_STEP = 10;\n const LINE_HEIGHT = 40;\n const PAGE_HEIGHT = 800;\n let sX = 0;\n let sY = 0; // spinX, spinY\n let pX = 0;\n let pY = 0; // pixelX, pixelY\n\n // Legacy\n if ('detail' in e) {\n sY = e.detail;\n }\n if ('wheelDelta' in e) {\n sY = -e.wheelDelta / 120;\n }\n if ('wheelDeltaY' in e) {\n sY = -e.wheelDeltaY / 120;\n }\n if ('wheelDeltaX' in e) {\n sX = -e.wheelDeltaX / 120;\n }\n\n // side scrolling on FF with DOMMouseScroll\n if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n sX = sY;\n sY = 0;\n }\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n if ('deltaY' in e) {\n pY = e.deltaY;\n }\n if ('deltaX' in e) {\n pX = e.deltaX;\n }\n if (e.shiftKey && !pX) {\n // if user scrolls with shift he wants horizontal scroll\n pX = pY;\n pY = 0;\n }\n if ((pX || pY) && e.deltaMode) {\n if (e.deltaMode === 1) {\n // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n } else {\n // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n }\n\n // Fall-back if spin cannot be determined\n if (pX && !sX) {\n sX = pX < 1 ? -1 : 1;\n }\n if (pY && !sY) {\n sY = pY < 1 ? -1 : 1;\n }\n return {\n spinX: sX,\n spinY: sY,\n pixelX: pX,\n pixelY: pY\n };\n }\n function handleMouseEnter() {\n if (!swiper.enabled) return;\n swiper.mouseEntered = true;\n }\n function handleMouseLeave() {\n if (!swiper.enabled) return;\n swiper.mouseEntered = false;\n }\n function animateSlider(newEvent) {\n if (swiper.params.mousewheel.thresholdDelta && newEvent.delta < swiper.params.mousewheel.thresholdDelta) {\n // Prevent if delta of wheel scroll delta is below configured threshold\n return false;\n }\n if (swiper.params.mousewheel.thresholdTime && now() - lastScrollTime < swiper.params.mousewheel.thresholdTime) {\n // Prevent if time between scrolls is below configured threshold\n return false;\n }\n\n // If the movement is NOT big enough and\n // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):\n // Don't go any further (avoid insignificant scroll movement).\n if (newEvent.delta >= 6 && now() - lastScrollTime < 60) {\n // Return false as a default\n return true;\n }\n // If user is scrolling towards the end:\n // If the slider hasn't hit the latest slide or\n // if the slider is a loop and\n // if the slider isn't moving right now:\n // Go to next slide and\n // emit a scroll event.\n // Else (the user is scrolling towards the beginning) and\n // if the slider hasn't hit the first slide or\n // if the slider is a loop and\n // if the slider isn't moving right now:\n // Go to prev slide and\n // emit a scroll event.\n if (newEvent.direction < 0) {\n if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n swiper.slideNext();\n emit('scroll', newEvent.raw);\n }\n } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n swiper.slidePrev();\n emit('scroll', newEvent.raw);\n }\n // If you got here is because an animation has been triggered so store the current time\n lastScrollTime = new window.Date().getTime();\n // Return false as a default\n return false;\n }\n function releaseScroll(newEvent) {\n const params = swiper.params.mousewheel;\n if (newEvent.direction < 0) {\n if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {\n // Return true to animate scroll on edges\n return true;\n }\n } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {\n // Return true to animate scroll on edges\n return true;\n }\n return false;\n }\n function handle(event) {\n let e = event;\n let disableParentSwiper = true;\n if (!swiper.enabled) return;\n\n // Ignore event if the target or its parents have the swiper-no-mousewheel class\n if (event.target.closest(`.${swiper.params.mousewheel.noMousewheelClass}`)) return;\n const params = swiper.params.mousewheel;\n if (swiper.params.cssMode) {\n e.preventDefault();\n }\n let targetEl = swiper.el;\n if (swiper.params.mousewheel.eventsTarget !== 'container') {\n targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget);\n }\n const targetElContainsTarget = targetEl && targetEl.contains(e.target);\n if (!swiper.mouseEntered && !targetElContainsTarget && !params.releaseOnEdges) return true;\n if (e.originalEvent) e = e.originalEvent; // jquery fix\n let delta = 0;\n const rtlFactor = swiper.rtlTranslate ? -1 : 1;\n const data = normalize(e);\n if (params.forceToAxis) {\n if (swiper.isHorizontal()) {\n if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true;\n } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true;\n } else {\n delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n }\n if (delta === 0) return true;\n if (params.invert) delta = -delta;\n\n // Get the scroll positions\n let positions = swiper.getTranslate() + delta * params.sensitivity;\n if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();\n if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate();\n\n // When loop is true:\n // the disableParentSwiper will be true.\n // When loop is false:\n // if the scroll positions is not on edge,\n // then the disableParentSwiper will be true.\n // if the scroll on edge positions,\n // then the disableParentSwiper will be false.\n disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());\n if (disableParentSwiper && swiper.params.nested) e.stopPropagation();\n if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {\n // Register the new event in a variable which stores the relevant data\n const newEvent = {\n time: now(),\n delta: Math.abs(delta),\n direction: Math.sign(delta),\n raw: event\n };\n\n // Keep the most recent events\n if (recentWheelEvents.length >= 2) {\n recentWheelEvents.shift(); // only store the last N events\n }\n\n const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;\n recentWheelEvents.push(newEvent);\n\n // If there is at least one previous recorded event:\n // If direction has changed or\n // if the scroll is quicker than the previous one:\n // Animate the slider.\n // Else (this is the first time the wheel is moved):\n // Animate the slider.\n if (prevEvent) {\n if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) {\n animateSlider(newEvent);\n }\n } else {\n animateSlider(newEvent);\n }\n\n // If it's time to release the scroll:\n // Return now so you don't hit the preventDefault.\n if (releaseScroll(newEvent)) {\n return true;\n }\n } else {\n // Freemode or scrollContainer:\n\n // If we recently snapped after a momentum scroll, then ignore wheel events\n // to give time for the deceleration to finish. Stop ignoring after 500 msecs\n // or if it's a new scroll (larger delta or inverse sign as last event before\n // an end-of-momentum snap).\n const newEvent = {\n time: now(),\n delta: Math.abs(delta),\n direction: Math.sign(delta)\n };\n const ignoreWheelEvents = lastEventBeforeSnap && newEvent.time < lastEventBeforeSnap.time + 500 && newEvent.delta <= lastEventBeforeSnap.delta && newEvent.direction === lastEventBeforeSnap.direction;\n if (!ignoreWheelEvents) {\n lastEventBeforeSnap = undefined;\n let position = swiper.getTranslate() + delta * params.sensitivity;\n const wasBeginning = swiper.isBeginning;\n const wasEnd = swiper.isEnd;\n if (position >= swiper.minTranslate()) position = swiper.minTranslate();\n if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();\n swiper.setTransition(0);\n swiper.setTranslate(position);\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) {\n swiper.updateSlidesClasses();\n }\n if (swiper.params.loop) {\n swiper.loopFix({\n direction: newEvent.direction < 0 ? 'next' : 'prev',\n byMousewheel: true\n });\n }\n if (swiper.params.freeMode.sticky) {\n // When wheel scrolling starts with sticky (aka snap) enabled, then detect\n // the end of a momentum scroll by storing recent (N=15?) wheel events.\n // 1. do all N events have decreasing or same (absolute value) delta?\n // 2. did all N events arrive in the last M (M=500?) msecs?\n // 3. does the earliest event have an (absolute value) delta that's\n // at least P (P=1?) larger than the most recent event's delta?\n // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?\n // If 1-4 are \"yes\" then we're near the end of a momentum scroll deceleration.\n // Snap immediately and ignore remaining wheel events in this scroll.\n // See comment above for \"remaining wheel events in this scroll\" determination.\n // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.\n clearTimeout(timeout);\n timeout = undefined;\n if (recentWheelEvents.length >= 15) {\n recentWheelEvents.shift(); // only store the last N events\n }\n\n const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;\n const firstEvent = recentWheelEvents[0];\n recentWheelEvents.push(newEvent);\n if (prevEvent && (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)) {\n // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.\n recentWheelEvents.splice(0);\n } else if (recentWheelEvents.length >= 15 && newEvent.time - firstEvent.time < 500 && firstEvent.delta - newEvent.delta >= 1 && newEvent.delta <= 6) {\n // We're at the end of the deceleration of a momentum scroll, so there's no need\n // to wait for more events. Snap ASAP on the next tick.\n // Also, because there's some remaining momentum we'll bias the snap in the\n // direction of the ongoing scroll because it's better UX for the scroll to snap\n // in the same direction as the scroll instead of reversing to snap. Therefore,\n // if it's already scrolled more than 20% in the current direction, keep going.\n const snapToThreshold = delta > 0 ? 0.8 : 0.2;\n lastEventBeforeSnap = newEvent;\n recentWheelEvents.splice(0);\n timeout = nextTick(() => {\n swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n }, 0); // no delay; move on next tick\n }\n\n if (!timeout) {\n // if we get here, then we haven't detected the end of a momentum scroll, so\n // we'll consider a scroll \"complete\" when there haven't been any wheel events\n // for 500ms.\n timeout = nextTick(() => {\n const snapToThreshold = 0.5;\n lastEventBeforeSnap = newEvent;\n recentWheelEvents.splice(0);\n swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n }, 500);\n }\n }\n\n // Emit event\n if (!ignoreWheelEvents) emit('scroll', e);\n\n // Stop autoplay\n if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) swiper.autoplay.stop();\n // Return page scroll on edge positions\n if (params.releaseOnEdges && (position === swiper.minTranslate() || position === swiper.maxTranslate())) {\n return true;\n }\n }\n }\n if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n return false;\n }\n function events(method) {\n let targetEl = swiper.el;\n if (swiper.params.mousewheel.eventsTarget !== 'container') {\n targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget);\n }\n targetEl[method]('mouseenter', handleMouseEnter);\n targetEl[method]('mouseleave', handleMouseLeave);\n targetEl[method]('wheel', handle);\n }\n function enable() {\n if (swiper.params.cssMode) {\n swiper.wrapperEl.removeEventListener('wheel', handle);\n return true;\n }\n if (swiper.mousewheel.enabled) return false;\n events('addEventListener');\n swiper.mousewheel.enabled = true;\n return true;\n }\n function disable() {\n if (swiper.params.cssMode) {\n swiper.wrapperEl.addEventListener(event, handle);\n return true;\n }\n if (!swiper.mousewheel.enabled) return false;\n events('removeEventListener');\n swiper.mousewheel.enabled = false;\n return true;\n }\n on('init', () => {\n if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {\n disable();\n }\n if (swiper.params.mousewheel.enabled) enable();\n });\n on('destroy', () => {\n if (swiper.params.cssMode) {\n enable();\n }\n if (swiper.mousewheel.enabled) disable();\n });\n Object.assign(swiper.mousewheel, {\n enable,\n disable\n });\n}\n\nexport { Mousewheel as default };\n","import { c as createElementIfNotDefined } from '../shared/create-element-if-not-defined.mjs';\n\nfunction Navigation(_ref) {\n let {\n swiper,\n extendParams,\n on,\n emit\n } = _ref;\n extendParams({\n navigation: {\n nextEl: null,\n prevEl: null,\n hideOnClick: false,\n disabledClass: 'swiper-button-disabled',\n hiddenClass: 'swiper-button-hidden',\n lockClass: 'swiper-button-lock',\n navigationDisabledClass: 'swiper-navigation-disabled'\n }\n });\n swiper.navigation = {\n nextEl: null,\n prevEl: null\n };\n const makeElementsArray = el => (Array.isArray(el) ? el : [el]).filter(e => !!e);\n function getEl(el) {\n let res;\n if (el && typeof el === 'string' && swiper.isElement) {\n res = swiper.el.querySelector(el);\n if (res) return res;\n }\n if (el) {\n if (typeof el === 'string') res = [...document.querySelectorAll(el)];\n if (swiper.params.uniqueNavElements && typeof el === 'string' && res.length > 1 && swiper.el.querySelectorAll(el).length === 1) {\n res = swiper.el.querySelector(el);\n }\n }\n if (el && !res) return el;\n // if (Array.isArray(res) && res.length === 1) res = res[0];\n return res;\n }\n function toggleEl(el, disabled) {\n const params = swiper.params.navigation;\n el = makeElementsArray(el);\n el.forEach(subEl => {\n if (subEl) {\n subEl.classList[disabled ? 'add' : 'remove'](...params.disabledClass.split(' '));\n if (subEl.tagName === 'BUTTON') subEl.disabled = disabled;\n if (swiper.params.watchOverflow && swiper.enabled) {\n subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);\n }\n }\n });\n }\n function update() {\n // Update Navigation Buttons\n const {\n nextEl,\n prevEl\n } = swiper.navigation;\n if (swiper.params.loop) {\n toggleEl(prevEl, false);\n toggleEl(nextEl, false);\n return;\n }\n toggleEl(prevEl, swiper.isBeginning && !swiper.params.rewind);\n toggleEl(nextEl, swiper.isEnd && !swiper.params.rewind);\n }\n function onPrevClick(e) {\n e.preventDefault();\n if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) return;\n swiper.slidePrev();\n emit('navigationPrev');\n }\n function onNextClick(e) {\n e.preventDefault();\n if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) return;\n swiper.slideNext();\n emit('navigationNext');\n }\n function init() {\n const params = swiper.params.navigation;\n swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, {\n nextEl: 'swiper-button-next',\n prevEl: 'swiper-button-prev'\n });\n if (!(params.nextEl || params.prevEl)) return;\n let nextEl = getEl(params.nextEl);\n let prevEl = getEl(params.prevEl);\n Object.assign(swiper.navigation, {\n nextEl,\n prevEl\n });\n nextEl = makeElementsArray(nextEl);\n prevEl = makeElementsArray(prevEl);\n const initButton = (el, dir) => {\n if (el) {\n el.addEventListener('click', dir === 'next' ? onNextClick : onPrevClick);\n }\n if (!swiper.enabled && el) {\n el.classList.add(...params.lockClass.split(' '));\n }\n };\n nextEl.forEach(el => initButton(el, 'next'));\n prevEl.forEach(el => initButton(el, 'prev'));\n }\n function destroy() {\n let {\n nextEl,\n prevEl\n } = swiper.navigation;\n nextEl = makeElementsArray(nextEl);\n prevEl = makeElementsArray(prevEl);\n const destroyButton = (el, dir) => {\n el.removeEventListener('click', dir === 'next' ? onNextClick : onPrevClick);\n el.classList.remove(...swiper.params.navigation.disabledClass.split(' '));\n };\n nextEl.forEach(el => destroyButton(el, 'next'));\n prevEl.forEach(el => destroyButton(el, 'prev'));\n }\n on('init', () => {\n if (swiper.params.navigation.enabled === false) {\n // eslint-disable-next-line\n disable();\n } else {\n init();\n update();\n }\n });\n on('toEdge fromEdge lock unlock', () => {\n update();\n });\n on('destroy', () => {\n destroy();\n });\n on('enable disable', () => {\n let {\n nextEl,\n prevEl\n } = swiper.navigation;\n nextEl = makeElementsArray(nextEl);\n prevEl = makeElementsArray(prevEl);\n if (swiper.enabled) {\n update();\n return;\n }\n [...nextEl, ...prevEl].filter(el => !!el).forEach(el => el.classList.add(swiper.params.navigation.lockClass));\n });\n on('click', (_s, e) => {\n let {\n nextEl,\n prevEl\n } = swiper.navigation;\n nextEl = makeElementsArray(nextEl);\n prevEl = makeElementsArray(prevEl);\n const targetEl = e.target;\n if (swiper.params.navigation.hideOnClick && !prevEl.includes(targetEl) && !nextEl.includes(targetEl)) {\n if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return;\n let isHidden;\n if (nextEl.length) {\n isHidden = nextEl[0].classList.contains(swiper.params.navigation.hiddenClass);\n } else if (prevEl.length) {\n isHidden = prevEl[0].classList.contains(swiper.params.navigation.hiddenClass);\n }\n if (isHidden === true) {\n emit('navigationShow');\n } else {\n emit('navigationHide');\n }\n [...nextEl, ...prevEl].filter(el => !!el).forEach(el => el.classList.toggle(swiper.params.navigation.hiddenClass));\n }\n });\n const enable = () => {\n swiper.el.classList.remove(...swiper.params.navigation.navigationDisabledClass.split(' '));\n init();\n update();\n };\n const disable = () => {\n swiper.el.classList.add(...swiper.params.navigation.navigationDisabledClass.split(' '));\n destroy();\n };\n Object.assign(swiper.navigation, {\n enable,\n disable,\n update,\n init,\n destroy\n });\n}\n\nexport { Navigation as default };\n","import { c as classesToSelector } from '../shared/classes-to-selector.mjs';\nimport { c as createElementIfNotDefined } from '../shared/create-element-if-not-defined.mjs';\nimport { f as elementOuterSize, g as elementIndex, a as elementParents } from '../shared/utils.mjs';\n\nfunction Pagination(_ref) {\n let {\n swiper,\n extendParams,\n on,\n emit\n } = _ref;\n const pfx = 'swiper-pagination';\n extendParams({\n pagination: {\n el: null,\n bulletElement: 'span',\n clickable: false,\n hideOnClick: false,\n renderBullet: null,\n renderProgressbar: null,\n renderFraction: null,\n renderCustom: null,\n progressbarOpposite: false,\n type: 'bullets',\n // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n dynamicBullets: false,\n dynamicMainBullets: 1,\n formatFractionCurrent: number => number,\n formatFractionTotal: number => number,\n bulletClass: `${pfx}-bullet`,\n bulletActiveClass: `${pfx}-bullet-active`,\n modifierClass: `${pfx}-`,\n currentClass: `${pfx}-current`,\n totalClass: `${pfx}-total`,\n hiddenClass: `${pfx}-hidden`,\n progressbarFillClass: `${pfx}-progressbar-fill`,\n progressbarOppositeClass: `${pfx}-progressbar-opposite`,\n clickableClass: `${pfx}-clickable`,\n lockClass: `${pfx}-lock`,\n horizontalClass: `${pfx}-horizontal`,\n verticalClass: `${pfx}-vertical`,\n paginationDisabledClass: `${pfx}-disabled`\n }\n });\n swiper.pagination = {\n el: null,\n bullets: []\n };\n let bulletSize;\n let dynamicBulletIndex = 0;\n const makeElementsArray = el => (Array.isArray(el) ? el : [el]).filter(e => !!e);\n function isPaginationDisabled() {\n return !swiper.params.pagination.el || !swiper.pagination.el || Array.isArray(swiper.pagination.el) && swiper.pagination.el.length === 0;\n }\n function setSideBullets(bulletEl, position) {\n const {\n bulletActiveClass\n } = swiper.params.pagination;\n if (!bulletEl) return;\n bulletEl = bulletEl[`${position === 'prev' ? 'previous' : 'next'}ElementSibling`];\n if (bulletEl) {\n bulletEl.classList.add(`${bulletActiveClass}-${position}`);\n bulletEl = bulletEl[`${position === 'prev' ? 'previous' : 'next'}ElementSibling`];\n if (bulletEl) {\n bulletEl.classList.add(`${bulletActiveClass}-${position}-${position}`);\n }\n }\n }\n function onBulletClick(e) {\n const bulletEl = e.target.closest(classesToSelector(swiper.params.pagination.bulletClass));\n if (!bulletEl) {\n return;\n }\n e.preventDefault();\n const index = elementIndex(bulletEl) * swiper.params.slidesPerGroup;\n if (swiper.params.loop) {\n if (swiper.realIndex === index) return;\n const realIndex = swiper.realIndex;\n const newSlideIndex = swiper.getSlideIndexByData(index);\n const currentSlideIndex = swiper.getSlideIndexByData(swiper.realIndex);\n const loopFix = dir => {\n const indexBeforeLoopFix = swiper.activeIndex;\n swiper.loopFix({\n direction: dir,\n activeSlideIndex: newSlideIndex,\n slideTo: false\n });\n const indexAfterFix = swiper.activeIndex;\n if (indexBeforeLoopFix === indexAfterFix) {\n swiper.slideToLoop(realIndex, 0, false, true);\n }\n };\n if (newSlideIndex > swiper.slides.length - swiper.loopedSlides) {\n loopFix(newSlideIndex > currentSlideIndex ? 'next' : 'prev');\n } else if (swiper.params.centeredSlides) {\n const slidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(swiper.params.slidesPerView, 10));\n if (newSlideIndex < Math.floor(slidesPerView / 2)) {\n loopFix('prev');\n }\n }\n swiper.slideToLoop(index);\n } else {\n swiper.slideTo(index);\n }\n }\n function update() {\n // Render || Update Pagination bullets/items\n const rtl = swiper.rtl;\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n let el = swiper.pagination.el;\n el = makeElementsArray(el);\n // Current/Total\n let current;\n let previousIndex;\n const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n const total = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n if (swiper.params.loop) {\n previousIndex = swiper.previousRealIndex || 0;\n current = swiper.params.slidesPerGroup > 1 ? Math.floor(swiper.realIndex / swiper.params.slidesPerGroup) : swiper.realIndex;\n } else if (typeof swiper.snapIndex !== 'undefined') {\n current = swiper.snapIndex;\n previousIndex = swiper.previousSnapIndex;\n } else {\n previousIndex = swiper.previousIndex || 0;\n current = swiper.activeIndex || 0;\n }\n // Types\n if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {\n const bullets = swiper.pagination.bullets;\n let firstIndex;\n let lastIndex;\n let midIndex;\n if (params.dynamicBullets) {\n bulletSize = elementOuterSize(bullets[0], swiper.isHorizontal() ? 'width' : 'height', true);\n el.forEach(subEl => {\n subEl.style[swiper.isHorizontal() ? 'width' : 'height'] = `${bulletSize * (params.dynamicMainBullets + 4)}px`;\n });\n if (params.dynamicMainBullets > 1 && previousIndex !== undefined) {\n dynamicBulletIndex += current - (previousIndex || 0);\n if (dynamicBulletIndex > params.dynamicMainBullets - 1) {\n dynamicBulletIndex = params.dynamicMainBullets - 1;\n } else if (dynamicBulletIndex < 0) {\n dynamicBulletIndex = 0;\n }\n }\n firstIndex = Math.max(current - dynamicBulletIndex, 0);\n lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n midIndex = (lastIndex + firstIndex) / 2;\n }\n bullets.forEach(bulletEl => {\n const classesToRemove = [...['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(suffix => `${params.bulletActiveClass}${suffix}`)].map(s => typeof s === 'string' && s.includes(' ') ? s.split(' ') : s).flat();\n bulletEl.classList.remove(...classesToRemove);\n });\n if (el.length > 1) {\n bullets.forEach(bullet => {\n const bulletIndex = elementIndex(bullet);\n if (bulletIndex === current) {\n bullet.classList.add(...params.bulletActiveClass.split(' '));\n } else if (swiper.isElement) {\n bullet.setAttribute('part', 'bullet');\n }\n if (params.dynamicBullets) {\n if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n bullet.classList.add(...`${params.bulletActiveClass}-main`.split(' '));\n }\n if (bulletIndex === firstIndex) {\n setSideBullets(bullet, 'prev');\n }\n if (bulletIndex === lastIndex) {\n setSideBullets(bullet, 'next');\n }\n }\n });\n } else {\n const bullet = bullets[current];\n if (bullet) {\n bullet.classList.add(...params.bulletActiveClass.split(' '));\n }\n if (swiper.isElement) {\n bullets.forEach((bulletEl, bulletIndex) => {\n bulletEl.setAttribute('part', bulletIndex === current ? 'bullet-active' : 'bullet');\n });\n }\n if (params.dynamicBullets) {\n const firstDisplayedBullet = bullets[firstIndex];\n const lastDisplayedBullet = bullets[lastIndex];\n for (let i = firstIndex; i <= lastIndex; i += 1) {\n if (bullets[i]) {\n bullets[i].classList.add(...`${params.bulletActiveClass}-main`.split(' '));\n }\n }\n setSideBullets(firstDisplayedBullet, 'prev');\n setSideBullets(lastDisplayedBullet, 'next');\n }\n }\n if (params.dynamicBullets) {\n const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;\n const offsetProp = rtl ? 'right' : 'left';\n bullets.forEach(bullet => {\n bullet.style[swiper.isHorizontal() ? offsetProp : 'top'] = `${bulletsOffset}px`;\n });\n }\n }\n el.forEach((subEl, subElIndex) => {\n if (params.type === 'fraction') {\n subEl.querySelectorAll(classesToSelector(params.currentClass)).forEach(fractionEl => {\n fractionEl.textContent = params.formatFractionCurrent(current + 1);\n });\n subEl.querySelectorAll(classesToSelector(params.totalClass)).forEach(totalEl => {\n totalEl.textContent = params.formatFractionTotal(total);\n });\n }\n if (params.type === 'progressbar') {\n let progressbarDirection;\n if (params.progressbarOpposite) {\n progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n } else {\n progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n }\n const scale = (current + 1) / total;\n let scaleX = 1;\n let scaleY = 1;\n if (progressbarDirection === 'horizontal') {\n scaleX = scale;\n } else {\n scaleY = scale;\n }\n subEl.querySelectorAll(classesToSelector(params.progressbarFillClass)).forEach(progressEl => {\n progressEl.style.transform = `translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`;\n progressEl.style.transitionDuration = `${swiper.params.speed}ms`;\n });\n }\n if (params.type === 'custom' && params.renderCustom) {\n subEl.innerHTML = params.renderCustom(swiper, current + 1, total);\n if (subElIndex === 0) emit('paginationRender', subEl);\n } else {\n if (subElIndex === 0) emit('paginationRender', subEl);\n emit('paginationUpdate', subEl);\n }\n if (swiper.params.watchOverflow && swiper.enabled) {\n subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);\n }\n });\n }\n function render() {\n // Render Container\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n let el = swiper.pagination.el;\n el = makeElementsArray(el);\n let paginationHTML = '';\n if (params.type === 'bullets') {\n let numberOfBullets = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n if (swiper.params.freeMode && swiper.params.freeMode.enabled && numberOfBullets > slidesLength) {\n numberOfBullets = slidesLength;\n }\n for (let i = 0; i < numberOfBullets; i += 1) {\n if (params.renderBullet) {\n paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n } else {\n // prettier-ignore\n paginationHTML += `<${params.bulletElement} ${swiper.isElement ? 'part=\"bullet\"' : ''} class=\"${params.bulletClass}\">${params.bulletElement}>`;\n }\n }\n }\n if (params.type === 'fraction') {\n if (params.renderFraction) {\n paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n } else {\n paginationHTML = `` + ' / ' + ``;\n }\n }\n if (params.type === 'progressbar') {\n if (params.renderProgressbar) {\n paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n } else {\n paginationHTML = ``;\n }\n }\n swiper.pagination.bullets = [];\n el.forEach(subEl => {\n if (params.type !== 'custom') {\n subEl.innerHTML = paginationHTML || '';\n }\n if (params.type === 'bullets') {\n swiper.pagination.bullets.push(...subEl.querySelectorAll(classesToSelector(params.bulletClass)));\n }\n });\n if (params.type !== 'custom') {\n emit('paginationRender', el[0]);\n }\n }\n function init() {\n swiper.params.pagination = createElementIfNotDefined(swiper, swiper.originalParams.pagination, swiper.params.pagination, {\n el: 'swiper-pagination'\n });\n const params = swiper.params.pagination;\n if (!params.el) return;\n let el;\n if (typeof params.el === 'string' && swiper.isElement) {\n el = swiper.el.querySelector(params.el);\n }\n if (!el && typeof params.el === 'string') {\n el = [...document.querySelectorAll(params.el)];\n }\n if (!el) {\n el = params.el;\n }\n if (!el || el.length === 0) return;\n if (swiper.params.uniqueNavElements && typeof params.el === 'string' && Array.isArray(el) && el.length > 1) {\n el = [...swiper.el.querySelectorAll(params.el)];\n // check if it belongs to another nested Swiper\n if (el.length > 1) {\n el = el.filter(subEl => {\n if (elementParents(subEl, '.swiper')[0] !== swiper.el) return false;\n return true;\n })[0];\n }\n }\n if (Array.isArray(el) && el.length === 1) el = el[0];\n Object.assign(swiper.pagination, {\n el\n });\n el = makeElementsArray(el);\n el.forEach(subEl => {\n if (params.type === 'bullets' && params.clickable) {\n subEl.classList.add(...(params.clickableClass || '').split(' '));\n }\n subEl.classList.add(params.modifierClass + params.type);\n subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n if (params.type === 'bullets' && params.dynamicBullets) {\n subEl.classList.add(`${params.modifierClass}${params.type}-dynamic`);\n dynamicBulletIndex = 0;\n if (params.dynamicMainBullets < 1) {\n params.dynamicMainBullets = 1;\n }\n }\n if (params.type === 'progressbar' && params.progressbarOpposite) {\n subEl.classList.add(params.progressbarOppositeClass);\n }\n if (params.clickable) {\n subEl.addEventListener('click', onBulletClick);\n }\n if (!swiper.enabled) {\n subEl.classList.add(params.lockClass);\n }\n });\n }\n function destroy() {\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n let el = swiper.pagination.el;\n if (el) {\n el = makeElementsArray(el);\n el.forEach(subEl => {\n subEl.classList.remove(params.hiddenClass);\n subEl.classList.remove(params.modifierClass + params.type);\n subEl.classList.remove(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n if (params.clickable) {\n subEl.classList.remove(...(params.clickableClass || '').split(' '));\n subEl.removeEventListener('click', onBulletClick);\n }\n });\n }\n if (swiper.pagination.bullets) swiper.pagination.bullets.forEach(subEl => subEl.classList.remove(...params.bulletActiveClass.split(' ')));\n }\n on('changeDirection', () => {\n if (!swiper.pagination || !swiper.pagination.el) return;\n const params = swiper.params.pagination;\n let {\n el\n } = swiper.pagination;\n el = makeElementsArray(el);\n el.forEach(subEl => {\n subEl.classList.remove(params.horizontalClass, params.verticalClass);\n subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n });\n });\n on('init', () => {\n if (swiper.params.pagination.enabled === false) {\n // eslint-disable-next-line\n disable();\n } else {\n init();\n render();\n update();\n }\n });\n on('activeIndexChange', () => {\n if (typeof swiper.snapIndex === 'undefined') {\n update();\n }\n });\n on('snapIndexChange', () => {\n update();\n });\n on('snapGridLengthChange', () => {\n render();\n update();\n });\n on('destroy', () => {\n destroy();\n });\n on('enable disable', () => {\n let {\n el\n } = swiper.pagination;\n if (el) {\n el = makeElementsArray(el);\n el.forEach(subEl => subEl.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.pagination.lockClass));\n }\n });\n on('lock unlock', () => {\n update();\n });\n on('click', (_s, e) => {\n const targetEl = e.target;\n const el = makeElementsArray(swiper.pagination.el);\n if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && el && el.length > 0 && !targetEl.classList.contains(swiper.params.pagination.bulletClass)) {\n if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return;\n const isHidden = el[0].classList.contains(swiper.params.pagination.hiddenClass);\n if (isHidden === true) {\n emit('paginationShow');\n } else {\n emit('paginationHide');\n }\n el.forEach(subEl => subEl.classList.toggle(swiper.params.pagination.hiddenClass));\n }\n });\n const enable = () => {\n swiper.el.classList.remove(swiper.params.pagination.paginationDisabledClass);\n let {\n el\n } = swiper.pagination;\n if (el) {\n el = makeElementsArray(el);\n el.forEach(subEl => subEl.classList.remove(swiper.params.pagination.paginationDisabledClass));\n }\n init();\n render();\n update();\n };\n const disable = () => {\n swiper.el.classList.add(swiper.params.pagination.paginationDisabledClass);\n let {\n el\n } = swiper.pagination;\n if (el) {\n el = makeElementsArray(el);\n el.forEach(subEl => subEl.classList.add(swiper.params.pagination.paginationDisabledClass));\n }\n destroy();\n };\n Object.assign(swiper.pagination, {\n enable,\n disable,\n render,\n update,\n init,\n destroy\n });\n}\n\nexport { Pagination as default };\n","import { g as getDocument } from '../shared/ssr-window.esm.mjs';\nimport { c as createElement, n as nextTick, b as elementOffset } from '../shared/utils.mjs';\nimport { c as createElementIfNotDefined } from '../shared/create-element-if-not-defined.mjs';\n\nfunction Scrollbar(_ref) {\n let {\n swiper,\n extendParams,\n on,\n emit\n } = _ref;\n const document = getDocument();\n let isTouched = false;\n let timeout = null;\n let dragTimeout = null;\n let dragStartPos;\n let dragSize;\n let trackSize;\n let divider;\n extendParams({\n scrollbar: {\n el: null,\n dragSize: 'auto',\n hide: false,\n draggable: false,\n snapOnRelease: true,\n lockClass: 'swiper-scrollbar-lock',\n dragClass: 'swiper-scrollbar-drag',\n scrollbarDisabledClass: 'swiper-scrollbar-disabled',\n horizontalClass: `swiper-scrollbar-horizontal`,\n verticalClass: `swiper-scrollbar-vertical`\n }\n });\n swiper.scrollbar = {\n el: null,\n dragEl: null\n };\n function setTranslate() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n const {\n scrollbar,\n rtlTranslate: rtl\n } = swiper;\n const {\n dragEl,\n el\n } = scrollbar;\n const params = swiper.params.scrollbar;\n const progress = swiper.params.loop ? swiper.progressLoop : swiper.progress;\n let newSize = dragSize;\n let newPos = (trackSize - dragSize) * progress;\n if (rtl) {\n newPos = -newPos;\n if (newPos > 0) {\n newSize = dragSize - newPos;\n newPos = 0;\n } else if (-newPos + dragSize > trackSize) {\n newSize = trackSize + newPos;\n }\n } else if (newPos < 0) {\n newSize = dragSize + newPos;\n newPos = 0;\n } else if (newPos + dragSize > trackSize) {\n newSize = trackSize - newPos;\n }\n if (swiper.isHorizontal()) {\n dragEl.style.transform = `translate3d(${newPos}px, 0, 0)`;\n dragEl.style.width = `${newSize}px`;\n } else {\n dragEl.style.transform = `translate3d(0px, ${newPos}px, 0)`;\n dragEl.style.height = `${newSize}px`;\n }\n if (params.hide) {\n clearTimeout(timeout);\n el.style.opacity = 1;\n timeout = setTimeout(() => {\n el.style.opacity = 0;\n el.style.transitionDuration = '400ms';\n }, 1000);\n }\n }\n function setTransition(duration) {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n swiper.scrollbar.dragEl.style.transitionDuration = `${duration}ms`;\n }\n function updateSize() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n const {\n scrollbar\n } = swiper;\n const {\n dragEl,\n el\n } = scrollbar;\n dragEl.style.width = '';\n dragEl.style.height = '';\n trackSize = swiper.isHorizontal() ? el.offsetWidth : el.offsetHeight;\n divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));\n if (swiper.params.scrollbar.dragSize === 'auto') {\n dragSize = trackSize * divider;\n } else {\n dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n }\n if (swiper.isHorizontal()) {\n dragEl.style.width = `${dragSize}px`;\n } else {\n dragEl.style.height = `${dragSize}px`;\n }\n if (divider >= 1) {\n el.style.display = 'none';\n } else {\n el.style.display = '';\n }\n if (swiper.params.scrollbar.hide) {\n el.style.opacity = 0;\n }\n if (swiper.params.watchOverflow && swiper.enabled) {\n scrollbar.el.classList[swiper.isLocked ? 'add' : 'remove'](swiper.params.scrollbar.lockClass);\n }\n }\n function getPointerPosition(e) {\n return swiper.isHorizontal() ? e.clientX : e.clientY;\n }\n function setDragPosition(e) {\n const {\n scrollbar,\n rtlTranslate: rtl\n } = swiper;\n const {\n el\n } = scrollbar;\n let positionRatio;\n positionRatio = (getPointerPosition(e) - elementOffset(el)[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);\n positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n if (rtl) {\n positionRatio = 1 - positionRatio;\n }\n const position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;\n swiper.updateProgress(position);\n swiper.setTranslate(position);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n function onDragStart(e) {\n const params = swiper.params.scrollbar;\n const {\n scrollbar,\n wrapperEl\n } = swiper;\n const {\n el,\n dragEl\n } = scrollbar;\n isTouched = true;\n dragStartPos = e.target === dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;\n e.preventDefault();\n e.stopPropagation();\n wrapperEl.style.transitionDuration = '100ms';\n dragEl.style.transitionDuration = '100ms';\n setDragPosition(e);\n clearTimeout(dragTimeout);\n el.style.transitionDuration = '0ms';\n if (params.hide) {\n el.style.opacity = 1;\n }\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style['scroll-snap-type'] = 'none';\n }\n emit('scrollbarDragStart', e);\n }\n function onDragMove(e) {\n const {\n scrollbar,\n wrapperEl\n } = swiper;\n const {\n el,\n dragEl\n } = scrollbar;\n if (!isTouched) return;\n if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n setDragPosition(e);\n wrapperEl.style.transitionDuration = '0ms';\n el.style.transitionDuration = '0ms';\n dragEl.style.transitionDuration = '0ms';\n emit('scrollbarDragMove', e);\n }\n function onDragEnd(e) {\n const params = swiper.params.scrollbar;\n const {\n scrollbar,\n wrapperEl\n } = swiper;\n const {\n el\n } = scrollbar;\n if (!isTouched) return;\n isTouched = false;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style['scroll-snap-type'] = '';\n wrapperEl.style.transitionDuration = '';\n }\n if (params.hide) {\n clearTimeout(dragTimeout);\n dragTimeout = nextTick(() => {\n el.style.opacity = 0;\n el.style.transitionDuration = '400ms';\n }, 1000);\n }\n emit('scrollbarDragEnd', e);\n if (params.snapOnRelease) {\n swiper.slideToClosest();\n }\n }\n function events(method) {\n const {\n scrollbar,\n params\n } = swiper;\n const el = scrollbar.el;\n if (!el) return;\n const target = el;\n const activeListener = params.passiveListeners ? {\n passive: false,\n capture: false\n } : false;\n const passiveListener = params.passiveListeners ? {\n passive: true,\n capture: false\n } : false;\n if (!target) return;\n const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n target[eventMethod]('pointerdown', onDragStart, activeListener);\n document[eventMethod]('pointermove', onDragMove, activeListener);\n document[eventMethod]('pointerup', onDragEnd, passiveListener);\n }\n function enableDraggable() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n events('on');\n }\n function disableDraggable() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n events('off');\n }\n function init() {\n const {\n scrollbar,\n el: swiperEl\n } = swiper;\n swiper.params.scrollbar = createElementIfNotDefined(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, {\n el: 'swiper-scrollbar'\n });\n const params = swiper.params.scrollbar;\n if (!params.el) return;\n let el;\n if (typeof params.el === 'string' && swiper.isElement) {\n el = swiper.el.querySelector(params.el);\n }\n if (!el && typeof params.el === 'string') {\n el = document.querySelectorAll(params.el);\n } else if (!el) {\n el = params.el;\n }\n if (swiper.params.uniqueNavElements && typeof params.el === 'string' && el.length > 1 && swiperEl.querySelectorAll(params.el).length === 1) {\n el = swiperEl.querySelector(params.el);\n }\n if (el.length > 0) el = el[0];\n el.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n let dragEl;\n if (el) {\n dragEl = el.querySelector(`.${swiper.params.scrollbar.dragClass}`);\n if (!dragEl) {\n dragEl = createElement('div', swiper.params.scrollbar.dragClass);\n el.append(dragEl);\n }\n }\n Object.assign(scrollbar, {\n el,\n dragEl\n });\n if (params.draggable) {\n enableDraggable();\n }\n if (el) {\n el.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.scrollbar.lockClass);\n }\n }\n function destroy() {\n const params = swiper.params.scrollbar;\n const el = swiper.scrollbar.el;\n if (el) {\n el.classList.remove(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n }\n disableDraggable();\n }\n on('init', () => {\n if (swiper.params.scrollbar.enabled === false) {\n // eslint-disable-next-line\n disable();\n } else {\n init();\n updateSize();\n setTranslate();\n }\n });\n on('update resize observerUpdate lock unlock', () => {\n updateSize();\n });\n on('setTranslate', () => {\n setTranslate();\n });\n on('setTransition', (_s, duration) => {\n setTransition(duration);\n });\n on('enable disable', () => {\n const {\n el\n } = swiper.scrollbar;\n if (el) {\n el.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.scrollbar.lockClass);\n }\n });\n on('destroy', () => {\n destroy();\n });\n const enable = () => {\n swiper.el.classList.remove(swiper.params.scrollbar.scrollbarDisabledClass);\n if (swiper.scrollbar.el) {\n swiper.scrollbar.el.classList.remove(swiper.params.scrollbar.scrollbarDisabledClass);\n }\n init();\n updateSize();\n setTranslate();\n };\n const disable = () => {\n swiper.el.classList.add(swiper.params.scrollbar.scrollbarDisabledClass);\n if (swiper.scrollbar.el) {\n swiper.scrollbar.el.classList.add(swiper.params.scrollbar.scrollbarDisabledClass);\n }\n destroy();\n };\n Object.assign(swiper.scrollbar, {\n enable,\n disable,\n updateSize,\n setTranslate,\n init,\n destroy\n });\n}\n\nexport { Scrollbar as default };\n","import { e as elementChildren } from '../shared/utils.mjs';\n\nfunction Parallax(_ref) {\n let {\n swiper,\n extendParams,\n on\n } = _ref;\n extendParams({\n parallax: {\n enabled: false\n }\n });\n const elementsSelector = '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]';\n const setTransform = (el, progress) => {\n const {\n rtl\n } = swiper;\n const rtlFactor = rtl ? -1 : 1;\n const p = el.getAttribute('data-swiper-parallax') || '0';\n let x = el.getAttribute('data-swiper-parallax-x');\n let y = el.getAttribute('data-swiper-parallax-y');\n const scale = el.getAttribute('data-swiper-parallax-scale');\n const opacity = el.getAttribute('data-swiper-parallax-opacity');\n const rotate = el.getAttribute('data-swiper-parallax-rotate');\n if (x || y) {\n x = x || '0';\n y = y || '0';\n } else if (swiper.isHorizontal()) {\n x = p;\n y = '0';\n } else {\n y = p;\n x = '0';\n }\n if (x.indexOf('%') >= 0) {\n x = `${parseInt(x, 10) * progress * rtlFactor}%`;\n } else {\n x = `${x * progress * rtlFactor}px`;\n }\n if (y.indexOf('%') >= 0) {\n y = `${parseInt(y, 10) * progress}%`;\n } else {\n y = `${y * progress}px`;\n }\n if (typeof opacity !== 'undefined' && opacity !== null) {\n const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));\n el.style.opacity = currentOpacity;\n }\n let transform = `translate3d(${x}, ${y}, 0px)`;\n if (typeof scale !== 'undefined' && scale !== null) {\n const currentScale = scale - (scale - 1) * (1 - Math.abs(progress));\n transform += ` scale(${currentScale})`;\n }\n if (rotate && typeof rotate !== 'undefined' && rotate !== null) {\n const currentRotate = rotate * progress * -1;\n transform += ` rotate(${currentRotate}deg)`;\n }\n el.style.transform = transform;\n };\n const setTranslate = () => {\n const {\n el,\n slides,\n progress,\n snapGrid,\n isElement\n } = swiper;\n const elements = elementChildren(el, elementsSelector);\n if (swiper.isElement) {\n elements.push(...elementChildren(swiper.hostEl, elementsSelector));\n }\n elements.forEach(subEl => {\n setTransform(subEl, progress);\n });\n slides.forEach((slideEl, slideIndex) => {\n let slideProgress = slideEl.progress;\n if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);\n }\n slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n slideEl.querySelectorAll(`${elementsSelector}, [data-swiper-parallax-rotate]`).forEach(subEl => {\n setTransform(subEl, slideProgress);\n });\n });\n };\n const setTransition = function (duration) {\n if (duration === void 0) {\n duration = swiper.params.speed;\n }\n const {\n el,\n hostEl\n } = swiper;\n const elements = [...el.querySelectorAll(elementsSelector)];\n if (swiper.isElement) {\n elements.push(...hostEl.querySelectorAll(elementsSelector));\n }\n elements.forEach(parallaxEl => {\n let parallaxDuration = parseInt(parallaxEl.getAttribute('data-swiper-parallax-duration'), 10) || duration;\n if (duration === 0) parallaxDuration = 0;\n parallaxEl.style.transitionDuration = `${parallaxDuration}ms`;\n });\n };\n on('beforeInit', () => {\n if (!swiper.params.parallax.enabled) return;\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n });\n on('init', () => {\n if (!swiper.params.parallax.enabled) return;\n setTranslate();\n });\n on('setTranslate', () => {\n if (!swiper.params.parallax.enabled) return;\n setTranslate();\n });\n on('setTransition', (_swiper, duration) => {\n if (!swiper.params.parallax.enabled) return;\n setTransition(duration);\n });\n}\n\nexport { Parallax as default };\n","import { a as getWindow } from '../shared/ssr-window.esm.mjs';\nimport { e as elementChildren, a as elementParents, b as elementOffset, h as getTranslate } from '../shared/utils.mjs';\n\nfunction Zoom(_ref) {\n let {\n swiper,\n extendParams,\n on,\n emit\n } = _ref;\n const window = getWindow();\n extendParams({\n zoom: {\n enabled: false,\n maxRatio: 3,\n minRatio: 1,\n toggle: true,\n containerClass: 'swiper-zoom-container',\n zoomedSlideClass: 'swiper-slide-zoomed'\n }\n });\n swiper.zoom = {\n enabled: false\n };\n let currentScale = 1;\n let isScaling = false;\n let fakeGestureTouched;\n let fakeGestureMoved;\n const evCache = [];\n const gesture = {\n originX: 0,\n originY: 0,\n slideEl: undefined,\n slideWidth: undefined,\n slideHeight: undefined,\n imageEl: undefined,\n imageWrapEl: undefined,\n maxRatio: 3\n };\n const image = {\n isTouched: undefined,\n isMoved: undefined,\n currentX: undefined,\n currentY: undefined,\n minX: undefined,\n minY: undefined,\n maxX: undefined,\n maxY: undefined,\n width: undefined,\n height: undefined,\n startX: undefined,\n startY: undefined,\n touchesStart: {},\n touchesCurrent: {}\n };\n const velocity = {\n x: undefined,\n y: undefined,\n prevPositionX: undefined,\n prevPositionY: undefined,\n prevTime: undefined\n };\n let scale = 1;\n Object.defineProperty(swiper.zoom, 'scale', {\n get() {\n return scale;\n },\n set(value) {\n if (scale !== value) {\n const imageEl = gesture.imageEl;\n const slideEl = gesture.slideEl;\n emit('zoomChange', value, imageEl, slideEl);\n }\n scale = value;\n }\n });\n function getDistanceBetweenTouches() {\n if (evCache.length < 2) return 1;\n const x1 = evCache[0].pageX;\n const y1 = evCache[0].pageY;\n const x2 = evCache[1].pageX;\n const y2 = evCache[1].pageY;\n const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n return distance;\n }\n function getScaleOrigin() {\n if (evCache.length < 2) return {\n x: null,\n y: null\n };\n const box = gesture.imageEl.getBoundingClientRect();\n return [(evCache[0].pageX + (evCache[1].pageX - evCache[0].pageX) / 2 - box.x - window.scrollX) / currentScale, (evCache[0].pageY + (evCache[1].pageY - evCache[0].pageY) / 2 - box.y - window.scrollY) / currentScale];\n }\n function getSlideSelector() {\n return swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;\n }\n function eventWithinSlide(e) {\n const slideSelector = getSlideSelector();\n if (e.target.matches(slideSelector)) return true;\n if (swiper.slides.filter(slideEl => slideEl.contains(e.target)).length > 0) return true;\n return false;\n }\n function eventWithinZoomContainer(e) {\n const selector = `.${swiper.params.zoom.containerClass}`;\n if (e.target.matches(selector)) return true;\n if ([...swiper.hostEl.querySelectorAll(selector)].filter(containerEl => containerEl.contains(e.target)).length > 0) return true;\n return false;\n }\n\n // Events\n function onGestureStart(e) {\n if (e.pointerType === 'mouse') {\n evCache.splice(0, evCache.length);\n }\n if (!eventWithinSlide(e)) return;\n const params = swiper.params.zoom;\n fakeGestureTouched = false;\n fakeGestureMoved = false;\n evCache.push(e);\n if (evCache.length < 2) {\n return;\n }\n fakeGestureTouched = true;\n gesture.scaleStart = getDistanceBetweenTouches();\n if (!gesture.slideEl) {\n gesture.slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);\n if (!gesture.slideEl) gesture.slideEl = swiper.slides[swiper.activeIndex];\n let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);\n if (imageEl) {\n imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];\n }\n gesture.imageEl = imageEl;\n if (imageEl) {\n gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];\n } else {\n gesture.imageWrapEl = undefined;\n }\n if (!gesture.imageWrapEl) {\n gesture.imageEl = undefined;\n return;\n }\n gesture.maxRatio = gesture.imageWrapEl.getAttribute('data-swiper-zoom') || params.maxRatio;\n }\n if (gesture.imageEl) {\n const [originX, originY] = getScaleOrigin();\n gesture.originX = originX;\n gesture.originY = originY;\n gesture.imageEl.style.transitionDuration = '0ms';\n }\n isScaling = true;\n }\n function onGestureChange(e) {\n if (!eventWithinSlide(e)) return;\n const params = swiper.params.zoom;\n const zoom = swiper.zoom;\n const pointerIndex = evCache.findIndex(cachedEv => cachedEv.pointerId === e.pointerId);\n if (pointerIndex >= 0) evCache[pointerIndex] = e;\n if (evCache.length < 2) {\n return;\n }\n fakeGestureMoved = true;\n gesture.scaleMove = getDistanceBetweenTouches();\n if (!gesture.imageEl) {\n return;\n }\n zoom.scale = gesture.scaleMove / gesture.scaleStart * currentScale;\n if (zoom.scale > gesture.maxRatio) {\n zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5;\n }\n if (zoom.scale < params.minRatio) {\n zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5;\n }\n gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;\n }\n function onGestureEnd(e) {\n if (!eventWithinSlide(e)) return;\n if (e.pointerType === 'mouse' && e.type === 'pointerout') return;\n const params = swiper.params.zoom;\n const zoom = swiper.zoom;\n const pointerIndex = evCache.findIndex(cachedEv => cachedEv.pointerId === e.pointerId);\n if (pointerIndex >= 0) evCache.splice(pointerIndex, 1);\n if (!fakeGestureTouched || !fakeGestureMoved) {\n return;\n }\n fakeGestureTouched = false;\n fakeGestureMoved = false;\n if (!gesture.imageEl) return;\n zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n gesture.imageEl.style.transitionDuration = `${swiper.params.speed}ms`;\n gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;\n currentScale = zoom.scale;\n isScaling = false;\n if (zoom.scale > 1 && gesture.slideEl) {\n gesture.slideEl.classList.add(`${params.zoomedSlideClass}`);\n } else if (zoom.scale <= 1 && gesture.slideEl) {\n gesture.slideEl.classList.remove(`${params.zoomedSlideClass}`);\n }\n if (zoom.scale === 1) {\n gesture.originX = 0;\n gesture.originY = 0;\n gesture.slideEl = undefined;\n }\n }\n function onTouchStart(e) {\n const device = swiper.device;\n if (!gesture.imageEl) return;\n if (image.isTouched) return;\n if (device.android && e.cancelable) e.preventDefault();\n image.isTouched = true;\n const event = evCache.length > 0 ? evCache[0] : e;\n image.touchesStart.x = event.pageX;\n image.touchesStart.y = event.pageY;\n }\n function onTouchMove(e) {\n if (!eventWithinSlide(e) || !eventWithinZoomContainer(e)) return;\n const zoom = swiper.zoom;\n if (!gesture.imageEl) return;\n if (!image.isTouched || !gesture.slideEl) return;\n if (!image.isMoved) {\n image.width = gesture.imageEl.offsetWidth;\n image.height = gesture.imageEl.offsetHeight;\n image.startX = getTranslate(gesture.imageWrapEl, 'x') || 0;\n image.startY = getTranslate(gesture.imageWrapEl, 'y') || 0;\n gesture.slideWidth = gesture.slideEl.offsetWidth;\n gesture.slideHeight = gesture.slideEl.offsetHeight;\n gesture.imageWrapEl.style.transitionDuration = '0ms';\n }\n // Define if we need image drag\n const scaledWidth = image.width * zoom.scale;\n const scaledHeight = image.height * zoom.scale;\n if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return;\n image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n image.maxX = -image.minX;\n image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n image.maxY = -image.minY;\n image.touchesCurrent.x = evCache.length > 0 ? evCache[0].pageX : e.pageX;\n image.touchesCurrent.y = evCache.length > 0 ? evCache[0].pageY : e.pageY;\n const touchesDiff = Math.max(Math.abs(image.touchesCurrent.x - image.touchesStart.x), Math.abs(image.touchesCurrent.y - image.touchesStart.y));\n if (touchesDiff > 5) {\n swiper.allowClick = false;\n }\n if (!image.isMoved && !isScaling) {\n if (swiper.isHorizontal() && (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x || Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)) {\n image.isTouched = false;\n return;\n }\n if (!swiper.isHorizontal() && (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y || Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)) {\n image.isTouched = false;\n return;\n }\n }\n if (e.cancelable) {\n e.preventDefault();\n }\n e.stopPropagation();\n image.isMoved = true;\n const scaleRatio = (zoom.scale - currentScale) / (gesture.maxRatio - swiper.params.zoom.minRatio);\n const {\n originX,\n originY\n } = gesture;\n image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX + scaleRatio * (image.width - originX * 2);\n image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY + scaleRatio * (image.height - originY * 2);\n if (image.currentX < image.minX) {\n image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8;\n }\n if (image.currentX > image.maxX) {\n image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8;\n }\n if (image.currentY < image.minY) {\n image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8;\n }\n if (image.currentY > image.maxY) {\n image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8;\n }\n\n // Velocity\n if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;\n if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;\n if (!velocity.prevTime) velocity.prevTime = Date.now();\n velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;\n if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;\n velocity.prevPositionX = image.touchesCurrent.x;\n velocity.prevPositionY = image.touchesCurrent.y;\n velocity.prevTime = Date.now();\n gesture.imageWrapEl.style.transform = `translate3d(${image.currentX}px, ${image.currentY}px,0)`;\n }\n function onTouchEnd() {\n const zoom = swiper.zoom;\n if (!gesture.imageEl) return;\n if (!image.isTouched || !image.isMoved) {\n image.isTouched = false;\n image.isMoved = false;\n return;\n }\n image.isTouched = false;\n image.isMoved = false;\n let momentumDurationX = 300;\n let momentumDurationY = 300;\n const momentumDistanceX = velocity.x * momentumDurationX;\n const newPositionX = image.currentX + momentumDistanceX;\n const momentumDistanceY = velocity.y * momentumDurationY;\n const newPositionY = image.currentY + momentumDistanceY;\n\n // Fix duration\n if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);\n if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);\n const momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n image.currentX = newPositionX;\n image.currentY = newPositionY;\n // Define if we need image drag\n const scaledWidth = image.width * zoom.scale;\n const scaledHeight = image.height * zoom.scale;\n image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n image.maxX = -image.minX;\n image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n image.maxY = -image.minY;\n image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n gesture.imageWrapEl.style.transitionDuration = `${momentumDuration}ms`;\n gesture.imageWrapEl.style.transform = `translate3d(${image.currentX}px, ${image.currentY}px,0)`;\n }\n function onTransitionEnd() {\n const zoom = swiper.zoom;\n if (gesture.slideEl && swiper.activeIndex !== swiper.slides.indexOf(gesture.slideEl)) {\n if (gesture.imageEl) {\n gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)';\n }\n if (gesture.imageWrapEl) {\n gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)';\n }\n gesture.slideEl.classList.remove(`${swiper.params.zoom.zoomedSlideClass}`);\n zoom.scale = 1;\n currentScale = 1;\n gesture.slideEl = undefined;\n gesture.imageEl = undefined;\n gesture.imageWrapEl = undefined;\n gesture.originX = 0;\n gesture.originY = 0;\n }\n }\n function zoomIn(e) {\n const zoom = swiper.zoom;\n const params = swiper.params.zoom;\n if (!gesture.slideEl) {\n if (e && e.target) {\n gesture.slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);\n }\n if (!gesture.slideEl) {\n if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n gesture.slideEl = elementChildren(swiper.slidesEl, `.${swiper.params.slideActiveClass}`)[0];\n } else {\n gesture.slideEl = swiper.slides[swiper.activeIndex];\n }\n }\n let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);\n if (imageEl) {\n imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];\n }\n gesture.imageEl = imageEl;\n if (imageEl) {\n gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];\n } else {\n gesture.imageWrapEl = undefined;\n }\n }\n if (!gesture.imageEl || !gesture.imageWrapEl) return;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style.overflow = 'hidden';\n swiper.wrapperEl.style.touchAction = 'none';\n }\n gesture.slideEl.classList.add(`${params.zoomedSlideClass}`);\n let touchX;\n let touchY;\n let offsetX;\n let offsetY;\n let diffX;\n let diffY;\n let translateX;\n let translateY;\n let imageWidth;\n let imageHeight;\n let scaledWidth;\n let scaledHeight;\n let translateMinX;\n let translateMinY;\n let translateMaxX;\n let translateMaxY;\n let slideWidth;\n let slideHeight;\n if (typeof image.touchesStart.x === 'undefined' && e) {\n touchX = e.pageX;\n touchY = e.pageY;\n } else {\n touchX = image.touchesStart.x;\n touchY = image.touchesStart.y;\n }\n const forceZoomRatio = typeof e === 'number' ? e : null;\n if (currentScale === 1 && forceZoomRatio) {\n touchX = undefined;\n touchY = undefined;\n }\n zoom.scale = forceZoomRatio || gesture.imageWrapEl.getAttribute('data-swiper-zoom') || params.maxRatio;\n currentScale = forceZoomRatio || gesture.imageWrapEl.getAttribute('data-swiper-zoom') || params.maxRatio;\n if (e && !(currentScale === 1 && forceZoomRatio)) {\n slideWidth = gesture.slideEl.offsetWidth;\n slideHeight = gesture.slideEl.offsetHeight;\n offsetX = elementOffset(gesture.slideEl).left + window.scrollX;\n offsetY = elementOffset(gesture.slideEl).top + window.scrollY;\n diffX = offsetX + slideWidth / 2 - touchX;\n diffY = offsetY + slideHeight / 2 - touchY;\n imageWidth = gesture.imageEl.offsetWidth;\n imageHeight = gesture.imageEl.offsetHeight;\n scaledWidth = imageWidth * zoom.scale;\n scaledHeight = imageHeight * zoom.scale;\n translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);\n translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);\n translateMaxX = -translateMinX;\n translateMaxY = -translateMinY;\n translateX = diffX * zoom.scale;\n translateY = diffY * zoom.scale;\n if (translateX < translateMinX) {\n translateX = translateMinX;\n }\n if (translateX > translateMaxX) {\n translateX = translateMaxX;\n }\n if (translateY < translateMinY) {\n translateY = translateMinY;\n }\n if (translateY > translateMaxY) {\n translateY = translateMaxY;\n }\n } else {\n translateX = 0;\n translateY = 0;\n }\n if (forceZoomRatio && zoom.scale === 1) {\n gesture.originX = 0;\n gesture.originY = 0;\n }\n gesture.imageWrapEl.style.transitionDuration = '300ms';\n gesture.imageWrapEl.style.transform = `translate3d(${translateX}px, ${translateY}px,0)`;\n gesture.imageEl.style.transitionDuration = '300ms';\n gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;\n }\n function zoomOut() {\n const zoom = swiper.zoom;\n const params = swiper.params.zoom;\n if (!gesture.slideEl) {\n if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n gesture.slideEl = elementChildren(swiper.slidesEl, `.${swiper.params.slideActiveClass}`)[0];\n } else {\n gesture.slideEl = swiper.slides[swiper.activeIndex];\n }\n let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);\n if (imageEl) {\n imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];\n }\n gesture.imageEl = imageEl;\n if (imageEl) {\n gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];\n } else {\n gesture.imageWrapEl = undefined;\n }\n }\n if (!gesture.imageEl || !gesture.imageWrapEl) return;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style.overflow = '';\n swiper.wrapperEl.style.touchAction = '';\n }\n zoom.scale = 1;\n currentScale = 1;\n gesture.imageWrapEl.style.transitionDuration = '300ms';\n gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)';\n gesture.imageEl.style.transitionDuration = '300ms';\n gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)';\n gesture.slideEl.classList.remove(`${params.zoomedSlideClass}`);\n gesture.slideEl = undefined;\n gesture.originX = 0;\n gesture.originY = 0;\n }\n\n // Toggle Zoom\n function zoomToggle(e) {\n const zoom = swiper.zoom;\n if (zoom.scale && zoom.scale !== 1) {\n // Zoom Out\n zoomOut();\n } else {\n // Zoom In\n zoomIn(e);\n }\n }\n function getListeners() {\n const passiveListener = swiper.params.passiveListeners ? {\n passive: true,\n capture: false\n } : false;\n const activeListenerWithCapture = swiper.params.passiveListeners ? {\n passive: false,\n capture: true\n } : true;\n return {\n passiveListener,\n activeListenerWithCapture\n };\n }\n\n // Attach/Detach Events\n function enable() {\n const zoom = swiper.zoom;\n if (zoom.enabled) return;\n zoom.enabled = true;\n const {\n passiveListener,\n activeListenerWithCapture\n } = getListeners();\n\n // Scale image\n swiper.wrapperEl.addEventListener('pointerdown', onGestureStart, passiveListener);\n swiper.wrapperEl.addEventListener('pointermove', onGestureChange, activeListenerWithCapture);\n ['pointerup', 'pointercancel', 'pointerout'].forEach(eventName => {\n swiper.wrapperEl.addEventListener(eventName, onGestureEnd, passiveListener);\n });\n\n // Move image\n swiper.wrapperEl.addEventListener('pointermove', onTouchMove, activeListenerWithCapture);\n }\n function disable() {\n const zoom = swiper.zoom;\n if (!zoom.enabled) return;\n zoom.enabled = false;\n const {\n passiveListener,\n activeListenerWithCapture\n } = getListeners();\n\n // Scale image\n swiper.wrapperEl.removeEventListener('pointerdown', onGestureStart, passiveListener);\n swiper.wrapperEl.removeEventListener('pointermove', onGestureChange, activeListenerWithCapture);\n ['pointerup', 'pointercancel', 'pointerout'].forEach(eventName => {\n swiper.wrapperEl.removeEventListener(eventName, onGestureEnd, passiveListener);\n });\n\n // Move image\n swiper.wrapperEl.removeEventListener('pointermove', onTouchMove, activeListenerWithCapture);\n }\n on('init', () => {\n if (swiper.params.zoom.enabled) {\n enable();\n }\n });\n on('destroy', () => {\n disable();\n });\n on('touchStart', (_s, e) => {\n if (!swiper.zoom.enabled) return;\n onTouchStart(e);\n });\n on('touchEnd', (_s, e) => {\n if (!swiper.zoom.enabled) return;\n onTouchEnd();\n });\n on('doubleTap', (_s, e) => {\n if (!swiper.animating && swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {\n zoomToggle(e);\n }\n });\n on('transitionEnd', () => {\n if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n onTransitionEnd();\n }\n });\n on('slideChange', () => {\n if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {\n onTransitionEnd();\n }\n });\n Object.assign(swiper.zoom, {\n enable,\n disable,\n in: zoomIn,\n out: zoomOut,\n toggle: zoomToggle\n });\n}\n\nexport { Zoom as default };\n","import { n as nextTick, i as elementTransitionEnd } from '../shared/utils.mjs';\n\n/* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\nfunction Controller(_ref) {\n let {\n swiper,\n extendParams,\n on\n } = _ref;\n extendParams({\n controller: {\n control: undefined,\n inverse: false,\n by: 'slide' // or 'container'\n }\n });\n\n swiper.controller = {\n control: undefined\n };\n function LinearSpline(x, y) {\n const binarySearch = function search() {\n let maxIndex;\n let minIndex;\n let guess;\n return (array, val) => {\n minIndex = -1;\n maxIndex = array.length;\n while (maxIndex - minIndex > 1) {\n guess = maxIndex + minIndex >> 1;\n if (array[guess] <= val) {\n minIndex = guess;\n } else {\n maxIndex = guess;\n }\n }\n return maxIndex;\n };\n }();\n this.x = x;\n this.y = y;\n this.lastIndex = x.length - 1;\n // Given an x value (x2), return the expected y2 value:\n // (x1,y1) is the known point before given value,\n // (x3,y3) is the known point after given value.\n let i1;\n let i3;\n this.interpolate = function interpolate(x2) {\n if (!x2) return 0;\n\n // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n i3 = binarySearch(this.x, x2);\n i1 = i3 - 1;\n\n // We have our indexes i1 & i3, so we can calculate already:\n // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n return (x2 - this.x[i1]) * (this.y[i3] - this.y[i1]) / (this.x[i3] - this.x[i1]) + this.y[i1];\n };\n return this;\n }\n function getInterpolateFunction(c) {\n swiper.controller.spline = swiper.params.loop ? new LinearSpline(swiper.slidesGrid, c.slidesGrid) : new LinearSpline(swiper.snapGrid, c.snapGrid);\n }\n function setTranslate(_t, byController) {\n const controlled = swiper.controller.control;\n let multiplier;\n let controlledTranslate;\n const Swiper = swiper.constructor;\n function setControlledTranslate(c) {\n if (c.destroyed) return;\n\n // this will create an Interpolate function based on the snapGrids\n // x is the Grid of the scrolled scroller and y will be the controlled scroller\n // it makes sense to create this only once and recall it for the interpolation\n // the function does a lot of value caching for performance\n const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;\n if (swiper.params.controller.by === 'slide') {\n getInterpolateFunction(c);\n // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n // but it did not work out\n controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n }\n if (!controlledTranslate || swiper.params.controller.by === 'container') {\n multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n if (Number.isNaN(multiplier) || !Number.isFinite(multiplier)) {\n multiplier = 1;\n }\n controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();\n }\n if (swiper.params.controller.inverse) {\n controlledTranslate = c.maxTranslate() - controlledTranslate;\n }\n c.updateProgress(controlledTranslate);\n c.setTranslate(controlledTranslate, swiper);\n c.updateActiveIndex();\n c.updateSlidesClasses();\n }\n if (Array.isArray(controlled)) {\n for (let i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTranslate(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTranslate(controlled);\n }\n }\n function setTransition(duration, byController) {\n const Swiper = swiper.constructor;\n const controlled = swiper.controller.control;\n let i;\n function setControlledTransition(c) {\n if (c.destroyed) return;\n c.setTransition(duration, swiper);\n if (duration !== 0) {\n c.transitionStart();\n if (c.params.autoHeight) {\n nextTick(() => {\n c.updateAutoHeight();\n });\n }\n elementTransitionEnd(c.wrapperEl, () => {\n if (!controlled) return;\n c.transitionEnd();\n });\n }\n }\n if (Array.isArray(controlled)) {\n for (i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTransition(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTransition(controlled);\n }\n }\n function removeSpline() {\n if (!swiper.controller.control) return;\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n }\n on('beforeInit', () => {\n if (typeof window !== 'undefined' && (\n // eslint-disable-line\n typeof swiper.params.controller.control === 'string' || swiper.params.controller.control instanceof HTMLElement)) {\n const controlElement = document.querySelector(swiper.params.controller.control);\n if (controlElement && controlElement.swiper) {\n swiper.controller.control = controlElement.swiper;\n } else if (controlElement) {\n const onControllerSwiper = e => {\n swiper.controller.control = e.detail[0];\n swiper.update();\n controlElement.removeEventListener('init', onControllerSwiper);\n };\n controlElement.addEventListener('init', onControllerSwiper);\n }\n return;\n }\n swiper.controller.control = swiper.params.controller.control;\n });\n on('update', () => {\n removeSpline();\n });\n on('resize', () => {\n removeSpline();\n });\n on('observerUpdate', () => {\n removeSpline();\n });\n on('setTranslate', (_s, translate, byController) => {\n if (!swiper.controller.control || swiper.controller.control.destroyed) return;\n swiper.controller.setTranslate(translate, byController);\n });\n on('setTransition', (_s, duration, byController) => {\n if (!swiper.controller.control || swiper.controller.control.destroyed) return;\n swiper.controller.setTransition(duration, byController);\n });\n Object.assign(swiper.controller, {\n setTranslate,\n setTransition\n });\n}\n\nexport { Controller as default };\n","import { c as classesToSelector } from '../shared/classes-to-selector.mjs';\nimport { c as createElement, g as elementIndex } from '../shared/utils.mjs';\n\nfunction A11y(_ref) {\n let {\n swiper,\n extendParams,\n on\n } = _ref;\n extendParams({\n a11y: {\n enabled: true,\n notificationClass: 'swiper-notification',\n prevSlideMessage: 'Previous slide',\n nextSlideMessage: 'Next slide',\n firstSlideMessage: 'This is the first slide',\n lastSlideMessage: 'This is the last slide',\n paginationBulletMessage: 'Go to slide {{index}}',\n slideLabelMessage: '{{index}} / {{slidesLength}}',\n containerMessage: null,\n containerRoleDescriptionMessage: null,\n itemRoleDescriptionMessage: null,\n slideRole: 'group',\n id: null\n }\n });\n swiper.a11y = {\n clicked: false\n };\n let liveRegion = null;\n function notify(message) {\n const notification = liveRegion;\n if (notification.length === 0) return;\n notification.innerHTML = '';\n notification.innerHTML = message;\n }\n const makeElementsArray = el => (Array.isArray(el) ? el : [el]).filter(e => !!e);\n function getRandomNumber(size) {\n if (size === void 0) {\n size = 16;\n }\n const randomChar = () => Math.round(16 * Math.random()).toString(16);\n return 'x'.repeat(size).replace(/x/g, randomChar);\n }\n function makeElFocusable(el) {\n el = makeElementsArray(el);\n el.forEach(subEl => {\n subEl.setAttribute('tabIndex', '0');\n });\n }\n function makeElNotFocusable(el) {\n el = makeElementsArray(el);\n el.forEach(subEl => {\n subEl.setAttribute('tabIndex', '-1');\n });\n }\n function addElRole(el, role) {\n el = makeElementsArray(el);\n el.forEach(subEl => {\n subEl.setAttribute('role', role);\n });\n }\n function addElRoleDescription(el, description) {\n el = makeElementsArray(el);\n el.forEach(subEl => {\n subEl.setAttribute('aria-roledescription', description);\n });\n }\n function addElControls(el, controls) {\n el = makeElementsArray(el);\n el.forEach(subEl => {\n subEl.setAttribute('aria-controls', controls);\n });\n }\n function addElLabel(el, label) {\n el = makeElementsArray(el);\n el.forEach(subEl => {\n subEl.setAttribute('aria-label', label);\n });\n }\n function addElId(el, id) {\n el = makeElementsArray(el);\n el.forEach(subEl => {\n subEl.setAttribute('id', id);\n });\n }\n function addElLive(el, live) {\n el = makeElementsArray(el);\n el.forEach(subEl => {\n subEl.setAttribute('aria-live', live);\n });\n }\n function disableEl(el) {\n el = makeElementsArray(el);\n el.forEach(subEl => {\n subEl.setAttribute('aria-disabled', true);\n });\n }\n function enableEl(el) {\n el = makeElementsArray(el);\n el.forEach(subEl => {\n subEl.setAttribute('aria-disabled', false);\n });\n }\n function onEnterOrSpaceKey(e) {\n if (e.keyCode !== 13 && e.keyCode !== 32) return;\n const params = swiper.params.a11y;\n const targetEl = e.target;\n if (swiper.pagination && swiper.pagination.el && (targetEl === swiper.pagination.el || swiper.pagination.el.contains(e.target))) {\n if (!e.target.matches(classesToSelector(swiper.params.pagination.bulletClass))) return;\n }\n if (swiper.navigation && swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl) {\n if (!(swiper.isEnd && !swiper.params.loop)) {\n swiper.slideNext();\n }\n if (swiper.isEnd) {\n notify(params.lastSlideMessage);\n } else {\n notify(params.nextSlideMessage);\n }\n }\n if (swiper.navigation && swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl) {\n if (!(swiper.isBeginning && !swiper.params.loop)) {\n swiper.slidePrev();\n }\n if (swiper.isBeginning) {\n notify(params.firstSlideMessage);\n } else {\n notify(params.prevSlideMessage);\n }\n }\n if (swiper.pagination && targetEl.matches(classesToSelector(swiper.params.pagination.bulletClass))) {\n targetEl.click();\n }\n }\n function updateNavigation() {\n if (swiper.params.loop || swiper.params.rewind || !swiper.navigation) return;\n const {\n nextEl,\n prevEl\n } = swiper.navigation;\n if (prevEl) {\n if (swiper.isBeginning) {\n disableEl(prevEl);\n makeElNotFocusable(prevEl);\n } else {\n enableEl(prevEl);\n makeElFocusable(prevEl);\n }\n }\n if (nextEl) {\n if (swiper.isEnd) {\n disableEl(nextEl);\n makeElNotFocusable(nextEl);\n } else {\n enableEl(nextEl);\n makeElFocusable(nextEl);\n }\n }\n }\n function hasPagination() {\n return swiper.pagination && swiper.pagination.bullets && swiper.pagination.bullets.length;\n }\n function hasClickablePagination() {\n return hasPagination() && swiper.params.pagination.clickable;\n }\n function updatePagination() {\n const params = swiper.params.a11y;\n if (!hasPagination()) return;\n swiper.pagination.bullets.forEach(bulletEl => {\n if (swiper.params.pagination.clickable) {\n makeElFocusable(bulletEl);\n if (!swiper.params.pagination.renderBullet) {\n addElRole(bulletEl, 'button');\n addElLabel(bulletEl, params.paginationBulletMessage.replace(/\\{\\{index\\}\\}/, elementIndex(bulletEl) + 1));\n }\n }\n if (bulletEl.matches(classesToSelector(swiper.params.pagination.bulletActiveClass))) {\n bulletEl.setAttribute('aria-current', 'true');\n } else {\n bulletEl.removeAttribute('aria-current');\n }\n });\n }\n const initNavEl = (el, wrapperId, message) => {\n makeElFocusable(el);\n if (el.tagName !== 'BUTTON') {\n addElRole(el, 'button');\n el.addEventListener('keydown', onEnterOrSpaceKey);\n }\n addElLabel(el, message);\n addElControls(el, wrapperId);\n };\n const handlePointerDown = () => {\n swiper.a11y.clicked = true;\n };\n const handlePointerUp = () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (!swiper.destroyed) {\n swiper.a11y.clicked = false;\n }\n });\n });\n };\n const handleFocus = e => {\n if (swiper.a11y.clicked) return;\n const slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);\n if (!slideEl || !swiper.slides.includes(slideEl)) return;\n const isActive = swiper.slides.indexOf(slideEl) === swiper.activeIndex;\n const isVisible = swiper.params.watchSlidesProgress && swiper.visibleSlides && swiper.visibleSlides.includes(slideEl);\n if (isActive || isVisible) return;\n if (e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return;\n if (swiper.isHorizontal()) {\n swiper.el.scrollLeft = 0;\n } else {\n swiper.el.scrollTop = 0;\n }\n swiper.slideTo(swiper.slides.indexOf(slideEl), 0);\n };\n const initSlides = () => {\n const params = swiper.params.a11y;\n if (params.itemRoleDescriptionMessage) {\n addElRoleDescription(swiper.slides, params.itemRoleDescriptionMessage);\n }\n if (params.slideRole) {\n addElRole(swiper.slides, params.slideRole);\n }\n const slidesLength = swiper.slides.length;\n if (params.slideLabelMessage) {\n swiper.slides.forEach((slideEl, index) => {\n const slideIndex = swiper.params.loop ? parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10) : index;\n const ariaLabelMessage = params.slideLabelMessage.replace(/\\{\\{index\\}\\}/, slideIndex + 1).replace(/\\{\\{slidesLength\\}\\}/, slidesLength);\n addElLabel(slideEl, ariaLabelMessage);\n });\n }\n };\n const init = () => {\n const params = swiper.params.a11y;\n swiper.el.append(liveRegion);\n\n // Container\n const containerEl = swiper.el;\n if (params.containerRoleDescriptionMessage) {\n addElRoleDescription(containerEl, params.containerRoleDescriptionMessage);\n }\n if (params.containerMessage) {\n addElLabel(containerEl, params.containerMessage);\n }\n\n // Wrapper\n const wrapperEl = swiper.wrapperEl;\n const wrapperId = params.id || wrapperEl.getAttribute('id') || `swiper-wrapper-${getRandomNumber(16)}`;\n const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';\n addElId(wrapperEl, wrapperId);\n addElLive(wrapperEl, live);\n\n // Slide\n initSlides();\n\n // Navigation\n let {\n nextEl,\n prevEl\n } = swiper.navigation ? swiper.navigation : {};\n nextEl = makeElementsArray(nextEl);\n prevEl = makeElementsArray(prevEl);\n if (nextEl) {\n nextEl.forEach(el => initNavEl(el, wrapperId, params.nextSlideMessage));\n }\n if (prevEl) {\n prevEl.forEach(el => initNavEl(el, wrapperId, params.prevSlideMessage));\n }\n\n // Pagination\n if (hasClickablePagination()) {\n const paginationEl = Array.isArray(swiper.pagination.el) ? swiper.pagination.el : [swiper.pagination.el];\n paginationEl.forEach(el => {\n el.addEventListener('keydown', onEnterOrSpaceKey);\n });\n }\n\n // Tab focus\n swiper.el.addEventListener('focus', handleFocus, true);\n swiper.el.addEventListener('pointerdown', handlePointerDown, true);\n swiper.el.addEventListener('pointerup', handlePointerUp, true);\n };\n function destroy() {\n if (liveRegion) liveRegion.remove();\n let {\n nextEl,\n prevEl\n } = swiper.navigation ? swiper.navigation : {};\n nextEl = makeElementsArray(nextEl);\n prevEl = makeElementsArray(prevEl);\n if (nextEl) {\n nextEl.forEach(el => el.removeEventListener('keydown', onEnterOrSpaceKey));\n }\n if (prevEl) {\n prevEl.forEach(el => el.removeEventListener('keydown', onEnterOrSpaceKey));\n }\n\n // Pagination\n if (hasClickablePagination()) {\n const paginationEl = Array.isArray(swiper.pagination.el) ? swiper.pagination.el : [swiper.pagination.el];\n paginationEl.forEach(el => {\n el.removeEventListener('keydown', onEnterOrSpaceKey);\n });\n }\n\n // Tab focus\n swiper.el.removeEventListener('focus', handleFocus, true);\n swiper.el.removeEventListener('pointerdown', handlePointerDown, true);\n swiper.el.removeEventListener('pointerup', handlePointerUp, true);\n }\n on('beforeInit', () => {\n liveRegion = createElement('span', swiper.params.a11y.notificationClass);\n liveRegion.setAttribute('aria-live', 'assertive');\n liveRegion.setAttribute('aria-atomic', 'true');\n });\n on('afterInit', () => {\n if (!swiper.params.a11y.enabled) return;\n init();\n });\n on('slidesLengthChange snapGridLengthChange slidesGridLengthChange', () => {\n if (!swiper.params.a11y.enabled) return;\n initSlides();\n });\n on('fromEdge toEdge afterInit lock unlock', () => {\n if (!swiper.params.a11y.enabled) return;\n updateNavigation();\n });\n on('paginationUpdate', () => {\n if (!swiper.params.a11y.enabled) return;\n updatePagination();\n });\n on('destroy', () => {\n if (!swiper.params.a11y.enabled) return;\n destroy();\n });\n}\n\nexport { A11y as default };\n","import { a as getWindow } from '../shared/ssr-window.esm.mjs';\n\nfunction History(_ref) {\n let {\n swiper,\n extendParams,\n on\n } = _ref;\n extendParams({\n history: {\n enabled: false,\n root: '',\n replaceState: false,\n key: 'slides',\n keepQuery: false\n }\n });\n let initialized = false;\n let paths = {};\n const slugify = text => {\n return text.toString().replace(/\\s+/g, '-').replace(/[^\\w-]+/g, '').replace(/--+/g, '-').replace(/^-+/, '').replace(/-+$/, '');\n };\n const getPathValues = urlOverride => {\n const window = getWindow();\n let location;\n if (urlOverride) {\n location = new URL(urlOverride);\n } else {\n location = window.location;\n }\n const pathArray = location.pathname.slice(1).split('/').filter(part => part !== '');\n const total = pathArray.length;\n const key = pathArray[total - 2];\n const value = pathArray[total - 1];\n return {\n key,\n value\n };\n };\n const setHistory = (key, index) => {\n const window = getWindow();\n if (!initialized || !swiper.params.history.enabled) return;\n let location;\n if (swiper.params.url) {\n location = new URL(swiper.params.url);\n } else {\n location = window.location;\n }\n const slide = swiper.slides[index];\n let value = slugify(slide.getAttribute('data-history'));\n if (swiper.params.history.root.length > 0) {\n let root = swiper.params.history.root;\n if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);\n value = `${root}/${key ? `${key}/` : ''}${value}`;\n } else if (!location.pathname.includes(key)) {\n value = `${key ? `${key}/` : ''}${value}`;\n }\n if (swiper.params.history.keepQuery) {\n value += location.search;\n }\n const currentState = window.history.state;\n if (currentState && currentState.value === value) {\n return;\n }\n if (swiper.params.history.replaceState) {\n window.history.replaceState({\n value\n }, null, value);\n } else {\n window.history.pushState({\n value\n }, null, value);\n }\n };\n const scrollToSlide = (speed, value, runCallbacks) => {\n if (value) {\n for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n const slide = swiper.slides[i];\n const slideHistory = slugify(slide.getAttribute('data-history'));\n if (slideHistory === value) {\n const index = swiper.getSlideIndex(slide);\n swiper.slideTo(index, speed, runCallbacks);\n }\n }\n } else {\n swiper.slideTo(0, speed, runCallbacks);\n }\n };\n const setHistoryPopState = () => {\n paths = getPathValues(swiper.params.url);\n scrollToSlide(swiper.params.speed, paths.value, false);\n };\n const init = () => {\n const window = getWindow();\n if (!swiper.params.history) return;\n if (!window.history || !window.history.pushState) {\n swiper.params.history.enabled = false;\n swiper.params.hashNavigation.enabled = true;\n return;\n }\n initialized = true;\n paths = getPathValues(swiper.params.url);\n if (!paths.key && !paths.value) {\n if (!swiper.params.history.replaceState) {\n window.addEventListener('popstate', setHistoryPopState);\n }\n return;\n }\n scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);\n if (!swiper.params.history.replaceState) {\n window.addEventListener('popstate', setHistoryPopState);\n }\n };\n const destroy = () => {\n const window = getWindow();\n if (!swiper.params.history.replaceState) {\n window.removeEventListener('popstate', setHistoryPopState);\n }\n };\n on('init', () => {\n if (swiper.params.history.enabled) {\n init();\n }\n });\n on('destroy', () => {\n if (swiper.params.history.enabled) {\n destroy();\n }\n });\n on('transitionEnd _freeModeNoMomentumRelease', () => {\n if (initialized) {\n setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n });\n on('slideChange', () => {\n if (initialized && swiper.params.cssMode) {\n setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n });\n}\n\nexport { History as default };\n","import { g as getDocument, a as getWindow } from '../shared/ssr-window.esm.mjs';\nimport { e as elementChildren } from '../shared/utils.mjs';\n\nfunction HashNavigation(_ref) {\n let {\n swiper,\n extendParams,\n emit,\n on\n } = _ref;\n let initialized = false;\n const document = getDocument();\n const window = getWindow();\n extendParams({\n hashNavigation: {\n enabled: false,\n replaceState: false,\n watchState: false,\n getSlideIndex(_s, hash) {\n if (swiper.virtual && swiper.params.virtual.enabled) {\n const slideWithHash = swiper.slides.filter(slideEl => slideEl.getAttribute('data-hash') === hash)[0];\n if (!slideWithHash) return 0;\n const index = parseInt(slideWithHash.getAttribute('data-swiper-slide-index'), 10);\n return index;\n }\n return swiper.getSlideIndex(elementChildren(swiper.slidesEl, `.${swiper.params.slideClass}[data-hash=\"${hash}\"], swiper-slide[data-hash=\"${hash}\"]`)[0]);\n }\n }\n });\n const onHashChange = () => {\n emit('hashChange');\n const newHash = document.location.hash.replace('#', '');\n const activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector(`[data-swiper-slide-index=\"${swiper.activeIndex}\"]`) : swiper.slides[swiper.activeIndex];\n const activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') : '';\n if (newHash !== activeSlideHash) {\n const newIndex = swiper.params.hashNavigation.getSlideIndex(swiper, newHash);\n if (typeof newIndex === 'undefined' || Number.isNaN(newIndex)) return;\n swiper.slideTo(newIndex);\n }\n };\n const setHash = () => {\n if (!initialized || !swiper.params.hashNavigation.enabled) return;\n const activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector(`[data-swiper-slide-index=\"${swiper.activeIndex}\"]`) : swiper.slides[swiper.activeIndex];\n const activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') || activeSlideEl.getAttribute('data-history') : '';\n if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) {\n window.history.replaceState(null, null, `#${activeSlideHash}` || '');\n emit('hashSet');\n } else {\n document.location.hash = activeSlideHash || '';\n emit('hashSet');\n }\n };\n const init = () => {\n if (!swiper.params.hashNavigation.enabled || swiper.params.history && swiper.params.history.enabled) return;\n initialized = true;\n const hash = document.location.hash.replace('#', '');\n if (hash) {\n const speed = 0;\n const index = swiper.params.hashNavigation.getSlideIndex(swiper, hash);\n swiper.slideTo(index || 0, speed, swiper.params.runCallbacksOnInit, true);\n }\n if (swiper.params.hashNavigation.watchState) {\n window.addEventListener('hashchange', onHashChange);\n }\n };\n const destroy = () => {\n if (swiper.params.hashNavigation.watchState) {\n window.removeEventListener('hashchange', onHashChange);\n }\n };\n on('init', () => {\n if (swiper.params.hashNavigation.enabled) {\n init();\n }\n });\n on('destroy', () => {\n if (swiper.params.hashNavigation.enabled) {\n destroy();\n }\n });\n on('transitionEnd _freeModeNoMomentumRelease', () => {\n if (initialized) {\n setHash();\n }\n });\n on('slideChange', () => {\n if (initialized && swiper.params.cssMode) {\n setHash();\n }\n });\n}\n\nexport { HashNavigation as default };\n","import { g as getDocument } from '../shared/ssr-window.esm.mjs';\n\n/* eslint no-underscore-dangle: \"off\" */\n/* eslint no-use-before-define: \"off\" */\nfunction Autoplay(_ref) {\n let {\n swiper,\n extendParams,\n on,\n emit,\n params\n } = _ref;\n swiper.autoplay = {\n running: false,\n paused: false,\n timeLeft: 0\n };\n extendParams({\n autoplay: {\n enabled: false,\n delay: 3000,\n waitForTransition: true,\n disableOnInteraction: true,\n stopOnLastSlide: false,\n reverseDirection: false,\n pauseOnMouseEnter: false\n }\n });\n let timeout;\n let raf;\n let autoplayDelayTotal = params && params.autoplay ? params.autoplay.delay : 3000;\n let autoplayDelayCurrent = params && params.autoplay ? params.autoplay.delay : 3000;\n let autoplayTimeLeft;\n let autoplayStartTime = new Date().getTime;\n let wasPaused;\n let isTouched;\n let pausedByTouch;\n let touchStartTimeout;\n let slideChanged;\n let pausedByInteraction;\n function onTransitionEnd(e) {\n if (!swiper || swiper.destroyed || !swiper.wrapperEl) return;\n if (e.target !== swiper.wrapperEl) return;\n swiper.wrapperEl.removeEventListener('transitionend', onTransitionEnd);\n resume();\n }\n const calcTimeLeft = () => {\n if (swiper.destroyed || !swiper.autoplay.running) return;\n if (swiper.autoplay.paused) {\n wasPaused = true;\n } else if (wasPaused) {\n autoplayDelayCurrent = autoplayTimeLeft;\n wasPaused = false;\n }\n const timeLeft = swiper.autoplay.paused ? autoplayTimeLeft : autoplayStartTime + autoplayDelayCurrent - new Date().getTime();\n swiper.autoplay.timeLeft = timeLeft;\n emit('autoplayTimeLeft', timeLeft, timeLeft / autoplayDelayTotal);\n raf = requestAnimationFrame(() => {\n calcTimeLeft();\n });\n };\n const getSlideDelay = () => {\n let activeSlideEl;\n if (swiper.virtual && swiper.params.virtual.enabled) {\n activeSlideEl = swiper.slides.filter(slideEl => slideEl.classList.contains('swiper-slide-active'))[0];\n } else {\n activeSlideEl = swiper.slides[swiper.activeIndex];\n }\n if (!activeSlideEl) return undefined;\n const currentSlideDelay = parseInt(activeSlideEl.getAttribute('data-swiper-autoplay'), 10);\n return currentSlideDelay;\n };\n const run = delayForce => {\n if (swiper.destroyed || !swiper.autoplay.running) return;\n cancelAnimationFrame(raf);\n calcTimeLeft();\n let delay = typeof delayForce === 'undefined' ? swiper.params.autoplay.delay : delayForce;\n autoplayDelayTotal = swiper.params.autoplay.delay;\n autoplayDelayCurrent = swiper.params.autoplay.delay;\n const currentSlideDelay = getSlideDelay();\n if (!Number.isNaN(currentSlideDelay) && currentSlideDelay > 0 && typeof delayForce === 'undefined') {\n delay = currentSlideDelay;\n autoplayDelayTotal = currentSlideDelay;\n autoplayDelayCurrent = currentSlideDelay;\n }\n autoplayTimeLeft = delay;\n const speed = swiper.params.speed;\n const proceed = () => {\n if (!swiper || swiper.destroyed) return;\n if (swiper.params.autoplay.reverseDirection) {\n if (!swiper.isBeginning || swiper.params.loop || swiper.params.rewind) {\n swiper.slidePrev(speed, true, true);\n emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n swiper.slideTo(swiper.slides.length - 1, speed, true, true);\n emit('autoplay');\n }\n } else {\n if (!swiper.isEnd || swiper.params.loop || swiper.params.rewind) {\n swiper.slideNext(speed, true, true);\n emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n swiper.slideTo(0, speed, true, true);\n emit('autoplay');\n }\n }\n if (swiper.params.cssMode) {\n autoplayStartTime = new Date().getTime();\n requestAnimationFrame(() => {\n run();\n });\n }\n };\n if (delay > 0) {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n proceed();\n }, delay);\n } else {\n requestAnimationFrame(() => {\n proceed();\n });\n }\n\n // eslint-disable-next-line\n return delay;\n };\n const start = () => {\n swiper.autoplay.running = true;\n run();\n emit('autoplayStart');\n };\n const stop = () => {\n swiper.autoplay.running = false;\n clearTimeout(timeout);\n cancelAnimationFrame(raf);\n emit('autoplayStop');\n };\n const pause = (internal, reset) => {\n if (swiper.destroyed || !swiper.autoplay.running) return;\n clearTimeout(timeout);\n if (!internal) {\n pausedByInteraction = true;\n }\n const proceed = () => {\n emit('autoplayPause');\n if (swiper.params.autoplay.waitForTransition) {\n swiper.wrapperEl.addEventListener('transitionend', onTransitionEnd);\n } else {\n resume();\n }\n };\n swiper.autoplay.paused = true;\n if (reset) {\n if (slideChanged) {\n autoplayTimeLeft = swiper.params.autoplay.delay;\n }\n slideChanged = false;\n proceed();\n return;\n }\n const delay = autoplayTimeLeft || swiper.params.autoplay.delay;\n autoplayTimeLeft = delay - (new Date().getTime() - autoplayStartTime);\n if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop) return;\n if (autoplayTimeLeft < 0) autoplayTimeLeft = 0;\n proceed();\n };\n const resume = () => {\n if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop || swiper.destroyed || !swiper.autoplay.running) return;\n autoplayStartTime = new Date().getTime();\n if (pausedByInteraction) {\n pausedByInteraction = false;\n run(autoplayTimeLeft);\n } else {\n run();\n }\n swiper.autoplay.paused = false;\n emit('autoplayResume');\n };\n const onVisibilityChange = () => {\n if (swiper.destroyed || !swiper.autoplay.running) return;\n const document = getDocument();\n if (document.visibilityState === 'hidden') {\n pausedByInteraction = true;\n pause(true);\n }\n if (document.visibilityState === 'visible') {\n resume();\n }\n };\n const onPointerEnter = e => {\n if (e.pointerType !== 'mouse') return;\n pausedByInteraction = true;\n if (swiper.animating || swiper.autoplay.paused) return;\n pause(true);\n };\n const onPointerLeave = e => {\n if (e.pointerType !== 'mouse') return;\n if (swiper.autoplay.paused) {\n resume();\n }\n };\n const attachMouseEvents = () => {\n if (swiper.params.autoplay.pauseOnMouseEnter) {\n swiper.el.addEventListener('pointerenter', onPointerEnter);\n swiper.el.addEventListener('pointerleave', onPointerLeave);\n }\n };\n const detachMouseEvents = () => {\n swiper.el.removeEventListener('pointerenter', onPointerEnter);\n swiper.el.removeEventListener('pointerleave', onPointerLeave);\n };\n const attachDocumentEvents = () => {\n const document = getDocument();\n document.addEventListener('visibilitychange', onVisibilityChange);\n };\n const detachDocumentEvents = () => {\n const document = getDocument();\n document.removeEventListener('visibilitychange', onVisibilityChange);\n };\n on('init', () => {\n if (swiper.params.autoplay.enabled) {\n attachMouseEvents();\n attachDocumentEvents();\n autoplayStartTime = new Date().getTime();\n start();\n }\n });\n on('destroy', () => {\n detachMouseEvents();\n detachDocumentEvents();\n if (swiper.autoplay.running) {\n stop();\n }\n });\n on('beforeTransitionStart', (_s, speed, internal) => {\n if (swiper.destroyed || !swiper.autoplay.running) return;\n if (internal || !swiper.params.autoplay.disableOnInteraction) {\n pause(true, true);\n } else {\n stop();\n }\n });\n on('sliderFirstMove', () => {\n if (swiper.destroyed || !swiper.autoplay.running) return;\n if (swiper.params.autoplay.disableOnInteraction) {\n stop();\n return;\n }\n isTouched = true;\n pausedByTouch = false;\n pausedByInteraction = false;\n touchStartTimeout = setTimeout(() => {\n pausedByInteraction = true;\n pausedByTouch = true;\n pause(true);\n }, 200);\n });\n on('touchEnd', () => {\n if (swiper.destroyed || !swiper.autoplay.running || !isTouched) return;\n clearTimeout(touchStartTimeout);\n clearTimeout(timeout);\n if (swiper.params.autoplay.disableOnInteraction) {\n pausedByTouch = false;\n isTouched = false;\n return;\n }\n if (pausedByTouch && swiper.params.cssMode) resume();\n pausedByTouch = false;\n isTouched = false;\n });\n on('slideChange', () => {\n if (swiper.destroyed || !swiper.autoplay.running) return;\n slideChanged = true;\n });\n Object.assign(swiper.autoplay, {\n start,\n stop,\n pause,\n resume\n });\n}\n\nexport { Autoplay as default };\n","import { g as getDocument } from '../shared/ssr-window.esm.mjs';\nimport { j as isObject, e as elementChildren } from '../shared/utils.mjs';\n\nfunction Thumb(_ref) {\n let {\n swiper,\n extendParams,\n on\n } = _ref;\n extendParams({\n thumbs: {\n swiper: null,\n multipleActiveThumbs: true,\n autoScrollOffset: 0,\n slideThumbActiveClass: 'swiper-slide-thumb-active',\n thumbsContainerClass: 'swiper-thumbs'\n }\n });\n let initialized = false;\n let swiperCreated = false;\n swiper.thumbs = {\n swiper: null\n };\n function onThumbClick() {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n const clickedIndex = thumbsSwiper.clickedIndex;\n const clickedSlide = thumbsSwiper.clickedSlide;\n if (clickedSlide && clickedSlide.classList.contains(swiper.params.thumbs.slideThumbActiveClass)) return;\n if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;\n let slideToIndex;\n if (thumbsSwiper.params.loop) {\n slideToIndex = parseInt(thumbsSwiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);\n } else {\n slideToIndex = clickedIndex;\n }\n if (swiper.params.loop) {\n swiper.slideToLoop(slideToIndex);\n } else {\n swiper.slideTo(slideToIndex);\n }\n }\n function init() {\n const {\n thumbs: thumbsParams\n } = swiper.params;\n if (initialized) return false;\n initialized = true;\n const SwiperClass = swiper.constructor;\n if (thumbsParams.swiper instanceof SwiperClass) {\n swiper.thumbs.swiper = thumbsParams.swiper;\n Object.assign(swiper.thumbs.swiper.originalParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false\n });\n Object.assign(swiper.thumbs.swiper.params, {\n watchSlidesProgress: true,\n slideToClickedSlide: false\n });\n swiper.thumbs.swiper.update();\n } else if (isObject(thumbsParams.swiper)) {\n const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);\n Object.assign(thumbsSwiperParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false\n });\n swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);\n swiperCreated = true;\n }\n swiper.thumbs.swiper.el.classList.add(swiper.params.thumbs.thumbsContainerClass);\n swiper.thumbs.swiper.on('tap', onThumbClick);\n return true;\n }\n function update(initial) {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n const slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView;\n\n // Activate thumbs\n let thumbsToActivate = 1;\n const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n thumbsToActivate = swiper.params.slidesPerView;\n }\n if (!swiper.params.thumbs.multipleActiveThumbs) {\n thumbsToActivate = 1;\n }\n thumbsToActivate = Math.floor(thumbsToActivate);\n thumbsSwiper.slides.forEach(slideEl => slideEl.classList.remove(thumbActiveClass));\n if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled) {\n for (let i = 0; i < thumbsToActivate; i += 1) {\n elementChildren(thumbsSwiper.slidesEl, `[data-swiper-slide-index=\"${swiper.realIndex + i}\"]`).forEach(slideEl => {\n slideEl.classList.add(thumbActiveClass);\n });\n }\n } else {\n for (let i = 0; i < thumbsToActivate; i += 1) {\n if (thumbsSwiper.slides[swiper.realIndex + i]) {\n thumbsSwiper.slides[swiper.realIndex + i].classList.add(thumbActiveClass);\n }\n }\n }\n const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;\n const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;\n if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {\n const currentThumbsIndex = thumbsSwiper.activeIndex;\n let newThumbsIndex;\n let direction;\n if (thumbsSwiper.params.loop) {\n const newThumbsSlide = thumbsSwiper.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') === `${swiper.realIndex}`)[0];\n newThumbsIndex = thumbsSwiper.slides.indexOf(newThumbsSlide);\n direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';\n } else {\n newThumbsIndex = swiper.realIndex;\n direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';\n }\n if (useOffset) {\n newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;\n }\n if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {\n if (thumbsSwiper.params.centeredSlides) {\n if (newThumbsIndex > currentThumbsIndex) {\n newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;\n } else {\n newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;\n }\n } else if (newThumbsIndex > currentThumbsIndex && thumbsSwiper.params.slidesPerGroup === 1) ;\n thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);\n }\n }\n }\n on('beforeInit', () => {\n const {\n thumbs\n } = swiper.params;\n if (!thumbs || !thumbs.swiper) return;\n if (typeof thumbs.swiper === 'string' || thumbs.swiper instanceof HTMLElement) {\n const document = getDocument();\n const getThumbsElementAndInit = () => {\n const thumbsElement = typeof thumbs.swiper === 'string' ? document.querySelector(thumbs.swiper) : thumbs.swiper;\n if (thumbsElement && thumbsElement.swiper) {\n thumbs.swiper = thumbsElement.swiper;\n init();\n update(true);\n } else if (thumbsElement) {\n const onThumbsSwiper = e => {\n thumbs.swiper = e.detail[0];\n thumbsElement.removeEventListener('init', onThumbsSwiper);\n init();\n update(true);\n thumbs.swiper.update();\n swiper.update();\n };\n thumbsElement.addEventListener('init', onThumbsSwiper);\n }\n return thumbsElement;\n };\n const watchForThumbsToAppear = () => {\n if (swiper.destroyed) return;\n const thumbsElement = getThumbsElementAndInit();\n if (!thumbsElement) {\n requestAnimationFrame(watchForThumbsToAppear);\n }\n };\n requestAnimationFrame(watchForThumbsToAppear);\n } else {\n init();\n update(true);\n }\n });\n on('slideChange update resize observerUpdate', () => {\n update();\n });\n on('setTransition', (_s, duration) => {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n thumbsSwiper.setTransition(duration);\n });\n on('beforeDestroy', () => {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n if (swiperCreated) {\n thumbsSwiper.destroy();\n }\n });\n Object.assign(swiper.thumbs, {\n init,\n update\n });\n}\n\nexport { Thumb as default };\n","import { d as now, i as elementTransitionEnd } from '../shared/utils.mjs';\n\nfunction freeMode(_ref) {\n let {\n swiper,\n extendParams,\n emit,\n once\n } = _ref;\n extendParams({\n freeMode: {\n enabled: false,\n momentum: true,\n momentumRatio: 1,\n momentumBounce: true,\n momentumBounceRatio: 1,\n momentumVelocityRatio: 1,\n sticky: false,\n minimumVelocity: 0.02\n }\n });\n function onTouchStart() {\n if (swiper.params.cssMode) return;\n const translate = swiper.getTranslate();\n swiper.setTranslate(translate);\n swiper.setTransition(0);\n swiper.touchEventsData.velocities.length = 0;\n swiper.freeMode.onTouchEnd({\n currentPos: swiper.rtl ? swiper.translate : -swiper.translate\n });\n }\n function onTouchMove() {\n if (swiper.params.cssMode) return;\n const {\n touchEventsData: data,\n touches\n } = swiper;\n // Velocity\n if (data.velocities.length === 0) {\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n time: data.touchStartTime\n });\n }\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n time: now()\n });\n }\n function onTouchEnd(_ref2) {\n let {\n currentPos\n } = _ref2;\n if (swiper.params.cssMode) return;\n const {\n params,\n wrapperEl,\n rtlTranslate: rtl,\n snapGrid,\n touchEventsData: data\n } = swiper;\n // Time diff\n const touchEndTime = now();\n const timeDiff = touchEndTime - data.touchStartTime;\n if (currentPos < -swiper.minTranslate()) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (currentPos > -swiper.maxTranslate()) {\n if (swiper.slides.length < snapGrid.length) {\n swiper.slideTo(snapGrid.length - 1);\n } else {\n swiper.slideTo(swiper.slides.length - 1);\n }\n return;\n }\n if (params.freeMode.momentum) {\n if (data.velocities.length > 1) {\n const lastMoveEvent = data.velocities.pop();\n const velocityEvent = data.velocities.pop();\n const distance = lastMoveEvent.position - velocityEvent.position;\n const time = lastMoveEvent.time - velocityEvent.time;\n swiper.velocity = distance / time;\n swiper.velocity /= 2;\n if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {\n swiper.velocity = 0;\n }\n // this implies that the user stopped moving a finger then released.\n // There would be no events with distance zero, so the last event is stale.\n if (time > 150 || now() - lastMoveEvent.time > 300) {\n swiper.velocity = 0;\n }\n } else {\n swiper.velocity = 0;\n }\n swiper.velocity *= params.freeMode.momentumVelocityRatio;\n data.velocities.length = 0;\n let momentumDuration = 1000 * params.freeMode.momentumRatio;\n const momentumDistance = swiper.velocity * momentumDuration;\n let newPosition = swiper.translate + momentumDistance;\n if (rtl) newPosition = -newPosition;\n let doBounce = false;\n let afterBouncePosition;\n const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;\n let needsLoopFix;\n if (newPosition < swiper.maxTranslate()) {\n if (params.freeMode.momentumBounce) {\n if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n newPosition = swiper.maxTranslate() - bounceAmount;\n }\n afterBouncePosition = swiper.maxTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.maxTranslate();\n }\n if (params.loop && params.centeredSlides) needsLoopFix = true;\n } else if (newPosition > swiper.minTranslate()) {\n if (params.freeMode.momentumBounce) {\n if (newPosition - swiper.minTranslate() > bounceAmount) {\n newPosition = swiper.minTranslate() + bounceAmount;\n }\n afterBouncePosition = swiper.minTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.minTranslate();\n }\n if (params.loop && params.centeredSlides) needsLoopFix = true;\n } else if (params.freeMode.sticky) {\n let nextSlide;\n for (let j = 0; j < snapGrid.length; j += 1) {\n if (snapGrid[j] > -newPosition) {\n nextSlide = j;\n break;\n }\n }\n if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {\n newPosition = snapGrid[nextSlide];\n } else {\n newPosition = snapGrid[nextSlide - 1];\n }\n newPosition = -newPosition;\n }\n if (needsLoopFix) {\n once('transitionEnd', () => {\n swiper.loopFix();\n });\n }\n // Fix duration\n if (swiper.velocity !== 0) {\n if (rtl) {\n momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n } else {\n momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n }\n if (params.freeMode.sticky) {\n // If freeMode.sticky is active and the user ends a swipe with a slow-velocity\n // event, then durations can be 20+ seconds to slide one (or zero!) slides.\n // It's easy to see this when simulating touch with mouse events. To fix this,\n // limit single-slide swipes to the default slide duration. This also has the\n // nice side effect of matching slide speed if the user stopped moving before\n // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.\n // For faster swipes, also apply limits (albeit higher ones).\n const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);\n const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];\n if (moveDistance < currentSlideSize) {\n momentumDuration = params.speed;\n } else if (moveDistance < 2 * currentSlideSize) {\n momentumDuration = params.speed * 1.5;\n } else {\n momentumDuration = params.speed * 2.5;\n }\n }\n } else if (params.freeMode.sticky) {\n swiper.slideToClosest();\n return;\n }\n if (params.freeMode.momentumBounce && doBounce) {\n swiper.updateProgress(afterBouncePosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n swiper.animating = true;\n elementTransitionEnd(wrapperEl, () => {\n if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;\n emit('momentumBounce');\n swiper.setTransition(params.speed);\n setTimeout(() => {\n swiper.setTranslate(afterBouncePosition);\n elementTransitionEnd(wrapperEl, () => {\n if (!swiper || swiper.destroyed) return;\n swiper.transitionEnd();\n });\n }, 0);\n });\n } else if (swiper.velocity) {\n emit('_freeModeNoMomentumRelease');\n swiper.updateProgress(newPosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n if (!swiper.animating) {\n swiper.animating = true;\n elementTransitionEnd(wrapperEl, () => {\n if (!swiper || swiper.destroyed) return;\n swiper.transitionEnd();\n });\n }\n } else {\n swiper.updateProgress(newPosition);\n }\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n } else if (params.freeMode.sticky) {\n swiper.slideToClosest();\n return;\n } else if (params.freeMode) {\n emit('_freeModeNoMomentumRelease');\n }\n if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n }\n Object.assign(swiper, {\n freeMode: {\n onTouchStart,\n onTouchMove,\n onTouchEnd\n }\n });\n}\n\nexport { freeMode as default };\n","function Grid(_ref) {\n let {\n swiper,\n extendParams,\n on\n } = _ref;\n extendParams({\n grid: {\n rows: 1,\n fill: 'column'\n }\n });\n let slidesNumberEvenToRows;\n let slidesPerRow;\n let numFullColumns;\n let wasMultiRow;\n const getSpaceBetween = () => {\n let spaceBetween = swiper.params.spaceBetween;\n if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;\n } else if (typeof spaceBetween === 'string') {\n spaceBetween = parseFloat(spaceBetween);\n }\n return spaceBetween;\n };\n const initSlides = slidesLength => {\n const {\n slidesPerView\n } = swiper.params;\n const {\n rows,\n fill\n } = swiper.params.grid;\n numFullColumns = Math.floor(slidesLength / rows);\n if (Math.floor(slidesLength / rows) === slidesLength / rows) {\n slidesNumberEvenToRows = slidesLength;\n } else {\n slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;\n }\n if (slidesPerView !== 'auto' && fill === 'row') {\n slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows);\n }\n slidesPerRow = slidesNumberEvenToRows / rows;\n };\n const updateSlide = (i, slide, slidesLength, getDirectionLabel) => {\n const {\n slidesPerGroup\n } = swiper.params;\n const spaceBetween = getSpaceBetween();\n const {\n rows,\n fill\n } = swiper.params.grid;\n // Set slides order\n let newSlideOrderIndex;\n let column;\n let row;\n if (fill === 'row' && slidesPerGroup > 1) {\n const groupIndex = Math.floor(i / (slidesPerGroup * rows));\n const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;\n const columnsInGroup = groupIndex === 0 ? slidesPerGroup : Math.min(Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows), slidesPerGroup);\n row = Math.floor(slideIndexInGroup / columnsInGroup);\n column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;\n newSlideOrderIndex = column + row * slidesNumberEvenToRows / rows;\n slide.style.order = newSlideOrderIndex;\n } else if (fill === 'column') {\n column = Math.floor(i / rows);\n row = i - column * rows;\n if (column > numFullColumns || column === numFullColumns && row === rows - 1) {\n row += 1;\n if (row >= rows) {\n row = 0;\n column += 1;\n }\n }\n } else {\n row = Math.floor(i / slidesPerRow);\n column = i - row * slidesPerRow;\n }\n slide.row = row;\n slide.column = column;\n slide.style[getDirectionLabel('margin-top')] = row !== 0 ? spaceBetween && `${spaceBetween}px` : '';\n };\n const updateWrapperSize = (slideSize, snapGrid, getDirectionLabel) => {\n const {\n centeredSlides,\n roundLengths\n } = swiper.params;\n const spaceBetween = getSpaceBetween();\n const {\n rows\n } = swiper.params.grid;\n swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;\n swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;\n swiper.wrapperEl.style[getDirectionLabel('width')] = `${swiper.virtualSize + spaceBetween}px`;\n if (centeredSlides) {\n const newSlidesGrid = [];\n for (let i = 0; i < snapGrid.length; i += 1) {\n let slidesGridItem = snapGrid[i];\n if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);\n }\n snapGrid.splice(0, snapGrid.length);\n snapGrid.push(...newSlidesGrid);\n }\n };\n const onInit = () => {\n wasMultiRow = swiper.params.grid && swiper.params.grid.rows > 1;\n };\n const onUpdate = () => {\n const {\n params,\n el\n } = swiper;\n const isMultiRow = params.grid && params.grid.rows > 1;\n if (wasMultiRow && !isMultiRow) {\n el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`);\n numFullColumns = 1;\n swiper.emitContainerClasses();\n } else if (!wasMultiRow && isMultiRow) {\n el.classList.add(`${params.containerModifierClass}grid`);\n if (params.grid.fill === 'column') {\n el.classList.add(`${params.containerModifierClass}grid-column`);\n }\n swiper.emitContainerClasses();\n }\n wasMultiRow = isMultiRow;\n };\n on('init', onInit);\n on('update', onUpdate);\n swiper.grid = {\n initSlides,\n updateSlide,\n updateWrapperSize\n };\n}\n\nexport { Grid as default };\n","import { e as effectInit } from '../shared/effect-init.mjs';\nimport { e as effectTarget } from '../shared/effect-target.mjs';\nimport { e as effectVirtualTransitionEnd } from '../shared/effect-virtual-transition-end.mjs';\nimport { k as getSlideTransformEl } from '../shared/utils.mjs';\n\nfunction EffectFade(_ref) {\n let {\n swiper,\n extendParams,\n on\n } = _ref;\n extendParams({\n fadeEffect: {\n crossFade: false\n }\n });\n const setTranslate = () => {\n const {\n slides\n } = swiper;\n const params = swiper.params.fadeEffect;\n for (let i = 0; i < slides.length; i += 1) {\n const slideEl = swiper.slides[i];\n const offset = slideEl.swiperSlideOffset;\n let tx = -offset;\n if (!swiper.params.virtualTranslate) tx -= swiper.translate;\n let ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n }\n const slideOpacity = swiper.params.fadeEffect.crossFade ? Math.max(1 - Math.abs(slideEl.progress), 0) : 1 + Math.min(Math.max(slideEl.progress, -1), 0);\n const targetEl = effectTarget(params, slideEl);\n targetEl.style.opacity = slideOpacity;\n targetEl.style.transform = `translate3d(${tx}px, ${ty}px, 0px)`;\n }\n };\n const setTransition = duration => {\n const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));\n transformElements.forEach(el => {\n el.style.transitionDuration = `${duration}ms`;\n });\n effectVirtualTransitionEnd({\n swiper,\n duration,\n transformElements,\n allSlides: true\n });\n };\n effectInit({\n effect: 'fade',\n swiper,\n on,\n setTranslate,\n setTransition,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: !swiper.params.cssMode\n })\n });\n}\n\nexport { EffectFade as default };\n","import { e as effectInit } from '../shared/effect-init.mjs';\nimport { c as createElement } from '../shared/utils.mjs';\n\nfunction EffectCube(_ref) {\n let {\n swiper,\n extendParams,\n on\n } = _ref;\n extendParams({\n cubeEffect: {\n slideShadows: true,\n shadow: true,\n shadowOffset: 20,\n shadowScale: 0.94\n }\n });\n const createSlideShadows = (slideEl, progress, isHorizontal) => {\n let shadowBefore = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');\n let shadowAfter = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');\n if (!shadowBefore) {\n shadowBefore = createElement('div', `swiper-slide-shadow-cube swiper-slide-shadow-${isHorizontal ? 'left' : 'top'}`.split(' '));\n slideEl.append(shadowBefore);\n }\n if (!shadowAfter) {\n shadowAfter = createElement('div', `swiper-slide-shadow-cube swiper-slide-shadow-${isHorizontal ? 'right' : 'bottom'}`.split(' '));\n slideEl.append(shadowAfter);\n }\n if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);\n if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);\n };\n const recreateShadows = () => {\n // create new ones\n const isHorizontal = swiper.isHorizontal();\n swiper.slides.forEach(slideEl => {\n const progress = Math.max(Math.min(slideEl.progress, 1), -1);\n createSlideShadows(slideEl, progress, isHorizontal);\n });\n };\n const setTranslate = () => {\n const {\n el,\n wrapperEl,\n slides,\n width: swiperWidth,\n height: swiperHeight,\n rtlTranslate: rtl,\n size: swiperSize,\n browser\n } = swiper;\n const params = swiper.params.cubeEffect;\n const isHorizontal = swiper.isHorizontal();\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n let wrapperRotate = 0;\n let cubeShadowEl;\n if (params.shadow) {\n if (isHorizontal) {\n cubeShadowEl = swiper.wrapperEl.querySelector('.swiper-cube-shadow');\n if (!cubeShadowEl) {\n cubeShadowEl = createElement('div', 'swiper-cube-shadow');\n swiper.wrapperEl.append(cubeShadowEl);\n }\n cubeShadowEl.style.height = `${swiperWidth}px`;\n } else {\n cubeShadowEl = el.querySelector('.swiper-cube-shadow');\n if (!cubeShadowEl) {\n cubeShadowEl = createElement('div', 'swiper-cube-shadow');\n el.append(cubeShadowEl);\n }\n }\n }\n for (let i = 0; i < slides.length; i += 1) {\n const slideEl = slides[i];\n let slideIndex = i;\n if (isVirtual) {\n slideIndex = parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10);\n }\n let slideAngle = slideIndex * 90;\n let round = Math.floor(slideAngle / 360);\n if (rtl) {\n slideAngle = -slideAngle;\n round = Math.floor(-slideAngle / 360);\n }\n const progress = Math.max(Math.min(slideEl.progress, 1), -1);\n let tx = 0;\n let ty = 0;\n let tz = 0;\n if (slideIndex % 4 === 0) {\n tx = -round * 4 * swiperSize;\n tz = 0;\n } else if ((slideIndex - 1) % 4 === 0) {\n tx = 0;\n tz = -round * 4 * swiperSize;\n } else if ((slideIndex - 2) % 4 === 0) {\n tx = swiperSize + round * 4 * swiperSize;\n tz = swiperSize;\n } else if ((slideIndex - 3) % 4 === 0) {\n tx = -swiperSize;\n tz = 3 * swiperSize + swiperSize * 4 * round;\n }\n if (rtl) {\n tx = -tx;\n }\n if (!isHorizontal) {\n ty = tx;\n tx = 0;\n }\n const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${isHorizontal ? slideAngle : 0}deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;\n if (progress <= 1 && progress > -1) {\n wrapperRotate = slideIndex * 90 + progress * 90;\n if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;\n }\n slideEl.style.transform = transform;\n if (params.slideShadows) {\n createSlideShadows(slideEl, progress, isHorizontal);\n }\n }\n wrapperEl.style.transformOrigin = `50% 50% -${swiperSize / 2}px`;\n wrapperEl.style['-webkit-transform-origin'] = `50% 50% -${swiperSize / 2}px`;\n if (params.shadow) {\n if (isHorizontal) {\n cubeShadowEl.style.transform = `translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${-swiperWidth / 2}px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`;\n } else {\n const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;\n const multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2);\n const scale1 = params.shadowScale;\n const scale2 = params.shadowScale / multiplier;\n const offset = params.shadowOffset;\n cubeShadowEl.style.transform = `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${-swiperHeight / 2 / scale2}px) rotateX(-90deg)`;\n }\n }\n const zFactor = (browser.isSafari || browser.isWebView) && browser.needPerspectiveFix ? -swiperSize / 2 : 0;\n wrapperEl.style.transform = `translate3d(0px,0,${zFactor}px) rotateX(${swiper.isHorizontal() ? 0 : wrapperRotate}deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`;\n wrapperEl.style.setProperty('--swiper-cube-translate-z', `${zFactor}px`);\n };\n const setTransition = duration => {\n const {\n el,\n slides\n } = swiper;\n slides.forEach(slideEl => {\n slideEl.style.transitionDuration = `${duration}ms`;\n slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(subEl => {\n subEl.style.transitionDuration = `${duration}ms`;\n });\n });\n if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n const shadowEl = el.querySelector('.swiper-cube-shadow');\n if (shadowEl) shadowEl.style.transitionDuration = `${duration}ms`;\n }\n };\n effectInit({\n effect: 'cube',\n swiper,\n on,\n setTranslate,\n setTransition,\n recreateShadows,\n getEffectParams: () => swiper.params.cubeEffect,\n perspective: () => true,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n resistanceRatio: 0,\n spaceBetween: 0,\n centeredSlides: false,\n virtualTranslate: true\n })\n });\n}\n\nexport { EffectCube as default };\n","import { c as createShadow } from '../shared/create-shadow.mjs';\nimport { e as effectInit } from '../shared/effect-init.mjs';\nimport { e as effectTarget } from '../shared/effect-target.mjs';\nimport { e as effectVirtualTransitionEnd } from '../shared/effect-virtual-transition-end.mjs';\nimport { k as getSlideTransformEl } from '../shared/utils.mjs';\n\nfunction EffectFlip(_ref) {\n let {\n swiper,\n extendParams,\n on\n } = _ref;\n extendParams({\n flipEffect: {\n slideShadows: true,\n limitRotation: true\n }\n });\n const createSlideShadows = (slideEl, progress) => {\n let shadowBefore = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');\n let shadowAfter = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');\n if (!shadowBefore) {\n shadowBefore = createShadow('flip', slideEl, swiper.isHorizontal() ? 'left' : 'top');\n }\n if (!shadowAfter) {\n shadowAfter = createShadow('flip', slideEl, swiper.isHorizontal() ? 'right' : 'bottom');\n }\n if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);\n if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);\n };\n const recreateShadows = () => {\n // Set shadows\n swiper.params.flipEffect;\n swiper.slides.forEach(slideEl => {\n let progress = slideEl.progress;\n if (swiper.params.flipEffect.limitRotation) {\n progress = Math.max(Math.min(slideEl.progress, 1), -1);\n }\n createSlideShadows(slideEl, progress);\n });\n };\n const setTranslate = () => {\n const {\n slides,\n rtlTranslate: rtl\n } = swiper;\n const params = swiper.params.flipEffect;\n for (let i = 0; i < slides.length; i += 1) {\n const slideEl = slides[i];\n let progress = slideEl.progress;\n if (swiper.params.flipEffect.limitRotation) {\n progress = Math.max(Math.min(slideEl.progress, 1), -1);\n }\n const offset = slideEl.swiperSlideOffset;\n const rotate = -180 * progress;\n let rotateY = rotate;\n let rotateX = 0;\n let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n let ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n rotateX = -rotateY;\n rotateY = 0;\n } else if (rtl) {\n rotateY = -rotateY;\n }\n slideEl.style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n if (params.slideShadows) {\n createSlideShadows(slideEl, progress);\n }\n const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;\n const targetEl = effectTarget(params, slideEl);\n targetEl.style.transform = transform;\n }\n };\n const setTransition = duration => {\n const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));\n transformElements.forEach(el => {\n el.style.transitionDuration = `${duration}ms`;\n el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => {\n shadowEl.style.transitionDuration = `${duration}ms`;\n });\n });\n effectVirtualTransitionEnd({\n swiper,\n duration,\n transformElements\n });\n };\n effectInit({\n effect: 'flip',\n swiper,\n on,\n setTranslate,\n setTransition,\n recreateShadows,\n getEffectParams: () => swiper.params.flipEffect,\n perspective: () => true,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: !swiper.params.cssMode\n })\n });\n}\n\nexport { EffectFlip as default };\n","import { c as createShadow } from '../shared/create-shadow.mjs';\nimport { e as effectInit } from '../shared/effect-init.mjs';\nimport { e as effectTarget } from '../shared/effect-target.mjs';\nimport { k as getSlideTransformEl } from '../shared/utils.mjs';\n\nfunction EffectCoverflow(_ref) {\n let {\n swiper,\n extendParams,\n on\n } = _ref;\n extendParams({\n coverflowEffect: {\n rotate: 50,\n stretch: 0,\n depth: 100,\n scale: 1,\n modifier: 1,\n slideShadows: true\n }\n });\n const setTranslate = () => {\n const {\n width: swiperWidth,\n height: swiperHeight,\n slides,\n slidesSizesGrid\n } = swiper;\n const params = swiper.params.coverflowEffect;\n const isHorizontal = swiper.isHorizontal();\n const transform = swiper.translate;\n const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;\n const rotate = isHorizontal ? params.rotate : -params.rotate;\n const translate = params.depth;\n // Each slide offset from center\n for (let i = 0, length = slides.length; i < length; i += 1) {\n const slideEl = slides[i];\n const slideSize = slidesSizesGrid[i];\n const slideOffset = slideEl.swiperSlideOffset;\n const centerOffset = (center - slideOffset - slideSize / 2) / slideSize;\n const offsetMultiplier = typeof params.modifier === 'function' ? params.modifier(centerOffset) : centerOffset * params.modifier;\n let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;\n // var rotateZ = 0\n let translateZ = -translate * Math.abs(offsetMultiplier);\n let stretch = params.stretch;\n // Allow percentage to make a relative stretch for responsive sliders\n if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {\n stretch = parseFloat(params.stretch) / 100 * slideSize;\n }\n let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;\n let translateX = isHorizontal ? stretch * offsetMultiplier : 0;\n let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);\n\n // Fix for ultra small values\n if (Math.abs(translateX) < 0.001) translateX = 0;\n if (Math.abs(translateY) < 0.001) translateY = 0;\n if (Math.abs(translateZ) < 0.001) translateZ = 0;\n if (Math.abs(rotateY) < 0.001) rotateY = 0;\n if (Math.abs(rotateX) < 0.001) rotateX = 0;\n if (Math.abs(scale) < 0.001) scale = 0;\n const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`;\n const targetEl = effectTarget(params, slideEl);\n targetEl.style.transform = slideTransform;\n slideEl.style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n if (params.slideShadows) {\n // Set shadows\n let shadowBeforeEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');\n let shadowAfterEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');\n if (!shadowBeforeEl) {\n shadowBeforeEl = createShadow('coverflow', slideEl, isHorizontal ? 'left' : 'top');\n }\n if (!shadowAfterEl) {\n shadowAfterEl = createShadow('coverflow', slideEl, isHorizontal ? 'right' : 'bottom');\n }\n if (shadowBeforeEl) shadowBeforeEl.style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;\n if (shadowAfterEl) shadowAfterEl.style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;\n }\n }\n };\n const setTransition = duration => {\n const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));\n transformElements.forEach(el => {\n el.style.transitionDuration = `${duration}ms`;\n el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => {\n shadowEl.style.transitionDuration = `${duration}ms`;\n });\n });\n };\n effectInit({\n effect: 'coverflow',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n watchSlidesProgress: true\n })\n });\n}\n\nexport { EffectCoverflow as default };\n","import { c as createShadow } from '../shared/create-shadow.mjs';\nimport { e as effectInit } from '../shared/effect-init.mjs';\nimport { e as effectTarget } from '../shared/effect-target.mjs';\nimport { e as effectVirtualTransitionEnd } from '../shared/effect-virtual-transition-end.mjs';\nimport { k as getSlideTransformEl } from '../shared/utils.mjs';\n\nfunction EffectCreative(_ref) {\n let {\n swiper,\n extendParams,\n on\n } = _ref;\n extendParams({\n creativeEffect: {\n limitProgress: 1,\n shadowPerProgress: false,\n progressMultiplier: 1,\n perspective: true,\n prev: {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n opacity: 1,\n scale: 1\n },\n next: {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n opacity: 1,\n scale: 1\n }\n }\n });\n const getTranslateValue = value => {\n if (typeof value === 'string') return value;\n return `${value}px`;\n };\n const setTranslate = () => {\n const {\n slides,\n wrapperEl,\n slidesSizesGrid\n } = swiper;\n const params = swiper.params.creativeEffect;\n const {\n progressMultiplier: multiplier\n } = params;\n const isCenteredSlides = swiper.params.centeredSlides;\n if (isCenteredSlides) {\n const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0;\n wrapperEl.style.transform = `translateX(calc(50% - ${margin}px))`;\n }\n for (let i = 0; i < slides.length; i += 1) {\n const slideEl = slides[i];\n const slideProgress = slideEl.progress;\n const progress = Math.min(Math.max(slideEl.progress, -params.limitProgress), params.limitProgress);\n let originalProgress = progress;\n if (!isCenteredSlides) {\n originalProgress = Math.min(Math.max(slideEl.originalProgress, -params.limitProgress), params.limitProgress);\n }\n const offset = slideEl.swiperSlideOffset;\n const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];\n const r = [0, 0, 0];\n let custom = false;\n if (!swiper.isHorizontal()) {\n t[1] = t[0];\n t[0] = 0;\n }\n let data = {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n scale: 1,\n opacity: 1\n };\n if (progress < 0) {\n data = params.next;\n custom = true;\n } else if (progress > 0) {\n data = params.prev;\n custom = true;\n }\n // set translate\n t.forEach((value, index) => {\n t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(progress * multiplier)}))`;\n });\n // set rotates\n r.forEach((value, index) => {\n r[index] = data.rotate[index] * Math.abs(progress * multiplier);\n });\n slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n const translateString = t.join(', ');\n const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`;\n const scaleString = originalProgress < 0 ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})` : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`;\n const opacityString = originalProgress < 0 ? 1 + (1 - data.opacity) * originalProgress * multiplier : 1 - (1 - data.opacity) * originalProgress * multiplier;\n const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`;\n\n // Set shadows\n if (custom && data.shadow || !custom) {\n let shadowEl = slideEl.querySelector('.swiper-slide-shadow');\n if (!shadowEl && data.shadow) {\n shadowEl = createShadow('creative', slideEl);\n }\n if (shadowEl) {\n const shadowOpacity = params.shadowPerProgress ? progress * (1 / params.limitProgress) : progress;\n shadowEl.style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);\n }\n }\n const targetEl = effectTarget(params, slideEl);\n targetEl.style.transform = transform;\n targetEl.style.opacity = opacityString;\n if (data.origin) {\n targetEl.style.transformOrigin = data.origin;\n }\n }\n };\n const setTransition = duration => {\n const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));\n transformElements.forEach(el => {\n el.style.transitionDuration = `${duration}ms`;\n el.querySelectorAll('.swiper-slide-shadow').forEach(shadowEl => {\n shadowEl.style.transitionDuration = `${duration}ms`;\n });\n });\n effectVirtualTransitionEnd({\n swiper,\n duration,\n transformElements,\n allSlides: true\n });\n };\n effectInit({\n effect: 'creative',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => swiper.params.creativeEffect.perspective,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n virtualTranslate: !swiper.params.cssMode\n })\n });\n}\n\nexport { EffectCreative as default };\n","import { c as createShadow } from '../shared/create-shadow.mjs';\nimport { e as effectInit } from '../shared/effect-init.mjs';\nimport { e as effectTarget } from '../shared/effect-target.mjs';\nimport { e as effectVirtualTransitionEnd } from '../shared/effect-virtual-transition-end.mjs';\nimport { k as getSlideTransformEl } from '../shared/utils.mjs';\n\nfunction EffectCards(_ref) {\n let {\n swiper,\n extendParams,\n on\n } = _ref;\n extendParams({\n cardsEffect: {\n slideShadows: true,\n rotate: true,\n perSlideRotate: 2,\n perSlideOffset: 8\n }\n });\n const setTranslate = () => {\n const {\n slides,\n activeIndex,\n rtlTranslate: rtl\n } = swiper;\n const params = swiper.params.cardsEffect;\n const {\n startTranslate,\n isTouched\n } = swiper.touchEventsData;\n const currentTranslate = rtl ? -swiper.translate : swiper.translate;\n for (let i = 0; i < slides.length; i += 1) {\n const slideEl = slides[i];\n const slideProgress = slideEl.progress;\n const progress = Math.min(Math.max(slideProgress, -4), 4);\n let offset = slideEl.swiperSlideOffset;\n if (swiper.params.centeredSlides && !swiper.params.cssMode) {\n swiper.wrapperEl.style.transform = `translateX(${swiper.minTranslate()}px)`;\n }\n if (swiper.params.centeredSlides && swiper.params.cssMode) {\n offset -= slides[0].swiperSlideOffset;\n }\n let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n let tY = 0;\n const tZ = -100 * Math.abs(progress);\n let scale = 1;\n let rotate = -params.perSlideRotate * progress;\n let tXAdd = params.perSlideOffset - Math.abs(progress) * 0.75;\n const slideIndex = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.from + i : i;\n const isSwipeToNext = (slideIndex === activeIndex || slideIndex === activeIndex - 1) && progress > 0 && progress < 1 && (isTouched || swiper.params.cssMode) && currentTranslate < startTranslate;\n const isSwipeToPrev = (slideIndex === activeIndex || slideIndex === activeIndex + 1) && progress < 0 && progress > -1 && (isTouched || swiper.params.cssMode) && currentTranslate > startTranslate;\n if (isSwipeToNext || isSwipeToPrev) {\n const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;\n rotate += -28 * progress * subProgress;\n scale += -0.5 * subProgress;\n tXAdd += 96 * subProgress;\n tY = `${-25 * subProgress * Math.abs(progress)}%`;\n }\n if (progress < 0) {\n // next\n tX = `calc(${tX}px ${rtl ? '-' : '+'} (${tXAdd * Math.abs(progress)}%))`;\n } else if (progress > 0) {\n // prev\n tX = `calc(${tX}px ${rtl ? '-' : '+'} (-${tXAdd * Math.abs(progress)}%))`;\n } else {\n tX = `${tX}px`;\n }\n if (!swiper.isHorizontal()) {\n const prevY = tY;\n tY = tX;\n tX = prevY;\n }\n const scaleString = progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;\n\n /* eslint-disable */\n const transform = `\n translate3d(${tX}, ${tY}, ${tZ}px)\n rotateZ(${params.rotate ? rtl ? -rotate : rotate : 0}deg)\n scale(${scaleString})\n `;\n /* eslint-enable */\n\n if (params.slideShadows) {\n // Set shadows\n let shadowEl = slideEl.querySelector('.swiper-slide-shadow');\n if (!shadowEl) {\n shadowEl = createShadow('cards', slideEl);\n }\n if (shadowEl) shadowEl.style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);\n }\n slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n const targetEl = effectTarget(params, slideEl);\n targetEl.style.transform = transform;\n }\n };\n const setTransition = duration => {\n const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));\n transformElements.forEach(el => {\n el.style.transitionDuration = `${duration}ms`;\n el.querySelectorAll('.swiper-slide-shadow').forEach(shadowEl => {\n shadowEl.style.transitionDuration = `${duration}ms`;\n });\n });\n effectVirtualTransitionEnd({\n swiper,\n duration,\n transformElements\n });\n };\n effectInit({\n effect: 'cards',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n virtualTranslate: !swiper.params.cssMode\n })\n });\n}\n\nexport { EffectCards as default };\n","/* underscore in name -> watch for changes */\nconst paramsList = ['eventsPrefix', 'injectStyles', 'injectStylesUrls', 'modules', 'init', '_direction', 'oneWayMovement', 'touchEventsTarget', 'initialSlide', '_speed', 'cssMode', 'updateOnWindowResize', 'resizeObserver', 'nested', 'focusableElements', '_enabled', '_width', '_height', 'preventInteractionOnTransition', 'userAgent', 'url', '_edgeSwipeDetection', '_edgeSwipeThreshold', '_freeMode', '_autoHeight', 'setWrapperSize', 'virtualTranslate', '_effect', 'breakpoints', 'breakpointsBase', '_spaceBetween', '_slidesPerView', 'maxBackfaceHiddenSlides', '_grid', '_slidesPerGroup', '_slidesPerGroupSkip', '_slidesPerGroupAuto', '_centeredSlides', '_centeredSlidesBounds', '_slidesOffsetBefore', '_slidesOffsetAfter', 'normalizeSlideIndex', '_centerInsufficientSlides', '_watchOverflow', 'roundLengths', 'touchRatio', 'touchAngle', 'simulateTouch', '_shortSwipes', '_longSwipes', 'longSwipesRatio', 'longSwipesMs', '_followFinger', 'allowTouchMove', '_threshold', 'touchMoveStopPropagation', 'touchStartPreventDefault', 'touchStartForcePreventDefault', 'touchReleaseOnEdges', 'uniqueNavElements', '_resistance', '_resistanceRatio', '_watchSlidesProgress', '_grabCursor', 'preventClicks', 'preventClicksPropagation', '_slideToClickedSlide', '_loop', 'loopedSlides', 'loopPreventsSliding', '_rewind', '_allowSlidePrev', '_allowSlideNext', '_swipeHandler', '_noSwiping', 'noSwipingClass', 'noSwipingSelector', 'passiveListeners', 'containerModifierClass', 'slideClass', 'slideActiveClass', 'slideVisibleClass', 'slideNextClass', 'slidePrevClass', 'wrapperClass', 'lazyPreloaderClass', 'lazyPreloadPrevNext', 'runCallbacksOnInit', 'observer', 'observeParents', 'observeSlideChildren',\n// modules\n'a11y', '_autoplay', '_controller', 'coverflowEffect', 'cubeEffect', 'fadeEffect', 'flipEffect', 'creativeEffect', 'cardsEffect', 'hashNavigation', 'history', 'keyboard', 'mousewheel', '_navigation', '_pagination', 'parallax', '_scrollbar', '_thumbs', 'virtual', 'zoom', 'control'];\n\nfunction isObject(o) {\n return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object' && !o.__swiper__;\n}\nfunction extend(target, src) {\n const noExtend = ['__proto__', 'constructor', 'prototype'];\n Object.keys(src).filter(key => noExtend.indexOf(key) < 0).forEach(key => {\n if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {\n if (src[key].__swiper__) target[key] = src[key];else extend(target[key], src[key]);\n } else {\n target[key] = src[key];\n }\n });\n}\nfunction needsNavigation(params) {\n if (params === void 0) {\n params = {};\n }\n return params.navigation && typeof params.navigation.nextEl === 'undefined' && typeof params.navigation.prevEl === 'undefined';\n}\nfunction needsPagination(params) {\n if (params === void 0) {\n params = {};\n }\n return params.pagination && typeof params.pagination.el === 'undefined';\n}\nfunction needsScrollbar(params) {\n if (params === void 0) {\n params = {};\n }\n return params.scrollbar && typeof params.scrollbar.el === 'undefined';\n}\nfunction uniqueClasses(classNames) {\n if (classNames === void 0) {\n classNames = '';\n }\n const classes = classNames.split(' ').map(c => c.trim()).filter(c => !!c);\n const unique = [];\n classes.forEach(c => {\n if (unique.indexOf(c) < 0) unique.push(c);\n });\n return unique.join(' ');\n}\nfunction attrToProp(attrName) {\n if (attrName === void 0) {\n attrName = '';\n }\n return attrName.replace(/-[a-z]/g, l => l.toUpperCase().replace('-', ''));\n}\nfunction wrapperClass(className) {\n if (className === void 0) {\n className = '';\n }\n if (!className) return 'swiper-wrapper';\n if (!className.includes('swiper-wrapper')) return `swiper-wrapper ${className}`;\n return className;\n}\n\nfunction updateSwiper(_ref) {\n let {\n swiper,\n slides,\n passedParams,\n changedParams,\n nextEl,\n prevEl,\n scrollbarEl,\n paginationEl\n } = _ref;\n const updateParams = changedParams.filter(key => key !== 'children' && key !== 'direction' && key !== 'wrapperClass');\n const {\n params: currentParams,\n pagination,\n navigation,\n scrollbar,\n virtual,\n thumbs\n } = swiper;\n let needThumbsInit;\n let needControllerInit;\n let needPaginationInit;\n let needScrollbarInit;\n let needNavigationInit;\n let loopNeedDestroy;\n let loopNeedEnable;\n let loopNeedReloop;\n if (changedParams.includes('thumbs') && passedParams.thumbs && passedParams.thumbs.swiper && currentParams.thumbs && !currentParams.thumbs.swiper) {\n needThumbsInit = true;\n }\n if (changedParams.includes('controller') && passedParams.controller && passedParams.controller.control && currentParams.controller && !currentParams.controller.control) {\n needControllerInit = true;\n }\n if (changedParams.includes('pagination') && passedParams.pagination && (passedParams.pagination.el || paginationEl) && (currentParams.pagination || currentParams.pagination === false) && pagination && !pagination.el) {\n needPaginationInit = true;\n }\n if (changedParams.includes('scrollbar') && passedParams.scrollbar && (passedParams.scrollbar.el || scrollbarEl) && (currentParams.scrollbar || currentParams.scrollbar === false) && scrollbar && !scrollbar.el) {\n needScrollbarInit = true;\n }\n if (changedParams.includes('navigation') && passedParams.navigation && (passedParams.navigation.prevEl || prevEl) && (passedParams.navigation.nextEl || nextEl) && (currentParams.navigation || currentParams.navigation === false) && navigation && !navigation.prevEl && !navigation.nextEl) {\n needNavigationInit = true;\n }\n const destroyModule = mod => {\n if (!swiper[mod]) return;\n swiper[mod].destroy();\n if (mod === 'navigation') {\n if (swiper.isElement) {\n swiper[mod].prevEl.remove();\n swiper[mod].nextEl.remove();\n }\n currentParams[mod].prevEl = undefined;\n currentParams[mod].nextEl = undefined;\n swiper[mod].prevEl = undefined;\n swiper[mod].nextEl = undefined;\n } else {\n if (swiper.isElement) {\n swiper[mod].el.remove();\n }\n currentParams[mod].el = undefined;\n swiper[mod].el = undefined;\n }\n };\n if (changedParams.includes('loop') && swiper.isElement) {\n if (currentParams.loop && !passedParams.loop) {\n loopNeedDestroy = true;\n } else if (!currentParams.loop && passedParams.loop) {\n loopNeedEnable = true;\n } else {\n loopNeedReloop = true;\n }\n }\n updateParams.forEach(key => {\n if (isObject(currentParams[key]) && isObject(passedParams[key])) {\n extend(currentParams[key], passedParams[key]);\n if ((key === 'navigation' || key === 'pagination' || key === 'scrollbar') && 'enabled' in passedParams[key] && !passedParams[key].enabled) {\n destroyModule(key);\n }\n } else {\n const newValue = passedParams[key];\n if ((newValue === true || newValue === false) && (key === 'navigation' || key === 'pagination' || key === 'scrollbar')) {\n if (newValue === false) {\n destroyModule(key);\n }\n } else {\n currentParams[key] = passedParams[key];\n }\n }\n });\n if (updateParams.includes('controller') && !needControllerInit && swiper.controller && swiper.controller.control && currentParams.controller && currentParams.controller.control) {\n swiper.controller.control = currentParams.controller.control;\n }\n if (changedParams.includes('children') && slides && virtual && currentParams.virtual.enabled) {\n virtual.slides = slides;\n virtual.update(true);\n }\n if (changedParams.includes('children') && slides && currentParams.loop) {\n loopNeedReloop = true;\n }\n if (needThumbsInit) {\n const initialized = thumbs.init();\n if (initialized) thumbs.update(true);\n }\n if (needControllerInit) {\n swiper.controller.control = currentParams.controller.control;\n }\n if (needPaginationInit) {\n if (swiper.isElement && (!paginationEl || typeof paginationEl === 'string')) {\n paginationEl = document.createElement('div');\n paginationEl.classList.add('swiper-pagination');\n paginationEl.part.add('pagination');\n swiper.el.appendChild(paginationEl);\n }\n if (paginationEl) currentParams.pagination.el = paginationEl;\n pagination.init();\n pagination.render();\n pagination.update();\n }\n if (needScrollbarInit) {\n if (swiper.isElement && (!scrollbarEl || typeof scrollbarEl === 'string')) {\n scrollbarEl = document.createElement('div');\n scrollbarEl.classList.add('swiper-scrollbar');\n scrollbarEl.part.add('scrollbar');\n swiper.el.appendChild(scrollbarEl);\n }\n if (scrollbarEl) currentParams.scrollbar.el = scrollbarEl;\n scrollbar.init();\n scrollbar.updateSize();\n scrollbar.setTranslate();\n }\n if (needNavigationInit) {\n if (swiper.isElement) {\n if (!nextEl || typeof nextEl === 'string') {\n nextEl = document.createElement('div');\n nextEl.classList.add('swiper-button-next');\n nextEl.innerHTML = swiper.hostEl.constructor.nextButtonSvg;\n nextEl.part.add('button-next');\n swiper.el.appendChild(nextEl);\n }\n if (!prevEl || typeof prevEl === 'string') {\n prevEl = document.createElement('div');\n prevEl.classList.add('swiper-button-prev');\n prevEl.innerHTML = swiper.hostEl.constructor.prevButtonSvg;\n prevEl.part.add('button-prev');\n swiper.el.appendChild(prevEl);\n }\n }\n if (nextEl) currentParams.navigation.nextEl = nextEl;\n if (prevEl) currentParams.navigation.prevEl = prevEl;\n navigation.init();\n navigation.update();\n }\n if (changedParams.includes('allowSlideNext')) {\n swiper.allowSlideNext = passedParams.allowSlideNext;\n }\n if (changedParams.includes('allowSlidePrev')) {\n swiper.allowSlidePrev = passedParams.allowSlidePrev;\n }\n if (changedParams.includes('direction')) {\n swiper.changeDirection(passedParams.direction, false);\n }\n if (loopNeedDestroy || loopNeedReloop) {\n swiper.loopDestroy();\n }\n if (loopNeedEnable || loopNeedReloop) {\n swiper.loopCreate();\n }\n swiper.update();\n}\n\nexport { needsPagination as a, needsScrollbar as b, attrToProp as c, uniqueClasses as d, extend as e, isObject as i, needsNavigation as n, paramsList as p, updateSwiper as u, wrapperClass as w };\n","import { e as extend, i as isObject, c as attrToProp, p as paramsList } from './update-swiper.mjs';\nimport { d as defaults } from './swiper-core.mjs';\n\nconst formatValue = val => {\n if (parseFloat(val) === Number(val)) return Number(val);\n if (val === 'true') return true;\n if (val === '') return true;\n if (val === 'false') return false;\n if (val === 'null') return null;\n if (val === 'undefined') return undefined;\n if (typeof val === 'string' && val.includes('{') && val.includes('}') && val.includes('\"')) {\n let v;\n try {\n v = JSON.parse(val);\n } catch (err) {\n v = val;\n }\n return v;\n }\n return val;\n};\nconst modulesParamsList = ['a11y', 'autoplay', 'controller', 'cards-effect', 'coverflow-effect', 'creative-effect', 'cube-effect', 'fade-effect', 'flip-effect', 'free-mode', 'grid', 'hash-navigation', 'history', 'keyboard', 'mousewheel', 'navigation', 'pagination', 'parallax', 'scrollbar', 'thumbs', 'virtual', 'zoom'];\nfunction getParams(element, propName, propValue) {\n const params = {};\n const passedParams = {};\n extend(params, defaults);\n const localParamsList = [...paramsList, 'on'];\n const allowedParams = localParamsList.map(key => key.replace(/_/, ''));\n\n // First check props\n localParamsList.forEach(paramName => {\n paramName = paramName.replace('_', '');\n if (typeof element[paramName] !== 'undefined') {\n passedParams[paramName] = element[paramName];\n }\n });\n\n // Attributes\n const attrsList = [...element.attributes];\n if (typeof propName === 'string' && typeof propValue !== 'undefined') {\n attrsList.push({\n name: propName,\n value: isObject(propValue) ? {\n ...propValue\n } : propValue\n });\n }\n attrsList.forEach(attr => {\n const moduleParam = modulesParamsList.filter(mParam => attr.name.indexOf(`${mParam}-`) === 0)[0];\n if (moduleParam) {\n const parentObjName = attrToProp(moduleParam);\n const subObjName = attrToProp(attr.name.split(`${moduleParam}-`)[1]);\n if (typeof passedParams[parentObjName] === 'undefined') passedParams[parentObjName] = {};\n if (passedParams[parentObjName] === true) {\n passedParams[parentObjName] = {\n enabled: true\n };\n }\n passedParams[parentObjName][subObjName] = formatValue(attr.value);\n } else {\n const name = attrToProp(attr.name);\n if (!allowedParams.includes(name)) return;\n const value = formatValue(attr.value);\n if (passedParams[name] && modulesParamsList.includes(attr.name) && !isObject(value)) {\n if (passedParams[name].constructor !== Object) {\n passedParams[name] = {};\n }\n passedParams[name].enabled = !!value;\n } else {\n passedParams[name] = value;\n }\n }\n });\n extend(params, passedParams);\n if (params.navigation) {\n params.navigation = {\n prevEl: '.swiper-button-prev',\n nextEl: '.swiper-button-next',\n ...(params.navigation !== true ? params.navigation : {})\n };\n } else if (params.navigation === false) {\n delete params.navigation;\n }\n if (params.scrollbar) {\n params.scrollbar = {\n el: '.swiper-scrollbar',\n ...(params.scrollbar !== true ? params.scrollbar : {})\n };\n } else if (params.scrollbar === false) {\n delete params.scrollbar;\n }\n if (params.pagination) {\n params.pagination = {\n el: '.swiper-pagination',\n ...(params.pagination !== true ? params.pagination : {})\n };\n } else if (params.pagination === false) {\n delete params.pagination;\n }\n return {\n params,\n passedParams\n };\n}\n\nexport { getParams as g };\n","/**\n * Swiper Custom Element 10.3.1\n * Most modern mobile touch slider and framework with hardware accelerated transitions\n * https://swiperjs.com\n *\n * Copyright 2014-2023 Vladimir Kharlampidi\n *\n * Released under the MIT License\n *\n * Released on: September 28, 2023\n */\n\nimport './swiper-bundle.mjs';\nimport { p as paramsList, n as needsNavigation, a as needsPagination, b as needsScrollbar, u as updateSwiper, c as attrToProp } from './shared/update-swiper.mjs';\nimport { g as getParams } from './shared/get-element-params.mjs';\nimport { S as Swiper } from './shared/swiper-core.mjs';\n\n/* eslint-disable spaced-comment */\n\nconst SwiperCSS = `:host{--swiper-theme-color:#007aff}:host{position:relative;display:block;margin-left:auto;margin-right:auto;z-index:1}.swiper{width:100%;height:100%;margin-left:auto;margin-right:auto;position:relative;overflow:hidden;overflow:clip;list-style:none;padding:0;z-index:1;display:block}.swiper-vertical>.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;transition-timing-function:var(--swiper-wrapper-transition-timing-function,initial);box-sizing:content-box}.swiper-android ::slotted(swiper-slide),.swiper-ios ::slotted(swiper-slide),.swiper-wrapper{transform:translate3d(0px,0,0)}.swiper-horizontal{touch-action:pan-y}.swiper-vertical{touch-action:pan-x}::slotted(swiper-slide){flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform;display:block}::slotted(.swiper-slide-invisible-blank){visibility:hidden}.swiper-autoheight,.swiper-autoheight ::slotted(swiper-slide){height:auto}.swiper-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-backface-hidden ::slotted(swiper-slide){transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-3d.swiper-css-mode .swiper-wrapper{perspective:1200px}.swiper-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-3d{perspective:1200px}.swiper-3d .swiper-cube-shadow,.swiper-3d ::slotted(swiper-slide){transform-style:preserve-3d}.swiper-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.swiper-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-css-mode ::slotted(swiper-slide){scroll-snap-align:start start}.swiper-css-mode.swiper-horizontal>.swiper-wrapper{scroll-snap-type:x mandatory}.swiper-css-mode.swiper-vertical>.swiper-wrapper{scroll-snap-type:y mandatory}.swiper-css-mode.swiper-free-mode>.swiper-wrapper{scroll-snap-type:none}.swiper-css-mode.swiper-free-mode ::slotted(swiper-slide){scroll-snap-align:none}.swiper-css-mode.swiper-centered>.swiper-wrapper::before{content:'';flex-shrink:0;order:9999}.swiper-css-mode.swiper-centered ::slotted(swiper-slide){scroll-snap-align:center center;scroll-snap-stop:always}.swiper-css-mode.swiper-centered.swiper-horizontal ::slotted(swiper-slide):first-child{margin-inline-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper::before{height:100%;min-height:1px;width:var(--swiper-centered-offset-after)}.swiper-css-mode.swiper-centered.swiper-vertical ::slotted(swiper-slide):first-child{margin-block-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper::before{width:100%;min-width:1px;height:var(--swiper-centered-offset-after)}.swiper-virtual ::slotted(swiper-slide){-webkit-backface-visibility:hidden;transform:translateZ(0)}.swiper-virtual.swiper-css-mode .swiper-wrapper::after{content:'';position:absolute;left:0;top:0;pointer-events:none}.swiper-virtual.swiper-css-mode.swiper-horizontal .swiper-wrapper::after{height:1px;width:var(--swiper-virtual-size)}.swiper-virtual.swiper-css-mode.swiper-vertical .swiper-wrapper::after{width:1px;height:var(--swiper-virtual-size)}:host{--swiper-navigation-size:44px}.swiper-button-next,.swiper-button-prev{position:absolute;top:var(--swiper-navigation-top-offset,50%);width:calc(var(--swiper-navigation-size)/ 44 * 27);height:var(--swiper-navigation-size);margin-top:calc(0px - (var(--swiper-navigation-size)/ 2));z-index:10;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--swiper-navigation-color,var(--swiper-theme-color))}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-next.swiper-button-hidden,.swiper-button-prev.swiper-button-hidden{opacity:0;cursor:auto;pointer-events:none}.swiper-navigation-disabled .swiper-button-next,.swiper-navigation-disabled .swiper-button-prev{display:none!important}.swiper-button-next svg,.swiper-button-prev svg{width:100%;height:100%;object-fit:contain;transform-origin:center}.swiper-rtl .swiper-button-next svg,.swiper-rtl .swiper-button-prev svg{transform:rotate(180deg)}.swiper-button-prev,.swiper-rtl .swiper-button-next{left:var(--swiper-navigation-sides-offset,10px);right:auto}.swiper-button-next,.swiper-rtl .swiper-button-prev{right:var(--swiper-navigation-sides-offset,10px);left:auto}.swiper-button-lock{display:none}.swiper-pagination{position:absolute;text-align:center;transition:.3s opacity;transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-pagination-disabled>.swiper-pagination,.swiper-pagination.swiper-pagination-disabled{display:none!important}.swiper-horizontal>.swiper-pagination-bullets,.swiper-pagination-bullets.swiper-pagination-horizontal,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:var(--swiper-pagination-bottom,8px);top:var(--swiper-pagination-top,auto);left:0;width:100%}.swiper-pagination-bullets-dynamic{overflow:hidden;font-size:0}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transform:scale(.33);position:relative}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev{transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next{transform:scale(.33)}.swiper-pagination-bullet{width:var(--swiper-pagination-bullet-width,var(--swiper-pagination-bullet-size,8px));height:var(--swiper-pagination-bullet-height,var(--swiper-pagination-bullet-size,8px));display:inline-block;border-radius:var(--swiper-pagination-bullet-border-radius,50%);background:var(--swiper-pagination-bullet-inactive-color,#000);opacity:var(--swiper-pagination-bullet-inactive-opacity, .2)}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-bullet:only-child{display:none!important}.swiper-pagination-bullet-active{opacity:var(--swiper-pagination-bullet-opacity, 1);background:var(--swiper-pagination-color,var(--swiper-theme-color))}.swiper-pagination-vertical.swiper-pagination-bullets,.swiper-vertical>.swiper-pagination-bullets{right:var(--swiper-pagination-right,8px);left:var(--swiper-pagination-left,auto);top:50%;transform:translate3d(0px,-50%,0)}.swiper-pagination-vertical.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:var(--swiper-pagination-bullet-vertical-gap,6px) 0;display:block}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{top:50%;transform:translateY(-50%);width:8px}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{display:inline-block;transition:.2s transform,.2s top}.swiper-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 var(--swiper-pagination-bullet-horizontal-gap,4px)}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{left:50%;transform:translateX(-50%);white-space:nowrap}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s left}.swiper-horizontal.swiper-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s right}.swiper-pagination-fraction{color:var(--swiper-pagination-fraction-color,inherit)}.swiper-pagination-progressbar{background:var(--swiper-pagination-progressbar-bg-color,rgba(0,0,0,.25));position:absolute}.swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:var(--swiper-pagination-color,var(--swiper-theme-color));position:absolute;left:0;top:0;width:100%;height:100%;transform:scale(0);transform-origin:left top}.swiper-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{transform-origin:right top}.swiper-horizontal>.swiper-pagination-progressbar,.swiper-pagination-progressbar.swiper-pagination-horizontal,.swiper-pagination-progressbar.swiper-pagination-vertical.swiper-pagination-progressbar-opposite,.swiper-vertical>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite{width:100%;height:var(--swiper-pagination-progressbar-size,4px);left:0;top:0}.swiper-horizontal>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-vertical,.swiper-vertical>.swiper-pagination-progressbar{width:var(--swiper-pagination-progressbar-size,4px);height:100%;left:0;top:0}.swiper-pagination-lock{display:none}.swiper-scrollbar{border-radius:var(--swiper-scrollbar-border-radius,10px);position:relative;touch-action:none;background:var(--swiper-scrollbar-bg-color,rgba(0,0,0,.1))}.swiper-scrollbar-disabled>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-disabled{display:none!important}.swiper-horizontal>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-horizontal{position:absolute;left:var(--swiper-scrollbar-sides-offset,1%);bottom:var(--swiper-scrollbar-bottom,4px);top:var(--swiper-scrollbar-top,auto);z-index:50;height:var(--swiper-scrollbar-size,4px);width:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar.swiper-scrollbar-vertical,.swiper-vertical>.swiper-scrollbar{position:absolute;left:var(--swiper-scrollbar-left,auto);right:var(--swiper-scrollbar-right,4px);top:var(--swiper-scrollbar-sides-offset,1%);z-index:50;width:var(--swiper-scrollbar-size,4px);height:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:var(--swiper-scrollbar-drag-bg-color,rgba(0,0,0,.5));border-radius:var(--swiper-scrollbar-border-radius,10px);left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}::slotted(.swiper-slide-zoomed){cursor:move;touch-action:none}.swiper .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-free-mode>.swiper-wrapper{transition-timing-function:ease-out;margin:0 auto}.swiper-grid>.swiper-wrapper{flex-wrap:wrap}.swiper-grid-column>.swiper-wrapper{flex-wrap:wrap;flex-direction:column}.swiper-fade.swiper-free-mode ::slotted(swiper-slide){transition-timing-function:ease-out}.swiper-fade ::slotted(swiper-slide){pointer-events:none;transition-property:opacity}.swiper-fade ::slotted(swiper-slide) ::slotted(swiper-slide){pointer-events:none}.swiper-fade ::slotted(.swiper-slide-active){pointer-events:auto}.swiper-fade ::slotted(.swiper-slide-active) ::slotted(.swiper-slide-active){pointer-events:auto}.swiper-cube{overflow:visible}.swiper-cube ::slotted(swiper-slide){pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1;visibility:hidden;transform-origin:0 0;width:100%;height:100%}.swiper-cube ::slotted(swiper-slide) ::slotted(swiper-slide){pointer-events:none}.swiper-cube.swiper-rtl ::slotted(swiper-slide){transform-origin:100% 0}.swiper-cube ::slotted(.swiper-slide-active),.swiper-cube ::slotted(.swiper-slide-active) ::slotted(.swiper-slide-active){pointer-events:auto}.swiper-cube ::slotted(.swiper-slide-active),.swiper-cube ::slotted(.swiper-slide-next),.swiper-cube ::slotted(.swiper-slide-prev){pointer-events:auto;visibility:visible}.swiper-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0px;width:100%;height:100%;opacity:.6;z-index:0}.swiper-cube .swiper-cube-shadow:before{content:'';background:#000;position:absolute;left:0;top:0;bottom:0;right:0;filter:blur(50px)}.swiper-cube ::slotted(.swiper-slide-next)+::slotted(swiper-slide){pointer-events:auto;visibility:visible}.swiper-flip{overflow:visible}.swiper-flip ::slotted(swiper-slide){pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-flip ::slotted(swiper-slide) ::slotted(swiper-slide){pointer-events:none}.swiper-flip ::slotted(.swiper-slide-active),.swiper-flip ::slotted(.swiper-slide-active) ::slotted(.swiper-slide-active){pointer-events:auto}.swiper-creative ::slotted(swiper-slide){-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;transition-property:transform,opacity,height}.swiper-cards{overflow:visible}.swiper-cards ::slotted(swiper-slide){transform-origin:center bottom;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden}`\nconst SwiperSlideCSS = `::slotted(.swiper-slide-shadow),::slotted(.swiper-slide-shadow-bottom),::slotted(.swiper-slide-shadow-left),::slotted(.swiper-slide-shadow-right),::slotted(.swiper-slide-shadow-top){position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}::slotted(.swiper-slide-shadow){background:rgba(0,0,0,.15)}::slotted(.swiper-slide-shadow-left){background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}::slotted(.swiper-slide-shadow-right){background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}::slotted(.swiper-slide-shadow-top){background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}::slotted(.swiper-slide-shadow-bottom){background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-lazy-preloader{animation:swiper-preloader-spin 1s infinite linear;width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;transform-origin:50%;box-sizing:border-box;border:4px solid var(--swiper-preloader-color,var(--swiper-theme-color));border-radius:50%;border-top-color:transparent}@keyframes swiper-preloader-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}::slotted(.swiper-slide-shadow-cube.swiper-slide-shadow-bottom),::slotted(.swiper-slide-shadow-cube.swiper-slide-shadow-left),::slotted(.swiper-slide-shadow-cube.swiper-slide-shadow-right),::slotted(.swiper-slide-shadow-cube.swiper-slide-shadow-top){z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}::slotted(.swiper-slide-shadow-flip.swiper-slide-shadow-bottom),::slotted(.swiper-slide-shadow-flip.swiper-slide-shadow-left),::slotted(.swiper-slide-shadow-flip.swiper-slide-shadow-right),::slotted(.swiper-slide-shadow-flip.swiper-slide-shadow-top){z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}::slotted(.swiper-zoom-container){width:100%;height:100%;display:flex;justify-content:center;align-items:center;text-align:center}::slotted(.swiper-zoom-container)>canvas,::slotted(.swiper-zoom-container)>img,::slotted(.swiper-zoom-container)>svg{max-width:100%;max-height:100%;object-fit:contain}`\n\nclass DummyHTMLElement {}\nconst ClassToExtend = typeof window === 'undefined' || typeof HTMLElement === 'undefined' ? DummyHTMLElement : HTMLElement;\nconst arrowSvg = `\n `;\nconst addStyle = (shadowRoot, styles) => {\n if (typeof CSSStyleSheet !== 'undefined' && shadowRoot.adoptedStyleSheets) {\n const styleSheet = new CSSStyleSheet();\n styleSheet.replaceSync(styles);\n shadowRoot.adoptedStyleSheets = [styleSheet];\n } else {\n const style = document.createElement('style');\n style.rel = 'stylesheet';\n style.textContent = styles;\n shadowRoot.appendChild(style);\n }\n};\nclass SwiperContainer extends ClassToExtend {\n constructor() {\n super();\n this.attachShadow({\n mode: 'open'\n });\n }\n static get nextButtonSvg() {\n return arrowSvg;\n }\n static get prevButtonSvg() {\n return arrowSvg.replace('/>', ' transform-origin=\"center\" transform=\"rotate(180)\"/>');\n }\n cssStyles() {\n return [SwiperCSS,\n // eslint-disable-line\n ...(this.injectStyles && Array.isArray(this.injectStyles) ? this.injectStyles : [])].join('\\n');\n }\n cssLinks() {\n return this.injectStylesUrls || [];\n }\n calcSlideSlots() {\n const currentSideSlots = this.slideSlots || 0;\n // slide slots\n const slideSlotChildren = [...this.querySelectorAll(`[slot^=slide-]`)].map(child => {\n return parseInt(child.getAttribute('slot').split('slide-')[1], 10);\n });\n this.slideSlots = slideSlotChildren.length ? Math.max(...slideSlotChildren) + 1 : 0;\n if (!this.rendered) return;\n if (this.slideSlots > currentSideSlots) {\n for (let i = currentSideSlots; i < this.slideSlots; i += 1) {\n const slideEl = document.createElement('swiper-slide');\n slideEl.setAttribute('part', `slide slide-${i + 1}`);\n const slotEl = document.createElement('slot');\n slotEl.setAttribute('name', `slide-${i + 1}`);\n slideEl.appendChild(slotEl);\n this.shadowRoot.querySelector('.swiper-wrapper').appendChild(slideEl);\n }\n } else if (this.slideSlots < currentSideSlots) {\n const slides = this.swiper.slides;\n for (let i = slides.length - 1; i >= 0; i -= 1) {\n if (i > this.slideSlots) {\n slides[i].remove();\n }\n }\n }\n }\n render() {\n if (this.rendered) return;\n this.calcSlideSlots();\n\n // local styles\n let localStyles = this.cssStyles();\n if (this.slideSlots > 0) {\n localStyles = localStyles.replace(/::slotted\\(([a-z-0-9.]*)\\)/g, '$1');\n }\n if (localStyles.length) {\n addStyle(this.shadowRoot, localStyles);\n }\n this.cssLinks().forEach(url => {\n const linkExists = this.shadowRoot.querySelector(`link[href=\"${url}\"]`);\n if (linkExists) return;\n const linkEl = document.createElement('link');\n linkEl.rel = 'stylesheet';\n linkEl.href = url;\n this.shadowRoot.appendChild(linkEl);\n });\n // prettier-ignore\n const el = document.createElement('div');\n el.classList.add('swiper');\n el.part = 'container';\n\n // prettier-ignore\n el.innerHTML = `\n \n \n \n ${Array.from({\n length: this.slideSlots\n }).map((_, index) => `\n \n \n \n `).join('')}\n
\n \n ${needsNavigation(this.passedParams) ? `\n ${this.constructor.prevButtonSvg}
\n ${this.constructor.nextButtonSvg}
\n ` : ''}\n ${needsPagination(this.passedParams) ? `\n \n ` : ''}\n ${needsScrollbar(this.passedParams) ? `\n \n ` : ''}\n `;\n this.shadowRoot.appendChild(el);\n this.rendered = true;\n }\n initialize() {\n var _this = this;\n if (this.initialized) return;\n this.initialized = true;\n const {\n params: swiperParams,\n passedParams\n } = getParams(this);\n this.swiperParams = swiperParams;\n this.passedParams = passedParams;\n delete this.swiperParams.init;\n this.render();\n\n // eslint-disable-next-line\n this.swiper = new Swiper(this.shadowRoot.querySelector('.swiper'), {\n ...(swiperParams.virtual ? {} : {\n observer: true,\n observeSlideChildren: this.slideSlots > 0\n }),\n ...swiperParams,\n touchEventsTarget: 'container',\n onAny: function (name) {\n if (name === 'observerUpdate') {\n _this.calcSlideSlots();\n }\n const eventName = swiperParams.eventsPrefix ? `${swiperParams.eventsPrefix}${name.toLowerCase()}` : name.toLowerCase();\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n const event = new CustomEvent(eventName, {\n detail: args,\n bubbles: name !== 'hashChange',\n cancelable: true\n });\n _this.dispatchEvent(event);\n }\n });\n }\n connectedCallback() {\n if (this.initialized && this.nested && this.closest('swiper-slide') && this.closest('swiper-slide').swiperLoopMoveDOM) {\n return;\n }\n if (this.init === false || this.getAttribute('init') === 'false') {\n return;\n }\n this.initialize();\n }\n disconnectedCallback() {\n if (this.nested && this.closest('swiper-slide') && this.closest('swiper-slide').swiperLoopMoveDOM) {\n return;\n }\n if (this.swiper && this.swiper.destroy) {\n this.swiper.destroy();\n }\n this.initialized = false;\n }\n updateSwiperOnPropChange(propName, propValue) {\n const {\n params: swiperParams,\n passedParams\n } = getParams(this, propName, propValue);\n this.passedParams = passedParams;\n this.swiperParams = swiperParams;\n updateSwiper({\n swiper: this.swiper,\n passedParams: this.passedParams,\n changedParams: [attrToProp(propName)],\n ...(propName === 'navigation' && passedParams[propName] ? {\n prevEl: '.swiper-button-prev',\n nextEl: '.swiper-button-next'\n } : {}),\n ...(propName === 'pagination' && passedParams[propName] ? {\n paginationEl: '.swiper-pagination'\n } : {}),\n ...(propName === 'scrollbar' && passedParams[propName] ? {\n scrollbarEl: '.swiper-scrollbar'\n } : {})\n });\n }\n attributeChangedCallback(attr, prevValue, newValue) {\n if (!this.initialized) return;\n if (prevValue === 'true' && newValue === null) {\n newValue = false;\n }\n this.updateSwiperOnPropChange(attr, newValue);\n }\n static get observedAttributes() {\n const attrs = paramsList.filter(param => param.includes('_')).map(param => param.replace(/[A-Z]/g, v => `-${v}`).replace('_', '').toLowerCase());\n return attrs;\n }\n}\nparamsList.forEach(paramName => {\n if (paramName === 'init') return;\n paramName = paramName.replace('_', '');\n Object.defineProperty(SwiperContainer.prototype, paramName, {\n configurable: true,\n get() {\n return (this.passedParams || {})[paramName];\n },\n set(value) {\n if (!this.passedParams) this.passedParams = {};\n this.passedParams[paramName] = value;\n if (!this.initialized) return;\n this.updateSwiperOnPropChange(paramName, value);\n }\n });\n});\nclass SwiperSlide extends ClassToExtend {\n constructor() {\n super();\n this.attachShadow({\n mode: 'open'\n });\n }\n render() {\n const lazy = this.lazy || this.getAttribute('lazy') === '' || this.getAttribute('lazy') === 'true';\n addStyle(this.shadowRoot, SwiperSlideCSS);\n this.shadowRoot.appendChild(document.createElement('slot'));\n if (lazy) {\n const lazyDiv = document.createElement('div');\n lazyDiv.classList.add('swiper-lazy-preloader');\n lazyDiv.part.add('preloader');\n this.shadowRoot.appendChild(lazyDiv);\n }\n }\n initialize() {\n this.render();\n }\n connectedCallback() {\n this.initialize();\n }\n}\n\n// eslint-disable-next-line\nconst register = () => {\n if (typeof window === 'undefined') return;\n if (!window.customElements.get('swiper-container')) window.customElements.define('swiper-container', SwiperContainer);\n if (!window.customElements.get('swiper-slide')) window.customElements.define('swiper-slide', SwiperSlide);\n};\nif (typeof window !== 'undefined') {\n window.SwiperElementRegisterParams = params => {\n paramsList.push(...params);\n };\n}\n\nexport { SwiperContainer, SwiperSlide, register };\n","// eslint-disable-next-line\nimport Swiper from 'swiper/bundle';\n// eslint-disable-next-line\nimport { register } from 'swiper/element/bundle';\nimport $ from '../../shared/dom7.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nregister();\n\n\n\nfunction initSwiper(swiperEl) {\n const app = this;\n const $swiperEl = $(swiperEl);\n if ($swiperEl.length === 0) return;\n const isElement = $swiperEl[0].swiper && $swiperEl[0].swiper.isElement;\n if ($swiperEl[0].swiper && !$swiperEl[0].swiper.isElement) return;\n let initialSlide;\n let params = {};\n let isTabs;\n let isRoutableTabs;\n if ($swiperEl.hasClass('tabs')) {\n initialSlide = $swiperEl.children('swiper-slide').indexOf($swiperEl.children('.tab-active')[0]);\n isTabs = true;\n isRoutableTabs = $swiperEl.find('.tabs-routable').length > 0;\n }\n if ($swiperEl.attr('data-swiper')) {\n params = JSON.parse($swiperEl.attr('data-swiper'));\n } else if ($swiperEl[0].f7SwiperParams) {\n params = $swiperEl[0].f7SwiperParams;\n } else {\n params = $swiperEl.dataset();\n Object.keys(params).forEach(key => {\n const value = params[key];\n if (typeof value === 'string' && value.indexOf('{') === 0 && value.indexOf('}') > 0) {\n try {\n params[key] = JSON.parse(value);\n } catch (e) {\n // not JSON\n }\n }\n });\n }\n if (typeof params.initialSlide === 'undefined' && typeof initialSlide !== 'undefined') {\n params.initialSlide = initialSlide;\n }\n const swiper = isElement ? $swiperEl[0].swiper : app.swiper.create($swiperEl[0], params);\n if (isElement) {\n swiper.slideTo(initialSlide, 0);\n }\n function updateSwiper() {\n swiper.update();\n }\n const $tabEl = $swiperEl.parents('.tab').filter(tabEl => {\n return $(tabEl).parent('.tabs').parent('.tabs-animated-wrap, swiper-container.tabs').length === 0;\n }).eq(0);\n $swiperEl.parents('.popup, .login-screen, .sheet-modal, .popover').on('modal:open', updateSwiper);\n $swiperEl.parents('.panel').on('panel:open', updateSwiper);\n if ($tabEl && $tabEl.length) {\n $tabEl.on('tab:show', updateSwiper);\n }\n swiper.on('beforeDestroy', () => {\n $swiperEl.parents('.popup, .login-screen, .sheet-modal, .popover').off('modal:open', updateSwiper);\n $swiperEl.parents('.panel').off('panel:open', updateSwiper);\n if ($tabEl && $tabEl.length) {\n $tabEl.off('tab:show', updateSwiper);\n }\n });\n if (isTabs) {\n swiper.on('slideChange', () => {\n if (isRoutableTabs) {\n let view = app.views.get($swiperEl.parents('.view'));\n if (!view) view = app.views.main;\n const router = view.router;\n const tabRouteUrl = router.findTabRouteUrl($(swiper.slides).eq(swiper.activeIndex)[0]);\n if (tabRouteUrl) {\n setTimeout(() => {\n router.navigate(tabRouteUrl);\n }, 0);\n }\n } else {\n app.tab.show({\n tabEl: $(swiper.slides).eq(swiper.activeIndex)\n });\n }\n });\n }\n}\nexport default {\n name: 'swiper',\n static: {\n Swiper\n },\n create() {\n const app = this;\n app.swiper = ConstructorMethods({\n defaultSelector: '.swiper',\n constructor: Swiper,\n domProp: 'swiper'\n });\n },\n on: {\n pageMounted(page) {\n const app = this;\n page.$el.find('swiper-container.tabs').each(swiperEl => {\n initSwiper.call(app, swiperEl);\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('swiper-container.tabs').each(swiperEl => {\n initSwiper.call(app, swiperEl);\n });\n },\n pageReinit(page) {\n const app = this;\n page.$el.find('swiper-container.tabs').each(swiperEl => {\n const swiper = app.swiper.get(swiperEl);\n if (swiper && swiper.update) swiper.update();\n });\n },\n tabMounted(tabEl) {\n const app = this;\n $(tabEl).find('swiper-container.tabs').each(swiperEl => {\n initSwiper.call(app, swiperEl);\n });\n },\n tabShow(tabEl) {\n const app = this;\n $(tabEl).find('swiper-container.tabs').each(swiperEl => {\n const swiper = app.swiper.get(swiperEl);\n if (swiper && swiper.update) swiper.update();\n });\n },\n tabBeforeRemove(tabEl) {\n const app = this;\n $(tabEl).find('swiper-container.tabs').each(swiperEl => {\n app.swiper.destroy(swiperEl);\n });\n }\n }\n};","/* eslint indent: [\"off\"] */\nimport { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom7.js';\nimport { extend, now, nextTick, deleteProps } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\n/** @jsx $jsx */\nimport $jsx from '../../shared/$jsx.js';\nclass PhotoBrowser extends Framework7Class {\n constructor(app, params) {\n if (params === void 0) {\n params = {};\n }\n super(params, [app]);\n const pb = this;\n pb.app = app;\n const defaults = extend({\n on: {}\n }, app.params.photoBrowser);\n\n // Extend defaults with modules params\n pb.useModulesParams(defaults);\n pb.params = extend(defaults, params);\n extend(pb, {\n exposed: false,\n opened: false,\n activeIndex: pb.params.swiper.initialSlide,\n url: pb.params.url,\n swipeToClose: {\n allow: true,\n isTouched: false,\n diff: undefined,\n start: undefined,\n current: undefined,\n started: false,\n activeSlide: undefined,\n timeStart: undefined\n }\n });\n\n // Install Modules\n pb.useModules();\n\n // Init\n pb.init();\n }\n get view() {\n const {\n params,\n app\n } = this;\n return params.view || app.views.main;\n }\n onSlideChange(swiper) {\n const pb = this;\n pb.activeIndex = swiper.activeIndex;\n let current = swiper.activeIndex + 1;\n let total = pb.params.virtualSlides ? pb.params.photos.length : swiper.slides.length;\n if (swiper.params.loop) {\n total -= 2;\n current -= swiper.loopedSlides;\n if (current < 1) current = total + current;\n if (current > total) current -= total;\n }\n const $activeSlideEl = pb.params.virtualSlides ? $(swiper.wrapperEl).find(`.swiper-slide[data-swiper-slide-index=\"${swiper.activeIndex}\"]`) : $(swiper.slides).eq(swiper.activeIndex);\n const $previousSlideEl = pb.params.virtualSlides ? $(swiper.wrapperEl).find(`.swiper-slide[data-swiper-slide-index=\"${swiper.previousIndex}\"]`) : $(swiper.slides).eq(swiper.previousIndex);\n let $currentEl = pb.$el.find('.photo-browser-current');\n let $totalEl = pb.$el.find('.photo-browser-total');\n let navbarEl;\n if (pb.params.type === 'page' && pb.params.navbar && $currentEl.length === 0 && pb.app.theme === 'ios') {\n navbarEl = pb.app.navbar.getElByPage(pb.$el);\n if (navbarEl) {\n $currentEl = $(navbarEl).find('.photo-browser-current');\n $totalEl = $(navbarEl).find('.photo-browser-total');\n }\n }\n if ($currentEl.length && $totalEl.length) {\n $currentEl.text(current);\n $totalEl.text(total);\n if (!navbarEl) navbarEl = $currentEl.parents('.navbar')[0];\n if (navbarEl) {\n pb.app.navbar.size(navbarEl);\n }\n }\n\n // Update captions\n if (pb.captions.length > 0) {\n const captionIndex = swiper.params.loop ? $activeSlideEl.attr('data-swiper-slide-index') : pb.activeIndex;\n pb.$captionsContainerEl.find('.photo-browser-caption-active').removeClass('photo-browser-caption-active');\n pb.$captionsContainerEl.find(`[data-caption-index=\"${captionIndex}\"]`).addClass('photo-browser-caption-active');\n }\n\n // Stop Video\n const previousSlideVideo = $previousSlideEl.find('video');\n if (previousSlideVideo.length > 0) {\n if ('pause' in previousSlideVideo[0]) previousSlideVideo[0].pause();\n }\n }\n onTouchStart() {\n const pb = this;\n const swipeToClose = pb.swipeToClose;\n if (!swipeToClose.allow) return;\n swipeToClose.isTouched = true;\n }\n onTouchMove(e) {\n const pb = this;\n const swipeToClose = pb.swipeToClose;\n if (!swipeToClose.isTouched) return;\n if (!swipeToClose.started) {\n swipeToClose.started = true;\n swipeToClose.start = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n if (pb.params.virtualSlides) {\n swipeToClose.activeSlide = $(pb.swiper.wrapperEl).children('.swiper-slide-active');\n } else {\n swipeToClose.activeSlide = $(pb.swiper.slides).eq(pb.swiper.activeIndex);\n }\n swipeToClose.timeStart = now();\n }\n e.preventDefault();\n swipeToClose.current = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n swipeToClose.diff = swipeToClose.start - swipeToClose.current;\n pb.$el.transition(0).transform(`translate3d(0,${-swipeToClose.diff}px,0)`);\n }\n onTouchEnd() {\n const pb = this;\n const swipeToClose = pb.swipeToClose;\n swipeToClose.isTouched = false;\n if (!swipeToClose.started) {\n swipeToClose.started = false;\n return;\n }\n swipeToClose.started = false;\n swipeToClose.allow = false;\n const diff = Math.abs(swipeToClose.diff);\n const timeDiff = new Date().getTime() - swipeToClose.timeStart;\n if (timeDiff < 300 && diff > 20 || timeDiff >= 300 && diff > 100) {\n nextTick(() => {\n if (pb.$el) {\n if (swipeToClose.diff < 0) pb.$el.addClass('swipe-close-to-bottom');else pb.$el.addClass('swipe-close-to-top');\n }\n pb.emit('local::swipeToClose', pb);\n pb.$el.transform('').transition('');\n pb.close();\n swipeToClose.allow = true;\n });\n return;\n }\n if (diff !== 0) {\n pb.$el.addClass('photo-browser-transitioning').transitionEnd(() => {\n swipeToClose.allow = true;\n pb.$el.removeClass('photo-browser-transitioning');\n });\n } else {\n swipeToClose.allow = true;\n }\n nextTick(() => {\n pb.$el.transform('').transition('');\n });\n }\n\n // Render Functions\n renderNavbar() {\n const pb = this;\n if (pb.params.renderNavbar) return pb.params.renderNavbar.call(pb);\n const iconsColor = pb.params.iconsColor;\n const pageBackLinkText = pb.app.theme === 'ios' && pb.params.pageBackLinkText ? pb.params.pageBackLinkText : '';\n const renderNavbarCount = typeof pb.params.navbarShowCount === 'undefined' ? pb.params.photos.length > 1 : pb.params.navbarShowCount;\n const isPopup = pb.params.type !== 'page';\n return $jsx(\"div\", {\n class: `navbar navbar-photo-browser ${pb.params.theme === 'dark' ? 'navbar-photo-browser-dark' : ''}`\n }, $jsx(\"div\", {\n class: \"navbar-bg\"\n }), $jsx(\"div\", {\n class: \"navbar-inner navbar-inner-centered-title sliding\"\n }, !isPopup && $jsx(\"div\", {\n class: \"left\"\n }, $jsx(\"a\", {\n class: `link ${!pageBackLinkText ? 'icon-only' : ''} back`\n }, $jsx(\"i\", {\n class: `icon icon-back ${iconsColor ? `color-${iconsColor}` : ''}`\n }), pageBackLinkText && $jsx(\"span\", null, pageBackLinkText))), renderNavbarCount && $jsx(\"div\", {\n class: \"title\"\n }, $jsx(\"span\", {\n class: \"photo-browser-current\"\n }), $jsx(\"span\", {\n class: \"photo-browser-of\"\n }, pb.params.navbarOfText), $jsx(\"span\", {\n class: \"photo-browser-total\"\n })), isPopup && (pb.params.popupCloseLinkText || pb.params.popupCloseLinkIcon) && $jsx(\"div\", {\n class: \"right\"\n }, $jsx(\"a\", {\n class: \"link popup-close\",\n \"data-popup\": \".photo-browser-popup\"\n }, pb.params.popupCloseLinkIcon && pb.app.theme === 'ios' && $jsx(\"i\", null, $jsx(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"56\",\n height: \"56\",\n viewBox: \"0 0 56 56\"\n }, $jsx(\"path\", {\n fill: \"currentColor\",\n d: \"M 10.0234 43.0234 C 9.2266 43.8203 9.2031 45.1797 10.0234 45.9766 C 10.8438 46.7734 12.1797 46.7734 13.0000 45.9766 L 28.0000 30.9766 L 43.0000 45.9766 C 43.7969 46.7734 45.1563 46.7969 45.9766 45.9766 C 46.7734 45.1562 46.7734 43.8203 45.9766 43.0234 L 30.9531 28.0000 L 45.9766 13.0000 C 46.7734 12.2031 46.7969 10.8437 45.9766 10.0469 C 45.1328 9.2266 43.7969 9.2266 43.0000 10.0469 L 28.0000 25.0469 L 13.0000 10.0469 C 12.1797 9.2266 10.8203 9.2031 10.0234 10.0469 C 9.2266 10.8672 9.2266 12.2031 10.0234 13.0000 L 25.0234 28.0000 Z\"\n }))), pb.params.popupCloseLinkIcon && pb.app.theme === 'md' && $jsx(\"i\", null, $jsx(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n height: \"24px\",\n viewBox: \"0 0 24 24\",\n width: \"24px\",\n fill: \"currentColor\"\n }, $jsx(\"path\", {\n d: \"M0 0h24v24H0V0z\",\n fill: \"none\"\n }), $jsx(\"path\", {\n d: \"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\"\n }))), pb.params.popupCloseLinkText && $jsx(\"span\", null, pb.params.popupCloseLinkText)))));\n }\n renderToolbar() {\n const pb = this;\n if (pb.params.renderToolbar) return pb.params.renderToolbar.call(pb);\n const iconsColor = pb.params.iconsColor;\n return $jsx(\"div\", {\n class: \"toolbar toolbar-bottom tabbar\"\n }, $jsx(\"div\", {\n class: \"toolbar-inner\"\n }, $jsx(\"a\", {\n class: \"link photo-browser-prev\"\n }, $jsx(\"i\", {\n class: `icon icon-back ${iconsColor ? `color-${iconsColor}` : ''}`\n })), $jsx(\"a\", {\n class: \"link photo-browser-next\"\n }, $jsx(\"i\", {\n class: `icon icon-forward ${iconsColor ? `color-${iconsColor}` : ''}`\n }))));\n }\n renderThumbs() {\n const pb = this;\n return $jsx(\"div\", {\n class: \"toolbar toolbar-bottom photo-browser-thumbs\"\n }, $jsx(\"div\", {\n class: \"swiper\"\n }, $jsx(\"div\", {\n class: \"swiper-wrapper\"\n }, pb.params.thumbs.map((thumb, index) => pb.renderThumb(thumb, index)))));\n }\n renderCaption(caption, index) {\n const pb = this;\n if (pb.params.renderCaption) return pb.params.renderCaption.call(pb, caption, index);\n return $jsx(\"div\", {\n class: \"photo-browser-caption\",\n \"data-caption-index\": index\n }, caption);\n }\n renderObject(photo, index) {\n const pb = this;\n if (pb.params.renderObject) return pb.params.renderObject.call(pb, photo, index);\n return $jsx(\"div\", {\n class: \"photo-browser-slide photo-browser-object-slide swiper-slide\",\n \"data-swiper-slide-index\": index\n }, photo.html ? photo.html : photo);\n }\n renderLazyPhoto(photo, index) {\n const pb = this;\n if (pb.params.renderLazyPhoto) return pb.params.renderLazyPhoto.call(pb, photo, index);\n return $jsx(\"div\", {\n class: \"photo-browser-slide photo-browser-slide-lazy swiper-slide\",\n \"data-swiper-slide-index\": index\n }, $jsx(\"div\", {\n class: \"swiper-lazy-preloader\"\n }), $jsx(\"span\", {\n class: \"swiper-zoom-container\"\n }, $jsx(\"img\", {\n loading: \"lazy\",\n src: photo.url ? photo.url : photo\n })));\n }\n renderPhoto(photo, index) {\n const pb = this;\n if (pb.params.renderPhoto) return pb.params.renderPhoto.call(pb, photo, index);\n return $jsx(\"div\", {\n class: \"photo-browser-slide swiper-slide\",\n \"data-swiper-slide-index\": index\n }, $jsx(\"span\", {\n class: \"swiper-zoom-container\"\n }, $jsx(\"img\", {\n src: photo.url ? photo.url : photo\n })));\n }\n renderThumb(thumb, index) {\n const pb = this;\n const url = typeof thumb === 'string' ? thumb : thumb.url;\n if (pb.params.renderThumb) return pb.params.renderThumb.call(pb, thumb, index);\n return $jsx(\"div\", {\n class: \"photo-browser-thumbs-slide swiper-slide\",\n \"data-swiper-slide-index\": index\n }, url && $jsx(\"img\", {\n src: url,\n loading: \"lazy\"\n }));\n }\n render() {\n const pb = this;\n if (pb.params.render) return pb.params.render.call(pb, pb.params);\n return $jsx(\"div\", {\n class: `photo-browser photo-browser-${pb.params.theme}`\n }, $jsx(\"div\", {\n class: \"view\"\n }, $jsx(\"div\", {\n class: `page photo-browser-page photo-browser-page-${pb.params.theme} no-toolbar ${!pb.params.navbar ? 'no-navbar' : ''}`,\n \"data-name\": \"photo-browser-page\"\n }, pb.params.navbar && pb.renderNavbar(), pb.params.toolbar && pb.renderToolbar(), pb.params.thumbs && pb.params.thumbs.length && pb.renderThumbs(), $jsx(\"div\", {\n class: `photo-browser-captions photo-browser-captions-${pb.params.captionsTheme || pb.params.theme}`\n }, pb.params.photos.map((photo, index) => {\n if (photo.caption) return pb.renderCaption(photo.caption, index);\n return '';\n })), $jsx(\"div\", {\n class: \"photo-browser-swiper-container swiper\"\n }, $jsx(\"div\", {\n class: \"photo-browser-swiper-wrapper swiper-wrapper\"\n }, !pb.params.virtualSlides && pb.params.photos.map((photo, index) => {\n if (photo.html || (typeof photo === 'string' || photo instanceof String) && photo.indexOf('<') >= 0 && photo.indexOf('>') >= 0) {\n return pb.renderObject(photo, index);\n }\n if (pb.params.lazy === true) {\n return pb.renderLazyPhoto(photo, index);\n }\n return pb.renderPhoto(photo, index);\n }))))));\n }\n renderStandalone() {\n const pb = this;\n if (pb.params.renderStandalone) return pb.params.renderStandalone.call(pb);\n const standaloneHtml = ``;\n return standaloneHtml;\n }\n renderPage() {\n const pb = this;\n if (pb.params.renderPage) return pb.params.renderPage.call(pb);\n const pageHtml = pb.render();\n return pageHtml;\n }\n renderPopup() {\n const pb = this;\n if (pb.params.renderPopup) return pb.params.renderPopup.call(pb);\n const popupHtml = ``;\n return popupHtml;\n }\n\n // Callbacks\n onOpen(type, el) {\n const pb = this;\n const app = pb.app;\n const $el = $(el);\n $el[0].f7PhotoBrowser = pb;\n pb.$el = $el;\n pb.el = $el[0];\n pb.openedIn = type;\n pb.opened = true;\n pb.$swiperContainerEl = pb.$el.find('.photo-browser-swiper-container');\n pb.$swiperWrapperEl = pb.$el.find('.photo-browser-swiper-wrapper');\n pb.slides = pb.$el.find('.photo-browser-slide');\n pb.$captionsContainerEl = pb.$el.find('.photo-browser-captions');\n pb.captions = pb.$el.find('.photo-browser-caption');\n const hasThumbs = pb.params.thumbs && pb.params.thumbs.length > 0;\n\n // Init Swiper\n let clickTimeout;\n let preventThumbsSlide;\n let preventMainSlide;\n const initialSlide = pb.activeIndex;\n const swiperParams = extend({}, pb.params.swiper, {\n initialSlide,\n // cssMode:\n // typeof pb.params.swiper.cssMode === 'undefined' && (app.device.ios || app.device.android)\n // ? true\n // : pb.params.swiper.cssMode,\n on: {\n click(e) {\n clearTimeout(clickTimeout);\n if (pb.params.exposition) {\n clickTimeout = setTimeout(() => {\n pb.expositionToggle();\n }, 350);\n }\n pb.emit('local::tap', e);\n pb.emit('local::click', e);\n },\n doubleClick(e) {\n clearTimeout(clickTimeout);\n pb.emit('local::doubleTap', e);\n pb.emit('local::doubleClick', e);\n },\n slideChange() {\n const swiper = this;\n if (hasThumbs && pb.thumbsSwiper && !preventMainSlide) {\n preventThumbsSlide = true;\n pb.thumbsSwiper.slideTo(pb.swiper.activeIndex);\n setTimeout(() => {\n preventThumbsSlide = false;\n });\n }\n pb.onSlideChange(swiper);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n pb.emit('local::slideChange', ...args);\n },\n transitionStart() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n pb.emit('local::transitionStart', ...args);\n },\n transitionEnd() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n pb.emit('local::transitionEnd', ...args);\n },\n slideChangeTransitionStart() {\n const swiper = this;\n pb.onSlideChange(swiper);\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n pb.emit('local::slideChangeTransitionStart', ...args);\n },\n slideChangeTransitionEnd() {\n for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n args[_key5] = arguments[_key5];\n }\n pb.emit('local::slideChangeTransitionEnd', ...args);\n }\n }\n });\n if (pb.params.swipeToClose && pb.params.type !== 'page') {\n extend(swiperParams.on, {\n touchStart(swiper, e) {\n pb.onTouchStart(e);\n pb.emit('local::touchStart', e);\n },\n touchMoveOpposite(swiper, e) {\n pb.onTouchMove(e);\n pb.emit('local::touchMoveOpposite', e);\n },\n touchEnd(swiper, e) {\n pb.onTouchEnd(e);\n pb.emit('local::touchEnd', e);\n }\n });\n }\n if (pb.params.virtualSlides) {\n extend(swiperParams, {\n virtual: {\n slides: pb.params.photos,\n renderSlide(photo, index) {\n if (photo.html || (typeof photo === 'string' || photo instanceof String) && photo.indexOf('<') >= 0 && photo.indexOf('>') >= 0) {\n return pb.renderObject(photo, index);\n }\n if (pb.params.lazy === true) {\n return pb.renderLazyPhoto(photo, index);\n }\n return pb.renderPhoto(photo, index);\n }\n }\n });\n }\n const window = getWindow();\n pb.swiper = app.swiper ? app.swiper.create(pb.$swiperContainerEl[0], swiperParams) : new window.Swiper(pb.$swiperContainerEl[0], swiperParams);\n if (pb.activeIndex === 0 || pb.params.virtualSlides) {\n pb.onSlideChange(pb.swiper);\n }\n if (hasThumbs) {\n const thumbsSwiperParams = {\n el: pb.$el.find('.photo-browser-thumbs .swiper')[0],\n slidesPerView: 'auto',\n centeredSlides: true,\n spaceBetween: 4,\n watchSlidesProgress: true,\n initialSlide,\n on: {\n touchMove() {\n preventMainSlide = true;\n },\n touchEnd() {\n preventMainSlide = false;\n },\n slideChange(s) {\n if (preventThumbsSlide) return;\n pb.swiper.slideTo(s.activeIndex, 0);\n },\n click(s) {\n if (!s.clickedSlide) return;\n const index = parseInt($(s.clickedSlide).attr('data-swiper-slide-index'), 10);\n s.slideTo(index, 0);\n }\n }\n };\n pb.thumbsSwiper = app.swiper ? app.swiper.create(thumbsSwiperParams) : new window.Swiper(thumbsSwiperParams);\n }\n if (pb.$el) {\n pb.$el.trigger('photobrowser:open');\n }\n pb.emit('local::open photoBrowserOpen', pb);\n }\n onOpened() {\n const pb = this;\n if (pb.$el && pb.params.type === 'standalone') {\n pb.$el.css('animation', 'none');\n }\n if (pb.$el) {\n pb.$el.trigger('photobrowser:opened');\n }\n pb.emit('local::opened photoBrowserOpened', pb);\n }\n onClose() {\n const pb = this;\n if (pb.destroyed) return;\n\n // Destroy Swiper\n if (pb.swiper && pb.swiper.destroy) {\n pb.swiper.destroy(true, false);\n pb.swiper = null;\n delete pb.swiper;\n }\n if (pb.thumbsSwiper && pb.thumbsSwiper.destroy) {\n pb.thumbsSwiper.destroy(true, false);\n pb.thumbsSwiper = null;\n delete pb.thumbsSwiper;\n }\n if (pb.$el) {\n pb.$el.trigger('photobrowser:close');\n }\n pb.emit('local::close photoBrowserClose', pb);\n }\n onClosed() {\n const pb = this;\n if (pb.destroyed) return;\n pb.opened = false;\n pb.$el = null;\n pb.el = null;\n delete pb.$el;\n delete pb.el;\n if (pb.$el) {\n pb.$el.trigger('photobrowser:closed');\n }\n pb.emit('local::closed photoBrowserClosed', pb);\n }\n\n // Open\n openPage() {\n const pb = this;\n if (pb.opened) return pb;\n const pageHtml = pb.renderPage();\n pb.view.router.navigate({\n url: pb.url,\n route: {\n content: pageHtml,\n path: pb.url,\n on: {\n pageBeforeIn(e, page) {\n pb.view.$el.addClass(`with-photo-browser-page with-photo-browser-page-${pb.params.theme}`);\n pb.onOpen('page', page.el);\n },\n pageAfterIn(e, page) {\n pb.onOpened('page', page.el);\n },\n pageBeforeOut(e, page) {\n pb.view.$el.removeClass(`with-photo-browser-page with-photo-browser-page-exposed with-photo-browser-page-${pb.params.theme}`);\n pb.onClose('page', page.el);\n },\n pageAfterOut(e, page) {\n pb.onClosed('page', page.el);\n }\n }\n }\n });\n return pb;\n }\n openStandalone() {\n const pb = this;\n if (pb.opened) return pb;\n const standaloneHtml = pb.renderStandalone();\n const popupParams = {\n backdrop: false,\n content: standaloneHtml,\n on: {\n popupOpen(popup) {\n pb.onOpen('popup', popup.el);\n },\n popupOpened(popup) {\n pb.onOpened('popup', popup.el);\n },\n popupClose(popup) {\n pb.onClose('popup', popup.el);\n },\n popupClosed(popup) {\n pb.onClosed('popup', popup.el);\n }\n }\n };\n if (pb.params.routableModals && pb.view) {\n pb.view.router.navigate({\n url: pb.url,\n route: {\n path: pb.url,\n popup: popupParams\n }\n });\n } else {\n pb.modal = pb.app.popup.create(popupParams).open();\n }\n return pb;\n }\n openPopup() {\n const pb = this;\n if (pb.opened) return pb;\n const popupHtml = pb.renderPopup();\n const popupParams = {\n content: popupHtml,\n push: pb.params.popupPush,\n closeByBackdropClick: pb.params.closeByBackdropClick,\n on: {\n popupOpen(popup) {\n pb.onOpen('popup', popup.el);\n },\n popupOpened(popup) {\n pb.onOpened('popup', popup.el);\n },\n popupClose(popup) {\n pb.onClose('popup', popup.el);\n },\n popupClosed(popup) {\n pb.onClosed('popup', popup.el);\n }\n }\n };\n if (pb.params.routableModals && pb.view) {\n pb.view.router.navigate({\n url: pb.url,\n route: {\n path: pb.url,\n popup: popupParams\n }\n });\n } else {\n pb.modal = pb.app.popup.create(popupParams).open();\n }\n return pb;\n }\n\n // Exposition\n expositionEnable() {\n const pb = this;\n if (pb.params.type === 'page') {\n pb.view.$el.addClass('with-photo-browser-page-exposed');\n }\n if (pb.$el) pb.$el.addClass('photo-browser-exposed');\n if (pb.params.expositionHideCaptions) pb.$captionsContainerEl.addClass('photo-browser-captions-exposed');\n pb.exposed = true;\n return pb;\n }\n expositionDisable() {\n const pb = this;\n if (pb.params.type === 'page') {\n pb.view.$el.removeClass('with-photo-browser-page-exposed');\n }\n if (pb.$el) pb.$el.removeClass('photo-browser-exposed');\n if (pb.params.expositionHideCaptions) pb.$captionsContainerEl.removeClass('photo-browser-captions-exposed');\n pb.exposed = false;\n return pb;\n }\n expositionToggle() {\n const pb = this;\n if (pb.params.type === 'page') {\n pb.view.$el.toggleClass('with-photo-browser-page-exposed');\n }\n if (pb.$el) pb.$el.toggleClass('photo-browser-exposed');\n if (pb.params.expositionHideCaptions) pb.$captionsContainerEl.toggleClass('photo-browser-captions-exposed');\n pb.exposed = !pb.exposed;\n return pb;\n }\n open(index) {\n const pb = this;\n const type = pb.params.type;\n if (pb.opened) {\n if (pb.swiper && typeof index !== 'undefined') {\n pb.swiper.slideTo(parseInt(index, 10));\n }\n return pb;\n }\n if (typeof index !== 'undefined') {\n pb.activeIndex = index;\n }\n if (type === 'standalone') {\n pb.openStandalone();\n }\n if (type === 'page') {\n pb.openPage();\n }\n if (type === 'popup') {\n pb.openPopup();\n }\n return pb;\n }\n close() {\n const pb = this;\n if (!pb.opened) return pb;\n if (pb.params.routableModals && pb.view || pb.openedIn === 'page') {\n pb.view.router.back();\n } else {\n pb.modal.once('modalClosed', () => {\n nextTick(() => {\n if (pb.destroyed) return;\n pb.modal.destroy();\n delete pb.modal;\n });\n });\n pb.modal.close();\n }\n return pb;\n }\n // eslint-disable-next-line\n init() {}\n destroy() {\n let pb = this;\n pb.emit('local::beforeDestroy photoBrowserBeforeDestroy', pb);\n if (pb.$el) {\n pb.$el.trigger('photobrowser:beforedestroy');\n pb.$el[0].f7PhotoBrowser = null;\n delete pb.$el[0].f7PhotoBrowser;\n }\n deleteProps(pb);\n pb.destroyed = true;\n pb = null;\n }\n}\nexport default PhotoBrowser;","import PhotoBrowser from './photo-browser-class.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nexport default {\n name: 'photoBrowser',\n params: {\n photoBrowser: {\n photos: [],\n thumbs: [],\n exposition: true,\n expositionHideCaptions: false,\n type: 'standalone',\n navbar: true,\n toolbar: true,\n theme: 'light',\n captionsTheme: undefined,\n iconsColor: undefined,\n popupPush: false,\n swipeToClose: true,\n pageBackLinkText: 'Back',\n popupCloseLinkText: undefined,\n popupCloseLinkIcon: true,\n navbarOfText: 'of',\n navbarShowCount: undefined,\n view: undefined,\n url: 'photos/',\n routableModals: false,\n virtualSlides: true,\n lazy: true,\n closeByBackdropClick: true,\n renderNavbar: undefined,\n renderToolbar: undefined,\n renderCaption: undefined,\n renderObject: undefined,\n renderLazyPhoto: undefined,\n renderPhoto: undefined,\n renderThumb: undefined,\n renderPage: undefined,\n renderPopup: undefined,\n renderStandalone: undefined,\n swiper: {\n cssMode: false,\n initialSlide: 0,\n spaceBetween: 20,\n speed: 300,\n loop: false,\n keyboard: {\n enabled: true\n },\n navigation: {\n nextEl: '.photo-browser-next',\n prevEl: '.photo-browser-prev'\n },\n zoom: {\n enabled: true,\n maxRatio: 3,\n minRatio: 1\n }\n }\n }\n },\n create() {\n const app = this;\n app.photoBrowser = ConstructorMethods({\n defaultSelector: '.photo-browser-popup, .photo-browser-page',\n constructor: PhotoBrowser,\n app,\n domProp: 'f7PhotoBrowser'\n });\n },\n static: {\n PhotoBrowser\n }\n};","import $ from '../../shared/dom7.js';\nimport { extend, now, nextTick } from '../../shared/utils.js';\nimport Modal from '../modal/modal-class.js';\n/** @jsx $jsx */\nimport $jsx from '../../shared/$jsx.js';\nclass Notification extends Modal {\n constructor(app, params) {\n const extendedParams = extend({\n on: {}\n }, app.params.notification, params);\n\n // Extends with open/close Modal methods;\n super(app, extendedParams);\n const notification = this;\n notification.app = app;\n notification.params = extendedParams;\n const {\n icon,\n title,\n titleRightText,\n subtitle,\n text,\n closeButton,\n closeTimeout,\n cssClass,\n closeOnClick\n } = notification.params;\n let $el;\n if (!notification.params.el) {\n // Find Element\n const notificationHtml = notification.render({\n icon,\n title,\n titleRightText,\n subtitle,\n text,\n closeButton,\n cssClass\n });\n $el = $(notificationHtml);\n } else {\n $el = $(notification.params.el);\n }\n if ($el && $el.length > 0 && $el[0].f7Modal) {\n return $el[0].f7Modal;\n }\n if ($el.length === 0) {\n return notification.destroy();\n }\n extend(notification, {\n $el,\n el: $el[0],\n type: 'notification'\n });\n $el[0].f7Modal = notification;\n if (closeButton) {\n $el.find('.notification-close-button').on('click', () => {\n notification.close();\n });\n }\n $el.on('click', e => {\n if (closeButton && $(e.target).closest('.notification-close-button').length) {\n return;\n }\n notification.emit('local::click notificationClick', notification);\n if (closeOnClick) notification.close();\n });\n notification.on('beforeDestroy', () => {\n $el.off('click');\n });\n\n /* Touch Events */\n let isTouched;\n let isMoved;\n let isScrolling;\n let touchesDiff;\n let touchStartTime;\n let notificationHeight;\n const touchesStart = {};\n function handleTouchStart(e) {\n if (isTouched) return;\n isTouched = true;\n isMoved = false;\n isScrolling = undefined;\n touchStartTime = now();\n touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n }\n function handleTouchMove(e) {\n if (!isTouched) return;\n const pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n const pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n if (typeof isScrolling === 'undefined') {\n isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) < Math.abs(pageX - touchesStart.x));\n }\n if (isScrolling) {\n isTouched = false;\n return;\n }\n e.preventDefault();\n if (!isMoved) {\n notification.$el.removeClass('notification-transitioning');\n notification.$el.transition(0);\n notificationHeight = notification.$el[0].offsetHeight / 2;\n }\n isMoved = true;\n touchesDiff = pageY - touchesStart.y;\n let newTranslate = touchesDiff;\n if (touchesDiff > 0) {\n newTranslate = touchesDiff ** 0.8;\n }\n notification.$el.transform(`translate3d(0, ${newTranslate}px, 0)`);\n }\n function handleTouchEnd() {\n if (!isTouched || !isMoved) {\n isTouched = false;\n isMoved = false;\n return;\n }\n isTouched = false;\n isMoved = false;\n if (touchesDiff === 0) {\n return;\n }\n const timeDiff = now() - touchStartTime;\n notification.$el.transition('');\n notification.$el.addClass('notification-transitioning');\n notification.$el.transform('');\n if (touchesDiff < -10 && timeDiff < 300 || -touchesDiff >= notificationHeight / 1) {\n notification.close();\n }\n }\n function attachTouchEvents() {\n notification.$el.on(app.touchEvents.start, handleTouchStart, {\n passive: true\n });\n app.on('touchmove:active', handleTouchMove);\n app.on('touchend:passive', handleTouchEnd);\n }\n function detachTouchEvents() {\n notification.$el.off(app.touchEvents.start, handleTouchStart, {\n passive: true\n });\n app.off('touchmove:active', handleTouchMove);\n app.off('touchend:passive', handleTouchEnd);\n }\n let timeoutId;\n function closeOnTimeout() {\n timeoutId = nextTick(() => {\n if (isTouched && isMoved) {\n closeOnTimeout();\n return;\n }\n notification.close();\n }, closeTimeout);\n }\n notification.on('open', () => {\n if (notification.params.swipeToClose) {\n attachTouchEvents();\n }\n $('.notification.modal-in').each(openedEl => {\n const notificationInstance = app.notification.get(openedEl);\n if (openedEl !== notification.el && notificationInstance) {\n notificationInstance.close();\n }\n });\n if (closeTimeout) {\n closeOnTimeout();\n }\n });\n notification.on('close beforeDestroy', () => {\n if (notification.params.swipeToClose) {\n detachTouchEvents();\n }\n clearTimeout(timeoutId);\n });\n return notification;\n }\n render() {\n const notification = this;\n if (notification.params.render) return notification.params.render.call(notification, notification);\n const {\n icon,\n title,\n titleRightText,\n subtitle,\n text,\n closeButton,\n cssClass\n } = notification.params;\n return $jsx(\"div\", {\n class: `notification ${icon ? 'notification-with-icon' : ''} ${cssClass || ''}`\n }, $jsx(\"div\", {\n class: \"notification-header\"\n }, icon && $jsx(\"div\", {\n class: \"notification-icon\"\n }, icon), title && $jsx(\"div\", {\n class: \"notification-title\"\n }, title), titleRightText && $jsx(\"div\", {\n class: \"notification-title-right-text\"\n }, titleRightText), closeButton && $jsx(\"span\", {\n class: \"notification-close-button\"\n })), $jsx(\"div\", {\n class: \"notification-content\"\n }, subtitle && $jsx(\"div\", {\n class: \"notification-subtitle\"\n }, subtitle), text && $jsx(\"div\", {\n class: \"notification-text\"\n }, text)));\n }\n}\nexport default Notification;","import { extend } from '../../shared/utils.js';\nimport Notification from './notification-class.js';\nimport ModalMethods from '../../shared/modal-methods.js';\nexport default {\n name: 'notification',\n static: {\n Notification\n },\n create() {\n const app = this;\n app.notification = extend({}, ModalMethods({\n app,\n constructor: Notification,\n defaultSelector: '.notification.modal-in'\n }));\n },\n params: {\n notification: {\n icon: null,\n title: null,\n titleRightText: null,\n subtitle: null,\n text: null,\n closeButton: false,\n closeTimeout: null,\n closeOnClick: false,\n swipeToClose: true,\n cssClass: null,\n render: null,\n containerEl: null\n }\n }\n};","/* eslint \"no-useless-escape\": \"off\" */\nimport $ from '../../shared/dom7.js';\nimport { extend, id, nextTick, deleteProps, iosPreloaderContent, mdPreloaderContent } from '../../shared/utils.js';\nimport { getDevice } from '../../shared/get-device.js';\nimport Framework7Class from '../../shared/class.js';\n/** @jsx $jsx */\nimport $jsx from '../../shared/$jsx.js';\nclass Autocomplete extends Framework7Class {\n constructor(app, params) {\n if (params === void 0) {\n params = {};\n }\n super(params, [app]);\n const ac = this;\n ac.app = app;\n const device = getDevice();\n const defaults = extend({\n on: {}\n }, app.params.autocomplete);\n\n // Extend defaults with modules params\n ac.useModulesParams(defaults);\n ac.params = extend(defaults, params);\n let $openerEl;\n if (ac.params.openerEl) {\n $openerEl = $(ac.params.openerEl);\n if ($openerEl.length) $openerEl[0].f7Autocomplete = ac;\n }\n let $inputEl;\n if (ac.params.inputEl) {\n $inputEl = $(ac.params.inputEl);\n if ($inputEl.length) $inputEl[0].f7Autocomplete = ac;\n }\n const uniqueId = id();\n let url = params.url;\n if (!url && $openerEl && $openerEl.length) {\n if ($openerEl.attr('href')) url = $openerEl.attr('href');else if ($openerEl.find('a').length > 0) {\n url = $openerEl.find('a').attr('href');\n }\n }\n if (!url || url === '#' || url === '') url = ac.params.url;\n const inputType = ac.params.multiple ? 'checkbox' : 'radio';\n extend(ac, {\n $openerEl,\n openerEl: $openerEl && $openerEl[0],\n $inputEl,\n inputEl: $inputEl && $inputEl[0],\n id: uniqueId,\n url,\n value: ac.params.value || [],\n inputType,\n inputName: `${inputType}-${uniqueId}`,\n $modalEl: undefined,\n $dropdownEl: undefined\n });\n let previousQuery = '';\n function onInputChange() {\n let query = ac.$inputEl.val().trim();\n if (!ac.params.source) return;\n ac.params.source.call(ac, query, items => {\n let itemsHTML = '';\n const limit = ac.params.limit ? Math.min(ac.params.limit, items.length) : items.length;\n ac.items = items;\n let regExp;\n if (ac.params.highlightMatches) {\n query = query.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n regExp = new RegExp(`(${query})`, 'i');\n }\n let firstValue;\n let firstItem;\n for (let i = 0; i < limit; i += 1) {\n const itemValue = typeof items[i] === 'object' ? items[i][ac.params.valueProperty] : items[i];\n const itemText = typeof items[i] === 'object' ? items[i][ac.params.textProperty] : items[i];\n if (i === 0) {\n firstValue = itemValue;\n firstItem = ac.items[i];\n }\n itemsHTML += ac.renderItem({\n value: itemValue,\n text: ac.params.highlightMatches ? itemText.replace(regExp, '$1') : itemText\n }, i);\n }\n if (itemsHTML === '' && query === '' && ac.params.dropdownPlaceholderText) {\n itemsHTML += ac.renderItem({\n placeholder: true,\n text: ac.params.dropdownPlaceholderText\n });\n }\n ac.$dropdownEl.find('ul').html(itemsHTML);\n if (ac.params.typeahead) {\n if (!firstValue || !firstItem) {\n return;\n }\n if (firstValue.toLowerCase().indexOf(query.toLowerCase()) !== 0) {\n return;\n }\n if (previousQuery.toLowerCase() === query.toLowerCase()) {\n ac.value = [];\n return;\n }\n if (previousQuery.toLowerCase().indexOf(query.toLowerCase()) === 0) {\n previousQuery = query;\n ac.value = [];\n return;\n }\n $inputEl.val(firstValue);\n $inputEl[0].setSelectionRange(query.length, firstValue.length);\n const previousValue = typeof ac.value[0] === 'object' ? ac.value[0][ac.params.valueProperty] : ac.value[0];\n if (!previousValue || firstValue.toLowerCase() !== previousValue.toLowerCase()) {\n ac.value = [firstItem];\n ac.emit('local::change autocompleteChange', [firstItem]);\n }\n }\n previousQuery = query;\n });\n }\n function onPageInputChange() {\n const inputEl = this;\n const value = inputEl.value;\n const isValues = $(inputEl).parents('.autocomplete-values').length > 0;\n let item;\n let itemValue;\n let aValue;\n if (isValues) {\n if (ac.inputType === 'checkbox' && !inputEl.checked) {\n for (let i = 0; i < ac.value.length; i += 1) {\n aValue = typeof ac.value[i] === 'string' ? ac.value[i] : ac.value[i][ac.params.valueProperty];\n if (aValue === value || aValue * 1 === value * 1) {\n ac.value.splice(i, 1);\n }\n }\n ac.updateValues();\n ac.emit('local::change autocompleteChange', ac.value);\n }\n return;\n }\n\n // Find Related Item\n for (let i = 0; i < ac.items.length; i += 1) {\n itemValue = typeof ac.items[i] === 'object' ? ac.items[i][ac.params.valueProperty] : ac.items[i];\n if (itemValue === value || itemValue * 1 === value * 1) item = ac.items[i];\n }\n if (ac.inputType === 'radio') {\n ac.value = [item];\n } else if (inputEl.checked) {\n ac.value.push(item);\n } else {\n for (let i = 0; i < ac.value.length; i += 1) {\n aValue = typeof ac.value[i] === 'object' ? ac.value[i][ac.params.valueProperty] : ac.value[i];\n if (aValue === value || aValue * 1 === value * 1) {\n ac.value.splice(i, 1);\n }\n }\n }\n\n // Update Values Block\n ac.updateValues();\n\n // On Select Callback\n if (ac.inputType === 'radio' && inputEl.checked || ac.inputType === 'checkbox') {\n ac.emit('local::change autocompleteChange', ac.value);\n }\n }\n function onHtmlClick(e) {\n const $targetEl = $(e.target);\n if ($targetEl.is(ac.$inputEl[0]) || ac.$dropdownEl && $targetEl.closest(ac.$dropdownEl[0]).length) return;\n ac.close();\n }\n function onOpenerClick() {\n ac.open();\n }\n function onInputFocus() {\n ac.open();\n }\n function onInputBlur() {\n if (ac.$dropdownEl.find('label.active-state').length > 0) return;\n setTimeout(() => {\n ac.close();\n }, 0);\n }\n function onResize() {\n ac.positionDropdown();\n }\n function onKeyDown(e) {\n if (!ac.opened) return;\n if (e.keyCode === 27) {\n // ESC\n e.preventDefault();\n ac.$inputEl.blur();\n return;\n }\n if (e.keyCode === 13) {\n // Enter\n const $selectedItemLabel = ac.$dropdownEl.find('.autocomplete-dropdown-selected label');\n if ($selectedItemLabel.length) {\n e.preventDefault();\n $selectedItemLabel.trigger('click');\n ac.$inputEl.blur();\n return;\n }\n if (ac.params.typeahead) {\n e.preventDefault();\n ac.$inputEl.blur();\n }\n return;\n }\n if (e.keyCode !== 40 && e.keyCode !== 38) return;\n e.preventDefault();\n const $selectedItem = ac.$dropdownEl.find('.autocomplete-dropdown-selected');\n let $newItem;\n if ($selectedItem.length) {\n $newItem = $selectedItem[e.keyCode === 40 ? 'next' : 'prev']('li');\n if (!$newItem.length) {\n $newItem = ac.$dropdownEl.find('li').eq(e.keyCode === 40 ? 0 : ac.$dropdownEl.find('li').length - 1);\n }\n } else {\n $newItem = ac.$dropdownEl.find('li').eq(e.keyCode === 40 ? 0 : ac.$dropdownEl.find('li').length - 1);\n }\n if ($newItem.hasClass('autocomplete-dropdown-placeholder')) return;\n $selectedItem.removeClass('autocomplete-dropdown-selected');\n $newItem.addClass('autocomplete-dropdown-selected');\n }\n function onDropdownClick() {\n const $clickedEl = $(this);\n let clickedItem;\n for (let i = 0; i < ac.items.length; i += 1) {\n const itemValue = typeof ac.items[i] === 'object' ? ac.items[i][ac.params.valueProperty] : ac.items[i];\n const value = $clickedEl.attr('data-value');\n if (itemValue === value || itemValue * 1 === value * 1) {\n clickedItem = ac.items[i];\n }\n }\n if (ac.params.updateInputValueOnSelect) {\n ac.$inputEl.val(typeof clickedItem === 'object' ? clickedItem[ac.params.valueProperty] : clickedItem);\n ac.$inputEl.trigger('input change');\n }\n ac.value = [clickedItem];\n ac.emit('local::change autocompleteChange', [clickedItem]);\n ac.close();\n }\n ac.attachEvents = function attachEvents() {\n if (ac.params.openIn !== 'dropdown' && ac.$openerEl) {\n ac.$openerEl.on('click', onOpenerClick);\n }\n if (ac.params.openIn === 'dropdown' && ac.$inputEl) {\n ac.$inputEl.on('focus', onInputFocus);\n ac.$inputEl.on(ac.params.inputEvents, onInputChange);\n if (device.android) {\n $('html').on('click', onHtmlClick);\n } else {\n ac.$inputEl.on('blur', onInputBlur);\n }\n ac.$inputEl.on('keydown', onKeyDown);\n }\n };\n ac.detachEvents = function attachEvents() {\n if (ac.params.openIn !== 'dropdown' && ac.$openerEl) {\n ac.$openerEl.off('click', onOpenerClick);\n }\n if (ac.params.openIn === 'dropdown' && ac.$inputEl) {\n ac.$inputEl.off('focus', onInputFocus);\n ac.$inputEl.off(ac.params.inputEvents, onInputChange);\n if (device.android) {\n $('html').off('click', onHtmlClick);\n } else {\n ac.$inputEl.off('blur', onInputBlur);\n }\n ac.$inputEl.off('keydown', onKeyDown);\n }\n };\n ac.attachDropdownEvents = function attachDropdownEvents() {\n ac.$dropdownEl.on('click', 'label', onDropdownClick);\n app.on('resize', onResize);\n };\n ac.detachDropdownEvents = function detachDropdownEvents() {\n ac.$dropdownEl.off('click', 'label', onDropdownClick);\n app.off('resize', onResize);\n };\n ac.attachPageEvents = function attachPageEvents() {\n ac.$el.on('change', 'input[type=\"radio\"], input[type=\"checkbox\"]', onPageInputChange);\n if (ac.params.closeOnSelect && !ac.params.multiple) {\n ac.$el.once('click', '.list label', () => {\n nextTick(() => {\n ac.close();\n });\n });\n }\n };\n ac.detachPageEvents = function detachPageEvents() {\n ac.$el.off('change', 'input[type=\"radio\"], input[type=\"checkbox\"]', onPageInputChange);\n };\n\n // Install Modules\n ac.useModules();\n\n // Init\n ac.init();\n return ac;\n }\n get view() {\n const ac = this;\n const {\n $openerEl,\n $inputEl,\n app\n } = ac;\n let view;\n if (ac.params.view) {\n view = ac.params.view;\n } else if ($openerEl || $inputEl) {\n const $el = $openerEl || $inputEl;\n view = $el.closest('.view').length && $el.closest('.view')[0].f7View;\n }\n if (!view) view = app.views.main;\n return view;\n }\n positionDropdown() {\n const ac = this;\n const {\n $inputEl,\n app,\n $dropdownEl\n } = ac;\n const $pageContentEl = $inputEl.parents('.page-content');\n if ($pageContentEl.length === 0) return;\n const inputOffset = $inputEl.offset();\n const inputOffsetWidth = $inputEl[0].offsetWidth;\n const inputOffsetHeight = $inputEl[0].offsetHeight;\n const $listEl = $inputEl.parents('.list');\n let $listParent;\n $listEl.parents().each(parentEl => {\n if ($listParent) return;\n const $parentEl = $(parentEl);\n if ($parentEl.parent($pageContentEl).length) $listParent = $parentEl;\n });\n const listOffset = $listEl.offset();\n const paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);\n const listOffsetLeft = $listEl.length > 0 ? listOffset.left - $pageContentEl.offset().left : 0;\n const inputOffsetLeft = inputOffset.left - ($listEl.length > 0 ? listOffset.left : 0) - (app.rtl ? 0 : 0);\n const inputOffsetTop = inputOffset.top - ($pageContentEl.offset().top - $pageContentEl[0].scrollTop);\n const maxHeight = $pageContentEl[0].scrollHeight - paddingBottom - (inputOffsetTop + $pageContentEl[0].scrollTop) - $inputEl[0].offsetHeight;\n const paddingProp = app.rtl ? 'padding-right' : 'padding-left';\n let paddingValue;\n if ($listEl.length) {\n paddingValue = (app.rtl ? $listEl[0].offsetWidth - inputOffsetLeft - inputOffsetWidth : inputOffsetLeft) - (app.theme === 'md' ? 16 : 15);\n }\n $dropdownEl.css({\n left: `${$listEl.length > 0 ? listOffsetLeft : inputOffsetLeft}px`,\n top: `${inputOffsetTop + $pageContentEl[0].scrollTop + inputOffsetHeight}px`,\n width: `${$listEl.length > 0 ? $listEl[0].offsetWidth : inputOffsetWidth}px`\n });\n $dropdownEl.children('.autocomplete-dropdown-inner').css({\n maxHeight: `${maxHeight}px`,\n [paddingProp]: $listEl.length > 0 ? `${paddingValue}px` : ''\n });\n }\n focus() {\n const ac = this;\n ac.$el.find('input[type=search]').focus();\n }\n source(query) {\n const ac = this;\n if (!ac.params.source) return;\n const {\n $el\n } = ac;\n ac.params.source.call(ac, query, items => {\n let itemsHTML = '';\n const limit = ac.params.limit ? Math.min(ac.params.limit, items.length) : items.length;\n ac.items = items;\n for (let i = 0; i < limit; i += 1) {\n let selected = false;\n const itemValue = typeof items[i] === 'object' ? items[i][ac.params.valueProperty] : items[i];\n for (let j = 0; j < ac.value.length; j += 1) {\n const aValue = typeof ac.value[j] === 'object' ? ac.value[j][ac.params.valueProperty] : ac.value[j];\n if (aValue === itemValue || aValue * 1 === itemValue * 1) selected = true;\n }\n itemsHTML += ac.renderItem({\n value: itemValue,\n text: typeof items[i] === 'object' ? items[i][ac.params.textProperty] : items[i],\n inputType: ac.inputType,\n id: ac.id,\n inputName: ac.inputName,\n selected\n }, i);\n }\n $el.find('.autocomplete-found ul').html(itemsHTML);\n if (items.length === 0) {\n if (query.length !== 0) {\n $el.find('.autocomplete-not-found').show();\n $el.find('.autocomplete-found, .autocomplete-values').hide();\n } else {\n $el.find('.autocomplete-values').show();\n $el.find('.autocomplete-found, .autocomplete-not-found').hide();\n }\n } else {\n $el.find('.autocomplete-found').show();\n $el.find('.autocomplete-not-found, .autocomplete-values').hide();\n }\n });\n }\n updateValues() {\n const ac = this;\n let valuesHTML = '';\n for (let i = 0; i < ac.value.length; i += 1) {\n valuesHTML += ac.renderItem({\n value: typeof ac.value[i] === 'object' ? ac.value[i][ac.params.valueProperty] : ac.value[i],\n text: typeof ac.value[i] === 'object' ? ac.value[i][ac.params.textProperty] : ac.value[i],\n inputType: ac.inputType,\n id: ac.id,\n inputName: `${ac.inputName}-checked}`,\n selected: true\n }, i);\n }\n ac.$el.find('.autocomplete-values ul').html(valuesHTML);\n }\n preloaderHide() {\n const ac = this;\n if (ac.params.openIn === 'dropdown' && ac.$dropdownEl) {\n ac.$dropdownEl.find('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');\n } else {\n $('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');\n }\n }\n preloaderShow() {\n const ac = this;\n if (ac.params.openIn === 'dropdown' && ac.$dropdownEl) {\n ac.$dropdownEl.find('.autocomplete-preloader').addClass('autocomplete-preloader-visible');\n } else {\n $('.autocomplete-preloader').addClass('autocomplete-preloader-visible');\n }\n }\n renderPreloader() {\n const ac = this;\n const preloaders = {\n iosPreloaderContent,\n mdPreloaderContent\n };\n return $jsx(\"div\", {\n class: `autocomplete-preloader preloader ${ac.params.preloaderColor ? `color-${ac.params.preloaderColor}` : ''}`\n }, preloaders[`${ac.app.theme}PreloaderContent`] || '');\n }\n renderSearchbar() {\n const ac = this;\n if (ac.params.renderSearchbar) return ac.params.renderSearchbar.call(ac);\n return $jsx(\"form\", {\n class: \"searchbar\"\n }, $jsx(\"div\", {\n class: \"searchbar-inner\"\n }, $jsx(\"div\", {\n class: \"searchbar-input-wrap\"\n }, $jsx(\"input\", {\n type: \"search\",\n spellcheck: ac.params.searchbarSpellcheck || 'false',\n placeholder: ac.params.searchbarPlaceholder\n }), $jsx(\"i\", {\n class: \"searchbar-icon\"\n }), $jsx(\"span\", {\n class: \"input-clear-button\"\n })), ac.params.searchbarDisableButton && $jsx(\"span\", {\n class: \"searchbar-disable-button\"\n }, ac.params.searchbarDisableText)));\n }\n renderItem(item, index) {\n const ac = this;\n if (ac.params.renderItem) return ac.params.renderItem.call(ac, item, index);\n const itemValue = item.value && typeof item.value === 'string' ? item.value.replace(/\"/g, '"') : item.value;\n if (ac.params.openIn !== 'dropdown') {\n return $jsx(\"li\", null, $jsx(\"label\", {\n class: `item-${item.inputType} item-content`\n }, $jsx(\"input\", {\n type: item.inputType,\n name: item.inputName,\n value: itemValue,\n _checked: item.selected\n }), $jsx(\"i\", {\n class: `icon icon-${item.inputType}`\n }), $jsx(\"div\", {\n class: \"item-inner\"\n }, $jsx(\"div\", {\n class: \"item-title\"\n }, item.text))));\n }\n // Dropdown\n if (!item.placeholder) {\n return $jsx(\"li\", null, $jsx(\"label\", {\n class: \"item-radio item-content\",\n \"data-value\": itemValue\n }, $jsx(\"div\", {\n class: \"item-inner\"\n }, $jsx(\"div\", {\n class: \"item-title\"\n }, item.text))));\n }\n\n // Dropwdown placeholder\n return $jsx(\"li\", {\n class: \"autocomplete-dropdown-placeholder\"\n }, $jsx(\"label\", {\n class: \"item-content\"\n }, $jsx(\"div\", {\n class: \"item-inner\"\n }, $jsx(\"div\", {\n class: \"item-title\"\n }, item.text))));\n }\n renderNavbar() {\n const ac = this;\n if (ac.params.renderNavbar) return ac.params.renderNavbar.call(ac);\n let pageTitle = ac.params.pageTitle;\n if (typeof pageTitle === 'undefined' && ac.$openerEl && ac.$openerEl.length) {\n pageTitle = ac.$openerEl.find('.item-title').text().trim();\n }\n const inPopup = ac.params.openIn === 'popup';\n\n // eslint-disable-next-line\n const navbarLeft = inPopup ? ac.params.preloader && $jsx(\"div\", {\n class: \"left\"\n }, ac.renderPreloader()) : $jsx(\"div\", {\n class: \"left sliding\"\n }, $jsx(\"a\", {\n class: \"link back\"\n }, $jsx(\"i\", {\n class: \"icon icon-back\"\n }), $jsx(\"span\", {\n class: \"if-not-md\"\n }, ac.params.pageBackLinkText)));\n const navbarRight = inPopup ? $jsx(\"div\", {\n class: \"right\"\n }, $jsx(\"a\", {\n class: \"link popup-close\",\n \"data-popup\": \".autocomplete-popup\"\n }, ac.params.popupCloseLinkText)) : ac.params.preloader && $jsx(\"div\", {\n class: \"right\"\n }, ac.renderPreloader());\n return $jsx(\"div\", {\n class: `navbar ${ac.params.navbarColorTheme ? `color-${ac.params.navbarColorTheme}` : ''}`\n }, $jsx(\"div\", {\n class: \"navbar-bg\"\n }), $jsx(\"div\", {\n class: `navbar-inner ${ac.params.navbarColorTheme ? `color-${ac.params.navbarColorTheme}` : ''}`\n }, navbarLeft, pageTitle && $jsx(\"div\", {\n class: \"title sliding\"\n }, pageTitle), navbarRight, $jsx(\"div\", {\n class: \"subnavbar sliding\"\n }, ac.renderSearchbar())));\n }\n renderDropdown() {\n const ac = this;\n if (ac.params.renderDropdown) return ac.params.renderDropdown.call(ac, ac.items);\n return $jsx(\"div\", {\n class: \"autocomplete-dropdown\"\n }, $jsx(\"div\", {\n class: \"autocomplete-dropdown-inner\"\n }, $jsx(\"div\", {\n class: `list no-safe-areas`\n }, $jsx(\"ul\", null))), ac.params.preloader && ac.renderPreloader());\n }\n renderPage(inPopup) {\n const ac = this;\n if (ac.params.renderPage) return ac.params.renderPage.call(ac, ac.items);\n return $jsx(\"div\", {\n class: \"page page-with-subnavbar autocomplete-page\",\n \"data-name\": \"autocomplete-page\"\n }, ac.renderNavbar(inPopup), $jsx(\"div\", {\n class: \"searchbar-backdrop\"\n }), $jsx(\"div\", {\n class: \"page-content\"\n }, $jsx(\"div\", {\n class: `list autocomplete-list autocomplete-found autocomplete-list-${ac.id} ${ac.params.formColorTheme ? `color-${ac.params.formColorTheme}` : ''}`\n }, $jsx(\"ul\", null)), $jsx(\"div\", {\n class: \"list autocomplete-not-found\"\n }, $jsx(\"ul\", null, $jsx(\"li\", {\n class: \"item-content\"\n }, $jsx(\"div\", {\n class: \"item-inner\"\n }, $jsx(\"div\", {\n class: \"item-title\"\n }, ac.params.notFoundText))))), $jsx(\"div\", {\n class: \"list autocomplete-values\"\n }, $jsx(\"ul\", null))));\n }\n renderPopup() {\n const ac = this;\n if (ac.params.renderPopup) return ac.params.renderPopup.call(ac, ac.items);\n return $jsx(\"div\", {\n class: \"popup autocomplete-popup\"\n }, $jsx(\"div\", {\n class: \"view\"\n }, ac.renderPage(true), \";\"));\n }\n onOpen(type, el) {\n const ac = this;\n const app = ac.app;\n const $el = $(el);\n ac.$el = $el;\n ac.el = $el[0];\n ac.openedIn = type;\n ac.opened = true;\n if (ac.params.openIn === 'dropdown') {\n ac.attachDropdownEvents();\n ac.$dropdownEl.addClass('autocomplete-dropdown-in');\n ac.$inputEl.trigger('input');\n } else {\n // Init SB\n let $searchbarEl = $el.find('.searchbar');\n if (ac.params.openIn === 'page' && app.theme === 'ios' && $searchbarEl.length === 0) {\n $searchbarEl = $(app.navbar.getElByPage($el)).find('.searchbar');\n }\n ac.searchbar = app.searchbar.create({\n el: $searchbarEl,\n backdropEl: $el.find('.searchbar-backdrop'),\n customSearch: true,\n on: {\n search(sb, query) {\n if (query.length === 0 && ac.searchbar.enabled) {\n ac.searchbar.backdropShow();\n } else {\n ac.searchbar.backdropHide();\n }\n ac.source(query);\n }\n }\n });\n\n // Attach page events\n ac.attachPageEvents();\n\n // Update Values On Page Init\n ac.updateValues();\n\n // Source on load\n if (ac.params.requestSourceOnOpen) ac.source('');\n }\n ac.emit('local::open autocompleteOpen', ac);\n }\n autoFocus() {\n const ac = this;\n if (ac.searchbar && ac.searchbar.$inputEl) {\n ac.searchbar.$inputEl.focus();\n }\n return ac;\n }\n onOpened() {\n const ac = this;\n if (ac.params.openIn !== 'dropdown' && ac.params.autoFocus) {\n ac.autoFocus();\n }\n ac.emit('local::opened autocompleteOpened', ac);\n }\n onClose() {\n const ac = this;\n if (ac.destroyed) return;\n\n // Destroy SB\n if (ac.searchbar && ac.searchbar.destroy) {\n ac.searchbar.destroy();\n ac.searchbar = null;\n delete ac.searchbar;\n }\n if (ac.params.openIn === 'dropdown') {\n ac.detachDropdownEvents();\n ac.$dropdownEl.removeClass('autocomplete-dropdown-in').remove();\n } else {\n ac.detachPageEvents();\n }\n ac.emit('local::close autocompleteClose', ac);\n }\n onClosed() {\n const ac = this;\n if (ac.destroyed) return;\n ac.opened = false;\n ac.$el = null;\n ac.el = null;\n delete ac.$el;\n delete ac.el;\n ac.emit('local::closed autocompleteClosed', ac);\n }\n openPage() {\n const ac = this;\n if (ac.opened) return ac;\n const pageHtml = ac.renderPage();\n ac.view.router.navigate({\n url: ac.url,\n route: {\n content: pageHtml,\n path: ac.url,\n on: {\n pageBeforeIn(e, page) {\n ac.onOpen('page', page.el);\n },\n pageAfterIn(e, page) {\n ac.onOpened('page', page.el);\n },\n pageBeforeOut(e, page) {\n ac.onClose('page', page.el);\n },\n pageAfterOut(e, page) {\n ac.onClosed('page', page.el);\n }\n },\n options: {\n animate: ac.params.animate\n }\n }\n });\n return ac;\n }\n openPopup() {\n const ac = this;\n if (ac.opened) return ac;\n const popupHtml = ac.renderPopup();\n const popupParams = {\n content: popupHtml,\n animate: ac.params.animate,\n push: ac.params.popupPush,\n swipeToClose: ac.params.popupSwipeToClose,\n on: {\n popupOpen(popup) {\n ac.onOpen('popup', popup.el);\n },\n popupOpened(popup) {\n ac.onOpened('popup', popup.el);\n },\n popupClose(popup) {\n ac.onClose('popup', popup.el);\n },\n popupClosed(popup) {\n ac.onClosed('popup', popup.el);\n }\n }\n };\n if (ac.params.routableModals && ac.view) {\n ac.view.router.navigate({\n url: ac.url,\n route: {\n path: ac.url,\n popup: popupParams\n }\n });\n } else {\n ac.modal = ac.app.popup.create(popupParams).open(ac.params.animate);\n }\n return ac;\n }\n openDropdown() {\n const ac = this;\n if (!ac.$dropdownEl) {\n ac.$dropdownEl = $(ac.renderDropdown());\n }\n const $pageContentEl = ac.$inputEl.parents('.page-content');\n if (ac.params.dropdownContainerEl) {\n $(ac.params.dropdownContainerEl).append(ac.$dropdownEl);\n } else if ($pageContentEl.length === 0) {\n ac.$dropdownEl.insertAfter(ac.$inputEl);\n } else {\n ac.positionDropdown();\n $pageContentEl.append(ac.$dropdownEl);\n }\n ac.onOpen('dropdown', ac.$dropdownEl);\n ac.onOpened('dropdown', ac.$dropdownEl);\n }\n open() {\n const ac = this;\n if (ac.opened) return ac;\n const openIn = ac.params.openIn;\n ac[`open${openIn.split('').map((el, index) => {\n if (index === 0) return el.toUpperCase();\n return el;\n }).join('')}`]();\n return ac;\n }\n close() {\n const ac = this;\n if (!ac.opened) return ac;\n if (ac.params.openIn === 'dropdown') {\n ac.onClose();\n ac.onClosed();\n } else if (ac.params.routableModals && ac.view || ac.openedIn === 'page') {\n ac.view.router.back({\n animate: ac.params.animate\n });\n } else {\n ac.modal.once('modalClosed', () => {\n nextTick(() => {\n if (ac.destroyed) return;\n ac.modal.destroy();\n delete ac.modal;\n });\n });\n ac.modal.close();\n }\n return ac;\n }\n init() {\n const ac = this;\n ac.attachEvents();\n }\n destroy() {\n const ac = this;\n ac.emit('local::beforeDestroy autocompleteBeforeDestroy', ac);\n ac.detachEvents();\n if (ac.$inputEl && ac.$inputEl[0]) {\n delete ac.$inputEl[0].f7Autocomplete;\n }\n if (ac.$openerEl && ac.$openerEl[0]) {\n delete ac.$openerEl[0].f7Autocomplete;\n }\n deleteProps(ac);\n ac.destroyed = true;\n }\n}\nexport default Autocomplete;","import { extend } from '../../shared/utils.js';\nimport Autocomplete from './autocomplete-class.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nexport default {\n name: 'autocomplete',\n params: {\n autocomplete: {\n openerEl: undefined,\n inputEl: undefined,\n view: undefined,\n // DropDown\n dropdownContainerEl: undefined,\n dropdownPlaceholderText: undefined,\n typeahead: false,\n highlightMatches: true,\n updateInputValueOnSelect: true,\n inputEvents: 'input',\n value: undefined,\n multiple: false,\n source: undefined,\n limit: undefined,\n valueProperty: 'id',\n textProperty: 'text',\n openIn: 'page',\n // or 'popup' or 'dropdown'\n pageBackLinkText: 'Back',\n popupCloseLinkText: 'Close',\n pageTitle: undefined,\n searchbarPlaceholder: 'Search...',\n searchbarDisableText: 'Cancel',\n searchbarDisableButton: true,\n searchbarSpellcheck: false,\n popupPush: false,\n popupSwipeToClose: undefined,\n animate: true,\n autoFocus: false,\n closeOnSelect: false,\n notFoundText: 'Nothing found',\n requestSourceOnOpen: false,\n // Preloader\n preloaderColor: undefined,\n preloader: false,\n // Colors\n formColorTheme: undefined,\n navbarColorTheme: undefined,\n // Routing\n routableModals: false,\n url: 'select/',\n // Custom render functions\n renderDropdown: undefined,\n renderPage: undefined,\n renderPopup: undefined,\n renderItem: undefined,\n renderSearchbar: undefined,\n renderNavbar: undefined\n }\n },\n static: {\n Autocomplete\n },\n create() {\n const app = this;\n app.autocomplete = extend(ConstructorMethods({\n defaultSelector: undefined,\n constructor: Autocomplete,\n app,\n domProp: 'f7Autocomplete'\n }), {\n open(autocompleteEl) {\n const ac = app.autocomplete.get(autocompleteEl);\n if (ac && ac.open) return ac.open();\n return undefined;\n },\n close(autocompleteEl) {\n const ac = app.autocomplete.get(autocompleteEl);\n if (ac && ac.close) return ac.close();\n return undefined;\n }\n });\n }\n};","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom7.js';\nimport { extend, deleteProps } from '../../shared/utils.js';\nimport { getSupport } from '../../shared/get-support.js';\nimport Framework7Class from '../../shared/class.js';\nclass Tooltip extends Framework7Class {\n constructor(app, params) {\n if (params === void 0) {\n params = {};\n }\n super(params, [app]);\n const tooltip = this;\n const support = getSupport();\n const defaults = extend({}, app.params.tooltip);\n const document = getDocument();\n\n // Extend defaults with modules params\n tooltip.useModulesParams(defaults);\n tooltip.params = extend(defaults, params);\n if (typeof params.offset === 'undefined' && support.touch && tooltip.params.trigger === 'hover') {\n tooltip.params.offset = 10;\n }\n const {\n targetEl,\n containerEl\n } = tooltip.params;\n if (!targetEl && !tooltip.params.delegated) return tooltip;\n const $targetEl = $(targetEl);\n if ($targetEl.length === 0 && !tooltip.params.delegated) return tooltip;\n if ($targetEl[0] && $targetEl[0].f7Tooltip && !tooltip.params.delegated) return $targetEl[0].f7Tooltip;\n let $containerEl = $(containerEl || app.$el).eq(0);\n if ($containerEl.length === 0) {\n $containerEl = app.$el;\n }\n const $el = $(tooltip.render()).eq(0);\n extend(tooltip, {\n app,\n $targetEl,\n targetEl: $targetEl && $targetEl[0],\n $containerEl,\n containerEl: $containerEl && $containerEl[0],\n $el,\n el: $el && $el[0],\n text: tooltip.params.text || '',\n visible: false,\n opened: false\n });\n if ($targetEl[0]) $targetEl[0].f7Tooltip = tooltip;\n const touchesStart = {};\n let isTouched;\n function handleClick() {\n if (tooltip.opened) tooltip.hide();else tooltip.show(this);\n }\n function handleClickOut(e) {\n if (tooltip.opened && ($(e.target).closest($targetEl).length || $(e.target).closest(tooltip.$el).length)) return;\n tooltip.hide();\n }\n function handleTouchStart(e) {\n if (isTouched) return;\n isTouched = true;\n touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n tooltip.show(this);\n }\n function handleTouchMove(e) {\n if (!isTouched) return;\n const x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n const y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n const distance = ((x - touchesStart.x) ** 2 + (y - touchesStart.y) ** 2) ** 0.5;\n if (distance > 50) {\n isTouched = false;\n tooltip.hide();\n }\n }\n function handleTouchEnd() {\n if (!isTouched) return;\n isTouched = false;\n tooltip.hide();\n }\n function handleMouseEnter() {\n tooltip.show(this);\n }\n function handleMouseLeave() {\n tooltip.hide();\n }\n function handleTransitionEnd() {\n if (!$el.hasClass('tooltip-in')) {\n $el.removeClass('tooltip-out').remove();\n }\n }\n tooltip.attachEvents = function attachEvents() {\n $el.on('transitionend', handleTransitionEnd);\n if (tooltip.params.trigger === 'click') {\n if (tooltip.params.delegated) {\n $(document).on('click', tooltip.params.targetEl, handleClick);\n } else {\n tooltip.$targetEl.on('click', handleClick);\n }\n $('html').on('click', handleClickOut);\n return;\n }\n if (tooltip.params.trigger === 'manual') return;\n if (support.touch) {\n const passive = support.passiveListener ? {\n passive: true\n } : false;\n if (tooltip.params.delegated) {\n $(document).on(app.touchEvents.start, tooltip.params.targetEl, handleTouchStart, passive);\n } else {\n tooltip.$targetEl.on(app.touchEvents.start, handleTouchStart, passive);\n }\n app.on('touchmove', handleTouchMove);\n app.on('touchend:passive', handleTouchEnd);\n } else {\n // eslint-disable-next-line\n if (tooltip.params.delegated) {\n $(document).on(support.pointerEvents ? 'pointerenter' : 'mouseenter', tooltip.params.targetEl, handleMouseEnter, true);\n $(document).on(support.pointerEvents ? 'pointerleave' : 'mouseleave', tooltip.params.targetEl, handleMouseLeave, true);\n } else {\n tooltip.$targetEl.on(support.pointerEvents ? 'pointerenter' : 'mouseenter', handleMouseEnter);\n tooltip.$targetEl.on(support.pointerEvents ? 'pointerleave' : 'mouseleave', handleMouseLeave);\n }\n }\n };\n tooltip.detachEvents = function detachEvents() {\n $el.off('transitionend', handleTransitionEnd);\n if (tooltip.params.trigger === 'click') {\n if (tooltip.params.delegated) {\n $(document).on('click', tooltip.params.targetEl, handleClick);\n } else {\n tooltip.$targetEl.off('click', handleClick);\n }\n $('html').off('click', handleClickOut);\n return;\n }\n if (tooltip.params.trigger === 'manual') return;\n if (support.touch) {\n const passive = support.passiveListener ? {\n passive: true\n } : false;\n if (tooltip.params.delegated) {\n $(document).off(app.touchEvents.start, tooltip.params.targetEl, handleTouchStart, passive);\n } else {\n tooltip.$targetEl.off(app.touchEvents.start, handleTouchStart, passive);\n }\n app.off('touchmove', handleTouchMove);\n app.off('touchend:passive', handleTouchEnd);\n } else {\n // eslint-disable-next-line\n if (tooltip.params.delegated) {\n $(document).off(support.pointerEvents ? 'pointerenter' : 'mouseenter', tooltip.params.targetEl, handleMouseEnter, true);\n $(document).off(support.pointerEvents ? 'pointerleave' : 'mouseleave', tooltip.params.targetEl, handleMouseLeave, true);\n } else {\n tooltip.$targetEl.off(support.pointerEvents ? 'pointerenter' : 'mouseenter', handleMouseEnter);\n tooltip.$targetEl.off(support.pointerEvents ? 'pointerleave' : 'mouseleave', handleMouseLeave);\n }\n }\n };\n\n // Install Modules\n tooltip.useModules();\n tooltip.init();\n return tooltip;\n }\n setTargetEl(targetEl) {\n const tooltip = this;\n tooltip.detachEvents();\n tooltip.$targetEl = $(targetEl);\n tooltip.targetEl = tooltip.$targetEl[0];\n tooltip.attachEvents();\n return tooltip;\n }\n position(targetEl) {\n const tooltip = this;\n const {\n $el,\n app,\n $containerEl\n } = tooltip;\n const hasContainerEl = !!tooltip.params.containerEl;\n const tooltipOffset = tooltip.params.offset || 0;\n $el.css({\n left: '',\n top: ''\n });\n const $targetEl = $(targetEl || tooltip.targetEl);\n const [width, height] = [$el.width(), $el.height()];\n $el.css({\n left: '',\n top: ''\n });\n let targetWidth;\n let targetHeight;\n let targetOffsetLeft;\n let targetOffsetTop;\n const boundaries = hasContainerEl && $containerEl.length ? $containerEl[0].getBoundingClientRect() : app;\n if ($targetEl && $targetEl.length > 0) {\n targetWidth = $targetEl.outerWidth();\n targetHeight = $targetEl.outerHeight();\n if (typeof targetWidth === 'undefined' && typeof targetHeight === 'undefined') {\n const clientRect = $targetEl[0].getBoundingClientRect();\n targetWidth = clientRect.width;\n targetHeight = clientRect.height;\n }\n const targetOffset = $targetEl.offset();\n targetOffsetLeft = targetOffset.left - boundaries.left;\n targetOffsetTop = targetOffset.top - boundaries.top;\n const targetParentPage = $targetEl.parents('.page');\n if (targetParentPage.length > 0) {\n targetOffsetTop -= targetParentPage[0].scrollTop;\n }\n }\n let [left, top] = [0, 0, 0];\n\n // Top Position\n let position = 'top';\n if (height + tooltipOffset < targetOffsetTop) {\n // On top\n top = targetOffsetTop - height - tooltipOffset;\n } else if (height < boundaries.height - targetOffsetTop - targetHeight) {\n // On bottom\n position = 'bottom';\n top = targetOffsetTop + targetHeight + tooltipOffset;\n } else {\n // On middle\n position = 'middle';\n top = targetHeight / 2 + targetOffsetTop - height / 2;\n if (top <= 0) {\n top = 8;\n } else if (top + height >= boundaries.height) {\n top = boundaries.height - height - 8;\n }\n }\n\n // Horizontal Position\n if (position === 'top' || position === 'bottom') {\n left = targetWidth / 2 + targetOffsetLeft - width / 2;\n if (left < 8) left = 8;\n if (left + width > boundaries.width) left = boundaries.width - width - 8;\n if (left < 0) left = 0;\n } else if (position === 'middle') {\n left = targetOffsetLeft - width;\n if (left < 8 || left + width > boundaries.width) {\n if (left < 8) left = targetOffsetLeft + targetWidth;\n if (left + width > boundaries.width) left = boundaries.width - width - 8;\n }\n }\n\n // Apply Styles\n $el.css({\n top: `${top}px`,\n left: `${left}px`\n });\n }\n show(aroundEl) {\n const tooltip = this;\n const {\n $el,\n $targetEl,\n $containerEl\n } = tooltip;\n if ($containerEl[0] && $el[0] && !$containerEl[0].contains($el[0])) {\n $containerEl.append($el);\n }\n tooltip.position(aroundEl);\n const $aroundEl = $(aroundEl);\n tooltip.visible = true;\n tooltip.opened = true;\n $targetEl.trigger('tooltip:show');\n $el.trigger('tooltip:show');\n if ($aroundEl.length && $aroundEl[0] !== $targetEl[0]) {\n $aroundEl.trigger('tooltip:show');\n }\n tooltip.emit('local::show tooltipShow', tooltip);\n $el.removeClass('tooltip-out').addClass('tooltip-in');\n return tooltip;\n }\n hide() {\n const tooltip = this;\n const {\n $el,\n $targetEl\n } = tooltip;\n tooltip.visible = false;\n tooltip.opened = false;\n $targetEl.trigger('tooltip:hide');\n $el.trigger('tooltip:hide');\n tooltip.emit('local::hide tooltipHide', tooltip);\n $el.addClass('tooltip-out').removeClass('tooltip-in');\n return tooltip;\n }\n render() {\n const tooltip = this;\n if (tooltip.params.render) return tooltip.params.render.call(tooltip, tooltip);\n const {\n cssClass,\n text\n } = tooltip.params;\n return `\n \n `.trim();\n }\n setText(newText) {\n const tooltip = this;\n if (typeof newText === 'undefined') {\n return tooltip;\n }\n tooltip.params.text = newText;\n tooltip.text = newText;\n if (tooltip.$el) {\n tooltip.$el.children('.tooltip-content').html(newText);\n }\n if (tooltip.opened) {\n tooltip.position();\n }\n return tooltip;\n }\n init() {\n const tooltip = this;\n tooltip.attachEvents();\n }\n destroy() {\n const tooltip = this;\n if (!tooltip.$targetEl || tooltip.destroyed) return;\n tooltip.$targetEl.trigger('tooltip:beforedestroy');\n tooltip.emit('local::beforeDestroy tooltipBeforeDestroy', tooltip);\n tooltip.$el.remove();\n if (tooltip.$targetEl[0]) delete tooltip.$targetEl[0].f7Tooltip;\n tooltip.detachEvents();\n deleteProps(tooltip);\n tooltip.destroyed = true;\n }\n}\nexport default Tooltip;","import $ from '../../shared/dom7.js';\nimport Tooltip from './tooltip-class.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nexport default {\n name: 'tooltip',\n static: {\n Tooltip\n },\n create() {\n const app = this;\n app.tooltip = ConstructorMethods({\n defaultSelector: '.tooltip',\n constructor: Tooltip,\n app,\n domProp: 'f7Tooltip'\n });\n app.tooltip.show = function show(el) {\n const $el = $(el);\n if ($el.length === 0) return undefined;\n const tooltip = $el[0].f7Tooltip;\n if (!tooltip) return undefined;\n tooltip.show($el[0]);\n return tooltip;\n };\n app.tooltip.hide = function hide(el) {\n const $el = $(el);\n if ($el.length === 0) return undefined;\n const tooltip = $el[0].f7Tooltip;\n if (!tooltip) return undefined;\n tooltip.hide();\n return tooltip;\n };\n app.tooltip.setText = function text(el, newText) {\n const $el = $(el);\n if ($el.length === 0) return undefined;\n const tooltip = $el[0].f7Tooltip;\n if (!tooltip) return undefined;\n tooltip.setText(newText);\n return tooltip;\n };\n },\n params: {\n tooltip: {\n targetEl: null,\n delegated: false,\n text: null,\n cssClass: null,\n render: null,\n offset: 0,\n trigger: 'hover',\n containerEl: undefined\n }\n },\n on: {\n tabMounted(tabEl) {\n const app = this;\n $(tabEl).find('.tooltip-init').each(el => {\n const text = $(el).attr('data-tooltip');\n if (!text) return;\n app.tooltip.create({\n targetEl: el,\n text\n });\n });\n },\n tabBeforeRemove(tabEl) {\n $(tabEl).find('.tooltip-init').each(el => {\n if (el.f7Tooltip) el.f7Tooltip.destroy();\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.tooltip-init').each(el => {\n const text = $(el).attr('data-tooltip');\n if (!text) return;\n app.tooltip.create({\n targetEl: el,\n text\n });\n });\n if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {\n page.$navbarEl.find('.tooltip-init').each(el => {\n const text = $(el).attr('data-tooltip');\n if (!text) return;\n app.tooltip.create({\n targetEl: el,\n text\n });\n });\n }\n },\n pageBeforeRemove(page) {\n const app = this;\n page.$el.find('.tooltip-init').each(el => {\n if (el.f7Tooltip) el.f7Tooltip.destroy();\n });\n if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {\n page.$navbarEl.find('.tooltip-init').each(el => {\n if (el.f7Tooltip) el.f7Tooltip.destroy();\n });\n }\n }\n },\n vnode: {\n 'tooltip-init': {\n insert(vnode) {\n const app = this;\n const el = vnode.elm;\n const text = $(el).attr('data-tooltip');\n if (!text) return;\n app.tooltip.create({\n targetEl: el,\n text\n });\n },\n update(vnode) {\n const el = vnode.elm;\n if (!el.f7Tooltip) return;\n if (vnode && vnode.data && vnode.data.attrs && vnode.data.attrs['data-tooltip']) {\n el.f7Tooltip.setText(vnode.data.attrs['data-tooltip']);\n }\n },\n destroy(vnode) {\n const el = vnode.elm;\n if (el.f7Tooltip) el.f7Tooltip.destroy();\n }\n }\n }\n};","/** @jsx $jsx */\nimport $jsx from '../../../shared/$jsx.js';\nexport default {\n render(self) {\n const {\n sliderLabel,\n sliderValue,\n sliderValueEditable,\n alphaLabelText\n } = self.params;\n return $jsx(\"div\", {\n class: \"color-picker-module color-picker-module-alpha-slider\"\n }, $jsx(\"div\", {\n class: \"color-picker-slider-wrap\"\n }, sliderLabel && $jsx(\"div\", {\n class: \"color-picker-slider-label\"\n }, alphaLabelText), $jsx(\"div\", {\n class: \"range-slider color-picker-slider color-picker-slider-alpha\"\n }), sliderValue && $jsx(\"div\", {\n class: \"color-picker-slider-value\"\n }, sliderValueEditable ? $jsx(\"input\", {\n type: \"number\",\n step: \"0.01\",\n min: \"0\",\n max: \"1\",\n class: \"color-picker-value-alpha\"\n }) : $jsx(\"span\", {\n class: \"color-picker-value-alpha\"\n }))));\n },\n init(self) {\n self.alphaRangeSlider = self.app.range.create({\n el: self.$el.find('.color-picker-slider-alpha'),\n min: 0,\n max: 1,\n step: 0.01,\n value: 1,\n on: {\n change(range, value) {\n const alpha = Math.floor(value * 100) / 100;\n self.setValue({\n alpha\n });\n }\n }\n });\n function handleInputChange(e) {\n const alpha = self.value.alpha;\n let value = parseFloat(e.target.value);\n if (Number.isNaN(value)) {\n e.target.value = alpha;\n return;\n }\n value = Math.max(0, Math.min(1, value));\n self.setValue({\n alpha: value\n });\n }\n self.$el.on('change', '.color-picker-module-alpha-slider input', handleInputChange);\n self.destroyAlphaSliderEvents = function destroyAlphaSliderEvents() {\n self.$el.off('change', '.color-picker-module-alpha-slider input', handleInputChange);\n };\n },\n update(self) {\n const {\n value\n } = self;\n const {\n sliderValue,\n sliderValueEditable\n } = self.params;\n const {\n alpha\n } = value;\n self.alphaRangeSlider.value = alpha;\n self.alphaRangeSlider.layout();\n if (sliderValue && sliderValueEditable) {\n self.$el.find('input.color-picker-value-alpha').val(alpha);\n } else {\n self.$el.find('span.color-picker-value-alpha').text(alpha);\n }\n },\n destroy(self) {\n if (self.alphaRangeSlider && self.alphaRangeSlider.destroy) {\n self.alphaRangeSlider.destroy();\n }\n delete self.alphaRangeSlider;\n if (self.destroyAlphaSliderEvents) self.destroyAlphaSliderEvents();\n delete self.destroyAlphaSliderEvents;\n }\n};","/** @jsx $jsx */\nimport $jsx from '../../../shared/$jsx.js';\nexport default {\n render() {\n return $jsx(\"div\", {\n class: \"color-picker-module color-picker-module-current-color\"\n }, $jsx(\"div\", {\n class: \"color-picker-current-color\"\n }));\n },\n update(self) {\n self.$el.find('.color-picker-module-current-color .color-picker-current-color').css('background-color', self.value.hex);\n }\n};","/** @jsx $jsx */\nimport $jsx from '../../../shared/$jsx.js';\nexport default {\n render(self) {\n const {\n hexLabel,\n hexLabelText,\n hexValueEditable\n } = self.params;\n return $jsx(\"div\", {\n class: \"color-picker-module color-picker-module-hex\"\n }, $jsx(\"div\", {\n class: \"color-picker-hex-wrap\"\n }, hexLabel && $jsx(\"div\", {\n class: \"color-picker-hex-label\"\n }, hexLabelText), $jsx(\"div\", {\n class: \"color-picker-hex-value\"\n }, hexValueEditable ? $jsx(\"input\", {\n type: \"text\",\n class: \"color-picker-value-hex\"\n }) : $jsx(\"span\", {\n class: \"color-picker-value-hex\"\n }))));\n },\n init(self) {\n function handleInputChange(e) {\n const hex = self.value.hex;\n let value = e.target.value.replace(/#/g, '');\n if (Number.isNaN(value) || !value || value.length !== 3 && value.length !== 6) {\n e.target.value = hex;\n return;\n }\n const min = 0;\n const current = parseInt(value, 16);\n const max = parseInt('ffffff', 16); // eslint-disable-line\n if (current > max) {\n value = 'fff';\n }\n if (current < min) {\n value = '000';\n }\n self.setValue({\n hex: value\n });\n }\n self.$el.on('change', '.color-picker-module-hex input', handleInputChange);\n self.destroyHexEvents = function destroyHexEvents() {\n self.$el.off('change', '.color-picker-module-hex input', handleInputChange);\n };\n },\n update(self) {\n const {\n value\n } = self;\n const {\n hexValueEditable\n } = self.params;\n const {\n hex\n } = value;\n if (hexValueEditable) {\n self.$el.find('input.color-picker-value-hex').val(hex);\n } else {\n self.$el.find('span.color-picker-value-hex').text(hex);\n }\n },\n destroy(self) {\n if (self.destroyHexEvents) self.destroyHexEvents();\n delete self.destroyHexEvents;\n }\n};","import $ from '../../../shared/dom7.js';\nimport { colorHsbToHsl } from '../../../shared/utils.js';\n/** @jsx $jsx */\nimport $jsx from '../../../shared/$jsx.js';\nexport default {\n render(self) {\n const {\n sliderLabel,\n sliderValue,\n sliderValueEditable,\n hueLabelText,\n saturationLabelText,\n brightnessLabelText\n } = self.params;\n return $jsx(\"div\", {\n class: \"color-picker-module color-picker-module-hsb-sliders\"\n }, $jsx(\"div\", {\n class: \"color-picker-slider-wrap\"\n }, sliderLabel && $jsx(\"div\", {\n class: \"color-picker-slider-label\"\n }, hueLabelText), $jsx(\"div\", {\n class: \"range-slider color-picker-slider color-picker-slider-hue\"\n }), sliderValue && $jsx(\"div\", {\n class: \"color-picker-slider-value\"\n }, sliderValueEditable ? $jsx(\"input\", {\n type: \"number\",\n step: \"0.1\",\n min: \"0\",\n max: \"360\",\n class: \"color-picker-value-hue\",\n \"data-color-index\": \"0\"\n }) : $jsx(\"span\", {\n class: \"color-picker-value-hue\"\n }))), $jsx(\"div\", {\n class: \"color-picker-slider-wrap\"\n }, sliderLabel && $jsx(\"div\", {\n class: \"color-picker-slider-label\"\n }, saturationLabelText), $jsx(\"div\", {\n class: \"range-slider color-picker-slider color-picker-slider-saturation\"\n }), sliderValue && $jsx(\"div\", {\n class: \"color-picker-slider-value\"\n }, sliderValueEditable ? $jsx(\"input\", {\n type: \"number\",\n step: \"0.1\",\n min: \"0\",\n max: \"100\",\n class: \"color-picker-value-saturation\",\n \"data-color-index\": \"1\"\n }) : $jsx(\"span\", {\n class: \"color-picker-value-saturation\"\n }))), $jsx(\"div\", {\n class: \"color-picker-slider-wrap\"\n }, sliderLabel && $jsx(\"div\", {\n class: \"color-picker-slider-label\"\n }, brightnessLabelText), $jsx(\"div\", {\n class: \"range-slider color-picker-slider color-picker-slider-brightness\"\n }), sliderValue && $jsx(\"div\", {\n class: \"color-picker-slider-value\"\n }, sliderValueEditable ? $jsx(\"input\", {\n type: \"number\",\n step: \"0.1\",\n min: \"0\",\n max: \"100\",\n class: \"color-picker-value-brightness\",\n \"data-color-index\": \"2\"\n }) : $jsx(\"span\", {\n class: \"color-picker-value-brightness\"\n }))));\n },\n init(self) {\n self.hueRangeSlider = self.app.range.create({\n el: self.$el.find('.color-picker-slider-hue'),\n min: 0,\n max: 360,\n step: 0.1,\n value: 0,\n on: {\n change(range, value) {\n self.setValue({\n hue: value\n });\n }\n }\n });\n self.saturationRangeSlider = self.app.range.create({\n el: self.$el.find('.color-picker-slider-saturation'),\n min: 0,\n max: 1,\n step: 0.001,\n value: 0,\n on: {\n change(range, value) {\n const s = Math.floor(value * 1000) / 1000;\n self.setValue({\n hsb: [self.value.hsb[0], s, self.value.hsb[2]]\n });\n }\n }\n });\n self.brightnessRangeSlider = self.app.range.create({\n el: self.$el.find('.color-picker-slider-brightness'),\n min: 0,\n max: 1,\n step: 0.001,\n value: 0,\n on: {\n change(range, value) {\n const b = Math.floor(value * 1000) / 1000;\n self.setValue({\n hsb: [self.value.hsb[0], self.value.hsb[1], b]\n });\n }\n }\n });\n function handleInputChange(e) {\n const hsb = [...self.value.hsb];\n const index = parseInt($(e.target).attr('data-color-index'), 10);\n let value = parseFloat(e.target.value);\n if (Number.isNaN(value)) {\n e.target.value = hsb[index];\n return;\n }\n if (index === 0) {\n value = Math.max(0, Math.min(360, value));\n } else {\n value = Math.max(0, Math.min(100, value)) / 100;\n }\n hsb[index] = value;\n self.setValue({\n hsb\n });\n }\n self.$el.on('change', '.color-picker-module-hsb-sliders input', handleInputChange);\n self.destroyHsbSlidersEvents = function destroyHsbSlidersEvents() {\n self.$el.off('change', '.color-picker-module-hsb-sliders input', handleInputChange);\n };\n },\n update(self) {\n const {\n app,\n value\n } = self;\n const {\n sliderValue,\n sliderValueEditable\n } = self.params;\n const {\n hsb,\n hue\n } = value;\n self.hueRangeSlider.value = hue;\n self.saturationRangeSlider.value = hsb[1];\n self.brightnessRangeSlider.value = hsb[2];\n self.hueRangeSlider.layout();\n self.saturationRangeSlider.layout();\n self.brightnessRangeSlider.layout();\n const hslCurrent = colorHsbToHsl(hsb[0], hsb[1], 1);\n const hslLeft = colorHsbToHsl(hsb[0], 0, 1);\n const hslRight = colorHsbToHsl(hsb[0], 1, 1);\n const brightness = hsb[2];\n self.hueRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', `hsl(${hue}, 100%, 50%)`);\n self.saturationRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', `hsl(${hslCurrent[0]}, ${hslCurrent[1] * 100}%, ${hslCurrent[2] * 100}%)`);\n self.brightnessRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', `rgb(${brightness * 255}, ${brightness * 255}, ${brightness * 255})`);\n self.saturationRangeSlider.$el.find('.range-bar').css('background-image', `linear-gradient(${app.rtl ? 'to left' : 'to right'}, hsl(${hslLeft[0]}, ${hslLeft[1] * 100}%, ${hslLeft[2] * 100}%), hsl(${hslRight[0]}, ${hslRight[1] * 100}%, ${hslRight[2] * 100}%))`);\n if (sliderValue && sliderValueEditable) {\n self.$el.find('input.color-picker-value-hue').val(`${hue}`);\n self.$el.find('input.color-picker-value-saturation').val(`${hsb[1] * 1000 / 10}`);\n self.$el.find('input.color-picker-value-brightness').val(`${hsb[2] * 1000 / 10}`);\n } else if (sliderValue) {\n self.$el.find('span.color-picker-value-hue').text(`${hue}`);\n self.$el.find('span.color-picker-value-saturation').text(`${hsb[1] * 1000 / 10}`);\n self.$el.find('span.color-picker-value-brightness').text(`${hsb[2] * 1000 / 10}`);\n }\n },\n destroy(self) {\n if (self.hueRangeSlider && self.hueRangeSlider.destroy) {\n self.hueRangeSlider.destroy();\n }\n if (self.saturationRangeSlider && self.saturationRangeSlider.destroy) {\n self.saturationRangeSlider.destroy();\n }\n if (self.brightnessRangeSlider && self.brightnessRangeSlider.destroy) {\n self.brightnessRangeSlider.destroy();\n }\n delete self.hueRangeSlider;\n delete self.saturationRangeSlider;\n delete self.brightnessRangeSlider;\n if (self.destroyHsbSlidersEvents) self.destroyHsbSlidersEvents();\n delete self.destroyHsbSlidersEvents;\n }\n};","/** @jsx $jsx */\nimport $jsx from '../../../shared/$jsx.js';\nexport default {\n render(self) {\n const {\n sliderLabel,\n sliderValue,\n sliderValueEditable,\n hueLabelText\n } = self.params;\n return $jsx(\"div\", {\n class: \"color-picker-module color-picker-module-hue-slider\"\n }, $jsx(\"div\", {\n class: \"color-picker-slider-wrap\"\n }, sliderLabel && $jsx(\"div\", {\n class: \"color-picker-slider-label\"\n }, hueLabelText), $jsx(\"div\", {\n class: \"range-slider color-picker-slider color-picker-slider-hue\"\n }), sliderValue && $jsx(\"div\", {\n class: \"color-picker-slider-value\"\n }, sliderValueEditable ? $jsx(\"input\", {\n type: \"number\",\n step: \"0.1\",\n min: \"0\",\n max: \"360\",\n class: \"color-picker-value-hue\"\n }) : $jsx(\"span\", {\n class: \"color-picker-value-hue\"\n }))));\n },\n init(self) {\n self.hueRangeSlider = self.app.range.create({\n el: self.$el.find('.color-picker-slider-hue'),\n min: 0,\n max: 360,\n step: 0.1,\n value: 0,\n on: {\n change(range, value) {\n self.setValue({\n hue: value\n });\n }\n }\n });\n },\n update(self) {\n const {\n value\n } = self;\n const {\n sliderValue,\n sliderValueEditable\n } = self.params;\n const {\n hue\n } = value;\n self.hueRangeSlider.value = hue;\n self.hueRangeSlider.layout();\n self.hueRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', `hsl(${hue}, 100%, 50%)`);\n if (sliderValue && sliderValueEditable) {\n self.$el.find('input.color-picker-value-hue').val(`${hue}`);\n } else if (sliderValue) {\n self.$el.find('span.color-picker-value-hue').text(`${hue}`);\n }\n },\n destroy(self) {\n if (self.hueRangeSlider && self.hueRangeSlider.destroy) {\n self.hueRangeSlider.destroy();\n }\n delete self.hueRangeSlider;\n }\n};","import { colorHsbToHsl } from '../../../shared/utils.js';\n/** @jsx $jsx */\nimport $jsx from '../../../shared/$jsx.js';\nexport default {\n render(self) {\n const {\n sliderLabel,\n sliderValue,\n sliderValueEditable,\n brightnessLabelText\n } = self.params;\n return $jsx(\"div\", {\n class: \"color-picker-module color-picker-module-brightness-slider\"\n }, $jsx(\"div\", {\n class: \"color-picker-slider-wrap\"\n }, sliderLabel && $jsx(\"div\", {\n class: \"color-picker-slider-label\"\n }, brightnessLabelText), $jsx(\"div\", {\n class: \"range-slider color-picker-slider color-picker-slider-brightness\"\n }), sliderValue && $jsx(\"div\", {\n class: \"color-picker-slider-value\"\n }, sliderValueEditable ? $jsx(\"input\", {\n type: \"number\",\n step: \"0.1\",\n min: \"0\",\n max: \"100\",\n class: \"color-picker-value-brightness\"\n }) : $jsx(\"span\", {\n class: \"color-picker-value-brightness\"\n }))));\n },\n init(self) {\n self.brightnessRangeSlider = self.app.range.create({\n el: self.$el.find('.color-picker-slider-brightness'),\n min: 0,\n max: 1,\n step: 0.001,\n value: 0,\n on: {\n change(range, value) {\n const b = Math.floor(value * 1000) / 1000;\n self.setValue({\n hsb: [self.value.hsb[0], self.value.hsb[1], b]\n });\n }\n }\n });\n },\n update(self) {\n const {\n value,\n app\n } = self;\n const {\n sliderValue,\n sliderValueEditable\n } = self.params;\n const {\n hsb\n } = value;\n self.brightnessRangeSlider.value = hsb[2];\n self.brightnessRangeSlider.layout();\n const hslCurrent = colorHsbToHsl(hsb[0], hsb[1], hsb[2]);\n const hslLeft = colorHsbToHsl(hsb[0], hsb[1], 0);\n const hslRight = colorHsbToHsl(hsb[0], hsb[1], 1);\n self.brightnessRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', `hsl(${hslCurrent[0]}, ${hslCurrent[1] * 100}%, ${hslCurrent[2] * 100}%)`);\n self.brightnessRangeSlider.$el.find('.range-bar').css('background-image', `linear-gradient(${app.rtl ? 'to left' : 'to right'}, hsl(${hslLeft[0]}, ${hslLeft[1] * 100}%, ${hslLeft[2] * 100}%), hsl(${hslRight[0]}, ${hslRight[1] * 100}%, ${hslRight[2] * 100}%))`);\n if (sliderValue && sliderValueEditable) {\n self.$el.find('input.color-picker-value-brightness').val(`${hsb[2] * 1000 / 10}`);\n } else if (sliderValue) {\n self.$el.find('span.color-picker-value-brightness').text(`${hsb[2] * 1000 / 10}`);\n }\n },\n destroy(self) {\n if (self.brightnessRangeSlider && self.brightnessRangeSlider.destroy) {\n self.brightnessRangeSlider.destroy();\n }\n delete self.brightnessRangeSlider;\n }\n};","/* eslint indent: [\"off\"] */\nimport $ from '../../../shared/dom7.js';\n/** @jsx $jsx */\nimport $jsx from '../../../shared/$jsx.js';\nexport default {\n render(self) {\n return $jsx(\"div\", {\n class: \"color-picker-module color-picker-module-palette\"\n }, $jsx(\"div\", {\n class: \"color-picker-palette\"\n }, self.params.palette.map(p => {\n if (Array.isArray(p)) {\n let row = '';\n // prettier-ignore\n row += p.map(c => `\n
\n `).join('');\n row += '
';\n return row;\n }\n return $jsx(\"div\", {\n class: \"color-picker-palette-value\",\n \"data-palette-color\": p,\n style: `background-color: ${p}`\n });\n })));\n },\n init(self) {\n function handlePaletteClick(e) {\n const hex = $(e.target).attr('data-palette-color');\n self.setValue({\n hex\n });\n }\n self.$el.on('click', '.color-picker-module-palette .color-picker-palette-value', handlePaletteClick);\n self.destroyPaletteEvents = function destroyPaletteEvents() {\n self.$el.off('click', '.color-picker-module-hex input', handlePaletteClick);\n };\n },\n destroy(self) {\n if (self.destroyPaletteEvents) {\n self.destroyPaletteEvents();\n }\n delete self.destroyPaletteEvents;\n }\n};","/** @jsx $jsx */\nimport $jsx from '../../../shared/$jsx.js';\nexport default {\n render() {\n return $jsx(\"div\", {\n class: \"color-picker-module color-picker-module-initial-current-colors\"\n }, $jsx(\"div\", {\n class: \"color-picker-initial-current-colors\"\n }, $jsx(\"div\", {\n class: \"color-picker-initial-color\"\n }), $jsx(\"div\", {\n class: \"color-picker-current-color\"\n })));\n },\n init(self) {\n function handleInitialColorClick() {\n if (self.initialValue) {\n const {\n hex,\n alpha\n } = self.initialValue;\n self.setValue({\n hex,\n alpha\n });\n }\n }\n self.$el.on('click', '.color-picker-initial-color', handleInitialColorClick);\n self.destroyInitialCurrentEvents = function destroyInitialCurrentEvents() {\n self.$el.off('click', '.color-picker-initial-color', handleInitialColorClick);\n };\n },\n update(self) {\n self.$el.find('.color-picker-module-initial-current-colors .color-picker-initial-color').css('background-color', self.initialValue.hex);\n self.$el.find('.color-picker-module-initial-current-colors .color-picker-current-color').css('background-color', self.value.hex);\n },\n destroy(self) {\n if (self.destroyInitialCurrentEvents) {\n self.destroyInitialCurrentEvents();\n }\n delete self.destroyInitialCurrentEvents;\n }\n};","import $ from '../../../shared/dom7.js';\n/** @jsx $jsx */\nimport $jsx from '../../../shared/$jsx.js';\nexport default {\n render(self) {\n const {\n barLabel,\n barValue,\n barValueEditable,\n redLabelText,\n greenLabelText,\n blueLabelText\n } = self.params;\n return $jsx(\"div\", {\n class: \"color-picker-module color-picker-module-rgb-bars\"\n }, $jsx(\"div\", {\n class: \"color-picker-bar-wrap\"\n }, barLabel && $jsx(\"div\", {\n class: \"color-picker-bar-label\"\n }, redLabelText), $jsx(\"div\", {\n class: \"range-slider color-picker-bar color-picker-bar-red\"\n }), barValue && $jsx(\"div\", {\n class: \"color-picker-bar-value\"\n }, barValueEditable ? $jsx(\"input\", {\n type: \"number\",\n step: \"1\",\n min: \"0\",\n max: \"255\",\n class: \"color-picker-value-bar-red\",\n \"data-color-index\": \"0\"\n }) : $jsx(\"span\", {\n class: \"color-picker-value-bar-red\"\n }))), $jsx(\"div\", {\n class: \"color-picker-bar-wrap\"\n }, barLabel && $jsx(\"div\", {\n class: \"color-picker-bar-label\"\n }, greenLabelText), $jsx(\"div\", {\n class: \"range-slider color-picker-bar color-picker-bar-green\"\n }), barValue && $jsx(\"div\", {\n class: \"color-picker-bar-value\"\n }, barValueEditable ? $jsx(\"input\", {\n type: \"number\",\n step: \"1\",\n min: \"0\",\n max: \"255\",\n class: \"color-picker-value-bar-green\",\n \"data-color-index\": \"1\"\n }) : $jsx(\"span\", {\n class: \"color-picker-value-bar-green\"\n }))), $jsx(\"div\", {\n class: \"color-picker-bar-wrap\"\n }, barLabel && $jsx(\"div\", {\n class: \"color-picker-bar-label\"\n }, blueLabelText), $jsx(\"div\", {\n class: \"range-slider color-picker-bar color-picker-bar-blue\"\n }), barValue && $jsx(\"div\", {\n class: \"color-picker-bar-value\"\n }, barValueEditable ? $jsx(\"input\", {\n type: \"number\",\n step: \"1\",\n min: \"0\",\n max: \"255\",\n class: \"color-picker-value-bar-blue\",\n \"data-color-index\": \"2\"\n }) : $jsx(\"span\", {\n class: \"color-picker-value-bar-blue\"\n }))));\n },\n init(self) {\n self.redBar = self.app.range.create({\n el: self.$el.find('.color-picker-bar-red'),\n min: 0,\n max: 255,\n step: 1,\n value: 0,\n vertical: true,\n on: {\n change(range, value) {\n self.setValue({\n rgb: [value, self.value.rgb[1], self.value.rgb[2]]\n });\n }\n }\n });\n self.greenBar = self.app.range.create({\n el: self.$el.find('.color-picker-bar-green'),\n min: 0,\n max: 255,\n step: 1,\n value: 0,\n vertical: true,\n on: {\n change(range, value) {\n self.setValue({\n rgb: [self.value.rgb[0], value, self.value.rgb[2]]\n });\n }\n }\n });\n self.blueBar = self.app.range.create({\n el: self.$el.find('.color-picker-bar-blue'),\n min: 0,\n max: 255,\n step: 1,\n value: 0,\n vertical: true,\n on: {\n change(range, value) {\n self.setValue({\n rgb: [self.value.rgb[0], self.value.rgb[1], value]\n });\n }\n }\n });\n function handleInputChange(e) {\n const rgb = [...self.value.rgb];\n const index = parseInt($(e.target).attr('data-color-index'), 10);\n let value = parseInt(e.target.value, 10);\n if (Number.isNaN(value)) {\n e.target.value = rgb[index];\n return;\n }\n value = Math.max(0, Math.min(255, value));\n rgb[index] = value;\n self.setValue({\n rgb\n });\n }\n self.$el.on('change', '.color-picker-module-rgb-bars input', handleInputChange);\n self.destroyRgbBarsEvents = function destroyRgbBarsEvents() {\n self.$el.off('change', '.color-picker-module-rgb-bars input', handleInputChange);\n };\n },\n update(self) {\n const {\n value,\n redBar,\n greenBar,\n blueBar\n } = self;\n const {\n barValue,\n barValueEditable\n } = self.params;\n const {\n rgb\n } = value;\n redBar.value = rgb[0];\n greenBar.value = rgb[1];\n blueBar.value = rgb[2];\n redBar.layout();\n greenBar.layout();\n blueBar.layout();\n redBar.$el.find('.range-bar').css('background-image', `linear-gradient(to top, rgb(0, ${rgb[1]}, ${rgb[2]}), rgb(255, ${rgb[1]}, ${rgb[2]}))`);\n greenBar.$el.find('.range-bar').css('background-image', `linear-gradient(to top, rgb(${rgb[0]}, 0, ${rgb[2]}), rgb(${rgb[0]}, 255, ${rgb[2]}))`);\n blueBar.$el.find('.range-bar').css('background-image', `linear-gradient(to top, rgb(${rgb[0]}, ${rgb[1]}, 0), rgb(${rgb[0]}, ${rgb[1]}, 255))`);\n if (barValue && barValueEditable) {\n self.$el.find('input.color-picker-value-bar-red').val(rgb[0]);\n self.$el.find('input.color-picker-value-bar-green').val(rgb[1]);\n self.$el.find('input.color-picker-value-bar-blue').val(rgb[2]);\n } else if (barValue) {\n self.$el.find('span.color-picker-value-bar-red').text(rgb[0]);\n self.$el.find('span.color-picker-value-bar-green').text(rgb[1]);\n self.$el.find('span.color-picker-value-bar-blue').text(rgb[2]);\n }\n },\n destroy(self) {\n if (self.redBar && self.redBar.destroy) {\n self.redBar.destroy();\n }\n if (self.greenBar && self.greenBar.destroy) {\n self.greenBar.destroy();\n }\n if (self.blueBar && self.blueBar.destroy) {\n self.blueBar.destroy();\n }\n delete self.redBar;\n delete self.greenBar;\n delete self.blueBar;\n if (self.destroyRgbBarsEvents) self.destroyRgbBarsEvents();\n delete self.destroyRgbBarsEvents;\n }\n};","import $ from '../../../shared/dom7.js';\n/** @jsx $jsx */\nimport $jsx from '../../../shared/$jsx.js';\nexport default {\n render(self) {\n const {\n sliderLabel,\n sliderValue,\n sliderValueEditable,\n redLabelText,\n greenLabelText,\n blueLabelText\n } = self.params;\n return $jsx(\"div\", {\n class: \"color-picker-module color-picker-module-rgb-sliders\"\n }, $jsx(\"div\", {\n class: \"color-picker-slider-wrap\"\n }, sliderLabel && $jsx(\"div\", {\n class: \"color-picker-slider-label\"\n }, redLabelText), $jsx(\"div\", {\n class: \"range-slider color-picker-slider color-picker-slider-red\"\n }), sliderValue && $jsx(\"div\", {\n class: \"color-picker-slider-value\"\n }, sliderValueEditable ? $jsx(\"input\", {\n type: \"number\",\n step: \"1\",\n min: \"0\",\n max: \"255\",\n class: \"color-picker-value-red\",\n \"data-color-index\": \"0\"\n }) : $jsx(\"span\", {\n class: \"color-picker-value-red\"\n }))), $jsx(\"div\", {\n class: \"color-picker-slider-wrap\"\n }, sliderLabel && $jsx(\"div\", {\n class: \"color-picker-slider-label\"\n }, greenLabelText), $jsx(\"div\", {\n class: \"range-slider color-picker-slider color-picker-slider-green\"\n }), sliderValue && $jsx(\"div\", {\n class: \"color-picker-slider-value\"\n }, sliderValueEditable ? $jsx(\"input\", {\n type: \"number\",\n step: \"1\",\n min: \"0\",\n max: \"255\",\n class: \"color-picker-value-green\",\n \"data-color-index\": \"1\"\n }) : $jsx(\"span\", {\n class: \"color-picker-value-green\"\n }))), $jsx(\"div\", {\n class: \"color-picker-slider-wrap\"\n }, sliderLabel && $jsx(\"div\", {\n class: \"color-picker-slider-label\"\n }, blueLabelText), $jsx(\"div\", {\n class: \"range-slider color-picker-slider color-picker-slider-blue\"\n }), sliderValue && $jsx(\"div\", {\n class: \"color-picker-slider-value\"\n }, sliderValueEditable ? $jsx(\"input\", {\n type: \"number\",\n step: \"1\",\n min: \"0\",\n max: \"255\",\n class: \"color-picker-value-blue\",\n \"data-color-index\": \"2\"\n }) : $jsx(\"span\", {\n class: \"color-picker-value-blue\"\n }))));\n },\n init(self) {\n self.redRangeSlider = self.app.range.create({\n el: self.$el.find('.color-picker-slider-red'),\n min: 0,\n max: 255,\n step: 1,\n value: 0,\n on: {\n change(range, value) {\n self.setValue({\n rgb: [value, self.value.rgb[1], self.value.rgb[2]]\n });\n }\n }\n });\n self.greenRangeSlider = self.app.range.create({\n el: self.$el.find('.color-picker-slider-green'),\n min: 0,\n max: 255,\n step: 1,\n value: 0,\n on: {\n change(range, value) {\n self.setValue({\n rgb: [self.value.rgb[0], value, self.value.rgb[2]]\n });\n }\n }\n });\n self.blueRangeSlider = self.app.range.create({\n el: self.$el.find('.color-picker-slider-blue'),\n min: 0,\n max: 255,\n step: 1,\n value: 0,\n on: {\n change(range, value) {\n self.setValue({\n rgb: [self.value.rgb[0], self.value.rgb[1], value]\n });\n }\n }\n });\n function handleInputChange(e) {\n const rgb = [...self.value.rgb];\n const index = parseInt($(e.target).attr('data-color-index'), 10);\n let value = parseInt(e.target.value, 10);\n if (Number.isNaN(value)) {\n e.target.value = rgb[index];\n return;\n }\n value = Math.max(0, Math.min(255, value));\n rgb[index] = value;\n self.setValue({\n rgb\n });\n }\n self.$el.on('change', '.color-picker-module-rgb-sliders input', handleInputChange);\n self.destroyRgbSlidersEvents = function destroyRgbSlidersEvents() {\n self.$el.off('change', '.color-picker-module-rgb-sliders input', handleInputChange);\n };\n },\n update(self) {\n const {\n app,\n value,\n redRangeSlider,\n greenRangeSlider,\n blueRangeSlider\n } = self;\n const {\n sliderValue,\n sliderValueEditable\n } = self.params;\n const {\n rgb\n } = value;\n redRangeSlider.value = rgb[0];\n greenRangeSlider.value = rgb[1];\n blueRangeSlider.value = rgb[2];\n redRangeSlider.layout();\n greenRangeSlider.layout();\n blueRangeSlider.layout();\n redRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`);\n greenRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`);\n blueRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`);\n const direction = app.rtl ? 'to left' : 'to right';\n redRangeSlider.$el.find('.range-bar').css('background-image', `linear-gradient(${direction}, rgb(0, ${rgb[1]}, ${rgb[2]}), rgb(255, ${rgb[1]}, ${rgb[2]}))`);\n greenRangeSlider.$el.find('.range-bar').css('background-image', `linear-gradient(${direction}, rgb(${rgb[0]}, 0, ${rgb[2]}), rgb(${rgb[0]}, 255, ${rgb[2]}))`);\n blueRangeSlider.$el.find('.range-bar').css('background-image', `linear-gradient(${direction}, rgb(${rgb[0]}, ${rgb[1]}, 0), rgb(${rgb[0]}, ${rgb[1]}, 255))`);\n if (sliderValue && sliderValueEditable) {\n self.$el.find('input.color-picker-value-red').val(rgb[0]);\n self.$el.find('input.color-picker-value-green').val(rgb[1]);\n self.$el.find('input.color-picker-value-blue').val(rgb[2]);\n } else if (sliderValue) {\n self.$el.find('span.color-picker-value-red').text(rgb[0]);\n self.$el.find('span.color-picker-value-green').text(rgb[1]);\n self.$el.find('span.color-picker-value-blue').text(rgb[2]);\n }\n },\n destroy(self) {\n if (self.redRangeSlider && self.redRangeSlider.destroy) {\n self.redRangeSlider.destroy();\n }\n if (self.greenRangeSlider && self.greenRangeSlider.destroy) {\n self.greenRangeSlider.destroy();\n }\n if (self.blueRangeSlider && self.blueRangeSlider.destroy) {\n self.blueRangeSlider.destroy();\n }\n delete self.redRangeSlider;\n delete self.greenRangeSlider;\n delete self.blueRangeSlider;\n if (self.destroyRgbSlidersEvents) self.destroyRgbSlidersEvents();\n delete self.destroyRgbSlidersEvents;\n }\n};","import $ from '../../../shared/dom7.js';\nimport { getSupport } from '../../../shared/get-support.js';\n/** @jsx $jsx */\nimport $jsx from '../../../shared/$jsx.js';\nexport default {\n render() {\n return $jsx(\"div\", {\n class: \"color-picker-module color-picker-module-sb-spectrum\"\n }, $jsx(\"div\", {\n class: \"color-picker-sb-spectrum\",\n style: \"background-color: hsl(0, 100%, 50%)\"\n }, $jsx(\"div\", {\n class: \"color-picker-sb-spectrum-handle\"\n })));\n },\n init(self) {\n const {\n app\n } = self;\n let isTouched;\n let isMoved;\n let touchStartX;\n let touchStartY;\n let touchCurrentX;\n let touchCurrentY;\n let specterRect;\n let specterIsTouched;\n let specterHandleIsTouched;\n const {\n $el\n } = self;\n function setSBFromSpecterCoords(x, y) {\n let s = (x - specterRect.left) / specterRect.width;\n let b = (y - specterRect.top) / specterRect.height;\n s = Math.max(0, Math.min(1, s));\n b = 1 - Math.max(0, Math.min(1, b));\n self.setValue({\n hsb: [self.value.hue, s, b]\n });\n }\n function handleTouchStart(e) {\n if (isMoved || isTouched) return;\n touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchCurrentX = touchStartX;\n touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n touchCurrentY = touchStartY;\n const $targetEl = $(e.target);\n specterHandleIsTouched = $targetEl.closest('.color-picker-sb-spectrum-handle').length > 0;\n if (!specterHandleIsTouched) {\n specterIsTouched = $targetEl.closest('.color-picker-sb-spectrum').length > 0;\n }\n if (specterIsTouched) {\n specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();\n setSBFromSpecterCoords(touchStartX, touchStartY);\n }\n if (specterHandleIsTouched || specterIsTouched) {\n $el.find('.color-picker-sb-spectrum-handle').addClass('color-picker-sb-spectrum-handle-pressed');\n }\n }\n function handleTouchMove(e) {\n if (!(specterIsTouched || specterHandleIsTouched)) return;\n touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n e.preventDefault();\n if (!isMoved) {\n // First move\n isMoved = true;\n if (specterHandleIsTouched) {\n specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();\n }\n }\n if (specterIsTouched || specterHandleIsTouched) {\n setSBFromSpecterCoords(touchCurrentX, touchCurrentY);\n }\n }\n function handleTouchEnd() {\n isMoved = false;\n if (specterIsTouched || specterHandleIsTouched) {\n $el.find('.color-picker-sb-spectrum-handle').removeClass('color-picker-sb-spectrum-handle-pressed');\n }\n specterIsTouched = false;\n specterHandleIsTouched = false;\n }\n function handleResize() {\n self.modules['sb-spectrum'].update(self);\n }\n const passiveListener = app.touchEvents.start === 'touchstart' && getSupport().passiveListener ? {\n passive: true,\n capture: false\n } : false;\n self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);\n app.on('touchmove:active', handleTouchMove);\n app.on('touchend:passive', handleTouchEnd);\n app.on('resize', handleResize);\n self.destroySpectrumEvents = function destroySpectrumEvents() {\n self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);\n app.off('touchmove:active', handleTouchMove);\n app.off('touchend:passive', handleTouchEnd);\n app.off('resize', handleResize);\n };\n },\n update(self) {\n const {\n value\n } = self;\n const {\n hsl,\n hsb\n } = value;\n const specterWidth = self.$el.find('.color-picker-sb-spectrum')[0].offsetWidth;\n const specterHeight = self.$el.find('.color-picker-sb-spectrum')[0].offsetHeight;\n self.$el.find('.color-picker-sb-spectrum').css('background-color', `hsl(${hsl[0]}, 100%, 50%)`);\n self.$el.find('.color-picker-sb-spectrum-handle').css('background-color', `hsl(${hsl[0]}, ${hsl[1] * 100}%, ${hsl[2] * 100}%)`).transform(`translate(${specterWidth * hsb[1]}px, ${specterHeight * (1 - hsb[2])}px)`);\n },\n destroy(self) {\n if (self.destroySpectrumEvents) self.destroySpectrumEvents();\n delete self.destroySpectrumEvents;\n }\n};","import $ from '../../../shared/dom7.js';\nimport { colorHsbToHsl } from '../../../shared/utils.js';\nimport { getSupport } from '../../../shared/get-support.js';\n/** @jsx $jsx */\nimport $jsx from '../../../shared/$jsx.js';\nexport default {\n render() {\n return $jsx(\"div\", {\n class: \"color-picker-module color-picker-module-hs-spectrum\"\n }, $jsx(\"div\", {\n class: \"color-picker-hs-spectrum\"\n }, $jsx(\"div\", {\n class: \"color-picker-hs-spectrum-handle\"\n })));\n },\n init(self) {\n const {\n app\n } = self;\n let isTouched;\n let isMoved;\n let touchStartX;\n let touchStartY;\n let touchCurrentX;\n let touchCurrentY;\n let specterRect;\n let specterIsTouched;\n let specterHandleIsTouched;\n const {\n $el\n } = self;\n function setHSFromSpecterCoords(x, y) {\n let h = (x - specterRect.left) / specterRect.width * 360;\n let s = (y - specterRect.top) / specterRect.height;\n h = Math.max(0, Math.min(360, h));\n s = 1 - Math.max(0, Math.min(1, s));\n self.setValue({\n hsb: [h, s, self.value.hsb[2]]\n });\n }\n function handleTouchStart(e) {\n if (isMoved || isTouched) return;\n touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchCurrentX = touchStartX;\n touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n touchCurrentY = touchStartY;\n const $targetEl = $(e.target);\n specterHandleIsTouched = $targetEl.closest('.color-picker-hs-spectrum-handle').length > 0;\n if (!specterHandleIsTouched) {\n specterIsTouched = $targetEl.closest('.color-picker-hs-spectrum').length > 0;\n }\n if (specterIsTouched) {\n specterRect = $el.find('.color-picker-hs-spectrum')[0].getBoundingClientRect();\n setHSFromSpecterCoords(touchStartX, touchStartY);\n }\n if (specterHandleIsTouched || specterIsTouched) {\n $el.find('.color-picker-hs-spectrum-handle').addClass('color-picker-hs-spectrum-handle-pressed');\n }\n }\n function handleTouchMove(e) {\n if (!(specterIsTouched || specterHandleIsTouched)) return;\n touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n e.preventDefault();\n if (!isMoved) {\n // First move\n isMoved = true;\n if (specterHandleIsTouched) {\n specterRect = $el.find('.color-picker-hs-spectrum')[0].getBoundingClientRect();\n }\n }\n if (specterIsTouched || specterHandleIsTouched) {\n setHSFromSpecterCoords(touchCurrentX, touchCurrentY);\n }\n }\n function handleTouchEnd() {\n isMoved = false;\n if (specterIsTouched || specterHandleIsTouched) {\n $el.find('.color-picker-hs-spectrum-handle').removeClass('color-picker-hs-spectrum-handle-pressed');\n }\n specterIsTouched = false;\n specterHandleIsTouched = false;\n }\n function handleResize() {\n self.modules['hs-spectrum'].update(self);\n }\n const passiveListener = app.touchEvents.start === 'touchstart' && getSupport().passiveListener ? {\n passive: true,\n capture: false\n } : false;\n self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);\n app.on('touchmove:active', handleTouchMove);\n app.on('touchend:passive', handleTouchEnd);\n app.on('resize', handleResize);\n self.destroySpectrumEvents = function destroySpectrumEvents() {\n self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);\n app.off('touchmove:active', handleTouchMove);\n app.off('touchend:passive', handleTouchEnd);\n app.off('resize', handleResize);\n };\n },\n update(self) {\n const {\n value\n } = self;\n const {\n hsb\n } = value;\n const specterWidth = self.$el.find('.color-picker-hs-spectrum')[0].offsetWidth;\n const specterHeight = self.$el.find('.color-picker-hs-spectrum')[0].offsetHeight;\n const hslBright = colorHsbToHsl(hsb[0], hsb[1], 1);\n self.$el.find('.color-picker-hs-spectrum-handle').css('background-color', `hsl(${hslBright[0]}, ${hslBright[1] * 100}%, ${hslBright[2] * 100}%)`).transform(`translate(${specterWidth * (hsb[0] / 360)}px, ${specterHeight * (1 - hsb[1])}px)`);\n },\n destroy(self) {\n if (self.destroySpectrumEvents) self.destroySpectrumEvents();\n delete self.destroySpectrumEvents;\n }\n};","import $ from '../../../shared/dom7.js';\nimport { getSupport } from '../../../shared/get-support.js';\n/** @jsx $jsx */\nimport $jsx from '../../../shared/$jsx.js';\nfunction svgWheelCircles() {\n const total = 256;\n let circles = '';\n for (let i = total; i > 0; i -= 1) {\n const angle = i * Math.PI / (total / 2);\n const hue = 360 / total * i;\n circles += ``;\n }\n return circles;\n}\nexport default {\n render() {\n return $jsx(\"div\", {\n class: \"color-picker-module color-picker-module-wheel\"\n }, $jsx(\"div\", {\n class: \"color-picker-wheel\"\n }, $jsx(\"svg\", {\n viewBox: \"0 0 300 300\",\n width: \"300\",\n height: \"300\"\n }, svgWheelCircles()), $jsx(\"div\", {\n class: \"color-picker-wheel-handle\"\n }), $jsx(\"div\", {\n class: \"color-picker-sb-spectrum\",\n style: \"background-color: hsl(0, 100%, 50%)\"\n }, $jsx(\"div\", {\n class: \"color-picker-sb-spectrum-handle\"\n }))));\n },\n init(self) {\n const {\n app\n } = self;\n let isTouched;\n let isMoved;\n let touchStartX;\n let touchStartY;\n let touchCurrentX;\n let touchCurrentY;\n let wheelRect;\n let wheelIsTouched;\n let wheelHandleIsTouched;\n let specterRect;\n let specterIsTouched;\n let specterHandleIsTouched;\n const {\n $el\n } = self;\n function setHueFromWheelCoords(x, y) {\n const wheelCenterX = wheelRect.left + wheelRect.width / 2;\n const wheelCenterY = wheelRect.top + wheelRect.height / 2;\n const angleRad = Math.atan2(y - wheelCenterY, x - wheelCenterX);\n let angleDeg = angleRad * 180 / Math.PI + 90;\n if (angleDeg < 0) angleDeg += 360;\n angleDeg = 360 - angleDeg;\n self.setValue({\n hue: angleDeg\n });\n }\n function setSBFromSpecterCoords(x, y) {\n let s = (x - specterRect.left) / specterRect.width;\n let b = (y - specterRect.top) / specterRect.height;\n s = Math.max(0, Math.min(1, s));\n b = 1 - Math.max(0, Math.min(1, b));\n self.setValue({\n hsb: [self.value.hue, s, b]\n });\n }\n function handleTouchStart(e) {\n if (isMoved || isTouched) return;\n touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touchCurrentX = touchStartX;\n touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n touchCurrentY = touchStartY;\n const $targetEl = $(e.target);\n wheelHandleIsTouched = $targetEl.closest('.color-picker-wheel-handle').length > 0;\n wheelIsTouched = $targetEl.closest('circle').length > 0;\n specterHandleIsTouched = $targetEl.closest('.color-picker-sb-spectrum-handle').length > 0;\n if (!specterHandleIsTouched) {\n specterIsTouched = $targetEl.closest('.color-picker-sb-spectrum').length > 0;\n }\n if (wheelIsTouched) {\n wheelRect = $el.find('.color-picker-wheel')[0].getBoundingClientRect();\n setHueFromWheelCoords(touchStartX, touchStartY);\n }\n if (specterIsTouched) {\n specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();\n setSBFromSpecterCoords(touchStartX, touchStartY);\n }\n if (specterHandleIsTouched || specterIsTouched) {\n $el.find('.color-picker-sb-spectrum-handle').addClass('color-picker-sb-spectrum-handle-pressed');\n }\n }\n function handleTouchMove(e) {\n if (!(wheelIsTouched || wheelHandleIsTouched) && !(specterIsTouched || specterHandleIsTouched)) return;\n touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n e.preventDefault();\n if (!isMoved) {\n // First move\n isMoved = true;\n if (wheelHandleIsTouched) {\n wheelRect = $el.find('.color-picker-wheel')[0].getBoundingClientRect();\n }\n if (specterHandleIsTouched) {\n specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();\n }\n }\n if (wheelIsTouched || wheelHandleIsTouched) {\n setHueFromWheelCoords(touchCurrentX, touchCurrentY);\n }\n if (specterIsTouched || specterHandleIsTouched) {\n setSBFromSpecterCoords(touchCurrentX, touchCurrentY);\n }\n }\n function handleTouchEnd() {\n isMoved = false;\n if (specterIsTouched || specterHandleIsTouched) {\n $el.find('.color-picker-sb-spectrum-handle').removeClass('color-picker-sb-spectrum-handle-pressed');\n }\n wheelIsTouched = false;\n wheelHandleIsTouched = false;\n specterIsTouched = false;\n specterHandleIsTouched = false;\n }\n function handleResize() {\n self.modules.wheel.update(self);\n }\n const passiveListener = app.touchEvents.start === 'touchstart' && getSupport().passiveListener ? {\n passive: true,\n capture: false\n } : false;\n self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);\n app.on('touchmove:active', handleTouchMove);\n app.on('touchend:passive', handleTouchEnd);\n app.on('resize', handleResize);\n self.destroyWheelEvents = function destroyWheelEvents() {\n self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);\n app.off('touchmove:active', handleTouchMove);\n app.off('touchend:passive', handleTouchEnd);\n app.off('resize', handleResize);\n };\n },\n update(self) {\n const {\n value\n } = self;\n const {\n hsl,\n hsb\n } = value;\n const specterWidth = self.$el.find('.color-picker-sb-spectrum')[0].offsetWidth;\n const specterHeight = self.$el.find('.color-picker-sb-spectrum')[0].offsetHeight;\n const wheelSize = self.$el.find('.color-picker-wheel')[0].offsetWidth;\n const wheelHalfSize = wheelSize / 2;\n const angleRad = value.hue * Math.PI / 180;\n const handleSize = wheelSize / 6;\n const handleHalfSize = handleSize / 2;\n const tX = wheelHalfSize - Math.sin(angleRad) * (wheelHalfSize - handleHalfSize) - handleHalfSize;\n const tY = wheelHalfSize - Math.cos(angleRad) * (wheelHalfSize - handleHalfSize) - handleHalfSize;\n self.$el.find('.color-picker-wheel-handle').css('background-color', `hsl(${hsl[0]}, 100%, 50%)`).transform(`translate(${tX}px, ${tY}px)`);\n self.$el.find('.color-picker-sb-spectrum').css('background-color', `hsl(${hsl[0]}, 100%, 50%)`);\n self.$el.find('.color-picker-sb-spectrum-handle').css('background-color', `hsl(${hsl[0]}, ${hsl[1] * 100}%, ${hsl[2] * 100}%)`).transform(`translate(${specterWidth * hsb[1]}px, ${specterHeight * (1 - hsb[2])}px)`);\n },\n destroy(self) {\n if (self.destroyWheelEvents) self.destroyWheelEvents();\n delete self.destroyWheelEvents;\n }\n};","import { extend, colorRgbToHex, colorRgbToHsl, colorHslToHsb, colorHslToRgb, colorHsbToHsl, colorHexToRgb, nextTick, deleteProps } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\nimport $ from '../../shared/dom7.js';\nimport { getDevice } from '../../shared/get-device.js';\nimport moduleAlphaSlider from './modules/alpha-slider.js';\nimport moduleCurrentColor from './modules/current-color.js';\nimport moduleHex from './modules/hex.js';\nimport moduleHsbSliders from './modules/hsb-sliders.js';\nimport moduleHueSlider from './modules/hue-slider.js';\nimport moduleBrightnessSlider from './modules/brightness-slider.js';\nimport modulePalette from './modules/palette.js';\nimport moduleInitialCurrentColors from './modules/initial-current-colors.js';\nimport moduleRgbBars from './modules/rgb-bars.js';\nimport moduleRgbSliders from './modules/rgb-sliders.js';\nimport moduleSbSpectrum from './modules/sb-spectrum.js';\nimport moduleHsSpectrum from './modules/hs-spectrum.js';\nimport moduleWheel from './modules/wheel.js';\n\n/** @jsx $jsx */\nimport $jsx from '../../shared/$jsx.js';\nclass ColorPicker extends Framework7Class {\n constructor(app, params) {\n if (params === void 0) {\n params = {};\n }\n super(params, [app]);\n const self = this;\n self.params = extend({}, app.params.colorPicker, params);\n let $containerEl;\n if (self.params.containerEl) {\n $containerEl = $(self.params.containerEl);\n if ($containerEl.length === 0) return self;\n }\n let $inputEl;\n if (self.params.inputEl) {\n $inputEl = $(self.params.inputEl);\n }\n let $targetEl;\n if (self.params.targetEl) {\n $targetEl = $(self.params.targetEl);\n }\n extend(self, {\n app,\n $containerEl,\n containerEl: $containerEl && $containerEl[0],\n inline: $containerEl && $containerEl.length > 0,\n $inputEl,\n inputEl: $inputEl && $inputEl[0],\n $targetEl,\n targetEl: $targetEl && $targetEl[0],\n initialized: false,\n opened: false,\n url: self.params.url,\n modules: {\n 'alpha-slider': moduleAlphaSlider,\n 'current-color': moduleCurrentColor,\n hex: moduleHex,\n // eslint-disable-line\n 'hsb-sliders': moduleHsbSliders,\n 'hue-slider': moduleHueSlider,\n 'brightness-slider': moduleBrightnessSlider,\n palette: modulePalette,\n // eslint-disable-line\n 'initial-current-colors': moduleInitialCurrentColors,\n 'rgb-bars': moduleRgbBars,\n 'rgb-sliders': moduleRgbSliders,\n 'sb-spectrum': moduleSbSpectrum,\n 'hs-spectrum': moduleHsSpectrum,\n wheel: moduleWheel // eslint-disable-line\n }\n });\n\n function onInputClick() {\n self.open();\n }\n function onInputFocus(e) {\n e.preventDefault();\n }\n function onTargetClick() {\n self.open();\n }\n function onHtmlClick(e) {\n if (self.destroyed || !self.params) return;\n if (self.params.openIn === 'page') return;\n const $clickTargetEl = $(e.target);\n if (!self.opened || self.closing) return;\n if ($clickTargetEl.closest('[class*=\"backdrop\"]').length) return;\n if ($clickTargetEl.closest('.color-picker-popup, .color-picker-popover').length) return;\n if ($inputEl && $inputEl.length > 0) {\n if ($clickTargetEl[0] !== $inputEl[0] && $clickTargetEl.closest('.sheet-modal').length === 0) {\n self.close();\n }\n } else if ($(e.target).closest('.sheet-modal').length === 0) {\n self.close();\n }\n }\n\n // Events\n extend(self, {\n attachInputEvents() {\n self.$inputEl.on('click', onInputClick);\n if (self.params.inputReadOnly) {\n self.$inputEl.on('focus mousedown', onInputFocus);\n if (self.$inputEl[0]) {\n self.$inputEl[0].f7ValidateReadonly = true;\n }\n }\n },\n detachInputEvents() {\n self.$inputEl.off('click', onInputClick);\n if (self.params.inputReadOnly) {\n self.$inputEl.off('focus mousedown', onInputFocus);\n if (self.$inputEl[0]) {\n delete self.$inputEl[0].f7ValidateReadonly;\n }\n }\n },\n attachTargetEvents() {\n self.$targetEl.on('click', onTargetClick);\n },\n detachTargetEvents() {\n self.$targetEl.off('click', onTargetClick);\n },\n attachHtmlEvents() {\n app.on('click', onHtmlClick);\n },\n detachHtmlEvents() {\n app.off('click', onHtmlClick);\n }\n });\n self.init();\n return self;\n }\n get view() {\n const {\n $inputEl,\n $targetEl,\n app,\n params\n } = this;\n let view;\n if (params.view) {\n view = params.view;\n } else {\n if ($inputEl) {\n view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;\n }\n if (!view && $targetEl) {\n view = $targetEl.parents('.view').length && $targetEl.parents('.view')[0].f7View;\n }\n }\n if (!view) view = app.views.main;\n return view;\n }\n attachEvents() {\n const self = this;\n self.centerModules = self.centerModules.bind(self);\n if (self.params.centerModules) {\n self.app.on('resize', self.centerModules);\n }\n }\n detachEvents() {\n const self = this;\n if (self.params.centerModules) {\n self.app.off('resize', self.centerModules);\n }\n }\n centerModules() {\n const self = this;\n if (!self.opened || !self.$el || self.inline) return;\n const $pageContentEl = self.$el.find('.page-content');\n if (!$pageContentEl.length) return;\n const {\n scrollHeight,\n offsetHeight\n } = $pageContentEl[0];\n if (scrollHeight <= offsetHeight) {\n $pageContentEl.addClass('justify-content-center');\n } else {\n $pageContentEl.removeClass('justify-content-center');\n }\n }\n initInput() {\n const self = this;\n if (!self.$inputEl) return;\n if (self.params.inputReadOnly) self.$inputEl.prop('readOnly', true);\n }\n getModalType() {\n const self = this;\n const {\n app,\n modal,\n params\n } = self;\n const {\n openIn,\n openInPhone\n } = params;\n const device = getDevice();\n if (modal && modal.type) return modal.type;\n if (openIn !== 'auto') return openIn;\n if (self.inline) return null;\n if (device.ios) {\n return device.ipad ? 'popover' : openInPhone;\n }\n if (app.width >= 768) {\n return 'popover';\n }\n return openInPhone;\n }\n formatValue() {\n const self = this;\n const {\n value\n } = self;\n if (self.params.formatValue) {\n return self.params.formatValue.call(self, value);\n }\n return value.hex;\n }\n\n // eslint-disable-next-line\n normalizeHsValues(arr) {\n return [Math.floor(arr[0] * 10) / 10, Math.floor(arr[1] * 1000) / 1000, Math.floor(arr[2] * 1000) / 1000];\n }\n setValue(value, updateModules) {\n if (value === void 0) {\n value = {};\n }\n if (updateModules === void 0) {\n updateModules = true;\n }\n const self = this;\n if (typeof value === 'undefined') return;\n let {\n hex,\n rgb,\n hsl,\n hsb,\n alpha = 1,\n hue,\n rgba,\n hsla\n } = self.value || {};\n const needChangeEvent = self.value || !self.value && !self.params.value;\n let valueChanged;\n Object.keys(value).forEach(k => {\n if (!self.value || typeof self.value[k] === 'undefined') {\n valueChanged = true;\n return;\n }\n const v = value[k];\n if (Array.isArray(v)) {\n v.forEach((subV, subIndex) => {\n if (subV !== self.value[k][subIndex]) {\n valueChanged = true;\n }\n });\n } else if (v !== self.value[k]) {\n valueChanged = true;\n }\n });\n if (!valueChanged) return;\n if (value.rgb || value.rgba) {\n const [r, g, b, a = alpha] = value.rgb || value.rgba;\n rgb = [r, g, b];\n hex = colorRgbToHex(...rgb);\n hsl = colorRgbToHsl(...rgb);\n hsb = colorHslToHsb(...hsl);\n hsl = self.normalizeHsValues(hsl);\n hsb = self.normalizeHsValues(hsb);\n hue = hsb[0];\n alpha = a;\n rgba = [rgb[0], rgb[1], rgb[2], a];\n hsla = [hsl[0], hsl[1], hsl[2], a];\n }\n if (value.hsl || value.hsla) {\n const [h, s, l, a = alpha] = value.hsl || value.hsla;\n hsl = [h, s, l];\n rgb = colorHslToRgb(...hsl);\n hex = colorRgbToHex(...rgb);\n hsb = colorHslToHsb(...hsl);\n hsl = self.normalizeHsValues(hsl);\n hsb = self.normalizeHsValues(hsb);\n hue = hsb[0];\n alpha = a;\n rgba = [rgb[0], rgb[1], rgb[2], a];\n hsla = [hsl[0], hsl[1], hsl[2], a];\n }\n if (value.hsb) {\n const [h, s, b, a = alpha] = value.hsb;\n hsb = [h, s, b];\n hsl = colorHsbToHsl(...hsb);\n rgb = colorHslToRgb(...hsl);\n hex = colorRgbToHex(...rgb);\n hsl = self.normalizeHsValues(hsl);\n hsb = self.normalizeHsValues(hsb);\n hue = hsb[0];\n alpha = a;\n rgba = [rgb[0], rgb[1], rgb[2], a];\n hsla = [hsl[0], hsl[1], hsl[2], a];\n }\n if (value.hex) {\n rgb = colorHexToRgb(value.hex);\n hex = colorRgbToHex(...rgb);\n hsl = colorRgbToHsl(...rgb);\n hsb = colorHslToHsb(...hsl);\n hsl = self.normalizeHsValues(hsl);\n hsb = self.normalizeHsValues(hsb);\n hue = hsb[0];\n rgba = [rgb[0], rgb[1], rgb[2], alpha];\n hsla = [hsl[0], hsl[1], hsl[2], alpha];\n }\n if (typeof value.alpha !== 'undefined') {\n alpha = value.alpha;\n if (typeof rgb !== 'undefined') {\n rgba = [rgb[0], rgb[1], rgb[2], alpha];\n }\n if (typeof hsl !== 'undefined') {\n hsla = [hsl[0], hsl[1], hsl[2], alpha];\n }\n }\n if (typeof value.hue !== 'undefined') {\n const [h, s, l] = hsl; // eslint-disable-line\n hsl = [value.hue, s, l];\n hsb = colorHslToHsb(...hsl);\n rgb = colorHslToRgb(...hsl);\n hex = colorRgbToHex(...rgb);\n hsl = self.normalizeHsValues(hsl);\n hsb = self.normalizeHsValues(hsb);\n hue = hsb[0];\n rgba = [rgb[0], rgb[1], rgb[2], alpha];\n hsla = [hsl[0], hsl[1], hsl[2], alpha];\n }\n self.value = {\n hex,\n alpha,\n hue,\n rgb,\n hsl,\n hsb,\n rgba,\n hsla\n };\n if (!self.initialValue) self.initialValue = extend({}, self.value);\n self.updateValue(needChangeEvent);\n if (self.opened && updateModules) {\n self.updateModules();\n }\n }\n getValue() {\n const self = this;\n return self.value;\n }\n updateValue(fireEvents) {\n if (fireEvents === void 0) {\n fireEvents = true;\n }\n const self = this;\n const {\n $inputEl,\n value,\n $targetEl\n } = self;\n if ($targetEl && self.params.targetElSetBackgroundColor) {\n const {\n rgba\n } = value;\n $targetEl.css('background-color', `rgba(${rgba.join(', ')})`);\n }\n if (fireEvents) {\n self.emit('local::change colorPickerChange', self, value);\n }\n if ($inputEl && $inputEl.length) {\n const inputValue = self.formatValue(value);\n if ($inputEl && $inputEl.length) {\n $inputEl.val(inputValue);\n if (fireEvents) {\n $inputEl.trigger('change');\n }\n }\n }\n }\n updateModules() {\n const self = this;\n const {\n modules\n } = self;\n self.params.modules.forEach(m => {\n if (typeof m === 'string' && modules[m] && modules[m].update) {\n modules[m].update(self);\n } else if (m && m.update) {\n m.update(self);\n }\n });\n }\n update() {\n const self = this;\n self.updateModules();\n }\n renderPicker() {\n const self = this;\n const {\n params,\n modules\n } = self;\n let html = '';\n params.modules.forEach(m => {\n if (typeof m === 'string' && modules[m] && modules[m].render) {\n html += modules[m].render(self);\n } else if (m && m.render) {\n html += m.render(self);\n }\n });\n return html;\n }\n renderNavbar() {\n const self = this;\n if (self.params.renderNavbar) {\n return self.params.renderNavbar.call(self, self);\n }\n const {\n openIn,\n navbarTitleText,\n navbarBackLinkText,\n navbarCloseText\n } = self.params;\n return $jsx(\"div\", {\n class: \"navbar\"\n }, $jsx(\"div\", {\n class: \"navbar-bg\"\n }), $jsx(\"div\", {\n class: \"navbar-inner sliding\"\n }, openIn === 'page' && $jsx(\"div\", {\n class: \"left\"\n }, $jsx(\"a\", {\n class: \"link back\"\n }, $jsx(\"i\", {\n class: \"icon icon-back\"\n }), $jsx(\"span\", {\n class: \"if-not-md\"\n }, navbarBackLinkText))), $jsx(\"div\", {\n class: \"title\"\n }, navbarTitleText), openIn !== 'page' && $jsx(\"div\", {\n class: \"right\"\n }, $jsx(\"a\", {\n class: \"link popup-close\",\n \"data-popup\": \".color-picker-popup\"\n }, navbarCloseText))));\n }\n renderToolbar() {\n const self = this;\n if (self.params.renderToolbar) {\n return self.params.renderToolbar.call(self, self);\n }\n return $jsx(\"div\", {\n class: \"toolbar toolbar-top\"\n }, $jsx(\"div\", {\n class: \"toolbar-inner\"\n }, $jsx(\"div\", {\n class: \"left\"\n }), $jsx(\"div\", {\n class: \"right\"\n }, $jsx(\"a\", {\n class: \"link sheet-close popover-close\",\n \"data-sheet\": \".color-picker-sheet-modal\",\n \"data-popover\": \".color-picker-popover\"\n }, self.params.toolbarCloseText))));\n }\n renderInline() {\n const self = this;\n const {\n cssClass,\n groupedModules\n } = self.params;\n return $jsx(\"div\", {\n class: `color-picker color-picker-inline ${groupedModules ? 'color-picker-grouped-modules' : ''} ${cssClass || ''}`\n }, self.renderPicker());\n }\n renderSheet() {\n const self = this;\n const {\n cssClass,\n toolbarSheet,\n groupedModules\n } = self.params;\n return $jsx(\"div\", {\n class: `sheet-modal color-picker color-picker-sheet-modal ${groupedModules ? 'color-picker-grouped-modules' : ''} ${cssClass || ''}`\n }, toolbarSheet && self.renderToolbar(), $jsx(\"div\", {\n class: \"sheet-modal-inner\"\n }, $jsx(\"div\", {\n class: \"page-content\"\n }, self.renderPicker())));\n }\n renderPopover() {\n const self = this;\n const {\n cssClass,\n toolbarPopover,\n groupedModules\n } = self.params;\n return $jsx(\"div\", {\n class: `popover color-picker-popover ${cssClass || ''}`\n }, $jsx(\"div\", {\n class: \"popover-inner\"\n }, $jsx(\"div\", {\n class: `color-picker ${groupedModules ? 'color-picker-grouped-modules' : ''}`\n }, toolbarPopover && self.renderToolbar(), $jsx(\"div\", {\n class: \"page-content\"\n }, self.renderPicker()))));\n }\n renderPopup() {\n const self = this;\n const {\n cssClass,\n navbarPopup,\n groupedModules\n } = self.params;\n return $jsx(\"div\", {\n class: `popup color-picker-popup ${cssClass || ''}`\n }, $jsx(\"div\", {\n class: \"page\"\n }, navbarPopup && self.renderNavbar(), $jsx(\"div\", {\n class: `color-picker ${groupedModules ? 'color-picker-grouped-modules' : ''}`\n }, $jsx(\"div\", {\n class: \"page-content\"\n }, self.renderPicker()))));\n }\n renderPage() {\n const self = this;\n const {\n cssClass,\n groupedModules\n } = self.params;\n return $jsx(\"div\", {\n class: `page color-picker-page ${cssClass || ''}`,\n \"data-name\": \"color-picker-page\"\n }, self.renderNavbar(), $jsx(\"div\", {\n class: `color-picker ${groupedModules ? 'color-picker-grouped-modules' : ''}`\n }, $jsx(\"div\", {\n class: \"page-content\"\n }, self.renderPicker())));\n }\n\n // eslint-disable-next-line\n render() {\n const self = this;\n const {\n params\n } = self;\n if (params.render) return params.render.call(self);\n if (self.inline) return self.renderInline();\n if (params.openIn === 'page') {\n return self.renderPage();\n }\n const modalType = self.getModalType();\n if (modalType === 'popover') return self.renderPopover();\n if (modalType === 'sheet') return self.renderSheet();\n if (modalType === 'popup') return self.renderPopup();\n }\n onOpen() {\n const self = this;\n const {\n initialized,\n $el,\n app,\n $inputEl,\n inline,\n value,\n params,\n modules\n } = self;\n self.closing = false;\n self.opened = true;\n self.opening = true;\n\n // Init main events\n self.attachEvents();\n params.modules.forEach(m => {\n if (typeof m === 'string' && modules[m] && modules[m].init) {\n modules[m].init(self);\n } else if (m && m.init) {\n m.init(self);\n }\n });\n const updateValue = !value && params.value;\n\n // Set value\n if (!initialized) {\n if (value) self.setValue(value);else if (params.value) {\n self.setValue(params.value, false);\n } else if (!params.value) {\n self.setValue({\n hex: '#ff0000'\n }, false);\n }\n } else if (value) {\n self.initialValue = extend({}, value);\n self.setValue(value, false);\n }\n\n // Update input value\n if (updateValue) self.updateValue();\n self.updateModules();\n\n // Center modules\n if (params.centerModules) {\n self.centerModules();\n }\n\n // Extra focus\n if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {\n $inputEl.trigger('focus');\n }\n self.initialized = true;\n\n // Trigger events\n if ($el) {\n $el.trigger('colorpicker:open');\n }\n if ($inputEl) {\n $inputEl.trigger('colorpicker:open');\n }\n self.emit('local::open colorPickerOpen', self);\n }\n onOpened() {\n const self = this;\n self.opening = false;\n if (self.$el) {\n self.$el.trigger('colorpicker:opened');\n }\n if (self.$inputEl) {\n self.$inputEl.trigger('colorpicker:opened');\n }\n self.emit('local::opened colorPickerOpened', self);\n }\n onClose() {\n const self = this;\n const {\n app,\n params,\n modules\n } = self;\n self.opening = false;\n self.closing = true;\n\n // Detach events\n self.detachEvents();\n if (self.$inputEl) {\n if (app.theme === 'md') {\n self.$inputEl.trigger('blur');\n } else {\n const validate = self.$inputEl.attr('validate');\n const required = self.$inputEl.attr('required');\n if (validate && required) {\n app.input.validate(self.$inputEl);\n }\n }\n }\n params.modules.forEach(m => {\n if (typeof m === 'string' && modules[m] && modules[m].destroy) {\n modules[m].destroy(self);\n } else if (m && m.destroy) {\n m.destroy(self);\n }\n });\n if (self.$el) {\n self.$el.trigger('colorpicker:close');\n }\n if (self.$inputEl) {\n self.$inputEl.trigger('colorpicker:close');\n }\n self.emit('local::close colorPickerClose', self);\n }\n onClosed() {\n const self = this;\n self.opened = false;\n self.closing = false;\n if (!self.inline) {\n nextTick(() => {\n if (self.modal && self.modal.el && self.modal.destroy) {\n if (!self.params.routableModals) {\n self.modal.destroy();\n }\n }\n delete self.modal;\n });\n }\n if (self.$el) {\n self.$el.trigger('colorpicker:closed');\n }\n if (self.$inputEl) {\n self.$inputEl.trigger('colorpicker:closed');\n }\n self.emit('local::closed colorPickerClosed', self);\n }\n open() {\n const self = this;\n const {\n app,\n opened,\n inline,\n $inputEl,\n $targetEl,\n params\n } = self;\n if (opened) return;\n if (inline) {\n self.$el = $(self.render());\n self.$el[0].f7ColorPicker = self;\n self.$containerEl.append(self.$el);\n self.onOpen();\n self.onOpened();\n return;\n }\n const colorPickerContent = self.render();\n if (params.openIn === 'page') {\n self.view.router.navigate({\n url: self.url,\n route: {\n content: colorPickerContent,\n path: self.url,\n on: {\n pageBeforeIn(e, page) {\n self.$el = page.$el.find('.color-picker');\n self.$el[0].f7ColorPicker = self;\n self.onOpen();\n },\n pageAfterIn() {\n self.onOpened();\n },\n pageBeforeOut() {\n self.onClose();\n },\n pageAfterOut() {\n self.onClosed();\n if (self.$el && self.$el[0]) {\n self.$el[0].f7ColorPicker = null;\n delete self.$el[0].f7ColorPicker;\n }\n }\n }\n }\n });\n } else {\n const modalType = self.getModalType();\n let backdrop = params.backdrop;\n if (backdrop === null || typeof backdrop === 'undefined') {\n if (modalType === 'popover' && app.params.popover.backdrop !== false) backdrop = true;\n if (modalType === 'popup') backdrop = true;\n }\n const modalParams = {\n targetEl: $targetEl || $inputEl,\n scrollToEl: params.scrollToInput ? $targetEl || $inputEl : undefined,\n content: colorPickerContent,\n backdrop,\n closeByBackdropClick: params.closeByBackdropClick,\n on: {\n open() {\n const modal = this;\n self.modal = modal;\n self.$el = modalType === 'popover' || modalType === 'popup' ? modal.$el.find('.color-picker') : modal.$el;\n self.$el[0].f7ColorPicker = self;\n self.onOpen();\n },\n opened() {\n self.onOpened();\n },\n close() {\n self.onClose();\n },\n closed() {\n self.onClosed();\n if (self.$el && self.$el[0]) {\n self.$el[0].f7ColorPicker = null;\n delete self.$el[0].f7ColorPicker;\n }\n }\n }\n };\n if (modalType === 'popup') {\n modalParams.push = params.popupPush;\n modalParams.swipeToClose = params.popupSwipeToClose;\n }\n if (modalType === 'sheet') {\n modalParams.push = params.sheetPush;\n modalParams.swipeToClose = params.sheetSwipeToClose;\n }\n if (params.routableModals && self.view) {\n self.view.router.navigate({\n url: self.url,\n route: {\n path: self.url,\n [modalType]: modalParams\n }\n });\n } else {\n self.modal = app[modalType].create(modalParams);\n self.modal.open();\n }\n }\n }\n close() {\n const self = this;\n const {\n opened,\n inline\n } = self;\n if (!opened) return;\n if (inline) {\n self.onClose();\n self.onClosed();\n return;\n }\n if (self.params.routableModals && self.view || self.params.openIn === 'page') {\n self.view.router.back();\n } else {\n self.modal.close();\n }\n }\n init() {\n const self = this;\n self.initInput();\n if (self.inline) {\n self.open();\n self.emit('local::init colorPickerInit', self);\n return;\n }\n if (!self.initialized && self.params.value) {\n self.setValue(self.params.value);\n }\n\n // Attach input Events\n if (self.$inputEl) {\n self.attachInputEvents();\n }\n if (self.$targetEl) {\n self.attachTargetEvents();\n }\n if (self.params.closeByOutsideClick) {\n self.attachHtmlEvents();\n }\n self.emit('local::init colorPickerInit', self);\n }\n destroy() {\n const self = this;\n if (self.destroyed) return;\n const {\n $el\n } = self;\n self.emit('local::beforeDestroy colorPickerBeforeDestroy', self);\n if ($el) $el.trigger('colorpicker:beforedestroy');\n self.close();\n\n // Detach Events\n self.detachEvents();\n if (self.$inputEl) {\n self.detachInputEvents();\n }\n if (self.$targetEl) {\n self.detachTargetEvents();\n }\n if (self.params.closeByOutsideClick) {\n self.detachHtmlEvents();\n }\n if ($el && $el.length) delete self.$el[0].f7ColorPicker;\n deleteProps(self);\n self.destroyed = true;\n }\n}\nexport default ColorPicker;","import $ from '../../shared/dom7.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nimport ColorPicker from './color-picker-class.js';\nexport default {\n name: 'colorPicker',\n static: {\n ColorPicker\n },\n create() {\n const app = this;\n app.colorPicker = ConstructorMethods({\n defaultSelector: '.color-picker',\n constructor: ColorPicker,\n app,\n domProp: 'f7ColorPicker'\n });\n app.colorPicker.close = function close(el) {\n if (el === void 0) {\n el = '.color-picker';\n }\n const $el = $(el);\n if ($el.length === 0) return;\n const colorPicker = $el[0].f7ColorPicker;\n if (!colorPicker || colorPicker && !colorPicker.opened) return;\n colorPicker.close();\n };\n },\n params: {\n colorPicker: {\n // Color picker settings\n value: null,\n modules: ['wheel'],\n palette: [['#FFEBEE', '#FFCDD2', '#EF9A9A', '#E57373', '#EF5350', '#F44336', '#E53935', '#D32F2F', '#C62828', '#B71C1C'], ['#F3E5F5', '#E1BEE7', '#CE93D8', '#BA68C8', '#AB47BC', '#9C27B0', '#8E24AA', '#7B1FA2', '#6A1B9A', '#4A148C'], ['#E8EAF6', '#C5CAE9', '#9FA8DA', '#7986CB', '#5C6BC0', '#3F51B5', '#3949AB', '#303F9F', '#283593', '#1A237E'], ['#E1F5FE', '#B3E5FC', '#81D4FA', '#4FC3F7', '#29B6F6', '#03A9F4', '#039BE5', '#0288D1', '#0277BD', '#01579B'], ['#E0F2F1', '#B2DFDB', '#80CBC4', '#4DB6AC', '#26A69A', '#009688', '#00897B', '#00796B', '#00695C', '#004D40'], ['#F1F8E9', '#DCEDC8', '#C5E1A5', '#AED581', '#9CCC65', '#8BC34A', '#7CB342', '#689F38', '#558B2F', '#33691E'], ['#FFFDE7', '#FFF9C4', '#FFF59D', '#FFF176', '#FFEE58', '#FFEB3B', '#FDD835', '#FBC02D', '#F9A825', '#F57F17'], ['#FFF3E0', '#FFE0B2', '#FFCC80', '#FFB74D', '#FFA726', '#FF9800', '#FB8C00', '#F57C00', '#EF6C00', '#E65100']],\n groupedModules: false,\n centerModules: true,\n sliderLabel: false,\n sliderValue: false,\n sliderValueEdiable: false,\n barLabel: false,\n barValue: false,\n barValueEdiable: false,\n hexLabel: false,\n hexValueEditable: false,\n redLabelText: 'R',\n greenLabelText: 'G',\n blueLabelText: 'B',\n hueLabelText: 'H',\n saturationLabelText: 'S',\n brightnessLabelText: 'B',\n hexLabelText: 'HEX',\n alphaLabelText: 'A',\n // Common opener settings\n containerEl: null,\n openIn: 'popover',\n // or 'popover' or 'sheet' or 'popup' or 'page' or 'auto'\n openInPhone: 'popup',\n // or 'popover' or 'sheet' or 'popup' or 'page'\n popupPush: false,\n popupSwipeToClose: undefined,\n sheetPush: false,\n sheetSwipeToClose: undefined,\n formatValue: null,\n targetEl: null,\n targetElSetBackgroundColor: false,\n inputEl: null,\n inputReadOnly: true,\n closeByOutsideClick: true,\n scrollToInput: true,\n toolbarSheet: true,\n toolbarPopover: false,\n toolbarCloseText: 'Done',\n navbarPopup: true,\n navbarCloseText: 'Done',\n navbarTitleText: 'Color',\n navbarBackLinkText: 'Back',\n cssClass: null,\n routableModals: false,\n view: null,\n url: 'color/',\n backdrop: null,\n closeByBackdropClick: true,\n // Render functions\n renderToolbar: null,\n renderNavbar: null,\n renderInline: null,\n renderPopover: null,\n renderSheet: null,\n renderPopup: null,\n render: null\n }\n }\n};","import $ from '../../shared/dom7.js';\nimport { bindMethods, iosPreloaderContent, mdPreloaderContent } from '../../shared/utils.js';\nconst Treeview = {\n open(itemEl) {\n const app = this;\n const $itemEl = $(itemEl).eq(0);\n if (!$itemEl.length) return;\n $itemEl.addClass('treeview-item-opened');\n $itemEl.trigger('treeview:open');\n app.emit('treeviewOpen', $itemEl[0]);\n function done(cancel) {\n if (cancel) {\n $itemEl.removeClass('treeview-item-opened');\n $itemEl.trigger('treeview:close');\n app.emit('treeviewClose', $itemEl[0]);\n } else {\n $itemEl[0].f7TreeviewChildrenLoaded = true;\n }\n $itemEl.find('.treeview-toggle').removeClass('treeview-toggle-hidden');\n $itemEl.find('.treeview-preloader').remove();\n }\n if ($itemEl.hasClass('treeview-load-children') && !$itemEl[0].f7TreeviewChildrenLoaded) {\n const preloaders = {\n iosPreloaderContent,\n mdPreloaderContent\n };\n $itemEl.trigger('treeview:loadchildren', done);\n app.emit('treeviewLoadChildren', $itemEl[0], done);\n $itemEl.find('.treeview-toggle').addClass('treeview-toggle-hidden');\n $itemEl.find('.treeview-item-root').prepend(`${preloaders[`${app.theme}PreloaderContent`]}
`);\n }\n },\n close(itemEl) {\n const app = this;\n const $itemEl = $(itemEl).eq(0);\n if (!$itemEl.length) return;\n $itemEl.removeClass('treeview-item-opened');\n $itemEl.trigger('treeview:close');\n app.emit('treeviewClose', $itemEl[0]);\n },\n toggle(itemEl) {\n const app = this;\n const $itemEl = $(itemEl).eq(0);\n if (!$itemEl.length) return;\n const wasOpened = $itemEl.hasClass('treeview-item-opened');\n app.treeview[wasOpened ? 'close' : 'open']($itemEl);\n }\n};\nexport default {\n name: 'treeview',\n create() {\n const app = this;\n bindMethods(app, {\n treeview: Treeview\n });\n },\n clicks: {\n '.treeview-toggle': function toggle($clickedEl, clickedData, e) {\n const app = this;\n if ($clickedEl.parents('.treeview-item-toggle').length) return;\n const $treeviewItemEl = $clickedEl.parents('.treeview-item').eq(0);\n if (!$treeviewItemEl.length) return;\n e.preventF7Router = true;\n app.treeview.toggle($treeviewItemEl[0]);\n },\n '.treeview-item-toggle': function toggle($clickedEl, clickedData, e) {\n const app = this;\n const $treeviewItemEl = $clickedEl.closest('.treeview-item').eq(0);\n if (!$treeviewItemEl.length) return;\n e.preventF7Router = true;\n app.treeview.toggle($treeviewItemEl[0]);\n }\n }\n};","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom7.js';\nimport { extend, deleteProps } from '../../shared/utils.js';\nimport Framework7Class from '../../shared/class.js';\nimport { getDevice } from '../../shared/get-device.js';\nconst textEditorButtonsMap = {\n // f7-icon, material-icon, command\n bold: ['bold', 'format_bold', 'bold'],\n italic: ['italic', 'format_italic', 'italic'],\n underline: ['underline', 'format_underlined', 'underline'],\n strikeThrough: ['strikethrough', 'strikethrough_s', 'strikeThrough'],\n orderedList: ['list_number', 'format_list_numbered', 'insertOrderedList'],\n unorderedList: ['list_bullet', 'format_list_bulleted', 'insertUnorderedList'],\n link: ['link', 'link', 'createLink'],\n image: ['photo', 'image', 'insertImage'],\n paragraph: ['paragraph', '¶', 'formatBlock.P'],\n h1: ['H1', 'H1', 'formatBlock.H1'],\n h2: ['H2', 'H2', 'formatBlock.H2'],\n h3: ['H3', 'H3', 'formatBlock.H3'],\n alignLeft: ['text_alignleft', 'format_align_left', 'justifyLeft'],\n alignCenter: ['text_aligncenter', 'format_align_center', 'justifyCenter'],\n alignRight: ['text_alignright', 'format_align_right', 'justifyRight'],\n alignJustify: ['text_justify', 'format_align_justify', 'justifyFull'],\n subscript: ['textformat_subscript', 'A1', 'subscript'],\n superscript: ['textformat_superscript', 'A1', 'superscript'],\n indent: ['increase_indent', 'format_indent_increase', 'indent'],\n outdent: ['decrease_indent', 'format_indent_decrease', 'outdent']\n};\nclass TextEditor extends Framework7Class {\n constructor(app, params) {\n super(params, [app]);\n const self = this;\n const document = getDocument();\n const device = getDevice();\n const defaults = extend({}, app.params.textEditor);\n\n // Extend defaults with modules params\n self.useModulesParams(defaults);\n self.params = extend(defaults, params);\n const el = self.params.el;\n if (!el) return self;\n const $el = $(el);\n if ($el.length === 0) return self;\n if ($el[0].f7TextEditor) return $el[0].f7TextEditor;\n let $contentEl = $el.children('.text-editor-content');\n if (!$contentEl.length) {\n $el.append('');\n $contentEl = $el.children('.text-editor-content');\n }\n extend(self, {\n app,\n $el,\n el: $el[0],\n $contentEl,\n contentEl: $contentEl[0]\n });\n if ('value' in params) {\n self.value = self.params.value;\n }\n if (self.params.mode === 'keyboard-toolbar') {\n if (!(device.cordova || device.capacitor) && !device.android) {\n self.params.mode = 'popover';\n }\n }\n if (typeof self.params.buttons === 'string') {\n try {\n self.params.buttons = JSON.parse(self.params.buttons);\n } catch (err) {\n throw new Error('Framework7: TextEditor: wrong \"buttons\" parameter format');\n }\n }\n $el[0].f7TextEditor = self;\n\n // Bind\n self.onButtonClick = self.onButtonClick.bind(self);\n self.onFocus = self.onFocus.bind(self);\n self.onBlur = self.onBlur.bind(self);\n self.onInput = self.onInput.bind(self);\n self.onPaste = self.onPaste.bind(self);\n self.onSelectionChange = self.onSelectionChange.bind(self);\n self.closeKeyboardToolbar = self.closeKeyboardToolbar.bind(self);\n\n // Handle Events\n self.attachEvents = function attachEvents() {\n if (self.params.mode === 'toolbar') {\n self.$el.find('.text-editor-toolbar').on('click', 'button', self.onButtonClick);\n }\n if (self.params.mode === 'keyboard-toolbar') {\n self.$keyboardToolbarEl.on('click', 'button', self.onButtonClick);\n self.$el.parents('.page').on('page:beforeout', self.closeKeyboardToolbar);\n }\n if (self.params.mode === 'popover' && self.popover) {\n self.popover.$el.on('click', 'button', self.onButtonClick);\n }\n self.$contentEl.on('paste', self.onPaste);\n self.$contentEl.on('focus', self.onFocus);\n self.$contentEl.on('blur', self.onBlur);\n self.$contentEl.on('input', self.onInput, true);\n $(document).on('selectionchange', self.onSelectionChange);\n };\n self.detachEvents = function detachEvents() {\n if (self.params.mode === 'toolbar') {\n self.$el.find('.text-editor-toolbar').off('click', 'button', self.onButtonClick);\n }\n if (self.params.mode === 'keyboard-toolbar') {\n self.$keyboardToolbarEl.off('click', 'button', self.onButtonClick);\n self.$el.parents('.page').off('page:beforeout', self.closeKeyboardToolbar);\n }\n if (self.params.mode === 'popover' && self.popover) {\n self.popover.$el.off('click', 'button', self.onButtonClick);\n }\n self.$contentEl.off('paste', self.onPaste);\n self.$contentEl.off('focus', self.onFocus);\n self.$contentEl.off('blur', self.onBlur);\n self.$contentEl.off('input', self.onInput, true);\n $(document).off('selectionchange', self.onSelectionChange);\n };\n\n // Install Modules\n self.useModules();\n\n // Init\n self.init();\n return self;\n }\n setValue(newValue) {\n const self = this;\n const currentValue = self.value;\n if (currentValue === newValue) return self;\n self.value = newValue;\n self.$contentEl.html(newValue);\n self.$el.trigger('texteditor:change', self.value);\n self.emit('local::change textEditorChange', self, self.value);\n return self;\n }\n getValue() {\n const self = this;\n return self.value;\n }\n clearValue() {\n const self = this;\n self.setValue('');\n if (self.params.placeholder && !self.$contentEl.html()) {\n self.insertPlaceholder();\n }\n return self;\n }\n createLink() {\n const self = this;\n const window = getWindow();\n const document = getDocument();\n const currentSelection = window.getSelection();\n const selectedNodes = [];\n let $selectedLinks;\n if (currentSelection && currentSelection.anchorNode && $(currentSelection.anchorNode).parents(self.$el).length) {\n let anchorNode = currentSelection.anchorNode;\n while (anchorNode) {\n selectedNodes.push(anchorNode);\n if (!anchorNode.nextSibling || anchorNode === currentSelection.focusNode) {\n anchorNode = null;\n }\n if (anchorNode) {\n anchorNode = anchorNode.nextSibling;\n }\n }\n const selectedNodesLinks = [];\n const $selectedNodes = $(selectedNodes);\n for (let i = 0; i < $selectedNodes.length; i += 1) {\n const childNodes = $selectedNodes[i].children;\n if (childNodes) {\n for (let j = 0; j < childNodes.length; j += 1) {\n if ($(childNodes[j]).is('a')) {\n selectedNodesLinks.push(childNodes[j]);\n }\n }\n }\n }\n $selectedLinks = $selectedNodes.closest('a').add($(selectedNodesLinks));\n }\n if ($selectedLinks && $selectedLinks.length) {\n $selectedLinks.each(linkNode => {\n const selection = window.getSelection();\n const range = document.createRange();\n range.selectNodeContents(linkNode);\n selection.removeAllRanges();\n selection.addRange(range);\n document.execCommand('unlink', false);\n selection.removeAllRanges();\n });\n return self;\n }\n const currentRange = self.getSelectionRange();\n if (!currentRange) return self;\n const dialog = self.app.dialog.prompt('', self.params.linkUrlText, link => {\n if (link && link.trim().length) {\n self.setSelectionRange(currentRange);\n document.execCommand('createLink', false, link.trim());\n self.$el.trigger('texteditor:insertlink', {\n url: link.trim()\n });\n self.emit('local:insertLink textEditorInsertLink', self, link.trim());\n }\n });\n dialog.$el.find('input').focus();\n return self;\n }\n insertImage() {\n const self = this;\n const document = getDocument();\n const currentRange = self.getSelectionRange();\n if (!currentRange) return self;\n const dialog = self.app.dialog.prompt('', self.params.imageUrlText, imageUrl => {\n if (imageUrl && imageUrl.trim().length) {\n self.setSelectionRange(currentRange);\n document.execCommand('insertImage', false, imageUrl.trim());\n self.$el.trigger('texteditor:insertimage', {\n url: imageUrl.trim()\n });\n self.emit('local:insertImage textEditorInsertImage', self, imageUrl.trim());\n }\n });\n dialog.$el.find('input').focus();\n return self;\n }\n removePlaceholder() {\n const self = this;\n self.$contentEl.find('.text-editor-placeholder').remove();\n }\n insertPlaceholder() {\n const self = this;\n self.$contentEl.append(`${self.params.placeholder}
`);\n }\n onSelectionChange() {\n const self = this;\n const window = getWindow();\n const document = getDocument();\n if (self.params.mode === 'toolbar') return;\n const selection = window.getSelection();\n const selectionIsInContent = $(selection.anchorNode).parents(self.contentEl).length || selection.anchorNode === self.contentEl;\n if (self.params.mode === 'keyboard-toolbar') {\n if (!selectionIsInContent) {\n self.closeKeyboardToolbar();\n } else {\n self.openKeyboardToolbar();\n }\n return;\n }\n if (self.params.mode === 'popover') {\n const selectionIsInPopover = $(selection.anchorNode).parents(self.popover.el).length || selection.anchorNode === self.popover.el;\n if (!selectionIsInContent && !selectionIsInPopover) {\n self.closePopover();\n return;\n }\n if (!selection.isCollapsed && selection.rangeCount) {\n const range = selection.getRangeAt(0);\n const rect = range.getBoundingClientRect();\n const rootEl = self.app.$el[0] || document.body;\n self.openPopover(rect.x + (window.scrollX || 0) - rootEl.offsetLeft, rect.y + (window.scrollY || 0) - rootEl.offsetTop, rect.width, rect.height);\n } else if (selection.isCollapsed) {\n self.closePopover();\n }\n }\n }\n onPaste(e) {\n const self = this;\n const document = getDocument();\n if (self.params.clearFormattingOnPaste && e.clipboardData && e.clipboardData.getData) {\n const text = e.clipboardData.getData('text/plain');\n e.preventDefault();\n document.execCommand('insertText', false, text);\n }\n }\n onInput() {\n const self = this;\n const value = self.$contentEl.html();\n self.value = value;\n self.$el.trigger('texteditor:input');\n self.emit('local:input textEditorInput', self, self.value);\n self.$el.trigger('texteditor:change', self.value);\n self.emit('local::change textEditorChange', self, self.value);\n }\n onFocus() {\n const self = this;\n self.removePlaceholder();\n self.$contentEl.focus();\n self.$el.trigger('texteditor:focus');\n self.emit('local::focus textEditorFocus', self);\n }\n onBlur() {\n const self = this;\n const window = getWindow();\n const document = getDocument();\n if (self.params.placeholder && self.$contentEl.html() === '') {\n self.insertPlaceholder();\n }\n if (self.params.mode === 'popover') {\n const selection = window.getSelection();\n const selectionIsInContent = $(selection.anchorNode).parents(self.contentEl).length || selection.anchorNode === self.contentEl;\n const inPopover = document.activeElement && self.popover && $(document.activeElement).closest(self.popover.$el).length;\n if (!inPopover && !selectionIsInContent) {\n self.closePopover();\n }\n }\n if (self.params.mode === 'keyboard-toolbar') {\n const selection = window.getSelection();\n const selectionIsInContent = $(selection.anchorNode).parents(self.contentEl).length || selection.anchorNode === self.contentEl;\n if (!selectionIsInContent) {\n self.closeKeyboardToolbar();\n }\n }\n self.$el.trigger('texteditor:blur');\n self.emit('local::blur textEditorBlur', self);\n }\n onButtonClick(e) {\n const self = this;\n const window = getWindow();\n const document = getDocument();\n const selection = window.getSelection();\n const selectionIsInContent = $(selection.anchorNode).parents(self.contentEl).length || selection.anchorNode === self.contentEl;\n if (!selectionIsInContent) return;\n const $buttonEl = $(e.target).closest('button');\n if ($buttonEl.parents('form').length) {\n e.preventDefault();\n }\n const button = $buttonEl.attr('data-button');\n const buttonData = self.params.customButtons && self.params.customButtons[button];\n if (!button || !(textEditorButtonsMap[button] || buttonData)) return;\n $buttonEl.trigger('texteditor:buttonclick', button);\n self.emit('local::buttonClick textEditorButtonClick', self, button);\n if (buttonData) {\n if (buttonData.onClick) buttonData.onClick(self, $buttonEl[0]);\n return;\n }\n const command = textEditorButtonsMap[button][2];\n if (command === 'createLink') {\n self.createLink();\n return;\n }\n if (command === 'insertImage') {\n self.insertImage();\n return;\n }\n if (command.indexOf('formatBlock') === 0) {\n const tagName = command.split('.')[1];\n const $anchorNode = $(selection.anchorNode);\n if ($anchorNode.parents(tagName.toLowerCase()).length || $anchorNode.is(tagName)) {\n document.execCommand('formatBlock', false, 'div');\n } else {\n document.execCommand('formatBlock', false, tagName);\n }\n return;\n }\n document.execCommand(command, false);\n }\n\n // eslint-disable-next-line\n getSelectionRange() {\n const window = getWindow();\n const document = getDocument();\n if (window.getSelection) {\n const sel = window.getSelection();\n if (sel.getRangeAt && sel.rangeCount) {\n return sel.getRangeAt(0);\n }\n } else if (document.selection && document.selection.createRange) {\n return document.selection.createRange();\n }\n return null;\n }\n\n // eslint-disable-next-line\n setSelectionRange(range) {\n const window = getWindow();\n const document = getDocument();\n if (range) {\n if (window.getSelection) {\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n } else if (document.selection && range.select) {\n range.select();\n }\n }\n }\n renderButtons() {\n const self = this;\n let html = '';\n function renderButton(button) {\n const iconClass = self.app.theme === 'md' ? 'material-icons' : 'f7-icons';\n if (self.params.customButtons && self.params.customButtons[button]) {\n const buttonData = self.params.customButtons[button];\n return ``;\n }\n if (!textEditorButtonsMap[button]) return '';\n const iconContent = textEditorButtonsMap[button][self.app.theme === 'md' ? 1 : 0];\n return ``.trim();\n }\n self.params.buttons.forEach((button, buttonIndex) => {\n if (Array.isArray(button)) {\n button.forEach(b => {\n html += renderButton(b);\n });\n if (buttonIndex < self.params.buttons.length - 1 && self.params.dividers) {\n html += '';\n }\n } else {\n html += renderButton(button);\n }\n });\n return html;\n }\n createToolbar() {\n const self = this;\n self.$el.prepend(`${self.renderButtons()}
`);\n }\n createKeyboardToolbar() {\n const self = this;\n self.$keyboardToolbarEl = $(``);\n }\n createPopover() {\n const self = this;\n self.popover = self.app.popover.create({\n content: `\n \n
${self.renderButtons()}
\n
\n `,\n closeByOutsideClick: false,\n backdrop: false\n });\n }\n openKeyboardToolbar() {\n const self = this;\n if (self.$keyboardToolbarEl.parent(self.app.$el).length) return;\n self.$el.trigger('texteditor:keyboardopen');\n self.emit('local::keyboardOpen textEditorKeyboardOpen', self);\n self.app.$el.append(self.$keyboardToolbarEl);\n }\n closeKeyboardToolbar() {\n const self = this;\n self.$keyboardToolbarEl.remove();\n self.$el.trigger('texteditor:keyboardclose');\n self.emit('local::keyboardClose textEditorKeyboardClose', self);\n }\n openPopover(targetX, targetY, targetWidth, targetHeight) {\n const self = this;\n if (!self.popover) return;\n Object.assign(self.popover.params, {\n targetX,\n targetY,\n targetWidth,\n targetHeight\n });\n clearTimeout(self.popoverTimeout);\n self.popoverTimeout = setTimeout(() => {\n if (!self.popover) return;\n if (self.popover.opened) {\n self.popover.resize();\n } else {\n self.$el.trigger('texteditor:popoveropen');\n self.emit('local::popoverOpen textEditorPopoverOpen', self);\n self.popover.open();\n }\n }, 400);\n }\n closePopover() {\n const self = this;\n clearTimeout(self.popoverTimeout);\n if (!self.popover || !self.popover.opened) return;\n self.popoverTimeout = setTimeout(() => {\n if (!self.popover) return;\n self.$el.trigger('texteditor:popoverclose');\n self.emit('local::popoverClose textEditorPopoverClose', self);\n self.popover.close();\n }, 400);\n }\n init() {\n const self = this;\n if (self.value) {\n self.$contentEl.html(self.value);\n } else {\n self.value = self.$contentEl.html();\n }\n if (self.params.placeholder && self.value === '') {\n self.insertPlaceholder();\n }\n if (self.params.mode === 'toolbar') {\n self.createToolbar();\n } else if (self.params.mode === 'popover') {\n self.createPopover();\n } else if (self.params.mode === 'keyboard-toolbar') {\n self.createKeyboardToolbar();\n }\n self.attachEvents();\n self.$el.trigger('texteditor:init');\n self.emit('local::init textEditorInit', self);\n return self;\n }\n destroy() {\n let self = this;\n self.$el.trigger('texteditor:beforedestroy');\n self.emit('local::beforeDestroy textEditorBeforeDestroy', self);\n self.detachEvents();\n if (self.params.mode === 'keyboard-toolbar' && self.$keyboardToolbarEl) {\n self.$keyboardToolbarEl.remove();\n }\n if (self.popover) {\n self.popover.close(false);\n self.popover.destroy();\n }\n delete self.$el[0].f7TextEditor;\n deleteProps(self);\n self = null;\n }\n}\nexport default TextEditor;","import $ from '../../shared/dom7.js';\nimport { extend } from '../../shared/utils.js';\nimport TextEditor from './text-editor-class.js';\nimport ConstructorMethods from '../../shared/constructor-methods.js';\nexport default {\n name: 'textEditor',\n params: {\n textEditor: {\n el: null,\n mode: 'toolbar',\n // or 'popover'\n value: undefined,\n // will use html content\n customButtons: null,\n buttons: [['bold', 'italic', 'underline', 'strikeThrough'], ['orderedList', 'unorderedList'], ['link', 'image'], ['paragraph', 'h1', 'h2', 'h3'], ['alignLeft', 'alignCenter', 'alignRight', 'alignJustify'], ['subscript', 'superscript'], ['indent', 'outdent']],\n dividers: true,\n imageUrlText: 'Insert image URL',\n linkUrlText: 'Insert link URL',\n placeholder: null,\n clearFormattingOnPaste: true\n }\n },\n create() {\n const app = this;\n app.textEditor = extend(ConstructorMethods({\n defaultSelector: '.text-editor',\n constructor: TextEditor,\n app,\n domProp: 'f7TextEditor'\n }));\n },\n static: {\n TextEditor\n },\n on: {\n tabMounted(tabEl) {\n const app = this;\n $(tabEl).find('.text-editor-init').each(editorEl => {\n const dataset = $(editorEl).dataset();\n app.textEditor.create(extend({\n el: editorEl\n }, dataset || {}));\n });\n },\n tabBeforeRemove(tabEl) {\n $(tabEl).find('.text-editor-init').each(editorEl => {\n if (editorEl.f7TextEditor) editorEl.f7TextEditor.destroy();\n });\n },\n pageInit(page) {\n const app = this;\n page.$el.find('.text-editor-init').each(editorEl => {\n const dataset = $(editorEl).dataset();\n app.textEditor.create(extend({\n el: editorEl\n }, dataset || {}));\n });\n },\n pageBeforeRemove(page) {\n page.$el.find('.text-editor-init').each(editorEl => {\n if (editorEl.f7TextEditor) editorEl.f7TextEditor.destroy();\n });\n }\n },\n vnode: {\n 'text-editor-init': {\n insert(vnode) {\n const app = this;\n const editorEl = vnode.elm;\n const dataset = $(editorEl).dataset();\n app.textEditor.create(extend({\n el: editorEl\n }, dataset || {}));\n },\n destroy(vnode) {\n const editorEl = vnode.elm;\n if (editorEl.f7TextEditor) editorEl.f7TextEditor.destroy();\n }\n }\n }\n};","import { bindMethods } from '../../shared/utils.js';\nconst Breadcrumbs = {};\nexport default {\n name: 'breadrumbs',\n create() {\n const app = this;\n bindMethods(app, {\n breadrumbs: Breadcrumbs\n });\n }\n};","/**\n * Framework7 8.3.2\n * Full featured mobile HTML framework for building iOS & Android apps\n * https://framework7.io/\n *\n * Copyright 2014-2024 Vladimir Kharlampidi\n *\n * Released under the MIT License\n *\n * Released on: February 27, 2024\n */\n\nimport $ from './shared/dom7.js';\nimport Framework7 from './components/app/app-class.js';\nimport * as utils from './shared/utils.js';\nimport { getSupport } from './shared/get-support.js';\nimport { getDevice } from './shared/get-device.js';\nimport DeviceModule from './modules/device/device.js';\nimport SupportModule from './modules/support/support.js';\nimport UtilsModule from './modules/utils/utils.js';\nimport ResizeModule from './modules/resize/resize.js';\nimport TouchModule from './modules/touch/touch.js';\nimport ClicksModule from './modules/clicks/clicks.js';\nimport RouterModule from './modules/router/router.js';\nimport HistoryModule from './modules/history/history.js';\nimport ServiceWorkerModule from './modules/service-worker/service-worker.js';\nimport StoreModule, { createStore } from './modules/store/store.js';\nimport Statusbar from './components/statusbar/statusbar.js';\nimport View from './components/view/view.js';\nimport Navbar from './components/navbar/navbar.js';\nimport Toolbar from './components/toolbar/toolbar.js';\nimport Subnavbar from './components/subnavbar/subnavbar.js';\nimport TouchRipple from './components/touch-ripple/touch-ripple.js';\nimport Modal from './components/modal/modal.js';\nimport Dialog from './components/dialog/dialog.js';\nimport Popup from './components/popup/popup.js';\nimport LoginScreen from './components/login-screen/login-screen.js';\nimport Popover from './components/popover/popover.js';\nimport Actions from './components/actions/actions.js';\nimport Sheet from './components/sheet/sheet.js';\nimport Toast from './components/toast/toast.js';\nimport Preloader from './components/preloader/preloader.js';\nimport Progressbar from './components/progressbar/progressbar.js';\nimport Sortable from './components/sortable/sortable.js';\nimport Swipeout from './components/swipeout/swipeout.js';\nimport Accordion from './components/accordion/accordion.js';\nimport ContactsList from './components/contacts-list/contacts-list.js';\nimport VirtualList from './components/virtual-list/virtual-list.js';\nimport ListIndex from './components/list-index/list-index.js';\nimport Timeline from './components/timeline/timeline.js';\nimport Tabs from './components/tabs/tabs.js';\nimport Panel from './components/panel/panel.js';\nimport Card from './components/card/card.js';\nimport Chip from './components/chip/chip.js';\nimport Form from './components/form/form.js';\nimport Input from './components/input/input.js';\nimport Checkbox from './components/checkbox/checkbox.js';\nimport Radio from './components/radio/radio.js';\nimport Toggle from './components/toggle/toggle.js';\nimport Range from './components/range/range.js';\nimport Stepper from './components/stepper/stepper.js';\nimport SmartSelect from './components/smart-select/smart-select.js';\nimport Grid from './components/grid/grid.js';\nimport Calendar from './components/calendar/calendar.js';\nimport Picker from './components/picker/picker.js';\nimport InfiniteScroll from './components/infinite-scroll/infinite-scroll.js';\nimport PullToRefresh from './components/pull-to-refresh/pull-to-refresh.js';\nimport DataTable from './components/data-table/data-table.js';\nimport Fab from './components/fab/fab.js';\nimport Searchbar from './components/searchbar/searchbar.js';\nimport Messages from './components/messages/messages.js';\nimport Messagebar from './components/messagebar/messagebar.js';\nimport Swiper from './components/swiper/swiper.js';\nimport PhotoBrowser from './components/photo-browser/photo-browser.js';\nimport Notification from './components/notification/notification.js';\nimport Autocomplete from './components/autocomplete/autocomplete.js';\nimport Tooltip from './components/tooltip/tooltip.js';\nimport Skeleton from './components/skeleton/skeleton.js';\nimport ColorPicker from './components/color-picker/color-picker.js';\nimport Treeview from './components/treeview/treeview.js';\nimport TextEditor from './components/text-editor/text-editor.js';\nimport Breadcrumbs from './components/breadcrumbs/breadcrumbs.js';\nimport Typography from './components/typography/typography.js';\nFramework7.use([DeviceModule, SupportModule, UtilsModule, ResizeModule, TouchModule, ClicksModule, RouterModule, HistoryModule, ServiceWorkerModule, StoreModule, Statusbar, View, Navbar, Toolbar, Subnavbar, TouchRipple, Modal, Dialog, Popup, LoginScreen, Popover, Actions, Sheet, Toast, Preloader, Progressbar, Sortable, Swipeout, Accordion, ContactsList, VirtualList, ListIndex, Timeline, Tabs, Panel, Card, Chip, Form, Input, Checkbox, Radio, Toggle, Range, Stepper, SmartSelect, Grid, Calendar, Picker, InfiniteScroll, PullToRefresh, DataTable, Fab, Searchbar, Messages, Messagebar, Swiper, PhotoBrowser, Notification, Autocomplete, Tooltip, Skeleton, ColorPicker, Treeview, TextEditor, Breadcrumbs, Typography]);\nexport { $ as Dom7, utils, getDevice, getSupport, createStore };\nexport default Framework7;\n","export default {\n name: 'contactsList'\n};","export default {\n name: 'timeline'\n};","export default {\n name: 'chip'\n};","export default {\n name: 'checkbox'\n};","export default {\n name: 'radio'\n};","export default {\n name: 'grid'\n};","export default {\n name: 'skeleton'\n};","export default {\n name: 'typography'\n};","/**\n * Framework7 8.3.2\n * Full featured mobile HTML framework for building iOS & Android apps\n * https://framework7.io/\n *\n * Copyright 2014-2024 Vladimir Kharlampidi\n *\n * Released under the MIT License\n *\n * Released on: February 27, 2024\n */\n\nimport $ from './shared/dom7.js';\nimport Framework7 from './components/app/app-class.js';\nimport * as utils from './shared/utils.js';\nimport { getSupport } from './shared/get-support.js';\nimport { getDevice } from './shared/get-device.js';\nimport DeviceModule from './modules/device/device.js';\nimport SupportModule from './modules/support/support.js';\nimport UtilsModule from './modules/utils/utils.js';\nimport ResizeModule from './modules/resize/resize.js';\nimport TouchModule from './modules/touch/touch.js';\nimport ClicksModule from './modules/clicks/clicks.js';\nimport RouterModule from './modules/router/router.js';\nimport HistoryModule from './modules/history/history.js';\nimport ServiceWorkerModule from './modules/service-worker/service-worker.js';\nimport StoreModule, { createStore } from './modules/store/store.js';\nimport Statusbar from './components/statusbar/statusbar.js';\nimport View from './components/view/view.js';\nimport Navbar from './components/navbar/navbar.js';\nimport Toolbar from './components/toolbar/toolbar.js';\nimport Subnavbar from './components/subnavbar/subnavbar.js';\nimport TouchRipple from './components/touch-ripple/touch-ripple.js';\nimport Modal from './components/modal/modal.js';\nFramework7.use([DeviceModule, SupportModule, UtilsModule, ResizeModule, TouchModule, ClicksModule, RouterModule, HistoryModule, ServiceWorkerModule, StoreModule, Statusbar, View, Navbar, Toolbar, Subnavbar, TouchRipple, Modal]);\nexport { $ as Dom7, utils, getDevice, getSupport, createStore };\nexport default Framework7;\n","export function noUndefinedProps(obj) {\n const o = {};\n Object.keys(obj).forEach(key => {\n if (typeof obj[key] !== 'undefined') o[key] = obj[key];\n });\n return o;\n}\nexport function isStringProp(val) {\n return typeof val === 'string' && val !== '';\n}\nexport function isObject(o) {\n return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object;\n}\nexport function now() {\n return Date.now();\n}\nexport function extend() {\n let deep = true;\n let to;\n let from;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (typeof args[0] === 'boolean') {\n [deep, to] = args;\n args.splice(0, 2);\n from = args;\n } else {\n [to] = args;\n args.splice(0, 1);\n from = args;\n }\n for (let i = 0; i < from.length; i += 1) {\n const nextSource = args[i];\n if (nextSource !== undefined && nextSource !== null) {\n const keysArray = Object.keys(Object(nextSource));\n for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n const nextKey = keysArray[nextIndex];\n const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n if (desc !== undefined && desc.enumerable) {\n if (!deep) {\n to[nextKey] = nextSource[nextKey];\n } else if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n extend(to[nextKey], nextSource[nextKey]);\n } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n to[nextKey] = {};\n extend(to[nextKey], nextSource[nextKey]);\n } else {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n }\n return to;\n}\nexport function flattenArray() {\n const arr = [];\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n args.forEach(arg => {\n if (Array.isArray(arg)) arr.push(...flattenArray(...arg));else arr.push(arg);\n });\n return arr;\n}\nexport function classNames() {\n const classes = [];\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n args.forEach(arg => {\n if (typeof arg === 'object' && arg.constructor === Object) {\n Object.keys(arg).forEach(key => {\n if (arg[key]) classes.push(key);\n });\n } else if (arg) classes.push(arg);\n });\n const uniqueClasses = [];\n classes.forEach(c => {\n if (uniqueClasses.indexOf(c) < 0) uniqueClasses.push(c);\n });\n return uniqueClasses.join(' ');\n}\nexport function getSlots(props) {\n if (props === void 0) {\n props = {};\n }\n const slots = {};\n if (!props) return slots;\n const children = props.children;\n if (!children || children.length === 0) {\n return slots;\n }\n function addChildToSlot(name, child) {\n if (!slots[name]) slots[name] = [];\n slots[name].push(child);\n }\n if (Array.isArray(children)) {\n children.forEach(child => {\n if (!child) return;\n const slotName = child.props && child.props.slot || 'default';\n addChildToSlot(slotName, child);\n });\n } else {\n let slotName = 'default';\n if (children.props && children.props.slot) slotName = children.props.slot;\n addChildToSlot(slotName, children);\n }\n return slots;\n}\nexport function emit(props, events) {\n for (var _len4 = arguments.length, args = new Array(_len4 > 2 ? _len4 - 2 : 0), _key4 = 2; _key4 < _len4; _key4++) {\n args[_key4 - 2] = arguments[_key4];\n }\n if (!events || !events.trim().length || typeof events !== 'string') return;\n events.trim().split(' ').forEach(event => {\n let eventName = (event || '').trim();\n if (!eventName) return;\n eventName = eventName.charAt(0).toUpperCase() + eventName.slice(1);\n const propName = `on${eventName}`;\n if (props[propName]) props[propName](...args);\n });\n}\nexport function getExtraAttrs(props) {\n if (props === void 0) {\n props = {};\n }\n const extraAttrs = {};\n Object.keys(props).forEach(key => {\n if (key.indexOf('data-') === 0 || key.indexOf('aria-') === 0 || key === 'role') {\n extraAttrs[key] = props[key];\n }\n });\n return extraAttrs;\n}\nlet routerIdCounter = 0;\nlet routerComponentIdCounter = 0;\nexport function unsetRouterIds() {\n routerIdCounter = 0;\n routerComponentIdCounter = 0;\n}\nexport function getRouterId() {\n routerIdCounter += 1;\n return `${now()}_${routerIdCounter}`;\n}\nexport function getComponentId() {\n routerComponentIdCounter += 1;\n return `${now()}_${routerComponentIdCounter}`;\n}","/* eslint-disable import/no-mutable-exports */\nimport Framework7 from 'framework7/lite';\nimport { extend, unsetRouterIds } from './utils.js';\nlet f7;\nlet f7events;\nconst theme = {};\nconst f7routers = {\n views: [],\n tabs: [],\n modals: null\n};\nconst setTheme = () => {\n if (!f7) return;\n theme.ios = f7.theme === 'ios';\n theme.md = f7.theme === 'md';\n};\nconst cleanup = () => {\n unsetRouterIds();\n delete theme.ios;\n delete theme.md;\n f7routers.views = [];\n f7routers.tabs = [];\n f7routers.modals = null;\n};\nconst f7initEvents = () => {\n f7events = new Framework7.Events();\n};\nconst f7init = function (rootEl, params, init) {\n if (params === void 0) {\n params = {};\n }\n if (init === void 0) {\n init = true;\n }\n const f7Params = extend({}, params, {\n el: rootEl,\n init\n });\n if (typeof params.store !== 'undefined') f7Params.store = params.store;\n if (!f7Params.routes) f7Params.routes = [];\n if (f7Params.userAgent && (f7Params.theme === 'auto' || !f7Params.theme)) {\n const device = Framework7.getDevice({\n userAgent: f7Params.userAgent\n }, true);\n theme.ios = !!device.ios;\n theme.md = !theme.ios;\n }\n // eslint-disable-next-line\n if (f7 && typeof window !== 'undefined') return;\n // eslint-disable-next-line\n if (typeof window === 'undefined') cleanup();\n const instance = new Framework7(f7Params);\n f7 = instance;\n setTheme();\n if (instance.initialized) {\n f7 = instance;\n f7events.emit('ready', f7);\n } else {\n instance.on('init', () => {\n f7 = instance;\n f7events.emit('ready', f7);\n });\n }\n};\nconst f7ready = callback => {\n if (!callback) return;\n if (f7 && f7.initialized) callback(f7);else {\n f7events.once('ready', callback);\n }\n};\nexport { f7, theme, f7ready, f7events, f7init, f7routers, f7initEvents, setTheme };","import { isStringProp } from './utils.js';\nexport function colorClasses(props) {\n const {\n color,\n textColor,\n bgColor,\n borderColor,\n rippleColor,\n dark\n } = props;\n return {\n dark,\n [`color-${color}`]: color,\n [`text-color-${textColor}`]: textColor,\n [`bg-color-${bgColor}`]: bgColor,\n [`border-color-${borderColor}`]: borderColor,\n [`ripple-color-${rippleColor}`]: rippleColor\n };\n}\nexport function routerAttrs(props) {\n const {\n force,\n reloadCurrent,\n reloadPrevious,\n reloadAll,\n reloadDetail,\n animate,\n ignoreCache,\n routeTabId,\n view,\n transition,\n openIn\n } = props;\n let dataAnimate;\n if ('animate' in props && typeof animate !== 'undefined') {\n dataAnimate = animate.toString();\n }\n let dataReloadDetail;\n if ('reloadDetail' in props && typeof reloadDetail !== 'undefined') {\n dataReloadDetail = reloadDetail.toString();\n }\n return {\n 'data-force': force || undefined,\n 'data-reload-current': reloadCurrent || undefined,\n 'data-reload-all': reloadAll || undefined,\n 'data-reload-previous': reloadPrevious || undefined,\n 'data-reload-detail': dataReloadDetail,\n 'data-animate': dataAnimate,\n 'data-ignore-cache': ignoreCache || undefined,\n 'data-route-tab-id': routeTabId || undefined,\n 'data-view': isStringProp(view) ? view : undefined,\n 'data-transition': isStringProp(transition) ? transition : undefined,\n 'data-open-in': isStringProp(openIn) ? openIn : undefined\n };\n}\nexport function routerClasses(props) {\n const {\n back,\n linkBack,\n external,\n preventRouter\n } = props;\n return {\n back: back || linkBack,\n external,\n 'prevent-router': preventRouter\n };\n}\nexport function actionsAttrs(props) {\n const {\n searchbarEnable,\n searchbarDisable,\n searchbarClear,\n searchbarToggle,\n panelOpen,\n panelClose,\n panelToggle,\n popupOpen,\n popupClose,\n actionsOpen,\n actionsClose,\n popoverOpen,\n popoverClose,\n loginScreenOpen,\n loginScreenClose,\n sheetOpen,\n sheetClose,\n sortableEnable,\n sortableDisable,\n sortableToggle,\n cardOpen,\n cardClose\n } = props;\n return {\n 'data-searchbar': isStringProp(searchbarEnable) && searchbarEnable || isStringProp(searchbarDisable) && searchbarDisable || isStringProp(searchbarClear) && searchbarClear || isStringProp(searchbarToggle) && searchbarToggle || undefined,\n 'data-panel': isStringProp(panelOpen) && panelOpen || isStringProp(panelClose) && panelClose || isStringProp(panelToggle) && panelToggle || undefined,\n 'data-popup': isStringProp(popupOpen) && popupOpen || isStringProp(popupClose) && popupClose || undefined,\n 'data-actions': isStringProp(actionsOpen) && actionsOpen || isStringProp(actionsClose) && actionsClose || undefined,\n 'data-popover': isStringProp(popoverOpen) && popoverOpen || isStringProp(popoverClose) && popoverClose || undefined,\n 'data-sheet': isStringProp(sheetOpen) && sheetOpen || isStringProp(sheetClose) && sheetClose || undefined,\n 'data-login-screen': isStringProp(loginScreenOpen) && loginScreenOpen || isStringProp(loginScreenClose) && loginScreenClose || undefined,\n 'data-sortable': isStringProp(sortableEnable) && sortableEnable || isStringProp(sortableDisable) && sortableDisable || isStringProp(sortableToggle) && sortableToggle || undefined,\n 'data-card': isStringProp(cardOpen) && cardOpen || isStringProp(cardClose) && cardClose || undefined\n };\n}\nexport function actionsClasses(props) {\n const {\n searchbarEnable,\n searchbarDisable,\n searchbarClear,\n searchbarToggle,\n panelOpen,\n panelClose,\n panelToggle,\n popupOpen,\n popupClose,\n actionsClose,\n actionsOpen,\n popoverOpen,\n popoverClose,\n loginScreenOpen,\n loginScreenClose,\n sheetOpen,\n sheetClose,\n sortableEnable,\n sortableDisable,\n sortableToggle,\n cardOpen,\n cardPreventOpen,\n cardClose\n } = props;\n return {\n 'searchbar-enable': searchbarEnable || searchbarEnable === '',\n 'searchbar-disable': searchbarDisable || searchbarDisable === '',\n 'searchbar-clear': searchbarClear || searchbarClear === '',\n 'searchbar-toggle': searchbarToggle || searchbarToggle === '',\n 'panel-close': panelClose || panelClose === '',\n 'panel-open': panelOpen || panelOpen === '',\n 'panel-toggle': panelToggle || panelToggle === '',\n 'popup-close': popupClose || popupClose === '',\n 'popup-open': popupOpen || popupOpen === '',\n 'actions-close': actionsClose || actionsClose === '',\n 'actions-open': actionsOpen || actionsOpen === '',\n 'popover-close': popoverClose || popoverClose === '',\n 'popover-open': popoverOpen || popoverOpen === '',\n 'sheet-close': sheetClose || sheetClose === '',\n 'sheet-open': sheetOpen || sheetOpen === '',\n 'login-screen-close': loginScreenClose || loginScreenClose === '',\n 'login-screen-open': loginScreenOpen || loginScreenOpen === '',\n 'sortable-enable': sortableEnable || sortableEnable === '',\n 'sortable-disable': sortableDisable || sortableDisable === '',\n 'sortable-toggle': sortableToggle || sortableToggle === '',\n 'card-close': cardClose || cardClose === '',\n 'card-open': cardOpen || cardOpen === '',\n 'card-prevent-open': cardPreventOpen || cardPreventOpen === ''\n };\n}","export const modalStateClasses = function (_temp) {\n let {\n isOpened,\n isClosing\n } = _temp === void 0 ? {} : _temp;\n return {\n 'modal-in': isOpened.current && !isClosing.current,\n 'modal-out': isClosing.current\n };\n};","import { useEffect, useLayoutEffect } from 'react';\nfunction useIsomorphicLayoutEffect(callback, deps) {\n // eslint-disable-next-line\n if (typeof window === 'undefined') return useEffect(callback, deps);\n return useLayoutEffect(callback, deps);\n}\nexport { useIsomorphicLayoutEffect };","import { useRef } from 'react';\nimport { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect.js';\nexport const watchProp = (value, callback) => {\n const valueRef = useRef(value);\n useIsomorphicLayoutEffect(() => {\n if (value !== valueRef.current && callback) {\n callback(value, valueRef.current);\n }\n valueRef.current = value;\n }, [value]);\n};","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useImperativeHandle, useRef } from 'react';\nimport { f7, f7ready } from '../shared/f7.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { modalStateClasses } from '../shared/modal-state-classes.js';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, emit, getExtraAttrs } from '../shared/utils.js';\nimport { watchProp } from '../shared/watch-prop.js';\n\n\n\nconst Popup = /*#__PURE__*/forwardRef((props, ref) => {\n const f7Popup = useRef(null);\n const {\n className,\n id,\n style,\n children,\n tabletFullscreen,\n push,\n opened,\n closeByBackdropClick,\n backdrop,\n backdropEl,\n animate,\n closeOnEscape,\n swipeToClose = false,\n swipeHandler,\n containerEl\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const isOpened = useRef(opened);\n const isClosing = useRef(false);\n const onSwipeStart = instance => {\n emit(props, 'popupSwipeStart', instance);\n };\n const onSwipeMove = instance => {\n emit(props, 'popupSwipeMove', instance);\n };\n const onSwipeEnd = instance => {\n emit(props, 'popupSwipeEnd', instance);\n };\n const onSwipeClose = instance => {\n emit(props, 'popupSwipeClose', instance);\n };\n const onOpen = instance => {\n isOpened.current = true;\n isClosing.current = false;\n emit(props, 'popupOpen', instance);\n };\n const onOpened = instance => {\n emit(props, 'popupOpened', instance);\n };\n const onClose = instance => {\n isOpened.current = false;\n isClosing.current = true;\n emit(props, 'popupClose', instance);\n };\n const onClosed = instance => {\n isClosing.current = false;\n emit(props, 'popupClosed', instance);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n f7Popup: () => f7Popup.current\n }));\n watchProp(opened, value => {\n if (!f7Popup.current) return;\n if (value) {\n f7Popup.current.open();\n } else {\n f7Popup.current.close();\n }\n });\n const modalEvents = method => {\n if (!f7Popup.current) return;\n f7Popup.current[method]('swipeStart', onSwipeStart);\n f7Popup.current[method]('swipeMove', onSwipeMove);\n f7Popup.current[method]('swipeEnd', onSwipeEnd);\n f7Popup.current[method]('swipeClose', onSwipeClose);\n f7Popup.current[method]('open', onOpen);\n f7Popup.current[method]('opened', onOpened);\n f7Popup.current[method]('close', onClose);\n f7Popup.current[method]('closed', onClosed);\n };\n const onMount = () => {\n if (!elRef.current) return;\n const popupParams = {\n el: elRef.current\n };\n if ('closeByBackdropClick' in props) popupParams.closeByBackdropClick = closeByBackdropClick;\n if ('closeOnEscape' in props) popupParams.closeOnEscape = closeOnEscape;\n if ('animate' in props) popupParams.animate = animate;\n if ('backdrop' in props) popupParams.backdrop = backdrop;\n if ('backdropEl' in props) popupParams.backdropEl = backdropEl;\n if ('swipeToClose' in props) popupParams.swipeToClose = swipeToClose;\n if ('swipeHandler' in props) popupParams.swipeHandler = swipeHandler;\n if ('containerEl' in props) popupParams.containerEl = containerEl;\n f7ready(() => {\n f7Popup.current = f7.popup.create(popupParams);\n modalEvents('on');\n if (opened) {\n f7Popup.current.open(false, true);\n }\n });\n };\n const onDestroy = () => {\n if (f7Popup.current) {\n f7Popup.current.destroy();\n }\n f7Popup.current = null;\n };\n useIsomorphicLayoutEffect(() => {\n modalEvents('on');\n return () => {\n modalEvents('off');\n };\n });\n useIsomorphicLayoutEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n const classes = classNames(className, 'popup', {\n 'popup-tablet-fullscreen': tabletFullscreen,\n 'popup-push': push\n }, modalStateClasses({\n isOpened,\n isClosing\n }), colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), children);\n});\nPopup.displayName = 'f7-popup';\nexport default Popup;","import { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect.js';\nimport { f7, f7ready } from './f7.js';\nimport { emit } from './utils.js';\nexport const useTab = (elRef, props) => {\n const onTabShow = el => {\n if (elRef.current !== el) return;\n emit(props, 'tabShow', el);\n };\n const onTabHide = el => {\n if (elRef.current !== el) return;\n emit(props, 'tabHide', el);\n };\n const attachEvents = () => {\n if (!elRef.current) return;\n f7ready(() => {\n f7.on('tabShow', onTabShow);\n f7.on('tabHide', onTabHide);\n });\n };\n const detachEvents = () => {\n if (!f7) return;\n f7.off('tabShow', onTabShow);\n f7.off('tabHide', onTabHide);\n };\n useIsomorphicLayoutEffect(() => {\n attachEvents();\n return detachEvents;\n });\n};","import React, { lazy, Suspense } from 'react';\nexport const useAsyncComponent = (component, props, key) => {\n const Component = /*#__PURE__*/lazy(component);\n return /*#__PURE__*/React.createElement(Suspense, {\n fallback: null,\n key: key\n }, /*#__PURE__*/React.createElement(Component, props));\n};","import { getComponentId } from './utils.js';\nexport const getRouterInitialComponent = (router, initialComponent) => {\n let initialComponentData;\n const {\n initialUrl\n } = router.getInitialUrl();\n const initialRoute = router.findMatchingRoute(initialUrl);\n let routeProps = {};\n if (initialRoute && initialRoute.route && initialRoute.route.options) {\n routeProps = initialRoute.route.options.props;\n }\n const isMasterRoute = route => {\n if (route.master === true) return true;\n if (typeof route.master === 'function') return route.master(router.app);\n return false;\n };\n if (initialRoute && initialRoute.route && (initialRoute.route.component || initialRoute.route.asyncComponent) && !isMasterRoute(initialRoute.route)) {\n initialComponentData = {\n component: initialRoute.route.component || initialRoute.route.asyncComponent,\n initialComponent,\n id: getComponentId(),\n isAsync: !!initialRoute.route.asyncComponent,\n props: {\n f7route: initialRoute,\n f7router: router,\n ...routeProps,\n ...initialRoute.params\n }\n };\n }\n return {\n initialPage: initialComponentData,\n initialRoute\n };\n};","import React from 'react';\nconst RouterContext = /*#__PURE__*/React.createContext({\n route: null,\n router: null\n});\nexport { RouterContext };","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/* eslint-disable no-nested-ternary */\nimport React, { forwardRef, useRef, useImperativeHandle, useState } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, noUndefinedProps, emit, getRouterId } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7ready, f7routers, f7, f7events } from '../shared/f7.js';\nimport { useTab } from '../shared/use-tab.js';\nimport { useAsyncComponent } from '../shared/use-async-component.js';\nimport { getRouterInitialComponent } from '../shared/get-router-initial-component.js';\nimport { RouterContext } from '../shared/router-context.js';\n\nconst View = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n init = true,\n main,\n tab,\n tabActive,\n url,\n initRouterOnTabShow,\n browserHistoryInitialMatch = true\n } = props;\n const childrenArray = React.Children.toArray(children);\n const initialPageComponent = childrenArray.filter(c => c.props && c.props.initialPage)[0];\n const restChildren = childrenArray.filter(c => !c.props || !c.props.initialPage);\n const shouldInitRouter = !(initRouterOnTabShow && tab && !tabActive);\n const extraAttrs = getExtraAttrs(props);\n const f7View = useRef(null);\n const elRef = useRef(null);\n const routerData = useRef(null);\n let initialPage;\n let initialRoute;\n const onViewInit = view => {\n emit(props, 'viewInit', view);\n if (!init) {\n routerData.current.instance = view;\n f7View.current = routerData.current.instance;\n }\n };\n if (f7 && !f7View.current && init) {\n const routerId = getRouterId();\n f7View.current = f7.views.create(elRef.current, {\n routerId,\n init: false,\n ...noUndefinedProps(props),\n browserHistoryInitialMatch,\n on: {\n init: onViewInit\n }\n });\n routerData.current = {\n routerId,\n instance: f7View.current\n };\n f7routers.views.push(routerData.current);\n if (shouldInitRouter && f7View.current && f7View.current.router && (url || main)) {\n const initialData = getRouterInitialComponent(f7View.current.router, initialPageComponent);\n initialPage = initialData.initialPage;\n initialRoute = initialData.initialRoute;\n if (initialRoute && initialRoute.route && initialRoute.route.masterRoute) {\n initialPage = undefined;\n initialRoute = undefined;\n }\n }\n }\n const [pages, setPages] = useState(initialPage ? [initialPage] : []);\n const onResize = (view, width) => {\n emit(props, 'viewResize', width);\n };\n const onSwipeBackMove = data => {\n const swipeBackData = data;\n emit(props, 'swipeBackMove', swipeBackData);\n };\n const onSwipeBackBeforeChange = data => {\n const swipeBackData = data;\n emit(props, 'swipeBackBeforeChange', swipeBackData);\n };\n const onSwipeBackAfterChange = data => {\n const swipeBackData = data;\n emit(props, 'swipeBackAfterChange', swipeBackData);\n };\n const onSwipeBackBeforeReset = data => {\n const swipeBackData = data;\n emit(props, 'swipeBackBeforeReset', swipeBackData);\n };\n const onSwipeBackAfterReset = data => {\n const swipeBackData = data;\n emit(props, 'swipeBackAfterReset', swipeBackData);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n f7View: () => f7View.current\n }));\n const onMount = () => {\n f7ready(() => {\n if (f7View.current) {\n routerData.current.el = elRef.current;\n routerData.current.pages = pages;\n routerData.current.setPages = newPages => {\n setPages([...newPages]);\n };\n if (initialPage && initialPage.isAsync && !initialPage.initialComponent) {\n initialPage.component().then(() => {\n setTimeout(() => {\n f7View.current.init(elRef.current);\n if (initialPage) {\n initialPage.el = f7View.current.router.currentPageEl;\n if (initialRoute && initialRoute.route && initialRoute.route.keepAlive) {\n initialRoute.route.keepAliveData = {\n pageEl: initialPage.el\n };\n }\n }\n }, 100);\n });\n } else {\n f7View.current.init(elRef.current);\n if (initialPage) {\n initialPage.el = f7View.current.router.currentPageEl;\n if (initialRoute && initialRoute.route && initialRoute.route.keepAlive) {\n initialRoute.route.keepAliveData = {\n pageEl: initialPage.el\n };\n }\n }\n }\n } else {\n const routerId = getRouterId();\n routerData.current = {\n el: elRef.current,\n routerId,\n pages,\n instance: f7View.current,\n setPages(newPages) {\n setPages([...newPages]);\n }\n };\n f7routers.views.push(routerData.current);\n routerData.current.instance = f7.views.create(elRef.current, {\n routerId,\n ...noUndefinedProps(props),\n browserHistoryInitialMatch,\n on: {\n init: onViewInit\n }\n });\n f7View.current = routerData.current.instance;\n }\n if (!init) return;\n f7View.current.on('resize', onResize);\n f7View.current.on('swipebackMove', onSwipeBackMove);\n f7View.current.on('swipebackBeforeChange', onSwipeBackBeforeChange);\n f7View.current.on('swipebackAfterChange', onSwipeBackAfterChange);\n f7View.current.on('swipebackBeforeReset', onSwipeBackBeforeReset);\n f7View.current.on('swipebackAfterReset', onSwipeBackAfterReset);\n });\n };\n const onDestroy = () => {\n if (f7View.current) {\n f7View.current.off('resize', onResize);\n f7View.current.off('swipebackMove', onSwipeBackMove);\n f7View.current.off('swipebackBeforeChange', onSwipeBackBeforeChange);\n f7View.current.off('swipebackAfterChange', onSwipeBackAfterChange);\n f7View.current.off('swipebackBeforeReset', onSwipeBackBeforeReset);\n f7View.current.off('swipebackAfterReset', onSwipeBackAfterReset);\n if (f7View.current.destroy) f7View.current.destroy();\n f7View.current = null;\n }\n f7routers.views.splice(f7routers.views.indexOf(routerData.current), 1);\n routerData.current = null;\n };\n useIsomorphicLayoutEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n useIsomorphicLayoutEffect(() => {\n if (routerData.current && f7) {\n f7events.emit('viewRouterDidUpdate', routerData.current);\n }\n });\n useTab(elRef, props);\n const classes = classNames(className, 'view', {\n 'view-main': main,\n 'tab-active': tabActive,\n tab\n }, colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), restChildren, pages.map(_ref => {\n let {\n component: PageComponent,\n id: pageId,\n props: pageProps,\n isAsync,\n initialComponent\n } = _ref;\n return /*#__PURE__*/React.createElement(RouterContext.Provider, {\n key: pageId,\n value: {\n router: pageProps.f7router,\n route: pageProps.f7route\n }\n }, initialComponent ? /*#__PURE__*/React.cloneElement(initialComponent, {\n ...pageProps\n }) : isAsync ? useAsyncComponent(PageComponent, pageProps) : /*#__PURE__*/React.createElement(PageComponent, pageProps));\n }));\n});\nView.displayName = 'f7-view';\nexport default View;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, emit } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7ready, f7 } from '../shared/f7.js';\nimport { watchProp } from '../shared/watch-prop.js';\nimport { modalStateClasses } from '../shared/modal-state-classes.js';\n\n\nconst LoginScreen = /*#__PURE__*/forwardRef((props, ref) => {\n const f7LoginScreen = useRef(null);\n const {\n className,\n id,\n style,\n children,\n opened,\n animate,\n containerEl\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const isOpened = useRef(opened);\n const isClosing = useRef(false);\n const elRef = useRef(null);\n const onOpen = instance => {\n isOpened.current = true;\n isClosing.current = false;\n emit(props, 'loginScreenOpen', instance);\n };\n const onOpened = instance => {\n emit(props, 'loginScreenOpened', instance);\n };\n const onClose = instance => {\n isOpened.current = false;\n isClosing.current = true;\n emit(props, 'loginScreenClose', instance);\n };\n const onClosed = instance => {\n isClosing.current = false;\n emit(props, 'loginScreenClosed', instance);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n f7LoginScreen: () => f7LoginScreen.current\n }));\n\n // watch opened changes\n watchProp(opened, value => {\n if (!f7LoginScreen.current) return;\n if (value) {\n f7LoginScreen.current.open();\n } else {\n f7LoginScreen.current.close();\n }\n });\n const modalEvents = method => {\n if (!f7LoginScreen.current) return;\n f7LoginScreen.current[method]('open', onOpen);\n f7LoginScreen.current[method]('opened', onOpened);\n f7LoginScreen.current[method]('close', onClose);\n f7LoginScreen.current[method]('closed', onClosed);\n };\n const onMount = () => {\n if (!elRef.current) return;\n f7ready(() => {\n const loginScreenParams = {\n el: elRef.current\n };\n if ('animate' in props) loginScreenParams.animate = animate;\n if ('containerEl' in props) loginScreenParams.containerEl = containerEl;\n f7LoginScreen.current = f7.loginScreen.create(loginScreenParams);\n modalEvents('on');\n if (opened) {\n f7LoginScreen.current.open(false);\n }\n });\n };\n const onDestroy = () => {\n if (f7LoginScreen.current) {\n f7LoginScreen.current.destroy();\n }\n f7LoginScreen.current = null;\n };\n useIsomorphicLayoutEffect(() => {\n modalEvents('on');\n return () => {\n modalEvents('off');\n };\n });\n useIsomorphicLayoutEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n const classes = classNames(className, 'login-screen', modalStateClasses({\n isOpened,\n isClosing\n }), colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), children);\n});\nLoginScreen.displayName = 'f7-login-screen';\nexport default LoginScreen;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, emit, getSlots } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7ready, f7 } from '../shared/f7.js';\nimport { watchProp } from '../shared/watch-prop.js';\nimport { modalStateClasses } from '../shared/modal-state-classes.js';\n\n\n\nconst Sheet = /*#__PURE__*/forwardRef((props, ref) => {\n const f7Sheet = useRef(null);\n const {\n className,\n id,\n style,\n top,\n bottom,\n position,\n push,\n opened,\n animate,\n backdrop,\n backdropEl,\n closeByBackdropClick,\n closeByOutsideClick,\n closeOnEscape,\n swipeToClose,\n swipeToStep,\n swipeHandler,\n containerEl,\n breakpoints,\n backdropBreakpoint,\n pushBreakpoint\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const isOpened = useRef(opened);\n const isClosing = useRef(false);\n const onBreakpoint = (instance, breakpoint) => {\n emit(props, 'sheetBreakpoint', instance, breakpoint);\n };\n const onStepProgress = (instance, progress) => {\n emit(props, 'sheetStepProgress', instance, progress);\n };\n const onStepOpen = instance => {\n emit(props, 'sheetStepOpen', instance);\n };\n const onStepClose = instance => {\n emit(props, 'sheetStepClose', instance);\n };\n const onOpen = instance => {\n isOpened.current = true;\n isClosing.current = false;\n emit(props, 'sheetOpen', instance);\n };\n const onOpened = instance => {\n emit(props, 'sheetOpened', instance);\n };\n const onClose = instance => {\n isOpened.current = false;\n isClosing.current = true;\n emit(props, 'sheetClose', instance);\n };\n const onClosed = instance => {\n isClosing.current = false;\n emit(props, 'sheetClosed', instance);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n f7Sheet: () => f7Sheet.current\n }));\n const modalEvents = method => {\n if (!f7Sheet.current) return;\n f7Sheet.current[method]('open', onOpen);\n f7Sheet.current[method]('opened', onOpened);\n f7Sheet.current[method]('close', onClose);\n f7Sheet.current[method]('closed', onClosed);\n f7Sheet.current[method]('stepOpen', onStepOpen);\n f7Sheet.current[method]('stepClose', onStepClose);\n f7Sheet.current[method]('stepProgress', onStepProgress);\n f7Sheet.current[method]('breakpoint', onBreakpoint);\n };\n const onMount = () => {\n if (!elRef.current) return;\n const sheetParams = {\n el: elRef.current,\n breakpoints,\n backdropBreakpoint,\n pushBreakpoint\n };\n if ('animate' in props && typeof animate !== 'undefined') sheetParams.animate = animate;\n if ('backdrop' in props && typeof backdrop !== 'undefined') sheetParams.backdrop = backdrop;\n if ('backdropEl' in props) sheetParams.backdropEl = backdropEl;\n if ('closeByBackdropClick' in props) sheetParams.closeByBackdropClick = closeByBackdropClick;\n if ('closeByOutsideClick' in props) sheetParams.closeByOutsideClick = closeByOutsideClick;\n if ('closeOnEscape' in props) sheetParams.closeOnEscape = closeOnEscape;\n if ('swipeToClose' in props) sheetParams.swipeToClose = swipeToClose;\n if ('swipeToStep' in props) sheetParams.swipeToStep = swipeToStep;\n if ('swipeHandler' in props) sheetParams.swipeHandler = swipeHandler;\n if ('containerEl' in props) sheetParams.containerEl = containerEl;\n if ('breakpoints' in props) sheetParams.breakpoints = breakpoints;\n if ('backdropBreakpoint' in props) sheetParams.backdropBreakpoint = backdropBreakpoint;\n if ('pushBreakpoint' in props) sheetParams.pushBreakpoint = pushBreakpoint;\n f7ready(() => {\n f7Sheet.current = f7.sheet.create(sheetParams);\n modalEvents('on');\n if (opened) {\n f7Sheet.current.open(false);\n }\n });\n };\n const onDestroy = () => {\n if (f7Sheet.current) {\n f7Sheet.current.destroy();\n }\n f7Sheet.current = null;\n };\n useIsomorphicLayoutEffect(() => {\n modalEvents('on');\n return () => {\n modalEvents('off');\n };\n });\n useIsomorphicLayoutEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n watchProp(opened, value => {\n if (!f7Sheet.current) return;\n if (value) {\n f7Sheet.current.open();\n } else {\n f7Sheet.current.close();\n }\n });\n const slots = getSlots(props);\n const fixedList = [];\n const staticList = [];\n const fixedTags = 'navbar toolbar tabbar subnavbar searchbar messagebar fab list-index panel'.split(' ').map(tagName => `f7-${tagName}`);\n const slotsDefault = slots.default;\n if (slotsDefault && slotsDefault.length) {\n slotsDefault.forEach(child => {\n if (typeof child === 'undefined') return;\n let isFixedTag = false;\n const tag = child.type && (child.type.displayName || child.type.name);\n if (!tag) {\n staticList.push(child);\n return;\n }\n if (fixedTags.indexOf(tag) >= 0) {\n isFixedTag = true;\n }\n if (isFixedTag) fixedList.push(child);else staticList.push(child);\n });\n }\n const innerEl = /*#__PURE__*/React.createElement(\"div\", {\n className: \"sheet-modal-inner\"\n }, staticList, slots.static);\n let positionComputed = 'bottom';\n if (position) positionComputed = position;else if (top) positionComputed = 'top';else if (bottom) positionComputed = 'bottom';\n const classes = classNames(className, 'sheet-modal', `sheet-modal-${positionComputed}`, {\n 'sheet-modal-push': push\n }, modalStateClasses({\n isOpened,\n isClosing\n }), colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), fixedList, slots.fixed, innerEl);\n});\nSheet.displayName = 'f7-sheet';\nexport default Sheet;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, emit } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7ready, f7 } from '../shared/f7.js';\nimport { watchProp } from '../shared/watch-prop.js';\nimport { modalStateClasses } from '../shared/modal-state-classes.js';\n\n\n\nconst Popover = /*#__PURE__*/forwardRef((props, ref) => {\n const f7Popover = useRef(null);\n const {\n className,\n id,\n style,\n children,\n opened,\n animate,\n targetEl,\n arrow,\n backdrop,\n backdropEl,\n closeByBackdropClick,\n closeByOutsideClick,\n closeOnEscape,\n containerEl,\n verticalPosition\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const isOpened = useRef(opened);\n const isClosing = useRef(false);\n const onOpen = instance => {\n isOpened.current = true;\n isClosing.current = false;\n emit(props, 'popoverOpen', instance);\n };\n const onOpened = instance => {\n emit(props, 'popoverOpened', instance);\n };\n const onClose = instance => {\n isOpened.current = false;\n isClosing.current = true;\n emit(props, 'popoverClose', instance);\n };\n const onClosed = instance => {\n isClosing.current = false;\n emit(props, 'popoverClosed', instance);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n f7Popover: () => f7Popover.current\n }));\n watchProp(opened, value => {\n if (!f7Popover.current) return;\n if (value) {\n f7Popover.current.open();\n } else {\n f7Popover.current.close();\n }\n });\n const modalEvents = method => {\n if (!f7Popover.current) return;\n f7Popover.current[method]('open', onOpen);\n f7Popover.current[method]('opened', onOpened);\n f7Popover.current[method]('close', onClose);\n f7Popover.current[method]('closed', onClosed);\n };\n const onMount = () => {\n if (!elRef.current) return;\n const popoverParams = {\n el: elRef.current\n };\n if (targetEl) popoverParams.targetEl = targetEl;\n if ('closeByBackdropClick' in props) popoverParams.closeByBackdropClick = closeByBackdropClick;\n if ('closeByOutsideClick' in props) popoverParams.closeByOutsideClick = closeByOutsideClick;\n if ('closeOnEscape' in props) popoverParams.closeOnEscape = closeOnEscape;\n if ('arrow' in props) popoverParams.arrow = arrow;\n if ('backdrop' in props) popoverParams.backdrop = backdrop;\n if ('backdropEl' in props) popoverParams.backdropEl = backdropEl;\n if ('animate' in props) popoverParams.animate = animate;\n if ('containerEl' in props) popoverParams.containerEl = containerEl;\n if ('verticalPosition' in props) popoverParams.verticalPosition = verticalPosition;\n f7ready(() => {\n f7Popover.current = f7.popover.create(popoverParams);\n modalEvents('on');\n if (opened && targetEl) {\n f7Popover.current.open(targetEl, false);\n }\n });\n };\n const onDestroy = () => {\n if (f7Popover.current) {\n f7Popover.current.destroy();\n }\n f7Popover.current = null;\n };\n useIsomorphicLayoutEffect(() => {\n modalEvents('on');\n return () => {\n modalEvents('off');\n };\n });\n useIsomorphicLayoutEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n const classes = classNames(className, 'popover', modalStateClasses({\n isOpened,\n isClosing\n }), colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), arrow !== false && /*#__PURE__*/React.createElement(\"div\", {\n className: \"popover-arrow\"\n }), /*#__PURE__*/React.createElement(\"div\", {\n className: \"popover-inner\"\n }, children));\n});\nPopover.displayName = 'f7-popover';\nexport default Popover;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, noUndefinedProps, emit } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7ready, f7 } from '../shared/f7.js';\nimport { watchProp } from '../shared/watch-prop.js';\n\n\n\nconst Panel = /*#__PURE__*/forwardRef((props, ref) => {\n const f7Panel = useRef(null);\n const {\n className,\n id,\n style,\n children,\n side,\n effect,\n // eslint-disable-next-line\n cover,\n reveal,\n push,\n floating,\n left,\n // right,\n opened,\n resizable,\n backdrop = true,\n backdropEl,\n containerEl,\n closeByBackdropClick,\n visibleBreakpoint,\n collapsedBreakpoint,\n swipe,\n swipeNoFollow,\n swipeOnlyClose,\n swipeActiveArea = 0,\n swipeThreshold = 0\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const isOpened = useRef(false);\n const isClosing = useRef(false);\n const isCollapsed = useRef(false);\n const isBreakpoint = useRef(false);\n const onOpen = event => {\n isOpened.current = true;\n isClosing.current = false;\n emit(props, 'panelOpen', event);\n };\n const onOpened = event => {\n emit(props, 'panelOpened', event);\n };\n const onClose = event => {\n isOpened.current = false;\n isClosing.current = true;\n emit(props, 'panelClose', event);\n };\n const onClosed = event => {\n isClosing.current = false;\n emit(props, 'panelClosed', event);\n };\n const onBackdropClick = event => {\n emit(props, 'click panelBackdropClick', event);\n };\n const onSwipe = event => {\n emit(props, 'panelSwipe', event);\n };\n const onSwipeOpen = event => {\n emit(props, 'panelSwipeOpen', event);\n };\n const onBreakpoint = event => {\n isBreakpoint.current = true;\n isCollapsed.current = false;\n emit(props, 'panelBreakpoint', event);\n };\n const onCollapsedBreakpoint = event => {\n isBreakpoint.current = false;\n isCollapsed.current = true;\n emit(props, 'panelCollapsedBreakpoint', event);\n };\n const onResize = function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n emit(props, 'panelResize', ...args);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n f7Panel: () => f7Panel.current\n }));\n watchProp(resizable, newValue => {\n if (!f7Panel.current) return;\n if (newValue) f7Panel.current.enableResizable();else f7Panel.current.disableResizable();\n });\n watchProp(opened, newValue => {\n if (!f7Panel.current) return;\n if (newValue) {\n f7Panel.current.open();\n } else {\n f7Panel.current.close();\n }\n });\n const modalEvents = method => {\n if (!f7Panel.current) return;\n f7Panel.current[method]('open', onOpen);\n f7Panel.current[method]('opened', onOpened);\n f7Panel.current[method]('close', onClose);\n f7Panel.current[method]('closed', onClosed);\n f7Panel.current[method]('backdropClick', onBackdropClick);\n f7Panel.current[method]('swipe', onSwipe);\n f7Panel.current[method]('swipeOpen', onSwipeOpen);\n f7Panel.current[method]('collapsedBreakpoint', onCollapsedBreakpoint);\n f7Panel.current[method]('breakpoint', onBreakpoint);\n f7Panel.current[method]('resize', onResize);\n };\n const onMount = () => {\n f7ready(() => {\n const $ = f7.$;\n if (!$) return;\n if ($('.panel-backdrop').length === 0) {\n $('').insertBefore(elRef.current);\n }\n const params = noUndefinedProps({\n el: elRef.current,\n resizable,\n backdrop,\n backdropEl,\n containerEl,\n visibleBreakpoint,\n collapsedBreakpoint,\n swipe,\n swipeNoFollow,\n swipeOnlyClose,\n swipeActiveArea,\n swipeThreshold,\n closeByBackdropClick\n });\n f7Panel.current = f7.panel.create(params);\n modalEvents('on');\n if (opened) {\n f7Panel.current.open(false);\n }\n });\n };\n const onDestroy = () => {\n if (f7Panel.current && f7Panel.current.destroy) {\n f7Panel.current.destroy();\n }\n f7Panel.current = null;\n };\n useIsomorphicLayoutEffect(() => {\n modalEvents('on');\n return () => {\n modalEvents('off');\n };\n });\n useIsomorphicLayoutEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n const sideComputed = side || (left ? 'left' : 'right');\n // eslint-disable-next-line\n const effectComputed = effect || (reveal ? 'reveal' : push ? 'push' : floating ? 'floating' : 'cover');\n const classes = classNames(className, 'panel', {\n 'panel-in': isOpened.current && !isClosing.current && !isBreakpoint.current,\n 'panel-in-breakpoint': isBreakpoint.current,\n 'panel-in-collapsed': isCollapsed.current,\n 'panel-resizable': resizable,\n [`panel-${sideComputed}`]: sideComputed,\n [`panel-${effectComputed}`]: effectComputed\n }, colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), children, resizable && /*#__PURE__*/React.createElement(\"div\", {\n className: \"panel-resize-handler\"\n }));\n});\nPanel.displayName = 'f7-panel';\nexport default Panel;","import React from 'react';\nimport Popup from '../components/popup.js';\nimport View from '../components/view.js';\nimport LoginScreen from '../components/login-screen.js';\nimport Sheet from '../components/sheet.js';\nimport Popover from '../components/popover.js';\nimport Panel from '../components/panel.js';\nexport const routerOpenIn = (router, url, options) => {\n const navigateOptions = {\n url,\n route: {\n path: url,\n options: {\n ...options,\n openIn: undefined\n }\n }\n };\n const params = {\n ...options\n };\n if (options.openIn === 'popup') {\n params.component = function DynamicPopup() {\n return /*#__PURE__*/React.createElement(Popup, {\n className: \"popup-router-open-in\",\n \"data-url\": url\n }, /*#__PURE__*/React.createElement(View, {\n linksView: router.view.selector,\n url: url,\n ignoreOpenIn: true\n }));\n };\n navigateOptions.route.popup = params;\n }\n if (options.openIn === 'loginScreen') {\n params.component = function DynamicPopover() {\n return /*#__PURE__*/React.createElement(LoginScreen, {\n className: \"login-screen-router-open-in\",\n \"data-url\": url\n }, /*#__PURE__*/React.createElement(View, {\n linksView: router.view.selector,\n url: url,\n ignoreOpenIn: true\n }));\n };\n navigateOptions.route.loginScreen = params;\n }\n if (options.openIn === 'sheet') {\n params.component = function DynamicSheet() {\n return /*#__PURE__*/React.createElement(Sheet, {\n className: \"sheet-modal-router-open-in\",\n \"data-url\": url\n }, /*#__PURE__*/React.createElement(View, {\n linksView: router.view.selector,\n url: url,\n ignoreOpenIn: true\n }));\n };\n navigateOptions.route.sheet = params;\n }\n if (options.openIn === 'popover') {\n params.targetEl = options.clickedEl || options.targetEl;\n params.component = function DynamicPopover() {\n return /*#__PURE__*/React.createElement(Popover, {\n className: \"popover-router-open-in\",\n targetEl: options.clickedEl || options.targetEl,\n \"data-url\": url\n }, /*#__PURE__*/React.createElement(View, {\n linksView: router.view.selector,\n url: url,\n ignoreOpenIn: true\n }));\n };\n navigateOptions.route.popover = params;\n }\n if (options.openIn.indexOf('panel') >= 0) {\n const parts = options.openIn.split(':');\n const side = parts[1] || 'left';\n const effect = parts[2] || 'cover';\n params.component = function DynamicPanel() {\n return /*#__PURE__*/React.createElement(Panel, {\n side: side,\n effect: effect,\n className: \"panel-router-open-in\",\n \"data-url\": url\n }, /*#__PURE__*/React.createElement(View, {\n linksView: router.view.selector,\n url: url,\n ignoreOpenIn: true\n }));\n };\n navigateOptions.route.panel = params;\n }\n return router.navigate(navigateOptions);\n};","/* eslint no-underscore-dangle: \"off\" */\nimport { f7events, f7routers } from './f7.js';\nimport { extend, getComponentId } from './utils.js';\nimport { routerOpenIn } from './router-open-in.js';\nconst getChildrenArray = el => {\n const arr = [];\n for (let i = 0; i < el.children.length; i += 1) {\n arr.push(el.children[i]);\n }\n return arr;\n};\nconst hasSameChildren = (childrenBefore, childrenAfter) => {\n if (childrenBefore.length !== childrenAfter.length) return false;\n const set = new Set([...childrenBefore, ...childrenAfter]);\n if (set.size === childrenBefore.length) return true;\n return false;\n};\nexport default {\n proto: {\n openIn(router, navigateUrl, options) {\n return routerOpenIn(router, navigateUrl, options);\n },\n pageComponentLoader(_ref) {\n let {\n routerEl,\n component,\n options,\n resolve,\n reject\n } = _ref;\n const router = this;\n const routerId = router.id;\n const el = routerEl;\n let viewRouter;\n f7routers.views.forEach(data => {\n if (data.el && data.el === routerEl || data.routerId && data.routerId === routerId) {\n viewRouter = data;\n }\n });\n if (!viewRouter) {\n reject();\n return;\n }\n const pageData = {\n component,\n id: getComponentId(),\n props: extend({\n f7route: options.route,\n f7router: router\n }, options.route.params, options.props || {})\n };\n let resolved;\n const childrenBefore = getChildrenArray(el);\n function onDidUpdate(componentRouterData) {\n if (componentRouterData !== viewRouter || resolved) return;\n const childrenAfter = getChildrenArray(el);\n if (hasSameChildren(childrenBefore, childrenAfter)) return;\n f7events.off('viewRouterDidUpdate', onDidUpdate);\n const pageEl = el.children[el.children.length - 1];\n pageData.el = pageEl;\n resolve(pageEl);\n resolved = true;\n }\n f7events.on('viewRouterDidUpdate', onDidUpdate);\n viewRouter.pages.push(pageData);\n viewRouter.setPages(viewRouter.pages);\n },\n removePage($pageEl) {\n if (!$pageEl) return;\n const router = this;\n let f7Page;\n if ('length' in $pageEl && $pageEl[0]) f7Page = $pageEl[0].f7Page;else f7Page = $pageEl.f7Page;\n if (f7Page && f7Page.route && f7Page.route.route && f7Page.route.route.keepAlive) {\n router.app.$($pageEl).remove();\n return;\n }\n let viewRouter;\n f7routers.views.forEach(data => {\n if (data.el && data.el === router.el) {\n viewRouter = data;\n }\n });\n let pageEl;\n if ('length' in $pageEl) {\n // Dom7\n if ($pageEl.length === 0) return;\n pageEl = $pageEl[0];\n } else {\n pageEl = $pageEl;\n }\n if (!pageEl) return;\n let pageComponentFound;\n viewRouter.pages.forEach((page, index) => {\n if (page.el === pageEl) {\n pageComponentFound = true;\n viewRouter.pages.splice(index, 1);\n viewRouter.setPages(viewRouter.pages);\n }\n });\n if (!pageComponentFound) {\n pageEl.parentNode.removeChild(pageEl);\n }\n },\n tabComponentLoader(_temp) {\n let {\n tabEl,\n component,\n options,\n resolve,\n reject\n } = _temp === void 0 ? {} : _temp;\n const router = this;\n if (!tabEl) reject();\n let tabRouter;\n f7routers.tabs.forEach(tabData => {\n if (tabData.el && tabData.el === tabEl) {\n tabRouter = tabData;\n }\n });\n if (!tabRouter) {\n reject();\n return;\n }\n const id = getComponentId();\n const tabContent = {\n id,\n component,\n props: extend({\n f7route: options.route,\n f7router: router\n }, options.route.route && options.route.route.tab && options.route.route.tab.options && options.route.route.tab.options.props || {}, options.route.params, options.props || {})\n };\n let resolved;\n function onDidUpdate(componentRouterData) {\n if (componentRouterData !== tabRouter || resolved) return;\n f7events.off('tabRouterDidUpdate', onDidUpdate);\n const tabContentEl = tabEl.children[0];\n resolve(tabContentEl);\n resolved = true;\n }\n f7events.on('tabRouterDidUpdate', onDidUpdate);\n tabRouter.setTabContent(tabContent);\n },\n removeTabContent(tabEl) {\n if (!tabEl) return;\n let tabRouter;\n f7routers.tabs.forEach(tabData => {\n if (tabData.el && tabData.el === tabEl) {\n tabRouter = tabData;\n }\n });\n if (!tabRouter) {\n tabEl.innerHTML = ''; // eslint-disable-line\n return;\n }\n tabRouter.setTabContent(null);\n },\n modalComponentLoader(_temp2) {\n let {\n component,\n options,\n resolve,\n reject\n } = _temp2 === void 0 ? {} : _temp2;\n const router = this;\n const modalsRouter = f7routers.modals;\n if (!modalsRouter) {\n reject();\n return;\n }\n const modalData = {\n component,\n id: getComponentId(),\n props: extend({\n f7route: options.route,\n f7router: router\n }, options.route.params, options.props || {})\n };\n let resolved;\n function onDidUpdate() {\n if (resolved) return;\n f7events.off('modalsRouterDidUpdate', onDidUpdate);\n const modalEl = modalsRouter.el.children[modalsRouter.el.children.length - 1];\n modalData.el = modalEl;\n resolve(modalEl);\n resolved = true;\n }\n f7events.on('modalsRouterDidUpdate', onDidUpdate);\n modalsRouter.modals.push(modalData);\n modalsRouter.setModals(modalsRouter.modals);\n },\n removeModal(modalEl) {\n const modalsRouter = f7routers.modals;\n if (!modalsRouter) return;\n let modalDataToRemove;\n modalsRouter.modals.forEach(modalData => {\n if (modalData.el === modalEl) modalDataToRemove = modalData;\n });\n modalsRouter.modals.splice(modalsRouter.modals.indexOf(modalDataToRemove), 1);\n modalsRouter.setModals(modalsRouter.modals);\n }\n }\n};","import Framework7 from 'framework7/lite';\nimport componentsRouter from './components-router.js';\nimport { f7, f7ready, theme, f7initEvents, setTheme } from './f7.js';\nconst Framework7React = {\n name: 'reactPlugin',\n installed: false,\n install(params) {\n if (params === void 0) {\n params = {};\n }\n if (Framework7React.installed) return;\n Framework7React.installed = true;\n f7initEvents();\n const {\n theme: paramsTheme,\n userAgent\n } = params;\n if (paramsTheme === 'md') theme.md = true;\n if (paramsTheme === 'ios') theme.ios = true;\n\n // eslint-disable-next-line\n const needThemeCalc = typeof window === 'undefined' ? !!userAgent : true;\n if (needThemeCalc && (!paramsTheme || paramsTheme === 'auto')) {\n const device = Framework7.getDevice({\n userAgent\n }, true);\n theme.ios = !!device.ios;\n theme.md = !theme.ios;\n }\n f7ready(() => {\n setTheme();\n });\n Framework7.Router.use(componentsRouter);\n }\n};\nexport { f7ready, f7, theme };\nexport default Framework7React;","/**\n * Framework7 React 8.3.2\n * Build full featured iOS & Android apps using Framework7 & React\n * https://framework7.io/react/\n *\n * Copyright 2014-2024 Vladimir Kharlampidi\n *\n * Released under the MIT License\n *\n * Released on: February 27, 2024\n */\nimport Framework7React from './shared/plugin.js';\nimport { f7, f7ready, theme } from './shared/f7.js';\nimport { useStore } from './shared/use-store.js';\n\nimport AccordionContent from './components/accordion-content.js';\nimport AccordionItem from './components/accordion-item.js';\nimport AccordionToggle from './components/accordion-toggle.js';\nimport Accordion from './components/accordion.js';\nimport ActionsButton from './components/actions-button.js';\nimport ActionsGroup from './components/actions-group.js';\nimport ActionsLabel from './components/actions-label.js';\nimport Actions from './components/actions.js';\nimport App from './components/app.js';\nimport AreaChart from './components/area-chart.js';\nimport Badge from './components/badge.js';\nimport BlockFooter from './components/block-footer.js';\nimport BlockHeader from './components/block-header.js';\nimport BlockTitle from './components/block-title.js';\nimport Block from './components/block.js';\nimport BreadcrumbsCollapsed from './components/breadcrumbs-collapsed.js';\nimport BreadcrumbsItem from './components/breadcrumbs-item.js';\nimport BreadcrumbsSeparator from './components/breadcrumbs-separator.js';\nimport Breadcrumbs from './components/breadcrumbs.js';\nimport Button from './components/button.js';\nimport CardContent from './components/card-content.js';\nimport CardFooter from './components/card-footer.js';\nimport CardHeader from './components/card-header.js';\nimport Card from './components/card.js';\nimport Checkbox from './components/checkbox.js';\nimport Chip from './components/chip.js';\nimport FabBackdrop from './components/fab-backdrop.js';\nimport FabButton from './components/fab-button.js';\nimport FabButtons from './components/fab-buttons.js';\nimport Fab from './components/fab.js';\nimport Gauge from './components/gauge.js';\nimport Icon from './components/icon.js';\nimport Input from './components/input.js';\nimport Link from './components/link.js';\nimport ListButton from './components/list-button.js';\nimport ListGroup from './components/list-group.js';\nimport ListIndex from './components/list-index.js';\nimport ListInput from './components/list-input.js';\nimport ListItemContent from './components/list-item-content.js';\nimport ListItem from './components/list-item.js';\nimport List from './components/list.js';\nimport LoginScreenTitle from './components/login-screen-title.js';\nimport LoginScreen from './components/login-screen.js';\nimport Message from './components/message.js';\nimport MessagebarAttachment from './components/messagebar-attachment.js';\nimport MessagebarAttachments from './components/messagebar-attachments.js';\nimport MessagebarSheetImage from './components/messagebar-sheet-image.js';\nimport MessagebarSheetItem from './components/messagebar-sheet-item.js';\nimport MessagebarSheet from './components/messagebar-sheet.js';\nimport Messagebar from './components/messagebar.js';\nimport MessagesTitle from './components/messages-title.js';\nimport Messages from './components/messages.js';\nimport NavLeft from './components/nav-left.js';\nimport NavRight from './components/nav-right.js';\nimport NavTitleLarge from './components/nav-title-large.js';\nimport NavTitle from './components/nav-title.js';\nimport Navbar from './components/navbar.js';\nimport PageContent from './components/page-content.js';\nimport Page from './components/page.js';\nimport Panel from './components/panel.js';\nimport PhotoBrowser from './components/photo-browser.js';\nimport PieChart from './components/pie-chart.js';\nimport Popover from './components/popover.js';\nimport Popup from './components/popup.js';\nimport Preloader from './components/preloader.js';\nimport Progressbar from './components/progressbar.js';\nimport Radio from './components/radio.js';\nimport Range from './components/range.js';\nimport RoutableModals from './components/routable-modals.js';\nimport Searchbar from './components/searchbar.js';\nimport Segmented from './components/segmented.js';\nimport Sheet from './components/sheet.js';\nimport SkeletonAvatar from './components/skeleton-avatar.js';\nimport SkeletonBlock from './components/skeleton-block.js';\nimport SkeletonImage from './components/skeleton-image.js';\nimport SkeletonText from './components/skeleton-text.js';\nimport Stepper from './components/stepper.js';\nimport Subnavbar from './components/subnavbar.js';\nimport SwipeoutActions from './components/swipeout-actions.js';\nimport SwipeoutButton from './components/swipeout-button.js';\nimport Tab from './components/tab.js';\nimport Tabs from './components/tabs.js';\nimport TextEditor from './components/text-editor.js';\nimport Toggle from './components/toggle.js';\nimport Toolbar from './components/toolbar.js';\nimport TreeviewItem from './components/treeview-item.js';\nimport Treeview from './components/treeview.js';\nimport View from './components/view.js';\nimport Views from './components/views.js';\n\nexport { AccordionContent, AccordionItem, AccordionToggle, Accordion, ActionsButton, ActionsGroup, ActionsLabel, Actions, App, AreaChart, Badge, BlockFooter, BlockHeader, BlockTitle, Block, BreadcrumbsCollapsed, BreadcrumbsItem, BreadcrumbsSeparator, Breadcrumbs, Button, CardContent, CardFooter, CardHeader, Card, Checkbox, Chip, FabBackdrop, FabButton, FabButtons, Fab, Gauge, Icon, Input, Link, ListButton, ListGroup, ListIndex, ListInput, ListItemContent, ListItem, List, LoginScreenTitle, LoginScreen, Message, MessagebarAttachment, MessagebarAttachments, MessagebarSheetImage, MessagebarSheetItem, MessagebarSheet, Messagebar, MessagesTitle, Messages, NavLeft, NavRight, NavTitleLarge, NavTitle, Navbar, PageContent, Page, Panel, PhotoBrowser, PieChart, Popover, Popup, Preloader, Progressbar, Radio, Range, RoutableModals, Searchbar, Segmented, Sheet, SkeletonAvatar, SkeletonBlock, SkeletonImage, SkeletonText, Stepper, Subnavbar, SwipeoutActions, SwipeoutButton, Tab, Tabs, TextEditor, Toggle, Toolbar, TreeviewItem, Treeview, View, Views }\nexport { f7, f7ready, theme, useStore };\nexport default Framework7React;\n","var __WEBPACK_NAMESPACE_OBJECT__ = jQuery;","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle, useState } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { f7events, f7routers, f7 } from '../shared/f7.js';\n\n\nconst RoutableModals = /*#__PURE__*/forwardRef((props, ref) => {\n const [modals, setModals] = useState([]);\n const elRef = useRef(null);\n const routerData = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n const onMount = () => {\n routerData.current = {\n modals,\n el: elRef.current,\n setModals(newModals) {\n setModals([...newModals]);\n }\n };\n f7routers.modals = routerData.current;\n };\n const onDestroy = () => {\n if (!routerData.current) return;\n f7routers.modals = null;\n routerData.current = null;\n };\n useIsomorphicLayoutEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n useIsomorphicLayoutEffect(() => {\n if (!routerData.current || !f7) return;\n f7events.emit('modalsRouterDidUpdate', routerData.current);\n });\n return /*#__PURE__*/React.createElement(\"div\", {\n ref: elRef,\n className: \"framework7-modals\"\n }, modals.map(_ref => {\n let {\n component: ModalComponent,\n id: modalId,\n props: modalProps\n } = _ref;\n return /*#__PURE__*/React.createElement(ModalComponent, _extends({\n key: modalId\n }, modalProps));\n }));\n});\nRoutableModals.displayName = 'f7-routable-modals';\nexport default RoutableModals;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport RoutableModals from './routable-modals.js';\nimport { f7init, f7 } from '../shared/f7.js';\n\n\n\n\nconst App = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n style,\n children,\n ...rest\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const params = rest;\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n const classes = classNames(className, 'framework7-root', colorClasses(props));\n\n // eslint-disable-next-line\n if (!f7 || typeof window === 'undefined') {\n f7init(elRef.current, params, false);\n }\n useIsomorphicLayoutEffect(() => {\n const parentEl = elRef.current && elRef.current.parentNode;\n /* eslint-disable no-restricted-globals */\n if (typeof document !== 'undefined' && parentEl && parentEl !== document.body && parentEl.parentNode === document.body) {\n parentEl.style.height = '100%';\n }\n /* eslint-enable no-restricted-globals */\n if (f7) {\n f7.init(elRef.current);\n return;\n }\n f7init(elRef.current, params, true);\n }, []);\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: \"framework7-root\",\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), children, /*#__PURE__*/React.createElement(RoutableModals, null));\n});\nApp.displayName = 'f7-app';\nexport default App;","import { useState } from 'react';\nimport { f7, f7ready, theme } from './f7.js';\nexport const useTheme = () => {\n const [t, setTheme] = useState(f7 ? theme : null);\n if (!f7) {\n f7ready(() => {\n setTheme(theme);\n });\n }\n return t;\n};","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { classNames, getExtraAttrs, extend } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { useTheme } from '../shared/use-theme.js';\n\n\nconst Preloader = /*#__PURE__*/forwardRef((props, ref) => {\n const theme = useTheme();\n const {\n className,\n id,\n style,\n size\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n const preloaderStyle = {};\n let sizeComputed = size;\n if (sizeComputed && typeof sizeComputed === 'string' && sizeComputed.indexOf('px') >= 0) {\n sizeComputed = sizeComputed.replace('px', '');\n }\n if (sizeComputed) {\n preloaderStyle.width = `${sizeComputed}px`;\n preloaderStyle.height = `${sizeComputed}px`;\n preloaderStyle['--f7-preloader-size'] = `${sizeComputed}px`;\n }\n if (style) extend(preloaderStyle, style || {});\n let innerEl;\n if (theme && theme.md) {\n innerEl = /*#__PURE__*/React.createElement(\"span\", {\n className: \"preloader-inner\"\n }, /*#__PURE__*/React.createElement(\"svg\", {\n viewBox: \"0 0 36 36\"\n }, /*#__PURE__*/React.createElement(\"circle\", {\n cx: \"18\",\n cy: \"18\",\n r: \"16\"\n })));\n } else if (theme && theme.ios) {\n innerEl = /*#__PURE__*/React.createElement(\"span\", {\n className: \"preloader-inner\"\n }, /*#__PURE__*/React.createElement(\"span\", {\n className: \"preloader-inner-line\"\n }), /*#__PURE__*/React.createElement(\"span\", {\n className: \"preloader-inner-line\"\n }), /*#__PURE__*/React.createElement(\"span\", {\n className: \"preloader-inner-line\"\n }), /*#__PURE__*/React.createElement(\"span\", {\n className: \"preloader-inner-line\"\n }), /*#__PURE__*/React.createElement(\"span\", {\n className: \"preloader-inner-line\"\n }), /*#__PURE__*/React.createElement(\"span\", {\n className: \"preloader-inner-line\"\n }), /*#__PURE__*/React.createElement(\"span\", {\n className: \"preloader-inner-line\"\n }), /*#__PURE__*/React.createElement(\"span\", {\n className: \"preloader-inner-line\"\n }));\n } else if (!theme) {\n innerEl = /*#__PURE__*/React.createElement(\"span\", {\n className: \"preloader-inner\"\n });\n }\n const classes = classNames(className, {\n preloader: true\n }, colorClasses(props));\n return /*#__PURE__*/React.createElement(\"span\", _extends({\n id: id,\n style: preloaderStyle,\n className: classes,\n ref: elRef\n }, extraAttrs), innerEl);\n});\nPreloader.displayName = 'f7-preloader';\nexport default Preloader;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, emit } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport Preloader from './preloader.js';\nimport { useTab } from '../shared/use-tab.js';\nimport { f7ready, f7 } from '../shared/f7.js';\n\n\nconst PageContent = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n tab,\n tabActive,\n ptr,\n ptrDistance,\n ptrPreloader = true,\n ptrBottom,\n ptrMousewheel,\n infinite,\n infiniteTop,\n infiniteDistance,\n infinitePreloader = true,\n hideBarsOnScroll,\n hideNavbarOnScroll,\n hideToolbarOnScroll,\n messagesContent,\n loginScreen\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const onPtrPullStart = el => {\n if (elRef.current !== el) return;\n emit(props, 'ptrPullStart');\n };\n const onPtrPullMove = el => {\n if (elRef.current !== el) return;\n emit(props, 'ptrPullMove');\n };\n const onPtrPullEnd = el => {\n if (elRef.current !== el) return;\n emit(props, 'ptrPullEnd');\n };\n const onPtrRefresh = (el, done) => {\n if (elRef.current !== el) return;\n emit(props, 'ptrRefresh', done);\n };\n const onPtrDone = el => {\n if (elRef.current !== el) return;\n emit(props, 'ptrDone');\n };\n const onInfinite = el => {\n if (elRef.current !== el) return;\n emit(props, 'infinite');\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n useTab(elRef, props);\n const attachEvents = () => {\n f7ready(() => {\n if (ptr) {\n f7.on('ptrPullStart', onPtrPullStart);\n f7.on('ptrPullMove', onPtrPullMove);\n f7.on('ptrPullEnd', onPtrPullEnd);\n f7.on('ptrRefresh', onPtrRefresh);\n f7.on('ptrDone', onPtrDone);\n }\n if (infinite) {\n f7.on('infinite', onInfinite);\n }\n });\n };\n const detachEvents = () => {\n if (!f7) return;\n f7.off('ptrPullStart', onPtrPullStart);\n f7.off('ptrPullMove', onPtrPullMove);\n f7.off('ptrPullEnd', onPtrPullEnd);\n f7.off('ptrRefresh', onPtrRefresh);\n f7.off('ptrDone', onPtrDone);\n f7.off('infinite', onInfinite);\n };\n useIsomorphicLayoutEffect(() => {\n attachEvents();\n return detachEvents;\n });\n let ptrEl;\n let infiniteEl;\n if (ptr && ptrPreloader) {\n ptrEl = /*#__PURE__*/React.createElement(\"div\", {\n className: \"ptr-preloader\"\n }, /*#__PURE__*/React.createElement(Preloader, null), /*#__PURE__*/React.createElement(\"div\", {\n className: \"ptr-arrow\"\n }));\n }\n if (infinite && infinitePreloader) {\n infiniteEl = /*#__PURE__*/React.createElement(Preloader, {\n className: \"infinite-scroll-preloader\"\n });\n }\n const classes = classNames(className, 'page-content', {\n tab,\n 'tab-active': tabActive,\n 'ptr-content': ptr,\n 'ptr-bottom': ptrBottom,\n 'infinite-scroll-content': infinite,\n 'infinite-scroll-top': infiniteTop,\n 'hide-bars-on-scroll': hideBarsOnScroll,\n 'hide-navbar-on-scroll': hideNavbarOnScroll,\n 'hide-toolbar-on-scroll': hideToolbarOnScroll,\n 'messages-content': messagesContent,\n 'login-screen-content': loginScreen\n }, colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n \"data-ptr-distance\": ptrDistance || undefined,\n \"data-ptr-mousewheel\": ptrMousewheel || undefined,\n \"data-infinite-distance\": infiniteDistance || undefined,\n ref: elRef\n }, extraAttrs), ptrBottom ? null : ptrEl, infiniteTop ? infiniteEl : null, children, infiniteTop ? null : infiniteEl, ptrBottom ? ptrEl : null);\n});\nPageContent.displayName = 'f7-page-content';\nexport default PageContent;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, getSlots, emit } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7ready, f7 } from '../shared/f7.js';\nimport PageContent from './page-content.js';\n\n\nconst Page = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n name,\n withSubnavbar,\n subnavbar,\n withNavbarLarge,\n navbarLarge,\n noNavbar,\n noToolbar,\n tabs,\n pageContent = true,\n noSwipeback,\n ptr,\n ptrDistance,\n ptrPreloader = true,\n ptrBottom,\n ptrMousewheel,\n infinite,\n infiniteTop,\n infiniteDistance,\n infinitePreloader = true,\n hideBarsOnScroll,\n hideNavbarOnScroll,\n hideToolbarOnScroll,\n messagesContent,\n loginScreen,\n onPtrPullStart,\n onPtrPullMove,\n onPtrPullEnd,\n onPtrRefresh,\n onPtrDone,\n onInfinite\n } = props;\n const hasSubnavbar = useRef(false);\n const hasNavbarLarge = useRef(false);\n const hasNavbarLargeCollapsed = useRef(false);\n const hasCardExpandableOpened = useRef(false);\n const routerPositionClass = useRef('');\n const routerPageRole = useRef(null);\n const routerPageRoleDetailRoot = useRef(false);\n const routerPageMasterStack = useRef(false);\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n\n // Main Page Events\n const onPageMounted = page => {\n if (elRef.current !== page.el) return;\n emit(props, 'pageMounted', page);\n };\n const onPageInit = page => {\n if (elRef.current !== page.el) return;\n if (typeof withSubnavbar === 'undefined' && typeof subnavbar === 'undefined') {\n if (page.$navbarEl && page.$navbarEl.length && page.$navbarEl.find('.subnavbar').length || page.$el.children('.navbar').find('.subnavbar').length) {\n hasSubnavbar.current = true;\n }\n }\n if (typeof withNavbarLarge === 'undefined' && typeof navbarLarge === 'undefined') {\n if (page.$navbarEl && page.$navbarEl.hasClass('navbar-large')) {\n hasNavbarLarge.current = true;\n }\n }\n emit(props, 'pageInit', page);\n };\n const onPageReinit = page => {\n if (elRef.current !== page.el) return;\n emit(props, 'pageReinit', page);\n };\n const onPageBeforeIn = page => {\n if (elRef.current !== page.el) return;\n if (!page.swipeBack) {\n if (page.from === 'next') {\n routerPositionClass.current = 'page-next';\n }\n if (page.from === 'previous') {\n routerPositionClass.current = 'page-previous';\n }\n }\n emit(props, 'pageBeforeIn', page);\n };\n const onPageBeforeOut = page => {\n if (elRef.current !== page.el) return;\n emit(props, 'pageBeforeOut', page);\n };\n const onPageAfterOut = page => {\n if (elRef.current !== page.el) return;\n if (page.to === 'next') {\n routerPositionClass.current = 'page-next';\n }\n if (page.to === 'previous') {\n routerPositionClass.current = 'page-previous';\n }\n emit(props, 'pageAfterOut', page);\n };\n const onPageAfterIn = page => {\n if (elRef.current !== page.el) return;\n routerPositionClass.current = 'page-current';\n emit(props, 'pageAfterIn', page);\n };\n const onPageBeforeRemove = page => {\n if (elRef.current !== page.el) return;\n emit(props, 'pageBeforeRemove', page);\n };\n const onPageBeforeUnmount = page => {\n if (elRef.current !== page.el) return;\n emit(props, 'pageBeforeUnmount', page);\n };\n const onPagePosition = (pageEl, position) => {\n if (elRef.current !== pageEl) return;\n routerPositionClass.current = `page-${position}`;\n };\n const onPageRole = (pageEl, rolesData) => {\n if (elRef.current !== pageEl) return;\n routerPageRole.current = rolesData.role;\n routerPageRoleDetailRoot.current = rolesData.detailRoot;\n };\n const onPageMasterStack = pageEl => {\n if (elRef.current !== pageEl) return;\n routerPageMasterStack.current = true;\n };\n const onPageMasterUnstack = pageEl => {\n if (elRef.current !== pageEl) return;\n routerPageMasterStack.current = false;\n };\n const onPageNavbarLargeCollapsed = pageEl => {\n if (elRef.current !== pageEl) return;\n hasNavbarLargeCollapsed.current = true;\n };\n const onPageNavbarLargeExpanded = pageEl => {\n if (elRef.current !== pageEl) return;\n hasNavbarLargeCollapsed.current = false;\n };\n const onCardOpened = (cardEl, pageEl) => {\n if (elRef.current !== pageEl) return;\n hasCardExpandableOpened.current = true;\n };\n const onCardClose = (cardEl, pageEl) => {\n if (elRef.current !== pageEl) return;\n hasCardExpandableOpened.current = false;\n };\n const onPageTabShow = pageEl => {\n if (elRef.current !== pageEl) return;\n emit(props, 'pageTabShow');\n };\n const onPageTabHide = pageEl => {\n if (elRef.current !== pageEl) return;\n emit(props, 'pageTabHide');\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n const attachEvents = () => {\n f7ready(() => {\n f7.on('pageMounted', onPageMounted);\n f7.on('pageInit', onPageInit);\n f7.on('pageReinit', onPageReinit);\n f7.on('pageBeforeIn', onPageBeforeIn);\n f7.on('pageBeforeOut', onPageBeforeOut);\n f7.on('pageAfterOut', onPageAfterOut);\n f7.on('pageAfterIn', onPageAfterIn);\n f7.on('pageBeforeRemove', onPageBeforeRemove);\n f7.on('pageBeforeUnmount', onPageBeforeUnmount);\n f7.on('pagePosition', onPagePosition);\n f7.on('pageRole', onPageRole);\n f7.on('pageMasterStack', onPageMasterStack);\n f7.on('pageMasterUnstack', onPageMasterUnstack);\n f7.on('pageNavbarLargeCollapsed', onPageNavbarLargeCollapsed);\n f7.on('pageNavbarLargeExpanded', onPageNavbarLargeExpanded);\n f7.on('cardOpened', onCardOpened);\n f7.on('cardClose', onCardClose);\n f7.on('pageTabShow', onPageTabShow);\n f7.on('pageTabHide', onPageTabHide);\n });\n };\n const detachEvents = () => {\n if (!f7) return;\n f7.off('pageMounted', onPageMounted);\n f7.off('pageInit', onPageInit);\n f7.off('pageReinit', onPageReinit);\n f7.off('pageBeforeIn', onPageBeforeIn);\n f7.off('pageBeforeOut', onPageBeforeOut);\n f7.off('pageAfterOut', onPageAfterOut);\n f7.off('pageAfterIn', onPageAfterIn);\n f7.off('pageBeforeRemove', onPageBeforeRemove);\n f7.off('pageBeforeUnmount', onPageBeforeUnmount);\n f7.off('pagePosition', onPagePosition);\n f7.off('pageRole', onPageRole);\n f7.off('pageMasterStack', onPageMasterStack);\n f7.off('pageMasterUnstack', onPageMasterUnstack);\n f7.off('pageNavbarLargeCollapsed', onPageNavbarLargeCollapsed);\n f7.off('pageNavbarLargeExpanded', onPageNavbarLargeExpanded);\n f7.off('cardOpened', onCardOpened);\n f7.off('cardClose', onCardClose);\n f7.off('pageTabShow', onPageTabShow);\n f7.off('pageTabHide', onPageTabHide);\n };\n useIsomorphicLayoutEffect(() => {\n attachEvents();\n return detachEvents;\n });\n const slots = getSlots(props);\n const fixedList = [];\n const staticList = [];\n const {\n static: slotsStatic,\n fixed: slotsFixed,\n default: slotsDefault\n } = slots;\n const fixedTags = 'navbar toolbar tabbar subnavbar searchbar messagebar fab list-index panel'.split(' ').map(tagName => `f7-${tagName}`);\n let hasSubnavbarComputed;\n let hasNavbarLargeComputed;\n let hasMessages = messagesContent;\n if (slotsDefault) {\n slotsDefault.forEach(child => {\n if (typeof child === 'undefined') return;\n let isFixedTag = false;\n const tag = child.type && (child.type.displayName || child.type.name);\n if (!tag) {\n if (pageContent) staticList.push(child);\n return;\n }\n if (tag === 'f7-subnavbar') hasSubnavbarComputed = true;\n if (tag === 'f7-navbar') {\n if (child.props && child.props.large) hasNavbarLargeComputed = true;\n }\n if (typeof hasMessages === 'undefined' && tag === 'f7-messages') hasMessages = true;\n if (fixedTags.indexOf(tag) >= 0) {\n isFixedTag = true;\n }\n if (pageContent) {\n if (isFixedTag) fixedList.push(child);else staticList.push(child);\n }\n });\n }\n const forceSubnavbar = typeof subnavbar === 'undefined' && typeof withSubnavbar === 'undefined' ? hasSubnavbarComputed || hasSubnavbar.current : false;\n const forceNavbarLarge = typeof navbarLarge === 'undefined' && typeof withNavbarLarge === 'undefined' ? hasNavbarLargeComputed || hasNavbarLarge.current : false;\n const classes = classNames(className, 'page', routerPositionClass.current, {\n tabs,\n 'page-with-subnavbar': subnavbar || withSubnavbar || forceSubnavbar,\n 'page-with-navbar-large': navbarLarge || withNavbarLarge || forceNavbarLarge,\n 'no-navbar': noNavbar,\n 'no-toolbar': noToolbar,\n 'no-swipeback': noSwipeback,\n 'page-master': routerPageRole.current === 'master',\n 'page-master-detail': routerPageRole.current === 'detail',\n 'page-master-detail-root': routerPageRoleDetailRoot.current === true,\n 'page-master-stacked': routerPageMasterStack.current === true,\n 'page-with-navbar-large-collapsed': hasNavbarLargeCollapsed.current === true,\n 'page-with-card-opened': hasCardExpandableOpened.current === true,\n 'login-screen-page': loginScreen\n }, colorClasses(props));\n if (!pageContent) {\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n \"data-name\": name,\n ref: elRef\n }, extraAttrs), slotsFixed, slotsStatic, slotsDefault);\n }\n const pageContentEl = /*#__PURE__*/React.createElement(PageContent, {\n ptr: ptr,\n ptrDistance: ptrDistance,\n ptrPreloader: ptrPreloader,\n ptrBottom: ptrBottom,\n ptrMousewheel: ptrMousewheel,\n infinite: infinite,\n infiniteTop: infiniteTop,\n infiniteDistance: infiniteDistance,\n infinitePreloader: infinitePreloader,\n hideBarsOnScroll: hideBarsOnScroll,\n hideNavbarOnScroll: hideNavbarOnScroll,\n hideToolbarOnScroll: hideToolbarOnScroll,\n messagesContent: messagesContent || hasMessages,\n loginScreen: loginScreen,\n onPtrPullStart: onPtrPullStart,\n onPtrPullMove: onPtrPullMove,\n onPtrPullEnd: onPtrPullEnd,\n onPtrRefresh: onPtrRefresh,\n onPtrDone: onPtrDone,\n onInfinite: onInfinite\n }, slotsStatic, staticList);\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n \"data-name\": name,\n ref: elRef\n }, extraAttrs), fixedList, slotsFixed, pageContentEl);\n});\nPage.displayName = 'f7-page';\nexport default Page;","import { useEffect, useRef } from 'react';\nimport { watchProp } from './watch-prop.js';\nimport { f7, f7ready } from './f7.js';\nexport const useTooltip = (elRef, props) => {\n const f7Tooltip = useRef(null);\n const {\n tooltip,\n tooltipTrigger\n } = props;\n const onMount = () => {\n if (!elRef.current) return;\n if (!tooltip) return;\n f7ready(() => {\n f7Tooltip.current = f7.tooltip.create({\n targetEl: elRef.current,\n text: tooltip,\n trigger: tooltipTrigger\n });\n });\n };\n const onDestroy = () => {\n if (f7Tooltip.current && f7Tooltip.current.destroy) {\n f7Tooltip.current.destroy();\n f7Tooltip.current = null;\n }\n };\n useEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n watchProp(tooltip, value => {\n if (!value && f7Tooltip.current) {\n f7Tooltip.current.destroy();\n f7Tooltip.current = null;\n return;\n }\n if (value && !f7Tooltip.current && f7) {\n f7Tooltip.current = f7.tooltip.create({\n targetEl: elRef.current,\n text: value,\n trigger: tooltipTrigger\n });\n return;\n }\n if (!value || !f7Tooltip.current) return;\n f7Tooltip.current.setText(value);\n });\n};","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { classNames, getExtraAttrs, extend } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { useTooltip } from '../shared/use-tooltip.js';\nimport { useTheme } from '../shared/use-theme.js';\n\n\nconst Icon = /*#__PURE__*/forwardRef((props, ref) => {\n const theme = useTheme();\n const {\n className,\n id,\n style,\n children,\n material,\n f7,\n icon,\n md,\n ios,\n size\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n useTooltip(elRef, props);\n const getClasses = () => {\n let classes = {\n icon: true\n };\n let themeIcon;\n if (theme && theme.ios) themeIcon = ios;else if (theme && theme.md) themeIcon = md;\n if (themeIcon) {\n const parts = themeIcon.split(':');\n const prop = parts[0];\n const value = parts[1];\n if (prop === 'material' || prop === 'f7') {\n classes['material-icons'] = prop === 'material';\n classes['f7-icons'] = prop === 'f7';\n }\n if (prop === 'icon') {\n classes[value] = true;\n }\n if (icon) classes[icon] = true;\n } else {\n classes = {\n icon: true,\n 'material-icons': material,\n 'f7-icons': f7\n };\n if (icon) classes[icon] = true;\n }\n return classNames(className, classes, colorClasses(props));\n };\n const getIconText = () => {\n let text = material || f7;\n if (md && theme && theme.md && (md.indexOf('material:') >= 0 || md.indexOf('f7:') >= 0)) {\n text = md.split(':')[1];\n } else if (ios && theme && theme.ios && (ios.indexOf('material:') >= 0 || ios.indexOf('f7:') >= 0)) {\n text = ios.split(':')[1];\n }\n return text;\n };\n let sizeComputed = size;\n if (typeof size === 'number' || parseFloat(size) === size * 1) {\n sizeComputed = `${size}px`;\n }\n return /*#__PURE__*/React.createElement(\"i\", _extends({\n id: id,\n style: extend({\n fontSize: sizeComputed,\n width: sizeComputed,\n height: sizeComputed\n }, style),\n className: getClasses(),\n ref: elRef\n }, extraAttrs), getIconText(), children);\n});\nIcon.displayName = 'f7-icon';\nexport default Icon;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { classNames, getExtraAttrs } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { useTooltip } from '../shared/use-tooltip.js';\n\n\n/* dts-instance\nf7Tooltip: Tooltip.Tooltip\n*/\n\n\nconst Badge = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n useTooltip(elRef, props);\n const classes = classNames(className, 'badge', colorClasses(props));\n return /*#__PURE__*/React.createElement(\"span\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), children);\n});\nBadge.displayName = 'f7-badge';\nexport default Badge;","import React from 'react';\nimport Icon from '../components/icon.js';\nimport Badge from '../components/badge.js';\nexport const useIcon = function (props) {\n if (props === void 0) {\n props = {};\n }\n const {\n icon,\n iconMaterial,\n iconF7,\n iconMd,\n iconIos,\n iconColor,\n iconSize,\n iconBadge,\n badgeColor,\n iconBadgeColor\n } = props;\n if (icon || iconMaterial || iconF7 || iconMd || iconIos) {\n return /*#__PURE__*/React.createElement(Icon, {\n material: iconMaterial,\n f7: iconF7,\n icon: icon,\n md: iconMd,\n ios: iconIos,\n color: iconColor,\n size: iconSize\n }, (iconBadge || iconBadge === 0) && /*#__PURE__*/React.createElement(Badge, {\n color: badgeColor || iconBadgeColor\n }, iconBadge));\n }\n return null;\n};","import { useEffect } from 'react';\nexport const useRouteProps = function (elRef, _temp) {\n let {\n routeProps\n } = _temp === void 0 ? {} : _temp;\n useEffect(() => {\n if (elRef.current) {\n elRef.current.f7RouteProps = routeProps;\n }\n return () => {\n if (elRef.current && elRef.current.f7RouteProps) {\n delete elRef.current.f7RouteProps;\n }\n };\n }, [routeProps]);\n};","import React from 'react';\nconst TabbarContext = /*#__PURE__*/React.createContext({\n tabbarHasIcons: false\n});\nexport { TabbarContext };","import { useEffect } from 'react';\nimport { f7ready, f7 } from './f7.js';\nimport { extend } from './utils.js';\nexport const useSmartSelect = (smartSelect, smartSelectParams, f7SmartSelect, getEl) => {\n const onMount = () => {\n f7ready(() => {\n if (smartSelect) {\n const ssParams = extend({\n el: getEl()\n }, smartSelectParams || {});\n f7SmartSelect.current = f7.smartSelect.create(ssParams);\n }\n });\n };\n const onDestroy = () => {\n if (f7SmartSelect.current && f7SmartSelect.current.destroy) {\n f7SmartSelect.current.destroy();\n }\n f7SmartSelect.current = null;\n };\n useEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n};","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle, useContext } from 'react';\nimport { classNames, getExtraAttrs, isStringProp, emit } from '../shared/utils.js';\nimport { colorClasses, routerAttrs, routerClasses, actionsAttrs, actionsClasses } from '../shared/mixins.js';\nimport { useIcon } from '../shared/use-icon.js';\nimport { useRouteProps } from '../shared/use-route-props.js';\nimport { useTooltip } from '../shared/use-tooltip.js';\nimport { TabbarContext } from '../shared/tabbar-context.js';\nimport Badge from './badge.js';\nimport { useSmartSelect } from '../shared/use-smart-select.js';\n\n\n\nconst Link = /*#__PURE__*/forwardRef((props, ref) => {\n const f7SmartSelect = useRef(null);\n const {\n className,\n id,\n style,\n children,\n noLinkClass,\n text,\n tabLink,\n tabLinkActive,\n tabbarLabel,\n iconOnly,\n badge,\n badgeColor,\n href = '#',\n target,\n // Smart Select\n smartSelect,\n smartSelectParams\n } = props;\n const tabbarContext = useContext(TabbarContext);\n const isTabbarIcons = tabbarLabel || tabbarContext.tabbarHasIcons;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const onClick = e => {\n emit(props, 'click', e);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n f7SmartSelect: () => f7SmartSelect.current\n }));\n useTooltip(elRef, props);\n useRouteProps(elRef, props);\n useSmartSelect(smartSelect, smartSelectParams, f7SmartSelect, () => {\n return elRef.current;\n });\n let textEl;\n let badgeEl;\n if (text) {\n if (badge) badgeEl = /*#__PURE__*/React.createElement(Badge, {\n color: badgeColor\n }, badge);\n textEl = /*#__PURE__*/React.createElement(\"span\", {\n className: isTabbarIcons ? 'tabbar-label' : ''\n }, text, badgeEl);\n }\n const iconEl = useIcon(props);\n let iconOnlyComputed;\n if (iconOnly || !text && children && children.length === 0 || !text && !children) {\n iconOnlyComputed = true;\n } else {\n iconOnlyComputed = false;\n }\n const classes = classNames(className, {\n link: !(noLinkClass || isTabbarIcons),\n 'icon-only': iconOnlyComputed,\n 'tab-link': tabLink || tabLink === '',\n 'tab-link-active': tabLinkActive,\n 'smart-select': smartSelect\n }, colorClasses(props), routerClasses(props), actionsClasses(props));\n let hrefComputed = href;\n if (href === true) hrefComputed = '#';\n if (href === false) hrefComputed = undefined; // no href attribute\n const attrs = {\n href: hrefComputed,\n target,\n 'data-tab': isStringProp(tabLink) && tabLink || undefined,\n ...routerAttrs(props),\n ...actionsAttrs(props)\n };\n return /*#__PURE__*/React.createElement(\"a\", _extends({\n ref: elRef,\n id: id,\n style: style,\n className: classes\n }, attrs, extraAttrs, {\n onClick: onClick\n }), iconEl, textEl, children);\n});\nLink.displayName = 'f7-link';\nexport default Link;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { classNames, getExtraAttrs, emit } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { useTheme } from '../shared/use-theme.js';\nimport Link from './link.js';\n\n\nconst NavLeft = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n backLink,\n backLinkUrl,\n backLinkForce,\n backLinkShowText,\n sliding\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const onBackClick = event => {\n emit(props, 'backClick clickBack', event);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n const theme = useTheme();\n let linkEl;\n let needBackLinkText = backLinkShowText;\n if (typeof needBackLinkText === 'undefined') needBackLinkText = !theme.md;\n if (backLink) {\n const text = backLink !== true && needBackLinkText ? backLink : undefined;\n linkEl = /*#__PURE__*/React.createElement(Link, {\n href: backLinkUrl || '#',\n back: true,\n icon: \"icon-back\",\n force: backLinkForce || undefined,\n className: !text ? 'icon-only' : undefined,\n text: text,\n onClick: onBackClick\n });\n }\n const classes = classNames(className, 'left', {\n sliding\n }, colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), linkEl, children);\n});\nNavLeft.displayName = 'f7-nav-left';\nexport default NavLeft;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { classNames, getExtraAttrs } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\n\n\nconst NavTitle = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n title,\n subtitle,\n sliding\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n let subtitleEl;\n if (subtitle) {\n subtitleEl = /*#__PURE__*/React.createElement(\"span\", {\n className: \"subtitle\"\n }, subtitle);\n }\n const classes = classNames(className, 'title', {\n sliding\n }, colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), children, title, subtitleEl);\n});\nNavTitle.displayName = 'f7-nav-title';\nexport default NavTitle;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { classNames, getExtraAttrs } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\n\n\nconst NavRight = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n sliding\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n const classes = classNames(className, 'right', {\n sliding\n }, colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), children);\n});\nNavRight.displayName = 'f7-nav-right';\nexport default NavRight;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, emit, getSlots } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7ready, f7 } from '../shared/f7.js';\nimport { useTheme } from '../shared/use-theme.js';\nimport NavLeft from './nav-left.js';\nimport NavTitle from './nav-title.js';\nimport NavRight from './nav-right.js';\n\n\nconst Navbar = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n sliding = true,\n large,\n largeTransparent,\n transparent,\n hidden,\n outline = true,\n backLink,\n backLinkForce,\n backLinkUrl,\n backLinkShowText,\n title,\n subtitle,\n titleLarge,\n innerClass,\n innerClassName\n } = props;\n const routerPositionClass = useRef('');\n const largeCollapsed = useRef(false);\n const routerNavbarRole = useRef(null);\n const routerNavbarRoleDetailRoot = useRef(false);\n const routerNavbarMasterStack = useRef(false);\n const transparentVisible = useRef(false);\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const theme = useTheme();\n const onHide = navbarEl => {\n if (elRef.current !== navbarEl) return;\n emit(props, 'navbarHide');\n };\n const onShow = navbarEl => {\n if (elRef.current !== navbarEl) return;\n emit(props, 'navbarShow');\n };\n const onExpand = navbarEl => {\n if (elRef.current !== navbarEl) return;\n largeCollapsed.current = false;\n emit(props, 'navbarExpand');\n };\n const onCollapse = navbarEl => {\n if (elRef.current !== navbarEl) return;\n largeCollapsed.current = true;\n emit(props, 'navbarCollapse');\n };\n const onNavbarTransparentShow = navbarEl => {\n if (elRef.current !== navbarEl) return;\n transparentVisible.current = true;\n emit(props, 'navbarTransparentShow');\n };\n const onNavbarTransparentHide = navbarEl => {\n if (elRef.current !== navbarEl) return;\n transparentVisible.current = false;\n emit(props, 'navbarTransparentHide');\n };\n const onNavbarPosition = (navbarEl, position) => {\n if (elRef.current !== navbarEl) return;\n routerPositionClass.current = position ? `navbar-${position}` : '';\n };\n const onNavbarRole = (navbarEl, rolesData) => {\n if (elRef.current !== navbarEl) return;\n routerNavbarRole.current = rolesData.role;\n routerNavbarRoleDetailRoot.current = rolesData.detailRoot;\n };\n const onNavbarMasterStack = navbarEl => {\n if (elRef.current !== navbarEl) return;\n routerNavbarMasterStack.current = true;\n };\n const onNavbarMasterUnstack = navbarEl => {\n if (elRef.current !== navbarEl) return;\n routerNavbarMasterStack.current = false;\n };\n const hide = animate => {\n if (!f7) return;\n f7.navbar.hide(elRef.current, animate);\n };\n const show = animate => {\n if (!f7) return;\n f7.navbar.show(elRef.current, animate);\n };\n const size = () => {\n if (!f7) return;\n f7.navbar.size(elRef.current);\n };\n const onBackClick = event => {\n emit(props, 'backClick clickBack', event);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n hide,\n show,\n size\n }));\n const attachEvents = () => {\n if (!elRef.current) return;\n f7ready(() => {\n f7.navbar.size(elRef.current);\n f7.on('navbarShow', onShow);\n f7.on('navbarHide', onHide);\n f7.on('navbarCollapse', onCollapse);\n f7.on('navbarExpand', onExpand);\n f7.on('navbarPosition', onNavbarPosition);\n f7.on('navbarRole', onNavbarRole);\n f7.on('navbarMasterStack', onNavbarMasterStack);\n f7.on('navbarMasterUnstack', onNavbarMasterUnstack);\n f7.on('navbarTransparentShow', onNavbarTransparentShow);\n f7.on('navbarTransparentHide', onNavbarTransparentHide);\n });\n };\n const detachEvents = () => {\n if (!f7) return;\n f7.off('navbarShow', onShow);\n f7.off('navbarHide', onHide);\n f7.off('navbarCollapse', onCollapse);\n f7.off('navbarExpand', onExpand);\n f7.off('navbarPosition', onNavbarPosition);\n f7.off('navbarRole', onNavbarRole);\n f7.off('navbarMasterStack', onNavbarMasterStack);\n f7.off('navbarMasterUnstack', onNavbarMasterUnstack);\n f7.off('navbarTransparentShow', onNavbarTransparentShow);\n f7.off('navbarTransparentHide', onNavbarTransparentHide);\n };\n useIsomorphicLayoutEffect(() => {\n attachEvents();\n return detachEvents;\n });\n const slots = getSlots(props);\n let leftEl;\n let titleEl;\n let rightEl;\n let titleLargeEl;\n const addLeftTitleClass = theme && theme.ios && f7 && !f7.params.navbar.iosCenterTitle;\n const addCenterTitleClass = theme && theme.md && f7 && f7.params.navbar.mdCenterTitle;\n const isLarge = large || largeTransparent;\n const isTransparent = transparent || isLarge && largeTransparent;\n const isTransparentVisible = isTransparent && transparentVisible.current;\n const classes = classNames(className, 'navbar', routerPositionClass.current, {\n 'navbar-hidden': hidden,\n 'navbar-large': isLarge,\n 'navbar-large-collapsed': isLarge && largeCollapsed.current,\n 'navbar-transparent': isTransparent,\n 'navbar-transparent-visible': isTransparentVisible,\n 'navbar-master': routerNavbarRole.current === 'master',\n 'navbar-master-detail': routerNavbarRole.current === 'detail',\n 'navbar-master-detail-root': routerNavbarRoleDetailRoot.current === true,\n 'navbar-master-stacked': routerNavbarMasterStack.current === true,\n 'no-outline': !outline\n }, colorClasses(props));\n if (backLink || slots['nav-left'] || slots.left) {\n leftEl = /*#__PURE__*/React.createElement(NavLeft, {\n backLink: backLink,\n backLinkUrl: backLinkUrl,\n backLinkForce: backLinkForce,\n backLinkShowText: backLinkShowText,\n onBackClick: onBackClick\n }, slots['nav-left'], slots.left);\n }\n if (title || subtitle || slots.title) {\n titleEl = /*#__PURE__*/React.createElement(NavTitle, {\n title: title,\n subtitle: subtitle\n }, slots.title);\n }\n if (slots['nav-right'] || slots.right) {\n rightEl = /*#__PURE__*/React.createElement(NavRight, null, slots['nav-right'], slots.right);\n }\n let largeTitle = titleLarge;\n if (!largeTitle && large && title) largeTitle = title;\n if (largeTitle || slots['title-large']) {\n titleLargeEl = /*#__PURE__*/React.createElement(\"div\", {\n className: \"title-large\"\n }, /*#__PURE__*/React.createElement(\"div\", {\n className: \"title-large-text\"\n }, largeTitle || '', slots['title-large']));\n }\n const innerEl = /*#__PURE__*/React.createElement(\"div\", {\n className: classNames('navbar-inner', innerClass, innerClassName, {\n sliding,\n 'navbar-inner-left-title': addLeftTitleClass,\n 'navbar-inner-centered-title': addCenterTitleClass\n })\n }, leftEl, titleEl, rightEl, titleLargeEl, slots.default);\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), /*#__PURE__*/React.createElement(\"div\", {\n className: \"navbar-bg\"\n }), slots['before-inner'], innerEl, slots['after-inner']);\n});\nNavbar.displayName = 'f7-navbar';\nexport default Navbar;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { classNames, getExtraAttrs } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\n\n\nconst Subnavbar = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n inner = true,\n title,\n sliding\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n const classes = classNames(className, 'subnavbar', {\n sliding\n }, colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n className: classes,\n id: id,\n style: style,\n ref: elRef\n }, extraAttrs), inner ? /*#__PURE__*/React.createElement(\"div\", {\n className: \"subnavbar-inner\"\n }, title && /*#__PURE__*/React.createElement(\"div\", {\n className: \"subnavbar-title\"\n }, title), children) : children);\n});\nSubnavbar.displayName = 'f7-subnavbar';\nexport default Subnavbar;","var niceErrors = {\n 0: \"Invalid value for configuration 'enforceActions', expected 'never', 'always' or 'observed'\",\n 1: function _(annotationType, key) {\n return \"Cannot apply '\" + annotationType + \"' to '\" + key.toString() + \"': Field not found.\";\n },\n /*\n 2(prop) {\n return `invalid decorator for '${prop.toString()}'`\n },\n 3(prop) {\n return `Cannot decorate '${prop.toString()}': action can only be used on properties with a function value.`\n },\n 4(prop) {\n return `Cannot decorate '${prop.toString()}': computed can only be used on getter properties.`\n },\n */\n 5: \"'keys()' can only be used on observable objects, arrays, sets and maps\",\n 6: \"'values()' can only be used on observable objects, arrays, sets and maps\",\n 7: \"'entries()' can only be used on observable objects, arrays and maps\",\n 8: \"'set()' can only be used on observable objects, arrays and maps\",\n 9: \"'remove()' can only be used on observable objects, arrays and maps\",\n 10: \"'has()' can only be used on observable objects, arrays and maps\",\n 11: \"'get()' can only be used on observable objects, arrays and maps\",\n 12: \"Invalid annotation\",\n 13: \"Dynamic observable objects cannot be frozen. If you're passing observables to 3rd party component/function that calls Object.freeze, pass copy instead: toJS(observable)\",\n 14: \"Intercept handlers should return nothing or a change object\",\n 15: \"Observable arrays cannot be frozen. If you're passing observables to 3rd party component/function that calls Object.freeze, pass copy instead: toJS(observable)\",\n 16: \"Modification exception: the internal structure of an observable array was changed.\",\n 17: function _(index, length) {\n return \"[mobx.array] Index out of bounds, \" + index + \" is larger than \" + length;\n },\n 18: \"mobx.map requires Map polyfill for the current browser. Check babel-polyfill or core-js/es6/map.js\",\n 19: function _(other) {\n return \"Cannot initialize from classes that inherit from Map: \" + other.constructor.name;\n },\n 20: function _(other) {\n return \"Cannot initialize map from \" + other;\n },\n 21: function _(dataStructure) {\n return \"Cannot convert to map from '\" + dataStructure + \"'\";\n },\n 22: \"mobx.set requires Set polyfill for the current browser. Check babel-polyfill or core-js/es6/set.js\",\n 23: \"It is not possible to get index atoms from arrays\",\n 24: function _(thing) {\n return \"Cannot obtain administration from \" + thing;\n },\n 25: function _(property, name) {\n return \"the entry '\" + property + \"' does not exist in the observable map '\" + name + \"'\";\n },\n 26: \"please specify a property\",\n 27: function _(property, name) {\n return \"no observable property '\" + property.toString() + \"' found on the observable object '\" + name + \"'\";\n },\n 28: function _(thing) {\n return \"Cannot obtain atom from \" + thing;\n },\n 29: \"Expecting some object\",\n 30: \"invalid action stack. did you forget to finish an action?\",\n 31: \"missing option for computed: get\",\n 32: function _(name, derivation) {\n return \"Cycle detected in computation \" + name + \": \" + derivation;\n },\n 33: function _(name) {\n return \"The setter of computed value '\" + name + \"' is trying to update itself. Did you intend to update an _observable_ value, instead of the computed property?\";\n },\n 34: function _(name) {\n return \"[ComputedValue '\" + name + \"'] It is not possible to assign a new value to a computed value.\";\n },\n 35: \"There are multiple, different versions of MobX active. Make sure MobX is loaded only once or use `configure({ isolateGlobalState: true })`\",\n 36: \"isolateGlobalState should be called before MobX is running any reactions\",\n 37: function _(method) {\n return \"[mobx] `observableArray.\" + method + \"()` mutates the array in-place, which is not allowed inside a derivation. Use `array.slice().\" + method + \"()` instead\";\n },\n 38: \"'ownKeys()' can only be used on observable objects\",\n 39: \"'defineProperty()' can only be used on observable objects\"\n};\nvar errors = process.env.NODE_ENV !== \"production\" ? niceErrors : {};\nfunction die(error) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (process.env.NODE_ENV !== \"production\") {\n var e = typeof error === \"string\" ? error : errors[error];\n if (typeof e === \"function\") e = e.apply(null, args);\n throw new Error(\"[MobX] \" + e);\n }\n throw new Error(typeof error === \"number\" ? \"[MobX] minified error nr: \" + error + (args.length ? \" \" + args.map(String).join(\",\") : \"\") + \". Find the full error at: https://github.com/mobxjs/mobx/blob/main/packages/mobx/src/errors.ts\" : \"[MobX] \" + error);\n}\n\nvar mockGlobal = {};\nfunction getGlobal() {\n if (typeof globalThis !== \"undefined\") {\n return globalThis;\n }\n if (typeof window !== \"undefined\") {\n return window;\n }\n if (typeof global !== \"undefined\") {\n return global;\n }\n if (typeof self !== \"undefined\") {\n return self;\n }\n return mockGlobal;\n}\n\n// We shorten anything used > 5 times\nvar assign = Object.assign;\nvar getDescriptor = Object.getOwnPropertyDescriptor;\nvar defineProperty = Object.defineProperty;\nvar objectPrototype = Object.prototype;\nvar EMPTY_ARRAY = [];\nObject.freeze(EMPTY_ARRAY);\nvar EMPTY_OBJECT = {};\nObject.freeze(EMPTY_OBJECT);\nvar hasProxy = typeof Proxy !== \"undefined\";\nvar plainObjectString = /*#__PURE__*/Object.toString();\nfunction assertProxies() {\n if (!hasProxy) {\n die(process.env.NODE_ENV !== \"production\" ? \"`Proxy` objects are not available in the current environment. Please configure MobX to enable a fallback implementation.`\" : \"Proxy not available\");\n }\n}\nfunction warnAboutProxyRequirement(msg) {\n if (process.env.NODE_ENV !== \"production\" && globalState.verifyProxies) {\n die(\"MobX is currently configured to be able to run in ES5 mode, but in ES5 MobX won't be able to \" + msg);\n }\n}\nfunction getNextId() {\n return ++globalState.mobxGuid;\n}\n/**\n * Makes sure that the provided function is invoked at most once.\n */\nfunction once(func) {\n var invoked = false;\n return function () {\n if (invoked) {\n return;\n }\n invoked = true;\n return func.apply(this, arguments);\n };\n}\nvar noop = function noop() {};\nfunction isFunction(fn) {\n return typeof fn === \"function\";\n}\nfunction isStringish(value) {\n var t = typeof value;\n switch (t) {\n case \"string\":\n case \"symbol\":\n case \"number\":\n return true;\n }\n return false;\n}\nfunction isObject(value) {\n return value !== null && typeof value === \"object\";\n}\nfunction isPlainObject(value) {\n if (!isObject(value)) {\n return false;\n }\n var proto = Object.getPrototypeOf(value);\n if (proto == null) {\n return true;\n }\n var protoConstructor = Object.hasOwnProperty.call(proto, \"constructor\") && proto.constructor;\n return typeof protoConstructor === \"function\" && protoConstructor.toString() === plainObjectString;\n}\n// https://stackoverflow.com/a/37865170\nfunction isGenerator(obj) {\n var constructor = obj == null ? void 0 : obj.constructor;\n if (!constructor) {\n return false;\n }\n if (\"GeneratorFunction\" === constructor.name || \"GeneratorFunction\" === constructor.displayName) {\n return true;\n }\n return false;\n}\nfunction addHiddenProp(object, propName, value) {\n defineProperty(object, propName, {\n enumerable: false,\n writable: true,\n configurable: true,\n value: value\n });\n}\nfunction addHiddenFinalProp(object, propName, value) {\n defineProperty(object, propName, {\n enumerable: false,\n writable: false,\n configurable: true,\n value: value\n });\n}\nfunction createInstanceofPredicate(name, theClass) {\n var propName = \"isMobX\" + name;\n theClass.prototype[propName] = true;\n return function (x) {\n return isObject(x) && x[propName] === true;\n };\n}\nfunction isES6Map(thing) {\n return thing instanceof Map;\n}\nfunction isES6Set(thing) {\n return thing instanceof Set;\n}\nvar hasGetOwnPropertySymbols = typeof Object.getOwnPropertySymbols !== \"undefined\";\n/**\n * Returns the following: own enumerable keys and symbols.\n */\nfunction getPlainObjectKeys(object) {\n var keys = Object.keys(object);\n // Not supported in IE, so there are not going to be symbol props anyway...\n if (!hasGetOwnPropertySymbols) {\n return keys;\n }\n var symbols = Object.getOwnPropertySymbols(object);\n if (!symbols.length) {\n return keys;\n }\n return [].concat(keys, symbols.filter(function (s) {\n return objectPrototype.propertyIsEnumerable.call(object, s);\n }));\n}\n// From Immer utils\n// Returns all own keys, including non-enumerable and symbolic\nvar ownKeys = typeof Reflect !== \"undefined\" && Reflect.ownKeys ? Reflect.ownKeys : hasGetOwnPropertySymbols ? function (obj) {\n return Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj));\n} : /* istanbul ignore next */Object.getOwnPropertyNames;\nfunction stringifyKey(key) {\n if (typeof key === \"string\") {\n return key;\n }\n if (typeof key === \"symbol\") {\n return key.toString();\n }\n return new String(key).toString();\n}\nfunction toPrimitive(value) {\n return value === null ? null : typeof value === \"object\" ? \"\" + value : value;\n}\nfunction hasProp(target, prop) {\n return objectPrototype.hasOwnProperty.call(target, prop);\n}\n// From Immer utils\nvar getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors || function getOwnPropertyDescriptors(target) {\n // Polyfill needed for Hermes and IE, see https://github.com/facebook/hermes/issues/274\n var res = {};\n // Note: without polyfill for ownKeys, symbols won't be picked up\n ownKeys(target).forEach(function (key) {\n res[key] = getDescriptor(target, key);\n });\n return res;\n};\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n if (it) return (it = it.call(o)).next.bind(it);\n if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n return function () {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n };\n }\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _toPrimitive(input, hint) {\n if (typeof input !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (typeof res !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}\nfunction _toPropertyKey(arg) {\n var key = _toPrimitive(arg, \"string\");\n return typeof key === \"symbol\" ? key : String(key);\n}\n\nvar storedAnnotationsSymbol = /*#__PURE__*/Symbol(\"mobx-stored-annotations\");\n/**\n * Creates a function that acts as\n * - decorator\n * - annotation object\n */\nfunction createDecoratorAnnotation(annotation) {\n function decorator(target, property) {\n if (is20223Decorator(property)) {\n return annotation.decorate_20223_(target, property);\n } else {\n storeAnnotation(target, property, annotation);\n }\n }\n return Object.assign(decorator, annotation);\n}\n/**\n * Stores annotation to prototype,\n * so it can be inspected later by `makeObservable` called from constructor\n */\nfunction storeAnnotation(prototype, key, annotation) {\n if (!hasProp(prototype, storedAnnotationsSymbol)) {\n addHiddenProp(prototype, storedAnnotationsSymbol, _extends({}, prototype[storedAnnotationsSymbol]));\n }\n // @override must override something\n if (process.env.NODE_ENV !== \"production\" && isOverride(annotation) && !hasProp(prototype[storedAnnotationsSymbol], key)) {\n var fieldName = prototype.constructor.name + \".prototype.\" + key.toString();\n die(\"'\" + fieldName + \"' is decorated with 'override', \" + \"but no such decorated member was found on prototype.\");\n }\n // Cannot re-decorate\n assertNotDecorated(prototype, annotation, key);\n // Ignore override\n if (!isOverride(annotation)) {\n prototype[storedAnnotationsSymbol][key] = annotation;\n }\n}\nfunction assertNotDecorated(prototype, annotation, key) {\n if (process.env.NODE_ENV !== \"production\" && !isOverride(annotation) && hasProp(prototype[storedAnnotationsSymbol], key)) {\n var fieldName = prototype.constructor.name + \".prototype.\" + key.toString();\n var currentAnnotationType = prototype[storedAnnotationsSymbol][key].annotationType_;\n var requestedAnnotationType = annotation.annotationType_;\n die(\"Cannot apply '@\" + requestedAnnotationType + \"' to '\" + fieldName + \"':\" + (\"\\nThe field is already decorated with '@\" + currentAnnotationType + \"'.\") + \"\\nRe-decorating fields is not allowed.\" + \"\\nUse '@override' decorator for methods overridden by subclass.\");\n }\n}\n/**\n * Collects annotations from prototypes and stores them on target (instance)\n */\nfunction collectStoredAnnotations(target) {\n if (!hasProp(target, storedAnnotationsSymbol)) {\n // if (__DEV__ && !target[storedAnnotationsSymbol]) {\n // die(\n // `No annotations were passed to makeObservable, but no decorated members have been found either`\n // )\n // }\n // We need a copy as we will remove annotation from the list once it's applied.\n addHiddenProp(target, storedAnnotationsSymbol, _extends({}, target[storedAnnotationsSymbol]));\n }\n return target[storedAnnotationsSymbol];\n}\nfunction is20223Decorator(context) {\n return typeof context == \"object\" && typeof context[\"kind\"] == \"string\";\n}\nfunction assert20223DecoratorType(context, types) {\n if (process.env.NODE_ENV !== \"production\" && !types.includes(context.kind)) {\n die(\"The decorator applied to '\" + String(context.name) + \"' cannot be used on a \" + context.kind + \" element\");\n }\n}\n\nvar $mobx = /*#__PURE__*/Symbol(\"mobx administration\");\nvar Atom = /*#__PURE__*/function () {\n // for effective unobserving. BaseAtom has true, for extra optimization, so its onBecomeUnobserved never gets called, because it's not needed\n\n /**\n * Create a new atom. For debugging purposes it is recommended to give it a name.\n * The onBecomeObserved and onBecomeUnobserved callbacks can be used for resource management.\n */\n function Atom(name_) {\n if (name_ === void 0) {\n name_ = process.env.NODE_ENV !== \"production\" ? \"Atom@\" + getNextId() : \"Atom\";\n }\n this.name_ = void 0;\n this.isPendingUnobservation_ = false;\n this.isBeingObserved_ = false;\n this.observers_ = new Set();\n this.diffValue_ = 0;\n this.lastAccessedBy_ = 0;\n this.lowestObserverState_ = IDerivationState_.NOT_TRACKING_;\n this.onBOL = void 0;\n this.onBUOL = void 0;\n this.name_ = name_;\n }\n // onBecomeObservedListeners\n var _proto = Atom.prototype;\n _proto.onBO = function onBO() {\n if (this.onBOL) {\n this.onBOL.forEach(function (listener) {\n return listener();\n });\n }\n };\n _proto.onBUO = function onBUO() {\n if (this.onBUOL) {\n this.onBUOL.forEach(function (listener) {\n return listener();\n });\n }\n }\n /**\n * Invoke this method to notify mobx that your atom has been used somehow.\n * Returns true if there is currently a reactive context.\n */;\n _proto.reportObserved = function reportObserved$1() {\n return reportObserved(this);\n }\n /**\n * Invoke this method _after_ this method has changed to signal mobx that all its observers should invalidate.\n */;\n _proto.reportChanged = function reportChanged() {\n startBatch();\n propagateChanged(this);\n endBatch();\n };\n _proto.toString = function toString() {\n return this.name_;\n };\n return Atom;\n}();\nvar isAtom = /*#__PURE__*/createInstanceofPredicate(\"Atom\", Atom);\nfunction createAtom(name, onBecomeObservedHandler, onBecomeUnobservedHandler) {\n if (onBecomeObservedHandler === void 0) {\n onBecomeObservedHandler = noop;\n }\n if (onBecomeUnobservedHandler === void 0) {\n onBecomeUnobservedHandler = noop;\n }\n var atom = new Atom(name);\n // default `noop` listener will not initialize the hook Set\n if (onBecomeObservedHandler !== noop) {\n onBecomeObserved(atom, onBecomeObservedHandler);\n }\n if (onBecomeUnobservedHandler !== noop) {\n onBecomeUnobserved(atom, onBecomeUnobservedHandler);\n }\n return atom;\n}\n\nfunction identityComparer(a, b) {\n return a === b;\n}\nfunction structuralComparer(a, b) {\n return deepEqual(a, b);\n}\nfunction shallowComparer(a, b) {\n return deepEqual(a, b, 1);\n}\nfunction defaultComparer(a, b) {\n if (Object.is) {\n return Object.is(a, b);\n }\n return a === b ? a !== 0 || 1 / a === 1 / b : a !== a && b !== b;\n}\nvar comparer = {\n identity: identityComparer,\n structural: structuralComparer,\n \"default\": defaultComparer,\n shallow: shallowComparer\n};\n\nfunction deepEnhancer(v, _, name) {\n // it is an observable already, done\n if (isObservable(v)) {\n return v;\n }\n // something that can be converted and mutated?\n if (Array.isArray(v)) {\n return observable.array(v, {\n name: name\n });\n }\n if (isPlainObject(v)) {\n return observable.object(v, undefined, {\n name: name\n });\n }\n if (isES6Map(v)) {\n return observable.map(v, {\n name: name\n });\n }\n if (isES6Set(v)) {\n return observable.set(v, {\n name: name\n });\n }\n if (typeof v === \"function\" && !isAction(v) && !isFlow(v)) {\n if (isGenerator(v)) {\n return flow(v);\n } else {\n return autoAction(name, v);\n }\n }\n return v;\n}\nfunction shallowEnhancer(v, _, name) {\n if (v === undefined || v === null) {\n return v;\n }\n if (isObservableObject(v) || isObservableArray(v) || isObservableMap(v) || isObservableSet(v)) {\n return v;\n }\n if (Array.isArray(v)) {\n return observable.array(v, {\n name: name,\n deep: false\n });\n }\n if (isPlainObject(v)) {\n return observable.object(v, undefined, {\n name: name,\n deep: false\n });\n }\n if (isES6Map(v)) {\n return observable.map(v, {\n name: name,\n deep: false\n });\n }\n if (isES6Set(v)) {\n return observable.set(v, {\n name: name,\n deep: false\n });\n }\n if (process.env.NODE_ENV !== \"production\") {\n die(\"The shallow modifier / decorator can only used in combination with arrays, objects, maps and sets\");\n }\n}\nfunction referenceEnhancer(newValue) {\n // never turn into an observable\n return newValue;\n}\nfunction refStructEnhancer(v, oldValue) {\n if (process.env.NODE_ENV !== \"production\" && isObservable(v)) {\n die(\"observable.struct should not be used with observable values\");\n }\n if (deepEqual(v, oldValue)) {\n return oldValue;\n }\n return v;\n}\n\nvar OVERRIDE = \"override\";\nvar override = /*#__PURE__*/createDecoratorAnnotation({\n annotationType_: OVERRIDE,\n make_: make_,\n extend_: extend_,\n decorate_20223_: decorate_20223_\n});\nfunction isOverride(annotation) {\n return annotation.annotationType_ === OVERRIDE;\n}\nfunction make_(adm, key) {\n // Must not be plain object\n if (process.env.NODE_ENV !== \"production\" && adm.isPlainObject_) {\n die(\"Cannot apply '\" + this.annotationType_ + \"' to '\" + adm.name_ + \".\" + key.toString() + \"':\" + (\"\\n'\" + this.annotationType_ + \"' cannot be used on plain objects.\"));\n }\n // Must override something\n if (process.env.NODE_ENV !== \"production\" && !hasProp(adm.appliedAnnotations_, key)) {\n die(\"'\" + adm.name_ + \".\" + key.toString() + \"' is annotated with '\" + this.annotationType_ + \"', \" + \"but no such annotated member was found on prototype.\");\n }\n return 0 /* MakeResult.Cancel */;\n}\n\nfunction extend_(adm, key, descriptor, proxyTrap) {\n die(\"'\" + this.annotationType_ + \"' can only be used with 'makeObservable'\");\n}\nfunction decorate_20223_(desc, context) {\n console.warn(\"'\" + this.annotationType_ + \"' cannot be used with decorators - this is a no-op\");\n}\n\nfunction createActionAnnotation(name, options) {\n return {\n annotationType_: name,\n options_: options,\n make_: make_$1,\n extend_: extend_$1,\n decorate_20223_: decorate_20223_$1\n };\n}\nfunction make_$1(adm, key, descriptor, source) {\n var _this$options_;\n // bound\n if ((_this$options_ = this.options_) != null && _this$options_.bound) {\n return this.extend_(adm, key, descriptor, false) === null ? 0 /* MakeResult.Cancel */ : 1 /* MakeResult.Break */;\n }\n // own\n if (source === adm.target_) {\n return this.extend_(adm, key, descriptor, false) === null ? 0 /* MakeResult.Cancel */ : 2 /* MakeResult.Continue */;\n }\n // prototype\n if (isAction(descriptor.value)) {\n // A prototype could have been annotated already by other constructor,\n // rest of the proto chain must be annotated already\n return 1 /* MakeResult.Break */;\n }\n\n var actionDescriptor = createActionDescriptor(adm, this, key, descriptor, false);\n defineProperty(source, key, actionDescriptor);\n return 2 /* MakeResult.Continue */;\n}\n\nfunction extend_$1(adm, key, descriptor, proxyTrap) {\n var actionDescriptor = createActionDescriptor(adm, this, key, descriptor);\n return adm.defineProperty_(key, actionDescriptor, proxyTrap);\n}\nfunction decorate_20223_$1(mthd, context) {\n if (process.env.NODE_ENV !== \"production\") {\n assert20223DecoratorType(context, [\"method\", \"field\"]);\n }\n var kind = context.kind,\n name = context.name,\n addInitializer = context.addInitializer;\n var ann = this;\n var _createAction = function _createAction(m) {\n var _ann$options_$name, _ann$options_, _ann$options_$autoAct, _ann$options_2;\n return createAction((_ann$options_$name = (_ann$options_ = ann.options_) == null ? void 0 : _ann$options_.name) != null ? _ann$options_$name : name.toString(), m, (_ann$options_$autoAct = (_ann$options_2 = ann.options_) == null ? void 0 : _ann$options_2.autoAction) != null ? _ann$options_$autoAct : false);\n };\n // Backwards/Legacy behavior, expects makeObservable(this)\n if (kind == \"field\") {\n addInitializer(function () {\n storeAnnotation(this, name, ann);\n });\n return;\n }\n if (kind == \"method\") {\n var _this$options_2;\n if (!isAction(mthd)) {\n mthd = _createAction(mthd);\n }\n if ((_this$options_2 = this.options_) != null && _this$options_2.bound) {\n addInitializer(function () {\n var self = this;\n var bound = self[name].bind(self);\n bound.isMobxAction = true;\n self[name] = bound;\n });\n }\n return mthd;\n }\n die(\"Cannot apply '\" + ann.annotationType_ + \"' to '\" + String(name) + \"' (kind: \" + kind + \"):\" + (\"\\n'\" + ann.annotationType_ + \"' can only be used on properties with a function value.\"));\n}\nfunction assertActionDescriptor(adm, _ref, key, _ref2) {\n var annotationType_ = _ref.annotationType_;\n var value = _ref2.value;\n if (process.env.NODE_ENV !== \"production\" && !isFunction(value)) {\n die(\"Cannot apply '\" + annotationType_ + \"' to '\" + adm.name_ + \".\" + key.toString() + \"':\" + (\"\\n'\" + annotationType_ + \"' can only be used on properties with a function value.\"));\n }\n}\nfunction createActionDescriptor(adm, annotation, key, descriptor,\n// provides ability to disable safeDescriptors for prototypes\nsafeDescriptors) {\n var _annotation$options_, _annotation$options_$, _annotation$options_2, _annotation$options_$2, _annotation$options_3, _annotation$options_4, _adm$proxy_2;\n if (safeDescriptors === void 0) {\n safeDescriptors = globalState.safeDescriptors;\n }\n assertActionDescriptor(adm, annotation, key, descriptor);\n var value = descriptor.value;\n if ((_annotation$options_ = annotation.options_) != null && _annotation$options_.bound) {\n var _adm$proxy_;\n value = value.bind((_adm$proxy_ = adm.proxy_) != null ? _adm$proxy_ : adm.target_);\n }\n return {\n value: createAction((_annotation$options_$ = (_annotation$options_2 = annotation.options_) == null ? void 0 : _annotation$options_2.name) != null ? _annotation$options_$ : key.toString(), value, (_annotation$options_$2 = (_annotation$options_3 = annotation.options_) == null ? void 0 : _annotation$options_3.autoAction) != null ? _annotation$options_$2 : false,\n // https://github.com/mobxjs/mobx/discussions/3140\n (_annotation$options_4 = annotation.options_) != null && _annotation$options_4.bound ? (_adm$proxy_2 = adm.proxy_) != null ? _adm$proxy_2 : adm.target_ : undefined),\n // Non-configurable for classes\n // prevents accidental field redefinition in subclass\n configurable: safeDescriptors ? adm.isPlainObject_ : true,\n // https://github.com/mobxjs/mobx/pull/2641#issuecomment-737292058\n enumerable: false,\n // Non-obsevable, therefore non-writable\n // Also prevents rewriting in subclass constructor\n writable: safeDescriptors ? false : true\n };\n}\n\nfunction createFlowAnnotation(name, options) {\n return {\n annotationType_: name,\n options_: options,\n make_: make_$2,\n extend_: extend_$2,\n decorate_20223_: decorate_20223_$2\n };\n}\nfunction make_$2(adm, key, descriptor, source) {\n var _this$options_;\n // own\n if (source === adm.target_) {\n return this.extend_(adm, key, descriptor, false) === null ? 0 /* MakeResult.Cancel */ : 2 /* MakeResult.Continue */;\n }\n // prototype\n // bound - must annotate protos to support super.flow()\n if ((_this$options_ = this.options_) != null && _this$options_.bound && (!hasProp(adm.target_, key) || !isFlow(adm.target_[key]))) {\n if (this.extend_(adm, key, descriptor, false) === null) {\n return 0 /* MakeResult.Cancel */;\n }\n }\n\n if (isFlow(descriptor.value)) {\n // A prototype could have been annotated already by other constructor,\n // rest of the proto chain must be annotated already\n return 1 /* MakeResult.Break */;\n }\n\n var flowDescriptor = createFlowDescriptor(adm, this, key, descriptor, false, false);\n defineProperty(source, key, flowDescriptor);\n return 2 /* MakeResult.Continue */;\n}\n\nfunction extend_$2(adm, key, descriptor, proxyTrap) {\n var _this$options_2;\n var flowDescriptor = createFlowDescriptor(adm, this, key, descriptor, (_this$options_2 = this.options_) == null ? void 0 : _this$options_2.bound);\n return adm.defineProperty_(key, flowDescriptor, proxyTrap);\n}\nfunction decorate_20223_$2(mthd, context) {\n var _this$options_3;\n if (process.env.NODE_ENV !== \"production\") {\n assert20223DecoratorType(context, [\"method\"]);\n }\n var name = context.name,\n addInitializer = context.addInitializer;\n if (!isFlow(mthd)) {\n mthd = flow(mthd);\n }\n if ((_this$options_3 = this.options_) != null && _this$options_3.bound) {\n addInitializer(function () {\n var self = this;\n var bound = self[name].bind(self);\n bound.isMobXFlow = true;\n self[name] = bound;\n });\n }\n return mthd;\n}\nfunction assertFlowDescriptor(adm, _ref, key, _ref2) {\n var annotationType_ = _ref.annotationType_;\n var value = _ref2.value;\n if (process.env.NODE_ENV !== \"production\" && !isFunction(value)) {\n die(\"Cannot apply '\" + annotationType_ + \"' to '\" + adm.name_ + \".\" + key.toString() + \"':\" + (\"\\n'\" + annotationType_ + \"' can only be used on properties with a generator function value.\"));\n }\n}\nfunction createFlowDescriptor(adm, annotation, key, descriptor, bound,\n// provides ability to disable safeDescriptors for prototypes\nsafeDescriptors) {\n if (safeDescriptors === void 0) {\n safeDescriptors = globalState.safeDescriptors;\n }\n assertFlowDescriptor(adm, annotation, key, descriptor);\n var value = descriptor.value;\n // In case of flow.bound, the descriptor can be from already annotated prototype\n if (!isFlow(value)) {\n value = flow(value);\n }\n if (bound) {\n var _adm$proxy_;\n // We do not keep original function around, so we bind the existing flow\n value = value.bind((_adm$proxy_ = adm.proxy_) != null ? _adm$proxy_ : adm.target_);\n // This is normally set by `flow`, but `bind` returns new function...\n value.isMobXFlow = true;\n }\n return {\n value: value,\n // Non-configurable for classes\n // prevents accidental field redefinition in subclass\n configurable: safeDescriptors ? adm.isPlainObject_ : true,\n // https://github.com/mobxjs/mobx/pull/2641#issuecomment-737292058\n enumerable: false,\n // Non-obsevable, therefore non-writable\n // Also prevents rewriting in subclass constructor\n writable: safeDescriptors ? false : true\n };\n}\n\nfunction createComputedAnnotation(name, options) {\n return {\n annotationType_: name,\n options_: options,\n make_: make_$3,\n extend_: extend_$3,\n decorate_20223_: decorate_20223_$3\n };\n}\nfunction make_$3(adm, key, descriptor) {\n return this.extend_(adm, key, descriptor, false) === null ? 0 /* MakeResult.Cancel */ : 1 /* MakeResult.Break */;\n}\n\nfunction extend_$3(adm, key, descriptor, proxyTrap) {\n assertComputedDescriptor(adm, this, key, descriptor);\n return adm.defineComputedProperty_(key, _extends({}, this.options_, {\n get: descriptor.get,\n set: descriptor.set\n }), proxyTrap);\n}\nfunction decorate_20223_$3(get, context) {\n if (process.env.NODE_ENV !== \"production\") {\n assert20223DecoratorType(context, [\"getter\"]);\n }\n var ann = this;\n var key = context.name,\n addInitializer = context.addInitializer;\n addInitializer(function () {\n var adm = asObservableObject(this)[$mobx];\n var options = _extends({}, ann.options_, {\n get: get,\n context: this\n });\n options.name || (options.name = process.env.NODE_ENV !== \"production\" ? adm.name_ + \".\" + key.toString() : \"ObservableObject.\" + key.toString());\n adm.values_.set(key, new ComputedValue(options));\n });\n return function () {\n return this[$mobx].getObservablePropValue_(key);\n };\n}\nfunction assertComputedDescriptor(adm, _ref, key, _ref2) {\n var annotationType_ = _ref.annotationType_;\n var get = _ref2.get;\n if (process.env.NODE_ENV !== \"production\" && !get) {\n die(\"Cannot apply '\" + annotationType_ + \"' to '\" + adm.name_ + \".\" + key.toString() + \"':\" + (\"\\n'\" + annotationType_ + \"' can only be used on getter(+setter) properties.\"));\n }\n}\n\nfunction createObservableAnnotation(name, options) {\n return {\n annotationType_: name,\n options_: options,\n make_: make_$4,\n extend_: extend_$4,\n decorate_20223_: decorate_20223_$4\n };\n}\nfunction make_$4(adm, key, descriptor) {\n return this.extend_(adm, key, descriptor, false) === null ? 0 /* MakeResult.Cancel */ : 1 /* MakeResult.Break */;\n}\n\nfunction extend_$4(adm, key, descriptor, proxyTrap) {\n var _this$options_$enhanc, _this$options_;\n assertObservableDescriptor(adm, this, key, descriptor);\n return adm.defineObservableProperty_(key, descriptor.value, (_this$options_$enhanc = (_this$options_ = this.options_) == null ? void 0 : _this$options_.enhancer) != null ? _this$options_$enhanc : deepEnhancer, proxyTrap);\n}\nfunction decorate_20223_$4(desc, context) {\n if (process.env.NODE_ENV !== \"production\") {\n if (context.kind === \"field\") {\n throw die(\"Please use `@observable accessor \" + String(context.name) + \"` instead of `@observable \" + String(context.name) + \"`\");\n }\n assert20223DecoratorType(context, [\"accessor\"]);\n }\n var ann = this;\n var kind = context.kind,\n name = context.name;\n // The laziness here is not ideal... It's a workaround to how 2022.3 Decorators are implemented:\n // `addInitializer` callbacks are executed _before_ any accessors are defined (instead of the ideal-for-us right after each).\n // This means that, if we were to do our stuff in an `addInitializer`, we'd attempt to read a private slot\n // before it has been initialized. The runtime doesn't like that and throws a `Cannot read private member\n // from an object whose class did not declare it` error.\n // TODO: it seems that this will not be required anymore in the final version of the spec\n // See TODO: link\n var initializedObjects = new WeakSet();\n function initializeObservable(target, value) {\n var _ann$options_$enhance, _ann$options_;\n var adm = asObservableObject(target)[$mobx];\n var observable = new ObservableValue(value, (_ann$options_$enhance = (_ann$options_ = ann.options_) == null ? void 0 : _ann$options_.enhancer) != null ? _ann$options_$enhance : deepEnhancer, process.env.NODE_ENV !== \"production\" ? adm.name_ + \".\" + name.toString() : \"ObservableObject.\" + name.toString(), false);\n adm.values_.set(name, observable);\n initializedObjects.add(target);\n }\n if (kind == \"accessor\") {\n return {\n get: function get() {\n if (!initializedObjects.has(this)) {\n initializeObservable(this, desc.get.call(this));\n }\n return this[$mobx].getObservablePropValue_(name);\n },\n set: function set(value) {\n if (!initializedObjects.has(this)) {\n initializeObservable(this, value);\n }\n return this[$mobx].setObservablePropValue_(name, value);\n },\n init: function init(value) {\n if (!initializedObjects.has(this)) {\n initializeObservable(this, value);\n }\n return value;\n }\n };\n }\n return;\n}\nfunction assertObservableDescriptor(adm, _ref, key, descriptor) {\n var annotationType_ = _ref.annotationType_;\n if (process.env.NODE_ENV !== \"production\" && !(\"value\" in descriptor)) {\n die(\"Cannot apply '\" + annotationType_ + \"' to '\" + adm.name_ + \".\" + key.toString() + \"':\" + (\"\\n'\" + annotationType_ + \"' cannot be used on getter/setter properties\"));\n }\n}\n\nvar AUTO = \"true\";\nvar autoAnnotation = /*#__PURE__*/createAutoAnnotation();\nfunction createAutoAnnotation(options) {\n return {\n annotationType_: AUTO,\n options_: options,\n make_: make_$5,\n extend_: extend_$5,\n decorate_20223_: decorate_20223_$5\n };\n}\nfunction make_$5(adm, key, descriptor, source) {\n var _this$options_3, _this$options_4;\n // getter -> computed\n if (descriptor.get) {\n return computed.make_(adm, key, descriptor, source);\n }\n // lone setter -> action setter\n if (descriptor.set) {\n // TODO make action applicable to setter and delegate to action.make_\n var set = createAction(key.toString(), descriptor.set);\n // own\n if (source === adm.target_) {\n return adm.defineProperty_(key, {\n configurable: globalState.safeDescriptors ? adm.isPlainObject_ : true,\n set: set\n }) === null ? 0 /* MakeResult.Cancel */ : 2 /* MakeResult.Continue */;\n }\n // proto\n defineProperty(source, key, {\n configurable: true,\n set: set\n });\n return 2 /* MakeResult.Continue */;\n }\n // function on proto -> autoAction/flow\n if (source !== adm.target_ && typeof descriptor.value === \"function\") {\n var _this$options_2;\n if (isGenerator(descriptor.value)) {\n var _this$options_;\n var flowAnnotation = (_this$options_ = this.options_) != null && _this$options_.autoBind ? flow.bound : flow;\n return flowAnnotation.make_(adm, key, descriptor, source);\n }\n var actionAnnotation = (_this$options_2 = this.options_) != null && _this$options_2.autoBind ? autoAction.bound : autoAction;\n return actionAnnotation.make_(adm, key, descriptor, source);\n }\n // other -> observable\n // Copy props from proto as well, see test:\n // \"decorate should work with Object.create\"\n var observableAnnotation = ((_this$options_3 = this.options_) == null ? void 0 : _this$options_3.deep) === false ? observable.ref : observable;\n // if function respect autoBind option\n if (typeof descriptor.value === \"function\" && (_this$options_4 = this.options_) != null && _this$options_4.autoBind) {\n var _adm$proxy_;\n descriptor.value = descriptor.value.bind((_adm$proxy_ = adm.proxy_) != null ? _adm$proxy_ : adm.target_);\n }\n return observableAnnotation.make_(adm, key, descriptor, source);\n}\nfunction extend_$5(adm, key, descriptor, proxyTrap) {\n var _this$options_5, _this$options_6;\n // getter -> computed\n if (descriptor.get) {\n return computed.extend_(adm, key, descriptor, proxyTrap);\n }\n // lone setter -> action setter\n if (descriptor.set) {\n // TODO make action applicable to setter and delegate to action.extend_\n return adm.defineProperty_(key, {\n configurable: globalState.safeDescriptors ? adm.isPlainObject_ : true,\n set: createAction(key.toString(), descriptor.set)\n }, proxyTrap);\n }\n // other -> observable\n // if function respect autoBind option\n if (typeof descriptor.value === \"function\" && (_this$options_5 = this.options_) != null && _this$options_5.autoBind) {\n var _adm$proxy_2;\n descriptor.value = descriptor.value.bind((_adm$proxy_2 = adm.proxy_) != null ? _adm$proxy_2 : adm.target_);\n }\n var observableAnnotation = ((_this$options_6 = this.options_) == null ? void 0 : _this$options_6.deep) === false ? observable.ref : observable;\n return observableAnnotation.extend_(adm, key, descriptor, proxyTrap);\n}\nfunction decorate_20223_$5(desc, context) {\n die(\"'\" + this.annotationType_ + \"' cannot be used as a decorator\");\n}\n\nvar OBSERVABLE = \"observable\";\nvar OBSERVABLE_REF = \"observable.ref\";\nvar OBSERVABLE_SHALLOW = \"observable.shallow\";\nvar OBSERVABLE_STRUCT = \"observable.struct\";\n// Predefined bags of create observable options, to avoid allocating temporarily option objects\n// in the majority of cases\nvar defaultCreateObservableOptions = {\n deep: true,\n name: undefined,\n defaultDecorator: undefined,\n proxy: true\n};\nObject.freeze(defaultCreateObservableOptions);\nfunction asCreateObservableOptions(thing) {\n return thing || defaultCreateObservableOptions;\n}\nvar observableAnnotation = /*#__PURE__*/createObservableAnnotation(OBSERVABLE);\nvar observableRefAnnotation = /*#__PURE__*/createObservableAnnotation(OBSERVABLE_REF, {\n enhancer: referenceEnhancer\n});\nvar observableShallowAnnotation = /*#__PURE__*/createObservableAnnotation(OBSERVABLE_SHALLOW, {\n enhancer: shallowEnhancer\n});\nvar observableStructAnnotation = /*#__PURE__*/createObservableAnnotation(OBSERVABLE_STRUCT, {\n enhancer: refStructEnhancer\n});\nvar observableDecoratorAnnotation = /*#__PURE__*/createDecoratorAnnotation(observableAnnotation);\nfunction getEnhancerFromOptions(options) {\n return options.deep === true ? deepEnhancer : options.deep === false ? referenceEnhancer : getEnhancerFromAnnotation(options.defaultDecorator);\n}\nfunction getAnnotationFromOptions(options) {\n var _options$defaultDecor;\n return options ? (_options$defaultDecor = options.defaultDecorator) != null ? _options$defaultDecor : createAutoAnnotation(options) : undefined;\n}\nfunction getEnhancerFromAnnotation(annotation) {\n var _annotation$options_$, _annotation$options_;\n return !annotation ? deepEnhancer : (_annotation$options_$ = (_annotation$options_ = annotation.options_) == null ? void 0 : _annotation$options_.enhancer) != null ? _annotation$options_$ : deepEnhancer;\n}\n/**\n * Turns an object, array or function into a reactive structure.\n * @param v the value which should become observable.\n */\nfunction createObservable(v, arg2, arg3) {\n // @observable someProp; (2022.3 Decorators)\n if (is20223Decorator(arg2)) {\n return observableAnnotation.decorate_20223_(v, arg2);\n }\n // @observable someProp;\n if (isStringish(arg2)) {\n storeAnnotation(v, arg2, observableAnnotation);\n return;\n }\n // already observable - ignore\n if (isObservable(v)) {\n return v;\n }\n // plain object\n if (isPlainObject(v)) {\n return observable.object(v, arg2, arg3);\n }\n // Array\n if (Array.isArray(v)) {\n return observable.array(v, arg2);\n }\n // Map\n if (isES6Map(v)) {\n return observable.map(v, arg2);\n }\n // Set\n if (isES6Set(v)) {\n return observable.set(v, arg2);\n }\n // other object - ignore\n if (typeof v === \"object\" && v !== null) {\n return v;\n }\n // anything else\n return observable.box(v, arg2);\n}\nassign(createObservable, observableDecoratorAnnotation);\nvar observableFactories = {\n box: function box(value, options) {\n var o = asCreateObservableOptions(options);\n return new ObservableValue(value, getEnhancerFromOptions(o), o.name, true, o.equals);\n },\n array: function array(initialValues, options) {\n var o = asCreateObservableOptions(options);\n return (globalState.useProxies === false || o.proxy === false ? createLegacyArray : createObservableArray)(initialValues, getEnhancerFromOptions(o), o.name);\n },\n map: function map(initialValues, options) {\n var o = asCreateObservableOptions(options);\n return new ObservableMap(initialValues, getEnhancerFromOptions(o), o.name);\n },\n set: function set(initialValues, options) {\n var o = asCreateObservableOptions(options);\n return new ObservableSet(initialValues, getEnhancerFromOptions(o), o.name);\n },\n object: function object(props, decorators, options) {\n return initObservable(function () {\n return extendObservable(globalState.useProxies === false || (options == null ? void 0 : options.proxy) === false ? asObservableObject({}, options) : asDynamicObservableObject({}, options), props, decorators);\n });\n },\n ref: /*#__PURE__*/createDecoratorAnnotation(observableRefAnnotation),\n shallow: /*#__PURE__*/createDecoratorAnnotation(observableShallowAnnotation),\n deep: observableDecoratorAnnotation,\n struct: /*#__PURE__*/createDecoratorAnnotation(observableStructAnnotation)\n};\n// eslint-disable-next-line\nvar observable = /*#__PURE__*/assign(createObservable, observableFactories);\n\nvar COMPUTED = \"computed\";\nvar COMPUTED_STRUCT = \"computed.struct\";\nvar computedAnnotation = /*#__PURE__*/createComputedAnnotation(COMPUTED);\nvar computedStructAnnotation = /*#__PURE__*/createComputedAnnotation(COMPUTED_STRUCT, {\n equals: comparer.structural\n});\n/**\n * Decorator for class properties: @computed get value() { return expr; }.\n * For legacy purposes also invokable as ES5 observable created: `computed(() => expr)`;\n */\nvar computed = function computed(arg1, arg2) {\n if (is20223Decorator(arg2)) {\n // @computed (2022.3 Decorators)\n return computedAnnotation.decorate_20223_(arg1, arg2);\n }\n if (isStringish(arg2)) {\n // @computed\n return storeAnnotation(arg1, arg2, computedAnnotation);\n }\n if (isPlainObject(arg1)) {\n // @computed({ options })\n return createDecoratorAnnotation(createComputedAnnotation(COMPUTED, arg1));\n }\n // computed(expr, options?)\n if (process.env.NODE_ENV !== \"production\") {\n if (!isFunction(arg1)) {\n die(\"First argument to `computed` should be an expression.\");\n }\n if (isFunction(arg2)) {\n die(\"A setter as second argument is no longer supported, use `{ set: fn }` option instead\");\n }\n }\n var opts = isPlainObject(arg2) ? arg2 : {};\n opts.get = arg1;\n opts.name || (opts.name = arg1.name || \"\"); /* for generated name */\n return new ComputedValue(opts);\n};\nObject.assign(computed, computedAnnotation);\ncomputed.struct = /*#__PURE__*/createDecoratorAnnotation(computedStructAnnotation);\n\nvar _getDescriptor$config, _getDescriptor;\n// we don't use globalState for these in order to avoid possible issues with multiple\n// mobx versions\nvar currentActionId = 0;\nvar nextActionId = 1;\nvar isFunctionNameConfigurable = (_getDescriptor$config = (_getDescriptor = /*#__PURE__*/getDescriptor(function () {}, \"name\")) == null ? void 0 : _getDescriptor.configurable) != null ? _getDescriptor$config : false;\n// we can safely recycle this object\nvar tmpNameDescriptor = {\n value: \"action\",\n configurable: true,\n writable: false,\n enumerable: false\n};\nfunction createAction(actionName, fn, autoAction, ref) {\n if (autoAction === void 0) {\n autoAction = false;\n }\n if (process.env.NODE_ENV !== \"production\") {\n if (!isFunction(fn)) {\n die(\"`action` can only be invoked on functions\");\n }\n if (typeof actionName !== \"string\" || !actionName) {\n die(\"actions should have valid names, got: '\" + actionName + \"'\");\n }\n }\n function res() {\n return executeAction(actionName, autoAction, fn, ref || this, arguments);\n }\n res.isMobxAction = true;\n res.toString = function () {\n return fn.toString();\n };\n if (isFunctionNameConfigurable) {\n tmpNameDescriptor.value = actionName;\n defineProperty(res, \"name\", tmpNameDescriptor);\n }\n return res;\n}\nfunction executeAction(actionName, canRunAsDerivation, fn, scope, args) {\n var runInfo = _startAction(actionName, canRunAsDerivation, scope, args);\n try {\n return fn.apply(scope, args);\n } catch (err) {\n runInfo.error_ = err;\n throw err;\n } finally {\n _endAction(runInfo);\n }\n}\nfunction _startAction(actionName, canRunAsDerivation,\n// true for autoAction\nscope, args) {\n var notifySpy_ = process.env.NODE_ENV !== \"production\" && isSpyEnabled() && !!actionName;\n var startTime_ = 0;\n if (process.env.NODE_ENV !== \"production\" && notifySpy_) {\n startTime_ = Date.now();\n var flattenedArgs = args ? Array.from(args) : EMPTY_ARRAY;\n spyReportStart({\n type: ACTION,\n name: actionName,\n object: scope,\n arguments: flattenedArgs\n });\n }\n var prevDerivation_ = globalState.trackingDerivation;\n var runAsAction = !canRunAsDerivation || !prevDerivation_;\n startBatch();\n var prevAllowStateChanges_ = globalState.allowStateChanges; // by default preserve previous allow\n if (runAsAction) {\n untrackedStart();\n prevAllowStateChanges_ = allowStateChangesStart(true);\n }\n var prevAllowStateReads_ = allowStateReadsStart(true);\n var runInfo = {\n runAsAction_: runAsAction,\n prevDerivation_: prevDerivation_,\n prevAllowStateChanges_: prevAllowStateChanges_,\n prevAllowStateReads_: prevAllowStateReads_,\n notifySpy_: notifySpy_,\n startTime_: startTime_,\n actionId_: nextActionId++,\n parentActionId_: currentActionId\n };\n currentActionId = runInfo.actionId_;\n return runInfo;\n}\nfunction _endAction(runInfo) {\n if (currentActionId !== runInfo.actionId_) {\n die(30);\n }\n currentActionId = runInfo.parentActionId_;\n if (runInfo.error_ !== undefined) {\n globalState.suppressReactionErrors = true;\n }\n allowStateChangesEnd(runInfo.prevAllowStateChanges_);\n allowStateReadsEnd(runInfo.prevAllowStateReads_);\n endBatch();\n if (runInfo.runAsAction_) {\n untrackedEnd(runInfo.prevDerivation_);\n }\n if (process.env.NODE_ENV !== \"production\" && runInfo.notifySpy_) {\n spyReportEnd({\n time: Date.now() - runInfo.startTime_\n });\n }\n globalState.suppressReactionErrors = false;\n}\nfunction allowStateChanges(allowStateChanges, func) {\n var prev = allowStateChangesStart(allowStateChanges);\n try {\n return func();\n } finally {\n allowStateChangesEnd(prev);\n }\n}\nfunction allowStateChangesStart(allowStateChanges) {\n var prev = globalState.allowStateChanges;\n globalState.allowStateChanges = allowStateChanges;\n return prev;\n}\nfunction allowStateChangesEnd(prev) {\n globalState.allowStateChanges = prev;\n}\n\nvar _Symbol$toPrimitive;\nvar CREATE = \"create\";\n_Symbol$toPrimitive = Symbol.toPrimitive;\nvar ObservableValue = /*#__PURE__*/function (_Atom) {\n _inheritsLoose(ObservableValue, _Atom);\n function ObservableValue(value, enhancer, name_, notifySpy, equals) {\n var _this;\n if (name_ === void 0) {\n name_ = process.env.NODE_ENV !== \"production\" ? \"ObservableValue@\" + getNextId() : \"ObservableValue\";\n }\n if (notifySpy === void 0) {\n notifySpy = true;\n }\n if (equals === void 0) {\n equals = comparer[\"default\"];\n }\n _this = _Atom.call(this, name_) || this;\n _this.enhancer = void 0;\n _this.name_ = void 0;\n _this.equals = void 0;\n _this.hasUnreportedChange_ = false;\n _this.interceptors_ = void 0;\n _this.changeListeners_ = void 0;\n _this.value_ = void 0;\n _this.dehancer = void 0;\n _this.enhancer = enhancer;\n _this.name_ = name_;\n _this.equals = equals;\n _this.value_ = enhancer(value, undefined, name_);\n if (process.env.NODE_ENV !== \"production\" && notifySpy && isSpyEnabled()) {\n // only notify spy if this is a stand-alone observable\n spyReport({\n type: CREATE,\n object: _assertThisInitialized(_this),\n observableKind: \"value\",\n debugObjectName: _this.name_,\n newValue: \"\" + _this.value_\n });\n }\n return _this;\n }\n var _proto = ObservableValue.prototype;\n _proto.dehanceValue = function dehanceValue(value) {\n if (this.dehancer !== undefined) {\n return this.dehancer(value);\n }\n return value;\n };\n _proto.set = function set(newValue) {\n var oldValue = this.value_;\n newValue = this.prepareNewValue_(newValue);\n if (newValue !== globalState.UNCHANGED) {\n var notifySpy = isSpyEnabled();\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportStart({\n type: UPDATE,\n object: this,\n observableKind: \"value\",\n debugObjectName: this.name_,\n newValue: newValue,\n oldValue: oldValue\n });\n }\n this.setNewValue_(newValue);\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportEnd();\n }\n }\n };\n _proto.prepareNewValue_ = function prepareNewValue_(newValue) {\n checkIfStateModificationsAreAllowed(this);\n if (hasInterceptors(this)) {\n var change = interceptChange(this, {\n object: this,\n type: UPDATE,\n newValue: newValue\n });\n if (!change) {\n return globalState.UNCHANGED;\n }\n newValue = change.newValue;\n }\n // apply modifier\n newValue = this.enhancer(newValue, this.value_, this.name_);\n return this.equals(this.value_, newValue) ? globalState.UNCHANGED : newValue;\n };\n _proto.setNewValue_ = function setNewValue_(newValue) {\n var oldValue = this.value_;\n this.value_ = newValue;\n this.reportChanged();\n if (hasListeners(this)) {\n notifyListeners(this, {\n type: UPDATE,\n object: this,\n newValue: newValue,\n oldValue: oldValue\n });\n }\n };\n _proto.get = function get() {\n this.reportObserved();\n return this.dehanceValue(this.value_);\n };\n _proto.intercept_ = function intercept_(handler) {\n return registerInterceptor(this, handler);\n };\n _proto.observe_ = function observe_(listener, fireImmediately) {\n if (fireImmediately) {\n listener({\n observableKind: \"value\",\n debugObjectName: this.name_,\n object: this,\n type: UPDATE,\n newValue: this.value_,\n oldValue: undefined\n });\n }\n return registerListener(this, listener);\n };\n _proto.raw = function raw() {\n // used by MST ot get undehanced value\n return this.value_;\n };\n _proto.toJSON = function toJSON() {\n return this.get();\n };\n _proto.toString = function toString() {\n return this.name_ + \"[\" + this.value_ + \"]\";\n };\n _proto.valueOf = function valueOf() {\n return toPrimitive(this.get());\n };\n _proto[_Symbol$toPrimitive] = function () {\n return this.valueOf();\n };\n return ObservableValue;\n}(Atom);\nvar isObservableValue = /*#__PURE__*/createInstanceofPredicate(\"ObservableValue\", ObservableValue);\n\nvar _Symbol$toPrimitive$1;\n/**\n * A node in the state dependency root that observes other nodes, and can be observed itself.\n *\n * ComputedValue will remember the result of the computation for the duration of the batch, or\n * while being observed.\n *\n * During this time it will recompute only when one of its direct dependencies changed,\n * but only when it is being accessed with `ComputedValue.get()`.\n *\n * Implementation description:\n * 1. First time it's being accessed it will compute and remember result\n * give back remembered result until 2. happens\n * 2. First time any deep dependency change, propagate POSSIBLY_STALE to all observers, wait for 3.\n * 3. When it's being accessed, recompute if any shallow dependency changed.\n * if result changed: propagate STALE to all observers, that were POSSIBLY_STALE from the last step.\n * go to step 2. either way\n *\n * If at any point it's outside batch and it isn't observed: reset everything and go to 1.\n */\n_Symbol$toPrimitive$1 = Symbol.toPrimitive;\nvar ComputedValue = /*#__PURE__*/function () {\n // nodes we are looking at. Our value depends on these nodes\n // during tracking it's an array with new observed observers\n\n // to check for cycles\n\n // N.B: unminified as it is used by MST\n\n /**\n * Create a new computed value based on a function expression.\n *\n * The `name` property is for debug purposes only.\n *\n * The `equals` property specifies the comparer function to use to determine if a newly produced\n * value differs from the previous value. Two comparers are provided in the library; `defaultComparer`\n * compares based on identity comparison (===), and `structuralComparer` deeply compares the structure.\n * Structural comparison can be convenient if you always produce a new aggregated object and\n * don't want to notify observers if it is structurally the same.\n * This is useful for working with vectors, mouse coordinates etc.\n */\n function ComputedValue(options) {\n this.dependenciesState_ = IDerivationState_.NOT_TRACKING_;\n this.observing_ = [];\n this.newObserving_ = null;\n this.isBeingObserved_ = false;\n this.isPendingUnobservation_ = false;\n this.observers_ = new Set();\n this.diffValue_ = 0;\n this.runId_ = 0;\n this.lastAccessedBy_ = 0;\n this.lowestObserverState_ = IDerivationState_.UP_TO_DATE_;\n this.unboundDepsCount_ = 0;\n this.value_ = new CaughtException(null);\n this.name_ = void 0;\n this.triggeredBy_ = void 0;\n this.isComputing_ = false;\n this.isRunningSetter_ = false;\n this.derivation = void 0;\n this.setter_ = void 0;\n this.isTracing_ = TraceMode.NONE;\n this.scope_ = void 0;\n this.equals_ = void 0;\n this.requiresReaction_ = void 0;\n this.keepAlive_ = void 0;\n this.onBOL = void 0;\n this.onBUOL = void 0;\n if (!options.get) {\n die(31);\n }\n this.derivation = options.get;\n this.name_ = options.name || (process.env.NODE_ENV !== \"production\" ? \"ComputedValue@\" + getNextId() : \"ComputedValue\");\n if (options.set) {\n this.setter_ = createAction(process.env.NODE_ENV !== \"production\" ? this.name_ + \"-setter\" : \"ComputedValue-setter\", options.set);\n }\n this.equals_ = options.equals || (options.compareStructural || options.struct ? comparer.structural : comparer[\"default\"]);\n this.scope_ = options.context;\n this.requiresReaction_ = options.requiresReaction;\n this.keepAlive_ = !!options.keepAlive;\n }\n var _proto = ComputedValue.prototype;\n _proto.onBecomeStale_ = function onBecomeStale_() {\n propagateMaybeChanged(this);\n };\n _proto.onBO = function onBO() {\n if (this.onBOL) {\n this.onBOL.forEach(function (listener) {\n return listener();\n });\n }\n };\n _proto.onBUO = function onBUO() {\n if (this.onBUOL) {\n this.onBUOL.forEach(function (listener) {\n return listener();\n });\n }\n }\n /**\n * Returns the current value of this computed value.\n * Will evaluate its computation first if needed.\n */;\n _proto.get = function get() {\n if (this.isComputing_) {\n die(32, this.name_, this.derivation);\n }\n if (globalState.inBatch === 0 &&\n // !globalState.trackingDerivatpion &&\n this.observers_.size === 0 && !this.keepAlive_) {\n if (shouldCompute(this)) {\n this.warnAboutUntrackedRead_();\n startBatch(); // See perf test 'computed memoization'\n this.value_ = this.computeValue_(false);\n endBatch();\n }\n } else {\n reportObserved(this);\n if (shouldCompute(this)) {\n var prevTrackingContext = globalState.trackingContext;\n if (this.keepAlive_ && !prevTrackingContext) {\n globalState.trackingContext = this;\n }\n if (this.trackAndCompute()) {\n propagateChangeConfirmed(this);\n }\n globalState.trackingContext = prevTrackingContext;\n }\n }\n var result = this.value_;\n if (isCaughtException(result)) {\n throw result.cause;\n }\n return result;\n };\n _proto.set = function set(value) {\n if (this.setter_) {\n if (this.isRunningSetter_) {\n die(33, this.name_);\n }\n this.isRunningSetter_ = true;\n try {\n this.setter_.call(this.scope_, value);\n } finally {\n this.isRunningSetter_ = false;\n }\n } else {\n die(34, this.name_);\n }\n };\n _proto.trackAndCompute = function trackAndCompute() {\n // N.B: unminified as it is used by MST\n var oldValue = this.value_;\n var wasSuspended = /* see #1208 */this.dependenciesState_ === IDerivationState_.NOT_TRACKING_;\n var newValue = this.computeValue_(true);\n var changed = wasSuspended || isCaughtException(oldValue) || isCaughtException(newValue) || !this.equals_(oldValue, newValue);\n if (changed) {\n this.value_ = newValue;\n if (process.env.NODE_ENV !== \"production\" && isSpyEnabled()) {\n spyReport({\n observableKind: \"computed\",\n debugObjectName: this.name_,\n object: this.scope_,\n type: \"update\",\n oldValue: oldValue,\n newValue: newValue\n });\n }\n }\n return changed;\n };\n _proto.computeValue_ = function computeValue_(track) {\n this.isComputing_ = true;\n // don't allow state changes during computation\n var prev = allowStateChangesStart(false);\n var res;\n if (track) {\n res = trackDerivedFunction(this, this.derivation, this.scope_);\n } else {\n if (globalState.disableErrorBoundaries === true) {\n res = this.derivation.call(this.scope_);\n } else {\n try {\n res = this.derivation.call(this.scope_);\n } catch (e) {\n res = new CaughtException(e);\n }\n }\n }\n allowStateChangesEnd(prev);\n this.isComputing_ = false;\n return res;\n };\n _proto.suspend_ = function suspend_() {\n if (!this.keepAlive_) {\n clearObserving(this);\n this.value_ = undefined; // don't hold on to computed value!\n if (process.env.NODE_ENV !== \"production\" && this.isTracing_ !== TraceMode.NONE) {\n console.log(\"[mobx.trace] Computed value '\" + this.name_ + \"' was suspended and it will recompute on the next access.\");\n }\n }\n };\n _proto.observe_ = function observe_(listener, fireImmediately) {\n var _this = this;\n var firstTime = true;\n var prevValue = undefined;\n return autorun(function () {\n // TODO: why is this in a different place than the spyReport() function? in all other observables it's called in the same place\n var newValue = _this.get();\n if (!firstTime || fireImmediately) {\n var prevU = untrackedStart();\n listener({\n observableKind: \"computed\",\n debugObjectName: _this.name_,\n type: UPDATE,\n object: _this,\n newValue: newValue,\n oldValue: prevValue\n });\n untrackedEnd(prevU);\n }\n firstTime = false;\n prevValue = newValue;\n });\n };\n _proto.warnAboutUntrackedRead_ = function warnAboutUntrackedRead_() {\n if (!(process.env.NODE_ENV !== \"production\")) {\n return;\n }\n if (this.isTracing_ !== TraceMode.NONE) {\n console.log(\"[mobx.trace] Computed value '\" + this.name_ + \"' is being read outside a reactive context. Doing a full recompute.\");\n }\n if (typeof this.requiresReaction_ === \"boolean\" ? this.requiresReaction_ : globalState.computedRequiresReaction) {\n console.warn(\"[mobx] Computed value '\" + this.name_ + \"' is being read outside a reactive context. Doing a full recompute.\");\n }\n };\n _proto.toString = function toString() {\n return this.name_ + \"[\" + this.derivation.toString() + \"]\";\n };\n _proto.valueOf = function valueOf() {\n return toPrimitive(this.get());\n };\n _proto[_Symbol$toPrimitive$1] = function () {\n return this.valueOf();\n };\n return ComputedValue;\n}();\nvar isComputedValue = /*#__PURE__*/createInstanceofPredicate(\"ComputedValue\", ComputedValue);\n\nvar IDerivationState_;\n(function (IDerivationState_) {\n // before being run or (outside batch and not being observed)\n // at this point derivation is not holding any data about dependency tree\n IDerivationState_[IDerivationState_[\"NOT_TRACKING_\"] = -1] = \"NOT_TRACKING_\";\n // no shallow dependency changed since last computation\n // won't recalculate derivation\n // this is what makes mobx fast\n IDerivationState_[IDerivationState_[\"UP_TO_DATE_\"] = 0] = \"UP_TO_DATE_\";\n // some deep dependency changed, but don't know if shallow dependency changed\n // will require to check first if UP_TO_DATE or POSSIBLY_STALE\n // currently only ComputedValue will propagate POSSIBLY_STALE\n //\n // having this state is second big optimization:\n // don't have to recompute on every dependency change, but only when it's needed\n IDerivationState_[IDerivationState_[\"POSSIBLY_STALE_\"] = 1] = \"POSSIBLY_STALE_\";\n // A shallow dependency has changed since last computation and the derivation\n // will need to recompute when it's needed next.\n IDerivationState_[IDerivationState_[\"STALE_\"] = 2] = \"STALE_\";\n})(IDerivationState_ || (IDerivationState_ = {}));\nvar TraceMode;\n(function (TraceMode) {\n TraceMode[TraceMode[\"NONE\"] = 0] = \"NONE\";\n TraceMode[TraceMode[\"LOG\"] = 1] = \"LOG\";\n TraceMode[TraceMode[\"BREAK\"] = 2] = \"BREAK\";\n})(TraceMode || (TraceMode = {}));\nvar CaughtException = function CaughtException(cause) {\n this.cause = void 0;\n this.cause = cause;\n // Empty\n};\n\nfunction isCaughtException(e) {\n return e instanceof CaughtException;\n}\n/**\n * Finds out whether any dependency of the derivation has actually changed.\n * If dependenciesState is 1 then it will recalculate dependencies,\n * if any dependency changed it will propagate it by changing dependenciesState to 2.\n *\n * By iterating over the dependencies in the same order that they were reported and\n * stopping on the first change, all the recalculations are only called for ComputedValues\n * that will be tracked by derivation. That is because we assume that if the first x\n * dependencies of the derivation doesn't change then the derivation should run the same way\n * up until accessing x-th dependency.\n */\nfunction shouldCompute(derivation) {\n switch (derivation.dependenciesState_) {\n case IDerivationState_.UP_TO_DATE_:\n return false;\n case IDerivationState_.NOT_TRACKING_:\n case IDerivationState_.STALE_:\n return true;\n case IDerivationState_.POSSIBLY_STALE_:\n {\n // state propagation can occur outside of action/reactive context #2195\n var prevAllowStateReads = allowStateReadsStart(true);\n var prevUntracked = untrackedStart(); // no need for those computeds to be reported, they will be picked up in trackDerivedFunction.\n var obs = derivation.observing_,\n l = obs.length;\n for (var i = 0; i < l; i++) {\n var obj = obs[i];\n if (isComputedValue(obj)) {\n if (globalState.disableErrorBoundaries) {\n obj.get();\n } else {\n try {\n obj.get();\n } catch (e) {\n // we are not interested in the value *or* exception at this moment, but if there is one, notify all\n untrackedEnd(prevUntracked);\n allowStateReadsEnd(prevAllowStateReads);\n return true;\n }\n }\n // if ComputedValue `obj` actually changed it will be computed and propagated to its observers.\n // and `derivation` is an observer of `obj`\n // invariantShouldCompute(derivation)\n if (derivation.dependenciesState_ === IDerivationState_.STALE_) {\n untrackedEnd(prevUntracked);\n allowStateReadsEnd(prevAllowStateReads);\n return true;\n }\n }\n }\n changeDependenciesStateTo0(derivation);\n untrackedEnd(prevUntracked);\n allowStateReadsEnd(prevAllowStateReads);\n return false;\n }\n }\n}\nfunction isComputingDerivation() {\n return globalState.trackingDerivation !== null; // filter out actions inside computations\n}\n\nfunction checkIfStateModificationsAreAllowed(atom) {\n if (!(process.env.NODE_ENV !== \"production\")) {\n return;\n }\n var hasObservers = atom.observers_.size > 0;\n // Should not be possible to change observed state outside strict mode, except during initialization, see #563\n if (!globalState.allowStateChanges && (hasObservers || globalState.enforceActions === \"always\")) {\n console.warn(\"[MobX] \" + (globalState.enforceActions ? \"Since strict-mode is enabled, changing (observed) observable values without using an action is not allowed. Tried to modify: \" : \"Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' (or decorate functions with 'action') if needed. Tried to modify: \") + atom.name_);\n }\n}\nfunction checkIfStateReadsAreAllowed(observable) {\n if (process.env.NODE_ENV !== \"production\" && !globalState.allowStateReads && globalState.observableRequiresReaction) {\n console.warn(\"[mobx] Observable '\" + observable.name_ + \"' being read outside a reactive context.\");\n }\n}\n/**\n * Executes the provided function `f` and tracks which observables are being accessed.\n * The tracking information is stored on the `derivation` object and the derivation is registered\n * as observer of any of the accessed observables.\n */\nfunction trackDerivedFunction(derivation, f, context) {\n var prevAllowStateReads = allowStateReadsStart(true);\n // pre allocate array allocation + room for variation in deps\n // array will be trimmed by bindDependencies\n changeDependenciesStateTo0(derivation);\n derivation.newObserving_ = new Array(derivation.observing_.length + 100);\n derivation.unboundDepsCount_ = 0;\n derivation.runId_ = ++globalState.runId;\n var prevTracking = globalState.trackingDerivation;\n globalState.trackingDerivation = derivation;\n globalState.inBatch++;\n var result;\n if (globalState.disableErrorBoundaries === true) {\n result = f.call(context);\n } else {\n try {\n result = f.call(context);\n } catch (e) {\n result = new CaughtException(e);\n }\n }\n globalState.inBatch--;\n globalState.trackingDerivation = prevTracking;\n bindDependencies(derivation);\n warnAboutDerivationWithoutDependencies(derivation);\n allowStateReadsEnd(prevAllowStateReads);\n return result;\n}\nfunction warnAboutDerivationWithoutDependencies(derivation) {\n if (!(process.env.NODE_ENV !== \"production\")) {\n return;\n }\n if (derivation.observing_.length !== 0) {\n return;\n }\n if (typeof derivation.requiresObservable_ === \"boolean\" ? derivation.requiresObservable_ : globalState.reactionRequiresObservable) {\n console.warn(\"[mobx] Derivation '\" + derivation.name_ + \"' is created/updated without reading any observable value.\");\n }\n}\n/**\n * diffs newObserving with observing.\n * update observing to be newObserving with unique observables\n * notify observers that become observed/unobserved\n */\nfunction bindDependencies(derivation) {\n // invariant(derivation.dependenciesState !== IDerivationState.NOT_TRACKING, \"INTERNAL ERROR bindDependencies expects derivation.dependenciesState !== -1\");\n var prevObserving = derivation.observing_;\n var observing = derivation.observing_ = derivation.newObserving_;\n var lowestNewObservingDerivationState = IDerivationState_.UP_TO_DATE_;\n // Go through all new observables and check diffValue: (this list can contain duplicates):\n // 0: first occurrence, change to 1 and keep it\n // 1: extra occurrence, drop it\n var i0 = 0,\n l = derivation.unboundDepsCount_;\n for (var i = 0; i < l; i++) {\n var dep = observing[i];\n if (dep.diffValue_ === 0) {\n dep.diffValue_ = 1;\n if (i0 !== i) {\n observing[i0] = dep;\n }\n i0++;\n }\n // Upcast is 'safe' here, because if dep is IObservable, `dependenciesState` will be undefined,\n // not hitting the condition\n if (dep.dependenciesState_ > lowestNewObservingDerivationState) {\n lowestNewObservingDerivationState = dep.dependenciesState_;\n }\n }\n observing.length = i0;\n derivation.newObserving_ = null; // newObserving shouldn't be needed outside tracking (statement moved down to work around FF bug, see #614)\n // Go through all old observables and check diffValue: (it is unique after last bindDependencies)\n // 0: it's not in new observables, unobserve it\n // 1: it keeps being observed, don't want to notify it. change to 0\n l = prevObserving.length;\n while (l--) {\n var _dep = prevObserving[l];\n if (_dep.diffValue_ === 0) {\n removeObserver(_dep, derivation);\n }\n _dep.diffValue_ = 0;\n }\n // Go through all new observables and check diffValue: (now it should be unique)\n // 0: it was set to 0 in last loop. don't need to do anything.\n // 1: it wasn't observed, let's observe it. set back to 0\n while (i0--) {\n var _dep2 = observing[i0];\n if (_dep2.diffValue_ === 1) {\n _dep2.diffValue_ = 0;\n addObserver(_dep2, derivation);\n }\n }\n // Some new observed derivations may become stale during this derivation computation\n // so they have had no chance to propagate staleness (#916)\n if (lowestNewObservingDerivationState !== IDerivationState_.UP_TO_DATE_) {\n derivation.dependenciesState_ = lowestNewObservingDerivationState;\n derivation.onBecomeStale_();\n }\n}\nfunction clearObserving(derivation) {\n // invariant(globalState.inBatch > 0, \"INTERNAL ERROR clearObserving should be called only inside batch\");\n var obs = derivation.observing_;\n derivation.observing_ = [];\n var i = obs.length;\n while (i--) {\n removeObserver(obs[i], derivation);\n }\n derivation.dependenciesState_ = IDerivationState_.NOT_TRACKING_;\n}\nfunction untracked(action) {\n var prev = untrackedStart();\n try {\n return action();\n } finally {\n untrackedEnd(prev);\n }\n}\nfunction untrackedStart() {\n var prev = globalState.trackingDerivation;\n globalState.trackingDerivation = null;\n return prev;\n}\nfunction untrackedEnd(prev) {\n globalState.trackingDerivation = prev;\n}\nfunction allowStateReadsStart(allowStateReads) {\n var prev = globalState.allowStateReads;\n globalState.allowStateReads = allowStateReads;\n return prev;\n}\nfunction allowStateReadsEnd(prev) {\n globalState.allowStateReads = prev;\n}\n/**\n * needed to keep `lowestObserverState` correct. when changing from (2 or 1) to 0\n *\n */\nfunction changeDependenciesStateTo0(derivation) {\n if (derivation.dependenciesState_ === IDerivationState_.UP_TO_DATE_) {\n return;\n }\n derivation.dependenciesState_ = IDerivationState_.UP_TO_DATE_;\n var obs = derivation.observing_;\n var i = obs.length;\n while (i--) {\n obs[i].lowestObserverState_ = IDerivationState_.UP_TO_DATE_;\n }\n}\n\n/**\n * These values will persist if global state is reset\n */\nvar persistentKeys = [\"mobxGuid\", \"spyListeners\", \"enforceActions\", \"computedRequiresReaction\", \"reactionRequiresObservable\", \"observableRequiresReaction\", \"allowStateReads\", \"disableErrorBoundaries\", \"runId\", \"UNCHANGED\", \"useProxies\"];\nvar MobXGlobals = function MobXGlobals() {\n this.version = 6;\n this.UNCHANGED = {};\n this.trackingDerivation = null;\n this.trackingContext = null;\n this.runId = 0;\n this.mobxGuid = 0;\n this.inBatch = 0;\n this.pendingUnobservations = [];\n this.pendingReactions = [];\n this.isRunningReactions = false;\n this.allowStateChanges = false;\n this.allowStateReads = true;\n this.enforceActions = true;\n this.spyListeners = [];\n this.globalReactionErrorHandlers = [];\n this.computedRequiresReaction = false;\n this.reactionRequiresObservable = false;\n this.observableRequiresReaction = false;\n this.disableErrorBoundaries = false;\n this.suppressReactionErrors = false;\n this.useProxies = true;\n this.verifyProxies = false;\n this.safeDescriptors = true;\n};\nvar canMergeGlobalState = true;\nvar isolateCalled = false;\nvar globalState = /*#__PURE__*/function () {\n var global = /*#__PURE__*/getGlobal();\n if (global.__mobxInstanceCount > 0 && !global.__mobxGlobals) {\n canMergeGlobalState = false;\n }\n if (global.__mobxGlobals && global.__mobxGlobals.version !== new MobXGlobals().version) {\n canMergeGlobalState = false;\n }\n if (!canMergeGlobalState) {\n // Because this is a IIFE we need to let isolateCalled a chance to change\n // so we run it after the event loop completed at least 1 iteration\n setTimeout(function () {\n if (!isolateCalled) {\n die(35);\n }\n }, 1);\n return new MobXGlobals();\n } else if (global.__mobxGlobals) {\n global.__mobxInstanceCount += 1;\n if (!global.__mobxGlobals.UNCHANGED) {\n global.__mobxGlobals.UNCHANGED = {};\n } // make merge backward compatible\n return global.__mobxGlobals;\n } else {\n global.__mobxInstanceCount = 1;\n return global.__mobxGlobals = /*#__PURE__*/new MobXGlobals();\n }\n}();\nfunction isolateGlobalState() {\n if (globalState.pendingReactions.length || globalState.inBatch || globalState.isRunningReactions) {\n die(36);\n }\n isolateCalled = true;\n if (canMergeGlobalState) {\n var global = getGlobal();\n if (--global.__mobxInstanceCount === 0) {\n global.__mobxGlobals = undefined;\n }\n globalState = new MobXGlobals();\n }\n}\nfunction getGlobalState() {\n return globalState;\n}\n/**\n * For testing purposes only; this will break the internal state of existing observables,\n * but can be used to get back at a stable state after throwing errors\n */\nfunction resetGlobalState() {\n var defaultGlobals = new MobXGlobals();\n for (var key in defaultGlobals) {\n if (persistentKeys.indexOf(key) === -1) {\n globalState[key] = defaultGlobals[key];\n }\n }\n globalState.allowStateChanges = !globalState.enforceActions;\n}\n\nfunction hasObservers(observable) {\n return observable.observers_ && observable.observers_.size > 0;\n}\nfunction getObservers(observable) {\n return observable.observers_;\n}\n// function invariantObservers(observable: IObservable) {\n// const list = observable.observers\n// const map = observable.observersIndexes\n// const l = list.length\n// for (let i = 0; i < l; i++) {\n// const id = list[i].__mapid\n// if (i) {\n// invariant(map[id] === i, \"INTERNAL ERROR maps derivation.__mapid to index in list\") // for performance\n// } else {\n// invariant(!(id in map), \"INTERNAL ERROR observer on index 0 shouldn't be held in map.\") // for performance\n// }\n// }\n// invariant(\n// list.length === 0 || Object.keys(map).length === list.length - 1,\n// \"INTERNAL ERROR there is no junk in map\"\n// )\n// }\nfunction addObserver(observable, node) {\n // invariant(node.dependenciesState !== -1, \"INTERNAL ERROR, can add only dependenciesState !== -1\");\n // invariant(observable._observers.indexOf(node) === -1, \"INTERNAL ERROR add already added node\");\n // invariantObservers(observable);\n observable.observers_.add(node);\n if (observable.lowestObserverState_ > node.dependenciesState_) {\n observable.lowestObserverState_ = node.dependenciesState_;\n }\n // invariantObservers(observable);\n // invariant(observable._observers.indexOf(node) !== -1, \"INTERNAL ERROR didn't add node\");\n}\n\nfunction removeObserver(observable, node) {\n // invariant(globalState.inBatch > 0, \"INTERNAL ERROR, remove should be called only inside batch\");\n // invariant(observable._observers.indexOf(node) !== -1, \"INTERNAL ERROR remove already removed node\");\n // invariantObservers(observable);\n observable.observers_[\"delete\"](node);\n if (observable.observers_.size === 0) {\n // deleting last observer\n queueForUnobservation(observable);\n }\n // invariantObservers(observable);\n // invariant(observable._observers.indexOf(node) === -1, \"INTERNAL ERROR remove already removed node2\");\n}\n\nfunction queueForUnobservation(observable) {\n if (observable.isPendingUnobservation_ === false) {\n // invariant(observable._observers.length === 0, \"INTERNAL ERROR, should only queue for unobservation unobserved observables\");\n observable.isPendingUnobservation_ = true;\n globalState.pendingUnobservations.push(observable);\n }\n}\n/**\n * Batch starts a transaction, at least for purposes of memoizing ComputedValues when nothing else does.\n * During a batch `onBecomeUnobserved` will be called at most once per observable.\n * Avoids unnecessary recalculations.\n */\nfunction startBatch() {\n globalState.inBatch++;\n}\nfunction endBatch() {\n if (--globalState.inBatch === 0) {\n runReactions();\n // the batch is actually about to finish, all unobserving should happen here.\n var list = globalState.pendingUnobservations;\n for (var i = 0; i < list.length; i++) {\n var observable = list[i];\n observable.isPendingUnobservation_ = false;\n if (observable.observers_.size === 0) {\n if (observable.isBeingObserved_) {\n // if this observable had reactive observers, trigger the hooks\n observable.isBeingObserved_ = false;\n observable.onBUO();\n }\n if (observable instanceof ComputedValue) {\n // computed values are automatically teared down when the last observer leaves\n // this process happens recursively, this computed might be the last observabe of another, etc..\n observable.suspend_();\n }\n }\n }\n globalState.pendingUnobservations = [];\n }\n}\nfunction reportObserved(observable) {\n checkIfStateReadsAreAllowed(observable);\n var derivation = globalState.trackingDerivation;\n if (derivation !== null) {\n /**\n * Simple optimization, give each derivation run an unique id (runId)\n * Check if last time this observable was accessed the same runId is used\n * if this is the case, the relation is already known\n */\n if (derivation.runId_ !== observable.lastAccessedBy_) {\n observable.lastAccessedBy_ = derivation.runId_;\n // Tried storing newObserving, or observing, or both as Set, but performance didn't come close...\n derivation.newObserving_[derivation.unboundDepsCount_++] = observable;\n if (!observable.isBeingObserved_ && globalState.trackingContext) {\n observable.isBeingObserved_ = true;\n observable.onBO();\n }\n }\n return observable.isBeingObserved_;\n } else if (observable.observers_.size === 0 && globalState.inBatch > 0) {\n queueForUnobservation(observable);\n }\n return false;\n}\n// function invariantLOS(observable: IObservable, msg: string) {\n// // it's expensive so better not run it in produciton. but temporarily helpful for testing\n// const min = getObservers(observable).reduce((a, b) => Math.min(a, b.dependenciesState), 2)\n// if (min >= observable.lowestObserverState) return // <- the only assumption about `lowestObserverState`\n// throw new Error(\n// \"lowestObserverState is wrong for \" +\n// msg +\n// \" because \" +\n// min +\n// \" < \" +\n// observable.lowestObserverState\n// )\n// }\n/**\n * NOTE: current propagation mechanism will in case of self reruning autoruns behave unexpectedly\n * It will propagate changes to observers from previous run\n * It's hard or maybe impossible (with reasonable perf) to get it right with current approach\n * Hopefully self reruning autoruns aren't a feature people should depend on\n * Also most basic use cases should be ok\n */\n// Called by Atom when its value changes\nfunction propagateChanged(observable) {\n // invariantLOS(observable, \"changed start\");\n if (observable.lowestObserverState_ === IDerivationState_.STALE_) {\n return;\n }\n observable.lowestObserverState_ = IDerivationState_.STALE_;\n // Ideally we use for..of here, but the downcompiled version is really slow...\n observable.observers_.forEach(function (d) {\n if (d.dependenciesState_ === IDerivationState_.UP_TO_DATE_) {\n if (process.env.NODE_ENV !== \"production\" && d.isTracing_ !== TraceMode.NONE) {\n logTraceInfo(d, observable);\n }\n d.onBecomeStale_();\n }\n d.dependenciesState_ = IDerivationState_.STALE_;\n });\n // invariantLOS(observable, \"changed end\");\n}\n// Called by ComputedValue when it recalculate and its value changed\nfunction propagateChangeConfirmed(observable) {\n // invariantLOS(observable, \"confirmed start\");\n if (observable.lowestObserverState_ === IDerivationState_.STALE_) {\n return;\n }\n observable.lowestObserverState_ = IDerivationState_.STALE_;\n observable.observers_.forEach(function (d) {\n if (d.dependenciesState_ === IDerivationState_.POSSIBLY_STALE_) {\n d.dependenciesState_ = IDerivationState_.STALE_;\n if (process.env.NODE_ENV !== \"production\" && d.isTracing_ !== TraceMode.NONE) {\n logTraceInfo(d, observable);\n }\n } else if (d.dependenciesState_ === IDerivationState_.UP_TO_DATE_ // this happens during computing of `d`, just keep lowestObserverState up to date.\n ) {\n observable.lowestObserverState_ = IDerivationState_.UP_TO_DATE_;\n }\n });\n // invariantLOS(observable, \"confirmed end\");\n}\n// Used by computed when its dependency changed, but we don't wan't to immediately recompute.\nfunction propagateMaybeChanged(observable) {\n // invariantLOS(observable, \"maybe start\");\n if (observable.lowestObserverState_ !== IDerivationState_.UP_TO_DATE_) {\n return;\n }\n observable.lowestObserverState_ = IDerivationState_.POSSIBLY_STALE_;\n observable.observers_.forEach(function (d) {\n if (d.dependenciesState_ === IDerivationState_.UP_TO_DATE_) {\n d.dependenciesState_ = IDerivationState_.POSSIBLY_STALE_;\n d.onBecomeStale_();\n }\n });\n // invariantLOS(observable, \"maybe end\");\n}\n\nfunction logTraceInfo(derivation, observable) {\n console.log(\"[mobx.trace] '\" + derivation.name_ + \"' is invalidated due to a change in: '\" + observable.name_ + \"'\");\n if (derivation.isTracing_ === TraceMode.BREAK) {\n var lines = [];\n printDepTree(getDependencyTree(derivation), lines, 1);\n // prettier-ignore\n new Function(\"debugger;\\n/*\\nTracing '\" + derivation.name_ + \"'\\n\\nYou are entering this break point because derivation '\" + derivation.name_ + \"' is being traced and '\" + observable.name_ + \"' is now forcing it to update.\\nJust follow the stacktrace you should now see in the devtools to see precisely what piece of your code is causing this update\\nThe stackframe you are looking for is at least ~6-8 stack-frames up.\\n\\n\" + (derivation instanceof ComputedValue ? derivation.derivation.toString().replace(/[*]\\//g, \"/\") : \"\") + \"\\n\\nThe dependencies for this derivation are:\\n\\n\" + lines.join(\"\\n\") + \"\\n*/\\n \")();\n }\n}\nfunction printDepTree(tree, lines, depth) {\n if (lines.length >= 1000) {\n lines.push(\"(and many more)\");\n return;\n }\n lines.push(\"\" + \"\\t\".repeat(depth - 1) + tree.name);\n if (tree.dependencies) {\n tree.dependencies.forEach(function (child) {\n return printDepTree(child, lines, depth + 1);\n });\n }\n}\n\nvar Reaction = /*#__PURE__*/function () {\n // nodes we are looking at. Our value depends on these nodes\n\n function Reaction(name_, onInvalidate_, errorHandler_, requiresObservable_) {\n if (name_ === void 0) {\n name_ = process.env.NODE_ENV !== \"production\" ? \"Reaction@\" + getNextId() : \"Reaction\";\n }\n this.name_ = void 0;\n this.onInvalidate_ = void 0;\n this.errorHandler_ = void 0;\n this.requiresObservable_ = void 0;\n this.observing_ = [];\n this.newObserving_ = [];\n this.dependenciesState_ = IDerivationState_.NOT_TRACKING_;\n this.diffValue_ = 0;\n this.runId_ = 0;\n this.unboundDepsCount_ = 0;\n this.isDisposed_ = false;\n this.isScheduled_ = false;\n this.isTrackPending_ = false;\n this.isRunning_ = false;\n this.isTracing_ = TraceMode.NONE;\n this.name_ = name_;\n this.onInvalidate_ = onInvalidate_;\n this.errorHandler_ = errorHandler_;\n this.requiresObservable_ = requiresObservable_;\n }\n var _proto = Reaction.prototype;\n _proto.onBecomeStale_ = function onBecomeStale_() {\n this.schedule_();\n };\n _proto.schedule_ = function schedule_() {\n if (!this.isScheduled_) {\n this.isScheduled_ = true;\n globalState.pendingReactions.push(this);\n runReactions();\n }\n };\n _proto.isScheduled = function isScheduled() {\n return this.isScheduled_;\n }\n /**\n * internal, use schedule() if you intend to kick off a reaction\n */;\n _proto.runReaction_ = function runReaction_() {\n if (!this.isDisposed_) {\n startBatch();\n this.isScheduled_ = false;\n var prev = globalState.trackingContext;\n globalState.trackingContext = this;\n if (shouldCompute(this)) {\n this.isTrackPending_ = true;\n try {\n this.onInvalidate_();\n if (process.env.NODE_ENV !== \"production\" && this.isTrackPending_ && isSpyEnabled()) {\n // onInvalidate didn't trigger track right away..\n spyReport({\n name: this.name_,\n type: \"scheduled-reaction\"\n });\n }\n } catch (e) {\n this.reportExceptionInDerivation_(e);\n }\n }\n globalState.trackingContext = prev;\n endBatch();\n }\n };\n _proto.track = function track(fn) {\n if (this.isDisposed_) {\n return;\n // console.warn(\"Reaction already disposed\") // Note: Not a warning / error in mobx 4 either\n }\n\n startBatch();\n var notify = isSpyEnabled();\n var startTime;\n if (process.env.NODE_ENV !== \"production\" && notify) {\n startTime = Date.now();\n spyReportStart({\n name: this.name_,\n type: \"reaction\"\n });\n }\n this.isRunning_ = true;\n var prevReaction = globalState.trackingContext; // reactions could create reactions...\n globalState.trackingContext = this;\n var result = trackDerivedFunction(this, fn, undefined);\n globalState.trackingContext = prevReaction;\n this.isRunning_ = false;\n this.isTrackPending_ = false;\n if (this.isDisposed_) {\n // disposed during last run. Clean up everything that was bound after the dispose call.\n clearObserving(this);\n }\n if (isCaughtException(result)) {\n this.reportExceptionInDerivation_(result.cause);\n }\n if (process.env.NODE_ENV !== \"production\" && notify) {\n spyReportEnd({\n time: Date.now() - startTime\n });\n }\n endBatch();\n };\n _proto.reportExceptionInDerivation_ = function reportExceptionInDerivation_(error) {\n var _this = this;\n if (this.errorHandler_) {\n this.errorHandler_(error, this);\n return;\n }\n if (globalState.disableErrorBoundaries) {\n throw error;\n }\n var message = process.env.NODE_ENV !== \"production\" ? \"[mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: '\" + this + \"'\" : \"[mobx] uncaught error in '\" + this + \"'\";\n if (!globalState.suppressReactionErrors) {\n console.error(message, error);\n /** If debugging brought you here, please, read the above message :-). Tnx! */\n } else if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[mobx] (error in reaction '\" + this.name_ + \"' suppressed, fix error of causing action below)\");\n } // prettier-ignore\n if (process.env.NODE_ENV !== \"production\" && isSpyEnabled()) {\n spyReport({\n type: \"error\",\n name: this.name_,\n message: message,\n error: \"\" + error\n });\n }\n globalState.globalReactionErrorHandlers.forEach(function (f) {\n return f(error, _this);\n });\n };\n _proto.dispose = function dispose() {\n if (!this.isDisposed_) {\n this.isDisposed_ = true;\n if (!this.isRunning_) {\n // if disposed while running, clean up later. Maybe not optimal, but rare case\n startBatch();\n clearObserving(this);\n endBatch();\n }\n }\n };\n _proto.getDisposer_ = function getDisposer_(abortSignal) {\n var _this2 = this;\n var dispose = function dispose() {\n _this2.dispose();\n abortSignal == null ? void 0 : abortSignal.removeEventListener == null ? void 0 : abortSignal.removeEventListener(\"abort\", dispose);\n };\n abortSignal == null ? void 0 : abortSignal.addEventListener == null ? void 0 : abortSignal.addEventListener(\"abort\", dispose);\n dispose[$mobx] = this;\n return dispose;\n };\n _proto.toString = function toString() {\n return \"Reaction[\" + this.name_ + \"]\";\n };\n _proto.trace = function trace$1(enterBreakPoint) {\n if (enterBreakPoint === void 0) {\n enterBreakPoint = false;\n }\n trace(this, enterBreakPoint);\n };\n return Reaction;\n}();\nfunction onReactionError(handler) {\n globalState.globalReactionErrorHandlers.push(handler);\n return function () {\n var idx = globalState.globalReactionErrorHandlers.indexOf(handler);\n if (idx >= 0) {\n globalState.globalReactionErrorHandlers.splice(idx, 1);\n }\n };\n}\n/**\n * Magic number alert!\n * Defines within how many times a reaction is allowed to re-trigger itself\n * until it is assumed that this is gonna be a never ending loop...\n */\nvar MAX_REACTION_ITERATIONS = 100;\nvar reactionScheduler = function reactionScheduler(f) {\n return f();\n};\nfunction runReactions() {\n // Trampolining, if runReactions are already running, new reactions will be picked up\n if (globalState.inBatch > 0 || globalState.isRunningReactions) {\n return;\n }\n reactionScheduler(runReactionsHelper);\n}\nfunction runReactionsHelper() {\n globalState.isRunningReactions = true;\n var allReactions = globalState.pendingReactions;\n var iterations = 0;\n // While running reactions, new reactions might be triggered.\n // Hence we work with two variables and check whether\n // we converge to no remaining reactions after a while.\n while (allReactions.length > 0) {\n if (++iterations === MAX_REACTION_ITERATIONS) {\n console.error(process.env.NODE_ENV !== \"production\" ? \"Reaction doesn't converge to a stable state after \" + MAX_REACTION_ITERATIONS + \" iterations.\" + (\" Probably there is a cycle in the reactive function: \" + allReactions[0]) : \"[mobx] cycle in reaction: \" + allReactions[0]);\n allReactions.splice(0); // clear reactions\n }\n\n var remainingReactions = allReactions.splice(0);\n for (var i = 0, l = remainingReactions.length; i < l; i++) {\n remainingReactions[i].runReaction_();\n }\n }\n globalState.isRunningReactions = false;\n}\nvar isReaction = /*#__PURE__*/createInstanceofPredicate(\"Reaction\", Reaction);\nfunction setReactionScheduler(fn) {\n var baseScheduler = reactionScheduler;\n reactionScheduler = function reactionScheduler(f) {\n return fn(function () {\n return baseScheduler(f);\n });\n };\n}\n\nfunction isSpyEnabled() {\n return process.env.NODE_ENV !== \"production\" && !!globalState.spyListeners.length;\n}\nfunction spyReport(event) {\n if (!(process.env.NODE_ENV !== \"production\")) {\n return;\n } // dead code elimination can do the rest\n if (!globalState.spyListeners.length) {\n return;\n }\n var listeners = globalState.spyListeners;\n for (var i = 0, l = listeners.length; i < l; i++) {\n listeners[i](event);\n }\n}\nfunction spyReportStart(event) {\n if (!(process.env.NODE_ENV !== \"production\")) {\n return;\n }\n var change = _extends({}, event, {\n spyReportStart: true\n });\n spyReport(change);\n}\nvar END_EVENT = {\n type: \"report-end\",\n spyReportEnd: true\n};\nfunction spyReportEnd(change) {\n if (!(process.env.NODE_ENV !== \"production\")) {\n return;\n }\n if (change) {\n spyReport(_extends({}, change, {\n type: \"report-end\",\n spyReportEnd: true\n }));\n } else {\n spyReport(END_EVENT);\n }\n}\nfunction spy(listener) {\n if (!(process.env.NODE_ENV !== \"production\")) {\n console.warn(\"[mobx.spy] Is a no-op in production builds\");\n return function () {};\n } else {\n globalState.spyListeners.push(listener);\n return once(function () {\n globalState.spyListeners = globalState.spyListeners.filter(function (l) {\n return l !== listener;\n });\n });\n }\n}\n\nvar ACTION = \"action\";\nvar ACTION_BOUND = \"action.bound\";\nvar AUTOACTION = \"autoAction\";\nvar AUTOACTION_BOUND = \"autoAction.bound\";\nvar DEFAULT_ACTION_NAME = \"\";\nvar actionAnnotation = /*#__PURE__*/createActionAnnotation(ACTION);\nvar actionBoundAnnotation = /*#__PURE__*/createActionAnnotation(ACTION_BOUND, {\n bound: true\n});\nvar autoActionAnnotation = /*#__PURE__*/createActionAnnotation(AUTOACTION, {\n autoAction: true\n});\nvar autoActionBoundAnnotation = /*#__PURE__*/createActionAnnotation(AUTOACTION_BOUND, {\n autoAction: true,\n bound: true\n});\nfunction createActionFactory(autoAction) {\n var res = function action(arg1, arg2) {\n // action(fn() {})\n if (isFunction(arg1)) {\n return createAction(arg1.name || DEFAULT_ACTION_NAME, arg1, autoAction);\n }\n // action(\"name\", fn() {})\n if (isFunction(arg2)) {\n return createAction(arg1, arg2, autoAction);\n }\n // @action (2022.3 Decorators)\n if (is20223Decorator(arg2)) {\n return (autoAction ? autoActionAnnotation : actionAnnotation).decorate_20223_(arg1, arg2);\n }\n // @action\n if (isStringish(arg2)) {\n return storeAnnotation(arg1, arg2, autoAction ? autoActionAnnotation : actionAnnotation);\n }\n // action(\"name\") & @action(\"name\")\n if (isStringish(arg1)) {\n return createDecoratorAnnotation(createActionAnnotation(autoAction ? AUTOACTION : ACTION, {\n name: arg1,\n autoAction: autoAction\n }));\n }\n if (process.env.NODE_ENV !== \"production\") {\n die(\"Invalid arguments for `action`\");\n }\n };\n return res;\n}\nvar action = /*#__PURE__*/createActionFactory(false);\nObject.assign(action, actionAnnotation);\nvar autoAction = /*#__PURE__*/createActionFactory(true);\nObject.assign(autoAction, autoActionAnnotation);\naction.bound = /*#__PURE__*/createDecoratorAnnotation(actionBoundAnnotation);\nautoAction.bound = /*#__PURE__*/createDecoratorAnnotation(autoActionBoundAnnotation);\nfunction runInAction(fn) {\n return executeAction(fn.name || DEFAULT_ACTION_NAME, false, fn, this, undefined);\n}\nfunction isAction(thing) {\n return isFunction(thing) && thing.isMobxAction === true;\n}\n\n/**\n * Creates a named reactive view and keeps it alive, so that the view is always\n * updated if one of the dependencies changes, even when the view is not further used by something else.\n * @param view The reactive view\n * @returns disposer function, which can be used to stop the view from being updated in the future.\n */\nfunction autorun(view, opts) {\n var _opts$name, _opts, _opts2, _opts2$signal, _opts3;\n if (opts === void 0) {\n opts = EMPTY_OBJECT;\n }\n if (process.env.NODE_ENV !== \"production\") {\n if (!isFunction(view)) {\n die(\"Autorun expects a function as first argument\");\n }\n if (isAction(view)) {\n die(\"Autorun does not accept actions since actions are untrackable\");\n }\n }\n var name = (_opts$name = (_opts = opts) == null ? void 0 : _opts.name) != null ? _opts$name : process.env.NODE_ENV !== \"production\" ? view.name || \"Autorun@\" + getNextId() : \"Autorun\";\n var runSync = !opts.scheduler && !opts.delay;\n var reaction;\n if (runSync) {\n // normal autorun\n reaction = new Reaction(name, function () {\n this.track(reactionRunner);\n }, opts.onError, opts.requiresObservable);\n } else {\n var scheduler = createSchedulerFromOptions(opts);\n // debounced autorun\n var isScheduled = false;\n reaction = new Reaction(name, function () {\n if (!isScheduled) {\n isScheduled = true;\n scheduler(function () {\n isScheduled = false;\n if (!reaction.isDisposed_) {\n reaction.track(reactionRunner);\n }\n });\n }\n }, opts.onError, opts.requiresObservable);\n }\n function reactionRunner() {\n view(reaction);\n }\n if (!((_opts2 = opts) != null && (_opts2$signal = _opts2.signal) != null && _opts2$signal.aborted)) {\n reaction.schedule_();\n }\n return reaction.getDisposer_((_opts3 = opts) == null ? void 0 : _opts3.signal);\n}\nvar run = function run(f) {\n return f();\n};\nfunction createSchedulerFromOptions(opts) {\n return opts.scheduler ? opts.scheduler : opts.delay ? function (f) {\n return setTimeout(f, opts.delay);\n } : run;\n}\nfunction reaction(expression, effect, opts) {\n var _opts$name2, _opts4, _opts4$signal, _opts5;\n if (opts === void 0) {\n opts = EMPTY_OBJECT;\n }\n if (process.env.NODE_ENV !== \"production\") {\n if (!isFunction(expression) || !isFunction(effect)) {\n die(\"First and second argument to reaction should be functions\");\n }\n if (!isPlainObject(opts)) {\n die(\"Third argument of reactions should be an object\");\n }\n }\n var name = (_opts$name2 = opts.name) != null ? _opts$name2 : process.env.NODE_ENV !== \"production\" ? \"Reaction@\" + getNextId() : \"Reaction\";\n var effectAction = action(name, opts.onError ? wrapErrorHandler(opts.onError, effect) : effect);\n var runSync = !opts.scheduler && !opts.delay;\n var scheduler = createSchedulerFromOptions(opts);\n var firstTime = true;\n var isScheduled = false;\n var value;\n var oldValue;\n var equals = opts.compareStructural ? comparer.structural : opts.equals || comparer[\"default\"];\n var r = new Reaction(name, function () {\n if (firstTime || runSync) {\n reactionRunner();\n } else if (!isScheduled) {\n isScheduled = true;\n scheduler(reactionRunner);\n }\n }, opts.onError, opts.requiresObservable);\n function reactionRunner() {\n isScheduled = false;\n if (r.isDisposed_) {\n return;\n }\n var changed = false;\n r.track(function () {\n var nextValue = allowStateChanges(false, function () {\n return expression(r);\n });\n changed = firstTime || !equals(value, nextValue);\n oldValue = value;\n value = nextValue;\n });\n if (firstTime && opts.fireImmediately) {\n effectAction(value, oldValue, r);\n } else if (!firstTime && changed) {\n effectAction(value, oldValue, r);\n }\n firstTime = false;\n }\n if (!((_opts4 = opts) != null && (_opts4$signal = _opts4.signal) != null && _opts4$signal.aborted)) {\n r.schedule_();\n }\n return r.getDisposer_((_opts5 = opts) == null ? void 0 : _opts5.signal);\n}\nfunction wrapErrorHandler(errorHandler, baseFn) {\n return function () {\n try {\n return baseFn.apply(this, arguments);\n } catch (e) {\n errorHandler.call(this, e);\n }\n };\n}\n\nvar ON_BECOME_OBSERVED = \"onBO\";\nvar ON_BECOME_UNOBSERVED = \"onBUO\";\nfunction onBecomeObserved(thing, arg2, arg3) {\n return interceptHook(ON_BECOME_OBSERVED, thing, arg2, arg3);\n}\nfunction onBecomeUnobserved(thing, arg2, arg3) {\n return interceptHook(ON_BECOME_UNOBSERVED, thing, arg2, arg3);\n}\nfunction interceptHook(hook, thing, arg2, arg3) {\n var atom = typeof arg3 === \"function\" ? getAtom(thing, arg2) : getAtom(thing);\n var cb = isFunction(arg3) ? arg3 : arg2;\n var listenersKey = hook + \"L\";\n if (atom[listenersKey]) {\n atom[listenersKey].add(cb);\n } else {\n atom[listenersKey] = new Set([cb]);\n }\n return function () {\n var hookListeners = atom[listenersKey];\n if (hookListeners) {\n hookListeners[\"delete\"](cb);\n if (hookListeners.size === 0) {\n delete atom[listenersKey];\n }\n }\n };\n}\n\nvar NEVER = \"never\";\nvar ALWAYS = \"always\";\nvar OBSERVED = \"observed\";\n// const IF_AVAILABLE = \"ifavailable\"\nfunction configure(options) {\n if (options.isolateGlobalState === true) {\n isolateGlobalState();\n }\n var useProxies = options.useProxies,\n enforceActions = options.enforceActions;\n if (useProxies !== undefined) {\n globalState.useProxies = useProxies === ALWAYS ? true : useProxies === NEVER ? false : typeof Proxy !== \"undefined\";\n }\n if (useProxies === \"ifavailable\") {\n globalState.verifyProxies = true;\n }\n if (enforceActions !== undefined) {\n var ea = enforceActions === ALWAYS ? ALWAYS : enforceActions === OBSERVED;\n globalState.enforceActions = ea;\n globalState.allowStateChanges = ea === true || ea === ALWAYS ? false : true;\n }\n [\"computedRequiresReaction\", \"reactionRequiresObservable\", \"observableRequiresReaction\", \"disableErrorBoundaries\", \"safeDescriptors\"].forEach(function (key) {\n if (key in options) {\n globalState[key] = !!options[key];\n }\n });\n globalState.allowStateReads = !globalState.observableRequiresReaction;\n if (process.env.NODE_ENV !== \"production\" && globalState.disableErrorBoundaries === true) {\n console.warn(\"WARNING: Debug feature only. MobX will NOT recover from errors when `disableErrorBoundaries` is enabled.\");\n }\n if (options.reactionScheduler) {\n setReactionScheduler(options.reactionScheduler);\n }\n}\n\nfunction extendObservable(target, properties, annotations, options) {\n if (process.env.NODE_ENV !== \"production\") {\n if (arguments.length > 4) {\n die(\"'extendObservable' expected 2-4 arguments\");\n }\n if (typeof target !== \"object\") {\n die(\"'extendObservable' expects an object as first argument\");\n }\n if (isObservableMap(target)) {\n die(\"'extendObservable' should not be used on maps, use map.merge instead\");\n }\n if (!isPlainObject(properties)) {\n die(\"'extendObservable' only accepts plain objects as second argument\");\n }\n if (isObservable(properties) || isObservable(annotations)) {\n die(\"Extending an object with another observable (object) is not supported\");\n }\n }\n // Pull descriptors first, so we don't have to deal with props added by administration ($mobx)\n var descriptors = getOwnPropertyDescriptors(properties);\n initObservable(function () {\n var adm = asObservableObject(target, options)[$mobx];\n ownKeys(descriptors).forEach(function (key) {\n adm.extend_(key, descriptors[key],\n // must pass \"undefined\" for { key: undefined }\n !annotations ? true : key in annotations ? annotations[key] : true);\n });\n });\n return target;\n}\n\nfunction getDependencyTree(thing, property) {\n return nodeToDependencyTree(getAtom(thing, property));\n}\nfunction nodeToDependencyTree(node) {\n var result = {\n name: node.name_\n };\n if (node.observing_ && node.observing_.length > 0) {\n result.dependencies = unique(node.observing_).map(nodeToDependencyTree);\n }\n return result;\n}\nfunction getObserverTree(thing, property) {\n return nodeToObserverTree(getAtom(thing, property));\n}\nfunction nodeToObserverTree(node) {\n var result = {\n name: node.name_\n };\n if (hasObservers(node)) {\n result.observers = Array.from(getObservers(node)).map(nodeToObserverTree);\n }\n return result;\n}\nfunction unique(list) {\n return Array.from(new Set(list));\n}\n\nvar generatorId = 0;\nfunction FlowCancellationError() {\n this.message = \"FLOW_CANCELLED\";\n}\nFlowCancellationError.prototype = /*#__PURE__*/Object.create(Error.prototype);\nfunction isFlowCancellationError(error) {\n return error instanceof FlowCancellationError;\n}\nvar flowAnnotation = /*#__PURE__*/createFlowAnnotation(\"flow\");\nvar flowBoundAnnotation = /*#__PURE__*/createFlowAnnotation(\"flow.bound\", {\n bound: true\n});\nvar flow = /*#__PURE__*/Object.assign(function flow(arg1, arg2) {\n // @flow (2022.3 Decorators)\n if (is20223Decorator(arg2)) {\n return flowAnnotation.decorate_20223_(arg1, arg2);\n }\n // @flow\n if (isStringish(arg2)) {\n return storeAnnotation(arg1, arg2, flowAnnotation);\n }\n // flow(fn)\n if (process.env.NODE_ENV !== \"production\" && arguments.length !== 1) {\n die(\"Flow expects single argument with generator function\");\n }\n var generator = arg1;\n var name = generator.name || \"\";\n // Implementation based on https://github.com/tj/co/blob/master/index.js\n var res = function res() {\n var ctx = this;\n var args = arguments;\n var runId = ++generatorId;\n var gen = action(name + \" - runid: \" + runId + \" - init\", generator).apply(ctx, args);\n var rejector;\n var pendingPromise = undefined;\n var promise = new Promise(function (resolve, reject) {\n var stepId = 0;\n rejector = reject;\n function onFulfilled(res) {\n pendingPromise = undefined;\n var ret;\n try {\n ret = action(name + \" - runid: \" + runId + \" - yield \" + stepId++, gen.next).call(gen, res);\n } catch (e) {\n return reject(e);\n }\n next(ret);\n }\n function onRejected(err) {\n pendingPromise = undefined;\n var ret;\n try {\n ret = action(name + \" - runid: \" + runId + \" - yield \" + stepId++, gen[\"throw\"]).call(gen, err);\n } catch (e) {\n return reject(e);\n }\n next(ret);\n }\n function next(ret) {\n if (isFunction(ret == null ? void 0 : ret.then)) {\n // an async iterator\n ret.then(next, reject);\n return;\n }\n if (ret.done) {\n return resolve(ret.value);\n }\n pendingPromise = Promise.resolve(ret.value);\n return pendingPromise.then(onFulfilled, onRejected);\n }\n onFulfilled(undefined); // kick off the process\n });\n\n promise.cancel = action(name + \" - runid: \" + runId + \" - cancel\", function () {\n try {\n if (pendingPromise) {\n cancelPromise(pendingPromise);\n }\n // Finally block can return (or yield) stuff..\n var _res = gen[\"return\"](undefined);\n // eat anything that promise would do, it's cancelled!\n var yieldedPromise = Promise.resolve(_res.value);\n yieldedPromise.then(noop, noop);\n cancelPromise(yieldedPromise); // maybe it can be cancelled :)\n // reject our original promise\n rejector(new FlowCancellationError());\n } catch (e) {\n rejector(e); // there could be a throwing finally block\n }\n });\n\n return promise;\n };\n res.isMobXFlow = true;\n return res;\n}, flowAnnotation);\nflow.bound = /*#__PURE__*/createDecoratorAnnotation(flowBoundAnnotation);\nfunction cancelPromise(promise) {\n if (isFunction(promise.cancel)) {\n promise.cancel();\n }\n}\nfunction flowResult(result) {\n return result; // just tricking TypeScript :)\n}\n\nfunction isFlow(fn) {\n return (fn == null ? void 0 : fn.isMobXFlow) === true;\n}\n\nfunction interceptReads(thing, propOrHandler, handler) {\n var target;\n if (isObservableMap(thing) || isObservableArray(thing) || isObservableValue(thing)) {\n target = getAdministration(thing);\n } else if (isObservableObject(thing)) {\n if (process.env.NODE_ENV !== \"production\" && !isStringish(propOrHandler)) {\n return die(\"InterceptReads can only be used with a specific property, not with an object in general\");\n }\n target = getAdministration(thing, propOrHandler);\n } else if (process.env.NODE_ENV !== \"production\") {\n return die(\"Expected observable map, object or array as first array\");\n }\n if (process.env.NODE_ENV !== \"production\" && target.dehancer !== undefined) {\n return die(\"An intercept reader was already established\");\n }\n target.dehancer = typeof propOrHandler === \"function\" ? propOrHandler : handler;\n return function () {\n target.dehancer = undefined;\n };\n}\n\nfunction intercept(thing, propOrHandler, handler) {\n if (isFunction(handler)) {\n return interceptProperty(thing, propOrHandler, handler);\n } else {\n return interceptInterceptable(thing, propOrHandler);\n }\n}\nfunction interceptInterceptable(thing, handler) {\n return getAdministration(thing).intercept_(handler);\n}\nfunction interceptProperty(thing, property, handler) {\n return getAdministration(thing, property).intercept_(handler);\n}\n\nfunction _isComputed(value, property) {\n if (property === undefined) {\n return isComputedValue(value);\n }\n if (isObservableObject(value) === false) {\n return false;\n }\n if (!value[$mobx].values_.has(property)) {\n return false;\n }\n var atom = getAtom(value, property);\n return isComputedValue(atom);\n}\nfunction isComputed(value) {\n if (process.env.NODE_ENV !== \"production\" && arguments.length > 1) {\n return die(\"isComputed expects only 1 argument. Use isComputedProp to inspect the observability of a property\");\n }\n return _isComputed(value);\n}\nfunction isComputedProp(value, propName) {\n if (process.env.NODE_ENV !== \"production\" && !isStringish(propName)) {\n return die(\"isComputed expected a property name as second argument\");\n }\n return _isComputed(value, propName);\n}\n\nfunction _isObservable(value, property) {\n if (!value) {\n return false;\n }\n if (property !== undefined) {\n if (process.env.NODE_ENV !== \"production\" && (isObservableMap(value) || isObservableArray(value))) {\n return die(\"isObservable(object, propertyName) is not supported for arrays and maps. Use map.has or array.length instead.\");\n }\n if (isObservableObject(value)) {\n return value[$mobx].values_.has(property);\n }\n return false;\n }\n // For first check, see #701\n return isObservableObject(value) || !!value[$mobx] || isAtom(value) || isReaction(value) || isComputedValue(value);\n}\nfunction isObservable(value) {\n if (process.env.NODE_ENV !== \"production\" && arguments.length !== 1) {\n die(\"isObservable expects only 1 argument. Use isObservableProp to inspect the observability of a property\");\n }\n return _isObservable(value);\n}\nfunction isObservableProp(value, propName) {\n if (process.env.NODE_ENV !== \"production\" && !isStringish(propName)) {\n return die(\"expected a property name as second argument\");\n }\n return _isObservable(value, propName);\n}\n\nfunction keys(obj) {\n if (isObservableObject(obj)) {\n return obj[$mobx].keys_();\n }\n if (isObservableMap(obj) || isObservableSet(obj)) {\n return Array.from(obj.keys());\n }\n if (isObservableArray(obj)) {\n return obj.map(function (_, index) {\n return index;\n });\n }\n die(5);\n}\nfunction values(obj) {\n if (isObservableObject(obj)) {\n return keys(obj).map(function (key) {\n return obj[key];\n });\n }\n if (isObservableMap(obj)) {\n return keys(obj).map(function (key) {\n return obj.get(key);\n });\n }\n if (isObservableSet(obj)) {\n return Array.from(obj.values());\n }\n if (isObservableArray(obj)) {\n return obj.slice();\n }\n die(6);\n}\nfunction entries(obj) {\n if (isObservableObject(obj)) {\n return keys(obj).map(function (key) {\n return [key, obj[key]];\n });\n }\n if (isObservableMap(obj)) {\n return keys(obj).map(function (key) {\n return [key, obj.get(key)];\n });\n }\n if (isObservableSet(obj)) {\n return Array.from(obj.entries());\n }\n if (isObservableArray(obj)) {\n return obj.map(function (key, index) {\n return [index, key];\n });\n }\n die(7);\n}\nfunction set(obj, key, value) {\n if (arguments.length === 2 && !isObservableSet(obj)) {\n startBatch();\n var _values = key;\n try {\n for (var _key in _values) {\n set(obj, _key, _values[_key]);\n }\n } finally {\n endBatch();\n }\n return;\n }\n if (isObservableObject(obj)) {\n obj[$mobx].set_(key, value);\n } else if (isObservableMap(obj)) {\n obj.set(key, value);\n } else if (isObservableSet(obj)) {\n obj.add(key);\n } else if (isObservableArray(obj)) {\n if (typeof key !== \"number\") {\n key = parseInt(key, 10);\n }\n if (key < 0) {\n die(\"Invalid index: '\" + key + \"'\");\n }\n startBatch();\n if (key >= obj.length) {\n obj.length = key + 1;\n }\n obj[key] = value;\n endBatch();\n } else {\n die(8);\n }\n}\nfunction remove(obj, key) {\n if (isObservableObject(obj)) {\n obj[$mobx].delete_(key);\n } else if (isObservableMap(obj)) {\n obj[\"delete\"](key);\n } else if (isObservableSet(obj)) {\n obj[\"delete\"](key);\n } else if (isObservableArray(obj)) {\n if (typeof key !== \"number\") {\n key = parseInt(key, 10);\n }\n obj.splice(key, 1);\n } else {\n die(9);\n }\n}\nfunction has(obj, key) {\n if (isObservableObject(obj)) {\n return obj[$mobx].has_(key);\n } else if (isObservableMap(obj)) {\n return obj.has(key);\n } else if (isObservableSet(obj)) {\n return obj.has(key);\n } else if (isObservableArray(obj)) {\n return key >= 0 && key < obj.length;\n }\n die(10);\n}\nfunction get(obj, key) {\n if (!has(obj, key)) {\n return undefined;\n }\n if (isObservableObject(obj)) {\n return obj[$mobx].get_(key);\n } else if (isObservableMap(obj)) {\n return obj.get(key);\n } else if (isObservableArray(obj)) {\n return obj[key];\n }\n die(11);\n}\nfunction apiDefineProperty(obj, key, descriptor) {\n if (isObservableObject(obj)) {\n return obj[$mobx].defineProperty_(key, descriptor);\n }\n die(39);\n}\nfunction apiOwnKeys(obj) {\n if (isObservableObject(obj)) {\n return obj[$mobx].ownKeys_();\n }\n die(38);\n}\n\nfunction observe(thing, propOrCb, cbOrFire, fireImmediately) {\n if (isFunction(cbOrFire)) {\n return observeObservableProperty(thing, propOrCb, cbOrFire, fireImmediately);\n } else {\n return observeObservable(thing, propOrCb, cbOrFire);\n }\n}\nfunction observeObservable(thing, listener, fireImmediately) {\n return getAdministration(thing).observe_(listener, fireImmediately);\n}\nfunction observeObservableProperty(thing, property, listener, fireImmediately) {\n return getAdministration(thing, property).observe_(listener, fireImmediately);\n}\n\nfunction cache(map, key, value) {\n map.set(key, value);\n return value;\n}\nfunction toJSHelper(source, __alreadySeen) {\n if (source == null || typeof source !== \"object\" || source instanceof Date || !isObservable(source)) {\n return source;\n }\n if (isObservableValue(source) || isComputedValue(source)) {\n return toJSHelper(source.get(), __alreadySeen);\n }\n if (__alreadySeen.has(source)) {\n return __alreadySeen.get(source);\n }\n if (isObservableArray(source)) {\n var res = cache(__alreadySeen, source, new Array(source.length));\n source.forEach(function (value, idx) {\n res[idx] = toJSHelper(value, __alreadySeen);\n });\n return res;\n }\n if (isObservableSet(source)) {\n var _res = cache(__alreadySeen, source, new Set());\n source.forEach(function (value) {\n _res.add(toJSHelper(value, __alreadySeen));\n });\n return _res;\n }\n if (isObservableMap(source)) {\n var _res2 = cache(__alreadySeen, source, new Map());\n source.forEach(function (value, key) {\n _res2.set(key, toJSHelper(value, __alreadySeen));\n });\n return _res2;\n } else {\n // must be observable object\n var _res3 = cache(__alreadySeen, source, {});\n apiOwnKeys(source).forEach(function (key) {\n if (objectPrototype.propertyIsEnumerable.call(source, key)) {\n _res3[key] = toJSHelper(source[key], __alreadySeen);\n }\n });\n return _res3;\n }\n}\n/**\n * Recursively converts an observable to it's non-observable native counterpart.\n * It does NOT recurse into non-observables, these are left as they are, even if they contain observables.\n * Computed and other non-enumerable properties are completely ignored.\n * Complex scenarios require custom solution, eg implementing `toJSON` or using `serializr` lib.\n */\nfunction toJS(source, options) {\n if (process.env.NODE_ENV !== \"production\" && options) {\n die(\"toJS no longer supports options\");\n }\n return toJSHelper(source, new Map());\n}\n\nfunction trace() {\n if (!(process.env.NODE_ENV !== \"production\")) {\n return;\n }\n var enterBreakPoint = false;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (typeof args[args.length - 1] === \"boolean\") {\n enterBreakPoint = args.pop();\n }\n var derivation = getAtomFromArgs(args);\n if (!derivation) {\n return die(\"'trace(break?)' can only be used inside a tracked computed value or a Reaction. Consider passing in the computed value or reaction explicitly\");\n }\n if (derivation.isTracing_ === TraceMode.NONE) {\n console.log(\"[mobx.trace] '\" + derivation.name_ + \"' tracing enabled\");\n }\n derivation.isTracing_ = enterBreakPoint ? TraceMode.BREAK : TraceMode.LOG;\n}\nfunction getAtomFromArgs(args) {\n switch (args.length) {\n case 0:\n return globalState.trackingDerivation;\n case 1:\n return getAtom(args[0]);\n case 2:\n return getAtom(args[0], args[1]);\n }\n}\n\n/**\n * During a transaction no views are updated until the end of the transaction.\n * The transaction will be run synchronously nonetheless.\n *\n * @param action a function that updates some reactive state\n * @returns any value that was returned by the 'action' parameter.\n */\nfunction transaction(action, thisArg) {\n if (thisArg === void 0) {\n thisArg = undefined;\n }\n startBatch();\n try {\n return action.apply(thisArg);\n } finally {\n endBatch();\n }\n}\n\nfunction when(predicate, arg1, arg2) {\n if (arguments.length === 1 || arg1 && typeof arg1 === \"object\") {\n return whenPromise(predicate, arg1);\n }\n return _when(predicate, arg1, arg2 || {});\n}\nfunction _when(predicate, effect, opts) {\n var timeoutHandle;\n if (typeof opts.timeout === \"number\") {\n var error = new Error(\"WHEN_TIMEOUT\");\n timeoutHandle = setTimeout(function () {\n if (!disposer[$mobx].isDisposed_) {\n disposer();\n if (opts.onError) {\n opts.onError(error);\n } else {\n throw error;\n }\n }\n }, opts.timeout);\n }\n opts.name = process.env.NODE_ENV !== \"production\" ? opts.name || \"When@\" + getNextId() : \"When\";\n var effectAction = createAction(process.env.NODE_ENV !== \"production\" ? opts.name + \"-effect\" : \"When-effect\", effect);\n // eslint-disable-next-line\n var disposer = autorun(function (r) {\n // predicate should not change state\n var cond = allowStateChanges(false, predicate);\n if (cond) {\n r.dispose();\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n effectAction();\n }\n }, opts);\n return disposer;\n}\nfunction whenPromise(predicate, opts) {\n var _opts$signal;\n if (process.env.NODE_ENV !== \"production\" && opts && opts.onError) {\n return die(\"the options 'onError' and 'promise' cannot be combined\");\n }\n if (opts != null && (_opts$signal = opts.signal) != null && _opts$signal.aborted) {\n return Object.assign(Promise.reject(new Error(\"WHEN_ABORTED\")), {\n cancel: function cancel() {\n return null;\n }\n });\n }\n var cancel;\n var abort;\n var res = new Promise(function (resolve, reject) {\n var _opts$signal2;\n var disposer = _when(predicate, resolve, _extends({}, opts, {\n onError: reject\n }));\n cancel = function cancel() {\n disposer();\n reject(new Error(\"WHEN_CANCELLED\"));\n };\n abort = function abort() {\n disposer();\n reject(new Error(\"WHEN_ABORTED\"));\n };\n opts == null ? void 0 : (_opts$signal2 = opts.signal) == null ? void 0 : _opts$signal2.addEventListener == null ? void 0 : _opts$signal2.addEventListener(\"abort\", abort);\n })[\"finally\"](function () {\n var _opts$signal3;\n return opts == null ? void 0 : (_opts$signal3 = opts.signal) == null ? void 0 : _opts$signal3.removeEventListener == null ? void 0 : _opts$signal3.removeEventListener(\"abort\", abort);\n });\n res.cancel = cancel;\n return res;\n}\n\nfunction getAdm(target) {\n return target[$mobx];\n}\n// Optimization: we don't need the intermediate objects and could have a completely custom administration for DynamicObjects,\n// and skip either the internal values map, or the base object with its property descriptors!\nvar objectProxyTraps = {\n has: function has(target, name) {\n if (process.env.NODE_ENV !== \"production\" && globalState.trackingDerivation) {\n warnAboutProxyRequirement(\"detect new properties using the 'in' operator. Use 'has' from 'mobx' instead.\");\n }\n return getAdm(target).has_(name);\n },\n get: function get(target, name) {\n return getAdm(target).get_(name);\n },\n set: function set(target, name, value) {\n var _getAdm$set_;\n if (!isStringish(name)) {\n return false;\n }\n if (process.env.NODE_ENV !== \"production\" && !getAdm(target).values_.has(name)) {\n warnAboutProxyRequirement(\"add a new observable property through direct assignment. Use 'set' from 'mobx' instead.\");\n }\n // null (intercepted) -> true (success)\n return (_getAdm$set_ = getAdm(target).set_(name, value, true)) != null ? _getAdm$set_ : true;\n },\n deleteProperty: function deleteProperty(target, name) {\n var _getAdm$delete_;\n if (process.env.NODE_ENV !== \"production\") {\n warnAboutProxyRequirement(\"delete properties from an observable object. Use 'remove' from 'mobx' instead.\");\n }\n if (!isStringish(name)) {\n return false;\n }\n // null (intercepted) -> true (success)\n return (_getAdm$delete_ = getAdm(target).delete_(name, true)) != null ? _getAdm$delete_ : true;\n },\n defineProperty: function defineProperty(target, name, descriptor) {\n var _getAdm$definePropert;\n if (process.env.NODE_ENV !== \"production\") {\n warnAboutProxyRequirement(\"define property on an observable object. Use 'defineProperty' from 'mobx' instead.\");\n }\n // null (intercepted) -> true (success)\n return (_getAdm$definePropert = getAdm(target).defineProperty_(name, descriptor)) != null ? _getAdm$definePropert : true;\n },\n ownKeys: function ownKeys(target) {\n if (process.env.NODE_ENV !== \"production\" && globalState.trackingDerivation) {\n warnAboutProxyRequirement(\"iterate keys to detect added / removed properties. Use 'keys' from 'mobx' instead.\");\n }\n return getAdm(target).ownKeys_();\n },\n preventExtensions: function preventExtensions(target) {\n die(13);\n }\n};\nfunction asDynamicObservableObject(target, options) {\n var _target$$mobx, _target$$mobx$proxy_;\n assertProxies();\n target = asObservableObject(target, options);\n return (_target$$mobx$proxy_ = (_target$$mobx = target[$mobx]).proxy_) != null ? _target$$mobx$proxy_ : _target$$mobx.proxy_ = new Proxy(target, objectProxyTraps);\n}\n\nfunction hasInterceptors(interceptable) {\n return interceptable.interceptors_ !== undefined && interceptable.interceptors_.length > 0;\n}\nfunction registerInterceptor(interceptable, handler) {\n var interceptors = interceptable.interceptors_ || (interceptable.interceptors_ = []);\n interceptors.push(handler);\n return once(function () {\n var idx = interceptors.indexOf(handler);\n if (idx !== -1) {\n interceptors.splice(idx, 1);\n }\n });\n}\nfunction interceptChange(interceptable, change) {\n var prevU = untrackedStart();\n try {\n // Interceptor can modify the array, copy it to avoid concurrent modification, see #1950\n var interceptors = [].concat(interceptable.interceptors_ || []);\n for (var i = 0, l = interceptors.length; i < l; i++) {\n change = interceptors[i](change);\n if (change && !change.type) {\n die(14);\n }\n if (!change) {\n break;\n }\n }\n return change;\n } finally {\n untrackedEnd(prevU);\n }\n}\n\nfunction hasListeners(listenable) {\n return listenable.changeListeners_ !== undefined && listenable.changeListeners_.length > 0;\n}\nfunction registerListener(listenable, handler) {\n var listeners = listenable.changeListeners_ || (listenable.changeListeners_ = []);\n listeners.push(handler);\n return once(function () {\n var idx = listeners.indexOf(handler);\n if (idx !== -1) {\n listeners.splice(idx, 1);\n }\n });\n}\nfunction notifyListeners(listenable, change) {\n var prevU = untrackedStart();\n var listeners = listenable.changeListeners_;\n if (!listeners) {\n return;\n }\n listeners = listeners.slice();\n for (var i = 0, l = listeners.length; i < l; i++) {\n listeners[i](change);\n }\n untrackedEnd(prevU);\n}\n\nfunction makeObservable(target, annotations, options) {\n initObservable(function () {\n var _annotations;\n var adm = asObservableObject(target, options)[$mobx];\n if (process.env.NODE_ENV !== \"production\" && annotations && target[storedAnnotationsSymbol]) {\n die(\"makeObservable second arg must be nullish when using decorators. Mixing @decorator syntax with annotations is not supported.\");\n }\n // Default to decorators\n (_annotations = annotations) != null ? _annotations : annotations = collectStoredAnnotations(target);\n // Annotate\n ownKeys(annotations).forEach(function (key) {\n return adm.make_(key, annotations[key]);\n });\n });\n return target;\n}\n// proto[keysSymbol] = new Set()\nvar keysSymbol = /*#__PURE__*/Symbol(\"mobx-keys\");\nfunction makeAutoObservable(target, overrides, options) {\n if (process.env.NODE_ENV !== \"production\") {\n if (!isPlainObject(target) && !isPlainObject(Object.getPrototypeOf(target))) {\n die(\"'makeAutoObservable' can only be used for classes that don't have a superclass\");\n }\n if (isObservableObject(target)) {\n die(\"makeAutoObservable can only be used on objects not already made observable\");\n }\n }\n // Optimization: avoid visiting protos\n // Assumes that annotation.make_/.extend_ works the same for plain objects\n if (isPlainObject(target)) {\n return extendObservable(target, target, overrides, options);\n }\n initObservable(function () {\n var adm = asObservableObject(target, options)[$mobx];\n // Optimization: cache keys on proto\n // Assumes makeAutoObservable can be called only once per object and can't be used in subclass\n if (!target[keysSymbol]) {\n var proto = Object.getPrototypeOf(target);\n var keys = new Set([].concat(ownKeys(target), ownKeys(proto)));\n keys[\"delete\"](\"constructor\");\n keys[\"delete\"]($mobx);\n addHiddenProp(proto, keysSymbol, keys);\n }\n target[keysSymbol].forEach(function (key) {\n return adm.make_(key,\n // must pass \"undefined\" for { key: undefined }\n !overrides ? true : key in overrides ? overrides[key] : true);\n });\n });\n return target;\n}\n\nvar SPLICE = \"splice\";\nvar UPDATE = \"update\";\nvar MAX_SPLICE_SIZE = 10000; // See e.g. https://github.com/mobxjs/mobx/issues/859\nvar arrayTraps = {\n get: function get(target, name) {\n var adm = target[$mobx];\n if (name === $mobx) {\n return adm;\n }\n if (name === \"length\") {\n return adm.getArrayLength_();\n }\n if (typeof name === \"string\" && !isNaN(name)) {\n return adm.get_(parseInt(name));\n }\n if (hasProp(arrayExtensions, name)) {\n return arrayExtensions[name];\n }\n return target[name];\n },\n set: function set(target, name, value) {\n var adm = target[$mobx];\n if (name === \"length\") {\n adm.setArrayLength_(value);\n }\n if (typeof name === \"symbol\" || isNaN(name)) {\n target[name] = value;\n } else {\n // numeric string\n adm.set_(parseInt(name), value);\n }\n return true;\n },\n preventExtensions: function preventExtensions() {\n die(15);\n }\n};\nvar ObservableArrayAdministration = /*#__PURE__*/function () {\n // this is the prop that gets proxied, so can't replace it!\n\n function ObservableArrayAdministration(name, enhancer, owned_, legacyMode_) {\n if (name === void 0) {\n name = process.env.NODE_ENV !== \"production\" ? \"ObservableArray@\" + getNextId() : \"ObservableArray\";\n }\n this.owned_ = void 0;\n this.legacyMode_ = void 0;\n this.atom_ = void 0;\n this.values_ = [];\n this.interceptors_ = void 0;\n this.changeListeners_ = void 0;\n this.enhancer_ = void 0;\n this.dehancer = void 0;\n this.proxy_ = void 0;\n this.lastKnownLength_ = 0;\n this.owned_ = owned_;\n this.legacyMode_ = legacyMode_;\n this.atom_ = new Atom(name);\n this.enhancer_ = function (newV, oldV) {\n return enhancer(newV, oldV, process.env.NODE_ENV !== \"production\" ? name + \"[..]\" : \"ObservableArray[..]\");\n };\n }\n var _proto = ObservableArrayAdministration.prototype;\n _proto.dehanceValue_ = function dehanceValue_(value) {\n if (this.dehancer !== undefined) {\n return this.dehancer(value);\n }\n return value;\n };\n _proto.dehanceValues_ = function dehanceValues_(values) {\n if (this.dehancer !== undefined && values.length > 0) {\n return values.map(this.dehancer);\n }\n return values;\n };\n _proto.intercept_ = function intercept_(handler) {\n return registerInterceptor(this, handler);\n };\n _proto.observe_ = function observe_(listener, fireImmediately) {\n if (fireImmediately === void 0) {\n fireImmediately = false;\n }\n if (fireImmediately) {\n listener({\n observableKind: \"array\",\n object: this.proxy_,\n debugObjectName: this.atom_.name_,\n type: \"splice\",\n index: 0,\n added: this.values_.slice(),\n addedCount: this.values_.length,\n removed: [],\n removedCount: 0\n });\n }\n return registerListener(this, listener);\n };\n _proto.getArrayLength_ = function getArrayLength_() {\n this.atom_.reportObserved();\n return this.values_.length;\n };\n _proto.setArrayLength_ = function setArrayLength_(newLength) {\n if (typeof newLength !== \"number\" || isNaN(newLength) || newLength < 0) {\n die(\"Out of range: \" + newLength);\n }\n var currentLength = this.values_.length;\n if (newLength === currentLength) {\n return;\n } else if (newLength > currentLength) {\n var newItems = new Array(newLength - currentLength);\n for (var i = 0; i < newLength - currentLength; i++) {\n newItems[i] = undefined;\n } // No Array.fill everywhere...\n this.spliceWithArray_(currentLength, 0, newItems);\n } else {\n this.spliceWithArray_(newLength, currentLength - newLength);\n }\n };\n _proto.updateArrayLength_ = function updateArrayLength_(oldLength, delta) {\n if (oldLength !== this.lastKnownLength_) {\n die(16);\n }\n this.lastKnownLength_ += delta;\n if (this.legacyMode_ && delta > 0) {\n reserveArrayBuffer(oldLength + delta + 1);\n }\n };\n _proto.spliceWithArray_ = function spliceWithArray_(index, deleteCount, newItems) {\n var _this = this;\n checkIfStateModificationsAreAllowed(this.atom_);\n var length = this.values_.length;\n if (index === undefined) {\n index = 0;\n } else if (index > length) {\n index = length;\n } else if (index < 0) {\n index = Math.max(0, length + index);\n }\n if (arguments.length === 1) {\n deleteCount = length - index;\n } else if (deleteCount === undefined || deleteCount === null) {\n deleteCount = 0;\n } else {\n deleteCount = Math.max(0, Math.min(deleteCount, length - index));\n }\n if (newItems === undefined) {\n newItems = EMPTY_ARRAY;\n }\n if (hasInterceptors(this)) {\n var change = interceptChange(this, {\n object: this.proxy_,\n type: SPLICE,\n index: index,\n removedCount: deleteCount,\n added: newItems\n });\n if (!change) {\n return EMPTY_ARRAY;\n }\n deleteCount = change.removedCount;\n newItems = change.added;\n }\n newItems = newItems.length === 0 ? newItems : newItems.map(function (v) {\n return _this.enhancer_(v, undefined);\n });\n if (this.legacyMode_ || process.env.NODE_ENV !== \"production\") {\n var lengthDelta = newItems.length - deleteCount;\n this.updateArrayLength_(length, lengthDelta); // checks if internal array wasn't modified\n }\n\n var res = this.spliceItemsIntoValues_(index, deleteCount, newItems);\n if (deleteCount !== 0 || newItems.length !== 0) {\n this.notifyArraySplice_(index, newItems, res);\n }\n return this.dehanceValues_(res);\n };\n _proto.spliceItemsIntoValues_ = function spliceItemsIntoValues_(index, deleteCount, newItems) {\n if (newItems.length < MAX_SPLICE_SIZE) {\n var _this$values_;\n return (_this$values_ = this.values_).splice.apply(_this$values_, [index, deleteCount].concat(newItems));\n } else {\n // The items removed by the splice\n var res = this.values_.slice(index, index + deleteCount);\n // The items that that should remain at the end of the array\n var oldItems = this.values_.slice(index + deleteCount);\n // New length is the previous length + addition count - deletion count\n this.values_.length += newItems.length - deleteCount;\n for (var i = 0; i < newItems.length; i++) {\n this.values_[index + i] = newItems[i];\n }\n for (var _i = 0; _i < oldItems.length; _i++) {\n this.values_[index + newItems.length + _i] = oldItems[_i];\n }\n return res;\n }\n };\n _proto.notifyArrayChildUpdate_ = function notifyArrayChildUpdate_(index, newValue, oldValue) {\n var notifySpy = !this.owned_ && isSpyEnabled();\n var notify = hasListeners(this);\n var change = notify || notifySpy ? {\n observableKind: \"array\",\n object: this.proxy_,\n type: UPDATE,\n debugObjectName: this.atom_.name_,\n index: index,\n newValue: newValue,\n oldValue: oldValue\n } : null;\n // The reason why this is on right hand side here (and not above), is this way the uglifier will drop it, but it won't\n // cause any runtime overhead in development mode without NODE_ENV set, unless spying is enabled\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportStart(change);\n }\n this.atom_.reportChanged();\n if (notify) {\n notifyListeners(this, change);\n }\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportEnd();\n }\n };\n _proto.notifyArraySplice_ = function notifyArraySplice_(index, added, removed) {\n var notifySpy = !this.owned_ && isSpyEnabled();\n var notify = hasListeners(this);\n var change = notify || notifySpy ? {\n observableKind: \"array\",\n object: this.proxy_,\n debugObjectName: this.atom_.name_,\n type: SPLICE,\n index: index,\n removed: removed,\n added: added,\n removedCount: removed.length,\n addedCount: added.length\n } : null;\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportStart(change);\n }\n this.atom_.reportChanged();\n // conform: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/observe\n if (notify) {\n notifyListeners(this, change);\n }\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportEnd();\n }\n };\n _proto.get_ = function get_(index) {\n if (this.legacyMode_ && index >= this.values_.length) {\n console.warn(process.env.NODE_ENV !== \"production\" ? \"[mobx.array] Attempt to read an array index (\" + index + \") that is out of bounds (\" + this.values_.length + \"). Please check length first. Out of bound indices will not be tracked by MobX\" : \"[mobx] Out of bounds read: \" + index);\n return undefined;\n }\n this.atom_.reportObserved();\n return this.dehanceValue_(this.values_[index]);\n };\n _proto.set_ = function set_(index, newValue) {\n var values = this.values_;\n if (this.legacyMode_ && index > values.length) {\n // out of bounds\n die(17, index, values.length);\n }\n if (index < values.length) {\n // update at index in range\n checkIfStateModificationsAreAllowed(this.atom_);\n var oldValue = values[index];\n if (hasInterceptors(this)) {\n var change = interceptChange(this, {\n type: UPDATE,\n object: this.proxy_,\n index: index,\n newValue: newValue\n });\n if (!change) {\n return;\n }\n newValue = change.newValue;\n }\n newValue = this.enhancer_(newValue, oldValue);\n var changed = newValue !== oldValue;\n if (changed) {\n values[index] = newValue;\n this.notifyArrayChildUpdate_(index, newValue, oldValue);\n }\n } else {\n // For out of bound index, we don't create an actual sparse array,\n // but rather fill the holes with undefined (same as setArrayLength_).\n // This could be considered a bug.\n var newItems = new Array(index + 1 - values.length);\n for (var i = 0; i < newItems.length - 1; i++) {\n newItems[i] = undefined;\n } // No Array.fill everywhere...\n newItems[newItems.length - 1] = newValue;\n this.spliceWithArray_(values.length, 0, newItems);\n }\n };\n return ObservableArrayAdministration;\n}();\nfunction createObservableArray(initialValues, enhancer, name, owned) {\n if (name === void 0) {\n name = process.env.NODE_ENV !== \"production\" ? \"ObservableArray@\" + getNextId() : \"ObservableArray\";\n }\n if (owned === void 0) {\n owned = false;\n }\n assertProxies();\n return initObservable(function () {\n var adm = new ObservableArrayAdministration(name, enhancer, owned, false);\n addHiddenFinalProp(adm.values_, $mobx, adm);\n var proxy = new Proxy(adm.values_, arrayTraps);\n adm.proxy_ = proxy;\n if (initialValues && initialValues.length) {\n adm.spliceWithArray_(0, 0, initialValues);\n }\n return proxy;\n });\n}\n// eslint-disable-next-line\nvar arrayExtensions = {\n clear: function clear() {\n return this.splice(0);\n },\n replace: function replace(newItems) {\n var adm = this[$mobx];\n return adm.spliceWithArray_(0, adm.values_.length, newItems);\n },\n // Used by JSON.stringify\n toJSON: function toJSON() {\n return this.slice();\n },\n /*\n * functions that do alter the internal structure of the array, (based on lib.es6.d.ts)\n * since these functions alter the inner structure of the array, the have side effects.\n * Because the have side effects, they should not be used in computed function,\n * and for that reason the do not call dependencyState.notifyObserved\n */\n splice: function splice(index, deleteCount) {\n for (var _len = arguments.length, newItems = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n newItems[_key - 2] = arguments[_key];\n }\n var adm = this[$mobx];\n switch (arguments.length) {\n case 0:\n return [];\n case 1:\n return adm.spliceWithArray_(index);\n case 2:\n return adm.spliceWithArray_(index, deleteCount);\n }\n return adm.spliceWithArray_(index, deleteCount, newItems);\n },\n spliceWithArray: function spliceWithArray(index, deleteCount, newItems) {\n return this[$mobx].spliceWithArray_(index, deleteCount, newItems);\n },\n push: function push() {\n var adm = this[$mobx];\n for (var _len2 = arguments.length, items = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n items[_key2] = arguments[_key2];\n }\n adm.spliceWithArray_(adm.values_.length, 0, items);\n return adm.values_.length;\n },\n pop: function pop() {\n return this.splice(Math.max(this[$mobx].values_.length - 1, 0), 1)[0];\n },\n shift: function shift() {\n return this.splice(0, 1)[0];\n },\n unshift: function unshift() {\n var adm = this[$mobx];\n for (var _len3 = arguments.length, items = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n items[_key3] = arguments[_key3];\n }\n adm.spliceWithArray_(0, 0, items);\n return adm.values_.length;\n },\n reverse: function reverse() {\n // reverse by default mutates in place before returning the result\n // which makes it both a 'derivation' and a 'mutation'.\n if (globalState.trackingDerivation) {\n die(37, \"reverse\");\n }\n this.replace(this.slice().reverse());\n return this;\n },\n sort: function sort() {\n // sort by default mutates in place before returning the result\n // which goes against all good practices. Let's not change the array in place!\n if (globalState.trackingDerivation) {\n die(37, \"sort\");\n }\n var copy = this.slice();\n copy.sort.apply(copy, arguments);\n this.replace(copy);\n return this;\n },\n remove: function remove(value) {\n var adm = this[$mobx];\n var idx = adm.dehanceValues_(adm.values_).indexOf(value);\n if (idx > -1) {\n this.splice(idx, 1);\n return true;\n }\n return false;\n }\n};\n/**\n * Wrap function from prototype\n * Without this, everything works as well, but this works\n * faster as everything works on unproxied values\n */\naddArrayExtension(\"at\", simpleFunc);\naddArrayExtension(\"concat\", simpleFunc);\naddArrayExtension(\"flat\", simpleFunc);\naddArrayExtension(\"includes\", simpleFunc);\naddArrayExtension(\"indexOf\", simpleFunc);\naddArrayExtension(\"join\", simpleFunc);\naddArrayExtension(\"lastIndexOf\", simpleFunc);\naddArrayExtension(\"slice\", simpleFunc);\naddArrayExtension(\"toString\", simpleFunc);\naddArrayExtension(\"toLocaleString\", simpleFunc);\naddArrayExtension(\"toSorted\", simpleFunc);\naddArrayExtension(\"toSpliced\", simpleFunc);\naddArrayExtension(\"with\", simpleFunc);\n// map\naddArrayExtension(\"every\", mapLikeFunc);\naddArrayExtension(\"filter\", mapLikeFunc);\naddArrayExtension(\"find\", mapLikeFunc);\naddArrayExtension(\"findIndex\", mapLikeFunc);\naddArrayExtension(\"findLast\", mapLikeFunc);\naddArrayExtension(\"findLastIndex\", mapLikeFunc);\naddArrayExtension(\"flatMap\", mapLikeFunc);\naddArrayExtension(\"forEach\", mapLikeFunc);\naddArrayExtension(\"map\", mapLikeFunc);\naddArrayExtension(\"some\", mapLikeFunc);\naddArrayExtension(\"toReversed\", mapLikeFunc);\n// reduce\naddArrayExtension(\"reduce\", reduceLikeFunc);\naddArrayExtension(\"reduceRight\", reduceLikeFunc);\nfunction addArrayExtension(funcName, funcFactory) {\n if (typeof Array.prototype[funcName] === \"function\") {\n arrayExtensions[funcName] = funcFactory(funcName);\n }\n}\n// Report and delegate to dehanced array\nfunction simpleFunc(funcName) {\n return function () {\n var adm = this[$mobx];\n adm.atom_.reportObserved();\n var dehancedValues = adm.dehanceValues_(adm.values_);\n return dehancedValues[funcName].apply(dehancedValues, arguments);\n };\n}\n// Make sure callbacks recieve correct array arg #2326\nfunction mapLikeFunc(funcName) {\n return function (callback, thisArg) {\n var _this2 = this;\n var adm = this[$mobx];\n adm.atom_.reportObserved();\n var dehancedValues = adm.dehanceValues_(adm.values_);\n return dehancedValues[funcName](function (element, index) {\n return callback.call(thisArg, element, index, _this2);\n });\n };\n}\n// Make sure callbacks recieve correct array arg #2326\nfunction reduceLikeFunc(funcName) {\n return function () {\n var _this3 = this;\n var adm = this[$mobx];\n adm.atom_.reportObserved();\n var dehancedValues = adm.dehanceValues_(adm.values_);\n // #2432 - reduce behavior depends on arguments.length\n var callback = arguments[0];\n arguments[0] = function (accumulator, currentValue, index) {\n return callback(accumulator, currentValue, index, _this3);\n };\n return dehancedValues[funcName].apply(dehancedValues, arguments);\n };\n}\nvar isObservableArrayAdministration = /*#__PURE__*/createInstanceofPredicate(\"ObservableArrayAdministration\", ObservableArrayAdministration);\nfunction isObservableArray(thing) {\n return isObject(thing) && isObservableArrayAdministration(thing[$mobx]);\n}\n\nvar _Symbol$iterator, _Symbol$toStringTag;\nvar ObservableMapMarker = {};\nvar ADD = \"add\";\nvar DELETE = \"delete\";\n// just extend Map? See also https://gist.github.com/nestharus/13b4d74f2ef4a2f4357dbd3fc23c1e54\n// But: https://github.com/mobxjs/mobx/issues/1556\n_Symbol$iterator = Symbol.iterator;\n_Symbol$toStringTag = Symbol.toStringTag;\nvar ObservableMap = /*#__PURE__*/function () {\n // hasMap, not hashMap >-).\n\n function ObservableMap(initialData, enhancer_, name_) {\n var _this = this;\n if (enhancer_ === void 0) {\n enhancer_ = deepEnhancer;\n }\n if (name_ === void 0) {\n name_ = process.env.NODE_ENV !== \"production\" ? \"ObservableMap@\" + getNextId() : \"ObservableMap\";\n }\n this.enhancer_ = void 0;\n this.name_ = void 0;\n this[$mobx] = ObservableMapMarker;\n this.data_ = void 0;\n this.hasMap_ = void 0;\n this.keysAtom_ = void 0;\n this.interceptors_ = void 0;\n this.changeListeners_ = void 0;\n this.dehancer = void 0;\n this.enhancer_ = enhancer_;\n this.name_ = name_;\n if (!isFunction(Map)) {\n die(18);\n }\n initObservable(function () {\n _this.keysAtom_ = createAtom(process.env.NODE_ENV !== \"production\" ? _this.name_ + \".keys()\" : \"ObservableMap.keys()\");\n _this.data_ = new Map();\n _this.hasMap_ = new Map();\n if (initialData) {\n _this.merge(initialData);\n }\n });\n }\n var _proto = ObservableMap.prototype;\n _proto.has_ = function has_(key) {\n return this.data_.has(key);\n };\n _proto.has = function has(key) {\n var _this2 = this;\n if (!globalState.trackingDerivation) {\n return this.has_(key);\n }\n var entry = this.hasMap_.get(key);\n if (!entry) {\n var newEntry = entry = new ObservableValue(this.has_(key), referenceEnhancer, process.env.NODE_ENV !== \"production\" ? this.name_ + \".\" + stringifyKey(key) + \"?\" : \"ObservableMap.key?\", false);\n this.hasMap_.set(key, newEntry);\n onBecomeUnobserved(newEntry, function () {\n return _this2.hasMap_[\"delete\"](key);\n });\n }\n return entry.get();\n };\n _proto.set = function set(key, value) {\n var hasKey = this.has_(key);\n if (hasInterceptors(this)) {\n var change = interceptChange(this, {\n type: hasKey ? UPDATE : ADD,\n object: this,\n newValue: value,\n name: key\n });\n if (!change) {\n return this;\n }\n value = change.newValue;\n }\n if (hasKey) {\n this.updateValue_(key, value);\n } else {\n this.addValue_(key, value);\n }\n return this;\n };\n _proto[\"delete\"] = function _delete(key) {\n var _this3 = this;\n checkIfStateModificationsAreAllowed(this.keysAtom_);\n if (hasInterceptors(this)) {\n var change = interceptChange(this, {\n type: DELETE,\n object: this,\n name: key\n });\n if (!change) {\n return false;\n }\n }\n if (this.has_(key)) {\n var notifySpy = isSpyEnabled();\n var notify = hasListeners(this);\n var _change = notify || notifySpy ? {\n observableKind: \"map\",\n debugObjectName: this.name_,\n type: DELETE,\n object: this,\n oldValue: this.data_.get(key).value_,\n name: key\n } : null;\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportStart(_change);\n } // TODO fix type\n transaction(function () {\n var _this3$hasMap_$get;\n _this3.keysAtom_.reportChanged();\n (_this3$hasMap_$get = _this3.hasMap_.get(key)) == null ? void 0 : _this3$hasMap_$get.setNewValue_(false);\n var observable = _this3.data_.get(key);\n observable.setNewValue_(undefined);\n _this3.data_[\"delete\"](key);\n });\n if (notify) {\n notifyListeners(this, _change);\n }\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportEnd();\n }\n return true;\n }\n return false;\n };\n _proto.updateValue_ = function updateValue_(key, newValue) {\n var observable = this.data_.get(key);\n newValue = observable.prepareNewValue_(newValue);\n if (newValue !== globalState.UNCHANGED) {\n var notifySpy = isSpyEnabled();\n var notify = hasListeners(this);\n var change = notify || notifySpy ? {\n observableKind: \"map\",\n debugObjectName: this.name_,\n type: UPDATE,\n object: this,\n oldValue: observable.value_,\n name: key,\n newValue: newValue\n } : null;\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportStart(change);\n } // TODO fix type\n observable.setNewValue_(newValue);\n if (notify) {\n notifyListeners(this, change);\n }\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportEnd();\n }\n }\n };\n _proto.addValue_ = function addValue_(key, newValue) {\n var _this4 = this;\n checkIfStateModificationsAreAllowed(this.keysAtom_);\n transaction(function () {\n var _this4$hasMap_$get;\n var observable = new ObservableValue(newValue, _this4.enhancer_, process.env.NODE_ENV !== \"production\" ? _this4.name_ + \".\" + stringifyKey(key) : \"ObservableMap.key\", false);\n _this4.data_.set(key, observable);\n newValue = observable.value_; // value might have been changed\n (_this4$hasMap_$get = _this4.hasMap_.get(key)) == null ? void 0 : _this4$hasMap_$get.setNewValue_(true);\n _this4.keysAtom_.reportChanged();\n });\n var notifySpy = isSpyEnabled();\n var notify = hasListeners(this);\n var change = notify || notifySpy ? {\n observableKind: \"map\",\n debugObjectName: this.name_,\n type: ADD,\n object: this,\n name: key,\n newValue: newValue\n } : null;\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportStart(change);\n } // TODO fix type\n if (notify) {\n notifyListeners(this, change);\n }\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportEnd();\n }\n };\n _proto.get = function get(key) {\n if (this.has(key)) {\n return this.dehanceValue_(this.data_.get(key).get());\n }\n return this.dehanceValue_(undefined);\n };\n _proto.dehanceValue_ = function dehanceValue_(value) {\n if (this.dehancer !== undefined) {\n return this.dehancer(value);\n }\n return value;\n };\n _proto.keys = function keys() {\n this.keysAtom_.reportObserved();\n return this.data_.keys();\n };\n _proto.values = function values() {\n var self = this;\n var keys = this.keys();\n return makeIterable({\n next: function next() {\n var _keys$next = keys.next(),\n done = _keys$next.done,\n value = _keys$next.value;\n return {\n done: done,\n value: done ? undefined : self.get(value)\n };\n }\n });\n };\n _proto.entries = function entries() {\n var self = this;\n var keys = this.keys();\n return makeIterable({\n next: function next() {\n var _keys$next2 = keys.next(),\n done = _keys$next2.done,\n value = _keys$next2.value;\n return {\n done: done,\n value: done ? undefined : [value, self.get(value)]\n };\n }\n });\n };\n _proto[_Symbol$iterator] = function () {\n return this.entries();\n };\n _proto.forEach = function forEach(callback, thisArg) {\n for (var _iterator = _createForOfIteratorHelperLoose(this), _step; !(_step = _iterator()).done;) {\n var _step$value = _step.value,\n key = _step$value[0],\n value = _step$value[1];\n callback.call(thisArg, value, key, this);\n }\n }\n /** Merge another object into this object, returns this. */;\n _proto.merge = function merge(other) {\n var _this5 = this;\n if (isObservableMap(other)) {\n other = new Map(other);\n }\n transaction(function () {\n if (isPlainObject(other)) {\n getPlainObjectKeys(other).forEach(function (key) {\n return _this5.set(key, other[key]);\n });\n } else if (Array.isArray(other)) {\n other.forEach(function (_ref) {\n var key = _ref[0],\n value = _ref[1];\n return _this5.set(key, value);\n });\n } else if (isES6Map(other)) {\n if (other.constructor !== Map) {\n die(19, other);\n }\n other.forEach(function (value, key) {\n return _this5.set(key, value);\n });\n } else if (other !== null && other !== undefined) {\n die(20, other);\n }\n });\n return this;\n };\n _proto.clear = function clear() {\n var _this6 = this;\n transaction(function () {\n untracked(function () {\n for (var _iterator2 = _createForOfIteratorHelperLoose(_this6.keys()), _step2; !(_step2 = _iterator2()).done;) {\n var key = _step2.value;\n _this6[\"delete\"](key);\n }\n });\n });\n };\n _proto.replace = function replace(values) {\n var _this7 = this;\n // Implementation requirements:\n // - respect ordering of replacement map\n // - allow interceptors to run and potentially prevent individual operations\n // - don't recreate observables that already exist in original map (so we don't destroy existing subscriptions)\n // - don't _keysAtom.reportChanged if the keys of resulting map are indentical (order matters!)\n // - note that result map may differ from replacement map due to the interceptors\n transaction(function () {\n // Convert to map so we can do quick key lookups\n var replacementMap = convertToMap(values);\n var orderedData = new Map();\n // Used for optimization\n var keysReportChangedCalled = false;\n // Delete keys that don't exist in replacement map\n // if the key deletion is prevented by interceptor\n // add entry at the beginning of the result map\n for (var _iterator3 = _createForOfIteratorHelperLoose(_this7.data_.keys()), _step3; !(_step3 = _iterator3()).done;) {\n var key = _step3.value;\n // Concurrently iterating/deleting keys\n // iterator should handle this correctly\n if (!replacementMap.has(key)) {\n var deleted = _this7[\"delete\"](key);\n // Was the key removed?\n if (deleted) {\n // _keysAtom.reportChanged() was already called\n keysReportChangedCalled = true;\n } else {\n // Delete prevented by interceptor\n var value = _this7.data_.get(key);\n orderedData.set(key, value);\n }\n }\n }\n // Merge entries\n for (var _iterator4 = _createForOfIteratorHelperLoose(replacementMap.entries()), _step4; !(_step4 = _iterator4()).done;) {\n var _step4$value = _step4.value,\n _key = _step4$value[0],\n _value = _step4$value[1];\n // We will want to know whether a new key is added\n var keyExisted = _this7.data_.has(_key);\n // Add or update value\n _this7.set(_key, _value);\n // The addition could have been prevent by interceptor\n if (_this7.data_.has(_key)) {\n // The update could have been prevented by interceptor\n // and also we want to preserve existing values\n // so use value from _data map (instead of replacement map)\n var _value2 = _this7.data_.get(_key);\n orderedData.set(_key, _value2);\n // Was a new key added?\n if (!keyExisted) {\n // _keysAtom.reportChanged() was already called\n keysReportChangedCalled = true;\n }\n }\n }\n // Check for possible key order change\n if (!keysReportChangedCalled) {\n if (_this7.data_.size !== orderedData.size) {\n // If size differs, keys are definitely modified\n _this7.keysAtom_.reportChanged();\n } else {\n var iter1 = _this7.data_.keys();\n var iter2 = orderedData.keys();\n var next1 = iter1.next();\n var next2 = iter2.next();\n while (!next1.done) {\n if (next1.value !== next2.value) {\n _this7.keysAtom_.reportChanged();\n break;\n }\n next1 = iter1.next();\n next2 = iter2.next();\n }\n }\n }\n // Use correctly ordered map\n _this7.data_ = orderedData;\n });\n return this;\n };\n _proto.toString = function toString() {\n return \"[object ObservableMap]\";\n };\n _proto.toJSON = function toJSON() {\n return Array.from(this);\n };\n /**\n * Observes this object. Triggers for the events 'add', 'update' and 'delete'.\n * See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe\n * for callback details\n */\n _proto.observe_ = function observe_(listener, fireImmediately) {\n if (process.env.NODE_ENV !== \"production\" && fireImmediately === true) {\n die(\"`observe` doesn't support fireImmediately=true in combination with maps.\");\n }\n return registerListener(this, listener);\n };\n _proto.intercept_ = function intercept_(handler) {\n return registerInterceptor(this, handler);\n };\n _createClass(ObservableMap, [{\n key: \"size\",\n get: function get() {\n this.keysAtom_.reportObserved();\n return this.data_.size;\n }\n }, {\n key: _Symbol$toStringTag,\n get: function get() {\n return \"Map\";\n }\n }]);\n return ObservableMap;\n}();\n// eslint-disable-next-line\nvar isObservableMap = /*#__PURE__*/createInstanceofPredicate(\"ObservableMap\", ObservableMap);\nfunction convertToMap(dataStructure) {\n if (isES6Map(dataStructure) || isObservableMap(dataStructure)) {\n return dataStructure;\n } else if (Array.isArray(dataStructure)) {\n return new Map(dataStructure);\n } else if (isPlainObject(dataStructure)) {\n var map = new Map();\n for (var key in dataStructure) {\n map.set(key, dataStructure[key]);\n }\n return map;\n } else {\n return die(21, dataStructure);\n }\n}\n\nvar _Symbol$iterator$1, _Symbol$toStringTag$1;\nvar ObservableSetMarker = {};\n_Symbol$iterator$1 = Symbol.iterator;\n_Symbol$toStringTag$1 = Symbol.toStringTag;\nvar ObservableSet = /*#__PURE__*/function () {\n function ObservableSet(initialData, enhancer, name_) {\n var _this = this;\n if (enhancer === void 0) {\n enhancer = deepEnhancer;\n }\n if (name_ === void 0) {\n name_ = process.env.NODE_ENV !== \"production\" ? \"ObservableSet@\" + getNextId() : \"ObservableSet\";\n }\n this.name_ = void 0;\n this[$mobx] = ObservableSetMarker;\n this.data_ = new Set();\n this.atom_ = void 0;\n this.changeListeners_ = void 0;\n this.interceptors_ = void 0;\n this.dehancer = void 0;\n this.enhancer_ = void 0;\n this.name_ = name_;\n if (!isFunction(Set)) {\n die(22);\n }\n this.enhancer_ = function (newV, oldV) {\n return enhancer(newV, oldV, name_);\n };\n initObservable(function () {\n _this.atom_ = createAtom(_this.name_);\n if (initialData) {\n _this.replace(initialData);\n }\n });\n }\n var _proto = ObservableSet.prototype;\n _proto.dehanceValue_ = function dehanceValue_(value) {\n if (this.dehancer !== undefined) {\n return this.dehancer(value);\n }\n return value;\n };\n _proto.clear = function clear() {\n var _this2 = this;\n transaction(function () {\n untracked(function () {\n for (var _iterator = _createForOfIteratorHelperLoose(_this2.data_.values()), _step; !(_step = _iterator()).done;) {\n var value = _step.value;\n _this2[\"delete\"](value);\n }\n });\n });\n };\n _proto.forEach = function forEach(callbackFn, thisArg) {\n for (var _iterator2 = _createForOfIteratorHelperLoose(this), _step2; !(_step2 = _iterator2()).done;) {\n var value = _step2.value;\n callbackFn.call(thisArg, value, value, this);\n }\n };\n _proto.add = function add(value) {\n var _this3 = this;\n checkIfStateModificationsAreAllowed(this.atom_);\n if (hasInterceptors(this)) {\n var change = interceptChange(this, {\n type: ADD,\n object: this,\n newValue: value\n });\n if (!change) {\n return this;\n }\n // ideally, value = change.value would be done here, so that values can be\n // changed by interceptor. Same applies for other Set and Map api's.\n }\n\n if (!this.has(value)) {\n transaction(function () {\n _this3.data_.add(_this3.enhancer_(value, undefined));\n _this3.atom_.reportChanged();\n });\n var notifySpy = process.env.NODE_ENV !== \"production\" && isSpyEnabled();\n var notify = hasListeners(this);\n var _change = notify || notifySpy ? {\n observableKind: \"set\",\n debugObjectName: this.name_,\n type: ADD,\n object: this,\n newValue: value\n } : null;\n if (notifySpy && process.env.NODE_ENV !== \"production\") {\n spyReportStart(_change);\n }\n if (notify) {\n notifyListeners(this, _change);\n }\n if (notifySpy && process.env.NODE_ENV !== \"production\") {\n spyReportEnd();\n }\n }\n return this;\n };\n _proto[\"delete\"] = function _delete(value) {\n var _this4 = this;\n if (hasInterceptors(this)) {\n var change = interceptChange(this, {\n type: DELETE,\n object: this,\n oldValue: value\n });\n if (!change) {\n return false;\n }\n }\n if (this.has(value)) {\n var notifySpy = process.env.NODE_ENV !== \"production\" && isSpyEnabled();\n var notify = hasListeners(this);\n var _change2 = notify || notifySpy ? {\n observableKind: \"set\",\n debugObjectName: this.name_,\n type: DELETE,\n object: this,\n oldValue: value\n } : null;\n if (notifySpy && process.env.NODE_ENV !== \"production\") {\n spyReportStart(_change2);\n }\n transaction(function () {\n _this4.atom_.reportChanged();\n _this4.data_[\"delete\"](value);\n });\n if (notify) {\n notifyListeners(this, _change2);\n }\n if (notifySpy && process.env.NODE_ENV !== \"production\") {\n spyReportEnd();\n }\n return true;\n }\n return false;\n };\n _proto.has = function has(value) {\n this.atom_.reportObserved();\n return this.data_.has(this.dehanceValue_(value));\n };\n _proto.entries = function entries() {\n var nextIndex = 0;\n var keys = Array.from(this.keys());\n var values = Array.from(this.values());\n return makeIterable({\n next: function next() {\n var index = nextIndex;\n nextIndex += 1;\n return index < values.length ? {\n value: [keys[index], values[index]],\n done: false\n } : {\n done: true\n };\n }\n });\n };\n _proto.keys = function keys() {\n return this.values();\n };\n _proto.values = function values() {\n this.atom_.reportObserved();\n var self = this;\n var nextIndex = 0;\n var observableValues = Array.from(this.data_.values());\n return makeIterable({\n next: function next() {\n return nextIndex < observableValues.length ? {\n value: self.dehanceValue_(observableValues[nextIndex++]),\n done: false\n } : {\n done: true\n };\n }\n });\n };\n _proto.replace = function replace(other) {\n var _this5 = this;\n if (isObservableSet(other)) {\n other = new Set(other);\n }\n transaction(function () {\n if (Array.isArray(other)) {\n _this5.clear();\n other.forEach(function (value) {\n return _this5.add(value);\n });\n } else if (isES6Set(other)) {\n _this5.clear();\n other.forEach(function (value) {\n return _this5.add(value);\n });\n } else if (other !== null && other !== undefined) {\n die(\"Cannot initialize set from \" + other);\n }\n });\n return this;\n };\n _proto.observe_ = function observe_(listener, fireImmediately) {\n // ... 'fireImmediately' could also be true?\n if (process.env.NODE_ENV !== \"production\" && fireImmediately === true) {\n die(\"`observe` doesn't support fireImmediately=true in combination with sets.\");\n }\n return registerListener(this, listener);\n };\n _proto.intercept_ = function intercept_(handler) {\n return registerInterceptor(this, handler);\n };\n _proto.toJSON = function toJSON() {\n return Array.from(this);\n };\n _proto.toString = function toString() {\n return \"[object ObservableSet]\";\n };\n _proto[_Symbol$iterator$1] = function () {\n return this.values();\n };\n _createClass(ObservableSet, [{\n key: \"size\",\n get: function get() {\n this.atom_.reportObserved();\n return this.data_.size;\n }\n }, {\n key: _Symbol$toStringTag$1,\n get: function get() {\n return \"Set\";\n }\n }]);\n return ObservableSet;\n}();\n// eslint-disable-next-line\nvar isObservableSet = /*#__PURE__*/createInstanceofPredicate(\"ObservableSet\", ObservableSet);\n\nvar descriptorCache = /*#__PURE__*/Object.create(null);\nvar REMOVE = \"remove\";\nvar ObservableObjectAdministration = /*#__PURE__*/function () {\n function ObservableObjectAdministration(target_, values_, name_,\n // Used anytime annotation is not explicitely provided\n defaultAnnotation_) {\n if (values_ === void 0) {\n values_ = new Map();\n }\n if (defaultAnnotation_ === void 0) {\n defaultAnnotation_ = autoAnnotation;\n }\n this.target_ = void 0;\n this.values_ = void 0;\n this.name_ = void 0;\n this.defaultAnnotation_ = void 0;\n this.keysAtom_ = void 0;\n this.changeListeners_ = void 0;\n this.interceptors_ = void 0;\n this.proxy_ = void 0;\n this.isPlainObject_ = void 0;\n this.appliedAnnotations_ = void 0;\n this.pendingKeys_ = void 0;\n this.target_ = target_;\n this.values_ = values_;\n this.name_ = name_;\n this.defaultAnnotation_ = defaultAnnotation_;\n this.keysAtom_ = new Atom(process.env.NODE_ENV !== \"production\" ? this.name_ + \".keys\" : \"ObservableObject.keys\");\n // Optimization: we use this frequently\n this.isPlainObject_ = isPlainObject(this.target_);\n if (process.env.NODE_ENV !== \"production\" && !isAnnotation(this.defaultAnnotation_)) {\n die(\"defaultAnnotation must be valid annotation\");\n }\n if (process.env.NODE_ENV !== \"production\") {\n // Prepare structure for tracking which fields were already annotated\n this.appliedAnnotations_ = {};\n }\n }\n var _proto = ObservableObjectAdministration.prototype;\n _proto.getObservablePropValue_ = function getObservablePropValue_(key) {\n return this.values_.get(key).get();\n };\n _proto.setObservablePropValue_ = function setObservablePropValue_(key, newValue) {\n var observable = this.values_.get(key);\n if (observable instanceof ComputedValue) {\n observable.set(newValue);\n return true;\n }\n // intercept\n if (hasInterceptors(this)) {\n var change = interceptChange(this, {\n type: UPDATE,\n object: this.proxy_ || this.target_,\n name: key,\n newValue: newValue\n });\n if (!change) {\n return null;\n }\n newValue = change.newValue;\n }\n newValue = observable.prepareNewValue_(newValue);\n // notify spy & observers\n if (newValue !== globalState.UNCHANGED) {\n var notify = hasListeners(this);\n var notifySpy = process.env.NODE_ENV !== \"production\" && isSpyEnabled();\n var _change = notify || notifySpy ? {\n type: UPDATE,\n observableKind: \"object\",\n debugObjectName: this.name_,\n object: this.proxy_ || this.target_,\n oldValue: observable.value_,\n name: key,\n newValue: newValue\n } : null;\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportStart(_change);\n }\n observable.setNewValue_(newValue);\n if (notify) {\n notifyListeners(this, _change);\n }\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportEnd();\n }\n }\n return true;\n };\n _proto.get_ = function get_(key) {\n if (globalState.trackingDerivation && !hasProp(this.target_, key)) {\n // Key doesn't exist yet, subscribe for it in case it's added later\n this.has_(key);\n }\n return this.target_[key];\n }\n /**\n * @param {PropertyKey} key\n * @param {any} value\n * @param {Annotation|boolean} annotation true - use default annotation, false - copy as is\n * @param {boolean} proxyTrap whether it's called from proxy trap\n * @returns {boolean|null} true on success, false on failure (proxyTrap + non-configurable), null when cancelled by interceptor\n */;\n _proto.set_ = function set_(key, value, proxyTrap) {\n if (proxyTrap === void 0) {\n proxyTrap = false;\n }\n // Don't use .has(key) - we care about own\n if (hasProp(this.target_, key)) {\n // Existing prop\n if (this.values_.has(key)) {\n // Observable (can be intercepted)\n return this.setObservablePropValue_(key, value);\n } else if (proxyTrap) {\n // Non-observable - proxy\n return Reflect.set(this.target_, key, value);\n } else {\n // Non-observable\n this.target_[key] = value;\n return true;\n }\n } else {\n // New prop\n return this.extend_(key, {\n value: value,\n enumerable: true,\n writable: true,\n configurable: true\n }, this.defaultAnnotation_, proxyTrap);\n }\n }\n // Trap for \"in\"\n ;\n _proto.has_ = function has_(key) {\n if (!globalState.trackingDerivation) {\n // Skip key subscription outside derivation\n return key in this.target_;\n }\n this.pendingKeys_ || (this.pendingKeys_ = new Map());\n var entry = this.pendingKeys_.get(key);\n if (!entry) {\n entry = new ObservableValue(key in this.target_, referenceEnhancer, process.env.NODE_ENV !== \"production\" ? this.name_ + \".\" + stringifyKey(key) + \"?\" : \"ObservableObject.key?\", false);\n this.pendingKeys_.set(key, entry);\n }\n return entry.get();\n }\n /**\n * @param {PropertyKey} key\n * @param {Annotation|boolean} annotation true - use default annotation, false - ignore prop\n */;\n _proto.make_ = function make_(key, annotation) {\n if (annotation === true) {\n annotation = this.defaultAnnotation_;\n }\n if (annotation === false) {\n return;\n }\n assertAnnotable(this, annotation, key);\n if (!(key in this.target_)) {\n var _this$target_$storedA;\n // Throw on missing key, except for decorators:\n // Decorator annotations are collected from whole prototype chain.\n // When called from super() some props may not exist yet.\n // However we don't have to worry about missing prop,\n // because the decorator must have been applied to something.\n if ((_this$target_$storedA = this.target_[storedAnnotationsSymbol]) != null && _this$target_$storedA[key]) {\n return; // will be annotated by subclass constructor\n } else {\n die(1, annotation.annotationType_, this.name_ + \".\" + key.toString());\n }\n }\n var source = this.target_;\n while (source && source !== objectPrototype) {\n var descriptor = getDescriptor(source, key);\n if (descriptor) {\n var outcome = annotation.make_(this, key, descriptor, source);\n if (outcome === 0 /* MakeResult.Cancel */) {\n return;\n }\n if (outcome === 1 /* MakeResult.Break */) {\n break;\n }\n }\n source = Object.getPrototypeOf(source);\n }\n recordAnnotationApplied(this, annotation, key);\n }\n /**\n * @param {PropertyKey} key\n * @param {PropertyDescriptor} descriptor\n * @param {Annotation|boolean} annotation true - use default annotation, false - copy as is\n * @param {boolean} proxyTrap whether it's called from proxy trap\n * @returns {boolean|null} true on success, false on failure (proxyTrap + non-configurable), null when cancelled by interceptor\n */;\n _proto.extend_ = function extend_(key, descriptor, annotation, proxyTrap) {\n if (proxyTrap === void 0) {\n proxyTrap = false;\n }\n if (annotation === true) {\n annotation = this.defaultAnnotation_;\n }\n if (annotation === false) {\n return this.defineProperty_(key, descriptor, proxyTrap);\n }\n assertAnnotable(this, annotation, key);\n var outcome = annotation.extend_(this, key, descriptor, proxyTrap);\n if (outcome) {\n recordAnnotationApplied(this, annotation, key);\n }\n return outcome;\n }\n /**\n * @param {PropertyKey} key\n * @param {PropertyDescriptor} descriptor\n * @param {boolean} proxyTrap whether it's called from proxy trap\n * @returns {boolean|null} true on success, false on failure (proxyTrap + non-configurable), null when cancelled by interceptor\n */;\n _proto.defineProperty_ = function defineProperty_(key, descriptor, proxyTrap) {\n if (proxyTrap === void 0) {\n proxyTrap = false;\n }\n checkIfStateModificationsAreAllowed(this.keysAtom_);\n try {\n startBatch();\n // Delete\n var deleteOutcome = this.delete_(key);\n if (!deleteOutcome) {\n // Failure or intercepted\n return deleteOutcome;\n }\n // ADD interceptor\n if (hasInterceptors(this)) {\n var change = interceptChange(this, {\n object: this.proxy_ || this.target_,\n name: key,\n type: ADD,\n newValue: descriptor.value\n });\n if (!change) {\n return null;\n }\n var newValue = change.newValue;\n if (descriptor.value !== newValue) {\n descriptor = _extends({}, descriptor, {\n value: newValue\n });\n }\n }\n // Define\n if (proxyTrap) {\n if (!Reflect.defineProperty(this.target_, key, descriptor)) {\n return false;\n }\n } else {\n defineProperty(this.target_, key, descriptor);\n }\n // Notify\n this.notifyPropertyAddition_(key, descriptor.value);\n } finally {\n endBatch();\n }\n return true;\n }\n // If original descriptor becomes relevant, move this to annotation directly\n ;\n _proto.defineObservableProperty_ = function defineObservableProperty_(key, value, enhancer, proxyTrap) {\n if (proxyTrap === void 0) {\n proxyTrap = false;\n }\n checkIfStateModificationsAreAllowed(this.keysAtom_);\n try {\n startBatch();\n // Delete\n var deleteOutcome = this.delete_(key);\n if (!deleteOutcome) {\n // Failure or intercepted\n return deleteOutcome;\n }\n // ADD interceptor\n if (hasInterceptors(this)) {\n var change = interceptChange(this, {\n object: this.proxy_ || this.target_,\n name: key,\n type: ADD,\n newValue: value\n });\n if (!change) {\n return null;\n }\n value = change.newValue;\n }\n var cachedDescriptor = getCachedObservablePropDescriptor(key);\n var descriptor = {\n configurable: globalState.safeDescriptors ? this.isPlainObject_ : true,\n enumerable: true,\n get: cachedDescriptor.get,\n set: cachedDescriptor.set\n };\n // Define\n if (proxyTrap) {\n if (!Reflect.defineProperty(this.target_, key, descriptor)) {\n return false;\n }\n } else {\n defineProperty(this.target_, key, descriptor);\n }\n var observable = new ObservableValue(value, enhancer, process.env.NODE_ENV !== \"production\" ? this.name_ + \".\" + key.toString() : \"ObservableObject.key\", false);\n this.values_.set(key, observable);\n // Notify (value possibly changed by ObservableValue)\n this.notifyPropertyAddition_(key, observable.value_);\n } finally {\n endBatch();\n }\n return true;\n }\n // If original descriptor becomes relevant, move this to annotation directly\n ;\n _proto.defineComputedProperty_ = function defineComputedProperty_(key, options, proxyTrap) {\n if (proxyTrap === void 0) {\n proxyTrap = false;\n }\n checkIfStateModificationsAreAllowed(this.keysAtom_);\n try {\n startBatch();\n // Delete\n var deleteOutcome = this.delete_(key);\n if (!deleteOutcome) {\n // Failure or intercepted\n return deleteOutcome;\n }\n // ADD interceptor\n if (hasInterceptors(this)) {\n var change = interceptChange(this, {\n object: this.proxy_ || this.target_,\n name: key,\n type: ADD,\n newValue: undefined\n });\n if (!change) {\n return null;\n }\n }\n options.name || (options.name = process.env.NODE_ENV !== \"production\" ? this.name_ + \".\" + key.toString() : \"ObservableObject.key\");\n options.context = this.proxy_ || this.target_;\n var cachedDescriptor = getCachedObservablePropDescriptor(key);\n var descriptor = {\n configurable: globalState.safeDescriptors ? this.isPlainObject_ : true,\n enumerable: false,\n get: cachedDescriptor.get,\n set: cachedDescriptor.set\n };\n // Define\n if (proxyTrap) {\n if (!Reflect.defineProperty(this.target_, key, descriptor)) {\n return false;\n }\n } else {\n defineProperty(this.target_, key, descriptor);\n }\n this.values_.set(key, new ComputedValue(options));\n // Notify\n this.notifyPropertyAddition_(key, undefined);\n } finally {\n endBatch();\n }\n return true;\n }\n /**\n * @param {PropertyKey} key\n * @param {PropertyDescriptor} descriptor\n * @param {boolean} proxyTrap whether it's called from proxy trap\n * @returns {boolean|null} true on success, false on failure (proxyTrap + non-configurable), null when cancelled by interceptor\n */;\n _proto.delete_ = function delete_(key, proxyTrap) {\n if (proxyTrap === void 0) {\n proxyTrap = false;\n }\n checkIfStateModificationsAreAllowed(this.keysAtom_);\n // No such prop\n if (!hasProp(this.target_, key)) {\n return true;\n }\n // Intercept\n if (hasInterceptors(this)) {\n var change = interceptChange(this, {\n object: this.proxy_ || this.target_,\n name: key,\n type: REMOVE\n });\n // Cancelled\n if (!change) {\n return null;\n }\n }\n // Delete\n try {\n var _this$pendingKeys_, _this$pendingKeys_$ge;\n startBatch();\n var notify = hasListeners(this);\n var notifySpy = process.env.NODE_ENV !== \"production\" && isSpyEnabled();\n var observable = this.values_.get(key);\n // Value needed for spies/listeners\n var value = undefined;\n // Optimization: don't pull the value unless we will need it\n if (!observable && (notify || notifySpy)) {\n var _getDescriptor;\n value = (_getDescriptor = getDescriptor(this.target_, key)) == null ? void 0 : _getDescriptor.value;\n }\n // delete prop (do first, may fail)\n if (proxyTrap) {\n if (!Reflect.deleteProperty(this.target_, key)) {\n return false;\n }\n } else {\n delete this.target_[key];\n }\n // Allow re-annotating this field\n if (process.env.NODE_ENV !== \"production\") {\n delete this.appliedAnnotations_[key];\n }\n // Clear observable\n if (observable) {\n this.values_[\"delete\"](key);\n // for computed, value is undefined\n if (observable instanceof ObservableValue) {\n value = observable.value_;\n }\n // Notify: autorun(() => obj[key]), see #1796\n propagateChanged(observable);\n }\n // Notify \"keys/entries/values\" observers\n this.keysAtom_.reportChanged();\n // Notify \"has\" observers\n // \"in\" as it may still exist in proto\n (_this$pendingKeys_ = this.pendingKeys_) == null ? void 0 : (_this$pendingKeys_$ge = _this$pendingKeys_.get(key)) == null ? void 0 : _this$pendingKeys_$ge.set(key in this.target_);\n // Notify spies/listeners\n if (notify || notifySpy) {\n var _change2 = {\n type: REMOVE,\n observableKind: \"object\",\n object: this.proxy_ || this.target_,\n debugObjectName: this.name_,\n oldValue: value,\n name: key\n };\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportStart(_change2);\n }\n if (notify) {\n notifyListeners(this, _change2);\n }\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportEnd();\n }\n }\n } finally {\n endBatch();\n }\n return true;\n }\n /**\n * Observes this object. Triggers for the events 'add', 'update' and 'delete'.\n * See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe\n * for callback details\n */;\n _proto.observe_ = function observe_(callback, fireImmediately) {\n if (process.env.NODE_ENV !== \"production\" && fireImmediately === true) {\n die(\"`observe` doesn't support the fire immediately property for observable objects.\");\n }\n return registerListener(this, callback);\n };\n _proto.intercept_ = function intercept_(handler) {\n return registerInterceptor(this, handler);\n };\n _proto.notifyPropertyAddition_ = function notifyPropertyAddition_(key, value) {\n var _this$pendingKeys_2, _this$pendingKeys_2$g;\n var notify = hasListeners(this);\n var notifySpy = process.env.NODE_ENV !== \"production\" && isSpyEnabled();\n if (notify || notifySpy) {\n var change = notify || notifySpy ? {\n type: ADD,\n observableKind: \"object\",\n debugObjectName: this.name_,\n object: this.proxy_ || this.target_,\n name: key,\n newValue: value\n } : null;\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportStart(change);\n }\n if (notify) {\n notifyListeners(this, change);\n }\n if (process.env.NODE_ENV !== \"production\" && notifySpy) {\n spyReportEnd();\n }\n }\n (_this$pendingKeys_2 = this.pendingKeys_) == null ? void 0 : (_this$pendingKeys_2$g = _this$pendingKeys_2.get(key)) == null ? void 0 : _this$pendingKeys_2$g.set(true);\n // Notify \"keys/entries/values\" observers\n this.keysAtom_.reportChanged();\n };\n _proto.ownKeys_ = function ownKeys_() {\n this.keysAtom_.reportObserved();\n return ownKeys(this.target_);\n };\n _proto.keys_ = function keys_() {\n // Returns enumerable && own, but unfortunately keysAtom will report on ANY key change.\n // There is no way to distinguish between Object.keys(object) and Reflect.ownKeys(object) - both are handled by ownKeys trap.\n // We can either over-report in Object.keys(object) or under-report in Reflect.ownKeys(object)\n // We choose to over-report in Object.keys(object), because:\n // - typically it's used with simple data objects\n // - when symbolic/non-enumerable keys are relevant Reflect.ownKeys works as expected\n this.keysAtom_.reportObserved();\n return Object.keys(this.target_);\n };\n return ObservableObjectAdministration;\n}();\nfunction asObservableObject(target, options) {\n var _options$name;\n if (process.env.NODE_ENV !== \"production\" && options && isObservableObject(target)) {\n die(\"Options can't be provided for already observable objects.\");\n }\n if (hasProp(target, $mobx)) {\n if (process.env.NODE_ENV !== \"production\" && !(getAdministration(target) instanceof ObservableObjectAdministration)) {\n die(\"Cannot convert '\" + getDebugName(target) + \"' into observable object:\" + \"\\nThe target is already observable of different type.\" + \"\\nExtending builtins is not supported.\");\n }\n return target;\n }\n if (process.env.NODE_ENV !== \"production\" && !Object.isExtensible(target)) {\n die(\"Cannot make the designated object observable; it is not extensible\");\n }\n var name = (_options$name = options == null ? void 0 : options.name) != null ? _options$name : process.env.NODE_ENV !== \"production\" ? (isPlainObject(target) ? \"ObservableObject\" : target.constructor.name) + \"@\" + getNextId() : \"ObservableObject\";\n var adm = new ObservableObjectAdministration(target, new Map(), String(name), getAnnotationFromOptions(options));\n addHiddenProp(target, $mobx, adm);\n return target;\n}\nvar isObservableObjectAdministration = /*#__PURE__*/createInstanceofPredicate(\"ObservableObjectAdministration\", ObservableObjectAdministration);\nfunction getCachedObservablePropDescriptor(key) {\n return descriptorCache[key] || (descriptorCache[key] = {\n get: function get() {\n return this[$mobx].getObservablePropValue_(key);\n },\n set: function set(value) {\n return this[$mobx].setObservablePropValue_(key, value);\n }\n });\n}\nfunction isObservableObject(thing) {\n if (isObject(thing)) {\n return isObservableObjectAdministration(thing[$mobx]);\n }\n return false;\n}\nfunction recordAnnotationApplied(adm, annotation, key) {\n var _adm$target_$storedAn;\n if (process.env.NODE_ENV !== \"production\") {\n adm.appliedAnnotations_[key] = annotation;\n }\n // Remove applied decorator annotation so we don't try to apply it again in subclass constructor\n (_adm$target_$storedAn = adm.target_[storedAnnotationsSymbol]) == null ? true : delete _adm$target_$storedAn[key];\n}\nfunction assertAnnotable(adm, annotation, key) {\n // Valid annotation\n if (process.env.NODE_ENV !== \"production\" && !isAnnotation(annotation)) {\n die(\"Cannot annotate '\" + adm.name_ + \".\" + key.toString() + \"': Invalid annotation.\");\n }\n /*\n // Configurable, not sealed, not frozen\n // Possibly not needed, just a little better error then the one thrown by engine.\n // Cases where this would be useful the most (subclass field initializer) are not interceptable by this.\n if (__DEV__) {\n const configurable = getDescriptor(adm.target_, key)?.configurable\n const frozen = Object.isFrozen(adm.target_)\n const sealed = Object.isSealed(adm.target_)\n if (!configurable || frozen || sealed) {\n const fieldName = `${adm.name_}.${key.toString()}`\n const requestedAnnotationType = annotation.annotationType_\n let error = `Cannot apply '${requestedAnnotationType}' to '${fieldName}':`\n if (frozen) {\n error += `\\nObject is frozen.`\n }\n if (sealed) {\n error += `\\nObject is sealed.`\n }\n if (!configurable) {\n error += `\\nproperty is not configurable.`\n // Mention only if caused by us to avoid confusion\n if (hasProp(adm.appliedAnnotations!, key)) {\n error += `\\nTo prevent accidental re-definition of a field by a subclass, `\n error += `all annotated fields of non-plain objects (classes) are not configurable.`\n }\n }\n die(error)\n }\n }\n */\n // Not annotated\n if (process.env.NODE_ENV !== \"production\" && !isOverride(annotation) && hasProp(adm.appliedAnnotations_, key)) {\n var fieldName = adm.name_ + \".\" + key.toString();\n var currentAnnotationType = adm.appliedAnnotations_[key].annotationType_;\n var requestedAnnotationType = annotation.annotationType_;\n die(\"Cannot apply '\" + requestedAnnotationType + \"' to '\" + fieldName + \"':\" + (\"\\nThe field is already annotated with '\" + currentAnnotationType + \"'.\") + \"\\nRe-annotating fields is not allowed.\" + \"\\nUse 'override' annotation for methods overridden by subclass.\");\n }\n}\n\n// Bug in safari 9.* (or iOS 9 safari mobile). See #364\nvar ENTRY_0 = /*#__PURE__*/createArrayEntryDescriptor(0);\nvar safariPrototypeSetterInheritanceBug = /*#__PURE__*/function () {\n var v = false;\n var p = {};\n Object.defineProperty(p, \"0\", {\n set: function set() {\n v = true;\n }\n });\n /*#__PURE__*/Object.create(p)[\"0\"] = 1;\n return v === false;\n}();\n/**\n * This array buffer contains two lists of properties, so that all arrays\n * can recycle their property definitions, which significantly improves performance of creating\n * properties on the fly.\n */\nvar OBSERVABLE_ARRAY_BUFFER_SIZE = 0;\n// Typescript workaround to make sure ObservableArray extends Array\nvar StubArray = function StubArray() {};\nfunction inherit(ctor, proto) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(ctor.prototype, proto);\n } else if (ctor.prototype.__proto__ !== undefined) {\n ctor.prototype.__proto__ = proto;\n } else {\n ctor.prototype = proto;\n }\n}\ninherit(StubArray, Array.prototype);\n// Weex proto freeze protection was here,\n// but it is unclear why the hack is need as MobX never changed the prototype\n// anyway, so removed it in V6\nvar LegacyObservableArray = /*#__PURE__*/function (_StubArray, _Symbol$toStringTag, _Symbol$iterator) {\n _inheritsLoose(LegacyObservableArray, _StubArray);\n function LegacyObservableArray(initialValues, enhancer, name, owned) {\n var _this;\n if (name === void 0) {\n name = process.env.NODE_ENV !== \"production\" ? \"ObservableArray@\" + getNextId() : \"ObservableArray\";\n }\n if (owned === void 0) {\n owned = false;\n }\n _this = _StubArray.call(this) || this;\n initObservable(function () {\n var adm = new ObservableArrayAdministration(name, enhancer, owned, true);\n adm.proxy_ = _assertThisInitialized(_this);\n addHiddenFinalProp(_assertThisInitialized(_this), $mobx, adm);\n if (initialValues && initialValues.length) {\n // @ts-ignore\n _this.spliceWithArray(0, 0, initialValues);\n }\n if (safariPrototypeSetterInheritanceBug) {\n // Seems that Safari won't use numeric prototype setter untill any * numeric property is\n // defined on the instance. After that it works fine, even if this property is deleted.\n Object.defineProperty(_assertThisInitialized(_this), \"0\", ENTRY_0);\n }\n });\n return _this;\n }\n var _proto = LegacyObservableArray.prototype;\n _proto.concat = function concat() {\n this[$mobx].atom_.reportObserved();\n for (var _len = arguments.length, arrays = new Array(_len), _key = 0; _key < _len; _key++) {\n arrays[_key] = arguments[_key];\n }\n return Array.prototype.concat.apply(this.slice(),\n //@ts-ignore\n arrays.map(function (a) {\n return isObservableArray(a) ? a.slice() : a;\n }));\n };\n _proto[_Symbol$iterator] = function () {\n var self = this;\n var nextIndex = 0;\n return makeIterable({\n next: function next() {\n return nextIndex < self.length ? {\n value: self[nextIndex++],\n done: false\n } : {\n done: true,\n value: undefined\n };\n }\n });\n };\n _createClass(LegacyObservableArray, [{\n key: \"length\",\n get: function get() {\n return this[$mobx].getArrayLength_();\n },\n set: function set(newLength) {\n this[$mobx].setArrayLength_(newLength);\n }\n }, {\n key: _Symbol$toStringTag,\n get: function get() {\n return \"Array\";\n }\n }]);\n return LegacyObservableArray;\n}(StubArray, Symbol.toStringTag, Symbol.iterator);\nObject.entries(arrayExtensions).forEach(function (_ref) {\n var prop = _ref[0],\n fn = _ref[1];\n if (prop !== \"concat\") {\n addHiddenProp(LegacyObservableArray.prototype, prop, fn);\n }\n});\nfunction createArrayEntryDescriptor(index) {\n return {\n enumerable: false,\n configurable: true,\n get: function get() {\n return this[$mobx].get_(index);\n },\n set: function set(value) {\n this[$mobx].set_(index, value);\n }\n };\n}\nfunction createArrayBufferItem(index) {\n defineProperty(LegacyObservableArray.prototype, \"\" + index, createArrayEntryDescriptor(index));\n}\nfunction reserveArrayBuffer(max) {\n if (max > OBSERVABLE_ARRAY_BUFFER_SIZE) {\n for (var index = OBSERVABLE_ARRAY_BUFFER_SIZE; index < max + 100; index++) {\n createArrayBufferItem(index);\n }\n OBSERVABLE_ARRAY_BUFFER_SIZE = max;\n }\n}\nreserveArrayBuffer(1000);\nfunction createLegacyArray(initialValues, enhancer, name) {\n return new LegacyObservableArray(initialValues, enhancer, name);\n}\n\nfunction getAtom(thing, property) {\n if (typeof thing === \"object\" && thing !== null) {\n if (isObservableArray(thing)) {\n if (property !== undefined) {\n die(23);\n }\n return thing[$mobx].atom_;\n }\n if (isObservableSet(thing)) {\n return thing.atom_;\n }\n if (isObservableMap(thing)) {\n if (property === undefined) {\n return thing.keysAtom_;\n }\n var observable = thing.data_.get(property) || thing.hasMap_.get(property);\n if (!observable) {\n die(25, property, getDebugName(thing));\n }\n return observable;\n }\n if (isObservableObject(thing)) {\n if (!property) {\n return die(26);\n }\n var _observable = thing[$mobx].values_.get(property);\n if (!_observable) {\n die(27, property, getDebugName(thing));\n }\n return _observable;\n }\n if (isAtom(thing) || isComputedValue(thing) || isReaction(thing)) {\n return thing;\n }\n } else if (isFunction(thing)) {\n if (isReaction(thing[$mobx])) {\n // disposer function\n return thing[$mobx];\n }\n }\n die(28);\n}\nfunction getAdministration(thing, property) {\n if (!thing) {\n die(29);\n }\n if (property !== undefined) {\n return getAdministration(getAtom(thing, property));\n }\n if (isAtom(thing) || isComputedValue(thing) || isReaction(thing)) {\n return thing;\n }\n if (isObservableMap(thing) || isObservableSet(thing)) {\n return thing;\n }\n if (thing[$mobx]) {\n return thing[$mobx];\n }\n die(24, thing);\n}\nfunction getDebugName(thing, property) {\n var named;\n if (property !== undefined) {\n named = getAtom(thing, property);\n } else if (isAction(thing)) {\n return thing.name;\n } else if (isObservableObject(thing) || isObservableMap(thing) || isObservableSet(thing)) {\n named = getAdministration(thing);\n } else {\n // valid for arrays as well\n named = getAtom(thing);\n }\n return named.name_;\n}\n/**\n * Helper function for initializing observable structures, it applies:\n * 1. allowStateChanges so we don't violate enforceActions.\n * 2. untracked so we don't accidentaly subscribe to anything observable accessed during init in case the observable is created inside derivation.\n * 3. batch to avoid state version updates\n */\nfunction initObservable(cb) {\n var derivation = untrackedStart();\n var allowStateChanges = allowStateChangesStart(true);\n startBatch();\n try {\n return cb();\n } finally {\n endBatch();\n allowStateChangesEnd(allowStateChanges);\n untrackedEnd(derivation);\n }\n}\n\nvar toString = objectPrototype.toString;\nfunction deepEqual(a, b, depth) {\n if (depth === void 0) {\n depth = -1;\n }\n return eq(a, b, depth);\n}\n// Copied from https://github.com/jashkenas/underscore/blob/5c237a7c682fb68fd5378203f0bf22dce1624854/underscore.js#L1186-L1289\n// Internal recursive comparison function for `isEqual`.\nfunction eq(a, b, depth, aStack, bStack) {\n // Identical objects are equal. `0 === -0`, but they aren't identical.\n // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).\n if (a === b) {\n return a !== 0 || 1 / a === 1 / b;\n }\n // `null` or `undefined` only equal to itself (strict comparison).\n if (a == null || b == null) {\n return false;\n }\n // `NaN`s are equivalent, but non-reflexive.\n if (a !== a) {\n return b !== b;\n }\n // Exhaust primitive checks\n var type = typeof a;\n if (type !== \"function\" && type !== \"object\" && typeof b != \"object\") {\n return false;\n }\n // Compare `[[Class]]` names.\n var className = toString.call(a);\n if (className !== toString.call(b)) {\n return false;\n }\n switch (className) {\n // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n case \"[object RegExp]\":\n // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n case \"[object String]\":\n // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n // equivalent to `new String(\"5\")`.\n return \"\" + a === \"\" + b;\n case \"[object Number]\":\n // `NaN`s are equivalent, but non-reflexive.\n // Object(NaN) is equivalent to NaN.\n if (+a !== +a) {\n return +b !== +b;\n }\n // An `egal` comparison is performed for other numeric values.\n return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n case \"[object Date]\":\n case \"[object Boolean]\":\n // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n // millisecond representations. Note that invalid dates with millisecond representations\n // of `NaN` are not equivalent.\n return +a === +b;\n case \"[object Symbol]\":\n return typeof Symbol !== \"undefined\" && Symbol.valueOf.call(a) === Symbol.valueOf.call(b);\n case \"[object Map]\":\n case \"[object Set]\":\n // Maps and Sets are unwrapped to arrays of entry-pairs, adding an incidental level.\n // Hide this extra level by increasing the depth.\n if (depth >= 0) {\n depth++;\n }\n break;\n }\n // Unwrap any wrapped objects.\n a = unwrap(a);\n b = unwrap(b);\n var areArrays = className === \"[object Array]\";\n if (!areArrays) {\n if (typeof a != \"object\" || typeof b != \"object\") {\n return false;\n }\n // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n // from different frames are.\n var aCtor = a.constructor,\n bCtor = b.constructor;\n if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor && isFunction(bCtor) && bCtor instanceof bCtor) && \"constructor\" in a && \"constructor\" in b) {\n return false;\n }\n }\n if (depth === 0) {\n return false;\n } else if (depth < 0) {\n depth = -1;\n }\n // Assume equality for cyclic structures. The algorithm for detecting cyclic\n // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n // Initializing stack of traversed objects.\n // It's done here since we only need them for objects and arrays comparison.\n aStack = aStack || [];\n bStack = bStack || [];\n var length = aStack.length;\n while (length--) {\n // Linear search. Performance is inversely proportional to the number of\n // unique nested structures.\n if (aStack[length] === a) {\n return bStack[length] === b;\n }\n }\n // Add the first object to the stack of traversed objects.\n aStack.push(a);\n bStack.push(b);\n // Recursively compare objects and arrays.\n if (areArrays) {\n // Compare array lengths to determine if a deep comparison is necessary.\n length = a.length;\n if (length !== b.length) {\n return false;\n }\n // Deep compare the contents, ignoring non-numeric properties.\n while (length--) {\n if (!eq(a[length], b[length], depth - 1, aStack, bStack)) {\n return false;\n }\n }\n } else {\n // Deep compare objects.\n var keys = Object.keys(a);\n var key;\n length = keys.length;\n // Ensure that both objects contain the same number of properties before comparing deep equality.\n if (Object.keys(b).length !== length) {\n return false;\n }\n while (length--) {\n // Deep compare each member\n key = keys[length];\n if (!(hasProp(b, key) && eq(a[key], b[key], depth - 1, aStack, bStack))) {\n return false;\n }\n }\n }\n // Remove the first object from the stack of traversed objects.\n aStack.pop();\n bStack.pop();\n return true;\n}\nfunction unwrap(a) {\n if (isObservableArray(a)) {\n return a.slice();\n }\n if (isES6Map(a) || isObservableMap(a)) {\n return Array.from(a.entries());\n }\n if (isES6Set(a) || isObservableSet(a)) {\n return Array.from(a.entries());\n }\n return a;\n}\n\nfunction makeIterable(iterator) {\n iterator[Symbol.iterator] = getSelf;\n return iterator;\n}\nfunction getSelf() {\n return this;\n}\n\nfunction isAnnotation(thing) {\n return (\n // Can be function\n thing instanceof Object && typeof thing.annotationType_ === \"string\" && isFunction(thing.make_) && isFunction(thing.extend_)\n );\n}\n\n/**\n * (c) Michel Weststrate 2015 - 2020\n * MIT Licensed\n *\n * Welcome to the mobx sources! To get a global overview of how MobX internally works,\n * this is a good place to start:\n * https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254#.xvbh6qd74\n *\n * Source folders:\n * ===============\n *\n * - api/ Most of the public static methods exposed by the module can be found here.\n * - core/ Implementation of the MobX algorithm; atoms, derivations, reactions, dependency trees, optimizations. Cool stuff can be found here.\n * - types/ All the magic that is need to have observable objects, arrays and values is in this folder. Including the modifiers like `asFlat`.\n * - utils/ Utility stuff.\n *\n */\n[\"Symbol\", \"Map\", \"Set\"].forEach(function (m) {\n var g = getGlobal();\n if (typeof g[m] === \"undefined\") {\n die(\"MobX requires global '\" + m + \"' to be available or polyfilled\");\n }\n});\nif (typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__ === \"object\") {\n // See: https://github.com/andykog/mobx-devtools/\n __MOBX_DEVTOOLS_GLOBAL_HOOK__.injectMobx({\n spy: spy,\n extras: {\n getDebugName: getDebugName\n },\n $mobx: $mobx\n });\n}\n\nexport { $mobx, FlowCancellationError, ObservableMap, ObservableSet, Reaction, allowStateChanges as _allowStateChanges, runInAction as _allowStateChangesInsideComputed, allowStateReadsEnd as _allowStateReadsEnd, allowStateReadsStart as _allowStateReadsStart, autoAction as _autoAction, _endAction, getAdministration as _getAdministration, getGlobalState as _getGlobalState, interceptReads as _interceptReads, isComputingDerivation as _isComputingDerivation, resetGlobalState as _resetGlobalState, _startAction, action, autorun, comparer, computed, configure, createAtom, apiDefineProperty as defineProperty, entries, extendObservable, flow, flowResult, get, getAtom, getDebugName, getDependencyTree, getObserverTree, has, intercept, isAction, isObservableValue as isBoxedObservable, isComputed, isComputedProp, isFlow, isFlowCancellationError, isObservable, isObservableArray, isObservableMap, isObservableObject, isObservableProp, isObservableSet, keys, makeAutoObservable, makeObservable, observable, observe, onBecomeObserved, onBecomeUnobserved, onReactionError, override, apiOwnKeys as ownKeys, reaction, remove, runInAction, set, spy, toJS, trace, transaction, untracked, values, when };\n//# sourceMappingURL=mobx.esm.js.map\n","import { makeObservable } from \"mobx\";\nimport { useState } from \"react\";\nif (!useState) {\n throw new Error(\"mobx-react-lite requires React with Hooks support\");\n}\nif (!makeObservable) {\n throw new Error(\"mobx-react-lite@3 requires mobx at least version 6 to be available\");\n}\n//# sourceMappingURL=assertEnvironment.js.map","import { configure } from \"mobx\";\nexport function defaultNoopBatch(callback) {\n callback();\n}\nexport function observerBatching(reactionScheduler) {\n if (!reactionScheduler) {\n reactionScheduler = defaultNoopBatch;\n if (\"production\" !== process.env.NODE_ENV) {\n console.warn(\"[MobX] Failed to get unstable_batched updates from react-dom / react-native\");\n }\n }\n configure({ reactionScheduler: reactionScheduler });\n}\nexport var isObserverBatched = function () {\n if (\"production\" !== process.env.NODE_ENV) {\n console.warn(\"[MobX] Deprecated\");\n }\n return true;\n};\n//# sourceMappingURL=observerBatching.js.map","import { getDependencyTree } from \"mobx\";\nexport function printDebugValue(v) {\n return getDependencyTree(v);\n}\n//# sourceMappingURL=printDebugValue.js.map","var globalIsUsingStaticRendering = false;\nexport function enableStaticRendering(enable) {\n globalIsUsingStaticRendering = enable;\n}\nexport function isUsingStaticRendering() {\n return globalIsUsingStaticRendering;\n}\n//# sourceMappingURL=staticRendering.js.map","export var REGISTRY_FINALIZE_AFTER = 10000;\nexport var REGISTRY_SWEEP_INTERVAL = 10000;\nvar TimerBasedFinalizationRegistry = /** @class */ (function () {\n function TimerBasedFinalizationRegistry(finalize) {\n var _this = this;\n Object.defineProperty(this, \"finalize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: finalize\n });\n Object.defineProperty(this, \"registrations\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: new Map()\n });\n Object.defineProperty(this, \"sweepTimeout\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n // Bound so it can be used directly as setTimeout callback.\n Object.defineProperty(this, \"sweep\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: function (maxAge) {\n if (maxAge === void 0) { maxAge = REGISTRY_FINALIZE_AFTER; }\n // cancel timeout so we can force sweep anytime\n clearTimeout(_this.sweepTimeout);\n _this.sweepTimeout = undefined;\n var now = Date.now();\n _this.registrations.forEach(function (registration, token) {\n if (now - registration.registeredAt >= maxAge) {\n _this.finalize(registration.value);\n _this.registrations.delete(token);\n }\n });\n if (_this.registrations.size > 0) {\n _this.scheduleSweep();\n }\n }\n });\n // Bound so it can be exported directly as clearTimers test utility.\n Object.defineProperty(this, \"finalizeAllImmediately\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: function () {\n _this.sweep(0);\n }\n });\n }\n // Token is actually required with this impl\n Object.defineProperty(TimerBasedFinalizationRegistry.prototype, \"register\", {\n enumerable: false,\n configurable: true,\n writable: true,\n value: function (target, value, token) {\n this.registrations.set(token, {\n value: value,\n registeredAt: Date.now()\n });\n this.scheduleSweep();\n }\n });\n Object.defineProperty(TimerBasedFinalizationRegistry.prototype, \"unregister\", {\n enumerable: false,\n configurable: true,\n writable: true,\n value: function (token) {\n this.registrations.delete(token);\n }\n });\n Object.defineProperty(TimerBasedFinalizationRegistry.prototype, \"scheduleSweep\", {\n enumerable: false,\n configurable: true,\n writable: true,\n value: function () {\n if (this.sweepTimeout === undefined) {\n this.sweepTimeout = setTimeout(this.sweep, REGISTRY_SWEEP_INTERVAL);\n }\n }\n });\n return TimerBasedFinalizationRegistry;\n}());\nexport { TimerBasedFinalizationRegistry };\nexport var UniversalFinalizationRegistry = typeof FinalizationRegistry !== \"undefined\"\n ? FinalizationRegistry\n : TimerBasedFinalizationRegistry;\n//# sourceMappingURL=UniversalFinalizationRegistry.js.map","import { UniversalFinalizationRegistry } from \"./UniversalFinalizationRegistry\";\nexport var observerFinalizationRegistry = new UniversalFinalizationRegistry(function (adm) {\n var _a;\n (_a = adm.reaction) === null || _a === void 0 ? void 0 : _a.dispose();\n adm.reaction = null;\n});\n//# sourceMappingURL=observerFinalizationRegistry.js.map","import { Reaction } from \"mobx\";\nimport React from \"react\";\nimport { printDebugValue } from \"./utils/printDebugValue\";\nimport { isUsingStaticRendering } from \"./staticRendering\";\nimport { observerFinalizationRegistry } from \"./utils/observerFinalizationRegistry\";\nimport { useSyncExternalStore } from \"use-sync-external-store/shim\";\n// Required by SSR when hydrating #3669\nvar getServerSnapshot = function () { };\nfunction createReaction(adm) {\n adm.reaction = new Reaction(\"observer\".concat(adm.name), function () {\n var _a;\n adm.stateVersion = Symbol();\n // onStoreChange won't be available until the component \"mounts\".\n // If state changes in between initial render and mount,\n // `useSyncExternalStore` should handle that by checking the state version and issuing update.\n (_a = adm.onStoreChange) === null || _a === void 0 ? void 0 : _a.call(adm);\n });\n}\nexport function useObserver(render, baseComponentName) {\n if (baseComponentName === void 0) { baseComponentName = \"observed\"; }\n if (isUsingStaticRendering()) {\n return render();\n }\n var admRef = React.useRef(null);\n if (!admRef.current) {\n // First render\n var adm_1 = {\n reaction: null,\n onStoreChange: null,\n stateVersion: Symbol(),\n name: baseComponentName,\n subscribe: function (onStoreChange) {\n // Do NOT access admRef here!\n observerFinalizationRegistry.unregister(adm_1);\n adm_1.onStoreChange = onStoreChange;\n if (!adm_1.reaction) {\n // We've lost our reaction and therefore all subscriptions, occurs when:\n // 1. Timer based finalization registry disposed reaction before component mounted.\n // 2. React \"re-mounts\" same component without calling render in between (typically ).\n // We have to recreate reaction and schedule re-render to recreate subscriptions,\n // even if state did not change.\n createReaction(adm_1);\n // `onStoreChange` won't force update if subsequent `getSnapshot` returns same value.\n // So we make sure that is not the case\n adm_1.stateVersion = Symbol();\n }\n return function () {\n var _a;\n // Do NOT access admRef here!\n adm_1.onStoreChange = null;\n (_a = adm_1.reaction) === null || _a === void 0 ? void 0 : _a.dispose();\n adm_1.reaction = null;\n };\n },\n getSnapshot: function () {\n // Do NOT access admRef here!\n return adm_1.stateVersion;\n }\n };\n admRef.current = adm_1;\n }\n var adm = admRef.current;\n if (!adm.reaction) {\n // First render or reaction was disposed by registry before subscribe\n createReaction(adm);\n // StrictMode/ConcurrentMode/Suspense may mean that our component is\n // rendered and abandoned multiple times, so we need to track leaked\n // Reactions.\n observerFinalizationRegistry.register(admRef, adm, adm);\n }\n React.useDebugValue(adm.reaction, printDebugValue);\n useSyncExternalStore(\n // Both of these must be stable, otherwise it would keep resubscribing every render.\n adm.subscribe, adm.getSnapshot, getServerSnapshot);\n // render the original component, but have the\n // reaction track the observables, so that rendering\n // can be invalidated (see above) once a dependency changes\n var renderResult;\n var exception;\n adm.reaction.track(function () {\n try {\n renderResult = render();\n }\n catch (e) {\n exception = e;\n }\n });\n if (exception) {\n throw exception; // re-throw any exceptions caught during rendering\n }\n return renderResult;\n}\n//# sourceMappingURL=useObserver.js.map","import { forwardRef, memo } from \"react\";\nimport { isUsingStaticRendering } from \"./staticRendering\";\nimport { useObserver } from \"./useObserver\";\nvar warnObserverOptionsDeprecated = true;\nvar hasSymbol = typeof Symbol === \"function\" && Symbol.for;\n// Using react-is had some issues (and operates on elements, not on types), see #608 / #609\nvar ReactForwardRefSymbol = hasSymbol\n ? Symbol.for(\"react.forward_ref\")\n : typeof forwardRef === \"function\" && forwardRef(function (props) { return null; })[\"$$typeof\"];\nvar ReactMemoSymbol = hasSymbol\n ? Symbol.for(\"react.memo\")\n : typeof memo === \"function\" && memo(function (props) { return null; })[\"$$typeof\"];\n// n.b. base case is not used for actual typings or exported in the typing files\nexport function observer(baseComponent, \n// TODO remove in next major\noptions) {\n var _a;\n if (process.env.NODE_ENV !== \"production\" && warnObserverOptionsDeprecated && options) {\n warnObserverOptionsDeprecated = false;\n console.warn(\"[mobx-react-lite] `observer(fn, { forwardRef: true })` is deprecated, use `observer(React.forwardRef(fn))`\");\n }\n if (ReactMemoSymbol && baseComponent[\"$$typeof\"] === ReactMemoSymbol) {\n throw new Error(\"[mobx-react-lite] You are trying to use `observer` on a function component wrapped in either another `observer` or `React.memo`. The observer already applies 'React.memo' for you.\");\n }\n // The working of observer is explained step by step in this talk: https://www.youtube.com/watch?v=cPF4iBedoF0&feature=youtu.be&t=1307\n if (isUsingStaticRendering()) {\n return baseComponent;\n }\n var useForwardRef = (_a = options === null || options === void 0 ? void 0 : options.forwardRef) !== null && _a !== void 0 ? _a : false;\n var render = baseComponent;\n var baseComponentName = baseComponent.displayName || baseComponent.name;\n // If already wrapped with forwardRef, unwrap,\n // so we can patch render and apply memo\n if (ReactForwardRefSymbol && baseComponent[\"$$typeof\"] === ReactForwardRefSymbol) {\n useForwardRef = true;\n render = baseComponent[\"render\"];\n if (typeof render !== \"function\") {\n throw new Error(\"[mobx-react-lite] `render` property of ForwardRef was not a function\");\n }\n }\n var observerComponent = function (props, ref) {\n return useObserver(function () { return render(props, ref); }, baseComponentName);\n };\n observerComponent.displayName = baseComponent.displayName;\n Object.defineProperty(observerComponent, \"name\", {\n value: baseComponent.name,\n writable: true,\n configurable: true\n });\n // Support legacy context: `contextTypes` must be applied before `memo`\n if (baseComponent.contextTypes) {\n ;\n observerComponent.contextTypes = baseComponent.contextTypes;\n }\n if (useForwardRef) {\n // `forwardRef` must be applied prior `memo`\n // `forwardRef(observer(cmp))` throws:\n // \"forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))\"\n observerComponent = forwardRef(observerComponent);\n }\n // memo; we are not interested in deep updates\n // in props; we assume that if deep objects are changed,\n // this is in observables, which would have been tracked anyway\n observerComponent = memo(observerComponent);\n copyStaticProperties(baseComponent, observerComponent);\n if (\"production\" !== process.env.NODE_ENV) {\n Object.defineProperty(observerComponent, \"contextTypes\", {\n set: function () {\n var _a, _b;\n throw new Error(\"[mobx-react-lite] `\".concat(this.displayName || ((_a = this.type) === null || _a === void 0 ? void 0 : _a.displayName) || ((_b = this.type) === null || _b === void 0 ? void 0 : _b.name) || \"Component\", \".contextTypes` must be set before applying `observer`.\"));\n }\n });\n }\n return observerComponent;\n}\n// based on https://github.com/mridgway/hoist-non-react-statics/blob/master/src/index.js\nvar hoistBlackList = {\n $$typeof: true,\n render: true,\n compare: true,\n type: true,\n // Don't redefine `displayName`,\n // it's defined as getter-setter pair on `memo` (see #3192).\n displayName: true\n};\nfunction copyStaticProperties(base, target) {\n Object.keys(base).forEach(function (key) {\n if (!hoistBlackList[key]) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(base, key));\n }\n });\n}\n//# sourceMappingURL=observer.js.map","var __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nimport { useDeprecated } from \"./utils/utils\";\nimport { observable, runInAction } from \"mobx\";\nimport { useState } from \"react\";\nexport function useAsObservableSource(current) {\n if (\"production\" !== process.env.NODE_ENV)\n useDeprecated(\"[mobx-react-lite] 'useAsObservableSource' is deprecated, please store the values directly in an observable, for example by using 'useLocalObservable', and sync future updates using 'useEffect' when needed. See the README for examples.\");\n var _a = __read(useState(function () { return observable(current, {}, { deep: false }); }), 1), res = _a[0];\n runInAction(function () {\n Object.assign(res, current);\n });\n return res;\n}\n//# sourceMappingURL=useAsObservableSource.js.map","var _a;\nimport \"./utils/assertEnvironment\";\nimport { unstable_batchedUpdates as batch } from \"./utils/reactBatchedUpdates\";\nimport { observerBatching } from \"./utils/observerBatching\";\nimport { useDeprecated } from \"./utils/utils\";\nimport { useObserver as useObserverOriginal } from \"./useObserver\";\nimport { enableStaticRendering } from \"./staticRendering\";\nimport { observerFinalizationRegistry } from \"./utils/observerFinalizationRegistry\";\nobserverBatching(batch);\nexport { isUsingStaticRendering, enableStaticRendering } from \"./staticRendering\";\nexport { observer } from \"./observer\";\nexport { Observer } from \"./ObserverComponent\";\nexport { useLocalObservable } from \"./useLocalObservable\";\nexport { useLocalStore } from \"./useLocalStore\";\nexport { useAsObservableSource } from \"./useAsObservableSource\";\nexport { observerFinalizationRegistry as _observerFinalizationRegistry };\nexport var clearTimers = (_a = observerFinalizationRegistry[\"finalizeAllImmediately\"]) !== null && _a !== void 0 ? _a : (function () { });\nexport function useObserver(fn, baseComponentName) {\n if (baseComponentName === void 0) { baseComponentName = \"observed\"; }\n if (\"production\" !== process.env.NODE_ENV) {\n useDeprecated(\"[mobx-react-lite] 'useObserver(fn)' is deprecated. Use `{fn}` instead, or wrap the entire component in `observer`.\");\n }\n return useObserverOriginal(fn, baseComponentName);\n}\nexport { isObserverBatched, observerBatching } from \"./utils/observerBatching\";\nexport function useStaticRendering(enable) {\n if (\"production\" !== process.env.NODE_ENV) {\n console.warn(\"[mobx-react-lite] 'useStaticRendering' is deprecated, use 'enableStaticRendering' instead\");\n }\n enableStaticRendering(enable);\n}\n//# sourceMappingURL=index.js.map","import { _getGlobalState, Reaction, _allowStateChanges, untracked, isObservableMap, isObservableObject, isObservableArray, observable } from 'mobx';\nimport React__default, { PureComponent, Component } from 'react';\nimport { isUsingStaticRendering, _observerFinalizationRegistry, observer as observer$1 } from 'mobx-react-lite';\nexport { Observer, enableStaticRendering, isUsingStaticRendering, observerBatching, useAsObservableSource, useLocalObservable, useLocalStore, useObserver, useStaticRendering } from 'mobx-react-lite';\n\nfunction shallowEqual(objA, objB) {\n //From: https://github.com/facebook/fbjs/blob/c69904a511b900266935168223063dd8772dfc40/packages/fbjs/src/core/shallowEqual.js\n if (is(objA, objB)) {\n return true;\n }\n if (typeof objA !== \"object\" || objA === null || typeof objB !== \"object\" || objB === null) {\n return false;\n }\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n if (keysA.length !== keysB.length) {\n return false;\n }\n for (var i = 0; i < keysA.length; i++) {\n if (!Object.hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n return false;\n }\n }\n return true;\n}\nfunction is(x, y) {\n // From: https://github.com/facebook/fbjs/blob/c69904a511b900266935168223063dd8772dfc40/packages/fbjs/src/core/shallowEqual.js\n if (x === y) {\n return x !== 0 || 1 / x === 1 / y;\n } else {\n return x !== x && y !== y;\n }\n}\n// based on https://github.com/mridgway/hoist-non-react-statics/blob/master/src/index.js\nvar hoistBlackList = {\n $$typeof: 1,\n render: 1,\n compare: 1,\n type: 1,\n childContextTypes: 1,\n contextType: 1,\n contextTypes: 1,\n defaultProps: 1,\n getDefaultProps: 1,\n getDerivedStateFromError: 1,\n getDerivedStateFromProps: 1,\n mixins: 1,\n displayName: 1,\n propTypes: 1\n};\nfunction copyStaticProperties(base, target) {\n var protoProps = Object.getOwnPropertyNames(Object.getPrototypeOf(base));\n Object.getOwnPropertyNames(base).forEach(function (key) {\n if (!hoistBlackList[key] && protoProps.indexOf(key) === -1) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(base, key));\n }\n });\n}\n/**\n * Utilities for patching componentWillUnmount, to make sure @disposeOnUnmount works correctly icm with user defined hooks\n * and the handler provided by mobx-react\n */\nvar mobxMixins = /*#__PURE__*/Symbol(\"patchMixins\");\nvar mobxPatchedDefinition = /*#__PURE__*/Symbol(\"patchedDefinition\");\nfunction getMixins(target, methodName) {\n var mixins = target[mobxMixins] = target[mobxMixins] || {};\n var methodMixins = mixins[methodName] = mixins[methodName] || {};\n methodMixins.locks = methodMixins.locks || 0;\n methodMixins.methods = methodMixins.methods || [];\n return methodMixins;\n}\nfunction wrapper(realMethod, mixins) {\n var _this = this;\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n // locks are used to ensure that mixins are invoked only once per invocation, even on recursive calls\n mixins.locks++;\n try {\n var retVal;\n if (realMethod !== undefined && realMethod !== null) {\n retVal = realMethod.apply(this, args);\n }\n return retVal;\n } finally {\n mixins.locks--;\n if (mixins.locks === 0) {\n mixins.methods.forEach(function (mx) {\n mx.apply(_this, args);\n });\n }\n }\n}\nfunction wrapFunction(realMethod, mixins) {\n var fn = function fn() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n wrapper.call.apply(wrapper, [this, realMethod, mixins].concat(args));\n };\n return fn;\n}\nfunction patch(target, methodName, mixinMethod) {\n var mixins = getMixins(target, methodName);\n if (mixins.methods.indexOf(mixinMethod) < 0) {\n mixins.methods.push(mixinMethod);\n }\n var oldDefinition = Object.getOwnPropertyDescriptor(target, methodName);\n if (oldDefinition && oldDefinition[mobxPatchedDefinition]) {\n // already patched definition, do not repatch\n return;\n }\n var originalMethod = target[methodName];\n var newDefinition = createDefinition(target, methodName, oldDefinition ? oldDefinition.enumerable : undefined, mixins, originalMethod);\n Object.defineProperty(target, methodName, newDefinition);\n}\nfunction createDefinition(target, methodName, enumerable, mixins, originalMethod) {\n var _ref;\n var wrappedFunc = wrapFunction(originalMethod, mixins);\n return _ref = {}, _ref[mobxPatchedDefinition] = true, _ref.get = function get() {\n return wrappedFunc;\n }, _ref.set = function set(value) {\n if (this === target) {\n wrappedFunc = wrapFunction(value, mixins);\n } else {\n // when it is an instance of the prototype/a child prototype patch that particular case again separately\n // since we need to store separate values depending on wether it is the actual instance, the prototype, etc\n // e.g. the method for super might not be the same as the method for the prototype which might be not the same\n // as the method for the instance\n var newDefinition = createDefinition(this, methodName, enumerable, mixins, value);\n Object.defineProperty(this, methodName, newDefinition);\n }\n }, _ref.configurable = true, _ref.enumerable = enumerable, _ref;\n}\n\nvar administrationSymbol = /*#__PURE__*/Symbol(\"ObserverAdministration\");\nvar isMobXReactObserverSymbol = /*#__PURE__*/Symbol(\"isMobXReactObserver\");\nvar observablePropDescriptors;\nif (process.env.NODE_ENV !== \"production\") {\n observablePropDescriptors = {\n props: /*#__PURE__*/createObservablePropDescriptor(\"props\"),\n state: /*#__PURE__*/createObservablePropDescriptor(\"state\"),\n context: /*#__PURE__*/createObservablePropDescriptor(\"context\")\n };\n}\nfunction getAdministration(component) {\n var _component$administra;\n // We create administration lazily, because we can't patch constructor\n // and the exact moment of initialization partially depends on React internals.\n // At the time of writing this, the first thing invoked is one of the observable getter/setter (state/props/context).\n return (_component$administra = component[administrationSymbol]) != null ? _component$administra : component[administrationSymbol] = {\n reaction: null,\n mounted: false,\n reactionInvalidatedBeforeMount: false,\n forceUpdate: null,\n name: getDisplayName(component.constructor),\n state: undefined,\n props: undefined,\n context: undefined\n };\n}\nfunction makeClassComponentObserver(componentClass) {\n var prototype = componentClass.prototype;\n if (componentClass[isMobXReactObserverSymbol]) {\n var displayName = getDisplayName(componentClass);\n throw new Error(\"The provided component class (\" + displayName + \") has already been declared as an observer component.\");\n } else {\n componentClass[isMobXReactObserverSymbol] = true;\n }\n if (prototype.componentWillReact) {\n throw new Error(\"The componentWillReact life-cycle event is no longer supported\");\n }\n if (componentClass[\"__proto__\"] !== PureComponent) {\n if (!prototype.shouldComponentUpdate) {\n prototype.shouldComponentUpdate = observerSCU;\n } else if (prototype.shouldComponentUpdate !== observerSCU) {\n // n.b. unequal check, instead of existence check, as @observer might be on superclass as well\n throw new Error(\"It is not allowed to use shouldComponentUpdate in observer based components.\");\n }\n }\n if (process.env.NODE_ENV !== \"production\") {\n Object.defineProperties(prototype, observablePropDescriptors);\n }\n var originalRender = prototype.render;\n if (typeof originalRender !== \"function\") {\n var _displayName = getDisplayName(componentClass);\n throw new Error(\"[mobx-react] class component (\" + _displayName + \") is missing `render` method.\" + \"\\n`observer` requires `render` being a function defined on prototype.\" + \"\\n`render = () => {}` or `render = function() {}` is not supported.\");\n }\n prototype.render = function () {\n Object.defineProperty(this, \"render\", {\n // There is no safe way to replace render, therefore it's forbidden.\n configurable: false,\n writable: false,\n value: isUsingStaticRendering() ? originalRender : createReactiveRender.call(this, originalRender)\n });\n return this.render();\n };\n var originalComponentDidMount = prototype.componentDidMount;\n prototype.componentDidMount = function () {\n var _this = this;\n if (process.env.NODE_ENV !== \"production\" && this.componentDidMount !== Object.getPrototypeOf(this).componentDidMount) {\n var _displayName2 = getDisplayName(componentClass);\n throw new Error(\"[mobx-react] `observer(\" + _displayName2 + \").componentDidMount` must be defined on prototype.\" + \"\\n`componentDidMount = () => {}` or `componentDidMount = function() {}` is not supported.\");\n }\n // `componentDidMount` may not be called at all. React can abandon the instance after `render`.\n // That's why we use finalization registry to dispose reaction created during render.\n // Happens with `` see #3492\n //\n // `componentDidMount` can be called immediately after `componentWillUnmount` without calling `render` in between.\n // Happens with ``see #3395.\n //\n // If `componentDidMount` is called, it's guaranteed to run synchronously with render (similary to `useLayoutEffect`).\n // Therefore we don't have to worry about external (observable) state being updated before mount (no state version checking).\n //\n // Things may change: \"In the future, React will provide a feature that lets components preserve state between unmounts\"\n var admin = getAdministration(this);\n admin.mounted = true;\n // Component instance committed, prevent reaction disposal.\n _observerFinalizationRegistry.unregister(this);\n // We don't set forceUpdate before mount because it requires a reference to `this`,\n // therefore `this` could NOT be garbage collected before mount,\n // preventing reaction disposal by FinalizationRegistry and leading to memory leak.\n // As an alternative we could have `admin.instanceRef = new WeakRef(this)`, but lets avoid it if possible.\n admin.forceUpdate = function () {\n return _this.forceUpdate();\n };\n if (!admin.reaction || admin.reactionInvalidatedBeforeMount) {\n // Missing reaction:\n // 1. Instance was unmounted (reaction disposed) and immediately remounted without running render #3395.\n // 2. Reaction was disposed by finalization registry before mount. Shouldn't ever happen for class components:\n // `componentDidMount` runs synchronously after render, but our registry are deferred (can't run in between).\n // In any case we lost subscriptions to observables, so we have to create new reaction and re-render to resubscribe.\n // The reaction will be created lazily by following render.\n // Reaction invalidated before mount:\n // 1. A descendant's `componenDidMount` invalidated it's parent #3730\n admin.forceUpdate();\n }\n return originalComponentDidMount == null ? void 0 : originalComponentDidMount.apply(this, arguments);\n };\n // TODO@major Overly complicated \"patch\" is only needed to support the deprecated @disposeOnUnmount\n patch(prototype, \"componentWillUnmount\", function () {\n var _admin$reaction;\n if (isUsingStaticRendering()) {\n return;\n }\n var admin = getAdministration(this);\n (_admin$reaction = admin.reaction) == null ? void 0 : _admin$reaction.dispose();\n admin.reaction = null;\n admin.forceUpdate = null;\n admin.mounted = false;\n admin.reactionInvalidatedBeforeMount = false;\n });\n return componentClass;\n}\n// Generates a friendly name for debugging\nfunction getDisplayName(componentClass) {\n return componentClass.displayName || componentClass.name || \"\";\n}\nfunction createReactiveRender(originalRender) {\n var boundOriginalRender = originalRender.bind(this);\n var admin = getAdministration(this);\n function reactiveRender() {\n if (!admin.reaction) {\n // Create reaction lazily to support re-mounting #3395\n admin.reaction = createReaction(admin);\n if (!admin.mounted) {\n // React can abandon this instance and never call `componentDidMount`/`componentWillUnmount`,\n // we have to make sure reaction will be disposed.\n _observerFinalizationRegistry.register(this, admin, this);\n }\n }\n var error = undefined;\n var renderResult = undefined;\n admin.reaction.track(function () {\n try {\n // TODO@major\n // Optimization: replace with _allowStateChangesStart/End (not available in mobx@6.0.0)\n renderResult = _allowStateChanges(false, boundOriginalRender);\n } catch (e) {\n error = e;\n }\n });\n if (error) {\n throw error;\n }\n return renderResult;\n }\n return reactiveRender;\n}\nfunction createReaction(admin) {\n return new Reaction(admin.name + \".render()\", function () {\n if (!admin.mounted) {\n // This is neccessary to avoid react warning about calling forceUpdate on component that isn't mounted yet.\n // This happens when component is abandoned after render - our reaction is already created and reacts to changes.\n // `componenDidMount` runs synchronously after `render`, so unlike functional component, there is no delay during which the reaction could be invalidated.\n // However `componentDidMount` runs AFTER it's descendants' `componentDidMount`, which CAN invalidate the reaction, see #3730. Therefore remember and forceUpdate on mount.\n admin.reactionInvalidatedBeforeMount = true;\n return;\n }\n try {\n admin.forceUpdate == null ? void 0 : admin.forceUpdate();\n } catch (error) {\n var _admin$reaction2;\n (_admin$reaction2 = admin.reaction) == null ? void 0 : _admin$reaction2.dispose();\n admin.reaction = null;\n }\n });\n}\nfunction observerSCU(nextProps, nextState) {\n if (isUsingStaticRendering()) {\n console.warn(\"[mobx-react] It seems that a re-rendering of a React component is triggered while in static (server-side) mode. Please make sure components are rendered only once server-side.\");\n }\n // update on any state changes (as is the default)\n if (this.state !== nextState) {\n return true;\n }\n // update if props are shallowly not equal, inspired by PureRenderMixin\n // we could return just 'false' here, and avoid the `skipRender` checks etc\n // however, it is nicer if lifecycle events are triggered like usually,\n // so we return true here if props are shallowly modified.\n return !shallowEqual(this.props, nextProps);\n}\nfunction createObservablePropDescriptor(key) {\n return {\n configurable: true,\n enumerable: true,\n get: function get() {\n var admin = getAdministration(this);\n var derivation = _getGlobalState().trackingDerivation;\n if (derivation && derivation !== admin.reaction) {\n throw new Error(\"[mobx-react] Cannot read \\\"\" + admin.name + \".\" + key + \"\\\" in a reactive context, as it isn't observable.\\n Please use component lifecycle method to copy the value into a local observable first.\\n See https://github.com/mobxjs/mobx/blob/main/packages/mobx-react/README.md#note-on-using-props-and-state-in-derivations\");\n }\n return admin[key];\n },\n set: function set(value) {\n getAdministration(this)[key] = value;\n }\n };\n}\n\nfunction observer(component, context) {\n if (context && context.kind !== \"class\") {\n throw new Error(\"The @observer decorator can be used on classes only\");\n }\n if (component[\"isMobxInjector\"] === true) {\n console.warn(\"Mobx observer: You are trying to use `observer` on a component that already has `inject`. Please apply `observer` before applying `inject`\");\n }\n if (Object.prototype.isPrototypeOf.call(Component, component) || Object.prototype.isPrototypeOf.call(PureComponent, component)) {\n // Class component\n return makeClassComponentObserver(component);\n } else {\n // Function component\n return observer$1(component);\n }\n}\n\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\n\nvar _excluded = [\"children\"];\nvar MobXProviderContext = /*#__PURE__*/React__default.createContext({});\nfunction Provider(props) {\n var children = props.children,\n stores = _objectWithoutPropertiesLoose(props, _excluded);\n var parentValue = React__default.useContext(MobXProviderContext);\n var mutableProviderRef = React__default.useRef(_extends({}, parentValue, stores));\n var value = mutableProviderRef.current;\n if (process.env.NODE_ENV !== \"production\") {\n var newValue = _extends({}, value, stores); // spread in previous state for the context based stores\n if (!shallowEqual(value, newValue)) {\n throw new Error(\"MobX Provider: The set of provided stores has changed. See: https://github.com/mobxjs/mobx-react#the-set-of-provided-stores-has-changed-error.\");\n }\n }\n return React__default.createElement(MobXProviderContext.Provider, {\n value: value\n }, children);\n}\nProvider.displayName = \"MobXProvider\";\n\n/**\n * Store Injection\n */\nfunction createStoreInjector(grabStoresFn, component, injectNames, makeReactive) {\n // Support forward refs\n var Injector = React__default.forwardRef(function (props, ref) {\n var newProps = _extends({}, props);\n var context = React__default.useContext(MobXProviderContext);\n Object.assign(newProps, grabStoresFn(context || {}, newProps) || {});\n if (ref) {\n newProps.ref = ref;\n }\n return React__default.createElement(component, newProps);\n });\n if (makeReactive) Injector = observer(Injector);\n Injector[\"isMobxInjector\"] = true; // assigned late to suppress observer warning\n // Static fields from component should be visible on the generated Injector\n copyStaticProperties(component, Injector);\n Injector[\"wrappedComponent\"] = component;\n Injector.displayName = getInjectName(component, injectNames);\n return Injector;\n}\nfunction getInjectName(component, injectNames) {\n var displayName;\n var componentName = component.displayName || component.name || component.constructor && component.constructor.name || \"Component\";\n if (injectNames) displayName = \"inject-with-\" + injectNames + \"(\" + componentName + \")\";else displayName = \"inject(\" + componentName + \")\";\n return displayName;\n}\nfunction grabStoresByName(storeNames) {\n return function (baseStores, nextProps) {\n storeNames.forEach(function (storeName) {\n if (storeName in nextProps // prefer props over stores\n ) return;\n if (!(storeName in baseStores)) throw new Error(\"MobX injector: Store '\" + storeName + \"' is not available! Make sure it is provided by some Provider\");\n nextProps[storeName] = baseStores[storeName];\n });\n return nextProps;\n };\n}\n/**\n * higher order component that injects stores to a child.\n * takes either a varargs list of strings, which are stores read from the context,\n * or a function that manually maps the available stores from the context to props:\n * storesToProps(mobxStores, props, context) => newProps\n */\nfunction inject() {\n for (var _len = arguments.length, storeNames = new Array(_len), _key = 0; _key < _len; _key++) {\n storeNames[_key] = arguments[_key];\n }\n if (typeof arguments[0] === \"function\") {\n var grabStoresFn = arguments[0];\n return function (componentClass) {\n return createStoreInjector(grabStoresFn, componentClass, grabStoresFn.name, true);\n };\n } else {\n return function (componentClass) {\n return createStoreInjector(grabStoresByName(storeNames), componentClass, storeNames.join(\"-\"), false);\n };\n }\n}\n\nvar reactMajorVersion = /*#__PURE__*/Number.parseInt( /*#__PURE__*/React__default.version.split(\".\")[0]);\nvar warnedAboutDisposeOnUnmountDeprecated = false;\nvar protoStoreKey = /*#__PURE__*/Symbol(\"disposeOnUnmountProto\");\nvar instStoreKey = /*#__PURE__*/Symbol(\"disposeOnUnmountInst\");\nfunction runDisposersOnWillUnmount() {\n var _this = this;\n [].concat(this[protoStoreKey] || [], this[instStoreKey] || []).forEach(function (propKeyOrFunction) {\n var prop = typeof propKeyOrFunction === \"string\" ? _this[propKeyOrFunction] : propKeyOrFunction;\n if (prop !== undefined && prop !== null) {\n if (Array.isArray(prop)) prop.map(function (f) {\n return f();\n });else prop();\n }\n });\n}\n/**\n * @deprecated `disposeOnUnmount` is not compatible with React 18 and higher.\n */\nfunction disposeOnUnmount(target, propertyKeyOrFunction) {\n if (Array.isArray(propertyKeyOrFunction)) {\n return propertyKeyOrFunction.map(function (fn) {\n return disposeOnUnmount(target, fn);\n });\n }\n if (!warnedAboutDisposeOnUnmountDeprecated) {\n if (reactMajorVersion >= 18) {\n console.error(\"[mobx-react] disposeOnUnmount is not compatible with React 18 and higher. Don't use it.\");\n } else {\n console.warn(\"[mobx-react] disposeOnUnmount is deprecated. It won't work correctly with React 18 and higher.\");\n }\n warnedAboutDisposeOnUnmountDeprecated = true;\n }\n var c = Object.getPrototypeOf(target).constructor;\n var c2 = Object.getPrototypeOf(target.constructor);\n // Special case for react-hot-loader\n var c3 = Object.getPrototypeOf(Object.getPrototypeOf(target));\n if (!(c === React__default.Component || c === React__default.PureComponent || c2 === React__default.Component || c2 === React__default.PureComponent || c3 === React__default.Component || c3 === React__default.PureComponent)) {\n throw new Error(\"[mobx-react] disposeOnUnmount only supports direct subclasses of React.Component or React.PureComponent.\");\n }\n if (typeof propertyKeyOrFunction !== \"string\" && typeof propertyKeyOrFunction !== \"function\" && !Array.isArray(propertyKeyOrFunction)) {\n throw new Error(\"[mobx-react] disposeOnUnmount only works if the parameter is either a property key or a function.\");\n }\n // decorator's target is the prototype, so it doesn't have any instance properties like props\n var isDecorator = typeof propertyKeyOrFunction === \"string\";\n // add property key / function we want run (disposed) to the store\n var componentWasAlreadyModified = !!target[protoStoreKey] || !!target[instStoreKey];\n var store = isDecorator ?\n // decorators are added to the prototype store\n target[protoStoreKey] || (target[protoStoreKey] = []) :\n // functions are added to the instance store\n target[instStoreKey] || (target[instStoreKey] = []);\n store.push(propertyKeyOrFunction);\n // tweak the component class componentWillUnmount if not done already\n if (!componentWasAlreadyModified) {\n patch(target, \"componentWillUnmount\", runDisposersOnWillUnmount);\n }\n // return the disposer as is if invoked as a non decorator\n if (typeof propertyKeyOrFunction !== \"string\") {\n return propertyKeyOrFunction;\n }\n}\n\n// Copied from React.PropTypes\nfunction createChainableTypeChecker(validator) {\n function checkType(isRequired, props, propName, componentName, location, propFullName) {\n for (var _len = arguments.length, rest = new Array(_len > 6 ? _len - 6 : 0), _key = 6; _key < _len; _key++) {\n rest[_key - 6] = arguments[_key];\n }\n return untracked(function () {\n componentName = componentName || \"<>\";\n propFullName = propFullName || propName;\n if (props[propName] == null) {\n if (isRequired) {\n var actual = props[propName] === null ? \"null\" : \"undefined\";\n return new Error(\"The \" + location + \" `\" + propFullName + \"` is marked as required \" + \"in `\" + componentName + \"`, but its value is `\" + actual + \"`.\");\n }\n return null;\n } else {\n // @ts-ignore rest arg is necessary for some React internals - fails tests otherwise\n return validator.apply(void 0, [props, propName, componentName, location, propFullName].concat(rest));\n }\n });\n }\n var chainedCheckType = checkType.bind(null, false);\n // Add isRequired to satisfy Requirable\n chainedCheckType.isRequired = checkType.bind(null, true);\n return chainedCheckType;\n}\n// Copied from React.PropTypes\nfunction isSymbol(propType, propValue) {\n // Native Symbol.\n if (propType === \"symbol\") {\n return true;\n }\n // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n if (propValue[\"@@toStringTag\"] === \"Symbol\") {\n return true;\n }\n // Fallback for non-spec compliant Symbols which are polyfilled.\n if (typeof Symbol === \"function\" && propValue instanceof Symbol) {\n return true;\n }\n return false;\n}\n// Copied from React.PropTypes\nfunction getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return \"array\";\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return \"object\";\n }\n if (isSymbol(propType, propValue)) {\n return \"symbol\";\n }\n return propType;\n}\n// This handles more types than `getPropType`. Only used for error messages.\n// Copied from React.PropTypes\nfunction getPreciseType(propValue) {\n var propType = getPropType(propValue);\n if (propType === \"object\") {\n if (propValue instanceof Date) {\n return \"date\";\n } else if (propValue instanceof RegExp) {\n return \"regexp\";\n }\n }\n return propType;\n}\nfunction createObservableTypeCheckerCreator(allowNativeType, mobxType) {\n return createChainableTypeChecker(function (props, propName, componentName, location, propFullName) {\n return untracked(function () {\n if (allowNativeType) {\n if (getPropType(props[propName]) === mobxType.toLowerCase()) return null;\n }\n var mobxChecker;\n switch (mobxType) {\n case \"Array\":\n mobxChecker = isObservableArray;\n break;\n case \"Object\":\n mobxChecker = isObservableObject;\n break;\n case \"Map\":\n mobxChecker = isObservableMap;\n break;\n default:\n throw new Error(\"Unexpected mobxType: \" + mobxType);\n }\n var propValue = props[propName];\n if (!mobxChecker(propValue)) {\n var preciseType = getPreciseType(propValue);\n var nativeTypeExpectationMessage = allowNativeType ? \" or javascript `\" + mobxType.toLowerCase() + \"`\" : \"\";\n return new Error(\"Invalid prop `\" + propFullName + \"` of type `\" + preciseType + \"` supplied to\" + \" `\" + componentName + \"`, expected `mobx.Observable\" + mobxType + \"`\" + nativeTypeExpectationMessage + \".\");\n }\n return null;\n });\n });\n}\nfunction createObservableArrayOfTypeChecker(allowNativeType, typeChecker) {\n return createChainableTypeChecker(function (props, propName, componentName, location, propFullName) {\n for (var _len2 = arguments.length, rest = new Array(_len2 > 5 ? _len2 - 5 : 0), _key2 = 5; _key2 < _len2; _key2++) {\n rest[_key2 - 5] = arguments[_key2];\n }\n return untracked(function () {\n if (typeof typeChecker !== \"function\") {\n return new Error(\"Property `\" + propFullName + \"` of component `\" + componentName + \"` has \" + \"invalid PropType notation.\");\n } else {\n var error = createObservableTypeCheckerCreator(allowNativeType, \"Array\")(props, propName, componentName, location, propFullName);\n if (error instanceof Error) return error;\n var propValue = props[propName];\n for (var i = 0; i < propValue.length; i++) {\n error = typeChecker.apply(void 0, [propValue, i, componentName, location, propFullName + \"[\" + i + \"]\"].concat(rest));\n if (error instanceof Error) return error;\n }\n return null;\n }\n });\n });\n}\nvar observableArray = /*#__PURE__*/createObservableTypeCheckerCreator(false, \"Array\");\nvar observableArrayOf = /*#__PURE__*/createObservableArrayOfTypeChecker.bind(null, false);\nvar observableMap = /*#__PURE__*/createObservableTypeCheckerCreator(false, \"Map\");\nvar observableObject = /*#__PURE__*/createObservableTypeCheckerCreator(false, \"Object\");\nvar arrayOrObservableArray = /*#__PURE__*/createObservableTypeCheckerCreator(true, \"Array\");\nvar arrayOrObservableArrayOf = /*#__PURE__*/createObservableArrayOfTypeChecker.bind(null, true);\nvar objectOrObservableObject = /*#__PURE__*/createObservableTypeCheckerCreator(true, \"Object\");\nvar PropTypes = {\n observableArray: observableArray,\n observableArrayOf: observableArrayOf,\n observableMap: observableMap,\n observableObject: observableObject,\n arrayOrObservableArray: arrayOrObservableArray,\n arrayOrObservableArrayOf: arrayOrObservableArrayOf,\n objectOrObservableObject: objectOrObservableObject\n};\n\nif (!Component) {\n throw new Error(\"mobx-react requires React to be available\");\n}\nif (!observable) {\n throw new Error(\"mobx-react requires mobx to be available\");\n}\n\nexport { MobXProviderContext, PropTypes, Provider, disposeOnUnmount, inject, observer };\n//# sourceMappingURL=mobxreact.esm.js.map\n","\nimport React from 'react';\nimport { f7 } from 'framework7-react';\nimport { Dom7 } from 'framework7'\n\nclass WrapDevice {\n constructor(){\n const ua = navigator.userAgent,\n isMobile = /Mobile(\\/|\\s|;)/.test(ua);\n\n this.isPhone = /(iPhone|iPod)/.test(ua) ||\n (!/(Silk)/.test(ua) && (/(Android)/.test(ua) && !/Galaxy Tab S6|SCH-I800|Lenovo YT-X705X/.test(ua) && (/(Android 2)/.test(ua) || isMobile))) ||\n (/(BlackBerry|BB)/.test(ua) && isMobile) ||\n /(Windows Phone)/.test(ua);\n\n this.isTablet = !this.isPhone && (/iPad/.test(ua) || /Android/.test(ua) || /(RIM Tablet OS)/.test(ua) ||\n (/MSIE 10/.test(ua) && /; Touch/.test(ua)));\n }\n\n initDom() {\n const $$ = Dom7;\n if ( this.sailfish ) {\n $$('html').addClass('sailfish');\n }\n\n $$('html').addClass(this.phone ? 'phone' : 'tablet');\n // $$(window).on('resize', _.bind(this.onWindowResize, this));\n }\n\n get phone() {\n return this.isPhone\n }\n\n get tablet() {\n return this.isTablet\n }\n\n get sailfish() {\n return /Sailfish/.test(navigator.userAgent) || /Jolla/.test(navigator.userAgent);\n }\n\n get android() {\n return f7.device.android;\n }\n\n get ios() {\n return f7.device.ios;\n }\n}\n\nconst device = new WrapDevice();\nexport {device as Device};\n","import e from\"void-elements\";var t=/\\s([^'\"/\\s><]+?)[\\s/>]|([^\\s=]+)=\\s?(\".*?\"|'.*?')/g;function n(n){var r={type:\"tag\",name:\"\",voidElement:!1,attrs:{},children:[]},i=n.match(/<\\/?([^\\s]+?)[/\\s>]/);if(i&&(r.name=i[1],(e[i[1]]||\"/\"===n.charAt(n.length-2))&&(r.voidElement=!0),r.name.startsWith(\"!--\"))){var s=n.indexOf(\"--\\x3e\");return{type:\"comment\",comment:-1!==s?n.slice(4,s):\"\"}}for(var a=new RegExp(t),c=null;null!==(c=a.exec(n));)if(c[0].trim())if(c[1]){var o=c[1].trim(),l=[o,\"\"];o.indexOf(\"=\")>-1&&(l=o.split(\"=\")),r.attrs[l[0]]=l[1],a.lastIndex--}else c[2]&&(r.attrs[c[2]]=c[3].trim().substring(1,c[3].length-1));return r}var r=/<[a-zA-Z0-9\\-\\!\\/](?:\"[^\"]*\"|'[^']*'|[^'\">])*>/g,i=/^\\s*$/,s=Object.create(null);function a(e,t){switch(t.type){case\"text\":return e+t.content;case\"tag\":return e+=\"<\"+t.name+(t.attrs?function(e){var t=[];for(var n in e)t.push(n+'=\"'+e[n]+'\"');return t.length?\" \"+t.join(\" \"):\"\"}(t.attrs):\"\")+(t.voidElement?\"/>\":\">\"),t.voidElement?e:e+t.children.reduce(a,\"\")+\"\"+t.name+\">\";case\"comment\":return e+\"\\x3c!--\"+t.comment+\"--\\x3e\"}}var c={parse:function(e,t){t||(t={}),t.components||(t.components=s);var a,c=[],o=[],l=-1,m=!1;if(0!==e.indexOf(\"<\")){var u=e.indexOf(\"<\");c.push({type:\"text\",content:-1===u?e:e.substring(0,u)})}return e.replace(r,function(r,s){if(m){if(r!==\"\"+a.name+\">\")return;m=!1}var u,f=\"/\"!==r.charAt(1),h=r.startsWith(\"\\x3c!--\"),p=s+r.length,d=e.charAt(p);if(h){var v=n(r);return l<0?(c.push(v),c):((u=o[l]).children.push(v),c)}if(f&&(l++,\"tag\"===(a=n(r)).type&&t.components[a.name]&&(a.type=\"component\",m=!0),a.voidElement||m||!d||\"<\"===d||a.children.push({type:\"text\",content:e.slice(p,e.indexOf(\"<\",p))}),0===l&&c.push(a),(u=o[l-1])&&u.children.push(a),o[l]=a),(!f||a.voidElement)&&(l>-1&&(a.voidElement||a.name===r.slice(2,-1))&&(l--,a=-1===l?c:o[l]),!m&&\"<\"!==d&&d)){u=-1===l?c:o[l].children;var x=e.indexOf(\"<\",p),g=e.slice(p,-1===x?void 0:x);i.test(g)&&(g=\" \"),(x>-1&&l+u.length>=0||\" \"!==g)&&u.push({type:\"text\",content:g})}}),c},stringify:function(e){return e.reduce(function(e,t){return e+a(\"\",t)},\"\")}};export default c;\n//# sourceMappingURL=html-parse-stringify.module.js.map\n","export function warn() {\n if (console && console.warn) {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (typeof args[0] === 'string') args[0] = `react-i18next:: ${args[0]}`;\n console.warn(...args);\n }\n}\nconst alreadyWarned = {};\nexport function warnOnce() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n if (typeof args[0] === 'string' && alreadyWarned[args[0]]) return;\n if (typeof args[0] === 'string') alreadyWarned[args[0]] = new Date();\n warn(...args);\n}\nconst loadedClb = (i18n, cb) => () => {\n if (i18n.isInitialized) {\n cb();\n } else {\n const initialized = () => {\n setTimeout(() => {\n i18n.off('initialized', initialized);\n }, 0);\n cb();\n };\n i18n.on('initialized', initialized);\n }\n};\nexport function loadNamespaces(i18n, ns, cb) {\n i18n.loadNamespaces(ns, loadedClb(i18n, cb));\n}\nexport function loadLanguages(i18n, lng, ns, cb) {\n if (typeof ns === 'string') ns = [ns];\n ns.forEach(n => {\n if (i18n.options.ns.indexOf(n) < 0) i18n.options.ns.push(n);\n });\n i18n.loadLanguages(lng, loadedClb(i18n, cb));\n}\nfunction oldI18nextHasLoadedNamespace(ns, i18n) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n const lng = i18n.languages[0];\n const fallbackLng = i18n.options ? i18n.options.fallbackLng : false;\n const lastLng = i18n.languages[i18n.languages.length - 1];\n if (lng.toLowerCase() === 'cimode') return true;\n const loadNotPending = (l, n) => {\n const loadState = i18n.services.backendConnector.state[`${l}|${n}`];\n return loadState === -1 || loadState === 2;\n };\n if (options.bindI18n && options.bindI18n.indexOf('languageChanging') > -1 && i18n.services.backendConnector.backend && i18n.isLanguageChangingTo && !loadNotPending(i18n.isLanguageChangingTo, ns)) return false;\n if (i18n.hasResourceBundle(lng, ns)) return true;\n if (!i18n.services.backendConnector.backend || i18n.options.resources && !i18n.options.partialBundledLanguages) return true;\n if (loadNotPending(lng, ns) && (!fallbackLng || loadNotPending(lastLng, ns))) return true;\n return false;\n}\nexport function hasLoadedNamespace(ns, i18n) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n if (!i18n.languages || !i18n.languages.length) {\n warnOnce('i18n.languages were undefined or empty', i18n.languages);\n return true;\n }\n const isNewerI18next = i18n.options.ignoreJSONStructure !== undefined;\n if (!isNewerI18next) {\n return oldI18nextHasLoadedNamespace(ns, i18n, options);\n }\n return i18n.hasLoadedNamespace(ns, {\n lng: options.lng,\n precheck: (i18nInstance, loadNotPending) => {\n if (options.bindI18n && options.bindI18n.indexOf('languageChanging') > -1 && i18nInstance.services.backendConnector.backend && i18nInstance.isLanguageChangingTo && !loadNotPending(i18nInstance.isLanguageChangingTo, ns)) return false;\n }\n });\n}\nexport function getDisplayName(Component) {\n return Component.displayName || Component.name || (typeof Component === 'string' && Component.length > 0 ? Component : 'Unknown');\n}","const matchHtmlEntity = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g;\nconst htmlEntities = {\n '&': '&',\n '&': '&',\n '<': '<',\n '<': '<',\n '>': '>',\n '>': '>',\n ''': \"'\",\n ''': \"'\",\n '"': '\"',\n '"': '\"',\n ' ': ' ',\n ' ': ' ',\n '©': '©',\n '©': '©',\n '®': '®',\n '®': '®',\n '…': '…',\n '…': '…',\n '/': '/',\n '/': '/'\n};\nconst unescapeHtmlEntity = m => htmlEntities[m];\nexport const unescape = text => text.replace(matchHtmlEntity, unescapeHtmlEntity);","import { unescape } from './unescape.js';\nlet defaultOptions = {\n bindI18n: 'languageChanged',\n bindI18nStore: '',\n transEmptyNodeValue: '',\n transSupportBasicHtmlNodes: true,\n transWrapTextNodes: '',\n transKeepBasicHtmlNodesFor: ['br', 'strong', 'i', 'p'],\n useSuspense: true,\n unescape\n};\nexport function setDefaults() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n defaultOptions = {\n ...defaultOptions,\n ...options\n };\n}\nexport function getDefaults() {\n return defaultOptions;\n}","let i18nInstance;\nexport function setI18n(instance) {\n i18nInstance = instance;\n}\nexport function getI18n() {\n return i18nInstance;\n}","import { setDefaults } from './defaults.js';\nimport { setI18n } from './i18nInstance.js';\nexport const initReactI18next = {\n type: '3rdParty',\n init(instance) {\n setDefaults(instance.options.react);\n setI18n(instance);\n }\n};","import { createContext } from 'react';\nimport { getDefaults, setDefaults } from './defaults.js';\nimport { getI18n, setI18n } from './i18nInstance.js';\nimport { initReactI18next } from './initReactI18next.js';\nexport { getDefaults, setDefaults, getI18n, setI18n, initReactI18next };\nexport const I18nContext = createContext();\nexport class ReportNamespaces {\n constructor() {\n this.usedNamespaces = {};\n }\n addUsedNamespaces(namespaces) {\n namespaces.forEach(ns => {\n if (!this.usedNamespaces[ns]) this.usedNamespaces[ns] = true;\n });\n }\n getUsedNamespaces() {\n return Object.keys(this.usedNamespaces);\n }\n}\nexport function composeInitialProps(ForComponent) {\n return ctx => new Promise(resolve => {\n const i18nInitialProps = getInitialProps();\n if (ForComponent.getInitialProps) {\n ForComponent.getInitialProps(ctx).then(componentsInitialProps => {\n resolve({\n ...componentsInitialProps,\n ...i18nInitialProps\n });\n });\n } else {\n resolve(i18nInitialProps);\n }\n });\n}\nexport function getInitialProps() {\n const i18n = getI18n();\n const namespaces = i18n.reportNamespaces ? i18n.reportNamespaces.getUsedNamespaces() : [];\n const ret = {};\n const initialI18nStore = {};\n i18n.languages.forEach(l => {\n initialI18nStore[l] = {};\n namespaces.forEach(ns => {\n initialI18nStore[l][ns] = i18n.getResourceBundle(l, ns) || {};\n });\n });\n ret.initialI18nStore = initialI18nStore;\n ret.initialLanguage = i18n.language;\n return ret;\n}","import { useState, useEffect, useContext, useRef, useCallback } from 'react';\nimport { getI18n, getDefaults, ReportNamespaces, I18nContext } from './context.js';\nimport { warnOnce, loadNamespaces, loadLanguages, hasLoadedNamespace } from './utils.js';\nconst usePrevious = (value, ignore) => {\n const ref = useRef();\n useEffect(() => {\n ref.current = ignore ? ref.current : value;\n }, [value, ignore]);\n return ref.current;\n};\nfunction alwaysNewT(i18n, language, namespace, keyPrefix) {\n return i18n.getFixedT(language, namespace, keyPrefix);\n}\nfunction useMemoizedT(i18n, language, namespace, keyPrefix) {\n return useCallback(alwaysNewT(i18n, language, namespace, keyPrefix), [i18n, language, namespace, keyPrefix]);\n}\nexport function useTranslation(ns) {\n let props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const {\n i18n: i18nFromProps\n } = props;\n const {\n i18n: i18nFromContext,\n defaultNS: defaultNSFromContext\n } = useContext(I18nContext) || {};\n const i18n = i18nFromProps || i18nFromContext || getI18n();\n if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new ReportNamespaces();\n if (!i18n) {\n warnOnce('You will need to pass in an i18next instance by using initReactI18next');\n const notReadyT = (k, optsOrDefaultValue) => {\n if (typeof optsOrDefaultValue === 'string') return optsOrDefaultValue;\n if (optsOrDefaultValue && typeof optsOrDefaultValue === 'object' && typeof optsOrDefaultValue.defaultValue === 'string') return optsOrDefaultValue.defaultValue;\n return Array.isArray(k) ? k[k.length - 1] : k;\n };\n const retNotReady = [notReadyT, {}, false];\n retNotReady.t = notReadyT;\n retNotReady.i18n = {};\n retNotReady.ready = false;\n return retNotReady;\n }\n if (i18n.options.react && i18n.options.react.wait !== undefined) warnOnce('It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.');\n const i18nOptions = {\n ...getDefaults(),\n ...i18n.options.react,\n ...props\n };\n const {\n useSuspense,\n keyPrefix\n } = i18nOptions;\n let namespaces = ns || defaultNSFromContext || i18n.options && i18n.options.defaultNS;\n namespaces = typeof namespaces === 'string' ? [namespaces] : namespaces || ['translation'];\n if (i18n.reportNamespaces.addUsedNamespaces) i18n.reportNamespaces.addUsedNamespaces(namespaces);\n const ready = (i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(n => hasLoadedNamespace(n, i18n, i18nOptions));\n const memoGetT = useMemoizedT(i18n, props.lng || null, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix);\n const getT = () => memoGetT;\n const getNewT = () => alwaysNewT(i18n, props.lng || null, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix);\n const [t, setT] = useState(getT);\n let joinedNS = namespaces.join();\n if (props.lng) joinedNS = `${props.lng}${joinedNS}`;\n const previousJoinedNS = usePrevious(joinedNS);\n const isMounted = useRef(true);\n useEffect(() => {\n const {\n bindI18n,\n bindI18nStore\n } = i18nOptions;\n isMounted.current = true;\n if (!ready && !useSuspense) {\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, () => {\n if (isMounted.current) setT(getNewT);\n });\n } else {\n loadNamespaces(i18n, namespaces, () => {\n if (isMounted.current) setT(getNewT);\n });\n }\n }\n if (ready && previousJoinedNS && previousJoinedNS !== joinedNS && isMounted.current) {\n setT(getNewT);\n }\n function boundReset() {\n if (isMounted.current) setT(getNewT);\n }\n if (bindI18n && i18n) i18n.on(bindI18n, boundReset);\n if (bindI18nStore && i18n) i18n.store.on(bindI18nStore, boundReset);\n return () => {\n isMounted.current = false;\n if (bindI18n && i18n) bindI18n.split(' ').forEach(e => i18n.off(e, boundReset));\n if (bindI18nStore && i18n) bindI18nStore.split(' ').forEach(e => i18n.store.off(e, boundReset));\n };\n }, [i18n, joinedNS]);\n const isInitial = useRef(true);\n useEffect(() => {\n if (isMounted.current && !isInitial.current) {\n setT(getT);\n }\n isInitial.current = false;\n }, [i18n, keyPrefix]);\n const ret = [t, i18n, ready];\n ret.t = t;\n ret.i18n = i18n;\n ret.ready = ready;\n if (ready) return ret;\n if (!ready && !useSuspense) return ret;\n throw new Promise(resolve => {\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, () => resolve());\n } else {\n loadNamespaces(i18n, namespaces, () => resolve());\n }\n });\n}","import { createElement, forwardRef as forwardRefReact } from 'react';\nimport { useTranslation } from './useTranslation.js';\nimport { getDisplayName } from './utils.js';\nexport function withTranslation(ns) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return function Extend(WrappedComponent) {\n function I18nextWithTranslation(_ref) {\n let {\n forwardedRef,\n ...rest\n } = _ref;\n const [t, i18n, ready] = useTranslation(ns, {\n ...rest,\n keyPrefix: options.keyPrefix\n });\n const passDownProps = {\n ...rest,\n t,\n i18n,\n tReady: ready\n };\n if (options.withRef && forwardedRef) {\n passDownProps.ref = forwardedRef;\n } else if (!options.withRef && forwardedRef) {\n passDownProps.forwardedRef = forwardedRef;\n }\n return createElement(WrappedComponent, passDownProps);\n }\n I18nextWithTranslation.displayName = `withI18nextTranslation(${getDisplayName(WrappedComponent)})`;\n I18nextWithTranslation.WrappedComponent = WrappedComponent;\n const forwardRef = (props, ref) => createElement(I18nextWithTranslation, Object.assign({}, props, {\n forwardedRef: ref\n }));\n return options.withRef ? forwardRefReact(forwardRef) : I18nextWithTranslation;\n };\n}","import { createElement, useMemo } from 'react';\nimport { I18nContext } from './context.js';\nexport function I18nextProvider(_ref) {\n let {\n i18n,\n defaultNS,\n children\n } = _ref;\n const value = useMemo(() => ({\n i18n,\n defaultNS\n }), [i18n, defaultNS]);\n return createElement(I18nContext.Provider, {\n value\n }, children);\n}","import React from 'react';\nconst ListContext = /*#__PURE__*/React.createContext({\n listIsMedia: false,\n listIsSimple: false,\n listIsSortable: false,\n listIsSortableOpposite: false\n});\nexport { ListContext };","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, getSlots, flattenArray, emit, extend } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7, f7ready } from '../shared/f7.js';\nimport { ListContext } from '../shared/list-context.js';\nimport { useTab } from '../shared/use-tab.js';\n\n\nconst List = /*#__PURE__*/forwardRef((props, ref) => {\n const f7VirtualList = useRef(null);\n const {\n className,\n id,\n style,\n inset,\n insetIos,\n insetMd,\n xsmallInset,\n xsmallInsetIos,\n xsmallInsetMd,\n smallInset,\n smallInsetIos,\n smallInsetMd,\n mediumInset,\n mediumInsetIos,\n mediumInsetMd,\n largeInset,\n largeInsetIos,\n largeInsetMd,\n xlargeInset,\n xlargeInsetIos,\n xlargeInsetMd,\n strong,\n strongIos,\n strongMd,\n outline,\n outlineIos,\n outlineMd,\n dividers,\n dividersIos,\n dividersMd,\n mediaList,\n sortable,\n sortableTapHold,\n sortableEnabled,\n sortableMoveElements,\n sortableOpposite,\n accordionList,\n accordionOpposite,\n contactsList,\n simpleList,\n linksList,\n menuList,\n noChevron,\n chevronCenter,\n tab,\n tabActive,\n form,\n formStoreData,\n virtualList,\n virtualListParams\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const onSubmit = event => {\n emit(props, 'submit', event);\n };\n const onSortableEnable = el => {\n if (elRef.current !== el) return;\n emit(props, 'sortableEnable');\n };\n const onSortableDisable = el => {\n if (elRef.current !== el) return;\n emit(props, 'sortableDisable');\n };\n const onSortableSort = (el, sortData, listEl) => {\n if (elRef.current !== listEl) return;\n emit(props, 'sortableSort', sortData);\n };\n const onSortableMove = (el, listEl) => {\n if (elRef.current !== listEl) return;\n emit(props, 'sortableMove', el, listEl);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n f7VirtualList: () => f7VirtualList.current\n }));\n useTab(elRef, props);\n const attachEvents = () => {\n f7ready(() => {\n f7.on('sortableEnable', onSortableEnable);\n f7.on('sortableDisable', onSortableDisable);\n f7.on('sortableSort', onSortableSort);\n f7.on('sortableMove', onSortableMove);\n });\n };\n const detachEvents = () => {\n if (!f7) return;\n f7.off('sortableEnable', onSortableEnable);\n f7.off('sortableDisable', onSortableDisable);\n f7.off('sortableSort', onSortableSort);\n f7.off('sortableMove', onSortableMove);\n };\n const onMount = () => {\n f7ready(() => {\n if (!virtualList) return;\n const vlParams = virtualListParams || {};\n if (!vlParams.renderItem && !vlParams.renderExternal) return;\n f7VirtualList.current = f7.virtualList.create(extend({\n el: elRef.current,\n on: {\n itemBeforeInsert(itemEl, item) {\n const vl = this;\n emit(props, 'virtualItemBeforeInsert', vl, itemEl, item);\n },\n beforeClear(fragment) {\n const vl = this;\n emit(props, 'virtualBeforeClear', vl, fragment);\n },\n itemsBeforeInsert(fragment) {\n const vl = this;\n emit(props, 'virtualItemsBeforeInsert', vl, fragment);\n },\n itemsAfterInsert(fragment) {\n const vl = this;\n emit(props, 'virtualItemsAfterInsert', vl, fragment);\n }\n }\n }, vlParams));\n });\n };\n const onDestroy = () => {\n if (!f7) return;\n if (!(virtualList && f7VirtualList.current)) return;\n if (f7VirtualList.current.destroy) f7VirtualList.current.destroy();\n f7VirtualList.current = null;\n };\n useIsomorphicLayoutEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n useIsomorphicLayoutEffect(() => {\n attachEvents();\n return detachEvents;\n });\n const slots = getSlots(props);\n const {\n list: slotsList,\n default: slotsDefault\n } = slots;\n const rootChildrenBeforeList = [];\n const rootChildrenAfterList = [];\n const ulChildren = slotsList || [];\n const flattenSlots = flattenArray(slotsDefault);\n let wasUlChild = false;\n flattenSlots.forEach(child => {\n if (typeof child === 'undefined') return;\n let tag = child.type && (child.type.displayName || child.type.name);\n if (!tag && typeof child.type === 'string') {\n tag = child.type;\n }\n if (!tag || tag && !(tag === 'li' || tag.indexOf('f7-list-item') >= 0 || tag.indexOf('f7-list-button') >= 0 || tag.indexOf('f7-list-input') >= 0)) {\n if (wasUlChild) rootChildrenAfterList.push(child);else rootChildrenBeforeList.push(child);\n } else if (tag) {\n wasUlChild = true;\n ulChildren.push(child);\n }\n });\n const ListTag = form ? 'form' : 'div';\n const classes = classNames(className, 'list', {\n inset,\n 'inset-ios': insetIos,\n 'inset-md': insetMd,\n 'xsmall-inset': xsmallInset,\n 'xsmall-inset-ios': xsmallInsetIos,\n 'xsmall-inset-md': xsmallInsetMd,\n 'small-inset': smallInset,\n 'small-inset-ios': smallInsetIos,\n 'small-inset-md': smallInsetMd,\n 'medium-inset': mediumInset,\n 'medium-inset-ios': mediumInsetIos,\n 'medium-inset-md': mediumInsetMd,\n 'large-inset': largeInset,\n 'large-inset-ios': largeInsetIos,\n 'large-inset-md': largeInsetMd,\n 'xlarge-inset': xlargeInset,\n 'xlarge-inset-ios': xlargeInsetIos,\n 'xlarge-inset-md': xlargeInsetMd,\n 'list-strong': strong,\n 'list-strong-ios': strongIos,\n 'list-strong-md': strongMd,\n 'list-outline': outline,\n 'list-outline-ios': outlineIos,\n 'list-outline-md': outlineMd,\n 'list-dividers': dividers,\n 'list-dividers-ios': dividersIos,\n 'list-dividers-md': dividersMd,\n 'media-list': mediaList,\n 'simple-list': simpleList,\n 'links-list': linksList,\n 'menu-list': menuList,\n sortable,\n 'sortable-tap-hold': sortableTapHold,\n 'sortable-enabled': sortableEnabled,\n 'sortable-opposite': sortableOpposite,\n 'accordion-list': accordionList,\n 'accordion-opposite': accordionOpposite,\n 'contacts-list': contactsList,\n 'virtual-list': virtualList,\n tab,\n 'tab-active': tabActive,\n 'form-store-data': formStoreData,\n 'no-chevron': noChevron,\n 'chevron-center': chevronCenter\n }, colorClasses(props));\n return /*#__PURE__*/React.createElement(ListTag, _extends({\n id: id,\n ref: elRef,\n style: style,\n className: classes\n }, extraAttrs, {\n \"data-sortable-move-elements\": typeof sortableMoveElements !== 'undefined' ? sortableMoveElements.toString() : undefined,\n onSubmit: onSubmit\n }), /*#__PURE__*/React.createElement(ListContext.Provider, {\n value: {\n listIsMedia: mediaList,\n listIsSimple: simpleList,\n listIsSortable: sortable,\n listIsSortableOpposite: sortableOpposite\n }\n }, slots['before-list'], rootChildrenBeforeList, ulChildren.length > 0 && /*#__PURE__*/React.createElement(\"ul\", null, ulChildren), slots['after-list'], rootChildrenAfterList));\n});\nList.displayName = 'f7-list';\nexport default List;","import React, { useRef, useEffect } from 'react';\nimport { classNames } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport Badge from './badge.js';\nconst ListItemContent = props => {\n const {\n indeterminate,\n radio,\n checkbox,\n value,\n name,\n readonly,\n disabled,\n checked,\n defaultChecked,\n required,\n media,\n header,\n footer,\n title,\n subtitle,\n text,\n after,\n badge,\n badgeColor,\n checkboxIcon,\n radioIcon,\n swipeout,\n sortable,\n accordionItem,\n onChange,\n onClick,\n isMediaComputed,\n isSortableComputed,\n isSortableOppositeComputed,\n slots\n } = props;\n const inputElRef = useRef(null);\n useEffect(() => {\n if (inputElRef.current) {\n inputElRef.current.indeterminate = !!indeterminate;\n }\n }, [indeterminate]);\n let titleEl;\n let afterWrapEl;\n let afterEl;\n let badgeEl;\n let innerEl;\n let titleRowEl;\n let subtitleEl;\n let textEl;\n let mediaEl;\n let inputEl;\n let inputIconEl;\n let headerEl;\n let footerEl;\n\n // Input\n if (radio || checkbox) {\n inputEl = /*#__PURE__*/React.createElement(\"input\", {\n ref: inputElRef,\n value: value,\n name: name,\n checked: checked,\n defaultChecked: defaultChecked,\n readOnly: readonly,\n disabled: disabled,\n required: required,\n type: radio ? 'radio' : 'checkbox',\n onChange: onChange\n });\n inputIconEl = /*#__PURE__*/React.createElement(\"i\", {\n className: `icon icon-${radio ? 'radio' : 'checkbox'}`\n });\n }\n // Media\n if (media || slots.media) {\n let mediaImgEl;\n if (media) {\n mediaImgEl = /*#__PURE__*/React.createElement(\"img\", {\n src: media\n });\n }\n mediaEl = /*#__PURE__*/React.createElement(\"div\", {\n className: \"item-media\"\n }, mediaImgEl, slots.media);\n }\n // Inner Elements\n if (header || slots.header) {\n headerEl = /*#__PURE__*/React.createElement(\"div\", {\n className: \"item-header\"\n }, header, slots.header);\n }\n if (footer || slots.footer) {\n footerEl = /*#__PURE__*/React.createElement(\"div\", {\n className: \"item-footer\"\n }, footer, slots.footer);\n }\n if (title || slots.title || !isMediaComputed && headerEl || !isMediaComputed && footerEl) {\n titleEl = /*#__PURE__*/React.createElement(\"div\", {\n className: \"item-title\"\n }, !isMediaComputed && headerEl, title, slots.title, !isMediaComputed && footerEl);\n }\n if (subtitle || slots.subtitle) {\n subtitleEl = /*#__PURE__*/React.createElement(\"div\", {\n className: \"item-subtitle\"\n }, subtitle, slots.subtitle);\n }\n if (text || slots.text) {\n textEl = /*#__PURE__*/React.createElement(\"div\", {\n className: \"item-text\"\n }, text, slots.text);\n }\n if (after || badge || slots.after) {\n if (after) {\n afterEl = /*#__PURE__*/React.createElement(\"span\", null, after);\n }\n if (badge) {\n badgeEl = /*#__PURE__*/React.createElement(Badge, {\n color: badgeColor\n }, badge);\n }\n afterWrapEl = /*#__PURE__*/React.createElement(\"div\", {\n className: \"item-after\"\n }, slots['after-start'], afterEl, badgeEl, slots.after, slots['after-end']);\n }\n if (isMediaComputed) {\n titleRowEl = /*#__PURE__*/React.createElement(\"div\", {\n className: \"item-title-row\"\n }, slots['before-title'], titleEl, slots['after-title'], afterWrapEl);\n innerEl = /*#__PURE__*/React.createElement(\"div\", {\n className: \"item-inner\"\n }, slots['inner-start'], headerEl, titleRowEl, subtitleEl, textEl, swipeout || accordionItem ? null : slots.default, slots.inner, footerEl, slots['inner-end']);\n } else {\n innerEl = /*#__PURE__*/React.createElement(\"div\", {\n className: \"item-inner\"\n }, slots['inner-start'], slots['before-title'], titleEl, slots['after-title'], afterWrapEl, swipeout || accordionItem ? null : slots.default, slots.inner, slots['inner-end']);\n }\n const ItemContentTag = checkbox || radio ? 'label' : 'div';\n const classes = classNames('item-content', {\n 'item-checkbox': checkbox,\n 'item-radio': radio,\n 'item-checkbox-icon-start': checkbox && checkboxIcon === 'start',\n 'item-checkbox-icon-end': checkbox && checkboxIcon === 'end',\n 'item-radio-icon-start': radio && radioIcon === 'start',\n 'item-radio-icon-end': radio && radioIcon === 'end'\n }, colorClasses(props));\n return /*#__PURE__*/React.createElement(ItemContentTag, {\n className: classes,\n onClick: onClick\n }, isSortableComputed && sortable !== false && isSortableOppositeComputed && /*#__PURE__*/React.createElement(\"div\", {\n className: \"sortable-handler\"\n }), slots['content-start'], inputEl, inputIconEl, mediaEl, innerEl, slots.content, slots['content-end']);\n};\nListItemContent.displayName = 'f7-list-item-content';\nexport default ListItemContent;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle, useContext } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, getSlots, emit, isStringProp } from '../shared/utils.js';\nimport { colorClasses, actionsAttrs, actionsClasses, routerAttrs, routerClasses } from '../shared/mixins.js';\nimport { useRouteProps } from '../shared/use-route-props.js';\nimport { useSmartSelect } from '../shared/use-smart-select.js';\nimport { useTooltip } from '../shared/use-tooltip.js';\nimport { watchProp } from '../shared/watch-prop.js';\nimport { f7ready, f7 } from '../shared/f7.js';\nimport ListItemContent from './list-item-content.js';\nimport { ListContext } from '../shared/list-context.js';\n\n\n\n/*\nconst ListItemContent = ({\n props,\n slots,\n inputElRef,\n onChange,\n onClick,\n isMediaComputed,\n isSortableComputed,\n isSortableOppositeComputed,\n} = {}) => {\n const {\n radio,\n checkbox,\n value,\n name,\n readonly,\n disabled,\n checked,\n defaultChecked,\n required,\n media,\n header,\n footer,\n title,\n subtitle,\n text,\n after,\n badge,\n badgeColor,\n checkboxIcon,\n radioIcon,\n swipeout,\n sortable,\n accordionItem,\n } = props;\n\n};\n*/\nconst ListItem = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n title,\n link,\n target,\n tabLink,\n tabLinkActive,\n selected,\n mediaItem,\n mediaList,\n groupTitle,\n swipeout,\n swipeoutOpened,\n sortable,\n sortableOpposite,\n accordionItem,\n accordionItemOpened,\n smartSelect,\n smartSelectParams,\n noChevron,\n chevronCenter,\n checkbox,\n radio,\n disabled,\n virtualListIndex,\n href\n } = props;\n const listContext = useContext(ListContext);\n const {\n listIsMedia = false,\n listIsSortable = false,\n listIsSortableOpposite = false,\n listIsSimple = false\n } = listContext || {};\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const linkElRef = useRef(null);\n const f7SmartSelect = useRef(null);\n const onClick = event => {\n if (event.target.tagName.toLowerCase() !== 'input') {\n emit(props, 'click', event);\n }\n };\n const onSwipeoutOverswipeEnter = el => {\n if (elRef.current !== el) return;\n emit(props, 'swipeoutOverswipeEnter');\n };\n const onSwipeoutOverswipeExit = el => {\n if (elRef.current !== el) return;\n emit(props, 'swipeoutOverswipeExit');\n };\n const onSwipeoutDeleted = el => {\n if (elRef.current !== el) return;\n emit(props, 'swipeoutDeleted');\n };\n const onSwipeoutDelete = el => {\n if (elRef.current !== el) return;\n emit(props, 'swipeoutDelete');\n };\n const onSwipeoutClose = el => {\n if (elRef.current !== el) return;\n emit(props, 'swipeoutClose');\n };\n const onSwipeoutClosed = el => {\n if (elRef.current !== el) return;\n emit(props, 'swipeoutClosed');\n };\n const onSwipeoutOpen = el => {\n if (elRef.current !== el) return;\n emit(props, 'swipeoutOpen');\n };\n const onSwipeoutOpened = el => {\n if (elRef.current !== el) return;\n emit(props, 'swipeoutOpened');\n };\n const onSwipeout = (el, progress) => {\n if (elRef.current !== el) return;\n emit(props, 'swipeout', progress);\n };\n const onAccBeforeClose = (el, prevent) => {\n if (elRef.current !== el) return;\n emit(props, 'accordionBeforeClose', prevent);\n };\n const onAccClose = el => {\n if (elRef.current !== el) return;\n emit(props, 'accordionClose');\n };\n const onAccClosed = el => {\n if (elRef.current !== el) return;\n emit(props, 'accordionClosed');\n };\n const onAccBeforeOpen = (el, prevent) => {\n if (elRef.current !== el) return;\n emit(props, 'accordionBeforeOpen', prevent);\n };\n const onAccOpen = el => {\n if (elRef.current !== el) return;\n emit(props, 'accordionOpen');\n };\n const onAccOpened = el => {\n if (elRef.current !== el) return;\n emit(props, 'accordionOpened');\n };\n const onChange = event => {\n emit(props, 'change', event);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n f7SmartSelect: () => f7SmartSelect.current\n }));\n useTooltip(elRef, props);\n useRouteProps(linkElRef, props);\n watchProp(swipeoutOpened, newValue => {\n if (!swipeout || !elRef.current || !f7) return;\n if (newValue) {\n f7.swipeout.open(elRef.current);\n } else {\n f7.swipeout.close(elRef.current);\n }\n });\n const attachEvents = () => {\n f7ready(() => {\n if (swipeout) {\n f7.on('swipeoutOpen', onSwipeoutOpen);\n f7.on('swipeoutOpened', onSwipeoutOpened);\n f7.on('swipeoutClose', onSwipeoutClose);\n f7.on('swipeoutClosed', onSwipeoutClosed);\n f7.on('swipeoutDelete', onSwipeoutDelete);\n f7.on('swipeoutDeleted', onSwipeoutDeleted);\n f7.on('swipeoutOverswipeEnter', onSwipeoutOverswipeEnter);\n f7.on('swipeoutOverswipeExit', onSwipeoutOverswipeExit);\n f7.on('swipeout', onSwipeout);\n }\n if (accordionItem) {\n f7.on('accordionBeforeOpen', onAccBeforeOpen);\n f7.on('accordionOpen', onAccOpen);\n f7.on('accordionOpened', onAccOpened);\n f7.on('accordionBeforeClose', onAccBeforeClose);\n f7.on('accordionClose', onAccClose);\n f7.on('accordionClosed', onAccClosed);\n }\n });\n };\n const detachEvents = () => {\n if (!f7) return;\n f7.off('swipeoutOpen', onSwipeoutOpen);\n f7.off('swipeoutOpened', onSwipeoutOpened);\n f7.off('swipeoutClose', onSwipeoutClose);\n f7.off('swipeoutClosed', onSwipeoutClosed);\n f7.off('swipeoutDelete', onSwipeoutDelete);\n f7.off('swipeoutDeleted', onSwipeoutDeleted);\n f7.off('swipeoutOverswipeEnter', onSwipeoutOverswipeEnter);\n f7.off('swipeoutOverswipeExit', onSwipeoutOverswipeExit);\n f7.off('swipeout', onSwipeout);\n f7.off('accordionBeforeOpen', onAccBeforeOpen);\n f7.off('accordionOpen', onAccOpen);\n f7.off('accordionOpened', onAccOpened);\n f7.off('accordionBeforeClose', onAccBeforeClose);\n f7.off('accordionClose', onAccClose);\n f7.off('accordionClosed', onAccClosed);\n };\n useSmartSelect(smartSelect, smartSelectParams, f7SmartSelect, () => elRef.current.querySelector('a.smart-select'));\n useIsomorphicLayoutEffect(() => {\n f7ready(() => {\n if (swipeout && swipeoutOpened) {\n f7.swipeout.open(elRef.current);\n }\n });\n }, []);\n useIsomorphicLayoutEffect(() => {\n attachEvents();\n return detachEvents;\n });\n const slots = getSlots(props);\n let linkEl;\n let itemContentEl;\n const isMediaComputed = mediaItem || mediaList || listIsMedia;\n const isSortableComputed = sortable === true || sortable === false ? sortable : listIsSortable;\n const isSortableOppositeComputed = isSortableComputed && (sortableOpposite || listIsSortableOpposite);\n if (!listIsSimple) {\n // Item Content\n itemContentEl = /*#__PURE__*/React.createElement(ListItemContent, _extends({}, props, {\n slots: slots,\n onChange: onChange,\n onClick: link || href || accordionItem || smartSelect ? undefined : onClick,\n isMediaComputed: isMediaComputed,\n isSortableComputed: isSortableComputed,\n isSortableOppositeComputed: isSortableOppositeComputed\n }));\n\n // Link\n if (link || href || accordionItem || smartSelect) {\n const linkAttrs = {\n href: link === true ? '' : link || href,\n target,\n 'data-tab': isStringProp(tabLink) && tabLink || undefined,\n ...routerAttrs(props),\n ...actionsAttrs(props)\n };\n const linkClasses = classNames({\n 'item-link': true,\n 'smart-select': smartSelect,\n 'tab-link': tabLink || tabLink === '',\n 'tab-link-active': tabLinkActive,\n 'item-selected': selected\n }, routerClasses(props), actionsClasses(props));\n linkEl = /*#__PURE__*/React.createElement(\"a\", _extends({\n ref: linkElRef,\n className: linkClasses\n }, linkAttrs, {\n onClick: onClick\n }), itemContentEl);\n }\n }\n const liClasses = classNames(className, {\n 'list-group-title': groupTitle,\n 'media-item': isMediaComputed,\n swipeout,\n 'accordion-item': accordionItem,\n 'accordion-item-opened': accordionItemOpened,\n disabled: disabled && !(radio || checkbox),\n 'no-chevron': noChevron,\n 'chevron-center': chevronCenter,\n 'disallow-sorting': sortable === false\n }, colorClasses(props));\n if (groupTitle) {\n return /*#__PURE__*/React.createElement(\"li\", {\n ref: elRef,\n id: id,\n style: style,\n className: liClasses,\n \"data-virtual-list-index\": virtualListIndex,\n onClick: onClick\n }, /*#__PURE__*/React.createElement(\"span\", null, title, children));\n }\n if (listIsSimple) {\n return /*#__PURE__*/React.createElement(\"li\", {\n ref: elRef,\n id: id,\n style: style,\n className: liClasses,\n \"data-virtual-list-index\": virtualListIndex,\n onClick: onClick\n }, title, children);\n }\n const linkItemEl = link || href || smartSelect || accordionItem ? linkEl : itemContentEl;\n return /*#__PURE__*/React.createElement(\"li\", _extends({\n ref: elRef,\n id: id,\n style: style,\n className: liClasses,\n \"data-virtual-list-index\": virtualListIndex\n }, extraAttrs), slots['root-start'], swipeout ? /*#__PURE__*/React.createElement(\"div\", {\n className: \"swipeout-content\"\n }, linkItemEl) : linkItemEl, isSortableComputed && sortable !== false && !isSortableOppositeComputed && /*#__PURE__*/React.createElement(\"div\", {\n className: \"sortable-handler\"\n }), (swipeout || accordionItem) && slots.default, slots.root, slots['root-end']);\n});\nListItem.displayName = 'f7-list-item';\nexport default ListItem;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, emit } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7ready, f7 } from '../shared/f7.js';\nimport { watchProp } from '../shared/watch-prop.js';\nimport { useTooltip } from '../shared/use-tooltip.js';\n\n\nconst Toggle = /*#__PURE__*/forwardRef((props, ref) => {\n const f7Toggle = useRef(null);\n const {\n className,\n id,\n style,\n init = true,\n checked,\n defaultChecked,\n disabled,\n readonly,\n name,\n value\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const inputElRef = useRef(null);\n const onChange = event => {\n emit(props, 'change', event);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n f7Toggle: () => f7Toggle.current\n }));\n useTooltip(elRef, props);\n watchProp(checked, newValue => {\n if (!f7Toggle.current) return;\n f7Toggle.current.checked = newValue;\n });\n const onToggleChange = toggleInstance => {\n emit(props, 'toggleChange', toggleInstance.checked);\n };\n const toggleEvents = method => {\n if (!f7Toggle.current) return;\n f7Toggle.current[method]('toggleChange', onToggleChange);\n };\n const onMount = () => {\n f7ready(() => {\n if (!init || !elRef.current) return;\n f7Toggle.current = f7.toggle.create({\n el: elRef.current\n });\n toggleEvents('on');\n });\n };\n const onDestroy = () => {\n if (f7Toggle.current && f7Toggle.current.destroy && f7Toggle.current.$el) {\n f7Toggle.current.destroy();\n }\n f7Toggle.current = null;\n };\n useIsomorphicLayoutEffect(() => {\n toggleEvents('on');\n if (inputElRef.current) {\n inputElRef.current.addEventListener('change', onChange);\n }\n return () => {\n toggleEvents('off');\n if (inputElRef.current) {\n inputElRef.current.removeEventListener('change', onChange);\n }\n };\n });\n useIsomorphicLayoutEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n const labelClasses = classNames('toggle', className, {\n disabled\n }, colorClasses(props));\n const inputEl = /*#__PURE__*/React.createElement(\"input\", {\n ref: inputElRef,\n type: \"checkbox\",\n name: name,\n disabled: disabled,\n readOnly: readonly,\n checked: checked,\n defaultChecked: defaultChecked,\n value: value,\n onChange: () => {}\n });\n return /*#__PURE__*/React.createElement(\"label\", _extends({\n id: id,\n style: style,\n className: labelClasses,\n ref: elRef\n }, extraAttrs), inputEl, /*#__PURE__*/React.createElement(\"span\", {\n className: \"toggle-icon\"\n }));\n});\nToggle.displayName = 'f7-toggle';\nexport default Toggle;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, getSlots, emit } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { useTheme } from '../shared/use-theme.js';\nimport { f7ready, f7 } from '../shared/f7.js';\nimport { TabbarContext } from '../shared/tabbar-context.js';\n\n\nconst Toolbar = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n tabbar,\n icons,\n scrollable,\n hidden,\n outline = true,\n position,\n topMd,\n topIos,\n top,\n bottomMd,\n bottomIos,\n bottom,\n inner = true\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const onHide = toolbarEl => {\n if (elRef.current !== toolbarEl) return;\n emit(props, 'toolbarHide');\n };\n const onShow = toolbarEl => {\n if (elRef.current !== toolbarEl) return;\n emit(props, 'toolbarShow');\n };\n const hide = animate => {\n if (!f7) return;\n f7.toolbar.hide(elRef.current, animate);\n };\n const show = animate => {\n if (!f7) return;\n f7.toolbar.show(elRef.current, animate);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n hide,\n show\n }));\n useIsomorphicLayoutEffect(() => {\n f7ready(() => {\n if (tabbar && f7 && elRef.current) {\n f7.toolbar.setHighlight(elRef.current);\n }\n f7.on('toolbarShow', onShow);\n f7.on('toolbarHide', onHide);\n });\n return () => {\n if (!f7) return;\n f7.off('toolbarShow', onShow);\n f7.off('toolbarHide', onHide);\n };\n });\n const theme = useTheme();\n const classes = classNames(className, 'toolbar', {\n tabbar,\n 'toolbar-bottom': theme && theme.md && bottomMd || theme && theme.ios && bottomIos || bottom || position === 'bottom',\n 'toolbar-top': theme && theme.md && topMd || theme && theme.ios && topIos || top || position === 'top',\n 'tabbar-icons': icons,\n 'tabbar-scrollable': scrollable,\n 'toolbar-hidden': hidden,\n 'no-outline': !outline\n }, colorClasses(props));\n const slots = getSlots(props);\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), /*#__PURE__*/React.createElement(TabbarContext.Provider, {\n value: {\n tabbarHasIcons: icons\n }\n }, slots['before-inner'], inner ? /*#__PURE__*/React.createElement(\"div\", {\n className: \"toolbar-inner\"\n }, slots.default) : slots.default, slots['after-inner']));\n});\nToolbar.displayName = 'f7-toolbar';\nexport default Toolbar;","import React, { Component, useEffect } from 'react';\nimport { observer, inject } from \"mobx-react\";\nimport { Page, Navbar, NavRight, List, ListItem, Icon, Toggle, Toolbar, Link } from 'framework7-react';\nimport { f7 } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport {Device} from \"../../../utils/device\";\n\nconst PageReview = props => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const isProtected = props.isProtected;\n const isDisableAllSettings = props.isReviewOnly || props.displayMode === \"final\" || props.displayMode === \"original\";\n const canReview = !!props.canReview;\n\n return (\n \n \n {Device.phone &&\n \n \n \n \n \n }\n \n \n {canReview &&\n \n props.onTrackChanges(!props.trackChanges)} />\n \n }\n {!props.isRestrictedEdit &&\n \n }\n
\n \n \n \n \n {canReview && !props.canUseReviewPermissions && !isProtected &&\n {props.onAcceptAll();}}>\n \n \n }\n {canReview && !props.canUseReviewPermissions && !isProtected &&\n {props.onRejectAll();}}>\n \n \n }\n
\n \n )\n};\n\nconst DisplayMode = props => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const mode = props.storeReview.displayMode;\n return (\n \n \n {Device.phone &&\n \n \n \n \n \n }\n \n \n {\n props.onDisplayMode('markup');\n }}\n >\n {\n props.onDisplayMode('final');\n }}\n >\n {\n props.onDisplayMode('original');\n }}\n >\n
\n \n )\n};\n\nconst PageReviewChange = inject(\"storeAppOptions\")(observer(props => {\n const isAndroid = Device.android;\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const change = props.change;\n const displayMode = props.displayMode;\n const isLockAcceptReject = (!change || (change && !change.editable) || (displayMode === \"final\" || displayMode === \"original\") || !props.canReview);\n const isLockPrevNext = (displayMode === \"final\" || displayMode === \"original\");\n const appOptions = props.storeAppOptions;\n const isProtected = appOptions.isProtected;\n\n return (\n \n \n {Device.phone &&\n \n \n \n \n \n }\n \n \n \n {(!props.isReviewOnly && !isProtected) &&\n \n {props.onAcceptCurrentChange()}}\n >{_t.textAccept}\n {props.onRejectCurrentChange()}}\n >{_t.textReject}\n \n }\n {!props.isReviewOnly && change && change?.editable &&\n \n {props.onDeleteChange()}}>{_t.textDelete}\n \n }\n {props.goto && {props.onGotoNextChange()}}>}\n \n \n {props.onPrevChange()}}\n className={isLockPrevNext && 'disabled'}\n >\n {props.onNextChange()}}\n className={isLockPrevNext && 'disabled'}\n >\n \n \n {change ?\n \n
\n {isAndroid &&\n
{change.initials}
\n }\n
\n
{change.userName}
\n
{change.date}
\n
\n
\n
{change.text}
\n
:\n {_t.textNoChanges}
\n }\n \n )\n}));\n\nconst PageDisplayMode = inject(\"storeReview\")(observer(DisplayMode));\n\nexport {PageReview, PageDisplayMode, PageReviewChange};","\nclass LocalStorage {\n constructor() {\n Common.Gateway.on('internalcommand', data => {\n if (data.type == 'localstorage') {\n this._store = data.keys;\n }\n });\n\n this._store = {};\n this._prefix = 'mobile-';\n this._common_keys = ['guest-id', 'guest-username'];\n\n try {\n this._isAllowed = !!window.localStorage;\n } catch (e) {\n this._isAllowed = false;\n }\n }\n\n get id() {\n return this._storeName;\n }\n\n set id(name) {\n this._storeName = name;\n }\n\n set keysFilter(value) {\n this._filter = value;\n }\n\n get keysFilter() {\n return this._filter;\n }\n\n get prefix() {\n return this._prefix;\n }\n\n set prefix(p) {\n this._prefix = p;\n }\n\n sync() {\n if ( !this._isAllowed )\n Common.Gateway.internalMessage('localstorage', {cmd:'get', keys:this._filter});\n }\n\n save() {\n if ( !this._isAllowed )\n Common.Gateway.internalMessage('localstorage', {cmd:'set', keys:this._store});\n }\n\n setItem(name, value, just) {\n if ( !this._common_keys.includes(value) )\n name = this._prefix + name;\n\n if ( this._isAllowed ) {\n try {\n localStorage.setItem(name, value);\n } catch (error){}\n } else {\n this._store[name] = value;\n\n if ( just===true ) {\n Common.Gateway.internalMessage('localstorage', {cmd:'set', keys: {name: value}});\n }\n }\n }\n\n getItem(name) {\n if ( !this._common_keys.includes(name) )\n name = this._prefix + name;\n\n if ( this._isAllowed )\n return localStorage.getItem(name);\n else return this._store[name]===undefined ? null : this._store[name];\n };\n\n setBool(name, value, just) {\n this.setItem(name, value ? 1 : 0, just);\n }\n\n getBool(name, defValue) {\n const value = this.getItem(name);\n return (value !== null) ? (parseInt(value) != 0) : !!defValue;\n }\n\n itemExists(name) {\n return this.getItem(name) !== null;\n }\n}\n\nconst instance = new LocalStorage();\nexport {instance as LocalStorage};","import React, { Component } from 'react'\nimport Notifications from '../../../utils/notifications.js'\nimport {observer, inject} from \"mobx-react\"\nimport { withTranslation } from 'react-i18next';\n\nimport {PageReview, PageReviewChange} from \"../../view/collaboration/Review\";\nimport {LocalStorage} from \"../../../utils/LocalStorage.mjs\";\n\nclass InitReview extends Component {\n constructor(props){\n super(props);\n\n Common.Notifications.on('engineCreated', api => {\n api.asc_registerCallback('asc_onShowRevisionsChange', this.onChangeReview.bind(this));\n });\n\n Common.Notifications.on('document:ready', () => {\n const api = Common.EditorApi.get();\n const appOptions = props.storeAppOptions;\n const isProtected = appOptions.isProtected;\n\n let trackChanges = appOptions.customization && appOptions.customization.review ? appOptions.customization.review.trackChanges : undefined;\n (trackChanges===undefined) && (trackChanges = appOptions.customization ? appOptions.customization.trackChanges : undefined);\n trackChanges = appOptions.isReviewOnly || trackChanges === true || trackChanges !== false\n && LocalStorage.getBool(\"de-mobile-track-changes-\" + (appOptions.fileKey || ''));\n\n if(!isProtected) {\n api.asc_SetTrackRevisions(trackChanges);\n }\n \n // Init display mode\n\n const canViewReview = appOptions.canReview || appOptions.isEdit || api.asc_HaveRevisionsChanges(true);\n if (!appOptions.canReview)\n appOptions.setCanViewReview(canViewReview);\n if (canViewReview) {\n let viewReviewMode = (appOptions.isEdit || appOptions.isRestrictedEdit) ? null : LocalStorage.getItem(\"de-view-review-mode\");\n if (viewReviewMode === null) {\n viewReviewMode = appOptions.customization && appOptions.customization.review ? appOptions.customization.review.reviewDisplay : undefined;\n !viewReviewMode && (viewReviewMode = appOptions.customization ? appOptions.customization.reviewDisplay : undefined);\n viewReviewMode = /^(original|final|markup|simple)$/i.test(viewReviewMode) ? viewReviewMode.toLocaleLowerCase() : ( appOptions.isEdit || appOptions.isRestrictedEdit ? 'markup' : 'original');\n }\n let displayMode = viewReviewMode.toLocaleLowerCase();\n let type = Asc.c_oAscDisplayModeInReview.Edit;\n switch (displayMode) {\n case 'final':\n type = Asc.c_oAscDisplayModeInReview.Final;\n break;\n case 'original':\n type = Asc.c_oAscDisplayModeInReview.Original;\n break;\n }\n api.asc_SetDisplayModeInReview(type);\n props.storeReview.changeDisplayMode(displayMode);\n }\n });\n }\n\n onChangeReview (data, isShow) {\n const storeReview = this.props.storeReview;\n storeReview.changeArrReview(data);\n }\n\n render() {\n return null\n }\n}\n\nclass Review extends Component {\n constructor(props) {\n super(props);\n this.onTrackChanges = this.onTrackChanges.bind(this);\n this.onDisplayMode = this.onDisplayMode.bind(this);\n\n this.appConfig = props.storeAppOptions;\n this.editorPrefix = window.editorType || '';\n\n let trackChanges = this.appConfig.customization && this.appConfig.customization.review ? this.appConfig.customization.review.trackChanges : undefined;\n (trackChanges===undefined) && (trackChanges = this.appConfig.customization ? this.appConfig.customization.trackChanges : undefined);\n trackChanges = this.appConfig.isReviewOnly || trackChanges === true || trackChanges !== false\n && LocalStorage.getBool(`${this.editorPrefix}-mobile-track-changes-${this.appConfig.fileKey || ''}`);\n\n this.state = {\n trackChanges: trackChanges\n }\n }\n\n onTrackChanges (checked) {\n const api = Common.EditorApi.get();\n if ( this.appConfig.isReviewOnly ) {\n this.setState({trackChanges: true});\n } else {\n this.setState({trackChanges: checked});\n api.asc_SetTrackRevisions(checked);\n LocalStorage.setBool(`${this.editorPrefix}-mobile-track-changes-${this.appConfig.fileKey || ''}`, checked);\n }\n }\n\n onAcceptAll () {\n const api = Common.EditorApi.get();\n api.asc_AcceptAllChanges();\n }\n\n onRejectAll () {\n const api = Common.EditorApi.get();\n api.asc_RejectAllChanges();\n }\n\n onDisplayMode (mode) {\n const api = Common.EditorApi.get();\n let type = Asc.c_oAscDisplayModeInReview.Edit;\n switch (mode) {\n case 'final':\n type = Asc.c_oAscDisplayModeInReview.Final;\n break;\n case 'original':\n type = Asc.c_oAscDisplayModeInReview.Original;\n break;\n }\n api.asc_SetDisplayModeInReview(type);\n !this.appConfig.isEdit && !this.appConfig.isRestrictedEdit && LocalStorage.setItem(\"de-view-review-mode\", mode);\n this.props.storeReview.changeDisplayMode(mode);\n }\n\n render() {\n const displayMode = this.props.storeReview.displayMode;\n const isReviewOnly = this.appConfig.isReviewOnly;\n const isProtected = this.appConfig.isProtected;\n const canReview = this.appConfig.canReview;\n const canUseReviewPermissions = this.appConfig.canUseReviewPermissions;\n const isRestrictedEdit = this.appConfig.isRestrictedEdit;\n\n return (\n \n )\n }\n}\n\nclass ReviewChange extends Component {\n constructor (props) {\n super(props);\n this.onAcceptCurrentChange = this.onAcceptCurrentChange.bind(this);\n this.onRejectCurrentChange = this.onRejectCurrentChange.bind(this);\n this.onGotoNextChange = this.onGotoNextChange.bind(this);\n this.onDeleteChange = this.onDeleteChange.bind(this);\n\n this.appConfig = props.storeAppOptions;\n }\n \n dateToLocaleTimeString (date, lang) {\n const format = (date) => {\n let strTime,\n hours = date.getHours(),\n minutes = date.getMinutes(),\n ampm = hours >= 12 ? 'pm' : 'am';\n\n hours = hours % 12;\n hours = hours ? hours : 12; // the hour '0' should be '12'\n minutes = minutes < 10 ? '0' + minutes : minutes;\n strTime = hours + ':' + minutes + ' ' + ampm;\n\n return strTime;\n };\n\n lang = (lang || 'en').replace('_', '-').toLowerCase();\n try {\n return date.toLocaleString(lang, {dateStyle: 'short', timeStyle: 'short'});\n } catch (e) {\n lang = 'en';\n return date.toLocaleString(lang, {dateStyle: 'short', timeStyle: 'short'});\n }\n\n // MM/dd/yyyy hh:mm AM\n return (date.getMonth() + 1) + '/' + (date.getDate()) + '/' + date.getFullYear() + ' ' + format(date);\n }\n getArrChangeReview (data) {\n const api = Common.EditorApi.get();\n\n const { t } = this.props;\n const _t = t(\"Common.Collaboration\", { returnObjects: true });\n\n if (data.length === 0) return [];\n const arr = [];\n const c_paragraphLinerule = {\n LINERULE_LEAST: 0,\n LINERULE_AUTO: 1,\n LINERULE_EXACT: 2\n };\n data.forEach((item) => {\n let changeText = [], proptext = [],\n value = item.get_Value(),\n movetype = item.get_MoveType();\n switch (item.get_Type()) {\n case Asc.c_oAscRevisionsChangeType.TextAdd:\n changeText.push();\n if (typeof value == 'object') {\n value.forEach( (obj) => {\n if (typeof obj === 'string')\n changeText.push();\n else {\n switch (obj) {\n case 0:\n changeText.push();\n break;\n case 1:\n changeText.push();\n break;\n case 2:\n changeText.push();\n break;\n case 3:\n changeText.push();\n break;\n }\n }\n })\n } else if (typeof value === 'string') {\n changeText.push();\n }\n break;\n case Asc.c_oAscRevisionsChangeType.TextRem:\n changeText.push();\n if (typeof value == 'object') {\n value.forEach( (obj) => {\n if (typeof obj === 'string')\n changeText.push();\n else {\n switch (obj) {\n case 0:\n changeText.push();\n break;\n case 1:\n changeText.push();\n break;\n case 2:\n changeText.push();\n break;\n case 3:\n changeText.push();\n break;\n }\n }\n })\n } else if (typeof value === 'string') {\n changeText.push();\n }\n break;\n case Asc.c_oAscRevisionsChangeType.ParaAdd:\n changeText.push();\n break;\n case Asc.c_oAscRevisionsChangeType.ParaRem:\n changeText.push();\n break;\n case Asc.c_oAscRevisionsChangeType.TextPr:\n if (value.Get_Bold() !== undefined)\n proptext.push();\n if (value.Get_Italic() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_Underline() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_Strikeout() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_DStrikeout() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_Caps() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_SmallCaps() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_VertAlign() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_Color() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_Highlight() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_Shd() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_FontFamily() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_FontSize() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_Spacing() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_Position() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_Lang() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n\n if (proptext.length > 0) {\n changeText.push();\n proptext.forEach((item) => {\n changeText.push(item);\n });\n } else {\n changeText.push();\n }\n break;\n case Asc.c_oAscRevisionsChangeType.ParaPr:\n if (value.Get_ContextualSpacing())\n proptext.push();\n if (value.Get_IndLeft() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_IndRight() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_IndFirstLine() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_Jc() !== undefined) {\n switch (value.Get_Jc()) {\n case 0:\n proptext.length > 0 && proptext.push();\n proptext.push();\n break;\n case 1:\n proptext.length > 0 && proptext.push();\n proptext.push();\n break;\n case 2:\n proptext.length > 0 && proptext.push();\n proptext.push();\n break;\n case 3:\n proptext.length > 0 && proptext.push();\n proptext.push();\n break;\n }\n }\n if (value.Get_KeepLines() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_KeepNext()) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_PageBreakBefore()) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_SpacingLineRule() !== undefined && value.Get_SpacingLine() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n proptext.push();\n proptext.push();\n }\n if (value.Get_SpacingBeforeAutoSpacing()) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n else if (value.Get_SpacingBefore() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_SpacingAfterAutoSpacing()) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n else if (value.Get_SpacingAfter() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_WidowControl()) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_Tabs() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n if (value.Get_NumPr() !== undefined) {\n proptext.length > 0 && proptext.push();\n proptext.push()\n }\n if (value.Get_PStyle() !== undefined) {\n const style = api.asc_GetStyleNameById(value.Get_PStyle());\n if (style.length > 0) {\n proptext.length > 0 && proptext.push();\n proptext.push();\n }\n }\n\n if (proptext.length > 0) {\n changeText.push();\n proptext.forEach((item) => {\n changeText.push(item);\n });\n } else {\n changeText.push();\n }\n break;\n case Asc.c_oAscRevisionsChangeType.TablePr:\n changeText.push();\n break;\n case Asc.c_oAscRevisionsChangeType.RowsAdd:\n changeText.push();\n break;\n case Asc.c_oAscRevisionsChangeType.RowsRem:\n changeText.push();\n break;\n\n }\n let date = (item.get_DateTime() == '') ? new Date() : new Date(item.get_DateTime());\n const user = item.get_UserName();\n const userColor = item.get_UserColor();\n const goto = (item.get_MoveType() == Asc.c_oAscRevisionsMove.MoveTo || item.get_MoveType() == Asc.c_oAscRevisionsMove.MoveFrom);\n date = this.dateToLocaleTimeString(date, this.appConfig.lang);\n const editable = this.appConfig.isReviewOnly && (item.get_UserId() == this.appConfig.user.id) || !this.appConfig.isReviewOnly && (!this.appConfig.canUseReviewPermissions || AscCommon.UserInfoParser.canEditReview(item.get_UserName()));\n arr.push({date: date, user: user, userColor: userColor, changeText: changeText, goto: goto, editable: editable});\n });\n return arr;\n }\n\n onPrevChange () {\n const api = Common.EditorApi.get();\n api.asc_GetPrevRevisionsChange();\n }\n\n onNextChange () {\n const api = Common.EditorApi.get();\n api.asc_GetNextRevisionsChange();\n }\n\n onAcceptCurrentChange () {\n const api = Common.EditorApi.get();\n api.asc_AcceptChanges(this.dataChanges[0]);\n setTimeout(() => {\n api.asc_GetNextRevisionsChange();\n });\n }\n\n onRejectCurrentChange () {\n const api = Common.EditorApi.get();\n api.asc_RejectChanges(this.dataChanges[0]);\n setTimeout(() => {\n api.asc_GetNextRevisionsChange();\n });\n }\n\n onGotoNextChange () {\n const api = Common.EditorApi.get();\n api.asc_FollowRevisionMove(this.dataChanges[0]);\n }\n\n onDeleteChange () {\n const api = Common.EditorApi.get();\n api.asc_RejectChanges(this.dataChanges[0]);\n }\n\n render() {\n this.dataChanges = this.props.storeReview.dataChanges;\n const arrChangeReview = this.getArrChangeReview(this.dataChanges);\n let change;\n let goto = false;\n if (arrChangeReview.length > 0) {\n const name = AscCommon.UserInfoParser.getParsedName(arrChangeReview[0].user);\n change = {\n date: arrChangeReview[0].date,\n user: arrChangeReview[0].user,\n userName: Common.Utils.String.htmlEncode(name),\n color: arrChangeReview[0].userColor.get_hex(),\n text: arrChangeReview[0].changeText,\n initials: this.props.users.getInitials(name),\n editable: arrChangeReview[0].editable\n };\n goto = arrChangeReview[0].goto;\n }\n\n const isReviewOnly = this.appConfig.isReviewOnly;\n const canReview = this.appConfig.canReview;\n const displayMode = this.props.storeReview.displayMode;\n\n return (\n \n )\n }\n}\n\n\nconst InitReviewController = inject(\"storeAppOptions\", \"storeReview\")(observer(InitReview));\nconst ReviewController = inject(\"storeAppOptions\", \"storeReview\")(observer(Review));\nconst ReviewChangeController = withTranslation()(inject(\"storeAppOptions\", \"storeReview\", \"users\")(observer(ReviewChange)));\n\nexport {InitReviewController, ReviewController, ReviewChangeController};","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, emit } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7, f7ready } from '../shared/f7.js';\nimport { watchProp } from '../shared/watch-prop.js';\nimport { modalStateClasses } from '../shared/modal-state-classes.js';\n\n\n\nconst Actions = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n grid,\n opened = false,\n animate\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const isOpened = useRef(opened);\n const isClosing = useRef(false);\n const f7Actions = useRef(null);\n const onOpen = instance => {\n isOpened.current = true;\n isClosing.current = false;\n emit(props, 'actionsOpen', instance);\n };\n const onOpened = instance => {\n emit(props, 'actionsOpened', instance);\n };\n const onClose = instance => {\n isOpened.current = false;\n isClosing.current = true;\n emit(props, 'actionsClose', instance);\n };\n const onClosed = instance => {\n isClosing.current = false;\n emit(props, 'actionsClosed', instance);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n f7Actions: () => f7Actions.current\n }));\n\n // watch opened changes\n watchProp(opened, value => {\n if (!f7Actions.current) return;\n if (value) {\n f7Actions.current.open();\n } else {\n f7Actions.current.close();\n }\n });\n const modalEvents = method => {\n if (!f7Actions.current) return;\n f7Actions.current[method]('open', onOpen);\n f7Actions.current[method]('opened', onOpened);\n f7Actions.current[method]('close', onClose);\n f7Actions.current[method]('closed', onClosed);\n };\n const onMount = () => {\n if (!elRef.current) return;\n const {\n target,\n convertToPopover,\n forceToPopover,\n closeByBackdropClick,\n closeByOutsideClick,\n closeOnEscape,\n backdrop,\n backdropEl,\n containerEl\n } = props;\n const params = {\n el: elRef.current,\n grid\n };\n if (target) params.targetEl = target;\n if ('convertToPopover' in props) params.convertToPopover = convertToPopover;\n if ('forceToPopover' in props) params.forceToPopover = forceToPopover;\n if ('backdrop' in props) params.backdrop = backdrop;\n if ('backdropEl' in props) params.backdropEl = backdropEl;\n if ('closeByBackdropClick' in props) params.closeByBackdropClick = closeByBackdropClick;\n if ('closeByOutsideClick' in props) params.closeByOutsideClick = closeByOutsideClick;\n if ('closeOnEscape' in props) params.closeOnEscape = closeOnEscape;\n if ('animate' in props) params.animate = animate;\n if ('containerEl' in props) params.containerEl = containerEl;\n f7ready(() => {\n f7Actions.current = f7.actions.create(params);\n modalEvents('on');\n if (opened) {\n f7Actions.current.open(false);\n }\n });\n };\n const onDestroy = () => {\n if (f7Actions.current) f7Actions.current.destroy();\n f7Actions.current = null;\n };\n useIsomorphicLayoutEffect(() => {\n modalEvents('on');\n return () => {\n modalEvents('off');\n };\n });\n useIsomorphicLayoutEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n const classes = classNames(className, 'actions-modal', {\n 'actions-grid': grid\n }, modalStateClasses({\n isOpened,\n isClosing\n }), colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), children);\n});\nActions.displayName = 'f7-actions';\nexport default Actions;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { classNames, getExtraAttrs } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\n\n\nconst ActionsGroup = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n const classes = classNames(className, 'actions-group', colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), children);\n});\nActionsGroup.displayName = 'f7-actions-group';\nexport default ActionsGroup;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { classNames, getExtraAttrs, getSlots, emit } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7 } from '../shared/f7.js';\n\n\nconst ComponentName = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n strong,\n close = true\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n const classes = classNames(className, {\n 'actions-button': true,\n 'actions-button-strong': strong\n }, colorClasses(props));\n let mediaEl;\n const slots = getSlots(props);\n if (slots.media && slots.media.length) {\n mediaEl = /*#__PURE__*/React.createElement(\"div\", {\n className: \"actions-button-media\"\n }, slots.media);\n }\n const onClick = e => {\n if (elRef.current && close && f7) {\n f7.actions.close(f7.$(elRef.current).parents('.actions-modal'));\n }\n emit(props, 'click', e);\n };\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs, {\n onClick: onClick\n }), mediaEl, /*#__PURE__*/React.createElement(\"div\", {\n className: \"actions-button-text\"\n }, slots.default));\n});\nComponentName.displayName = 'f7-actions-button';\nexport default ComponentName;","import React, {useState, useEffect, Fragment, useRef} from 'react';\nimport {observer, inject} from \"mobx-react\";\nimport { f7, Popup, Sheet, Popover, Page, Toolbar, Navbar, NavLeft, NavRight, NavTitle, Link, Input, Icon, List, ListItem, Actions, ActionsGroup, ActionsButton } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport {Device} from '../../../utils/device';\n\n// Utils\nconst sliceQuote = (text) => {\n if (text) {\n let sliced = text.slice(0, 100);\n if (sliced.length < text.length) {\n sliced += '...';\n return sliced;\n }\n return text;\n }\n};\n\n// Add comment\n\nconst AddCommentPopup = inject(\"storeComments\")(observer(props => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const userInfo = props.userInfo;\n const [stateText, setText] = useState('');\n let refInputComment = useRef(null);\n\n useEffect(() => {\n f7.popup.open('.add-comment-popup', false);\n\n if(refInputComment) {\n refInputComment.focus();\n }\n }, []);\n\n return (\n \n \n \n {\n f7.popup.close('.add-comment-popup');\n setTimeout(() => {\n props.closeAddComment();\n }, 500)\n }}>{_t.textCancel}\n \n {_t.textAddComment}\n \n {\n f7.popup.close('.add-comment-popup');\n setTimeout(() => {\n props.closeAddComment();\n props.onAddNewComment(stateText, false)\n }, 500);\n }}>\n {Device.android ? : _t.textDone}\n \n \n \n \n
\n {Device.android &&\n
{userInfo.initials}
\n }\n
{userInfo.name}
\n
\n
\n \n
\n
\n \n )\n}));\n\nconst AddCommentDialog = inject(\"storeComments\")(observer(props => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const userInfo = props.userInfo;\n const templateInitials = `${userInfo.initials}
`;\n let refContainerDialog = useRef(null);\n\n useEffect(() => {\n f7.dialog.create({\n destroyOnClose: true,\n containerEl: document.getElementById('add-comment-dialog'),\n content:\n `\n
\n
\n
\n \n
\n
${_t.textAddComment}
\n
\n \n
\n
\n
\n `,\n on: {\n opened: () => {\n const cancel = document.getElementById('comment-cancel');\n if(!Device.android) $$('#comment-text').focus();\n cancel.addEventListener('click', () => {\n f7.dialog.close();\n props.closeAddComment();\n });\n const done = document.getElementById('comment-done');\n done.addEventListener('click', () => {\n const value = document.getElementById('comment-text').value;\n if (value.length > 0) {\n f7.dialog.close();\n props.closeAddComment();\n props.onAddNewComment(value, false);\n }\n });\n const area = document.getElementById('comment-text');\n area.addEventListener('input', (event) => {\n if (event.target.value.length === 0 && !done.classList.contains('disabled')) {\n done.classList.add('disabled');\n } else if (event.target.value.length > 0 && done.classList.contains('disabled')) {\n done.classList.remove('disabled');\n }\n });\n done.classList.add('disabled');\n }\n }\n }).open();\n\n if(refContainerDialog) {\n const inputComment = refContainerDialog.querySelector('#comment-text');\n inputComment.focus();\n }\n }, []);\n\n return (\n \n );\n}));\n\nconst AddComment = props => {\n return (\n Device.phone ?\n :\n \n )\n};\n\n// Actions\nconst CommentActions = ({comment, onCommentMenuClick, opened, openActionComment}) => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n return (\n \n )\n};\n\nconst ReplyActions = ({comment, reply, onCommentMenuClick, opened, openActionReply}) => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n return (\n \n )\n};\n\n// Edit comment\nconst EditCommentPopup = inject(\"storeComments\")(observer(({storeComments, comment, onEditComment}) => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const [stateText, setText] = useState(comment.comment);\n let refInputEditComment = useRef(null);\n\n useEffect(() => {\n f7.popup.open('.edit-comment-popup', false);\n\n if(refInputEditComment) {\n refInputEditComment.focus();\n }\n }, []);\n \n return (\n \n \n \n {\n f7.popup.close('.edit-comment-popup');\n setTimeout(() => {\n storeComments.openEditComment(false);\n }, 500);\n }}>{_t.textCancel}\n \n {_t.textEditComment}\n \n {\n f7.popup.close('.edit-comment-popup');\n setTimeout(() => {\n storeComments.openEditComment(false);\n onEditComment(comment, stateText);\n }, 500);\n }}\n >\n {Device.android ? : _t.textDone}\n \n \n \n \n
\n {Device.android &&\n
{comment.userInitials}
\n }\n
\n
{comment.parsedName}
\n
{comment.date}
\n
\n
\n
\n \n
\n
\n \n )\n}));\n\nconst EditCommentDialog = inject(\"storeComments\")(observer(({storeComments, comment, onEditComment}) => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const templateInitials = `${comment.userInitials}
`;\n let refContainerDialog = useRef(null);\n\n useEffect(() => {\n f7.dialog.create({\n destroyOnClose: true,\n containerEl: document.getElementById('edit-comment-dialog'),\n content:\n `\n
\n
\n
\n \n
\n
${_t.textEditComment}
\n
\n \n
\n
\n
\n `,\n on: {\n opened: () => {\n const cancel = document.getElementById('comment-cancel');\n cancel.addEventListener('click', () => {\n f7.dialog.close();\n storeComments.openEditComment(false);\n });\n const done = document.getElementById('comment-done');\n done.addEventListener('click', () => {\n const value = document.getElementById('comment-text').value;\n if (value.length > 0) {\n onEditComment(comment, value);\n f7.dialog.close();\n storeComments.openEditComment(false);\n }\n });\n const area = document.getElementById('comment-text');\n area.addEventListener('input', (event) => {\n if (event.target.value.length === 0 && !done.classList.contains('disabled')) {\n done.classList.add('disabled');\n } else if (event.target.value.length > 0 && done.classList.contains('disabled')) {\n done.classList.remove('disabled');\n }\n });\n },\n open: () => {\n $$('.dialog-backdrop.backdrop-in')[0].classList.add('over-popover');\n },\n closed: () => {\n $$('.dialog-backdrop.backdrop-in')[0].classList.remove('over-popover');\n }\n }\n }).open();\n\n if(refContainerDialog) {\n const inputComment = refContainerDialog.querySelector('#comment-text');\n inputComment.focus();\n }\n }, []);\n\n return (\n \n );\n}));\n\nconst EditComment = ({comment, onEditComment}) => {\n return (\n Device.phone ?\n :\n \n )\n};\n\nconst AddReplyPopup = inject(\"storeComments\")(observer(({storeComments, userInfo, comment, onAddReply}) => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const [stateText, setText] = useState('');\n let refInputReplyComment = useRef(null);\n\n useEffect(() => {\n f7.popup.open('.add-reply-popup', false);\n\n if(refInputReplyComment) {\n refInputReplyComment.focus();\n }\n }, []);\n\n return (\n \n \n \n {\n f7.popup.close('.add-reply-popup');\n setTimeout(() => {\n storeComments.openAddReply(false);\n }, 500);\n }}>{_t.textCancel}\n \n {_t.textAddReply}\n \n {\n f7.popup.close('.add-reply-popup');\n setTimeout(() => {\n storeComments.openAddReply(false);\n onAddReply(comment, stateText);\n }, 500);\n }}>\n {Device.android ? : _t.textDone}\n \n \n \n \n
\n {Device.android &&\n
{userInfo.initials}
\n }\n
{userInfo.name}
\n
\n
\n \n
\n
\n \n )\n}));\n\nconst AddReplyDialog = inject(\"storeComments\")(observer(({storeComments, userInfo, comment, onAddReply}) => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const templateInitials = `${userInfo.initials}
`;\n let refContainerDialog = useRef(null);\n\n useEffect(() => {\n f7.dialog.create({\n destroyOnClose: true,\n containerEl: document.getElementById('add-reply-dialog'),\n content:\n `\n
\n
\n
\n
${_t.textAddReply}
\n
\n
\n
\n `,\n on: {\n opened: () => {\n const cancel = document.getElementById('reply-cancel');\n cancel.addEventListener('click', () => {\n f7.dialog.close();\n storeComments.openAddReply(false);\n });\n const done = document.getElementById('reply-done');\n done.addEventListener('click', () => {\n const value = document.getElementById('reply-text').value;\n if (value.length > 0) {\n onAddReply(comment, value);\n f7.dialog.close();\n storeComments.openAddReply(false);\n }\n });\n const area = document.getElementById('reply-text');\n area.addEventListener('input', (event) => {\n if (event.target.value.length === 0 && !done.classList.contains('disabled')) {\n done.classList.add('disabled');\n } else if (event.target.value.length > 0 && done.classList.contains('disabled')) {\n done.classList.remove('disabled');\n }\n });\n done.classList.add('disabled');\n },\n open: () => {\n $$('.dialog-backdrop.backdrop-in')[0].classList.add('over-popover');\n },\n closed: () => {\n $$('.dialog-backdrop.backdrop-in')[0].classList.remove('over-popover');\n }\n }\n }).open();\n\n if(refContainerDialog) {\n const inputReplyComment = refContainerDialog.querySelector('#reply-text');\n inputReplyComment.focus();\n }\n }, []);\n\n return (\n refContainerDialog = el} className=\"add-reply-dialog\">
\n );\n}));\n\nconst AddReply = ({userInfo, comment, onAddReply}) => {\n return (\n Device.phone ?\n :\n \n )\n};\n\nconst EditReplyPopup = inject(\"storeComments\")(observer(({storeComments, comment, reply, onEditReply}) => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const [stateText, setText] = useState(reply.reply);\n let relInputReplyComment = useRef(null);\n\n useEffect(() => {\n f7.popup.open('.edit-reply-popup', false);\n\n if(relInputReplyComment) {\n relInputReplyComment.focus();\n }\n }, []);\n\n return (\n \n \n \n {\n f7.popup.close('.edit-reply-popup');\n setTimeout(() => {\n storeComments.openEditReply(false);\n }, 500);\n }}>{_t.textCancel}\n \n {_t.textEditReply}\n \n {\n f7.popup.close('.edit-reply-popup');\n setTimeout(() => {\n storeComments.openEditReply(false);\n onEditReply(comment, reply, stateText);\n }, 500);\n }}\n >\n {Device.android ? : _t.textDone}\n \n \n \n \n
\n {Device.android &&\n
{reply.userInitials}
\n }\n
\n
{reply.parsedName}
\n
{reply.date}
\n
\n
\n
\n \n
\n
\n \n )\n}));\n\nconst EditReplyDialog = inject(\"storeComments\")(observer(({storeComments, comment, reply, onEditReply}) => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const templateInitials = `${reply.userInitials}
`;\n let refContainerDialog = useRef(null);\n\n useEffect(() => {\n f7.dialog.create({\n destroyOnClose: true,\n containerEl: document.getElementById('edit-reply-dialog'),\n content:\n `\n
\n
\n
\n
${_t.textEditReply}
\n
\n
\n
\n `,\n on: {\n opened: () => {\n const cancel = document.getElementById('reply-cancel');\n cancel.addEventListener('click', () => {\n f7.dialog.close();\n storeComments.openEditReply(false);\n });\n const done = document.getElementById('reply-done');\n done.addEventListener('click', () => {\n const value = document.getElementById('reply-text').value;\n if (value.length > 0) {\n onEditReply(comment, reply, value);\n f7.dialog.close();\n storeComments.openEditReply(false);\n }\n });\n const area = document.getElementById('reply-text');\n area.addEventListener('input', (event) => {\n if (event.target.value.length === 0 && !done.classList.contains('disabled')) {\n done.classList.add('disabled');\n } else if (event.target.value.length > 0 && done.classList.contains('disabled')) {\n done.classList.remove('disabled');\n }\n });\n },\n open: () => {\n $$('.dialog-backdrop.backdrop-in')[0].classList.add('over-popover');\n },\n closed: () => {\n $$('.dialog-backdrop.backdrop-in')[0].classList.remove('over-popover');\n }\n }\n }).open();\n\n if(refContainerDialog) {\n const inputReplyComment = refContainerDialog.querySelector('#reply-text');\n inputReplyComment.focus();\n }\n }, []);\n\n return (\n refContainerDialog = el} className=\"edit-reply-dialog\">
\n );\n}));\n\nconst EditReply = ({comment, reply, onEditReply}) => {\n return (\n Device.phone ?\n :\n \n )\n};\n\nconst pickLink = (message) => {\n let arrayComment = [], offset, len;\n message.replace(Common.Utils.ipStrongRe, function(subStr) {\n let result = /[\\.,\\?\\+;:=!\\(\\)]+$/.exec(subStr);\n if (result)\n subStr = subStr.substring(0, result.index);\n offset = arguments[arguments.length-2];\n arrayComment.push({start: offset, end: subStr.length+offset, str: window.open(subStr)} href={subStr} target=\"_blank\" data-can-copy=\"true\">{subStr}});\n return '';\n });\n\n if (message.length<1000 || message.search(/\\S{255,}/)<0)\n message.replace(Common.Utils.hostnameStrongRe, function(subStr) {\n let result = /[\\.,\\?\\+;:=!\\(\\)]+$/.exec(subStr);\n if (result)\n subStr = subStr.substring(0, result.index);\n let ref = (! /(((^https?)|(^ftp)):\\/\\/)/i.test(subStr) ) ? ('http://' + subStr) : subStr;\n offset = arguments[arguments.length-2];\n len = subStr.length;\n let elem = arrayComment.find(function(item){\n return ( (offset>=item.start) && (offsetitem.start));\n });\n if (!elem)\n arrayComment.push({start: offset, end: len+offset, str: window.open(ref)} href={ref} target=\"_blank\" data-can-copy=\"true\">{subStr}});\n return '';\n });\n\n message.replace(Common.Utils.emailStrongRe, function(subStr) {\n let ref = (! /((^mailto:)\\/\\/)/i.test(subStr) ) ? ('mailto:' + subStr) : subStr;\n offset = arguments[arguments.length-2];\n len = subStr.length;\n let elem = arrayComment.find(function(item){\n return ( (offset>=item.start) && (offsetitem.start));\n });\n if (!elem)\n arrayComment.push({start: offset, end: len+offset, str: window.open(ref)} href={ref}>{subStr}});\n return '';\n });\n\n arrayComment = arrayComment.sort(function(item1,item2){ return item1.start - item2.start; });\n \n let str_res = (arrayComment.length>0) ? : ;\n\n for (var i=1; i{str_res}{Common.Utils.String.htmlEncode(message.substring(arrayComment[i-1].end, arrayComment[i].start))}{arrayComment[i].str};\n }\n\n if (arrayComment.length>0) {\n str_res = ;\n }\n\n return str_res; \n}\n\n// View comments\n\nconst ViewComments = inject(\"storeComments\", \"storeAppOptions\", \"storeReview\")(observer(({storeComments, storeAppOptions, onCommentMenuClick, onResolveComment, showComment, storeReview, wsProps}) => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const isAndroid = Device.android;\n const displayMode = storeReview.displayMode;\n const isViewer = storeAppOptions.isViewer;\n const canEditComments = storeAppOptions.canEditComments;\n const viewMode = !storeAppOptions.canComments;\n const comments = storeComments.groupCollectionFilter || storeComments.collectionComments;\n const isEdit = storeAppOptions.isEdit || storeAppOptions.isRestrictedEdit;\n const sortComments = comments.length > 0 ? [...comments].sort((a, b) => a.time > b.time ? -1 : 1) : null;\n const isProtected = storeAppOptions.isProtected;\n const typeProtection = storeAppOptions.typeProtection;\n const isAvailableCommenting = !isProtected || typeProtection === Asc.c_oAscEDocProtect.TrackedChanges || typeProtection === Asc.c_oAscEDocProtect.Comments;\n\n const [clickComment, setComment] = useState();\n const [commentActionsOpened, openActionComment] = useState(false);\n\n const [reply, setReply] = useState();\n const [replyActionsOpened, openActionReply] = useState(false);\n\n return (\n \n \n {Device.phone &&\n \n \n \n \n \n }\n \n {!sortComments ?\n {_t.textNoComments}
:\n \n {sortComments.map((comment, indexComment) => {\n return (\n !comment.hide &&\n {\n !e.target.closest('.comment-menu') && !e.target.closest('.reply-menu') ? showComment(comment) : null}}>\n \n
\n {isAndroid &&
{comment.userInitials}
}\n
\n
{comment.parsedName}
\n
{comment.date}
\n
\n
\n {isEdit && !viewMode &&\n
\n {(comment.editable && displayMode === 'markup' && !wsProps?.Objects && (!isViewer || canEditComments) && isAvailableCommenting) &&
{onResolveComment(comment);}}>
}\n {(displayMode === 'markup' && !wsProps?.Objects && (!isViewer || canEditComments) && isAvailableCommenting) &&\n
{setComment(comment); openActionComment(true);}}>\n \n
\n }\n
\n }\n
\n \n {comment.quote &&
{sliceQuote(comment.quote)}
}\n
{pickLink(comment.comment)}\n {comment.replies.length > 0 &&\n
\n {comment.replies.map((reply, indexReply) => {\n return (\n - \n
\n
\n
\n
\n
\n {isAndroid &&
{reply.userInitials}
}\n
\n
{reply.parsedName}
\n
{reply.date}
\n
\n
\n {isEdit && !viewMode && reply.editable && (!isViewer || canEditComments) && isAvailableCommenting &&\n
\n
{setComment(comment); setReply(reply); openActionReply(true);}}\n >\n \n
\n
\n }\n
\n
\n
\n
\n
\n \n )\n })}\n
\n }\n
\n \n )\n })}\n
\n }\n\n \n \n \n )\n}));\n\nconst CommentList = inject(\"storeComments\", \"storeAppOptions\", \"storeReview\")(observer(({storeComments, storeAppOptions, onCommentMenuClick, onResolveComment, storeReview, wsProps}) => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const isAndroid = Device.android;\n const displayMode = storeReview.displayMode;\n const isViewer = storeAppOptions.isViewer;\n const canEditComments = storeAppOptions.canEditComments;\n const viewMode = !storeAppOptions.canComments;\n const isEdit = storeAppOptions.isEdit || storeAppOptions.isRestrictedEdit;\n const comments = storeComments.showComments;\n const isProtected = storeAppOptions.isProtected;\n const typeProtection = storeAppOptions.typeProtection;\n const isAvailableCommenting = !isProtected || typeProtection === Asc.c_oAscEDocProtect.TrackedChanges || typeProtection === Asc.c_oAscEDocProtect.Comments;\n\n const [currentIndex, setCurrentIndex] = useState(0);\n const comment = comments[currentIndex];\n\n const [commentActionsOpened, openActionComment] = useState(false);\n\n const [reply, setReply] = useState();\n const [replyActionsOpened, openActionReply] = useState(false);\n\n const onViewPrevComment = () => {\n if (currentIndex - 1 < 0) {\n setCurrentIndex(comments.length - 1);\n } else {\n setCurrentIndex(currentIndex - 1);\n }\n };\n\n const onViewNextComment = () => {\n if (currentIndex + 1 >= comments.length) {\n setCurrentIndex(0);\n } else {\n setCurrentIndex(currentIndex + 1);\n }\n };\n\n if(!comment) {\n if (comments.length > 0) {\n onViewNextComment();\n }\n return null;\n }\n\n return (\n \n \n {isEdit && !viewMode &&\n {onCommentMenuClick('addReply', comment);}}>{_t.textAddReply}\n }\n {comments.length > 1 &&\n \n \n \n
\n }\n \n \n
\n \n \n \n
\n {isAndroid &&
{comment.userInitials}
}\n
\n
{comment.parsedName}
\n
{comment.date}
\n
\n
\n {isEdit && !viewMode &&\n
\n {(comment.editable && displayMode === 'markup' && !wsProps?.Objects && (!isViewer || canEditComments) && isAvailableCommenting) &&
{onResolveComment(comment);}}>
}\n {(displayMode === 'markup' && !wsProps?.Objects && (!isViewer || canEditComments) && isAvailableCommenting) &&\n
{openActionComment(true);}}>\n \n
\n }\n
\n }\n
\n \n {comment.quote &&
{sliceQuote(comment.quote)}
}\n
{pickLink(comment.comment)}\n {comment.replies.length > 0 &&\n
\n {comment.replies.map((reply, indexReply) => {\n return (\n - \n
\n
\n
\n
\n
\n {isAndroid &&
{reply.userInitials}
}\n
\n
{reply.parsedName}
\n
{reply.date}
\n
\n
\n {isEdit && !viewMode && reply.editable && (!isViewer || canEditComments) && isAvailableCommenting &&\n
\n
{setReply(reply); openActionReply(true);}}\n >\n \n
\n
\n }\n
\n
\n
\n
\n
\n \n )\n })}\n
\n }\n
\n \n
\n \n \n \n
\n \n )\n\n}));\n\nconst ViewCommentSheet = ({closeCurComments, onCommentMenuClick, onResolveComment, wsProps}) => {\n useEffect(() => {\n f7.sheet.open('#view-comment-sheet');\n });\n\n const [stateHeight, setHeight] = useState('45%');\n const [stateOpacity, setOpacity] = useState(1);\n\n const [stateStartY, setStartY] = useState();\n const [isNeedClose, setNeedClose] = useState(false);\n\n const handleTouchStart = (event) => {\n const touchObj = event.changedTouches[0];\n setStartY(parseInt(touchObj.clientY));\n };\n const handleTouchMove = (event) => {\n const touchObj = event.changedTouches[0];\n const dist = parseInt(touchObj.clientY) - stateStartY;\n if (dist < 0) { // to top\n setHeight('90%');\n setOpacity(1);\n setNeedClose(false);\n } else if (dist < 80) {\n setHeight('45%');\n setOpacity(1);\n setNeedClose(false);\n } else {\n setNeedClose(true);\n setOpacity(0.6);\n }\n };\n const handleTouchEnd = (event) => {\n const touchObj = event.changedTouches[0];\n const swipeEnd = parseInt(touchObj.clientY);\n const dist = swipeEnd - stateStartY;\n if (isNeedClose) {\n closeCurComments();\n } else if (stateHeight === '90%' && dist > 20) {\n setHeight('45%');\n }\n };\n return (\n \n )\n};\n\nconst ViewCommentPopover = ({onCommentMenuClick, onResolveComment, wsProps}) => {\n useEffect(() => {\n f7.popover.open('#view-comment-popover', '#btn-coauth');\n });\n\n return (\n \n )\n};\n\nconst ViewCurrentComments = props => {\n return (\n Device.phone ?\n :\n \n )\n};\n\nexport {\n AddComment,\n EditComment,\n AddReply,\n EditReply,\n ViewComments,\n ViewCurrentComments\n};\n","export const getUserColor = (id, intValue) => {\n\tconst api = Common.EditorApi.get();\n\tconst color = api.asc_getUserColorById(id);\n\tconst userColors = [\"#\" + (\"000000\" + color.toString(16)).slice(-6), color];\n\n\treturn intValue ? userColors[1] : userColors[0];\n}","import React, {Component, Fragment} from 'react';\nimport { inject, observer } from \"mobx-react\";\nimport { f7 } from 'framework7-react';\nimport {Device} from '../../../../../common/mobile/utils/device';\nimport { withTranslation} from 'react-i18next';\nimport { LocalStorage } from '../../../utils/LocalStorage.mjs';\n\nimport {AddComment, EditComment, AddReply, EditReply, ViewComments, ViewCurrentComments} from '../../view/collaboration/Comments';\nimport { getUserColor } from '../../../utils/getUserColor';\n\n// utils\nconst timeZoneOffsetInMs = (new Date()).getTimezoneOffset() * 60000;\nconst utcDateToString = (date) => {\n if (Object.prototype.toString.call(date) === '[object Date]')\n return (date.getTime() - timeZoneOffsetInMs).toString();\n return '';\n};\nconst ooDateToString = (date) => {\n if (Object.prototype.toString.call(date) === '[object Date]')\n return (date.getTime()).toString();\n return '';\n};\nconst stringOOToLocalDate = (date) => {\n if (typeof date === 'string')\n return parseInt(date);\n return 0;\n};\nconst stringUtcToLocalDate = (date) => {\n if (typeof date === 'string')\n return parseInt(date) + timeZoneOffsetInMs;\n return 0;\n};\nconst dateToLocaleTimeString = (date, lang) => {\n const format = (date) => {\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let ampm = hours >= 12 ? 'pm' : 'am';\n\n hours = hours % 12;\n hours = hours ? hours : 12; // the hour '0' should be '12'\n minutes = minutes < 10 ? '0' + minutes : minutes;\n return hours + ':' + minutes + ' ' + ampm;\n };\n lang = (lang || 'en').replace('_', '-').toLowerCase();\n try {\n return date.toLocaleString(lang, {dateStyle: 'short', timeStyle: 'short'});\n } catch (e) {\n lang = 'en';\n return date.toLocaleString(lang, {dateStyle: 'short', timeStyle: 'short'});\n }\n\n // MM/dd/yyyy hh:mm AM\n return (date.getMonth() + 1) + '/' + (date.getDate()) + '/' + date.getFullYear() + ' ' + format(date);\n};\nconst parseUserName = name => {\n return AscCommon.UserInfoParser.getParsedName(name);\n};\n//end utils\n\nclass CommentsController extends Component {\n constructor(props) {\n super(props);\n this.usersStore = this.props.users;\n this.appOptions = this.props.storeAppOptions;\n this.storeComments = this.props.storeComments;\n this.storeApplicationSettings = this.props.storeApplicationSettings;\n\n Common.Notifications.on('engineCreated', api => {\n api.asc_registerCallback('asc_onAddComment', this.addComment.bind(this));\n api.asc_registerCallback('asc_onAddComments', this.addComments.bind(this));\n api.asc_registerCallback('asc_onRemoveComment', this.removeComment.bind(this));\n api.asc_registerCallback('asc_onRemoveComments', this.removeComments.bind(this));\n api.asc_registerCallback('asc_onChangeCommentData', this.changeCommentData.bind(this));\n api.asc_registerCallback('asc_onShowComment', this.changeShowComments.bind(this));\n api.asc_registerCallback('asc_onHideComment', this.hideComments.bind(this));\n\n if (window.editorType === 'sse') {\n api.asc_registerCallback('asc_onActiveSheetChanged', this.onApiActiveSheetChanged.bind(this));\n Common.Notifications.on('comments:filterchange', this.onFilterChange.bind(this));\n Common.Notifications.on('sheet:active', this.onApiActiveSheetChanged.bind(this));\n }\n });\n\n Common.Notifications.on('document:ready', () => {\n if (window.editorType === 'de' || window.editorType === 'sse') {\n const api = Common.EditorApi.get();\n /** coauthoring begin **/\n const isLiveCommenting = LocalStorage.getBool(`${window.editorType}-mobile-settings-livecomment`, true);\n const resolved = LocalStorage.getBool(`${window.editorType}-settings-resolvedcomment`);\n this.storeApplicationSettings.changeDisplayComments(isLiveCommenting);\n this.storeApplicationSettings.changeDisplayResolved(resolved);\n isLiveCommenting ? api.asc_showComments(resolved) : api.asc_hideComments();\n /** coauthoring end **/\n }\n\n this.curUserId = this.props.users.currentUser.asc_getIdOriginal();\n });\n }\n onApiActiveSheetChanged (index) {\n this.onFilterChange(['doc', 'sheet' + Common.EditorApi.get().asc_getWorksheetId(index)]);\n }\n addComment (id, data) {\n const comment = this.readSDKComment(id, data);\n \n if (comment) {\n this.storeComments.addComment(comment);\n this.changeShowComments([comment.uid]);\n }\n }\n addComments (data) {\n for (let i = 0; i < data.length; ++i) {\n const comment = this.readSDKComment(data[i].asc_getId(), data[i]);\n this.storeComments.addComment(comment);\n }\n }\n removeComment (id) {\n this.storeComments.removeComment(id);\n if (this.storeComments.showComments.length < 1) {\n Device.phone ? f7.sheet.close('#view-comment-sheet') : f7.popover.close('#view-comment-popover');\n }\n }\n removeComments (data) {\n for (let i = 0; i < data.length; i++) {\n this.removeComment(data[i]);\n }\n }\n changeShowComments (id) {\n this.storeComments.changeShowComment(id);\n }\n hideComments () {\n //Common.Notifications.trigger('closeviewcomment');\n }\n changeCommentData (id, data) {\n const changeComment = {};\n\n const date = (data.asc_getOnlyOfficeTime()) ? new Date(stringOOToLocalDate(data.asc_getOnlyOfficeTime())) :\n ((data.asc_getTime() === '') ? new Date() : new Date(stringUtcToLocalDate(data.asc_getTime())));\n\n const userId = data.asc_getUserId()\n const user = this.usersStore.searchUserById(userId);\n const name = data.asc_getUserName();\n const parsedName = parseUserName(name);\n\n changeComment.comment = data.asc_getText();\n changeComment.userId = userId;\n changeComment.userName = name;\n changeComment.parsedName = Common.Utils.String.htmlEncode(parsedName);\n changeComment.userInitials = this.usersStore.getInitials(parsedName);\n changeComment.userColor = (user) ? user.asc_getColor() : getUserColor(userId || name);\n changeComment.resolved = data.asc_getSolved();\n changeComment.quote = data.asc_getQuoteText();\n changeComment.time = date.getTime();\n changeComment.date = dateToLocaleTimeString(date, this.appOptions.lang);\n changeComment.editable = (this.appOptions.canEditComments || (data.asc_getUserId() === this.curUserId)) && AscCommon.UserInfoParser.canEditComment(name);\n changeComment.removable = (this.appOptions.canDeleteComments || (data.asc_getUserId() === this.curUserId)) && AscCommon.UserInfoParser.canDeleteComment(name);\n changeComment.hide = !AscCommon.UserInfoParser.canViewComment(name);\n\n let dateReply = null;\n const replies = [];\n\n const repliesCount = data.asc_getRepliesCount();\n for (let i = 0; i < repliesCount; ++i) {\n\n dateReply = (data.asc_getReply(i).asc_getOnlyOfficeTime()) ? new Date(stringOOToLocalDate(data.asc_getReply(i).asc_getOnlyOfficeTime())) :\n ((data.asc_getReply(i).asc_getTime() === '') ? new Date() : new Date(stringUtcToLocalDate(data.asc_getReply(i).asc_getTime())));\n\n const userId = data.asc_getReply(i).asc_getUserId();\n const user = this.usersStore.searchUserById(userId);\n const userName = data.asc_getReply(i).asc_getUserName();\n const parsedName = parseUserName(userName);\n\n replies.push({\n ind: i,\n userId,\n userName,\n parsedName: Common.Utils.String.htmlEncode(parsedName),\n userColor: (user) ? user.asc_getColor() : getUserColor(userId || userName),\n date: dateToLocaleTimeString(dateReply, this.appOptions.lang),\n reply: data.asc_getReply(i).asc_getText(),\n time: dateReply.getTime(),\n userInitials: this.usersStore.getInitials(parsedName),\n editable: (this.appOptions.canEditComments || (data.asc_getReply(i).asc_getUserId() === this.curUserId)) && AscCommon.UserInfoParser.canEditComment(userName),\n removable: (this.appOptions.canDeleteComments || (data.asc_getReply(i).asc_getUserId() === this.curUserId)) && AscCommon.UserInfoParser.canDeleteComment(userName)\n });\n }\n changeComment.replies = replies;\n\n this.props.storeComments.changeComment(id, changeComment);\n }\n onFilterChange (filter) {\n this.storeComments.changeFilter(filter);\n }\n readSDKComment (id, data) {\n const date = (data.asc_getOnlyOfficeTime()) ? new Date(stringOOToLocalDate(data.asc_getOnlyOfficeTime())) :\n ((data.asc_getTime() === '') ? new Date() : new Date(stringUtcToLocalDate(data.asc_getTime())));\n const userId = data.asc_getUserId();\n const user = this.usersStore.searchUserById(userId);\n const groupName = id.substr(0, id.lastIndexOf('_')+1).match(/^(doc|sheet[0-9_]+)_/);\n const userName = data.asc_getUserName();\n const parsedName = parseUserName(userName);\n const comment = {\n uid : id,\n userId,\n userName,\n parsedName,\n userColor : (user) ? user.asc_getColor() : getUserColor(userId || userName),\n date : dateToLocaleTimeString(date, this.appOptions.lang),\n quote : data.asc_getQuoteText(),\n comment : data.asc_getText(),\n resolved : data.asc_getSolved(),\n unattached : !!data.asc_getDocumentFlag ? data.asc_getDocumentFlag() : false,\n time : date.getTime(),\n replies : [],\n groupName : (groupName && groupName.length>1) ? groupName[1] : null,\n userInitials : this.usersStore.getInitials(parsedName),\n editable : (this.appOptions.canEditComments || (data.asc_getUserId() === this.curUserId)) && AscCommon.UserInfoParser.canEditComment(userName),\n removable : (this.appOptions.canDeleteComments || (data.asc_getUserId() === this.curUserId)) && AscCommon.UserInfoParser.canDeleteComment(userName),\n hide : !AscCommon.UserInfoParser.canViewComment(userName),\n };\n if (comment) {\n const replies = this.readSDKReplies(data);\n if (replies.length > 0) {\n comment.replies = replies;\n }\n }\n return comment;\n }\n readSDKReplies (data) {\n const replies = [];\n const repliesCount = data.asc_getRepliesCount();\n let i = 0;\n let date = null;\n if (repliesCount) {\n for (i = 0; i < repliesCount; ++i) {\n date = (data.asc_getReply(i).asc_getOnlyOfficeTime()) ? new Date(stringOOToLocalDate(data.asc_getReply(i).asc_getOnlyOfficeTime())) :\n ((data.asc_getReply(i).asc_getTime() === '') ? new Date() : new Date(stringUtcToLocalDate(data.asc_getReply(i).asc_getTime())));\n const userId = data.asc_getReply(i).asc_getUserId();\n const user = this.usersStore.searchUserById(userId);\n const userName = data.asc_getReply(i).asc_getUserName();\n const parsedName = parseUserName(userName);\n\n replies.push({\n ind : i,\n userId,\n userName,\n parsedName : Common.Utils.String.htmlEncode(parsedName),\n userColor : (user) ? user.asc_getColor() : getUserColor(userId || userName),\n date : dateToLocaleTimeString(date, this.appOptions.lang),\n reply : data.asc_getReply(i).asc_getText(),\n time : date.getTime(),\n userInitials : this.usersStore.getInitials(parsedName),\n editable : (this.appOptions.canEditComments || (data.asc_getReply(i).asc_getUserId() === this.curUserId)) && AscCommon.UserInfoParser.canEditComment(userName),\n removable : (this.appOptions.canDeleteComments || (data.asc_getReply(i).asc_getUserId() === this.curUserId)) && AscCommon.UserInfoParser.canDeleteComment(userName)\n });\n }\n }\n return replies;\n }\n render() {\n return null;\n }\n}\n\nclass AddCommentController extends Component {\n constructor(props) {\n super(props);\n this.closeAddComment = this.closeAddComment.bind(this);\n this.getUserInfo = this.getUserInfo.bind(this);\n this.onAddNewComment = this.onAddNewComment.bind(this);\n\n this.state = {\n isOpen: false\n };\n\n Common.Notifications.on('addcomment', () => {\n f7.popover.close('#idx-context-menu-popover'); //close context menu\n this.setState({isOpen: true});\n });\n }\n closeAddComment () {\n this.setState({isOpen: false});\n }\n getUserInfo () {\n this.currentUser = this.props.users.currentUser;\n if (!this.currentUser) {\n this.currentUser = this.props.users.setCurrentUser(this.props.storeAppOptions.user.id);\n }\n const name = parseUserName(this.currentUser.asc_getUserName());\n return {\n name: Common.Utils.String.htmlEncode(name),\n initials: this.props.users.getInitials(name),\n color: this.currentUser.asc_getColor()\n };\n }\n onAddNewComment (commentText, documentFlag) {\n const api = Common.EditorApi.get();\n let comment;\n if (typeof Asc.asc_CCommentDataWord !== 'undefined') {\n comment = new Asc.asc_CCommentDataWord(null);\n } else {\n comment = new Asc.asc_CCommentData(null);\n }\n if (commentText.length > 0) {\n comment.asc_putText(commentText);\n comment.asc_putTime(utcDateToString(new Date()));\n comment.asc_putOnlyOfficeTime(ooDateToString(new Date()));\n comment.asc_putUserId(this.currentUser.asc_getIdOriginal());\n comment.asc_putUserName(this.currentUser.asc_getUserName());\n comment.asc_putSolved(false);\n\n !!comment.asc_putDocumentFlag && comment.asc_putDocumentFlag(documentFlag);\n\n api.asc_addComment(comment);\n Common.Notifications.trigger('viewcomment');\n }\n }\n render() {\n return(\n this.state.isOpen ? : null\n )\n }\n}\n\nclass EditCommentController extends Component {\n constructor (props) {\n super(props);\n this.onEditComment = this.onEditComment.bind(this);\n this.onAddReply = this.onAddReply.bind(this);\n this.onEditReply = this.onEditReply.bind(this);\n }\n getUserInfo () {\n this.currentUser = this.props.users.currentUser;\n const name = parseUserName(this.currentUser.asc_getUserName());\n return {\n name: Common.Utils.String.htmlEncode(name),\n initials: this.props.users.getInitials(name),\n color: this.currentUser.asc_getColor()\n };\n }\n onChangeComment (comment) {\n const ascComment = typeof Asc.asc_CCommentDataWord !== 'undefined' ? new Asc.asc_CCommentDataWord(null) : new Asc.asc_CCommentData(null);\n if (ascComment && comment) {\n ascComment.asc_putText(comment.comment);\n ascComment.asc_putQuoteText(comment.quote);\n ascComment.asc_putTime(utcDateToString(new Date(comment.time)));\n ascComment.asc_putOnlyOfficeTime(ooDateToString(new Date(comment.time)));\n ascComment.asc_putUserId(comment.userId);\n ascComment.asc_putUserName(comment.userName);\n ascComment.asc_putSolved(comment.resolved);\n ascComment.asc_putGuid(comment.guid);\n\n if (!!ascComment.asc_putDocumentFlag) {\n ascComment.asc_putDocumentFlag(comment.unattached);\n }\n\n const reply = comment.replies;\n if (reply && reply.length > 0) {\n reply.forEach((reply) => {\n const addReply = (typeof Asc.asc_CCommentDataWord !== 'undefined' ? new Asc.asc_CCommentDataWord(null) : new Asc.asc_CCommentData(null));\n if (addReply) {\n addReply.asc_putText(reply.reply);\n addReply.asc_putTime(utcDateToString(new Date(reply.time)));\n addReply.asc_putOnlyOfficeTime(ooDateToString(new Date(reply.time)));\n addReply.asc_putUserId(reply.userId);\n addReply.asc_putUserName(reply.userName);\n\n ascComment.asc_addReply(addReply);\n }\n });\n }\n const api = Common.EditorApi.get();\n api.asc_changeComment(comment.uid, ascComment);\n }\n }\n onEditComment (comment, text) {\n const changeComment = {...comment};\n changeComment.comment = text.trim();\n const user = this.props.users.currentUser;\n changeComment.userid = user.asc_getIdOriginal();\n changeComment.username = user.asc_getUserName();\n this.onChangeComment(changeComment);\n }\n onAddReply (comment, replyVal) {\n let reply = null;\n let addReply = null;\n const ascComment = (typeof Asc.asc_CCommentDataWord !== 'undefined' ? new Asc.asc_CCommentDataWord(null) : new Asc.asc_CCommentData(null));\n\n if (ascComment) {\n ascComment.asc_putText(comment.comment);\n ascComment.asc_putQuoteText(comment.quote);\n ascComment.asc_putTime(utcDateToString(new Date(comment.time)));\n ascComment.asc_putOnlyOfficeTime(ooDateToString(new Date(comment.time)));\n ascComment.asc_putUserId(comment.userId);\n ascComment.asc_putUserName(comment.userName);\n ascComment.asc_putSolved(comment.resolved);\n ascComment.asc_putGuid(comment.guid);\n\n if (!!ascComment.asc_putDocumentFlag) {\n ascComment.asc_putDocumentFlag(comment.unattached);\n }\n\n reply = comment.replies;\n if (reply && reply.length) {\n reply.forEach(function (reply) {\n\n addReply = (typeof Asc.asc_CCommentDataWord !== 'undefined' ? new Asc.asc_CCommentDataWord(null) : new Asc.asc_CCommentData(null));\n if (addReply) {\n addReply.asc_putText(reply.reply);\n addReply.asc_putTime(utcDateToString(new Date(reply.time)));\n addReply.asc_putOnlyOfficeTime(ooDateToString(new Date(reply.time)));\n addReply.asc_putUserId(reply.userId);\n addReply.asc_putUserName(reply.userName);\n\n ascComment.asc_addReply(addReply);\n }\n });\n }\n\n addReply = (typeof Asc.asc_CCommentDataWord !== 'undefined' ? new Asc.asc_CCommentDataWord(null) : new Asc.asc_CCommentData(null));\n if (addReply) {\n addReply.asc_putText(replyVal);\n addReply.asc_putTime(utcDateToString(new Date()));\n addReply.asc_putOnlyOfficeTime(ooDateToString(new Date()));\n const currentUser = this.props.users.currentUser;\n addReply.asc_putUserId(currentUser.asc_getIdOriginal());\n addReply.asc_putUserName(currentUser.asc_getUserName());\n\n ascComment.asc_addReply(addReply);\n\n const api = Common.EditorApi.get();\n api.asc_changeComment(comment.uid, ascComment);\n }\n }\n }\n onEditReply (comment, reply, textReply) {\n const currentUser = this.props.users.currentUser;\n const indReply = reply.ind;\n const changeComment = {...comment};\n changeComment.replies = [...comment.replies];\n changeComment.replies[indReply] = {...reply};\n changeComment.replies[indReply].reply = textReply;\n changeComment.replies[indReply].userid = currentUser.asc_getIdOriginal();\n changeComment.replies[indReply].username = currentUser.asc_getUserName();\n this.onChangeComment(changeComment);\n }\n render() {\n const storeComments = this.props.storeComments;\n const comment = storeComments.currentComment;\n return (\n \n {storeComments.isOpenEditComment && }\n {storeComments.isOpenAddReply && }\n {storeComments.isOpenEditReply && }\n \n )\n }\n}\n\nclass ViewCommentsController extends Component {\n constructor (props) {\n super(props);\n this.onCommentMenuClick = this.onCommentMenuClick.bind(this);\n this.onResolveComment = this.onResolveComment.bind(this);\n this.closeViewCurComments = this.closeViewCurComments.bind(this);\n\n this.state = {\n isOpenViewCurComments: false\n };\n\n Common.Notifications.on('viewcomment', () => {\n this.setState({isOpenViewCurComments: true});\n });\n Common.Notifications.on('closeviewcomment', () => {\n this.closeViewCurComments();\n });\n }\n closeViewCurComments () {\n if (Device.phone) {\n f7.sheet.close('#view-comment-sheet');\n } else {\n f7.popover.close('#view-comment-popover');\n }\n this.setState({isOpenViewCurComments: false});\n }\n onResolveComment (comment) {\n let reply = null,\n addReply = null,\n ascComment = (typeof Asc.asc_CCommentDataWord !== 'undefined' ? new Asc.asc_CCommentDataWord(null) : new Asc.asc_CCommentData(null));\n\n if (ascComment && comment) {\n ascComment.asc_putText(comment.comment);\n ascComment.asc_putQuoteText(comment.quote);\n ascComment.asc_putTime(utcDateToString(new Date(comment.time)));\n ascComment.asc_putOnlyOfficeTime(ooDateToString(new Date(comment.time)));\n ascComment.asc_putUserId(comment.userId);\n ascComment.asc_putUserName(comment.userName);\n ascComment.asc_putSolved(!comment.resolved);\n ascComment.asc_putGuid(comment.guid);\n\n if (!!ascComment.asc_putDocumentFlag) {\n ascComment.asc_putDocumentFlag(comment.unattached);\n }\n\n reply = comment.replies;\n if (reply && reply.length > 0) {\n reply.forEach((reply) => {\n addReply = (typeof Asc.asc_CCommentDataWord !== 'undefined' ? new Asc.asc_CCommentDataWord(null) : new Asc.asc_CCommentData(null));\n if (addReply) {\n addReply.asc_putText(reply.reply);\n addReply.asc_putTime(utcDateToString(new Date(reply.time)));\n addReply.asc_putOnlyOfficeTime(ooDateToString(new Date(reply.time)));\n addReply.asc_putUserId(reply.userId);\n addReply.asc_putUserName(reply.userName);\n\n ascComment.asc_addReply(addReply);\n }\n });\n }\n const api = Common.EditorApi.get();\n api.asc_showComments(this.props.storeApplicationSettings.isResolvedComments);\n api.asc_changeComment(comment.uid, ascComment);\n\n if(!this.props.storeApplicationSettings.isResolvedComments) {\n this.closeViewCurComments();\n }\n }\n }\n deleteComment (comment) {\n const api = Common.EditorApi.get();\n comment && api.asc_removeComment(comment.uid);\n }\n deleteReply (comment, reply) {\n let replies = null,\n addReply = null,\n ascComment = (!!Asc.asc_CCommentDataWord ? new Asc.asc_CCommentDataWord(null) : new Asc.asc_CCommentData(null));\n\n const indReply = reply.ind;\n\n if (ascComment && comment) {\n ascComment.asc_putText(comment.comment);\n ascComment.asc_putQuoteText(comment.quote);\n ascComment.asc_putTime(utcDateToString(new Date(comment.time)));\n ascComment.asc_putOnlyOfficeTime(ooDateToString(new Date(comment.time)));\n ascComment.asc_putUserId(comment.userId);\n ascComment.asc_putUserName(comment.userName);\n ascComment.asc_putSolved(comment.resolved);\n ascComment.asc_putGuid(comment.guid);\n\n if (!!ascComment.asc_putDocumentFlag) {\n ascComment.asc_putDocumentFlag(comment.unattached);\n }\n\n replies = comment.replies;\n if (replies && replies.length) {\n replies.forEach((reply) => {\n if (reply.ind !== indReply) {\n addReply = (!!Asc.asc_CCommentDataWord ? new Asc.asc_CCommentDataWord(null) : new Asc.asc_CCommentData(null));\n if (addReply) {\n addReply.asc_putText(reply.reply);\n addReply.asc_putTime(utcDateToString(new Date(reply.time)));\n addReply.asc_putOnlyOfficeTime(ooDateToString(new Date(reply.time)));\n addReply.asc_putUserId(reply.userId);\n addReply.asc_putUserName(reply.userName);\n\n ascComment.asc_addReply(addReply);\n }\n }\n });\n }\n const api = Common.EditorApi.get();\n api.asc_changeComment(comment.uid, ascComment);\n }\n }\n onCommentMenuClick (action, comment, reply) {\n const { t } = this.props;\n const _t = t(\"Common.Collaboration\", { returnObjects: true });\n switch (action) {\n case 'editComment':\n this.props.storeComments.openEditComment(true, comment);\n break;\n case 'resolve':\n this.onResolveComment(comment);\n break;\n case 'deleteComment':\n f7.dialog.create({\n title: _t.textDeleteComment,\n text: _t.textMessageDeleteComment,\n buttons: [\n {\n text: _t.textCancel\n },\n {\n text: _t.textOk,\n onClick: () => this.deleteComment(comment)\n }\n ]\n }).open();\n break;\n case 'editReply':\n this.props.storeComments.openEditReply(true, comment, reply);\n break;\n case 'deleteReply':\n f7.dialog.create({\n title: _t.textDeleteReply,\n text: _t.textMessageDeleteReply,\n buttons: [\n {\n text: _t.textCancel\n },\n {\n text: _t.textOk,\n onClick: () => this.deleteReply(comment, reply)\n }\n ]\n }).open();\n break;\n case 'addReply':\n this.props.storeComments.openAddReply(true, comment);\n break;\n }\n }\n\n showComment (comment) {\n const api = Common.EditorApi.get();\n\n api.asc_selectComment(comment.uid); \n api.asc_showComment(comment.uid, false);\n }\n\n\n render() {\n return(\n \n {this.props.allComments && }\n {this.state.isOpenViewCurComments && }\n \n )\n }\n}\n\nclass ViewCommentsSheetsController extends ViewCommentsController {\n constructor(props) {\n super(props);\n }\n}\n\nconst _CommentsController = inject('storeAppOptions', 'storeComments', 'users', \"storeApplicationSettings\")(observer(CommentsController));\nconst _AddCommentController = inject('storeAppOptions', 'storeComments', 'users')(observer(AddCommentController));\nconst _EditCommentController = inject('storeComments', 'users')(observer(EditCommentController));\nconst _ViewCommentsController = inject('storeComments', 'users', \"storeApplicationSettings\", \"storeReview\", \"storeAppOptions\")(observer(withTranslation()(ViewCommentsController)));\nconst _ViewCommentsSheetsController = inject('storeComments', 'users', \"storeApplicationSettings\", \"storeWorksheets\", \"storeReview\", \"storeAppOptions\")(observer(withTranslation()(ViewCommentsSheetsController)));\n\nexport {\n _CommentsController as CommentsController,\n _AddCommentController as AddCommentController,\n _EditCommentController as EditCommentController,\n _ViewCommentsController as ViewCommentsController,\n _ViewCommentsSheetsController as ViewCommentsSheetsController\n};","import React from 'react';\nimport { observer, inject } from \"mobx-react\";\nimport { List, ListItem, Navbar, NavRight, Page, Icon, Link } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport { Device } from \"../../utils/device\";\n\nconst CollaborationPage = props => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const appOptions = props.storeAppOptions;\n const isForm = appOptions.isForm;\n const sharingSettingsUrl = appOptions.sharingSettingsUrl;\n const isViewer = appOptions.isViewer;\n\n return (\n \n \n {Device.phone &&\n \n \n \n \n \n }\n \n \n {(sharingSettingsUrl && !isForm) &&\n \n \n \n }\n {props.users.editUsers.length > 0 &&\n \n \n \n }\n {appOptions.canViewComments &&\n \n \n \n }\n {(window.editorType === 'de' && (appOptions.canReview || appOptions.canViewReview) && !isViewer) &&\n \n \n \n }\n
\n \n )\n};\n\nlet storeInfo;\n\nswitch (window.asceditor) {\n case 'word':\n storeInfo = 'storeDocumentInfo';\n break;\n case 'slide':\n storeInfo = 'storePresentationInfo';\n break;\n case 'cell':\n storeInfo = 'storeSpreadsheetInfo';\n break;\n}\n\nconst Collaboration = inject('storeAppOptions', 'users', storeInfo)(observer(CollaborationPage));\n\nexport { Collaboration as CollaborationPage };","import React, { useEffect, useRef } from 'react';\nimport { Navbar, Page } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport { Device } from '../../utils/device';\n\nconst frameStyle = {\n width: '100%',\n height: '100%',\n minHeight: 380\n}\n\nconst ViewSharingSettings = props => {\n const { t } = useTranslation();\n const sharingSettingsUrl = props.sharingSettingsUrl;\n const _t = t('Common.Collaboration', {returnObjects: true});\n const ref = useRef(null);\n\n useEffect(() => {\n const coauthSheetElem = ref.current.closest('.coauth__sheet');\n\n if(Device.phone) {\n coauthSheetElem.style.height = '100%';\n coauthSheetElem.style.maxHeight = '100%';\n }\n\n return () => {\n if(Device.phone) {\n coauthSheetElem.style.height = null;\n coauthSheetElem.style.maxHeight = '65%';\n }\n }\n }, []);\n\n return (\n \n \n \n \n
\n \n )\n};\n\nexport default ViewSharingSettings;","import React, {useEffect} from 'react';\nimport ViewSharingSettings from \"../view/SharingSettings\";\nimport {observer, inject} from \"mobx-react\";\n\nconst SharingSettingsController = props => {\n const appOptions = props.storeAppOptions;\n const canRequestSharingSettings = appOptions.canRequestSharingSettings;\n const sharingSettingsUrl = appOptions.sharingSettingsUrl;\n\n const changeAccessRights = () => {\n if (canRequestSharingSettings) {\n Common.Gateway.requestSharingSettings();\n }\n };\n\n const setSharingSettings = data => {\n if (data) {\n Common.Notifications.trigger('collaboration:sharingupdate', data.sharingSettings);\n }\n }\n\n const onMessage = msg => {\n if(msg) {\n const msgData = JSON.parse(msg.data);\n\n if (msgData && msgData?.Referer == \"onlyoffice\") {\n if (msgData?.needUpdate) {\n setSharingSettings(msgData.sharingSettings);\n }\n props.f7router.back();\n }\n }\n };\n\n const bindWindowEvents = () => {\n if (window.addEventListener) {\n window.addEventListener(\"message\", onMessage, false);\n } else if (window.attachEvent) {\n window.attachEvent(\"onmessage\", onMessage);\n }\n };\n\n const unbindWindowEvents = () => {\n if (window.removeEventListener) {\n window.removeEventListener(\"message\", onMessage);\n } else if (window.detachEvent) {\n window.detachEvent(\"onmessage\", onMessage);\n }\n };\n\n useEffect(() => {\n bindWindowEvents();\n Common.Notifications.on('collaboration:sharing', changeAccessRights);\n\n if (!!sharingSettingsUrl && sharingSettingsUrl.length || canRequestSharingSettings) {\n Common.Gateway.on('showsharingsettings', changeAccessRights);\n Common.Gateway.on('setsharingsettings', setSharingSettings);\n }\n\n return () => {\n unbindWindowEvents();\n }\n }, []);\n\n return (\n \n );\n};\n\nexport default inject('storeAppOptions')(observer(SharingSettingsController));","import React from 'react';\nimport { observer, inject } from \"mobx-react\";\nimport { List, ListItem, Navbar, NavRight, Page, Icon, Link } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport { Device } from \"../../utils/device\";\n\nconst UsersPage = inject(\"users\")(observer(props => {\n const { t } = useTranslation();\n const _t = t('Common.Collaboration', {returnObjects: true});\n const storeUsers = props.users;\n\n return (\n \n \n {Device.phone &&\n \n \n \n \n \n }\n \n \n {storeUsers.editUsers.map((user, i) => (\n 1 ? ` (${user.count})` : '')} key={i}>\n \n {user.initials}\n
\n \n ))}\n
\n \n )\n}));\n\nexport default UsersPage;","import React, { useEffect } from 'react';\nimport { Popover, Sheet, f7, View } from 'framework7-react';\nimport { Device } from \"../../../utils/device\";\nimport { ReviewController, ReviewChangeController } from \"../../controller/collaboration/Review\";\nimport { PageDisplayMode } from \"./Review\";\nimport { ViewCommentsController, ViewCommentsSheetsController } from \"../../controller/collaboration/Comments\";\nimport SharingSettingsController from \"../../controller/SharingSettings\";\nimport { CollaborationPage } from '../../pages/CollaborationPage';\nimport UsersPage from '../../pages/UsersPage';\n\nconst routes = [\n {\n path: '/collaboration-page/',\n component: CollaborationPage,\n keepAlive: true\n },\n {\n path: '/users/',\n component: UsersPage\n },\n {\n path: '/review/',\n component: ReviewController\n },\n {\n path: '/cm-review/',\n component: ReviewController,\n options: {\n props: {\n noBack: true\n }\n }\n },\n {\n path: '/display-mode/',\n component: PageDisplayMode\n },\n {\n path: '/review-change/',\n component: ReviewChangeController\n },\n {\n path: '/cm-review-change/',\n component: ReviewChangeController,\n options: {\n props: {\n noBack: true\n }\n }\n },\n {\n path: '/comments/',\n asyncComponent: () => window.editorType == 'sse' ? ViewCommentsSheetsController : ViewCommentsController,\n options: {\n props: {\n allComments: true\n }\n }\n },\n {\n path: '/sharing-settings/',\n component: SharingSettingsController\n }\n];\n\nroutes.forEach(route => {\n route.options = {\n ...route.options,\n transition: 'f7-push'\n };\n});\n\nconst CollaborationView = props => {\n useEffect(() => {\n if(Device.phone) {\n f7.sheet.open('.coauth__sheet');\n } else {\n f7.popover.open('#coauth-popover', '#btn-coauth');\n }\n }, []);\n\n return (\n !Device.phone ?\n props.closeOptions('coauth')} closeByOutsideClick={false}>\n \n \n \n :\n props.closeOptions('coauth')}>\n \n \n \n \n )\n}\n\nexport default CollaborationView;\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}","\nimport React, { Fragment, useState, useEffect } from 'react';\nimport { Input, View, Button, Link, Popover, ListItem, List, Icon, f7, Page, Navbar, NavRight } from 'framework7-react';\nimport {observer, inject} from \"mobx-react\";\n// import { __interactionsRef } from 'scheduler/tracing';\nimport { Device } from '../../../../common/mobile/utils/device';\nimport { useTranslation } from 'react-i18next';\n\nconst viewStyle = {\n height: 30\n};\n\nconst contentStyle = {\n flexGrow: 1\n};\n\nconst CellEditorView = props => {\n const [expanded, setExpanded] = useState(false);\n const isPhone = Device.isPhone;\n const storeAppOptions = props.storeAppOptions;\n const storeFunctions = props.storeFunctions;\n const storeWorksheets = props.storeWorksheets;\n const wsLock = storeWorksheets.wsLock;\n const {functionsDisable} = props.storeFocusObjects;\n const functions = storeFunctions.functions;\n const isEdit = storeAppOptions.isEdit;\n const funcArr = props.funcArr;\n const hintArr = props.hintArr;\n\n const expandClick = e => {\n setExpanded(!expanded);\n };\n\n return (\n <>\n \n \n \n \n \n
\n \n {\n \n {funcArr && funcArr.length ?\n \n \n \n \n \n \n : null}\n \n }\n >\n );\n};\n\nconst FunctionsList = props => {\n const isPhone = Device.isPhone;\n const functions = props.functions;\n const funcArr = props.funcArr;\n const hintArr = props.hintArr;\n const functionsList = document.querySelector('#functions-list');\n\n useEffect(() => {\n if(functionsList) {\n const height = functionsList.offsetHeight + 'px';\n functionsList.closest('.view').style.height = height;\n }\n }, [funcArr]);\n\n return (\n \n
\n {funcArr && funcArr.length && funcArr.map((elem, index) => {\n return (\n props.insertFormula(elem.name, elem.type)}>\n {(functions[elem.name] || hintArr[index]?.descr) &&\n {\n e.stopPropagation();\n let functionInfo = functions[elem.name] || hintArr[index];\n\n if(functionInfo) {\n f7.views.current.router.navigate('/function-info/', {props: {functionInfo, functionObj: elem, insertFormula: props.insertFormula}});\n }\n }}>\n \n
\n }\n \n )\n })}\n
\n
\n )\n}\n\nconst FunctionInfo = props => {\n const { t } = useTranslation();\n const _t = t('View.Add', {returnObjects: true});\n const functionObj = props.functionObj;\n const functionInfo = props.functionInfo;\n const functionsList = document.querySelector('#functions-list');\n\n useEffect(() => {\n if(functionsList) {\n const height = functionsList.offsetHeight + 'px';\n functionsList.closest('.view').style.height = '200px';\n\n return () => {\n functionsList.closest('.view').style.height = height;\n }\n }\n }, [functionsList]);\n\n return (\n \n \n \n props.insertFormula(functionObj.name, functionObj.type)}>\n \n \n \n
{functionInfo.caption && functionInfo.args ? `${functionInfo.caption} ${functionInfo.args}` : functionInfo.name}
\n
{functionInfo.descr}
\n
\n \n )\n}\n\nconst routes = [\n {\n path: '/function-info/',\n component: FunctionInfo\n },\n {\n path: '/functions-list/',\n component: FunctionsList\n }\n];\n\n\nexport default inject(\"storeAppOptions\", \"storeFunctions\", \"storeFocusObjects\", \"storeWorksheets\")(observer(CellEditorView));\n","import React, { useEffect, useState } from 'react';\nimport CellEditorView from '../view/CellEditor';\nimport { f7 } from 'framework7-react';\nimport { Device } from '../../../../common/mobile/utils/device';\nimport { useTranslation } from 'react-i18next';\nimport {observer, inject} from \"mobx-react\";\n\nconst CellEditor = inject(\"storeFunctions\")(observer(props => {\n useEffect(() => {\n Common.Notifications.on('engineCreated', api => {\n api.asc_registerCallback('asc_onSelectionNameChanged', onApiCellSelection.bind(this));\n api.asc_registerCallback('asc_onSelectionChanged', onApiSelectionChanged.bind(this));\n api.asc_registerCallback('asc_onFormulaCompleteMenu', onFormulaCompleteMenu.bind(this));\n });\n }, []);\n\n const { t } = useTranslation();\n const [cellName, setCellName] = useState('');\n const [stateFunctions, setFunctionshDisabled] = useState(null);\n const [stateFuncArr, setFuncArr] = useState('');\n const [stateHintArr, setHintArr] = useState('');\n\n const onApiCellSelection = info => {\n setCellName(typeof(info)=='string' ? info : info.asc_getName());\n };\n\n const onApiSelectionChanged = info => {\n let seltype = info.asc_getSelectionType(),\n coauth_disable = info.asc_getLocked() === true || info.asc_getLockedTable() === true || info.asc_getLockedPivotTable()===true;\n\n let is_chart_text = seltype == Asc.c_oAscSelectionType.RangeChartText,\n is_chart = seltype == Asc.c_oAscSelectionType.RangeChart,\n is_shape_text = seltype == Asc.c_oAscSelectionType.RangeShapeText,\n is_shape = seltype == Asc.c_oAscSelectionType.RangeShape,\n is_image = seltype == Asc.c_oAscSelectionType.RangeImage || seltype == Asc.c_oAscSelectionType.RangeSlicer,\n is_mode_2 = is_shape_text || is_shape || is_chart_text || is_chart;\n\n setFunctionshDisabled(is_image || is_mode_2 || coauth_disable);\n }\n\n const onFormulaCompleteMenu = async funcArr => {\n const api = Common.EditorApi.get();\n const storeFunctions = props.storeFunctions;\n const functions = storeFunctions.functions;\n\n if(funcArr) {\n funcArr.sort(function (a, b) {\n let atype = a.asc_getType(),\n btype = b.asc_getType();\n if (atype===btype && (atype === Asc.c_oAscPopUpSelectorType.TableColumnName))\n return 0;\n if (atype === Asc.c_oAscPopUpSelectorType.TableThisRow) return -1;\n if (btype === Asc.c_oAscPopUpSelectorType.TableThisRow) return 1;\n if ((atype === Asc.c_oAscPopUpSelectorType.TableColumnName || btype === Asc.c_oAscPopUpSelectorType.TableColumnName) && atype !== btype)\n return atype === Asc.c_oAscPopUpSelectorType.TableColumnName ? -1 : 1;\n let aname = a.asc_getName(true).toLocaleUpperCase(),\n bname = b.asc_getName(true).toLocaleUpperCase();\n if (aname < bname) return -1;\n if (aname > bname) return 1;\n \n return 0;\n });\n \n let hintArr = funcArr.map(item => {\n let type = item.asc_getType(),\n name = item.asc_getName(true),\n origName = api.asc_getFormulaNameByLocale(name),\n args = '',\n caption = name,\n descr = '';\n\n switch (type) {\n case Asc.c_oAscPopUpSelectorType.Func:\n if (functions && functions[origName] && functions[origName].descr)\n descr = functions[origName].descr;\n else {\n let custom = api.asc_getCustomFunctionInfo(origName);\n descr = custom ? custom.asc_getDescription() || '' : '';\n }\n if (functions && functions[origName] && functions[origName].args)\n args = functions[origName].args;\n else {\n let custom = api.asc_getCustomFunctionInfo(origName);\n if (custom) {\n let arr_args = custom.asc_getArg() || [];\n args = '(' + arr_args.map(function (item) { return item.asc_getIsOptional() ? '[' + item.asc_getName() + ']' : item.asc_getName(); }).join(api.asc_getFunctionArgumentSeparator() + ' ') + ')';\n }\n }\n break;\n case Asc.c_oAscPopUpSelectorType.TableThisRow:\n descr = t('View.Add.textThisRowHint');\n break;\n case Asc.c_oAscPopUpSelectorType.TableAll:\n descr = t('View.Add.textAllTableHint');\n break;\n case Asc.c_oAscPopUpSelectorType.TableData:\n descr = t('View.Add.textDataTableHint');\n break;\n case Asc.c_oAscPopUpSelectorType.TableHeaders:\n descr = t('View.Add.textHeadersTableHint');\n break;\n case Asc.c_oAscPopUpSelectorType.TableTotals:\n descr = t('View.Add.textTotalsTableHint');\n break;\n }\n\n return {name, type, descr, caption, args};\n });\n\n await setFuncArr(funcArr);\n await setHintArr(hintArr);\n\n await f7.popover.open('#idx-functions-list', '#idx-list-target');\n } else {\n await f7.popover.close('#idx-functions-list');\n await setFuncArr('');\n await setHintArr('');\n }\n }\n\n const insertFormula = (name, type) => {\n const api = Common.EditorApi.get();\n api.asc_insertInCell(name, type, false);\n f7.popover.close('#idx-functions-list');\n }\n \n return (\n \n )\n}));\n\nexport default CellEditor;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle, useContext } from 'react';\nimport { classNames, getExtraAttrs } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { ListContext } from '../shared/list-context.js';\n\n\nconst ListGroup = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n simpleList,\n mediaList,\n sortable,\n sortableOpposite,\n sortableTapHold,\n sortableMoveElements\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const listContext = useContext(ListContext);\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n const classes = classNames(className, 'list-group', {\n 'media-list': mediaList,\n sortable,\n 'sortable-tap-hold': sortableTapHold,\n 'sortable-opposite': sortableOpposite\n }, colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n \"data-sortable-move-elements\": typeof sortableMoveElements !== 'undefined' ? sortableMoveElements.toString() : undefined,\n ref: elRef\n }, extraAttrs), /*#__PURE__*/React.createElement(\"ul\", null, /*#__PURE__*/React.createElement(ListContext.Provider, {\n value: {\n listIsMedia: mediaList || listContext.listIsMedia,\n listIsSimple: simpleList || listContext.listIsSimple,\n listIsSortable: sortable || listContext.listIsSortable,\n listIsSortableOpposite: sortableOpposite || listContext.listIsSortableOpposite\n }\n }, children)));\n});\nListGroup.displayName = 'f7-list-group';\nexport default ListGroup;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { classNames, getExtraAttrs, isStringProp, emit } from '../shared/utils.js';\nimport { colorClasses, actionsAttrs, actionsClasses, routerAttrs, routerClasses } from '../shared/mixins.js';\nimport { useTooltip } from '../shared/use-tooltip.js';\nimport { useRouteProps } from '../shared/use-route-props.js';\n\n\nconst ListButton = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n title,\n text,\n tabLink,\n tabLinkActive,\n link,\n href,\n target\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const linkElRef = useRef(null);\n const onClick = e => {\n emit(props, 'click', e);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n useTooltip(linkElRef, props);\n useRouteProps(linkElRef, props);\n const linkAttrs = {\n href: typeof link === 'boolean' && typeof href === 'boolean' ? '#' : link || href,\n target,\n 'data-tab': isStringProp(tabLink) && tabLink,\n ...routerAttrs(props),\n ...actionsAttrs(props)\n };\n const linkClasses = classNames({\n 'list-button': true,\n 'tab-link': tabLink || tabLink === '',\n 'tab-link-active': tabLinkActive,\n ...colorClasses(props),\n ...routerClasses(props),\n ...actionsClasses(props)\n });\n return /*#__PURE__*/React.createElement(\"li\", _extends({\n id: id,\n style: style,\n className: className,\n ref: elRef\n }, extraAttrs), /*#__PURE__*/React.createElement(\"a\", _extends({\n className: linkClasses\n }, linkAttrs, {\n onClick: onClick,\n ref: linkElRef\n }), title, text, children));\n});\nListButton.displayName = 'f7-list-button';\nexport default ListButton;","import React, { useState, useEffect } from 'react';\nimport { f7, ListItem, List, Icon } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport { LocalStorage } from '../../utils/LocalStorage.mjs';\n\nconst ThemeColors = ({ themeColors, onColorClick, curColor, isTypeColors, isTypeCustomColors }) => {\n return (\n \n {themeColors?.length && themeColors.map((row, rowIndex) => {\n return(\n
\n )\n })}\n
\n )\n};\n\nconst StandartColors = ({ options, standartColors, onColorClick, curColor }) => {\n return (\n \n )\n};\n\nconst CustomColors = ({ options, customColors, isTypeColors, onColorClick, curColor }) => {\n const colors = customColors.length > 0 ? customColors : [];\n const emptyItems = [];\n\n if (colors.length < options.customcolors) {\n for (let i = colors.length; i < options.customcolors; i++) {\n emptyItems.push( {onColorClick('empty')}}\n >)\n }\n }\n\n let indexCurColor = colors.indexOf(curColor);\n \n return (\n \n {colors && colors.length > 0 ? colors.map((color, index) => {\n return (\n
{onColorClick(color)}}\n >\n )\n }) : null}\n {emptyItems.length > 0 && emptyItems}\n
\n )\n};\n\nconst ThemeColorPalette = props => {\n const {t} = useTranslation();\n const _t = t('Common.ThemeColorPalette', {returnObjects: true});\n const options = {\n customcolors: props.customcolors || 10,\n standardcolors: props.standardcolors || 10,\n themecolors: props.themecolors || 10,\n effects: props.effects || 5,\n //allowReselect: props.allowReselect !== false,\n transparent: props.transparent || false,\n value: props.value || '000000',\n cls: props.cls || ''\n };\n const curColor = props.curColor;\n const themeColors = [];\n const effectColors = Common.Utils.ThemeColor.getEffectColors();\n let row = -1;\n\n if(effectColors?.length) {\n effectColors.forEach((effect, index) => {\n if (0 == index % options.themecolors) {\n themeColors.push([]);\n row++;\n }\n themeColors[row].push(effect);\n });\n }\n\n const standartColors = Common.Utils.ThemeColor.getStandartColors();\n let isTypeColors = standartColors?.length && standartColors.some( value => value === curColor );\n // custom color\n let customColors = props.customColors;\n\n if (customColors.length < 1) {\n customColors = LocalStorage.getItem('mobile-custom-colors');\n customColors = customColors ? customColors.toLowerCase().split(',') : [];\n }\n\n let isTypeCustomColors = customColors.some( value => value === curColor );\n\n return (\n \n
\n \n { _t.textThemeColors }
\n \n \n \n { _t.textStandartColors }
\n \n \n \n { _t.textCustomColors }
\n \n \n
\n
\n )\n};\n\nconst CustomColorPicker = props => {\n //Function to convert rgb color to hex format\n const hexDigits = new Array(\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"a\",\"b\",\"c\",\"d\",\"e\",\"f\");\n const hex = x => {\n return isNaN(x) ? \"00\" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];\n };\n const rgb2hex = rgb => {\n rgb = rgb.match(/^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/);\n return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);\n };\n\n let currentColor = props.currentColor;\n\n if (props.autoColor) {\n currentColor = rgb2hex(props.autoColor);\n }\n\n if (currentColor === 'transparent' || !currentColor) {\n currentColor = 'ffffff';\n }\n\n const countDynamicColors = props.countdynamiccolors || 10;\n const [stateColor, setColor] = useState(`#${currentColor}`);\n\n useEffect(() => {\n if (document.getElementsByClassName('color-picker-wheel').length < 1) {\n const colorPicker = f7.colorPicker.create({\n containerEl: document.getElementsByClassName('color-picker-container')[0],\n value: {\n hex: `#${currentColor}`\n },\n on: {\n change: function (value) {\n setColor(value.getValue().hex);\n }\n }\n });\n }\n });\n\n const addNewColor = (color) => {\n let colors = LocalStorage.getItem('mobile-custom-colors');\n colors = colors ? colors.split(',') : [];\n const newColor = color.slice(1);\n if (colors.push(newColor) > countDynamicColors) colors.shift(); // 10 - dynamiccolors\n LocalStorage.setItem('mobile-custom-colors', colors.join().toLowerCase());\n props.onAddNewColor && props.onAddNewColor(colors, newColor);\n };\n\n return (\n \n )\n};\n\nexport { ThemeColorPalette, CustomColorPicker };","import React, { Fragment, useEffect, useState } from 'react';\nimport {f7, View, Link, Icon, Popover, Navbar, NavRight, List, ListGroup, ListItem, ListButton, Actions, ActionsGroup, ActionsButton, Sheet, Page } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport { Device } from '../../../../common/mobile/utils/device';\nimport { inject, observer } from 'mobx-react';\nimport { ThemeColorPalette, CustomColorPicker } from '../../../../common/mobile/lib/component/ThemeColorPalette.jsx';\n\nconst viewStyle = {\n height: 30\n};\n\nconst PageListMove = props => {\n const { t } = useTranslation();\n const { sheets, onMenuMoveClick } = props;\n const allSheets = sheets.sheets;\n\n return (\n \n \n \n \n \n { allSheets.map((model, index) => \n model.hidden ? null : \n onMenuMoveClick(index)} />)\n }\n onMenuMoveClick(-255)}/>\n \n
\n \n \n )\n};\n\nconst PageAllList = observer((props) => {\n const { t } = useTranslation();\n const { sheets, onTabListClick } = props;\n const allSheets = sheets.sheets;\n const heightView = Device.android ? allSheets.length * 48 : allSheets.length * 44;\n\n useEffect(() => {\n const tabs = $$('.sheet-tabs .tab');\n let tab = tabs.eq(sheets.activeWorksheet);\n\n if(sheets.activeWorksheet !== -1) {\n if(tab.length === 0) {\n tab = tabs.eq(tabs.length - 1);\n $$('.sheet-tabs').scrollLeft( tab.offset().left + tab.width(), 500);\n } else if(tab.offset().left < 0) {\n $$('.sheet-tabs').scrollLeft( $$('.sheet-tabs').scrollLeft() + tab.offset().left - 96, 500);\n } else {\n $$('.sheet-tabs').scrollLeft( $$('.sheet-tabs').scrollLeft() + (tab.offset().left + tab.width() - $$('.sheet-tabs').width()), 500);\n }\n }\n }, [sheets.activeWorksheet]);\n\n return (\n 240 ? '240px' : `${heightView}px`}}>\n \n \n {allSheets.map((model, sheetIndex) =>\n onTabListClick(sheetIndex)}>\n \n {model.hidden ? \n t('Statusbar.textHidden')\n :\n
\n }\n
\n \n )}\n
\n \n \n )\n});\n\nconst PageCustomTabColor = inject(\"storePalette\")(observer (props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n\n const onAddNewColor = (colors, color) => {\n props.storePalette.changeCustomColors(colors);\n props.onSetWorkSheetColor(color);\n props.sheets.changeTabColor(color);\n props.f7router.back();\n };\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n \n )\n}));\n\nconst PageTabColor = inject(\"storePalette\")(observer(props => {\n const { t } = useTranslation();\n const {sheets, allSheets = sheets.sheets} = props;\n const storePalette = props.storePalette;\n const customColors = storePalette.customColors;\n const activeIndex = sheets.activeWorksheet;\n\n useEffect(() => {\n if (allSheets.length !== 0) {\n let color = sheets.at(activeIndex).color;\n if(color !== null) {\n sheets.changeTabColor('' + Common.Utils.ThemeColor.getHexColor(color.get_r(), color.get_g(), color.get_b()));\n } else {\n sheets.changeTabColor('transparent');\n }\n }\n }, [activeIndex]);\n\n const changeColor = (color, effectId, effectValue) => {\n if (color !== 'empty') {\n if (effectId !== undefined ) {\n sheets.changeTabColor(color);\n props.onSetWorkSheetColor(color);\n } else {\n sheets.changeTabColor(color);\n props.onSetWorkSheetColor(color);\n }\n \n Device.isPhone ? f7.sheet.close('.tab-color-sheet') : f7.popover.close('#idx-tab-color-popover');\n\n } else {\n f7.views.tabColorView.router.navigate('/sheet-tab-custom-color/', {props:{onSetWorkSheetColor: props.onSetWorkSheetColor, sheets}});\n }\n };\n\n return (\n \n \n {Device.phone &&\n \n \n \n \n \n }\n \n\n { allSheets.length !== 0 && \n }\n \n \n
\n \n )\n}));\n\nconst PopoverAllList = (props) => {\n const {sheets, onTabListClick} = props;\n\n const onScrollList = () => {\n const listHeight = $$('.list .item-list').height();\n $$('.all-list .page-content').scrollTop(listHeight*sheets.activeWorksheet);\n };\n\n return (\n \n \n \n )\n};\n\nconst StatusbarView = inject('storeAppOptions', 'storeWorksheets', 'users')(observer(props => {\n const { t } = useTranslation();\n const _t = t('Statusbar', {returnObjects: true});\n const isAndroid = Device.android;\n const isPhone = Device.isPhone;\n const {storeWorksheets, storeAppOptions, users} = props;\n const allSheets = storeWorksheets.sheets;\n const hiddenSheets = storeWorksheets.hiddenWorksheets();\n const isWorkbookLocked = storeWorksheets.isWorkbookLocked;\n const isProtectedWorkbook = storeWorksheets.isProtectedWorkbook;\n const isEdit = storeAppOptions.isEdit;\n const isDisconnected = users.isDisconnected;\n const isDisabledEditSheet = storeWorksheets.isDisabledEditSheet;\n\n const setSheetColor = sheet => {\n if(sheet) {\n let color;\n\n if (sheet.color) {\n color = '#' + Common.Utils.ThemeColor.getHexColor(sheet.color.get_r(), sheet.color.get_g(), sheet.color.get_b());\n } else {\n color = '';\n }\n\n if(color) {\n if(!sheet.active) {\n color = '0px 3px 0 ' + Common.Utils.RGBColor(color).toRGBA(0.7) + ' inset';\n } else {\n color = '0px 3px 0 ' + color + ' inset';\n }\n }\n\n return color;\n }\n };\n\n return (\n \n \n {isEdit &&\n \n \n \n \n f7.popover.open('#idx-all-list', e.target)}>\n \n \n
\n }\n \n
\n {allSheets.map((model, i) => \n model.hidden ? null : \n - props.onTabClick(i, e.target)}>\n {model.name}\n
\n \n )}\n
\n
\n \n {isEdit ? \n \n : null}\n {isPhone || isAndroid ? (\n \n ) : null}\n {\n \n }\n {isPhone ? \n \n \n \n
\n \n \n :\n \n \n \n }\n { isPhone ?\n \n {\n f7.navbar.show('.main-navbar');\n $$('.statusbar').css('top', '0%');\n }}>\n \n \n \n \n : \n \n \n \n \n \n }\n {hiddenSheets.length ? (\n \n \n {hiddenSheets.map(sheet => {\n return (\n props.onTabMenu(`reveal:${sheet.index}`)} />\n )\n })}\n
\n \n ) : null}\n \n )\n}));\n\nconst routes = [\n {\n path: '/sheet-tab-custom-color/',\n component: PageCustomTabColor\n },\n];\n\nexport {StatusbarView};\n","\nimport React, { Fragment, useEffect, useRef, useState } from 'react';\nimport {StatusbarView} from '../view/Statusbar';\nimport { inject, observer } from 'mobx-react';\nimport { f7 } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport { Device } from '../../../../common/mobile/utils/device';\n\nconst StatusbarController = inject('storeWorksheets', 'storeFocusObjects', 'users')(observer(props => {\n const {storeWorksheets, storeFocusObjects, users} = props;\n \n useEffect(() => {\n Common.Notifications.on('engineCreated', api => {\n api.asc_registerCallback('asc_onWorkbookLocked', (locked) => {\n storeWorksheets.setWorkbookLocked(locked);\n storeFocusObjects.setIsLocked(api.asc_getCellInfo());\n });\n api.asc_registerCallback('asc_onWorksheetLocked', (index, locked) => {\n storeWorksheets.setWorksheetLocked(index, locked);\n storeFocusObjects.setIsLocked(api.asc_getCellInfo());\n });\n api.asc_registerCallback('asc_onChangeProtectWorkbook', () => {\n storeWorksheets.setProtectedWorkbook(api.asc_isProtectedWorkbook());\n });\n api.asc_registerCallback('asc_onEditCell', onApiEditCell);\n api.asc_registerCallback('asc_onSheetsChanged', onApiSheetsChanged);\n api.asc_registerCallback('asc_onActiveSheetChanged', onApiActiveSheetChanged);\n api.asc_registerCallback('asc_onHidePopMenu', onApiHideTabContextMenu);\n api.asc_registerCallback('asc_onUpdateTabColor', onApiUpdateTabColor);\n api.asc_registerCallback('asc_onCoAuthoringDisconnect', onApiDisconnect);\n });\n Common.Notifications.on('document:ready', onApiSheetsChanged);\n Common.Notifications.on('api:disconnect', onApiDisconnect);\n });\n\n const onApiEditCell = state => {\n let isDisable = state !== Asc.c_oAscCellEditorState.editEnd;\n storeWorksheets.setDisabledEditSheet(isDisable);\n }\n\n const onApiDisconnect = () => {\n users.resetDisconnected(true);\n }\n\n const onApiSheetsChanged = () => {\n const api = Common.EditorApi.get();\n const sheets_count = api.asc_getWorksheetsCount();\n const active_index = api.asc_getActiveWorksheetIndex();\n\n let i = -1, items = [];\n\n while (++i < sheets_count) {\n const tab = {\n index : i,\n active : active_index == i,\n name : api.asc_getWorksheetName(i),\n locked : api.asc_isWorksheetLockedOrDeleted(i),\n hidden : api.asc_isWorksheetHidden(i),\n color : api.asc_getWorksheetTabColor(i)\n };\n\n items.push(tab);\n }\n\n storeWorksheets.resetSheets(items);\n };\n\n const onApiActiveSheetChanged = (index) => {\n if (index < storeWorksheets.sheets.length) {\n storeWorksheets.setActiveWorksheet(index);\n Common.Notifications.trigger('sheet:active', index);\n }\n };\n\n const onApiHideTabContextMenu = () => {\n f7.popover.close('.document-menu.modal-in', false);\n }\n\n const onApiUpdateTabColor = sheetindex => {\n const api = Common.EditorApi.get();\n let tab = storeWorksheets.sheets.find(sheet => sheet.index === sheetindex);\n\n if (tab) {\n setTabLineColor(tab, api.asc_getWorksheetTabColor(sheetindex));\n }\n };\n\n const setTabLineColor = (tab, color) => {\n if (tab) {\n if (null !== color) {\n color = '#' + Common.Utils.ThemeColor.getHexColor(color.get_r(), color.get_g(), color.get_b());\n } else {\n color = '';\n }\n\n if (color.length) {\n if (!tab.active) {\n color = '0px 3px 0 ' + Common.Utils.RGBColor(color).toRGBA(0.7) + ' inset';\n } else {\n color = '0px 3px 0 ' + color + ' inset';\n }\n $$(`.sheet-tabs .tab a.tab-color-${tab.index}`).css('box-shadow', color);\n } else {\n $$(`.sheet-tabs .tab a.tab-color-${tab.index}`).css('box-shadow', '');\n }\n }\n };\n\n return null;\n}));\n\nconst Statusbar = inject('storeWorksheets', 'storeAppOptions', 'users')(observer(props => {\n const {storeWorksheets, storeAppOptions, users} = props;\n const {t} = useTranslation();\n const _t = t('Statusbar', {returnObjects: true});\n const isEdit = storeAppOptions.isEdit;\n const isDisconnected = users.isDisconnected;\n const isProtectedWorkbook = storeWorksheets.isProtectedWorkbook;\n const isDisabledEditSheet = storeWorksheets.isDisabledEditSheet;\n const targetRef = useRef();\n\n useEffect(() => {\n const on_main_view_click = e => {\n if(!e.target.closest('.tab.active')) {\n f7.popover.close('.document-menu.modal-in', false);\n }\n };\n $$('.view-main').on('click', on_main_view_click);\n return () => {\n $$('.view-main').off('click', on_main_view_click);\n };\n }, []);\n\n const onTabClicked = i => {\n const model = storeWorksheets.at(i);\n const api = Common.EditorApi.get();\n\n api.asc_showWorksheet(model.index);\n storeWorksheets.setActiveWorksheet(i);\n\n Common.Notifications.trigger('sheet:active', model.index);\n };\n\n const createSheetName = () => {\n const api = Common.EditorApi.get();\n\n let items = [], wc = api.asc_getWorksheetsCount();\n while (wc--) {\n items.push(api.asc_getWorksheetName(wc).toLowerCase());\n }\n\n let index = 0, name;\n while(++index < 1000) {\n name = _t.textSheet + index;\n if (items.indexOf(name.toLowerCase()) < 0) break;\n }\n\n return name;\n };\n\n const onAddTabClicked = () => {\n const api = Common.EditorApi.get();\n api.asc_closeCellEditor();\n api.asc_addWorksheet(createSheetName());\n };\n\n const onTabClick = (i, target) => {\n const api = Common.EditorApi.get();\n const model = storeWorksheets.at(i);\n targetRef.current = target;\n\n let opened = $$('.document-menu.modal-in').length;\n let index = model.index;\n\n f7.popover.close('.document-menu.modal-in', false);\n\n if (index == api.asc_getActiveWorksheetIndex()) {\n if (!opened) {\n if (isEdit && !isDisconnected && !model.locked && !isProtectedWorkbook && !isDisabledEditSheet) {\n api.asc_closeCellEditor();\n f7.popover.open('#idx-tab-context-menu-popover', target);\n }\n }\n } \n else {\n f7.popover.close('#idx-tab-context-menu-popover', false);\n onTabClicked(i);\n }\n };\n\n const deleteWorksheet = () => {\n const api = Common.EditorApi.get();\n const visibleSheets = storeWorksheets.visibleWorksheets();\n\n if (storeWorksheets.sheets.length == 1 || visibleSheets.length == 1) {\n f7.dialog.alert(_t.textErrorLastSheet, _t.notcriticalErrorTitle);\n } else {\n f7.dialog.create({\n title: _t.notcriticalErrorTitle,\n text: _t.textWarnDeleteSheet,\n buttons: [\n {text: _t.textCancel},\n {\n text: _t.textOk,\n onClick: () => {\n if (!api.asc_deleteWorksheet()) {\n f7.dialog.alert(_t.textErrorRemoveSheet, _t.notcriticalErrorTitle);\n }\n }\n }]\n }).open();\n }\n };\n\n const renameWorksheet = () => {\n const api = Common.EditorApi.get();\n\n if (api.asc_getWorksheetsCount() > 0) {\n let sindex = api.asc_getActiveWorksheetIndex();\n\n if (api.asc_isWorksheetLockedOrDeleted(sindex)) {\n return;\n }\n\n let current = api.asc_getWorksheetName(api.asc_getActiveWorksheetIndex());\n\n f7.dialog.create({\n title: _t.textSheetName,\n content: Device.ios ?\n '' : \n '',\n buttons: [\n {\n text: 'OK',\n bold: true,\n onClick: function () {\n let s = $$('input[name=\"modal-sheet-name\"]').val(),\n wc = api.asc_getWorksheetsCount(), items = [],\n err = !s.trim().length ? _t.textErrNotEmpty : ((!/^(\\')|[:\\\\\\/\\*\\?\\[\\]]|(\\')$/.test(s)) ? null : _t.textErrNameWrongChar);\n if (!err) {\n while (wc--) {\n if (sindex !== wc) {\n items.push(api.asc_getWorksheetName(wc).toLowerCase());\n }\n }\n if (items) {\n let testval = s.toLowerCase();\n for (var i = items.length - 1; i >= 0; --i) {\n if (items[i] === testval) {\n err = _t.textErrNameExists;\n }\n }\n }\n }\n if (err) {\n f7.dialog.alert(err, _t.notcriticalErrorTitle, () => {\n renameWorksheet();\n });\n } else if (s != current)\n api.asc_renameWorksheet(s);\n }\n },\n {\n text: _t.textCancel\n }\n ],\n on: {\n opened: () => {\n const nameField = document.querySelector('input[name=\"modal-sheet-name\"]');\n nameField.select();\n },\n }\n }).open();\n }\n };\n\n const createCopyName = (orig) => {\n const api = Common.EditorApi.get();\n let wc = api.asc_getWorksheetsCount(), names = [];\n\n while (wc--) {\n names.push(api.asc_getWorksheetName(wc).toLowerCase());\n }\n\n let re = /^(.*)\\((\\d)\\)$/.exec(orig);\n let first = re ? re[1] : orig + ' ';\n let index = 1, name;\n\n while(++index < 1000) {\n name = first + '(' + index + ')';\n if (names.indexOf(name.toLowerCase()) < 0) break;\n }\n\n return name;\n };\n\n const hideWorksheet = (hide, index) => {\n const api = Common.EditorApi.get();\n const visibleSheets = storeWorksheets.visibleWorksheets();\n\n if(hide) {\n visibleSheets.length == 1 ? \n f7.dialog.alert(_t.textErrorLastSheet, _t.notcriticalErrorTitle) :\n api['asc_hideWorksheet']([index]);\n } else {\n f7.popover.close('#idx-hidden-sheets-popover');\n api['asc_showWorksheet'](index);\n }\n };\n\n const onTabMenu = (event) => {\n const api = Common.EditorApi.get();\n let index = storeWorksheets.sheets.find(sheet => sheet.active).index;\n\n f7.popover.close('.document-menu.modal-in', false);\n\n switch (event) {\n case 'del': deleteWorksheet(); break;\n case 'hide': hideWorksheet(true, index); break;\n case 'ins': api.asc_insertWorksheet(createSheetName()); break;\n case 'copy':\n let name = createCopyName(api.asc_getWorksheetName(api.asc_getActiveWorksheetIndex()));\n api.asc_copyWorksheet(index, name);\n break;\n case 'ren': renameWorksheet(); break;\n case 'move': \n Device.phone ? f7.sheet.open('.move-sheet') : f7.popover.open('#idx-move-sheet-popover', targetRef.current); \n break;\n case 'tab-color':\n if( Device.phone ) {\n f7.sheet.open('.tab-color-sheet');\n f7.navbar.hide('.main-navbar');\n $$('.statusbar').css('top', '-50%');\n } else {\n f7.popover.open('#idx-tab-color-popover',targetRef.current);\n }\n break;\n case 'unhide':\n f7.popover.open('#idx-hidden-sheets-popover', '.active');\n break;\n case 'showMore':\n f7.actions.open('#idx-tab-menu-actions');\n break;\n default:\n let _re = /reveal\\:(\\d+)/.exec(event);\n if (_re && !!_re[1]) {\n hideWorksheet(false, parseInt(_re[1]));\n }\n }\n };\n\n const onMenuMoveClick = (index) => {\n const api = Common.EditorApi.get();\n\n let sheetsCount = api.asc_getWorksheetsCount();\n let activeIndex = api.asc_getActiveWorksheetIndex();\n\n api.asc_moveWorksheet(index === -255 ? sheetsCount : index , [activeIndex]);\n };\n\n const onTabListClick = (sheetIndex) => {\n const api = Common.EditorApi.get();\n if(api && api.asc_getActiveWorksheetIndex() !== sheetIndex) {\n api.asc_showWorksheet(sheetIndex);\n f7.popover.close('#idx-all-list');\n }\n };\n\n const onSetWorkSheetColor = (color) => {\n const api = Common.EditorApi.get();\n const active_index = api.asc_getActiveWorksheetIndex();\n const arrIndex = [];\n\n if (api) {\n arrIndex.push(active_index);\n if (arrIndex) {\n if(color === 'transparent') {\n api.asc_setWorksheetTabColor(null, arrIndex);\n storeWorksheets.sheets.forEach(tab => {\n if(tab.active) $$(`.sheet-tabs .tab a.tab-color-${tab.index}`).css('box-shadow', '');\n })\n } else {\n let asc_clr = Common.Utils.ThemeColor.getRgbColor(color);\n if (asc_clr) {\n api.asc_setWorksheetTabColor(asc_clr, arrIndex);\n }\n }\n }\n storeWorksheets.sheets[active_index].color = api.asc_getWorksheetTabColor(active_index);\n }\n }\n\n return (\n \n )\n}));\n\nexport {Statusbar, StatusbarController};","import React from 'react';\nimport {f7, List, Popover, Sheet, ListItem, Icon, ListButton, Page, Navbar, NavRight, Link, View} from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport { Device } from '../../../../common/mobile/utils/device';\nimport {observer, inject} from \"mobx-react\";\n\nconst FilterOptions = inject('storeAppOptions')(observer(props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const storeAppOptions = props.storeAppOptions;\n const canModifyFilter = storeAppOptions.canModifyFilter;\n let is_all_checked = props.listVal.every(item => item.check);\n\n const HandleClearFilter = () => {\n is_all_checked = true;\n props.onClearFilter();\n props.onUpdateCell('all', true);\n };\n\n const onValidChecked = () => {\n if ( props.listVal.every(item => !item.check) ) {\n f7.dialog.create({\n title: _t.textErrorTitle,\n text: _t.textErrorMsg,\n buttons: [\n {\n text: 'OK',\n }\n ]\n }).open();\n }\n };\n\n return (\n \n \n \n {Device.phone &&\n \n \n \n \n \n }\n \n \n \n \n \n
\n \n {_t.textClearFilter}\n props.onDeleteFilter()}\n id=\"btn-delete-filter\">{_t.textDeleteFilter}\n
\n \n {\n props.onUpdateCell('all', e.target.checked);\n onValidChecked();\n }} name='filter-cellAll' checkbox checked={is_all_checked}>{_t.textSelectAll}\n {props.listVal.map((value) =>\n {\n props.onUpdateCell(value.id, e.target.checked);\n onValidChecked();\n }} key={value.value} name='filter-cell' value={value.value} title={value.cellvalue} checkbox\n checked={value.check}/>\n )}\n
\n \n \n )\n}));\n\nconst FilterView = (props) => {\n return (\n !Device.phone ?\n \n \n :\n \n \n \n )\n}\n\nexport default FilterView;","import React, { memo, useEffect,useRef,useState } from 'react';\nimport FilterView from '../../src/view/FilterOptions';\nimport { f7,Sheet,Popover } from 'framework7-react';\nimport { Device } from '../../../../common/mobile/utils/device';\nimport { useTranslation } from 'react-i18next';\n\nconst FilterOptionsController = memo(props => {\n const { t } = useTranslation();\n const wsProps = props.wsProps;\n const _t = t('View.Edit', {returnObjects: true});\n const configRef = useRef();\n\n const [listVal, setListValue] = useState([]);\n const [isValid, setIsValid] = useState(null);\n const [checkSort, setCheckSort] = useState('');\n\n useEffect(() => {\n function onDocumentReady() {\n const api = Common.EditorApi.get();\n api.asc_registerCallback('asc_onSetAFDialog',onApiFilterOptions);\n }\n \n if ( !Common.EditorApi.get() ) {\n Common.Notifications.on('document:ready',onDocumentReady);\n } else {\n onDocumentReady();\n }\n\n return () => { \n Common.Notifications.off('document:ready', onDocumentReady);\n const api = Common.EditorApi.get();\n if ( api ) {\n api.asc_unregisterCallback('asc_onSetAFDialog', onApiFilterOptions);\n }\n }\n }, []);\n\n const onApiFilterOptions = (config) => {\n setDataFilterCells(config);\n configRef.current = config;\n\n if (wsProps.PivotTables && config.asc_getPivotObj() || \n wsProps.AutoFilter && !config.asc_getPivotObj()) return;\n \n setCheckSort((config.asc_getSortState() === Asc.c_oAscSortOptions.Ascending ? 'down' : '') || \n (config.asc_getSortState() === Asc.c_oAscSortOptions.Descending ? 'up' : ''));\n \n if (Device.phone) { \n f7.sheet.open('.picker__sheet');\n } else {\n let rect = config.asc_getCellCoord(),\n posX = rect.asc_getX() + rect.asc_getWidth() - 9,\n posY = rect.asc_getY() + rect.asc_getHeight() - 9;\n\n let $target = $$('#idx-context-menu-target')\n .css({left: `${posX}px`, top: `${posY}px`});\n if(!$$('#picker-popover.modal-in').length) f7.popover.open('#picker-popover',$target);\n } \n }\n\n const onSort = (type) => {\n const api = Common.EditorApi.get();\n api.asc_sortColFilter(type == 'sortdown' ? Asc.c_oAscSortOptions.Ascending : Asc.c_oAscSortOptions.Descending, configRef.current.asc_getCellId(), configRef.current.asc_getDisplayName());\n f7.sheet.close('.picker__sheet');\n f7.popover.close('#picker-popover');\n };\n \n const onClearFilter = () => {\n const api = Common.EditorApi.get();\n if(api) api.asc_clearFilter();\n setCheckSort('');\n };\n\n const onDeleteFilter = () => {\n const api = Common.EditorApi.get();\n let formatTableInfo = api.asc_getCellInfo().asc_getFormatTableInfo();\n let tablename = (formatTableInfo) ? formatTableInfo.asc_getTableName() : undefined;\n if(api) {\n api.asc_changeAutoFilter(tablename, Asc.c_oAscChangeFilterOptions.filter, false);\n f7.sheet.close('.picker__sheet');\n f7.popover.close('#picker-popover');\n }\n };\n\n const setClearDisable = (config) => {\n let arr = config.asc_getValues();\n let lenCheck = arr.filter((item) => item.visible == true).length;\n lenCheck == arr.length ? setIsValid(true) : setIsValid(false);\n };\n\n const setDataFilterCells = (config) => {\n let value = null,\n isnumber = null,\n arrCells = [];\n\n config.asc_getValues().forEach((item, index) => {\n value = item.asc_getText();\n isnumber = !isNaN(parseFloat(value)) && isFinite(value);\n\n arrCells.push({\n id : index,\n selected : false,\n cellvalue : value ? value : _t.textEmptyItem,\n value : isnumber ? value : (value.length > 0 ? value: _t.textEmptyItem),\n groupid : '1',\n check : item.asc_getVisible()\n });\n });\n\n setListValue(arrCells);\n };\n \n const onUpdateCell = (id, state) => {\n const api = Common.EditorApi.get();\n\n id == 'all' ? listVal.forEach(item => item.check = state) : listVal[id].check = state;\n setListValue([...listVal]);\n\n if ( listVal.some(item => item.check) ) {\n configRef.current.asc_getValues().forEach(\n (item, index) => item.asc_setVisible(listVal[index].check)\n );\n\n configRef.current.asc_getFilterObj().asc_setType(Asc.c_oAscAutoFilterTypes.Filters);\n api.asc_applyAutoFilter(configRef.current);\n }\n\n setClearDisable(configRef.current);\n };\n\n return (\n \n )\n});\n\nexport default FilterOptionsController;","import superPropBase from \"./superPropBase.js\";\nexport default function _get() {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get.bind();\n } else {\n _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n if (desc.get) {\n return desc.get.call(arguments.length < 3 ? target : receiver);\n }\n return desc.value;\n };\n }\n return _get.apply(this, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nexport default function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n return object;\n}","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { classNames, getExtraAttrs } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\n\n\nconst BlockTitle = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n large,\n medium\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n const classes = classNames(className, 'block-title', {\n 'block-title-large': large,\n 'block-title-medium': medium\n }, colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), children);\n});\nBlockTitle.displayName = 'f7-block-title';\nexport default BlockTitle;","\nimport React, { Component } from 'react';\nimport { Popover, Popup, View, f7 } from 'framework7-react';\nimport { Device } from '../../../../common/mobile/utils/device';\nimport { observable, runInAction } from \"mobx\";\nimport { observer } from \"mobx-react\";\n\nconst searchOptions = observable({\n usereplace: false,\n isReplaceAll: false\n});\n\nconst popoverStyle = {\n height: '300px'\n};\n\nconst SEARCH_BACKWARD = 'back';\nconst SEARCH_FORWARD = 'next';\n\nclass SearchSettingsView extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n useReplace: false,\n // caseSensitive: false,\n // markResults: false\n searchIn: 0,\n searchBy: 1,\n lookIn: 1,\n isMatchCase: false,\n isMatchCell: false,\n isReplaceAll: false\n };\n }\n\n onFindReplaceClick(action) {\n runInAction(() => {\n searchOptions.usereplace = action == 'replace';\n searchOptions.isReplaceAll = action == 'replace-all';\n });\n\n this.setState({\n useReplace: searchOptions.usereplace,\n isReplaceAll: searchOptions.isReplaceAll\n });\n\n if (this.onReplaceChecked) {}\n }\n\n extraSearchOptions() {}\n\n render() {\n const show_popover = !Device.phone;\n const extra = this.extraSearchOptions();\n const content =\n \n {extra}\n ;\n return (\n show_popover ?\n {content} :\n {content}\n )\n }\n}\n\n// @observer\nclass SearchView extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n searchQuery: '',\n replaceQuery: ''\n };\n\n this.refSearchbarInput = React.createRef();\n this.onSettingsClick = this.onSettingsClick.bind(this);\n this.onSearchClick = this.onSearchClick.bind(this);\n this.onReplaceClick = this.onReplaceClick.bind(this);\n }\n\n componentDidMount() {\n this.$replace = $$('#idx-replace-val');\n const $editor = $$('#editor_sdk');\n\n this.onEditorTouchStart = this.onEditorTouchStart.bind(this);\n this.onEditorTouchEnd = this.onEditorTouchEnd.bind(this);\n\n $editor.on('pointerdown', this.onEditorTouchStart);\n $editor.on('pointerup', this.onEditorTouchEnd);\n\n if(!this.searchbar) {\n this.searchbar = f7.searchbar.create({\n el: '.searchbar',\n customSearch: true,\n expandable: true,\n backdrop: false,\n on: {\n search: (sb, query, previousQuery) => {\n const api = Common.EditorApi.get();\n\n if(!query) {\n api.asc_selectSearchingResults(false);\n }\n },\n searchbarEnable: (sb) => {\n this.refSearchbarInput.focus();\n\n if(this.state.searchQuery.length > 0) {\n const searchInput = document.querySelector('.searchbar-input');\n searchInput.classList.add('input-with-value');\n }\n\n if (this.searchbar && this.searchbar.enabled && !this.props.isViewer) {\n searchOptions.usereplace || searchOptions.isReplaceAll ? this.searchbar.el.classList.add('replace') : this.searchbar.el.classList.remove('replace');\n } else {\n this.searchbar.el.classList.remove('replace');\n }\n }\n }\n });\n }\n }\n\n componentWillUnmount() {\n $$('#editor_sdk')\n .off('pointerdown', this.onEditorTouchStart)\n .off('pointerup', this.onEditorTouchEnd);\n \n if(this.searchTimer) {\n clearInterval(this.searchTimer);\n }\n }\n\n onSettingsClick(e) {\n if ( Device.phone ) {\n f7.popup.open('.search-settings-popup');\n } else f7.popover.open('#idx-search-settings', '#idx-btn-search-settings');\n }\n\n searchParams() {\n let params = {\n find: this.state.searchQuery\n };\n\n if (searchOptions.usereplace || searchOptions.isReplaceAll) {\n params.replace = this.$replace.val();\n } \n\n return params;\n }\n\n onSearchClick(action) {\n if (this.searchbar && this.state.searchQuery) {\n if (this.props.onSearchQuery) {\n let params = this.searchParams();\n\n params.find = this.state.searchQuery;\n params.forward = action != SEARCH_BACKWARD;\n\n this.props.onSearchQuery(params);\n }\n }\n }\n\n onReplaceClick() {\n if (this.searchbar) {\n if (this.props.onReplaceQuery) {\n let params = this.searchParams();\n params.find = this.state.searchQuery;\n\n this.props.onReplaceQuery(params);\n } \n }\n }\n\n onReplaceAllClick() {\n if (this.searchbar) {\n if (this.props.onReplaceAllQuery) {\n let params = this.searchParams();\n params.find = this.state.searchQuery;\n\n this.props.onReplaceAllQuery(params);\n } \n }\n }\n\n onEditorTouchStart(e) {\n this.startPoint = this.pointerPosition(e);\n }\n\n onEditorTouchEnd(e) {\n const endPoint = this.pointerPosition(e);\n\n if (this.searchbar.enabled) {\n let distance;\n\n if(this.startPoint) {\n distance = (this.startPoint.x === undefined || this.startPoint.y === undefined) ? 0 :\n Math.sqrt((endPoint.x -= this.startPoint.x) * endPoint.x + (endPoint.y -= this.startPoint.y) * endPoint.y);\n } else {\n distance = 0;\n }\n\n if (distance < 1) {\n this.searchbar.disable();\n }\n }\n }\n\n pointerPosition(e) {\n let out = {x:0, y:0};\n if ( e.type == 'pointerdown' || e.type == 'pointerup' || e.type == 'mousedown' || e.type == 'mouseup') {\n out.x = e.pageX;\n out.y = e.pageY;\n }\n return out;\n }\n\n changeSearchQuery(value) {\n this.setState({\n searchQuery: value\n });\n\n this.props.onchangeSearchQuery(value);\n }\n\n changeReplaceQuery(value) {\n this.setState({\n replaceQuery: value\n });\n }\n \n onSearchKeyDown(e) {\n if(e.keyCode === 13) {\n if (this.props.onSearchQuery(this.searchParams(), true) && this.searchTimer) {\n clearInterval(this.searchTimer);\n this.searchTimer = undefined;\n }\n }\n }\n\n onSearchInput(e) {\n const text = e.target.value;\n const api = Common.EditorApi.get();\n\n if (text && this.state.searchQuery !== text) {\n this.setState(prevState => ({\n ...prevState,\n searchQuery: text\n }));\n\n this.lastInputChange = new Date();\n\n if (this.searchTimer === undefined) {\n this.searchTimer = setInterval(() => {\n if (new Date() - this.lastInputChange < 400) return;\n\n if (!(this.state.searchQuery === '' || this.props.onSearchQuery(this.searchParams(), true))) {\n this.props.onSearchQuery(this.searchParams(), true);\n clearInterval(this.searchTimer);\n this.searchTimer = undefined;\n }\n }, 10);\n }\n } else {\n this.props.setNumberSearchResults(null);\n }\n }\n\n render() {\n const usereplace = searchOptions.usereplace;\n const isReplaceAll = searchOptions.isReplaceAll;\n const hidden = {display: \"none\"};\n const searchQuery = this.state.searchQuery;\n const replaceQuery = this.state.replaceQuery;\n const isIos = Device.ios;\n const { _t } = this.props;\n const numberSearchResults = this.props.numberSearchResults;\n const isViewer = this.props.isViewer ?? false;\n\n\n if (this.searchbar && this.searchbar.enabled && !isViewer) {\n searchOptions.usereplace || searchOptions.isReplaceAll ? this.searchbar.el.classList.add('replace') : this.searchbar.el.classList.remove('replace');\n }\n\n return (\n \n )\n } \n}\n\nconst SearchViewWithObserver = observer(SearchView);\nconst SearchSettingsViewWithObserver = observer(SearchSettingsView);\n\nexport {SearchViewWithObserver as SearchView, SearchSettingsViewWithObserver as SearchSettingsView};\n","import React, { useEffect, useState } from 'react';\r\nimport { List, ListItem, Toggle, BlockTitle, Navbar, NavRight, Link, Page } from 'framework7-react';\r\nimport { SearchView, SearchSettingsView } from '../../../../common/mobile/lib/controller/Search';\r\nimport { f7 } from 'framework7-react';\r\nimport { withTranslation } from 'react-i18next';\r\nimport { Dom7 } from 'framework7';\r\nimport { Device } from '../../../../common/mobile/utils/device';\r\nimport { observer, inject } from \"mobx-react\";\r\n\r\nclass SearchSettings extends SearchSettingsView {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.onToggleMarkResults = this.onToggleMarkResults.bind(this);\r\n }\r\n\r\n onToggleMarkResults(checked) {\r\n const api = Common.EditorApi.get();\r\n api.asc_selectSearchingResults(checked);\r\n }\r\n\r\n extraSearchOptions() {\r\n const anc_markup = super.extraSearchOptions();\r\n const show_popover = !Device.phone;\r\n const { t } = this.props;\r\n const _t = t(\"View.Settings\", { returnObjects: true });\r\n const storeAppOptions = this.props.storeAppOptions;\r\n const storeVersionHistory = this.props.storeVersionHistory;\r\n const isVersionHistoryMode = storeVersionHistory.isVersionHistoryMode;\r\n const isEdit = storeAppOptions.isEdit;\r\n\r\n const markup = (\r\n \r\n \r\n {!show_popover &&\r\n \r\n {_t.textDone}\r\n \r\n }\r\n \r\n \r\n this.onFindReplaceClick('find')} />\r\n {isEdit && !isVersionHistoryMode ? [\r\n this.onFindReplaceClick('replace')} />,\r\n this.onFindReplaceClick('replace-all')}>]\r\n : null}\r\n
\r\n {_t.textSearchIn}\r\n \r\n this.setState({\r\n searchIn: 0\r\n })} />\r\n this.setState({\r\n searchIn: 1\r\n })} />\r\n
\r\n {_t.textSearchBy}\r\n \r\n this.setState({\r\n searchBy: 0\r\n })} />\r\n this.setState({\r\n searchBy: 1\r\n })} />\r\n
\r\n {_t.textLookIn}\r\n \r\n this.setState({\r\n lookIn: 0\r\n })} />\r\n this.setState({\r\n lookIn: 1\r\n })} />\r\n
\r\n \r\n \r\n this.setState({\r\n isMatchCase: !this.state.isMatchCase\r\n })} />\r\n \r\n \r\n this.setState({\r\n isMatchCell: !this.state.isMatchCell\r\n })} />\r\n \r\n \r\n \r\n \r\n
\r\n \r\n )\r\n\r\n return {...anc_markup, ...markup};\r\n }\r\n}\r\n\r\nclass SESearchView extends SearchView {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n searchParams() {\r\n let params = super.searchParams();\r\n const $$ = Dom7;\r\n\r\n const checkboxMatchCase = f7.toggle.get('.toggle-match-case'),\r\n checkboxMatchCell = f7.toggle.get('.toggle-match-cell'),\r\n checkboxMarkResults = f7.toggle.get('.toggle-mark-results'),\r\n checkboxSearchIn = $$('[name=\"search-in-checkbox\"]:checked')[0],\r\n checkboxSearchBy = $$('[name=\"search-by-checkbox\"]:checked')[0],\r\n checkboxLookIn = $$('[name=\"look-in-checkbox\"]:checked')[0];\r\n\r\n const searchOptions = {\r\n caseSensitive: checkboxMatchCase.checked,\r\n highlight: checkboxMarkResults.checked,\r\n matchCell: checkboxMatchCell.checked,\r\n searchIn: checkboxSearchIn.value,\r\n searchBy: checkboxSearchBy.value,\r\n lookIn: checkboxLookIn.value,\r\n };\r\n\r\n return {...params, ...searchOptions};\r\n }\r\n\r\n onSearchbarShow(isshowed, bar) {\r\n // super.onSearchbarShow(isshowed, bar);\r\n const api = Common.EditorApi.get();\r\n\r\n if ( isshowed && this.state.searchQuery.length ) {\r\n const checkboxMarkResults = f7.toggle.get('.toggle-mark-results');\r\n api.asc_selectSearchingResults(checkboxMarkResults.checked);\r\n } else api.asc_selectSearchingResults(false);\r\n }\r\n}\r\n\r\nconst Search = withTranslation()(props => {\r\n const { t } = props;\r\n const _t = t('View.Settings', {returnObjects: true});\r\n const [numberSearchResults, setNumberSearchResults] = useState(null);\r\n\r\n useEffect(() => {\r\n if (f7.searchbar.get('.searchbar')?.enabled && Device.phone) {\r\n const api = Common.EditorApi.get();\r\n api.asc_enableKeyEvents(false);\r\n $$('.searchbar-input').focus();\r\n }\r\n });\r\n\r\n const onSearchQuery = (params, isSearchByTyping) => {\r\n const api = Common.EditorApi.get();\r\n\r\n let lookIn = +params.lookIn === 0;\r\n let searchIn = +params.searchIn;\r\n let searchBy = +params.searchBy === 0;\r\n\r\n const options = new Asc.asc_CFindOptions();\r\n\r\n options.asc_setFindWhat(params.find);\r\n options.asc_setScanForward(params.forward);\r\n options.asc_setIsMatchCase(params.caseSensitive);\r\n options.asc_setIsWholeCell(params.matchCell);\r\n options.asc_setScanOnOnlySheet(searchIn);\r\n options.asc_setScanByRows(searchBy);\r\n options.asc_setLookIn(lookIn ? Asc.c_oAscFindLookIn.Formulas : Asc.c_oAscFindLookIn.Value);\r\n\r\n if (params.highlight) api.asc_selectSearchingResults(true);\r\n\r\n api.asc_findText(options, function(resultCount) {\r\n if(!resultCount) {\r\n setNumberSearchResults(0);\r\n\r\n if(!isSearchByTyping) {\r\n f7.dialog.alert(null, t('View.Settings.textNoMatches'));\r\n }\r\n } else {\r\n setNumberSearchResults(resultCount);\r\n }\r\n });\r\n };\r\n\r\n const onchangeSearchQuery = params => {\r\n const api = Common.EditorApi.get();\r\n \r\n if(params.length === 0) api.asc_selectSearchingResults(false);\r\n }\r\n\r\n const onReplaceQuery = params => {\r\n if (!params.find) return;\r\n\r\n const api = Common.EditorApi.get();\r\n\r\n let lookIn = +params.lookIn === 0;\r\n let searchIn = +params.searchIn;\r\n let searchBy = +params.searchBy === 0;\r\n\r\n api.isReplaceAll = false;\r\n\r\n const options = new Asc.asc_CFindOptions();\r\n\r\n options.asc_setFindWhat(params.find);\r\n options.asc_setReplaceWith(params.replace || '');\r\n options.asc_setIsMatchCase(params.caseSensitive);\r\n options.asc_setIsWholeCell(params.matchCell);\r\n options.asc_setScanOnOnlySheet(searchIn);\r\n options.asc_setScanByRows(searchBy);\r\n options.asc_setLookIn(lookIn ? Asc.c_oAscFindLookIn.Formulas : Asc.c_oAscFindLookIn.Value);\r\n options.asc_setIsReplaceAll(false);\r\n\r\n api.asc_replaceText(options, params.replace || '', false);\r\n setNumberSearchResults(numberSearchResults > 0 ? numberSearchResults - 1 : 0);\r\n }\r\n\r\n const onReplaceAllQuery = params => {\r\n if (!params.find) return;\r\n\r\n const api = Common.EditorApi.get();\r\n\r\n let lookIn = +params.lookIn === 0;\r\n let searchIn = +params.searchIn;\r\n let searchBy = +params.searchBy === 0;\r\n\r\n api.isReplaceAll = true;\r\n\r\n const options = new Asc.asc_CFindOptions();\r\n\r\n options.asc_setFindWhat(params.find);\r\n options.asc_setReplaceWith(params.replace || '');\r\n options.asc_setIsMatchCase(params.caseSensitive);\r\n options.asc_setIsWholeCell(params.matchCell);\r\n options.asc_setScanOnOnlySheet(searchIn);\r\n options.asc_setScanByRows(searchBy);\r\n options.asc_setLookIn(lookIn ? Asc.c_oAscFindLookIn.Formulas : Asc.c_oAscFindLookIn.Value);\r\n options.asc_setIsReplaceAll(true);\r\n\r\n api.asc_replaceText(options, params.replace || '', true);\r\n setNumberSearchResults(0);\r\n }\r\n\r\n return (\r\n \r\n )\r\n});\r\n\r\nconst SearchSettingsWithTranslation = inject(\"storeAppOptions\", \"storeVersionHistory\")(observer(withTranslation()(SearchSettings)));\r\n\r\nexport {Search, SearchSettingsWithTranslation as SearchSettings}","import React, { Fragment } from 'react';\nimport { observer, inject } from \"mobx-react\";\nimport { useTranslation } from 'react-i18next';\nimport { List, ListItem, Page, Navbar, Icon, BlockTitle, f7 } from 'framework7-react';\n\nconst PageInfo = props => {\n const { t } = useTranslation();\n const _t = t('View.Add', {returnObjects: true});\n const f = props.functionInfo;\n return(\n \n \n \n
{`${f.caption} ${f.args}`}
\n
{f.descr}
\n
\n \n )\n};\n\nconst PageGroup = ({name, type, functions, onInsertFunction, f7router}) => {\n const { t } = useTranslation();\n const _t = t('View.Add', {returnObjects: true});\n const items = [];\n for (let k in functions) {\n if (functions[k].group == type)\n items.push(functions[k]);\n }\n\n items.sort(function(a, b) {\n return (a.caption.toLowerCase() > b.caption.toLowerCase()) ? 1 : -1;\n });\n\n return (\n \n \n \n {items.map((f, index) => {\n return(\n {onInsertFunction(f.type);}}\n >\n {\n f7router.navigate('/add-function-info/', {\n props: {\n functionInfo: f\n }\n });\n event.stopPropagation();\n }}>\n \n
\n \n )\n })}\n
\n \n )\n};\n\nconst AddFunction = props => {\n const { t } = useTranslation();\n const _t = t('View.Add', {returnObjects: true});\n const store = props.storeFunctions;\n const functions = store.functions;\n const quickFunctions = [\n {caption: 'SUM', type: 'SUM'},\n {caption: 'MIN', type: 'MIN'},\n {caption: 'MAX', type: 'MAX'},\n {caption: 'COUNT', type: 'COUNT'}\n ];\n\n if (Object.keys(functions).length) {\n quickFunctions.forEach((quickFunction) => {\n const f = functions[quickFunction.type];\n quickFunction.caption = f.caption;\n quickFunction.args = f.args;\n quickFunction.descr = f.descr;\n });\n }\n let name = '';\n const descriptions = ['DateAndTime', 'Engineering', 'Financial', 'Information', 'Logical', 'LookupAndReference', 'Mathematic', 'Statistical', 'TextAndData' ];\n const groups = [];\n for (let i = 0; i < descriptions.length; i++) {\n name = descriptions[i];\n name = _t['sCat' + name] || name;\n groups.push({\n type: descriptions[i],\n name: name\n })\n }\n\n const onOptionClick = (page, props) => {\n f7.views.current.router.navigate(page, props);\n }\n\n return (\n \n \n {quickFunctions.map((f, index) => {\n return (\n {props.onInsertFunction(f.type);}}\n >\n {\n onOptionClick('/add-function-info/', {\n props: {\n functionInfo: f\n }\n });\n e.stopPropagation();\n }}>\n \n
\n \n )\n })}\n
\n {_t.textGroups}\n \n {groups.map((group, index) => {\n return(\n \n )\n })}\n
\n \n )\n};\n\nconst AddFunctionContainer = inject(\"storeFunctions\")(observer(AddFunction));\n\nexport {\n AddFunctionContainer as AddFunction,\n PageGroup as PageFunctionGroup,\n PageInfo as PageFunctionInfo\n};","import React, {Component} from 'react';\nimport {observer, inject} from \"mobx-react\";\nimport { f7 } from 'framework7-react';\nimport {Device} from '../../../../../common/mobile/utils/device';\nimport {LocalStorage} from '../../../../../common/mobile/utils/LocalStorage.mjs';\nimport {AddFunction} from '../../view/add/AddFunction';\n\nclass _FunctionGroups extends Component {\n constructor (props) {\n super(props);\n\n Common.Notifications.on('changeFuncLang', () => {\n this.api = Common.EditorApi.get();\n this.init();\n });\n\n Common.Notifications.on('changeRegSettings', () => {\n this.api = Common.EditorApi.get();\n this.init();\n });\n }\n componentDidMount() {\n Common.Notifications.on('document:ready', () => {\n this.api = Common.EditorApi.get();\n this.init();\n });\n }\n init () {\n const editorLang = LocalStorage.getItem('sse-settings-func-lang');\n this._editorLang = (editorLang ? editorLang : 'en').split(/[\\-\\_]/)[0].toLowerCase();\n const localizationFunctions = (data) => {\n this.api.asc_setLocalization(data, this._editorLang);\n this.fill(data);\n };\n\n fetch(`locale/l10n/functions/${this._editorLang}.json`)\n .then(response => response.json())\n .then((data) => {\n localizationFunctions(data);\n });\n }\n fill () {\n this._functions = {};\n const localizationFunctionsDesc = (data) => {\n let jsonDesc = {};\n try {\n jsonDesc = JSON.parse(data);\n } catch (e) {\n jsonDesc = data;\n }\n const grouparr = this.api.asc_getFormulasInfo();\n const separator = this.api.asc_getFunctionArgumentSeparator();\n this.props.storeFunctions.initFunctions(grouparr, jsonDesc, separator);\n };\n\n fetch(`locale/l10n/functions/${this._editorLang}_desc.json`)\n .then(response => response.json())\n .then((data) => {\n localizationFunctionsDesc(data);\n });\n }\n render() {\n return null;\n }\n}\nconst FunctionGroups = inject(\"storeFunctions\")(observer(_FunctionGroups));\n\nclass AddFunctionController extends Component {\n constructor (props) {\n super(props);\n this.onInsertFunction = this.onInsertFunction.bind(this);\n }\n\n closeModal () {\n if ( Device.phone ) {\n f7.sheet.close('.add-popup', true);\n } else {\n f7.popover.close('#add-popover');\n }\n }\n\n onInsertFunction (type) {\n const api = Common.EditorApi.get();\n api.asc_insertInCell(api.asc_getFormulaLocaleName(type), Asc.c_oAscPopUpSelectorType.Func, true);\n this.closeModal();\n }\n\n render () {\n return (\n \n )\n }\n}\n\nexport {FunctionGroups, AddFunctionController};","import React, { Component } from 'react';\nimport { Popover, List, ListItem, ListButton, Link, Icon, Actions, ActionsGroup, ActionsButton } from 'framework7-react';\nimport { f7 } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\n\nconst idContextMenuElement = \"idx-context-menu-popover\";\n\nclass ContextMenuView extends Component {\n constructor(props) {\n super(props);\n }\n\n componentDidMount() {\n // f7.popover.open('#idx-context-menu-popover', '#idx-context-menu-target');\n }\n\n render() {\n const buttons = this.props.items || {};\n\n return (\n \n )\n }\n}\n\nconst ActionsWithExtraItems = ({items, onMenuItemClick, opened, onActionClosed}) => {\n const { t } = useTranslation();\n const _t = t('ContextMenu', {returnObjects: true});\n return (\n onActionClosed()}>\n \n {items.length > 0 && items.map((item, index)=>{\n return(\n {onMenuItemClick(item.event)}}>{item.caption}\n )\n })}\n \n \n {_t.menuCancel}\n \n \n )\n};\n\nconst exportedIdMenuElemen = `#${idContextMenuElement}`;\nexport {ContextMenuView as default, exportedIdMenuElemen as idContextMenuElement, ActionsWithExtraItems};","import React, { Component, Fragment } from 'react';\nimport { f7 } from 'framework7-react';\nimport {observer, inject} from \"mobx-react\";\nimport { Device } from '../../../../common/mobile/utils/device';\n\nimport ContextMenuView, { idContextMenuElement, ActionsWithExtraItems } from '../view/ContextMenu';\n\nconst idCntextMenuTargetElement = '#idx-context-menu-target';\n\nclass ContextMenuController extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n opened: false,\n items: [],\n openedMore: false,\n extraItems: []\n };\n\n this.fastCoAuthTips = [];\n this.onMenuItemClick = this.onMenuItemClick.bind(this);\n this.onMenuClosed = this.onMenuClosed.bind(this);\n this.onActionClosed = this.onActionClosed.bind(this);\n this.onDocumentReady = this.onDocumentReady.bind(this);\n this.onApiOpenContextMenu = this.onApiOpenContextMenu.bind(this);\n this.onApiHideContextMenu = this.onApiHideContextMenu.bind(this);\n this.onApiShowForeignCursorLabel = this.onApiShowForeignCursorLabel.bind(this);\n this.onApiHideForeignCursorLabel = this.onApiHideForeignCursorLabel.bind(this);\n }\n\n onDocumentReady() {\n this.$targetEl = $$(idCntextMenuTargetElement);\n if ( !this.$targetEl.length ) {\n // this.$targetEl = $$('');\n this.$targetEl = $$(``);\n this.$targetEl.css({left: '-10000px', top: '-10000px'});\n\n $$('#editor_sdk').append(this.$targetEl);\n }\n\n const api = Common.EditorApi.get();\n api.asc_registerCallback('asc_onShowPopMenu', this.onApiOpenContextMenu);\n api.asc_registerCallback('asc_onHidePopMenu', this.onApiHideContextMenu);\n api.asc_registerCallback('asc_onShowForeignCursorLabel', this.onApiShowForeignCursorLabel);\n api.asc_registerCallback('asc_onHideForeignCursorLabel', this.onApiHideForeignCursorLabel);\n }\n\n offsetPopoverTop(popover) {\n var app = popover.app,\n $el = popover.$el,\n $targetEl = popover.$targetEl;\n\n const width = $el.width(),\n height = $el.height();\n\n $el.removeClass('popover-on-left popover-on-right popover-on-top popover-on-bottom popover-on-middle').css({\n left: '',\n top: ''\n });\n\n let targetOffsetLeft, targetOffsetTop;\n // var safeAreaTop = parseInt($('html').css('--f7-safe-area-top'), 10);\n let safeAreaLeft = parseInt($('html').css('--f7-safe-area-left'), 10),\n safeAreaRight = parseInt($('html').css('--f7-safe-area-right'), 10);\n // if (Number.isNaN(safeAreaTop)) safeAreaTop = 0;\n if (Number.isNaN(safeAreaLeft)) safeAreaLeft = 0;\n if (Number.isNaN(safeAreaRight)) safeAreaRight = 0;\n\n if ($targetEl && $targetEl.length > 0) {\n let targetOffset = $targetEl.offset();\n targetOffsetLeft = targetOffset.left - app.left;\n targetOffsetTop = targetOffset.top - app.top;\n let targetParentPage = $targetEl.parents('.page');\n\n if (targetParentPage.length > 0) {\n targetOffsetTop -= targetParentPage[0].scrollTop;\n }\n }\n\n let position = 'top';\n\n let top = targetOffsetTop - height - 10;\n top = Math.max(8, Math.min(top, app.height - height - 8)); // Horizontal Position\n\n let hPosition;\n\n // if (targetOffsetLeft < app.width / 2) {\n // hPosition = 'right';\n // left = position === 'middle' ? targetOffsetLeft + targetWidth : targetOffsetLeft;\n // } else {\n // hPosition = 'left';\n // left = position === 'middle' ? targetOffsetLeft - width : targetOffsetLeft + targetWidth - width;\n // }\n\n hPosition = 'middle';\n let left = targetOffsetLeft - width / 2;\n\n left = Math.max(8, Math.min(left, app.width - width - 8 - safeAreaRight), safeAreaLeft);\n $el.addClass(`popover-on-${position} popover-on-${hPosition}`);\n\n $el.css({top: `${top}px`,\n left: `${left}px`});\n }\n\n onApiOpenContextMenu(x, y) {\n if ( !this.state.opened && $$('.dialog.modal-in, .popover.modal-in, .sheet-modal.modal-in, .popup.modal-in, #pe-preview, .add-comment-popup, .actions-modal.modal-in').length < 1) {\n const subNav = document.querySelector('.subnavbar');\n const rect = subNav.getBoundingClientRect();\n\n this.setState({\n items: this.initMenuItems(),\n extraItems: this.initExtraItems()\n });\n\n if ( this.state.items.length > 0 ) {\n const api = Common.EditorApi.get();\n \n this.$targetEl.css({left: `${x}px`, top: y < rect.bottom ? `${rect.bottom}px` : `${y}px`});\n const popover = f7.popover.open(idContextMenuElement, idCntextMenuTargetElement);\n\n if (Device.android)\n this.offsetPopoverTop(popover);\n\n this.setState(state => {\n return {opened: true}\n });\n\n api.asc_enableKeyEvents(true);\n }\n }\n }\n\n onApiHideContextMenu() {\n if ( this.state.opened ) {\n $$(idContextMenuElement).hide();\n f7.popover.close(idContextMenuElement, false);\n\n this.$targetEl.css({left: '-10000px', top: '-10000px'});\n this.setState({opened: false});\n }\n }\n\n onMenuClosed() {\n this.$targetEl.css({left: '-10000px', top: '-10000px'});\n this.setState({opened: false});\n\n // (async () => {\n // await 1 && this.setState(state => {\n // this.$targetEl.css({left: '-10000px', top: '-10000px'});\n // return ({opened: false});\n // });\n // })();\n }\n\n onActionClosed() {\n this.setState({openedMore: false});\n }\n\n async onMenuItemClick(action) {\n await this.onApiHideContextMenu();\n\n if (action === 'showActionSheet') {\n this.setState({openedMore: true});\n }\n }\n\n onApiShowForeignCursorLabel(UserId, X, Y, color) {\n if (!this.isUserVisible(UserId)) return;\n\n /** coauthoring begin **/\n const tipHeight = 20;\n\n let src;\n for (let i=0; i`);\n src.attr('userid', UserId);\n src.css({'background-color': '#'+Common.Utils.ThemeColor.getHexColor(color.get_r(), color.get_g(), color.get_b())});\n src.text(this.getUserName(UserId));\n this.fastCoAuthTips.push(src);\n //src.fadeIn(150);\n src[0].classList.add('active');\n\n $$(\"#editor_sdk\").append(src);\n }\n\n if ( X + src.outerWidth() > $$(window).width() ) { \n src.css({\n top: (Y - tipHeight) + 'px',\n left: X - src.outerWidth() + 'px'});\n } else {\n src.css({\n left: X + 'px',\n top: (Y - tipHeight) + 'px',\n });\n }\n \n /** coauthoring end **/\n }\n\n onApiHideForeignCursorLabel(userId) {\n /** coauthoring begin **/\n for (let i=0; i {src.remove()});\n src[0].classList.remove('active');\n src.remove();\n this.fastCoAuthTips.splice(i, 1);\n break;\n }\n }\n /** coauthoring end **/\n }\n\n componentWillUnmount() {\n Common.Notifications.off('document:ready', this.onDocumentReady);\n\n const api = Common.EditorApi.get();\n if ( api ) {\n api.asc_unregisterCallback('asc_onShowPopMenu', this.onApiOpenContextMenu);\n api.asc_unregisterCallback('asc_onHidePopMenu', this.onApiHideContextMenu);\n api.asc_unregisterCallback('asc_onShowForeignCursorLabel', this.onApiShowForeignCursorLabel);\n api.asc_unregisterCallback('asc_onHideForeignCursorLabel', this.onApiHideForeignCursorLabel);\n }\n }\n\n componentDidMount() {\n if ( !Common.EditorApi ) {\n Common.Notifications.on({\n 'document:ready': this.onDocumentReady\n });\n } else {\n this.onDocumentReady();\n }\n }\n\n initMenuItems() {\n return [];\n }\n\n initExtraItems () {\n return [];\n }\n\n render() {\n return (\n \n \n \n \n )\n }\n}\n\nexport default ContextMenuController;","\nconst EditorUIController = () => null;\n\nEditorUIController.isSupportEditFeature = () => false;\n\nexport default EditorUIController;\n","import { f7 } from 'framework7-react';\nimport { inject, observer } from \"mobx-react\";\nimport { withTranslation} from 'react-i18next';\nimport { LocalStorage } from '../../../../common/mobile/utils/LocalStorage.mjs';\n\nimport ContextMenuController from '../../../../common/mobile/lib/controller/ContextMenu';\nimport { idContextMenuElement } from '../../../../common/mobile/lib/view/ContextMenu';\nimport EditorUIController from '../lib/patch';\n\n@inject(stores => ({\n isEdit: stores.storeAppOptions.isEdit,\n canComments: stores.storeAppOptions.canComments,\n canViewComments: stores.storeAppOptions.canViewComments,\n canCoAuthoring: stores.storeAppOptions.canCoAuthoring,\n isRestrictedEdit: stores.storeAppOptions.isRestrictedEdit,\n users: stores.users,\n isDisconnected: stores.users.isDisconnected,\n storeWorksheets: stores.storeWorksheets,\n wsProps: stores.storeWorksheets.wsProps,\n wsLock: stores.storeWorksheets.wsLock,\n objects: stores.storeFocusObjects.objects,\n focusOn: stores.storeFocusObjects.focusOn,\n isResolvedComments: stores.storeApplicationSettings.isResolvedComments,\n isVersionHistoryMode: stores.storeVersionHistory.isVersionHistoryMode\n}))\nclass ContextMenu extends ContextMenuController {\n constructor(props) {\n super(props);\n\n // console.log('context menu controller created');\n this.onApiShowComment = this.onApiShowComment.bind(this);\n this.onApiHideComment = this.onApiHideComment.bind(this);\n this.isOpenWindowUser = false;\n this.timer;\n this.getUserName = this.getUserName.bind(this);\n this.isUserVisible = this.isUserVisible.bind(this);\n this.onApiMouseMove = this.onApiMouseMove.bind(this);\n this.onApiHyperlinkClick = this.onApiHyperlinkClick.bind(this);\n this.checkShapeSelection = this.checkShapeSelection.bind(this);\n }\n\n static closeContextMenu() {\n f7.popover.close(idContextMenuElement, false);\n }\n\n getUserName(id) {\n const user = this.props.users.searchUserByCurrentId(id);\n return AscCommon.UserInfoParser.getParsedName(user.asc_getUserName());\n }\n\n isUserVisible(id) {\n const user = this.props.users.searchUserByCurrentId(id);\n return user ? (user.asc_getIdOriginal()===this.props.users.currentUser.asc_getIdOriginal() || AscCommon.UserInfoParser.isUserVisible(user.asc_getUserName())) : true;\n }\n\n componentWillUnmount() {\n super.componentWillUnmount();\n\n const api = Common.EditorApi.get();\n if ( api ) {\n api.asc_unregisterCallback('asc_onShowComment', this.onApiShowComment);\n api.asc_unregisterCallback('asc_onHideComment', this.onApiHideComment);\n api.asc_unregisterCallback('asc_onMouseMove', this.onApiMouseMove);\n api.asc_unregisterCallback('asc_onHyperlinkClick', this.onApiHyperlinkClick);\n api.asc_unregisterCallback('asc_onShowPopMenu', this.checkShapeSelection);\n }\n }\n\n\n onApiShowComment(comments) {\n this.isComments = comments && comments.length > 0;\n }\n\n onApiHideComment() {\n this.isComments = false;\n }\n\n // onMenuClosed() {\n // super.onMenuClosed();\n // }\n\n onApiHyperlinkClick(url) {\n const { t } = this.props;\n\n if(!url) {\n f7.dialog.create({\n title: t('ContextMenu.notcriticalErrorTitle'),\n text: t('ContextMenu.errorInvalidLink'),\n buttons:[\n {text: 'OK'}\n ] \n }).open();\n }\n }\n\n onMenuItemClick(action) {\n const { t } = this.props;\n const _t = t(\"ContextMenu\", { returnObjects: true });\n\n super.onMenuItemClick(action);\n\n if ( EditorUIController.ContextMenu && EditorUIController.ContextMenu.handleMenuItemClick(this, action) )\n return;\n\n const api = Common.EditorApi.get();\n const info = api.asc_getCellInfo();\n\n switch (action) {\n case 'cut':\n if (!LocalStorage.getBool(\"sse-hide-copy-cut-paste-warning\")) {\n this.showCopyCutPasteModal();\n }\n break;\n case 'copy':\n if (!api.asc_Copy() && !LocalStorage.getBool(\"sse-hide-copy-cut-paste-warning\")) {\n this.showCopyCutPasteModal();\n }\n break;\n case 'paste':\n if (!LocalStorage.getBool(\"sse-hide-copy-cut-paste-warning\")) {\n this.showCopyCutPasteModal();\n }\n break;\n case 'viewcomment':\n Common.Notifications.trigger('viewcomment');\n break;\n case 'openlink':\n const linkinfo = info.asc_getHyperlink();\n\n if ( linkinfo.asc_getType() == Asc.c_oAscHyperlinkType.RangeLink ) {\n const { storeWorksheets } = this.props;\n const nameSheet = linkinfo.asc_getSheet();\n const curActiveSheet = api.asc_getActiveWorksheetIndex();\n const tab = storeWorksheets.sheets.find((sheet) => sheet.name === nameSheet);\n api.asc_setWorksheetRange(linkinfo);\n\n if (tab) {\n const sdkIndex = tab.index;\n if (sdkIndex !== curActiveSheet) {\n const index = storeWorksheets.sheets.indexOf(tab);\n storeWorksheets.setActiveWorksheet(index);\n Common.Notifications.trigger('sheet:active', sdkIndex);\n }\n }\n } else {\n const url = linkinfo.asc_getHyperlinkUrl().replace(/\\s/g, \"%20\");\n this.openLink(url);\n }\n break;\n case 'autofillCells':\n api.asc_fillHandleDone();\n break;\n }\n }\n\n onMergeCells() {\n const { t } = this.props;\n const api = Common.EditorApi.get();\n if (api.asc_mergeCellsDataLost(Asc.c_oAscMergeOptions.Merge)) {\n setTimeout(() => {\n f7.dialog.create({\n title: t('ContextMenu.notcriticalErrorTitle'),\n text: t('ContextMenu.warnMergeLostData'),\n buttons: [\n {\n text: t('ContextMenu.menuCancel')\n },\n {\n text: 'OK',\n onClick: () => {\n api.asc_mergeCells(Asc.c_oAscMergeOptions.Merge);\n }\n }\n ] \n }).open();\n }, 0);\n } else {\n api.asc_mergeCells(Asc.c_oAscMergeOptions.Merge);\n }\n }\n\n showCopyCutPasteModal() {\n const { t } = this.props;\n const _t = t(\"ContextMenu\", { returnObjects: true });\n f7.dialog.create({\n title: _t.textCopyCutPasteActions,\n text: _t.errorCopyCutPaste,\n content: `\n \n ${_t.textDoNotShowAgain}\n
`,\n buttons: [{\n text: 'OK',\n onClick: () => {\n const dontShow = $$('input[name=\"checkbox-show\"]').prop('checked');\n if (dontShow) LocalStorage.setItem(\"sse-hide-copy-cut-paste-warning\", 1);\n }\n }]\n }).open();\n }\n\n openLink(url) {\n if (url) {\n const type = Common.EditorApi.get().asc_getUrlType(url);\n if (type===AscCommon.c_oAscUrlType.Http || type===AscCommon.c_oAscUrlType.Email) {\n const newDocumentPage = window.open(url, '_blank');\n if (newDocumentPage) {\n newDocumentPage.focus();\n }\n } else {\n const { t } = this.props;\n const _t = t(\"ContextMenu\", { returnObjects: true });\n f7.dialog.create({\n title: _t.notcriticalErrorTitle,\n text : _t.txtWarnUrl,\n buttons: [{\n text: _t.textOk,\n bold: true,\n onClick: () => {\n const newDocumentPage = window.open(url, '_blank');\n if (newDocumentPage) {\n newDocumentPage.focus();\n }\n }\n },\n { text: _t.menuCancel }]\n }).open();\n }\n }\n }\n\n onDocumentReady() {\n super.onDocumentReady();\n\n const api = Common.EditorApi.get();\n api.asc_registerCallback('asc_onShowComment', this.onApiShowComment);\n api.asc_registerCallback('asc_onHideComment', this.onApiHideComment);\n api.asc_registerCallback('asc_onMouseMove', this.onApiMouseMove);\n api.asc_registerCallback('asc_onHyperlinkClick', this.onApiHyperlinkClick);\n api.asc_registerCallback('asc_onShowPopMenu', this.checkShapeSelection);\n }\n\n initMenuItems() {\n if ( !Common.EditorApi ) return [];\n\n const { t } = this.props;\n const _t = t(\"ContextMenu\", { returnObjects: true });\n\n const { isEdit, isRestrictedEdit, isDisconnected, isVersionHistoryMode } = this.props;\n\n if (isEdit && EditorUIController.ContextMenu) {\n return EditorUIController.ContextMenu.mapMenuItems(this);\n } else {\n const {canViewComments, canCoAuthoring, canComments, isResolvedComments} = this.props;\n\n const api = Common.EditorApi.get();\n const cellinfo = api.asc_getCellInfo();\n const isCanFillHandle = api.asc_canFillHandle();\n\n const itemsIcon = [];\n const itemsText = [];\n\n let iscellmenu, isrowmenu, iscolmenu, isallmenu, ischartmenu, isimagemenu, istextshapemenu, isshapemenu, istextchartmenu;\n const seltype = cellinfo.asc_getSelectionType();\n const comments = cellinfo.asc_getComments(); //prohibit adding multiple comments in one cell;\n const isSolvedComment = comments?.length && comments[0].asc_getSolved();\n\n switch (seltype) {\n case Asc.c_oAscSelectionType.RangeCells: iscellmenu = true; break;\n case Asc.c_oAscSelectionType.RangeRow: isrowmenu = true; break;\n case Asc.c_oAscSelectionType.RangeCol: iscolmenu = true; break;\n case Asc.c_oAscSelectionType.RangeMax: isallmenu = true; break;\n case Asc.c_oAscSelectionType.RangeImage: isimagemenu = true; break;\n case Asc.c_oAscSelectionType.RangeShape: isshapemenu = true; break;\n case Asc.c_oAscSelectionType.RangeChart: ischartmenu = true; break;\n case Asc.c_oAscSelectionType.RangeChartText: istextchartmenu = true; break;\n case Asc.c_oAscSelectionType.RangeShapeText: istextshapemenu = true; break;\n }\n\n itemsIcon.push({\n event: 'copy',\n icon: 'icon-copy'\n });\n \n if (iscellmenu && cellinfo.asc_getHyperlink()) {\n itemsText.push({\n caption: _t.menuOpenLink,\n event: 'openlink'\n });\n \n if(!isVersionHistoryMode) {\n itemsText.push({\n caption: t(\"ContextMenu.menuEditLink\"),\n event: 'editlink'\n });\n }\n }\n\n if(!isDisconnected && !isVersionHistoryMode) {\n if (canViewComments && comments && comments.length && ((!isSolvedComment && !isResolvedComments) || isResolvedComments)) {\n itemsText.push({\n caption: _t.menuViewComment,\n event: 'viewcomment'\n });\n }\n\n if (iscellmenu && !api.isCellEdited && isRestrictedEdit && canCoAuthoring && canComments && comments && comments.length<1) {\n itemsText.push({\n caption: _t.menuAddComment,\n event: 'addcomment'\n });\n }\n }\n\n if(isCanFillHandle) {\n itemsText.push({\n caption: t('ContextMenu.menuAutofill'),\n event: 'autofillCells'\n });\n }\n\n return itemsIcon.concat(itemsText);\n }\n }\n\n checkShapeSelection() {\n const objects = this.props.objects;\n const focusOn = this.props.focusOn;\n const contextMenuElem = document.querySelector('#idx-context-menu-popover');\n\n if(objects?.indexOf('shape') > -1 && focusOn === 'obj') {\n contextMenuElem.style.top = `${+(contextMenuElem.style.top.replace(/px$/, '')) - 40}px`;\n }\n }\n\n onApiMouseMove(dataarray) {\n const tipHeight = 20;\n let index_locked,\n index_foreign,\n editorOffset = $$(\"#editor_sdk\").offset(),\n XY = [ editorOffset.left - $(window).scrollLeft(), editorOffset.top - $(window).scrollTop()];\n\n for (let i = dataarray.length; i > 0; i--) {\n if (dataarray[i-1].asc_getType() === Asc.c_oAscMouseMoveType.LockedObject) index_locked = i;\n if (dataarray[i-1].asc_getType() === Asc.c_oAscMouseMoveType.ForeignSelect) index_foreign = i;\n }\n\n if (this.isOpenWindowUser) {\n this.timer = setTimeout(() => $$('.username-tip').remove(), 1500);\n this.isOpenWindowUser = false;\n } else {\n clearTimeout(this.timer);\n $$('.username-tip').remove();\n }\n\n if (index_locked && this.isUserVisible(dataarray[index_locked-1].asc_getUserId())) {\n let data = dataarray[index_locked - 1],\n X = data.asc_getX(),\n Y = data.asc_getY(),\n src = $$(``);\n\n src.css({\n height : tipHeight + 'px',\n position : 'absolute',\n zIndex : '5000',\n visibility : 'visible',\n });\n\n src.text(this.getUserName(data.asc_getUserId()));\n src.addClass('active');\n $$(document.body).append(src);\n\n let showPoint = [ ($$(window).width() - (X + XY[0])), Y + XY[1] ];\n\n if ( $$(window).width() - showPoint[0] < src.outerWidth() ) {\n src.css({\n left: '0px',\n top: (showPoint[1] - tipHeight) + 'px',\n });\n } else {\n src.css({\n right: showPoint[0] + 'px',\n top: showPoint[1] - 1 + 'px',\n });\n }\n this.isOpenWindowUser = true;\n }\n\n if(index_foreign && this.isUserVisible(dataarray[index_foreign-1].asc_getUserId())) {\n let data = dataarray[index_foreign - 1],\n src = $$(``),\n color = data.asc_getColor(),\n foreignSelectX = data.asc_getX(),\n foreignSelectY = data.asc_getY();\n \n src.css({\n height : tipHeight + 'px',\n position : 'absolute',\n zIndex : '5000',\n visibility : 'visible',\n 'background-color': '#'+Common.Utils.ThemeColor.getHexColor(color.get_r(), color.get_g(), color.get_b())\n });\n\n src.text(this.getUserName(data.asc_getUserId()));\n src.addClass('active');\n $$(document.body).append(src);\n\n if ( foreignSelectX + src.outerWidth() > $$(window).width() ) {\n src.css({\n left: foreignSelectX - src.outerWidth() + 'px',\n top: (foreignSelectY + XY[1] - tipHeight) + 'px',\n });\n } else {\n src.css({\n left: foreignSelectX + 'px',\n top: (foreignSelectY + XY[1] - tipHeight) + 'px',\n });\n }\n this.isOpenWindowUser = true;\n }\n }\n\n initExtraItems () {\n return (this.extraItems && this.extraItems.length > 0 ? this.extraItems : []);\n }\n}\n\nconst _ContextMenu = withTranslation()(ContextMenu);\n_ContextMenu.closeContextMenu = ContextMenu.closeContextMenu;\nexport { _ContextMenu as default };","import React, {Fragment} from 'react';\nimport {NavLeft, NavRight, Link} from 'framework7-react';\nimport { Device } from '../../../../common/mobile/utils/device';\nimport EditorUIController from '../lib/patch'\nimport { useTranslation } from 'react-i18next';\n\nconst ToolbarView = props => {\n const { t } = useTranslation();\n const isDisconnected = props.isDisconnected;\n const wsProps = props.wsProps;\n const focusOn = props.focusOn;\n const isShapeLocked = props.isShapeLocked;\n const undo_box = props.isEdit && EditorUIController.toolbarOptions ? EditorUIController.toolbarOptions.getUndoRedo({\n disabledUndo: !props.isCanUndo || isDisconnected,\n disabledRedo: !props.isCanRedo || isDisconnected,\n onUndoClick: props.onUndo,\n onRedoClick: props.onRedo\n }) : null;\n const docTitle = props.docTitle;\n const isVersionHistoryMode = props.isVersionHistoryMode;\n const isOpenModal = props.isOpenModal;\n\n return (\n \n \n {(props.isShowBack && !isVersionHistoryMode) && Common.Notifications.trigger('goback')}>}\n {isVersionHistoryMode ? {\n e.preventDefault();\n props.closeHistory();\n }}>{t(\"Toolbar.textCloseHistory\")} : null}\n {(Device.ios && !isVersionHistoryMode) && undo_box}\n \n {(!Device.phone && !isVersionHistoryMode) && \n props.changeTitleHandler()} style={{width: '71%'}}>\n {docTitle}\n
\n }\n \n {(Device.android && !isVersionHistoryMode) && undo_box}\n {(props.showEditDocument && !isVersionHistoryMode) &&\n \n }\n {(props.isEdit && EditorUIController.toolbarOptions && !isVersionHistoryMode) && EditorUIController.toolbarOptions.getEditOptions({\n disabled: props.disabledEditControls || props.disabledControls || isDisconnected || isOpenModal,\n wsProps,\n focusOn,\n isShapeLocked,\n onEditClick: () => props.openOptions('edit'),\n onAddClick: () => props.openOptions('add')\n })}\n {Device.phone ? null : }\n {props.displayCollaboration && window.matchMedia(\"(min-width: 360px)\").matches && !isVersionHistoryMode ? props.openOptions('coauth')}> : null}\n {isVersionHistoryMode ? props.openOptions('history')}> : null}\n props.openOptions('settings')}>\n \n \n )\n};\n\nexport default ToolbarView;","import React, { useEffect, useState } from 'react';\nimport { inject, observer } from 'mobx-react';\nimport { f7 } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport ToolbarView from \"../view/Toolbar\";\nimport { Device } from '../../../../common/mobile/utils/device';\n\nconst ToolbarController = inject('storeAppOptions', 'users', 'storeSpreadsheetInfo', 'storeFocusObjects', 'storeToolbarSettings', 'storeWorksheets', 'storeVersionHistory')(observer(props => {\n const {t} = useTranslation();\n const _t = t(\"Toolbar\", { returnObjects: true });\n const storeVersionHistory = props.storeVersionHistory;\n const storeSpreadsheetInfo = props.storeSpreadsheetInfo;\n const isVersionHistoryMode = storeVersionHistory.isVersionHistoryMode;\n\n const storeWorksheets = props.storeWorksheets;\n const wsProps = storeWorksheets.wsProps;\n\n const appOptions = props.storeAppOptions;\n const isDisconnected = props.users.isDisconnected;\n\n const storeFocusObjects = props.storeFocusObjects;\n const focusOn = storeFocusObjects.focusOn;\n const isObjectLocked = storeFocusObjects.isLocked;\n const isShapeLocked = storeFocusObjects.isLockedShape;\n const isEditCell = storeFocusObjects.isEditCell;\n const editFormulaMode = storeFocusObjects.editFormulaMode;\n\n const displayCollaboration = props.users.hasEditUsers || appOptions.canViewComments;\n const docTitle = storeSpreadsheetInfo.dataDoc?.title ?? '';\n const docExt = storeSpreadsheetInfo.dataDoc?.fileType ?? '';\n \n const showEditDocument = !appOptions.isEdit && appOptions.canEdit && appOptions.canRequestEditRights;\n\n const storeToolbarSettings = props.storeToolbarSettings;\n const isCanUndo = storeToolbarSettings.isCanUndo;\n const isCanRedo = storeToolbarSettings.isCanRedo;\n const disabledControls = storeToolbarSettings.disabledControls;\n const disabledEditControls = storeToolbarSettings.disabledEditControls;\n const disabledSettings = storeToolbarSettings.disabledSettings;\n\n useEffect(() => {\n Common.Gateway.on('init', loadConfig);\n Common.Notifications.on('toolbar:activatecontrols', activateControls);\n Common.Notifications.on('toolbar:deactivateeditcontrols', deactivateEditControls);\n Common.Notifications.on('goback', goBack);\n Common.Notifications.on('close', onClose);\n Common.Notifications.on('sheet:active', onApiActiveSheetChanged);\n\n if (isDisconnected) {\n f7.popover.close();\n f7.sheet.close();\n f7.popup.close();\n }\n\n return () => {\n Common.Notifications.off('toolbar:activatecontrols', activateControls);\n Common.Notifications.off('toolbar:deactivateeditcontrols', deactivateEditControls);\n Common.Notifications.off('goback', goBack);\n Common.Notifications.off('close', onClose);\n Common.Notifications.off('sheet:active', onApiActiveSheetChanged);\n }\n });\n\n // Back button\n const [isShowBack, setShowBack] = useState(appOptions.canBackToFolder);\n const loadConfig = (data) => {\n if (data && data.config && data.config.canBackToFolder !== false &&\n data.config.customization && data.config.customization.goback) {\n const canback = data.config.customization.close === undefined ?\n data.config.customization.goback.url || data.config.customization.goback.requestClose && data.config.canRequestClose :\n data.config.customization.goback.url && !data.config.customization.goback.requestClose;\n canback && setShowBack(true);\n }\n };\n\n const onRequestClose = () => {\n const api = Common.EditorApi.get();\n\n if (api.asc_isDocumentModified()) {\n api.asc_stopSaving();\n\n f7.dialog.create({\n title : _t.dlgLeaveTitleText,\n text : _t.dlgLeaveMsgText,\n verticalButtons: true,\n buttons : [\n {\n text: _t.leaveButtonText,\n onClick: () => {\n api.asc_undoAllChanges();\n api.asc_continueSaving();\n Common.Gateway.requestClose();\n }\n },\n {\n text: _t.stayButtonText,\n bold: true,\n onClick: () => {\n api.asc_continueSaving();\n }\n }\n ]\n }).open();\n } else {\n Common.Gateway.requestClose();\n }\n };\n\n const goBack = (current) => {\n if (appOptions.customization.goback.requestClose && appOptions.canRequestClose) {\n onRequestClose();\n } else {\n const href = appOptions.customization.goback.url;\n\n if (!current && appOptions.customization.goback.blank !== false) {\n window.open(href, \"_blank\");\n } else {\n parent.location.href = href;\n }\n }\n }\n\n const onClose = () => {\n onRequestClose();\n }\n\n const onUndo = () => {\n const api = Common.EditorApi.get();\n if (api) {\n api.asc_Undo();\n }\n };\n\n const onRedo = () => {\n const api = Common.EditorApi.get();\n if (api) {\n api.asc_Redo();\n }\n }\n\n const onApiActiveSheetChanged = (index) => {\n Common.Notifications.trigger('comments:filterchange', ['doc', 'sheet' + Common.EditorApi.get().asc_getWorksheetId(index)], false );\n };\n\n const deactivateEditControls = (enableDownload) => {\n storeToolbarSettings.setDisabledEditControls(true);\n if (enableDownload) {\n //DE.getController('Settings').setMode({isDisconnected: true, enableDownload: enableDownload});\n } else {\n storeToolbarSettings.setDisabledSettings(true);\n }\n };\n \n const activateControls = () => {\n storeToolbarSettings.setDisabledControls(false);\n };\n\n const onEditDocument = () => {\n Common.Gateway.requestEditRights();\n };\n\n const closeHistory = () => {\n Common.Gateway.requestHistoryClose();\n }\n\n const changeTitleHandler = () => {\n if(!appOptions.canRename) return;\n\n const api = Common.EditorApi.get();\n api.asc_enableKeyEvents(true);\n\n f7.dialog.create({\n title: t('Toolbar.textRenameFile'),\n text : t('Toolbar.textEnterNewFileName'),\n content: Device.ios ?\n `\n \n
` : \n ``,\n cssClass: 'dlg-adv-options',\n buttons: [\n {\n text: t('View.Edit.textCancel')\n },\n {\n text: t('View.Edit.textOk'),\n cssClass: 'btn-change-title',\n bold: true,\n close: false,\n onClick: () => {\n const titleFieldValue = document.querySelector('#modal-title').value;\n\n if(titleFieldValue.trim().length) {\n changeTitle(titleFieldValue);\n f7.dialog.close();\n }\n }\n }\n ],\n on: {\n opened: () => {\n const nameDoc = docTitle.split('.')[0];\n const titleField = document.querySelector('#modal-title');\n const btnChangeTitle = document.querySelector('.btn-change-title');\n\n titleField.value = nameDoc;\n titleField.focus();\n titleField.select();\n\n titleField.addEventListener('input', () => {\n if(titleField.value.trim().length) {\n btnChangeTitle.classList.remove('disabled');\n } else {\n btnChangeTitle.classList.add('disabled');\n }\n });\n }\n }\n }).open();\n }\n\n const cutDocName = name => {\n if(name.length <= docExt.length) return name;\n const idx = name.length - docExt.length;\n\n return name.substring(idx) == docExt ? name.substring(0, idx) : name;\n };\n\n const changeTitle = (name) => {\n const api = Common.EditorApi.get();\n const currentTitle = `${name}.${docExt}`;\n let formatName = name.trim();\n\n if(formatName.length > 0 && cutDocName(currentTitle) !== formatName) {\n if(/[\\t*\\+:\\\"<>?|\\\\\\\\/]/gim.test(formatName)) {\n f7.dialog.create({\n title: t('View.Edit.notcriticalErrorTitle'),\n text: t('View.Edit.textInvalidName') + '*+:\\\"<>?|\\/',\n buttons: [\n {\n text: t('View.Edit.textOk'),\n close: true\n }\n ]\n }).open();\n } else {\n const wopi = appOptions.wopi;\n formatName = cutDocName(formatName);\n\n if(wopi) {\n api.asc_wopi_renameFile(formatName);\n } else {\n Common.Gateway.requestRename(formatName);\n }\n\n const newTitle = `${formatName}.${docExt}`;\n storeSpreadsheetInfo.changeTitle(newTitle);\n }\n }\n }\n\n return (\n \n )\n}));\n\nexport {ToolbarController as Toolbar};","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, getSlots, noUndefinedProps, emit } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7ready, f7 } from '../shared/f7.js';\nimport { watchProp } from '../shared/watch-prop.js';\n\n\nconst TextEditor = /*#__PURE__*/forwardRef((props, ref) => {\n const f7TextEditor = useRef(null);\n const {\n className,\n id,\n style,\n mode,\n value,\n buttons,\n customButtons,\n dividers,\n imageUrlText,\n linkUrlText,\n placeholder,\n clearFormattingOnPaste,\n resizable = false\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const onChange = (editor, editorValue) => {\n emit(props, 'textEditorChange', editorValue);\n };\n const onInput = (editor, editorValue) => {\n emit(props, 'textEditorInput', editorValue);\n };\n const onFocus = () => {\n emit(props, 'textEditorFocus');\n };\n const onBlur = () => {\n emit(props, 'textEditorBlur');\n };\n const onButtonClick = (editor, button) => {\n emit(props, 'textEditorButtonClick', button);\n };\n const onKeyboardOpen = () => {\n emit(props, 'textEditorKeyboardOpen');\n };\n const onKeyboardClose = () => {\n emit(props, 'textEditorKeyboardClose');\n };\n const onPopoverOpen = () => {\n emit(props, 'textEditorPopoverOpen');\n };\n const onPopoverClose = () => {\n emit(props, 'textEditorPopoverClose');\n };\n const onInsertLink = (editor, url) => {\n emit(props, 'textEditorInsertLink', url);\n };\n const onInsertImage = (editor, url) => {\n emit(props, 'textEditorInsertImage', url);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n f7TextEditor: () => f7TextEditor.current\n }));\n watchProp(value, newValue => {\n if (f7TextEditor.current) {\n f7TextEditor.current.setValue(newValue);\n }\n });\n const onMount = () => {\n const params = noUndefinedProps({\n el: elRef.current,\n mode,\n value,\n buttons,\n customButtons,\n dividers,\n imageUrlText,\n linkUrlText,\n placeholder,\n clearFormattingOnPaste,\n on: {\n change: onChange,\n input: onInput,\n focus: onFocus,\n blur: onBlur,\n buttonClick: onButtonClick,\n keyboardOpen: onKeyboardOpen,\n keyboardClose: onKeyboardClose,\n popoverOpen: onPopoverOpen,\n popoverClose: onPopoverClose,\n insertLink: onInsertLink,\n insertImage: onInsertImage\n }\n });\n f7ready(() => {\n f7TextEditor.current = f7.textEditor.create(params);\n });\n };\n const onDestroy = () => {\n if (f7TextEditor.current && f7TextEditor.current.destroy) {\n f7TextEditor.current.destroy();\n }\n f7TextEditor.current = null;\n };\n useIsomorphicLayoutEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n const slots = getSlots(props);\n const classes = classNames(className, 'text-editor', resizable && 'text-editor-resizable', colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n ref: elRef,\n id: id,\n style: style,\n className: classes\n }, extraAttrs), slots['root-start'], /*#__PURE__*/React.createElement(\"div\", {\n className: \"text-editor-content\",\n contentEditable: true\n }, slots.default), slots['root-end'], slots.root);\n});\nTextEditor.displayName = 'f7-text-editor';\nexport default TextEditor;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle, useState, useContext } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, emit, getSlots, extend } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7ready, f7 } from '../shared/f7.js';\nimport TextEditor from './text-editor.js';\nimport { watchProp } from '../shared/watch-prop.js';\nimport { ListContext } from '../shared/list-context.js';\n\n\nconst ListInput = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n sortable,\n media,\n dropdown = 'auto',\n wrap = true,\n // Inputs\n input: renderInput = true,\n type = 'text',\n name,\n value,\n defaultValue,\n inputmode,\n readonly,\n required,\n disabled,\n placeholder,\n inputId,\n size,\n accept,\n autocomplete,\n autocorrect,\n autocapitalize,\n spellcheck,\n autofocus,\n autosave,\n max,\n min,\n step,\n maxlength,\n minlength,\n multiple,\n inputStyle,\n pattern,\n validate,\n validateOnBlur,\n onValidate,\n tabindex,\n resizable,\n clearButton,\n // Form\n noFormStoreData,\n noStoreData,\n ignoreStoreData,\n // Error, Info\n errorMessage,\n errorMessageForce,\n info,\n // Outline\n outline,\n // Label\n label,\n floatingLabel,\n // Datepicker\n calendarParams,\n // Colorpicker\n colorPickerParams,\n // Text editor\n textEditorParams\n } = props;\n const [inputInvalid, setInputInvalid] = useState(false);\n const [inputFocused, setInputFocused] = useState(false);\n const listContext = useContext(ListContext);\n const {\n listIsSortable = false\n } = listContext || {};\n const extraAttrs = getExtraAttrs(props);\n const f7Calendar = useRef(null);\n const f7ColorPicker = useRef(null);\n const elRef = useRef(null);\n const inputElRef = useRef(null);\n const itemContentElRef = useRef(null);\n const updateInputOnDidUpdate = useRef(false);\n const getDomValue = () => {\n if (!inputElRef.current) return undefined;\n return inputElRef.current.value;\n };\n const isInputHasValue = () => {\n if (type === 'datepicker' && Array.isArray(value) && value.length === 0) {\n return false;\n }\n const domValue = getDomValue();\n return typeof value === 'undefined' ? domValue || domValue === 0 : value || value === 0;\n };\n const validateInput = () => {\n if (!f7 || !inputElRef.current) return;\n const validity = inputElRef.current.validity;\n if (!validity) return;\n if (!validity.valid) {\n if (onValidate) onValidate(false);\n if (inputInvalid !== true) {\n setInputInvalid(true);\n }\n } else {\n if (onValidate) onValidate(true);\n if (inputInvalid !== false) {\n setInputInvalid(false);\n }\n }\n };\n const onTextareaResize = event => {\n emit(props, 'textareaResize', event);\n };\n const onInputNotEmpty = event => {\n emit(props, 'inputNotEmpty', event);\n };\n const onInputEmpty = event => {\n emit(props, 'inputEmpty', event);\n };\n const onInputClear = event => {\n emit(props, 'inputClear', event);\n };\n const onInput = function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n emit(props, 'input', ...args);\n if (!(validateOnBlur || validateOnBlur === '') && (validate || validate === '') && inputElRef.current) {\n validateInput(inputElRef.current);\n }\n };\n const onFocus = function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n emit(props, 'focus', ...args);\n setInputFocused(true);\n };\n const onBlur = function () {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n emit(props, 'blur', ...args);\n if ((validate || validate === '' || validateOnBlur || validateOnBlur === '') && inputElRef.current) {\n validateInput(inputElRef.current);\n }\n setInputFocused(false);\n };\n const onChange = function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n emit(props, 'change', ...args);\n if (type === 'texteditor') {\n emit(props, 'textEditorChange', args[0]);\n }\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n const onMount = () => {\n if (!elRef.current && !itemContentElRef.current) return;\n f7ready(() => {\n if (!inputElRef.current) return;\n inputElRef.current.addEventListener('input:notempty', onInputNotEmpty, false);\n inputElRef.current.addEventListener('textarea:resize', onTextareaResize, false);\n inputElRef.current.addEventListener('input:empty', onInputEmpty, false);\n inputElRef.current.addEventListener('input:clear', onInputClear, false);\n if (type === 'datepicker') {\n f7Calendar.current = f7.calendar.create({\n inputEl: inputElRef.current,\n value,\n on: {\n change(calendar, calendarValue) {\n emit(props, 'calendarChange', calendarValue);\n }\n },\n ...(calendarParams || {})\n });\n }\n if (type === 'colorpicker') {\n f7ColorPicker.current = f7.colorPicker.create({\n inputEl: inputElRef.current,\n value,\n on: {\n change(colorPicker, colorPickerValue) {\n emit(props, 'colorpicker:change colorPickerChange', colorPickerValue);\n }\n },\n ...(colorPickerParams || {})\n });\n }\n if (!(validateOnBlur || validateOnBlur === '') && (validate || validate === '') && (typeof value !== 'undefined' && value !== null && value !== '' || typeof defaultValue !== 'undefined' && defaultValue !== null && defaultValue !== '')) {\n setTimeout(() => {\n validateInput();\n }, 0);\n }\n if (type === 'textarea' && resizable) {\n f7.input.resizeTextarea(inputElRef.current);\n }\n });\n };\n const onDestroy = () => {\n if (inputElRef.current) {\n inputElRef.current.removeEventListener('input:notempty', onInputNotEmpty, false);\n inputElRef.current.removeEventListener('textarea:resize', onTextareaResize, false);\n inputElRef.current.removeEventListener('input:empty', onInputEmpty, false);\n inputElRef.current.removeEventListener('input:clear', onInputClear, false);\n }\n if (f7Calendar.current && f7Calendar.current.destroy) {\n f7Calendar.current.destroy();\n f7Calendar.current = null;\n }\n if (f7ColorPicker.current && f7ColorPicker.current.destroy) {\n f7ColorPicker.current.destroy();\n f7ColorPicker.current = null;\n }\n };\n useIsomorphicLayoutEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n useIsomorphicLayoutEffect(() => {\n if (!f7) return;\n if (updateInputOnDidUpdate.current) {\n if (!inputElRef.current) return;\n updateInputOnDidUpdate.current = false;\n if (validate && !validateOnBlur) {\n validateInput();\n }\n if (type === 'textarea' && resizable) {\n f7.input.resizeTextarea(inputElRef.current);\n }\n }\n });\n watchProp(colorPickerParams, newValue => {\n if (!f7 || !f7ColorPicker.current) return;\n extend(f7ColorPicker.current.params, newValue || {});\n });\n watchProp(calendarParams, newValue => {\n if (!f7 || !f7Calendar.current) return;\n extend(f7Calendar.current.params, newValue || {});\n });\n watchProp(value, newValue => {\n if (!f7) return;\n updateInputOnDidUpdate.current = true;\n if (f7Calendar.current) {\n f7Calendar.current.setValue(newValue);\n }\n if (f7ColorPicker.current) {\n f7ColorPicker.current.setValue(newValue);\n }\n });\n const slots = getSlots(props);\n const domValue = getDomValue();\n const inputHasValue = isInputHasValue();\n const isSortableComputed = sortable === true || sortable === false ? sortable : listIsSortable;\n let inputEl;\n const createInput = (InputTag, children) => {\n const needsValue = type !== 'file' && type !== 'datepicker' && type !== 'colorpicker';\n const needsType = InputTag === 'input';\n let inputType = type;\n if (inputType === 'datepicker' || inputType === 'colorpicker') {\n inputType = 'text';\n }\n const inputClassName = classNames({\n resizable: inputType === 'textarea' && resizable,\n 'no-store-data': noFormStoreData || noStoreData || ignoreStoreData,\n 'input-invalid': errorMessage && errorMessageForce || inputInvalid,\n 'input-with-value': inputHasValue,\n 'input-focused': inputFocused\n });\n let inputValue;\n if (needsValue) {\n if (typeof value !== 'undefined') inputValue = value;else inputValue = domValue;\n }\n const valueProps = {};\n if (type !== 'datepicker' && type !== 'colorpicker') {\n if ('value' in props) valueProps.value = inputValue;\n if ('defaultValue' in props) valueProps.defaultValue = defaultValue;\n }\n return /*#__PURE__*/React.createElement(InputTag, _extends({\n ref: inputElRef,\n style: inputStyle,\n name: name,\n type: needsType ? inputType : undefined,\n placeholder: placeholder,\n inputMode: inputmode,\n id: inputId,\n size: size,\n accept: accept,\n autoComplete: autocomplete,\n autoCorrect: autocorrect,\n autoCapitalize: autocapitalize,\n spellCheck: spellcheck,\n autoFocus: autofocus,\n autoSave: autosave,\n disabled: disabled,\n max: max,\n maxLength: maxlength,\n min: min,\n minLength: minlength,\n step: step,\n multiple: multiple,\n readOnly: readonly,\n required: required,\n pattern: pattern,\n validate: typeof validate === 'string' && validate.length ? validate : undefined,\n \"data-validate\": validate === true || validate === '' || validateOnBlur === true || validateOnBlur === '' ? true : undefined,\n \"data-validate-on-blur\": validateOnBlur === true || validateOnBlur === '' ? true : undefined,\n tabIndex: tabindex,\n \"data-error-message\": errorMessageForce ? undefined : errorMessage,\n className: inputClassName,\n onFocus: onFocus,\n onBlur: onBlur,\n onInput: onInput,\n onChange: onChange\n }, valueProps), children);\n };\n if (renderInput) {\n if (type === 'select' || type === 'textarea' || type === 'file') {\n if (type === 'select') {\n inputEl = createInput('select', slots.default);\n } else if (type === 'file') {\n inputEl = createInput('input');\n } else {\n inputEl = createInput('textarea');\n }\n } else if (type === 'texteditor') {\n inputEl = /*#__PURE__*/React.createElement(TextEditor, _extends({\n value: value,\n resizable: resizable,\n placeholder: placeholder,\n onTextEditorFocus: onFocus,\n onTextEditorBlur: onBlur,\n onTextEditorInput: onInput,\n onTextEditorChange: onChange\n }, textEditorParams || {}));\n } else {\n inputEl = createInput('input');\n }\n }\n const hasErrorMessage = !!errorMessage || slots['error-message'] && slots['error-message'].length;\n const ItemContent = /*#__PURE__*/React.createElement(\"div\", {\n ref: itemContentElRef,\n className: classNames('item-content item-input', !wrap && className, !wrap && {\n disabled\n }, !wrap && colorClasses(props), {\n 'item-input-outline': outline,\n 'item-input-focused': inputFocused,\n 'item-input-with-info': !!info || slots.info && slots.info.length,\n 'item-input-with-value': inputHasValue,\n 'item-input-with-error-message': hasErrorMessage && errorMessageForce || inputInvalid,\n 'item-input-invalid': hasErrorMessage && errorMessageForce || inputInvalid\n })\n }, slots['content-start'], (media || slots.media) && /*#__PURE__*/React.createElement(\"div\", {\n className: \"item-media\"\n }, media && /*#__PURE__*/React.createElement(\"img\", {\n src: media\n }), slots.media), /*#__PURE__*/React.createElement(\"div\", {\n className: \"item-inner\"\n }, slots['inner-start'], (label || slots.label) && /*#__PURE__*/React.createElement(\"div\", {\n className: classNames('item-title item-label', {\n 'item-floating-label': floatingLabel\n })\n }, label, slots.label), /*#__PURE__*/React.createElement(\"div\", {\n className: classNames('item-input-wrap', {\n 'input-dropdown': dropdown === 'auto' ? type === 'select' : dropdown\n })\n }, inputEl, slots.input, hasErrorMessage && errorMessageForce && /*#__PURE__*/React.createElement(\"div\", {\n className: \"item-input-error-message\"\n }, errorMessage, slots['error-message']), clearButton && /*#__PURE__*/React.createElement(\"span\", {\n className: \"input-clear-button\"\n }), (info || slots.info) && /*#__PURE__*/React.createElement(\"div\", {\n className: \"item-input-info\"\n }, info, slots.info)), slots.inner, slots['inner-end']), slots.content, slots['content-end']);\n if (!wrap) {\n return ItemContent;\n }\n return /*#__PURE__*/React.createElement(\"li\", _extends({\n ref: elRef,\n id: id,\n style: style,\n className: classNames(className, {\n disabled\n }, colorClasses(props))\n }, extraAttrs), slots['root-start'], ItemContent, isSortableComputed && /*#__PURE__*/React.createElement(\"div\", {\n className: \"sortable-handler\"\n }), slots.root, slots['root-end']);\n});\nListInput.displayName = 'f7-list-input';\nexport default ListInput;","import React, {Fragment, useState} from 'react';\nimport {Page, Navbar, BlockTitle, List, ListItem, ListInput, ListButton, Icon, Link, NavLeft, NavRight, NavTitle, f7} from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport {Device} from \"../../../../../common/mobile/utils/device\";\n\nconst PageTypeLink = ({curType, changeType, isNavigate}) => {\n const { t } = useTranslation();\n const _t = t('View.Add', {returnObjects: true});\n const [typeLink, setTypeLink] = useState(curType);\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n {setTypeLink('ext'); changeType('ext');}}>\n {setTypeLink('int'); changeType('int');}}>\n
\n \n )\n};\n\nconst PageSheet = ({curSheet, sheets, changeSheet, isNavigate}) => {\n const { t } = useTranslation();\n const _t = t('View.Add', {returnObjects: true});\n const [stateSheet, setSheet] = useState(curSheet.value);\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n {sheets.map((sheet) => {\n return (\n {\n setSheet(sheet.value);\n changeSheet(sheet);\n }}\n />\n )\n })}\n\n
\n \n )\n};\n\nconst AddLink = props => {\n const isIos = Device.ios;\n const { t } = useTranslation();\n const _t = t('View.Add', {returnObjects: true});\n const isNavigate = props.isNavigate;\n\n const [typeLink, setTypeLink] = useState('ext');\n const textType = typeLink === 'ext' ? _t.textExternalLink : _t.textInternalDataRange;\n const changeType = (newType) => {\n setTypeLink(newType);\n };\n\n const [link, setLink] = useState('');\n\n let displayText = props.displayText;\n const displayDisabled = displayText === 'locked';\n displayText = displayDisabled ? _t.textSelectedRange : displayText;\n \n const [stateDisplayText, setDisplayText] = useState(displayText);\n const [stateAutoUpdate, setAutoUpdate] = useState(!stateDisplayText ? true : false);\n const [screenTip, setScreenTip] = useState('');\n\n const activeSheet = props.activeSheet;\n const [curSheet, setSheet] = useState(activeSheet);\n const changeSheet = (sheet) => {\n setSheet(sheet);\n };\n\n const [range, setRange] = useState('');\n\n return (\n \n \n \n {\n isNavigate ? f7.views.current.router.back() : props.closeModal('#add-link-popup', '#add-link-popover');\n }}>\n {Device.android && }\n \n \n {t('View.Add.textLinkSettings')}\n \n {\n props.onInsertLink(typeLink === 'ext' ?\n {type: 'ext', url: link, text: stateDisplayText} :\n {type: 'int', url: range, sheet: curSheet.caption, text: stateDisplayText});\n }} text={Device.ios ? t('View.Add.textDone') : ''}>\n {Device.android && }\n \n \n \n \n {props.allowInternal &&\n \n }\n {typeLink === 'ext' &&\n {\n setLink(event.target.value);\n if(stateAutoUpdate && !displayDisabled) setDisplayText(event.target.value);\n }} \n />\n }\n {typeLink === 'int' &&\n \n }\n {typeLink === 'int' &&\n {setRange(event.target.value)}}\n />\n }\n {\n setDisplayText(event.target.value);\n setAutoUpdate(event.target.value == ''); \n }}\n />\n {setScreenTip(event.target.value)}}\n />\n
\n \n )\n};\n\nexport {AddLink, PageTypeLink, PageSheet};","import React, {Component} from 'react';\nimport { f7, Popup, Popover, View } from 'framework7-react';\nimport {Device} from '../../../../../common/mobile/utils/device';\nimport {withTranslation} from 'react-i18next';\n\nimport {AddLink, PageTypeLink, PageSheet} from '../../view/add/AddLink';\n\nconst routes = [\n {\n path: '/add-link-type/',\n component: PageTypeLink\n },\n {\n path: '/add-link-sheet/',\n component: PageSheet\n }\n];\n\nclass AddLinkController extends Component {\n constructor (props) {\n super(props);\n this.onInsertLink = this.onInsertLink.bind(this);\n\n const api = Common.EditorApi.get();\n const cell = api.asc_getCellInfo();\n const celltype = cell.asc_getSelectionType();\n\n this.allowInternal = (celltype !== Asc.c_oAscSelectionType.RangeImage && celltype !== Asc.c_oAscSelectionType.RangeShape &&\n celltype !== Asc.c_oAscSelectionType.RangeShapeText && celltype !== Asc.c_oAscSelectionType.RangeChart &&\n celltype !== Asc.c_oAscSelectionType.RangeChartText);\n\n this.displayText = cell.asc_getLockText() ? 'locked' : cell.asc_getText();\n\n // sheets\n let items = [];\n let wsc = api.asc_getWorksheetsCount();\n const aws = api.asc_getActiveWorksheetIndex();\n if (wsc > 0) {\n items = [];\n while ( !(--wsc < 0) ) {\n if ( !api.asc_isWorksheetHidden(wsc) ) {\n items.unshift({\n value: wsc,\n caption: api.asc_getWorksheetName(wsc)\n });\n if (wsc === aws) {\n this.activeSheet = {\n value: wsc,\n caption: api.asc_getWorksheetName(wsc)\n }\n }\n }\n }\n this.sheets = items;\n }\n }\n\n onInsertLink (args) {\n const api = Common.EditorApi.get();\n const { t } = this.props;\n const _t = t(\"View.Add\", { returnObjects: true });\n\n const link = new Asc.asc_CHyperlink();\n let display = '';\n\n if (args.type == 'ext') {\n let url = args.url;\n const urltype = api.asc_getUrlType(url.trim());\n\n if (urltype===AscCommon.c_oAscUrlType.Invalid) {\n f7.dialog.create({\n title: _t.notcriticalErrorTitle,\n text: _t.txtNotUrl,\n buttons: [\n {\n text: t('View.Add.textOk')\n }\n ]\n }).open();\n return;\n }\n\n url = url.replace(/^\\s+|\\s+$/g, '');\n\n if (urltype!==AscCommon.c_oAscUrlType.Unsafe && !/(((^https?)|(^ftp)):\\/\\/)|(^mailto:)/i.test(url))\n url = (urltype===AscCommon.c_oAscUrlType.Email ? 'mailto:' : 'http://' ) + url;\n\n url = url.replace(new RegExp(\"%20\", 'g'), \" \");\n\n link.asc_setType(Asc.c_oAscHyperlinkType.WebLink);\n link.asc_setHyperlinkUrl(url);\n display = url;\n } else {\n const isValid = api.asc_checkDataRange(Asc.c_oAscSelectionDialogType.FormatTable, args.url, false);\n\n if (isValid !== Asc.c_oAscError.ID.No) {\n f7.dialog.alert(_t.textInvalidRange, _t.notcriticalErrorTitle);\n return;\n }\n\n link.asc_setType(Asc.c_oAscHyperlinkType.RangeLink);\n link.asc_setSheet(args.sheet);\n link.asc_setRange(args.url);\n\n display = args.sheet + '!' + args.url;\n }\n\n if(this.displayText !== 'locked') {\n link.asc_setText(args.text == null ? null : !!args.text ? args.text : display);\n }\n\n link.asc_setTooltip(args.tooltip);\n api.asc_insertHyperlink(link);\n \n if(this.props.isNavigate) {\n this.closeModal('.add-popup', '#add-popover');\n } else {\n this.closeModal('#add-link-popup', '#add-link-popover');\n }\n }\n\n closeModal(mobileSelector, tabletSelector) {\n if (Device.phone) {\n f7.popup.close(mobileSelector);\n } else {\n f7.popover.close(tabletSelector);\n }\n }\n\n componentDidMount() {\n if(!this.props.isNavigate) {\n if(Device.phone) {\n f7.popup.open('#add-link-popup', true);\n } else {\n f7.popover.open('#add-link-popover', '#btn-add');\n }\n }\n }\n\n render () {\n return (\n !this.props.isNavigate ?\n Device.phone ?\n \n :\n this.props.closeOptions('add-link')}>\n \n \n \n \n :\n \n )\n }\n}\n\nconst AddLinkWithTranslation = withTranslation()(AddLinkController);\n\nexport {AddLinkWithTranslation as AddLinkController};","import React, {useState, useEffect, Fragment} from 'react';\r\nimport {observer, inject} from \"mobx-react\";\r\nimport {f7, List, ListItem, Page, Navbar, NavRight, Icon, ListButton, ListInput, Link, NavLeft, NavTitle} from 'framework7-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {Device} from \"../../../../../common/mobile/utils/device\";\r\n\r\nconst PageEditTypeLink = ({curType, changeType, storeFocusObjects}) => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const [typeLink, setTypeLink] = useState(curType);\r\n\r\n const settings = !storeFocusObjects.focusOn ? [] : (storeFocusObjects.focusOn === 'obj' ? storeFocusObjects.objects : storeFocusObjects.selections);\r\n if (storeFocusObjects.focusOn === 'obj' || settings.indexOf('hyperlink') === -1) {\r\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {setTypeLink(1); changeType(1);}}>\r\n {setTypeLink(2); changeType(2);}}>\r\n
\r\n \r\n )\r\n};\r\n\r\nconst PageEditSheet = ({curSheet, sheets, changeSheet, storeFocusObjects}) => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const [stateSheet, setSheet] = useState(curSheet);\r\n\r\n const settings = !storeFocusObjects.focusOn ? [] : (storeFocusObjects.focusOn === 'obj' ? storeFocusObjects.objects : storeFocusObjects.selections);\r\n if (storeFocusObjects.focusOn === 'obj' || settings.indexOf('hyperlink') === -1) {\r\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {sheets.map(sheet => {\r\n return(\r\n {\r\n setSheet(sheet.caption);\r\n changeSheet(sheet.caption);\r\n }}\r\n />\r\n )\r\n })}\r\n\r\n
\r\n \r\n )\r\n};\r\n\r\nconst EditLink = props => {\r\n const isIos = Device.ios;\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const linkInfo = props.linkInfo;\r\n const isLock = props.isLock;\r\n const sheets = props.sheets;\r\n const currentSheet = props.currentSheet;\r\n const valueTypeLink = linkInfo.asc_getType();\r\n const valueLinkSheet = linkInfo.asc_getSheet();\r\n const getLinkSheet = () => sheets.find(sheet => sheet.caption === valueLinkSheet);\r\n const linkSheet = (valueTypeLink == Asc.c_oAscHyperlinkType.RangeLink) ? getLinkSheet() ? getLinkSheet().caption : '' : currentSheet;\r\n\r\n const [typeLink, setTypeLink] = useState(valueTypeLink);\r\n const textType = typeLink != Asc.c_oAscHyperlinkType.RangeLink ? _t.textExternalLink : _t.textInternalDataRange;\r\n\r\n const changeType = (newType) => {\r\n setTypeLink(newType);\r\n };\r\n \r\n const [link, setLink] = useState(linkInfo.asc_getHyperlinkUrl() ? linkInfo.asc_getHyperlinkUrl().replace(new RegExp(\" \", 'g'), \"%20\") : '');\r\n \r\n const displayText = isLock ? _t.textDefault : linkInfo.asc_getText();\r\n const [stateDisplayText, setDisplayText] = useState(displayText);\r\n \r\n const [screenTip, setScreenTip] = useState(linkInfo.asc_getTooltip());\r\n \r\n const [curSheet, setSheet] = useState(linkSheet);\r\n\r\n const changeSheet = (sheet) => {\r\n setSheet(sheet);\r\n };\r\n\r\n const valueRange = linkInfo.asc_getRange();\r\n const [range, setRange] = useState(valueRange || 'A1');\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n props.isNavigate ? f7.views.current.router.back() : props.closeModal();\r\n }}>\r\n {Device.android && }\r\n \r\n \r\n {t('View.Edit.textLinkSettings')}\r\n \r\n {\r\n props.onEditLink(typeLink === 1 ?\r\n {type: 1, url: link, text: stateDisplayText, tooltip: screenTip} :\r\n {type: 2, url: range, sheet: curSheet, text: stateDisplayText, tooltip: screenTip});\r\n }} text={Device.ios ? t('View.Edit.textDone') : ''}>\r\n {Device.android && }\r\n \r\n \r\n \r\n\r\n \r\n \r\n {typeLink != Asc.c_oAscHyperlinkType.RangeLink &&\r\n {setLink(event.target.value)}}\r\n className={isIos ? 'list-input-right' : ''}\r\n />\r\n }\r\n {typeLink == Asc.c_oAscHyperlinkType.RangeLink &&\r\n \r\n }\r\n {typeLink == Asc.c_oAscHyperlinkType.RangeLink &&\r\n {setRange(event.target.value)}}\r\n disabled={curSheet === '' && 'disabled'}\r\n className={isIos ? 'list-input-right' : ''}\r\n />\r\n }\r\n {setDisplayText(event.target.value)}}\r\n className={isIos ? 'list-input-right' : ''}\r\n />\r\n {setScreenTip(event.target.value)}}\r\n className={isIos ? 'list-input-right' : ''}\r\n />\r\n
\r\n \r\n {\r\n props.onRemoveLink();\r\n props.isNavigate ? f7.views.current.router.back() : props.closeModal();\r\n }}\r\n />\r\n
\r\n \r\n )\r\n};\r\n\r\nconst _PageEditTypeLink = inject(\"storeFocusObjects\")(observer(PageEditTypeLink));\r\nconst _PageEditSheet = inject(\"storeFocusObjects\")(observer(PageEditSheet));\r\n\r\nexport {\r\n EditLink,\r\n _PageEditTypeLink as PageEditTypeLink,\r\n _PageEditSheet as PageEditSheet\r\n};","import React, { Component } from 'react';\r\nimport { f7, Popup, Popover, View } from 'framework7-react';\r\nimport { Device } from '../../../../../common/mobile/utils/device';\r\nimport { withTranslation } from 'react-i18next';\r\n\r\nimport { EditLink, PageEditTypeLink, PageEditSheet} from '../../view/edit/EditLink';\r\n\r\nconst routes = [\r\n {\r\n path: '/edit-link-type/',\r\n component: PageEditTypeLink\r\n },\r\n {\r\n path: '/edit-link-sheet/',\r\n component: PageEditSheet\r\n }\r\n];\r\n\r\nclass EditLinkController extends Component {\r\n constructor (props) {\r\n super(props);\r\n this.onEditLink = this.onEditLink.bind(this);\r\n this.onRemoveLink = this.onRemoveLink.bind(this);\r\n\r\n const api = Common.EditorApi.get();\r\n const cellInfo = api.asc_getCellInfo();\r\n\r\n this.linkInfo = cellInfo.asc_getHyperlink();\r\n this.isLock = cellInfo.asc_getLockText();\r\n this.currentSheet = api.asc_getWorksheetName(api.asc_getActiveWorksheetIndex());\r\n \r\n // Sheets\r\n\r\n let items = [];\r\n let wsc = api.asc_getWorksheetsCount();\r\n\r\n if (wsc > 0) {\r\n items = [];\r\n while (!(--wsc < 0)) {\r\n if (!api.asc_isWorksheetHidden(wsc)) {\r\n items.unshift({\r\n value: wsc,\r\n caption: api.asc_getWorksheetName(wsc)\r\n });\r\n }\r\n }\r\n this.sheets = items;\r\n }\r\n }\r\n\r\n closeModal () {\r\n if ( Device.phone ) {\r\n f7.popup.close('#edit-link-popup');\r\n } else {\r\n f7.popover.close('#edit-link-popover');\r\n }\r\n }\r\n\r\n onEditLink(args) {\r\n const api = Common.EditorApi.get();\r\n const { t } = this.props;\r\n const _t = t(\"View.Edit\", {returnObjects: true});\r\n\r\n let linkProps = new Asc.asc_CHyperlink(),\r\n sheet = \"\",\r\n displayText = args.text,\r\n tip = args.tooltip,\r\n defaultDisplay = \"\";\r\n\r\n linkProps.asc_setType(args.type);\r\n\r\n if(args.type === Asc.c_oAscHyperlinkType.RangeLink) {\r\n let range = args.url,\r\n isValidRange = /^[A-Z]+[1-9]\\d*:[A-Z]+[1-9]\\d*$/.test(range);\r\n\r\n if (!isValidRange)\r\n isValidRange = /^[A-Z]+[1-9]\\d*$/.test(range);\r\n\r\n if (!isValidRange) {\r\n f7.dialog.alert(_t.textInvalidRange, _t.notcriticalErrorTitle);\r\n return;\r\n }\r\n\r\n sheet = args.sheet;\r\n\r\n linkProps.asc_setSheet(sheet);\r\n linkProps.asc_setRange(range);\r\n defaultDisplay = sheet + '!' + range;\r\n } else {\r\n let url = args.url.replace(/^\\s+|\\s+$/g,'');\r\n let urltype = api.asc_getUrlType(url.trim());\r\n\r\n if (urltype===AscCommon.c_oAscUrlType.Invalid) {\r\n f7.dialog.create({\r\n title: t('View.Edit.notcriticalErrorTitle'),\r\n text: t('View.Edit.textNotUrl'),\r\n buttons: [\r\n {\r\n text: t('View.Edit.textOk')\r\n }\r\n ]\r\n }).open();\r\n\r\n return;\r\n }\r\n\r\n if (urltype!==AscCommon.c_oAscUrlType.Unsafe && ! /(((^https?)|(^ftp)):\\/\\/)|(^mailto:)/i.test(url))\r\n url = ( (urltype===AscCommon.c_oAscUrlType.Email) ? 'mailto:' : 'http://' ) + url;\r\n\r\n url = url.replace(new RegExp(\"%20\",'g'),\" \");\r\n\r\n linkProps.asc_setHyperlinkUrl(url);\r\n defaultDisplay = url;\r\n }\r\n\r\n if (this.isLock) {\r\n linkProps.asc_setText(null);\r\n } else {\r\n if (!displayText) {\r\n displayText = defaultDisplay;\r\n }\r\n linkProps.asc_setText(displayText);\r\n }\r\n\r\n linkProps.asc_setTooltip(tip);\r\n\r\n api.asc_insertHyperlink(linkProps);\r\n this.props.isNavigate ? f7.views.current.router.back() : this.closeModal();\r\n \r\n }\r\n\r\n onRemoveLink() {\r\n const api = Common.EditorApi.get();\r\n api.asc_removeHyperlink();\r\n }\r\n\r\n componentDidMount() {\r\n if(!this.props.isNavigate) {\r\n if(Device.phone) {\r\n f7.popup.open('#edit-link-popup', true);\r\n } else {\r\n f7.popover.open('#edit-link-popover', '#btn-add');\r\n }\r\n }\r\n }\r\n\r\n render () {\r\n return (\r\n !this.props.isNavigate ?\r\n Device.phone ?\r\n \r\n :\r\n this.props.closeOptions('edit-link')}>\r\n \r\n \r\n \r\n \r\n : \r\n \r\n )\r\n }\r\n}\r\n\r\nconst EditLinkWithTranslation = withTranslation()(EditLinkController);\r\n\r\nexport {EditLinkWithTranslation as EditLinkController};","import React, { createContext, useEffect } from 'react';\nimport { LocalStorage } from \"../../utils/LocalStorage.mjs\";\nimport { inject, observer } from \"mobx-react\";\nimport { useTranslation } from 'react-i18next';\n\nexport const ThemesContext = createContext();\nexport const ThemesProvider = props => {\n const { t, ready } = useTranslation();\n const storeThemes = props.storeThemes;\n const themes = storeThemes.themes;\n const nameColors = storeThemes.nameColors;\n\n useEffect(() => {\n initTheme();\n }, []);\n\n useEffect(() => {\n if (ready) {\n const translations = getTranslationsThemes();\n storeThemes.setTranslationsThemes(translations);\n }\n }, [ready]);\n\n const getTranslationsThemes = () => {\n const translations = Object.keys(themes).reduce((acc, theme) => {\n acc[theme] = t(`Common.Themes.${theme}`);\n return acc;\n }, {});\n\n return translations;\n }\n\n const initTheme = () => {\n const clientTheme = LocalStorage.getItem(\"ui-theme\");\n const editorConfig = window.native?.editorConfig;\n\n storeThemes.setConfigSelectTheme(editorConfig?.theme?.select != false);\n setUITheme(clientTheme ? JSON.parse(clientTheme).type : editorConfig?.theme?.type);\n\n applyTheme();\n }\n\n const setUITheme = type => {\n if(type && type !== 'system') {\n const theme = themes[type];\n storeThemes.setColorTheme(theme);\n } else {\n setSystemTheme();\n }\n }\n\n const setSystemTheme = () => {\n let theme = themes.light;\n\n if(window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n theme = themes.dark;\n }\n\n storeThemes.setColorTheme(themes[\"system\"]);\n storeThemes.setSystemColorTheme(theme);\n }\n\n const getCurrentThemeColors = colors => {\n let outObject = {};\n const style = getComputedStyle(document.body);\n\n colors.forEach(item => {\n outObject[item] = style.getPropertyValue('--' + item).trim()\n });\n\n return outObject;\n }\n\n const changeTheme = key => {\n const theme = themes[key];\n const type = theme.type;\n\n LocalStorage.setItem(\"ui-theme\", JSON.stringify(theme));\n storeThemes.setColorTheme(theme);\n\n if(type !== \"system\") {\n storeThemes.resetSystemColorTheme();\n } else {\n setSystemTheme();\n }\n\n applyTheme();\n }\n\n const applyTheme = () => {\n const $body = $$('body');\n\n let theme = storeThemes.systemColorTheme;\n if(!theme) theme = storeThemes.colorTheme;\n \n $body.attr('class') && $body.attr('class', $body.attr('class').replace(/\\s?theme-type-(?:dark|light)/, ''));\n $body.addClass(`theme-type-${theme.type}`);\n\n const onEngineCreated = api => {\n let obj = getCurrentThemeColors(nameColors);\n obj.type = theme.type;\n obj.name = theme.id;\n\n api.asc_setSkin(obj);\n };\n\n const api = Common.EditorApi ? Common.EditorApi.get() : undefined;\n if(!api) Common.Notifications.on('engineCreated', onEngineCreated);\n else onEngineCreated(api);\n }\n\n return (\n \n {props.children}\n \n )\n}\n\nconst themes = inject('storeThemes')(observer(ThemesProvider));\nexport {themes as Themes}","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { classNames, getExtraAttrs } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\n\n\nconst Segmented = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n raised,\n raisedIos,\n raisedMd,\n round,\n roundIos,\n roundMd,\n strong,\n strongIos,\n strongMd,\n tag = 'div'\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n const classes = classNames(className, {\n segmented: true,\n 'segmented-raised': raised,\n 'segmented-raised-ios': raisedIos,\n 'segmented-raised-md': raisedMd,\n 'segmented-round': round,\n 'segmented-round-ios': roundIos,\n 'segmented-round-md': roundMd,\n 'segmented-strong': strong,\n 'segmented-strong-ios': strongIos,\n 'segmented-strong-md': strongMd\n }, colorClasses(props));\n const SegmentedTag = tag;\n return /*#__PURE__*/React.createElement(SegmentedTag, _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), children, (strong || strongIos || strongMd) && /*#__PURE__*/React.createElement(\"span\", {\n className: \"segmented-highlight\"\n }));\n});\nSegmented.displayName = 'f7-segmented';\nexport default Segmented;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { classNames, getExtraAttrs, extend, isStringProp, emit } from '../shared/utils.js';\nimport { colorClasses, actionsAttrs, actionsClasses, routerAttrs, routerClasses } from '../shared/mixins.js';\nimport { useTooltip } from '../shared/use-tooltip.js';\nimport { useIcon } from '../shared/use-icon.js';\nimport { useRouteProps } from '../shared/use-route-props.js';\nimport Preloader from './preloader.js';\n\n\nconst Button = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n text,\n type,\n href = '#',\n target,\n tabLink,\n tabLinkActive,\n round,\n roundIos,\n roundMd,\n fill,\n fillIos,\n fillMd,\n tonal,\n tonalIos,\n tonalMd,\n large,\n largeIos,\n largeMd,\n small,\n smallIos,\n smallMd,\n raised,\n raisedIos,\n raisedMd,\n active,\n outline,\n outlineIos,\n outlineMd,\n disabled,\n preloader,\n preloaderSize,\n preloaderColor,\n loading\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const onClick = e => {\n emit(props, 'click', e);\n };\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n useTooltip(elRef, props);\n useRouteProps(elRef, props);\n const getClasses = () => {\n return classNames(className, 'button', {\n 'tab-link': tabLink || tabLink === '',\n 'tab-link-active': tabLinkActive,\n 'button-round': round,\n 'button-round-ios': roundIos,\n 'button-round-md': roundMd,\n 'button-fill': fill,\n 'button-fill-ios': fillIos,\n 'button-fill-md': fillMd,\n 'button-tonal': tonal,\n 'button-tonal-ios': tonalIos,\n 'button-tonal-md': tonalMd,\n 'button-large': large,\n 'button-large-ios': largeIos,\n 'button-large-md': largeMd,\n 'button-small': small,\n 'button-small-ios': smallIos,\n 'button-small-md': smallMd,\n 'button-raised': raised,\n 'button-raised-ios': raisedIos,\n 'button-raised-md': raisedMd,\n 'button-active': active,\n 'button-outline': outline,\n 'button-outline-ios': outlineIos,\n 'button-outline-md': outlineMd,\n 'button-preloader': preloader,\n 'button-loading': loading,\n disabled\n }, colorClasses(props), routerClasses(props), actionsClasses(props));\n };\n const ButtonTag = type === 'submit' || type === 'reset' || type === 'button' ? 'button' : 'a';\n const getAttrs = () => {\n let hrefComputed = href;\n if (href === true) hrefComputed = '#';\n if (href === false || ButtonTag === 'button') hrefComputed = undefined; // no href attribute\n return extend({\n href: hrefComputed,\n target,\n type,\n 'data-tab': isStringProp(tabLink) && tabLink || undefined\n }, routerAttrs(props), actionsAttrs(props));\n };\n const iconEl = useIcon(props);\n let textEl;\n if (text) {\n textEl = /*#__PURE__*/React.createElement(\"span\", null, text);\n }\n if (preloader) {\n return /*#__PURE__*/React.createElement(ButtonTag, _extends({\n ref: elRef,\n id: id,\n style: style,\n className: getClasses()\n }, getAttrs(), extraAttrs, {\n onClick: onClick\n }), /*#__PURE__*/React.createElement(Preloader, {\n size: preloaderSize,\n color: preloaderColor\n }), /*#__PURE__*/React.createElement(\"span\", null, iconEl, textEl, children));\n }\n return /*#__PURE__*/React.createElement(ButtonTag, _extends({\n ref: elRef,\n id: id,\n style: style,\n className: getClasses()\n }, getAttrs(), extraAttrs, {\n onClick: onClick\n }), iconEl, textEl, children);\n});\nButton.displayName = 'f7-button';\nexport default Button;","import React, {useState} from 'react';\r\nimport {observer, inject} from \"mobx-react\";\r\nimport {Page, Navbar, List, ListItem, BlockTitle, Segmented, Button, Icon, Toggle} from 'framework7-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {Device} from '../../../../../common/mobile/utils/device';\r\n\r\nconst PageSpreadsheetColorSchemes = props => {\r\n const { t } = useTranslation();\r\n const curScheme = props.initPageColorSchemes();\r\n const [stateScheme, setScheme] = useState(curScheme);\r\n const storeSpreadsheetSettings = props.storeSpreadsheetSettings;\r\n const allSchemes = storeSpreadsheetSettings.allSchemes;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n allSchemes ? allSchemes.map((scheme, index) => {\r\n return (\r\n {\r\n setScheme(index);\r\n setTimeout(() => props.onColorSchemeChange(index), 15);\r\n }}>\r\n \r\n \r\n {\r\n scheme.get_colors().map((elem, index) => {\r\n if(index >=2 && index < 7) {\r\n let clr = {background: \"#\" + Common.Utils.ThemeColor.getHexColor(elem.get_r(), elem.get_g(), elem.get_b())};\r\n return (\r\n \r\n )\r\n }\r\n })\r\n }\r\n \r\n \r\n
\r\n \r\n )\r\n }) : null \r\n }\r\n
\r\n \r\n\r\n )\r\n};\r\n\r\nconst PageSpreadsheetFormats = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Settings', {returnObjects: true});\r\n const storeSpreadsheetSettings = props.storeSpreadsheetSettings;\r\n const pageSizesIndex = storeSpreadsheetSettings.pageSizesIndex;\r\n const pageSizes = storeSpreadsheetSettings.getPageSizesList();\r\n const textMetric = Common.Utils.Metric.getCurrentMetricName();\r\n\r\n return (\r\n \r\n \r\n \r\n {pageSizes.map((item, index) => (\r\n {props.onFormatChange(item.value)}}>\r\n \r\n ))}\r\n
\r\n \r\n )\r\n};\r\n\r\nconst PageSpreadsheetMargins = props => {\r\n const isAndroid = Device.android;\r\n const { t } = useTranslation();\r\n const _t = t('View.Settings', {returnObjects: true});\r\n const metricText = Common.Utils.Metric.getMetricName(Common.Utils.Metric.getCurrentMetric());\r\n const margins = props.initSpreadsheetMargins();\r\n\r\n const [stateTop, setTop] = useState(margins.top);\r\n const [stateBottom, setBottom] = useState(margins.bottom);\r\n const [stateLeft, setLeft] = useState(margins.left);\r\n const [stateRight, setRight] = useState(margins.right);\r\n\r\n const onChangeMargins = (align, isDecrement) => {\r\n let step = Common.Utils.Metric.getCurrentMetric() == Common.Utils.Metric.c_MetricUnits.pt ? 1 : 0.1;\r\n step = Common.Utils.Metric.fnRecalcToMM(step);\r\n\r\n let marginValue,\r\n maxMarginsH = 482.5,\r\n maxMarginsW = 482.5;\r\n\r\n switch (align) {\r\n case 'left': marginValue = stateLeft; break;\r\n case 'top': marginValue = stateTop; break;\r\n case 'right': marginValue = stateRight; break;\r\n case 'bottom': marginValue = stateBottom; break;\r\n }\r\n\r\n if (isDecrement) {\r\n marginValue = Math.max(0, marginValue - step);\r\n } else {\r\n marginValue = Math.min((align == 'left' || align == 'right') ? maxMarginsW : maxMarginsH, marginValue + step);\r\n }\r\n\r\n switch (align) {\r\n case 'left': setLeft(marginValue); break;\r\n case 'top': setTop(marginValue); break;\r\n case 'right': setRight(marginValue); break;\r\n case 'bottom': setBottom(marginValue); break;\r\n }\r\n\r\n props.onPageMarginsChange(align, marginValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {!isAndroid && {parseFloat(Common.Utils.Metric.fnRecalcFromMM(stateTop).toFixed(2)) + ' ' + metricText}
}\r\n \r\n \r\n \r\n {isAndroid && }\r\n \r\n \r\n
\r\n \r\n \r\n {!isAndroid && {parseFloat(Common.Utils.Metric.fnRecalcFromMM(stateBottom).toFixed(2)) + ' ' + metricText}
}\r\n \r\n \r\n \r\n {isAndroid && }\r\n \r\n \r\n
\r\n \r\n \r\n {!isAndroid && {parseFloat(Common.Utils.Metric.fnRecalcFromMM(stateLeft).toFixed(2)) + ' ' + metricText}
}\r\n \r\n \r\n \r\n {isAndroid && }\r\n \r\n \r\n
\r\n \r\n \r\n {!isAndroid && {parseFloat(Common.Utils.Metric.fnRecalcFromMM(stateRight).toFixed(2)) + ' ' + metricText}
}\r\n \r\n \r\n \r\n {isAndroid && }\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n )\r\n};\r\n\r\nconst PageSpreadsheetSettings = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Settings', {returnObjects: true});\r\n const storeSpreadsheetSettings = props.storeSpreadsheetSettings;\r\n const storeWorksheets = props.storeWorksheets;\r\n const wsProps = storeWorksheets.wsProps;\r\n const isPortrait = storeSpreadsheetSettings.isPortrait;\r\n const isHideHeadings = storeSpreadsheetSettings.isHideHeadings;\r\n const isHideGridlines = storeSpreadsheetSettings.isHideGridlines;\r\n\r\n // Init Format\r\n\r\n const curMetricName = Common.Utils.Metric.getMetricName(Common.Utils.Metric.getCurrentMetric());\r\n const pageSizesIndex = storeSpreadsheetSettings.pageSizesIndex;\r\n\r\n const pageSizes = storeSpreadsheetSettings.getPageSizesList();\r\n const textFormat = pageSizes[pageSizesIndex]['caption'];\r\n const sizeW = parseFloat(Common.Utils.Metric.fnRecalcFromMM(pageSizes[pageSizesIndex]['value'][0]).toFixed(2));\r\n const sizeH = parseFloat(Common.Utils.Metric.fnRecalcFromMM(pageSizes[pageSizesIndex]['value'][1]).toFixed(2));\r\n const pageSizeTxt = sizeW + ' ' + curMetricName + ' x ' + sizeH + ' ' + curMetricName;\r\n\r\n return (\r\n \r\n \r\n {_t.textOrientation}\r\n \r\n {\r\n storeSpreadsheetSettings.resetPortrait(true);\r\n props.onOrientationChange(0)}}> \r\n \r\n { \r\n storeSpreadsheetSettings.resetPortrait(false);\r\n props.onOrientationChange(1)}}>\r\n \r\n
\r\n {_t.textFormat}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n {\r\n storeSpreadsheetSettings.changeHideHeadings(!isHideHeadings);\r\n props.clickCheckboxHideHeadings(!isHideHeadings)\r\n }} />\r\n \r\n \r\n {\r\n storeSpreadsheetSettings.changeHideGridlines(!isHideGridlines);\r\n props.clickCheckboxHideGridlines(!isHideGridlines)\r\n }} />\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n )\r\n};\r\n\r\nconst SpreadsheetFormats = inject(\"storeSpreadsheetSettings\")(observer(PageSpreadsheetFormats));\r\nconst SpreadsheetMargins = inject(\"storeSpreadsheetSettings\")(observer(PageSpreadsheetMargins));\r\nconst SpreadsheetSettings = inject(\"storeSpreadsheetSettings\", \"storeWorksheets\")(observer(PageSpreadsheetSettings));\r\nconst SpreadsheetColorSchemes = inject(\"storeSpreadsheetSettings\")(observer(PageSpreadsheetColorSchemes));\r\n\r\nexport {\r\n SpreadsheetSettings,\r\n SpreadsheetFormats,\r\n SpreadsheetMargins,\r\n SpreadsheetColorSchemes\r\n};\r\n","\r\nimport React, {Component} from 'react';\r\nimport {SpreadsheetSettings} from '../../view/settings/SpreadsheetSettings';\r\nimport {observer, inject} from \"mobx-react\";\r\n\r\nclass SpreadsheetSettingsController extends Component {\r\n constructor (props) {\r\n super (props);\r\n this.initSpreadsheetMargins = this.initSpreadsheetMargins.bind(this);\r\n this.onFormatChange = this.onFormatChange.bind(this);\r\n this.onPageMarginsChange = this.onPageMarginsChange.bind(this); \r\n this.initSpreadsheetSettings();\r\n }\r\n\r\n initSpreadsheetSettings() {\r\n const api = Common.EditorApi.get();\r\n const params = api.asc_getSheetViewSettings();\r\n const currentSheet = api.asc_getActiveWorksheetIndex();\r\n const propsSheet = api.asc_getPageOptions(currentSheet);\r\n const opt = propsSheet.asc_getPageSetup();\r\n \r\n this.props.storeSpreadsheetSettings.changeHideHeadings(!params.asc_getShowRowColHeaders());\r\n this.props.storeSpreadsheetSettings.changeHideGridlines(!params.asc_getShowGridLines());\r\n this.props.storeSpreadsheetSettings.resetPortrait(opt.asc_getOrientation() === Asc.c_oAscPageOrientation.PagePortrait ? true : false);\r\n this.props.storeSpreadsheetSettings.changeDocSize(opt.asc_getWidth(), opt.asc_getHeight());\r\n }\r\n\r\n initSpreadsheetMargins() {\r\n const api = Common.EditorApi.get();\r\n\r\n // Init page margins\r\n\r\n let currentSheet = api.asc_getActiveWorksheetIndex(),\r\n props = api.asc_getPageOptions(currentSheet);\r\n\r\n this.localMarginProps = props.asc_getPageMargins();\r\n\r\n let left = this.localMarginProps.asc_getLeft(),\r\n top = this.localMarginProps.asc_getTop(),\r\n right = this.localMarginProps.asc_getRight(),\r\n bottom = this.localMarginProps.asc_getBottom();\r\n\r\n return {left, top, right, bottom};\r\n }\r\n\r\n onPageMarginsChange(align, marginValue) {\r\n const api = Common.EditorApi.get();\r\n let changeProps = new Asc.asc_CPageMargins();\r\n\r\n changeProps.asc_setTop(this.localMarginProps.asc_getTop());\r\n changeProps.asc_setBottom(this.localMarginProps.asc_getBottom());\r\n changeProps.asc_setLeft(this.localMarginProps.asc_getLeft());\r\n changeProps.asc_setRight(this.localMarginProps.asc_getRight());\r\n \r\n switch (align) {\r\n case 'left': changeProps.asc_setLeft(marginValue); break;\r\n case 'top': changeProps.asc_setTop(marginValue); break;\r\n case 'right': changeProps.asc_setRight(marginValue); break;\r\n case 'bottom': changeProps.asc_setBottom(marginValue); break;\r\n }\r\n\r\n api.asc_changePageMargins(changeProps, undefined, undefined, undefined, undefined, api.asc_getActiveWorksheetIndex());\r\n }\r\n\r\n onOrientationChange(value) {\r\n const api = Common.EditorApi.get();\r\n api.asc_changePageOrient(+value === Asc.c_oAscPageOrientation.PagePortrait, api.asc_getActiveWorksheetIndex());\r\n }\r\n\r\n clickCheckboxHideHeadings(value) {\r\n const api = Common.EditorApi.get();\r\n api.asc_setDisplayHeadings(!value);\r\n }\r\n\r\n clickCheckboxHideGridlines(value) {\r\n const api = Common.EditorApi.get();\r\n api.asc_setDisplayGridlines(!value);\r\n }\r\n\r\n initPageColorSchemes() {\r\n const api = Common.EditorApi.get();\r\n return api.asc_GetCurrentColorSchemeIndex();\r\n }\r\n\r\n onColorSchemeChange(index) {\r\n const api = Common.EditorApi.get();\r\n api.asc_ChangeColorSchemeByIdx(+index); \r\n }\r\n\r\n onFormatChange(value) {\r\n const api = Common.EditorApi.get();\r\n api.asc_changeDocSize(parseFloat(value[0]), parseFloat(value[1]), api.asc_getActiveWorksheetIndex());\r\n this.initSpreadsheetSettings();\r\n }\r\n\r\n render () {\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\nexport default inject(\"storeSpreadsheetSettings\")(observer(SpreadsheetSettingsController));","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { classNames, getExtraAttrs } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { useTab } from '../shared/use-tab.js';\n\n\nconst Block = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n inset,\n insetIos,\n insetMd,\n xsmallInset,\n xsmallInsetIos,\n xsmallInsetMd,\n smallInset,\n smallInsetIos,\n smallInsetMd,\n mediumInset,\n mediumInsetIos,\n mediumInsetMd,\n largeInset,\n largeInsetIos,\n largeInsetMd,\n xlargeInset,\n xlargeInsetIos,\n xlargeInsetMd,\n strong,\n strongIos,\n strongMd,\n outline,\n outlineIos,\n outlineMd,\n accordionList,\n accordionOpposite,\n tabs,\n tab,\n tabActive,\n id,\n style,\n children\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n useTab(elRef, props);\n const classes = classNames(className, 'block', {\n inset,\n 'inset-ios': insetIos,\n 'inset-md': insetMd,\n 'xsmall-inset': xsmallInset,\n 'xsmall-inset-ios': xsmallInsetIos,\n 'xsmall-inset-md': xsmallInsetMd,\n 'small-inset': smallInset,\n 'small-inset-ios': smallInsetIos,\n 'small-inset-md': smallInsetMd,\n 'medium-inset': mediumInset,\n 'medium-inset-ios': mediumInsetIos,\n 'medium-inset-md': mediumInsetMd,\n 'large-inset': largeInset,\n 'large-inset-ios': largeInsetIos,\n 'large-inset-md': largeInsetMd,\n 'xlarge-inset': xlargeInset,\n 'xlarge-inset-ios': xlargeInsetIos,\n 'xlarge-inset-md': xlargeInsetMd,\n 'block-strong': strong,\n 'block-strong-ios': strongIos,\n 'block-strong-md': strongMd,\n 'block-outline': outline,\n 'block-outline-ios': outlineIos,\n 'block-outline-md': outlineMd,\n 'accordion-list': accordionList,\n 'accordion-opposite': accordionOpposite,\n tabs,\n tab,\n 'tab-active': tabActive\n }, colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classes,\n ref: elRef\n }, extraAttrs), children);\n});\nBlock.displayName = 'f7-block';\nexport default Block;","import React, { Fragment } from \"react\";\r\nimport { observer, inject } from \"mobx-react\";\r\nimport { Page, Navbar, List, ListItem, BlockTitle, Toggle, Icon, f7, Block } from \"framework7-react\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst PageApplicationSettings = props => {\r\n const { t } = useTranslation();\r\n const _t = t(\"View.Settings\", { returnObjects: true });\r\n const storeApplicationSettings = props.storeApplicationSettings;\r\n const unitMeasurement = storeApplicationSettings.unitMeasurement;\r\n const formulaLang = storeApplicationSettings.formulaLang;\r\n const regData = storeApplicationSettings.regData;\r\n const regCode = storeApplicationSettings.regCode;\r\n const regExample = storeApplicationSettings.regExample;\r\n const formulaLangsColection = storeApplicationSettings.formulaLangsColection;\r\n const defineFormulaLang = () => formulaLangsColection.find(obj => obj.value === formulaLang);\r\n const currentFormulaLang = defineFormulaLang();\r\n const defineRegSetting = () => regData.find(obj => regCode === obj.code);\r\n const currentRegSetting = defineRegSetting();\r\n const isRefStyle = storeApplicationSettings.isRefStyle;\r\n const isComments = storeApplicationSettings.isComments;\r\n const isResolvedComments = storeApplicationSettings.isResolvedComments;\r\n const directionMode = storeApplicationSettings.directionMode;\r\n const newDirectionMode = directionMode !== 'ltr' ? 'ltr' : 'rtl';\r\n\r\n const changeMeasureSettings = value => {\r\n storeApplicationSettings.changeUnitMeasurement(value);\r\n props.unitMeasurementChange(value);\r\n };\r\n\r\n // set mode\r\n const appOptions = props.storeAppOptions; \r\n const storeThemes = props.storeThemes;\r\n const colorTheme = storeThemes.colorTheme;\r\n const themes = storeThemes.themes;\r\n const isConfigSelectTheme = storeThemes.isConfigSelectTheme;\r\n const typeTheme = colorTheme.type;\r\n const _isEdit = appOptions.isEdit;\r\n // const _isShowMacros = (!appOptions.isDisconnected && appOptions.customization) ? appOptions.customization.macros !== false : true;\r\n\r\n return (\r\n \r\n \r\n {_isEdit &&\r\n \r\n {_t.textUnitOfMeasurement}\r\n \r\n changeMeasureSettings(0)}>\r\n changeMeasureSettings(1)}>\r\n changeMeasureSettings(2)}>\r\n
\r\n {_t.textFormulaLanguage}\r\n \r\n \r\n \r\n
\r\n {_t.textRegionalSettings}\r\n \r\n \r\n
\r\n \r\n }\r\n {_t.textCommentingDisplay}\r\n \r\n \r\n {\r\n storeApplicationSettings.changeDisplayComments(!isComments);\r\n props.onChangeDisplayComments(!isComments);\r\n }}\r\n />\r\n \r\n \r\n {\r\n storeApplicationSettings.changeDisplayResolved(!isResolvedComments);\r\n props.onChangeDisplayResolved(!isResolvedComments);\r\n }}\r\n />\r\n \r\n
\r\n \r\n \r\n {\r\n storeApplicationSettings.changeRefStyle(!isRefStyle);\r\n props.clickR1C1Style(!isRefStyle);\r\n }}\r\n />\r\n \r\n
\r\n {!!isConfigSelectTheme &&\r\n \r\n \r\n
\r\n }\r\n \r\n \r\n
\r\n {Common.Locale.isCurrentLangRtl &&\r\n <>\r\n \r\n \r\n \r\n {t(\"View.Settings.textRtlInterface\")}\r\n Beta\r\n
\r\n {\r\n storeApplicationSettings.changeDirectionMode(newDirectionMode);\r\n props.changeDirectionMode(newDirectionMode);\r\n }}\r\n />\r\n \r\n
\r\n \r\n {t('View.Settings.textExplanationChangeDirection')}
\r\n \r\n >\r\n }\r\n \r\n );\r\n};\r\n\r\nconst PageThemeSettings = props => {\r\n const { t } = useTranslation();\r\n const _t = t(\"View.Settings\", { returnObjects: true });\r\n const storeThemes = props.storeThemes;\r\n const colorTheme = storeThemes.colorTheme;\r\n const typeTheme = colorTheme.type;\r\n const themes = storeThemes.themes;\r\n\r\n return (\r\n \r\n \r\n \r\n {Object.keys(themes).map((key, index) => {\r\n return (\r\n props.changeTheme(key)} name={themes[key].id} title={themes[key].text}>\r\n )\r\n })}\r\n
\r\n \r\n )\r\n};\r\n\r\nconst PageRegionalSettings = props => {\r\n const { t } = useTranslation();\r\n const _t = t(\"View.Settings\", { returnObjects: true });\r\n const storeApplicationSettings = props.storeApplicationSettings;\r\n const regData = storeApplicationSettings.regData;\r\n const regCode = storeApplicationSettings.regCode;\r\n \r\n return (\r\n \r\n \r\n \r\n {regData.length ? regData.map((elem, index) => {\r\n return (\r\n {\r\n storeApplicationSettings.changeRegCode(elem.code);\r\n props.onRegSettings(elem.code);\r\n }}>\r\n \r\n
\r\n
{elem.displayName}
\r\n
\r\n \r\n )\r\n }) : null}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageFormulaLanguage = props => {\r\n const { t } = useTranslation();\r\n const _t = t(\"View.Settings\", { returnObjects: true });\r\n const storeApplicationSettings = props.storeApplicationSettings;\r\n const formulaLangsColection = storeApplicationSettings.formulaLangsColection;\r\n const formulaLang = storeApplicationSettings.formulaLang;\r\n\r\n return (\r\n \r\n \r\n \r\n {formulaLangsColection.map((elem, index) => {\r\n return (\r\n {\r\n storeApplicationSettings.changeFormulaLang(elem.value);\r\n props.onFormulaLangChange(elem.value);\r\n }}>\r\n \r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageMacrosSettings = props => {\r\n const { t } = useTranslation();\r\n const _t = t(\"View.Settings\", { returnObjects: true });\r\n const storeApplicationSettings = props.storeApplicationSettings;\r\n const macrosMode = storeApplicationSettings.macrosMode;\r\n\r\n const changeMacros = value => {\r\n storeApplicationSettings.changeMacrosSettings(value);\r\n props.onChangeMacrosSettings(value);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n changeMacros(2)}>\r\n changeMacros(0)}>\r\n changeMacros(1)}>\r\n
\r\n \r\n );\r\n};\r\n\r\nconst ApplicationSettings = inject(\"storeApplicationSettings\", \"storeAppOptions\", \"storeThemes\")(observer(PageApplicationSettings));\r\nconst MacrosSettings = inject(\"storeApplicationSettings\")(observer(PageMacrosSettings));\r\nconst RegionalSettings = inject(\"storeApplicationSettings\")(observer(PageRegionalSettings));\r\nconst FormulaLanguage = inject(\"storeApplicationSettings\")(observer(PageFormulaLanguage));\r\nconst ThemeSettings = inject(\"storeThemes\")(observer(PageThemeSettings));\r\n\r\nexport {\r\n ApplicationSettings, \r\n MacrosSettings,\r\n RegionalSettings,\r\n FormulaLanguage,\r\n ThemeSettings\r\n};","import React, { Component } from \"react\";\r\nimport { ApplicationSettings } from \"../../view/settings/ApplicationSettings\";\r\nimport {observer, inject} from \"mobx-react\";\r\nimport { LocalStorage } from '../../../../../common/mobile/utils/LocalStorage.mjs';\r\nimport { withTranslation } from 'react-i18next';\r\nimport { ThemesContext } from \"../../../../../common/mobile/lib/controller/Themes\";\r\nimport { f7 } from \"framework7-react\";\r\n\r\nclass ApplicationSettingsController extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.onFormulaLangChange = this.onFormulaLangChange.bind(this);\r\n this.onChangeDisplayComments = this.onChangeDisplayComments.bind(this);\r\n this.onRegSettings = this.onRegSettings.bind(this);\r\n this.initRegSettings = this.initRegSettings.bind(this);\r\n this.changeDirectionMode = this.changeDirectionMode.bind(this);\r\n this.initFormulaLangsCollection = this.initFormulaLangsCollection.bind(this);\r\n this.props.storeApplicationSettings.initRegData();\r\n this.initRegSettings();\r\n this.props.storeApplicationSettings.changeUnitMeasurement(Common.Utils.Metric.getCurrentMetric());\r\n this.props.storeApplicationSettings.setFormulaLangsCollection(this.initFormulaLangsCollection());\r\n }\r\n\r\n static contextType = ThemesContext;\r\n\r\n initFormulaLangsCollection() {\r\n const { t } = this.props;\r\n const _t = t(\"View.Settings\", { returnObjects: true });\r\n const storeApplicationSettings = this.props.storeApplicationSettings;\r\n const formulaLangsExamples = storeApplicationSettings.formulaLangsExamples;\r\n const formulaLangs = storeApplicationSettings.formulaLangs;\r\n const formulaLangsCollection = formulaLangs.map(lang => {\r\n let str = lang.replace(/[\\-_]/, '');\r\n str = str.charAt(0).toUpperCase() + str.substring(1, str.length);\r\n\r\n return {\r\n value: lang, \r\n displayValue: _t[`txt${str}lang`] ? t(`View.Settings.txt${str}lang`) : t(`View.Settings.txt${str}`), exampleValue: formulaLangsExamples[`txtExample${str}`] || formulaLangsExamples['txtExampleEn']\r\n }\r\n });\r\n\r\n formulaLangsCollection.sort(function(a, b) {\r\n if (a.displayValue < b.displayValue) return -1;\r\n if (a.displayValue > b.displayValue) return 1;\r\n return 0;\r\n });\r\n\r\n return formulaLangsCollection;\r\n }\r\n\r\n initRegSettings() {\r\n const info = new Asc.asc_CFormatCellsInfo();\r\n const api = Common.EditorApi.get();\r\n const regCode = this.props.storeApplicationSettings.getRegCode();\r\n\r\n info.asc_setType(Asc.c_oAscNumFormatType.None);\r\n info.asc_setSymbol(regCode);\r\n\r\n const arr = api.asc_getFormatCells(info);\r\n const text4 = api.asc_getLocaleExample(arr[4], 1000.01, regCode),\r\n text5 = api.asc_getLocaleExample(arr[5], Asc.cDate().getExcelDateWithTime(), regCode),\r\n text6 = api.asc_getLocaleExample(arr[7], Asc.cDate().getExcelDateWithTime(), regCode);\r\n\r\n this.props.storeApplicationSettings.setRegExample(`${text4} ${text5} ${text6}`);\r\n }\r\n\r\n onChangeDisplayComments(displayComments) {\r\n const api = Common.EditorApi.get();\r\n this.props.storeAppOptions.changeCanViewComments(displayComments);\r\n\r\n if (!displayComments) {\r\n api.asc_hideComments();\r\n LocalStorage.setBool(\"sse-settings-resolvedcomment\", false);\r\n } else {\r\n let resolved = LocalStorage.getBool(\"sse-settings-resolvedcomment\");\r\n api.asc_showComments(resolved);\r\n }\r\n\r\n LocalStorage.setBool(\"sse-mobile-settings-livecomment\", displayComments);\r\n }\r\n\r\n onChangeDisplayResolved(value) {\r\n const api = Common.EditorApi.get();\r\n let displayComments = LocalStorage.getBool(\"sse-mobile-settings-livecomment\",true);\r\n\r\n if (displayComments) {\r\n api.asc_showComments(value);\r\n LocalStorage.setBool(\"sse-settings-resolvedcomment\", value);\r\n }\r\n }\r\n\r\n clickR1C1Style(checked) {\r\n const api = Common.EditorApi.get();\r\n LocalStorage.setBool('sse-settings-r1c1', checked);\r\n api.asc_setR1C1Mode(checked);\r\n }\r\n\r\n unitMeasurementChange(value) {\r\n value = value ? +value : Common.Utils.Metric.getDefaultMetric();\r\n Common.Utils.Metric.setCurrentMetric(value);\r\n LocalStorage.setItem(\"sse-mobile-settings-unit\", value);\r\n }\r\n\r\n onChangeMacrosSettings(value) {\r\n Common.Utils.InternalSettings.set(\"sse-mobile-macros-mode\", +value);\r\n LocalStorage.setItem(\"sse-mobile-macros-mode\", +value);\r\n }\r\n\r\n onFormulaLangChange(value) {\r\n LocalStorage.setItem(\"sse-settings-func-lang\", value);\r\n this.initRegSettings();\r\n Common.Notifications.trigger('changeFuncLang');\r\n }\r\n\r\n onRegSettings(regCode) {\r\n const api = Common.EditorApi.get();\r\n LocalStorage.setItem(\"sse-settings-regional\", regCode);\r\n this.initRegSettings();\r\n if (regCode!==null) api.asc_setLocale(+regCode);\r\n Common.Notifications.trigger('changeRegSettings');\r\n }\r\n\r\n changeDirectionMode(direction) {\r\n const { t } = this.props;\r\n const _t = t(\"View.Settings\", { returnObjects: true });\r\n\r\n this.props.storeApplicationSettings.changeDirectionMode(direction);\r\n LocalStorage.setItem('mode-direction', direction);\r\n\r\n f7.dialog.create({\r\n title: _t.notcriticalErrorTitle,\r\n text: t('View.Settings.textRestartApplication'),\r\n buttons: [\r\n {\r\n text: _t.textOk\r\n }\r\n ]\r\n }).open();\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\n\r\nexport default inject(\"storeApplicationSettings\", \"storeAppOptions\")(observer(withTranslation()(ApplicationSettingsController)));","import React, {Fragment, useContext} from \"react\";\r\nimport { observer, inject } from \"mobx-react\";\r\nimport { Page, Navbar, List, ListItem, BlockTitle } from \"framework7-react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { SettingsContext } from \"../../controller/settings/Settings\";\r\n\r\nconst PageSpreadsheetInfo = (props) => {\r\n const { t } = useTranslation();\r\n const _t = t(\"View.Settings\", { returnObjects: true });\r\n const storeSpreadsheetInfo = props.storeSpreadsheetInfo;\r\n const dataDoc = storeSpreadsheetInfo.dataDoc;\r\n const dataApp = props.getAppProps();\r\n const dataModified = props.modified;\r\n const dataModifiedBy = props.modifiedBy;\r\n const creators = props.creators;\r\n const settingsContext = useContext(SettingsContext);\r\n \r\n return (\r\n \r\n \r\n {dataDoc?.title ? (\r\n \r\n {_t.textSpreadsheetTitle}\r\n \r\n \r\n
\r\n \r\n ) : null}\r\n {dataDoc?.info?.author || dataDoc?.info?.owner ? (\r\n \r\n {_t.textOwner}\r\n \r\n \r\n
\r\n \r\n ) : null}\r\n {dataDoc?.info?.folder ? (\r\n \r\n {_t.textLocation}\r\n \r\n \r\n
\r\n \r\n ) : null}\r\n {dataDoc?.info?.uploaded || dataDoc?.info?.created ? (\r\n \r\n {_t.textUploaded}\r\n \r\n \r\n
\r\n \r\n ) : null}\r\n {props.title ? (\r\n \r\n {_t.textTitle}\r\n \r\n \r\n
\r\n \r\n ) : null}\r\n {props.subject ? (\r\n \r\n {_t.textSubject}\r\n \r\n \r\n
\r\n \r\n ) : null}\r\n {props.description ? (\r\n \r\n {_t.textComment}\r\n \r\n \r\n
\r\n \r\n ) : null}\r\n {dataModified ? (\r\n \r\n {_t.textLastModified}\r\n \r\n \r\n
\r\n \r\n ) : null}\r\n {dataModifiedBy ? (\r\n \r\n {_t.textLastModifiedBy}\r\n \r\n \r\n
\r\n \r\n ) : null}\r\n {props.created ? (\r\n \r\n {_t.textCreated}\r\n \r\n \r\n
\r\n \r\n ) : null}\r\n {dataApp ? (\r\n \r\n {_t.textApplication}\r\n \r\n \r\n
\r\n \r\n ) : null}\r\n {creators ? (\r\n \r\n {_t.textAuthor}\r\n \r\n {\r\n creators.split(/\\s*[,;]\\s*/).map(item => {\r\n return \r\n })\r\n }\r\n
\r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nconst SpreadsheetInfo = inject(\"storeSpreadsheetInfo\")(observer(PageSpreadsheetInfo));\r\n\r\nexport default SpreadsheetInfo;","import React, { Component } from \"react\";\r\nimport { observer, inject } from \"mobx-react\";\r\nimport SpreadsheetInfo from \"../../view/settings/SpreadsheetInfo\";\r\n\r\nclass SpreadsheetInfoController extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.docProps = this.getDocProps();\r\n\r\n if (this.docProps) {\r\n this.modified = this.getModified();\r\n this.modifiedBy = this.getModifiedBy();\r\n this.creators = this.getCreators();\r\n this.title = this.getTitle();\r\n this.subject = this.getSubject();\r\n this.description = this.getDescription();\r\n this.created = this.getCreated();\r\n }\r\n }\r\n\r\n getDocProps() {\r\n const api = Common.EditorApi.get();\r\n return api.asc_getCoreProps();\r\n }\r\n\r\n getAppProps() {\r\n const api = Common.EditorApi.get();\r\n const appProps = api.asc_getAppProps();\r\n if (appProps) {\r\n let appName =\r\n (appProps.asc_getApplication() || \"\") +\r\n (appProps.asc_getAppVersion() ? \" \" : \"\") +\r\n (appProps.asc_getAppVersion() || \"\");\r\n return appName;\r\n }\r\n return null;\r\n }\r\n\r\n getModified() {\r\n let valueModified = this.docProps.asc_getModified();\r\n const _lang = this.props.storeAppOptions.lang;\r\n\r\n if (valueModified) {\r\n return (\r\n valueModified.toLocaleString(_lang, {\r\n year: \"numeric\",\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n }) +\r\n \" \" +\r\n valueModified.toLocaleTimeString(_lang, { timeStyle: \"short\" })\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n getModifiedBy() {\r\n let valueModifiedBy = this.docProps.asc_getLastModifiedBy();\r\n if (valueModifiedBy) {\r\n return AscCommon.UserInfoParser.getParsedName(valueModifiedBy);\r\n }\r\n return null;\r\n }\r\n\r\n getCreators() {\r\n return this.docProps.asc_getCreator();\r\n }\r\n\r\n getTitle() {\r\n return this.docProps.asc_getTitle();\r\n }\r\n\r\n getSubject() {\r\n return this.docProps.asc_getSubject();\r\n }\r\n\r\n getDescription() {\r\n return this.docProps.asc_getDescription();\r\n }\r\n\r\n getCreated() {\r\n let value = this.docProps.asc_getCreated();\r\n const _lang = this.props.storeAppOptions.lang;\r\n\r\n if(value) {\r\n return value.toLocaleString(_lang, {year: 'numeric', month: '2-digit', day: '2-digit'}) + ' ' + value.toLocaleTimeString(_lang, {timeStyle: 'short'});\r\n }\r\n\r\n return null;\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\n\r\nexport default inject(\"storeAppOptions\")(observer(SpreadsheetInfoController));","import React from 'react';\r\nimport { Page, Navbar, List, ListItem, BlockTitle, Icon } from \"framework7-react\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst Download = props => {\r\n const { t } = useTranslation();\r\n const _t = t(\"View.Settings\", { returnObjects: true });\r\n\r\n return (\r\n \r\n \r\n {_t.textDownloadAs}\r\n \r\n props.onSaveFormat(Asc.c_oAscFileType.XLSX)}>\r\n \r\n \r\n props.onSaveFormat(Asc.c_oAscFileType.PDF)}>\r\n \r\n \r\n props.onSaveFormat(Asc.c_oAscFileType.PDFA)}>\r\n \r\n \r\n props.onSaveFormat(Asc.c_oAscFileType.ODS)}>\r\n \r\n \r\n props.onSaveFormat(Asc.c_oAscFileType.CSV)}>\r\n \r\n \r\n props.onSaveFormat(Asc.c_oAscFileType.XLTX)}>\r\n \r\n \r\n props.onSaveFormat(Asc.c_oAscFileType.OTS)}>\r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nexport default Download;","import React, { Component } from \"react\";\r\nimport Download from \"../../view/settings/Download\";\r\nimport { Device } from '../../../../../common/mobile/utils/device';\r\nimport { withTranslation, useTranslation } from 'react-i18next';\r\nimport { f7 } from 'framework7-react';\r\nimport { observer, inject } from \"mobx-react\";\r\n\r\nclass DownloadController extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.onSaveFormat = this.onSaveFormat.bind(this);\r\n }\r\n\r\n closeModal() {\r\n if (Device.phone) {\r\n f7.sheet.close('.settings-popup', false);\r\n } else {\r\n f7.popover.close('#settings-popover');\r\n }\r\n }\r\n\r\n onSaveFormat(format) {\r\n const api = Common.EditorApi.get();\r\n const { t } = this.props;\r\n const _t = t(\"View.Settings\", {returnObjects: true});\r\n\r\n if (format) {\r\n this.closeModal();\r\n if (format == Asc.c_oAscFileType.CSV) {\r\n f7.dialog.create({\r\n title: _t.notcriticalErrorTitle,\r\n text: _t.warnDownloadAs,\r\n buttons: [\r\n {\r\n text: _t.textCancel\r\n },\r\n {\r\n text: _t.textOk,\r\n onClick: () => {\r\n const advOptions = api.asc_getAdvancedOptions();\r\n Common.Notifications.trigger('openEncoding', Asc.c_oAscAdvancedOptionsID.CSV, advOptions, 2, new Asc.asc_CDownloadOptions(format))\r\n // onAdvancedOptions(Asc.c_oAscAdvancedOptionsID.CSV, api.asc_getAdvancedOptions(), 2, new Asc.asc_CDownloadOptions(format), _t, true);\r\n }\r\n }\r\n ]\r\n }).open();\r\n } else {\r\n api.asc_DownloadAs(new Asc.asc_CDownloadOptions(format));\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nconst DownloadWithTranslation = inject(\"storeAppOptions\")(observer(withTranslation()(DownloadController)));\r\n\r\nconst onAdvancedOptions = (type, _t, isDocReady, canRequestClose, isDRM) => {\r\n const api = Common.EditorApi.get();\r\n\r\n Common.Notifications.trigger('preloader:close');\r\n Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256, true);\r\n const buttons = [{\r\n text: 'OK',\r\n bold: true,\r\n onClick: function () {\r\n const password = document.getElementById('modal-password').value;\r\n api.asc_setAdvancedOptions(type, new Asc.asc_CDRMAdvancedOptions(password));\r\n if (!isDocReady) {\r\n Common.Notifications.trigger('preloader:beginAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256);\r\n }\r\n }\r\n }];\r\n\r\n if(isDRM) {\r\n f7.dialog.create({\r\n text: _t.txtIncorrectPwd,\r\n buttons : [{\r\n text: 'OK',\r\n bold: true,\r\n }]\r\n }).open();\r\n }\r\n\r\n if (canRequestClose)\r\n buttons.push({\r\n text: _t.closeButtonText,\r\n onClick: function () {\r\n Common.Gateway.requestClose();\r\n }\r\n });\r\n\r\n f7.dialog.create({\r\n title: _t.advDRMOptions,\r\n text: _t.textOpenFile,\r\n content: Device.ios ?\r\n '' : '',\r\n buttons: buttons\r\n }).open();\r\n \r\n};\r\n\r\nexport {\r\n DownloadWithTranslation,\r\n onAdvancedOptions\r\n}","import React, { Fragment } from 'react';\r\nimport { observer, inject } from \"mobx-react\";\r\nimport { Page, Navbar, Link } from \"framework7-react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Device } from '../../utils/device';\r\n\r\nconst PageAbout = props => {\r\n const { t } = useTranslation();\r\n const _t = t(\"About\", { returnObjects: true });\r\n const store = props.storeAppOptions;\r\n const isCanBranding = store.canBranding;\r\n const licInfo = isCanBranding ? store.customization : null;\r\n const customer = licInfo ? licInfo.customer : null;\r\n const nameCustomer = customer ? customer.name : null;\r\n const mailCustomer = customer ? customer.mail : null;\r\n const phoneCustomer = customer ? customer.phone : null;\r\n const addressCustomer = customer ? customer.address : null;\r\n const urlCustomer = customer ? customer.www : null;\r\n const infoCustomer = customer ? customer.info : null;\r\n const logoCustomer = customer ? customer.logo : null;\r\n\r\n const publisherUrl = __PUBLISHER_URL__, \r\n publisherPrintUrl = publisherUrl.replace(/https?:\\/{2}|\\/$/g,\"\");\r\n const publisherName = __PUBLISHER_NAME__.replace(/\\\\\"/g, '\"');\r\n \r\n const editors = {\r\n de: 'DOCUMENT EDITOR',\r\n pe: 'PRESENTATION EDITOR',\r\n sse: 'SPREADSHEET EDITOR'\r\n };\r\n\r\n const nameEditor = (_t.textEditor || editors[editorType]).toUpperCase();\r\n\r\n return (\r\n \r\n \r\n {licInfo && typeof licInfo == 'object' && typeof(customer) == 'object' ? (\r\n \r\n \r\n {logoCustomer && logoCustomer.length ? (\r\n
\r\n

\r\n
\r\n ) : null}\r\n
\r\n \r\n
{nameEditor}
\r\n
{_t.textVersion} {__PRODUCT_VERSION__}
\r\n
\r\n {mailCustomer || phoneCustomer ? (\r\n \r\n {mailCustomer && mailCustomer.length ? (\r\n
\r\n {mailCustomer}\r\n
\r\n ) : null}\r\n {phoneCustomer && phoneCustomer.length ? (\r\n
\r\n {phoneCustomer}\r\n
\r\n ) : null}\r\n
\r\n ) : null}\r\n {addressCustomer && addressCustomer.length ? (\r\n \r\n
\r\n {addressCustomer}\r\n
\r\n
\r\n ) : null}\r\n {nameCustomer || infoCustomer || urlCustomer ? (\r\n \r\n {nameCustomer && nameCustomer.length ? (\r\n
{nameCustomer}
\r\n ) : null}\r\n {infoCustomer && infoCustomer.length ? (\r\n
{infoCustomer}
\r\n ) : null}\r\n {urlCustomer && urlCustomer.length ? (\r\n
\r\n \r\n {urlCustomer}\r\n \r\n
\r\n ) : null}\r\n
\r\n ) : null}\r\n \r\n
\r\n {__PUBLISHER_ADDRESS__}\r\n
\r\n
\r\n \r\n
{publisherName}
\r\n
\r\n {publisherPrintUrl}\r\n
\r\n
\r\n \r\n ) : (\r\n \r\n \r\n \r\n
{nameEditor}
\r\n
{_t.textVersion} {__PRODUCT_VERSION__}
\r\n
\r\n \r\n
\r\n {__PUBLISHER_ADDRESS__}\r\n
\r\n
\r\n \r\n
{publisherName}
\r\n
\r\n {publisherPrintUrl}\r\n
\r\n
\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst About = inject(\"storeAppOptions\")(observer(PageAbout));\r\nAbout.appVersion = () => (__PRODUCT_VERSION__).match(/\\d+.\\d+.\\d+/)[0]; // skip build number\r\nAbout.compareVersions = () => /d$/.test(__PRODUCT_VERSION__);\r\nAbout.developVersion = () => /(?:d|debug)$/.test(__PRODUCT_VERSION__);\r\n\r\n\r\nexport default About;","import React, { useContext } from 'react';\nimport { Page, Navbar, NavRight, Link, Icon, ListItem, List, f7 } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport { Device } from '../../../../../common/mobile/utils/device';\nimport { observer, inject } from \"mobx-react\";\nimport { MainContext } from '../../page/main';\nimport { SettingsContext } from '../../controller/settings/Settings';\n\nconst SettingsPage = inject('storeAppOptions', 'storeSpreadsheetInfo')(observer(props => {\n const { t } = useTranslation();\n const appOptions = props.storeAppOptions;\n const storeSpreadsheetInfo = props.storeSpreadsheetInfo;\n const canUseHistory = appOptions.canUseHistory;\n const {openOptions, isBranding} = useContext(MainContext);\n const settingsContext = useContext(SettingsContext);\n const _t = t('View.Settings', {returnObjects: true});\n const docTitle = storeSpreadsheetInfo.dataDoc?.title ?? '';\n const canCloseEditor = appOptions.canCloseEditor;\n const closeButtonText = canCloseEditor && appOptions.customization.close.text;\n const navbar = \n \n {docTitle}
\n {Device.phone && \n {_t.textDone}\n }\n ;\n\n const onOpenOptions = name => {\n settingsContext.closeModal();\n openOptions(name);\n }\n\n let _isEdit = false,\n _canDownload = false,\n _canDownloadOrigin = false,\n _canAbout = true,\n _canHelp = true,\n _canPrint = false,\n _canFeedback = true,\n _canDisplayInfo = true;\n \n if (appOptions.isDisconnected) {\n _isEdit = false;\n if (!appOptions.enableDownload)\n _canPrint = _canDownload = _canDownloadOrigin = false;\n } else {\n _isEdit = appOptions.isEdit;\n _canDownload = appOptions.canDownload;\n _canDownloadOrigin = appOptions.canDownloadOrigin;\n _canPrint = appOptions.canPrint;\n\n if (appOptions.customization && appOptions.canBrandingExt) {\n _canAbout = appOptions.customization.about !== false;\n }\n\n if (appOptions.customization) {\n _canHelp = appOptions.customization.help !== false;\n _canFeedback = appOptions.customization.feedback !== false;\n _canDisplayInfo = appOptions.customization.info !== false;\n }\n }\n \n return (\n \n {navbar}\n \n {!props.inPopover &&\n \n \n \n }\n {window.matchMedia(\"(max-width: 359px)\").matches ?\n onOpenOptions('coauth')} className='no-indicator'>\n \n \n : null}\n {_isEdit && \n \n \n \n }\n \n \n \n {_isEdit && canUseHistory &&\n {\n if(Device.phone) {\n onOpenOptions('history');\n }\n }}>\n \n \n }\n {_canDownload &&\n \n \n \n }\n {_canDownloadOrigin &&\n \n \n \n }\n {_canPrint &&\n \n \n \n }\n {!(!_canDisplayInfo && isBranding) &&\n \n \n \n }\n {_canHelp &&\n \n \n \n }\n {_canAbout &&\n \n \n \n }\n {_canFeedback &&\n \n \n \n }\n {canCloseEditor &&\n Common.Notifications.trigger('close')}>\n }\n
\n \n )\n}));\n\nexport default SettingsPage;","import React, { useCallback, useEffect, useState } from 'react';\nimport { Page, Navbar, BlockTitle, List, ListItem, Icon, NavRight, Link } from \"framework7-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { observer, inject } from \"mobx-react\";\nimport { Device } from '../../utils/device';\n\nconst VersionHistoryView = inject('storeVersionHistory', 'users')(observer(props => {\n const { t } = useTranslation();\n const usersStore = props.users;\n const historyStore = props.storeVersionHistory;\n const currentVersion = historyStore.currentVersion;\n const arrVersions = historyStore.arrVersions;\n const [filteredVersions, setFilteredVersions] = useState([]);\n const isNavigate = props.isNavigate;\n const usersVersions = historyStore.usersVersions;\n\n useEffect(() => {\n if(arrVersions.length > 0) {\n const filteredVersions = groupByVersions(arrVersions);\n setFilteredVersions(filteredVersions);\n }\n }, [arrVersions]);\n\n const handleClickRevision = useCallback(version => {\n if(version !== currentVersion) {\n props.onSelectRevision(version);\n }\n }, []);\n\n function groupByVersions(arr) {\n return arr.reduce((result, revision) => {\n const value = revision.version;\n \n const arrVersion = result.find(arr => {\n return arr[0].version === value;\n });\n \n if (arrVersion) {\n arrVersion.push(revision);\n } else {\n result.push([revision]);\n }\n \n return result;\n }, []);\n }\n\n return (\n \n \n {Device.phone ?\n \n \n \n \n \n : !isNavigate &&\n \n \n \n \n \n }\n \n {filteredVersions.length > 0 ? \n filteredVersions.map((versions, index) => {\n return (\n \n {`${versions.find(ver => ver.selected) ? t('Common.VersionHistory.textCurrent') + ' - ' : ''} ${t('Common.VersionHistory.textVersion')} ${versions[0].revision}`}\n \n {versions.map((version, index) => {\n return (\n handleClickRevision(version)}>\n user.id === version.userid).color}}>{usersStore.getInitials(version.username)}
\n {(version === currentVersion && !version.selected && version.canRestore) &&\n \n \n
\n }\n \n )\n })}\n
\n \n )\n }) : null}\n \n )\n}));\n\nexport default VersionHistoryView;","import React, { useEffect, useRef } from 'react';\nimport { observer, inject } from \"mobx-react\";\nimport VersionHistoryView from '../view/VersionHistory';\nimport { f7, Sheet, Popover, View } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport { Device } from '../../../../common/mobile/utils/device';\nimport { getUserColor } from '../../utils/getUserColor';\n\nconst VersionHistoryController = inject('storeAppOptions', 'storeVersionHistory')(observer(props => {\n const api = Common.EditorApi.get();\n const appOptions = props.storeAppOptions;\n const isViewer = appOptions.isViewer;\n const historyStore = props.storeVersionHistory;\n const isVersionHistoryMode = historyStore.isVersionHistoryMode;\n const arrVersionsHistory = historyStore.arrVersions;\n const fileTypes = {\n de: 'docx',\n pe: 'pptx',\n sse: 'xslx'\n };\n const fileType = fileTypes[window.editorType];\n const { t } = useTranslation();\n\n let currentChangeId = -1;\n let currentDocId = '';\n let currentDocIdPrev = '';\n let currentServerVersion = 0;\n let currentUserId = '';\n let currentUserName = '';\n let currentUserColor = '';\n let currentDateCreated = '';\n let isFromSelectRevision;\n let currentRev = 0;\n let timerId;\n\n const timeoutIdRef = useRef(null);\n const currentArrColors = useRef(null);\n\n useEffect(() => {\n api.asc_enableKeyEvents(false);\n\n if(arrVersionsHistory.length < 1) {\n Common.Gateway.requestHistory();\n Common.Gateway.on('refreshhistory', onRefreshHistory);\n Common.Gateway.on('sethistorydata', onSetHistoryData);\n\n api.asc_registerCallback('asc_onDownloadUrl', onDownloadUrl);\n api.asc_registerCallback('asc_onExpiredToken', onExpiredToken);\n }\n\n if(window.editorType === 'de') {\n if(!isViewer) {\n appOptions.changeViewerMode(true);\n api.asc_addRestriction(Asc.c_oAscRestrictionType.View);\n }\n }\n \n if(!isVersionHistoryMode) {\n historyStore.changeVersionHistoryMode(true);\n }\n \n if(!props.isNavigate) {\n if(Device.phone) {\n f7.sheet.open('#version-history-sheet', true);\n } else {\n f7.popover.open('#version-history-popover', '#btn-open-history');\n }\n }\n\n return () => {\n api.asc_enableKeyEvents(true);\n api.asc_unregisterCallback('asc_onDownloadUrl', onDownloadUrl);\n api.asc_unregisterCallback('asc_onExpiredToken', onExpiredToken);\n }\n }, []);\n\n const onExpiredToken = () => {\n setTimeout(() => {\n Common.Gateway.requestHistoryData(currentRev);\n }, 10);\n }\n\n const onDownloadUrl = (url, fileType) => {\n if (isFromSelectRevision) {\n Common.Gateway.requestRestore(isFromSelectRevision, url, fileType);\n }\n\n isFromSelectRevision = null;\n }\n\n const onRefreshHistory = opts => {\n if (!appOptions.canUseHistory) return;\n \n if (opts.data.error || !opts.data.history) {\n if (arrVersions.length) {\n const arr = arrVersions.map(version => {\n version.canRestore = false;\n return version;\n });\n\n historyStore.setVersions(arr);\n }\n\n f7.dialog.create({\n title: t('Common.VersionHistory.notcriticalErrorTitle'),\n text: (opts.data.error) ? opts.data.error : t('Common.VersionHistory.txtErrorLoadHistory'),\n buttons: [\n {\n text: t('Common.VersionHistory.textOk')\n }\n ]\n }).open();\n } else {\n api.asc_coAuthoringDisconnect();\n\n const versions = opts.data.history;\n let arrVersions = [];\n let arrColors = [];\n let ver, version, currentVersion = null, group = -1, prev_ver = -1, docIdPrev = '', user = null, usersCnt = 0;\n\n for (ver = versions.length - 1; ver >= 0; ver--) {\n version = versions[ver];\n\n if (version.versionGroup === undefined || version.versionGroup === null) {\n version.versionGroup = version.version;\n }\n\n if (version) {\n if (!version.user) version.user = {};\n\n docIdPrev = (ver > 0 && versions[ver - 1]) ? versions[ver - 1].key : version.key + '0';\n user = historyStore.findUserById(version.user.id);\n\n if (!user) {\n const color = getUserColor(version.user.id || version.user.name || t('Common.VersionHistory.textAnonymous'), true);\n\n user = {\n id: version.user.id,\n username: version.user.name || t('Common.VersionHistory.textAnonymous'),\n colorval: color,\n color: generateUserColor(color),\n \n };\n\n historyStore.addUser(user);\n }\n\n arrVersions.push({\n version: version.versionGroup,\n revision: version.version,\n userid: version.user.id,\n username: version.user.name || t('Common.VersionHistory.textAnonymous'),\n usercolor: user.color,\n created: version.created,\n docId: version.key,\n markedAsVersion: (group !== version.versionGroup),\n selected: (opts.data.currentVersion == version.version),\n canRestore: appOptions.canHistoryRestore && (ver < versions.length - 1),\n isExpanded: true,\n serverVersion: version.serverVersion,\n fileType,\n isRevision: true\n });\n\n if (opts.data.currentVersion == version.version) {\n currentVersion = arrVersions[arrVersions.length - 1];\n }\n\n group = version.versionGroup;\n\n if (prev_ver !== version.version) {\n prev_ver = version.version;\n arrColors.reverse();\n\n for (let i = 0; i < arrColors.length; i++) {\n arrVersions[arrVersions.length - i - 2].arrColors = arrColors;\n }\n\n arrColors = [];\n }\n\n arrColors.push(user.colorval);\n\n let changes = version.changes, change, i;\n\n if (changes && changes.length > 0) {\n arrVersions[arrVersions.length - 1].docIdPrev = docIdPrev;\n\n if (version.serverVersion && version.serverVersion == appOptions.buildVersion) {\n arrVersions[arrVersions.length - 1].changeid = changes.length - 1;\n arrVersions[arrVersions.length - 1].hasChanges = changes.length > 1;\n\n for (i = changes.length - 2; i >= 0; i--) {\n change = changes[i];\n user = historyStore.findUserById(change.user.id);\n\n if (!user) {\n const color = getUserColor(change.user.id || change.user.name || t('Common.VersionHistory.textAnonymous'), true);\n\n user = {\n id: change.user.id,\n username: change.user.name || t('Common.VersionHistory.textAnonymous'),\n colorval: color,\n color: generateUserColor(color),\n };\n\n historyStore.addUser(user);\n }\n\n arrVersions.push({\n version: version.versionGroup,\n revision: version.version,\n changeid: i,\n userid: change.user.id,\n username: change.user.name || t('Common.VersionHistory.textAnonymous'),\n usercolor: user.color,\n created: change.created,\n docId: version.key,\n docIdPrev: docIdPrev,\n selected: false,\n canRestore: appOptions.canHistoryRestore && appOptions.canDownload,\n isRevision: false,\n isVisible: true,\n serverVersion: version.serverVersion,\n fileType\n });\n\n arrColors.push(user.colorval);\n }\n }\n } else if (ver == 0 && versions.length == 1) {\n arrVersions[arrVersions.length - 1].docId = version.key + '1';\n }\n }\n }\n\n if (arrColors.length > 0) {\n arrColors.reverse();\n\n for (let i = 0; i < arrColors.length; i++) {\n arrVersions[arrVersions.length - i - 1].arrColors = arrColors;\n }\n\n arrColors = [];\n }\n\n historyStore.setVersions(arrVersions);\n\n if (currentVersion === null && historyStore.arrVersions.length > 0) {\n arrVersions[0].selected = true;\n currentVersion = JSON.parse(JSON.stringify(arrVersions[0]));\n \n historyStore.setVersions([...arrVersions]);\n historyStore.changeVersion(currentVersion);\n } else if(!historyStore.currentVersion) {\n onSelectRevision(currentVersion);\n }\n }\n }\n\n const generateUserColor = color => {\n return '#' + color.toString(16);\n }\n\n const onSetHistoryData = opts => {\n if (!appOptions.canUseHistory) return;\n\n if (timeoutIdRef.current) {\n clearTimeout(timeoutIdRef.current);\n timerId = 0;\n }\n\n if (opts.data.error) {\n f7.dialog.create({\n title: t('Common.VersionHistory.notcriticalErrorTitle'),\n text: opts.data.error,\n buttons: [\n {\n text: t('Common.VersionHistory.textOk')\n }\n ]\n }).open();\n } else {\n const data = opts.data;\n \n if (data !== null) {\n let rev, revisions = historyStore.findRevisions(data.version), \n urlGetTime = new Date(),\n diff = (!opts.data.previous || currentChangeId === undefined) ? null : opts.data.changesUrl,\n url = !diff && opts.data.previous ? opts.data.previous.url : opts.data.url,\n fileType = !diff && opts.data.previous ? opts.data.previous.fileType : opts.data.fileType,\n docId = opts.data.key ? opts.data.key : currentDocId,\n docIdPrev = opts.data.previous && opts.data.previous.key ? opts.data.previous.key : currentDocIdPrev,\n token = opts.data.token;\n\n if (revisions && revisions.length > 0) {\n for(let i = 0; i < revisions.length; i++) {\n rev = revisions[i];\n rev.url = url;\n rev.urlDiff = diff;\n rev.urlGetTime = urlGetTime;\n\n if (opts.data.key) {\n rev.docId = docId;\n rev.docIdPrev = docIdPrev;\n }\n\n rev.token = token;\n\n if(fileType) {\n rev.fileType = fileType;\n }\n }\n }\n\n const hist = new Asc.asc_CVersionHistory();\n \n hist.asc_setUrl(url);\n hist.asc_setUrlChanges(diff);\n hist.asc_setDocId(!diff ? docId : docIdPrev);\n hist.asc_setCurrentChangeId(currentChangeId);\n hist.asc_setArrColors(currentArrColors.current);\n hist.asc_setToken(token);\n hist.asc_setIsRequested(true);\n hist.asc_setServerVersion(currentServerVersion);\n hist.asc_SetUserId(currentUserId);\n hist.asc_SetUserName(currentUserName);\n hist.asc_SetUserColor(currentUserColor);\n hist.asc_SetDateOfRevision(currentDateCreated);\n\n api.asc_showRevision(hist);\n currentRev = data.version;\n\n const selectedRev = revisions.find(revision => revision.selected);\n \n if(selectedRev) {\n historyStore.changeVersion(selectedRev);\n } \n }\n }\n };\n\n const onRestoreRevision = revision => {\n const isRevision = revision.isRevision;\n\n if (isRevision) {\n f7.dialog.create({\n title: t('Common.VersionHistory.titleWarningRestoreVersion'),\n text: t('Common.VersionHistory.textWarningRestoreVersion'),\n buttons: [\n {\n text: t('Common.VersionHistory.textCancel'),\n bold: true\n }, \n {\n text: t('Common.VersionHistory.textRestore'),\n onClick: () => {\n Common.Gateway.requestRestore(revision.revision, undefined, revision.fileType);\n }\n }\n ]\n }).open();\n } else {\n isFromSelectRevision = revision.revision;\n\n const fileType = Asc.c_oAscFileType[(revision.fileType || '').toUpperCase()] || Asc.c_oAscFileType.DOCX;\n api.asc_DownloadAs(new Asc.asc_CDownloadOptions(fileType, true));\n }\n }\n\n const onSelectRevision = version => {\n const rev = version.revision;\n const url = version.url;\n const urlGetTime = new Date();\n\n historyStore.changeVersion(version);\n\n currentRev = rev;\n currentChangeId = version.changeid;\n currentDocId = version.docId;\n currentDocIdPrev = version.docIdPrev;\n currentArrColors.current = version.arrColors;\n currentServerVersion = version.serverVersion;\n currentUserId = version.userid;\n currentUserName = version.username;\n currentUserColor = version.usercolor;\n currentDateCreated = version.created;\n\n if (!url || (urlGetTime - version.urlGetTime > 5 * 60000)) {\n if (!timerId) {\n timeoutIdRef.current = setTimeout(() => {\n timerId = 0;\n }, 30000);\n\n setTimeout(() => {\n Common.Gateway.requestHistoryData(rev);\n }, 10);\n }\n } else {\n const urlDiff = version.urlDiff;\n const token = version.token;\n const hist = new Asc.asc_CVersionHistory();\n\n hist.asc_setDocId(!urlDiff ? currentDocId : currentDocIdPrev);\n hist.asc_setUrl(url);\n hist.asc_setUrlChanges(urlDiff);\n hist.asc_setCurrentChangeId(currentChangeId);\n hist.asc_setArrColors(currentArrColors.current);\n hist.asc_setToken(token);\n hist.asc_setIsRequested(false);\n hist.asc_setServerVersion(currentServerVersion);\n hist.asc_SetUserId(currentUserId);\n hist.asc_SetUserName(currentUserName);\n hist.asc_SetUserColor(currentUserColor);\n hist.asc_SetDateOfRevision(currentDateCreated);\n\n api.asc_showRevision(hist);\n }\n }\n\n return (\n props.isNavigate ?\n !Device.phone &&\n \n :\n !Device.phone ?\n props.onclosed()}>\n \n \n \n \n :\n props.onclosed()}>\n \n \n\n )\n}));\n\nexport default VersionHistoryController;\n","import React, { useContext, useEffect } from 'react';\nimport { View, Popup, Popover, f7 } from 'framework7-react';\nimport { Device } from '../../../../../common/mobile/utils/device';\nimport SpreadsheetSettingsController from '../../controller/settings/SpreadsheetSettings.jsx';\nimport ApplicationSettingsController from '../../controller/settings/ApplicationSettings.jsx';\nimport SpreadsheetInfoController from '../../controller/settings/SpreadsheetInfo.jsx';\nimport { DownloadWithTranslation } from '../../controller/settings/Download.jsx';\nimport { SpreadsheetColorSchemes, SpreadsheetFormats, SpreadsheetMargins } from './SpreadsheetSettings.jsx';\nimport { MacrosSettings, RegionalSettings, FormulaLanguage, ThemeSettings } from './ApplicationSettings.jsx';\nimport About from '../../../../../common/mobile/lib/view/About';\nimport SettingsPage from './SettingsPage';\nimport { MainContext } from '../../page/main';\nimport VersionHistoryController from '../../../../../common/mobile/lib/controller/VersionHistory';\n\nconst routes = [\n {\n path: '/settings-page/',\n component: SettingsPage,\n keepAlive: true\n },\n {\n path: '/spreadsheet-settings/',\n component: SpreadsheetSettingsController,\n },\n {\n path: \"/color-schemes/\",\n component: SpreadsheetColorSchemes\n },\n {\n path: '/spreadsheet-formats/',\n component: SpreadsheetFormats\n },\n {\n path: '/margins/',\n component: SpreadsheetMargins\n },\n {\n path: '/download/',\n component: DownloadWithTranslation\n },\n {\n path: '/application-settings/',\n component: ApplicationSettingsController\n },\n {\n path: '/macros-settings/',\n component: MacrosSettings\n },\n {\n path: '/theme-settings/',\n component: ThemeSettings\n },\n {\n path: '/regional-settings/',\n component: RegionalSettings\n },\n {\n path: '/formula-languages/',\n component: FormulaLanguage\n },\n {\n path: '/spreadsheet-info/',\n component: SpreadsheetInfoController\n },\n {\n path: '/about/',\n component: About\n },\n // Version History \n {\n path: '/version-history',\n component: VersionHistoryController,\n options: {\n props: {\n isNavigate: true\n }\n }\n },\n];\n\nroutes.forEach(route => {\n route.options = {\n ...route.options,\n transition: 'f7-push'\n };\n});\n\nconst SettingsView = () => {\n const mainContext = useContext(MainContext);\n\n useEffect(() => {\n if(Device.phone) {\n f7.popup.open('.settings-popup');\n } else {\n f7.popover.open('#settings-popover', '#btn-settings');\n }\n }, []);\n\n return (\n !Device.phone ?\n mainContext.closeOptions('settings')}>\n \n \n \n :\n mainContext.closeOptions('settings')}>\n \n \n \n \n )\n}\n\nexport default SettingsView;","import React, { createContext } from 'react';\nimport { observer, inject } from \"mobx-react\";\nimport { Device } from '../../../../../common/mobile/utils/device';\nimport SettingsView from \"../../view/settings/Settings\";\nimport { f7 } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\n\nexport const SettingsContext = createContext();\n\nconst SettingsController = inject('storeAppOptions', 'storeSpreadsheetInfo')(observer(props => {\n const storeSpreadsheetInfo = props.storeSpreadsheetInfo;\n const appOptions = props.storeAppOptions;\n const docTitle = storeSpreadsheetInfo.dataDoc?.title ?? '';\n const docExt = storeSpreadsheetInfo.dataDoc?.fileType ?? '';\n const { t } = useTranslation();\n\n const closeModal = () => {\n if(Device.phone) {\n f7.sheet.close('.settings-popup', false);\n } else {\n f7.popover.close('#settings-popover', false);\n }\n };\n\n const onPrint = () => {\n const api = Common.EditorApi.get();\n\n closeModal();\n setTimeout(() => {\n api.asc_Print();\n }, 400);\n };\n\n const showHelp = () => {\n // let url = '{{HELP_URL}}';\n // let url = 'https://helpcenter.onlyoffice.com';\n let url = __HELP_URL__;\n\n if (url.charAt(url.length-1) !== '/') {\n url += '/';\n }\n\n if (Device.sailfish || Device.android) {\n url+='mobile-applications/documents/mobile-web-editors/android/index.aspx';\n } \n else {\n url+='mobile-applications/documents/mobile-web-editors/ios/index.aspx';\n }\n\n closeModal();\n window.open(url, \"_blank\");\n };\n\n const showFeedback = () => {\n let config = appOptions.config;\n\n closeModal();\n if(config && !!config.feedback && !!config.feedback.url) {\n window.open(config.feedback.url, \"_blank\");\n } else window.open(__SUPPORT_URL__, \"_blank\");\n };\n\n const onDownloadOrigin = () => {\n closeModal();\n setTimeout(() => {\n Common.EditorApi.get().asc_DownloadOrigin();\n }, 0);\n };\n\n const changeTitleHandler = () => {\n if(!appOptions.canRename) return;\n\n const api = Common.EditorApi.get();\n api.asc_enableKeyEvents(true);\n\n f7.dialog.create({\n title: t('Toolbar.textRenameFile'),\n text : t('Toolbar.textEnterNewFileName'),\n content: Device.ios ?\n `\n \n
` : \n ``,\n cssClass: 'dlg-adv-options',\n buttons: [\n {\n text: t('View.Edit.textCancel')\n },\n {\n text: t('View.Edit.textOk'),\n cssClass: 'btn-change-title',\n bold: true,\n close: false,\n onClick: () => {\n const titleFieldValue = document.querySelector('#modal-title').value;\n\n if(titleFieldValue.trim().length) {\n changeTitle(titleFieldValue);\n f7.dialog.close();\n }\n }\n }\n ],\n on: {\n opened: () => {\n const nameDoc = docTitle.split('.')[0];\n const titleField = document.querySelector('#modal-title');\n const btnChangeTitle = document.querySelector('.btn-change-title');\n\n titleField.value = nameDoc;\n titleField.focus();\n titleField.select();\n\n titleField.addEventListener('input', () => {\n if(titleField.value.trim().length) {\n btnChangeTitle.classList.remove('disabled');\n } else {\n btnChangeTitle.classList.add('disabled');\n }\n });\n }\n }\n }).open();\n }\n\n const cutDocName = name => {\n if(name.length <= docExt.length) return name;\n const idx = name.length - docExt.length;\n\n return name.substring(idx) == docExt ? name.substring(0, idx) : name;\n };\n\n const changeTitle = (name) => {\n const api = Common.EditorApi.get();\n const currentTitle = `${name}.${docExt}`;\n let formatName = name.trim();\n\n if(formatName.length > 0 && cutDocName(currentTitle) !== formatName) {\n if(/[\\t*\\+:\\\"<>?|\\\\\\\\/]/gim.test(formatName)) {\n f7.dialog.create({\n title: t('View.Edit.notcriticalErrorTitle'),\n text: t('View.Edit.textInvalidName') + '*+:\\\"<>?|\\/',\n buttons: [\n {\n text: t('View.Edit.textOk'),\n close: true\n }\n ]\n }).open();\n } else {\n const wopi = appOptions.wopi;\n formatName = cutDocName(formatName);\n\n if(wopi) {\n api.asc_wopi_renameFile(formatName);\n } else {\n Common.Gateway.requestRename(formatName);\n }\n\n const newTitle = `${formatName}.${docExt}`;\n storeSpreadsheetInfo.changeTitle(newTitle);\n }\n }\n }\n\n return (\n \n \n \n );\n}));\n\nexport default SettingsController;","import React, {Fragment, useState} from 'react';\nimport {Page, Navbar, BlockTitle, List, ListItem, ListInput, ListButton, Icon} from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\n\nconst AddImageList = props => {\n const { t } = useTranslation();\n const _t = t('View.Add', {returnObjects: true});\n return (\n \n {props.onInsertByFile()}}>\n \n \n \n \n \n
\n )\n};\n\nconst PageLinkSettings = props => {\n const { t } = useTranslation();\n const _t = t('View.Add', {returnObjects: true});\n const [stateValue, setValue] = useState('');\n return (\n \n \n {_t.textAddress}\n \n {setValue(event.target.value)}}\n >\n \n
\n \n {props.onInsertByUrl(stateValue)}}>\n
\n \n )\n};\n\nconst AddImage = props => {\n const { t } = useTranslation();\n const _t = t('View.Add', {returnObjects: true});\n return (\n props.inTabs ?\n :\n \n \n \n \n )\n};\n\nexport {AddImage, PageLinkSettings as PageImageLinkSettings};","import React, {Component} from 'react';\nimport { f7 } from 'framework7-react';\nimport {Device} from '../../../../../common/mobile/utils/device';\nimport {withTranslation} from 'react-i18next';\n\nimport {AddImage} from '../../view/add/AddImage';\n\nclass AddImageController extends Component {\n constructor (props) {\n super(props);\n this.onInsertByFile = this.onInsertByFile.bind(this);\n this.onInsertByUrl = this.onInsertByUrl.bind(this);\n }\n\n closeModal () {\n if ( Device.phone ) {\n f7.sheet.close('.add-popup', true);\n } else {\n f7.popover.close('#add-popover');\n }\n }\n\n onInsertByFile () {\n const api = Common.EditorApi.get();\n api.asc_addImage();\n this.closeModal();\n }\n\n onInsertByUrl (value) {\n const { t } = this.props;\n const _t = t(\"View.Add\", { returnObjects: true });\n\n const _value = value.replace(/ /g, '');\n\n if (_value) {\n if ((/((^https?)|(^ftp)):\\/\\/.+/i.test(_value))) {\n this.closeModal();\n const api = Common.EditorApi.get();\n api.asc_addImageDrawingObject([_value]);\n } else {\n f7.dialog.alert(_t.txtNotUrl, _t.notcriticalErrorTitle);\n }\n } else {\n f7.dialog.alert(_t.textEmptyImgUrl, _t.notcriticalErrorTitle);\n }\n }\n\n render () {\n return (\n \n )\n }\n}\n\nconst AddImageWithTranslation = withTranslation()(AddImageController);\n\nexport {AddImageWithTranslation as AddImageController};","import React, {useState} from 'react';\nimport {Page, Navbar, List, ListItem, Icon, Toggle} from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\n\nconst AddSortAndFilter = props => {\n const { t } = useTranslation();\n const _t = t('View.Add', {returnObjects: true});\n const [isFilter, setIsFilter] = useState(props.isFilter);\n const wsLock = props.wsLock;\n\n return (\n \n \n \n \n \n \n
\n {!wsLock && \n \n \n {\n setIsFilter(!isFilter);\n props.onInsertFilter(!isFilter)}\n }\n />\n \n
\n }\n \n )\n};\n\nexport default AddSortAndFilter;","import React, {Component} from 'react';\nimport { f7 } from 'framework7-react';\nimport { withTranslation } from 'react-i18next';\nimport {observer, inject} from \"mobx-react\";\n\nimport AddSortAndFilter from '../../view/add/AddFilter';\n\nclass AddFilterController extends Component {\n constructor (props) {\n super(props);\n this.onInsertFilter = this.onInsertFilter.bind(this);\n this.uncheckedFilter = this.uncheckedFilter.bind(this);\n this.onInsertSort = this.onInsertSort.bind(this);\n\n const api = Common.EditorApi.get();\n\n const filterInfo = api.asc_getCellInfo().asc_getAutoFilterInfo();\n const isFilter = (filterInfo ? filterInfo.asc_getIsAutoFilter() : false);\n\n this.state = {\n isFilter: isFilter\n };\n }\n\n componentDidMount () {\n const api = Common.EditorApi.get();\n const appOptions = this.props.storeAppOptions;\n\n api.asc_setFilteringMode && api.asc_setFilteringMode(appOptions.canModifyFilter);\n api.asc_registerCallback('asc_onError', this.uncheckedFilter);\n }\n\n componentWillUnmount () {\n const api = Common.EditorApi.get();\n api.asc_unregisterCallback('asc_onError', this.uncheckedFilter);\n }\n\n uncheckedFilter (id, level, errData) {\n setTimeout(() => {\n if (id === Asc.c_oAscError.ID.AutoFilterDataRangeError) {\n this.setState({isFilter: false});\n }\n }, 0);\n }\n\n onInsertSort (type) {\n const api = Common.EditorApi.get();\n const { t } = this.props;\n const _t = t('View.Add', {returnObjects: true});\n\n f7.popup.close('.add-popup');\n f7.popover.close('#add-popover');\n \n let typeCheck = type == 'down' ? Asc.c_oAscSortOptions.Ascending : Asc.c_oAscSortOptions.Descending;\n let res = api.asc_sortCellsRangeExpand();\n switch (res) {\n case Asc.c_oAscSelectionSortExpand.showExpandMessage:\n f7.dialog.create({\n title: _t.txtSorting,\n text: _t.txtExpandSort,\n buttons: [\n {\n text: _t.txtExpand,\n bold: true,\n onClick: () => {\n api.asc_sortColFilter(typeCheck, '', undefined, undefined, true);\n }\n },\n {\n text: _t.txtSortSelected,\n bold: true,\n onClick: () => {\n api.asc_sortColFilter(typeCheck, '', undefined, undefined);\n }\n },\n {\n text: _t.textCancel\n }\n ],\n verticalButtons: true\n }).open();\n break;\n case Asc.c_oAscSelectionSortExpand.showLockMessage:\n f7.dialog.create({\n title: _t.txtSorting,\n text: _t.txtLockSort,\n buttons: [\n {\n text: _t.txtYes,\n bold: true,\n onClick: () => {\n api.asc_sortColFilter(typeCheck, '', undefined, undefined, false);\n }\n },\n {\n text: _t.txtNo\n }\n ],\n verticalButtons: true\n }).open();\n break;\n case Asc.c_oAscSelectionSortExpand.expandAndNotShowMessage:\n case Asc.c_oAscSelectionSortExpand.notExpandAndNotShowMessage:\n api.asc_sortColFilter(typeCheck, '', undefined, undefined, res === Asc.c_oAscSelectionSortExpand.expandAndNotShowMessage);\n break;\n }\n }\n\n onInsertFilter (checked) {\n this.setState({isFilter: checked});\n const api = Common.EditorApi.get();\n const formatTableInfo = api.asc_getCellInfo().asc_getFormatTableInfo();\n const tablename = (formatTableInfo) ? formatTableInfo.asc_getTableName() : undefined;\n \n if (checked || tablename) {\n api.asc_addAutoFilter();\n } else {\n api.asc_changeAutoFilter(tablename, Asc.c_oAscChangeFilterOptions.filter, checked);\n }\n }\n\n render () {\n return (\n \n )\n }\n}\n\nexport default inject(\"storeWorksheets\", \"storeAppOptions\")(observer(withTranslation()(AddFilterController)));","import React from 'react';\nconst TabsSwipeableContext = /*#__PURE__*/React.createContext(false);\nexport { TabsSwipeableContext };","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { TabsSwipeableContext } from '../shared/tabs-swipeable-context.js';\n\n\nconst Tabs = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n animated,\n swipeable,\n routable,\n swiperParams\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n useIsomorphicLayoutEffect(() => {\n if (!swipeable || !swiperParams) return;\n if (!elRef.current) return;\n Object.assign(elRef.current, swiperParams);\n elRef.current.initialize();\n }, []);\n const classes = classNames(className, colorClasses(props));\n const tabsClasses = classNames({\n tabs: true,\n 'tabs-routable': routable\n });\n if (animated) {\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classNames('tabs-animated-wrap', classes),\n ref: elRef\n }, extraAttrs), /*#__PURE__*/React.createElement(\"div\", {\n className: tabsClasses\n }, children));\n }\n if (swipeable) {\n return /*#__PURE__*/React.createElement(\"swiper-container\", _extends({\n id: id,\n style: style,\n class: classNames(tabsClasses, classes),\n ref: elRef,\n init: swiperParams ? 'false' : 'true'\n }, extraAttrs), /*#__PURE__*/React.createElement(TabsSwipeableContext.Provider, {\n value: true\n }, children));\n }\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n id: id,\n style: style,\n className: classNames(tabsClasses, classes),\n ref: elRef\n }, extraAttrs), children);\n});\nTabs.displayName = 'f7-tabs';\nexport default Tabs;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle, useState, useContext } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, getComponentId } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7ready, f7routers, f7, f7events } from '../shared/f7.js';\nimport { useTab } from '../shared/use-tab.js';\nimport { RouterContext } from '../shared/router-context.js';\nimport { useAsyncComponent } from '../shared/use-async-component.js';\nimport { TabsSwipeableContext } from '../shared/tabs-swipeable-context.js';\n\n\nconst Tab = /*#__PURE__*/forwardRef((props, ref) => {\n const {\n className,\n id,\n style,\n children,\n tabActive\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n const routerData = useRef(null);\n const routerContext = useContext(RouterContext);\n const tabsSwipeableContext = useContext(TabsSwipeableContext);\n let initialTabContent = null;\n if (!routerData.current && routerContext && routerContext.route && routerContext.route.route && routerContext.route.route.tab && routerContext.route.route.tab.id === id) {\n const {\n component,\n asyncComponent,\n options: tabRouteOptions\n } = routerContext.route.route.tab;\n if (component || asyncComponent) {\n const parentProps = routerContext.route.route.options && routerContext.route.route.options.props;\n initialTabContent = {\n id: getComponentId(),\n component: component || asyncComponent,\n isAsync: !!asyncComponent,\n props: {\n ...(parentProps || {}),\n ...(tabRouteOptions && tabRouteOptions.props || {}),\n f7router: routerContext.router,\n f7route: routerContext.route,\n ...routerContext.route.params\n }\n };\n }\n }\n const [tabContent, setTabContent] = useState(initialTabContent || null);\n useImperativeHandle(ref, () => ({\n el: elRef.current\n }));\n if (f7 && !routerData.current) {\n routerData.current = {\n setTabContent\n };\n f7routers.tabs.push(routerData.current);\n }\n const onMount = () => {\n if (elRef.current && initialTabContent) {\n elRef.current.f7RouterTabLoaded = true;\n }\n f7ready(() => {\n if (!routerData.current) {\n routerData.current = {\n el: elRef.current,\n setTabContent\n };\n f7routers.tabs.push(routerData.current);\n } else {\n routerData.current.el = elRef.current;\n }\n });\n };\n const onDestroy = () => {\n if (!routerData.current) return;\n f7routers.tabs.splice(f7routers.tabs.indexOf(routerData.current), 1);\n routerData.current = null;\n };\n useIsomorphicLayoutEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n useIsomorphicLayoutEffect(() => {\n if (!routerData.current || !f7) return;\n f7events.emit('tabRouterDidUpdate', routerData.current);\n });\n useTab(elRef, props);\n const classes = classNames(className, 'tab', {\n 'tab-active': tabActive\n }, colorClasses(props));\n const renderChildren = () => {\n if (!tabContent) return children;\n if (tabContent.isAsync) {\n return useAsyncComponent(tabContent.component, tabContent.props, tabContent.id);\n }\n const TabContent = tabContent.component;\n return /*#__PURE__*/React.createElement(TabContent, _extends({\n key: tabContent.id\n }, tabContent.props));\n };\n const Component = tabsSwipeableContext ? 'swiper-slide' : 'div';\n const classAttrs = tabsSwipeableContext ? {\n class: classes\n } : {\n className: classes\n };\n return /*#__PURE__*/React.createElement(Component, _extends({\n id: id,\n style: style,\n ref: elRef\n }, extraAttrs, classAttrs), renderChildren());\n});\nTab.displayName = 'f7-tab';\nexport default Tab;","/**\n * Swiper React 10.3.1\n * Most modern mobile touch slider and framework with hardware accelerated transitions\n * https://swiperjs.com\n *\n * Copyright 2014-2023 Vladimir Kharlampidi\n *\n * Released under the MIT License\n *\n * Released on: September 28, 2023\n */\n\nimport React, { useEffect, useLayoutEffect, useContext, createContext, forwardRef, useState, useRef } from 'react';\nimport { S as Swiper$1 } from './shared/swiper-core.mjs';\nimport { g as getParams, m as mountSwiper, a as getChangedParams, u as updateOnVirtualData } from './shared/update-on-virtual-data.mjs';\nimport { d as uniqueClasses, w as wrapperClass, n as needsNavigation, b as needsScrollbar, a as needsPagination, e as extend, u as updateSwiper } from './shared/update-swiper.mjs';\n\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\nfunction isChildSwiperSlide(child) {\n return child.type && child.type.displayName && child.type.displayName.includes('SwiperSlide');\n}\nfunction processChildren(c) {\n const slides = [];\n React.Children.toArray(c).forEach(child => {\n if (isChildSwiperSlide(child)) {\n slides.push(child);\n } else if (child.props && child.props.children) {\n processChildren(child.props.children).forEach(slide => slides.push(slide));\n }\n });\n return slides;\n}\nfunction getChildren(c) {\n const slides = [];\n const slots = {\n 'container-start': [],\n 'container-end': [],\n 'wrapper-start': [],\n 'wrapper-end': []\n };\n React.Children.toArray(c).forEach(child => {\n if (isChildSwiperSlide(child)) {\n slides.push(child);\n } else if (child.props && child.props.slot && slots[child.props.slot]) {\n slots[child.props.slot].push(child);\n } else if (child.props && child.props.children) {\n const foundSlides = processChildren(child.props.children);\n if (foundSlides.length > 0) {\n foundSlides.forEach(slide => slides.push(slide));\n } else {\n slots['container-end'].push(child);\n }\n } else {\n slots['container-end'].push(child);\n }\n });\n return {\n slides,\n slots\n };\n}\n\nfunction renderVirtual(swiper, slides, virtualData) {\n if (!virtualData) return null;\n const getSlideIndex = index => {\n let slideIndex = index;\n if (index < 0) {\n slideIndex = slides.length + index;\n } else if (slideIndex >= slides.length) {\n // eslint-disable-next-line\n slideIndex = slideIndex - slides.length;\n }\n return slideIndex;\n };\n const style = swiper.isHorizontal() ? {\n [swiper.rtlTranslate ? 'right' : 'left']: `${virtualData.offset}px`\n } : {\n top: `${virtualData.offset}px`\n };\n const {\n from,\n to\n } = virtualData;\n const loopFrom = swiper.params.loop ? -slides.length : 0;\n const loopTo = swiper.params.loop ? slides.length * 2 : slides.length;\n const slidesToRender = [];\n for (let i = loopFrom; i < loopTo; i += 1) {\n if (i >= from && i <= to) {\n slidesToRender.push(slides[getSlideIndex(i)]);\n }\n }\n return slidesToRender.map((child, index) => {\n return /*#__PURE__*/React.cloneElement(child, {\n swiper,\n style,\n key: `slide-${index}`\n });\n });\n}\n\nfunction useIsomorphicLayoutEffect(callback, deps) {\n // eslint-disable-next-line\n if (typeof window === 'undefined') return useEffect(callback, deps);\n return useLayoutEffect(callback, deps);\n}\n\nconst SwiperSlideContext = /*#__PURE__*/createContext(null);\nconst useSwiperSlide = () => {\n return useContext(SwiperSlideContext);\n};\nconst SwiperContext = /*#__PURE__*/createContext(null);\nconst useSwiper = () => {\n return useContext(SwiperContext);\n};\n\nconst Swiper = /*#__PURE__*/forwardRef(function (_temp, externalElRef) {\n let {\n className,\n tag: Tag = 'div',\n wrapperTag: WrapperTag = 'div',\n children,\n onSwiper,\n ...rest\n } = _temp === void 0 ? {} : _temp;\n let eventsAssigned = false;\n const [containerClasses, setContainerClasses] = useState('swiper');\n const [virtualData, setVirtualData] = useState(null);\n const [breakpointChanged, setBreakpointChanged] = useState(false);\n const initializedRef = useRef(false);\n const swiperElRef = useRef(null);\n const swiperRef = useRef(null);\n const oldPassedParamsRef = useRef(null);\n const oldSlides = useRef(null);\n const nextElRef = useRef(null);\n const prevElRef = useRef(null);\n const paginationElRef = useRef(null);\n const scrollbarElRef = useRef(null);\n const {\n params: swiperParams,\n passedParams,\n rest: restProps,\n events\n } = getParams(rest);\n const {\n slides,\n slots\n } = getChildren(children);\n const onBeforeBreakpoint = () => {\n setBreakpointChanged(!breakpointChanged);\n };\n Object.assign(swiperParams.on, {\n _containerClasses(swiper, classes) {\n setContainerClasses(classes);\n }\n });\n const initSwiper = () => {\n // init swiper\n Object.assign(swiperParams.on, events);\n eventsAssigned = true;\n const passParams = {\n ...swiperParams\n };\n delete passParams.wrapperClass;\n swiperRef.current = new Swiper$1(passParams);\n if (swiperRef.current.virtual && swiperRef.current.params.virtual.enabled) {\n swiperRef.current.virtual.slides = slides;\n const extendWith = {\n cache: false,\n slides,\n renderExternal: setVirtualData,\n renderExternalUpdate: false\n };\n extend(swiperRef.current.params.virtual, extendWith);\n extend(swiperRef.current.originalParams.virtual, extendWith);\n }\n };\n if (!swiperElRef.current) {\n initSwiper();\n }\n\n // Listen for breakpoints change\n if (swiperRef.current) {\n swiperRef.current.on('_beforeBreakpoint', onBeforeBreakpoint);\n }\n const attachEvents = () => {\n if (eventsAssigned || !events || !swiperRef.current) return;\n Object.keys(events).forEach(eventName => {\n swiperRef.current.on(eventName, events[eventName]);\n });\n };\n const detachEvents = () => {\n if (!events || !swiperRef.current) return;\n Object.keys(events).forEach(eventName => {\n swiperRef.current.off(eventName, events[eventName]);\n });\n };\n useEffect(() => {\n return () => {\n if (swiperRef.current) swiperRef.current.off('_beforeBreakpoint', onBeforeBreakpoint);\n };\n });\n\n // set initialized flag\n useEffect(() => {\n if (!initializedRef.current && swiperRef.current) {\n swiperRef.current.emitSlidesClasses();\n initializedRef.current = true;\n }\n });\n\n // mount swiper\n useIsomorphicLayoutEffect(() => {\n if (externalElRef) {\n externalElRef.current = swiperElRef.current;\n }\n if (!swiperElRef.current) return;\n if (swiperRef.current.destroyed) {\n initSwiper();\n }\n mountSwiper({\n el: swiperElRef.current,\n nextEl: nextElRef.current,\n prevEl: prevElRef.current,\n paginationEl: paginationElRef.current,\n scrollbarEl: scrollbarElRef.current,\n swiper: swiperRef.current\n }, swiperParams);\n if (onSwiper) onSwiper(swiperRef.current);\n // eslint-disable-next-line\n return () => {\n if (swiperRef.current && !swiperRef.current.destroyed) {\n swiperRef.current.destroy(true, false);\n }\n };\n }, []);\n\n // watch for params change\n useIsomorphicLayoutEffect(() => {\n attachEvents();\n const changedParams = getChangedParams(passedParams, oldPassedParamsRef.current, slides, oldSlides.current, c => c.key);\n oldPassedParamsRef.current = passedParams;\n oldSlides.current = slides;\n if (changedParams.length && swiperRef.current && !swiperRef.current.destroyed) {\n updateSwiper({\n swiper: swiperRef.current,\n slides,\n passedParams,\n changedParams,\n nextEl: nextElRef.current,\n prevEl: prevElRef.current,\n scrollbarEl: scrollbarElRef.current,\n paginationEl: paginationElRef.current\n });\n }\n return () => {\n detachEvents();\n };\n });\n\n // update on virtual update\n useIsomorphicLayoutEffect(() => {\n updateOnVirtualData(swiperRef.current);\n }, [virtualData]);\n\n // bypass swiper instance to slides\n function renderSlides() {\n if (swiperParams.virtual) {\n return renderVirtual(swiperRef.current, slides, virtualData);\n }\n return slides.map((child, index) => {\n return /*#__PURE__*/React.cloneElement(child, {\n swiper: swiperRef.current,\n swiperSlideIndex: index\n });\n });\n }\n return /*#__PURE__*/React.createElement(Tag, _extends({\n ref: swiperElRef,\n className: uniqueClasses(`${containerClasses}${className ? ` ${className}` : ''}`)\n }, restProps), /*#__PURE__*/React.createElement(SwiperContext.Provider, {\n value: swiperRef.current\n }, slots['container-start'], /*#__PURE__*/React.createElement(WrapperTag, {\n className: wrapperClass(swiperParams.wrapperClass)\n }, slots['wrapper-start'], renderSlides(), slots['wrapper-end']), needsNavigation(swiperParams) && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(\"div\", {\n ref: prevElRef,\n className: \"swiper-button-prev\"\n }), /*#__PURE__*/React.createElement(\"div\", {\n ref: nextElRef,\n className: \"swiper-button-next\"\n })), needsScrollbar(swiperParams) && /*#__PURE__*/React.createElement(\"div\", {\n ref: scrollbarElRef,\n className: \"swiper-scrollbar\"\n }), needsPagination(swiperParams) && /*#__PURE__*/React.createElement(\"div\", {\n ref: paginationElRef,\n className: \"swiper-pagination\"\n }), slots['container-end']));\n});\nSwiper.displayName = 'Swiper';\n\nconst SwiperSlide = /*#__PURE__*/forwardRef(function (_temp, externalRef) {\n let {\n tag: Tag = 'div',\n children,\n className = '',\n swiper,\n zoom,\n lazy,\n virtualIndex,\n swiperSlideIndex,\n ...rest\n } = _temp === void 0 ? {} : _temp;\n const slideElRef = useRef(null);\n const [slideClasses, setSlideClasses] = useState('swiper-slide');\n const [lazyLoaded, setLazyLoaded] = useState(false);\n function updateClasses(_s, el, classNames) {\n if (el === slideElRef.current) {\n setSlideClasses(classNames);\n }\n }\n useIsomorphicLayoutEffect(() => {\n if (typeof swiperSlideIndex !== 'undefined') {\n slideElRef.current.swiperSlideIndex = swiperSlideIndex;\n }\n if (externalRef) {\n externalRef.current = slideElRef.current;\n }\n if (!slideElRef.current || !swiper) {\n return;\n }\n if (swiper.destroyed) {\n if (slideClasses !== 'swiper-slide') {\n setSlideClasses('swiper-slide');\n }\n return;\n }\n swiper.on('_slideClass', updateClasses);\n // eslint-disable-next-line\n return () => {\n if (!swiper) return;\n swiper.off('_slideClass', updateClasses);\n };\n });\n useIsomorphicLayoutEffect(() => {\n if (swiper && slideElRef.current && !swiper.destroyed) {\n setSlideClasses(swiper.getSlideClasses(slideElRef.current));\n }\n }, [swiper]);\n const slideData = {\n isActive: slideClasses.indexOf('swiper-slide-active') >= 0,\n isVisible: slideClasses.indexOf('swiper-slide-visible') >= 0,\n isPrev: slideClasses.indexOf('swiper-slide-prev') >= 0,\n isNext: slideClasses.indexOf('swiper-slide-next') >= 0\n };\n const renderChildren = () => {\n return typeof children === 'function' ? children(slideData) : children;\n };\n const onLoad = () => {\n setLazyLoaded(true);\n };\n return /*#__PURE__*/React.createElement(Tag, _extends({\n ref: slideElRef,\n className: uniqueClasses(`${slideClasses}${className ? ` ${className}` : ''}`),\n \"data-swiper-slide-index\": virtualIndex,\n onLoad: onLoad\n }, rest), zoom && /*#__PURE__*/React.createElement(SwiperSlideContext.Provider, {\n value: slideData\n }, /*#__PURE__*/React.createElement(\"div\", {\n className: \"swiper-zoom-container\",\n \"data-swiper-zoom\": typeof zoom === 'number' ? zoom : undefined\n }, renderChildren(), lazy && !lazyLoaded && /*#__PURE__*/React.createElement(\"div\", {\n className: \"swiper-lazy-preloader\"\n }))), !zoom && /*#__PURE__*/React.createElement(SwiperSlideContext.Provider, {\n value: slideData\n }, renderChildren(), lazy && !lazyLoaded && /*#__PURE__*/React.createElement(\"div\", {\n className: \"swiper-lazy-preloader\"\n })));\n});\nSwiperSlide.displayName = 'SwiperSlide';\n\nexport { Swiper, SwiperSlide, useSwiper, useSwiperSlide };\n","import { e as extend, p as paramsList, i as isObject, n as needsNavigation, a as needsPagination, b as needsScrollbar } from './update-swiper.mjs';\nimport { d as defaults } from './swiper-core.mjs';\n\nfunction getParams(obj, splitEvents) {\n if (obj === void 0) {\n obj = {};\n }\n if (splitEvents === void 0) {\n splitEvents = true;\n }\n const params = {\n on: {}\n };\n const events = {};\n const passedParams = {};\n extend(params, defaults);\n params._emitClasses = true;\n params.init = false;\n const rest = {};\n const allowedParams = paramsList.map(key => key.replace(/_/, ''));\n const plainObj = Object.assign({}, obj);\n Object.keys(plainObj).forEach(key => {\n if (typeof obj[key] === 'undefined') return;\n if (allowedParams.indexOf(key) >= 0) {\n if (isObject(obj[key])) {\n params[key] = {};\n passedParams[key] = {};\n extend(params[key], obj[key]);\n extend(passedParams[key], obj[key]);\n } else {\n params[key] = obj[key];\n passedParams[key] = obj[key];\n }\n } else if (key.search(/on[A-Z]/) === 0 && typeof obj[key] === 'function') {\n if (splitEvents) {\n events[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key];\n } else {\n params.on[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key];\n }\n } else {\n rest[key] = obj[key];\n }\n });\n ['navigation', 'pagination', 'scrollbar'].forEach(key => {\n if (params[key] === true) params[key] = {};\n if (params[key] === false) delete params[key];\n });\n return {\n params,\n passedParams,\n rest,\n events\n };\n}\n\nfunction mountSwiper(_ref, swiperParams) {\n let {\n el,\n nextEl,\n prevEl,\n paginationEl,\n scrollbarEl,\n swiper\n } = _ref;\n if (needsNavigation(swiperParams) && nextEl && prevEl) {\n swiper.params.navigation.nextEl = nextEl;\n swiper.originalParams.navigation.nextEl = nextEl;\n swiper.params.navigation.prevEl = prevEl;\n swiper.originalParams.navigation.prevEl = prevEl;\n }\n if (needsPagination(swiperParams) && paginationEl) {\n swiper.params.pagination.el = paginationEl;\n swiper.originalParams.pagination.el = paginationEl;\n }\n if (needsScrollbar(swiperParams) && scrollbarEl) {\n swiper.params.scrollbar.el = scrollbarEl;\n swiper.originalParams.scrollbar.el = scrollbarEl;\n }\n swiper.init(el);\n}\n\nfunction getChangedParams(swiperParams, oldParams, children, oldChildren, getKey) {\n const keys = [];\n if (!oldParams) return keys;\n const addKey = key => {\n if (keys.indexOf(key) < 0) keys.push(key);\n };\n if (children && oldChildren) {\n const oldChildrenKeys = oldChildren.map(getKey);\n const childrenKeys = children.map(getKey);\n if (oldChildrenKeys.join('') !== childrenKeys.join('')) addKey('children');\n if (oldChildren.length !== children.length) addKey('children');\n }\n const watchParams = paramsList.filter(key => key[0] === '_').map(key => key.replace(/_/, ''));\n watchParams.forEach(key => {\n if (key in swiperParams && key in oldParams) {\n if (isObject(swiperParams[key]) && isObject(oldParams[key])) {\n const newKeys = Object.keys(swiperParams[key]);\n const oldKeys = Object.keys(oldParams[key]);\n if (newKeys.length !== oldKeys.length) {\n addKey(key);\n } else {\n newKeys.forEach(newKey => {\n if (swiperParams[key][newKey] !== oldParams[key][newKey]) {\n addKey(key);\n }\n });\n oldKeys.forEach(oldKey => {\n if (swiperParams[key][oldKey] !== oldParams[key][oldKey]) addKey(key);\n });\n }\n } else if (swiperParams[key] !== oldParams[key]) {\n addKey(key);\n }\n }\n });\n return keys;\n}\n\nconst updateOnVirtualData = swiper => {\n if (!swiper || swiper.destroyed || !swiper.params.virtual || swiper.params.virtual && !swiper.params.virtual.enabled) return;\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n if (swiper.parallax && swiper.params.parallax && swiper.params.parallax.enabled) {\n swiper.parallax.setTranslate();\n }\n};\n\nexport { getChangedParams as a, getParams as g, mountSwiper as m, updateOnVirtualData as u };\n","import React from 'react';\nimport {observer, inject} from \"mobx-react\";\nimport {Device} from \"../../../../../common/mobile/utils/device\";\nimport { Swiper, SwiperSlide } from 'swiper/react';\n\nconst AddChart = props => {\n const types = props.storeChartSettings.types;\n const countSlides = Math.floor(types.length / 3);\n const arraySlides = !Device.phone ? Array(countSlides).fill(countSlides) : [types.slice(0, 6), types.slice(6)];\n \n return (\n \n {types && types.length ? (\n
\n {Device.phone ?\n arraySlides.map((typesSlide, indexSlide) => {\n return (\n \n {typesSlide.map((row, indexRow) => {\n return (\n \n {row.map((type, index) => {\n return (\n - {\n props.onInsertChart(type.type)\n }}>\n \n
\n )\n })}\n
\n )\n })}\n \n )\n })\n :\n arraySlides.map((_, indexSlide) => {\n let typesSlide = types.slice(indexSlide * 3, (indexSlide * 3) + 3);\n\n return (\n \n {typesSlide.map((row, indexRow) => {\n return (\n \n {row.map((type, index) => {\n return (\n - {\n props.onInsertChart(type.type)\n }}>\n \n
\n )\n })}\n
\n )\n })}\n \n )\n })}\n \n ) : null}\n
\n )\n};\n\nexport default inject(\"storeChartSettings\")(observer(AddChart));","import React, {Component} from 'react';\nimport { f7 } from 'framework7-react';\nimport {Device} from '../../../../../common/mobile/utils/device';\nimport { withTranslation } from 'react-i18next';\n\nimport AddChart from '../../view/add/AddChart';\n\nclass AddChartController extends Component {\n constructor (props) {\n super(props);\n this.onInsertChart = this.onInsertChart.bind(this);\n }\n\n closeModal () {\n if ( Device.phone ) {\n f7.sheet.close('.add-popup', true);\n } else {\n f7.popover.close('#add-popover');\n }\n }\n\n onInsertChart (type) {\n const api = Common.EditorApi.get();\n const { t } = this.props;\n const _t = t('View.Add', {returnObjects: true});\n const settings = api.asc_getChartObject(true);\n const info = api.asc_getCellInfo();\n const selType = info.asc_getSelectionType();\n const isChartEdit = (selType == Asc.c_oAscSelectionType.RangeChart || selType == Asc.c_oAscSelectionType.RangeChartText);\n\n if (settings) {\n isChartEdit ? settings.changeType(type) : settings.putType(type);\n let range = settings.getRange(),\n isValid = !!range ? api.asc_checkDataRange(Asc.c_oAscSelectionDialogType.Chart, range, true, !settings.getInColumns(), settings.getType()) : Asc.c_oAscError.ID.No;\n if (isValid == Asc.c_oAscError.ID.No) {\n isChartEdit ? api.asc_editChartDrawingObject(settings) : api.asc_addChartDrawingObject(settings);\n this.closeModal();\n } else {\n f7.dialog.alert((isValid == Asc.c_oAscError.ID.StockChartError) ? _t.errorStockChart : ((isValid == Asc.c_oAscError.ID.MaxDataSeriesError) ? _t.errorMaxRows : _t.txtInvalidRange), _t.notcriticalErrorTitle);\n }\n }\n }\n\n render () {\n return (\n \n )\n }\n}\n\nconst AddChartControllerTranslated = withTranslation()(AddChartController);\n\nexport {AddChartControllerTranslated as AddChartController};","import React, {Fragment, useState} from 'react';\nimport {observer, inject} from \"mobx-react\";\n\nconst AddShape = props => {\n const shapes = props.storeShapeSettings.getStyleGroups();\n return (\n \n {shapes.map((row, indexRow) => {\n return (\n
\n {row.map((shape, index) => {\n return (\n - {props.onShapeClick(shape.type)}}>\n
\n
\n \n )\n })}\n
\n )\n })}\n
\n )\n};\n\nexport default inject(\"storeShapeSettings\")(observer(AddShape));","import React, {Component} from 'react';\nimport { f7 } from 'framework7-react';\nimport {Device} from '../../../../../common/mobile/utils/device';\n\nimport AddShape from '../../view/add/AddShape';\n\nclass AddShapeController extends Component {\n constructor (props) {\n super(props);\n this.onShapeClick = this.onShapeClick.bind(this);\n }\n\n closeModal () {\n if ( Device.phone ) {\n f7.sheet.close('.add-popup', true);\n } else {\n f7.popover.close('#add-popover');\n }\n }\n\n onShapeClick (type) {\n const api = Common.EditorApi.get();\n api.asc_addShapeOnSheet(type);\n this.closeModal();\n }\n\n render () {\n return (\n \n )\n }\n}\n\nexport default AddShapeController;","import React, { useContext } from 'react';\nimport { inject, observer } from 'mobx-react';\nimport {List, ListItem, Icon} from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport { MainContext } from '../../page/main';\n\nconst AddOther = inject(\"storeFocusObjects\", \"storeAppOptions\")(observer(props => {\n const { t } = useTranslation();\n const _t = t('View.Add', {returnObjects: true});\n const storeFocusObjects = props.storeFocusObjects;\n const storeAppOptions = props.storeAppOptions;\n const canModifyFilter = storeAppOptions.canModifyFilter;\n const isHyperLink = storeFocusObjects.selections.indexOf('hyperlink') > -1;\n const hideAddComment = props.hideAddComment();\n const mainContext = useContext(MainContext);\n const wsProps = mainContext.wsProps;\n\n return (\n \n \n \n \n {(!hideAddComment && !wsProps.Objects) && {\n props.closeModal();\n Common.Notifications.trigger('addcomment');\n }}>\n \n }\n \n \n \n \n \n \n
\n )\n}));\n\nexport {AddOther};","import React, {Component} from 'react';\nimport { f7 } from 'framework7-react';\nimport {Device} from '../../../../../common/mobile/utils/device';\nimport { withTranslation} from 'react-i18next';\n\nimport {AddOther} from '../../view/add/AddOther';\n\nclass AddOtherController extends Component {\n constructor (props) {\n super(props);\n }\n\n closeModal () {\n if ( Device.phone ) {\n f7.sheet.close('.add-popup', true);\n } else {\n f7.popover.close('#add-popover');\n }\n }\n\n hideAddComment () {\n const cellinfo = Common.EditorApi.get().asc_getCellInfo();\n const iscelllocked = cellinfo.asc_getLocked();\n const seltype = cellinfo.asc_getSelectionType();\n const isComments = !cellinfo.asc_getComments() || cellinfo.asc_getComments().length > 0;\n \n return (!(seltype === Asc.c_oAscSelectionType.RangeCells && !iscelllocked) || isComments);\n }\n\n render () {\n return (\n \n )\n }\n}\n\nconst AddOtherWithTranslation = withTranslation()(AddOtherController);\n\nexport {AddOtherWithTranslation as AddOtherController};","import React, { useContext, useEffect } from 'react';\nimport { Page, Navbar, NavTitle, NavRight, Link, Icon, Tabs, Tab, f7 } from 'framework7-react';\nimport { observer, inject } from \"mobx-react\";\nimport { useTranslation } from 'react-i18next';\nimport { AddChartController } from \"../../controller/add/AddChart\";\nimport { AddFunctionController } from \"../../controller/add/AddFunction\";\nimport AddShapeController from \"../../controller/add/AddShape\";\nimport { AddOtherController } from \"../../controller/add/AddOther\";\nimport { Device } from \"../../../../../common/mobile/utils/device\";\nimport { MainContext } from '../../page/main';\nimport { AddingContext } from '../../controller/add/Add';\n\nconst AddLayoutNavbar = ({ tabs }) => {\n const isAndroid = Device.android;\n if(!tabs.length) return null;\n\n return (\n \n {tabs.length > 1 ?\n \n {tabs.map((item, index) =>\n \n \n )}\n {isAndroid && }\n
: {tabs[0].caption}\n }\n {Device.phone && }\n \n )\n};\n\nconst AddLayoutContent = ({ tabs }) => {\n if(!tabs.length) return null;\n\n return (\n \n {tabs.map((item, index) =>\n \n {item.component}\n \n )}\n \n )\n};\n\nconst AddingPage = inject(\"storeApplicationSettings\")(observer(props => {\n const { t } = useTranslation();\n const _t = t('View.Add', {returnObjects: true});\n const mainContext = useContext(MainContext);\n const addingContext = useContext(AddingContext);\n const storeApplicationSettings = props.storeApplicationSettings;\n const directionMode = storeApplicationSettings.directionMode;\n // const wsLock = mainContext.wsLock;\n const wsProps = mainContext.wsProps;\n const showPanels = addingContext.showPanels;\n const tabs = [];\n\n useEffect(() => {\n if(directionMode === 'rtl') {\n tabs.reverse();\n }\n }, [directionMode])\n \n if(!wsProps.Objects) {\n if(!showPanels) {\n tabs.push({\n caption: _t.textChart,\n id: 'add-chart',\n icon: 'icon-add-chart',\n component: \n });\n }\n\n if(!showPanels || showPanels === 'function') {\n tabs.push({\n caption: _t.textFunction,\n id: 'add-function',\n icon: 'icon-add-formula',\n component: \n });\n }\n\n if(!showPanels || showPanels.indexOf('shape') > 0) {\n tabs.push({\n caption: _t.textShape,\n id: 'add-shape',\n icon: 'icon-add-shape',\n component: \n });\n }\n\n // if (showPanels && showPanels.indexOf('image') !== -1) {\n // tabs.push({\n // caption: _t.textImage,\n // id: 'add-image',\n // icon: 'icon-add-image',\n // component: \n // });\n // }\n }\n\n if (!showPanels && (!wsProps.InsertHyperlinks || !wsProps.Objects || !wsProps.Sort)) {\n tabs.push({\n caption: _t.textOther,\n id: 'add-other',\n icon: 'icon-add-other',\n component: \n });\n }\n \n // if (((showPanels && showPanels === 'hyperlink') || props.isAddShapeHyperlink) && !wsProps.InsertHyperlinks) {\n // tabs.push({\n // caption: _t.textAddLink,\n // id: 'add-link',\n // icon: 'icon-link',\n // component: \n // });\n // }\n\n if(!tabs.length) {\n if (Device.phone) {\n f7.popup.close('.add-popup', false);\n } else {\n f7.popover.close('#add-popover', false);\n }\n\n return null;\n }\n\n return (\n \n \n \n \n )\n}));\n\nexport default AddingPage;","import React, { useContext, useEffect } from 'react';\nimport { View, Popup, Popover, f7 } from 'framework7-react';\nimport { Device } from '../../../../../common/mobile/utils/device';\nimport { PageFunctionGroup, PageFunctionInfo } from \"./AddFunction\";\nimport { AddImageController } from \"../../controller/add/AddImage\";\nimport { PageImageLinkSettings } from \"./AddImage\";\nimport { AddLinkController } from \"../../controller/add/AddLink\";\nimport { EditLinkController } from \"../../controller/edit/EditLink\";\nimport { PageTypeLink, PageSheet } from \"./AddLink\";\nimport { PageEditTypeLink, PageEditSheet } from \"../../view/edit/EditLink\";\nimport AddFilterController from \"../../controller/add/AddFilter\";\nimport AddingPage from './AddingPage';\nimport { MainContext } from '../../page/main';\n\nconst routes = [\n {\n path: '/adding-page/',\n component: AddingPage,\n },\n // Functions\n {\n path: '/add-function-group/',\n component: PageFunctionGroup\n },\n {\n path: '/add-function-info/',\n component: PageFunctionInfo\n },\n // Image\n {\n path: '/add-image/',\n component: AddImageController\n },\n {\n path: '/add-image-from-url/',\n component: PageImageLinkSettings\n },\n // Link\n {\n path: '/add-link/',\n component: AddLinkController\n },\n {\n path: '/add-link-type/',\n component: PageTypeLink\n },\n {\n path: '/add-link-sheet/',\n component: PageSheet\n },\n {\n path: '/edit-link/',\n component: EditLinkController\n },\n {\n path: '/edit-link-type/',\n component: PageEditTypeLink\n },\n {\n path: '/edit-link-sheet/',\n component: PageEditSheet\n },\n // Other\n {\n path: '/add-sort-and-filter/',\n component: AddFilterController\n }\n];\n\nroutes.forEach(route => {\n route.options = {\n ...route.options,\n transition: 'f7-push'\n };\n});\n\nconst AddView = props => {\n const mainContext = useContext(MainContext);\n\n useEffect(() => {\n if(Device.phone) {\n f7.popup.open('.add-popup');\n } else {\n const targetElem = !props.showOptions || !props.showOptions.button ? '#btn-add' : props.showOptions.button;\n f7.popover.open('#add-popover', targetElem);\n }\n }, []);\n\n return (\n !Device.phone ?\n mainContext.closeOptions('add')}>\n \n \n \n :\n mainContext.closeOptions('add')}>\n \n \n \n \n )\n}\n\nexport default AddView;","import React, { createContext } from \"react\";\nimport AddView from \"../../view/add/Add\";\n\nexport const AddingContext = createContext();\n\nconst AddingController = props => {\n const api = Common.EditorApi.get();\n const cellinfo = api.asc_getCellInfo();\n const seltype = cellinfo.asc_getSelectionType();\n const iscelllocked = cellinfo.asc_getLocked();\n const isAddShapeHyperlink = api.asc_canAddShapeHyperlink();\n let options;\n\n if(!iscelllocked) {\n options = props.showOptions;\n\n if(!options) {\n switch(seltype) {\n case Asc.c_oAscSelectionType.RangeCells:\n case Asc.c_oAscSelectionType.RangeRow:\n case Asc.c_oAscSelectionType.RangeCol:\n case Asc.c_oAscSelectionType.RangeMax: break;\n case Asc.c_oAscSelectionType.RangeImage:\n case Asc.c_oAscSelectionType.RangeShape:\n case Asc.c_oAscSelectionType.RangeChart:\n case Asc.c_oAscSelectionType.RangeChartText:\n case Asc.c_oAscSelectionType.RangeShapeText:\n options = {panels: ['image','shape']};\n break;\n }\n }\n }\n\n return (\n \n \n \n \n )\n}\n\nexport default AddingController;","function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React, { forwardRef, useRef, useImperativeHandle } from 'react';\nimport { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect.js';\nimport { classNames, getExtraAttrs, noUndefinedProps, emit } from '../shared/utils.js';\nimport { colorClasses } from '../shared/mixins.js';\nimport { f7ready, f7 } from '../shared/f7.js';\nimport { watchProp } from '../shared/watch-prop.js';\n\n\n\nconst Range = /*#__PURE__*/forwardRef((props, ref) => {\n const f7Range = useRef(null);\n const {\n className,\n id,\n style,\n children,\n init = true,\n value = 0,\n min = 0,\n max = 100,\n step = 1,\n label = false,\n dual = false,\n vertical = false,\n verticalReversed = false,\n draggableBar = true,\n formatLabel,\n scale = false,\n scaleSteps = 5,\n scaleSubSteps = 0,\n formatScaleLabel,\n limitKnobPosition = undefined,\n name,\n input,\n inputId,\n disabled\n } = props;\n const extraAttrs = getExtraAttrs(props);\n const elRef = useRef(null);\n useImperativeHandle(ref, () => ({\n el: elRef.current,\n f7Range: () => f7Range.current\n }));\n watchProp(value, newValue => {\n if (!f7Range.current) return;\n const rangeValue = f7Range.current.value;\n if (Array.isArray(newValue) && Array.isArray(rangeValue)) {\n if (rangeValue[0] !== newValue[0] || rangeValue[1] !== newValue[1]) {\n f7Range.current.setValue(newValue);\n }\n } else {\n f7Range.current.setValue(newValue);\n }\n });\n const onChange = (range, val) => {\n emit(props, 'rangeChange', val);\n };\n const onChanged = (range, val) => {\n emit(props, 'rangeChanged', val);\n };\n const rangeEvents = method => {\n if (!f7Range.current) return;\n f7Range.current[method]('change', onChange);\n f7Range.current[method]('changed', onChanged);\n };\n const onMount = () => {\n f7ready(() => {\n if (!init || !elRef.current) return;\n f7Range.current = f7.range.create(noUndefinedProps({\n el: elRef.current,\n value,\n min,\n max,\n step,\n label,\n dual,\n draggableBar,\n vertical,\n verticalReversed,\n formatLabel,\n scale,\n scaleSteps,\n scaleSubSteps,\n formatScaleLabel,\n limitKnobPosition\n }));\n rangeEvents('on');\n });\n };\n const onDestroy = () => {\n if (f7Range.current && f7Range.current.destroy) f7Range.current.destroy();\n f7Range.current = null;\n };\n useIsomorphicLayoutEffect(() => {\n rangeEvents('on');\n return () => {\n rangeEvents('off');\n };\n });\n useIsomorphicLayoutEffect(() => {\n onMount();\n return onDestroy;\n }, []);\n const classes = classNames(className, 'range-slider', {\n 'range-slider-horizontal': !vertical,\n 'range-slider-vertical': vertical,\n 'range-slider-vertical-reversed': vertical && verticalReversed,\n disabled\n }, colorClasses(props));\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n ref: elRef,\n id: id,\n style: style,\n className: classes\n }, extraAttrs), input && /*#__PURE__*/React.createElement(\"input\", {\n type: \"range\",\n name: name,\n id: inputId\n }), children);\n});\nRange.displayName = 'f7-range';\nexport default Range;","import React, {Fragment, useState} from 'react';\r\nimport {observer, inject} from \"mobx-react\";\r\nimport {f7, Page, Navbar, NavRight, List, ListItem, Link, Icon, Range, Tab, Tabs, ListButton} from 'framework7-react';\r\nimport { ThemeColorPalette, CustomColorPicker } from '../../../../../common/mobile/lib/component/ThemeColorPalette.jsx';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {Device} from '../../../../../common/mobile/utils/device';\r\n\r\nconst EditShape = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const storeFocusObjects = props.storeFocusObjects;\r\n const objects = storeFocusObjects.objects;\r\n const shapeObject = storeFocusObjects.shapeObject;\r\n const canFill = shapeObject && shapeObject.get_ShapeProperties().asc_getCanFill();\r\n\r\n const shapeType = shapeObject.get_ShapeProperties().asc_getType();\r\n const hideChangeType = shapeObject.get_ShapeProperties().get_FromChart() || shapeObject.get_ShapeProperties().get_FromSmartArt() \r\n || shapeType=='line' || shapeType=='bentConnector2' || shapeType=='bentConnector3'\r\n || shapeType=='bentConnector4' || shapeType=='bentConnector5' || shapeType=='curvedConnector2'\r\n || shapeType=='curvedConnector3' || shapeType=='curvedConnector4' || shapeType=='curvedConnector5'\r\n || shapeType=='straightConnector1';\r\n\r\n const isSmartArtInternal = shapeObject.get_ShapeProperties().get_FromSmartArtInternal();\r\n let disableRemove = storeFocusObjects.selections.indexOf('text') > -1;\r\n\r\n return (\r\n \r\n \r\n {canFill ?\r\n \r\n :\r\n \r\n }\r\n {!hideChangeType &&\r\n \r\n }\r\n {(!isSmartArtInternal && objects.indexOf('image') === -1) &&\r\n \r\n }\r\n
\r\n {objects.indexOf('image') === -1 &&\r\n \r\n {_t.textRemoveShape}\r\n
\r\n }\r\n \r\n )\r\n};\r\n\r\nconst PaletteFill = inject(\"storeFocusObjects\", \"storeShapeSettings\", \"storePalette\")(observer(props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const storeShapeSettings = props.storeShapeSettings;\r\n const shapeObject = props.storeFocusObjects.shapeObject.get_ShapeProperties();\r\n const curFillColor = storeShapeSettings.fillColor ? storeShapeSettings.fillColor : storeShapeSettings.getFillColor(shapeObject);\r\n const customColors = props.storePalette.customColors;\r\n\r\n const changeColor = (color, effectId, effectValue) => {\r\n if (color !== 'empty') {\r\n if (effectId !==undefined ) {\r\n const newColor = {color: color, effectId: effectId, effectValue: effectValue};\r\n props.onFillColor(newColor);\r\n storeShapeSettings.setFillColor(newColor);\r\n } else {\r\n props.onFillColor(color);\r\n storeShapeSettings.setFillColor(color);\r\n }\r\n } else {\r\n // open custom color menu\r\n props.f7router.navigate('/edit-shape-custom-fill-color/', {props: {onFillColor: props.onFillColor}});\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n \r\n )\r\n}));\r\n\r\nconst PageStyle = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const isAndroid = Device.android;\r\n const storeShapeSettings = props.storeShapeSettings;\r\n const storeFocusObjects = props.storeFocusObjects;\r\n const shapeObject = storeFocusObjects.shapeObject.get_ShapeProperties();\r\n const stroke = shapeObject.get_stroke();\r\n \r\n // Init border size\r\n \r\n const borderSizeTransform = storeShapeSettings.borderSizeTransform();\r\n const borderSize = stroke.get_width() * 72.0 / 25.4;\r\n const borderType = stroke.get_type();\r\n const displayBorderSize = (borderType == Asc.c_oAscStrokeType.STROKE_NONE) ? 0 : borderSizeTransform.indexSizeByValue(borderSize);\r\n const displayTextBorderSize = (borderType == Asc.c_oAscStrokeType.STROKE_NONE) ? 0 : borderSizeTransform.sizeByValue(borderSize);\r\n const [stateBorderSize, setBorderSize] = useState(displayBorderSize);\r\n const [stateTextBorderSize, setTextBorderSize] = useState(displayTextBorderSize);\r\n \r\n // Init border color\r\n \r\n const borderColor = !storeShapeSettings.borderColorView ? storeShapeSettings.initBorderColorView(shapeObject) : storeShapeSettings.borderColorView;\r\n const displayBorderColor = borderColor !== 'transparent' ? `#${(typeof borderColor === \"object\" ? borderColor.color : borderColor)}` : borderColor;\r\n \r\n // Init opacity\r\n \r\n const transparent = shapeObject.get_fill().asc_getTransparent();\r\n const opacity = transparent !== null && transparent !== undefined ? transparent / 2.55 : 100;\r\n const [stateOpacity, setOpacity] = useState(Math.round(opacity));\r\n\r\n if ((!shapeObject || storeFocusObjects.chartObject || storeFocusObjects.focusOn === 'cell') && Device.phone) {\r\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\r\n return null;\r\n }\r\n \r\n return (\r\n \r\n \r\n \r\n {_t.textFill}\r\n {_t.textBorder}\r\n {_t.textEffects}\r\n {isAndroid && }\r\n
\r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {_t.textSize}
\r\n \r\n {setBorderSize(value); setTextBorderSize(borderSizeTransform.sizeByIndex(value));}}\r\n onRangeChanged={(value) => {props.onBorderSize(borderSizeTransform.sizeByIndex(value))}}\r\n >\r\n
\r\n \r\n {stateTextBorderSize + ' ' + Common.Utils.Metric.getMetricName(Common.Utils.Metric.c_MetricUnits.pt)}\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n {_t.textOpacity}
\r\n \r\n {setOpacity(value)}}\r\n onRangeChanged={(value) => {props.onOpacity(value)}}\r\n >\r\n
\r\n \r\n {stateOpacity + ' %'}\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n )\r\n};\r\n\r\nconst PageCustomFillColor = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n let fillColor = props.storeShapeSettings.fillColor;\r\n\r\n if (typeof fillColor === 'object') {\r\n fillColor = fillColor.color;\r\n }\r\n\r\n const onAddNewColor = (colors, color) => {\r\n props.storePalette.changeCustomColors(colors);\r\n props.onFillColor(color);\r\n props.storeShapeSettings.setFillColor(color);\r\n props.f7router.back();\r\n };\r\n\r\n return(\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n )\r\n};\r\n\r\nconst PageStyleNoFill = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const storeShapeSettings = props.storeShapeSettings;\r\n const shapeObject = props.storeFocusObjects.shapeObject.get_ShapeProperties();\r\n const stroke = shapeObject.get_stroke();\r\n\r\n // Init border size\r\n\r\n const borderSizeTransform = storeShapeSettings.borderSizeTransform();\r\n const borderSize = stroke.get_width() * 72.0 / 25.4;\r\n const borderType = stroke.get_type();\r\n const displayBorderSize = (borderType == Asc.c_oAscStrokeType.STROKE_NONE) ? 0 : borderSizeTransform.indexSizeByValue(borderSize);\r\n const displayTextBorderSize = (borderType == Asc.c_oAscStrokeType.STROKE_NONE) ? 0 : borderSizeTransform.sizeByValue(borderSize);\r\n const [stateBorderSize, setBorderSize] = useState(displayBorderSize);\r\n const [stateTextBorderSize, setTextBorderSize] = useState(displayTextBorderSize);\r\n\r\n // Init border color\r\n\r\n const borderColor = !storeShapeSettings.borderColorView ? storeShapeSettings.initBorderColorView(shapeObject) : storeShapeSettings.borderColorView;\r\n const displayBorderColor = borderColor !== 'transparent' ? `#${(typeof borderColor === \"object\" ? borderColor.color : borderColor)}` : borderColor;\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n {_t.textSize}
\r\n \r\n {setBorderSize(value); setTextBorderSize(borderSizeTransform.sizeByIndex(value));}}\r\n onRangeChanged={(value) => {props.onBorderSize(borderSizeTransform.sizeByIndex(value))}}\r\n >\r\n
\r\n \r\n {stateTextBorderSize + ' ' + Common.Utils.Metric.getMetricName(Common.Utils.Metric.c_MetricUnits.pt)}\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n )\r\n};\r\n\r\nconst PageReplace = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const storeShapeSettings = props.storeShapeSettings;\r\n let shapes = storeShapeSettings.getStyleGroups();\r\n shapes.splice(0, 1); // Remove line shapes\r\n\r\n const storeFocusObjects = props.storeFocusObjects;\r\n if ((!storeFocusObjects.shapeObject || storeFocusObjects.chartObject || storeFocusObjects.focusOn === 'cell') && Device.phone) {\r\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n {shapes.map((row, indexRow) => {\r\n return (\r\n \r\n {row.map((shape, index) => {\r\n return (\r\n - {props.onReplace(shape.type)}}>\r\n
\r\n
\r\n \r\n )\r\n })}\r\n
\r\n )\r\n })}\r\n \r\n )\r\n};\r\n\r\nconst PageReorder = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n\r\n const storeFocusObjects = props.storeFocusObjects;\r\n if ((!storeFocusObjects.shapeObject || storeFocusObjects.chartObject || storeFocusObjects.focusOn === 'cell') && Device.phone) {\r\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {props.onReorder('all-up')}} className='no-indicator'>\r\n \r\n \r\n {props.onReorder('all-down')}} className='no-indicator'>\r\n \r\n \r\n {props.onReorder('move-up')}} className='no-indicator'>\r\n \r\n \r\n {props.onReorder('move-down')}} className='no-indicator'>\r\n \r\n \r\n
\r\n \r\n )\r\n};\r\n\r\nconst PageBorderColor = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const borderColor = props.storeShapeSettings.borderColorView;\r\n const customColors = props.storePalette.customColors;\r\n\r\n const changeColor = (color, effectId, effectValue) => {\r\n if (color !== 'empty') {\r\n if (effectId !==undefined ) {\r\n const newColor = {color: color, effectId: effectId, effectValue: effectValue};\r\n props.onBorderColor(newColor);\r\n props.storeShapeSettings.setBorderColor(newColor);\r\n } else {\r\n props.onBorderColor(color);\r\n props.storeShapeSettings.setBorderColor(color);\r\n }\r\n } else {\r\n // open custom color menu\r\n props.f7router.navigate('/edit-shape-custom-border-color/', {props: {onBorderColor: props.onBorderColor}});\r\n }\r\n };\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n \r\n
\r\n \r\n )\r\n};\r\n\r\nconst PageCustomBorderColor = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n let borderColor = props.storeShapeSettings.borderColorView;\r\n if (typeof borderColor === 'object') {\r\n borderColor = borderColor.color;\r\n }\r\n const onAddNewColor = (colors, color) => {\r\n props.storePalette.changeCustomColors(colors);\r\n props.onBorderColor(color);\r\n props.storeShapeSettings.setBorderColor(color);\r\n props.f7router.back();\r\n };\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n )\r\n};\r\n\r\nconst EditShapeContainer = inject(\"storeShapeSettings\", \"storeFocusObjects\")(observer(EditShape));\r\nconst PageShapeStyle = inject(\"storeFocusObjects\", \"storeShapeSettings\")(observer(PageStyle));\r\nconst PageShapeStyleNoFill = inject(\"storeFocusObjects\", \"storeShapeSettings\")(observer(PageStyleNoFill));\r\nconst PageShapeCustomFillColor = inject(\"storeFocusObjects\", \"storeShapeSettings\", \"storePalette\")(observer(PageCustomFillColor));\r\nconst PageReplaceContainer = inject(\"storeShapeSettings\",\"storeFocusObjects\")(observer(PageReplace));\r\nconst PageReorderContainer = inject(\"storeFocusObjects\")(observer(PageReorder));\r\nconst PageShapeBorderColor = inject(\"storeShapeSettings\", \"storePalette\")(observer(PageBorderColor));\r\nconst PageShapeCustomBorderColor = inject(\"storeShapeSettings\", \"storePalette\")(observer(PageCustomBorderColor));\r\n\r\nexport {\r\n EditShapeContainer as EditShape,\r\n PageShapeStyle,\r\n PageShapeStyleNoFill,\r\n PageReplaceContainer,\r\n PageReorderContainer,\r\n PageShapeBorderColor,\r\n PageShapeCustomBorderColor,\r\n PageShapeCustomFillColor\r\n}","import React, {Fragment, useState} from 'react';\r\nimport {observer, inject} from \"mobx-react\";\r\nimport {f7, Page, Navbar, NavRight, List, ListItem, BlockTitle, Icon, ListInput, ListButton, Link} from 'framework7-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {Device} from '../../../../../common/mobile/utils/device';\r\n\r\nconst EditImage = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const storeFocusObjects = props.storeFocusObjects;\r\n const imageObject = storeFocusObjects.imageObject;\r\n const pluginGuid = imageObject.asc_getPluginGuid();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n \r\n {_t.textActualSize}\r\n {t('View.Edit.textDeleteImage')}\r\n
\r\n \r\n )\r\n};\r\n\r\nconst PageReorder = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n\r\n const storeFocusObjects = props.storeFocusObjects;\r\n if ((!storeFocusObjects.imageObject || storeFocusObjects.focusOn === 'cell') && Device.phone) {\r\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {props.onReorder('all-up')}} className='no-indicator'>\r\n \r\n \r\n {props.onReorder('all-down')}} className='no-indicator'>\r\n \r\n \r\n {props.onReorder('move-up')}} className='no-indicator'>\r\n \r\n \r\n {props.onReorder('move-down')}} className='no-indicator'>\r\n \r\n \r\n
\r\n \r\n )\r\n};\r\n\r\n\r\nconst PageReplace = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n\r\n const storeFocusObjects = props.storeFocusObjects;\r\n if ((!storeFocusObjects.imageObject || storeFocusObjects.focusOn === 'cell') && Device.phone) {\r\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {props.onReplaceByFile()}}>\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n )\r\n};\r\n\r\nconst PageLinkSettings = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const [stateValue, setValue] = useState('');\r\n\r\n const onReplace = () => {\r\n if (stateValue.trim().length > 0) {\r\n if ((/((^https?)|(^ftp)):\\/\\/.+/i.test(stateValue))) {\r\n props.onReplaceByUrl(stateValue.trim());\r\n } else {\r\n f7.dialog.alert(_t.textNotUrl, _t.notcriticalErrorTitle);\r\n }\r\n } else {\r\n f7.dialog.alert(_t.textEmptyImgUrl, _t.notcriticalErrorTitle);\r\n }\r\n };\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n {_t.textAddress}\r\n \r\n {setValue(event.target.value)}}\r\n >\r\n \r\n
\r\n \r\n {onReplace()}}>\r\n
\r\n \r\n )\r\n};\r\n\r\nconst EditImageContainer = inject(\"storeFocusObjects\")(observer(EditImage));\r\nconst PageReplaceContainer = inject(\"storeFocusObjects\")(observer(PageReplace));\r\nconst PageReorderContainer = inject(\"storeFocusObjects\")(observer(PageReorder));\r\nconst PageLinkSettingsContainer = inject(\"storeFocusObjects\")(observer(PageLinkSettings));\r\n\r\nexport {\r\n EditImageContainer as EditImage,\r\n PageReplaceContainer as PageImageReplace,\r\n PageReorderContainer as PageImageReorder,\r\n PageLinkSettingsContainer as PageLinkSettings\r\n}","import React, {Fragment, useState, useEffect} from 'react';\nimport {observer, inject} from \"mobx-react\";\nimport {f7, List, ListItem, Icon, Button, Page, Navbar, Segmented, BlockTitle, NavRight, Link, Toggle, ListInput, Block} from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport {Device} from '../../../../../common/mobile/utils/device';\nimport { ThemeColorPalette, CustomColorPicker } from '../../../../../common/mobile/lib/component/ThemeColorPalette.jsx';\nimport { LocalStorage } from '../../../../../common/mobile/utils/LocalStorage.mjs';\nimport { Swiper, SwiperSlide } from 'swiper/react';\n\nconst EditCell = props => {\n const isAndroid = Device.android;\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const storeCellSettings = props.storeCellSettings;\n const storeWorksheets = props.storeWorksheets;\n const wsProps = storeWorksheets.wsProps;\n const cellStyles = storeCellSettings.cellStyles;\n const curStyleName = storeCellSettings.styleName;\n const curStyle = cellStyles.find(style => style.name === curStyleName);\n\n const fontInfo = storeCellSettings.fontInfo;\n const fontName = fontInfo.name || _t.textFonts;\n const fontSize = fontInfo.size;\n const fontColor = storeCellSettings.fontColor;\n const displaySize = typeof fontSize === 'undefined' ? _t.textAuto : fontSize + ' ' + _t.textPt;\n const fillColor = storeCellSettings.fillColor;\n\n const isBold = storeCellSettings.isBold;\n const isItalic = storeCellSettings.isItalic;\n const isUnderline = storeCellSettings.isUnderline;\n\n const fontColorPreview = fontColor !== 'auto' ?\n :\n ;\n \n const fillColorPreview = fillColor !== 'transparent' ?\n :\n ;\n\n return (\n \n \n \n
\n {!wsProps.FormatCells && \n <>\n \n \n \n \n \n {!isAndroid ?\n {fontColorPreview} :\n fontColorPreview\n }\n \n \n {!isAndroid ?\n {fillColorPreview} :\n fillColorPreview\n }\n \n \n {!isAndroid ?\n : null\n }\n \n {/* \n {!isAndroid ?\n : null\n }\n */}\n \n {!isAndroid ?\n : null\n }\n \n
\n \n \n {!isAndroid ?\n : null\n }\n \n
\n \n \n {!isAndroid && }\n \n \n
\n >} \n \n )\n};\n\nconst PageCellStyle = props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const storeCellSettings = props.storeCellSettings;\n const styleName = storeCellSettings.styleName;\n const cellStyles = storeCellSettings.cellStyles;\n const countStylesSlide = Device.phone ? 6 : 15;\n const countSlides = Math.floor(cellStyles.length / countStylesSlide);\n const arraySlides = Array(countSlides).fill(countSlides);\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n {cellStyles && cellStyles.length ? (\n \n {arraySlides.map((_, indexSlide) => {\n let stylesSlide = cellStyles.slice(indexSlide * countStylesSlide, (indexSlide * countStylesSlide) + countStylesSlide);\n \n return (\n \n \n {stylesSlide.map((elem, index) => (\n props.onStyleClick(elem.name)}>\n \n \n ))}\n
\n \n )\n })}\n \n ) : null}\n \n )\n}\n\nconst PageFontsCell = props => {\n const isAndroid = Device.android;\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const storeTextSettings = props.storeTextSettings;\n const storeCellSettings = props.storeCellSettings;\n const fontInfo = storeCellSettings.fontInfo;\n const size = fontInfo.size;\n const displaySize = typeof size === 'undefined' ? _t.textAuto : size + ' ' + _t.textPt;\n const curFontName = fontInfo.name;\n const fonts = storeCellSettings.fontsArray;\n const arrayRecentFonts = storeTextSettings.arrayRecentFonts;\n const iconWidth = storeTextSettings.iconWidth;\n const iconHeight = storeTextSettings.iconHeight;\n const thumbs = storeTextSettings.thumbs;\n const thumbIdx = storeTextSettings.thumbIdx;\n const thumbCanvas = storeTextSettings.thumbCanvas;\n const thumbContext = storeTextSettings.thumbContext;\n const spriteCols = storeTextSettings.spriteCols;\n const spriteThumbs = storeTextSettings.spriteThumbs;\n\n const addRecentStorage = () => {\n setRecent(getImageUri(arrayRecentFonts));\n LocalStorage.setItem('sse-settings-recent-fonts', JSON.stringify(arrayRecentFonts));\n };\n\n const getImageUri = fonts => {\n return fonts.map(font => {\n let index = Math.floor(font.imgidx/spriteCols);\n return spriteThumbs.getImage(index, thumbCanvas, thumbContext).toDataURL();\n });\n };\n\n const [stateRecent, setRecent] = useState(() => getImageUri(arrayRecentFonts));\n const [vlFonts, setVlFonts] = useState({\n vlData: {\n items: [],\n }\n });\n\n const renderExternal = (vl, vlData) => {\n setVlFonts((prevState) => {\n let fonts = [...prevState.vlData.items],\n drawFonts = [...vlData.items];\n\n let images = [],\n drawImages = getImageUri(drawFonts);\n for (let i = 0; i < drawFonts.length; i++) {\n fonts[i + vlData.fromIndex] = drawFonts[i];\n images[i + vlData.fromIndex] = drawImages[i];\n }\n return {vlData: {\n items: fonts,\n images,\n }}\n });\n };\n\n const storeFocusObjects = props.storeFocusObjects;\n if ((storeFocusObjects.focusOn !== 'cell') && Device.phone) {\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\n return null;\n }\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n \n {!isAndroid && {displaySize}
}\n \n \n \n {isAndroid && }\n \n \n
\n \n
\n {_t.textFonts}\n {!!arrayRecentFonts.length &&\n \n {arrayRecentFonts.map((item,index) => (\n {\n props.onFontClick(item.name);\n }}> \n
\n \n ))}\n
\n }\n \n \n {vlFonts.vlData.items.map((item, index) => {\n const font = item || fonts[index];\n const fontName = font.name;\n return (\n {\n props.onFontClick(fontName);\n storeTextSettings.addFontToRecent(font);\n addRecentStorage();\n }}>\n {vlFonts.vlData.images[index] &&
}\n \n )\n })}\n
\n
\n \n );\n};\n\nconst PageTextColorCell = props => {\n const { t } = useTranslation();\n const _t = t(\"View.Edit\", { returnObjects: true });\n const storePalette = props.storePalette;\n const storeCellSettings = props.storeCellSettings;\n const customColors = storePalette.customColors;\n const fontColor = storeCellSettings.fontColor;\n \n const changeColor = (color, effectId, effectValue) => {\n if (color !== 'empty') {\n if (effectId !== undefined ) {\n const newColor = {color: color, effectId: effectId, effectValue: effectValue};\n storeCellSettings.changeFontColor(newColor);\n props.onTextColor(newColor);\n } else {\n storeCellSettings.changeFontColor(color);\n props.onTextColor(color);\n }\n } else {\n // open custom color menu\n props.f7router.navigate('/edit-cell-text-custom-color/', {props: {onTextColor: props.onTextColor}});\n }\n };\n\n const storeFocusObjects = props.storeFocusObjects;\n if ((storeFocusObjects.focusOn !== 'cell') && Device.phone) {\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\n return null;\n }\n \n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n {\n props.onTextColorAuto();\n }}>\n \n \n
\n \n \n \n
\n \n );\n};\n\nconst PageFillColorCell = props => {\n const { t } = useTranslation();\n const _t = t(\"View.Edit\", { returnObjects: true });\n const storePalette = props.storePalette;\n const storeCellSettings = props.storeCellSettings;\n const customColors = storePalette.customColors;\n const fillColor = storeCellSettings.fillColor;\n\n const changeColor = (color, effectId, effectValue) => {\n if (color !== 'empty') {\n if (effectId !== undefined ) {\n const newColor = {color: color, effectId: effectId, effectValue: effectValue};\n storeCellSettings.changeFillColor(newColor);\n props.onFillColor(newColor);\n } else {\n storeCellSettings.changeFillColor(color);\n props.onFillColor(color);\n }\n } else {\n // open custom color menu\n props.f7router.navigate('/edit-cell-fill-custom-color/', {props: {onFillColor: props.onFillColor}});\n }\n };\n\n const storeFocusObjects = props.storeFocusObjects;\n if ((storeFocusObjects.focusOn !== 'cell') && Device.phone) {\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\n return null;\n }\n \n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n \n \n
\n \n );\n};\n\nconst PageCustomTextColorCell = props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n\n let fontColor = props.storeCellSettings.fontColor;\n\n if (typeof fontColor === 'object') {\n fontColor = fontColor.color;\n }\n\n const autoColor = fontColor === 'auto' ? window.getComputedStyle(document.getElementById('font-color-auto')).backgroundColor : null;\n const onAddNewColor = (colors, color) => {\n props.storePalette.changeCustomColors(colors);\n props.onTextColor(color);\n props.storeCellSettings.changeFontColor(color);\n props.f7router.back();\n };\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n \n )\n};\n\nconst PageCustomFillColorCell = props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n\n let fillColor = props.storeCellSettings.fillColor;\n\n if (typeof fillColor === 'object') {\n fillColor = fillColor.color;\n }\n\n const onAddNewColor = (colors, color) => {\n props.storePalette.changeCustomColors(colors);\n props.onFillColor(color);\n props.storeCellSettings.changeFillColor(color);\n props.f7router.back();\n };\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n \n )\n};\n\nconst PageTextFormatCell = props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const isAndroid = Device.android;\n const storeCellSettings = props.storeCellSettings;\n const hAlignStr = storeCellSettings.hAlignStr;\n const vAlignStr = storeCellSettings.vAlignStr;\n const isWrapText = storeCellSettings.isWrapText;\n\n const storeFocusObjects = props.storeFocusObjects;\n if ((storeFocusObjects.focusOn !== 'cell') && Device.phone) {\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\n return null;\n }\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n \n \n \n \n \n \n \n {!isAndroid ?\n : null\n }\n \n \n {!isAndroid ? : null}\n {props.onWrapTextChange(!isWrapText)}} />\n \n
\n {/* \n \n {!isAndroid ? : null}\n {props.onWrapTextChange(!isWrapText)}} />\n \n
*/}\n \n )\n};\n\nconst PageTextOrientationCell = props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const isAndroid = Device.android;\n const storeCellSettings = props.storeCellSettings;\n const orientationStr = storeCellSettings.orientationStr;\n\n const storeFocusObjects = props.storeFocusObjects;\n if ((storeFocusObjects.focusOn !== 'cell') && Device.phone) {\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\n return null;\n }\n \n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n {\n props.onTextOrientationChange('horizontal');\n }\n }>\n \n \n {\n props.onTextOrientationChange('anglecount');\n }\n }>\n \n \n {\n props.onTextOrientationChange('angleclock');\n }\n }>\n \n \n {\n props.onTextOrientationChange('vertical');\n }\n }>\n \n \n {\n props.onTextOrientationChange('rotateup');\n }\n }>\n \n \n {\n props.onTextOrientationChange('rotatedown');\n }\n }>\n \n \n
\n \n )\n};\n\nconst PageBorderStyleCell = props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const storeCellSettings = props.storeCellSettings;\n const borderInfo = storeCellSettings.borderInfo;\n\n const borderSizes = {\n 7: `${_t.textThin}`,\n 12: `${_t.textMedium}`,\n 13: `${_t.textThick}`\n };\n\n const storeFocusObjects = props.storeFocusObjects;\n if ((storeFocusObjects.focusOn !== 'cell') && Device.phone) {\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\n return null;\n }\n \n const displayBorderColor = `#${(typeof borderInfo.color === \"object\" ? borderInfo.color.color : borderInfo.color)}`;\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n {\n storeCellSettings.changeBorderStyle('none');\n props.onBorderStyle('none', borderInfo);\n }}>\n \n \n {\n storeCellSettings.changeBorderStyle('all');\n props.onBorderStyle('all', borderInfo);\n }}>\n \n \n {\n storeCellSettings.changeBorderStyle('outer');\n props.onBorderStyle('outer', borderInfo);\n }}> \n \n \n {\n storeCellSettings.changeBorderStyle('2');\n props.onBorderStyle('2', borderInfo);\n }}> \n \n \n {\n storeCellSettings.changeBorderStyle('0');\n props.onBorderStyle('0', borderInfo);\n }}>\n \n \n {\n storeCellSettings.changeBorderStyle('3');\n props.onBorderStyle('3', borderInfo);\n }}>\n \n \n {\n storeCellSettings.changeBorderStyle('1');\n props.onBorderStyle('1', borderInfo);\n }}>\n \n \n {\n storeCellSettings.changeBorderStyle('inner');\n props.onBorderStyle('inner', borderInfo);\n }}>\n \n \n {\n storeCellSettings.changeBorderStyle('6');\n props.onBorderStyle('6', borderInfo);\n }}>\n \n \n {\n storeCellSettings.changeBorderStyle('7');\n props.onBorderStyle('7', borderInfo);\n }}>\n \n \n {\n storeCellSettings.changeBorderStyle('5');\n props.onBorderStyle('5', borderInfo);\n }}>\n \n \n {\n storeCellSettings.changeBorderStyle('4');\n props.onBorderStyle('4', borderInfo);\n }}>\n \n \n
\n \n \n \n \n \n \n
\n \n )\n};\n\nconst PageBorderColorCell = props => {\n const { t } = useTranslation();\n const storePalette = props.storePalette;\n const storeCellSettings = props.storeCellSettings;\n const borderInfo = storeCellSettings.borderInfo;\n const borderColor = borderInfo.color;\n const borderStyle = storeCellSettings.borderStyle;\n const customColors = storePalette.customColors;\n const changeColor = (color, effectId, effectValue) => {\n if (color !== 'empty') {\n storeCellSettings.setAutoColor(null);\n if (effectId !== undefined ) {\n const newColor = {color: color, effectId: effectId, effectValue: effectValue};\n storeCellSettings.changeBorderColor(newColor);\n props.onBorderStyle(borderStyle, borderInfo);\n } else {\n storeCellSettings.changeBorderColor(color);\n props.onBorderStyle(borderStyle, borderInfo);\n }\n } else {\n // open custom color menu\n props.f7router.navigate('/edit-border-custom-color-cell/', {props: {onBorderStyle: props.onBorderStyle}});\n }\n };\n \n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n {\n storeCellSettings.setAutoColor('auto');\n }}>\n \n \n
\n \n \n \n
\n \n );\n};\n\nconst PageCustomBorderColorCell = props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const storeCellSettings = props.storeCellSettings;\n const storePalette = props.storePalette;\n const borderInfo = storeCellSettings.borderInfo;\n let borderColor = borderInfo.color;\n \n if(typeof borderColor === \"object\") {\n borderColor = borderInfo.color.color;\n }\n\n const borderStyle = storeCellSettings.borderStyle;\n const autoColor = storeCellSettings.colorAuto === 'auto' ? window.getComputedStyle(document.getElementById('font-color-auto')).backgroundColor : null;\n const onAddNewColor = (colors, color) => {\n storePalette.changeCustomColors(colors);\n storeCellSettings.changeBorderColor(color);\n props.onBorderStyle(borderStyle, borderInfo);\n props.f7router.back();\n };\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n \n )\n};\n\nconst PageBorderSizeCell = props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const storeCellSettings = props.storeCellSettings;\n const borderInfo = storeCellSettings.borderInfo;\n const borderStyle = storeCellSettings.borderStyle;\n\n const borderSizes = {\n 7: `${_t.textThin}`,\n 12: `${_t.textMedium}`,\n 13: `${_t.textThick}`\n }\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n {Object.keys(borderSizes).map(key => {\n return (\n {\n storeCellSettings.changeBorderSize(+key);\n props.onBorderStyle(borderStyle, borderInfo);\n }}>\n )\n })}\n
\n \n )\n}\n\nconst PageFormatCell = props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const isIos = Device.ios;\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n \n \n \n props.onCellFormat('General')}>\n \n \n props.onCellFormat('0.00')}>\n \n \n props.onCellFormat('# ?/?')}>\n \n \n props.onCellFormat('0.00E+00')}>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n props.onCellFormat('0.00%')}>\n \n \n props.onCellFormat('@')}>\n \n \n
\n \n )\n}\n\nconst PageCustomFormats = props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const storeCellSettings = props.storeCellSettings;\n const customFormats = storeCellSettings.customFormats;\n const [renderList, setRenderList] = useState(false);\n\n useEffect(() => {\n if (customFormats?.length) {\n setRenderList(true);\n }\n }, [customFormats]);\n\n const handleCellFormatClick = (format) => {\n props.onCellFormat(format);\n props.f7router.back();\n };\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n \n
\n {renderList && (\n \n {customFormats.map((item, idx) => (\n handleCellFormatClick(item.value)}\n />\n ))}\n
\n )}\n \n )\n}\n\nconst PageCreationCustomFormat = observer(props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const [formatValue, setFormatValue] = useState('');\n const isIos = Device.ios;\n\n const handleSetCustomFormat = (value) => {\n props.setCustomFormat(value);\n props.f7router.back();\n }\n\n return (\n \n \n \n handleSetCustomFormat(formatValue)}>\n \n \n <>\n \n setFormatValue(e.target.value)}\n clearButton={isIos ? true : false}\n />\n
\n \n {t('View.Edit.textCustomFormatWarning')}
\n \n >\n \n )\n});\n\nconst PageAccountingFormatCell = observer(props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n props.onAccountingCellFormat(1033)}>\n \n props.onAccountingCellFormat(1031)}>\n \n props.onAccountingCellFormat(2057)}> \n \n props.onAccountingCellFormat(1049)}>\n \n props.onAccountingCellFormat(1041)}>\n \n
\n \n )\n});\n\nconst PageCurrencyFormatCell = props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n props.onCellFormat('[$$-409]#,##0.00')}>\n \n props.onCellFormat('#,##0.00\\ [$€-407]')}>\n \n props.onCellFormat('[$£-809]#,##0.00')}>\n \n props.onCellFormat('#,##0.00\\ [$₽-419]')}>\n \n props.onCellFormat('[$¥-411]#,##0.00')}>\n \n
\n \n )\n}\n\nconst PageDateFormatCell = props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const dateFormats = props.dateFormats;\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n {dateFormats.map((format, index) => {\n return (\n props.onCellFormat(format.value)}>\n )\n })}\n
\n \n )\n}\n\nconst PageTimeFormatCell = props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const timeFormats = props.timeFormats;\n\n return (\n \n \n {Device.phone &&\n \n \n \n }\n \n \n {timeFormats.map((format, index) => {\n return (\n props.onCellFormat(format.value)}>\n )\n })}\n
\n \n )\n}\n\n\nconst PageEditCell = inject(\"storeCellSettings\", \"storeWorksheets\")(observer(EditCell));\nconst TextColorCell = inject(\"storeCellSettings\", \"storePalette\", \"storeFocusObjects\")(observer(PageTextColorCell));\nconst FillColorCell = inject(\"storeCellSettings\", \"storePalette\", \"storeFocusObjects\")(observer(PageFillColorCell));\nconst CustomTextColorCell = inject(\"storeCellSettings\", \"storePalette\", \"storeFocusObjects\")(observer(PageCustomTextColorCell));\nconst CustomFillColorCell = inject(\"storeCellSettings\", \"storePalette\", \"storeFocusObjects\")(observer(PageCustomFillColorCell));\nconst FontsCell = inject(\"storeCellSettings\", \"storeTextSettings\" , \"storeFocusObjects\")(observer(PageFontsCell));\nconst TextFormatCell = inject(\"storeCellSettings\", \"storeFocusObjects\")(observer(PageTextFormatCell));\nconst TextOrientationCell = inject(\"storeCellSettings\", \"storeFocusObjects\")(observer(PageTextOrientationCell));\nconst BorderStyleCell = inject(\"storeCellSettings\", \"storeFocusObjects\")(observer(PageBorderStyleCell));\nconst BorderColorCell = inject(\"storeCellSettings\", \"storePalette\")(observer(PageBorderColorCell));\nconst CustomBorderColorCell = inject(\"storeCellSettings\", \"storePalette\")(observer(PageCustomBorderColorCell));\nconst BorderSizeCell = inject(\"storeCellSettings\")(observer(PageBorderSizeCell));\nconst CellStyle = inject(\"storeCellSettings\")(observer(PageCellStyle));\nconst CustomFormats = inject(\"storeCellSettings\")(observer(PageCustomFormats));\n\nexport {\n PageEditCell as EditCell,\n TextColorCell,\n FillColorCell,\n CustomFillColorCell,\n CustomTextColorCell,\n FontsCell,\n TextFormatCell,\n TextOrientationCell,\n BorderStyleCell,\n BorderColorCell,\n CustomBorderColorCell,\n BorderSizeCell,\n PageFormatCell,\n PageAccountingFormatCell,\n PageCurrencyFormatCell,\n PageDateFormatCell,\n PageTimeFormatCell,\n CellStyle,\n CustomFormats,\n PageCreationCustomFormat\n};\n","import React, {Fragment, useState} from 'react';\r\nimport {observer, inject} from \"mobx-react\";\r\nimport {List, ListItem, Icon, Button, Page, Navbar, NavRight, Segmented, BlockTitle, Link} from 'framework7-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Device } from '../../../../../common/mobile/utils/device';\r\nimport { ThemeColorPalette, CustomColorPicker } from '../../../../../common/mobile/lib/component/ThemeColorPalette.jsx';\r\nimport { LocalStorage } from '../../../../../common/mobile/utils/LocalStorage.mjs';\r\n\r\nconst EditText = props => {\r\n const isAndroid = Device.android;\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const storeFocusObjects = props.storeFocusObjects;\r\n const shapeObject = storeFocusObjects.shapeObject;\r\n const storeTextSettings = props.storeTextSettings;\r\n const textIn = storeTextSettings.textIn;\r\n\r\n const fontName = storeTextSettings.fontName || _t.textFonts;\r\n const fontSize = storeTextSettings.fontSize;\r\n const fontColor = storeTextSettings.textColor;\r\n\r\n const displaySize = typeof fontSize === 'undefined' ? _t.textAuto : fontSize + ' ' + _t.textPt;\r\n const isBold = storeTextSettings.isBold;\r\n const isItalic = storeTextSettings.isItalic;\r\n const isUnderline = storeTextSettings.isUnderline;\r\n const paragraphAlign = storeTextSettings.paragraphAlign;\r\n const paragraphValign = storeTextSettings.paragraphValign;\r\n\r\n const fontColorPreview = fontColor !== 'auto' ?\r\n :\r\n ;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {!isAndroid ?\r\n {fontColorPreview} :\r\n fontColorPreview\r\n }\r\n \r\n
\r\n {textIn === 2 ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {shapeObject &&\r\n \r\n {!isAndroid && }\r\n \r\n }\r\n
\r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nconst PageOrientationTextShape = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const shapeObject = props.shapeObject;\r\n const [directionTextShape, setDirectionTextShape] = useState(shapeObject.get_Vert());\r\n const isAndroid = Device.android;\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n \r\n \r\n }\r\n \r\n \r\n {\r\n setDirectionTextShape(Asc.c_oAscVertDrawingText.normal);\r\n props.setOrientationTextShape(Asc.c_oAscVertDrawingText.normal);\r\n }}>\r\n \r\n \r\n {\r\n setDirectionTextShape(Asc.c_oAscVertDrawingText.vert);\r\n props.setOrientationTextShape(Asc.c_oAscVertDrawingText.vert);\r\n }}>\r\n \r\n \r\n {\r\n setDirectionTextShape(Asc.c_oAscVertDrawingText.vert270);\r\n props.setOrientationTextShape(Asc.c_oAscVertDrawingText.vert270);\r\n }}>\r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageFonts = props => {\r\n const isAndroid = Device.android;\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const storeTextSettings = props.storeTextSettings;\r\n const size = storeTextSettings.fontSize;\r\n const displaySize = typeof size === 'undefined' ? _t.textAuto : size + ' ' + _t.textPt;\r\n const curFontName = storeTextSettings.fontName;\r\n const fonts = storeTextSettings.fontsArray;\r\n const iconWidth = storeTextSettings.iconWidth;\r\n const iconHeight = storeTextSettings.iconHeight;\r\n // const thumbs = storeTextSettings.thumbs;\r\n // const thumbIdx = storeTextSettings.thumbIdx;\r\n const thumbCanvas = storeTextSettings.thumbCanvas;\r\n const thumbContext = storeTextSettings.thumbContext;\r\n const spriteCols = storeTextSettings.spriteCols;\r\n const spriteThumbs = storeTextSettings.spriteThumbs;\r\n const arrayRecentFonts = storeTextSettings.arrayRecentFonts;\r\n\r\n const addRecentStorage = () => {\r\n setRecent(getImageUri(arrayRecentFonts));\r\n LocalStorage.setItem('sse-settings-recent-fonts', JSON.stringify(arrayRecentFonts));\r\n };\r\n\r\n const getImageUri = fonts => {\r\n return fonts.map(font => {\r\n let index = Math.floor(font.imgidx/spriteCols);\r\n return spriteThumbs.getImage(index, thumbCanvas, thumbContext).toDataURL();\r\n });\r\n };\r\n\r\n const [stateRecent, setRecent] = useState(() => getImageUri(arrayRecentFonts));\r\n const [vlFonts, setVlFonts] = useState({\r\n vlData: {\r\n items: [],\r\n }\r\n });\r\n\r\n const renderExternal = (vl, vlData) => {\r\n setVlFonts((prevState) => {\r\n let fonts = [...prevState.vlData.items],\r\n drawFonts = [...vlData.items];\r\n\r\n let images = [],\r\n drawImages = getImageUri(drawFonts);\r\n for (let i = 0; i < drawFonts.length; i++) {\r\n fonts[i + vlData.fromIndex] = drawFonts[i];\r\n images[i + vlData.fromIndex] = drawImages[i];\r\n }\r\n return {vlData: {\r\n items: fonts,\r\n images,\r\n }}\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n {!isAndroid && {displaySize}
}\r\n \r\n \r\n \r\n {isAndroid && }\r\n \r\n \r\n
\r\n \r\n
\r\n {_t.textFonts}\r\n {!!arrayRecentFonts.length &&\r\n \r\n {arrayRecentFonts.map((item, index) => (\r\n {\r\n props.changeFontFamily(item.name);\r\n }}> \r\n
\r\n \r\n ))}\r\n
\r\n }\r\n \r\n \r\n {vlFonts.vlData.items.map((item, index) => {\r\n const font = item || fonts[index];\r\n const fontName = font.name;\r\n return (\r\n {\r\n props.changeFontFamily(fontName);\r\n storeTextSettings.addFontToRecent(font);\r\n addRecentStorage();\r\n }}>\r\n {vlFonts.vlData.images[index] &&
}\r\n \r\n )\r\n })}\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nconst PageFontColor = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const storeTextSettings = props.storeTextSettings;\r\n const storePalette = props.storePalette;\r\n const textColor = storeTextSettings.textColor;\r\n const customColors = storePalette.customColors;\r\n\r\n const changeColor = (color, effectId, effectValue) => {\r\n if (color !== 'empty') {\r\n if (effectId !== undefined) {\r\n const newColor = {color: color, effectId: effectId, effectValue: effectValue};\r\n props.onTextColor(newColor);\r\n storeTextSettings.changeTextColor(newColor);\r\n } else {\r\n props.onTextColor(color);\r\n storeTextSettings.changeTextColor(color);\r\n }\r\n } else {\r\n // open custom color menu\r\n props.f7router.navigate('/edit-text-custom-font-color/', {props: {onTextColor: props.onTextColor}});\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nconst PageCustomFontColor = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const storeTextSettings = props.storeTextSettings;\r\n const storePalette = props.storePalette;\r\n let textColor = storeTextSettings.textColor;\r\n\r\n if (typeof textColor === 'object') {\r\n textColor = textColor.color;\r\n }\r\n\r\n const autoColor = textColor === 'auto' ? window.getComputedStyle(document.getElementById('font-color-auto')).backgroundColor : null;\r\n\r\n const onAddNewColor = (colors, color) => {\r\n storePalette.changeCustomColors(colors);\r\n storeTextSettings.changeTextColor(color);\r\n props.onTextColor(color);\r\n props.f7router.back();\r\n };\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n )\r\n};\r\n\r\nconst EditTextContainer = inject(\"storeTextSettings\", \"storeFocusObjects\")(observer(EditText));\r\nconst PageTextFonts = inject(\"storeTextSettings\", \"storeFocusObjects\")(observer(PageFonts));\r\nconst PageTextFontColor = inject(\"storeTextSettings\", \"storePalette\")(observer(PageFontColor));\r\nconst PageTextCustomFontColor = inject(\"storeTextSettings\", \"storePalette\")(observer(PageCustomFontColor));\r\n\r\nexport {\r\n EditTextContainer as EditText,\r\n PageTextFonts,\r\n PageTextFontColor,\r\n PageTextCustomFontColor,\r\n PageOrientationTextShape\r\n};","import React, {Fragment, useState, useEffect} from 'react';\r\nimport {observer, inject} from \"mobx-react\";\r\nimport {f7, List, ListItem, ListButton, ListInput, Icon, Page, Navbar, NavRight, BlockTitle, Toggle, Range, Link} from 'framework7-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {Device} from '../../../../../common/mobile/utils/device';\r\nimport {CustomColorPicker, ThemeColorPalette} from \"../../../../../common/mobile/lib/component/ThemeColorPalette.jsx\";\r\nimport { Swiper, SwiperSlide } from 'swiper/react';\r\n\r\nconst PageCustomFillColor = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n let fillColor = props.storeChartSettings.fillColor;\r\n\r\n if (typeof fillColor === 'object') {\r\n fillColor = fillColor.color;\r\n }\r\n\r\n const onAddNewColor = (colors, color) => {\r\n props.storePalette.changeCustomColors(colors);\r\n props.onFillColor(color);\r\n props.storeChartSettings.setFillColor(color);\r\n props.f7router.back();\r\n };\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n )\r\n};\r\n\r\nconst PaletteFill = inject(\"storeFocusObjects\", \"storeChartSettings\", \"storePalette\")(observer(props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const storeChartSettings = props.storeChartSettings;\r\n const shapeProperties = props.storeFocusObjects.shapeObject.get_ShapeProperties();\r\n const curFillColor = storeChartSettings.fillColor ? storeChartSettings.fillColor : storeChartSettings.getFillColor(shapeProperties);\r\n const customColors = props.storePalette.customColors;\r\n\r\n const changeColor = (color, effectId, effectValue) => {\r\n if (color !== 'empty') {\r\n if (effectId !==undefined ) {\r\n const newColor = {color: color, effectId: effectId, effectValue: effectValue};\r\n props.onFillColor(newColor);\r\n storeChartSettings.setFillColor(newColor);\r\n } else {\r\n props.onFillColor(color);\r\n storeChartSettings.setFillColor(color);\r\n }\r\n } else {\r\n // open custom color menu\r\n props.f7router.navigate('/edit-chart-custom-fill-color/', {props: {onFillColor: props.onFillColor}});\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n \r\n )\r\n}));\r\n\r\nconst PageCustomBorderColor = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n let borderColor = props.storeChartSettings.borderColor;\r\n\r\n if (typeof borderColor === 'object') {\r\n borderColor = borderColor.color;\r\n }\r\n\r\n const onAddNewColor = (colors, color) => {\r\n props.storePalette.changeCustomColors(colors);\r\n props.onBorderColor(color);\r\n props.storeChartSettings.setBorderColor(color);\r\n props.f7router.back();\r\n };\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n )\r\n};\r\n\r\nconst PageBorderColor = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const storeChartSettings = props.storeChartSettings;\r\n const storePalette = props.storePalette;\r\n const borderColor = storeChartSettings.borderColor;\r\n const customColors = storePalette.customColors;\r\n\r\n const changeColor = (color, effectId, effectValue) => {\r\n if (color !== 'empty') {\r\n if (effectId !== undefined) {\r\n const newColor = {color: color, effectId: effectId, effectValue: effectValue};\r\n props.onBorderColor(newColor);\r\n storeChartSettings.setBorderColor(newColor);\r\n } else {\r\n props.onBorderColor(color);\r\n storeChartSettings.setBorderColor(color);\r\n }\r\n } else {\r\n // open custom color menu\r\n props.f7router.navigate('/edit-chart-custom-border-color/', {props: {onBorderColor: props.onBorderColor}});\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n \r\n
\r\n \r\n )\r\n};\r\n\r\nconst PageChartType = props => {\r\n const { t } = useTranslation();\r\n const storeChartSettings = props.storeChartSettings;\r\n const types = storeChartSettings.types;\r\n const countSlides = Math.floor(types.length / 3);\r\n const arraySlides = Array(countSlides).fill(countSlides);\r\n const storeFocusObjects = props.storeFocusObjects;\r\n const chartProperties = storeFocusObjects.chartObject && storeFocusObjects.chartObject.get_ChartProperties();\r\n const curType = chartProperties && chartProperties.getType();\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n {types && types.length ? (\r\n
\r\n {arraySlides.map((_, indexSlide) => {\r\n let typesSlide = types.slice(indexSlide * 3, (indexSlide * 3) + 3);\r\n\r\n return (\r\n \r\n {typesSlide.map((row, rowIndex) => {\r\n return (\r\n \r\n {row.map((type, index) => {\r\n return (\r\n - {props.onType(type.type)}}>\r\n \r\n
\r\n )\r\n })}\r\n
\r\n )\r\n })}\r\n \r\n )\r\n })}\r\n \r\n ) : null}\r\n
\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageChartStyle = props => {\r\n const { t } = useTranslation();\r\n const storeChartSettings = props.storeChartSettings;\r\n const styles = storeChartSettings.styles;\r\n const chartStyles = storeChartSettings.chartStyles;\r\n\r\n return (\r\n \r\n \r\n\r\n {chartStyles ? \r\n \r\n : null}\r\n \r\n )\r\n}\r\n\r\nconst PageChartDesignFill = props => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst PageChartBorder = props => {\r\n const { t } = useTranslation();\r\n const storeChartSettings = props.storeChartSettings;\r\n const storeFocusObjects = props.storeFocusObjects;\r\n const shapeProperties = storeFocusObjects.shapeObject && storeFocusObjects.shapeObject.get_ShapeProperties();\r\n\r\n // Init border size\r\n let borderSize, borderType;\r\n if (shapeProperties) {\r\n const shapeStroke = shapeProperties.get_stroke();\r\n borderSize = shapeStroke.get_width() * 72.0 / 25.4;\r\n borderType = shapeStroke.get_type();\r\n }\r\n const borderSizeTransform = storeChartSettings.borderSizeTransform();\r\n const displayBorderSize = (borderType == Asc.c_oAscStrokeType.STROKE_NONE || borderType === undefined) ? 0 : borderSizeTransform.indexSizeByValue(borderSize);\r\n const displayTextBorderSize = (borderType == Asc.c_oAscStrokeType.STROKE_NONE || borderType === undefined) ? 0 : borderSizeTransform.sizeByValue(borderSize);\r\n const [stateBorderSize, setBorderSize] = useState(displayBorderSize);\r\n const [stateTextBorderSize, setTextBorderSize] = useState(displayTextBorderSize);\r\n\r\n // Init border color\r\n\r\n if(!storeChartSettings.borderColor && shapeProperties) {\r\n storeChartSettings.initBorderColor(shapeProperties);\r\n }\r\n\r\n const borderColor = storeChartSettings.borderColor;\r\n const displayBorderColor = borderColor == 'transparent' ? borderColor : `#${(typeof borderColor === \"object\" ? borderColor.color : borderColor)}`;\r\n \r\n return (\r\n \r\n \r\n\r\n \r\n
\r\n \r\n {t('View.Edit.textSize')}
\r\n \r\n {setBorderSize(value); setTextBorderSize(borderSizeTransform.sizeByIndex(value));}}\r\n onRangeChanged={(value) => {props.onBorderSize(borderSizeTransform.sizeByIndex(value))}}\r\n >\r\n
\r\n \r\n {stateTextBorderSize + ' ' + Common.Utils.Metric.getMetricName(Common.Utils.Metric.c_MetricUnits.pt)}\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageDesign = props => {\r\n const { t } = useTranslation();\r\n const storeFocusObjects = props.storeFocusObjects;\r\n const chartProperties = storeFocusObjects.chartObject && storeFocusObjects.chartObject.get_ChartProperties();\r\n\r\n // console.log(chartStyles, curType);\r\n // console.log(Asc.c_oAscChartTypeSettings.comboBarLine, Asc.c_oAscChartTypeSettings.comboBarLineSecondary, Asc.c_oAscChartTypeSettings.comboAreaBar, Asc.c_oAscChartTypeSettings.comboCustom);\r\n\r\n if ((!chartProperties || storeFocusObjects.focusOn === 'cell') && Device.phone) {\r\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n )\r\n};\r\n\r\nconst PageReorder = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n if ((!props.storeFocusObjects.chartObject || props.storeFocusObjects.focusOn === 'cell') && Device.phone) {\r\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\r\n return null;\r\n }\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {props.onReorder('all-up')}} link='#' className='no-indicator'>\r\n \r\n \r\n {props.onReorder('all-down')}} link='#' className='no-indicator'>\r\n \r\n \r\n {props.onReorder('move-up')}} link='#' className='no-indicator'>\r\n \r\n \r\n {props.onReorder('move-down')}} link='#' className='no-indicator'>\r\n \r\n \r\n
\r\n \r\n )\r\n};\r\n\r\nconst PageLayout = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const storeFocusObjects = props.storeFocusObjects;\r\n const chartObject = storeFocusObjects.chartObject;\r\n const chartProperties = chartObject && chartObject.get_ChartProperties();\r\n const chartType = chartProperties && chartProperties.getType();\r\n\r\n let title, legend, axisHorTitle, axisVertTitle, horGridlines, vertGridlines, dataLabel;\r\n if (chartProperties) {\r\n title = chartProperties.getTitle();\r\n legend = chartProperties.getLegendPos();\r\n axisHorTitle = chartProperties.getHorAxisLabel();\r\n axisVertTitle = chartProperties.getVertAxisLabel();\r\n horGridlines = chartProperties.getHorGridLines();\r\n vertGridlines = chartProperties.getVertGridLines();\r\n dataLabel = chartProperties.getDataLabelsPos();\r\n }\r\n\r\n const [chartTitle, setTitle] = useState(title);\r\n const [chartLegend, setLegend] = useState(legend);\r\n const [chartAxisHorTitle, setAxisHorTitle] = useState(axisHorTitle);\r\n const [chartAxisVertTitle, setAxisVertTitle] = useState(axisVertTitle);\r\n const [chartHorGridlines, setHorGridlines] = useState(horGridlines);\r\n const [chartVertGridlines, setVertGridlines] = useState(vertGridlines);\r\n const [chartDataLabel, setDataLabel] = useState(dataLabel);\r\n\r\n let dataLabelPos = [\r\n { value: Asc.c_oAscChartDataLabelsPos.none, displayValue: _t.textNone },\r\n { value: Asc.c_oAscChartDataLabelsPos.ctr, displayValue: _t.textCenter }\r\n ];\r\n\r\n if (chartType == Asc.c_oAscChartTypeSettings.barNormal || chartType == Asc.c_oAscChartTypeSettings.hBarNormal) {\r\n dataLabelPos.push(\r\n {value: Asc.c_oAscChartDataLabelsPos.inBase, displayValue: _t.textInnerBottom},\r\n {value: Asc.c_oAscChartDataLabelsPos.inEnd, displayValue: _t.textInnerTop},\r\n {value: Asc.c_oAscChartDataLabelsPos.outEnd, displayValue: _t.textOuterTop}\r\n );\r\n } else if ( chartType == Asc.c_oAscChartTypeSettings.barStacked ||\r\n chartType == Asc.c_oAscChartTypeSettings.barStackedPer ||\r\n chartType == Asc.c_oAscChartTypeSettings.hBarStacked ||\r\n chartType == Asc.c_oAscChartTypeSettings.hBarStackedPer ) {\r\n dataLabelPos.push(\r\n { value: Asc.c_oAscChartDataLabelsPos.inBase, displayValue: _t.textInnerBottom },\r\n { value: Asc.c_oAscChartDataLabelsPos.inEnd, displayValue: _t.textInnerTop }\r\n );\r\n } else if (chartType == Asc.c_oAscChartTypeSettings.lineNormal ||\r\n chartType == Asc.c_oAscChartTypeSettings.lineStacked ||\r\n chartType == Asc.c_oAscChartTypeSettings.lineStackedPer ||\r\n chartType == Asc.c_oAscChartTypeSettings.stock ||\r\n chartType == Asc.c_oAscChartTypeSettings.scatter ||\r\n chartType == Asc.c_oAscChartTypeSettings.scatterSmoothMarker || chartType == Asc.c_oAscChartTypeSettings.scatterSmooth ||\r\n chartType == Asc.c_oAscChartTypeSettings.scatterLineMarker || chartType == Asc.c_oAscChartTypeSettings.scatterLine) {\r\n dataLabelPos.push(\r\n { value: Asc.c_oAscChartDataLabelsPos.l, displayValue: _t.textLeft },\r\n { value: Asc.c_oAscChartDataLabelsPos.r, displayValue: _t.textRight },\r\n { value: Asc.c_oAscChartDataLabelsPos.t, displayValue: _t.textTop },\r\n { value: Asc.c_oAscChartDataLabelsPos.b, displayValue: _t.textBottom }\r\n );\r\n } else if (chartType == Asc.c_oAscChartTypeSettings.pie || chartType == Asc.c_oAscChartTypeSettings.pie3d) {\r\n dataLabelPos.push(\r\n {value: Asc.c_oAscChartDataLabelsPos.bestFit, displayValue: _t.textFit},\r\n {value: Asc.c_oAscChartDataLabelsPos.inEnd, displayValue: _t.textInnerTop},\r\n {value: Asc.c_oAscChartDataLabelsPos.outEnd, displayValue: _t.textOuterTop}\r\n );\r\n }\r\n\r\n const disableEditAxis = props.disableEditAxis;\r\n\r\n const chartLayoutTitles = {\r\n 0: `${_t.textNone}`,\r\n 1: `${_t.textOverlay}`,\r\n 2: `${_t.textNoOverlay}`\r\n };\r\n\r\n const chartLayoutLegends = {\r\n 0: `${_t.textNone}`,\r\n 1: `${_t.textLeft}`,\r\n 2: `${_t.textTop}`,\r\n 3: `${_t.textRight}`,\r\n 4: `${_t.textBottom}`,\r\n 5: `${_t.textLeftOverlay}`,\r\n 6: `${_t.textRightOverlay}`\r\n };\r\n\r\n const chartLayoutAxisTitleHorizontal = {\r\n 0: `${_t.textNone}`,\r\n 1: `${_t.textNoOverlay}`\r\n };\r\n\r\n const chartLayoutAxisTitleVertical = {\r\n 0: `${_t.textNone}`,\r\n 1: `${_t.textRotated}`,\r\n 3: `${_t.textHorizontal}`\r\n };\r\n\r\n const chartLayoutGridlinesHorizontal = {\r\n 0: `${_t.textNone}`,\r\n 1: `${_t.textMajor}`,\r\n 2: `${_t.textMinor}`,\r\n 3: `${_t.textMajorAndMinor}`\r\n };\r\n\r\n const chartLayoutGridlinesVertical = {\r\n 0: `${_t.textNone}`,\r\n 1: `${_t.textMajor}`,\r\n 2: `${_t.textMinor}`,\r\n 3: `${_t.textMajorAndMinor}`\r\n };\r\n\r\n const chartDataLabels = {\r\n 0: `${_t.textNone}`,\r\n 3: `${_t.textCenter}`,\r\n 2: `${_t.textFit}`,\r\n 5: `${_t.textInnerTop}`,\r\n 7: `${_t.textOuterTop}`\r\n };\r\n\r\n if ((!chartObject || storeFocusObjects.focusOn === 'cell') && Device.phone) {\r\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n {_t.textAxisTitle}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n {_t.textGridlines}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageChartTitle = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const chartLayoutTitles = props.chartLayoutTitles;\r\n const [currentTitle, setTitle] = useState(props.chartTitle);\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {Object.keys(chartLayoutTitles).map(key => {\r\n return (\r\n {\r\n props.setTitle(+key);\r\n setTitle(+key);\r\n props.setLayoutProperty('putTitle', key);\r\n props.f7router.back();\r\n }}>\r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageLegend = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const chartLayoutLegends = props.chartLayoutLegends;\r\n const [currentLegend, setLegend] = useState(props.chartLegend);\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {Object.keys(chartLayoutLegends).map(key => {\r\n return (\r\n {\r\n props.setLegend(+key);\r\n setLegend(+key);\r\n props.setLayoutProperty('putLegendPos', key);\r\n props.f7router.back();\r\n }}>\r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageHorizontalAxisTitle = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const chartLayoutAxisTitleHorizontal = props.chartLayoutAxisTitleHorizontal;\r\n const [currentAxisHorTitle, setAxisHorTitle] = useState(props.chartAxisHorTitle);\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {Object.keys(chartLayoutAxisTitleHorizontal).map(key => {\r\n return (\r\n {\r\n props.setAxisHorTitle(+key);\r\n setAxisHorTitle(+key);\r\n props.setLayoutProperty('putHorAxisLabel', key);\r\n props.f7router.back();\r\n }}>\r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageVerticalAxisTitle = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const chartLayoutAxisTitleVertical = props.chartLayoutAxisTitleVertical;\r\n const [currentAxisVertTitle, setAxisVertTitle] = useState(props.chartAxisVertTitle);\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {Object.keys(chartLayoutAxisTitleVertical).map(key => {\r\n return (\r\n {\r\n props.setAxisVertTitle(+key);\r\n setAxisVertTitle(+key);\r\n props.setLayoutProperty('putVertAxisLabel', key);\r\n props.f7router.back();\r\n }}>\r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageHorizontalGridlines = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const chartLayoutGridlinesHorizontal = props.chartLayoutGridlinesHorizontal;\r\n const [currentChartHorGridlines, setHorGridlines] = useState(props.chartHorGridlines);\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {Object.keys(chartLayoutGridlinesHorizontal).map(key => {\r\n return (\r\n {\r\n props.setHorGridlines(+key);\r\n setHorGridlines(+key);\r\n props.setLayoutProperty('putHorGridLines', key);\r\n props.f7router.back();\r\n }}>\r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageVerticalGridlines = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const chartLayoutGridlinesVertical = props.chartLayoutGridlinesVertical;\r\n const [currentChartVertGridlines, setVertGridlines] = useState(props.chartVertGridlines);\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {Object.keys(chartLayoutGridlinesVertical).map(key => {\r\n return (\r\n {\r\n props.setVertGridlines(+key);\r\n setVertGridlines(+key);\r\n props.setLayoutProperty('putVertGridLines', key);\r\n props.f7router.back();\r\n }}>\r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageDataLabels = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const chartDataLabels = props.chartDataLabels;\r\n const [currentChartDataLabel, setDataLabel] = useState(props.chartDataLabel);\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {Object.keys(chartDataLabels).map(key => {\r\n return (\r\n {\r\n props.setDataLabel(+key);\r\n setDataLabel(+key);\r\n props.setLayoutProperty('putDataLabelsPos', key);\r\n props.f7router.back();\r\n }}>\r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageVerticalAxis = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const api = Common.EditorApi.get();\r\n const chartProperty = api.asc_getChartObject(true);\r\n const isIos = Device.ios;\r\n const verAxisProps = chartProperty.getVertAxisProps();\r\n const axisProps = (verAxisProps.getAxisType() == Asc.c_oAscAxisType.val) ? verAxisProps : chartProperty.getHorAxisProps();\r\n const crossValue = axisProps.getCrossesRule();\r\n\r\n const axisCrosses = [\r\n {display: `${_t.textAuto}`, value: Asc.c_oAscCrossesRule.auto},\r\n {display: `${_t.textValue}`, value: Asc.c_oAscCrossesRule.value},\r\n {display: `${_t.textMinimumValue}`, value: Asc.c_oAscCrossesRule.minValue},\r\n {display: `${_t.textMaximumValue}`, value: Asc.c_oAscCrossesRule.maxValue}\r\n ];\r\n\r\n const vertAxisDisplayUnits = [\r\n {display: `${_t.textNone}`, value: Asc.c_oAscValAxUnits.none},\r\n {display: `${_t.textHundreds}`, value: Asc.c_oAscValAxUnits.HUNDREDS},\r\n {display: `${_t.textThousands}`, value: Asc.c_oAscValAxUnits.THOUSANDS},\r\n {display: `${_t.textTenThousands}`, value: Asc.c_oAscValAxUnits.TEN_THOUSANDS},\r\n {display: `${_t.textHundredThousands}`, value: Asc.c_oAscValAxUnits.HUNDRED_THOUSANDS},\r\n {display: `${_t.textMillions}`, value: Asc.c_oAscValAxUnits.MILLIONS},\r\n {display: `${_t.textTenMillions}`, value: Asc.c_oAscValAxUnits.TEN_MILLIONS},\r\n {display: `${_t.textHundredMil}`, value: Asc.c_oAscValAxUnits.HUNDRED_MILLIONS},\r\n {display: `${_t.textBillions}`, value: Asc.c_oAscValAxUnits.BILLIONS},\r\n {display: `${_t.textTrillions}`, value: Asc.c_oAscValAxUnits.TRILLIONS}\r\n ];\r\n\r\n const tickOptions = [\r\n {display: `${_t.textNone}`, value: Asc.c_oAscTickMark.TICK_MARK_NONE},\r\n {display: `${_t.textCross}`, value: Asc.c_oAscTickMark.TICK_MARK_CROSS},\r\n {display: `${_t.textIn}`, value: Asc.c_oAscTickMark.TICK_MARK_IN},\r\n {display: `${_t.textOut}`, value: Asc.c_oAscTickMark.TICK_MARK_OUT}\r\n ];\r\n\r\n const verticalAxisLabelsPosition = [\r\n {display: `${_t.textNone}`, value: Asc.c_oAscTickLabelsPos.TICK_LABEL_POSITION_NONE},\r\n {display: `${_t.textLow}`, value: Asc.c_oAscTickLabelsPos.TICK_LABEL_POSITION_LOW},\r\n {display: `${_t.textHigh}`, value: Asc.c_oAscTickLabelsPos.TICK_LABEL_POSITION_HIGH},\r\n {display: `${_t.textNextToAxis}`, value: Asc.c_oAscTickLabelsPos.TICK_LABEL_POSITION_NEXT_TO}\r\n ];\r\n\r\n const defineCurrentAxisCrosses = () => axisCrosses.find(elem => elem.value === crossValue);\r\n const [currentAxisCrosses, setAxisCrosses] = useState(defineCurrentAxisCrosses());\r\n\r\n const defineCurrentDisplayUnits = () => vertAxisDisplayUnits.find(elem => elem.value === axisProps.getDispUnitsRule());\r\n const [currentDisplayUnits, setDisplayUnits] = useState(defineCurrentDisplayUnits());\r\n\r\n const [valuesReverseOrder, toggleValuesReverseOrder] = useState(axisProps.getInvertValOrder());\r\n\r\n const valueMajorType = axisProps.getMajorTickMark();\r\n const valueMinorType = axisProps.getMinorTickMark();\r\n\r\n const defineCurrentTickOption = (elemType) => tickOptions.find(elem => elem.value === elemType);\r\n const [currentMajorType, setMajorType] = useState(defineCurrentTickOption(valueMajorType));\r\n const [currentMinorType, setMinorType] = useState(defineCurrentTickOption(valueMinorType));\r\n\r\n const defineLabelsPosition = () => verticalAxisLabelsPosition.find(elem => elem.value === axisProps.getTickLabelsPos());\r\n const [currentLabelsPosition, setLabelsPosition] = useState(defineLabelsPosition());\r\n\r\n const [minValue, setMinValue] = useState(axisProps.getMinValRule() == Asc.c_oAscValAxisRule.auto ? '' : axisProps.getMinVal());\r\n const [maxValue, setMaxValue] = useState(axisProps.getMaxValRule() == Asc.c_oAscValAxisRule.auto ? '' : axisProps.getMaxVal());\r\n\r\n const currentCrossesValue = axisProps.getCrosses();\r\n const [crossesValue, setCrossesValue] = useState(!currentCrossesValue ? '' : currentCrossesValue);\r\n\r\n if ((!props.storeFocusObjects.chartObject || props.storeFocusObjects.focusOn === 'cell') && Device.phone) {\r\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n props.onVerAxisMinValue(e.target.value)}\r\n onInput={e => setMinValue(e.target.value)}\r\n className={isIos ? 'list-input-right' : ''}\r\n />\r\n\r\n props.onVerAxisMaxValue(e.target.value)} \r\n onInput={e => setMaxValue(e.target.value)}\r\n className={isIos ? 'list-input-right' : ''}\r\n />\r\n
\r\n \r\n \r\n {currentAxisCrosses.value == Asc.c_oAscCrossesRule.value ? (\r\n props.onVerAxisCrossValue(e.target.value)} \r\n onInput={e => setCrossesValue(e.target.value)}\r\n className={isIos ? 'list-input-right' : ''}\r\n />\r\n ) : null}\r\n
\r\n \r\n \r\n \r\n \r\n {\r\n toggleValuesReverseOrder(!valuesReverseOrder);\r\n props.onVerAxisReverse(!valuesReverseOrder);\r\n }} />\r\n
\r\n \r\n
\r\n {_t.textTickOptions}\r\n \r\n \r\n \r\n
\r\n {_t.textLabelOptions}\r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageVertAxisCrosses = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const axisCrosses = props.axisCrosses;\r\n const [currentAxisCrosses, setAxisCrosses] = useState(props.currentAxisCrosses);\r\n\r\n return ( \r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {axisCrosses.map((elem, index) => {\r\n return (\r\n { \r\n props.setAxisCrosses(elem);\r\n setAxisCrosses(elem);\r\n props.onVerAxisCrossType(elem.value);\r\n props.f7router.back();\r\n }}>\r\n \r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageDisplayUnits = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const vertAxisDisplayUnits = props.vertAxisDisplayUnits;\r\n const [currentDisplayUnits, setDisplayUnits] = useState(props.currentDisplayUnits);\r\n \r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {vertAxisDisplayUnits.map((elem, index) => {\r\n return (\r\n {\r\n props.setDisplayUnits(elem);\r\n setDisplayUnits(elem);\r\n props.onVerAxisDisplayUnits(elem.value);\r\n props.f7router.back();\r\n }}>\r\n \r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageVertMajorType = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const [currentMajorType, setMajorType] = useState(props.currentMajorType);\r\n const tickOptions = props.tickOptions;\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {tickOptions.map((elem, index) => {\r\n return (\r\n {\r\n props.setMajorType(elem);\r\n setMajorType(elem);\r\n props.onVerAxisTickMajor(elem.value);\r\n props.f7router.back();\r\n }}>\r\n \r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageVertMinorType = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const [currentMinorType, setMinorType] = useState(props.currentMinorType);\r\n const tickOptions = props.tickOptions;\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {tickOptions.map((elem, index) => {\r\n return (\r\n {\r\n props.setMinorType(elem);\r\n setMinorType(elem);\r\n props.onVerAxisTickMinor(elem.value);\r\n props.f7router.back();\r\n }}>\r\n \r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageVertLabelPosition = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const [currentLabelsPosition, setLabelsPosition] = useState(props.currentLabelsPosition);\r\n const verticalAxisLabelsPosition = props.verticalAxisLabelsPosition;\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {verticalAxisLabelsPosition.map((elem, index) => {\r\n return (\r\n {\r\n props.setLabelsPosition(elem);\r\n setLabelsPosition(elem);\r\n props.onVerAxisLabelPos(elem.value);\r\n props.f7router.back();\r\n }}>\r\n \r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageHorizontalAxis = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const api = Common.EditorApi.get();\r\n const isIos = Device.ios;\r\n const chartProperty = api.asc_getChartObject(true);\r\n const horAxisProps = chartProperty.getHorAxisProps();\r\n const axisProps = (horAxisProps.getAxisType() == Asc.c_oAscAxisType.val) ? chartProperty.getVertAxisProps() : horAxisProps;\r\n const crossValue = axisProps.getCrossesRule();\r\n\r\n const axisCrosses = [\r\n {display: `${_t.textAuto}`, value: Asc.c_oAscCrossesRule.auto},\r\n {display: `${_t.textValue}`, value: Asc.c_oAscCrossesRule.value},\r\n {display: `${_t.textMinimumValue}`, value: Asc.c_oAscCrossesRule.minValue},\r\n {display: `${_t.textMaximumValue}`, value: Asc.c_oAscCrossesRule.maxValue}\r\n ];\r\n\r\n const tickOptions = [\r\n {display: `${_t.textNone}`, value: Asc.c_oAscTickMark.TICK_MARK_NONE},\r\n {display: `${_t.textCross}`, value: Asc.c_oAscTickMark.TICK_MARK_CROSS},\r\n {display: `${_t.textIn}`, value: Asc.c_oAscTickMark.TICK_MARK_IN},\r\n {display: `${_t.textOut}`, value: Asc.c_oAscTickMark.TICK_MARK_OUT}\r\n ];\r\n\r\n const horAxisLabelsPosition = [\r\n {display: `${_t.textNone}`, value: Asc.c_oAscTickLabelsPos.TICK_LABEL_POSITION_NONE},\r\n {display: `${_t.textLow}`, value: Asc.c_oAscTickLabelsPos.TICK_LABEL_POSITION_LOW},\r\n {display: `${_t.textHigh}`, value: Asc.c_oAscTickLabelsPos.TICK_LABEL_POSITION_HIGH},\r\n {display: `${_t.textNextToAxis}`, value: Asc.c_oAscTickLabelsPos.TICK_LABEL_POSITION_NEXT_TO}\r\n ];\r\n\r\n const horAxisPosition = [\r\n {display: `${_t.textOnTickMarks}`, value: Asc.c_oAscLabelsPosition.byDivisions},\r\n {display: `${_t.textBetweenTickMarks}`, value: Asc.c_oAscLabelsPosition.betweenDivisions}\r\n ];\r\n\r\n const defineCurrentAxisCrosses = () => axisCrosses.find(elem => elem.value === crossValue);\r\n const [currentAxisCrosses, setAxisCrosses] = useState(defineCurrentAxisCrosses());\r\n\r\n const defineAxisPosition = () => horAxisPosition.find(elem => elem.value === axisProps.getLabelsPosition());\r\n const [axisPosition, setAxisPosition] = useState(defineAxisPosition());\r\n\r\n const [valuesReverseOrder, toggleValuesReverseOrder] = useState(axisProps.getInvertCatOrder());\r\n\r\n const valueMajorType = axisProps.getMajorTickMark();\r\n const valueMinorType = axisProps.getMinorTickMark();\r\n\r\n const defineCurrentTickOption = (elemType) => tickOptions.find(elem => elem.value === elemType);\r\n\r\n const [currentMajorType, setMajorType] = useState(defineCurrentTickOption(valueMajorType));\r\n const [currentMinorType, setMinorType] = useState(defineCurrentTickOption(valueMinorType));\r\n\r\n const defineLabelsPosition = () => horAxisLabelsPosition.find(elem => elem.value === axisProps.getTickLabelsPos());\r\n const [currentLabelsPosition, setLabelsPosition] = useState(defineLabelsPosition());\r\n\r\n const currentCrossesValue = axisProps.getCrosses();\r\n const [crossesValue, setCrossesValue] = useState(!currentCrossesValue ? '' : currentCrossesValue);\r\n const isRadar = axisProps.isRadarAxis();\r\n\r\n if ((!props.storeFocusObjects.chartObject || props.storeFocusObjects.focusOn === 'cell') && Device.phone) {\r\n $$('.sheet-modal.modal-in').length > 0 && f7.sheet.close();\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n {currentAxisCrosses.value == Asc.c_oAscCrossesRule.value ? (\r\n props.onHorAxisCrossValue(e.target.value)} \r\n onInput={e => setCrossesValue(e.target.value)}\r\n className={isIos ? 'list-input-right' : ''}\r\n />\r\n ) : null}\r\n
\r\n \r\n {!props.disableAxisPos ? \r\n \r\n : null}\r\n \r\n \r\n {\r\n toggleValuesReverseOrder(!valuesReverseOrder);\r\n props.onHorAxisReverse(!valuesReverseOrder);\r\n }} />\r\n
\r\n \r\n
\r\n {_t.textTickOptions}\r\n \r\n \r\n \r\n
\r\n {_t.textLabelOptions}\r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageHorAxisCrosses = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const [currentAxisCrosses, setAxisCrosses] = useState(props.currentAxisCrosses);\r\n const axisCrosses = props.axisCrosses;\r\n\r\n return ( \r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {axisCrosses.map((elem, index) => {\r\n return (\r\n { \r\n props.setAxisCrosses(elem);\r\n setAxisCrosses(elem);\r\n props.onHorAxisCrossType(elem.value);\r\n props.f7router.back();\r\n }}>\r\n \r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageHorAxisPosition = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const [axisPosition, setAxisPosition] = useState(props.axisPosition);\r\n const horAxisPosition = props.horAxisPosition;\r\n\r\n return ( \r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {horAxisPosition.map((elem, index) => {\r\n return (\r\n { \r\n props.setAxisPosition(elem);\r\n setAxisPosition(elem);\r\n props.onHorAxisPos(elem.value);\r\n props.f7router.back();\r\n }}>\r\n \r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageHorMajorType = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const [currentMajorType, setMajorType] = useState(props.currentMajorType);\r\n const tickOptions = props.tickOptions;\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {tickOptions.map((elem, index) => {\r\n return (\r\n {\r\n props.setMajorType(elem);\r\n setMajorType(elem);\r\n props.onHorAxisTickMajor(elem.value);\r\n props.f7router.back();\r\n }}>\r\n \r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageHorMinorType = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const [currentMinorType, setMinorType] = useState(props.currentMinorType);\r\n const tickOptions = props.tickOptions;\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {tickOptions.map((elem, index) => {\r\n return (\r\n {\r\n props.setMinorType(elem);\r\n setMinorType(elem);\r\n props.onHorAxisTickMinor(elem.value);\r\n props.f7router.back();\r\n }}>\r\n \r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst PageHorLabelPosition = props => {\r\n const { t } = useTranslation();\r\n const _t = t('View.Edit', {returnObjects: true});\r\n const [currentLabelsPosition, setLabelsPosition] = useState(props.currentLabelsPosition);\r\n const horAxisLabelsPosition = props.horAxisLabelsPosition;\r\n\r\n return (\r\n \r\n \r\n {Device.phone &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {horAxisLabelsPosition.map((elem, index) => {\r\n return (\r\n {\r\n props.setLabelsPosition(elem);\r\n setLabelsPosition(elem);\r\n props.onHorAxisLabelPos(elem.value);\r\n props.f7router.back();\r\n }}>\r\n \r\n )\r\n })}\r\n
\r\n \r\n )\r\n}\r\n\r\nconst EditChart = props => {\r\n const { t } = useTranslation();\r\n const storeFocusObjects = props.storeFocusObjects;\r\n const chartProperties = storeFocusObjects.chartObject && storeFocusObjects.chartObject.get_ChartProperties();\r\n const chartType = chartProperties && chartProperties.getType();\r\n\r\n const disableEditAxis = (\r\n chartType == Asc.c_oAscChartTypeSettings.pie ||\r\n chartType == Asc.c_oAscChartTypeSettings.doughnut ||\r\n chartType == Asc.c_oAscChartTypeSettings.pie3d\r\n );\r\n\r\n const disableAxisPos = (\r\n chartType == Asc.c_oAscChartTypeSettings.barNormal3d ||\r\n chartType == Asc.c_oAscChartTypeSettings.barStacked3d ||\r\n chartType == Asc.c_oAscChartTypeSettings.barStackedPer3d ||\r\n chartType == Asc.c_oAscChartTypeSettings.hBarNormal3d ||\r\n chartType == Asc.c_oAscChartTypeSettings.hBarStacked3d ||\r\n chartType == Asc.c_oAscChartTypeSettings.hBarStackedPer3d ||\r\n chartType == Asc.c_oAscChartTypeSettings.barNormal3dPerspective\r\n );\r\n\r\n const needReverse = (\r\n chartType == Asc.c_oAscChartTypeSettings.hBarNormal ||\r\n chartType == Asc.c_oAscChartTypeSettings.hBarStacked ||\r\n chartType == Asc.c_oAscChartTypeSettings.hBarStackedPer ||\r\n chartType == Asc.c_oAscChartTypeSettings.hBarNormal3d ||\r\n chartType == Asc.c_oAscChartTypeSettings.hBarStacked3d ||\r\n chartType == Asc.c_oAscChartTypeSettings.hBarStackedPer3d\r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n {props.onRemoveChart()}} className='button-red button-fill button-raised'/>\r\n
\r\n \r\n )\r\n};\r\n\r\nconst PageEditChart = inject(\"storeFocusObjects\")(observer(EditChart));\r\nconst PageChartDesign = inject(\"storeChartSettings\", \"storeFocusObjects\")(observer(PageDesign));\r\nconst PageChartDesignType = inject(\"storeChartSettings\", \"storeFocusObjects\")(observer(PageChartType));\r\nconst PageChartDesignStyle = inject(\"storeChartSettings\")(observer(PageChartStyle));\r\nconst PageChartDesignBorder = inject(\"storeChartSettings\", \"storeFocusObjects\")(observer(PageChartBorder));\r\nconst PageChartCustomFillColor = inject(\"storeChartSettings\", \"storePalette\")(observer(PageCustomFillColor));\r\nconst PageChartBorderColor = inject(\"storeChartSettings\", \"storePalette\")(observer(PageBorderColor));\r\nconst PageChartCustomBorderColor = inject(\"storeChartSettings\", \"storePalette\")(observer(PageCustomBorderColor));\r\nconst PageChartLayout = inject(\"storeFocusObjects\")(observer(PageLayout));\r\nconst PageChartVerticalAxis = inject(\"storeFocusObjects\")(observer(PageVerticalAxis));\r\nconst PageChartHorizontalAxis = inject(\"storeFocusObjects\")(observer(PageHorizontalAxis));\r\nconst PageChartReorder = inject(\"storeFocusObjects\")(observer(PageReorder));\r\n\r\nexport {\r\n PageEditChart as EditChart,\r\n PageChartDesign,\r\n PageChartDesignType,\r\n PageChartDesignStyle,\r\n PageChartDesignFill,\r\n PageChartDesignBorder,\r\n PageChartCustomFillColor,\r\n PageChartBorderColor,\r\n PageChartCustomBorderColor,\r\n PageChartReorder,\r\n PageChartLayout,\r\n PageLegend,\r\n PageChartTitle,\r\n PageHorizontalAxisTitle,\r\n PageVerticalAxisTitle,\r\n PageHorizontalGridlines,\r\n PageVerticalGridlines,\r\n PageDataLabels,\r\n PageChartVerticalAxis,\r\n PageVertAxisCrosses,\r\n PageDisplayUnits,\r\n PageVertMajorType,\r\n PageVertMinorType,\r\n PageVertLabelPosition, \r\n PageChartHorizontalAxis,\r\n PageHorAxisCrosses,\r\n PageHorAxisPosition, \r\n PageHorMajorType,\r\n PageHorMinorType,\r\n PageHorLabelPosition\r\n}","import React, {Component} from 'react';\nimport { EditCell } from '../../view/edit/EditCell';\nimport { f7 } from 'framework7-react';\nimport {observer, inject} from \"mobx-react\";\nimport { Device } from '../../../../../common/mobile/utils/device';\n\nclass EditCellController extends Component {\n constructor (props) {\n super(props);\n this.dateFormats = this.initFormats(Asc.c_oAscNumFormatType.Date, 38822);\n this.timeFormats = this.initFormats(Asc.c_oAscNumFormatType.Time, 1.534);\n this.initCustomFormats = this.initCustomFormats.bind(this);\n this.setCustomFormat = this.setCustomFormat.bind(this);\n this.onBorderStyle = this.onBorderStyle.bind(this);\n this.initCustomFormats();\n }\n\n initFormats(type, exampleVal) {\n const api = Common.EditorApi.get();\n let info = new Asc.asc_CFormatCellsInfo();\n\n info.asc_setType(type);\n info.asc_setDecimalPlaces(0);\n info.asc_setSeparator(false);\n\n const formatsArr = api.asc_getFormatCells(info);\n const data = formatsArr.map(item => ({\n value: item, \n displayValue: api.asc_getLocaleExample(item, exampleVal)\n }));\n\n return data;\n }\n\n initCustomFormats() {\n if(this.props.storeCellSettings.customFormats?.length) return;\n\n const api = Common.EditorApi.get();\n const storeCellSettings = this.props.storeCellSettings;\n const info = new Asc.asc_CFormatCellsInfo();\n const valSymbol = api.asc_getLocale();\n\n info.asc_setType(Asc.c_oAscNumFormatType.Custom);\n info.asc_setSymbol(valSymbol);\n\n const formatsArr = api.asc_getFormatCells(info);\n const data = formatsArr.map(item => ({\n value: api.asc_convertNumFormat2NumFormatLocal(item),\n format: item\n }));\n\n storeCellSettings.initCustomFormats(data);\n }\n\n setCustomFormat(value) {\n const api = Common.EditorApi.get();\n const format = api.asc_convertNumFormatLocal2NumFormat(value);\n const storeCellSettings = this.props.storeCellSettings;\n \n storeCellSettings.addCustomFormat({\n value: api.asc_convertNumFormat2NumFormatLocal(format),\n format\n });\n api.asc_setCellFormat(format);\n }\n\n toggleBold(value) {\n const api = Common.EditorApi.get();\n api.asc_setCellBold(value);\n }\n\n toggleItalic(value) {\n const api = Common.EditorApi.get();\n api.asc_setCellItalic(value);\n \n }\n\n toggleUnderline(value) {\n const api = Common.EditorApi.get();\n api.asc_setCellUnderline(value);\n }\n\n onStyleClick(type) {\n const api = Common.EditorApi.get();\n api.asc_setCellStyle(type);\n }\n\n onTextColor(color) {\n const api = Common.EditorApi.get();\n api.asc_setCellTextColor(Common.Utils.ThemeColor.getRgbColor(color));\n }\n\n onFillColor(color) {\n const api = Common.EditorApi.get();\n api.asc_setCellBackgroundColor(color == 'transparent' ? null : Common.Utils.ThemeColor.getRgbColor(color));\n }\n\n onFontSize(curSize, isDecrement) {\n const api = Common.EditorApi.get();\n let size = curSize;\n\n if (isDecrement) {\n typeof size === 'undefined' ? api.asc_decreaseFontSize() : size = Math.max(1, --size);\n } else {\n typeof size === 'undefined' ? api.asc_increaseFontSize() : size = Math.min(409, ++size);\n }\n\n if (typeof size !== 'undefined') {\n api.asc_setCellFontSize(size);\n }\n }\n\n onFontClick(name) {\n const api = Common.EditorApi.get();\n\n if (name) {\n api.asc_setCellFontName(name);\n }\n }\n\n onHAlignChange(value) {\n const api = Common.EditorApi.get();\n let type;\n\n if (value == 'center') {\n type = AscCommon.align_Center;\n } else if (value == 'right') {\n type = AscCommon.align_Right;\n } else if (value == 'justify') {\n type = AscCommon.align_Justify;\n } else if (value == 'left') {\n type = AscCommon.align_Left;\n }\n\n api.asc_setCellAlign(type);\n }\n\n onVAlignChange(value) {\n const api = Common.EditorApi.get();\n let type;\n\n if (value == 'top') {\n type = Asc.c_oAscVAlign.Top;\n } else if (value == 'center') {\n type = Asc.c_oAscVAlign.Center;\n } else if (value == 'bottom') {\n type = Asc.c_oAscVAlign.Bottom;\n }\n\n api.asc_setCellVertAlign(type);\n }\n\n onWrapTextChange(checked) {\n const api = Common.EditorApi.get();\n api.asc_setCellTextWrap(checked);\n }\n\n onTextOrientationChange(value) {\n const api = Common.EditorApi.get();\n let angle = 0;\n\n switch (value) {\n case 'anglecount': angle = 45; break;\n case 'angleclock': angle = -45; break;\n case 'vertical': angle = 255; break;\n case 'rotateup': angle = 90; break;\n case 'rotatedown': angle = -90; break;\n }\n\n api.asc_setCellAngle(angle);\n }\n\n onCellFormat(format) {\n const api = Common.EditorApi.get();\n api.asc_setCellFormat(format);\n }\n\n onAccountingCellFormat(value) {\n const api = Common.EditorApi.get();\n let info = new Asc.asc_CFormatCellsInfo();\n\n info.asc_setType(Asc.c_oAscNumFormatType.Accounting);\n info.asc_setSeparator(false);\n info.asc_setSymbol(value);\n\n let format = api.asc_getFormatCells(info);\n\n if (format && format.length > 0)\n api.asc_setCellFormat(format[0]);\n }\n\n onBorderStyle(type, borderInfo) {\n const api = Common.EditorApi.get();\n let newBorders = [],\n bordersWidth = borderInfo.width,\n bordersColor;\n \n if (this.props.storeCellSettings.colorAuto === 'auto') {\n bordersColor = new Asc.asc_CColor();\n bordersColor.put_auto(true);\n } else {\n bordersColor = Common.Utils.ThemeColor.getRgbColor(borderInfo.color);\n }\n\n if (type == 'inner') {\n newBorders[Asc.c_oAscBorderOptions.InnerV] = new Asc.asc_CBorder(bordersWidth, bordersColor);\n newBorders[Asc.c_oAscBorderOptions.InnerH] = new Asc.asc_CBorder(bordersWidth, bordersColor);\n } else if (type == 'all') {\n newBorders[Asc.c_oAscBorderOptions.InnerV] = new Asc.asc_CBorder(bordersWidth, bordersColor);\n newBorders[Asc.c_oAscBorderOptions.InnerH] = new Asc.asc_CBorder(bordersWidth, bordersColor);\n newBorders[Asc.c_oAscBorderOptions.Left] = new Asc.asc_CBorder(bordersWidth, bordersColor);\n newBorders[Asc.c_oAscBorderOptions.Top] = new Asc.asc_CBorder(bordersWidth, bordersColor);\n newBorders[Asc.c_oAscBorderOptions.Right] = new Asc.asc_CBorder(bordersWidth, bordersColor);\n newBorders[Asc.c_oAscBorderOptions.Bottom] = new Asc.asc_CBorder(bordersWidth, bordersColor);\n } else if (type == 'outer') {\n newBorders[Asc.c_oAscBorderOptions.Left] = new Asc.asc_CBorder(bordersWidth, bordersColor);\n newBorders[Asc.c_oAscBorderOptions.Top] = new Asc.asc_CBorder(bordersWidth, bordersColor);\n newBorders[Asc.c_oAscBorderOptions.Right] = new Asc.asc_CBorder(bordersWidth, bordersColor);\n newBorders[Asc.c_oAscBorderOptions.Bottom] = new Asc.asc_CBorder(bordersWidth, bordersColor);\n } else if (type != 'none') {\n var borderId = parseInt(type);\n newBorders[borderId] = new Asc.asc_CBorder(bordersWidth, bordersColor);\n }\n\n api.asc_setCellBorders(newBorders);\n }\n\n onTextColorAuto() {\n const api = Common.EditorApi.get();\n const color = new Asc.asc_CColor();\n color.put_auto(true);\n api.asc_setCellTextColor(color);\n }\n\n render () {\n return (\n \n )\n }\n}\n\nexport default inject(\"storeCellSettings\")(observer(EditCellController));","import React, {Component} from 'react';\r\nimport { f7 } from 'framework7-react';\r\nimport {Device} from '../../../../../common/mobile/utils/device';\r\nimport {observer, inject} from \"mobx-react\";\r\n\r\nimport { EditShape } from '../../view/edit/EditShape';\r\n\r\nclass EditShapeController extends Component {\r\n constructor (props) {\r\n super(props);\r\n this.onRemoveShape = this.onRemoveShape.bind(this);\r\n this.onBorderSize = this.onBorderSize.bind(this);\r\n this.onBorderColor = this.onBorderColor.bind(this);\r\n\r\n this.props.storeShapeSettings.setFillColor(undefined);\r\n this.props.storeShapeSettings.setBorderColor(undefined);\r\n }\r\n\r\n onReplace(type) {\r\n const api = Common.EditorApi.get();\r\n api.asc_changeShapeType(type);\r\n }\r\n\r\n onReorder(type) {\r\n const api = Common.EditorApi.get();\r\n let ascType;\r\n\r\n switch(type) {\r\n case 'all-up':\r\n ascType = Asc.c_oAscDrawingLayerType.BringToFront;\r\n break;\r\n case 'all-down':\r\n ascType = Asc.c_oAscDrawingLayerType.SendToBack;\r\n break;\r\n case 'move-up':\r\n ascType = Asc.c_oAscDrawingLayerType.BringForward;\r\n break;\r\n case 'move-down':\r\n ascType = Asc.c_oAscDrawingLayerType.SendBackward;\r\n break;\r\n }\r\n\r\n api.asc_setSelectedDrawingObjectLayer(ascType);\r\n }\r\n\r\n closeModal() {\r\n if (Device.phone) {\r\n f7.sheet.close('#edit-sheet', true);\r\n } else {\r\n f7.popover.close('#edit-popover');\r\n }\r\n };\r\n\r\n onRemoveShape() {\r\n const api = Common.EditorApi.get();\r\n api.asc_Remove();\r\n this.closeModal();\r\n }\r\n\r\n onFillColor(color) {\r\n const api = Common.EditorApi.get();\r\n\r\n let shape = new Asc.asc_CShapeProperty(),\r\n image = new Asc.asc_CImgProperty(),\r\n fill = new Asc.asc_CShapeFill();\r\n\r\n if (color == 'transparent') {\r\n fill.put_type(Asc.c_oAscFill.FILL_TYPE_NOFILL);\r\n fill.put_fill(null);\r\n } else {\r\n fill.put_type(Asc.c_oAscFill.FILL_TYPE_SOLID);\r\n fill.put_fill(new Asc.asc_CFillSolid());\r\n fill.get_fill().put_color(Common.Utils.ThemeColor.getRgbColor(color));\r\n }\r\n\r\n shape.asc_putFill(fill);\r\n image.asc_putShapeProperties(shape);\r\n\r\n api.asc_setGraphicObjectProps(image);\r\n }\r\n\r\n onBorderColor(color) {\r\n const api = Common.EditorApi.get();\r\n const _shapeObject = this.props.storeFocusObjects.shapeObject.get_ShapeProperties();\r\n\r\n if (_shapeObject && _shapeObject.get_stroke().get_type() == Asc.c_oAscStrokeType.STROKE_COLOR) {\r\n let shape = new Asc.asc_CShapeProperty(),\r\n image = new Asc.asc_CImgProperty(),\r\n stroke = new Asc.asc_CStroke();\r\n\r\n if (_shapeObject.get_stroke().get_width() < 0.01) {\r\n stroke.put_type(Asc.c_oAscStrokeType.STROKE_NONE);\r\n } else {\r\n stroke.put_type(Asc.c_oAscStrokeType.STROKE_COLOR);\r\n stroke.put_color(Common.Utils.ThemeColor.getRgbColor(color));\r\n stroke.put_width(_shapeObject.get_stroke().get_width());\r\n stroke.asc_putPrstDash(_shapeObject.get_stroke().asc_getPrstDash());\r\n }\r\n\r\n shape.put_stroke(stroke);\r\n image.asc_putShapeProperties(shape);\r\n\r\n api.asc_setGraphicObjectProps(image);\r\n }\r\n }\r\n\r\n onBorderSize(value) {\r\n const api = Common.EditorApi.get();\r\n const shape = new Asc.asc_CShapeProperty();\r\n const stroke = new Asc.asc_CStroke();\r\n const image = new Asc.asc_CImgProperty();\r\n\r\n const _borderColor = this.props.storeShapeSettings.borderColorView;\r\n\r\n if (value < 0.01) {\r\n stroke.put_type(Asc.c_oAscStrokeType.STROKE_NONE);\r\n } else {\r\n stroke.put_type(Asc.c_oAscStrokeType.STROKE_COLOR);\r\n if (_borderColor == 'transparent')\r\n stroke.put_color(Common.Utils.ThemeColor.getRgbColor({color: '000000', effectId: 29}));\r\n else\r\n stroke.put_color(Common.Utils.ThemeColor.getRgbColor(Common.Utils.ThemeColor.colorValue2EffectId(_borderColor)));\r\n stroke.put_width(value * 25.4 / 72.0);\r\n }\r\n\r\n shape.put_stroke(stroke);\r\n image.asc_putShapeProperties(shape);\r\n\r\n api.asc_setGraphicObjectProps(image);\r\n\r\n this.props.storeShapeSettings.initBorderColorView(this.props.storeFocusObjects.shapeObject.get_ShapeProperties());\r\n }\r\n\r\n onOpacity(value) {\r\n const api = Common.EditorApi.get();\r\n \r\n let fill = new Asc.asc_CShapeFill(),\r\n properties = new Asc.asc_CImgProperty(),\r\n shape = new Asc.asc_CShapeProperty();\r\n\r\n fill.asc_putTransparent(parseInt(value * 2.55));\r\n shape.asc_putFill(fill);\r\n properties.put_ShapeProperties(shape);\r\n\r\n api.asc_setGraphicObjectProps(properties);\r\n }\r\n\r\n\r\n render () {\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\nexport default inject(\"storeShapeSettings\", \"storeFocusObjects\")(observer(EditShapeController));","import React, {Component} from 'react';\r\nimport { f7 } from 'framework7-react';\r\nimport {Device} from '../../../../../common/mobile/utils/device';\r\nimport {observer, inject} from \"mobx-react\";\r\n\r\nimport { EditImage } from '../../view/edit/EditImage';\r\n\r\nclass EditImageController extends Component {\r\n constructor (props) {\r\n super(props);\r\n this.onRemoveImage = this.onRemoveImage.bind(this);\r\n this.onReplaceByFile = this.onReplaceByFile.bind(this);\r\n this.onReplaceByUrl = this.onReplaceByUrl.bind(this);\r\n }\r\n\r\n onReorder(type) {\r\n const api = Common.EditorApi.get();\r\n let ascType;\r\n\r\n switch(type) {\r\n case 'all-up':\r\n ascType = Asc.c_oAscDrawingLayerType.BringToFront;\r\n break;\r\n case 'all-down':\r\n ascType = Asc.c_oAscDrawingLayerType.SendToBack;\r\n break;\r\n case 'move-up':\r\n ascType = Asc.c_oAscDrawingLayerType.BringForward;\r\n break;\r\n case 'move-down':\r\n ascType = Asc.c_oAscDrawingLayerType.SendBackward;\r\n break;\r\n }\r\n\r\n api.asc_setSelectedDrawingObjectLayer(ascType);\r\n }\r\n\r\n closeModal() {\r\n if (Device.phone) {\r\n f7.sheet.close('#edit-sheet', true);\r\n } else {\r\n f7.popover.close('#edit-popover');\r\n }\r\n };\r\n\r\n onDefaultSize() {\r\n const api = Common.EditorApi.get();\r\n let imgsize = api.asc_getOriginalImageSize(),\r\n properties = new Asc.asc_CImgProperty();\r\n\r\n properties.put_Width(imgsize.get_ImageWidth());\r\n properties.put_Height(imgsize.get_ImageHeight());\r\n properties.put_ResetCrop(true);\r\n properties.put_Rot(0);\r\n api.asc_setGraphicObjectProps(properties);\r\n }\r\n\r\n onRemoveImage() {\r\n const api = Common.EditorApi.get();\r\n api.asc_Remove();\r\n this.closeModal();\r\n }\r\n\r\n onReplaceByFile() {\r\n const api = Common.EditorApi.get();\r\n api.asc_changeImageFromFile();\r\n this.closeModal();\r\n }\r\n\r\n onReplaceByUrl(value) {\r\n const api = Common.EditorApi.get();\r\n const image = new Asc.asc_CImgProperty();\r\n image.asc_putImageUrl(value);\r\n api.asc_setGraphicObjectProps(image);\r\n this.closeModal();\r\n }\r\n\r\n\r\n render () {\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\nexport default EditImageController;","import React, {Component} from 'react';\r\nimport { f7 } from 'framework7-react';\r\nimport {Device} from '../../../../../common/mobile/utils/device';\r\n\r\nimport { EditText } from '../../view/edit/EditText';\r\n\r\nclass EditTextController extends Component {\r\n constructor (props) {\r\n super(props);\r\n }\r\n\r\n toggleBold(value) {\r\n const api = Common.EditorApi.get();\r\n api.asc_setCellBold(value);\r\n };\r\n\r\n toggleItalic(value) {\r\n const api = Common.EditorApi.get();\r\n api.asc_setCellItalic(value);\r\n };\r\n\r\n toggleUnderline(value) {\r\n const api = Common.EditorApi.get();\r\n api.asc_setCellUnderline(value);\r\n };\r\n\r\n onParagraphAlign(type) {\r\n const api = Common.EditorApi.get();\r\n let value = AscCommon.align_Left;\r\n \r\n switch (type) {\r\n case 'justify':\r\n value = AscCommon.align_Justify;\r\n break;\r\n case 'right':\r\n value = AscCommon.align_Right;\r\n break;\r\n case 'center':\r\n value = AscCommon.align_Center;\r\n break;\r\n }\r\n\r\n api.asc_setCellAlign(value);\r\n };\r\n\r\n onParagraphValign(type) {\r\n const api = Common.EditorApi.get();\r\n let value;\r\n\r\n switch(type) {\r\n case 'top':\r\n value = Asc.c_oAscVAlign.Top;\r\n break;\r\n case 'center':\r\n value = Asc.c_oAscVAlign.Center;\r\n break;\r\n case 'bottom':\r\n value = Asc.c_oAscVAlign.Bottom;\r\n break;\r\n }\r\n\r\n api.asc_setCellVertAlign(value);\r\n };\r\n\r\n changeFontSize(curSize, isDecrement) {\r\n const api = Common.EditorApi.get();\r\n let size = curSize;\r\n\r\n if (isDecrement) {\r\n typeof size === 'undefined' ? api.asc_decreaseFontSize() : size = Math.max(1, --size);\r\n } else {\r\n typeof size === 'undefined' ? api.asc_increaseFontSize() : size = Math.min(409, ++size);\r\n }\r\n\r\n if (typeof size !== 'undefined') {\r\n api.asc_setCellFontSize(size);\r\n }\r\n };\r\n\r\n changeFontFamily(name) {\r\n const api = Common.EditorApi.get();\r\n if (name) {\r\n api.asc_setCellFontName(name);\r\n }\r\n }\r\n\r\n onTextColor(color) {\r\n const api = Common.EditorApi.get();\r\n api.asc_setCellTextColor(Common.Utils.ThemeColor.getRgbColor(color));\r\n }\r\n\r\n setOrientationTextShape(direction) {\r\n const api = Common.EditorApi.get();\r\n const properties = new Asc.asc_CImgProperty();\r\n\r\n properties.asc_putVert(direction);\r\n api.asc_setGraphicObjectProps(properties);\r\n }\r\n\r\n render () {\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\nexport default EditTextController;","import React, {Component} from 'react';\r\nimport { f7 } from 'framework7-react';\r\nimport {Device} from '../../../../../common/mobile/utils/device';\r\nimport {observer, inject} from \"mobx-react\";\r\n\r\nimport { EditChart } from '../../view/edit/EditChart';\r\n\r\nclass EditChartController extends Component {\r\n constructor (props) {\r\n super(props);\r\n this.onRemoveChart = this.onRemoveChart.bind(this);\r\n this.onType = this.onType.bind(this);\r\n this.onStyle = this.onStyle.bind(this);\r\n this.onBorderColor = this.onBorderColor.bind(this);\r\n this.onBorderSize = this.onBorderSize.bind(this);\r\n this.onVerAxisMinValue = this.onVerAxisMinValue.bind(this);\r\n this.onVerAxisMaxValue = this.onVerAxisMaxValue.bind(this);\r\n this.onVerAxisCrossType = this.onVerAxisCrossType.bind(this);\r\n this.onVerAxisCrossValue = this.onVerAxisCrossValue.bind(this);\r\n this.onVerAxisDisplayUnits = this.onVerAxisDisplayUnits.bind(this);\r\n this.onVerAxisReverse = this.onVerAxisReverse.bind(this);\r\n this.onVerAxisTickMajor = this.onVerAxisTickMajor.bind(this);\r\n this.onVerAxisTickMinor = this.onVerAxisTickMinor.bind(this);\r\n this.onVerAxisLabelPos = this.onVerAxisLabelPos.bind(this);\r\n this.onHorAxisCrossType = this.onHorAxisCrossType.bind(this);\r\n this.onHorAxisCrossValue = this.onHorAxisCrossValue.bind(this);\r\n this.onHorAxisPos = this.onHorAxisPos.bind(this);\r\n this.onHorAxisReverse = this.onHorAxisReverse.bind(this);\r\n this.onHorAxisTickMajor = this.onHorAxisTickMajor.bind(this);\r\n this.onHorAxisTickMinor = this.onHorAxisTickMinor.bind(this);\r\n this.onHorAxisLabelPos = this.onHorAxisLabelPos.bind(this);\r\n\r\n const type = props.storeFocusObjects.chartObject.get_ChartProperties().getType();\r\n if (type==Asc.c_oAscChartTypeSettings.comboBarLine ||\r\n type==Asc.c_oAscChartTypeSettings.comboBarLineSecondary ||\r\n type==Asc.c_oAscChartTypeSettings.comboAreaBar ||\r\n type==Asc.c_oAscChartTypeSettings.comboCustom) {\r\n props.storeChartSettings.clearChartStyles();\r\n } else {\r\n const api = Common.EditorApi.get();\r\n props.storeChartSettings.updateChartStyles(api.asc_getChartPreviews(type));\r\n }\r\n }\r\n\r\n closeModal() {\r\n if (Device.phone) {\r\n f7.sheet.close('#edit-sheet', true);\r\n } else {\r\n f7.popover.close('#edit-popover');\r\n }\r\n };\r\n\r\n onRemoveChart() {\r\n const api = Common.EditorApi.get();\r\n api.asc_Remove();\r\n this.closeModal();\r\n }\r\n\r\n onStyle(type) {\r\n const api = Common.EditorApi.get();\r\n let image = new Asc.asc_CImgProperty(),\r\n chart = this.props.storeFocusObjects.chartObject.get_ChartProperties();\r\n\r\n chart.putStyle(type);\r\n image.put_ChartProperties(chart);\r\n\r\n api.asc_setGraphicObjectProps(image);\r\n\r\n }\r\n\r\n onType(type) {\r\n const api = Common.EditorApi.get();\r\n let image = new Asc.asc_CImgProperty(),\r\n chart = this.props.storeFocusObjects.chartObject.get_ChartProperties();\r\n\r\n chart.changeType(type);\r\n image.put_ChartProperties(chart);\r\n\r\n api.asc_setGraphicObjectProps(image);\r\n\r\n // Force update styles\r\n this.props.storeChartSettings.updateChartStyles(api.asc_getChartPreviews(chart.getType()));\r\n\r\n // me.updateAxisProps(type);\r\n }\r\n\r\n onFillColor(color) {\r\n const api = Common.EditorApi.get();\r\n let image = new Asc.asc_CImgProperty(),\r\n shape = new Asc.asc_CShapeProperty(),\r\n fill = new Asc.asc_CShapeFill();\r\n\r\n if (color == 'transparent') {\r\n fill.put_type(Asc.c_oAscFill.FILL_TYPE_NOFILL);\r\n fill.put_fill(null);\r\n } else {\r\n fill.put_type(Asc.c_oAscFill.FILL_TYPE_SOLID);\r\n fill.put_fill(new Asc.asc_CFillSolid());\r\n fill.get_fill().put_color(Common.Utils.ThemeColor.getRgbColor(color));\r\n }\r\n\r\n shape.put_fill(fill);\r\n image.put_ShapeProperties(shape);\r\n\r\n api.asc_setGraphicObjectProps(image);\r\n }\r\n\r\n onBorderColor(color) {\r\n const api = Common.EditorApi.get();\r\n const currentShape = this.props.storeFocusObjects.shapeObject.get_ShapeProperties();\r\n let image = new Asc.asc_CImgProperty(),\r\n shape = new Asc.asc_CShapeProperty(),\r\n stroke = new Asc.asc_CStroke();\r\n\r\n if(currentShape && currentShape.get_stroke().get_type() == Asc.c_oAscStrokeType.STROKE_COLOR) {\r\n\r\n if (currentShape.get_stroke().get_width() < 0.01) {\r\n stroke.put_type(Asc.c_oAscStrokeType.STROKE_NONE);\r\n } else {\r\n stroke.put_type(Asc.c_oAscStrokeType.STROKE_COLOR);\r\n stroke.put_color(Common.Utils.ThemeColor.getRgbColor(color));\r\n stroke.put_width(currentShape.get_stroke().get_width());\r\n stroke.asc_putPrstDash(currentShape.get_stroke().asc_getPrstDash());\r\n }\r\n\r\n shape.put_stroke(stroke);\r\n image.put_ShapeProperties(shape);\r\n\r\n api.asc_setGraphicObjectProps(image);\r\n }\r\n }\r\n\r\n onBorderSize(value) {\r\n const api = Common.EditorApi.get();\r\n const image = new Asc.asc_CImgProperty();\r\n const shape = new Asc.asc_CShapeProperty();\r\n const stroke = new Asc.asc_CStroke();\r\n\r\n const _borderColor = this.props.storeChartSettings.borderColor;\r\n\r\n if (value < 0.01) {\r\n stroke.put_type(Asc.c_oAscStrokeType.STROKE_NONE);\r\n } else {\r\n stroke.put_type(Asc.c_oAscStrokeType.STROKE_COLOR);\r\n if (_borderColor == 'transparent')\r\n stroke.put_color(Common.Utils.ThemeColor.getRgbColor({color: '000000', effectId: 29}));\r\n else\r\n stroke.put_color(Common.Utils.ThemeColor.getRgbColor(Common.Utils.ThemeColor.colorValue2EffectId(_borderColor)));\r\n stroke.put_width(value * 25.4 / 72.0);\r\n }\r\n\r\n shape.put_stroke(stroke);\r\n image.put_ShapeProperties(shape);\r\n\r\n api.asc_setGraphicObjectProps(image);\r\n this.props.storeChartSettings.initBorderColor(this.props.storeFocusObjects.shapeObject.get_ShapeProperties()); // when select STROKE_NONE or change from STROKE_NONE to STROKE_COLOR\r\n }\r\n\r\n onReorder(type) {\r\n const api = Common.EditorApi.get();\r\n let ascType;\r\n\r\n if (type == 'all-up') {\r\n ascType = Asc.c_oAscDrawingLayerType.BringToFront;\r\n } else if (type == 'all-down') {\r\n ascType = Asc.c_oAscDrawingLayerType.SendToBack;\r\n } else if (type == 'move-up') {\r\n ascType = Asc.c_oAscDrawingLayerType.BringForward;\r\n } else {\r\n ascType = Asc.c_oAscDrawingLayerType.SendBackward;\r\n }\r\n\r\n api.asc_setSelectedDrawingObjectLayer(ascType);\r\n }\r\n\r\n setLayoutProperty(propertyMethod, value) {\r\n const api = Common.EditorApi.get();\r\n let chartObject = api.asc_getChartObject();\r\n\r\n if (chartObject && value) {\r\n\r\n chartObject[propertyMethod](+value);\r\n\r\n if (\"putDataLabelsPos\" == propertyMethod && +value != 0) {\r\n chartObject[\"putShowVal\"](true);\r\n }\r\n\r\n api.asc_editChartDrawingObject(chartObject);\r\n }\r\n }\r\n\r\n getVerticalAxisProp() {\r\n const api = Common.EditorApi.get();\r\n let chartObject = api.asc_getChartObject(),\r\n verAxisProps = chartObject.getVertAxisProps();\r\n\r\n return (verAxisProps.getAxisType() == Asc.c_oAscAxisType.val) ? verAxisProps : chartObject.getHorAxisProps();\r\n }\r\n\r\n setVerticalAxisProp(axisProps) {\r\n const api = Common.EditorApi.get();\r\n let chartObject = api.asc_getChartObject(),\r\n verAxisProps = chartObject.getVertAxisProps();\r\n\r\n if (chartObject) {\r\n chartObject[(verAxisProps.getAxisType() == Asc.c_oAscAxisType.val) ? 'putVertAxisProps' : 'putHorAxisProps'](axisProps);\r\n api.asc_editChartDrawingObject(chartObject);\r\n }\r\n }\r\n\r\n onVerAxisMinValue(value) {\r\n let axisProps = this.getVerticalAxisProp(),\r\n axisRule = !value ? Asc.c_oAscValAxisRule.auto : Asc.c_oAscValAxisRule.fixed;\r\n\r\n axisProps.putMinValRule(axisRule);\r\n\r\n if (axisRule == Asc.c_oAscValAxisRule.fixed) {\r\n axisProps.putMinVal(+value);\r\n }\r\n\r\n this.setVerticalAxisProp(axisProps);\r\n }\r\n\r\n onVerAxisMaxValue(value) {\r\n let axisProps = this.getVerticalAxisProp(),\r\n axisRule = !value ? Asc.c_oAscValAxisRule.auto : Asc.c_oAscValAxisRule.fixed;\r\n\r\n axisProps.putMaxValRule(axisRule);\r\n\r\n if (axisRule == Asc.c_oAscValAxisRule.fixed) {\r\n axisProps.putMaxVal(+value);\r\n }\r\n\r\n this.setVerticalAxisProp(axisProps);\r\n }\r\n\r\n onVerAxisCrossType(value) {\r\n let axisProps = this.getVerticalAxisProp();\r\n\r\n axisProps.putCrossesRule(+value);\r\n\r\n this.setVerticalAxisProp(axisProps);\r\n }\r\n\r\n onVerAxisCrossValue(value) {\r\n let axisProps = this.getVerticalAxisProp();\r\n\r\n axisProps.putCrossesRule(Asc.c_oAscCrossesRule.value);\r\n axisProps.putCrosses(+value);\r\n\r\n this.setVerticalAxisProp(axisProps);\r\n }\r\n\r\n onVerAxisDisplayUnits(value) {\r\n let axisProps = this.getVerticalAxisProp();\r\n\r\n axisProps.putDispUnitsRule(+value);\r\n\r\n this.setVerticalAxisProp(axisProps);\r\n }\r\n\r\n onVerAxisReverse(value) {\r\n let axisProps = this.getVerticalAxisProp();\r\n\r\n axisProps.putInvertValOrder(value);\r\n\r\n this.setVerticalAxisProp(axisProps);\r\n }\r\n\r\n onVerAxisTickMajor(value) {\r\n let axisProps = this.getVerticalAxisProp();\r\n\r\n axisProps.putMajorTickMark(+value);\r\n\r\n this.setVerticalAxisProp(axisProps);\r\n }\r\n\r\n onVerAxisTickMinor(value) {\r\n let axisProps = this.getVerticalAxisProp();\r\n\r\n axisProps.putMinorTickMark(+value);\r\n\r\n this.setVerticalAxisProp(axisProps);\r\n }\r\n\r\n onVerAxisLabelPos(value) {\r\n let axisProps = this.getVerticalAxisProp();\r\n\r\n axisProps.putTickLabelsPos(+value);\r\n\r\n this.setVerticalAxisProp(axisProps);\r\n }\r\n\r\n // Horizontal\r\n\r\n getHorizontalAxisProp() {\r\n const api = Common.EditorApi.get();\r\n let chartObject = api.asc_getChartObject(),\r\n verHorProps = chartObject.getHorAxisProps();\r\n\r\n return (verHorProps.getAxisType() == Asc.c_oAscAxisType.val) ? chartObject.getVertAxisProps() : verHorProps;\r\n }\r\n\r\n setHorizontalAxisProp(axisProps) {\r\n const api = Common.EditorApi.get();\r\n let chartObject = api.asc_getChartObject(),\r\n verAxisProps = chartObject.getHorAxisProps();\r\n\r\n if (chartObject) {\r\n chartObject[(verAxisProps.getAxisType() == Asc.c_oAscAxisType.val) ? 'putVertAxisProps' : 'putHorAxisProps'](axisProps);\r\n api.asc_editChartDrawingObject(chartObject);\r\n }\r\n }\r\n\r\n onHorAxisCrossType(value) {\r\n let axisProps = this.getHorizontalAxisProp();\r\n\r\n axisProps.putCrossesRule(+value);\r\n\r\n this.setHorizontalAxisProp(axisProps);\r\n }\r\n\r\n onHorAxisCrossValue(value) {\r\n let axisProps = this.getHorizontalAxisProp();\r\n\r\n axisProps.putCrossesRule(Asc.c_oAscCrossesRule.value);\r\n axisProps.putCrosses(+value);\r\n\r\n this.setHorizontalAxisProp(axisProps);\r\n }\r\n\r\n onHorAxisPos(value) {\r\n let axisProps = this.getHorizontalAxisProp();\r\n\r\n axisProps.putLabelsPosition(+value);\r\n\r\n this.setHorizontalAxisProp(axisProps);\r\n }\r\n\r\n onHorAxisReverse(value) {\r\n let axisProps = this.getHorizontalAxisProp();\r\n\r\n axisProps.putInvertCatOrder(value);\r\n\r\n this.setHorizontalAxisProp(axisProps);\r\n }\r\n\r\n onHorAxisTickMajor(value) {\r\n let axisProps = this.getHorizontalAxisProp();\r\n\r\n axisProps.putMajorTickMark(+value);\r\n\r\n this.setHorizontalAxisProp(axisProps);\r\n }\r\n\r\n onHorAxisTickMinor(value) {\r\n let axisProps = this.getHorizontalAxisProp();\r\n\r\n axisProps.putMinorTickMark(+value);\r\n\r\n this.setHorizontalAxisProp(axisProps);\r\n }\r\n\r\n onHorAxisLabelPos(value) {\r\n let axisProps = this.getHorizontalAxisProp();\r\n\r\n axisProps.putTickLabelsPos(+value);\r\n\r\n this.setHorizontalAxisProp(axisProps);\r\n }\r\n\r\n render () {\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\nexport default inject(\"storeChartSettings\", \"storeFocusObjects\")(observer(EditChartController));","import React, { useContext } from 'react';\nimport { observer, inject } from \"mobx-react\";\nimport { Page, Navbar, NavRight, NavTitle, Tabs, Tab, Link, f7 } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\nimport EditCellController from \"../../controller/edit/EditCell\";\nimport EditShapeController from \"../../controller/edit/EditShape\";\nimport EditImageController from \"../../controller/edit/EditImage\";\nimport EditTextController from \"../../controller/edit/EditText\";\nimport EditChartController from \"../../controller/edit/EditChart\";\nimport { Device } from \"../../../../../common/mobile/utils/device\";\nimport { MainContext } from '../../page/main';\n\nconst EmptyEditLayout = () => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n\n return (\n \n \n
\n
{_t.textSelectObjectToEdit}
\n
\n
\n \n )\n};\n\nconst EditLayoutNavbar = ({ editors }) => {\n const isAndroid = Device.android;\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n\n if(!editors.length) return null;\n\n return (\n \n {editors.length > 1 ?\n \n {editors.map((item, index) => {item.caption})}\n {isAndroid && }\n
: \n {editors[0].caption}\n }\n {Device.phone && \n \n \n \n }\n \n )\n};\n\nconst EditLayoutContent = ({ editors }) => {\n if(!editors.length) return null;\n\n if (editors.length > 1) {\n return (\n \n {editors.map((item, index) =>\n \n {item.component}\n \n )}\n \n )\n } else {\n return (\n \n {editors[0].component}\n \n )\n }\n};\n\nconst EditingPage = inject('storeFocusObjects')(observer(props => {\n const { t } = useTranslation();\n const _t = t('View.Edit', {returnObjects: true});\n const mainContext = useContext(MainContext);\n const store = props.storeFocusObjects;\n const wsProps = mainContext.wsProps;\n const settings = !store.focusOn ? [] : (store.focusOn === 'obj' ? store.objects : store.selections);\n let editors = [];\n\n if (settings.length < 1) {\n editors.push({\n caption: _t.textSettings,\n component: \n });\n } else {\n if (!(wsProps.Objects && store.isLockedShape) && settings.indexOf('image') > -1) {\n editors.push({\n caption: _t.textImage,\n id: 'edit-image',\n component: \n })\n }\n if (!(wsProps.Objects && store.isLockedShape) && settings.indexOf('shape') > -1) {\n editors.push({\n caption: _t.textShape,\n id: 'edit-shape',\n component: \n })\n }\n if (settings.indexOf('cell') > -1) {\n editors.push({\n caption: _t.textCell,\n id: 'edit-text',\n component: \n })\n }\n if (!(wsProps.Objects && store.isLockedShape) && settings.indexOf('chart') > -1) {\n editors.push({\n caption: _t.textChart,\n id: 'edit-chart',\n component: \n })\n }\n if (!(wsProps.Objects && store.isLockedText) && settings.indexOf('text') > -1) {\n editors.push({\n caption: _t.textText,\n id: 'edit-text',\n component: \n })\n }\n\n // if(!wsProps.Objects) {\n // if (settings.indexOf('hyperlink') > -1 || (props.hyperinfo && props.isAddShapeHyperlink)) {\n // editors.push({\n // caption: _t.textHyperlink,\n // id: 'edit-link',\n // component: \n // })\n // }\n // } \n }\n\n if(!editors.length) {\n if (Device.phone) {\n f7.sheet.close('#edit-sheet', false);\n } else { \n f7.popover.close('#edit-popover', false);\n }\n\n return null;\n }\n\n return (\n \n \n \n \n )\n}));\n\nexport default EditingPage;","import React, { useContext, useEffect } from 'react';\nimport { Popover, Sheet, View } from 'framework7-react';\nimport { f7 } from 'framework7-react';\nimport { Device } from '../../../../../common/mobile/utils/device';\n// import { EditLinkController } from \"../../controller/edit/EditLink\";\nimport { PageShapeStyle, PageShapeStyleNoFill, PageReplaceContainer, PageReorderContainer, PageShapeBorderColor, PageShapeCustomBorderColor, PageShapeCustomFillColor } from './EditShape';\nimport { PageImageReplace, PageImageReorder, PageLinkSettings } from './EditImage';\nimport { TextColorCell, FillColorCell, CustomTextColorCell, CustomFillColorCell, FontsCell, TextFormatCell, TextOrientationCell, BorderStyleCell, BorderColorCell, CustomBorderColorCell, BorderSizeCell, PageFormatCell, PageAccountingFormatCell, PageCurrencyFormatCell, PageDateFormatCell, PageTimeFormatCell, CellStyle, PageCreationCustomFormat, CustomFormats } from './EditCell';\nimport { PageTextFonts, PageTextFontColor, PageTextCustomFontColor, PageOrientationTextShape } from './EditText';\nimport { PageChartDesign, PageChartDesignType, PageChartDesignStyle, PageChartDesignFill, PageChartDesignBorder, PageChartCustomFillColor, PageChartBorderColor, PageChartCustomBorderColor, PageChartReorder, PageChartLayout, PageLegend, PageChartTitle, PageHorizontalAxisTitle, PageVerticalAxisTitle, PageHorizontalGridlines, PageVerticalGridlines, PageDataLabels, PageChartVerticalAxis, PageVertAxisCrosses, PageDisplayUnits, PageVertMajorType, PageVertMinorType, PageVertLabelPosition, PageChartHorizontalAxis, PageHorAxisCrosses, PageHorAxisPosition, PageHorMajorType, PageHorMinorType, PageHorLabelPosition } from './EditChart';\nimport { PageEditTypeLink, PageEditSheet } from './EditLink';\nimport EditingPage from './EditingPage';\nimport { MainContext } from '../../page/main';\n\nconst routes = [\n {\n path: '/editing-page/',\n component: EditingPage,\n keepAlive: true\n },\n // Shape\n {\n path: '/edit-style-shape/',\n component: PageShapeStyle\n },\n {\n path: '/edit-style-shape-no-fill/',\n component: PageShapeStyleNoFill\n },\n {\n path: '/edit-replace-shape/',\n component: PageReplaceContainer\n },\n {\n path: '/edit-reorder-shape',\n component: PageReorderContainer\n },\n {\n path: '/edit-shape-border-color/',\n component: PageShapeBorderColor\n },\n {\n path: '/edit-shape-custom-border-color/',\n component: PageShapeCustomBorderColor\n }, \n {\n path: '/edit-shape-custom-fill-color/',\n component: PageShapeCustomFillColor\n },\n {\n path: '/edit-text-shape-orientation/',\n component: PageOrientationTextShape\n },\n\n // Image\n\n {\n path: '/edit-replace-image/',\n component: PageImageReplace\n },\n {\n path: '/edit-reorder-image/',\n component: PageImageReorder\n },\n {\n path: '/edit-image-link/',\n component: PageLinkSettings\n },\n\n // Cell\n\n {\n path: '/edit-cell-text-color/',\n component: TextColorCell\n },\n {\n path: '/edit-cell-fill-color/',\n component: FillColorCell\n },\n {\n path: '/edit-cell-text-custom-color/',\n component: CustomTextColorCell\n },\n {\n path: '/edit-cell-fill-custom-color/',\n component: CustomFillColorCell\n },\n {\n path: '/edit-cell-text-fonts/',\n component: FontsCell\n },\n {\n path: '/edit-cell-text-format/',\n component: TextFormatCell\n },\n {\n path: '/edit-cell-text-orientation/',\n component: TextOrientationCell\n },\n {\n path: '/edit-cell-border-style/',\n component: BorderStyleCell\n },\n {\n path: '/edit-border-color-cell/',\n component: BorderColorCell\n },\n {\n path: '/edit-border-custom-color-cell/',\n component: CustomBorderColorCell\n },\n {\n path: '/edit-border-size-cell/',\n component: BorderSizeCell\n },\n {\n path: '/edit-format-cell/',\n component: PageFormatCell\n },\n {\n path: '/edit-accounting-format-cell/',\n component: PageAccountingFormatCell\n },\n {\n path: '/edit-currency-format-cell/',\n component: PageCurrencyFormatCell\n },\n {\n path: '/edit-date-format-cell/',\n component: PageDateFormatCell\n },\n {\n path: '/edit-time-format-cell/',\n component: PageTimeFormatCell\n }, \n {\n path: '/edit-cell-style/',\n component: CellStyle\n },\n\n // Text\n\n {\n path: '/edit-text-fonts/',\n component: PageTextFonts\n },\n {\n path: '/edit-text-font-color/',\n component: PageTextFontColor\n }, \n {\n path: '/edit-text-custom-font-color/',\n component: PageTextCustomFontColor\n },\n\n // Chart \n\n {\n path: '/edit-chart-design/',\n component: PageChartDesign,\n },\n {\n path: '/edit-chart-type/',\n component: PageChartDesignType\n },\n {\n path: '/edit-chart-style/',\n component: PageChartDesignStyle\n },\n {\n path: '/edit-chart-fill/',\n component: PageChartDesignFill\n },\n {\n path: '/edit-chart-border/',\n component: PageChartDesignBorder\n },\n {\n path: '/edit-chart-border-color/',\n component: PageChartBorderColor\n },\n {\n path: '/edit-chart-custom-fill-color/',\n component: PageChartCustomFillColor\n },\n {\n path: '/edit-chart-custom-border-color/',\n component: PageChartCustomBorderColor\n },\n {\n path: '/edit-chart-reorder/',\n component: PageChartReorder\n },\n {\n path: '/edit-chart-layout/',\n component: PageChartLayout\n },\n {\n path: '/edit-chart-title/',\n component: PageChartTitle\n },\n {\n path: '/edit-chart-legend/',\n component: PageLegend\n },\n {\n path: '/edit-horizontal-axis-title/',\n component: PageHorizontalAxisTitle\n },\n {\n path: '/edit-vertical-axis-title/',\n component: PageVerticalAxisTitle\n },\n {\n path: '/edit-horizontal-gridlines/',\n component: PageHorizontalGridlines\n },\n {\n path: '/edit-vertical-gridlines/',\n component: PageVerticalGridlines\n },\n {\n path: '/edit-data-labels/',\n component: PageDataLabels\n },\n\n // Vertical Axis\n\n {\n path: '/edit-chart-vertical-axis/',\n component: PageChartVerticalAxis\n },\n {\n path: '/edit-vert-axis-crosses/',\n component: PageVertAxisCrosses\n },\n {\n path: '/edit-display-units/',\n component: PageDisplayUnits\n },\n {\n path: '/edit-vert-major-type/',\n component: PageVertMajorType\n },\n {\n path: '/edit-vert-minor-type/',\n component: PageVertMinorType\n },\n {\n path: '/edit-vert-label-position/',\n component: PageVertLabelPosition\n },\n\n // Horizontal Axis\n\n {\n path: '/edit-chart-horizontal-axis/',\n component: PageChartHorizontalAxis\n },\n {\n path: '/edit-hor-axis-crosses/',\n component: PageHorAxisCrosses\n },\n {\n path: '/edit-hor-axis-position/',\n component: PageHorAxisPosition\n },\n {\n path: '/edit-hor-major-type/',\n component: PageHorMajorType\n },\n {\n path: '/edit-hor-minor-type/',\n component: PageHorMinorType\n },\n {\n path: '/edit-hor-label-position/',\n component: PageHorLabelPosition\n },\n\n // Link \n {\n path: '/edit-link-type/',\n component: PageEditTypeLink\n },\n {\n path: '/edit-link-sheet',\n component: PageEditSheet\n },\n\n // Add custom format\n {\n path: '/custom-format/',\n component: CustomFormats\n },\n {\n path: '/create-custom-format/',\n component: PageCreationCustomFormat\n }\n];\n\nroutes.forEach(route => {\n route.options = {\n ...route.options,\n transition: 'f7-push'\n };\n});\n\nconst EditView = () => {\n const mainContext = useContext(MainContext);\n // const api = Common.EditorApi.get();\n // const cellinfo = api.asc_getCellInfo();\n // const hyperinfo = cellinfo.asc_getHyperlink();\n // const isAddShapeHyperlink = api.asc_canAddShapeHyperlink();\n\n useEffect(() => {\n if(Device.phone) {\n f7.sheet.open('#edit-sheet');\n } else {\n f7.popover.open('#edit-popover', '#btn-edit');\n }\n }, []);\n\n return (\n !Device.phone ?\n mainContext.closeOptions('edit')}>\n \n \n \n :\n mainContext.closeOptions('edit')}>\n \n \n \n \n )\n};\n\nexport default EditView;","import React, { Component, Fragment, createContext } from 'react';\nimport { Page, View, Navbar, Subnavbar, Icon, f7 } from 'framework7-react';\nimport { observer, inject } from \"mobx-react\";\nimport { Device } from '../../../../common/mobile/utils/device';\nimport CollaborationView from '../../../../common/mobile/lib/view/collaboration/Collaboration.jsx'\nimport CellEditor from '../controller/CellEditor';\nimport { Statusbar } from '../controller/Statusbar';\nimport FilterOptionsController from '../controller/FilterOptions.jsx'\nimport { Search, SearchSettings } from '../controller/Search';\nimport { FunctionGroups } from \"../controller/add/AddFunction\";\nimport ContextMenu from '../controller/ContextMenu';\nimport { Toolbar } from \"../controller/Toolbar\";\nimport { AddLinkController } from '../controller/add/AddLink';\nimport { EditLinkController } from '../controller/edit/EditLink';\nimport { Themes } from '../../../../common/mobile/lib/controller/Themes';\nimport SettingsController from '../controller/settings/Settings';\nimport AddingController from '../controller/add/Add';\nimport EditView from '../view/edit/Edit';\nimport VersionHistoryController from '../../../../common/mobile/lib/controller/VersionHistory';\n\nexport const MainContext = createContext();\n\nclass MainPage extends Component {\n constructor(props) {\n super(props);\n this.state = {\n editOptionsVisible: false,\n addOptionsVisible: false,\n addShowOptions: null,\n settingsVisible: false,\n collaborationVisible: false,\n addLinkSettingsVisible: false,\n editLinkSettingsVisible: false,\n isOpenModal: false\n };\n }\n\n handleClickToOpenOptions = (opts, showOpts) => {\n f7.popover.close('.document-menu.modal-in', false);\n\n let opened = false;\n const newState = {};\n \n if ( opts === 'edit' ) {\n this.state.editOptionsVisible && (opened = true);\n newState.editOptionsVisible = true;\n newState.isOpenModal = true;\n } else if ( opts === 'add' ) {\n this.state.addOptionsVisible && (opened = true);\n newState.addOptionsVisible = true;\n newState.addShowOptions = showOpts;\n newState.isOpenModal = true;\n } else if ( opts === 'settings' ) {\n this.state.settingsVisible && (opened = true);\n newState.settingsVisible = true;\n newState.isOpenModal = true;\n } else if ( opts === 'coauth' ) {\n this.state.collaborationVisible && (opened = true);\n newState.collaborationVisible = true;\n newState.isOpenModal = true;\n } else if ( opts === 'add-link') {\n this.state.addLinkSettingsVisible && (opened = true);\n newState.addLinkSettingsVisible = true;\n } else if( opts === 'edit-link') {\n this.state.editLinkSettingsVisible && (opened = true);\n newState.editLinkSettingsVisible = true;\n } else if (opts === 'history') {\n newState.historyVisible = true;\n }\n\n for (let key in this.state) {\n if (this.state[key] && !opened) {\n setTimeout(() => {\n this.handleClickToOpenOptions(opts, showOpts);\n }, 10);\n return;\n }\n }\n\n if (!opened) {\n this.setState(newState);\n if ((opts === 'edit' || opts === 'coauth') && Device.phone) {\n f7.navbar.hide('.main-navbar');\n }\n }\n };\n\n handleOptionsViewClosed = opts => {\n this.setState(state => {\n if ( opts == 'edit' )\n return {editOptionsVisible: false, isOpenModal: false};\n else if ( opts == 'add' )\n return {addOptionsVisible: false, addShowOptions: null, isOpenModal: false};\n else if ( opts == 'settings' )\n return {settingsVisible: false, isOpenModal: false};\n else if ( opts == 'coauth' )\n return {collaborationVisible: false, isOpenModal: false};\n else if ( opts === 'add-link') \n return {addLinkSettingsVisible: false};\n else if( opts === 'edit-link') \n return {editLinkSettingsVisible: false};\n else if (opts === 'history')\n return {historyVisible: false}\n });\n\n if ((opts === 'edit' || opts === 'coauth') && Device.phone) {\n f7.navbar.show('.main-navbar');\n }\n };\n\n componentDidMount () {\n if($$('.skl-container').length)\n $$('.skl-container').remove();\n }\n\n render() {\n const appOptions = this.props.storeAppOptions;\n const storeWorksheets = this.props.storeWorksheets;\n const storeThemes = this.props.storeThemes;\n const colorTheme = storeThemes.colorTheme;\n const wsProps = storeWorksheets.wsProps;\n const wsLock = storeWorksheets.wsLock;\n const config = appOptions.config;\n const { customization = {} } = config;\n const isShowPlaceholder = !appOptions.isDocReady && (!customization || !(customization.loaderName || customization.loaderLogo));\n\n let isBranding = true,\n isHideLogo = true,\n customLogoImage = '',\n customLogoUrl = '';\n\n if(!appOptions.isDisconnected && appOptions.isDocReady) {\n const { logo } = customization;\n isBranding = appOptions.canBranding || appOptions.canBrandingExt;\n \n if(logo && isBranding) {\n isHideLogo = logo.visible === false;\n\n if(logo.image || logo.imageDark) {\n customLogoImage = colorTheme.type === 'dark' ? logo.imageDark ?? logo.image : logo.image ?? logo.imageDark;\n customLogoUrl = logo.url;\n }\n } else {\n isHideLogo = false;\n }\n }\n\n return (\n \n \n \n {/* Top Navbar */}\n \n {!isHideLogo &&\n {\n window.open(`${customLogoImage && customLogoUrl ? customLogoUrl : __PUBLISHER_URL__}`, \"_blank\");\n }}>\n {customLogoImage ? \n

\n :\n
\n }\n
\n }\n \n \n \n \n \n \n this.handleClickToOpenOptions('add', {panels: panels, button: button})} />\n {/* Page content */}\n \n {isShowPlaceholder ?\n :\n null\n }\n \n {!this.state.editOptionsVisible ? null : }\n {!this.state.addOptionsVisible ? null :\n \n }\n {!this.state.addLinkSettingsVisible ? null :\n \n }\n {!this.state.editLinkSettingsVisible ? null :\n \n }\n {!this.state.settingsVisible ? null : }\n {!this.state.collaborationVisible ? null :\n \n }\n {!this.state.historyVisible ? null :\n \n }\n {appOptions.isDocReady &&\n \n \n \n \n }\n \n {/* hidden component*/}\n \n \n \n )\n }\n}\n\nexport default inject('storeAppOptions', 'storeWorksheets', 'storeThemes')(observer(MainPage));","\nimport MainPage from '../page/main';\n\nvar routes = [\n {\n path: '/',\n component: MainPage,\n }\n];\n\nexport default routes;\n","\nexport default class Notifications {\n constructor() {\n this._events = {};\n }\n\n on(event, callback) {\n const addevent = (e, c) => {\n !this._events[e] && (this._events[e] = []);\n this._events[e].push(c);\n };\n\n if ( typeof(event) == 'object' )\n for (const i in event)\n addevent(i, event[i])\n else addevent(event, callback);\n }\n\n off(event, callback) {\n if ( this._events[event] && this._events[event].includes(callback) ) {\n this._events[event].splice(this._events[event].indexOf(callback), 1);\n }\n }\n\n trigger(event/*, args*/) {\n if ( this._events[event] ) {\n this._events[event].forEach(callback => {\n callback.apply(this, Array.prototype.slice.call(arguments, 1));\n });\n }\n }\n}\n","import React, { Component } from 'react'\nimport { f7 } from 'framework7-react';\nimport {observer, inject} from \"mobx-react\"\nimport { LocalStorage } from '../../../utils/LocalStorage.mjs';\nimport { withTranslation } from 'react-i18next';\n\nclass CollaborationController extends Component {\n constructor(props){\n super(props);\n\n Common.Notifications.on('engineCreated', (api) => {\n api.asc_registerCallback('asc_onAuthParticipantsChanged', this.onChangeEditUsers.bind(this));\n api.asc_registerCallback('asc_onParticipantsChanged', this.onChangeEditUsers.bind(this));\n api.asc_registerCallback('asc_onConnectionStateChanged', this.onUserConnection.bind(this));\n api.asc_registerCallback('asc_onCoAuthoringDisconnect', this.onCoAuthoringDisconnect.bind(this));\n\n api.asc_registerCallback('asc_OnTryUndoInFastCollaborative', this.onTryUndoInFastCollaborative.bind(this));\n });\n\n Common.Notifications.on('api:disconnect', this.onCoAuthoringDisconnect.bind(this));\n Common.Notifications.on('document:ready', this.onDocumentReady.bind(this));\n }\n\n onDocumentReady() {\n const api = Common.EditorApi.get();\n const appOptions = this.props.storeAppOptions;\n /** coauthoring begin **/\n let isFastCoauth;\n if (appOptions.isEdit && appOptions.canLicense && !appOptions.isOffline && appOptions.canCoAuthoring) {\n // Force ON fast co-authoring mode\n isFastCoauth = true;\n api.asc_SetFastCollaborative(isFastCoauth);\n\n if (window.editorType === 'de') {\n const value = LocalStorage.getItem((isFastCoauth) ? \"de-settings-showchanges-fast\" : \"de-settings-showchanges-strict\");\n if (value !== null) {\n api.SetCollaborativeMarksShowType(\n value === 'all' ? Asc.c_oAscCollaborativeMarksShowType.All :\n value === 'none' ? Asc.c_oAscCollaborativeMarksShowType.None : Asc.c_oAscCollaborativeMarksShowType.LastChanges);\n } else {\n api.SetCollaborativeMarksShowType(isFastCoauth ? Asc.c_oAscCollaborativeMarksShowType.None : Asc.c_oAscCollaborativeMarksShowType.LastChanges);\n }\n }\n } else if (!appOptions.isEdit && appOptions.isRestrictedEdit) {\n isFastCoauth = true;\n api.asc_SetFastCollaborative(isFastCoauth);\n window.editorType === 'de' && api.SetCollaborativeMarksShowType(Asc.c_oAscCollaborativeMarksShowType.None);\n api.asc_setAutoSaveGap(1);\n } else if (appOptions.canLiveView) { // viewer\n isFastCoauth = !(appOptions.config.coEditing && appOptions.config.coEditing.mode==='strict');\n api.asc_SetFastCollaborative(isFastCoauth);\n window.editorType === 'de' && api.SetCollaborativeMarksShowType(Asc.c_oAscCollaborativeMarksShowType.None);\n api.asc_setAutoSaveGap(1);\n } else {\n isFastCoauth = false;\n api.asc_SetFastCollaborative(isFastCoauth);\n window.editorType === 'de' && api.SetCollaborativeMarksShowType(Asc.c_oAscCollaborativeMarksShowType.None);\n }\n\n if (appOptions.isEdit) {\n let value;\n if (window.editorType === 'sse') {\n value = appOptions.canAutosave ? 1 : 0; // FORCE AUTOSAVE\n } else {\n value = isFastCoauth; // Common.localStorage.getItem(\"de-settings-autosave\");\n value = (!isFastCoauth && value !== null) ? parseInt(value) : (appOptions.canCoAuthoring ? 1 : 0);\n }\n api.asc_setAutoSaveGap(value);\n }\n /** coauthoring end **/\n }\n\n onChangeEditUsers(users) {\n const storeUsers = this.props.users;\n storeUsers.reset(users);\n storeUsers.setCurrentUser(this.props.storeAppOptions.user.id);\n }\n\n onUserConnection(change) {\n this.props.users.connection(change);\n }\n\n onCoAuthoringDisconnect() {\n this.props.users.resetDisconnected(true);\n }\n\n onTryUndoInFastCollaborative() {\n const { t } = this.props;\n const _t = t(\"Common.Collaboration\", { returnObjects: true });\n f7.dialog.alert(_t.textTryUndoRedo, _t.notcriticalErrorTitle);\n }\n\n render() {\n return null\n }\n}\n\nexport default inject('users', 'storeAppOptions')(observer(withTranslation()(CollaborationController)));","\nexport default class IrregularStack {\n constructor (config) {\n this._stack = [];\n\n const _config = config || {};\n this._strongCompare = _config.strongCompare || this._compare;\n this._weakCompare = _config.weakCompare || this._compare;\n }\n\n _compare (obj1, obj2) {\n if (typeof obj1 === 'object' && typeof obj2 === 'object' && window.JSON)\n return window.JSON.stringify(obj1) === window.JSON.stringify(obj2);\n return obj1 === obj2;\n };\n\n _indexOf (obj, compare) {\n for (let i = this._stack.length - 1; i >= 0; i--) {\n if (compare(this._stack[i], obj))\n return i;\n }\n return -1;\n }\n\n push (obj) {\n this._stack.push(obj);\n }\n\n pop (obj) {\n const index = this._indexOf(obj, this._strongCompare);\n if (index !== -1) {\n const removed = this._stack.splice(index, 1);\n return removed[0];\n }\n return undefined;\n }\n\n get (obj) {\n const index = this._indexOf(obj, this._weakCompare);\n if (index !== -1) {\n return this._stack[index];\n }\n return undefined;\n }\n\n exist (obj) {\n return !(this._indexOf(obj, this._strongCompare) < 0);\n }\n\n}","import React, { useEffect } from 'react';\nimport { f7 } from 'framework7-react';\nimport { inject } from 'mobx-react';\nimport { useTranslation } from 'react-i18next';\nimport IrregularStack from \"../../../../common/mobile/utils/IrregularStack\";\nimport { Device } from '../../../../common/mobile/utils/device';\n\nconst LongActionsController = inject('storeAppOptions')(({storeAppOptions}) => {\n const {t} = useTranslation();\n const _t = t(\"LongActions\", { returnObjects: true });\n\n const ApplyEditRights = -255;\n const LoadingDocument = -256;\n\n const stackLongActions = new IrregularStack({\n strongCompare : function(obj1, obj2){return obj1.id === obj2.id && obj1.type === obj2.type;},\n weakCompare : function(obj1, obj2){return obj1.type === obj2.type;}\n });\n\n let loadMask = null;\n\n const closePreloader = () => {\n if (loadMask && loadMask.el) {\n f7.dialog.close(loadMask.el);\n }\n };\n\n useEffect( () => {\n const on_engine_created = api => { \n api.asc_registerCallback('asc_onStartAction', onLongActionBegin);\n api.asc_registerCallback('asc_onEndAction', onLongActionEnd);\n api.asc_registerCallback('asc_onOpenDocumentProgress', onOpenDocument);\n api.asc_registerCallback('asc_onConfirmAction', onConfirmAction);\n };\n\n const api = Common.EditorApi.get();\n if(!api) Common.Notifications.on('engineCreated', on_engine_created);\n else on_engine_created(api);\n\n Common.Notifications.on('preloader:endAction', onLongActionEnd);\n Common.Notifications.on('preloader:beginAction', onLongActionBegin);\n Common.Notifications.on('preloader:close', closePreloader);\n\n return ( () => {\n const api = Common.EditorApi.get();\n if ( api ) {\n api.asc_unregisterCallback('asc_onStartAction', onLongActionBegin);\n api.asc_unregisterCallback('asc_onEndAction', onLongActionEnd);\n api.asc_unregisterCallback('asc_onOpenDocumentProgress', onOpenDocument);\n api.asc_unregisterCallback('asc_onConfirmAction', onConfirmAction);\n }\n\n Common.Notifications.off('engineCreated', on_engine_created);\n Common.Notifications.off('preloader:endAction', onLongActionEnd);\n Common.Notifications.off('preloader:beginAction', onLongActionBegin);\n Common.Notifications.off('preloader:close', closePreloader);\n })\n });\n\n const onLongActionBegin = (type, id) => {\n const action = {id: id, type: type};\n stackLongActions.push(action);\n setLongActionView(action);\n };\n\n const onLongActionEnd = (type, id, forceClose) => {\n if (!stackLongActions.exist({id: id, type: type})) return;\n\n let action = {id: id, type: type};\n stackLongActions.pop(action);\n\n //this.updateWindowTitle(true);\n\n action = stackLongActions.get({type: Asc.c_oAscAsyncActionType.Information}) || stackLongActions.get({type: Asc.c_oAscAsyncActionType.BlockInteraction});\n\n if (action && !forceClose) {\n setLongActionView(action)\n } else {\n loadMask && loadMask.el && loadMask.el.classList.contains('modal-in') ?\n f7.dialog.close(loadMask.el) :\n f7.dialog.close($$('.dialog-preloader'));\n }\n };\n\n const setLongActionView = (action) => {\n let title = '';\n // let text = '';\n switch (action.id) {\n case Asc.c_oAscAsyncAction['Open']:\n title = _t.textLoadingDocument;\n // title = _t.openTitleText;\n // text = _t.openTextText;\n break;\n\n case Asc.c_oAscAsyncAction['Save']:\n title = _t.saveTitleText;\n // text = _t.saveTextText;\n break;\n\n case Asc.c_oAscAsyncAction['LoadDocumentFonts']:\n if ( !storeAppOptions.isDocReady ) return;\n title = _t.loadFontsTitleText;\n // text = _t.loadFontsTextText;\n break;\n\n case Asc.c_oAscAsyncAction['LoadDocumentImages']:\n title = _t.loadImagesTitleText;\n // text = _t.loadImagesTextText;\n break;\n\n case Asc.c_oAscAsyncAction['LoadFont']:\n title = _t.loadFontTitleText;\n // text = _t.loadFontTextText;\n break;\n\n case Asc.c_oAscAsyncAction['LoadImage']:\n title = _t.loadImageTitleText;\n // text = _t.loadImageTextText;\n break;\n\n case Asc.c_oAscAsyncAction['DownloadAs']:\n title = _t.downloadTitleText;\n // text = _t.downloadTextText;\n break;\n\n case Asc.c_oAscAsyncAction['Print']:\n title = _t.printTitleText;\n // text = _t.printTextText;\n break;\n\n case Asc.c_oAscAsyncAction['UploadImage']:\n title = _t.uploadImageTitleText;\n // text = _t.uploadImageTextText;\n break;\n\n case Asc.c_oAscAsyncAction['ApplyChanges']:\n title = _t.applyChangesTitleText;\n // text = _t.applyChangesTextText;\n break;\n\n case Asc.c_oAscAsyncAction['PrepareToSave']:\n title = _t.savePreparingText;\n // text = _t.savePreparingTitle;\n break;\n\n case Asc.c_oAscAsyncAction['MailMergeLoadFile']:\n title = _t.mailMergeLoadFileText;\n // text = _t.mailMergeLoadFileTitle;\n break;\n\n case Asc.c_oAscAsyncAction['DownloadMerge']:\n title = _t.downloadMergeTitle;\n // text = _t.downloadMergeText;\n break;\n\n case Asc.c_oAscAsyncAction['SendMailMerge']:\n title = _t.sendMergeTitle;\n // text = _t.sendMergeText;\n break;\n\n case Asc.c_oAscAsyncAction['Waiting']:\n title = _t.waitText;\n // text = _t.waitText;\n break;\n\n case ApplyEditRights:\n title = _t.txtEditingMode;\n // text = _t.txtEditingMode;\n break;\n\n case LoadingDocument:\n title = _t.loadingDocumentTitleText;\n // text = _t.loadingDocumentTextText;\n break;\n default:\n if (typeof action.id == 'string'){\n title = action.id;\n // text = action.id;\n }\n break;\n }\n\n if (action.type == Asc.c_oAscAsyncActionType.BlockInteraction) {\n\n if (loadMask && loadMask.el && loadMask.el.classList.contains('modal-in')) {\n loadMask.el.getElementsByClassName('dialog-title')[0].innerHTML = title;\n } else if ($$('.dialog-preloader').hasClass('modal-in')) {\n $$('.dialog-preloader').find('dialog-title').text(title);\n } else {\n loadMask = f7.dialog.preloader(title);\n }\n }\n\n };\n\n const onConfirmAction = (id, apiCallback, data) => {\n const api = Common.EditorApi.get();\n\n if (id === Asc.c_oAscConfirm.ConfirmReplaceRange || id === Asc.c_oAscConfirm.ConfirmReplaceFormulaInTable) {\n f7.dialog.create({\n title: _t.notcriticalErrorTitle,\n text: id == Asc.c_oAscConfirm.ConfirmReplaceRange ? _t.confirmMoveCellRange : _t.confirmReplaceFormulaInTable,\n buttons: [\n {text: _t.textYes,\n onClick: () => {\n if (apiCallback) apiCallback(true);\n }},\n {text: _t.textNo,\n onClick: () => {\n if (apiCallback) apiCallback(false);\n }}\n ],\n }).open();\n } else if (id === Asc.c_oAscConfirm.ConfirmPutMergeRange) {\n f7.dialog.create({\n title: _t.notcriticalErrorTitle,\n text: _t.confirmPutMergeRange,\n buttons: [\n {text: _t.textOk,\n onClick: () => {\n if (apiCallback) apiCallback();\n }},\n ],\n }).open();\n } else if (id == Asc.c_oAscConfirm.ConfirmChangeProtectRange) {\n f7.dialog.create({\n title: t('LongActions.textUnlockRange'),\n text: t('LongActions.textUnlockRangeWarning'),\n content: Device.ios ?\n '' : '',\n buttons: [\n {\n text: t('LongActions.textOk'),\n onClick: () => {\n let password = document.getElementById('modal-password').value;\n if(apiCallback) {\n api.asc_checkProtectedRangesPassword(password, data, (res) => {\n apiCallback(res, false);\n });\n }\n }\n }, \n {\n text: t('LongActions.textCancel'),\n onClick: () => apiCallback(false, true)\n }\n ]\n }).open();\n } else if (id === Asc.c_oAscConfirm.ConfirmMaxChangesSize) {\n f7.dialog.create({\n title: _t.notcriticalErrorTitle,\n text: _t.confirmMaxChangesSize,\n buttons: [\n {text: _t.textUndo,\n onClick: () => {\n if (apiCallback) apiCallback(true);\n }\n },\n {text: _t.textContinue,\n onClick: () => {\n if (apiCallback) apiCallback(false);\n }\n }\n ],\n }).open();\n }\n };\n\n const onOpenDocument = (progress) => {\n if (loadMask && loadMask.el) {\n const $title = loadMask.el.getElementsByClassName('dialog-title')[0];\n const proc = (progress.asc_getCurrentFont() + progress.asc_getCurrentImage())/(progress.asc_getFontsCount() + progress.asc_getImagesCount());\n\n $title.innerHTML = `${_t.textLoadingDocument}: ${Math.min(Math.round(proc * 100), 100)}%`;\n }\n };\n\n return null;\n});\n\nexport default LongActionsController;","import React, { useEffect } from 'react';\nimport { inject } from 'mobx-react';\nimport { f7 } from 'framework7-react';\nimport { useTranslation } from 'react-i18next';\n\nconst ErrorController = inject('storeAppOptions','storeSpreadsheetInfo')(({storeAppOptions, storeSpreadsheetInfo, LoadingDocument}) => {\n const { t } = useTranslation();\n const _t = t(\"Error\", { returnObjects: true });\n\n useEffect(() => {\n const on_engine_created = k => { k.asc_registerCallback('asc_onError', onError); };\n\n const api = Common.EditorApi.get();\n if ( !api ) Common.Notifications.on('engineCreated', on_engine_created);\n else on_engine_created(api);\n\n return () => {\n const api = Common.EditorApi.get();\n if ( api ) api.asc_unregisterCallback('asc_onError', onError);\n\n Common.Notifications.off('engineCreated', on_engine_created);\n }\n });\n\n const onError = (id, level, errData) => {\n const api = Common.EditorApi.get();\n \n if (id === Asc.c_oAscError.ID.LoadingScriptError) {\n f7.notification.create({\n title: _t.criticalErrorTitle,\n text: _t.scriptLoadError,\n closeButton: true\n }).open();\n return;\n }\n\n Common.Notifications.trigger('preloader:close');\n Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument,true);\n\n const config = {\n closable: false\n };\n\n switch (id) {\n case Asc.c_oAscError.ID.Unknown:\n config.msg = _t.unknownErrorText;\n break;\n\n case Asc.c_oAscError.ID.ConvertationTimeout:\n config.msg = _t.convertationTimeoutText;\n break;\n\n case Asc.c_oAscError.ID.ConvertationOpenError:\n config.msg = _t.openErrorText;\n break;\n\n case Asc.c_oAscError.ID.ConvertationSaveError:\n config.msg = _t.saveErrorText;\n break;\n\n case Asc.c_oAscError.ID.DownloadError:\n config.msg = _t.downloadErrorText;\n break;\n\n case Asc.c_oAscError.ID.UplImageSize:\n config.msg = _t.uploadImageSizeMessage;\n break;\n\n case Asc.c_oAscError.ID.UplImageExt:\n config.msg = _t.uploadImageExtMessage;\n break;\n\n case Asc.c_oAscError.ID.UplImageFileCount:\n config.msg = _t.uploadImageFileCountMessage;\n break;\n\n case Asc.c_oAscError.ID.PastInMergeAreaError:\n config.msg = _t.pastInMergeAreaError;\n break;\n\n case Asc.c_oAscError.ID.FrmlWrongCountParentheses:\n config.msg = _t.errorWrongBracketsCount;\n config.closable = true;\n break;\n\n case Asc.c_oAscError.ID.FrmlWrongOperator:\n config.msg = _t.errorWrongOperator;\n config.closable = true;\n break;\n\n case Asc.c_oAscError.ID.FrmlWrongMaxArgument:\n config.msg = _t.errorCountArgExceed;\n config.closable = true;\n break;\n\n case Asc.c_oAscError.ID.FrmlWrongCountArgument:\n config.msg = _t.errorCountArg;\n config.closable = true;\n break;\n\n case Asc.c_oAscError.ID.FrmlWrongFunctionName:\n config.msg = _t.errorFormulaName;\n config.closable = true;\n break;\n\n case Asc.c_oAscError.ID.FrmlAnotherParsingError:\n config.msg = _t.errorFormulaParsing;\n config.closable = true;\n break;\n\n case Asc.c_oAscError.ID.FrmlWrongArgumentRange:\n config.msg = _t.errorArgsRange;\n config.closable = true;\n break;\n\n case Asc.c_oAscError.ID.UnexpectedGuid:\n config.msg = _t.errorUnexpectedGuid;\n break;\n\n case Asc.c_oAscError.ID.FileRequest:\n config.msg = _t.errorFileRequest;\n break;\n\n case Asc.c_oAscError.ID.FileVKey:\n config.msg = _t.errorFileVKey;\n break;\n\n case Asc.c_oAscError.ID.MaxDataPointsError:\n config.msg = _t.errorMaxPoints;\n break;\n\n case Asc.c_oAscError.ID.FrmlOperandExpected:\n config.msg = _t.errorOperandExpected;\n config.closable = true;\n break;\n\n case Asc.c_oAscError.ID.CannotMoveRange:\n config.msg = _t.errorMoveRange;\n break;\n\n case Asc.c_oAscError.ID.AutoFilterDataRangeError:\n config.msg = _t.errorAutoFilterDataRange;\n break;\n\n case Asc.c_oAscError.ID.AutoFilterChangeFormatTableError:\n config.msg = _t.errorAutoFilterChangeFormatTable;\n break;\n\n case Asc.c_oAscError.ID.AutoFilterChangeError:\n config.msg = _t.errorAutoFilterChange;\n break;\n\n case Asc.c_oAscError.ID.AutoFilterMoveToHiddenRangeError:\n config.msg = _t.errorAutoFilterHiddenRange;\n break;\n\n case Asc.c_oAscError.ID.CannotFillRange:\n config.msg = _t.errorFillRange;\n break;\n\n case Asc.c_oAscError.ID.InvalidReferenceOrName:\n config.msg = _t.errorInvalidRef;\n break;\n\n case Asc.c_oAscError.ID.LockCreateDefName:\n config.msg = _t.errorCreateDefName;\n break;\n\n case Asc.c_oAscError.ID.PasteMaxRangeError:\n config.msg = _t.errorPasteMaxRange;\n break;\n \n case Asc.c_oAscError.ID.LockedCellPivot:\n config.msg = _t.errorLockedCellPivot;\n break;\n\n case Asc.c_oAscError.ID.PivotLabledColumns:\n config.msg = t('Error.errorLabledColumnsPivot');\n break;\n\n case Asc.c_oAscError.ID.PivotOverlap:\n config.msg = t('Error.errorPivotOverlap');\n break;\n\n case Asc.c_oAscError.ID.ForceSaveButton:\n case Asc.c_oAscError.ID.ForceSaveTimeout:\n config.msg = t('Error.errorForceSave');\n break;\n\n case Asc.c_oAscError.ID.LockedAllError:\n config.msg = _t.errorLockedAll;\n break;\n\n case Asc.c_oAscError.ID.LockedWorksheetRename:\n config.msg = _t.errorLockedWorksheetRename;\n break;\n\n case Asc.c_oAscError.ID.OpenWarning:\n config.msg = _t.errorOpenWarning;\n break;\n\n case Asc.c_oAscError.ID.FrmlWrongReferences:\n config.msg = _t.errorFrmlWrongReferences;\n config.closable = true;\n break;\n\n case Asc.c_oAscError.ID.CopyMultiselectAreaError:\n config.msg = _t.errorCopyMultiselectArea;\n break;\n\n case Asc.c_oAscError.ID.PrintMaxPagesCount:\n config.msg = _t.errorPrintMaxPagesCount;\n break;\n\n case Asc.c_oAscError.ID.CannotChangeFormulaArray:\n config.msg = _t.errorChangeArray;\n break;\n\n case Asc.c_oAscError.ID.MultiCellsInTablesFormulaArray:\n config.msg = _t.errorMultiCellFormula;\n break;\n\n case Asc.c_oAscError.ID.MailToClientMissing:\n config.msg = t('Error.errorEmailClient');\n break;\n\n case Asc.c_oAscError.ID.NoDataToParse:\n config.msg = t('Error.errorNoDataToParse');\n break;\n\n case Asc.c_oAscError.ID.CannotUngroupError:\n config.msg = t('Error.errorCannotUngroup');\n break;\n\n case Asc.c_oAscError.ID.FrmlMaxTextLength:\n config.msg = _t.errorFrmlMaxTextLength;\n break;\n\n case Asc.c_oAscError.ID.FrmlMaxLength:\n config.msg = _t.errorFrmlMaxLength;\n break;\n\n case Asc.c_oAscError.ID.MoveSlicerError:\n config.msg = t('Error.errorMoveSlicerError');\n break;\n\n case Asc.c_oAscError.ID.LockedEditView:\n config.msg = t('Error.errorEditView');\n break;\n\n case Asc.c_oAscError.ID.ChangeFilteredRangeError:\n config.msg = t('Error.errorChangeFilteredRange');\n break;\n\n case Asc.c_oAscError.ID.FrmlMaxReference:\n config.msg = _t.errorFrmlMaxReference;\n break;\n\n case Asc.c_oAscError.ID.DataValidate:\n errData && errData.asc_getErrorTitle() && (config.title = Common.Utils.String.htmlEncode(errData.asc_getErrorTitle()));\n config.buttons = [t('Error.textOk'), t('Error.textCancel')];\n config.msg = errData && errData.asc_getError() ? Common.Utils.String.htmlEncode(errData.asc_getError()) : _t.errorDataValidate;\n break;\n\n case Asc.c_oAscError.ID.VKeyEncrypt:\n config.msg = _t.errorToken;\n break;\n\n case Asc.c_oAscError.ID.KeyExpire:\n config.msg = _t.errorTokenExpire;\n break;\n\n case Asc.c_oAscError.ID.UserCountExceed:\n config.msg = _t.errorUsersExceed;\n break;\n\n case Asc.c_oAscError.ID.CoAuthoringDisconnect:\n config.msg = _t.errorViewerDisconnect;\n break;\n\n case Asc.c_oAscError.ID.ConvertationPassword:\n config.msg = _t.errorFilePassProtect;\n break;\n\n case Asc.c_oAscError.ID.StockChartError:\n config.msg = _t.errorStockChart;\n break;\n\n case Asc.c_oAscError.ID.MaxDataSeriesError:\n config.msg = t('Error.errorMaxRows');\n break;\n\n case Asc.c_oAscError.ID.ComboSeriesError:\n config.msg = t('Error.errorComboSeries');\n break;\n\n case Asc.c_oAscError.ID.DataRangeError:\n config.msg = _t.errorDataRange;\n break;\n\n case Asc.c_oAscError.ID.Database:\n config.msg = _t.errorDatabaseConnection;\n break;\n\n case Asc.c_oAscError.ID.UserDrop:\n const lostEditingRights = storeAppOptions.lostEditingRights;\n if (lostEditingRights) {\n storeAppOptions.changeEditingRights(false);\n return;\n }\n storeAppOptions.changeEditingRights(true);\n config.msg = _t.errorUserDrop;\n break;\n\n case Asc.c_oAscError.ID.Warning:\n config.msg = _t.errorConnectToServer;\n break;\n\n case Asc.c_oAscError.ID.UplImageUrl:\n config.msg = _t.errorBadImageUrl;\n break;\n\n case Asc.c_oAscError.ID.SessionAbsolute:\n config.msg = _t.errorSessionAbsolute;\n break;\n\n case Asc.c_oAscError.ID.SessionIdle:\n config.msg = _t.errorSessionIdle;\n break;\n\n case Asc.c_oAscError.ID.SessionToken:\n config.msg = _t.errorSessionToken;\n break;\n\n case Asc.c_oAscError.ID.DataEncrypted:\n config.msg = _t.errorDataEncrypted;\n break;\n\n case Asc.c_oAscError.ID.AccessDeny:\n config.msg = _t.errorAccessDeny;\n break;\n\n case Asc.c_oAscError.ID.EditingError:\n config.msg = _t.errorEditingDownloadas;\n break;\n\n case Asc.c_oAscError.ID.ConvertationOpenLimitError:\n config.msg = _t.errorFileSizeExceed;\n break;\n\n case Asc.c_oAscError.ID.UpdateVersion:\n config.msg = _t.errorUpdateVersionOnDisconnect;\n break;\n\n case Asc.c_oAscError.ID.FTChangeTableRangeError:\n config.msg = t('Error.errorFTChangeTableRangeError');\n break;\n\n case Asc.c_oAscError.ID.FTRangeIncludedOtherTables:\n config.msg = t('Error.errorFTRangeIncludedOtherTables');\n break;\n\n case Asc.c_oAscError.ID.PasteSlicerError:\n config.msg = t('Error.errorPasteSlicerError');\n break;\n\n case Asc.c_oAscError.ID.RemoveDuplicates:\n config.iconCls = 'info';\n config.title = t('Error.textInformation');\n config.msg = (errData.asc_getDuplicateValues() !== null && errData.asc_getUniqueValues() !== null) ? t('Error.errRemDuplicates').replace(\"{0}\", errData.asc_getDuplicateValues()).replace(\"{1}\", errData.asc_getUniqueValues()) : t('Error.errNoDuplicates');\n break;\n \n case Asc.c_oAscError.ID.ChangeOnProtectedSheet:\n config.msg = t('Error.errorChangeOnProtectedSheet');\n break;\n\n case Asc.c_oAscError.ID.SingleColumnOrRowError:\n config.msg = t('Error.errorSingleColumnOrRowError');\n break;\n\n case Asc.c_oAscError.ID.LocationOrDataRangeError:\n config.msg = t('Error.errorLocationOrDataRangeError');\n break;\n\n case Asc.c_oAscError.ID.LoadingFontError:\n config.msg = _t.errorLoadingFont;\n break;\n\n case Asc.c_oAscError.ID.FillAllRowsWarning:\n let fill = errData[0],\n have = errData[1],\n lang = (storeAppOptions.lang || 'en').replace('_', '-').toLowerCase(),\n fillWithSeparator;\n\n try {\n fillWithSeparator = fill.toLocaleString(lang);\n } catch (e) {\n lang = 'en';\n fillWithSeparator = fill.toLocaleString(lang);\n }\n\n if (storeAppOptions.isDesktopApp && storeAppOptions.isOffline) {\n config.msg = fill > have ? \n t('Error.textFormulaFilledAllRowsWithEmpty').replace('{0}', fillWithSeparator) :\n t('Error.textFormulaFilledAllRows').replace('{0}', fillWithSeparator);\n config.buttons = [\n {caption: this.textFillOtherRows, primary: true, value: 'fillOther'}, {caption: t('Error.textClose')}\n ];\n } else {\n config.msg = fill >= have ? \n t('Error.textFormulaFilledFirstRowsOtherIsEmpty').replace('{0}', fillWithSeparator) :\n t('Error.textFormulaFilledFirstRowsOtherHaveData').replace('{0}', fillWithSeparator).replace('{1}', (have - fill).toLocaleString(lang));\n }\n break;\n\n case Asc.c_oAscError.ID.PasswordIsNotCorrect:\n config.msg = t('Error.textErrorPasswordIsNotCorrect');\n break;\n \n case Asc.c_oAscError.ID.UplDocumentSize:\n config.msg = t('Error.uploadDocSizeMessage');\n break;\n\n case Asc.c_oAscError.ID.DeleteColumnContainsLockedCell:\n config.msg = t('Error.errorDeleteColumnContainsLockedCell');\n break;\n\n case Asc.c_oAscError.ID.DeleteRowContainsLockedCell:\n config.msg = t('Error.errorDeleteRowContainsLockedCell');\n break;\n\n case Asc.c_oAscError.ID.UplDocumentFileCount:\n config.msg = t('Error.uploadDocFileCountMessage');\n break;\n\n case Asc.c_oAscError.ID.UplDocumentExt:\n config.msg = t('Error.uploadDocExtMessage');\n break;\n\n case Asc.c_oAscError.ID.Password:\n config.msg = t('Error.errorSetPassword');\n break;\n\n case Asc.c_oAscError.ID.PivotGroup:\n config.msg = t('Error.errorPivotGroup');\n break;\n\n case Asc.c_oAscError.ID.PasteMultiSelectError:\n config.msg = t('Error.errorPasteMultiSelect');\n break;\n\n case Asc.c_oAscError.ID.CannotUseCommandProtectedSheet:\n config.msg = t('Error.errorCannotUseCommandProtectedSheet');\n break;\n\n case Asc.c_oAscError.ID.PivotWithoutUnderlyingData:\n config.msg = t('Error.errorPivotWithoutUnderlying');\n break;\n\n case Asc.c_oAscError.ID.DirectUrl:\n config.msg = _t.errorDirectUrl;\n break;\n\n case Asc.c_oAscError.ID.ConvertationOpenFormat:\n let docExt = storeSpreadsheetInfo.dataDoc ? storeSpreadsheetInfo.dataDoc.fileType || '' : '';\n if (errData === 'pdf')\n config.msg = _t.errorInconsistentExtPdf.replace('%1', docExt);\n else if (errData === 'docx')\n config.msg = _t.errorInconsistentExtDocx.replace('%1', docExt);\n else if (errData === 'xlsx')\n config.msg = _t.errorInconsistentExtXlsx.replace('%1', docExt);\n else if (errData === 'pptx')\n config.msg = _t.errorInconsistentExtPptx.replace('%1', docExt);\n else\n config.msg = _t.errorInconsistentExt;\n break;\n\n case Asc.c_oAscError.ID.ProtectedRangeByOtherUser:\n config.msg = t('Error.errorProtectedRange');\n break;\n\n case Asc.c_oAscError.ID.TraceDependentsNoFormulas:\n config.msg = t('Error.errorDependentsNoFormulas');\n break;\n\n case Asc.c_oAscError.ID.TracePrecedentsNoValidReference:\n config.msg = t('Error.errorPrecedentsNoValidRef');\n break;\n\n default:\n config.msg = _t.errorDefaultMessage.replace('%1', id);\n break;\n }\n\n if (level === Asc.c_oAscError.Level.Critical) {\n\n // report only critical errors\n Common.Gateway.reportError(id, config.msg);\n\n config.title = _t.criticalErrorTitle;\n\n if (storeAppOptions.canBackToFolder && !storeAppOptions.isDesktopApp) {\n config.msg += '' + _t.criticalErrorExtText;\n config.callback = function() {\n Common.Notifications.trigger('goback', true);\n }\n }\n if (id === Asc.c_oAscError.ID.DataEncrypted) {\n api.asc_coAuthoringDisconnect();\n Common.Notifications.trigger('api:disconnect');\n }\n }\n else {\n Common.Gateway.reportWarning(id, config.msg);\n\n config.title = config.title || _t.notcriticalErrorTitle;\n config.buttons = config.buttons || [t('Error.textOk')];\n config.callback = (_, btn) => {\n if (id == Asc.c_oAscError.ID.DataValidate && btn.target.textContent !== 'OK') {\n api.asc_closeCellEditor(true);\n }\n storeAppOptions.changeEditingRights(false);\n };\n }\n\n f7.dialog.create({\n cssClass: 'error-dialog',\n title : config.title,\n text : config.msg,\n buttons: config.buttons ? config.buttons.map(button => (\n {\n text: button,\n onClick: (_, btn) => config.callback(_, btn)\n }\n )) : [\n {\n text: t('Error.textOk'),\n onClick: (dlg, _) => dlg.close()\n }\n ]\n }).open();\n\n Common.component.Analytics.trackEvent('Internal Error', id.toString());\n };\n\n return null\n});\n\nexport default ErrorController;","import React, { useEffect, useState } from 'react';\r\nimport { inject, observer } from 'mobx-react';\r\nimport { f7 } from 'framework7-react';\r\nimport { Device } from '../../utils/device';\r\n\r\nconst PluginsController = inject('storeAppOptions')(observer(props => {\r\n const { storeAppOptions } = props;\r\n let configPlugins = {autostart:[]},\r\n serverPlugins = {autostart:[]},\r\n modal,\r\n iframe;\r\n\r\n useEffect(() => {\r\n Common.Notifications.on('engineCreated', api => {\r\n api.asc_registerCallback(\"asc_onPluginShow\", showPluginModal);\r\n api.asc_registerCallback(\"asc_onPluginClose\", pluginClose);\r\n api.asc_registerCallback(\"asc_onPluginResize\", pluginResize);\r\n api.asc_registerCallback('asc_onPluginsInit', onPluginsInit);\r\n\r\n if(!storeAppOptions.customization || storeAppOptions.plugins !== false) {\r\n loadPlugins();\r\n }\r\n });\r\n\r\n Common.Gateway.on('init', loadConfig);\r\n\r\n return () => {\r\n const api = Common.EditorApi.get();\r\n\r\n if ( api ) {\r\n api.asc_unregisterCallback(\"asc_onPluginShow\", showPluginModal);\r\n api.asc_unregisterCallback(\"asc_onPluginClose\", pluginClose);\r\n api.asc_unregisterCallback(\"asc_onPluginResize\", pluginResize);\r\n api.asc_unregisterCallback('asc_onPluginsInit', onPluginsInit);\r\n }\r\n };\r\n });\r\n\r\n const onDlgBtnClick = e => {\r\n const api = Common.EditorApi.get();\r\n let index = $$(e.currentTarget).index();\r\n api.asc_pluginButtonClick(index);\r\n };\r\n\r\n const showPluginModal = (plugin, variationIndex, frameId, urlAddition) => {\r\n let isAndroid = Device.android;\r\n let variation = plugin.get_Variations()[variationIndex];\r\n\r\n if (variation.get_Visual()) {\r\n let url = variation.get_Url();\r\n url = ((plugin.get_BaseUrl().length == 0) ? url : plugin.get_BaseUrl()) + url;\r\n\r\n if (urlAddition)\r\n url += urlAddition;\r\n\r\n let isCustomWindow = variation.get_CustomWindow(),\r\n arrBtns = variation.get_Buttons(),\r\n newBtns = [],\r\n size = variation.get_Size();\r\n\r\n if (arrBtns.length) {\r\n arrBtns.forEach((b, index) => {\r\n if ((storeAppOptions.isEdit || b.isViewer !== false)) {\r\n newBtns[index] = {\r\n text: b.text,\r\n attributes: {result: index},\r\n close: false\r\n };\r\n }\r\n });\r\n }\r\n\r\n f7.popover.close('.document-menu.modal-in', false);\r\n\r\n modal = f7.dialog.create({\r\n title: '',\r\n text: '',\r\n content: ''+'
',\r\n buttons : isCustomWindow ? undefined : newBtns\r\n }).open();\r\n\r\n iframe = document.createElement(\"iframe\");\r\n\r\n iframe.id = frameId;\r\n iframe.name = 'pluginFrameEditor';\r\n iframe.width = '100%';\r\n iframe.height = '100%';\r\n iframe.align = \"top\";\r\n iframe.frameBorder = 0;\r\n iframe.scrolling = \"no\";\r\n iframe.src = url;\r\n\r\n $$('#plugin-frame').append(iframe);\r\n \r\n modal.$el.find('.dialog-button').on('click', onDlgBtnClick);\r\n\r\n modal.$el.css({\r\n margin: '0',\r\n width: '90%',\r\n left: '5%',\r\n height: 'auto'\r\n });\r\n\r\n modal.$el.find('.dialog-inner').css({padding: '0'});\r\n\r\n if (Device.phone) {\r\n let height = Math.min(size[1], 240);\r\n modal.$el.find('#plugin-frame').css({height: height + 'px'});\r\n } else {\r\n let height = Math.min(size[1], 500);\r\n modal.$el.find('#plugin-frame').css({height: height + 'px'});\r\n }\r\n\r\n if (isAndroid) {\r\n $$('.view.collaboration-root-view.navbar-through').removeClass('navbar-through').addClass('navbar-fixed');\r\n $$('.view.collaboration-root-view .navbar').prependTo('.view.collaboration-root-view > .pages > .page');\r\n }\r\n }\r\n };\r\n\r\n const pluginClose = plugin => {\r\n if (plugin && modal) {\r\n modal.close();\r\n }\r\n };\r\n\r\n const pluginResize = size => {\r\n if (Device.phone) {\r\n let height = Math.min(size[1], 240);\r\n modal.$el.find('#plugin-frame').css({height: height + 'px'});\r\n } else {\r\n let height = Math.min(size[1], 500);\r\n modal.$el.find('#plugin-frame').css({height: height + 'px'});\r\n }\r\n };\r\n\r\n const getPlugins = (pluginsData, fetchFunction) => {\r\n if (!pluginsData || pluginsData.length < 1)\r\n return Promise.resolve([]);\r\n\r\n fetchFunction = fetchFunction || function (url) {\r\n return fetch(url)\r\n .then(function(response) {\r\n if (response.ok) return response.json();\r\n else return Promise.reject(url);\r\n }).then(function(json) {\r\n json.baseUrl = url.substring(0, url.lastIndexOf(\"config.json\"));\r\n return json;\r\n });\r\n };\r\n\r\n let loaded = [];\r\n\r\n return pluginsData.map(fetchFunction).reduce(function (previousPromise, currentPromise) {\r\n return previousPromise\r\n .then(function()\r\n {\r\n return currentPromise;\r\n })\r\n .then(function(item)\r\n {\r\n loaded.push(item);\r\n return Promise.resolve(item);\r\n })\r\n .catch(function(item)\r\n {\r\n return Promise.resolve(item);\r\n });\r\n\r\n }, Promise.resolve())\r\n .then(function ()\r\n {\r\n return Promise.resolve(loaded);\r\n });\r\n };\r\n\r\n const loadConfig = data => {\r\n configPlugins.config = data.config.plugins;\r\n };\r\n\r\n const onPluginsInit = pluginsdata => {\r\n !(pluginsdata instanceof Array) && (pluginsdata = pluginsdata[\"pluginsData\"]);\r\n parsePlugins(pluginsdata)\r\n };\r\n\r\n const parsePlugins = pluginsdata => {\r\n let isEdit = storeAppOptions.isEdit;\r\n \r\n if (pluginsdata instanceof Array) { \r\n let lang = storeAppOptions.lang ? storeAppOptions.lang.split(/[\\-_]/)[0] : 'en';\r\n pluginsdata.forEach((item) => {\r\n item.variations.forEach( (itemVar) => { \r\n let description = itemVar.description;\r\n if (typeof itemVar.descriptionLocale == 'object')\r\n description = itemVar.descriptionLocale[lang] || itemVar.descriptionLocale['en'] || description || '';\r\n\r\n if(itemVar.buttons !== undefined) {\r\n itemVar.buttons.forEach( (button) => {\r\n if (typeof button.textLocale == 'object')\r\n button.text = button.textLocale[lang] || button.textLocale['en'] || button.text || '';\r\n button.visible = (isEdit || button.isViewer !== false);\r\n })\r\n }\r\n })\r\n });\r\n } \r\n registerPlugins(pluginsdata);\r\n };\r\n\r\n const registerPlugins = plugins => {\r\n let arr = [];\r\n\r\n plugins.forEach(item => {\r\n let plugin = new Asc.CPlugin();\r\n plugin.deserialize(item);\r\n arr.push(plugin);\r\n });\r\n\r\n const api = Common.EditorApi.get();\r\n api.asc_pluginsRegister('', arr);\r\n };\r\n\r\n const mergePlugins = () => {\r\n if (serverPlugins.plugins !== undefined && configPlugins.plugins !== undefined) {\r\n let arr = [],\r\n plugins = configPlugins;\r\n\r\n if (plugins.plugins && plugins.plugins.length > 0) {\r\n arr = plugins.plugins;\r\n }\r\n\r\n plugins = serverPlugins;\r\n\r\n if (plugins.plugins && plugins.plugins.length > 0) {\r\n arr = arr.concat(plugins.plugins);\r\n }\r\n\r\n parsePlugins(arr);\r\n }\r\n };\r\n\r\n const loadPlugins = () => {\r\n if (configPlugins.config) {\r\n getPlugins(configPlugins.config.pluginsData)\r\n .then(function(loaded)\r\n {\r\n configPlugins.plugins = loaded;\r\n mergePlugins();\r\n });\r\n if (configPlugins.config.options) {\r\n const api = Common.EditorApi.get();\r\n api && api.setPluginsOptions(configPlugins.config.options);\r\n }\r\n } else {\r\n configPlugins.plugins = false;\r\n }\r\n\r\n let server_plugins_url = '../../../../plugins.json';\r\n\r\n Common.Utils.loadConfig(server_plugins_url, function (obj) {\r\n if (obj != 'error') {\r\n serverPlugins.config = obj;\r\n getPlugins(serverPlugins.config.pluginsData)\r\n .then(function(loaded)\r\n {\r\n serverPlugins.plugins = loaded;\r\n mergePlugins();\r\n });\r\n } else\r\n serverPlugins.plugins = false;\r\n });\r\n };\r\n\r\n return <>>\r\n}));\r\n\r\nexport default PluginsController;\r\n\r\n\r\n\r\n","import React, {Component, useEffect, useState} from 'react';\r\nimport { f7, Page, Navbar, List, ListItem, BlockTitle, ListButton, Popover, Popup, View, Link } from \"framework7-react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Device } from '../../../../common/mobile/utils/device';\r\n\r\nconst PageEncoding = props => {\r\n const { t } = useTranslation();\r\n const _t = t(\"View.Settings\", { returnObjects: true });\r\n const encodeData = props.encodeData;\r\n const valuesDelimeter = props.valuesDelimeter;\r\n const namesDelimeter = props.namesDelimeter;\r\n const [stateEncoding, setStateEncoding] = useState(props.valueEncoding);\r\n const [stateDelimeter, setStateDelimeter] = useState(props.valueDelimeter);\r\n const getIndexNameEncoding = () => encodeData.findIndex(encoding => encoding.value === stateEncoding);\r\n const nameEncoding = encodeData[getIndexNameEncoding()].displayValue;\r\n const nameDelimeter = namesDelimeter[valuesDelimeter.indexOf(stateDelimeter)];\r\n const mode = props.mode;\r\n\r\n const changeStateEncoding = value => {\r\n setStateEncoding(value);\r\n }\r\n\r\n const changeStateDelimeter = value => {\r\n setStateDelimeter(value);\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {_t.textDelimeter}\r\n \r\n \r\n
\r\n {_t.textEncoding}\r\n \r\n \r\n
\r\n \r\n {mode === 2 ? \r\n props.closeModal()}>\r\n : null}\r\n props.onSaveFormat(stateEncoding, stateDelimeter)}>\r\n
\r\n \r\n \r\n \r\n )\r\n};\r\n\r\nconst PageEncodingList = props => {\r\n const { t } = useTranslation();\r\n const _t = t(\"View.Settings\", { returnObjects: true });\r\n const [currentEncoding, changeCurrentEncoding] = useState(props.stateEncoding);\r\n const encodeData = props.encodeData;\r\n \r\n return (\r\n \r\n \r\n {_t.textChooseEncoding}\r\n \r\n {encodeData.map((encoding, index) => {\r\n return (\r\n {\r\n changeCurrentEncoding(encoding.value);\r\n props.changeStateEncoding(encoding.value);\r\n f7.views.current.router.back();\r\n }}>\r\n )\r\n })}\r\n
\r\n \r\n )\r\n};\r\n\r\nconst PageDelimeterList = props => {\r\n const { t } = useTranslation();\r\n const _t = t(\"View.Settings\", { returnObjects: true });\r\n const [currentDelimeter, changeCurrentDelimeter] = useState(props.stateDelimeter);\r\n const namesDelimeter = props.namesDelimeter;\r\n const valuesDelimeter = props.valuesDelimeter;\r\n \r\n return (\r\n \r\n \r\n {_t.textChooseDelimeter}\r\n \r\n {namesDelimeter.map((name, index) => {\r\n return (\r\n {\r\n changeCurrentDelimeter(valuesDelimeter[index]);\r\n props.changeStateDelimeter(valuesDelimeter[index]);\r\n f7.views.current.router.back();\r\n }}>\r\n )\r\n })}\r\n
\r\n \r\n )\r\n};\r\n\r\nclass EncodingView extends Component {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nconst routes = [\r\n {\r\n path: '/encoding-list/',\r\n component: PageEncodingList\r\n },\r\n {\r\n path: '/delimeter-list/',\r\n component: PageDelimeterList\r\n }\r\n];\r\n\r\nconst Encoding = props => {\r\n useEffect(() => {\r\n f7.popup.open('.encoding-popup');\r\n \r\n return () => {\r\n }\r\n });\r\n\r\n return (\r\n \r\n )\r\n};\r\n\r\nexport {Encoding, PageEncodingList, PageDelimeterList}","import React, { Component } from 'react';\r\nimport { Device } from '../../../../common/mobile/utils/device';\r\nimport { f7 } from \"framework7-react\";\r\nimport { Encoding } from \"../view/Encoding\";\r\nimport { withTranslation } from 'react-i18next';\r\n\r\nclass EncodingController extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.valuesDelimeter = [4, 2, 3, 1, 5];\r\n this.onSaveFormat = this.onSaveFormat.bind(this);\r\n this.closeModal = this.closeModal.bind(this);\r\n this.state = {\r\n isOpen: false\r\n };\r\n\r\n Common.Notifications.on('engineCreated', api => {\r\n api.asc_registerCallback('asc_onAdvancedOptions', (type, advOptions, mode, formatOptions) => {\r\n this.initEncoding(type, advOptions, mode, formatOptions);\r\n });\r\n });\r\n\r\n Common.Notifications.on('openEncoding', (type, advOptions, mode, formatOptions) => {\r\n this.initEncoding(type, advOptions, mode, formatOptions);\r\n });\r\n }\r\n\r\n initEncoding(type, advOptions, mode, formatOptions) {\r\n const { t } = this.props;\r\n const _t = t(\"View.Settings\", { returnObjects: true });\r\n \r\n if(type === Asc.c_oAscAdvancedOptionsID.CSV) {\r\n Common.Notifications.trigger('preloader:close');\r\n Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256, true);\r\n\r\n this.mode = mode;\r\n this.advOptions = advOptions;\r\n this.formatOptions = formatOptions;\r\n this.encodeData = [];\r\n this.namesDelimeter = [_t.txtComma, _t.txtSemicolon, _t.txtColon, _t.txtTab, _t.txtSpace];\r\n \r\n const recommendedSettings = this.advOptions.asc_getRecommendedSettings();\r\n\r\n this.initEncodeData();\r\n this.valueEncoding = recommendedSettings.asc_getCodePage();\r\n this.valueDelimeter = recommendedSettings && recommendedSettings.asc_getDelimiter() ? recommendedSettings.asc_getDelimiter() : 4;\r\n \r\n this.setState({\r\n isOpen: true\r\n });\r\n }\r\n }\r\n\r\n initEncodeData() {\r\n for (let page of this.advOptions.asc_getCodePages()) {\r\n this.encodeData.push({\r\n value: page.asc_getCodePage(),\r\n displayValue: page.asc_getCodePageName(),\r\n lcid: page.asc_getLcid()\r\n });\r\n }\r\n }\r\n\r\n closeModal() {\r\n f7.sheet.close('.encoding-popup', true);\r\n this.setState({isOpen: false});\r\n }\r\n\r\n onSaveFormat(valueEncoding, valueDelimeter) {\r\n const api = Common.EditorApi.get();\r\n\r\n this.closeModal();\r\n\r\n if(this.mode === 2) {\r\n this.formatOptions && this.formatOptions.asc_setAdvancedOptions(new Asc.asc_CTextOptions(valueEncoding, valueDelimeter));\r\n api.asc_DownloadAs(this.formatOptions);\r\n } else {\r\n api.asc_setAdvancedOptions(Asc.c_oAscAdvancedOptionsID.CSV, new Asc.asc_CTextOptions(valueEncoding, valueDelimeter));\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n this.state.isOpen &&\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withTranslation()(EncodingController);","import React, {Component, useEffect, useState} from 'react';\nimport { f7, Page, Navbar, List, ListItem, BlockTitle, ListButton, Popover, Popup, View, Link, Sheet } from \"framework7-react\";\nimport { Device } from '../../../../common/mobile/utils/device';\n\nconst PageDropdownList = props => {\n const listItems = props.listItems;\n\n return (\n \n \n \n {listItems.length && listItems.map((elem, index) => (\n props.onChangeItemList(elem.value)}>\n ))} \n
\n \n \n );\n};\n\nclass DropdownListView extends Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n return (\n Device.isPhone ? \n \n \n \n : \n \n \n \n \n );\n }\n}\n\n\nconst DropdownList = props => {\n useEffect(() => {\n if(Device.isPhone) {\n f7.sheet.open('#dropdown-list-sheet', true);\n } else {\n f7.popover.open('#dropdown-list-popover', '#dropdown-list-target');\n }\n \n return () => {}\n });\n\n return (\n \n );\n};\n\nexport default DropdownList;","import React, { Component } from 'react';\nimport { Device } from '../../../../common/mobile/utils/device';\nimport { f7 } from \"framework7-react\";\nimport { withTranslation } from \"react-i18next\";\nimport DropdownList from \"../view/DropdownList\";\n\nclass DropdownListController extends Component {\n constructor(props) {\n super(props);\n this.onChangeItemList = this.onChangeItemList.bind(this);\n \n this.state = {\n isOpen: false\n };\n\n Common.Notifications.on('openDropdownList', (textArr, addArr) => {\n this.initDropdownList(textArr, addArr);\n });\n }\n\n initDropdownList(textArr, addArr) {\n this.listItems = textArr.map((item, index) => {\n return {\n caption: item, \n value: addArr ? addArr[index] : item\n };\n });\n\n this.setState({\n isOpen: true\n });\n }\n\n closeModal() {\n if(Device.isPhone) {\n f7.sheet.close('#dropdown-list-sheet', true);\n } else {\n f7.popover.close('#dropdown-list-popover', true);\n }\n\n this.setState({isOpen: false});\n }\n\n onChangeItemList(value) {\n const api = Common.EditorApi.get();\n\n this.closeModal();\n api.asc_insertInCell(value, Asc.c_oAscPopUpSelectorType.None, false);\n }\n\n render() {\n return (\n this.state.isOpen &&\n \n );\n }\n}\n\nexport default withTranslation()(DropdownListController);","\nimport React, { Component, Fragment } from 'react'\nimport { inject } from \"mobx-react\";\nimport { f7 } from 'framework7-react';\nimport { withTranslation } from 'react-i18next';\nimport CollaborationController from '../../../../common/mobile/lib/controller/collaboration/Collaboration.jsx'\nimport { onAdvancedOptions } from './settings/Download.jsx';\nimport EditorUIController from '../lib/patch';\nimport {\n AddCommentController,\n CommentsController,\n EditCommentController,\n ViewCommentsSheetsController\n} from \"../../../../common/mobile/lib/controller/collaboration/Comments\";\nimport {LocalStorage} from \"../../../../common/mobile/utils/LocalStorage.mjs\";\nimport LongActionsController from \"./LongActions\";\nimport ErrorController from \"./Error\";\nimport app from \"../page/app\";\nimport About from \"../../../../common/mobile/lib/view/About\";\nimport PluginsController from '../../../../common/mobile/lib/controller/Plugins.jsx';\nimport EncodingController from \"./Encoding\";\nimport DropdownListController from \"./DropdownList\";\nimport { StatusbarController } from \"./Statusbar\";\nimport { Device } from '../../../../common/mobile/utils/device';\nimport { Themes } from '../../../../common/mobile/lib/controller/Themes.jsx';\nimport { processArrayScripts } from '../../../../common/mobile/utils/processArrayScripts.js';\n\n@inject(\n \"users\",\n \"storeAppOptions\",\n \"storeFocusObjects\",\n \"storeCellSettings\",\n \"storeTextSettings\",\n \"storeChartSettings\",\n \"storeSpreadsheetSettings\",\n \"storeSpreadsheetInfo\",\n \"storeApplicationSettings\",\n \"storeToolbarSettings\",\n \"storeWorksheets\"\n )\nclass MainController extends Component {\n constructor(props) {\n super(props);\n window.editorType = 'sse';\n\n this.LoadingDocument = -256;\n this.ApplyEditRights = -255;\n this.InitApplication = -254;\n this.isShowOpenDialog = false;\n this.fallbackSdkTranslations = {\n \"Accent\": \"Accent\",\n \"Accent1\": \"Accent1\",\n \"Accent2\": \"Accent2\",\n \"Accent3\": \"Accent3\",\n \"Accent4\": \"Accent4\",\n \"Accent5\": \"Accent5\",\n \"Accent6\": \"Accent6\",\n \"20% - Accent1\": \"20% - Accent1\",\n \"20% - Accent2\": \"20% - Accent2\",\n \"20% - Accent3\": \"20% - Accent3\",\n \"20% - Accent4\": \"20% - Accent4\",\n \"20% - Accent5\": \"20% - Accent5\",\n \"20% - Accent6\": \"20% - Accent6\",\n \"40% - Accent1\": \"40% - Accent1\",\n \"40% - Accent2\": \"40% - Accent2\",\n \"40% - Accent3\": \"40% - Accent3\",\n \"40% - Accent4\": \"40% - Accent4\",\n \"40% - Accent5\": \"40% - Accent5\",\n \"40% - Accent6\": \"40% - Accent6\",\n \"60% - Accent1\": \"60% - Accent1\",\n \"60% - Accent2\": \"60% - Accent2\",\n \"60% - Accent3\": \"60% - Accent3\",\n \"60% - Accent4\": \"60% - Accent4\",\n \"60% - Accent5\": \"60% - Accent5\",\n \"60% - Accent6\": \"60% - Accent6\",\n \"(All)\": \"(All)\",\n \"Your text here\": \"Your text here\",\n \"(blank)\": \"(blank)\",\n \"%1 of %2\": \"%1 of %2\",\n \"Clear Filter (Alt+C)\": \"Clear Filter (Alt+C)\",\n \"Column Labels\": \"Column Labels\",\n \"Column\": \"Column\",\n \"Confidential\": \"Confidential\",\n \"Date\": \"Date\",\n \"Days\": \"Days\",\n \"Diagram Title\": \"Chart Title\",\n \"File\": \"File\",\n \"Grand Total\": \"Grand Total\",\n \"Group\": \"Group\",\n \"Hours\": \"Hours\",\n \"Minutes\": \"Minutes\",\n \"Months\": \"Months\",\n \"Multi-Select (Alt+S)\": \"Multi-Select (Alt+S)\",\n \"%1 or %2\": \"%1 or %2\",\n \"Page\": \"Page\",\n \"Page %1 of %2\": \"Page %1 of %2\",\n \"Pages\": \"Pages\",\n \"Prepared by\": \"Prepared by\",\n \"Print_Area\": \"Print_Area\",\n \"Qtr\": \"Qtr\",\n \"Quarters\": \"Quarters\",\n \"Row\": \"Row\",\n \"Row Labels\": \"Row Labels\",\n \"Seconds\": \"Seconds\",\n \"Series\": \"Series\",\n \"Bad\": \"Bad\",\n \"Calculation\": \"Calculation\",\n \"Check Cell\": \"Check Cell\",\n \"Comma\": \"Comma\",\n \"Comma [0]\": \"Comma [0]\",\n \"Currency\": \"Currency\",\n \"Currency [0]\": \"Currency [0]\",\n \"Explanatory Text\": \"Explanatory Text\",\n \"Good\": \"Good\",\n \"Heading 1\": \"Heading 1\",\n \"Heading 2\": \"Heading 2\",\n \"Heading 3\": \"Heading 3\",\n \"Heading 4\": \"Heading 4\",\n \"Input\": \"Input\",\n \"Linked Cell\": \"Linked Cell\",\n \"Neutral\": \"Neutral\",\n \"Normal\": \"Normal\",\n \"Note\": \"Note\",\n \"Output\": \"Output\",\n \"Percent\": \"Percent\",\n \"Title\": \"Title\",\n \"Total\": \"Total\",\n \"Warning Text\": \"Warning Text\",\n \"Tab\": \"Tab\",\n \"Table\": \"Table\",\n \"Time\": \"Time\",\n \"Values\": \"Values\",\n \"X Axis\": \"X Axis\",\n \"Y Axis\": \"Y Axis\",\n \"Years\": \"Years\"\n };\n let me = this;\n ['Aspect', 'Blue Green', 'Blue II', 'Blue Warm', 'Blue', 'Grayscale', 'Green Yellow', 'Green', 'Marquee', 'Median', 'Office 2007 - 2010', 'Office 2013 - 2022', 'Office',\n 'Orange Red', 'Orange', 'Paper', 'Red Orange', 'Red Violet', 'Red', 'Slipstream', 'Violet II', 'Violet', 'Yellow Orange', 'Yellow'].forEach(function(item){\n me.fallbackSdkTranslations[item] = item;\n });\n\n this._state = {\n licenseType: false,\n isDocModified: false\n };\n \n this.wsLockOptions = ['SelectLockedCells', 'SelectUnlockedCells', 'FormatCells', 'FormatColumns', 'FormatRows', 'InsertColumns', 'InsertRows', 'InsertHyperlinks', 'DeleteColumns',\n 'DeleteRows', 'Sort', 'AutoFilter', 'PivotTables', 'Objects', 'Scenarios'];\n\n this.defaultTitleText = __APP_TITLE_TEXT__;\n this.stackMacrosRequests = [];\n\n const { t } = this.props;\n this._t = t('Controller.Main', {returnObjects:true});\n }\n\n initSdk() {\n const on_load_scripts = () => {\n !window.sdk_scripts && (window.sdk_scripts = ['../../../../sdkjs/common/AllFonts.js',\n '../../../../sdkjs/cell/sdk-all-min.js']);\n let dep_scripts = [\n '../../../vendor/jquery/jquery.min.js',\n '../../../vendor/bootstrap/dist/js/bootstrap.min.js',\n '../../../vendor/underscore/underscore-min.js',\n '../../../vendor/xregexp/xregexp-all-min.js',\n '../../../vendor/socketio/socket.io.min.js'];\n dep_scripts.push(...window.sdk_scripts);\n\n const promise_get_script = (scriptpath) => {\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = scriptpath;\n script.onload = () => {\n resolve('ok');\n };\n script.onerror = () => {\n reject('error');\n };\n\n document.body.appendChild(script);\n });\n };\n\n const loadConfig = data => {\n const { t } = this.props;\n const _t = t('Controller.Main', {returnObjects:true});\n\n EditorUIController.isSupportEditFeature();\n\n this.editorConfig = Object.assign({}, this.editorConfig, data.config);\n this.appOptions.lang = this.editorConfig.lang;\n\n const appOptions = this.props.storeAppOptions;\n appOptions.setConfigOptions(this.editorConfig, _t);\n\n let value;\n if (appOptions.canRenameAnonymous) {\n value = LocalStorage.getItem(\"guest-username\");\n //Common.Utils.InternalSettings.set(\"guest-username\", value);\n //Common.Utils.InternalSettings.set(\"save-guest-username\", !!value);\n }\n\n value = LocalStorage.getItem(\"sse-settings-regional\");\n if (value !== null) {\n this.api.asc_setLocale(parseInt(value));\n } else {\n value = appOptions.region;\n value = Common.util.LanguageInfo.getLanguages().hasOwnProperty(value) ? value : Common.util.LanguageInfo.getLocalLanguageCode(value);\n if (value !== null) {\n value = parseInt(value);\n } else {\n value = (appOptions.lang) ? parseInt(Common.util.LanguageInfo.getLocalLanguageCode(appOptions.lang)) : 0x0409;\n }\n this.api.asc_setLocale(value);\n }\n\n if (appOptions.location == 'us' || appOptions.location == 'ca') {\n Common.Utils.Metric.setDefaultMetric(Common.Utils.Metric.c_MetricUnits.inch);\n }\n\n //if (!appOptions.customization || !(appOptions.customization.loaderName || appOptions.customization.loaderLogo))\n //$('#editor_sdk').append('');\n\n value = LocalStorage.getItem(\"sse-mobile-macros-mode\");\n if (value === null) {\n value = appOptions.customization ? appOptions.customization.macrosMode : 'warn';\n value = (value === 'enable') ? 1 : (value === 'disable' ? 2 : 0);\n } else {\n value = parseInt(value);\n }\n this.props.storeApplicationSettings.changeMacrosSettings(value);\n\n value = LocalStorage.getItem(\"sse-mobile-allow-macros-request\");\n this.props.storeApplicationSettings.changeMacrosRequest((value !== null) ? parseInt(value) : 0);\n };\n\n const loadDocument = data => {\n this.permissions = {};\n this.document = data.doc;\n\n let docInfo = {};\n\n if ( data.doc ) {\n this.permissions = Object.assign(this.permissions, data.doc.permissions);\n\n const _options = Object.assign({}, data.doc.options, this.editorConfig.actionLink || {});\n let _user = new Asc.asc_CUserInfo();\n const _userOptions = this.props.storeAppOptions.user;\n \n _user.put_Id(_userOptions.id);\n _user.put_FullName(_userOptions.fullname);\n _user.put_IsAnonymousUser(_userOptions.anonymous);\n\n docInfo = new Asc.asc_CDocInfo();\n docInfo.put_Id(data.doc.key);\n docInfo.put_Url(data.doc.url);\n docInfo.put_DirectUrl(data.doc.directUrl);\n docInfo.put_Title(data.doc.title);\n docInfo.put_Format(data.doc.fileType);\n docInfo.put_VKey(data.doc.vkey);\n docInfo.put_Options(_options);\n docInfo.put_UserInfo(_user);\n docInfo.put_CallbackUrl(this.editorConfig.callbackUrl);\n docInfo.put_Token(data.doc.token);\n docInfo.put_Permissions(data.doc.permissions);\n docInfo.put_EncryptedInfo(this.editorConfig.encryptionKeys);\n docInfo.put_Lang(this.editorConfig.lang);\n docInfo.put_Mode(this.editorConfig.mode);\n\n let coEditMode = !(this.editorConfig.coEditing && typeof this.editorConfig.coEditing == 'object') ? 'fast' : // fast by default\n this.editorConfig.mode === 'view' && this.editorConfig.coEditing.change!==false ? 'fast' : // if can change mode in viewer - set fast for using live viewer\n this.editorConfig.coEditing.mode || 'fast';\n docInfo.put_CoEditingMode(coEditMode);\n\n const appOptions = this.props.storeAppOptions;\n let enable = !appOptions.customization || (appOptions.customization.macros !== false);\n docInfo.asc_putIsEnabledMacroses(!!enable);\n enable = !appOptions.customization || (appOptions.customization.plugins!==false);\n docInfo.asc_putIsEnabledPlugins(!!enable);\n }\n\n this.api.asc_registerCallback('asc_onGetEditorPermissions', onEditorPermissions);\n this.api.asc_registerCallback('asc_onLicenseChanged', this.onLicenseChanged.bind(this));\n this.api.asc_registerCallback('asc_onMacrosPermissionRequest', this.onMacrosPermissionRequest.bind(this));\n this.api.asc_registerCallback('asc_onRunAutostartMacroses', this.onRunAutostartMacroses.bind(this));\n this.api.asc_setDocInfo(docInfo);\n this.api.asc_getEditorPermissions(this.editorConfig.licenseUrl, this.editorConfig.customerId);\n this.api.asc_enableKeyEvents(true);\n\n // Common.SharedSettings.set('document', data.doc);\n\n // Document Info\n\n const storeSpreadsheetInfo = this.props.storeSpreadsheetInfo;\n\n storeSpreadsheetInfo.setDataDoc(this.document);\n };\n\n const onEditorPermissions = params => {\n const licType = params.asc_getLicenseType();\n const { t } = this.props;\n // const _t = t('Controller.Main', { returnObjects:true });\n \n if (Asc.c_oLicenseResult.Expired === licType ||\n Asc.c_oLicenseResult.Error === licType ||\n Asc.c_oLicenseResult.ExpiredTrial === licType ||\n Asc.c_oLicenseResult.NotBefore === licType ||\n Asc.c_oLicenseResult.ExpiredLimited === licType) {\n\n f7.dialog.create({\n title: Asc.c_oLicenseResult.NotBefore === licType ? t('Controller.Main.titleLicenseNotActive') : t('Controller.Main.titleLicenseExp'),\n text: Asc.c_oLicenseResult.NotBefore === licType ? t('Controller.Main.warnLicenseBefore') : t('Controller.Main.warnLicenseExp')\n }).open();\n\n return;\n }\n\n this.appOptions.canLicense = (licType === Asc.c_oLicenseResult.Success || licType === Asc.c_oLicenseResult.SuccessLimit);\n\n const appOptions = this.props.storeAppOptions;\n appOptions.setPermissionOptions(this.document, licType, params, this.permissions, EditorUIController.isSupportEditFeature());\n\n this.applyMode(appOptions);\n\n this.api.asc_LoadDocument();\n\n //if (!me.appOptions.isEdit) {\n //me.hidePreloader();\n //me.onLongActionBegin(Asc.c_oAscAsyncActionType.BlockInteraction, LoadingDocument);\n //}\n };\n\n processArrayScripts(dep_scripts, promise_get_script)\n .then(() => {\n const { t } = this.props;\n let _translate = t('Controller.Main.SDK', { returnObjects:true })\n\n if (!(typeof _translate === 'object' && _translate !== null && Object.keys(_translate).length > 0)) {\n _translate = this.fallbackSdkTranslations\n }\n\n this.api = new Asc.spreadsheet_api({\n 'id-view': 'editor_sdk',\n 'id-input': 'idx-cell-content',\n 'mobile': true,\n 'translate': _translate\n });\n\n Common.Notifications.trigger('engineCreated', this.api);\n\n this.appOptions = {};\n this.bindEvents();\n\n let value = LocalStorage.getItem(\"sse-settings-fontrender\");\n if (value === null) value = window.devicePixelRatio > 1 ? '1' : '3';\n this.api.asc_setFontRenderingMode(parseInt(value));\n\n Common.Utils.Metric.setCurrentMetric(Common.Utils.Metric.c_MetricUnits.pt); // TODO: beautify c_MetricUnits\n\n Common.Gateway.on('init', loadConfig);\n Common.Gateway.on('showmessage', this.onExternalMessage.bind(this));\n Common.Gateway.on('opendocument', loadDocument);\n Common.Gateway.appReady();\n\n Common.Gateway.on('internalcommand', function(data) {\n if (data.command === 'hardBack') {\n if ($$('.modal-in').length > 0) {\n if ( !($$('.error-dialog.modal-in').length > 0) ) {\n f7.dialog.close();\n }\n Common.Gateway.internalMessage('hardBack', false);\n } else\n Common.Gateway.internalMessage('hardBack', true);\n }\n });\n Common.Gateway.internalMessage('listenHardBack');\n }, error => {\n console.log('promise failed ' + error);\n });\n };\n\n if ( About.developVersion() ) {\n const script = document.createElement(\"script\");\n script.src = \"../../../../sdkjs/develop/sdkjs/cell/scripts.js\";\n script.async = true;\n script.onload = on_load_scripts;\n script.onerror = () => {\n console.log('error load scripts');\n };\n\n document.body.appendChild(script);\n } else {\n on_load_scripts();\n }\n }\n\n bindEvents() {\n $$(window).on('resize', () => {\n this.api.asc_Resize();\n });\n\n $$(window).on('popover:open popup:open sheet:open actions:open searchbar:enable', () => {\n this.api.asc_enableKeyEvents(false);\n });\n\n this.api.asc_registerCallback('asc_onDocumentUpdateVersion', this.onUpdateVersion.bind(this));\n this.api.asc_registerCallback('asc_onServerVersion', this.onServerVersion.bind(this));\n this.api.asc_registerCallback('asc_onPrintUrl', this.onPrintUrl.bind(this));\n this.api.asc_registerCallback('asc_onPrint', this.onPrint.bind(this));\n this.api.asc_registerCallback('asc_onDocumentName', this.onDocumentName.bind(this));\n this.api.asc_registerCallback('asc_onEndAction', this._onLongActionEnd.bind(this));\n\n Common.Notifications.on('download:cancel', this.onDownloadCancel.bind(this));\n\n EditorUIController.initCellInfo && EditorUIController.initCellInfo(this.props);\n\n EditorUIController.initEditorStyles && EditorUIController.initEditorStyles(this.props.storeCellSettings);\n\n EditorUIController.initFonts && EditorUIController.initFonts(this.props);\n\n const styleSize = this.props.storeCellSettings.styleSize;\n this.api.asc_setThumbnailStylesSizes(styleSize.width, styleSize.height);\n\n // Text settings \n\n const storeTextSettings = this.props.storeTextSettings;\n storeTextSettings.resetFontsRecent(LocalStorage.getItem('sse-settings-recent-fonts'));\n\n // Spreadsheet Settings\n\n this.api.asc_registerCallback('asc_onSendThemeColorSchemes', schemes => {\n this.props.storeSpreadsheetSettings.addSchemes(schemes);\n });\n\n // Downloaded Advanced Options\n \n this.api.asc_registerCallback('asc_onAdvancedOptions', (type, advOptions, mode, formatOptions) => {\n const {t} = this.props;\n const _t = t(\"View.Settings\", { returnObjects: true });\n if(type == Asc.c_oAscAdvancedOptionsID.DRM) {\n onAdvancedOptions(type, _t, this._isDocReady, this.props.storeAppOptions.canRequestClose, this.isDRM);\n this.isDRM = true;\n }\n });\n\n // Toolbar settings\n\n const storeToolbarSettings = this.props.storeToolbarSettings;\n this.api.asc_registerCallback('asc_onCanUndoChanged', (can) => {\n if (this.props.users.isDisconnected) return;\n storeToolbarSettings.setCanUndo(can);\n });\n this.api.asc_registerCallback('asc_onCanRedoChanged', (can) => {\n if (this.props.users.isDisconnected) return;\n storeToolbarSettings.setCanRedo(can);\n });\n\n const storeFocusObjects = this.props.storeFocusObjects;\n this.api.asc_registerCallback('asc_onEditCell', (state) => {\n if (state == Asc.c_oAscCellEditorState.editStart || state == Asc.c_oAscCellEditorState.editEnd) {\n const isEditCell = state === Asc.c_oAscCellEditorState.editStart;\n const isEditEnd = state === Asc.c_oAscCellEditorState.editEnd;\n \n if (storeFocusObjects.isEditCell !== isEditCell) {\n storeFocusObjects.setEditCell(isEditCell);\n }\n\n if(isEditEnd) {\n storeFocusObjects.setEditFormulaMode(false);\n }\n } else {\n const isFormula = state === Asc.c_oAscCellEditorState.editFormula;\n \n if (storeFocusObjects.editFormulaMode !== isFormula) {\n storeFocusObjects.setEditFormulaMode(isFormula);\n }\n }\n\n storeFocusObjects.setFunctionsDisabled(state === Asc.c_oAscCellEditorState.editText);\n });\n\n this.api.asc_registerCallback('asc_onChangeProtectWorksheet', this.onChangeProtectSheet.bind(this));\n this.api.asc_registerCallback('asc_onActiveSheetChanged', this.onChangeProtectSheet.bind(this)); \n \n this.api.asc_registerCallback('asc_onRenameCellTextEnd', this.onRenameText.bind(this));\n\n this.api.asc_registerCallback('asc_onEntriesListMenu', this.onEntriesListMenu.bind(this, false));\n this.api.asc_registerCallback('asc_onValidationListMenu', this.onEntriesListMenu.bind(this, true));\n\n this.api.asc_registerCallback('asc_onInputMessage', (title, msg) => {\n if(!!msg) {\n const coord = this.api.asc_getActiveCellCoord();\n const widthCell = coord.asc_getWidth();\n const heightCell = coord.asc_getHeight();\n const topPosition = coord.asc_getY();\n const leftPosition = coord.asc_getX();\n const sdk = document.querySelector('#editor_sdk');\n const rect = sdk.getBoundingClientRect();\n\n if(document.querySelector('.tooltip-cell-data')) {\n document.querySelector('.tooltip-cell-data').remove();\n document.querySelector('.popover-backdrop')?.remove();\n }\n\n f7.popover.create({\n targetX: -10000,\n targetY: -10000,\n content: `\n \n `,\n backdrop: false,\n closeByBackdropClick: false\n }).open();\n\n const tooltipCell = document.querySelector('.tooltip-cell-data');\n\n // Define left position\n\n if(rect.right - leftPosition <= widthCell || rect.right - leftPosition <= tooltipCell.offsetWidth) {\n tooltipCell.style.left = `${leftPosition - tooltipCell.offsetWidth}px`;\n } else if(leftPosition === 0) {\n tooltipCell.style.left = `26px`;\n } else {\n tooltipCell.style.left = `${leftPosition}px`;\n }\n\n // Define top position\n\n if(rect.bottom - topPosition <= heightCell || rect.bottom - topPosition <= tooltipCell.offsetHeight) {\n tooltipCell.style.top = `${rect.bottom - tooltipCell.offsetHeight - heightCell - 7}px`;\n } else if(topPosition === 0) {\n tooltipCell.style.top = `${heightCell + rect.top + 22}px`;\n } else {\n tooltipCell.style.top = `${topPosition + rect.top + heightCell + 2}px`;\n }\n }\n });\n\n const storeSpreadsheetInfo = this.props.storeSpreadsheetInfo;\n\n this.api.asc_registerCallback('asc_onMeta', (meta) => {\n if(meta) {\n storeSpreadsheetInfo.changeTitle(meta.title);\n }\n });\n\n this.api.asc_registerCallback('asc_onNeedUpdateExternalReferenceOnOpen', this.onNeedUpdateExternalReference.bind(this));\n\n const storeAppOptions = this.props.storeAppOptions;\n this.api.asc_setFilteringMode && this.api.asc_setFilteringMode(storeAppOptions.canModifyFilter);\n }\n\n onNeedUpdateExternalReference() {\n const { t } = this.props;\n\n f7.dialog.create({\n title: t('Controller.Main.notcriticalErrorTitle'),\n text: t('Controller.Main.textWarnUpdateExternalData'),\n buttons: [\n {\n text: t('Controller.Main.textUpdate'),\n onClick: () => {\n const links = this.api.asc_getExternalReferences();\n (links && links.length) && this.api.asc_updateExternalReferences(links);\n } \n },\n {\n text: t('Controller.Main.textDontUpdate')\n }\n ]\n }).open();\n }\n\n onEntriesListMenu(validation, textArr, addArr) {\n const storeAppOptions = this.props.storeAppOptions;\n \n if (!storeAppOptions.isEdit && !storeAppOptions.isRestrictedEdit || this.props.users.isDisconnected) return;\n\n const { t } = this.props;\n const boxSdk = $$('#editor_sdk');\n \n if (textArr && textArr.length) { \n if(!Device.isPhone) {\n let dropdownListTarget = boxSdk.find('#dropdown-list-target');\n \n if (!dropdownListTarget.length) {\n dropdownListTarget = $$('');\n boxSdk.append(dropdownListTarget);\n }\n\n let coord = this.api.asc_getActiveCellCoord(validation),\n offset = {left: 0, top: 0},\n showPoint = [coord.asc_getX() + offset.left + (validation ? coord.asc_getWidth() : 0), (coord.asc_getY() < 0 ? 0 : coord.asc_getY()) + coord.asc_getHeight() + offset.top];\n \n dropdownListTarget.css({left: `${showPoint[0]}px`, top: `${showPoint[1]}px`});\n }\n\n Common.Notifications.trigger('openDropdownList', textArr, addArr);\n } else {\n !validation && f7.dialog.create({\n title: t('Controller.Main.notcriticalErrorTitle'),\n text: t('Controller.Main.textNoChoices'),\n buttons: [\n {\n text: t('Controller.Main.textOk')\n }\n ]\n });\n }\n }\n\n onRenameText(found, replaced) {\n const { t } = this.props;\n\n if (this.api.isReplaceAll) { \n f7.dialog.alert(null, (found) ? ((!found - replaced) ? t('Controller.Main.textReplaceSuccess').replace(/\\{0\\}/, `${replaced}`) : t('Controller.Main.textReplaceSkipped').replace(/\\{0\\}/, `${found - replaced}`)) : t('Controller.Main.textNoMatches'));\n }\n }\n\n onChangeProtectSheet() {\n const storeWorksheets = this.props.storeWorksheets;\n let {wsLock, wsProps} = this.getWSProps(true);\n\n if(wsProps) {\n storeWorksheets.setWsLock(wsLock);\n storeWorksheets.setWsProps(wsProps);\n }\n }\n\n getWSProps(update) {\n const storeAppOptions = this.props.storeAppOptions;\n let wsProtection = {};\n if (!storeAppOptions.config || !storeAppOptions.isEdit && !storeAppOptions.isRestrictedEdit) \n return wsProtection;\n\n if (update) {\n let wsLock = !!this.api.asc_isProtectedSheet();\n let wsProps = {};\n\n if (wsLock) {\n let props = this.api.asc_getProtectedSheet();\n props && this.wsLockOptions.forEach(function(item){\n wsProps[item] = props['asc_get' + item] ? props['asc_get' + item]() : false;\n });\n } else {\n this.wsLockOptions.forEach(function(item){\n wsProps[item] = false;\n });\n }\n\n wsProtection = {wsLock, wsProps};\n \n return wsProtection;\n }\n }\n\n _onLongActionEnd(type, id) {\n if ( type === Asc.c_oAscAsyncActionType.BlockInteraction && id == Asc.c_oAscAsyncAction.Open ) {\n Common.Gateway.internalMessage('documentReady', {});\n Common.Notifications.trigger('document:ready');\n this.onDocumentContentReady();\n }\n }\n\n onDocumentContentReady() {\n if (this._isDocReady)\n return;\n\n const appOptions = this.props.storeAppOptions;\n const appSettings = this.props.storeApplicationSettings;\n\n this._isDocReady = true;\n\n this.api.asc_showWorksheet(this.api.asc_getActiveWorksheetIndex());\n this.api.asc_Resize();\n\n Common.Notifications.trigger('preloader:close');\n Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], this.LoadingDocument);\n\n let value = (appOptions.isEditMailMerge || appOptions.isEditDiagram) ? 100 : LocalStorage.getItem(\"sse-settings-zoom\");\n var zf = (value !== null) ? parseInt(value)/100 : (appOptions.customization && appOptions.customization.zoom ? parseInt(appOptions.customization.zoom)/100 : 1);\n this.api.asc_setZoom(zf>0 ? zf : 1);\n\n this.updateWindowTitle(true);\n\n if (appOptions.isEdit) {\n if (this.needToUpdateVersion) {\n Common.Notifications.trigger('api:disconnect');\n }\n }\n\n if (appOptions.canAnalytics && false) {\n Common.component.Analytics.initialize('UA-12442749-13', 'Spreadsheet Editor');\n }\n\n Common.Gateway.on('processsaveresult', this.onProcessSaveResult.bind(this));\n Common.Gateway.on('processrightschange', this.onProcessRightsChange.bind(this));\n Common.Gateway.on('downloadas', this.onDownloadAs.bind(this));\n Common.Gateway.on('requestclose', this.onRequestClose.bind(this));\n\n Common.Gateway.sendInfo({\n mode: appOptions.isEdit ? 'edit' : 'view'\n });\n\n this.applyLicense();\n\n //R1C1 reference style\n value = LocalStorage.getBool('sse-settings-r1c1', false);\n appSettings.changeRefStyle(value);\n this.api.asc_setR1C1Mode(value);\n\n Common.Gateway.documentReady();\n f7.emit('resize');\n\n appOptions.changeDocReady(true);\n }\n\n applyMode (appOptions) {\n this.api.asc_enableKeyEvents(appOptions.isEdit);\n\n if (!appOptions.isEditMailMerge && !appOptions.isEditDiagram) {\n EditorUIController.initThemeColors && EditorUIController.initThemeColors();\n this.api.asc_registerCallback('asc_onDownloadUrl', this.onDownloadUrl.bind(this));\n }\n\n this.api.asc_setViewMode(!appOptions.isEdit && !appOptions.isRestrictedEdit);\n (appOptions.isRestrictedEdit && appOptions.canComments) && this.api.asc_setRestriction(Asc.c_oAscRestrictionType.OnlyComments);\n\n let value = LocalStorage.getItem('sse-mobile-settings-unit');\n value = (value !== null) ? parseInt(value) : (appOptions.customization && appOptions.customization.unit ? Common.Utils.Metric.c_MetricUnits[appOptions.customization.unit.toLocaleLowerCase()] : Common.Utils.Metric.getDefaultMetric());\n (value === undefined) && (value = Common.Utils.Metric.getDefaultMetric());\n Common.Utils.Metric.setCurrentMetric(value);\n\n this.api.asc_registerCallback('asc_onDocumentModifiedChanged', this.onDocumentModifiedChanged.bind(this));\n this.api.asc_registerCallback('asc_onDocumentCanSaveChanged', this.onDocumentCanSaveChanged.bind(this));\n\n Common.Notifications.trigger('preloader:close');\n Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], this.ApplyEditRights);\n\n if (!this._isDocReady) {\n Common.Notifications.trigger('preloader:beginAction', Asc.c_oAscAsyncActionType['BlockInteraction'], this.LoadingDocument);\n }\n\n // Message on window close\n window.onbeforeunload = this.onBeforeUnload.bind(this);\n window.onunload = this.onUnload.bind(this);\n }\n\n onLicenseChanged (params) {\n const appOptions = this.props.storeAppOptions;\n if (appOptions.isEditDiagram || appOptions.isEditMailMerge) return;\n\n const licType = params.asc_getLicenseType();\n if (licType !== undefined && (appOptions.canEdit || appOptions.isRestrictedEdit) && appOptions.config.mode !== 'view' &&\n (licType === Asc.c_oLicenseResult.Connections || licType === Asc.c_oLicenseResult.UsersCount || licType === Asc.c_oLicenseResult.ConnectionsOS || licType === Asc.c_oLicenseResult.UsersCountOS\n || licType === Asc.c_oLicenseResult.SuccessLimit && (appOptions.trialMode & Asc.c_oLicenseMode.Limited) !== 0))\n this._state.licenseType = licType;\n\n if (licType !== undefined && appOptions.canLiveView && (licType===Asc.c_oLicenseResult.ConnectionsLive || licType===Asc.c_oLicenseResult.ConnectionsLiveOS||\n licType===Asc.c_oLicenseResult.UsersViewCount || licType===Asc.c_oLicenseResult.UsersViewCountOS))\n this._state.licenseType = licType;\n\n if (this._isDocReady && this._state.licenseType)\n this.applyLicense();\n }\n\n applyLicense () {\n const { t } = this.props;\n const _t = t('Controller.Main', {returnObjects:true});\n\n const warnNoLicense = _t.warnNoLicense.replace(/%1/g, __COMPANY_NAME__);\n const warnNoLicenseUsers = _t.warnNoLicenseUsers.replace(/%1/g, __COMPANY_NAME__);\n const textNoLicenseTitle = _t.textNoLicenseTitle.replace(/%1/g, __COMPANY_NAME__);\n const warnLicenseExceeded = _t.warnLicenseExceeded.replace(/%1/g, __COMPANY_NAME__);\n const warnLicenseUsersExceeded = _t.warnLicenseUsersExceeded.replace(/%1/g, __COMPANY_NAME__);\n\n const appOptions = this.props.storeAppOptions;\n if (appOptions.config.mode !== 'view' && !EditorUIController.isSupportEditFeature()) {\n let value = LocalStorage.getItem(\"sse-opensource-warning\");\n value = (value !== null) ? parseInt(value) : 0;\n const now = (new Date).getTime();\n if (now - value > 86400000) {\n LocalStorage.setItem(\"sse-opensource-warning\", now);\n f7.dialog.create({\n title: _t.notcriticalErrorTitle,\n text : _t.errorOpensource,\n buttons: [{text: 'OK'}]\n }).open();\n }\n Common.Notifications.trigger('toolbar:activatecontrols');\n return;\n }\n\n if (appOptions.config.mode === 'view') {\n if (appOptions.canLiveView && (this._state.licenseType===Asc.c_oLicenseResult.ConnectionsLive || this._state.licenseType===Asc.c_oLicenseResult.ConnectionsLiveOS ||\n this._state.licenseType===Asc.c_oLicenseResult.UsersViewCount || this._state.licenseType===Asc.c_oLicenseResult.UsersViewCountOS ||\n !appOptions.isAnonymousSupport && !!appOptions.config.user.anonymous)) {\n appOptions.canLiveView = false;\n this.api.asc_SetFastCollaborative(false);\n }\n Common.Notifications.trigger('toolbar:activatecontrols');\n } else if (!appOptions.isAnonymousSupport && !!appOptions.config.user.anonymous) {\n Common.Notifications.trigger('toolbar:activatecontrols');\n Common.Notifications.trigger('toolbar:deactivateeditcontrols');\n this.api.asc_coAuthoringDisconnect();\n Common.Notifications.trigger('api:disconnect');\n f7.dialog.create({\n title: _t.notcriticalErrorTitle,\n text : _t.warnLicenseAnonymous,\n buttons: [{text: 'OK'}]\n }).open();\n } else if (this._state.licenseType) {\n let license = this._state.licenseType;\n let buttons = [{text: 'OK'}];\n if ((appOptions.trialMode & Asc.c_oLicenseMode.Limited) !== 0 &&\n (license === Asc.c_oLicenseResult.SuccessLimit ||\n appOptions.permissionsLicense === Asc.c_oLicenseResult.SuccessLimit)\n ) {\n license = _t.warnLicenseLimitedRenewed;\n } else if (license === Asc.c_oLicenseResult.Connections || license === Asc.c_oLicenseResult.UsersCount) {\n license = (license===Asc.c_oLicenseResult.Connections) ? warnLicenseExceeded : warnLicenseUsersExceeded;\n } else {\n license = (license === Asc.c_oLicenseResult.ConnectionsOS) ? warnNoLicense : warnNoLicenseUsers;\n buttons = [{\n text: _t.textBuyNow,\n bold: true,\n onClick: function() {\n window.open(`${__PUBLISHER_URL__}`, \"_blank\");\n }\n },\n {\n text: _t.textContactUs,\n onClick: function() {\n window.open(`mailto:${__SALES_EMAIL__}`, \"_blank\");\n }\n }];\n }\n if (this._state.licenseType === Asc.c_oLicenseResult.SuccessLimit) {\n Common.Notifications.trigger('toolbar:activatecontrols');\n } else {\n Common.Notifications.trigger('toolbar:activatecontrols');\n Common.Notifications.trigger('toolbar:deactivateeditcontrols');\n this.api.asc_coAuthoringDisconnect();\n Common.Notifications.trigger('api:disconnect');\n }\n\n let value = LocalStorage.getItem(\"sse-license-warning\");\n value = (value !== null) ? parseInt(value) : 0;\n const now = (new Date).getTime();\n\n if (now - value > 86400000) {\n LocalStorage.setItem(\"sse-license-warning\", now);\n f7.dialog.create({\n title: textNoLicenseTitle,\n text : license,\n buttons: buttons\n }).open();\n }\n } else {\n if (!appOptions.isDesktopApp && !appOptions.canBrandingExt &&\n appOptions.config && appOptions.config.customization && (appOptions.config.customization.loaderName || appOptions.config.customization.loaderLogo)) {\n f7.dialog.create({\n title: _t.textPaidFeature,\n text : _t.textCustomLoader,\n buttons: [{\n text: _t.textContactUs,\n bold: true,\n onClick: () => {\n window.open(`mailto:${__SALES_EMAIL__}`, \"_blank\");\n }\n },\n { text: _t.textClose }]\n }).open();\n }\n Common.Notifications.trigger('toolbar:activatecontrols');\n }\n }\n\n onExternalMessage (msg) {\n if (msg && msg.msg) {\n msg.msg = (msg.msg).toString();\n f7.notification.create({\n //title: uiApp.params.modalTitle,\n text: [msg.msg.charAt(0).toUpperCase() + msg.msg.substring(1)],\n closeButton: true\n }).open();\n\n Common.component.Analytics.trackEvent('External Error');\n }\n }\n\n onRunAutostartMacroses () {\n const appOptions = this.props.storeAppOptions;\n const enable = !appOptions.customization || (appOptions.customization.macros !== false);\n if (enable) {\n const value = this.props.storeApplicationSettings.macrosMode;\n if (value === 1) {\n this.api.asc_runAutostartMacroses();\n } else if (value === 0) {\n const { t } = this.props;\n const _t = t('Controller.Main', {returnObjects:true});\n f7.dialog.create({\n title: _t.notcriticalErrorTitle,\n text: _t.textHasMacros,\n content: `\n \n ${_t.textRemember}\n
`,\n buttons: [{\n text: _t.textYes,\n onClick: () => {\n const dontshow = $$('input[name=\"checkbox-show-macros\"]').prop('checked');\n if (dontshow) {\n this.props.storeApplicationSettings.changeMacrosSettings(1);\n LocalStorage.setItem(\"sse-mobile-macros-mode\", 1);\n }\n setTimeout(() => {\n this.api.asc_runAutostartMacroses();\n }, 1);\n }},\n {\n text: _t.textNo,\n onClick: () => {\n const dontshow = $$('input[name=\"checkbox-show-macros\"]').prop('checked');\n if (dontshow) {\n this.props.storeApplicationSettings.changeMacrosSettings(2);\n LocalStorage.setItem(\"sse-mobile-macros-mode\", 2);\n }\n }\n }]\n }).open();\n }\n }\n }\n\n onMacrosPermissionRequest (url, callback) {\n if (url && callback) {\n this.stackMacrosRequests.push({url: url, callback: callback});\n if (this.stackMacrosRequests.length>1) {\n return;\n }\n } else if (this.stackMacrosRequests.length>0) {\n url = this.stackMacrosRequests[0].url;\n callback = this.stackMacrosRequests[0].callback;\n } else\n return;\n\n const value = this.props.storeApplicationSettings.macrosRequest;\n if (value>0) {\n callback && callback(value === 1);\n this.stackMacrosRequests.shift();\n this.onMacrosPermissionRequest();\n } else {\n const { t } = this.props;\n const _t = t('Controller.Main', {returnObjects:true});\n f7.dialog.create({\n title: _t.notcriticalErrorTitle,\n text: _t.textRequestMacros.replace('%1', url),\n cssClass: 'dlg-macros-request',\n content: `\n \n ${_t.textRemember}\n
`,\n buttons: [{\n text: _t.textYes,\n onClick: () => {\n const dontshow = $$('input[name=\"checkbox-show-macros\"]').prop('checked');\n if (dontshow) {\n this.props.storeApplicationSettings.changeMacrosRequest(1);\n LocalStorage.setItem(\"sse-mobile-allow-macros-request\", 1);\n }\n setTimeout(() => {\n if (callback) callback(true);\n this.stackMacrosRequests.shift();\n this.onMacrosPermissionRequest();\n }, 1);\n }},\n {\n text: _t.textNo,\n onClick: () => {\n const dontshow = $$('input[name=\"checkbox-show-macros\"]').prop('checked');\n if (dontshow) {\n this.props.storeApplicationSettings.changeMacrosRequest(2);\n LocalStorage.setItem(\"sse-mobile-allow-macros-request\", 2);\n }\n setTimeout(() => {\n if (callback) callback(false);\n this.stackMacrosRequests.shift();\n this.onMacrosPermissionRequest();\n }, 1);\n }\n }]\n }).open();\n }\n }\n\n onDownloadUrl (url, fileType) {\n if (this._state.isFromGatewayDownloadAs) {\n Common.Gateway.downloadAs(url, fileType);\n }\n\n this._state.isFromGatewayDownloadAs = false;\n }\n\n onBeforeUnload () {\n const { t } = this.props;\n const _t = t('Controller.Main', {returnObjects:true});\n\n LocalStorage.save();\n\n const config = this.props.storeAppOptions.config;\n const isEdit = this.permissions.edit !== false && config.mode !== 'view' && config.mode !== 'editdiagram';\n if (isEdit && this.api.asc_isDocumentModified()) {\n this.api.asc_stopSaving();\n this.continueSavingTimer = window.setTimeout(() => {\n this.api.asc_continueSaving();\n }, 500);\n\n return _t.leavePageText;\n }\n }\n\n onUnload () {\n if (this.continueSavingTimer)\n clearTimeout(this.continueSavingTimer);\n }\n\n onUpdateVersion (callback) {\n const { t } = this.props;\n const _t = t('Controller.Main', {returnObjects:true});\n\n this.needToUpdateVersion = true;\n Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], this.LoadingDocument);\n\n f7.dialog.alert(\n _t.errorUpdateVersion,\n _t.titleUpdateVersion,\n () => {\n Common.Gateway.updateVersion();\n if (callback) {\n callback.call(this);\n }\n Common.Notifications.trigger('preloader:beginAction', Asc.c_oAscAsyncActionType['BlockInteraction'], this.LoadingDocument);\n });\n }\n\n onServerVersion (buildVersion) {\n if (this.changeServerVersion) return true;\n const { t } = this.props;\n const _t = t('Controller.Main', {returnObjects:true});\n\n if (About.appVersion() !== buildVersion && !About.compareVersions()) {\n this.changeServerVersion = true;\n f7.dialog.alert(\n _t.errorServerVersion,\n _t.titleServerVersion,\n () => {\n setTimeout(() => {Common.Gateway.updateVersion()}, 0);\n });\n return true;\n }\n return false;\n }\n\n onPrintUrl (url) {\n if (this.iframePrint) {\n this.iframePrint.parentNode.removeChild(this.iframePrint);\n this.iframePrint = null;\n }\n\n if (!this.iframePrint) {\n this.iframePrint = document.createElement(\"iframe\");\n this.iframePrint.id = \"id-print-frame\";\n this.iframePrint.style.display = 'none';\n this.iframePrint.style.visibility = \"hidden\";\n this.iframePrint.style.position = \"fixed\";\n this.iframePrint.style.right = \"0\";\n this.iframePrint.style.bottom = \"0\";\n document.body.appendChild(this.iframePrint);\n this.iframePrint.onload = function() {\n this.iframePrint.contentWindow.focus();\n this.iframePrint.contentWindow.print();\n this.iframePrint.contentWindow.blur();\n window.focus();\n };\n }\n\n if (url) {\n this.iframePrint.src = url;\n }\n }\n\n onDocumentName (name) {\n this.updateWindowTitle(true);\n }\n\n updateWindowTitle (force) {\n const isModified = this.api.asc_isDocumentModified();\n if (this._state.isDocModified !== isModified || force) {\n const title = this.defaultTitleText;\n\n if (window.document.title !== title) {\n window.document.title = title;\n }\n\n this._isDocReady && (this._state.isDocModified !== isModified) && Common.Gateway.setDocumentModified(isModified);\n this._state.isDocModified = isModified;\n }\n }\n\n onDocumentModifiedChanged () {\n const isModified = this.api.asc_isDocumentCanSave();\n if (this._state.isDocModified !== isModified) {\n this._isDocReady && Common.Gateway.setDocumentModified(this.api.asc_isDocumentModified());\n }\n\n this.updateWindowTitle();\n }\n\n onDocumentCanSaveChanged (isCanSave) {\n //\n }\n\n onPrint () {\n if (!this.props.storeAppOptions.canPrint) return;\n\n if (this.api)\n this.api.asc_Print();\n Common.component.Analytics.trackEvent('Print');\n }\n\n onProcessSaveResult (data) {\n this.api.asc_OnSaveEnd(data.result);\n\n if (data && data.result === false) {\n const { t } = this.props;\n const _t = t('Controller.Main', {returnObjects:true});\n f7.dialog.alert(\n (!data.message) ? _t.errorProcessSaveResult : data.message,\n _t.criticalErrorTitle\n );\n }\n }\n\n onProcessRightsChange (data) {\n if (data && data.enabled === false) {\n const appOptions = this.props.storeAppOptions;\n const old_rights = appOptions.lostEditingRights;\n appOptions.changeEditingRights(!old_rights);\n this.api.asc_coAuthoringDisconnect();\n Common.Notifications.trigger('api:disconnect');\n\n if (!old_rights) {\n const { t } = this.props;\n const _t = t('Controller.Main', {returnObjects:true});\n f7.dialog.alert(\n (!data.message) ? _t.warnProcessRightsChange : data.message,\n _t.notcriticalErrorTitle,\n () => { appOptions.changeEditingRights(false); }\n );\n }\n }\n }\n\n onDownloadCancel() {\n this._state.isFromGatewayDownloadAs = false;\n }\n\n onDownloadAs(format) {\n const appOptions = this.props.storeAppOptions;\n\n if(!appOptions.canDownload) {\n const { t } = this.props;\n const _t = t('Controller.Main', { returnObjects:true });\n Common.Gateway.reportError(Asc.c_oAscError.ID.AccessDeny, _t.errorAccessDeny);\n return;\n }\n\n this._state.isFromGatewayDownloadAs = true;\n\n let _format = (format && (typeof format == 'string')) ? Asc.c_oAscFileType[format.toUpperCase()] : null,\n _supported = [\n Asc.c_oAscFileType.XLSX,\n Asc.c_oAscFileType.ODS,\n Asc.c_oAscFileType.CSV,\n Asc.c_oAscFileType.PDF,\n Asc.c_oAscFileType.PDFA,\n Asc.c_oAscFileType.XLTX,\n Asc.c_oAscFileType.OTS,\n Asc.c_oAscFileType.XLSM,\n Asc.c_oAscFileType.XLSB,\n Asc.c_oAscFileType.JPG,\n Asc.c_oAscFileType.PNG\n ];\n\n if (!_format || _supported.indexOf(_format) < 0)\n _format = Asc.c_oAscFileType.XLSX;\n\n if (_format == Asc.c_oAscFileType.PDF || _format == Asc.c_oAscFileType.PDFA) {\n Common.Notifications.trigger('download:settings', this, _format, true);\n } else {\n const options = new Asc.asc_CDownloadOptions(_format, true);\n options.asc_setIsSaveAs(true);\n this.api.asc_DownloadAs(options);\n }\n }\n\n onRequestClose () {\n const { t } = this.props;\n const _t = t(\"Toolbar\", { returnObjects: true });\n\n if (this.api.isDocumentModified()) {\n this.api.asc_stopSaving();\n\n f7.dialog.create({\n title: _t.dlgLeaveTitleText,\n text: _t.dlgLeaveMsgText,\n verticalButtons: true,\n buttons : [\n {\n text: _t.leaveButtonText,\n onClick: () => {\n this.api.asc_undoAllChanges();\n this.api.asc_continueSaving();\n Common.Gateway.requestClose();\n }\n },\n {\n text: _t.stayButtonText,\n bold: true,\n onClick: () => {\n this.api.asc_continueSaving();\n }\n }\n ]\n }).open();\n } else {\n Common.Gateway.requestClose();\n }\n }\n\n render() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n }\n\n componentDidMount() {\n Common.EditorApi = {get: () => this.api};\n this.initSdk();\n }\n}\n\nconst translated = withTranslation()(MainController);\nexport {translated as MainController};\n","export const processArrayScripts = async (array, fn) => {\n\tconst results = [];\n\n\tfor (const item of array) {\n try {\n const data = await fn(item);\n results.push(data);\n } catch (error) {\n console.log(`Error with processing element ${item}:`, error);\n continue;\n }\n\t}\n\n\treturn results;\n};","\nimport React from 'react';\n\nimport {App,Views,View,Navbar,NavLeft,NavRight,Link} from 'framework7-react';\nimport { f7ready } from 'framework7-react';\n\nimport '../../../../common/Analytics.js';\n\nimport '../../../../common/Gateway.js';\n\nimport routes from '../router/routes.js';\n\nimport '../../../../common/main/lib/util/utils.js';\nimport '../../../../common/main/lib/util/LanguageInfo.js';\nimport {LocalStorage} from '../../../../common/mobile/utils/LocalStorage.mjs';\nimport Notifications from '../../../../common/mobile/utils/notifications.js';\nimport {MainController} from '../controller/Main';\nimport {Device} from '../../../../common/mobile/utils/device';\nimport CellEditor from '../controller/CellEditor';\n\nconst f7params = {\n name: 'Spreadsheet Editor', // App name\n theme: 'auto', // Automatic theme detection\n\n routes: routes, // App routes\n};\n\nexport default class extends React.Component {\n constructor() {\n super();\n \n Common.Notifications = new Notifications();\n Common.localStorage = LocalStorage;\n }\n\n render() {\n return (\n \n {/* Your main view, should have \"view-main\" class */}\n \n \n \n )\n }\n\n componentDidMount() {\n f7ready(f7 => {\n Device.initDom();\n });\n }\n}\n","const consoleLogger = {\n type: 'logger',\n log(args) {\n this.output('log', args);\n },\n warn(args) {\n this.output('warn', args);\n },\n error(args) {\n this.output('error', args);\n },\n output(type, args) {\n if (console && console[type]) console[type].apply(console, args);\n }\n};\nclass Logger {\n constructor(concreteLogger) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.init(concreteLogger, options);\n }\n init(concreteLogger) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.prefix = options.prefix || 'i18next:';\n this.logger = concreteLogger || consoleLogger;\n this.options = options;\n this.debug = options.debug;\n }\n log() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n return this.forward(args, 'log', '', true);\n }\n warn() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n return this.forward(args, 'warn', '', true);\n }\n error() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n return this.forward(args, 'error', '');\n }\n deprecate() {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n return this.forward(args, 'warn', 'WARNING DEPRECATED: ', true);\n }\n forward(args, lvl, prefix, debugOnly) {\n if (debugOnly && !this.debug) return null;\n if (typeof args[0] === 'string') args[0] = `${prefix}${this.prefix} ${args[0]}`;\n return this.logger[lvl](args);\n }\n create(moduleName) {\n return new Logger(this.logger, {\n ...{\n prefix: `${this.prefix}:${moduleName}:`\n },\n ...this.options\n });\n }\n clone(options) {\n options = options || this.options;\n options.prefix = options.prefix || this.prefix;\n return new Logger(this.logger, options);\n }\n}\nvar baseLogger = new Logger();\n\nclass EventEmitter {\n constructor() {\n this.observers = {};\n }\n on(events, listener) {\n events.split(' ').forEach(event => {\n if (!this.observers[event]) this.observers[event] = new Map();\n const numListeners = this.observers[event].get(listener) || 0;\n this.observers[event].set(listener, numListeners + 1);\n });\n return this;\n }\n off(event, listener) {\n if (!this.observers[event]) return;\n if (!listener) {\n delete this.observers[event];\n return;\n }\n this.observers[event].delete(listener);\n }\n emit(event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (this.observers[event]) {\n const cloned = Array.from(this.observers[event].entries());\n cloned.forEach(_ref => {\n let [observer, numTimesAdded] = _ref;\n for (let i = 0; i < numTimesAdded; i++) {\n observer(...args);\n }\n });\n }\n if (this.observers['*']) {\n const cloned = Array.from(this.observers['*'].entries());\n cloned.forEach(_ref2 => {\n let [observer, numTimesAdded] = _ref2;\n for (let i = 0; i < numTimesAdded; i++) {\n observer.apply(observer, [event, ...args]);\n }\n });\n }\n }\n}\n\nfunction defer() {\n let res;\n let rej;\n const promise = new Promise((resolve, reject) => {\n res = resolve;\n rej = reject;\n });\n promise.resolve = res;\n promise.reject = rej;\n return promise;\n}\nfunction makeString(object) {\n if (object == null) return '';\n return '' + object;\n}\nfunction copy(a, s, t) {\n a.forEach(m => {\n if (s[m]) t[m] = s[m];\n });\n}\nconst lastOfPathSeparatorRegExp = /###/g;\nfunction getLastOfPath(object, path, Empty) {\n function cleanKey(key) {\n return key && key.indexOf('###') > -1 ? key.replace(lastOfPathSeparatorRegExp, '.') : key;\n }\n function canNotTraverseDeeper() {\n return !object || typeof object === 'string';\n }\n const stack = typeof path !== 'string' ? path : path.split('.');\n let stackIndex = 0;\n while (stackIndex < stack.length - 1) {\n if (canNotTraverseDeeper()) return {};\n const key = cleanKey(stack[stackIndex]);\n if (!object[key] && Empty) object[key] = new Empty();\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n object = object[key];\n } else {\n object = {};\n }\n ++stackIndex;\n }\n if (canNotTraverseDeeper()) return {};\n return {\n obj: object,\n k: cleanKey(stack[stackIndex])\n };\n}\nfunction setPath(object, path, newValue) {\n const {\n obj,\n k\n } = getLastOfPath(object, path, Object);\n if (obj !== undefined || path.length === 1) {\n obj[k] = newValue;\n return;\n }\n let e = path[path.length - 1];\n let p = path.slice(0, path.length - 1);\n let last = getLastOfPath(object, p, Object);\n while (last.obj === undefined && p.length) {\n e = `${p[p.length - 1]}.${e}`;\n p = p.slice(0, p.length - 1);\n last = getLastOfPath(object, p, Object);\n if (last && last.obj && typeof last.obj[`${last.k}.${e}`] !== 'undefined') {\n last.obj = undefined;\n }\n }\n last.obj[`${last.k}.${e}`] = newValue;\n}\nfunction pushPath(object, path, newValue, concat) {\n const {\n obj,\n k\n } = getLastOfPath(object, path, Object);\n obj[k] = obj[k] || [];\n if (concat) obj[k] = obj[k].concat(newValue);\n if (!concat) obj[k].push(newValue);\n}\nfunction getPath(object, path) {\n const {\n obj,\n k\n } = getLastOfPath(object, path);\n if (!obj) return undefined;\n return obj[k];\n}\nfunction getPathWithDefaults(data, defaultData, key) {\n const value = getPath(data, key);\n if (value !== undefined) {\n return value;\n }\n return getPath(defaultData, key);\n}\nfunction deepExtend(target, source, overwrite) {\n for (const prop in source) {\n if (prop !== '__proto__' && prop !== 'constructor') {\n if (prop in target) {\n if (typeof target[prop] === 'string' || target[prop] instanceof String || typeof source[prop] === 'string' || source[prop] instanceof String) {\n if (overwrite) target[prop] = source[prop];\n } else {\n deepExtend(target[prop], source[prop], overwrite);\n }\n } else {\n target[prop] = source[prop];\n }\n }\n }\n return target;\n}\nfunction regexEscape(str) {\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n}\nvar _entityMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/'\n};\nfunction escape(data) {\n if (typeof data === 'string') {\n return data.replace(/[&<>\"'\\/]/g, s => _entityMap[s]);\n }\n return data;\n}\nclass RegExpCache {\n constructor(capacity) {\n this.capacity = capacity;\n this.regExpMap = new Map();\n this.regExpQueue = [];\n }\n getRegExp(pattern) {\n const regExpFromCache = this.regExpMap.get(pattern);\n if (regExpFromCache !== undefined) {\n return regExpFromCache;\n }\n const regExpNew = new RegExp(pattern);\n if (this.regExpQueue.length === this.capacity) {\n this.regExpMap.delete(this.regExpQueue.shift());\n }\n this.regExpMap.set(pattern, regExpNew);\n this.regExpQueue.push(pattern);\n return regExpNew;\n }\n}\nconst chars = [' ', ',', '?', '!', ';'];\nconst looksLikeObjectPathRegExpCache = new RegExpCache(20);\nfunction looksLikeObjectPath(key, nsSeparator, keySeparator) {\n nsSeparator = nsSeparator || '';\n keySeparator = keySeparator || '';\n const possibleChars = chars.filter(c => nsSeparator.indexOf(c) < 0 && keySeparator.indexOf(c) < 0);\n if (possibleChars.length === 0) return true;\n const r = looksLikeObjectPathRegExpCache.getRegExp(`(${possibleChars.map(c => c === '?' ? '\\\\?' : c).join('|')})`);\n let matched = !r.test(key);\n if (!matched) {\n const ki = key.indexOf(keySeparator);\n if (ki > 0 && !r.test(key.substring(0, ki))) {\n matched = true;\n }\n }\n return matched;\n}\nfunction deepFind(obj, path) {\n let keySeparator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '.';\n if (!obj) return undefined;\n if (obj[path]) return obj[path];\n const tokens = path.split(keySeparator);\n let current = obj;\n for (let i = 0; i < tokens.length;) {\n if (!current || typeof current !== 'object') {\n return undefined;\n }\n let next;\n let nextPath = '';\n for (let j = i; j < tokens.length; ++j) {\n if (j !== i) {\n nextPath += keySeparator;\n }\n nextPath += tokens[j];\n next = current[nextPath];\n if (next !== undefined) {\n if (['string', 'number', 'boolean'].indexOf(typeof next) > -1 && j < tokens.length - 1) {\n continue;\n }\n i += j - i + 1;\n break;\n }\n }\n current = next;\n }\n return current;\n}\nfunction getCleanedCode(code) {\n if (code && code.indexOf('_') > 0) return code.replace('_', '-');\n return code;\n}\n\nclass ResourceStore extends EventEmitter {\n constructor(data) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n ns: ['translation'],\n defaultNS: 'translation'\n };\n super();\n this.data = data || {};\n this.options = options;\n if (this.options.keySeparator === undefined) {\n this.options.keySeparator = '.';\n }\n if (this.options.ignoreJSONStructure === undefined) {\n this.options.ignoreJSONStructure = true;\n }\n }\n addNamespaces(ns) {\n if (this.options.ns.indexOf(ns) < 0) {\n this.options.ns.push(ns);\n }\n }\n removeNamespaces(ns) {\n const index = this.options.ns.indexOf(ns);\n if (index > -1) {\n this.options.ns.splice(index, 1);\n }\n }\n getResource(lng, ns, key) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n const ignoreJSONStructure = options.ignoreJSONStructure !== undefined ? options.ignoreJSONStructure : this.options.ignoreJSONStructure;\n let path;\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n } else {\n path = [lng, ns];\n if (key) {\n if (Array.isArray(key)) {\n path.push(...key);\n } else if (typeof key === 'string' && keySeparator) {\n path.push(...key.split(keySeparator));\n } else {\n path.push(key);\n }\n }\n }\n const result = getPath(this.data, path);\n if (!result && !ns && !key && lng.indexOf('.') > -1) {\n lng = path[0];\n ns = path[1];\n key = path.slice(2).join('.');\n }\n if (result || !ignoreJSONStructure || typeof key !== 'string') return result;\n return deepFind(this.data && this.data[lng] && this.data[lng][ns], key, keySeparator);\n }\n addResource(lng, ns, key, value) {\n let options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {\n silent: false\n };\n const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n let path = [lng, ns];\n if (key) path = path.concat(keySeparator ? key.split(keySeparator) : key);\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n value = ns;\n ns = path[1];\n }\n this.addNamespaces(ns);\n setPath(this.data, path, value);\n if (!options.silent) this.emit('added', lng, ns, key, value);\n }\n addResources(lng, ns, resources) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {\n silent: false\n };\n for (const m in resources) {\n if (typeof resources[m] === 'string' || Object.prototype.toString.apply(resources[m]) === '[object Array]') this.addResource(lng, ns, m, resources[m], {\n silent: true\n });\n }\n if (!options.silent) this.emit('added', lng, ns, resources);\n }\n addResourceBundle(lng, ns, resources, deep, overwrite) {\n let options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {\n silent: false,\n skipCopy: false\n };\n let path = [lng, ns];\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n deep = resources;\n resources = ns;\n ns = path[1];\n }\n this.addNamespaces(ns);\n let pack = getPath(this.data, path) || {};\n if (!options.skipCopy) resources = JSON.parse(JSON.stringify(resources));\n if (deep) {\n deepExtend(pack, resources, overwrite);\n } else {\n pack = {\n ...pack,\n ...resources\n };\n }\n setPath(this.data, path, pack);\n if (!options.silent) this.emit('added', lng, ns, resources);\n }\n removeResourceBundle(lng, ns) {\n if (this.hasResourceBundle(lng, ns)) {\n delete this.data[lng][ns];\n }\n this.removeNamespaces(ns);\n this.emit('removed', lng, ns);\n }\n hasResourceBundle(lng, ns) {\n return this.getResource(lng, ns) !== undefined;\n }\n getResourceBundle(lng, ns) {\n if (!ns) ns = this.options.defaultNS;\n if (this.options.compatibilityAPI === 'v1') return {\n ...{},\n ...this.getResource(lng, ns)\n };\n return this.getResource(lng, ns);\n }\n getDataByLanguage(lng) {\n return this.data[lng];\n }\n hasLanguageSomeTranslations(lng) {\n const data = this.getDataByLanguage(lng);\n const n = data && Object.keys(data) || [];\n return !!n.find(v => data[v] && Object.keys(data[v]).length > 0);\n }\n toJSON() {\n return this.data;\n }\n}\n\nvar postProcessor = {\n processors: {},\n addPostProcessor(module) {\n this.processors[module.name] = module;\n },\n handle(processors, value, key, options, translator) {\n processors.forEach(processor => {\n if (this.processors[processor]) value = this.processors[processor].process(value, key, options, translator);\n });\n return value;\n }\n};\n\nconst checkedLoadedFor = {};\nclass Translator extends EventEmitter {\n constructor(services) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n super();\n copy(['resourceStore', 'languageUtils', 'pluralResolver', 'interpolator', 'backendConnector', 'i18nFormat', 'utils'], services, this);\n this.options = options;\n if (this.options.keySeparator === undefined) {\n this.options.keySeparator = '.';\n }\n this.logger = baseLogger.create('translator');\n }\n changeLanguage(lng) {\n if (lng) this.language = lng;\n }\n exists(key) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n interpolation: {}\n };\n if (key === undefined || key === null) {\n return false;\n }\n const resolved = this.resolve(key, options);\n return resolved && resolved.res !== undefined;\n }\n extractFromKey(key, options) {\n let nsSeparator = options.nsSeparator !== undefined ? options.nsSeparator : this.options.nsSeparator;\n if (nsSeparator === undefined) nsSeparator = ':';\n const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n let namespaces = options.ns || this.options.defaultNS || [];\n const wouldCheckForNsInKey = nsSeparator && key.indexOf(nsSeparator) > -1;\n const seemsNaturalLanguage = !this.options.userDefinedKeySeparator && !options.keySeparator && !this.options.userDefinedNsSeparator && !options.nsSeparator && !looksLikeObjectPath(key, nsSeparator, keySeparator);\n if (wouldCheckForNsInKey && !seemsNaturalLanguage) {\n const m = key.match(this.interpolator.nestingRegexp);\n if (m && m.length > 0) {\n return {\n key,\n namespaces\n };\n }\n const parts = key.split(nsSeparator);\n if (nsSeparator !== keySeparator || nsSeparator === keySeparator && this.options.ns.indexOf(parts[0]) > -1) namespaces = parts.shift();\n key = parts.join(keySeparator);\n }\n if (typeof namespaces === 'string') namespaces = [namespaces];\n return {\n key,\n namespaces\n };\n }\n translate(keys, options, lastKey) {\n if (typeof options !== 'object' && this.options.overloadTranslationOptionHandler) {\n options = this.options.overloadTranslationOptionHandler(arguments);\n }\n if (typeof options === 'object') options = {\n ...options\n };\n if (!options) options = {};\n if (keys === undefined || keys === null) return '';\n if (!Array.isArray(keys)) keys = [String(keys)];\n const returnDetails = options.returnDetails !== undefined ? options.returnDetails : this.options.returnDetails;\n const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n const {\n key,\n namespaces\n } = this.extractFromKey(keys[keys.length - 1], options);\n const namespace = namespaces[namespaces.length - 1];\n const lng = options.lng || this.language;\n const appendNamespaceToCIMode = options.appendNamespaceToCIMode || this.options.appendNamespaceToCIMode;\n if (lng && lng.toLowerCase() === 'cimode') {\n if (appendNamespaceToCIMode) {\n const nsSeparator = options.nsSeparator || this.options.nsSeparator;\n if (returnDetails) {\n return {\n res: `${namespace}${nsSeparator}${key}`,\n usedKey: key,\n exactUsedKey: key,\n usedLng: lng,\n usedNS: namespace,\n usedParams: this.getUsedParamsDetails(options)\n };\n }\n return `${namespace}${nsSeparator}${key}`;\n }\n if (returnDetails) {\n return {\n res: key,\n usedKey: key,\n exactUsedKey: key,\n usedLng: lng,\n usedNS: namespace,\n usedParams: this.getUsedParamsDetails(options)\n };\n }\n return key;\n }\n const resolved = this.resolve(keys, options);\n let res = resolved && resolved.res;\n const resUsedKey = resolved && resolved.usedKey || key;\n const resExactUsedKey = resolved && resolved.exactUsedKey || key;\n const resType = Object.prototype.toString.apply(res);\n const noObject = ['[object Number]', '[object Function]', '[object RegExp]'];\n const joinArrays = options.joinArrays !== undefined ? options.joinArrays : this.options.joinArrays;\n const handleAsObjectInI18nFormat = !this.i18nFormat || this.i18nFormat.handleAsObject;\n const handleAsObject = typeof res !== 'string' && typeof res !== 'boolean' && typeof res !== 'number';\n if (handleAsObjectInI18nFormat && res && handleAsObject && noObject.indexOf(resType) < 0 && !(typeof joinArrays === 'string' && resType === '[object Array]')) {\n if (!options.returnObjects && !this.options.returnObjects) {\n if (!this.options.returnedObjectHandler) {\n this.logger.warn('accessing an object - but returnObjects options is not enabled!');\n }\n const r = this.options.returnedObjectHandler ? this.options.returnedObjectHandler(resUsedKey, res, {\n ...options,\n ns: namespaces\n }) : `key '${key} (${this.language})' returned an object instead of string.`;\n if (returnDetails) {\n resolved.res = r;\n resolved.usedParams = this.getUsedParamsDetails(options);\n return resolved;\n }\n return r;\n }\n if (keySeparator) {\n const resTypeIsArray = resType === '[object Array]';\n const copy = resTypeIsArray ? [] : {};\n const newKeyToUse = resTypeIsArray ? resExactUsedKey : resUsedKey;\n for (const m in res) {\n if (Object.prototype.hasOwnProperty.call(res, m)) {\n const deepKey = `${newKeyToUse}${keySeparator}${m}`;\n copy[m] = this.translate(deepKey, {\n ...options,\n ...{\n joinArrays: false,\n ns: namespaces\n }\n });\n if (copy[m] === deepKey) copy[m] = res[m];\n }\n }\n res = copy;\n }\n } else if (handleAsObjectInI18nFormat && typeof joinArrays === 'string' && resType === '[object Array]') {\n res = res.join(joinArrays);\n if (res) res = this.extendTranslation(res, keys, options, lastKey);\n } else {\n let usedDefault = false;\n let usedKey = false;\n const needsPluralHandling = options.count !== undefined && typeof options.count !== 'string';\n const hasDefaultValue = Translator.hasDefaultValue(options);\n const defaultValueSuffix = needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, options) : '';\n const defaultValueSuffixOrdinalFallback = options.ordinal && needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, {\n ordinal: false\n }) : '';\n const needsZeroSuffixLookup = needsPluralHandling && !options.ordinal && options.count === 0 && this.pluralResolver.shouldUseIntlApi();\n const defaultValue = needsZeroSuffixLookup && options[`defaultValue${this.options.pluralSeparator}zero`] || options[`defaultValue${defaultValueSuffix}`] || options[`defaultValue${defaultValueSuffixOrdinalFallback}`] || options.defaultValue;\n if (!this.isValidLookup(res) && hasDefaultValue) {\n usedDefault = true;\n res = defaultValue;\n }\n if (!this.isValidLookup(res)) {\n usedKey = true;\n res = key;\n }\n const missingKeyNoValueFallbackToKey = options.missingKeyNoValueFallbackToKey || this.options.missingKeyNoValueFallbackToKey;\n const resForMissing = missingKeyNoValueFallbackToKey && usedKey ? undefined : res;\n const updateMissing = hasDefaultValue && defaultValue !== res && this.options.updateMissing;\n if (usedKey || usedDefault || updateMissing) {\n this.logger.log(updateMissing ? 'updateKey' : 'missingKey', lng, namespace, key, updateMissing ? defaultValue : res);\n if (keySeparator) {\n const fk = this.resolve(key, {\n ...options,\n keySeparator: false\n });\n if (fk && fk.res) this.logger.warn('Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.');\n }\n let lngs = [];\n const fallbackLngs = this.languageUtils.getFallbackCodes(this.options.fallbackLng, options.lng || this.language);\n if (this.options.saveMissingTo === 'fallback' && fallbackLngs && fallbackLngs[0]) {\n for (let i = 0; i < fallbackLngs.length; i++) {\n lngs.push(fallbackLngs[i]);\n }\n } else if (this.options.saveMissingTo === 'all') {\n lngs = this.languageUtils.toResolveHierarchy(options.lng || this.language);\n } else {\n lngs.push(options.lng || this.language);\n }\n const send = (l, k, specificDefaultValue) => {\n const defaultForMissing = hasDefaultValue && specificDefaultValue !== res ? specificDefaultValue : resForMissing;\n if (this.options.missingKeyHandler) {\n this.options.missingKeyHandler(l, namespace, k, defaultForMissing, updateMissing, options);\n } else if (this.backendConnector && this.backendConnector.saveMissing) {\n this.backendConnector.saveMissing(l, namespace, k, defaultForMissing, updateMissing, options);\n }\n this.emit('missingKey', l, namespace, k, res);\n };\n if (this.options.saveMissing) {\n if (this.options.saveMissingPlurals && needsPluralHandling) {\n lngs.forEach(language => {\n const suffixes = this.pluralResolver.getSuffixes(language, options);\n if (needsZeroSuffixLookup && options[`defaultValue${this.options.pluralSeparator}zero`] && suffixes.indexOf(`${this.options.pluralSeparator}zero`) < 0) {\n suffixes.push(`${this.options.pluralSeparator}zero`);\n }\n suffixes.forEach(suffix => {\n send([language], key + suffix, options[`defaultValue${suffix}`] || defaultValue);\n });\n });\n } else {\n send(lngs, key, defaultValue);\n }\n }\n }\n res = this.extendTranslation(res, keys, options, resolved, lastKey);\n if (usedKey && res === key && this.options.appendNamespaceToMissingKey) res = `${namespace}:${key}`;\n if ((usedKey || usedDefault) && this.options.parseMissingKeyHandler) {\n if (this.options.compatibilityAPI !== 'v1') {\n res = this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey ? `${namespace}:${key}` : key, usedDefault ? res : undefined);\n } else {\n res = this.options.parseMissingKeyHandler(res);\n }\n }\n }\n if (returnDetails) {\n resolved.res = res;\n resolved.usedParams = this.getUsedParamsDetails(options);\n return resolved;\n }\n return res;\n }\n extendTranslation(res, key, options, resolved, lastKey) {\n var _this = this;\n if (this.i18nFormat && this.i18nFormat.parse) {\n res = this.i18nFormat.parse(res, {\n ...this.options.interpolation.defaultVariables,\n ...options\n }, options.lng || this.language || resolved.usedLng, resolved.usedNS, resolved.usedKey, {\n resolved\n });\n } else if (!options.skipInterpolation) {\n if (options.interpolation) this.interpolator.init({\n ...options,\n ...{\n interpolation: {\n ...this.options.interpolation,\n ...options.interpolation\n }\n }\n });\n const skipOnVariables = typeof res === 'string' && (options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables);\n let nestBef;\n if (skipOnVariables) {\n const nb = res.match(this.interpolator.nestingRegexp);\n nestBef = nb && nb.length;\n }\n let data = options.replace && typeof options.replace !== 'string' ? options.replace : options;\n if (this.options.interpolation.defaultVariables) data = {\n ...this.options.interpolation.defaultVariables,\n ...data\n };\n res = this.interpolator.interpolate(res, data, options.lng || this.language, options);\n if (skipOnVariables) {\n const na = res.match(this.interpolator.nestingRegexp);\n const nestAft = na && na.length;\n if (nestBef < nestAft) options.nest = false;\n }\n if (!options.lng && this.options.compatibilityAPI !== 'v1' && resolved && resolved.res) options.lng = resolved.usedLng;\n if (options.nest !== false) res = this.interpolator.nest(res, function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (lastKey && lastKey[0] === args[0] && !options.context) {\n _this.logger.warn(`It seems you are nesting recursively key: ${args[0]} in key: ${key[0]}`);\n return null;\n }\n return _this.translate(...args, key);\n }, options);\n if (options.interpolation) this.interpolator.reset();\n }\n const postProcess = options.postProcess || this.options.postProcess;\n const postProcessorNames = typeof postProcess === 'string' ? [postProcess] : postProcess;\n if (res !== undefined && res !== null && postProcessorNames && postProcessorNames.length && options.applyPostProcessor !== false) {\n res = postProcessor.handle(postProcessorNames, res, key, this.options && this.options.postProcessPassResolved ? {\n i18nResolved: {\n ...resolved,\n usedParams: this.getUsedParamsDetails(options)\n },\n ...options\n } : options, this);\n }\n return res;\n }\n resolve(keys) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let found;\n let usedKey;\n let exactUsedKey;\n let usedLng;\n let usedNS;\n if (typeof keys === 'string') keys = [keys];\n keys.forEach(k => {\n if (this.isValidLookup(found)) return;\n const extracted = this.extractFromKey(k, options);\n const key = extracted.key;\n usedKey = key;\n let namespaces = extracted.namespaces;\n if (this.options.fallbackNS) namespaces = namespaces.concat(this.options.fallbackNS);\n const needsPluralHandling = options.count !== undefined && typeof options.count !== 'string';\n const needsZeroSuffixLookup = needsPluralHandling && !options.ordinal && options.count === 0 && this.pluralResolver.shouldUseIntlApi();\n const needsContextHandling = options.context !== undefined && (typeof options.context === 'string' || typeof options.context === 'number') && options.context !== '';\n const codes = options.lngs ? options.lngs : this.languageUtils.toResolveHierarchy(options.lng || this.language, options.fallbackLng);\n namespaces.forEach(ns => {\n if (this.isValidLookup(found)) return;\n usedNS = ns;\n if (!checkedLoadedFor[`${codes[0]}-${ns}`] && this.utils && this.utils.hasLoadedNamespace && !this.utils.hasLoadedNamespace(usedNS)) {\n checkedLoadedFor[`${codes[0]}-${ns}`] = true;\n this.logger.warn(`key \"${usedKey}\" for languages \"${codes.join(', ')}\" won't get resolved as namespace \"${usedNS}\" was not yet loaded`, 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!');\n }\n codes.forEach(code => {\n if (this.isValidLookup(found)) return;\n usedLng = code;\n const finalKeys = [key];\n if (this.i18nFormat && this.i18nFormat.addLookupKeys) {\n this.i18nFormat.addLookupKeys(finalKeys, key, code, ns, options);\n } else {\n let pluralSuffix;\n if (needsPluralHandling) pluralSuffix = this.pluralResolver.getSuffix(code, options.count, options);\n const zeroSuffix = `${this.options.pluralSeparator}zero`;\n const ordinalPrefix = `${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;\n if (needsPluralHandling) {\n finalKeys.push(key + pluralSuffix);\n if (options.ordinal && pluralSuffix.indexOf(ordinalPrefix) === 0) {\n finalKeys.push(key + pluralSuffix.replace(ordinalPrefix, this.options.pluralSeparator));\n }\n if (needsZeroSuffixLookup) {\n finalKeys.push(key + zeroSuffix);\n }\n }\n if (needsContextHandling) {\n const contextKey = `${key}${this.options.contextSeparator}${options.context}`;\n finalKeys.push(contextKey);\n if (needsPluralHandling) {\n finalKeys.push(contextKey + pluralSuffix);\n if (options.ordinal && pluralSuffix.indexOf(ordinalPrefix) === 0) {\n finalKeys.push(contextKey + pluralSuffix.replace(ordinalPrefix, this.options.pluralSeparator));\n }\n if (needsZeroSuffixLookup) {\n finalKeys.push(contextKey + zeroSuffix);\n }\n }\n }\n }\n let possibleKey;\n while (possibleKey = finalKeys.pop()) {\n if (!this.isValidLookup(found)) {\n exactUsedKey = possibleKey;\n found = this.getResource(code, ns, possibleKey, options);\n }\n }\n });\n });\n });\n return {\n res: found,\n usedKey,\n exactUsedKey,\n usedLng,\n usedNS\n };\n }\n isValidLookup(res) {\n return res !== undefined && !(!this.options.returnNull && res === null) && !(!this.options.returnEmptyString && res === '');\n }\n getResource(code, ns, key) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n if (this.i18nFormat && this.i18nFormat.getResource) return this.i18nFormat.getResource(code, ns, key, options);\n return this.resourceStore.getResource(code, ns, key, options);\n }\n getUsedParamsDetails() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n const optionsKeys = ['defaultValue', 'ordinal', 'context', 'replace', 'lng', 'lngs', 'fallbackLng', 'ns', 'keySeparator', 'nsSeparator', 'returnObjects', 'returnDetails', 'joinArrays', 'postProcess', 'interpolation'];\n const useOptionsReplaceForData = options.replace && typeof options.replace !== 'string';\n let data = useOptionsReplaceForData ? options.replace : options;\n if (useOptionsReplaceForData && typeof options.count !== 'undefined') {\n data.count = options.count;\n }\n if (this.options.interpolation.defaultVariables) {\n data = {\n ...this.options.interpolation.defaultVariables,\n ...data\n };\n }\n if (!useOptionsReplaceForData) {\n data = {\n ...data\n };\n for (const key of optionsKeys) {\n delete data[key];\n }\n }\n return data;\n }\n static hasDefaultValue(options) {\n const prefix = 'defaultValue';\n for (const option in options) {\n if (Object.prototype.hasOwnProperty.call(options, option) && prefix === option.substring(0, prefix.length) && undefined !== options[option]) {\n return true;\n }\n }\n return false;\n }\n}\n\nfunction capitalize(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\nclass LanguageUtil {\n constructor(options) {\n this.options = options;\n this.supportedLngs = this.options.supportedLngs || false;\n this.logger = baseLogger.create('languageUtils');\n }\n getScriptPartFromCode(code) {\n code = getCleanedCode(code);\n if (!code || code.indexOf('-') < 0) return null;\n const p = code.split('-');\n if (p.length === 2) return null;\n p.pop();\n if (p[p.length - 1].toLowerCase() === 'x') return null;\n return this.formatLanguageCode(p.join('-'));\n }\n getLanguagePartFromCode(code) {\n code = getCleanedCode(code);\n if (!code || code.indexOf('-') < 0) return code;\n const p = code.split('-');\n return this.formatLanguageCode(p[0]);\n }\n formatLanguageCode(code) {\n if (typeof code === 'string' && code.indexOf('-') > -1) {\n const specialCases = ['hans', 'hant', 'latn', 'cyrl', 'cans', 'mong', 'arab'];\n let p = code.split('-');\n if (this.options.lowerCaseLng) {\n p = p.map(part => part.toLowerCase());\n } else if (p.length === 2) {\n p[0] = p[0].toLowerCase();\n p[1] = p[1].toUpperCase();\n if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n } else if (p.length === 3) {\n p[0] = p[0].toLowerCase();\n if (p[1].length === 2) p[1] = p[1].toUpperCase();\n if (p[0] !== 'sgn' && p[2].length === 2) p[2] = p[2].toUpperCase();\n if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n if (specialCases.indexOf(p[2].toLowerCase()) > -1) p[2] = capitalize(p[2].toLowerCase());\n }\n return p.join('-');\n }\n return this.options.cleanCode || this.options.lowerCaseLng ? code.toLowerCase() : code;\n }\n isSupportedCode(code) {\n if (this.options.load === 'languageOnly' || this.options.nonExplicitSupportedLngs) {\n code = this.getLanguagePartFromCode(code);\n }\n return !this.supportedLngs || !this.supportedLngs.length || this.supportedLngs.indexOf(code) > -1;\n }\n getBestMatchFromCodes(codes) {\n if (!codes) return null;\n let found;\n codes.forEach(code => {\n if (found) return;\n const cleanedLng = this.formatLanguageCode(code);\n if (!this.options.supportedLngs || this.isSupportedCode(cleanedLng)) found = cleanedLng;\n });\n if (!found && this.options.supportedLngs) {\n codes.forEach(code => {\n if (found) return;\n const lngOnly = this.getLanguagePartFromCode(code);\n if (this.isSupportedCode(lngOnly)) return found = lngOnly;\n found = this.options.supportedLngs.find(supportedLng => {\n if (supportedLng === lngOnly) return supportedLng;\n if (supportedLng.indexOf('-') < 0 && lngOnly.indexOf('-') < 0) return;\n if (supportedLng.indexOf(lngOnly) === 0) return supportedLng;\n });\n });\n }\n if (!found) found = this.getFallbackCodes(this.options.fallbackLng)[0];\n return found;\n }\n getFallbackCodes(fallbacks, code) {\n if (!fallbacks) return [];\n if (typeof fallbacks === 'function') fallbacks = fallbacks(code);\n if (typeof fallbacks === 'string') fallbacks = [fallbacks];\n if (Object.prototype.toString.apply(fallbacks) === '[object Array]') return fallbacks;\n if (!code) return fallbacks.default || [];\n let found = fallbacks[code];\n if (!found) found = fallbacks[this.getScriptPartFromCode(code)];\n if (!found) found = fallbacks[this.formatLanguageCode(code)];\n if (!found) found = fallbacks[this.getLanguagePartFromCode(code)];\n if (!found) found = fallbacks.default;\n return found || [];\n }\n toResolveHierarchy(code, fallbackCode) {\n const fallbackCodes = this.getFallbackCodes(fallbackCode || this.options.fallbackLng || [], code);\n const codes = [];\n const addCode = c => {\n if (!c) return;\n if (this.isSupportedCode(c)) {\n codes.push(c);\n } else {\n this.logger.warn(`rejecting language code not found in supportedLngs: ${c}`);\n }\n };\n if (typeof code === 'string' && (code.indexOf('-') > -1 || code.indexOf('_') > -1)) {\n if (this.options.load !== 'languageOnly') addCode(this.formatLanguageCode(code));\n if (this.options.load !== 'languageOnly' && this.options.load !== 'currentOnly') addCode(this.getScriptPartFromCode(code));\n if (this.options.load !== 'currentOnly') addCode(this.getLanguagePartFromCode(code));\n } else if (typeof code === 'string') {\n addCode(this.formatLanguageCode(code));\n }\n fallbackCodes.forEach(fc => {\n if (codes.indexOf(fc) < 0) addCode(this.formatLanguageCode(fc));\n });\n return codes;\n }\n}\n\nlet sets = [{\n lngs: ['ach', 'ak', 'am', 'arn', 'br', 'fil', 'gun', 'ln', 'mfe', 'mg', 'mi', 'oc', 'pt', 'pt-BR', 'tg', 'tl', 'ti', 'tr', 'uz', 'wa'],\n nr: [1, 2],\n fc: 1\n}, {\n lngs: ['af', 'an', 'ast', 'az', 'bg', 'bn', 'ca', 'da', 'de', 'dev', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fi', 'fo', 'fur', 'fy', 'gl', 'gu', 'ha', 'hi', 'hu', 'hy', 'ia', 'it', 'kk', 'kn', 'ku', 'lb', 'mai', 'ml', 'mn', 'mr', 'nah', 'nap', 'nb', 'ne', 'nl', 'nn', 'no', 'nso', 'pa', 'pap', 'pms', 'ps', 'pt-PT', 'rm', 'sco', 'se', 'si', 'so', 'son', 'sq', 'sv', 'sw', 'ta', 'te', 'tk', 'ur', 'yo'],\n nr: [1, 2],\n fc: 2\n}, {\n lngs: ['ay', 'bo', 'cgg', 'fa', 'ht', 'id', 'ja', 'jbo', 'ka', 'km', 'ko', 'ky', 'lo', 'ms', 'sah', 'su', 'th', 'tt', 'ug', 'vi', 'wo', 'zh'],\n nr: [1],\n fc: 3\n}, {\n lngs: ['be', 'bs', 'cnr', 'dz', 'hr', 'ru', 'sr', 'uk'],\n nr: [1, 2, 5],\n fc: 4\n}, {\n lngs: ['ar'],\n nr: [0, 1, 2, 3, 11, 100],\n fc: 5\n}, {\n lngs: ['cs', 'sk'],\n nr: [1, 2, 5],\n fc: 6\n}, {\n lngs: ['csb', 'pl'],\n nr: [1, 2, 5],\n fc: 7\n}, {\n lngs: ['cy'],\n nr: [1, 2, 3, 8],\n fc: 8\n}, {\n lngs: ['fr'],\n nr: [1, 2],\n fc: 9\n}, {\n lngs: ['ga'],\n nr: [1, 2, 3, 7, 11],\n fc: 10\n}, {\n lngs: ['gd'],\n nr: [1, 2, 3, 20],\n fc: 11\n}, {\n lngs: ['is'],\n nr: [1, 2],\n fc: 12\n}, {\n lngs: ['jv'],\n nr: [0, 1],\n fc: 13\n}, {\n lngs: ['kw'],\n nr: [1, 2, 3, 4],\n fc: 14\n}, {\n lngs: ['lt'],\n nr: [1, 2, 10],\n fc: 15\n}, {\n lngs: ['lv'],\n nr: [1, 2, 0],\n fc: 16\n}, {\n lngs: ['mk'],\n nr: [1, 2],\n fc: 17\n}, {\n lngs: ['mnk'],\n nr: [0, 1, 2],\n fc: 18\n}, {\n lngs: ['mt'],\n nr: [1, 2, 11, 20],\n fc: 19\n}, {\n lngs: ['or'],\n nr: [2, 1],\n fc: 2\n}, {\n lngs: ['ro'],\n nr: [1, 2, 20],\n fc: 20\n}, {\n lngs: ['sl'],\n nr: [5, 1, 2, 3],\n fc: 21\n}, {\n lngs: ['he', 'iw'],\n nr: [1, 2, 20, 21],\n fc: 22\n}];\nlet _rulesPluralsTypes = {\n 1: function (n) {\n return Number(n > 1);\n },\n 2: function (n) {\n return Number(n != 1);\n },\n 3: function (n) {\n return 0;\n },\n 4: function (n) {\n return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n },\n 5: function (n) {\n return Number(n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5);\n },\n 6: function (n) {\n return Number(n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2);\n },\n 7: function (n) {\n return Number(n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n },\n 8: function (n) {\n return Number(n == 1 ? 0 : n == 2 ? 1 : n != 8 && n != 11 ? 2 : 3);\n },\n 9: function (n) {\n return Number(n >= 2);\n },\n 10: function (n) {\n return Number(n == 1 ? 0 : n == 2 ? 1 : n < 7 ? 2 : n < 11 ? 3 : 4);\n },\n 11: function (n) {\n return Number(n == 1 || n == 11 ? 0 : n == 2 || n == 12 ? 1 : n > 2 && n < 20 ? 2 : 3);\n },\n 12: function (n) {\n return Number(n % 10 != 1 || n % 100 == 11);\n },\n 13: function (n) {\n return Number(n !== 0);\n },\n 14: function (n) {\n return Number(n == 1 ? 0 : n == 2 ? 1 : n == 3 ? 2 : 3);\n },\n 15: function (n) {\n return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n },\n 16: function (n) {\n return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n !== 0 ? 1 : 2);\n },\n 17: function (n) {\n return Number(n == 1 || n % 10 == 1 && n % 100 != 11 ? 0 : 1);\n },\n 18: function (n) {\n return Number(n == 0 ? 0 : n == 1 ? 1 : 2);\n },\n 19: function (n) {\n return Number(n == 1 ? 0 : n == 0 || n % 100 > 1 && n % 100 < 11 ? 1 : n % 100 > 10 && n % 100 < 20 ? 2 : 3);\n },\n 20: function (n) {\n return Number(n == 1 ? 0 : n == 0 || n % 100 > 0 && n % 100 < 20 ? 1 : 2);\n },\n 21: function (n) {\n return Number(n % 100 == 1 ? 1 : n % 100 == 2 ? 2 : n % 100 == 3 || n % 100 == 4 ? 3 : 0);\n },\n 22: function (n) {\n return Number(n == 1 ? 0 : n == 2 ? 1 : (n < 0 || n > 10) && n % 10 == 0 ? 2 : 3);\n }\n};\nconst nonIntlVersions = ['v1', 'v2', 'v3'];\nconst intlVersions = ['v4'];\nconst suffixesOrder = {\n zero: 0,\n one: 1,\n two: 2,\n few: 3,\n many: 4,\n other: 5\n};\nfunction createRules() {\n const rules = {};\n sets.forEach(set => {\n set.lngs.forEach(l => {\n rules[l] = {\n numbers: set.nr,\n plurals: _rulesPluralsTypes[set.fc]\n };\n });\n });\n return rules;\n}\nclass PluralResolver {\n constructor(languageUtils) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.languageUtils = languageUtils;\n this.options = options;\n this.logger = baseLogger.create('pluralResolver');\n if ((!this.options.compatibilityJSON || intlVersions.includes(this.options.compatibilityJSON)) && (typeof Intl === 'undefined' || !Intl.PluralRules)) {\n this.options.compatibilityJSON = 'v3';\n this.logger.error('Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.');\n }\n this.rules = createRules();\n }\n addRule(lng, obj) {\n this.rules[lng] = obj;\n }\n getRule(code) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n if (this.shouldUseIntlApi()) {\n try {\n return new Intl.PluralRules(getCleanedCode(code === 'dev' ? 'en' : code), {\n type: options.ordinal ? 'ordinal' : 'cardinal'\n });\n } catch (err) {\n return;\n }\n }\n return this.rules[code] || this.rules[this.languageUtils.getLanguagePartFromCode(code)];\n }\n needsPlural(code) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const rule = this.getRule(code, options);\n if (this.shouldUseIntlApi()) {\n return rule && rule.resolvedOptions().pluralCategories.length > 1;\n }\n return rule && rule.numbers.length > 1;\n }\n getPluralFormsOfKey(code, key) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n return this.getSuffixes(code, options).map(suffix => `${key}${suffix}`);\n }\n getSuffixes(code) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const rule = this.getRule(code, options);\n if (!rule) {\n return [];\n }\n if (this.shouldUseIntlApi()) {\n return rule.resolvedOptions().pluralCategories.sort((pluralCategory1, pluralCategory2) => suffixesOrder[pluralCategory1] - suffixesOrder[pluralCategory2]).map(pluralCategory => `${this.options.prepend}${options.ordinal ? `ordinal${this.options.prepend}` : ''}${pluralCategory}`);\n }\n return rule.numbers.map(number => this.getSuffix(code, number, options));\n }\n getSuffix(code, count) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n const rule = this.getRule(code, options);\n if (rule) {\n if (this.shouldUseIntlApi()) {\n return `${this.options.prepend}${options.ordinal ? `ordinal${this.options.prepend}` : ''}${rule.select(count)}`;\n }\n return this.getSuffixRetroCompatible(rule, count);\n }\n this.logger.warn(`no plural rule found for: ${code}`);\n return '';\n }\n getSuffixRetroCompatible(rule, count) {\n const idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count));\n let suffix = rule.numbers[idx];\n if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {\n if (suffix === 2) {\n suffix = 'plural';\n } else if (suffix === 1) {\n suffix = '';\n }\n }\n const returnSuffix = () => this.options.prepend && suffix.toString() ? this.options.prepend + suffix.toString() : suffix.toString();\n if (this.options.compatibilityJSON === 'v1') {\n if (suffix === 1) return '';\n if (typeof suffix === 'number') return `_plural_${suffix.toString()}`;\n return returnSuffix();\n } else if (this.options.compatibilityJSON === 'v2') {\n return returnSuffix();\n } else if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {\n return returnSuffix();\n }\n return this.options.prepend && idx.toString() ? this.options.prepend + idx.toString() : idx.toString();\n }\n shouldUseIntlApi() {\n return !nonIntlVersions.includes(this.options.compatibilityJSON);\n }\n}\n\nfunction deepFindWithDefaults(data, defaultData, key) {\n let keySeparator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '.';\n let ignoreJSONStructure = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n let path = getPathWithDefaults(data, defaultData, key);\n if (!path && ignoreJSONStructure && typeof key === 'string') {\n path = deepFind(data, key, keySeparator);\n if (path === undefined) path = deepFind(defaultData, key, keySeparator);\n }\n return path;\n}\nclass Interpolator {\n constructor() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.logger = baseLogger.create('interpolator');\n this.options = options;\n this.format = options.interpolation && options.interpolation.format || (value => value);\n this.init(options);\n }\n init() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (!options.interpolation) options.interpolation = {\n escapeValue: true\n };\n const iOpts = options.interpolation;\n this.escape = iOpts.escape !== undefined ? iOpts.escape : escape;\n this.escapeValue = iOpts.escapeValue !== undefined ? iOpts.escapeValue : true;\n this.useRawValueToEscape = iOpts.useRawValueToEscape !== undefined ? iOpts.useRawValueToEscape : false;\n this.prefix = iOpts.prefix ? regexEscape(iOpts.prefix) : iOpts.prefixEscaped || '{{';\n this.suffix = iOpts.suffix ? regexEscape(iOpts.suffix) : iOpts.suffixEscaped || '}}';\n this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ',';\n this.unescapePrefix = iOpts.unescapeSuffix ? '' : iOpts.unescapePrefix || '-';\n this.unescapeSuffix = this.unescapePrefix ? '' : iOpts.unescapeSuffix || '';\n this.nestingPrefix = iOpts.nestingPrefix ? regexEscape(iOpts.nestingPrefix) : iOpts.nestingPrefixEscaped || regexEscape('$t(');\n this.nestingSuffix = iOpts.nestingSuffix ? regexEscape(iOpts.nestingSuffix) : iOpts.nestingSuffixEscaped || regexEscape(')');\n this.nestingOptionsSeparator = iOpts.nestingOptionsSeparator ? iOpts.nestingOptionsSeparator : iOpts.nestingOptionsSeparator || ',';\n this.maxReplaces = iOpts.maxReplaces ? iOpts.maxReplaces : 1000;\n this.alwaysFormat = iOpts.alwaysFormat !== undefined ? iOpts.alwaysFormat : false;\n this.resetRegExp();\n }\n reset() {\n if (this.options) this.init(this.options);\n }\n resetRegExp() {\n const getOrResetRegExp = (existingRegExp, pattern) => {\n if (existingRegExp && existingRegExp.source === pattern) {\n existingRegExp.lastIndex = 0;\n return existingRegExp;\n }\n return new RegExp(pattern, 'g');\n };\n this.regexp = getOrResetRegExp(this.regexp, `${this.prefix}(.+?)${this.suffix}`);\n this.regexpUnescape = getOrResetRegExp(this.regexpUnescape, `${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`);\n this.nestingRegexp = getOrResetRegExp(this.nestingRegexp, `${this.nestingPrefix}(.+?)${this.nestingSuffix}`);\n }\n interpolate(str, data, lng, options) {\n let match;\n let value;\n let replaces;\n const defaultData = this.options && this.options.interpolation && this.options.interpolation.defaultVariables || {};\n function regexSafe(val) {\n return val.replace(/\\$/g, '$$$$');\n }\n const handleFormat = key => {\n if (key.indexOf(this.formatSeparator) < 0) {\n const path = deepFindWithDefaults(data, defaultData, key, this.options.keySeparator, this.options.ignoreJSONStructure);\n return this.alwaysFormat ? this.format(path, undefined, lng, {\n ...options,\n ...data,\n interpolationkey: key\n }) : path;\n }\n const p = key.split(this.formatSeparator);\n const k = p.shift().trim();\n const f = p.join(this.formatSeparator).trim();\n return this.format(deepFindWithDefaults(data, defaultData, k, this.options.keySeparator, this.options.ignoreJSONStructure), f, lng, {\n ...options,\n ...data,\n interpolationkey: k\n });\n };\n this.resetRegExp();\n const missingInterpolationHandler = options && options.missingInterpolationHandler || this.options.missingInterpolationHandler;\n const skipOnVariables = options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables;\n const todos = [{\n regex: this.regexpUnescape,\n safeValue: val => regexSafe(val)\n }, {\n regex: this.regexp,\n safeValue: val => this.escapeValue ? regexSafe(this.escape(val)) : regexSafe(val)\n }];\n todos.forEach(todo => {\n replaces = 0;\n while (match = todo.regex.exec(str)) {\n const matchedVar = match[1].trim();\n value = handleFormat(matchedVar);\n if (value === undefined) {\n if (typeof missingInterpolationHandler === 'function') {\n const temp = missingInterpolationHandler(str, match, options);\n value = typeof temp === 'string' ? temp : '';\n } else if (options && Object.prototype.hasOwnProperty.call(options, matchedVar)) {\n value = '';\n } else if (skipOnVariables) {\n value = match[0];\n continue;\n } else {\n this.logger.warn(`missed to pass in variable ${matchedVar} for interpolating ${str}`);\n value = '';\n }\n } else if (typeof value !== 'string' && !this.useRawValueToEscape) {\n value = makeString(value);\n }\n const safeValue = todo.safeValue(value);\n str = str.replace(match[0], safeValue);\n if (skipOnVariables) {\n todo.regex.lastIndex += value.length;\n todo.regex.lastIndex -= match[0].length;\n } else {\n todo.regex.lastIndex = 0;\n }\n replaces++;\n if (replaces >= this.maxReplaces) {\n break;\n }\n }\n });\n return str;\n }\n nest(str, fc) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n let match;\n let value;\n let clonedOptions;\n function handleHasOptions(key, inheritedOptions) {\n const sep = this.nestingOptionsSeparator;\n if (key.indexOf(sep) < 0) return key;\n const c = key.split(new RegExp(`${sep}[ ]*{`));\n let optionsString = `{${c[1]}`;\n key = c[0];\n optionsString = this.interpolate(optionsString, clonedOptions);\n const matchedSingleQuotes = optionsString.match(/'/g);\n const matchedDoubleQuotes = optionsString.match(/\"/g);\n if (matchedSingleQuotes && matchedSingleQuotes.length % 2 === 0 && !matchedDoubleQuotes || matchedDoubleQuotes.length % 2 !== 0) {\n optionsString = optionsString.replace(/'/g, '\"');\n }\n try {\n clonedOptions = JSON.parse(optionsString);\n if (inheritedOptions) clonedOptions = {\n ...inheritedOptions,\n ...clonedOptions\n };\n } catch (e) {\n this.logger.warn(`failed parsing options string in nesting for key ${key}`, e);\n return `${key}${sep}${optionsString}`;\n }\n delete clonedOptions.defaultValue;\n return key;\n }\n while (match = this.nestingRegexp.exec(str)) {\n let formatters = [];\n clonedOptions = {\n ...options\n };\n clonedOptions = clonedOptions.replace && typeof clonedOptions.replace !== 'string' ? clonedOptions.replace : clonedOptions;\n clonedOptions.applyPostProcessor = false;\n delete clonedOptions.defaultValue;\n let doReduce = false;\n if (match[0].indexOf(this.formatSeparator) !== -1 && !/{.*}/.test(match[1])) {\n const r = match[1].split(this.formatSeparator).map(elem => elem.trim());\n match[1] = r.shift();\n formatters = r;\n doReduce = true;\n }\n value = fc(handleHasOptions.call(this, match[1].trim(), clonedOptions), clonedOptions);\n if (value && match[0] === str && typeof value !== 'string') return value;\n if (typeof value !== 'string') value = makeString(value);\n if (!value) {\n this.logger.warn(`missed to resolve ${match[1]} for nesting ${str}`);\n value = '';\n }\n if (doReduce) {\n value = formatters.reduce((v, f) => this.format(v, f, options.lng, {\n ...options,\n interpolationkey: match[1].trim()\n }), value.trim());\n }\n str = str.replace(match[0], value);\n this.regexp.lastIndex = 0;\n }\n return str;\n }\n}\n\nfunction parseFormatStr(formatStr) {\n let formatName = formatStr.toLowerCase().trim();\n const formatOptions = {};\n if (formatStr.indexOf('(') > -1) {\n const p = formatStr.split('(');\n formatName = p[0].toLowerCase().trim();\n const optStr = p[1].substring(0, p[1].length - 1);\n if (formatName === 'currency' && optStr.indexOf(':') < 0) {\n if (!formatOptions.currency) formatOptions.currency = optStr.trim();\n } else if (formatName === 'relativetime' && optStr.indexOf(':') < 0) {\n if (!formatOptions.range) formatOptions.range = optStr.trim();\n } else {\n const opts = optStr.split(';');\n opts.forEach(opt => {\n if (!opt) return;\n const [key, ...rest] = opt.split(':');\n const val = rest.join(':').trim().replace(/^'+|'+$/g, '');\n if (!formatOptions[key.trim()]) formatOptions[key.trim()] = val;\n if (val === 'false') formatOptions[key.trim()] = false;\n if (val === 'true') formatOptions[key.trim()] = true;\n if (!isNaN(val)) formatOptions[key.trim()] = parseInt(val, 10);\n });\n }\n }\n return {\n formatName,\n formatOptions\n };\n}\nfunction createCachedFormatter(fn) {\n const cache = {};\n return function invokeFormatter(val, lng, options) {\n const key = lng + JSON.stringify(options);\n let formatter = cache[key];\n if (!formatter) {\n formatter = fn(getCleanedCode(lng), options);\n cache[key] = formatter;\n }\n return formatter(val);\n };\n}\nclass Formatter {\n constructor() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.logger = baseLogger.create('formatter');\n this.options = options;\n this.formats = {\n number: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.NumberFormat(lng, {\n ...opt\n });\n return val => formatter.format(val);\n }),\n currency: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.NumberFormat(lng, {\n ...opt,\n style: 'currency'\n });\n return val => formatter.format(val);\n }),\n datetime: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.DateTimeFormat(lng, {\n ...opt\n });\n return val => formatter.format(val);\n }),\n relativetime: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.RelativeTimeFormat(lng, {\n ...opt\n });\n return val => formatter.format(val, opt.range || 'day');\n }),\n list: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.ListFormat(lng, {\n ...opt\n });\n return val => formatter.format(val);\n })\n };\n this.init(options);\n }\n init(services) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n interpolation: {}\n };\n const iOpts = options.interpolation;\n this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ',';\n }\n add(name, fc) {\n this.formats[name.toLowerCase().trim()] = fc;\n }\n addCached(name, fc) {\n this.formats[name.toLowerCase().trim()] = createCachedFormatter(fc);\n }\n format(value, format, lng) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n const formats = format.split(this.formatSeparator);\n const result = formats.reduce((mem, f) => {\n const {\n formatName,\n formatOptions\n } = parseFormatStr(f);\n if (this.formats[formatName]) {\n let formatted = mem;\n try {\n const valOptions = options && options.formatParams && options.formatParams[options.interpolationkey] || {};\n const l = valOptions.locale || valOptions.lng || options.locale || options.lng || lng;\n formatted = this.formats[formatName](mem, l, {\n ...formatOptions,\n ...options,\n ...valOptions\n });\n } catch (error) {\n this.logger.warn(error);\n }\n return formatted;\n } else {\n this.logger.warn(`there was no format function for ${formatName}`);\n }\n return mem;\n }, value);\n return result;\n }\n}\n\nfunction removePending(q, name) {\n if (q.pending[name] !== undefined) {\n delete q.pending[name];\n q.pendingCount--;\n }\n}\nclass Connector extends EventEmitter {\n constructor(backend, store, services) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n super();\n this.backend = backend;\n this.store = store;\n this.services = services;\n this.languageUtils = services.languageUtils;\n this.options = options;\n this.logger = baseLogger.create('backendConnector');\n this.waitingReads = [];\n this.maxParallelReads = options.maxParallelReads || 10;\n this.readingCalls = 0;\n this.maxRetries = options.maxRetries >= 0 ? options.maxRetries : 5;\n this.retryTimeout = options.retryTimeout >= 1 ? options.retryTimeout : 350;\n this.state = {};\n this.queue = [];\n if (this.backend && this.backend.init) {\n this.backend.init(services, options.backend, options);\n }\n }\n queueLoad(languages, namespaces, options, callback) {\n const toLoad = {};\n const pending = {};\n const toLoadLanguages = {};\n const toLoadNamespaces = {};\n languages.forEach(lng => {\n let hasAllNamespaces = true;\n namespaces.forEach(ns => {\n const name = `${lng}|${ns}`;\n if (!options.reload && this.store.hasResourceBundle(lng, ns)) {\n this.state[name] = 2;\n } else if (this.state[name] < 0) ; else if (this.state[name] === 1) {\n if (pending[name] === undefined) pending[name] = true;\n } else {\n this.state[name] = 1;\n hasAllNamespaces = false;\n if (pending[name] === undefined) pending[name] = true;\n if (toLoad[name] === undefined) toLoad[name] = true;\n if (toLoadNamespaces[ns] === undefined) toLoadNamespaces[ns] = true;\n }\n });\n if (!hasAllNamespaces) toLoadLanguages[lng] = true;\n });\n if (Object.keys(toLoad).length || Object.keys(pending).length) {\n this.queue.push({\n pending,\n pendingCount: Object.keys(pending).length,\n loaded: {},\n errors: [],\n callback\n });\n }\n return {\n toLoad: Object.keys(toLoad),\n pending: Object.keys(pending),\n toLoadLanguages: Object.keys(toLoadLanguages),\n toLoadNamespaces: Object.keys(toLoadNamespaces)\n };\n }\n loaded(name, err, data) {\n const s = name.split('|');\n const lng = s[0];\n const ns = s[1];\n if (err) this.emit('failedLoading', lng, ns, err);\n if (data) {\n this.store.addResourceBundle(lng, ns, data, undefined, undefined, {\n skipCopy: true\n });\n }\n this.state[name] = err ? -1 : 2;\n const loaded = {};\n this.queue.forEach(q => {\n pushPath(q.loaded, [lng], ns);\n removePending(q, name);\n if (err) q.errors.push(err);\n if (q.pendingCount === 0 && !q.done) {\n Object.keys(q.loaded).forEach(l => {\n if (!loaded[l]) loaded[l] = {};\n const loadedKeys = q.loaded[l];\n if (loadedKeys.length) {\n loadedKeys.forEach(n => {\n if (loaded[l][n] === undefined) loaded[l][n] = true;\n });\n }\n });\n q.done = true;\n if (q.errors.length) {\n q.callback(q.errors);\n } else {\n q.callback();\n }\n }\n });\n this.emit('loaded', loaded);\n this.queue = this.queue.filter(q => !q.done);\n }\n read(lng, ns, fcName) {\n let tried = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n let wait = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.retryTimeout;\n let callback = arguments.length > 5 ? arguments[5] : undefined;\n if (!lng.length) return callback(null, {});\n if (this.readingCalls >= this.maxParallelReads) {\n this.waitingReads.push({\n lng,\n ns,\n fcName,\n tried,\n wait,\n callback\n });\n return;\n }\n this.readingCalls++;\n const resolver = (err, data) => {\n this.readingCalls--;\n if (this.waitingReads.length > 0) {\n const next = this.waitingReads.shift();\n this.read(next.lng, next.ns, next.fcName, next.tried, next.wait, next.callback);\n }\n if (err && data && tried < this.maxRetries) {\n setTimeout(() => {\n this.read.call(this, lng, ns, fcName, tried + 1, wait * 2, callback);\n }, wait);\n return;\n }\n callback(err, data);\n };\n const fc = this.backend[fcName].bind(this.backend);\n if (fc.length === 2) {\n try {\n const r = fc(lng, ns);\n if (r && typeof r.then === 'function') {\n r.then(data => resolver(null, data)).catch(resolver);\n } else {\n resolver(null, r);\n }\n } catch (err) {\n resolver(err);\n }\n return;\n }\n return fc(lng, ns, resolver);\n }\n prepareLoading(languages, namespaces) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n let callback = arguments.length > 3 ? arguments[3] : undefined;\n if (!this.backend) {\n this.logger.warn('No backend was added via i18next.use. Will not load resources.');\n return callback && callback();\n }\n if (typeof languages === 'string') languages = this.languageUtils.toResolveHierarchy(languages);\n if (typeof namespaces === 'string') namespaces = [namespaces];\n const toLoad = this.queueLoad(languages, namespaces, options, callback);\n if (!toLoad.toLoad.length) {\n if (!toLoad.pending.length) callback();\n return null;\n }\n toLoad.toLoad.forEach(name => {\n this.loadOne(name);\n });\n }\n load(languages, namespaces, callback) {\n this.prepareLoading(languages, namespaces, {}, callback);\n }\n reload(languages, namespaces, callback) {\n this.prepareLoading(languages, namespaces, {\n reload: true\n }, callback);\n }\n loadOne(name) {\n let prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n const s = name.split('|');\n const lng = s[0];\n const ns = s[1];\n this.read(lng, ns, 'read', undefined, undefined, (err, data) => {\n if (err) this.logger.warn(`${prefix}loading namespace ${ns} for language ${lng} failed`, err);\n if (!err && data) this.logger.log(`${prefix}loaded namespace ${ns} for language ${lng}`, data);\n this.loaded(name, err, data);\n });\n }\n saveMissing(languages, namespace, key, fallbackValue, isUpdate) {\n let options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n let clb = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : () => {};\n if (this.services.utils && this.services.utils.hasLoadedNamespace && !this.services.utils.hasLoadedNamespace(namespace)) {\n this.logger.warn(`did not save key \"${key}\" as the namespace \"${namespace}\" was not yet loaded`, 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!');\n return;\n }\n if (key === undefined || key === null || key === '') return;\n if (this.backend && this.backend.create) {\n const opts = {\n ...options,\n isUpdate\n };\n const fc = this.backend.create.bind(this.backend);\n if (fc.length < 6) {\n try {\n let r;\n if (fc.length === 5) {\n r = fc(languages, namespace, key, fallbackValue, opts);\n } else {\n r = fc(languages, namespace, key, fallbackValue);\n }\n if (r && typeof r.then === 'function') {\n r.then(data => clb(null, data)).catch(clb);\n } else {\n clb(null, r);\n }\n } catch (err) {\n clb(err);\n }\n } else {\n fc(languages, namespace, key, fallbackValue, clb, opts);\n }\n }\n if (!languages || !languages[0]) return;\n this.store.addResource(languages[0], namespace, key, fallbackValue);\n }\n}\n\nfunction get() {\n return {\n debug: false,\n initImmediate: true,\n ns: ['translation'],\n defaultNS: ['translation'],\n fallbackLng: ['dev'],\n fallbackNS: false,\n supportedLngs: false,\n nonExplicitSupportedLngs: false,\n load: 'all',\n preload: false,\n simplifyPluralSuffix: true,\n keySeparator: '.',\n nsSeparator: ':',\n pluralSeparator: '_',\n contextSeparator: '_',\n partialBundledLanguages: false,\n saveMissing: false,\n updateMissing: false,\n saveMissingTo: 'fallback',\n saveMissingPlurals: true,\n missingKeyHandler: false,\n missingInterpolationHandler: false,\n postProcess: false,\n postProcessPassResolved: false,\n returnNull: false,\n returnEmptyString: true,\n returnObjects: false,\n joinArrays: false,\n returnedObjectHandler: false,\n parseMissingKeyHandler: false,\n appendNamespaceToMissingKey: false,\n appendNamespaceToCIMode: false,\n overloadTranslationOptionHandler: function handle(args) {\n let ret = {};\n if (typeof args[1] === 'object') ret = args[1];\n if (typeof args[1] === 'string') ret.defaultValue = args[1];\n if (typeof args[2] === 'string') ret.tDescription = args[2];\n if (typeof args[2] === 'object' || typeof args[3] === 'object') {\n const options = args[3] || args[2];\n Object.keys(options).forEach(key => {\n ret[key] = options[key];\n });\n }\n return ret;\n },\n interpolation: {\n escapeValue: true,\n format: value => value,\n prefix: '{{',\n suffix: '}}',\n formatSeparator: ',',\n unescapePrefix: '-',\n nestingPrefix: '$t(',\n nestingSuffix: ')',\n nestingOptionsSeparator: ',',\n maxReplaces: 1000,\n skipOnVariables: true\n }\n };\n}\nfunction transformOptions(options) {\n if (typeof options.ns === 'string') options.ns = [options.ns];\n if (typeof options.fallbackLng === 'string') options.fallbackLng = [options.fallbackLng];\n if (typeof options.fallbackNS === 'string') options.fallbackNS = [options.fallbackNS];\n if (options.supportedLngs && options.supportedLngs.indexOf('cimode') < 0) {\n options.supportedLngs = options.supportedLngs.concat(['cimode']);\n }\n return options;\n}\n\nfunction noop() {}\nfunction bindMemberFunctions(inst) {\n const mems = Object.getOwnPropertyNames(Object.getPrototypeOf(inst));\n mems.forEach(mem => {\n if (typeof inst[mem] === 'function') {\n inst[mem] = inst[mem].bind(inst);\n }\n });\n}\nclass I18n extends EventEmitter {\n constructor() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let callback = arguments.length > 1 ? arguments[1] : undefined;\n super();\n this.options = transformOptions(options);\n this.services = {};\n this.logger = baseLogger;\n this.modules = {\n external: []\n };\n bindMemberFunctions(this);\n if (callback && !this.isInitialized && !options.isClone) {\n if (!this.options.initImmediate) {\n this.init(options, callback);\n return this;\n }\n setTimeout(() => {\n this.init(options, callback);\n }, 0);\n }\n }\n init() {\n var _this = this;\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let callback = arguments.length > 1 ? arguments[1] : undefined;\n this.isInitializing = true;\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n if (!options.defaultNS && options.defaultNS !== false && options.ns) {\n if (typeof options.ns === 'string') {\n options.defaultNS = options.ns;\n } else if (options.ns.indexOf('translation') < 0) {\n options.defaultNS = options.ns[0];\n }\n }\n const defOpts = get();\n this.options = {\n ...defOpts,\n ...this.options,\n ...transformOptions(options)\n };\n if (this.options.compatibilityAPI !== 'v1') {\n this.options.interpolation = {\n ...defOpts.interpolation,\n ...this.options.interpolation\n };\n }\n if (options.keySeparator !== undefined) {\n this.options.userDefinedKeySeparator = options.keySeparator;\n }\n if (options.nsSeparator !== undefined) {\n this.options.userDefinedNsSeparator = options.nsSeparator;\n }\n function createClassOnDemand(ClassOrObject) {\n if (!ClassOrObject) return null;\n if (typeof ClassOrObject === 'function') return new ClassOrObject();\n return ClassOrObject;\n }\n if (!this.options.isClone) {\n if (this.modules.logger) {\n baseLogger.init(createClassOnDemand(this.modules.logger), this.options);\n } else {\n baseLogger.init(null, this.options);\n }\n let formatter;\n if (this.modules.formatter) {\n formatter = this.modules.formatter;\n } else if (typeof Intl !== 'undefined') {\n formatter = Formatter;\n }\n const lu = new LanguageUtil(this.options);\n this.store = new ResourceStore(this.options.resources, this.options);\n const s = this.services;\n s.logger = baseLogger;\n s.resourceStore = this.store;\n s.languageUtils = lu;\n s.pluralResolver = new PluralResolver(lu, {\n prepend: this.options.pluralSeparator,\n compatibilityJSON: this.options.compatibilityJSON,\n simplifyPluralSuffix: this.options.simplifyPluralSuffix\n });\n if (formatter && (!this.options.interpolation.format || this.options.interpolation.format === defOpts.interpolation.format)) {\n s.formatter = createClassOnDemand(formatter);\n s.formatter.init(s, this.options);\n this.options.interpolation.format = s.formatter.format.bind(s.formatter);\n }\n s.interpolator = new Interpolator(this.options);\n s.utils = {\n hasLoadedNamespace: this.hasLoadedNamespace.bind(this)\n };\n s.backendConnector = new Connector(createClassOnDemand(this.modules.backend), s.resourceStore, s, this.options);\n s.backendConnector.on('*', function (event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n _this.emit(event, ...args);\n });\n if (this.modules.languageDetector) {\n s.languageDetector = createClassOnDemand(this.modules.languageDetector);\n if (s.languageDetector.init) s.languageDetector.init(s, this.options.detection, this.options);\n }\n if (this.modules.i18nFormat) {\n s.i18nFormat = createClassOnDemand(this.modules.i18nFormat);\n if (s.i18nFormat.init) s.i18nFormat.init(this);\n }\n this.translator = new Translator(this.services, this.options);\n this.translator.on('*', function (event) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n _this.emit(event, ...args);\n });\n this.modules.external.forEach(m => {\n if (m.init) m.init(this);\n });\n }\n this.format = this.options.interpolation.format;\n if (!callback) callback = noop;\n if (this.options.fallbackLng && !this.services.languageDetector && !this.options.lng) {\n const codes = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);\n if (codes.length > 0 && codes[0] !== 'dev') this.options.lng = codes[0];\n }\n if (!this.services.languageDetector && !this.options.lng) {\n this.logger.warn('init: no languageDetector is used and no lng is defined');\n }\n const storeApi = ['getResource', 'hasResourceBundle', 'getResourceBundle', 'getDataByLanguage'];\n storeApi.forEach(fcName => {\n this[fcName] = function () {\n return _this.store[fcName](...arguments);\n };\n });\n const storeApiChained = ['addResource', 'addResources', 'addResourceBundle', 'removeResourceBundle'];\n storeApiChained.forEach(fcName => {\n this[fcName] = function () {\n _this.store[fcName](...arguments);\n return _this;\n };\n });\n const deferred = defer();\n const load = () => {\n const finish = (err, t) => {\n this.isInitializing = false;\n if (this.isInitialized && !this.initializedStoreOnce) this.logger.warn('init: i18next is already initialized. You should call init just once!');\n this.isInitialized = true;\n if (!this.options.isClone) this.logger.log('initialized', this.options);\n this.emit('initialized', this.options);\n deferred.resolve(t);\n callback(err, t);\n };\n if (this.languages && this.options.compatibilityAPI !== 'v1' && !this.isInitialized) return finish(null, this.t.bind(this));\n this.changeLanguage(this.options.lng, finish);\n };\n if (this.options.resources || !this.options.initImmediate) {\n load();\n } else {\n setTimeout(load, 0);\n }\n return deferred;\n }\n loadResources(language) {\n let callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n let usedCallback = callback;\n const usedLng = typeof language === 'string' ? language : this.language;\n if (typeof language === 'function') usedCallback = language;\n if (!this.options.resources || this.options.partialBundledLanguages) {\n if (usedLng && usedLng.toLowerCase() === 'cimode' && (!this.options.preload || this.options.preload.length === 0)) return usedCallback();\n const toLoad = [];\n const append = lng => {\n if (!lng) return;\n if (lng === 'cimode') return;\n const lngs = this.services.languageUtils.toResolveHierarchy(lng);\n lngs.forEach(l => {\n if (l === 'cimode') return;\n if (toLoad.indexOf(l) < 0) toLoad.push(l);\n });\n };\n if (!usedLng) {\n const fallbacks = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);\n fallbacks.forEach(l => append(l));\n } else {\n append(usedLng);\n }\n if (this.options.preload) {\n this.options.preload.forEach(l => append(l));\n }\n this.services.backendConnector.load(toLoad, this.options.ns, e => {\n if (!e && !this.resolvedLanguage && this.language) this.setResolvedLanguage(this.language);\n usedCallback(e);\n });\n } else {\n usedCallback(null);\n }\n }\n reloadResources(lngs, ns, callback) {\n const deferred = defer();\n if (!lngs) lngs = this.languages;\n if (!ns) ns = this.options.ns;\n if (!callback) callback = noop;\n this.services.backendConnector.reload(lngs, ns, err => {\n deferred.resolve();\n callback(err);\n });\n return deferred;\n }\n use(module) {\n if (!module) throw new Error('You are passing an undefined module! Please check the object you are passing to i18next.use()');\n if (!module.type) throw new Error('You are passing a wrong module! Please check the object you are passing to i18next.use()');\n if (module.type === 'backend') {\n this.modules.backend = module;\n }\n if (module.type === 'logger' || module.log && module.warn && module.error) {\n this.modules.logger = module;\n }\n if (module.type === 'languageDetector') {\n this.modules.languageDetector = module;\n }\n if (module.type === 'i18nFormat') {\n this.modules.i18nFormat = module;\n }\n if (module.type === 'postProcessor') {\n postProcessor.addPostProcessor(module);\n }\n if (module.type === 'formatter') {\n this.modules.formatter = module;\n }\n if (module.type === '3rdParty') {\n this.modules.external.push(module);\n }\n return this;\n }\n setResolvedLanguage(l) {\n if (!l || !this.languages) return;\n if (['cimode', 'dev'].indexOf(l) > -1) return;\n for (let li = 0; li < this.languages.length; li++) {\n const lngInLngs = this.languages[li];\n if (['cimode', 'dev'].indexOf(lngInLngs) > -1) continue;\n if (this.store.hasLanguageSomeTranslations(lngInLngs)) {\n this.resolvedLanguage = lngInLngs;\n break;\n }\n }\n }\n changeLanguage(lng, callback) {\n var _this2 = this;\n this.isLanguageChangingTo = lng;\n const deferred = defer();\n this.emit('languageChanging', lng);\n const setLngProps = l => {\n this.language = l;\n this.languages = this.services.languageUtils.toResolveHierarchy(l);\n this.resolvedLanguage = undefined;\n this.setResolvedLanguage(l);\n };\n const done = (err, l) => {\n if (l) {\n setLngProps(l);\n this.translator.changeLanguage(l);\n this.isLanguageChangingTo = undefined;\n this.emit('languageChanged', l);\n this.logger.log('languageChanged', l);\n } else {\n this.isLanguageChangingTo = undefined;\n }\n deferred.resolve(function () {\n return _this2.t(...arguments);\n });\n if (callback) callback(err, function () {\n return _this2.t(...arguments);\n });\n };\n const setLng = lngs => {\n if (!lng && !lngs && this.services.languageDetector) lngs = [];\n const l = typeof lngs === 'string' ? lngs : this.services.languageUtils.getBestMatchFromCodes(lngs);\n if (l) {\n if (!this.language) {\n setLngProps(l);\n }\n if (!this.translator.language) this.translator.changeLanguage(l);\n if (this.services.languageDetector && this.services.languageDetector.cacheUserLanguage) this.services.languageDetector.cacheUserLanguage(l);\n }\n this.loadResources(l, err => {\n done(err, l);\n });\n };\n if (!lng && this.services.languageDetector && !this.services.languageDetector.async) {\n setLng(this.services.languageDetector.detect());\n } else if (!lng && this.services.languageDetector && this.services.languageDetector.async) {\n if (this.services.languageDetector.detect.length === 0) {\n this.services.languageDetector.detect().then(setLng);\n } else {\n this.services.languageDetector.detect(setLng);\n }\n } else {\n setLng(lng);\n }\n return deferred;\n }\n getFixedT(lng, ns, keyPrefix) {\n var _this3 = this;\n const fixedT = function (key, opts) {\n let options;\n if (typeof opts !== 'object') {\n for (var _len3 = arguments.length, rest = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {\n rest[_key3 - 2] = arguments[_key3];\n }\n options = _this3.options.overloadTranslationOptionHandler([key, opts].concat(rest));\n } else {\n options = {\n ...opts\n };\n }\n options.lng = options.lng || fixedT.lng;\n options.lngs = options.lngs || fixedT.lngs;\n options.ns = options.ns || fixedT.ns;\n options.keyPrefix = options.keyPrefix || keyPrefix || fixedT.keyPrefix;\n const keySeparator = _this3.options.keySeparator || '.';\n let resultKey;\n if (options.keyPrefix && Array.isArray(key)) {\n resultKey = key.map(k => `${options.keyPrefix}${keySeparator}${k}`);\n } else {\n resultKey = options.keyPrefix ? `${options.keyPrefix}${keySeparator}${key}` : key;\n }\n return _this3.t(resultKey, options);\n };\n if (typeof lng === 'string') {\n fixedT.lng = lng;\n } else {\n fixedT.lngs = lng;\n }\n fixedT.ns = ns;\n fixedT.keyPrefix = keyPrefix;\n return fixedT;\n }\n t() {\n return this.translator && this.translator.translate(...arguments);\n }\n exists() {\n return this.translator && this.translator.exists(...arguments);\n }\n setDefaultNamespace(ns) {\n this.options.defaultNS = ns;\n }\n hasLoadedNamespace(ns) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n if (!this.isInitialized) {\n this.logger.warn('hasLoadedNamespace: i18next was not initialized', this.languages);\n return false;\n }\n if (!this.languages || !this.languages.length) {\n this.logger.warn('hasLoadedNamespace: i18n.languages were undefined or empty', this.languages);\n return false;\n }\n const lng = options.lng || this.resolvedLanguage || this.languages[0];\n const fallbackLng = this.options ? this.options.fallbackLng : false;\n const lastLng = this.languages[this.languages.length - 1];\n if (lng.toLowerCase() === 'cimode') return true;\n const loadNotPending = (l, n) => {\n const loadState = this.services.backendConnector.state[`${l}|${n}`];\n return loadState === -1 || loadState === 2;\n };\n if (options.precheck) {\n const preResult = options.precheck(this, loadNotPending);\n if (preResult !== undefined) return preResult;\n }\n if (this.hasResourceBundle(lng, ns)) return true;\n if (!this.services.backendConnector.backend || this.options.resources && !this.options.partialBundledLanguages) return true;\n if (loadNotPending(lng, ns) && (!fallbackLng || loadNotPending(lastLng, ns))) return true;\n return false;\n }\n loadNamespaces(ns, callback) {\n const deferred = defer();\n if (!this.options.ns) {\n if (callback) callback();\n return Promise.resolve();\n }\n if (typeof ns === 'string') ns = [ns];\n ns.forEach(n => {\n if (this.options.ns.indexOf(n) < 0) this.options.ns.push(n);\n });\n this.loadResources(err => {\n deferred.resolve();\n if (callback) callback(err);\n });\n return deferred;\n }\n loadLanguages(lngs, callback) {\n const deferred = defer();\n if (typeof lngs === 'string') lngs = [lngs];\n const preloaded = this.options.preload || [];\n const newLngs = lngs.filter(lng => preloaded.indexOf(lng) < 0);\n if (!newLngs.length) {\n if (callback) callback();\n return Promise.resolve();\n }\n this.options.preload = preloaded.concat(newLngs);\n this.loadResources(err => {\n deferred.resolve();\n if (callback) callback(err);\n });\n return deferred;\n }\n dir(lng) {\n if (!lng) lng = this.resolvedLanguage || (this.languages && this.languages.length > 0 ? this.languages[0] : this.language);\n if (!lng) return 'rtl';\n const rtlLngs = ['ar', 'shu', 'sqr', 'ssh', 'xaa', 'yhd', 'yud', 'aao', 'abh', 'abv', 'acm', 'acq', 'acw', 'acx', 'acy', 'adf', 'ads', 'aeb', 'aec', 'afb', 'ajp', 'apc', 'apd', 'arb', 'arq', 'ars', 'ary', 'arz', 'auz', 'avl', 'ayh', 'ayl', 'ayn', 'ayp', 'bbz', 'pga', 'he', 'iw', 'ps', 'pbt', 'pbu', 'pst', 'prp', 'prd', 'ug', 'ur', 'ydd', 'yds', 'yih', 'ji', 'yi', 'hbo', 'men', 'xmn', 'fa', 'jpr', 'peo', 'pes', 'prs', 'dv', 'sam', 'ckb'];\n const languageUtils = this.services && this.services.languageUtils || new LanguageUtil(get());\n return rtlLngs.indexOf(languageUtils.getLanguagePartFromCode(lng)) > -1 || lng.toLowerCase().indexOf('-arab') > 1 ? 'rtl' : 'ltr';\n }\n static createInstance() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let callback = arguments.length > 1 ? arguments[1] : undefined;\n return new I18n(options, callback);\n }\n cloneInstance() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n const forkResourceStore = options.forkResourceStore;\n if (forkResourceStore) delete options.forkResourceStore;\n const mergedOptions = {\n ...this.options,\n ...options,\n ...{\n isClone: true\n }\n };\n const clone = new I18n(mergedOptions);\n if (options.debug !== undefined || options.prefix !== undefined) {\n clone.logger = clone.logger.clone(options);\n }\n const membersToCopy = ['store', 'services', 'language'];\n membersToCopy.forEach(m => {\n clone[m] = this[m];\n });\n clone.services = {\n ...this.services\n };\n clone.services.utils = {\n hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)\n };\n if (forkResourceStore) {\n clone.store = new ResourceStore(this.store.data, mergedOptions);\n clone.services.resourceStore = clone.store;\n }\n clone.translator = new Translator(clone.services, mergedOptions);\n clone.translator.on('*', function (event) {\n for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n args[_key4 - 1] = arguments[_key4];\n }\n clone.emit(event, ...args);\n });\n clone.init(mergedOptions, callback);\n clone.translator.options = mergedOptions;\n clone.translator.backendConnector.services.utils = {\n hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)\n };\n return clone;\n }\n toJSON() {\n return {\n options: this.options,\n store: this.store,\n language: this.language,\n languages: this.languages,\n resolvedLanguage: this.resolvedLanguage\n };\n }\n}\nconst instance = I18n.createInstance();\ninstance.createInstance = I18n.createInstance;\n\nconst createInstance = instance.createInstance;\nconst dir = instance.dir;\nconst init = instance.init;\nconst loadResources = instance.loadResources;\nconst reloadResources = instance.reloadResources;\nconst use = instance.use;\nconst changeLanguage = instance.changeLanguage;\nconst getFixedT = instance.getFixedT;\nconst t = instance.t;\nconst exists = instance.exists;\nconst setDefaultNamespace = instance.setDefaultNamespace;\nconst hasLoadedNamespace = instance.hasLoadedNamespace;\nconst loadNamespaces = instance.loadNamespaces;\nconst loadLanguages = instance.loadLanguages;\n\nexport { changeLanguage, createInstance, instance as default, dir, exists, getFixedT, hasLoadedNamespace, init, loadLanguages, loadNamespaces, loadResources, reloadResources, setDefaultNamespace, t, use };\n","const defaults = {\n loadPath: '/locales/{{lng}}/{{ns}}.json',\n addPath: '/locales/add/{{lng}}/{{ns}}',\n multiSeparator: '+',\n allowMultiLoading: false,\n fetch: typeof fetch === 'undefined' ? undefined : fetch,\n parse: JSON.parse,\n stringify: JSON.stringify,\n requestOptions: {},\n};\n\nconst arrify = (val) => (Array.isArray(val) ? val : [val]);\nconst normalize = (funcOrVal, ...args) => (typeof funcOrVal === 'function' ? funcOrVal(...args) : funcOrVal);\n\nclass BackendError extends Error {\n retry = null;\n\n constructor(message, retry = false) {\n super(message);\n\n this.retry = retry;\n }\n}\n\nexport default class Backend {\n constructor(services, options) {\n this.init(services, options);\n }\n\n type = 'backend';\n\n static type = 'backend';\n\n init(services, options = {}) {\n this.services = services;\n\n this.options = {\n ...defaults,\n ...this.options,\n ...options,\n };\n }\n\n getLoadPath(languages, namespaces) {\n return normalize(this.options.loadPath, languages, namespaces);\n }\n\n read(language, namespace, callback) {\n const loadPath = this.getLoadPath(language, namespace);\n const url = this.services.interpolator.interpolate(loadPath, { lng: language, ns: namespace });\n\n this.loadUrl(url, callback);\n }\n\n readMulti(languages, namespaces, callback) {\n const loadPath = this.getLoadPath(languages, namespaces);\n const { multiSeparator } = this.options;\n\n const url = this.services.interpolator.interpolate(loadPath, {\n lng: languages.join(multiSeparator),\n ns: namespaces.join(multiSeparator),\n });\n\n this.loadUrl(url, callback);\n }\n\n loadUrl(url, callback) {\n const { fetch, requestOptions, parse } = this.options;\n\n fetch(url, requestOptions)\n .then((response) => {\n const { ok, status } = response;\n\n if (!ok) {\n const retry = status >= 500 && status < 600; // don't retry for 4xx codes\n\n throw new BackendError(`failed loading ${url}`, retry);\n }\n\n return response.text();\n }, () => {\n throw new BackendError(`failed loading ${url}`);\n })\n .then((data) => {\n try {\n return callback(null, parse(data, url));\n } catch {\n throw new BackendError(`failed parsing ${url} to json`, false);\n }\n })\n .catch((e) => {\n if (e instanceof BackendError) {\n callback(e.message, e.retry);\n }\n });\n }\n\n create(languages, namespace, key, fallbackValue) {\n const payload = {\n [key]: fallbackValue || '',\n };\n\n arrify(languages).forEach((lng) => {\n const {\n addPath,\n requestOptions,\n fetch,\n stringify,\n } = this.options;\n\n const url = this.services.interpolator.interpolate(addPath, { lng, ns: namespace });\n\n try {\n fetch(url, {\n method: 'POST',\n body: stringify(payload),\n ...requestOptions,\n });\n } catch (e) {\n console.error(e); // eslint-disable-line no-console\n }\n });\n }\n}\n","import i18n from 'i18next'\nimport {initReactI18next} from 'react-i18next'\nimport Fetch from 'i18next-fetch-backend'\n\ni18n.use(initReactI18next)\n .use(Fetch)\n .init({\n lng: Common.Locale.currentLang,\n fallbackLng: Common.Locale.defaultLang,\n escapeValue: false,\n backend: {\n loadPath: './locale/{{lng}}.json'\n },\n interpolation: { escapeValue: false },\n react: {\n useSuspense: false,\n },\n }).then(() => {\n console.log(\"i18next is ready\");\n })\n .catch((error) => {\n console.error(\"i18next initialization error:\", error);\n });\n\ni18n.on('failedLoading', (lng, ns, msg) => {\n console.log(msg);\n});\n\nexport default i18n;","import {action, observable, computed, makeObservable} from 'mobx';\n\nexport class storeFocusObjects {\n constructor() {\n makeObservable(this, {\n focusOn: observable,\n changeFocus: action,\n _focusObjects: observable,\n _cellInfo: observable,\n resetFocusObjects: action,\n objects: computed,\n resetCellInfo: action,\n selections: computed,\n shapeObject: computed,\n imageObject: computed,\n chartObject: computed,\n isLocked: observable,\n isLockedText: observable,\n isLockedShape: observable,\n setIsLocked: action,\n editFormulaMode: observable,\n setEditFormulaMode: action,\n isEditCell: observable,\n setEditCell: action,\n functionsDisable: observable,\n setFunctionsDisabled: action,\n });\n }\n\n focusOn = undefined;\n\n changeFocus(isObj) {\n this.focusOn = isObj ? 'obj' : 'cell';\n }\n\n _focusObjects = [];\n\n resetFocusObjects(objects) {\n this._focusObjects = objects;\n }\n\n get objects() {\n const _objects = [];\n for (let object of this._focusObjects) {\n const type = object.get_ObjectType();\n\n if (Asc.c_oAscTypeSelectElement.Paragraph === type) {\n _objects.push('text', 'paragraph');\n } else if (Asc.c_oAscTypeSelectElement.Table === type) {\n _objects.push('table');\n } else if (Asc.c_oAscTypeSelectElement.Image === type) {\n if (object.get_ObjectValue().get_ChartProperties()) {\n _objects.push('chart');\n } else if (object.get_ObjectValue().get_ShapeProperties() && !_objects.includes('chart')) {\n _objects.push('shape');\n } else {\n _objects.push('image');\n }\n } else if (Asc.c_oAscTypeSelectElement.Hyperlink === type) {\n _objects.push('hyperlink');\n }\n }\n const resultArr = _objects.filter((value, index, self) => self.indexOf(value) === index); //get uniq array\n // Exclude shapes if chart exist\n if (resultArr.indexOf('chart') > -1) {\n resultArr.splice(resultArr.indexOf('shape'), 1);\n }\n return resultArr;\n }\n\n _cellInfo;\n\n resetCellInfo (cellInfo) {\n this._cellInfo = cellInfo;\n }\n\n get selections () {\n return !!this.intf ? this.intf.getSelections() : null;\n }\n\n get shapeObject() {\n return !!this.intf ? this.intf.getShapeObject() : null;\n }\n\n get imageObject() {\n return !!this.intf ? this.intf.getImageObject() : null;\n }\n\n get chartObject() {\n return !!this.intf ? this.intf.getChartObject() : null;\n }\n\n isLocked = false;\n isLockedShape = false;\n isLockedText = false;\n\n setIsLocked(info) {\n let isLocked = false, \n isLockedShape = false,\n isLockedText = false;\n\n switch (info.asc_getSelectionType()) {\n case Asc.c_oAscSelectionType.RangeChart:\n case Asc.c_oAscSelectionType.RangeImage:\n case Asc.c_oAscSelectionType.RangeShape:\n case Asc.c_oAscSelectionType.RangeChartText:\n case Asc.c_oAscSelectionType.RangeShapeText:\n const objects = Common.EditorApi.get().asc_getGraphicObjectProps();\n for ( let i in objects ) {\n if ( objects[i].asc_getObjectType() == Asc.c_oAscTypeSelectElement.Image ) {\n isLocked = objects[i].asc_getObjectValue().asc_getLocked();\n isLockedShape = objects[i].asc_getObjectValue().asc_getProtectionLocked();\n isLockedText = objects[i].asc_getObjectValue().asc_getProtectionLockText();\n break;\n }\n }\n break;\n default:\n this.isLocked = info.asc_getLocked();\n }\n this.isLocked = isLocked;\n this.isLockedShape = isLockedShape;\n this.isLockedText = isLockedText;\n }\n\n editFormulaMode = false;\n\n setEditFormulaMode(value) {\n this.editFormulaMode = value;\n }\n\n isEditCell = false;\n\n setEditCell(value) {\n this.isEditCell = value;\n }\n\n functionsDisable = false;\n\n setFunctionsDisabled(value) {\n this.functionsDisable = value;\n }\n\n}","\nimport {makeObservable, observable, action, computed} from 'mobx';\n\nexport class storeUsers {\n constructor() {\n makeObservable(this, {\n users: observable,\n reset: action,\n addUser: action,\n currentUser: observable,\n setCurrentUser: action,\n connection: action,\n isDisconnected: observable,\n resetDisconnected: action,\n hasEditUsers: computed,\n editUsers: computed\n })\n }\n\n users = [];\n currentUser;\n isDisconnected = false;\n\n reset (users) {\n this.users = Object.values(users)\n }\n\n addUser (user) {\n this.users.push(user);\n }\n\n setCurrentUser (id) {\n this.users.forEach((item) => {\n if (item.asc_getIdOriginal() === id) {\n this.currentUser = item;\n }\n });\n return this.currentUser;\n }\n\n connection (change) {\n let changed = false;\n for (let uid in this.users) {\n if (undefined !== uid) {\n const user = this.users[uid];\n if (user && user.asc_getId() === change.asc_getId()) {\n this.users[uid] = change;\n changed = true;\n }\n }\n }\n !changed && change && (this.users.push(change));\n }\n\n resetDisconnected (isDisconnected) {\n this.isDisconnected = isDisconnected;\n }\n\n getInitials (name) {\n const fio = name.split(' ');\n let initials = fio[0].substring(0, 1).toUpperCase();\n for (let i = fio.length-1; i>0; i--) {\n if (fio[i][0]!=='(' && fio[i][0]!==')') {\n initials += fio[i].substring(0, 1).toUpperCase();\n break;\n }\n }\n return initials;\n }\n\n searchUserById (id) {\n let user = null;\n this.users.forEach((item) => {\n if (item.asc_getIdOriginal() === id) {\n user = item;\n }\n });\n return user;\n }\n\n searchUserByCurrentId (id) {\n let user = null;\n this.users.forEach((item) => {\n if (item.asc_getId() === id) {\n user = item;\n }\n });\n return user;\n }\n\n get hasEditUsers () {\n let length = 0;\n this.users.forEach((item) => {\n if ((item.asc_getState()!==false) && !item.asc_getView()) {\n length++;\n }\n });\n return (length >= 1);\n }\n\n get editUsers () {\n const idArray = [];\n const usersArray = [];\n const curUserId = this.currentUser.asc_getIdOriginal();\n this.users.forEach((item) => {\n const name = AscCommon.UserInfoParser.getParsedName(item.asc_getUserName());\n if((item.asc_getState() !== false) && !item.asc_getView()) {\n const idOriginal = item.asc_getIdOriginal();\n const ind = idArray.indexOf(idOriginal);\n if (ind !== -1) {\n usersArray[ind].count = usersArray[ind].count + 1;\n } else {\n const userAttr = {\n color: item.asc_getColor(),\n id: item.asc_getId(),\n idOriginal: item.asc_getIdOriginal(),\n name: name,\n view: item.asc_getView(),\n initials: this.getInitials(name),\n count: 1\n };\n if(idOriginal === curUserId) {\n usersArray.unshift(userAttr);\n idArray.unshift(idOriginal);\n } else {\n usersArray.push(userAttr);\n idArray.push(idOriginal);\n }\n }\n }\n });\n return usersArray;\n }\n}\n","import {action, observable, makeObservable} from 'mobx';\n\nexport class storeFunctions {\n constructor() {\n makeObservable(this, {\n initFunctions: action,\n functions: observable\n });\n }\n\n functions = {};\n\n initFunctions (groups, data, separator) {\n this.functions = this.getFunctions(groups, data, separator);\n }\n\n getFunctions (groups, data, separator) {\n const functions = {};\n for (let g in groups) {\n const group = groups[g];\n const groupname = group.asc_getGroupName();\n const funcarr = group.asc_getFormulasArray();\n\n for (let f in funcarr) {\n const func = funcarr[f];\n const _name = func.asc_getName();\n functions[_name] = {\n type: _name,\n group: groupname,\n caption: func.asc_getLocaleName(),\n args: ((data && data[_name]) ? data[_name].a : '').replace(/[,;]/g, separator),\n descr: (data && data[_name]) ? data[_name].d : ''\n };\n }\n }\n return functions;\n }\n}\n","import {action, makeObservable, observable} from 'mobx';\r\n\r\nexport class storePalette {\r\n constructor() {\r\n makeObservable(this, {\r\n customColors: observable,\r\n changeCustomColors: action\r\n });\r\n }\r\n \r\n customColors = [];\r\n\r\n changeCustomColors (colors) {\r\n this.customColors = colors;\r\n }\r\n}","\nclass CThumbnailLoader {\n constructor() {\n this.image = null;\n this.binaryFormat = null;\n this.data = null;\n this.width = 0;\n this.heightOne = 0;\n this.offsets = null;\n }\n\n load(url, callback) {\n if (!callback)\n return;\n\n let xhr = new XMLHttpRequest();\n xhr.open('GET', url + \".bin\", true);\n xhr.responseType = 'arraybuffer';\n\n if (xhr.overrideMimeType)\n xhr.overrideMimeType('text/plain; charset=x-user-defined');\n else xhr.setRequestHeader('Accept-Charset', 'x-user-defined');\n\n xhr.onload = e => {\n // TODO: check errors\n this.binaryFormat = new Uint8Array(e.target.response);\n callback();\n };\n\n xhr.send(null);\n }\n\n openBinary(arrayBuffer) {\n //var t1 = performance.now();\n\n const binaryAlpha = this.binaryFormat;\n this.width = (binaryAlpha[0] << 24) | (binaryAlpha[1] << 16) | (binaryAlpha[2] << 8) | (binaryAlpha[3] << 0);\n this.heightOne = (binaryAlpha[4] << 24) | (binaryAlpha[5] << 16) | (binaryAlpha[6] << 8) | (binaryAlpha[7] << 0);\n const count = (binaryAlpha[8] << 24) | (binaryAlpha[9] << 16) | (binaryAlpha[10] << 8) | (binaryAlpha[11] << 0);\n const height = count * this.heightOne;\n\n const MAX_MEMORY_SIZE = 100000000;\n const memorySize = 4 * this.width * height;\n const isOffsets = memorySize > MAX_MEMORY_SIZE;\n\n if (!isOffsets)\n this.data = new Uint8ClampedArray(memorySize);\n else this.offsets = new Array(count);\n\n var binaryIndex = 12;\n var binaryLen = binaryAlpha.length;\n var index = 0;\n\n var len0 = 0;\n var tmpValue = 0;\n\n if (!isOffsets) {\n var imagePixels = this.data;\n while (binaryIndex < binaryLen) {\n tmpValue = binaryAlpha[binaryIndex++];\n if (0 == tmpValue) {\n len0 = binaryAlpha[binaryIndex++];\n while (len0 > 0) {\n len0--;\n imagePixels[index] = imagePixels[index + 1] = imagePixels[index + 2] = 255;\n imagePixels[index + 3] = 0; // this value is already 0.\n index += 4;\n }\n } else {\n imagePixels[index] = imagePixels[index + 1] = imagePixels[index + 2] = 255 - tmpValue;\n imagePixels[index + 3] = tmpValue;\n index += 4;\n }\n }\n } else {\n var module = this.width * this.heightOne;\n var moduleCur = module - 1;\n while (binaryIndex < binaryLen) {\n tmpValue = binaryAlpha[binaryIndex++];\n if (0 == tmpValue) {\n len0 = binaryAlpha[binaryIndex++];\n while (len0 > 0) {\n len0--;\n moduleCur++;\n if (moduleCur === module) {\n this.offsets[index++] = { pos : binaryIndex, len : len0 + 1 };\n moduleCur = 0;\n }\n }\n } else {\n moduleCur++;\n if (moduleCur === module) {\n this.offsets[index++] = { pos : binaryIndex - 1, len : -1 };\n moduleCur = 0;\n }\n }\n }\n }\n\n if ( !this.offsets )\n delete this.binaryFormat;\n\n //var t2 = performance.now();\n //console.log(t2 - t1);\n };\n\n getImage = function(index, canvas, ctx) {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n canvas.width = this.width;\n canvas.height = this.heightOne;\n canvas.style.width = iconWidth + \"px\";\n canvas.style.height = iconHeight + \"px\";\n\n ctx = canvas.getContext(\"2d\");\n }\n\n if (!this.data && !this.offsets) {\n this.openBinary(this.binaryFormat);\n }\n\n let dataTmp = ctx.createImageData(this.width, this.heightOne);\n const sizeImage = 4 * this.width * this.heightOne;\n\n if (!this.offsets) {\n dataTmp.data.set(new Uint8ClampedArray(this.data.buffer, index * sizeImage, sizeImage));\n } else {\n const binaryAlpha = this.binaryFormat;\n var binaryIndex = this.offsets[index].pos;\n var alphaChannel = 0;\n var pixelsCount = this.width * this.heightOne;\n var tmpValue = 0, len0 = 0;\n let imagePixels = dataTmp.data;\n if (-1 != this.offsets[index].len) {\n /*\n // this values is already 0.\n for (var i = 0; i < this.offsets[index].len; i++) {\n pixels[alphaChannel] = 0;\n alphaChannel += 4;\n }\n */\n alphaChannel += 4 * this.offsets[index].len;\n }\n while (pixelsCount > 0) {\n tmpValue = binaryAlpha[binaryIndex++];\n if (0 == tmpValue) {\n len0 = binaryAlpha[binaryIndex++];\n if (len0 > pixelsCount)\n len0 = pixelsCount;\n while (len0 > 0) {\n len0--;\n imagePixels[alphaChannel] = imagePixels[alphaChannel + 1] = imagePixels[alphaChannel + 2] = 255;\n imagePixels[alphaChannel + 3] = 0; // this value is already 0.\n alphaChannel += 4;\n pixelsCount--;\n }\n } else {\n imagePixels[alphaChannel] = imagePixels[alphaChannel + 1] = imagePixels[alphaChannel + 2] = 255 - tmpValue;\n imagePixels[alphaChannel + 3] = tmpValue;\n alphaChannel += 4;\n pixelsCount--;\n }\n }\n }\n ctx.putImageData(dataTmp, 0, 0);\n\n //var t2 = performance.now();\n //console.log(t2 - t1);\n\n return canvas;\n };\n};\n\nexport default CThumbnailLoader;","import {action, observable, makeObservable, computed} from 'mobx';\r\nimport CThumbnailLoader from '../../../../common/mobile/utils/CThumbnailLoader';\r\n\r\nexport class storeTextSettings {\r\n constructor() {\r\n makeObservable(this, {\r\n fontsArray: observable,\r\n fontInfo: observable,\r\n fontName: observable,\r\n arrayRecentFonts: observable,\r\n fontSize: observable,\r\n isBold: observable,\r\n isItalic: observable,\r\n isUnderline: observable,\r\n textColor: observable,\r\n customTextColors: observable,\r\n paragraphAlign: observable,\r\n paragraphValign: observable,\r\n textIn: observable,\r\n resetFontsRecent:action,\r\n initTextSettings: action,\r\n initFontSettings: action,\r\n initEditorFonts: action,\r\n initFontInfo: action,\r\n changeTextColor: action,\r\n changeCustomTextColors: action,\r\n iconWidth: observable,\r\n iconHeight: observable,\r\n thumbCanvas: observable,\r\n thumbContext: observable,\r\n thumbs: observable,\r\n thumbIdx: observable,\r\n listItemHeight: observable,\r\n spriteCols: observable,\r\n loadSprite: action,\r\n addFontToRecent:action\r\n });\r\n }\r\n \r\n iconWidth;\r\n iconHeight;\r\n thumbCanvas;\r\n thumbContext;\r\n thumbs;\r\n thumbIdx = 0;\r\n listItemHeight = 28;\r\n spriteCols = 1;\r\n fontsArray = [];\r\n arrayRecentFonts = [];\r\n fontInfo = {};\r\n fontName = '';\r\n fontSize = undefined;\r\n isBold = false;\r\n isItalic = false;\r\n isUnderline = false;\r\n textColor = undefined;\r\n customTextColors = [];\r\n paragraphAlign = undefined;\r\n paragraphValign = undefined;\r\n textIn = undefined;\r\n\r\n initTextSettings(cellInfo) {\r\n let xfs = cellInfo.asc_getXfs();\r\n let selectType = cellInfo.asc_getSelectionType();\r\n\r\n switch (selectType) {\r\n case Asc.c_oAscSelectionType.RangeChartText: this.textIn = 1; break;\r\n case Asc.c_oAscSelectionType.RangeShapeText: this.textIn = 2; break;\r\n default: this.textIn = 0;\r\n }\r\n\r\n this.initFontSettings(xfs);\r\n }\r\n\r\n initFontSettings(xfs) {\r\n this.fontName = xfs.asc_getFontName();\r\n this.fontSize = xfs.asc_getFontSize();\r\n\r\n this.isBold = xfs.asc_getFontBold();\r\n this.isItalic = xfs.asc_getFontItalic();\r\n this.isUnderline = xfs.asc_getFontUnderline();\r\n \r\n let color = xfs.asc_getFontColor();\r\n // console.log(color);\r\n this.textColor = this.resetTextColor(color);\r\n\r\n this.paragraphAlign = xfs.asc_getHorAlign();\r\n this.paragraphValign = xfs.asc_getVertAlign();\r\n }\r\n\r\n initEditorFonts (fonts, select) {\r\n let array = [];\r\n for (let font of fonts) {\r\n let fontId = font.asc_getFontId();\r\n array.push({\r\n id : fontId,\r\n name : font.asc_getFontName(),\r\n //displayValue: font.asc_getFontName(),\r\n imgidx : font.asc_getFontThumbnail(),\r\n type : font.asc_getFontType()\r\n });\r\n }\r\n this.fontsArray = array;\r\n this.iconWidth = 300;\r\n this.iconHeight = Asc.FONT_THUMBNAIL_HEIGHT || 28;\r\n this.thumbCanvas = document.createElement('canvas');\r\n this.thumbContext = this.thumbCanvas.getContext('2d');\r\n this.thumbs = [\r\n {ratio: 1, path: '../../../../../sdkjs/common/Images/fonts_thumbnail.png', width: this.iconWidth, height: this.iconHeight},\r\n {ratio: 1.25, path: '../../../../../sdkjs/common/Images/fonts_thumbnail@1.25x.png', width: this.iconWidth * 1.25, height: this.iconHeight * 1.25},\r\n {ratio: 1.5, path: '../../../../../sdkjs/common/Images/fonts_thumbnail@1.5x.png', width: this.iconWidth * 1.5, height: this.iconHeight * 1.5},\r\n {ratio: 1.75, path: '../../../../../sdkjs/common/Images/fonts_thumbnail@1.75x.png', width: this.iconWidth * 1.75, height: this.iconHeight * 1.75},\r\n {ratio: 2, path: '../../../../../sdkjs/common/Images/fonts_thumbnail@2x.png', width: this.iconWidth * 2, height: this.iconHeight * 2}\r\n ];\r\n\r\n const applicationPixelRatio = Common.Utils.applicationPixelRatio();\r\n\r\n let bestDistance = Math.abs(applicationPixelRatio - this.thumbs[0].ratio);\r\n let currentDistance = 0;\r\n\r\n for (let i = 1; i < this.thumbs.length; i++) {\r\n currentDistance = Math.abs(applicationPixelRatio - this.thumbs[i].ratio);\r\n if (currentDistance < (bestDistance - 0.0001))\r\n {\r\n bestDistance = currentDistance;\r\n this.thumbIdx = i;\r\n }\r\n }\r\n\r\n this.thumbCanvas.height = this.thumbs[this.thumbIdx].height;\r\n this.thumbCanvas.width = this.thumbs[this.thumbIdx].width;\r\n\r\n this.loadSprite();\r\n }\r\n\r\n loadSprite() {\r\n this.spriteThumbs = new CThumbnailLoader();\r\n this.spriteThumbs.load(this.thumbs[this.thumbIdx].path, () => {\r\n this.spriteCols = Math.floor(this.spriteThumbs.width / (this.thumbs[this.thumbIdx].width)) || 1;\r\n\r\n if (!this.spriteThumbs.data && !this.spriteThumbs.offsets) {\r\n this.spriteThumbs.openBinary(this.spriteThumbs.binaryFormat);\r\n }\r\n });\r\n }\r\n\r\n initFontInfo(fontObj) {\r\n this.fontInfo = fontObj;\r\n }\r\n\r\n addFontToRecent (font) {\r\n this.arrayRecentFonts.forEach(item => {\r\n if (item.name === font.name) this.arrayRecentFonts.splice(this.arrayRecentFonts.indexOf(item),1);\r\n })\r\n this.arrayRecentFonts.unshift(font);\r\n\r\n if (this.arrayRecentFonts.length > 5) this.arrayRecentFonts.splice(4,1);\r\n }\r\n\r\n changeTextColor(value) {\r\n this.textColor = value;\r\n }\r\n\r\n resetTextColor (color) {\r\n let value;\r\n\r\n if (color) {\r\n if (color.get_auto()) {\r\n value = 'auto';\r\n } else {\r\n if (color.get_type() == Asc.c_oAscColor.COLOR_TYPE_SCHEME) {\r\n value = {\r\n color: Common.Utils.ThemeColor.getHexColor(color.get_r(), color.get_g(), color.get_b()),\r\n effectValue: color.get_value()\r\n }\r\n } else {\r\n value = Common.Utils.ThemeColor.getHexColor(color.get_r(), color.get_g(), color.get_b());\r\n }\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n\r\n resetFontsRecent(fonts) {\r\n this.arrayRecentFonts = fonts;\r\n this.arrayRecentFonts = this.arrayRecentFonts ? JSON.parse(this.arrayRecentFonts) : [];\r\n }\r\n\r\n changeCustomTextColors (colors) {\r\n this.customTextColors = colors;\r\n }\r\n}","import {makeObservable, action, observable} from 'mobx';\r\nimport { LocalStorage } from '../../../../common/mobile/utils/LocalStorage.mjs';\r\n\r\nexport class storeApplicationSettings {\r\n constructor() {\r\n makeObservable(this, {\r\n unitMeasurement: observable,\r\n macrosMode: observable,\r\n macrosRequest: observable,\r\n formulaLang: observable, \r\n regCode: observable, \r\n regExample: observable, \r\n regData: observable, \r\n isRefStyle: observable, \r\n isComments: observable, \r\n isResolvedComments: observable, \r\n initRegData: action, \r\n getRegCode: action, \r\n changeRegCode: action, \r\n setRegExample: action, \r\n changeUnitMeasurement: action, \r\n changeMacrosSettings: action,\r\n changeMacrosRequest: action,\r\n changeDisplayComments: action, \r\n changeDisplayResolved: action, \r\n changeRefStyle: action, \r\n changeFormulaLang: action,\r\n directionMode: observable,\r\n changeDirectionMode: action,\r\n formulaLangsColection: observable,\r\n setFormulaLangsCollection: action\r\n });\r\n }\r\n \r\n directionMode = LocalStorage.getItem('mode-direction') || 'ltr';\r\n unitMeasurement = Common.Utils.Metric.getCurrentMetric();\r\n macrosMode = 0;\r\n macrosRequest = 0;\r\n formulaLang = LocalStorage.getItem('sse-settings-func-lang') || 'en';\r\n regCode = undefined;\r\n regExample = '';\r\n regData = [];\r\n isRefStyle = false;\r\n isComments = true;\r\n isResolvedComments = true; \r\n formulaLangs = ['en', 'be', 'bg', 'ca', 'zh', 'cs', 'da', 'nl', 'fi', 'fr', 'de', 'el', 'hu', 'id', 'it', 'ja', 'ko', 'lv', 'lo', 'nb', 'pl', 'pt-br', 'pt', 'ro', 'ru', 'sk', 'sl', 'sv', 'es', 'tr', 'uk', 'vi'];\r\n formulaLangsExamples = {\r\n 'txtExampleEn': 'SUM; MIN; MAX; COUNT',\r\n 'txtExampleDe': 'SUMME; MIN; MAX; ANZAHL',\r\n 'txtExampleRu': 'СУММ; МИН; МАКС; СЧЁТ',\r\n 'txtExamplePl': 'SUMA; MIN; MAX; ILE.LICZB',\r\n 'txtExampleEs': 'SUMA; MIN; MAX; CALCULAR',\r\n 'txtExampleFr': 'SOMME; MIN; MAX; NB',\r\n 'txtExampleIt': 'SOMMA; MIN; MAX; CONTA.NUMERI',\r\n 'txtExampleBe': 'СУММ; МИН; МАКС; СЧЁТ',\r\n 'txtExampleCa': 'SUMA; MIN; MAX; COMPT',\r\n 'txtExampleCs': 'SUMA; MIN; MAX; POČET',\r\n 'txtExampleDa': 'SUM; MIN; MAKS; TÆL',\r\n 'txtExampleNl': 'SOM; MIN; MAX; AANTAL',\r\n 'txtExampleFi': 'SUMMA; MIN; MAKS; LASKE',\r\n 'txtExampleHu': 'SZUM; MIN; MAX; DARAB',\r\n 'txtExampleNb': 'SUMMER; MIN; STØRST; ANTALL',\r\n 'txtExamplePt': 'SOMA; MÍNIMO; MÁXIMO; CONTAR',\r\n 'txtExamplePtbr': 'SOMA; MÍNIMO; MÁXIMO; CONT.NÚM',\r\n 'txtExampleSv': 'SUMMA; MIN; MAX; ANTAL',\r\n 'txtExampleTr': 'TOPLA; MİN; MAK; BAĞ_DEĞ_SAY'\r\n }\r\n formulaLangsColection = [];\r\n\r\n changeDirectionMode(value) {\r\n this.directionMode = value;\r\n }\r\n\r\n setFormulaLangsCollection(arr) {\r\n this.formulaLangsColection = arr;\r\n }\r\n\r\n getRegDataCodes() {\r\n const regDataCode = [\r\n { value: 0x0401 }, { value: 0x042C }, { value: 0x0402 }, { value: 0x0405 }, { value: 0x0406 }, { value: 0x0C07 }, { value: 0x0407 }, {value: 0x0807}, { value: 0x0408 }, { value: 0x0C09 }, { value: 0x3809 }, { value: 0x0809 }, { value: 0x0409 }, { value: 0x0C0A }, { value: 0x080A },\r\n { value: 0x040B }, { value: 0x040C }, { value: 0x100C }, { value: 0x0421 }, { value: 0x0410 }, { value: 0x0810 }, { value: 0x0411 }, { value: 0x0412 }, { value: 0x0426 }, { value: 0x040E }, { value: 0x0413 }, { value: 0x0415 }, { value: 0x0416 },\r\n { value: 0x0816 }, { value: 0x0419 }, { value: 0x041B }, { value: 0x0424 }, { value: 0x081D }, { value: 0x041D }, { value: 0x041F }, { value: 0x0422 }, { value: 0x042A }, { value: 0x0804 }, { value: 0x0404 }\r\n ];\r\n\r\n return regDataCode;\r\n }\r\n\r\n initRegData() {\r\n const regDataCodes = this.getRegDataCodes();\r\n\r\n regDataCodes.forEach(item => {\r\n let langInfo = Common.util.LanguageInfo.getLocalLanguageName(item.value);\r\n this.regData.push({code: item.value, displayName: langInfo[1], langName: langInfo[0]});\r\n })\r\n }\r\n\r\n getRegCode() {\r\n const regData = this.regData;\r\n let value = Number(LocalStorage.getItem('sse-settings-regional'));\r\n \r\n regData.forEach(obj => {\r\n if(obj.code === value) {\r\n this.regCode = obj.code;\r\n }\r\n });\r\n\r\n if(!this.regCode) {\r\n this.regCode = 0x0409;\r\n }\r\n\r\n return this.regCode;\r\n }\r\n\r\n changeRegCode(value) {\r\n this.regCode = value;\r\n }\r\n\r\n setRegExample(value) {\r\n this.regExample = value;\r\n }\r\n\r\n changeUnitMeasurement(value) {\r\n this.unitMeasurement = +value;\r\n }\r\n\r\n changeMacrosSettings(value) {\r\n this.macrosMode = +value;\r\n }\r\n\r\n changeMacrosRequest(value) {\r\n this.macrosRequest = value;\r\n }\r\n\r\n changeDisplayComments(value) {\r\n this.isComments = value;\r\n if (!value) this.changeDisplayResolved(value);\r\n }\r\n\r\n changeDisplayResolved(value) {\r\n this.isResolvedComments = value;\r\n }\r\n\r\n changeRefStyle(value) {\r\n this.isRefStyle = value;\r\n }\r\n\r\n changeFormulaLang(value) {\r\n this.formulaLang = value;\r\n }\r\n}","import {action, observable, computed, makeObservable} from 'mobx';\r\n\r\nexport class storeShapeSettings {\r\n constructor() {\r\n makeObservable(this, {\r\n fillColor: observable,\r\n borderColorView: observable,\r\n setFillColor: action,\r\n getFillColor: action,\r\n setBorderColor: action,\r\n initBorderColorView: action\r\n });\r\n }\r\n\r\n getStyleGroups () {\r\n const styles = [\r\n {\r\n title: 'Text',\r\n thumb: 'shape-01.svg',\r\n type: 'textRect'\r\n },\r\n {\r\n title: 'Line',\r\n thumb: 'shape-02.svg',\r\n type: 'line'\r\n },\r\n {\r\n title: 'Line with arrow',\r\n thumb: 'shape-03.svg',\r\n type: 'lineWithArrow'\r\n },\r\n {\r\n title: 'Line with two arrows',\r\n thumb: 'shape-04.svg',\r\n type: 'lineWithTwoArrows'\r\n },\r\n {\r\n title: 'Rect',\r\n thumb: 'shape-05.svg',\r\n type: 'rect'\r\n },\r\n {\r\n title: 'Hexagon',\r\n thumb: 'shape-06.svg',\r\n type: 'hexagon'\r\n },\r\n {\r\n title: 'Round rect',\r\n thumb: 'shape-07.svg',\r\n type: 'roundRect'\r\n },\r\n {\r\n title: 'Ellipse',\r\n thumb: 'shape-08.svg',\r\n type: 'ellipse'\r\n },\r\n {\r\n title: 'Triangle',\r\n thumb: 'shape-09.svg',\r\n type: 'triangle'\r\n },\r\n {\r\n title: 'Triangle',\r\n thumb: 'shape-10.svg',\r\n type: 'rtTriangle'\r\n },\r\n {\r\n title: 'Trapezoid',\r\n thumb: 'shape-11.svg',\r\n type: 'trapezoid'\r\n },\r\n {\r\n title: 'Diamond',\r\n thumb: 'shape-12.svg',\r\n type: 'diamond'\r\n },\r\n {\r\n title: 'Right arrow',\r\n thumb: 'shape-13.svg',\r\n type: 'rightArrow'\r\n },\r\n {\r\n title: 'Left-right arrow',\r\n thumb: 'shape-14.svg',\r\n type: 'leftRightArrow'\r\n },\r\n {\r\n title: 'Left arrow callout',\r\n thumb: 'shape-15.svg',\r\n type: 'leftArrow'\r\n },\r\n {\r\n title: 'Right arrow callout',\r\n thumb: 'shape-16.svg',\r\n type: 'bentUpArrow'\r\n },\r\n {\r\n title: 'Flow chart off page connector',\r\n thumb: 'shape-17.svg',\r\n type: 'flowChartOffpageConnector'\r\n },\r\n {\r\n title: 'Heart',\r\n thumb: 'shape-18.svg',\r\n type: 'heart'\r\n },\r\n {\r\n title: 'Math minus',\r\n thumb: 'shape-19.svg',\r\n type: 'mathMinus'\r\n },\r\n {\r\n title: 'Math plus',\r\n thumb: 'shape-20.svg',\r\n type: 'mathPlus'\r\n },\r\n {\r\n title: 'Parallelogram',\r\n thumb: 'shape-21.svg',\r\n type: 'parallelogram'\r\n },\r\n {\r\n title: 'Wedge rect callout',\r\n thumb: 'shape-22.svg',\r\n type: 'wedgeRectCallout'\r\n },\r\n {\r\n title: 'Wedge ellipse callout',\r\n thumb: 'shape-23.svg',\r\n type: 'wedgeEllipseCallout'\r\n },\r\n {\r\n title: 'Cloud callout',\r\n thumb: 'shape-24.svg',\r\n type: 'cloudCallout'\r\n }\r\n ];\r\n\r\n const groups = [];\r\n let i = 0;\r\n\r\n for (let row=0; row _sizes.length - 1) return _sizes[_sizes.length - 1];\r\n return _sizes[index];\r\n },\r\n\r\n indexSizeByValue: function (value) {\r\n let index = 0;\r\n _sizes.forEach((size, idx) => {\r\n if (Math.abs(size - value) < 0.25) {\r\n index = idx;\r\n }\r\n });\r\n return index;\r\n },\r\n\r\n sizeByValue: function (value) {\r\n return _sizes[this.indexSizeByValue(value)];\r\n }\r\n }\r\n }\r\n}","import {makeObservable, action, observable, computed} from 'mobx';\r\n\r\nexport class storeCellSettings {\r\n constructor() {\r\n makeObservable(this, {\r\n styleSize: observable, \r\n borderInfo: observable, \r\n borderStyle: observable, \r\n cellStyles: observable, \r\n fontsArray: observable, \r\n fontInfo: observable, \r\n fillColor: observable, \r\n fontColor: observable, \r\n styleName: observable, \r\n isBold: observable, \r\n isItalic: observable, \r\n isUnderline: observable, \r\n hAlignStr: observable, \r\n vAlignStr: observable, \r\n isWrapText: observable, \r\n orientationStr: observable,\r\n colorAuto: observable,\r\n initCellSettings: action, \r\n initTextFormat: action, \r\n initTextOrientation: action, \r\n initFontSettings: action, \r\n initEditorFonts: action, \r\n initCellStyles: action, \r\n initFontInfo: action, \r\n changeFontColor: action, \r\n changeFillColor: action, \r\n changeBorderColor: action, \r\n changeBorderSize: action, \r\n changeBorderStyle: action,\r\n setAutoColor: action,\r\n customFormats: observable,\r\n initCustomFormats: action,\r\n addCustomFormat: action\r\n });\r\n }\r\n\r\n styleSize = {\r\n width: 104,\r\n height: 48\r\n };\r\n\r\n borderInfo = {\r\n color: '000000', \r\n width: 12 // Asc.c_oAscBorderStyles.Medium\r\n };\r\n\r\n borderStyle = 'none';\r\n\r\n cellStyles = [];\r\n fontsArray = [];\r\n fontInfo = {};\r\n\r\n fillColor = undefined;\r\n fontColor = undefined;\r\n styleName = undefined;\r\n\r\n isBold = false;\r\n isItalic = false;\r\n isUnderline = false;\r\n\r\n hAlignStr = 'left';\r\n vAlignStr = 'bottom';\r\n isWrapText;\r\n\r\n orientationStr = 'horizontal';\r\n\r\n colorAuto = 'auto';\r\n\r\n customFormats;\r\n\r\n initCustomFormats(formatsArr) {\r\n this.customFormats = formatsArr;\r\n }\r\n\r\n addCustomFormat(format) {\r\n this.customFormats.push(format);\r\n }\r\n\r\n setAutoColor(value) {\r\n this.colorAuto = value;\r\n }\r\n\r\n initCellSettings(cellInfo) {\r\n\r\n let xfs = cellInfo.asc_getXfs();\r\n this.initFontSettings(xfs);\r\n\r\n let color = xfs.asc_getFillColor();\r\n // console.log(color);\r\n \r\n const clr = color.get_auto() ? 'transparent' : this.resetColor(color);\r\n \r\n this.fillColor = clr;\r\n this.styleName = cellInfo.asc_getStyleName();\r\n\r\n this.initTextOrientation(xfs);\r\n this.initTextFormat(xfs);\r\n\r\n }\r\n\r\n initTextFormat(xfs) {\r\n let hAlign = xfs.asc_getHorAlign();\r\n let vAlign = xfs.asc_getVertAlign();\r\n let isWrapText = xfs.asc_getWrapText();\r\n\r\n if (vAlign == Asc.c_oAscVAlign.Top)\r\n this.vAlignStr = 'top';\r\n else if (vAlign == Asc.c_oAscVAlign.Center)\r\n this.vAlignStr = 'center';\r\n else if (vAlign == Asc.c_oAscVAlign.Bottom)\r\n this.vAlignStr = 'bottom';\r\n\r\n switch (hAlign) {\r\n case AscCommon.align_Left: this.hAlignStr = 'left'; break;\r\n case AscCommon.align_Center: this.hAlignStr = 'center'; break;\r\n case AscCommon.align_Right: this.hAlignStr = 'right'; break;\r\n case AscCommon.align_Justify: this.hAlignStr = 'justify'; break;\r\n }\r\n\r\n this.isWrapText = isWrapText; \r\n }\r\n\r\n initTextOrientation(xfs) {\r\n switch( xfs.asc_getAngle() ) {\r\n case 45: this.orientationStr = 'anglecount'; break;\r\n case -45: this.orientationStr = 'angleclock'; break;\r\n case 255: this.orientationStr = 'vertical'; break;\r\n case 90: this.orientationStr = 'rotateup'; break;\r\n case -90: this.orientationStr = 'rotatedown'; break;\r\n case 0: this.orientationStr = 'horizontal'; break;\r\n }\r\n }\r\n\r\n initFontSettings(xfs) {\r\n this.fontInfo.name = xfs.asc_getFontName();\r\n this.fontInfo.size = xfs.asc_getFontSize();\r\n\r\n this.fontInfo.color = xfs.asc_getFontColor();\r\n this.fontColor = this.resetColor(this.fontInfo.color);\r\n\r\n this.isBold = xfs.asc_getFontBold();\r\n this.isItalic = xfs.asc_getFontItalic();\r\n this.isUnderline = xfs.asc_getFontUnderline();\r\n }\r\n\r\n initEditorFonts(fonts, select) {\r\n let array = [];\r\n\r\n for (let font of fonts) {\r\n array.push({\r\n id : font.asc_getFontId(),\r\n name : font.asc_getFontName(),\r\n //displayValue: font.asc_getFontName(),\r\n imgidx : font.asc_getFontThumbnail(),\r\n type : font.asc_getFontType()\r\n });\r\n }\r\n this.fontsArray = array;\r\n }\r\n\r\n initCellStyles(styles) {\r\n this.cellStyles = styles;\r\n }\r\n\r\n initFontInfo(fontObj) {\r\n this.fontInfo = fontObj;\r\n }\r\n\r\n changeFontColor(color) {\r\n this.fontColor = color;\r\n }\r\n\r\n changeFillColor(color) {\r\n this.fillColor = color;\r\n }\r\n\r\n changeBorderColor(color) {\r\n this.borderInfo.color = color;\r\n }\r\n\r\n changeBorderSize(size) {\r\n this.borderInfo.width = size;\r\n }\r\n\r\n changeBorderStyle(type) {\r\n this.borderStyle = type;\r\n }\r\n\r\n resetColor(color) {\r\n let clr = 'transparent';\r\n\r\n if(color) {\r\n if (color.get_auto()) {\r\n clr = 'auto'\r\n } else {\r\n if (color.get_type() == Asc.c_oAscColor.COLOR_TYPE_SCHEME) {\r\n clr = {\r\n color: Common.Utils.ThemeColor.getHexColor(color.get_r(), color.get_g(), color.get_b()),\r\n effectValue: color.get_value()\r\n }\r\n } else {\r\n clr = Common.Utils.ThemeColor.getHexColor(color.get_r(), color.get_g(), color.get_b());\r\n }\r\n }\r\n }\r\n\r\n return clr;\r\n }\r\n\r\n}","import {action, observable, makeObservable} from 'mobx';\r\n\r\nexport class storeSpreadsheetInfo {\r\n constructor() {\r\n makeObservable(this, {\r\n dataDoc: observable,\r\n setDataDoc: action,\r\n changeTitle: action\r\n })\r\n }\r\n \r\n dataDoc;\r\n\r\n setDataDoc(obj) {\r\n this.dataDoc = obj;\r\n }\r\n\r\n changeTitle(title) {\r\n this.dataDoc.title = title;\r\n }\r\n}","import {action, observable, makeObservable} from 'mobx';\r\nimport { LocalStorage } from '../../../../common/mobile/utils/LocalStorage.mjs';\r\n\r\nexport class storeAppOptions {\r\n constructor() {\r\n makeObservable(this, {\r\n isEdit: observable,\r\n canViewComments: observable,\r\n setConfigOptions: action,\r\n setPermissionOptions: action,\r\n\r\n lostEditingRights: observable,\r\n changeEditingRights: action,\r\n \r\n canBranding: observable,\r\n canBrandingExt: observable,\r\n\r\n isDocReady: observable,\r\n changeDocReady: action,\r\n });\r\n }\r\n\r\n isEdit = false;\r\n config = {};\r\n \r\n canViewComments = false;\r\n changeCanViewComments(value) {\r\n this.canViewComments = value;\r\n }\r\n\r\n canBranding = true;\r\n canBrandingExt = true;\r\n\r\n lostEditingRights = false;\r\n changeEditingRights (value) {\r\n this.lostEditingRights = value;\r\n }\r\n\r\n isDocReady = false;\r\n changeDocReady (value) {\r\n this.isDocReady = value;\r\n }\r\n\r\n setConfigOptions (config, _t) {\r\n this.config = config;\r\n this.customization = config.customization;\r\n this.canRenameAnonymous = !((typeof (this.customization) == 'object') && (typeof (this.customization.anonymous) == 'object') && (this.customization.anonymous.request===false));\r\n this.guestName = (typeof (this.customization) == 'object') && (typeof (this.customization.anonymous) == 'object') &&\r\n (typeof (this.customization.anonymous.label) == 'string') && this.customization.anonymous.label.trim()!=='' ?\r\n Common.Utils.String.htmlEncode(this.customization.anonymous.label) : _t.textGuest;\r\n\r\n const value = this.canRenameAnonymous ? LocalStorage.getItem(\"guest-username\") : null;\r\n this.canRename = this.config.canRename;\r\n this.user = Common.Utils.fillUserInfo(config.user, config.lang, value ? (value + ' (' + this.guestName + ')' ) : _t.textAnonymous, LocalStorage.getItem(\"guest-id\") || ('uid-' + Date.now()));\r\n this.user.anonymous && LocalStorage.setItem(\"guest-id\", this.user.id);\r\n \r\n config.user = this.user;\r\n this.isDesktopApp = config.targetApp == 'desktop';\r\n this.canCreateNew = !!config.createUrl && !this.isDesktopApp;\r\n this.canOpenRecent = config.recent !== undefined && !this.isDesktopApp;\r\n this.templates = config.templates;\r\n this.recent = config.recent;\r\n this.createUrl = config.createUrl;\r\n this.lang = config.lang;\r\n this.location = (typeof (config.location) == 'string') ? config.location.toLowerCase() : '';\r\n this.region = (typeof (config.region) == 'string') ? config.region.toLowerCase() : config.region;\r\n this.sharingSettingsUrl = config.sharingSettingsUrl;\r\n this.fileChoiceUrl = config.fileChoiceUrl;\r\n this.isEditDiagram = config.mode == 'editdiagram';\r\n this.isEditMailMerge = config.mode == 'editmerge';\r\n this.mergeFolderUrl = config.mergeFolderUrl;\r\n this.canAnalytics = false;\r\n this.canRequestClose = config.canRequestClose;\r\n this.canCloseEditor = false;\r\n \r\n let canBack = false;\r\n\r\n if (typeof config.customization === 'object' && config.customization !== null) {\r\n const { goback, close } = config.customization;\r\n\r\n if (typeof goback === 'object' && config.canBackToFolder !== false) {\r\n const hasUrl = !!goback.url;\r\n const requestClose = goback.requestClose && this.canRequestClose;\r\n\r\n canBack = close === undefined ? hasUrl || requestClose : hasUrl && !goback.requestClose;\r\n\r\n if (goback.requestClose) {\r\n console.log(\"Obsolete: The 'requestClose' parameter of the 'customization.goback' section is deprecated. Please use 'close' parameter in the 'customization' section instead.\");\r\n }\r\n }\r\n\r\n if (typeof close === 'object' && close !== null) {\r\n this.canCloseEditor = (close.visible!==false) && this.canRequestClose && !this.isDesktopApp;\r\n }\r\n }\r\n \r\n this.canBack = this.canBackToFolder = canBack;\r\n this.canPlugins = false;\r\n\r\n AscCommon.UserInfoParser.setParser(true);\r\n AscCommon.UserInfoParser.setCurrentName(this.user.fullname);\r\n }\r\n\r\n setPermissionOptions (document, licType, params, permissions, isSupportEditFeature) {\r\n if (params.asc_getRights() !== Asc.c_oRights.Edit)\r\n permissions.edit = false;\r\n this.canBranding = params.asc_getCustomization();\r\n this.canBrandingExt = params.asc_getCanBranding() && (typeof this.customization == 'object');\r\n this.canModifyFilter = permissions.modifyFilter !== false;\r\n this.canAutosave = true;\r\n this.canAnalytics = params.asc_getIsAnalyticsEnable();\r\n this.canLicense = (licType === Asc.c_oLicenseResult.Success || licType === Asc.c_oLicenseResult.SuccessLimit);\r\n this.isLightVersion = params.asc_getIsLight();\r\n this.buildVersion = params.asc_getBuildVersion();\r\n this.canCoAuthoring = !this.isLightVersion;\r\n this.isOffline = Common.EditorApi.get().asc_isOffline();\r\n this.canRequestEditRights = this.config.canRequestEditRights;\r\n this.canEdit = permissions.edit !== false && // can edit or review\r\n (this.config.canRequestEditRights || this.config.mode !== 'view') && isSupportEditFeature; // if mode==\"view\" -> canRequestEditRights must be defined\r\n // (!this.isReviewOnly || this.canLicense) && // if isReviewOnly==true -> canLicense must be true\r\n this.isEdit = (this.canLicense || this.isEditDiagram || this.isEditMailMerge) && permissions.edit !== false && this.config.mode !== 'view' && isSupportEditFeature;\r\n this.canComments = this.canLicense && (permissions.comment === undefined ? this.isEdit : permissions.comment) && (this.config.mode !== 'view');\r\n this.canComments = this.canComments && !((typeof (this.customization) == 'object') && this.customization.comments===false);\r\n this.canViewComments = this.canComments || !((typeof (this.customization) == 'object') && this.customization.comments===false);\r\n this.canEditComments = this.isOffline || !permissions.editCommentAuthorOnly;\r\n this.canDeleteComments= this.isOffline || !permissions.deleteCommentAuthorOnly;\r\n if ((typeof (this.customization) == 'object') && this.customization.commentAuthorOnly===true) {\r\n console.log(\"Obsolete: The 'commentAuthorOnly' parameter of the 'customization' section is deprecated. Please use 'editCommentAuthorOnly' and 'deleteCommentAuthorOnly' parameters in the permissions instead.\");\r\n if (permissions.editCommentAuthorOnly===undefined && permissions.deleteCommentAuthorOnly===undefined)\r\n this.canEditComments = this.canDeleteComments = this.isOffline;\r\n }\r\n // this.isForm = !!window.isPDFForm;\r\n this.canChat = this.canLicense && !this.isOffline && (permissions.chat !== false);\r\n this.canPrint = (permissions.print !== false);\r\n this.isRestrictedEdit = !this.isEdit && this.canComments && isSupportEditFeature;\r\n this.trialMode = params.asc_getLicenseMode();\r\n\r\n const type = /^(?:(pdf|djvu|xps|oxps))$/.exec(document.fileType);\r\n this.canDownloadOrigin = permissions.download !== false && (type && typeof type[1] === 'string');\r\n this.canDownload = permissions.download !== false && (!type || typeof type[1] !== 'string');\r\n this.canUseReviewPermissions = this.canLicense && (!!permissions.reviewGroups || this.customization \r\n && this.customization.reviewPermissions && (typeof (this.customization.reviewPermissions) == 'object'));\r\n this.canUseCommentPermissions = this.canLicense && !!permissions.commentGroups;\r\n this.canUseUserInfoPermissions = this.canLicense && !!permissions.userInfoGroups;\r\n this.canUseReviewPermissions && AscCommon.UserInfoParser.setReviewPermissions(permissions.reviewGroups, this.customization.reviewPermissions);\r\n this.canUseCommentPermissions && AscCommon.UserInfoParser.setCommentPermissions(permissions.commentGroups); \r\n this.canUseUserInfoPermissions && AscCommon.UserInfoParser.setUserInfoPermissions(permissions.userInfoGroups);\r\n\r\n this.canUseHistory = this.canLicense && this.config.canUseHistory && this.canCoAuthoring && !this.isDesktopApp && !this.isOffline;\r\n this.canHistoryClose = this.config.canHistoryClose;\r\n this.canHistoryRestore= this.config.canHistoryRestore;\r\n\r\n this.canLiveView = !!params.asc_getLiveViewerSupport() && (this.config.mode === 'view') && isSupportEditFeature;\r\n this.isAnonymousSupport = !!Common.EditorApi.get().asc_isAnonymousSupport();\r\n }\r\n}","import {action, observable, computed, makeObservable} from 'mobx';\n\nexport class storeChartSettings {\n constructor() {\n makeObservable(this, {\n borderColor: observable,\n fillColor: observable,\n chartStyles: observable,\n setBorderColor: action,\n initBorderColor: action,\n setFillColor: action,\n getFillColor: action,\n clearChartStyles: action,\n updateChartStyles: action,\n styles: computed,\n types: computed,\n });\n }\n \n borderColor = undefined;\n\n setBorderColor (color) {\n this.borderColor = color;\n }\n\n initBorderColor(shapeProperties) {\n let stroke = shapeProperties.get_stroke();\n this.borderColor = (stroke && stroke.get_type() == Asc.c_oAscStrokeType.STROKE_COLOR) ? this.resetColor(stroke.get_color()) : 'transparent';\n }\n\n fillColor = undefined;\n\n setFillColor (color) {\n this.fillColor = color;\n }\n\n getFillColor (shapeProperties) {\n const fill = shapeProperties.asc_getFill();\n const fillType = fill.asc_getType();\n\n if (fillType == Asc.c_oAscFill.FILL_TYPE_SOLID) {\n this.fillColor = this.resetColor(fill.asc_getFill().asc_getColor());\n }\n\n return this.fillColor;\n }\n\n chartStyles = null;\n\n clearChartStyles () {\n this.chartStyles = null;\n }\n\n updateChartStyles (styles) {\n this.chartStyles = styles;\n }\n\n get styles () {\n if (!this.chartStyles) return null;\n const widthContainer = document.querySelector(\".page-content\").clientWidth;\n const columns = parseInt(widthContainer / 70); // magic\n let row = -1;\n const styles = [];\n \n this.chartStyles.forEach((style, index) => {\n if (0 == index % columns) {\n styles.push([]);\n row++\n }\n styles[row].push(style);\n });\n\n return styles;\n }\n\n get types () {\n const _types = [\n { type: Asc.c_oAscChartTypeSettings.barNormal, thumb: 'bar-normal'},\n { type: Asc.c_oAscChartTypeSettings.barStacked, thumb: 'bar-stacked'},\n { type: Asc.c_oAscChartTypeSettings.barStackedPer, thumb: 'bar-pstacked'},\n { type: Asc.c_oAscChartTypeSettings.barNormal3d, thumb: 'bar3dnormal'},\n { type: Asc.c_oAscChartTypeSettings.barStacked3d, thumb: 'bar3dstack'},\n { type: Asc.c_oAscChartTypeSettings.barStackedPer3d, thumb: 'bar3dpstack'},\n { type: Asc.c_oAscChartTypeSettings.barNormal3dPerspective, thumb: 'bar3dpsnormal'},\n { type: Asc.c_oAscChartTypeSettings.lineNormal, thumb: 'line-normal'},\n { type: Asc.c_oAscChartTypeSettings.lineStacked, thumb: 'line-stacked'},\n { type: Asc.c_oAscChartTypeSettings.lineStackedPer, thumb: 'line-pstacked'},\n { type: Asc.c_oAscChartTypeSettings.hBarNormal, thumb: 'hbar-normal'},\n { type: Asc.c_oAscChartTypeSettings.hBarStacked, thumb: 'hbar-stacked'},\n { type: Asc.c_oAscChartTypeSettings.hBarStackedPer, thumb: 'hbar-pstacked'},\n { type: Asc.c_oAscChartTypeSettings.hBarNormal3d, thumb: 'hbar3dnormal'},\n { type: Asc.c_oAscChartTypeSettings.hBarStacked3d, thumb: 'hbar3dstack'},\n { type: Asc.c_oAscChartTypeSettings.hBarStackedPer3d, thumb: 'hbar3dpstack'},\n { type: Asc.c_oAscChartTypeSettings.areaNormal, thumb: 'area-normal'},\n { type: Asc.c_oAscChartTypeSettings.areaStacked, thumb: 'area-stacked'},\n { type: Asc.c_oAscChartTypeSettings.areaStackedPer, thumb: 'area-pstacked'},\n { type: Asc.c_oAscChartTypeSettings.pie, thumb: 'pie'},\n { type: Asc.c_oAscChartTypeSettings.doughnut, thumb: 'doughnut'},\n { type: Asc.c_oAscChartTypeSettings.pie3d, thumb: 'pie3d'},\n { type: Asc.c_oAscChartTypeSettings.scatter, thumb: 'scatter'},\n { type: Asc.c_oAscChartTypeSettings.stock, thumb: 'stock'},\n { type: Asc.c_oAscChartTypeSettings.line3d, thumb: 'line3d'},\n ];\n const columns = 3;\n let row = -1;\n const groups = [];\n _types.forEach((type, index) => {\n if (0 == index % columns) {\n groups.push([]);\n row++\n }\n groups[row].push(type);\n });\n return groups;\n }\n\n borderSizeTransform () {\n const _sizes = [0, 0.5, 1, 1.5, 2.25, 3, 4.5, 6];\n\n return {\n sizeByIndex: function (index) {\n if (index < 1) return _sizes[0];\n if (index > _sizes.length - 1) return _sizes[_sizes.length - 1];\n return _sizes[index];\n },\n\n indexSizeByValue: function (value) {\n let index = 0;\n _sizes.forEach((size, idx) => {\n if (Math.abs(size - value) < 0.25) {\n index = idx;\n }\n });\n return index;\n },\n\n sizeByValue: function (value) {\n return _sizes[this.indexSizeByValue(value)];\n }\n }\n }\n\n resetColor(color) {\n let clr = 'transparent';\n\n if(color) {\n if (color.get_auto()) {\n clr = 'auto'\n } else {\n if (color.get_type() == Asc.c_oAscColor.COLOR_TYPE_SCHEME) {\n clr = {\n color: Common.Utils.ThemeColor.getHexColor(color.get_r(), color.get_g(), color.get_b()),\n effectValue: color.get_value()\n }\n } else {\n clr = Common.Utils.ThemeColor.getHexColor(color.get_r(), color.get_g(), color.get_b());\n }\n }\n }\n\n return clr;\n }\n\n}","import {action, observable, computed, makeObservable} from 'mobx';\r\n\r\nexport class storeSpreadsheetSettings {\r\n constructor() {\r\n makeObservable(this, {\r\n isPortrait: observable,\r\n widthDocument: observable,\r\n heightDocument: observable,\r\n allSchemes: observable,\r\n isHideHeadings: observable,\r\n isHideGridlines: observable,\r\n resetPortrait: action,\r\n changeDocSize: action,\r\n pageSizesIndex: computed,\r\n addSchemes: action,\r\n changeHideHeadings: action,\r\n changeHideGridlines: action\r\n })\r\n }\r\n\r\n isPortrait = true;\r\n\r\n resetPortrait (isPortrait) {\r\n this.isPortrait = isPortrait === true;\r\n }\r\n\r\n // Spreadsheet Formats\r\n\r\n widthDocument;\r\n heightDocument;\r\n\r\n changeDocSize (width, height) {\r\n this.widthDocument = width;\r\n this.heightDocument = height;\r\n }\r\n\r\n getPageSizesList () {\r\n const txtCm = Common.Utils.Metric.getMetricName(Common.Utils.Metric.c_MetricUnits.cm);\r\n const pageSizes = [\r\n { caption: 'US Letter', subtitle: '21,59 ' + txtCm + ' x 27,94 ' + txtCm, value: [215.9, 279.4] },\r\n { caption: 'US Legal', subtitle: '21,59 ' + txtCm + ' x 35,56 ' + txtCm, value: [215.9, 355.6] },\r\n { caption: 'A4', subtitle: '21 ' + txtCm + ' x 29,7 ' + txtCm, value: [210, 297] },\r\n { caption: 'A5', subtitle: '14,8 ' + txtCm + ' x 21 ' + txtCm, value: [148, 210] },\r\n { caption: 'B5', subtitle: '17,6 ' + txtCm + ' x 25 ' + txtCm, value: [176, 250] },\r\n { caption: 'Envelope #10', subtitle: '10,48 ' + txtCm + ' x 24,13 ' + txtCm, value: [104.8, 241.3] },\r\n { caption: 'Envelope DL', subtitle: '11 ' + txtCm + ' x 22 ' + txtCm, value: [110, 220] },\r\n { caption: 'Tabloid', subtitle: '27,94 ' + txtCm + ' x 43,18 ' + txtCm, value: [279.4, 431.8] },\r\n { caption: 'A3', subtitle: '29,7 ' + txtCm + ' x 42 ' + txtCm, value: [297, 420] },\r\n { caption: 'Tabloid Oversize', subtitle: '29,69 ' + txtCm + ' x 45,72 ' + txtCm, value: [296.9, 457.2] },\r\n { caption: 'ROC 16K', subtitle: '19,68 ' + txtCm + ' x 27,3 ' + txtCm, value: [196.8, 273] },\r\n { caption: 'Envelope Choukei 3', subtitle: '12 ' + txtCm + ' x 23,5 ' + txtCm, value: [120, 235] },\r\n { caption: 'Super B/A3', subtitle: '30,5 ' + txtCm + ' x 48,7 ' + txtCm, value: [305, 487] },\r\n { caption: 'A0', subtitle: '84,1 ' + txtCm + ' x 118,9 ' + txtCm, value: [841, 1189] },\r\n { caption: 'A1', subtitle: '59,4 ' + txtCm + ' x 84,1 ' + txtCm, value: [594, 841] },\r\n { caption: 'A2', subtitle: '42 ' + txtCm + ' x 59,4 ' + txtCm, value: [420, 594] },\r\n { caption: 'A6', subtitle: '10,5 ' + txtCm + ' x 14,8 ' + txtCm, value: [105, 148] }\r\n ];\r\n\r\n return pageSizes;\r\n }\r\n\r\n get pageSizesIndex () {\r\n let w = this.widthDocument;\r\n let h = this.heightDocument;\r\n let ind;\r\n const pageSizes = this.getPageSizesList();\r\n\r\n pageSizes.forEach(function callback(size, index) {\r\n if (Math.abs(size.value[0] - w) < 0.1 && Math.abs(size.value[1] - h) < 0.1) {\r\n ind = index;\r\n }\r\n }, this);\r\n\r\n return ind;\r\n }\r\n\r\n // Color Schemes\r\n\r\n allSchemes;\r\n\r\n addSchemes(arr) {\r\n this.allSchemes = arr;\r\n }\r\n\r\n isHideHeadings;\r\n isHideGridlines;\r\n\r\n changeHideHeadings(value) {\r\n this.isHideHeadings = value;\r\n }\r\n\r\n changeHideGridlines(value) {\r\n this.isHideGridlines = value;\r\n }\r\n\r\n}\r\n","import {action, observable, makeObservable} from 'mobx';\r\n\r\nexport class storeReview {\r\n constructor() {\r\n makeObservable(this, {\r\n displayMode: observable,\r\n dataChanges: observable,\r\n changeDisplayMode: action,\r\n changeArrReview: action\r\n });\r\n }\r\n\r\n displayMode = 'markup';\r\n\r\n changeDisplayMode (mode) {\r\n this.displayMode = mode;\r\n }\r\n\r\n dataChanges = [];\r\n\r\n changeArrReview (data) {\r\n this.dataChanges = data && data.length > 0 ? data : [];\r\n }\r\n}","\nimport {makeObservable, observable, action, computed} from 'mobx';\n\nexport class storeComments {\n constructor() {\n makeObservable(this, {\n collectionComments: observable,\n groupCollectionComments: observable,\n filter: observable,\n\n showComments: observable,\n changeShowComment: action,\n removeShowComment: action,\n\n addComment: action,\n removeComment: action,\n changeComment: action,\n changeFilter: action,\n\n groupCollectionFilter: computed,\n\n isOpenEditComment: observable,\n openEditComment: action,\n isOpenAddReply: observable,\n openAddReply: action,\n isOpenEditReply: observable,\n openEditReply: action\n })\n }\n collectionComments = [];\n groupCollectionComments = [];\n\n filter = undefined;\n\n showComments = [];\n changeShowComment (uid) {\n this.showComments.length = 0;\n uid.forEach((item) => {\n this.showComments.push(this.findComment(item));\n });\n }\n\n removeShowComment(id) {\n const index = this.showComments.findIndex((comment) => {\n return comment.uid === id;\n });\n\n if (index !== -1) {\n this.showComments.splice(index, 1);\n }\n }\n\n addComment (comment) {\n comment.groupName ? this.groupCollectionComments.push(comment) : this.collectionComments.push(comment);\n }\n\n removeComment (id) {\n const collection = this.collectionComments.length > 0 ? this.collectionComments : this.groupCollectionComments;\n const index = collection.findIndex((comment) => {\n return comment.uid === id;\n });\n if (index !== -1) {\n collection.splice(index, 1);\n }\n this.removeShowComment(id);\n }\n\n changeComment (id, changeComment) {\n const comment = this.findComment(id);\n if (comment) {\n comment.comment = changeComment.comment;\n comment.userId = changeComment.userId;\n comment.userName = changeComment.userName;\n comment.parsedName = changeComment.parsedName;\n comment.userInitials = changeComment.userInitials;\n comment.userColor = changeComment.userColor;\n comment.resolved = changeComment.resolved;\n comment.quote = changeComment.quote;\n comment.time = changeComment.time;\n comment.date = changeComment.date;\n comment.editable = changeComment.editable;\n comment.removable = changeComment.removable;\n comment.replies = changeComment.replies;\n comment.hide =changeComment.hide;\n }\n }\n\n changeFilter (filter) {\n this.filter = filter;\n }\n\n findComment (id) {\n const collection = this.collectionComments.length > 0 ? this.collectionComments : this.groupCollectionComments;\n let comment = collection.find((item) => {\n return item.uid === id;\n });\n return comment;\n }\n\n get groupCollectionFilter () {\n if (this.filter && this.groupCollectionComments.length > 0) {\n const arr = [];\n this.filter.forEach((groupName) => {\n this.groupCollectionComments.forEach((comment) => {\n if (comment.groupName === groupName) {\n arr.push(comment);\n }\n });\n });\n return arr;\n }\n return false;\n }\n\n // Edit comment\n currentComment = null;\n isOpenEditComment = false;\n openEditComment (open, comment) {\n if (open !== this.isOpenEditComment) {\n this.currentComment = open ? comment : null;\n this.isOpenEditComment = open;\n }\n }\n\n currentReply = null;\n isOpenAddReply = false;\n openAddReply (open, comment) {\n if (open !== this.isOpenAddReply) {\n this.currentComment = open ? comment : null;\n this.isOpenAddReply = open;\n }\n }\n\n isOpenEditReply = false;\n openEditReply (open, comment, reply) {\n if (open !== this.isOpenEditReply) {\n this.currentComment = open ? comment : null;\n this.currentReply = open ? reply : null;\n this.isOpenEditReply = open;\n }\n }\n}","import {action, observable, makeObservable} from 'mobx';\n\nexport class storeToolbarSettings {\n constructor() {\n makeObservable(this, {\n isCanUndo: observable,\n setCanUndo: action,\n isCanRedo: observable,\n setCanRedo: action,\n disabledControls: observable,\n setDisabledControls: action,\n disabledEditControls: observable,\n setDisabledEditControls: action,\n disabledSettings: observable, \n setDisabledSettings: action\n })\n }\n\n disabledControls = true;\n\n setDisabledControls(value) {\n this.disabledControls = value;\n }\n\n disabledEditControls = false;\n\n setDisabledEditControls(value) {\n this.disabledEditControls = value;\n }\n\n disabledSettings = false;\n\n setDisabledSettings(value) {\n this.disabledSettings = value;\n }\n\n isCanUndo = false;\n\n setCanUndo(can) {\n this.isCanUndo = can;\n }\n\n isCanRedo = false;\n\n setCanRedo(can) {\n this.isCanRedo = can;\n }\n}","import {action, observable, makeObservable} from 'mobx';\n\nexport class storeThemes {\n constructor() {\n makeObservable(this, {\n\t\t\tisConfigSelectTheme: observable,\n\t\t\tsetConfigSelectTheme: action,\n\t\t\tcolorTheme: observable,\n\t\t\tsetColorTheme: action,\n systemColorTheme: observable,\n setSystemColorTheme: action,\n resetSystemColorTheme: action,\n setTranslationsThemes: action\n });\n }\n\n themes = {\n\t\tdark: {\n\t\t\tid: 'theme-dark',\n\t\t\ttype: 'dark',\n\t\t},\n\t\tlight: {\n\t\t\tid: 'theme-light',\n\t\t\ttype: 'light',\n\t\t},\n\t\tsystem: {\n\t\t\tid: 'theme-system',\n\t\t\ttype: 'system',\n\t\t}\n\t}\n\n nameColors = [\n\t\t\"canvas-background\",\n\t\t\"canvas-content-background\",\n\t\t\"canvas-page-border\",\n\n\t\t\"canvas-ruler-background\",\n\t\t\"canvas-ruler-border\",\n\t\t\"canvas-ruler-margins-background\",\n\t\t\"canvas-ruler-mark\",\n\t\t\"canvas-ruler-handle-border\",\n\t\t\"canvas-ruler-handle-border-disabled\",\n\n\t\t\"canvas-high-contrast\",\n\t\t\"canvas-high-contrast-disabled\",\n\n\t\t\"canvas-cell-border\",\n\t\t\"canvas-cell-title-border\",\n\t\t\"canvas-cell-title-border-hover\",\n\t\t\"canvas-cell-title-border-selected\",\n\t\t\"canvas-cell-title-hover\",\n\t\t\"canvas-cell-title-text\",\n\t\t\"canvas-cell-title-background\",\n\t\t\"canvas-cell-title-background-selected\",\n\n\t\t\"canvas-scroll-thumb\",\n\t\t\"canvas-scroll-thumb-hover\",\n\t\t\"canvas-scroll-thumb-pressed\",\n\t\t\"canvas-scroll-thumb-border\",\n\t\t\"canvas-scroll-thumb-border-hover\",\n\t\t\"canvas-scroll-thumb-border-pressed\",\n\t\t\"canvas-scroll-arrow\",\n\t\t\"canvas-scroll-arrow-hover\",\n\t\t\"canvas-scroll-arrow-pressed\",\n\t\t\"canvas-scroll-thumb-target\",\n\t\t\"canvas-scroll-thumb-target-hover\",\n\t\t\"canvas-scroll-thumb-target-pressed\",\n\t];\n\n\tisConfigSelectTheme = true;\n setConfigSelectTheme(value) {\n this.isConfigSelectTheme = value;\n }\n\n colorTheme;\n setColorTheme(theme) {\n this.colorTheme = theme;\n }\n\n systemColorTheme;\n setSystemColorTheme(theme) {\n this.systemColorTheme = theme;\n }\n\n resetSystemColorTheme() {\n this.systemColorTheme = null;\n }\n\n setTranslationsThemes(translations) {\n for(let key in this.themes) {\n this.themes[key].text = translations[key];\n }\n }\n}","import {makeObservable, action, observable} from 'mobx';\n\nexport class storeVersionHistory {\n constructor() {\n makeObservable(this, {\n arrVersions: observable, \n setVersions: action,\n isVersionHistoryMode: observable,\n changeVersionHistoryMode: action,\n currentVersion: observable,\n changeVersion: action,\n usersVersions: observable,\n addUser: action, \n })\n }\n\n isVersionHistoryMode = false;\n currentVersion = null;\n arrVersions = [];\n usersVersions = [];\n\n addUser(user) {\n this.usersVersions.push(user);\n }\n\n findUserById(id) {\n const user = this.usersVersions.find(user => user.id === id);\n return user;\n }\n\n changeVersion(version) {\n this.currentVersion = version;\n }\n\n changeVersionHistoryMode(value) {\n this.isVersionHistoryMode = value;\n }\n\n setVersions(arr) {\n this.arrVersions = arr;\n }\n\n findRevisions(revision) {\n return this.arrVersions.filter(rev => rev.revision === revision);\n }\n\n hasChanges() {\n return this.arrVersions.filter(rev => rev.isRevision === false).length > 0\n }\n\n getCurrentVersion() {\n return this.arrVersions.find(rev => rev.selected) || null;\n }\n\n hasCollapsed() {\n return this.arrVersions.filter(rev => rev.isRevision === true && rev.hasChanges === true && rev.isExpanded === false).length > 0;\n }\n}","\nimport {observable, action, makeObservable, computed} from 'mobx';\n\nclass Worksheet {\n sheet = {\n index : -1,\n active : false,\n name : '',\n locked : false,\n hidden : false,\n color : ''\n };\n\n constructor(data = {}) {\n makeObservable(this, {\n sheet: observable\n });\n this.sheet.merge(data);\n }\n}\n\nexport class storeWorksheets {\n sheets = [];\n\n constructor() {\n makeObservable(this, {\n sheets: observable,\n resetSheets: action,\n setActiveWorksheet: action,\n activeWorksheet: computed,\n\n isWorkbookLocked: observable,\n setWorkbookLocked: action,\n\n isWorksheetLocked: observable,\n setWorksheetLocked: action,\n\n isProtectedWorkbook: observable,\n setProtectedWorkbook: action,\n\n wsProps: observable,\n setWsProps: action,\n\n isDisabledEditSheet: observable,\n setDisabledEditSheet: action,\n\n colorTab:observable,\n changeTabColor: action\n });\n this.sheets = [];\n }\n\n colorTab = undefined;\n\n resetSheets(sheets) {\n this.sheets = Object.values(sheets)\n }\n\n changeTabColor(color) {\n this.colorTab = color;\n }\n\n setActiveWorksheet(i) {\n if ( !this.sheets[i].active ) {\n this.sheets.forEach(model => {\n if ( model.active )\n model.active = false;\n });\n\n this.sheets[i].active = true;\n }\n }\n\n get activeWorksheet() {\n for (let i = 0; i < this.sheets.length; i++) {\n if (this.sheets[i].active)\n return i;\n }\n return -1;\n }\n\n at(i) {\n return this.sheets[i]\n }\n\n hasHiddenWorksheet() {\n return this.sheets.some(model => model.hidden);\n }\n\n hiddenWorksheets() {\n return this.sheets.filter(model => model.hidden);\n }\n\n visibleWorksheets() {\n return this.sheets.filter(model => !model.hidden);\n }\n\n isWorkbookLocked = false;\n setWorkbookLocked(locked) {\n this.isWorkbookLocked = locked;\n }\n\n isWorksheetLocked = false;\n setWorksheetLocked(index, locked) {\n let model = this.sheets[index];\n if(model && model.locked !== locked)\n model.locked = locked;\n this.isWorksheetLocked = locked;\n }\n\n isProtectedWorkbook = false;\n setProtectedWorkbook(value) {\n this.isProtectedWorkbook = value;\n }\n\n wsProps;\n setWsProps(value) {\n this.wsProps = value;\n }\n\n wsLock;\n setWsLock(value) {\n this.wsLock = value;\n }\n\n isDisabledEditSheet;\n setDisabledEditSheet(value) {\n this.isDisabledEditSheet = value;\n }\n}\n","import {storeFocusObjects} from \"./focusObjects\";\nimport {storeUsers} from '../../../../common/mobile/lib/store/users';\nimport {storeFunctions} from './functions';\nimport {storePalette} from \"./palette\";\nimport {storeTextSettings} from \"./textSettings\";\nimport {storeApplicationSettings} from \"./applicationSettings\";\nimport {storeShapeSettings} from \"./shapeSettings\";\nimport {storeCellSettings} from \"./cellSettings\";\nimport {storeSpreadsheetInfo} from \"./spreadsheetInfo\";\nimport {storeAppOptions} from \"./appOptions\";\n// import {storeImageSettings} from \"./imageSettings\";\n// import {storeTableSettings} from \"./tableSettings\";\nimport {storeChartSettings} from \"./chartSettings\";\nimport {storeSpreadsheetSettings} from \"./spreadsheetSettings\";\nimport {storeReview} from '../../../../common/mobile/lib/store/review';\nimport {storeComments} from \"../../../../common/mobile/lib/store/comments\";\nimport {storeToolbarSettings} from \"./toolbar\";\nimport { storeThemes } from '../../../../common/mobile/lib/store/themes';\nimport { storeVersionHistory } from \"../../../../common/mobile/lib/store/versionHistory\";\nimport {storeWorksheets} from \"./sheets\";\n\nexport const stores = {\n storeFocusObjects: new storeFocusObjects(),\n storeSpreadsheetSettings: new storeSpreadsheetSettings(),\n storeApplicationSettings: new storeApplicationSettings(),\n users: new storeUsers(),\n storeFunctions: new storeFunctions(),\n storeTextSettings: new storeTextSettings(),\n storeSpreadsheetInfo: new storeSpreadsheetInfo(),\n storeAppOptions: new storeAppOptions(),\n // storeParagraphSettings: new storeParagraphSettings(),\n storeShapeSettings: new storeShapeSettings(),\n storeChartSettings: new storeChartSettings(),\n storePalette: new storePalette(),\n storeCellSettings: new storeCellSettings(),\n storeReview: new storeReview(),\n // storeImageSettings: new storeImageSettings(),\n // storeTableSettings: new storeTableSettings()\n storeComments: new storeComments(),\n storeVersionHistory: new storeVersionHistory(),\n storeToolbarSettings: new storeToolbarSettings(),\n storeWorksheets: new storeWorksheets(),\n storeThemes: new storeThemes()\n};\n\n","// Import React and ReactDOM\nimport React, { Suspense } from 'react';\nimport { createRoot } from 'react-dom/client';\n\n// Import Framework7\nimport Framework7 from 'framework7/lite-bundle';\nimport { Dom7 } from 'framework7/lite-bundle';\nwindow.$$ = Dom7;\n\n// Import Framework7-React Plugin\nimport Framework7React from 'framework7-react';\n\nimport jQuery from 'jquery';\nwindow.jQuery = jQuery;\nwindow.$ = jQuery;\n\n// Import Framework7 Styles\n\n// Import App Custom Styles\n\nimport('./less/app.less');\nimport '../../../../../sdkjs/cell/css/main-mobile.css';\n\n// Import App Component\nimport App from './page/app.jsx';\nimport { I18nextProvider } from 'react-i18next';\nimport i18n from './lib/i18n.js';\n\nimport { Provider } from 'mobx-react';\nimport { stores } from './store/mainStore.js';\n// import { LocalStorage } from '../../../common/mobile/utils/LocalStorage.mjs';\n\nconst container = document.getElementById('app');\nconst root = createRoot(container); \n\n// Init F7 React Plugin\nFramework7.use(Framework7React);\n\n// Mount React App\nroot.render(\n \n \n {/**/}\n \n {/**/}\n \n \n);"],"names":["undefined","window","Common","component","Analytics","_category","initialize","id","category","Object","prototype","toString","apply","$","append","trackEvent","action","label","value","isFinite","_gaq","push","Gateway","me","this","$me","commandMap","data","trigger","url","_postMessage","msg","buffer","parent","JSON","frameEditorId","postMessage","stringify","fn","e","origin","parentOrigin","location","command","handler","call","cmd","parse","_onMessage","attachEvent","addEventListener","appReady","event","requestEditRights","requestHistory","requestHistoryData","revision","requestRestore","version","fileType","requestEmailAddresses","requestStartMailMerge","requestHistoryClose","reportError","code","description","errorCode","errorDescription","reportWarning","warningCode","warningDescription","sendInfo","info","setDocumentModified","modified","internalMessage","type","updateVersion","downloadAs","requestSaveAs","title","collaborativeChanges","requestRename","metaChange","meta","documentReady","requestClose","requestMakeActionLink","config","requestUsers","c","requestSendNotify","emails","requestInsertImage","requestMailMergeRecipients","requestCompareFile","requestSharingSettings","requestCreateNew","requestReferenceData","requestOpen","requestSelectDocument","requestSelectSpreadsheet","requestReferenceSource","requestStartFilling","pluginsReady","saveDocument","submitForm","on","util","LanguageInfo","localLanguageName","getLocalLanguageName","getLocalLanguageCode","name","toLowerCase","getLanguages","_extend_object","dest","source","_","extend","assign","Utils","utils","userAgent","navigator","check","regex","test","isStrict","document","compatMode","is","m","exec","parseFloat","docMode","documentMode","isOpera","isOpera10_5","isIE","isIE7","isIE8","isIE9","isIE10","isIE11","isIE6","isChrome","isWebKit","isSafari","isSafari2","isSafari3","isSafari4","isSafari5_0","isSafari5","isGecko","isGecko3","isGecko4","isGecko5","isGecko10","isFF3_0","isFF3_5","isFF3_6","isWindows","isMac","isLinux","chromeVersion","firefoxVersion","ieVersion","operaVersion","safariVersion","webKitVersion","isSecure","protocol","vendor","opera","checkSize","scale","AscCommon","checkDeviceScale","correctApplicationScale","str_mq_225","matchMedia","matches","devicePixelRatio","body","classes","className","clear_list","replace","trim","zoom","correct","innerWidth","innerHeight","applicationPixelRatio","checkSizeIE","isOffsetUsedZoom","getBoundingClientRect","element","rect","koef","newRect","x","y","width","height","left","top","right","bottom","getOffsetLeft","offsetLeft","getOffsetTop","offsetTop","getOffset","$element","pos","offset","getPosition","position","addClass","isIEQuirks","isIE7m","isIE7p","isIE8m","isIE8p","isIE9m","isIE9p","isIE10m","isIE10p","isIE11m","isIE11p","isFF4","isFF5","isFF10","emailRe","ipRe","hostnameRe","localRe","emailStrongRe","emailAddStrongRe","ipStrongRe","hostnameStrongRe","documentSettingsType","Paragraph","Table","Header","TextArt","Shape","Image","Slide","Chart","MailMerge","Signature","Pivot","Cell","Slicer","Form","importTextType","DRM","CSV","TXT","Paste","Columns","Data","topOffset","croppedGeometry","InternalSettings","get","themecolor","initnames","txtBlack","txtWhite","txtRed","txtGreen","txtBlue","txtYellow","txtPurple","txtAqua","txtDarkRed","txtDarkGreen","txtDarkBlue","txtDarkYellow","txtDarkPurple","txtDarkTeal","txtLightGray","txtGray","txtLightBlue","txtPink","txtLightYellow","txtSkyBlue","txtRose","txtTurquosie","txtLightGreen","txtLavender","txtLightOrange","txtTeal","txtGold","txtOrange","txtIndigo","txtBrown","txtDarkGray","txtbackground","txttext","txtaccent","txtDarker","txtLighter","txtBrightGreen","txtViolet","ThemeValues","getTranslation","getEffectTranslation","parseInt","Math","abs","setColors","colors","standart_colors","i","j","item","length","standartcolors","color","getHexColor","get_r","get_g","get_b","tip","asc_getName","idx","colorName","schemeName","asc_getNameInColorScheme","effectName","asc_getEffectValue","String","textComma","effectId","effectValue","effectcolors","getEffectColors","getStandartColors","r","g","b","getRgbColor","clr","Asc","asc_CColor","put_type","c_oAscColor","COLOR_TYPE_SCHEME","COLOR_TYPE_SRGB","put_r","put_g","put_b","put_a","put_value","colorValue2EffectId","toUpperCase","ThemeColor","metrics","c_MetricUnits","cm","pt","inch","currentMetric","metricName","defaultMetric","txtCm","txtPt","txtInch","setCurrentMetric","getCurrentMetric","getCurrentMetricName","getMetricName","unit","setDefaultMetric","getDefaultMetric","fnRecalcToMM","fnRecalcFromMM","toFixed","Metric","RGBColor","colorString","charAt","substr","colorDefinitions","re","process","bits","rgb","h","round","s","v","t1","t2","t3","processor","channels","isNaN","isEqual","toRGB","toRGBA","alfa","toHex","_r","_g","_b","toHSB","hsb","min","max","delta","utilsString","textCtrl","textShift","textAlt","format","args","toArray","arguments","slice","htmlEncode","string","escape","htmlDecode","unescape","ellipsis","len","word","vs","index","lastIndexOf","platformKey","template","hookFn","isEmpty","isFunction","encodeSurrogateChar","nUnicode","fromCharCode","nLeadingChar","nTrailingChar","fixedDigits","num","digits","fill","strfill","str","isBrowserSupported","showBrowserRestriction","getElementsByClassName","editor","DE","SSE","PE","PDFE","newDiv","createElement","innerHTML","appendChild","hide","remove","applyCustomization","elmap","$el","visible","text","applyCustomizationPlugins","plugins","_createXMLHTTPObject","xmlhttp","XMLHttpRequest","ActiveXObject","E","_getPluginCode","xhrObj","open","send","status","eval","responseText","forEach","fillUserInfo","lang","defname","defid","_user","anonymous","fullname","group","UserInfoParser","getSeparator","guest","createXhr","getConfigJson","loadConfig","callback","fetch","method","headers","then","response","ok","json","catch","asyncCall","scope","Promise","resolve","reject","strongMatch","regExp","RegExp","arr","match","settings","set","lockControls","causes","lock","opts","defControls","controls","array","doLock","cmp","cause","options","contains","keepState","indexOf","splice","merge","union","each","setDisabled","clear","difference","isArray","isDisabled","injectButtons","$slots","iconCls","caption","split","menu","toggle","dataHint","dataHintDirection","dataHintOffset","dataHintTitle","btnsArr","createButtonSet","el","_cls","button","UI","Button","parentEl","eq","cls","enableToggle","disabled","add","injectComponent","$slot","rendered","render","startFullscreenForElement","requestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","msRequestFullscreen","cancelFullscreen","cancelFullScreen","webkitCancelFullScreen","mozCancelFullScreen","msExitFullscreen","warningDocumentIsLocked","disablefunc","app","warning","Locale","default","buttons","primary","btn","getController","api","asc_setLocalRestrictions","c_oAscLocalRestrictionType","None","jQuery","elementById","_el","getElementById","substring","node","querySelectorAll","findById","ModalWindow","count","show","close","isVisible","separator","setParser","getParsedName","username","getParsedGroups","groups","getUserInitials","fio","initials","getKeyByValue","obj","prop","hasOwnProperty","isRTL","isrtl","nativeprocvars","rtl","localStorage","getBool","isCurrentLanguageRtl","iconsStr2IconsObj","icons","result","scaleValue","arrParams","start","commonPart","end","param","values","iconName","tempObj","pop","join","bHasName","bHasType","arrThemes","paramName","thInd","scaleInd","themePath","stateInd","state","getSuitableIcons","theme","Themes","currentThemeId","style","isDarkTheme","defUrl","bestUrl","ratio","current","bestDistance","currentDistance","key","aa","ca","p","a","encodeURIComponent","da","Set","ea","fa","ha","ia","ja","ka","la","ma","d","f","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","propertyName","sanitizeURL","removeEmptyString","z","ra","sa","ta","pa","qa","oa","removeAttribute","setAttribute","setAttributeNS","xlinkHref","ua","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","va","Symbol","for","wa","ya","za","Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia","Ja","iterator","Ka","La","A","Ma","Error","stack","Na","Oa","prepareStackTrace","defineProperty","Reflect","construct","l","k","displayName","includes","Pa","tag","Qa","$$typeof","_context","_payload","_init","Ra","Sa","Ta","nodeName","Va","_valueTracker","getOwnPropertyDescriptor","constructor","configurable","enumerable","getValue","setValue","stopTracking","Ua","Wa","checked","Xa","activeElement","Ya","defaultChecked","defaultValue","_wrapperState","initialChecked","Za","initialValue","controlled","ab","bb","cb","db","ownerDocument","eb","Array","fb","selected","defaultSelected","gb","dangerouslySetInnerHTML","children","hb","ib","jb","textContent","kb","lb","mb","nb","namespaceURI","valueOf","firstChild","removeChild","MSApp","execUnsafeLocalFunction","ob","lastChild","nodeType","nodeValue","pb","animationIterationCount","aspectRatio","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","fontWeight","lineClamp","lineHeight","opacity","order","orphans","tabSize","widows","zIndex","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","qb","rb","sb","setProperty","keys","tb","menuitem","area","base","br","col","embed","hr","img","input","keygen","link","track","wbr","ub","vb","wb","xb","target","srcElement","correspondingUseElement","parentNode","yb","zb","Ab","Bb","Cb","stateNode","Db","Eb","Fb","Gb","Hb","Ib","Jb","Kb","Lb","Mb","removeEventListener","Nb","onError","Ob","Pb","Qb","Rb","Sb","Tb","Vb","alternate","return","flags","Wb","memoizedState","dehydrated","Xb","Zb","child","sibling","Yb","$b","ac","unstable_scheduleCallback","bc","unstable_cancelCallback","cc","unstable_shouldYield","dc","unstable_requestPaint","B","unstable_now","ec","unstable_getCurrentPriorityLevel","fc","unstable_ImmediatePriority","gc","unstable_UserBlockingPriority","hc","unstable_NormalPriority","ic","unstable_LowPriority","jc","unstable_IdlePriority","kc","lc","oc","clz32","pc","qc","log","LN2","rc","sc","tc","uc","pendingLanes","suspendedLanes","pingedLanes","entangledLanes","entanglements","vc","xc","yc","zc","Ac","eventTimes","Cc","C","Dc","Ec","Fc","Gc","Hc","Ic","Jc","Kc","Lc","Mc","Nc","Oc","Map","Pc","Qc","Rc","Sc","delete","pointerId","Tc","nativeEvent","blockedOn","domEventName","eventSystemFlags","targetContainers","Vc","Wc","priority","isDehydrated","containerInfo","Xc","Yc","dispatchEvent","shift","Zc","$c","ad","bd","cd","ReactCurrentBatchConfig","dd","ed","transition","fd","gd","hd","Uc","stopPropagation","jd","kd","ld","md","nd","od","keyCode","charCode","pd","qd","rd","_reactName","_targetInst","currentTarget","isDefaultPrevented","defaultPrevented","returnValue","isPropagationStopped","preventDefault","cancelBubble","persist","isPersistent","wd","xd","yd","sd","eventPhase","bubbles","cancelable","timeStamp","Date","now","isTrusted","td","ud","view","detail","vd","Ad","screenX","screenY","clientX","clientY","pageX","pageY","ctrlKey","shiftKey","altKey","metaKey","getModifierState","zd","relatedTarget","fromElement","toElement","movementX","movementY","Bd","Dd","dataTransfer","Fd","Hd","animationName","elapsedTime","pseudoElement","Id","clipboardData","Jd","Ld","Md","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Nd","Od","Alt","Control","Meta","Shift","Pd","Qd","repeat","locale","which","Rd","Td","pressure","tangentialPressure","tiltX","tiltY","twist","pointerType","isPrimary","Vd","touches","targetTouches","changedTouches","Xd","Yd","deltaX","wheelDeltaX","deltaY","wheelDeltaY","wheelDelta","deltaZ","deltaMode","Zd","$d","ae","be","ce","de","ee","fe","ge","he","ie","le","date","datetime","email","month","number","password","range","search","tel","time","week","ne","oe","listeners","pe","qe","se","te","ue","ve","we","xe","ye","ze","oninput","Ae","detachEvent","Be","Ce","De","Ee","Fe","He","Ie","Je","Ke","nextSibling","Le","compareDocumentPosition","Me","HTMLIFrameElement","contentWindow","href","Ne","contentEditable","Oe","focusedElem","selectionRange","documentElement","selectionStart","selectionEnd","defaultView","getSelection","rangeCount","anchorNode","anchorOffset","focusNode","focusOffset","createRange","setStart","removeAllRanges","addRange","setEnd","scrollLeft","scrollTop","focus","Pe","Qe","Re","Se","Te","Ue","Ve","We","animationend","animationiteration","animationstart","transitionend","Xe","Ye","Ze","animation","$e","af","bf","cf","df","ef","ff","gf","hf","lf","mf","concat","nf","Ub","instance","listener","D","of","has","pf","qf","rf","random","sf","bind","capture","passive","n","t","J","u","w","F","tf","uf","parentWindow","vf","wf","na","xa","$a","ba","je","char","ke","unshift","xf","yf","zf","Af","Bf","Cf","Df","Ef","__html","Ff","setTimeout","Gf","clearTimeout","Hf","Jf","queueMicrotask","If","Kf","Lf","Mf","previousSibling","Nf","Of","Pf","Qf","Rf","Sf","Tf","Uf","G","Vf","H","Wf","Xf","Yf","contextTypes","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","Zf","childContextTypes","$f","ag","bg","getChildContext","cg","__reactInternalMemoizedMergedChildContext","dg","eg","fg","gg","hg","jg","kg","lg","mg","ng","og","pg","qg","rg","sg","tg","ug","vg","wg","xg","yg","I","zg","Ag","Bg","elementType","deletions","Cg","pendingProps","overflow","treeContext","retryLane","Dg","mode","Eg","Fg","Gg","memoizedProps","Hg","Ig","Jg","Kg","Lg","defaultProps","Mg","Ng","Og","Pg","Qg","Rg","_currentValue","Sg","childLanes","Tg","dependencies","firstContext","lanes","Ug","Vg","context","memoizedValue","next","Wg","Xg","Yg","interleaved","Zg","$g","ah","updateQueue","baseState","firstBaseUpdate","lastBaseUpdate","shared","pending","effects","bh","ch","eventTime","lane","payload","dh","K","eh","fh","gh","q","hh","ih","jh","Component","refs","kh","nh","isMounted","_reactInternals","enqueueSetState","L","lh","mh","enqueueReplaceState","enqueueForceUpdate","oh","shouldComponentUpdate","isPureReactComponent","ph","contextType","updater","qh","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","rh","props","getDerivedStateFromProps","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","componentDidMount","sh","ref","_owner","_stringRef","th","uh","vh","wh","xh","yh","implementation","zh","Ah","done","Bh","Ch","Dh","Eh","Fh","Gh","Hh","Ih","tagName","Jh","Kh","Lh","M","Mh","revealOrder","Nh","Oh","_workInProgressVersionPrimary","Ph","ReactCurrentDispatcher","Qh","Rh","N","O","P","Sh","Th","Uh","Vh","Q","Wh","Xh","Yh","Zh","$h","ai","bi","ci","baseQueue","queue","di","ei","fi","lastRenderedReducer","hasEagerState","eagerState","lastRenderedState","dispatch","gi","hi","ii","ji","ki","getSnapshot","li","mi","R","ni","lastEffect","stores","oi","pi","qi","ri","create","destroy","deps","si","ti","ui","vi","wi","xi","yi","zi","Ai","Bi","Ci","Di","Ei","Fi","Gi","Hi","Ii","Ji","readContext","useCallback","useContext","useEffect","useImperativeHandle","useInsertionEffect","useLayoutEffect","useMemo","useReducer","useRef","useState","useDebugValue","useDeferredValue","useTransition","useMutableSource","useSyncExternalStore","useId","unstable_isNewReconciler","identifierPrefix","Ki","message","digest","Li","Mi","console","error","Ni","WeakMap","Oi","Pi","Qi","Ri","getDerivedStateFromError","componentDidCatch","Si","componentStack","Ti","pingCache","Ui","Vi","Wi","Xi","ReactCurrentOwner","Yi","Zi","$i","aj","bj","compare","cj","dj","ej","baseLanes","cachePool","transitions","fj","gj","hj","ij","jj","UNSAFE_componentWillUpdate","componentWillUpdate","componentDidUpdate","kj","lj","pendingContext","mj","Aj","Bj","Cj","Dj","nj","oj","pj","fallback","qj","rj","tj","dataset","dgst","uj","vj","_reactRetry","sj","subtreeFlags","wj","xj","isBackwards","rendering","renderingStartTime","last","tail","tailMode","yj","Ej","S","Fj","Gj","wasMultiple","multiple","suppressHydrationWarning","onClick","onclick","size","createElementNS","autoFocus","createTextNode","T","Hj","Ij","Jj","Kj","U","Lj","WeakSet","V","Mj","W","Nj","Oj","Qj","Rj","Sj","Tj","Uj","Vj","Wj","insertBefore","_reactRootContainer","Xj","X","Yj","Zj","ak","onCommitFiberUnmount","componentWillUnmount","bk","ck","dk","ek","fk","isHidden","gk","hk","display","ik","jk","kk","lk","__reactInternalSnapshotBeforeUpdate","src","Wk","mk","ceil","nk","pk","Y","Z","qk","rk","sk","tk","uk","Infinity","vk","wk","xk","yk","zk","Ak","Bk","Ck","Dk","Ek","callbackNode","expirationTimes","expiredLanes","wc","callbackPriority","ig","Fk","Gk","Hk","Ik","Jk","Kk","Lk","Mk","Nk","Ok","Pk","finishedWork","finishedLanes","Qk","timeoutHandle","Rk","Sk","Tk","Uk","Vk","mutableReadLanes","Bc","Pj","onCommitFiberRoot","mc","onRecoverableError","Xk","onPostCommitFiberRoot","Yk","Zk","al","isReactComponent","pendingChildren","bl","mutableSourceEagerHydrationData","cl","cache","pendingSuspenseBoundaries","fl","gl","hl","il","jl","zj","$k","ll","ml","_internalRoot","nl","ol","pl","ql","sl","rl","unmount","unstable_scheduleHydration","form","tl","usingClientEntryPoint","Events","ul","findFiberByHostInstance","bundleType","rendererPackageName","vl","rendererConfig","overrideHookState","overrideHookStateDeletePath","overrideHookStateRenamePath","overrideProps","overridePropsDeletePath","overridePropsRenamePath","setErrorHandler","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","reconcilerVersion","__REACT_DEVTOOLS_GLOBAL_HOOK__","wl","supportsFiber","inject","exports","createPortal","dl","createRoot","unstable_strictMode","findDOMNode","flushSync","hydrate","hydrateRoot","hydratedSources","_getVersion","_source","unmountComponentAtNode","unstable_batchedUpdates","unstable_renderSubtreeIntoContainer","checkDCE","err","module","setState","forceUpdate","__self","__source","_status","_result","Children","map","only","Fragment","Profiler","PureComponent","StrictMode","Suspense","cloneElement","createContext","_currentValue2","_threadCount","Provider","Consumer","_defaultValue","_globalName","createFactory","createRef","forwardRef","isValidElement","lazy","memo","startTransition","unstable_act","sortIndex","performance","setImmediate","startTime","expirationTime","priorityLevel","scheduling","isInputPending","MessageChannel","port2","port1","onmessage","unstable_Profiling","unstable_continueExecution","unstable_forceFrameRate","floor","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","unstable_runWithPriority","delay","unstable_wrapCallback","inst","_typeof","_regeneratorRuntime","__esModule","o","asyncIterator","toStringTag","define","writable","wrap","Generator","Context","makeInvokeMethod","tryCatch","arg","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","defineIteratorMethods","_invoke","AsyncIterator","invoke","__await","callInvokeWithMethodAndArg","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","isGeneratorFunction","mark","setPrototypeOf","__proto__","awrap","async","reverse","prev","stop","rval","handle","complete","finish","delegateYield","runtime","regeneratorRuntime","accidentalStrictMode","globalThis","Function","__webpack_module_cache__","inProgress","dataWebpackPrefix","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","definition","chunkId","all","reduce","promises","miniCssF","script","needAttach","scripts","getElementsByTagName","getAttribute","charset","timeout","nc","onScriptComplete","onerror","onload","doneFns","head","loadStylesheet","fullhref","existingLinkTags","dataHref","rel","existingStyleTags","findStylesheet","oldTag","linkTag","nonce","errorType","realHref","request","createStylesheet","installedCssChunks","miniCss","installedChunks","installedChunkData","promise","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","some","chunkLoadingGlobal","self","_arrayLikeToArray","arr2","_unsupportedIterableToArray","minLen","from","_toConsumableArray","iter","toPropertyKey","toPrimitive","Number","_defineProperties","descriptor","Constructor","protoProps","staticProps","_assertThisInitialized","ReferenceError","_possibleConstructorReturn","_getPrototypeOf","_setPrototypeOf","_inherits","subClass","superClass","_isNativeReflectConstruct","Boolean","_construct","_wrapNativeSuper","Class","_cache","Wrapper","isObject","ssrDocument","blur","querySelector","createEvent","initEvent","childNodes","importNode","hash","host","hostname","pathname","getDocument","doc","ssrWindow","history","replaceState","pushState","go","back","CustomEvent","getComputedStyle","getPropertyValue","screen","requestAnimationFrame","cancelAnimationFrame","getWindow","win","Dom7","_Array","items","_this","proto","_classCallCheck","_callSuper","_createClass","arrayFlat","res","arrayFilter","filter","selector","html","toCreate","tempParent","qsa","uniqueArray","arrayUnique","_len","_key","classNames","_el$classList","classList","removeClass","_len2","_key2","_el$classList2","toggleClass","_len3","_key3","hasClass","_len4","_key4","attr","attrs","attrName","removeAttr","propName","dom7ElementDataStorage","dataKey","removeData","attributes","val","selectedOptions","transform","duration","transitionDuration","_len5","_key5","eventType","targetSelector","handleLiveEvent","eventData","dom7EventData","parents","handleEvent","events","dom7LiveListeners","proxyListener","dom7Listeners","off","_len6","_key6","handlers","dom7proxy","once","dom","_len7","_key7","eventName","onceHandler","_len8","eventArgs","_key8","_len9","_key9","evt","dataIndex","transitionStart","fireCallBack","transitionEnd","animationEnd","css","outerWidth","includeMargins","styles","offsetWidth","outerHeight","offsetHeight","box","clientTop","clientLeft","scrollY","scrollX","compareWith","webkitMatchesSelector","msMatchesSelector","returnIndex","newChild","tempDiv","appendTo","prepend","prependTo","before","cloneNode","insertAfter","after","nextElementSibling","nextAll","nextEls","previousElementSibling","prevAll","prevEls","siblings","closest","find","foundElements","found","detach","_len10","els","_key10","toAdd","empty","scrollTo","_len11","_key11","easing","currentTop","currentLeft","maxTop","maxLeft","newTop","newLeft","animateTop","animateLeft","scrollHeight","scrollWidth","getTime","progress","easeProgress","cos","PI","_len12","_key12","_len13","_key13","animate","initialProps","initialParams","animateInstance","params","elements","animating","que","easingProgress","frameId","dom7AnimateInstance","initialFullValue","finalValue","finalFullValue","container","currentValue","elementsDone","propsDone","began","begin","_el$prop","noTrigger","shortcut","_len14","_key14","click","focusin","focusout","keyup","keydown","keypress","submit","change","mousedown","mousemove","mouseup","mouseenter","mouseleave","mouseout","mouseover","touchstart","touchend","touchmove","resize","scroll","methods","methodName","_slicedToArray","signum","lerp","amount","clampDouble","sanitizeDegreesDouble","degrees","matrixMultiply","row","matrix","SRGB_TO_XYZ","XYZ_TO_SRGB","WHITE_POINT_D65","argbFromRgb","red","green","blue","argbFromLinrgb","linrgb","delinearized","redFromArgb","argb","greenFromArgb","blueFromArgb","lstarFromArgb","labF","linearized","xyzFromArgb","yFromLstar","lstar","ft3","ft","lstarFromY","rgbComponent","normalized","pow","clampInt","ViewingConditions","aw","nbb","ncb","rgbD","fLRoot","whitePoint","adaptingLuminance","backgroundLstar","surround","discountingIlluminant","xyz","rW","gW","bW","exp","k4","k4F","cbrt","sqrt","rgbAFactors","rgbA","DEFAULT","make","Cam16","hue","chroma","jstar","astar","bstar","other","dJ","dA","dB","dEPrime","viewed","viewingConditions","linearR","linearG","linearB","alpha","hRad","eHue","p1","p2","hSin","sin","hCos","gamma","rA","gA","bA","rCBase","rC","gCBase","gC","bCBase","bC","rF","gF","bF","fromIntInViewingConditions","redL","greenL","blueL","rD","gD","bD","rAF","gAF","bAF","atanDegrees","atan2","hueRadians","huePrime","mstar","fromJchInViewingConditions","fromUcsInViewingConditions","HctSolver","angle","scaledDiscount","SCALED_DISCOUNT_FROM_LINRGB","chromaticAdaptation","sanitizeRadians","mid","coordinate","axis","intercept","lerpPoint","kR","Y_FROM_LINRGB","kG","kB","coordA","coordB","isBounded","targetHue","leftHue","rightHue","initialized","uncut","nthVertex","midHue","hueOf","areInCyclicOrder","segment","bisectToSegment","lPlane","rPlane","criticalPlaneBelow","trueDelinearized","criticalPlaneAbove","mPlane","midPlaneCoordinate","CRITICAL_PLANES","setCoordinate","midpoint","adapted","adaptedAbs","tInnerCoeff","iterationRound","jNormalized","inverseChromaticAdaptation","LINRGB_FROM_SCALED_DISCOUNT","fnj","hueDegrees","argbFromLstar","exactAnswer","findResultByJ","bisectToLimit","fromInt","solveToInt","Variant","Hct","cam","internalHue","internalChroma","internalTone","newHue","setInternalState","newChroma","newTone","viewedInVc","toInt","xyzInViewingConditions","recastInVc","fromXyzInViewingConditions","tone","Blend","designColor","sourceColor","fromHct","toHct","differenceDegrees$1","differenceDegrees","rotationDegrees","outputHue","to","ucs","cam16Ucs","ucsCam","fromCam","toCam","fromJ","fromA","fromB","fromUcs","Contrast","toneA","toneB","ratioOfYs","y1","y2","lighter","darkY","lightY","realContrast","lighterSafe","darkerSafe","darker","DislikeAnalyzer","hct","huePasses","chromaPasses","tonePasses","isDisliked","DynamicColor","palette","isBackground","background","secondBackground","contrastCurve","toneDeltaPair","hctCache","scheme","getHct","cachedAnswer","getTone","answer","decreasingContrast","contrastLevel","roleA","roleB","polarity","stayTogether","bgTone","aIsNearer","isDark","nearer","farther","amNearer","expansionDir","nContrast","getContrast","fContrast","nInitialTone","nTone","ratioOfTones","foregroundTone","fInitialTone","fTone","desiredRatio","_ref","bg2","_ref2","bg1","bgTone1","bgTone2","_ref3","upper","lower","lightOption","darkOption","availables","tonePrefersLightForeground","_args$name","_args$isBackground","lighterTone","lighterUnsafe","darkerTone","darkerUnsafe","lighterRatio","darkerRatio","negligibleDifference","toneAllowsLightForeground","MONOCHROME","NEUTRAL","TONAL_SPOT","VIBRANT","EXPRESSIVE","FIDELITY","CONTENT","RAINBOW","FRUIT_SALAD","ContrastCurve","low","normal","medium","high","ToneDeltaPair","isFidelity","variant","isMonochrome","performAlbers","prealbers","albersd","inViewingConditions","viewingConditionsForAlbers","enableLightForeground","MaterialDynamicColors","surfaceBright","surfaceDim","contentAccentToneDelta","primaryPaletteKeyColor","fromPalette","primaryPalette","keyColor","secondaryPaletteKeyColor","secondaryPalette","tertiaryPaletteKeyColor","tertiaryPalette","neutralPaletteKeyColor","neutralPalette","neutralVariantPaletteKeyColor","neutralVariantPalette","onBackground","surface","surfaceContainerLowest","surfaceContainerLow","surfaceContainer","surfaceContainerHigh","surfaceContainerHighest","onSurface","highestSurface","surfaceVariant","onSurfaceVariant","inverseSurface","inverseOnSurface","outline","outlineVariant","shadow","scrim","surfaceTint","primaryContainer","onPrimary","sourceColorHct","onPrimaryContainer","inversePrimary","secondary","secondaryContainer","onSecondary","initialTone","byDecreasingTone","closestToChroma","chromaPeak","potentialSolution","findDesiredChromaByTone","onSecondaryContainer","tertiary","tertiaryContainer","onTertiary","albersTone","proposedHct","fixIfDisliked","onTertiaryContainer","errorPalette","errorContainer","onErrorContainer","primaryFixed","primaryFixedDim","onPrimaryFixed","onPrimaryFixedVariant","secondaryFixed","secondaryFixedDim","onSecondaryFixed","onSecondaryFixedVariant","tertiaryFixed","tertiaryFixedDim","onTertiaryFixed","onTertiaryFixedVariant","TonalPalette","createKeyColor","smallestDeltaHct","smallestDelta","hctAdd","hctAddDelta","hctSubtract","hctSubtractDelta","CorePalette","isContent","a1","fromHueAndChroma","a2","a3","n1","n2","createPaletteFromColors","content","neutral","neutralVariant","Scheme","_objectSpread","lightFromCorePalette","darkFromCorePalette","contentOf","core","hexFromArgb","_step","outParts","_iterator","_createForOfIteratorHelper","entries","_step$value","part","argbFromHex","hex","isThree","isSix","isEight","parseIntHex","themeFromSourceColor","customColors","schemes","light","dark","palettes","blend","harmonize","tones","onColor","colorContainer","onColorContainer","customColor","rgba","materialColors","hexColor","shouldSkip","uniqueNum","uniqueNumber","mask","mdPreloaderContent","iosPreloaderContent","eventNameToColonCase","hasColon","deleteProps","object","nextTick","nextFrame","parseUrlQuery","query","urlToParse","paramsPart","decodeURIComponent","getTranslate","curTransform","transformMatrix","curStyle","WebKitCSSMatrix","webkitTransform","MozTransform","OTransform","MsTransform","msTransform","m41","m42","serializeObject","newParents","resultArray","varName","parentParts","varValue","toPush","nextSource","keysArray","nextIndex","nextKey","desc","deep","colorHexToRgb","colorRgbToHex","colorRgbToHsl","colorHslToRgb","rgb1","hp","colorHsbToHsl","HSL","HSB","colorHslToHsb","support","deviceCalculated","getShadeTintColors","hsl","hslShade","hslTint","shade","tint","colorThemeCSSProperties","_materialColors","shadeTintIos","shadeTintMdLight","shadeTintMdDark","ios","bindMethods","subKey","flattenArray","colorThemeCSSStyles","stringifyObject","colorVars","restVars","colorValue","rest","_restVars$colorName","whiteColorVars","blackColorVars","lightString","darkString","getSupport","touch","DocumentTouch","pointerEvents","PointerEvent","maxTouchPoints","passiveListener","supportsPassive","intersectionObserver","calcSupport","getDevice","overrides","_temp","platform","device","android","androidChrome","desktop","iphone","ipod","ipad","edge","firefox","macos","windows","cordova","electron","capacitor","Capacitor","nwjs","screenWidth","screenHeight","nw","versions","os","osVersion","webView","standalone","webview","pixelRatio","prefersColorScheme","calcDevice","EventsClass","eventsParents","eventsListeners","f7proxy","eventHandler","local","eventsArray","localEvents","parentEvents","eventsParent","emit","Framework7Class","_EventsClass","instanceParams","originalParams","paramKey","modules","moduleName","moduleParams","modulePropName","moduleProp","moduleEventName","vnode","vnodeHooks","vnodeId","hookName","modulesParams","useModule","components","use","static","install","installModule","ConstructorMethods","parameters","_parameters","defaultSelector","domProp","addMethods","ModalMethods","targetEl","$targetPage","modalEl","$modalEl","f7Modal","$parentEl","$targetEl","fetchedModules","moduleToLoad","Framework7","modulePath","moduleObj","moduleFunc","matchNamePattern","lazyModulesPath","scriptLoad","resolveScript","rejectScript","scriptContent","callbackId","callbackLoadName","scriptEl","componentLoader","styleLoad","resolveStyle","styleContent","styleEl","useModuleParams","attrsString","childrenContent","_Framework7Class","passedParams","defaults","routes","initOnDeviceReady","init","darkMode","iosTranslucentBars","iosTranslucentModals","componentUrl","pink","yellow","orange","purple","deeppurple","lightblue","teal","lime","deeporange","white","black","useModulesParams","online","onLine","store","f7","useModules","initStore","colorsStyleEl","rootEl","$rootEl","DARK","LIGHT","mq","colorSchemeListener","media","__store","createStore","enableAutoDarkMode","disableAutoDarkMode","router","componentOptions","$elComponent","f7Component","mount","setDarkMode","initAppComponent","loadModule","loadModules","hook","$jsx","metaStatusbar","getSize","orientationchange","touchClicksDistanceThreshold","disableContextMenu","tapHold","tapHoldDelay","tapHoldPreventClicks","activeState","activeStateElements","activeStateOnMouseMove","mdTouchRipple","iosTouchRipple","touchRippleElements","touchRippleInsetElements","touchEvents","move","touchStartX","touchStartY","targetElement","isMoved","tapHoldFired","tapHoldTimeout","preventClick","activableElement","activeTimeout","rippleWave","rippleTarget","rippleTimeout","isScrolling","useRipple","findActivableElement","activable","preventPropagation","newActivable","isInsideScrollableView","addActive","removeActive","createRipple","touchRipple","removeRipple","rippleTouchStart","rippleElements","rippleParent","findRippleElement","rippleTouchMove","rippleTouchEnd","handleMouseUp","isSegmentedStrong","segmentedStrongEl","touchMoveActivableIos","isTouchMoveActivable","touchmoveActivableEl","emitAppTouchEvent","appTouchStartActive","appTouchMoveActive","appTouchEndActive","appTouchStartPassive","appTouchMovePassive","appTouchEndPassive","passiveListenerCapture","activeListener","activeListenerCapture","isOverswipe","isSegmented","localPreventClick","stopImmediatePropagation","distance","shouldRemoveActive","touchCurrentX","touchCurrentY","buttonEl","elementFromPoint","$activableEl","isNative","tokens","pattern","charCodeAt","lexer","_a","prefixes","defaultPattern","escapeString","delimiter","path","tryConsume","mustConsume","nextType","consumeText","prefix","suffix","modifier","name_1","pattern_1","compile","reFlags","encode","validate","token","optional","typeOfMessage","tokensToFunction","sensitive","stringToRegexp","strict","_c","_d","_e","_f","endsWith","endsWithRe","delimiterRe","route","_i","tokens_1","mod","endToken","isEndDelimited","tokensToRegexp","pathToRegexp","groupsRegex","execResult","regexpToRegexp","paths","parts","arrayToRegexp","History","clearQueue","currentQueue","routerQueue","clearRouterQueue","stateUrl","browserHistoryAnimate","browserHistory","navigate","blockPopstate","previousState","allowChange","views","viewState","allowPageChange","initViewState","viewId","newState","_defineProperty","readyState","viewContainerWidth","touchesDiff","touchStartTime","dynamicNavbar","$pageShadowEl","$pageOpacityEl","animatableNavEls","$navbarsEl","isTouched","touchesStart","$currentPageEl","$previousPageEl","allowViewTouchMove","$currentNavbarEl","$previousNavbarEl","paramsSwipeBackAnimateShadow","paramsSwipeBackAnimateOpacity","paramsSwipeBackActiveArea","paramsSwipeBackThreshold","transformOrigin","transformOriginTitleLarge","setAnimatableNavElements","reflow","_clientLeft","classNameSet","styleProp","handleTouchStart","swipeBackEnabled","swipeout","masterDetailBreakpoint","handleTouchMove","f7PreventSwipeBack","preventSwipeBack","cancel","activeNavBackIconText","previousNavBackIconText","inverter","currentNavIsTransparent","currentNavIsLarge","currentNavIsCollapsed","currentNavIsLargeTransparent","previousNavIsTransparent","previousNavIsLarge","previousNavIsCollapsed","previousNavIsLargeTransparent","fromLarge","toLarge","$currentNavElements","$previousNavElements","iosAnimateNavbarBackIcon","f7NavbarLeftOffset","navEl","$navEl","isSubnavbar","isLeft","isTitle","isBg","subNavEl","isSliding","transformTarget","textEl","activeNavTranslate","f7NavbarRightOffset","previousNavTranslate","animatableNavElements","sheet","f7PreventSwipePanel","preventSwipePanelBySwipeBack","percentage","callbackData","currentPageEl","previousPageEl","currentNavbarEl","previousNavbarEl","currentPageTranslate","previousPageTranslate","swipeBackActive","handleTouchEnd","$pages","timeDiff","pageChanged","setNavbarPosition","currentRoute","f7Page","currentPage","pageCallback","swipeBack","saveHistory","removePage","removeNavbar","previousRoute","preloadPreviousPage","preload","redirect","direction","initial","redirectUrl","redirectOptions","processQueue","routeQueue","processRouteQueue","enterNextRoute","routesBeforeEnter","beforeEnter","routesBeforeLeave","beforeLeave","appRouterCheck","asyncComponent","resolvePromise","componentPromise","_default","asyncComponentResult","forward","forwardOptions","masterPageEl","otherDetailPageEl","modalType","reloadCurrent","reloadPages","reloadPrevious","reloadAll","clearPreviousHistory","reloadDetail","masterDetailEnabled","isMaster","master","detailsInBetweenRemoved","currentRouteIsModal","modal","modalLoadProp","modalToClose","modalInstance","previousUrl","findMatchingRoute","modalRemove","$oldPage","$newNavbarEl","$oldNavbarEl","$viewEl","$newPage","reload","removeThemeElements","$navbarEl","keepAlive","keepAliveData","pageEl","$navbarsInView","isDetail","isDetailRoot","$pagesInView","pageInView","navbarInView","newPagePosition","role","root","detailRoot","navbar","getElByPage","navbarEl","removedPageEls","removedNavbarEls","oldNavbarEl","browserHistoryRoot","browserHistorySeparator","propsHistory","newPageInDom","componentEl","f7PageMounted","$oldPageEl","$oldNavbarElEl","tab","tabLoad","checkMasterDetailBreakpoint","setPagePosition","afterAnimation","keepOldPage","setPositionClasses","f7PageTransition","load","loadParams","loadOptions","ignorePageChange","pageName","parentPath","sameParams","allowDuplicateUrls","parseRouteUrl","getPageEl","pageComponentLoader","routerEl","newOptions","xhrAbortController","abort","xhrRequest","pageContent","backward","backwardOptions","masterPageRemoved","backIndex","initialPreload","currentIsMaster","masterRoute","force","$navbarToRemove","$pageToRemove","insertPage","$previousPages","pageToRemove","loadBack","backParams","backOptions","Router","isAppRouter","routerId","scrollHistory","iosDynamicNavbar","initialPages","initialNavbars","newRoute","tempDom","navbarsEl","newNavEls","oldNavEls","animateIcon","animatableNavEl","$navbarInner","isIconLabel","needsOpacityTransition","$iconEl","leftOffset","rightOffset","navEls","otherEls","otherNavEl","iconTextEl","$newPageEl","animateCustom","routerCustomTransitionClass","toDifferent","oldIsLarge","newIsLarge","routerTransitionClass","animateNavbars","removeEl","tabEl","tabChild","removeElements","removeElementsWithTimeout","removeElementsTimeout","findElement","stringSelector","$container","viewMainClass","flattenedRoutes","hasTabRoutes","tabs","mergedPathsRoutes","tabRoute","tRoute","flattenRoutes","detailRoutes","detailRoute","dRoute","masterRoutePath","childRoute","cRoute","findRouteByKey","constructRouteUrl","toUrl","foundTabRouteUrl","$tabEl","tabId","matchingRoute","_router$parseRouteUrl","matched","pathsToMatch","alias","aliasPath","pathToMatch","keyObj","paramValue","compiledUrl","xhrCache","xhr","requestUrl","ignoreCache","hasQuery","passRouteQueryToRequest","passRouteParamsToRequest","replaceRequestUrlParams","xhrCacheIgnoreGetParameters","xhrCacheIgnore","cachedUrl","xhrCacheDuration","fetchRes","AbortController","signal","removeFromXhrCache","ariaHidden","toRemove","pageFromEl","pageFrom","$pageEl","fromPage","$pageFromEl","page","restoreScrollTopOnBack","camelName","colonName","getPageData","_ref2$on","_ref2$once","attachEvents","$pageContent","pageContentEl","f7PageInitialized","f7RouteEventsAttached","f7RouteEventsOn","f7RouteEventsOnce","browserHistoryStoreHistory","newUrl","_router$parseRouteUrl2","initialUrl","historyRestored","URL","documentUrl","_router$params","browserHistoryOnLoad","warn","restoreHistory","_router$getInitialUrl","getInitialUrl","iosSwipeBack","mdSwipeBack","SwipeBack","_router$params2","browserHistoryAnimateOnLoad","browserHistoryInitialMatch","initUrl","loadInitialPage","modalOpen","pageAfterIn","hasTabRoute","initOptions","routerProp","navigateParams","navigateOptions","createRoute","generateUrl","navigateUrl","currentPath","viewName","anotherViewName","anotherView","openIn","ignoreOpenIn","routerLoaded","asyncResolve","resolveParams","resolveOptions","resolvedAsModal","modalRoute","modalLoad","asyncReject","pageLoadProp","preloadMaster","masterLoaded","refreshPage","parentPageEl","browserHistoryTabs","$parentPageEl","hasContentLoadProp","tabShowResult","$newTabEl","$oldTabEl","animated","onTabsChanged","tabParentPageData","f7RouterTabLoaded","loadTab","loadTabParams","loadTabOptions","contentEl","tabEventTarget","unloadTabContent","tabRemove","onTabLoaded","tabComponentLoader","tabContent","tabLoadProp","hasTabComponentChild","removeTabContent","foundLoadProp","isPanel","modalOrPanel","modalParams","routeCallback","panelOpen","modalClose","panelClose","modalClosed","panelClosed","onModalLoaded","hasEl","closeOnSwipeBack","closeByRouter","modalComponent","removeModal","loadModal","loadModalParams","loadModalOptions","modalComponentLoader","modalContent","navigateProps","_navigateOptions","prevOpenedModals","forceOtherUrl","isBrokenBrowserHistory","needHistoryBack","currentRouteWithoutBrowserHistory","skipMaster","$previousPage","$previousMaster","expectedPreviousPageUrl","expectedPreviousPageRoute","previousPageRoute","panel","clearPreviousPages","templates","resizableInitialized","resizable","resizableWidth","$htmlEl","$resizeHandlerEl","minWidth","maxWidth","handleResize","transformCSSWidth","newV","$pageMasterEl","newWidth","View","viewParams","routesAdd","main","f7View","viewProp","wasMasterDetail","isMasterDetail","masterDetailResizable","resizableView","viewEl","initMasterDetail","initRouterOnTabShow","clicks","externalLinks","$clickedEl","$clickedLinkEl","isLink","InAppBrowser","Plugins","Browser","moduleClicks","preventF7Router","clickSelector","matchingClickedElement","clickedLinkData","clickedEl","linksView","ViewClass","f7RouteProps","initClicks","SW","registrations","register","serviceWorker","reg","unregister","registration","storeParams","originalState","actions","getters","propsQueue","gettersDependencies","gettersCallbacks","getterKey","getGetterValue","addGetterCallback","__removeCallback","stateKey","callbacks","removeGetterCallback","getterValue","addCallback","dep","addGetterDependencies","onUpdated","__callback","Proxy","_gettersPlain","actionName","isCapacitor","StatusBar","Statusbar","setTextColor","styleLightContent","styleDefault","setStyle","setBackgroundColor","backgroundColorByHexString","getInfo","overlaysWebView","overlays","setOverlaysWebView","overlay","statusbar","enabled","isCordova","isCap","scrollTopOnClick","iosOverlaysWebView","iosTextColor","androidOverlaysWebView","androidTextColor","iosBackgroundColor","androidBackgroundColor","componentCache","iosSwipeBackAnimateShadow","iosSwipeBackAnimateOpacity","iosSwipeBackActiveArea","iosSwipeBackThreshold","mdSwipeBackAnimateShadow","mdSwipeBackAnimateOpacity","mdSwipeBackActiveArea","mdSwipeBackThreshold","iosPageLoadDelay","mdPageLoadDelay","$popoverView","$popupView","$panelView","$viewsEl","getCurrentView","insert","elm","Navbar","$innerEl","needCenterTitle","needLeftTitle","iosCenterTitle","currLeft","diff","subnavbar","noLeft","noRight","leftWidth","rightWidth","titleWidth","navbarStyles","navbarInnerWidth","paddingLeft","paddingRight","isPrevious","sliding","requiredLeft","titleLeftOffset","titleRightOffset","activeNavbarBackLink","titleLeft","hideStatusbar","hideOnlyCurrent","isDynamic","subEl","pageData","getPageByEl","collapseLargeTitle","expandLargeTitle","toggleLargeTitle","initNavbarOnScroll","needHide","needCollapse","needTransparent","previousScrollTop","currentScrollTop","reachEnd","navbarHidden","navbarCollapsed","navbarTitleLargeHeight","navbarOffsetHeight","scrollChanged","scrollContent","scrollTimeoutId","touchEndTimeoutId","$titleLargeEl","isLarge","navbarHideHeight","snapPageScrollToLargeTitle","snapPageScrollToTransparentNavbar","touchSnapTimeout","desktopSnapTimeout","calcScrollableDistance","f7ScrollableDistance","snapLargeNavbar","snapTransparentNavbar","previousCollapseProgress","collapseProgress","handleScroll","isLargeTransparent","scrollableDistance","previousCollapseWasInMiddle","$bgEl","handleLargeNavbarCollapse","notTransparent","handleNavbarTransparent","showOnPageScrollEnd","showOnPageScrollTop","handeTouchStart","f7DetachNavbarScrollHandlers","scrollTopOnTitleClick","mdCenterTitle","hideOnPageScroll","collapseLargeTitleOnScroll","pageBeforeRemove","pageBeforeIn","pageReinit","pageInit","needCollapseOnScrollHandler","needTransparentOnScroll","needHideOnScrollHandler","tabShow","clickedData","$pageContentEl","postpatch","Toolbar","setHighlight","tabbarEl","$tabbarEl","$highlightEl","tabLinksCount","highlightWidth","highlightTranslate","$activeLink","activeIndex","toolbar","initToolbarOnScroll","toolbarHidden","$toolbarEl","f7ScrollToolbarHandler","tabbar","subnavbarEl","TouchRipple","ripple","_$el$0$getBoundingCli","center","diameter","isInset","insetElements","rippleTransform","$rippleWaveEl","shouldBeRemoved","out","removeTimeout","openedModals","dialogsQueue","Modal","opened","$containerEl","containerEl","backdrop","backdropUnique","forceBackdropUnique","$backdropEl","animateModal","pushToQueue","queueDialogs","openedModal","$modalParentEl","wasInDom","onClosed","onOpened","onOpen","needToHideBackdrop","popupEl","popupInstance","closeByBackdropClick","backdropEl","onClose","destroyed","CustomModal","_Modal","extendedParams","customModal","handleClick","Dialog","dialog","verticalButtons","cssClass","destroyOnClose","addKeyboardHander","dialogClasses","buttonsHTML","class","strong","dialogHtml","buttonOnClick","onKeyDown","keyCodes","setProgress","progressbar","setText","newText","$textEl","setTitle","newTitle","$titleEl","buttonOk","buttonCancel","usernamePlaceholder","passwordPlaceholder","preloaderTitle","progressTitle","destroyPredefinedDialogs","keyboardActions","defaultDialogTitle","autoFocusHandler","isIosTheme","alert","callbackOk","prompt","callbackCancel","inputValue","confirm","login","preloader","preloaderInner","infinite","Popup","pushOffset","isPush","popup","$target","Keyboard","needToClose","closeOnEscape","pushViewScale","startTouch","currentTouch","pageContentScrollTop","pageContentOffsetHeight","pageContentScrollHeight","popupHeight","$pushEl","allowSwipeToClose","swipeToClose","swipeHandler","pushProgress","hasPreviousPushPopup","updatePushOffset","wasPush","setPushOffset","removeProperty","parentSelector","LoginScreen","loginScreen","Popover","popover","$arrowEl","anotherPopoverEl","f7PopoverRef","arrow","originalOpen","arrowEl","touchStartTarget","closeByOutsideClick","isAnotherPopoverBackdrop","isAnotherPopoverTarget","_popover$params","targetX","targetY","verticalPosition","arrowLeft","arrowTop","targetWidth","targetHeight","targetOffsetLeft","targetOffsetTop","arrowSize","hasArrow","arrowMin","safeAreaTop","safeAreaLeft","safeAreaRight","targetOffset","targetParentPage","hPosition","forcedPosition","popoverEl","$popoverEl","Actions","convertToPopover","popoverHtml","renderPopover","actionsHtml","originalClose","buttonIndex","groupIndex","$buttonEl","_actions$params","forceToPopover","closed","grid","buttonClasses","icon","itemClasses","Sheet","isTopSheetModal","swipeStepTranslate","startTranslate","currentTranslate","sheetElOffsetHeight","minTranslate","maxTranslate","$pushViewEl","pushBorderRadius","sheetPageContentEl","sheetPageContentScrollTop","sheetPageContentScrollHeight","sheetPageContentOffsetHeight","currentBreakpointIndex","useBreakpoints","breakpoints","breakpointsTranslate","backdropBreakpointSet","swipeToStep","setBackdropBreakpoint","setPushBreakpoint","openDirection","closeDirection","absCurrentTranslate","absSwipeStepTranslate","setBreakpoint","allBreakpoints","closestTranslate","curr","closestIndex","stepOpened","breakpoint","pushBreakpoint","pushBreakpoints","pushTransparentBreakpoint","backdropBreakpoint","backdropBreakpoints","backdropTransparentBreakpoint","calcBreakpoints","fullSize","onResize","setSwipeStep","byResize","$swipeStepEl","scrollToEl","$scrollEl","newPaddingBottom","paddingTop","paddingBottom","pageHeight","pageScrollHeight","pageScroll","scrollElTop","scrollToElementOnOpen","stepOpen","stepClose","stepToggle","sheetInstance","Toast","toast","timeoutId","_toast$params","closeButton","closeTimeout","toastHtml","openedEl","toastInstance","_toast$params2","horizontalPosition","closeButtonColor","closeButtonText","horizontalClass","Preloader","preloaders","showIn","hideIn","photoBrowserOpen","preloaderEl","tabMounted","Progressbar","$progressbarEl","progressNormalized","$progressbarLine","removeAfterHide","progressbarEl","update","Sortable","$sortingEl","$sortingItems","$sortableContainer","sortingElHeight","minTop","$insertAfterEl","$insertBeforeEl","indexFrom","pageOffset","sortingElOffsetLocal","sortingElOffsetTop","initialScrollTop","wasTapHold","isTapHold","$listGroup","allowOpen","allow","translateScrollOffset","translate","scrollDiff","scrollAddition","allowScroll","$currentEl","currentElOffset","currentElHeight","sortingElOffset","prevTranslate","f7Translate","indexTo","moveElements","sortableMoveElements","sortable","f7VirtualListIndex","virtualList","f7VirtualList","moveItem","pointerEvent","enable","disable","Swipeout","$swipeoutEl","$swipeoutContent","$actionsRight","$actionsLeft","actionsLeftWidth","actionsRightWidth","openedActionsSide","$leftButtons","$rightButtons","$overswipeLeftButton","$overswipeRightButton","overswipeLeft","overswipeRight","noFollow","buttonOffset","buttonTranslate","overswipeRatio","f7SwipeoutButtonOffset","$buttons","$actions","actionsWidth","newTranslate","side","$swipeoutActions","swipeoutActionsWidth","onSwipeoutClose","virtualIndex","deleteItem","actionsNoFold","_data","confirmTitle","Accordion","toggleClicked","$accordionItemEl","$accordionContent","accordion","prevented","prevent","$list","$contentEl","$openedItem","VirtualList","defaultHeight","cols","dynamicHeightBufferSize","showFilteredItemsOnly","renderExternal","setListHeight","searchByItem","searchAll","createUl","scrollableParentEl","renderItem","filteredItems","$scrollableParentEl","updatableScroll","$itemsWrapEl","$ul","itemsWrapEl","domCache","tempDomElement","lastRepaintY","fragment","createDocumentFragment","rowsPerScreen","rowsBefore","rowsAfter","rowsToRender","maxBufferHeight","listHeight","dynamicHeight","autoHeight","$panelEl","$popupEl","handleScrollBound","handleResizeBound","detachEvents","autoHeightRerender","heights","itemHeight","heightsCalculated","renderedItems","itemIndex","renderedItem","forceScrollTop","fromIndex","toIndex","topPosition","heightBeforeFirstItem","heightBeforeLastItem","itemTop","renderExternalItems","itemEl","currentFromIndex","currentToIndex","emptyTemplate","setListSize","indexes","resetScrollTop","listTop","getClientRects","appendItems","newCache","cached","prependItems","cachedIndex","leftIndex","rightIndex","indexShift","appendItem","prependItem","prevIndex","_loop","deletedItem","deleteItems","deleteCache","ListIndex","$listEl","listEl","iosItemHeight","mdItemHeight","scrollList","itemContent","renderSkipPlaceholder","f7ListIndex","calcSize","$clickedLi","skipRate","scrollListToIndex","topPoint","bottomPoint","$labelEl","previousIndex","$children","ulHeight","bubbleBottom","$scrollToEl","parentTop","scrollToElTop","navbarInnerEl","wasSkipped","itemHtml","maxItems","elContent","calcIndexes","listIndex","listIndexEl","tabBeforeRemove","Tab","tabLinkEl","animatedInit","$tabLinkEl","f7TabRoute","newTabEl","$tabsEl","tabsChangedCallbacks","tabsChanged","swiper","tabsTranslate","newTabIndex","slides","slideTo","tabLinkElement","$oldTabLinkEl","oldTabId","oldTabEl","pageOrTabEl","animatedTabEl","swipeInitialized","swipeable","otherPanel","isGestureStarted","isInterrupted","backdropOpacity","panelWidth","effect","touchMoves","handleGestureStart","handleGestureEnd","swipe","swipeOnlyClose","otherPanelOpened","swipeActiveArea","getViewEl","preventSwipePanel","threshold","swipeThreshold","insertToRoot","noFollowProgress","swipeNoFollow","viewTranslate","isGesture","removePanelInClass","setStateClasses","visibility","panelMinWidth","panelMaxWidth","visibleByBreakpoint","isPushingPanel","newPanelWidth","Panel","f7Panel","_panel$params","panelInView","visibleBreakpointDisabled","setVisibleBreakpoint","emitEvents","visibleBreakpointResizeHandler","visibleBreakpoint","wasVisible","allowPanelOpen","collapsedBreakpointDisabled","setCollapsedBreakpoint","collapsedBreakpointResizeHandler","collapsedBreakpoint","collapsed","resizablePanel","swipePanel","modifyHtmlClasses","_openTransitionStarted","toggleVisibleBreakpoint","$panelParentEl","otherOpenedPanel","transitionEndTarget","panelTransitionEnd","enableSwipe","enableResizable","panelEl","CardExpandable","cardEl","$cardEl","cardParams","card","hideNavbarOnOpen","hideToolbarOnOpen","hasTransform","currTransform","$cardContentEl","$cardSizeEl","statusbarHeight","cardWidth","cardHeight","pageWidth","maxHeight","hideStatusbarOnOpen","cardLeftOffset","cardTopOffset","scaleX","scaleY","transformValues","cardRightOffset","cardScrollTop","touchEndX","touchEndY","isV","isH","$cardScrollableEl","cardBottomOffset","translateX","translateY","f7KeepNavbarOnClose","f7KeepToolbarOnClose","detachEventHandlers","onTouchStart","onTouchMove","onTouchEnd","scrollableEl","animateWidth","$openedCardEl","FormData","formId","$formEl","removeItem","FormStorage","formEl","initialData","getFormData","fillFromData","convertToData","storeFormData","formToData","skipTypes","skipNames","inputEl","$inputEl","formFromData","formData","selectEl","checkboxEl","radioEl","initAjaxForm","fromData","contentType","removeFormData","storage","Input","ignoreTypes","createTextareaResizableShadow","$shadowEl","readonly","textareaResizableShadow","resizeTextarea","textareaEl","$textareaEl","styleValue","currentHeight","clientHeight","initialHeight","$itemInputEl","$inputWrapEl","setReadonly","f7ValidateReadonly","readOnly","validity","validationMessage","errorMessage","valid","$errorEl","validateInputs","checkEmptyState","hasAttribute","scrollIntoView","centered","$scrollableEl","contentHeight","contentScrollTop","contentPaddingTop","contentPaddingBottom","contentOffsetTop","inputOffsetTop","centeredPosition","previousValue","isContentEditable","scrollIntoViewOnFocus","scrollIntoViewDuration","scrollIntoViewCentered","scrollIntoViewAlways","itemInputEl","Toggle","f7Toggle","toggleWidth","touchStartChecked","changed","handleInputChange","toggleEl","Range","dual","step","draggableBar","vertical","verticalReversed","formatLabel","scaleSteps","scaleSubSteps","formatScaleLabel","limitKnobPosition","f7Range","valueLeft","valueRight","_range$params","$barEl","$barActiveEl","knobHTML","knobs","$knobEl","$scaleEl","labels","renderScale","rangeOffset","rangeOffsetLeft","rangeOffsetTop","$touchedKnobEl","dualValueIndex","valueChangedByTouch","targetTouchIdentifier","parentModals","parentPanel","parentPage","onTouchChange","identifier","rangeHeight","rangeWidth","newValue","leftValue","rightValue","touchEnded","layout","knobHeight","knobWidth","knobSize","rangeSize","positionProperty","knobIndex","startPos","realStartPos","byTouchMove","valueChanged","oldValue","newValues","valueIndex","labelEl","scaleEl","scaleStepValue","subStepEl","subIndex","subStep","subProgress","rangeEl","Stepper","stepper","valueEl","formatValue","watchInput","autorepeat","autorepeatDynamic","wraps","manualInputMode","decimalPoint","buttonsEndInputMode","$valueEl","f7Stepper","$buttonPlusEl","$buttonMinusEl","_stepper$params","buttonPlusEl","buttonMinusEl","typeModeChanged","preventButtonClick","intervalId","autorepeatAction","autorepeatInAction","manualInput","dynamicRepeat","progressions","startsIn","progressionStep","repeatEvery","clearInterval","setInterval","onMinusClick","endTypeMode","decrement","onPlusClick","increment","onInputClick","onInputKey","onInputBlur","onInput","typeValue","sentByF7Stepper","withWraps","formattedValue","noBlur","inputTxt","powVal","stepperEl","defaultDiacriticsRemovalap","letters","diacriticsMap","SmartSelect","ss","smartSelect","f7SmartSelect","$selectEl","setValueText","inputType","selectId","onChange","clearCache","optionEl","displayAs","optionText","maxLength","checkMaxLength","optEl","formatValueTextContent","closeOnSelect","inputName","selectName","attachInputsEvents","detachInputsEvents","valueFormatted","formatValueText","valueArray","$optionEl","previousGroupEl","optionData","optionImage","optionIcon","optionIconIos","optionIconMd","optionInputIconPosition","inputIconPosition","optionHasMedia","optionColor","optionClassName","optionClass","optionGroupEl","optionGroupLabel","optionIsLabel","groupLabel","isLabel","groupEl","image","iconIos","iconMd","hasMedia","checkbox","radio","renderSearchbar","spellcheck","searchbarSpellcheck","placeholder","searchbarPlaceholder","searchbarDisableButton","searchbarDisableText","iconValue","ssValue","hasIcon","iconContent","iconClass","getIconClass","_checked","renderItems","itemsHtml","renderPage","pageTitle","$itemTitleEl","navbarColorTheme","pageBackLinkText","searchbar","formColorTheme","renderPopup","popupTabletFullscreen","popupCloseLinkText","renderSheet","toolbarColorTheme","sheetCloseLinkText","selectedIndex","scrollToItem","$selectedItemEl","openedIn","virtualListHeight","removeDiacritics","scrollToSelectedItem","$searchbarEl","appendSearchbarNotFound","$notFoundEl","searchbarParams","searchContainer","searchIn","getItemsData","pageHtml","pageBeforeOut","pageAfterOut","popupParams","popupPush","popupSwipeToClose","popupOpen","popupOpened","popupClose","popupClosed","routableModals","sheetParams","sheetBackdrop","sheetPush","sheetSwipeToClose","sheetOpen","sheetOpened","sheetClose","sheetClosed","popoverParams","popoverOpen","popoverOpened","popoverClose","popoverClosed","smartSelectEl","Calendar","calendar","isHorizontal","inline","allowTouchMove","hasTimePicker","timePicker","rangePicker","dayFormatter","Intl","DateTimeFormat","day","monthFormatter","yearFormatter","year","timeSelectorFormatter","timePickerFormat","timeFormatCheckDate","is12HoursFormat","_calendar$params","monthNames","monthNamesShort","dayNames","dayNamesShort","_calendar$getIntlName","getIntlNames","monthNamesIntl","monthNamesShortIntl","dayNamesIntl","dayNamesShortIntl","onInputFocus","onInputClear","onHtmlClick","isPopover","closing","monthPickerPopover","yearPickerPopover","timePickerPopover","attachInputEvents","inputReadOnly","detachInputEvents","attachHtmlEvents","detachHtmlEvents","attachCalendarEvents","wrapperWidth","wrapperHeight","allowItemClick","$wrapperEl","monthsTranslate","resetMonth","nextMonth","prevMonth","handleDayClick","$dayEl","dateYear","dateMonth","dateDay","valueToAdd","setHours","getHours","getMinutes","addValue","onNextMonthClick","onPrevMonthClick","onNextYearClick","nextYear","onPrevYearClick","prevYear","onMonthSelectorClick","openMonthPicker","onYearSelectorClick","openYearPicker","onTimeSelectorClick","openTimePicker","monthPicker","yearPicker","touchMove","detachCalendarEvents","yearStarted","yearEnded","formatterMonthNames","formatterMonthNamesShort","formatterDayNames","weekday","formatterDayNamesShort","setMonth","currentYear","weekDay","getDay","getFullYear","getMonth","getDate","normalizeDate","month1","_calendar$params2","dateFormat","twoDigits","yyyy","yy","mm","MM","DD","hours","minutes","seconds","getSeconds","hours12","HH","regexp","formatDate","_calendar$params3","rangePickerMinDays","rangePickerMaxDays","inValuesIndex","updateValue","sort","equal","onlyHeader","valueDate","leftDate","rightDate","timePickerPlaceholder","header","dir","currentLocaleMonth","currentLocaleYear","$months","currentMonth","currentDate","prevMonthHtml","renderMonth","currentMonthHtml","nextMonthHtml","setMonthsTranslate","monthEl","updateCurrentMonthYear","currentIndex","rebuildBoth","prevMonthTranslate","currentMonthTranslate","nextMonthTranslate","nextDateTime","transitionEndCallback","maxDate","onMonthChangeStart","onMonthChangeEnd","prevDateTime","minDate","targetDate","newMonthHTML","monthTranslate","wrapperTranslate","setYearMonth","dayDate","renderMonths","localeMonth","localeYear","hasEvents","currentValues","today","daysInPrevMonth","daysInMonth","minDayNumber","firstDay","monthHtml","dayIndex","firstDayOfMonthIndex","rowHtml","dayNumber","weekDayIndex","weekendDays","eventsHtml","dateInRange","eventDots","ev","rangesClasses","dayYear","dayMonth","dayNumberDisplay","renderWeekHeader","weekDaysHtml","dayName","renderMonthSelector","renderYearSelector","timeString","timePickerLabel","renderHeader","headerPlaceholder","renderFooter","toolbarCloseText","renderToolbar","monthSelector","yearSelector","_calendar$params4","footer","weekHeader","renderTimeSelector","_calendar$params5","_calendar$params6","_calendar$params7","renderCustomModal","renderInline","closeMonthPicker","monthPickerInstance","displayValues","picker","monthPickerToolbar","rotateEffect","monthPickerCloseText","diffIndex","closeYearPicker","yearPickerInstance","yearMin","yearPickerMin","yearMax","yearPickerMax","years","yearPickerToolbar","yearPickerCloseText","hoursArr","minutesArr","hoursMax","closeTimePicker","timePickerInstance","timePickerToolbar","timePickerCloseText","divider","timePickerValue","period","opening","normalizeValues","required","f7Calendar","scrollToInput","initInput","hour","minute","pickerColumn","colEl","updateItems","colHeight","$colEl","colIndex","$itemsEl","replaceValues","renderColumn","hadPadding","valueCallbacks","newActiveIndex","newScrollTop","previousActiveIndex","selectedItem","$itemEl","itemsFit","displayValue","freeMode","Picker","resizeCols","needsOriginFix","htmlTouchStartTarget","onHtmlTouchStart","attachResizeEvent","detachResizeEvent","forceValues","column","newDisplayValue","noDividerColumns","onlyItems","columnHtml","columnItemsHtml","colClasses","textAlign","_picker$params","_picker$params2","_picker$params3","initColumn","f7Picker","InfiniteScroll","virtualListContainer","onTop","scrollHandler","infiniteScroll","f7InfiniteScrollHandler","$isEls","PullToRefresh","ptr","$preloaderEl","touchId","isMaterial","isIos","$transitionTarget","onTranstionEnd","refresh","mousewheel","wasScrolled","triggerDistance","dynamicTriggerDistance","pullStarted","maxScrollTop","mousewheelTimeout","mousewheelMoved","useTranslate","forceUseTranslate","hasNavbar","pageNavbarEl","$pageNavbarEl","isTransparent","setPreloaderProgress","$bars","perBarProgress","barEl","barIndex","barProgress","unsetPreloaderProgress","targetIsScrollable","$ptrWatchScrollable","ptrScrollableEl","mousewheelAllow","mousewheelTranslate","handleMouseWheelRelease","handleMouseWheel","f7PullToRefresh","$ptrEls","DataTable","table","f7DataTable","handleChange","sentByF7DataTable","columnIndex","checkedRows","totalRows","$headCheckboxEl","checkSelectedHeader","handleSortableClick","newSort","$cellEl","isActive","currentSort","collapsible","$headerEl","$headerSelectedEl","elIndex","collapsibleTitle","checkedItems","setCollapsibleLabels","dataTable","tableEl","Fab","morphOpen","fabEl","$fabEl","borderRadius","fab","f7FabMorphData","diffX","diffY","f7FabMorphResizeHandler","diffXNew","diffYNew","scaleXNew","scaleYNew","morphClose","morphData","$buttonsEl","Searchbar","_FrameworkClass","inputEvents","disableButton","disableButtonEl","searchItem","searchGroup","searchGroupTitle","ignore","foundEl","notFoundEl","hideOnEnableEl","hideOnSearchEl","customSearch","hideGroupTitles","hideGroups","disableOnBackdropClick","expandable","f7Searchbar","$foundEl","$hideOnEnableEl","$hideOnSearchEl","$searchContainer","$disableButtonEl","preventSubmit","onInputChange","isVirtualList","disableOnClick","onPageBeforeOut","onPageBeforeIn","disableButtonHasMargin","previousQuery","setFocus","backdropShow","setDisableButtonMargin","needsFocus","titleLargeHeight","backdropHide","internal","vlQuery","foundItems","resetFilter","compareWithText","$searchIn","searchInEl","itemText","wordsMatch","titleEl","$nextElements","$nextEl","$groupEl","filterItems","FrameworkClass","searchbarEl","_extends","Messages","autoLayout","messages","newMessagesFirst","scrollMessages","scrollMessagesOnEdge","firstMessageRule","lastMessageRule","tailMessageRule","sameNameMessageRule","sameHeaderMessageRule","sameFooterMessageRule","sameAvatarMessageRule","customClassMessageRule","renderMessage","f7Messages","messageEl","$messageEl","textHeader","textFooter","imageSrc","typing","avatar","getMessageData","messageToRender","isTyping","messagesToRender","_m$params","_m$params2","_m$params3","_m$params4","_m$params5","_m$params6","_m$params7","_m$params8","getMessagesData","previousMessage","nextMessage","isFirstMessage","isLastMessage","isTailMessage","isSameNameMessage","isSameHeaderMessage","isSameFooterMessage","isSameAvatarMessage","customMessageClasses","isCustomClassMessage","customClass","messageToRemove","messagesToRemove","messagesToRemoveEls","messageToRemoveIndex","removeMessage","messageToAdd","addMessages","scrollHeightBefore","heightBefore","scrollBefore","scrollData","messagesToAdd","_m$setScrollData","setScrollData","messagesHTML","typingMessage","$messagesEls","scrollWithEdgeCheck","addMessage","typingMessageIndex","typingFound","$typingMessageEl","_m$scrollData","onEdge","currentScroll","renderMessages","messagesEl","Messagebar","messagebar","bottomOffset","attachments","renderAttachments","renderAttachment","resizePage","f7Messagebar","$areaEl","$attachmentsEl","$sheetEl","onAppResize","onSubmit","onAttachmentClick","onTextareaChange","onTextareaFocus","sheetHide","onTextareaBlur","areaEl","attachmentsEl","attachmentsVisible","sheetEl","sheetVisible","elHeight","currentPaddingBottom","requiredPaddingBottom","currentPaddingTop","pageOffsetHeight","scrollOnBottom","attachmentsCreate","attachmentsHide","attachmentsShow","attachment","sheetCreate","sheetShow","messagebarEl","currentStyle","noExtend","HTMLElement","__swiper__","setCSSProperty","animateCSSModeScroll","targetPosition","startPosition","speed","wrapperEl","scrollSnapType","cssModeFrameID","isOutOfBound","currentPosition","getSlideTransformEl","slideEl","shadowRoot","elementChildren","elementOffset","elementStyle","elementIndex","elementParents","parentElement","elementTransitionEnd","elementOuterSize","deviceCached","browser","smoothScroll","getBrowser","needPerspectiveFix","major","minor","isWebView","calcBrowser","eventsEmitter","__emitterProxy","onAny","eventsAnyListeners","offAny","processLazyPreloader","imageEl","isElement","slideClass","lazyEl","lazyPreloaderClass","unlazy","lazyPreloadPrevNext","slidesPerView","slidesPerViewDynamic","rows","activeColumn","preloadColumns","slideIndexLastInView","rewind","loop","realIndex","updateSize","clientWidth","isVertical","updateSlides","getDirectionLabel","property","getDirectionPropertyValue","slidesEl","swiperSize","rtlTranslate","wrongRTL","isVirtual","virtual","previousSlidesLength","slidesLength","snapGrid","slidesGrid","slidesSizesGrid","offsetBefore","slidesOffsetBefore","offsetAfter","slidesOffsetAfter","previousSnapGridLength","previousSlidesGridLength","spaceBetween","slidePosition","prevSlideSize","virtualSize","marginLeft","marginRight","marginBottom","marginTop","centeredSlides","cssMode","gridEnabled","slideSize","initSlides","shouldResetSlideSize","slide","updateSlide","slideStyles","currentTransform","currentWebKitTransform","roundLengths","boxSizing","swiperSlideSize","slidesPerGroup","slidesPerGroupSkip","setWrapperSize","updateWrapperSize","newSlidesGrid","slidesGridItem","slidesBefore","slidesAfter","groupSize","slideIndex","centeredSlidesBounds","allSlidesSize","slideSizeValue","maxSnap","snap","centerInsufficientSlides","allSlidesOffset","snapIndex","addToSnapGrid","addToSlidesGrid","watchOverflow","checkOverflow","watchSlidesProgress","updateSlidesOffset","backFaceHiddenClass","containerModifierClass","hasClassBackfaceClassAdded","maxBackfaceHiddenSlides","updateAutoHeight","activeSlides","newHeight","setTransition","getSlideByIndex","getSlideIndexByData","visibleSlides","minusOffset","swiperSlideOffset","cssOverflowAdjustment","updateSlidesProgress","offsetCenter","slideVisibleClass","visibleSlidesIndexes","slideOffset","slideProgress","originalSlideProgress","slideBefore","slideAfter","originalProgress","updateProgress","multiplier","translatesDiff","isBeginning","isEnd","progressLoop","wasBeginning","wasEnd","isBeginningRounded","isEndRounded","firstSlideIndex","lastSlideIndex","firstSlideTranslate","lastSlideTranslate","translateMax","translateAbs","updateSlidesClasses","getFilteredSlide","activeSlide","slideActiveClass","slideNextClass","slidePrevClass","nextSlide","elementNextAll","prevSlide","elementPrevAll","emitSlidesClasses","updateActiveIndex","previousRealIndex","previousSnapIndex","getVirtualRealIndex","aIndex","normalizeSlideIndex","getActiveIndexByTranslate","skip","runCallbacksOnInit","updateClickedSlide","pathEl","slideFound","clickedSlide","clickedIndex","slideToClickedSlide","virtualTranslate","setTranslate","byController","newProgress","previousTranslate","translateTo","runCallbacks","translateBounds","preventInteractionOnTransition","behavior","onTranslateToWrapperTransitionEnd","transitionEmit","transitionDelay","normalizedTranslate","normalizedGrid","normalizedGridNext","allowSlideNext","allowSlidePrev","_immediateVirtual","_cssModeVirtualInitialSet","initialSlide","onSlideToWrapperTransitionEnd","slideToLoop","newIndex","slideNext","perGroup","slidesPerGroupAuto","loopPreventsSliding","loopFix","slidePrev","normalize","normalizedSnapGrid","prevSnap","prevSnapIndex","lastIndex","slideReset","slideToClosest","currentSnap","slideToIndex","slideSelector","loopedSlides","getSlideIndex","loopCreate","slideRealIndex","activeSlideIndex","byMousewheel","prependSlidesIndexes","appendSlidesIndexes","isNext","isPrev","slidesPrepended","slidesAppended","swiperLoopMoveDOM","recalcSlides","currentSlideTranslate","touchEventsData","controller","control","loopParams","loopDestroy","newSlidesOrder","swiperSlideIndex","grabCursor","setGrabCursor","moving","simulateTouch","isLocked","touchEventsTarget","__preventObserver__","cursor","unsetGrabCursor","evCache","originalEvent","swipingClassHasValue","noSwipingClass","eventPath","composedPath","noSwipingSelector","isTargetShadow","noSwiping","__closestFrom","assignedSlot","getRootNode","closestElement","allowClick","currentX","currentY","startX","startY","edgeSwipeDetection","iOSEdgeSwipeDetection","edgeSwipeThreshold","iOSEdgeSwipeThreshold","allowTouchCallbacks","startMoving","swipeDirection","allowThresholdMove","focusableElements","shouldPreventDefault","touchStartPreventDefault","touchStartForcePreventDefault","pointerIndex","findIndex","cachedEv","targetTouch","preventedByNestedSwiper","prevX","prevY","touchReleaseOnEdges","touchAngle","touchMoveStopPropagation","nested","previousX","previousY","oneWayMovement","touchRatio","prevTouchesDirection","touchesDirection","isLoop","allowLoopFix","allowMomentumBounce","loopFixed","disableParentSwiper","resistanceRatio","resistance","followFinger","touchEndTime","pathTree","lastClickTime","currentPos","stopIndex","rewindFirstIndex","rewindLastIndex","longSwipesMs","longSwipes","longSwipesRatio","shortSwipes","navigation","nextEl","prevEl","isVirtualLoop","autoplay","running","paused","resizeTimeout","resume","preventClicks","preventClicksPropagation","onScroll","onLoad","dummyEventAttached","dummyEventListener","domMethod","swiperMethod","updateOnWindowResize","events$1","isGridEnabled","getBreakpoint","breakpointsBase","currentBreakpoint","breakpointParams","wasMultiRow","isMultiRow","wasEnabled","emitContainerClasses","wasModuleEnabled","isModuleEnabled","directionChanged","needsReLoop","wasLoop","changeDirection","isEnabled","hasLoop","points","point","minRatio","addClasses","suffixes","resultClasses","prepareClasses","removeClasses","checkOverflow$1","wasLocked","lastSlideRightEdge","resizeObserver","createElements","uniqueNavElements","passiveListeners","wrapperClass","_emitClasses","moduleExtendParams","allModulesParams","moduleParamName","auto","prototypes","extendedDefaults","Swiper","swipers","newParams","__modules__","extendParams","swiperParams","velocity","trunc","clickTimeout","velocities","imagesToLoad","imagesLoaded","getSlideClasses","updates","exact","spv","breakLoop","translateValue","translated","newDirection","needUpdate","currentDirection","changeLanguageDirection","mounted","getWrapperSelector","getWrapper","slideSlots","hostEl","lazyElements","deleteInstance","cleanStyles","extendDefaults","newDefaults","createElementIfNotDefined","checkProps","classesToSelector","appendSlide","appendElement","tempDOM","observer","prependSlide","prependElement","addSlide","activeIndexBuffer","baseLength","slidesBuffer","currentSlide","removeSlide","slidesIndexes","indexToRemove","removeAllSlides","effectInit","overwriteParams","perspective","recreateShadows","getEffectParams","requireUpdateOnVirtual","overwriteParamsResult","_s","slideShadows","shadowEl","effectTarget","effectParams","transformEl","backfaceVisibility","effectVirtualTransitionEnd","transformElements","allSlides","eventTriggered","getSlide","createShadow","shadowClass","shadowContainer","prototypeGroup","protoMethod","animationFrame","resizeHandler","orientationChangeHandler","ResizeObserver","contentBoxSize","contentRect","inlineSize","blockSize","observe","unobserve","observers","attach","MutationObserver","WebkitMutationObserver","mutations","observerUpdate","childList","characterData","observeParents","observeSlideChildren","containerParents","disconnect","cssModeTimeout","renderSlide","renderExternalUpdate","addSlidesBefore","addSlidesAfter","previousFrom","previousTo","previousSlidesGrid","previousOffset","offsetProp","onRendered","slidesToRender","prependIndexes","appendIndexes","loopFrom","loopTo","domSlidesAssigned","numberOfNewSlides","cachedEl","cachedElIndex","pageUpDown","keyboard","isPageUp","isPageDown","isArrowLeft","isArrowRight","isArrowUp","isArrowDown","onlyInViewport","inView","swiperWidth","swiperHeight","windowWidth","windowHeight","swiperOffset","swiperCoord","releaseOnEdges","invert","forceToAxis","sensitivity","eventsTarget","thresholdDelta","thresholdTime","noMousewheelClass","lastEventBeforeSnap","lastScrollTime","recentWheelEvents","handleMouseEnter","mouseEntered","handleMouseLeave","animateSlider","newEvent","raw","targetElContainsTarget","rtlFactor","sX","sY","pX","pY","HORIZONTAL_AXIS","spinX","spinY","pixelX","pixelY","positions","sign","ignoreWheelEvents","sticky","prevEvent","firstEvent","snapToThreshold","autoplayDisableOnInteraction","releaseScroll","hideOnClick","disabledClass","hiddenClass","lockClass","navigationDisabledClass","makeElementsArray","getEl","onPrevClick","onNextClick","initButton","destroyButton","pagination","clickable","pfx","bulletSize","bulletElement","renderBullet","renderProgressbar","renderFraction","renderCustom","progressbarOpposite","dynamicBullets","dynamicMainBullets","formatFractionCurrent","formatFractionTotal","bulletClass","bulletActiveClass","modifierClass","currentClass","totalClass","progressbarFillClass","progressbarOppositeClass","clickableClass","verticalClass","paginationDisabledClass","bullets","dynamicBulletIndex","isPaginationDisabled","setSideBullets","bulletEl","onBulletClick","newSlideIndex","currentSlideIndex","indexBeforeLoopFix","total","firstIndex","midIndex","classesToRemove","flat","bullet","bulletIndex","firstDisplayedBullet","lastDisplayedBullet","dynamicBulletsLength","bulletsOffset","subElIndex","fractionEl","totalEl","progressbarDirection","progressEl","paginationHTML","numberOfBullets","dragStartPos","dragSize","trackSize","dragTimeout","scrollbar","dragEl","newSize","newPos","getPointerPosition","setDragPosition","positionRatio","onDragStart","onDragMove","onDragEnd","snapOnRelease","eventMethod","swiperEl","dragClass","draggable","scrollbarDisabledClass","parallax","elementsSelector","setTransform","rotate","currentOpacity","_swiper","parallaxEl","parallaxDuration","maxRatio","containerClass","zoomedSlideClass","fakeGestureTouched","fakeGestureMoved","currentScale","isScaling","gesture","originX","originY","slideWidth","slideHeight","imageWrapEl","minX","minY","maxX","maxY","touchesCurrent","prevPositionX","prevPositionY","prevTime","getDistanceBetweenTouches","x1","x2","eventWithinSlide","onGestureStart","scaleStart","getScaleOrigin","onGestureChange","scaleMove","onGestureEnd","eventWithinZoomContainer","scaledWidth","scaledHeight","scaleRatio","onTransitionEnd","zoomIn","touchX","touchY","offsetX","offsetY","imageWidth","imageHeight","translateMinX","translateMinY","translateMaxX","translateMaxY","touchAction","forceZoomRatio","zoomOut","zoomToggle","getListeners","activeListenerWithCapture","momentumDurationX","momentumDurationY","momentumDistanceX","newPositionX","momentumDistanceY","newPositionY","momentumDuration","in","LinearSpline","binarySearch","maxIndex","minIndex","guess","i1","i3","interpolate","removeSpline","spline","inverse","by","controlElement","onControllerSwiper","_t","controlledTranslate","setControlledTranslate","getInterpolateFunction","setControlledTransition","a11y","notificationClass","prevSlideMessage","nextSlideMessage","firstSlideMessage","lastSlideMessage","paginationBulletMessage","slideLabelMessage","containerMessage","containerRoleDescriptionMessage","itemRoleDescriptionMessage","slideRole","clicked","liveRegion","notify","notification","makeElFocusable","makeElNotFocusable","addElRole","addElRoleDescription","addElLabel","disableEl","enableEl","onEnterOrSpaceKey","hasPagination","hasClickablePagination","initNavEl","wrapperId","addElControls","handlePointerDown","handlePointerUp","handleFocus","sourceCapabilities","firesTouchEvents","live","addElId","addElLive","updateNavigation","updatePagination","keepQuery","slugify","getPathValues","urlOverride","pathArray","setHistory","currentState","scrollToSlide","setHistoryPopState","hashNavigation","watchState","slideWithHash","onHashChange","newHash","activeSlideEl","setHash","activeSlideHash","raf","timeLeft","waitForTransition","disableOnInteraction","stopOnLastSlide","reverseDirection","pauseOnMouseEnter","autoplayTimeLeft","wasPaused","pausedByTouch","touchStartTimeout","slideChanged","pausedByInteraction","autoplayDelayTotal","autoplayDelayCurrent","autoplayStartTime","calcTimeLeft","run","delayForce","currentSlideDelay","getSlideDelay","proceed","pause","onVisibilityChange","visibilityState","onPointerEnter","onPointerLeave","thumbs","multipleActiveThumbs","autoScrollOffset","slideThumbActiveClass","thumbsContainerClass","swiperCreated","onThumbClick","thumbsSwiper","thumbsParams","SwiperClass","thumbsSwiperParams","thumbsToActivate","thumbActiveClass","useOffset","currentThumbsIndex","newThumbsIndex","newThumbsSlide","getThumbsElementAndInit","thumbsElement","onThumbsSwiper","watchForThumbsToAppear","momentum","momentumRatio","momentumBounce","momentumBounceRatio","momentumVelocityRatio","minimumVelocity","lastMoveEvent","velocityEvent","momentumDistance","newPosition","afterBouncePosition","doBounce","bounceAmount","needsLoopFix","moveDistance","currentSlideSize","slidesNumberEvenToRows","slidesPerRow","numFullColumns","getSpaceBetween","newSlideOrderIndex","slideIndexInGroup","columnsInGroup","fadeEffect","crossFade","tx","ty","slideOpacity","cubeEffect","shadowOffset","shadowScale","createSlideShadows","shadowBefore","shadowAfter","cubeShadowEl","wrapperRotate","slideAngle","tz","shadowAngle","scale1","scale2","zFactor","flipEffect","limitRotation","rotateY","rotateX","coverflowEffect","stretch","depth","centerOffset","offsetMultiplier","translateZ","slideTransform","shadowBeforeEl","shadowAfterEl","creativeEffect","limitProgress","shadowPerProgress","progressMultiplier","getTranslateValue","isCenteredSlides","margin","custom","translateString","rotateString","scaleString","opacityString","shadowOpacity","cardsEffect","perSlideRotate","perSlideOffset","tX","tY","tZ","tXAdd","isSwipeToNext","isSwipeToPrev","paramsList","needsNavigation","needsPagination","needsScrollbar","uniqueClasses","unique","attrToProp","updateSwiper","changedParams","scrollbarEl","paginationEl","updateParams","currentParams","needThumbsInit","needControllerInit","needPaginationInit","needScrollbarInit","needNavigationInit","loopNeedDestroy","loopNeedEnable","loopNeedReloop","destroyModule","nextButtonSvg","prevButtonSvg","modulesParamsList","getParams","propValue","localParamsList","allowedParams","attrsList","moduleParam","mParam","parentObjName","subObjName","SwiperCSS","ClassToExtend","arrowSvg","addStyle","CSSStyleSheet","adoptedStyleSheets","styleSheet","replaceSync","SwiperContainer","super","attachShadow","cssStyles","injectStyles","cssLinks","injectStylesUrls","calcSlideSlots","currentSideSlots","slideSlotChildren","slotEl","localStyles","linkEl","eventsPrefix","connectedCallback","disconnectedCallback","updateSwiperOnPropChange","attributeChangedCallback","prevValue","observedAttributes","SwiperSlide","lazyDiv","initSwiper","$swiperEl","isTabs","isRoutableTabs","f7SwiperParams","tabRouteUrl","findTabRouteUrl","SwiperElementRegisterParams","customElements","pageMounted","PhotoBrowser","photoBrowser","exposed","started","timeStart","virtualSlides","photos","$activeSlideEl","$previousSlideEl","$totalEl","captions","captionIndex","$captionsContainerEl","previousSlideVideo","renderNavbar","iconsColor","renderNavbarCount","navbarShowCount","isPopup","navbarOfText","popupCloseLinkIcon","xmlns","viewBox","thumb","renderThumb","renderCaption","photo","renderObject","renderLazyPhoto","loading","renderPhoto","renderThumbs","captionsTheme","renderStandalone","f7PhotoBrowser","$swiperContainerEl","$swiperWrapperEl","preventThumbsSlide","preventMainSlide","hasThumbs","exposition","expositionToggle","doubleClick","slideChange","onSlideChange","slideChangeTransitionStart","slideChangeTransitionEnd","touchStart","touchMoveOpposite","touchEnd","expositionHideCaptions","openStandalone","openPage","openPopup","Notification","notificationHeight","_notification$params","titleRightText","subtitle","closeOnClick","notificationHtml","closeOnTimeout","notificationInstance","_notification$params2","Autocomplete","$openerEl","autocomplete","openerEl","f7Autocomplete","uniqueId","$dropdownEl","firstValue","firstItem","itemsHTML","limit","highlightMatches","itemValue","valueProperty","textProperty","dropdownPlaceholderText","typeahead","setSelectionRange","onPageInputChange","aValue","updateValues","onOpenerClick","positionDropdown","$selectedItemLabel","$newItem","$selectedItem","onDropdownClick","clickedItem","updateInputValueOnSelect","attachDropdownEvents","detachDropdownEvents","attachPageEvents","detachPageEvents","$listParent","inputOffset","inputOffsetWidth","inputOffsetHeight","paddingValue","listOffset","listOffsetLeft","inputOffsetLeft","paddingProp","valuesHTML","preloaderColor","inPopup","navbarLeft","renderPreloader","navbarRight","renderDropdown","notFoundText","requestSourceOnOpen","dropdownContainerEl","autocompleteEl","Tooltip","tooltip","_tooltip$params","delegated","f7Tooltip","handleClickOut","handleTransitionEnd","hasContainerEl","tooltipOffset","boundaries","clientRect","aroundEl","$aroundEl","_tooltip$params2","_self$params","sliderLabel","sliderValue","sliderValueEditable","alphaLabelText","alphaRangeSlider","destroyAlphaSliderEvents","_self$params2","hexLabel","hexLabelText","hexValueEditable","destroyHexEvents","hueLabelText","saturationLabelText","brightnessLabelText","hueRangeSlider","saturationRangeSlider","brightnessRangeSlider","destroyHsbSlidersEvents","hslCurrent","hslLeft","hslRight","brightness","handlePaletteClick","destroyPaletteEvents","handleInitialColorClick","_self$initialValue","destroyInitialCurrentEvents","barLabel","barValue","barValueEditable","redLabelText","greenLabelText","blueLabelText","redBar","greenBar","blueBar","destroyRgbBarsEvents","redRangeSlider","greenRangeSlider","blueRangeSlider","destroyRgbSlidersEvents","specterRect","specterIsTouched","specterHandleIsTouched","setSBFromSpecterCoords","destroySpectrumEvents","specterWidth","specterHeight","setHSFromSpecterCoords","hslBright","circles","svgWheelCircles","wheelRect","wheelIsTouched","wheelHandleIsTouched","setHueFromWheelCoords","wheelCenterX","wheelCenterY","angleDeg","wheel","destroyWheelEvents","wheelSize","wheelHalfSize","angleRad","handleHalfSize","ColorPicker","colorPicker","onTargetClick","$clickTargetEl","moduleAlphaSlider","moduleCurrentColor","moduleHex","moduleHsbSliders","moduleHueSlider","moduleBrightnessSlider","modulePalette","moduleInitialCurrentColors","moduleRgbBars","moduleRgbSliders","moduleSbSpectrum","moduleHsSpectrum","moduleWheel","attachTargetEvents","detachTargetEvents","centerModules","_$pageContentEl$","openInPhone","updateModules","_ref$alpha","hsla","needChangeEvent","subV","_ref3$","normalizeHsValues","_ref5","_ref5$","_value$hsb","_value$hsb$","_hsl2","fireEvents","targetElSetBackgroundColor","navbarTitleText","navbarBackLinkText","navbarCloseText","groupedModules","renderPicker","_self$params3","toolbarSheet","_self$params4","toolbarPopover","_self$params5","navbarPopup","_self$params6","getModalType","f7ColorPicker","colorPickerContent","sliderValueEdiable","barValueEdiable","Treeview","f7TreeviewChildrenLoaded","wasOpened","treeview","$treeviewItemEl","textEditorButtonsMap","bold","italic","underline","strikeThrough","orderedList","unorderedList","paragraph","h1","h2","h3","alignLeft","alignCenter","alignRight","alignJustify","subscript","superscript","indent","outdent","TextEditor","textEditor","f7TextEditor","onButtonClick","onFocus","onBlur","onPaste","onSelectionChange","closeKeyboardToolbar","$keyboardToolbarEl","insertPlaceholder","$selectedLinks","currentSelection","selectedNodes","selectedNodesLinks","$selectedNodes","linkNode","selection","selectNodeContents","execCommand","currentRange","getSelectionRange","linkUrlText","imageUrlText","imageUrl","selectionIsInContent","selectionIsInPopover","closePopover","isCollapsed","getRangeAt","openPopover","openKeyboardToolbar","clearFormattingOnPaste","getData","removePlaceholder","buttonData","customButtons","$anchorNode","insertImage","createLink","sel","select","renderButton","dividers","renderButtons","popoverTimeout","createToolbar","createPopover","createKeyboardToolbar","editorEl","Breadcrumbs","breadrumbs","DeviceModule","SupportModule","UtilsModule","ResizeModule","TouchModule","ClicksModule","RouterModule","HistoryModule","ServiceWorkerModule","StoreModule","Subnavbar","Tabs","Card","noUndefinedProps","isStringProp","getSlots","slots","addChildToSlot","slot","slotName","getExtraAttrs","extraAttrs","f7events","routerIdCounter","routerComponentIdCounter","getRouterId","getComponentId","f7routers","modals","setTheme","cleanup","f7init","f7Params","f7ready","colorClasses","textColor","bgColor","borderColor","rippleColor","routerAttrs","dataAnimate","dataReloadDetail","routeTabId","routerClasses","linkBack","external","preventRouter","actionsAttrs","searchbarEnable","searchbarDisable","searchbarClear","searchbarToggle","panelToggle","actionsOpen","actionsClose","loginScreenOpen","loginScreenClose","sortableEnable","sortableDisable","sortableToggle","cardOpen","cardClose","actionsClasses","cardPreventOpen","modalStateClasses","isOpened","isClosing","useIsomorphicLayoutEffect","watchProp","valueRef","f7Popup","tabletFullscreen","_props$swipeToClose","elRef","onSwipeStart","onSwipeMove","onSwipeEnd","onSwipeClose","modalEvents","onDestroy","onMount","React","useTab","onTabShow","onTabHide","useAsyncComponent","RouterContext","initialPage","initialRoute","_props$init","tabActive","_props$browserHistory","childrenArray","initialPageComponent","restChildren","shouldInitRouter","routerData","onViewInit","initialComponent","initialComponentData","routeProps","isAsync","f7route","f7router","getRouterInitialComponent","_useState2","pages","setPages","onSwipeBackMove","onSwipeBackBeforeChange","onSwipeBackAfterChange","onSwipeBackBeforeReset","onSwipeBackAfterReset","newPages","PageComponent","pageId","pageProps","f7LoginScreen","loginScreenParams","f7Sheet","onBreakpoint","onStepProgress","onStepOpen","onStepClose","fixedList","staticList","fixedTags","slotsDefault","isFixedTag","innerEl","positionComputed","fixed","f7Popover","reveal","cover","floating","_props$backdrop","_props$swipeActiveAre","_props$swipeThreshold","isBreakpoint","onBackdropClick","onSwipe","onSwipeOpen","onCollapsedBreakpoint","disableResizable","sideComputed","effectComputed","getChildrenArray","routerOpenIn","viewRouter","resolved","childrenBefore","onDidUpdate","componentRouterData","childrenAfter","hasSameChildren","pageComponentFound","tabRouter","tabData","tabContentEl","setTabContent","_temp2","modalsRouter","modalData","setModals","modalDataToRemove","Framework7React","installed","_params","paramsTheme","componentsRouter","_objectWithoutProperties","excluded","sourceKeys","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","RoutableModals","newModals","ModalComponent","modalId","modalProps","App","_excluded","useTheme","preloaderStyle","sizeComputed","cx","cy","PageContent","ptrDistance","_props$ptrPreloader","ptrPreloader","ptrBottom","ptrMousewheel","infiniteTop","infiniteDistance","_props$infinitePreloa","infinitePreloader","hideBarsOnScroll","hideNavbarOnScroll","hideToolbarOnScroll","messagesContent","onPtrPullStart","onPtrPullMove","onPtrPullEnd","onPtrRefresh","onPtrDone","onInfinite","ptrEl","infiniteEl","Page","withSubnavbar","withNavbarLarge","navbarLarge","noNavbar","noToolbar","_props$pageContent","noSwipeback","hasSubnavbar","hasNavbarLarge","hasNavbarLargeCollapsed","hasCardExpandableOpened","routerPositionClass","routerPageRole","routerPageRoleDetailRoot","routerPageMasterStack","onPageMounted","onPageInit","onPageReinit","onPageAfterOut","onPageAfterIn","onPageBeforeRemove","onPageBeforeUnmount","onPagePosition","onPageRole","rolesData","onPageMasterStack","onPageMasterUnstack","onPageNavbarLargeCollapsed","onPageNavbarLargeExpanded","onCardOpened","onCardClose","onPageTabShow","onPageTabHide","hasSubnavbarComputed","hasNavbarLargeComputed","slotsStatic","slotsFixed","hasMessages","large","forceSubnavbar","forceNavbarLarge","useTooltip","tooltipTrigger","Icon","material","fontSize","themeIcon","getClasses","Badge","useIcon","_props","iconMaterial","iconF7","iconColor","iconSize","iconBadge","badgeColor","iconBadgeColor","useRouteProps","TabbarContext","tabbarHasIcons","useSmartSelect","smartSelectParams","ssParams","Link","badgeEl","noLinkClass","tabLink","tabLinkActive","tabbarLabel","iconOnly","badge","_props$href","tabbarContext","isTabbarIcons","iconEl","hrefComputed","NavLeft","backLink","backLinkUrl","backLinkForce","backLinkShowText","needBackLinkText","NavTitle","subtitleEl","NavRight","_props$sliding","largeTransparent","transparent","hidden","_props$outline","titleLarge","innerClass","innerClassName","largeCollapsed","routerNavbarRole","routerNavbarRoleDetailRoot","routerNavbarMasterStack","transparentVisible","onHide","onShow","onExpand","onCollapse","onNavbarTransparentShow","onNavbarTransparentHide","onNavbarPosition","onNavbarRole","onNavbarMasterStack","onNavbarMasterUnstack","leftEl","rightEl","titleLargeEl","addLeftTitleClass","addCenterTitleClass","isTransparentVisible","onBackClick","largeTitle","_props$inner","inner","die","mockGlobal","getGlobal","getDescriptor","objectPrototype","EMPTY_ARRAY","freeze","EMPTY_OBJECT","hasProxy","plainObjectString","assertProxies","func","invoked","noop","isStringish","isPlainObject","protoConstructor","isGenerator","addHiddenProp","addHiddenFinalProp","createInstanceofPredicate","theClass","isES6Map","thing","isES6Set","hasGetOwnPropertySymbols","ownKeys","getOwnPropertyNames","hasProp","getOwnPropertyDescriptors","hint","prim","_toPrimitive","_inheritsLoose","_createForOfIteratorHelperLoose","allowArrayLike","it","storedAnnotationsSymbol","createDecoratorAnnotation","annotation","is20223Decorator","decorate_20223_","storeAnnotation","annotationType_","OVERRIDE","isOverride","$mobx","Atom","name_","isPendingUnobservation_","isBeingObserved_","observers_","diffValue_","lastAccessedBy_","lowestObserverState_","IDerivationState_","NOT_TRACKING_","onBOL","onBUOL","_proto","onBO","onBUO","reportObserved","reportChanged","startBatch","propagateChanged","endBatch","isAtom","createAtom","onBecomeObservedHandler","onBecomeUnobservedHandler","arg3","atom","interceptHook","ON_BECOME_OBSERVED","onBecomeUnobserved","comparer","identity","structural","deepEqual","shallow","deepEnhancer","isObservable","isAction","isFlow","flow","autoAction","referenceEnhancer","createActionAnnotation","options_","make_","make_$1","extend_","extend_$1","decorate_20223_$1","adm","_this$options_","bound","target_","actionDescriptor","createActionDescriptor","proxyTrap","defineProperty_","mthd","kind","addInitializer","ann","_this$options_2","_ann$options_$name","_ann$options_","_ann$options_$autoAct","_ann$options_2","createAction","isMobxAction","safeDescriptors","_annotation$options_","_annotation$options_$","_annotation$options_2","_annotation$options_$2","_annotation$options_3","_annotation$options_4","_adm$proxy_2","globalState","_adm$proxy_","proxy_","isPlainObject_","createFlowAnnotation","make_$2","extend_$2","decorate_20223_$2","flowDescriptor","createFlowDescriptor","_this$options_3","isMobXFlow","createComputedAnnotation","make_$3","extend_$3","decorate_20223_$3","assertComputedDescriptor","defineComputedProperty_","asObservableObject","values_","ComputedValue","getObservablePropValue_","createObservableAnnotation","make_$4","extend_$4","decorate_20223_$4","_this$options_$enhanc","assertObservableDescriptor","defineObservableProperty_","enhancer","initializedObjects","initializeObservable","_ann$options_$enhance","observable","ObservableValue","setObservablePropValue_","AUTO","autoAnnotation","createAutoAnnotation","make_$5","extend_$5","decorate_20223_$5","_this$options_4","computed","autoBind","observableAnnotation","_this$options_5","_this$options_6","defaultCreateObservableOptions","defaultDecorator","proxy","asCreateObservableOptions","observableRefAnnotation","observableShallowAnnotation","isObservableObject","isObservableArray","isObservableMap","isObservableSet","observableStructAnnotation","observableDecoratorAnnotation","getEnhancerFromOptions","createObservable","arg2","_getDescriptor$config","_getDescriptor","observableFactories","equals","initialValues","useProxies","createLegacyArray","createObservableArray","ObservableMap","ObservableSet","decorators","initObservable","extendObservable","_target$$mobx","_target$$mobx$proxy_","objectProxyTraps","asDynamicObservableObject","struct","COMPUTED","computedAnnotation","computedStructAnnotation","arg1","_Symbol$toPrimitive","currentActionId","nextActionId","isFunctionNameConfigurable","tmpNameDescriptor","executeAction","canRunAsDerivation","runInfo","notifySpy_","startTime_","prevDerivation_","trackingDerivation","runAsAction","prevAllowStateChanges_","allowStateChanges","untrackedStart","allowStateChangesStart","prevAllowStateReads_","allowStateReadsStart","runAsAction_","actionId_","parentActionId_","_startAction","error_","suppressReactionErrors","allowStateChangesEnd","allowStateReadsEnd","untrackedEnd","_endAction","_Symbol$toPrimitive$1","_Atom","notifySpy","hasUnreportedChange_","interceptors_","changeListeners_","value_","dehancer","dehanceValue","prepareNewValue_","UNCHANGED","setNewValue_","checkIfStateModificationsAreAllowed","hasInterceptors","interceptChange","UPDATE","hasListeners","notifyListeners","intercept_","registerInterceptor","observe_","fireImmediately","observableKind","debugObjectName","registerListener","toJSON","TraceMode","dependenciesState_","observing_","newObserving_","runId_","UP_TO_DATE_","unboundDepsCount_","CaughtException","triggeredBy_","isComputing_","isRunningSetter_","derivation","setter_","isTracing_","NONE","scope_","equals_","requiresReaction_","keepAlive_","compareStructural","requiresReaction","onBecomeStale_","POSSIBLY_STALE_","propagateMaybeChanged","inBatch","shouldCompute","prevTrackingContext","trackingContext","trackAndCompute","STALE_","propagateChangeConfirmed","warnAboutUntrackedRead_","computeValue_","isCaughtException","wasSuspended","trackDerivedFunction","disableErrorBoundaries","suspend_","clearObserving","firstTime","autorun","prevU","isComputedValue","prevAllowStateReads","prevUntracked","obs","changeDependenciesStateTo0","runId","prevTracking","prevObserving","observing","lowestNewObservingDerivationState","i0","_dep","removeObserver","_dep2","addObserver","bindDependencies","untracked","allowStateReads","MobXGlobals","mobxGuid","pendingUnobservations","pendingReactions","isRunningReactions","enforceActions","spyListeners","globalReactionErrorHandlers","computedRequiresReaction","reactionRequiresObservable","observableRequiresReaction","verifyProxies","canMergeGlobalState","isolateCalled","global","__mobxInstanceCount","__mobxGlobals","queueForUnobservation","runReactions","list","Reaction","onInvalidate_","errorHandler_","requiresObservable_","isDisposed_","isScheduled_","isTrackPending_","isRunning_","schedule_","isScheduled","runReaction_","reportExceptionInDerivation_","prevReaction","dispose","getDisposer_","abortSignal","_this2","trace","enterBreakPoint","MAX_REACTION_ITERATIONS","reactionScheduler","runReactionsHelper","allReactions","iterations","remainingReactions","isReaction","ACTION","AUTOACTION","DEFAULT_ACTION_NAME","actionAnnotation","actionBoundAnnotation","autoActionAnnotation","autoActionBoundAnnotation","createActionFactory","_opts$name","_opts","_opts2","_opts2$signal","_opts3","reaction","scheduler","reactionRunner","requiresObservable","createSchedulerFromOptions","aborted","ON_BECOME_UNOBSERVED","getAtom","listenersKey","hookListeners","NEVER","ALWAYS","OBSERVED","configure","isolateGlobalState","baseScheduler","properties","annotations","descriptors","getDependencyTree","nodeToDependencyTree","generatorId","FlowCancellationError","flowAnnotation","flowBoundAnnotation","generator","rejector","gen","pendingPromise","stepId","onFulfilled","ret","onRejected","cancelPromise","_res","yieldedPromise","_isObservable","transaction","thisArg","getAdm","has_","get_","_getAdm$set_","set_","deleteProperty","_getAdm$delete_","delete_","_getAdm$definePropert","ownKeys_","preventExtensions","interceptable","interceptors","listenable","collectStoredAnnotations","SPLICE","arrayTraps","getArrayLength_","arrayExtensions","setArrayLength_","ObservableArrayAdministration","owned_","legacyMode_","atom_","enhancer_","lastKnownLength_","oldV","dehanceValue_","dehanceValues_","added","addedCount","removed","removedCount","newLength","currentLength","newItems","spliceWithArray_","updateArrayLength_","oldLength","reserveArrayBuffer","deleteCount","lengthDelta","spliceItemsIntoValues_","notifyArraySplice_","_this$values_","oldItems","notifyArrayChildUpdate_","owned","spliceWithArray","copy","addArrayExtension","funcName","funcFactory","simpleFunc","dehancedValues","mapLikeFunc","reduceLikeFunc","_this3","accumulator","_Symbol$iterator","_Symbol$toStringTag","isObservableArrayAdministration","ObservableMapMarker","ADD","DELETE","_Symbol$iterator$1","_Symbol$toStringTag$1","data_","hasMap_","keysAtom_","entry","newEntry","hasKey","updateValue_","addValue_","_change","_this3$hasMap_$get","_this4","_this4$hasMap_$get","makeIterable","_keys$next","_keys$next2","_this5","symbols","getPlainObjectKeys","_this6","_step2","_iterator2","_this7","_step3","replacementMap","dataStructure","convertToMap","orderedData","keysReportChangedCalled","_iterator3","_step4","_iterator4","_step4$value","_value","keyExisted","_value2","iter1","iter2","next1","next2","ObservableSetMarker","callbackFn","_change2","observableValues","descriptorCache","REMOVE","ObservableObjectAdministration","defaultAnnotation_","appliedAnnotations_","pendingKeys_","assertAnnotable","_this$target_$storedA","outcome","recordAnnotationApplied","deleteOutcome","notifyPropertyAddition_","cachedDescriptor","getCachedObservablePropDescriptor","_this$pendingKeys_","_this$pendingKeys_$ge","_this$pendingKeys_2","_this$pendingKeys_2$g","keys_","_options$name","_options$defaultDecor","getAnnotationFromOptions","isObservableObjectAdministration","_adm$target_$storedAn","ctor","ENTRY_0","createArrayEntryDescriptor","safariPrototypeSetterInheritanceBug","OBSERVABLE_ARRAY_BUFFER_SIZE","StubArray","LegacyObservableArray","_StubArray","arrays","createArrayBufferItem","getDebugName","_observable","getAdministration","named","aStack","bStack","unwrap","areArrays","aCtor","bCtor","getSelf","__MOBX_DEVTOOLS_GLOBAL_HOOK__","injectMobx","spy","extras","defaultNoopBatch","printDebugValue","globalIsUsingStaticRendering","isUsingStaticRendering","TimerBasedFinalizationRegistry","finalize","maxAge","sweepTimeout","registeredAt","scheduleSweep","sweep","observerFinalizationRegistry","FinalizationRegistry","getServerSnapshot","createReaction","stateVersion","onStoreChange","useObserver","baseComponentName","admRef","adm_1","subscribe","renderResult","exception","hasSymbol","ReactForwardRefSymbol","ReactMemoSymbol","baseComponent","useForwardRef","observerComponent","hoistBlackList","observerBatching","getDefaultProps","mixins","propTypes","mobxMixins","mobxPatchedDefinition","wrapper","realMethod","locks","retVal","mx","wrapFunction","patch","mixinMethod","methodMixins","getMixins","oldDefinition","originalMethod","newDefinition","createDefinition","wrappedFunc","administrationSymbol","isMobXReactObserverSymbol","_component$administra","reactionInvalidatedBeforeMount","componentClass","createReactiveRender","originalRender","boundOriginalRender","admin","_admin$reaction2","observerSCU","nextProps","nextState","objA","objB","keysA","keysB","shallowEqual","isPrototypeOf","componentWillReact","_displayName","originalComponentDidMount","_admin$reaction","makeClassComponentObserver","MobXProviderContext","parentValue","createStoreInjector","grabStoresFn","injectNames","makeReactive","Injector","newProps","componentName","getInjectName","storeNames","baseStores","storeName","grabStoresByName","isMobile","isPhone","isTablet","initDom","$$","sailfish","phone","tablet","alreadyWarned","loadedClb","i18n","isInitialized","loadNamespaces","ns","loadLanguages","lng","matchHtmlEntity","htmlEntities","unescapeHtmlEntity","i18nInstance","defaultOptions","bindI18n","bindI18nStore","transEmptyNodeValue","transSupportBasicHtmlNodes","transWrapTextNodes","transKeepBasicHtmlNodesFor","useSuspense","initReactI18next","setDefaults","react","setI18n","ReportNamespaces","usedNamespaces","addUsedNamespaces","namespaces","getUsedNamespaces","usePrevious","alwaysNewT","language","namespace","keyPrefix","getFixedT","i18nFromProps","i18nFromContext","defaultNS","defaultNSFromContext","reportNamespaces","notReadyT","optsOrDefaultValue","retNotReady","ready","wait","i18nOptions","initializedStoreOnce","every","languages","ignoreJSONStructure","hasLoadedNamespace","precheck","loadNotPending","services","backendConnector","backend","isLanguageChangingTo","fallbackLng","lastLng","loadState","hasResourceBundle","resources","partialBundledLanguages","oldI18nextHasLoadedNamespace","memoGetT","useMemoizedT","nsMode","getT","getNewT","setT","joinedNS","previousJoinedNS","boundReset","isInitial","withTranslation","WrappedComponent","I18nextWithTranslation","forwardedRef","passDownProps","tReady","withRef","I18nextProvider","ListContext","listIsMedia","listIsSimple","listIsSortable","listIsSortableOpposite","List","inset","insetIos","insetMd","xsmallInset","xsmallInsetIos","xsmallInsetMd","smallInset","smallInsetIos","smallInsetMd","mediumInset","mediumInsetIos","mediumInsetMd","largeInset","largeInsetIos","largeInsetMd","xlargeInset","xlargeInsetIos","xlargeInsetMd","strongIos","strongMd","outlineIos","outlineMd","dividersIos","dividersMd","mediaList","sortableTapHold","sortableEnabled","sortableOpposite","accordionList","accordionOpposite","contactsList","simpleList","linksList","menuList","noChevron","chevronCenter","formStoreData","virtualListParams","onSortableEnable","onSortableDisable","onSortableSort","sortData","onSortableMove","vlParams","itemBeforeInsert","beforeClear","itemsBeforeInsert","itemsAfterInsert","slotsList","rootChildrenBeforeList","rootChildrenAfterList","ulChildren","flattenSlots","wasUlChild","ListTag","ListItemContent","afterWrapEl","afterEl","titleRowEl","mediaEl","inputIconEl","headerEl","footerEl","mediaImgEl","indeterminate","checkboxIcon","radioIcon","accordionItem","isMediaComputed","isSortableComputed","isSortableOppositeComputed","inputElRef","ItemContentTag","ListItem","mediaItem","groupTitle","swipeoutOpened","accordionItemOpened","virtualListIndex","_ref$listIsMedia","_ref$listIsSortable","_ref$listIsSortableOp","_ref$listIsSimple","linkElRef","onSwipeoutOverswipeEnter","onSwipeoutOverswipeExit","onSwipeoutDeleted","onSwipeoutDelete","onSwipeoutClosed","onSwipeoutOpen","onSwipeoutOpened","onSwipeout","onAccBeforeClose","onAccClose","onAccClosed","onAccBeforeOpen","onAccOpen","onAccOpened","itemContentEl","linkAttrs","linkClasses","liClasses","linkItemEl","onToggleChange","toggleInstance","toggleEvents","labelClasses","scrollable","topMd","topIos","bottomMd","bottomIos","toolbarEl","PageReview","useTranslation","returnObjects","isProtected","isDisableAllSettings","isReviewOnly","displayMode","canReview","textReview","noBack","textBack","Device","textTrackChanges","trackChanges","onTrackChanges","isRestrictedEdit","textDisplayMode","onDisplayMode","textReviewChange","canUseReviewPermissions","textAcceptAllChanges","onAcceptAll","textRejectAllChanges","onRejectAll","PageReviewChange","isAndroid","isLockAcceptReject","editable","isLockPrevNext","storeAppOptions","onAcceptCurrentChange","textAccept","onRejectCurrentChange","textReject","onDeleteChange","textDelete","goto","onGotoNextChange","onPrevChange","onNextChange","backgroundColor","userName","textNoChanges","PageDisplayMode","storeReview","textMarkup","textAllChangesEditing","textFinal","textAllChangesAcceptedPreview","textOriginal","textAllChangesRejectedPreview","_store","_prefix","_common_keys","_isAllowed","_storeName","keysFilter","_filter","sync","save","setItem","just","getItem","setBool","defValue","itemExists","InitReview","_Component","Notifications","asc_registerCallback","onChangeReview","EditorApi","appOptions","customization","review","LocalStorage","fileKey","asc_SetTrackRevisions","canViewReview","isEdit","asc_HaveRevisionsChanges","setCanViewReview","viewReviewMode","reviewDisplay","toLocaleLowerCase","c_oAscDisplayModeInReview","Edit","Final","Original","asc_SetDisplayModeInReview","changeDisplayMode","isShow","changeArrReview","Review","_Component2","appConfig","editorPrefix","editorType","asc_AcceptAllChanges","asc_RejectAllChanges","ReviewChange","_Component3","toLocaleString","dateStyle","timeStyle","ampm","c_paragraphLinerule","changeText","proptext","get_Value","movetype","get_MoveType","get_Type","c_oAscRevisionsChangeType","TextAdd","c_oAscRevisionsMove","NoMove","textInserted","textParaMoveTo","textImage","textShape","textChart","textEquation","TextRem","textDeleted","is_MovedDown","textParaMoveFromDown","textParaMoveFromUp","ParaAdd","textParaInserted","ParaRem","textParaDeleted","TextPr","Get_Bold","textNot","textBold","Get_Italic","textItalic","Get_Underline","textUnderline","Get_Strikeout","textStrikeout","Get_DStrikeout","textDStrikeout","Get_Caps","textCaps","Get_SmallCaps","textSmallCaps","Get_VertAlign","vertalign_SuperScript","textSuperScript","vertalign_SubScript","textSubScript","textBaseline","Get_Color","Get_Highlight","textHighlight","Get_Shd","textShd","Get_FontFamily","Get_FontSize","Get_Spacing","textSpacing","Get_Position","textPosition","Get_Lang","textFormatted","ParaPr","Get_ContextualSpacing","textContextual","textNoContextual","Get_IndLeft","textIndentLeft","Get_IndRight","textIndentRight","Get_IndFirstLine","textFirstLine","Get_Jc","textRight","textLeft","textCenter","textJustify","Get_KeepLines","textKeepLines","textNoKeepLines","Get_KeepNext","textKeepNext","textNoKeepNext","Get_PageBreakBefore","textBreakBefore","textNoBreakBefore","Get_SpacingLineRule","Get_SpacingLine","textLineSpacing","textAtLeast","textMultiple","textExact","Get_SpacingBeforeAutoSpacing","textSpacingBefore","textAuto","Get_SpacingBefore","Get_SpacingAfterAutoSpacing","textSpacingAfter","Get_SpacingAfter","Get_WidowControl","textWidow","textNoWidow","Get_Tabs","textTabs","Get_NumPr","textNum","Get_PStyle","asc_GetStyleNameById","textParaFormatted","TablePr","textTableChanged","RowsAdd","textTableRowsAdd","RowsRem","textTableRowsDel","get_DateTime","user","get_UserName","userColor","get_UserColor","MoveTo","MoveFrom","dateToLocaleTimeString","get_UserId","canEditReview","asc_GetPrevRevisionsChange","asc_GetNextRevisionsChange","asc_AcceptChanges","dataChanges","asc_RejectChanges","asc_FollowRevisionMove","arrChangeReview","getArrChangeReview","get_hex","users","getInitials","ReviewController","ReviewChangeController","_props$opened","f7Actions","ActionsGroup","ComponentName","_props$close","sliceQuote","sliced","AddCommentPopup","userInfo","stateText","refInputComment","closeAddComment","textCancel","textAddComment","onAddNewComment","textDone","AddCommentDialog","templateInitials","refContainerDialog","AddComment","CommentActions","comment","onCommentMenuClick","openActionComment","onActionsClosed","ActionsButton","textEdit","textResolve","textReopen","textAddReply","removable","textDeleteComment","ReplyActions","reply","openActionReply","textDeleteReply","EditCommentPopup","storeComments","onEditComment","_useState4","refInputEditComment","openEditComment","textEditComment","userInitials","parsedName","EditCommentDialog","_ref4","EditComment","AddReplyPopup","_ref6","onAddReply","_useState6","refInputReplyComment","openAddReply","AddReplyDialog","_ref7","AddReply","_ref8","EditReplyPopup","_ref9","onEditReply","_useState8","relInputReplyComment","openEditReply","textEditReply","EditReplyDialog","_ref10","EditReply","_ref11","pickLink","arrayComment","subStr","str_res","item1","item2","ViewComments","_ref12","onResolveComment","showComment","wsProps","isViewer","canEditComments","viewMode","canComments","comments","groupCollectionFilter","collectionComments","sortComments","typeProtection","isAvailableCommenting","c_oAscEDocProtect","TrackedChanges","Comments","_useState10","clickComment","setComment","_useState12","commentActionsOpened","_useState14","setReply","_useState16","replyActionsOpened","textComments","indexComment","Objects","quote","replies","indexReply","textNoComments","CommentList","_ref13","showComments","_useState18","setCurrentIndex","_useState20","_useState22","_useState24","onViewNextComment","ViewCommentSheet","_ref14","closeCurComments","_useState26","stateHeight","setHeight","_useState28","stateOpacity","setOpacity","_useState30","stateStartY","setStartY","_useState32","isNeedClose","setNeedClose","touchObj","dist","ViewCommentPopover","_ref15","ViewCurrentComments","getUserColor","intValue","asc_getUserColorById","userColors","storeInfo","timeZoneOffsetInMs","getTimezoneOffset","utcDateToString","ooDateToString","stringOOToLocalDate","stringUtcToLocalDate","parseUserName","CommentsController","usersStore","storeApplicationSettings","addComment","addComments","removeComment","removeComments","changeCommentData","changeShowComments","hideComments","onApiActiveSheetChanged","onFilterChange","isLiveCommenting","changeDisplayComments","changeDisplayResolved","asc_showComments","asc_hideComments","curUserId","currentUser","asc_getIdOriginal","asc_getWorksheetId","readSDKComment","uid","asc_getId","changeShowComment","changeComment","asc_getOnlyOfficeTime","asc_getTime","userId","asc_getUserId","searchUserById","asc_getUserName","asc_getText","asc_getColor","asc_getSolved","asc_getQuoteText","canEditComment","canDeleteComments","canDeleteComment","canViewComment","dateReply","repliesCount","asc_getRepliesCount","asc_getReply","ind","changeFilter","groupName","unattached","asc_getDocumentFlag","readSDKReplies","AddCommentController","getUserInfo","isOpen","setCurrentUser","commentText","documentFlag","asc_CCommentDataWord","asc_CCommentData","asc_putText","asc_putTime","asc_putOnlyOfficeTime","asc_putUserId","asc_putUserName","asc_putSolved","asc_putDocumentFlag","asc_addComment","EditCommentController","ascComment","asc_putQuoteText","asc_putGuid","guid","addReply","asc_addReply","asc_changeComment","userid","onChangeComment","replyVal","textReply","indReply","currentComment","isOpenEditComment","isOpenAddReply","isOpenEditReply","currentReply","ViewCommentsController","_Component4","closeViewCurComments","isOpenViewCurComments","isResolvedComments","asc_removeComment","textMessageDeleteComment","textOk","deleteComment","textMessageDeleteReply","deleteReply","asc_selectComment","asc_showComment","_this$props","_this$props2","allComments","storeWorksheets","ViewCommentsSheetsController","_ViewCommentsControll","_CommentsController","_AddCommentController","_EditCommentController","_ViewCommentsController","_ViewCommentsSheetsController","frameStyle","minHeight","sharingSettingsUrl","coauthSheetElem","frameBorder","scrolling","align","canRequestSharingSettings","changeAccessRights","setSharingSettings","sharingSettings","onMessage","msgData","Referer","ViewSharingSettings","asceditor","Collaboration","isForm","textCollaboration","editUsers","textUsers","canViewComments","UsersPage","storeUsers","CollaborationPage","SharingSettingsController","onSheetClosed","closeOptions","onPopoverClosed","asyncGeneratorStep","_next","_throw","_asyncToGenerator","viewStyle","contentStyle","FunctionsList","functions","funcArr","hintArr","functionsList","elem","_hintArr$index","insertFormula","descr","functionInfo","functionObj","expanded","setExpanded","storeFunctions","wsLock","functionsDisable","storeFocusObjects","cellName","stateFunctions","onClickToOpenAddOptions","spellCheck","CellEditor","onApiCellSelection","onApiSelectionChanged","onFormulaCompleteMenu","setCellName","setFunctionshDisabled","stateFuncArr","setFuncArr","stateHintArr","setHintArr","seltype","asc_getSelectionType","coauth_disable","asc_getLocked","asc_getLockedTable","asc_getLockedPivotTable","is_chart_text","c_oAscSelectionType","RangeChartText","is_chart","RangeChart","is_shape_text","RangeShapeText","is_shape","RangeShape","is_image","RangeImage","RangeSlicer","_callee","atype","asc_getType","btype","c_oAscPopUpSelectorType","TableColumnName","TableThisRow","aname","toLocaleUpperCase","bname","origName","asc_getFormulaNameByLocale","Func","asc_getCustomFunctionInfo","asc_getDescription","asc_getArg","asc_getIsOptional","asc_getFunctionArgumentSeparator","TableAll","TableData","TableHeaders","TableTotals","_x","CellEditorView","asc_insertInCell","ListGroup","listContext","ListButton","ThemeColors","themeColors","onColorClick","curColor","isTypeColors","isTypeCustomColors","rowIndex","StandartColors","standartColors","CustomColors","emptyItems","customcolors","indexCurColor","ThemeColorPalette","standardcolors","themecolors","effectColors","textThemeColors","changeColor","textStandartColors","textCustomColors","CustomColorPicker","hexDigits","currentColor","autoColor","countDynamicColors","countdynamiccolors","stateColor","setColor","newColor","onAddNewColor","addNewColor","PageListMove","sheets","onMenuMoveClick","allSheets","model","PageAllList","onTabListClick","heightView","activeWorksheet","sheetIndex","active","PageCustomTabColor","textCustomColor","colorTab","storePalette","changeCustomColors","onSetWorkSheetColor","changeTabColor","PageTabColor","_props$allSheets","at","tabColorView","PopoverAllList","onPopoverOpen","StatusbarView","hiddenSheets","hiddenWorksheets","isWorkbookLocked","isProtectedWorkbook","isDisconnected","isDisabledEditSheet","setSheetColor","onAddTabClicked","locked","onTabClick","boxShadow","textDuplicate","onTabMenu","textMore","textRename","textHide","textMove","textTabColor","textUnhide","onSheetClose","StatusbarController","setWorkbookLocked","setIsLocked","asc_getCellInfo","setWorksheetLocked","setProtectedWorkbook","asc_isProtectedWorkbook","onApiEditCell","onApiSheetsChanged","onApiHideTabContextMenu","onApiUpdateTabColor","onApiDisconnect","isDisable","c_oAscCellEditorState","editEnd","setDisabledEditSheet","resetDisconnected","sheets_count","asc_getWorksheetsCount","active_index","asc_getActiveWorksheetIndex","asc_getWorksheetName","asc_isWorksheetLockedOrDeleted","asc_isWorksheetHidden","asc_getWorksheetTabColor","resetSheets","setActiveWorksheet","sheetindex","setTabLineColor","targetRef","on_main_view_click","onTabClicked","asc_showWorksheet","createSheetName","textSheet","renameWorksheet","sindex","textSheetName","textErrNameWrongChar","textErrNotEmpty","testval","textErrNameExists","notcriticalErrorTitle","asc_renameWorksheet","hideWorksheet","visibleSheets","visibleWorksheets","textErrorLastSheet","asc_closeCellEditor","asc_addWorksheet","textWarnDeleteSheet","asc_deleteWorksheet","textErrorRemoveSheet","deleteWorksheet","asc_insertWorksheet","orig","names","first","createCopyName","asc_copyWorksheet","_re","sheetsCount","asc_moveWorksheet","arrIndex","asc_setWorksheetTabColor","asc_clr","FilterOptions","canModifyFilter","is_all_checked","listVal","onValidChecked","textErrorTitle","textErrorMsg","textFilterOptions","checkSort","onSort","isValid","onClearFilter","onUpdateCell","textClearFilter","onDeleteFilter","textDeleteFilter","textSelectAll","cellvalue","FilterOptionsController","configRef","setListValue","setIsValid","setCheckSort","onDocumentReady","onApiFilterOptions","asc_unregisterCallback","setDataFilterCells","PivotTables","asc_getPivotObj","AutoFilter","asc_getSortState","c_oAscSortOptions","Ascending","Descending","asc_getCellCoord","posX","asc_getX","asc_getWidth","posY","asc_getY","asc_getHeight","isnumber","arrCells","asc_getValues","textEmptyItem","groupid","asc_getVisible","FilterView","asc_sortColFilter","asc_getCellId","asc_getDisplayName","asc_setVisible","asc_getFilterObj","asc_setType","c_oAscAutoFilterTypes","Filters","asc_applyAutoFilter","formatTableInfo","asc_getFormatTableInfo","tablename","asc_getTableName","asc_changeAutoFilter","c_oAscChangeFilterOptions","asc_clearFilter","_get","receiver","BlockTitle","searchOptions","usereplace","isReplaceAll","popoverStyle","SEARCH_BACKWARD","SearchSettingsView","useReplace","searchBy","lookIn","isMatchCase","isMatchCell","runInAction","onReplaceChecked","show_popover","extra","extraSearchOptions","SearchView","searchQuery","replaceQuery","refSearchbarInput","onSettingsClick","onSearchClick","onReplaceClick","$replace","$editor","onEditorTouchStart","onEditorTouchEnd","asc_selectSearchingResults","searchTimer","onSearchQuery","searchParams","onReplaceQuery","onReplaceAllQuery","startPoint","pointerPosition","endPoint","onchangeSearchQuery","prevState","lastInputChange","setNumberSearchResults","_this$props$isViewer","numberSearchResults","textSearch","onSearchKeyDown","onSearchInput","changeSearchQuery","textReplace","changeReplaceQuery","onReplaceAllClick","textReplaceAll","SearchViewWithObserver","SearchSettings","_SearchSettingsView","onToggleMarkResults","anc_markup","isVersionHistoryMode","storeVersionHistory","markup","textFindAndReplace","textFind","onFindReplaceClick","textFindAndReplaceAll","textSearchIn","textWorkbook","textSearchBy","textByRows","textByColumns","textLookIn","textFormulas","textValues","textMatchCase","textMatchCell","textHighlightRes","SESearchView","_SearchView","checkboxMatchCase","checkboxMatchCell","checkboxMarkResults","checkboxSearchIn","checkboxSearchBy","checkboxLookIn","caseSensitive","highlight","matchCell","isshowed","bar","Search","_f7$searchbar$get","asc_enableKeyEvents","isSearchByTyping","asc_CFindOptions","asc_setFindWhat","asc_setScanForward","asc_setIsMatchCase","asc_setIsWholeCell","asc_setScanOnOnlySheet","asc_setScanByRows","asc_setLookIn","c_oAscFindLookIn","Formulas","Value","asc_findText","resultCount","asc_setReplaceWith","asc_setIsReplaceAll","asc_replaceText","SearchSettingsWithTranslation","AddFunctionContainer","quickFunctions","quickFunction","descriptions","onInsertFunction","onOptionClick","textGroups","_FunctionGroups","editorLang","_editorLang","asc_setLocalization","localizationFunctions","_functions","jsonDesc","grouparr","asc_getFormulasInfo","initFunctions","localizationFunctionsDesc","FunctionGroups","AddFunctionController","asc_getFormulaLocaleName","closeModal","AddFunction","idContextMenuElement","ContextMenuView","onMenuClosed","onMenuItemClick","ActionsWithExtraItems","onActionClosed","menuCancel","exportedIdMenuElemen","idCntextMenuTargetElement","ContextMenuController","openedMore","extraItems","fastCoAuthTips","onApiOpenContextMenu","onApiHideContextMenu","onApiShowForeignCursorLabel","onApiHideForeignCursorLabel","_onMenuItemClick","initMenuItems","initExtraItems","offsetPopoverTop","UserId","isUserVisible","getUserName","EditorUIController","isSupportEditFeature","ContextMenu","_dec","canCoAuthoring","objects","focusOn","_class","_ContextMenuControlle","onApiShowComment","onApiHideComment","isOpenWindowUser","timer","onApiMouseMove","onApiHyperlinkClick","checkShapeSelection","searchUserByCurrentId","isComments","handleMenuItemClick","showCopyCutPasteModal","asc_Copy","linkinfo","asc_getHyperlink","c_oAscHyperlinkType","RangeLink","nameSheet","asc_getSheet","curActiveSheet","asc_setWorksheetRange","sdkIndex","asc_getHyperlinkUrl","openLink","asc_fillHandleDone","asc_mergeCellsDataLost","c_oAscMergeOptions","Merge","asc_mergeCells","textCopyCutPasteActions","errorCopyCutPaste","textDoNotShowAgain","asc_getUrlType","c_oAscUrlType","Http","Email","newDocumentPage","txtWarnUrl","mapMenuItems","iscellmenu","cellinfo","isCanFillHandle","asc_canFillHandle","itemsIcon","itemsText","asc_getComments","isSolvedComment","RangeCells","RangeRow","RangeCol","RangeMax","menuOpenLink","menuViewComment","isCellEdited","menuAddComment","contextMenuElem","dataarray","index_locked","index_foreign","editorOffset","XY","c_oAscMouseMoveType","LockedObject","ForeignSelect","tipHeight","showPoint","foreignSelectX","foreignSelectY","_ContextMenu","closeContextMenu","isShapeLocked","undo_box","toolbarOptions","getUndoRedo","disabledUndo","isCanUndo","disabledRedo","isCanRedo","onUndoClick","onUndo","onRedoClick","onRedo","docTitle","isOpenModal","isShowBack","disabledControls","closeHistory","changeTitleHandler","showEditDocument","onEditDocument","getEditOptions","disabledEditControls","onEditClick","openOptions","onAddClick","disabledSearch","displayCollaboration","disabledCollaboration","disabledSettings","ToolbarController","_storeSpreadsheetInfo","_storeSpreadsheetInfo2","_storeSpreadsheetInfo3","_storeSpreadsheetInfo4","storeSpreadsheetInfo","isObjectLocked","isLockedShape","isEditCell","editFormulaMode","hasEditUsers","dataDoc","docExt","canEdit","canRequestEditRights","storeToolbarSettings","activateControls","deactivateEditControls","goBack","canBackToFolder","setShowBack","goback","canRequestClose","onRequestClose","asc_isDocumentModified","asc_stopSaving","dlgLeaveTitleText","dlgLeaveMsgText","leaveButtonText","asc_undoAllChanges","asc_continueSaving","stayButtonText","blank","enableDownload","setDisabledEditControls","setDisabledSettings","setDisabledControls","cutDocName","changeTitle","currentTitle","formatName","wopi","asc_wopi_renameFile","ToolbarView","asc_Undo","asc_Redo","canRename","titleFieldValue","nameDoc","titleField","btnChangeTitle","_props$resizable","editorValue","onKeyboardOpen","onKeyboardClose","onPopoverClose","onInsertLink","onInsertImage","buttonClick","keyboardOpen","keyboardClose","insertLink","ListInput","_props$dropdown","dropdown","_props$wrap","_props$input","renderInput","_props$type","inputmode","inputId","accept","autocorrect","autocapitalize","autofocus","autosave","maxlength","minlength","inputStyle","validateOnBlur","onValidate","tabindex","clearButton","noFormStoreData","noStoreData","ignoreStoreData","errorMessageForce","floatingLabel","calendarParams","colorPickerParams","textEditorParams","inputInvalid","setInputInvalid","inputFocused","setInputFocused","itemContentElRef","updateInputOnDidUpdate","getDomValue","validateInput","onTextareaResize","onInputNotEmpty","onInputEmpty","calendarValue","colorPickerValue","domValue","inputHasValue","isInputHasValue","createInput","InputTag","needsValue","needsType","inputClassName","valueProps","inputMode","autoComplete","autoCorrect","autoCapitalize","autoSave","minLength","tabIndex","onTextEditorFocus","onTextEditorBlur","onTextEditorInput","onTextEditorChange","hasErrorMessage","ItemContent","PageTypeLink","curType","changeType","isNavigate","typeLink","setTypeLink","textLinkType","textExternalLink","textInternalDataRange","PageSheet","curSheet","changeSheet","stateSheet","setSheet","AddLink","textType","setLink","displayText","displayDisabled","textSelectedRange","stateDisplayText","setDisplayText","stateAutoUpdate","setAutoUpdate","screenTip","setScreenTip","activeSheet","setRange","inlineLabels","allowInternal","newType","textLink","textRequired","textRange","textDisplay","textScreenTip","AddLinkController","cell","celltype","asc_getLockText","wsc","aws","asc_CHyperlink","urltype","Invalid","txtNotUrl","Unsafe","WebLink","asc_setHyperlinkUrl","asc_checkDataRange","c_oAscSelectionDialogType","FormatTable","c_oAscError","ID","No","textInvalidRange","asc_setSheet","asc_setRange","asc_setText","asc_setTooltip","asc_insertHyperlink","mobileSelector","tabletSelector","onPopupClosed","AddLinkWithTranslation","EditLink","linkInfo","isLock","currentSheet","valueTypeLink","valueLinkSheet","getLinkSheet","linkSheet","textDefault","asc_getTooltip","valueRange","asc_getRange","onEditLink","onRemoveLink","_PageEditTypeLink","selections","_PageEditSheet","PageEditTypeLink","PageEditSheet","EditLinkController","cellInfo","linkProps","defaultDisplay","isValidRange","asc_removeHyperlink","EditLinkWithTranslation","ThemesContext","themes","_useTranslation","storeThemes","nameColors","initTheme","translations","getTranslationsThemes","setTranslationsThemes","acc","_window$native","_editorConfig$theme","_editorConfig$theme2","clientTheme","editorConfig","native","setConfigSelectTheme","setUITheme","applyTheme","setColorTheme","setSystemTheme","setSystemColorTheme","$body","systemColorTheme","colorTheme","onEngineCreated","outObject","asc_setSkin","changeTheme","resetSystemColorTheme","Segmented","raised","raisedIos","raisedMd","roundIos","roundMd","_props$tag","segmented","SegmentedTag","fillIos","fillMd","tonal","tonalIos","tonalMd","largeIos","largeMd","small","smallIos","smallMd","preloaderSize","ButtonTag","getAttrs","SpreadsheetFormats","storeSpreadsheetSettings","pageSizesIndex","pageSizes","getPageSizesList","textMetric","textSpreadsheetFormats","onFormatChange","SpreadsheetMargins","metricText","margins","initSpreadsheetMargins","stateTop","setTop","stateBottom","setBottom","stateLeft","setLeft","stateRight","setRight","onChangeMargins","isDecrement","marginValue","onPageMarginsChange","textMargins","textTop","textBottom","SpreadsheetSettings","isPortrait","isHideHeadings","isHideGridlines","curMetricName","textFormat","pageSizeTxt","textSpreadsheetSettings","textOrientation","textPortrait","resetPortrait","onOrientationChange","textLandscape","textHideHeadings","changeHideHeadings","clickCheckboxHideHeadings","textHideGridlines","changeHideGridlines","clickCheckboxHideGridlines","textColorSchemes","FormatCells","onColorSchemeChange","initPageColorSchemes","SpreadsheetColorSchemes","curScheme","stateScheme","setScheme","allSchemes","get_name","get_colors","SpreadsheetSettingsController","initSpreadsheetSettings","asc_getSheetViewSettings","opt","asc_getPageOptions","asc_getPageSetup","asc_getShowRowColHeaders","asc_getShowGridLines","asc_getOrientation","c_oAscPageOrientation","PagePortrait","changeDocSize","localMarginProps","asc_getPageMargins","asc_getLeft","asc_getTop","asc_getRight","asc_getBottom","changeProps","asc_CPageMargins","asc_setTop","asc_setBottom","asc_setLeft","asc_setRight","asc_changePageMargins","asc_changePageOrient","asc_setDisplayHeadings","asc_setDisplayGridlines","asc_GetCurrentColorSchemeIndex","asc_ChangeColorSchemeByIdx","asc_changeDocSize","Block","ApplicationSettings","unitMeasurement","formulaLang","regData","regCode","regExample","currentFormulaLang","formulaLangsColection","currentRegSetting","isRefStyle","directionMode","newDirectionMode","changeMeasureSettings","changeUnitMeasurement","unitMeasurementChange","isConfigSelectTheme","typeTheme","_isEdit","textApplicationSettings","textUnitOfMeasurement","textCentimeter","textPoint","textInch","textFormulaLanguage","exampleValue","onFormulaLangChange","textRegionalSettings","onRegSettings","textCommentingDisplay","onChangeDisplayComments","textResolvedComments","onChangeDisplayResolved","textR1C1Style","changeRefStyle","clickR1C1Style","textMacrosSettings","onChangeMacrosSettings","isCurrentLangRtl","changeDirectionMode","MacrosSettings","macrosMode","changeMacros","changeMacrosSettings","textDisableAll","textDisableAllMacrosWithoutNotification","textShowNotification","textDisableAllMacrosWithNotification","textEnableAll","textEnableAllMacrosWithoutNotification","RegionalSettings","changeRegCode","langName","FormulaLanguage","changeFormulaLang","ThemeSettings","ApplicationSettingsController","initRegSettings","initFormulaLangsCollection","initRegData","setFormulaLangsCollection","formulaLangsExamples","formulaLangsCollection","formulaLangs","asc_CFormatCellsInfo","getRegCode","c_oAscNumFormatType","asc_setSymbol","asc_getFormatCells","text4","asc_getLocaleExample","text5","cDate","getExcelDateWithTime","text6","setRegExample","displayComments","changeCanViewComments","asc_setR1C1Mode","asc_setLocale","textRegSettingsExample","_dataDoc$info","_dataDoc$info2","_dataDoc$info3","_dataDoc$info4","_dataDoc$info5","dataApp","getAppProps","dataModified","dataModifiedBy","modifiedBy","creators","settingsContext","SettingsContext","textSpreadsheetInfo","textSpreadsheetTitle","author","owner","textOwner","folder","textLocation","uploaded","created","textUploaded","textTitle","subject","textSubject","textComment","textLastModified","textLastModifiedBy","textCreated","textApplication","textAuthor","SpreadsheetInfoController","docProps","getDocProps","getModified","getModifiedBy","getCreators","getTitle","getSubject","getDescription","getCreated","asc_getCoreProps","appProps","asc_getAppProps","asc_getApplication","asc_getAppVersion","valueModified","asc_getModified","_lang","toLocaleTimeString","valueModifiedBy","asc_getLastModifiedBy","asc_getCreator","asc_getTitle","asc_getSubject","asc_getCreated","SpreadsheetInfo","textDownload","textDownloadAs","onSaveFormat","c_oAscFileType","XLSX","PDF","PDFA","ODS","XLTX","OTS","DownloadController","warnDownloadAs","advOptions","asc_getAdvancedOptions","c_oAscAdvancedOptionsID","asc_CDownloadOptions","asc_DownloadAs","Download","DownloadWithTranslation","About","licInfo","canBranding","customer","nameCustomer","mailCustomer","mail","phoneCustomer","addressCustomer","address","urlCustomer","www","infoCustomer","logoCustomer","logo","publisherUrl","__PUBLISHER_URL__","publisherPrintUrl","publisherName","__PUBLISHER_NAME__","nameEditor","sse","textAbout","alt","textVersion","__PRODUCT_VERSION__","__PUBLISHER_ADDRESS__","appVersion","compareVersions","developVersion","SettingsPage","canUseHistory","_useContext","MainContext","isBranding","canCloseEditor","onOpenOptions","_canDownload","_canDownloadOrigin","_canAbout","_canHelp","_canPrint","_canFeedback","_canDisplayInfo","canDownload","canDownloadOrigin","canPrint","canBrandingExt","about","help","feedback","inPopover","readerMode","onDownloadOrigin","textPrint","onPrint","textHelp","showHelp","showFeedback","VersionHistoryView","historyStore","currentVersion","arrVersions","filteredVersions","setFilteredVersions","usersVersions","arrVersion","handleClickRevision","onSelectRevision","ver","canRestore","onRestoreRevision","VersionHistoryController","isFromSelectRevision","timerId","arrVersionsHistory","currentChangeId","currentDocId","currentDocIdPrev","currentServerVersion","currentUserId","currentUserName","currentUserColor","currentDateCreated","currentRev","timeoutIdRef","currentArrColors","onRefreshHistory","onSetHistoryData","onDownloadUrl","onExpiredToken","changeViewerMode","asc_addRestriction","c_oAscRestrictionType","changeVersionHistoryMode","setVersions","asc_coAuthoringDisconnect","arrColors","prev_ver","docIdPrev","versionGroup","findUserById","colorval","generateUserColor","addUser","usercolor","docId","markedAsVersion","canHistoryRestore","isExpanded","serverVersion","isRevision","changes","buildVersion","changeid","hasChanges","changeVersion","rev","revisions","findRevisions","urlGetTime","previous","changesUrl","urlDiff","hist","asc_CVersionHistory","asc_setUrl","asc_setUrlChanges","asc_setDocId","asc_setCurrentChangeId","asc_setArrColors","asc_setToken","asc_setIsRequested","asc_setServerVersion","asc_SetUserId","asc_SetUserName","asc_SetUserColor","asc_SetDateOfRevision","asc_showRevision","selectedRev","DOCX","onclosed","mainContext","SettingsController","asc_Print","__HELP_URL__","__SUPPORT_URL__","asc_DownloadOrigin","SettingsView","AddImageList","textPictureFromLibrary","onInsertByFile","textPictureFromURL","onInsertByUrl","AddImage","inTabs","AddImageController","asc_addImage","asc_addImageDrawingObject","textEmptyImgUrl","AddImageWithTranslation","isFilter","setIsFilter","textSortAndFilter","onInsertSort","textFilter","onInsertFilter","AddFilterController","uncheckedFilter","filterInfo","asc_getAutoFilterInfo","asc_getIsAutoFilter","asc_setFilteringMode","level","errData","AutoFilterDataRangeError","typeCheck","asc_sortCellsRangeExpand","c_oAscSelectionSortExpand","showExpandMessage","txtSorting","txtExpandSort","txtExpand","txtSortSelected","showLockMessage","txtLockSort","txtYes","txtNo","expandAndNotShowMessage","notExpandAndNotShowMessage","asc_addAutoFilter","AddSortAndFilter","getIsAutoFilter","TabsSwipeableContext","routable","tabsClasses","routerContext","tabsSwipeableContext","initialTabContent","_routerContext$route$","tabRouteOptions","parentProps","classAttrs","TabContent","renderChildren","isChildSwiperSlide","processChildren","foundSlides","SwiperSlideContext","SwiperContext","externalElRef","Tag","wrapperTag","WrapperTag","onSwiper","eventsAssigned","containerClasses","setContainerClasses","virtualData","setVirtualData","breakpointChanged","setBreakpointChanged","initializedRef","swiperElRef","swiperRef","oldPassedParamsRef","oldSlides","nextElRef","prevElRef","paginationElRef","scrollbarElRef","restProps","splitEvents","plainObj","onBeforeBreakpoint","_containerClasses","passParams","extendWith","mountSwiper","oldParams","oldChildren","getKey","addKey","oldChildrenKeys","childrenKeys","newKeys","oldKeys","newKey","oldKey","getChangedParams","updateOnVirtualData","renderVirtual","externalRef","slideElRef","slideClasses","setSlideClasses","lazyLoaded","setLazyLoaded","updateClasses","slideData","types","storeChartSettings","countSlides","arraySlides","typesSlide","indexSlide","indexRow","onInsertChart","AddChartController","asc_getChartObject","selType","isChartEdit","putType","getRange","getInColumns","getType","asc_editChartDrawingObject","asc_addChartDrawingObject","StockChartError","errorStockChart","MaxDataSeriesError","errorMaxRows","txtInvalidRange","AddChart","AddChartControllerTranslated","shapes","storeShapeSettings","getStyleGroups","shape","onShapeClick","WebkitMaskImage","AddShapeController","asc_addShapeOnSheet","AddShape","AddOther","isHyperLink","hideAddComment","Sort","InsertHyperlinks","AddOtherController","iscelllocked","AddOtherWithTranslation","AddLayoutNavbar","lenght","AddLayoutContent","AddingPage","addingContext","AddingContext","showPanels","textFunction","textOther","stateValue","textAddress","textImageURL","textInsertImage","targetElem","showOptions","isAddShapeHyperlink","asc_canAddShapeHyperlink","panels","AddView","_props$value","_props$min","_props$max","_props$step","_props$label","_props$dual","_props$vertical","_props$verticalRevers","_props$draggableBar","_props$scale","_props$scaleSteps","_props$scaleSubSteps","_props$limitKnobPosit","rangeValue","onChanged","rangeEvents","PaletteFill","shapeObject","get_ShapeProperties","curFillColor","fillColor","getFillColor","onFillColor","setFillColor","textAddCustomColor","EditShapeContainer","canFill","asc_getCanFill","shapeType","hideChangeType","get_FromChart","get_FromSmartArt","isSmartArtInternal","get_FromSmartArtInternal","disableRemove","textStyle","onBorderSize","onBorderColor","onOpacity","onReplace","onReorder","onRemoveShape","textRemoveShape","PageShapeStyle","stroke","get_stroke","borderSizeTransform","borderSize","get_width","borderType","get_type","displayBorderSize","c_oAscStrokeType","STROKE_NONE","indexSizeByValue","displayTextBorderSize","sizeByValue","stateBorderSize","setBorderSize","stateTextBorderSize","setTextBorderSize","borderColorView","initBorderColorView","displayBorderColor","get_fill","asc_getTransparent","chartObject","textFill","textBorder","textEffects","textSize","onRangeChange","sizeByIndex","onRangeChanged","textOpacity","PageShapeStyleNoFill","PageShapeCustomFillColor","PageReplaceContainer","PageReorderContainer","textBringToForeground","textSendToBackground","textMoveForward","textMoveBackward","PageShapeBorderColor","setBorderColor","PageShapeCustomBorderColor","EditImageContainer","pluginGuid","imageObject","asc_getPluginGuid","onReplaceByFile","onReplaceByUrl","onDefaultSize","textActualSize","onRemoveImage","PageLinkSettingsContainer","textLinkSettings","textReplaceImage","textNotUrl","PageCreationCustomFormat","setFormatValue","setCustomFormat","handleSetCustomFormat","PageAccountingFormatCell","textAccounting","textDollar","onAccountingCellFormat","textEuro","textPound","textRouble","textYen","PageEditCell","storeCellSettings","cellStyles","curStyleName","styleName","fontInfo","fontName","textFonts","fontColor","displaySize","textPt","isBold","isItalic","isUnderline","fontColorPreview","fillColorPreview","onFontSize","onFontClick","toggleBold","toggleItalic","toggleUnderline","textDecoration","textTextColor","onTextColor","onTextColorAuto","textFillColor","textTextFormat","onHAlignChange","onVAlignChange","onWrapTextChange","onTextOrientationChange","textBorderStyle","onBorderStyle","onCellFormat","onCurrencyCellFormat","dateFormats","timeFormats","onStyleClick","backgroundImage","TextColorCell","changeFontColor","FillColorCell","changeFillColor","CustomTextColorCell","CustomFillColorCell","FontsCell","storeTextSettings","curFontName","fonts","fontsArray","arrayRecentFonts","iconWidth","iconHeight","thumbCanvas","thumbIdx","thumbContext","spriteCols","spriteThumbs","getImageUri","font","imgidx","getImage","toDataURL","stateRecent","setRecent","vlData","vlFonts","setVlFonts","drawFonts","images","drawImages","addFontToRecent","TextFormatCell","hAlignStr","vAlignStr","isWrapText","textTextOrientation","textWrapText","TextOrientationCell","orientationStr","textHorizontalText","textAngleCounterclockwise","textAngleClockwise","textVerticalText","textRotateTextUp","textRotateTextDown","BorderStyleCell","borderInfo","borderSizes","textThin","textMedium","textThick","textNoBorder","changeBorderStyle","textAllBorders","textOutsideBorders","textBottomBorder","textTopBorder","textLeftBorder","textRightBorder","textInsideBorders","textInsideVerticalBorder","textInsideHorizontalBorder","textDiagonalUpBorder","textDiagonalDownBorder","colorAuto","BorderColorCell","borderStyle","setAutoColor","changeBorderColor","CustomBorderColorCell","BorderSizeCell","changeBorderSize","CellStyle","countStylesSlide","stylesSlide","CustomFormats","customFormats","renderList","setRenderList","EditTextContainer","textIn","paragraphAlign","paragraphValign","changeFontSize","changeFontFamily","align_Left","onParagraphAlign","align_Center","align_Right","align_Justify","c_oAscVAlign","Top","onParagraphValign","Center","Bottom","setOrientationTextShape","PageTextFonts","PageTextFontColor","changeTextColor","PageTextCustomFontColor","shapeProperties","PageEditChart","chartProperties","get_ChartProperties","chartType","disableEditAxis","c_oAscChartTypeSettings","pie","doughnut","pie3d","disableAxisPos","barNormal3d","barStacked3d","barStackedPer3d","hBarNormal3d","hBarStacked3d","hBarStackedPer3d","barNormal3dPerspective","needReverse","hBarNormal","hBarStacked","hBarStackedPer","onType","onStyle","setLayoutProperty","initChartLayout","onHorAxisCrossType","onHorAxisCrossValue","onHorAxisPos","onHorAxisReverse","onHorAxisTickMajor","onHorAxisTickMinor","onHorAxisLabelPos","onVerAxisMinValue","onVerAxisMaxValue","onVerAxisCrossType","onVerAxisCrossValue","onVerAxisDisplayUnits","onVerAxisReverse","onVerAxisTickMajor","onVerAxisTickMinor","onVerAxisLabelPos","scatter","onRemoveChart","PageChartDesign","PageChartDesignType","PageChartDesignStyle","chartStyles","asc_getImage","PageChartDesignBorder","shapeStroke","initBorderColor","PageChartCustomFillColor","PageChartBorderColor","PageChartCustomBorderColor","PageChartLayout","legend","axisHorTitle","axisVertTitle","horGridlines","vertGridlines","dataLabel","getLegendPos","getHorAxisLabel","getVertAxisLabel","getHorGridLines","getVertGridLines","getDataLabelsPos","chartTitle","chartLegend","setLegend","chartAxisHorTitle","setAxisHorTitle","chartAxisVertTitle","setAxisVertTitle","chartHorGridlines","setHorGridlines","chartVertGridlines","setVertGridlines","chartDataLabel","setDataLabel","dataLabelPos","c_oAscChartDataLabelsPos","none","textNone","ctr","barNormal","inBase","textInnerBottom","inEnd","textInnerTop","outEnd","textOuterTop","barStacked","barStackedPer","lineNormal","lineStacked","lineStackedPer","stock","scatterSmoothMarker","scatterSmooth","scatterLineMarker","scatterLine","bestFit","textFit","chartLayoutTitles","textOverlay","textNoOverlay","chartLayoutLegends","textLeftOverlay","textRightOverlay","chartLayoutAxisTitleHorizontal","chartLayoutAxisTitleVertical","textRotated","textHorizontal","chartLayoutGridlinesHorizontal","textMajor","textMinor","textMajorAndMinor","chartLayoutGridlinesVertical","chartDataLabels","textLayout","textChartTitle","textLegend","textAxisTitle","textVertical","textGridlines","textDataLabels","PageChartVerticalAxis","chartProperty","verAxisProps","getVertAxisProps","axisProps","getAxisType","c_oAscAxisType","getHorAxisProps","crossValue","getCrossesRule","axisCrosses","c_oAscCrossesRule","textValue","textMinimumValue","minValue","textMaximumValue","maxValue","vertAxisDisplayUnits","c_oAscValAxUnits","textHundreds","HUNDREDS","textThousands","THOUSANDS","textTenThousands","TEN_THOUSANDS","textHundredThousands","HUNDRED_THOUSANDS","textMillions","MILLIONS","textTenMillions","TEN_MILLIONS","textHundredMil","HUNDRED_MILLIONS","textBillions","BILLIONS","textTrillions","TRILLIONS","tickOptions","c_oAscTickMark","TICK_MARK_NONE","textCross","TICK_MARK_CROSS","TICK_MARK_IN","textOut","TICK_MARK_OUT","verticalAxisLabelsPosition","c_oAscTickLabelsPos","TICK_LABEL_POSITION_NONE","textLow","TICK_LABEL_POSITION_LOW","textHigh","TICK_LABEL_POSITION_HIGH","textNextToAxis","TICK_LABEL_POSITION_NEXT_TO","_useState34","currentAxisCrosses","setAxisCrosses","_useState36","getDispUnitsRule","currentDisplayUnits","setDisplayUnits","_useState38","getInvertValOrder","valuesReverseOrder","toggleValuesReverseOrder","valueMajorType","getMajorTickMark","valueMinorType","getMinorTickMark","defineCurrentTickOption","elemType","_useState40","currentMajorType","setMajorType","_useState42","currentMinorType","setMinorType","_useState44","getTickLabelsPos","currentLabelsPosition","setLabelsPosition","_useState46","getMinValRule","c_oAscValAxisRule","getMinVal","setMinValue","_useState48","getMaxValRule","getMaxVal","setMaxValue","currentCrossesValue","getCrosses","_useState50","crossesValue","setCrossesValue","textAxisOptions","textAxisCrosses","textCrossesValue","textDisplayUnits","textValuesInReverseOrder","textTickOptions","textMajorType","textMinorType","textLabelOptions","textLabelPosition","PageChartHorizontalAxis","horAxisProps","horAxisLabelsPosition","horAxisPosition","textOnTickMarks","c_oAscLabelsPosition","byDivisions","textBetweenTickMarks","betweenDivisions","_useState62","_useState64","getLabelsPosition","axisPosition","setAxisPosition","_useState66","getInvertCatOrder","_useState68","_useState70","_useState72","_useState74","isRadar","isRadarAxis","textAxisPosition","PageChartReorder","EditCellController","initFormats","Time","initCustomFormats","exampleVal","asc_setDecimalPlaces","asc_setSeparator","_this$props$storeCell","valSymbol","asc_getLocale","Custom","asc_convertNumFormat2NumFormatLocal","asc_convertNumFormatLocal2NumFormat","addCustomFormat","asc_setCellFormat","asc_setCellBold","asc_setCellItalic","asc_setCellUnderline","asc_setCellStyle","asc_setCellTextColor","asc_setCellBackgroundColor","curSize","asc_decreaseFontSize","asc_increaseFontSize","asc_setCellFontSize","asc_setCellFontName","asc_setCellAlign","asc_setCellVertAlign","asc_setCellTextWrap","asc_setCellAngle","Accounting","bordersColor","newBorders","bordersWidth","put_auto","c_oAscBorderOptions","InnerV","asc_CBorder","InnerH","asc_setCellBorders","EditCell","EditShapeController","asc_changeShapeType","ascType","c_oAscDrawingLayerType","BringToFront","SendToBack","BringForward","SendBackward","asc_setSelectedDrawingObjectLayer","asc_Remove","asc_CShapeProperty","asc_CImgProperty","asc_CShapeFill","c_oAscFill","FILL_TYPE_NOFILL","put_fill","FILL_TYPE_SOLID","asc_CFillSolid","put_color","asc_putFill","asc_putShapeProperties","asc_setGraphicObjectProps","_shapeObject","STROKE_COLOR","asc_CStroke","put_width","asc_putPrstDash","asc_getPrstDash","put_stroke","_borderColor","asc_putTransparent","put_ShapeProperties","EditShape","EditImageController","imgsize","asc_getOriginalImageSize","put_Width","get_ImageWidth","put_Height","get_ImageHeight","put_ResetCrop","put_Rot","asc_changeImageFromFile","asc_putImageUrl","EditImage","EditTextController","asc_putVert","EditText","EditChartController","comboBarLine","comboBarLineSecondary","comboAreaBar","comboCustom","clearChartStyles","updateChartStyles","asc_getChartPreviews","chart","putStyle","put_ChartProperties","currentShape","propertyMethod","getVerticalAxisProp","axisRule","putMinValRule","putMinVal","setVerticalAxisProp","putMaxValRule","putMaxVal","putCrossesRule","putCrosses","putDispUnitsRule","putInvertValOrder","putMajorTickMark","putMinorTickMark","putTickLabelsPos","verHorProps","getHorizontalAxisProp","setHorizontalAxisProp","putLabelsPosition","putInvertCatOrder","EditChart","EmptyEditLayout","textSelectObjectToEdit","EditLayoutNavbar","editors","EditLayoutContent","EditingPage","textSettings","textCell","isLockedText","textText","get_Vert","directionTextShape","setDirectionTextShape","c_oAscVertDrawingText","vert","vert270","PageImageReplace","PageImageReorder","PageLinkSettings","textGeneral","textNumber","textFraction","textScientific","textCurrency","textDate","textTime","textPercentage","currentLegend","currentAxisHorTitle","currentAxisVertTitle","currentChartHorGridlines","currentChartVertGridlines","currentChartDataLabel","_useState52","_useState54","_useState56","_useState58","_useState60","_useState76","_useState78","_useState80","_useState82","_useState84","MainPage","showOpts","editOptionsVisible","addOptionsVisible","addShowOptions","settingsVisible","collaborationVisible","addLinkSettingsVisible","editLinkSettingsVisible","historyVisible","handleClickToOpenOptions","_config$customization","isShowPlaceholder","isDocReady","loaderName","loaderLogo","isHideLogo","customLogoImage","customLogoUrl","_logo$imageDark","_logo$image","imageDark","handleOptionsViewClosed","EditView","AddingController","CollaborationView","_events","addevent","CollaborationController","onChangeEditUsers","onUserConnection","onCoAuthoringDisconnect","onTryUndoInFastCollaborative","isFastCoauth","canLicense","isOffline","asc_SetFastCollaborative","SetCollaborativeMarksShowType","c_oAscCollaborativeMarksShowType","All","LastChanges","asc_setAutoSaveGap","canLiveView","coEditing","canAutosave","connection","textTryUndoRedo","IrregularStack","_stack","_config","_strongCompare","strongCompare","_compare","_weakCompare","weakCompare","obj1","obj2","_indexOf","exist","LongActionsController","stackLongActions","loadMask","closePreloader","on_engine_created","onLongActionBegin","onLongActionEnd","onOpenDocument","onConfirmAction","setLongActionView","forceClose","c_oAscAsyncActionType","Information","BlockInteraction","c_oAscAsyncAction","textLoadingDocument","saveTitleText","loadFontsTitleText","loadImagesTitleText","loadFontTitleText","loadImageTitleText","downloadTitleText","printTitleText","uploadImageTitleText","applyChangesTitleText","savePreparingText","mailMergeLoadFileText","downloadMergeTitle","sendMergeTitle","waitText","txtEditingMode","loadingDocumentTitleText","apiCallback","c_oAscConfirm","ConfirmReplaceRange","ConfirmReplaceFormulaInTable","confirmMoveCellRange","confirmReplaceFormulaInTable","textYes","textNo","ConfirmPutMergeRange","confirmPutMergeRange","ConfirmChangeProtectRange","advDRMPassword","asc_checkProtectedRangesPassword","ConfirmMaxChangesSize","confirmMaxChangesSize","textUndo","textContinue","$title","proc","asc_getCurrentFont","asc_getCurrentImage","asc_getFontsCount","asc_getImagesCount","ErrorController","LoadingDocument","LoadingScriptError","closable","Unknown","unknownErrorText","ConvertationTimeout","convertationTimeoutText","ConvertationOpenError","openErrorText","ConvertationSaveError","saveErrorText","DownloadError","downloadErrorText","UplImageSize","uploadImageSizeMessage","UplImageExt","uploadImageExtMessage","UplImageFileCount","uploadImageFileCountMessage","PastInMergeAreaError","pastInMergeAreaError","FrmlWrongCountParentheses","errorWrongBracketsCount","FrmlWrongOperator","errorWrongOperator","FrmlWrongMaxArgument","errorCountArgExceed","FrmlWrongCountArgument","errorCountArg","FrmlWrongFunctionName","errorFormulaName","FrmlAnotherParsingError","errorFormulaParsing","FrmlWrongArgumentRange","errorArgsRange","UnexpectedGuid","errorUnexpectedGuid","FileRequest","errorFileRequest","FileVKey","errorFileVKey","MaxDataPointsError","errorMaxPoints","FrmlOperandExpected","errorOperandExpected","CannotMoveRange","errorMoveRange","errorAutoFilterDataRange","AutoFilterChangeFormatTableError","errorAutoFilterChangeFormatTable","AutoFilterChangeError","errorAutoFilterChange","AutoFilterMoveToHiddenRangeError","errorAutoFilterHiddenRange","CannotFillRange","errorFillRange","InvalidReferenceOrName","errorInvalidRef","LockCreateDefName","errorCreateDefName","PasteMaxRangeError","errorPasteMaxRange","LockedCellPivot","errorLockedCellPivot","PivotLabledColumns","PivotOverlap","ForceSaveButton","ForceSaveTimeout","LockedAllError","errorLockedAll","LockedWorksheetRename","errorLockedWorksheetRename","OpenWarning","errorOpenWarning","FrmlWrongReferences","errorFrmlWrongReferences","CopyMultiselectAreaError","errorCopyMultiselectArea","PrintMaxPagesCount","errorPrintMaxPagesCount","CannotChangeFormulaArray","errorChangeArray","MultiCellsInTablesFormulaArray","errorMultiCellFormula","MailToClientMissing","NoDataToParse","CannotUngroupError","FrmlMaxTextLength","errorFrmlMaxTextLength","FrmlMaxLength","errorFrmlMaxLength","MoveSlicerError","LockedEditView","ChangeFilteredRangeError","FrmlMaxReference","errorFrmlMaxReference","DataValidate","asc_getErrorTitle","asc_getError","errorDataValidate","VKeyEncrypt","errorToken","KeyExpire","errorTokenExpire","UserCountExceed","errorUsersExceed","CoAuthoringDisconnect","errorViewerDisconnect","ConvertationPassword","errorFilePassProtect","ComboSeriesError","DataRangeError","errorDataRange","Database","errorDatabaseConnection","UserDrop","lostEditingRights","changeEditingRights","errorUserDrop","Warning","errorConnectToServer","UplImageUrl","errorBadImageUrl","SessionAbsolute","errorSessionAbsolute","SessionIdle","errorSessionIdle","SessionToken","errorSessionToken","DataEncrypted","errorDataEncrypted","AccessDeny","errorAccessDeny","EditingError","errorEditingDownloadas","ConvertationOpenLimitError","errorFileSizeExceed","UpdateVersion","errorUpdateVersionOnDisconnect","FTChangeTableRangeError","FTRangeIncludedOtherTables","PasteSlicerError","RemoveDuplicates","asc_getDuplicateValues","asc_getUniqueValues","ChangeOnProtectedSheet","SingleColumnOrRowError","LocationOrDataRangeError","LoadingFontError","errorLoadingFont","FillAllRowsWarning","fillWithSeparator","have","isDesktopApp","textFillOtherRows","PasswordIsNotCorrect","UplDocumentSize","DeleteColumnContainsLockedCell","DeleteRowContainsLockedCell","UplDocumentFileCount","UplDocumentExt","Password","PivotGroup","PasteMultiSelectError","CannotUseCommandProtectedSheet","PivotWithoutUnderlyingData","DirectUrl","errorDirectUrl","ConvertationOpenFormat","errorInconsistentExtPdf","errorInconsistentExtDocx","errorInconsistentExtXlsx","errorInconsistentExtPptx","errorInconsistentExt","ProtectedRangeByOtherUser","TraceDependentsNoFormulas","TracePrecedentsNoValidReference","errorDefaultMessage","Level","Critical","criticalErrorTitle","criticalErrorExtText","dlg","scriptLoadError","PluginsController","iframe","configPlugins","autostart","serverPlugins","showPluginModal","pluginClose","pluginResize","onPluginsInit","loadPlugins","onDlgBtnClick","asc_pluginButtonClick","plugin","variationIndex","urlAddition","variation","get_Variations","get_Visual","get_Url","get_BaseUrl","isCustomWindow","get_CustomWindow","arrBtns","get_Buttons","newBtns","get_Size","padding","getPlugins","pluginsData","fetchFunction","baseUrl","loaded","previousPromise","currentPromise","pluginsdata","parsePlugins","variations","itemVar","descriptionLocale","textLocale","registerPlugins","CPlugin","deserialize","asc_pluginsRegister","mergePlugins","setPluginsOptions","PageEncoding","encodeData","valuesDelimeter","namesDelimeter","valueEncoding","stateEncoding","setStateEncoding","valueDelimeter","stateDelimeter","setStateDelimeter","nameEncoding","encoding","nameDelimeter","textChooseCsvOptions","textDelimeter","changeStateDelimeter","textEncoding","changeStateEncoding","txtOk","EncodingView","currentEncoding","changeCurrentEncoding","txtDownloadCsv","textChooseEncoding","lcid","currentDelimeter","changeCurrentDelimeter","textChooseDelimeter","Encoding","EncodingController","formatOptions","initEncoding","txtComma","txtSemicolon","txtColon","txtTab","txtSpace","recommendedSettings","asc_getRecommendedSettings","initEncodeData","asc_getCodePage","asc_getDelimiter","asc_getCodePages","asc_getCodePageName","asc_getLcid","asc_setAdvancedOptions","asc_CTextOptions","PageDropdownList","listItems","onChangeItemList","DropdownListView","DropdownListController","textArr","addArr","initDropdownList","DropdownList","MainController","ApplyEditRights","InitApplication","isShowOpenDialog","fallbackSdkTranslations","_state","licenseType","isDocModified","wsLockOptions","defaultTitleText","__APP_TITLE_TEXT__","stackMacrosRequests","on_load_scripts","sdk_scripts","dep_scripts","setConfigOptions","canRenameAnonymous","region","changeMacrosRequest","loadDocument","permissions","docInfo","_options","actionLink","asc_CUserInfo","_userOptions","put_Id","put_FullName","put_IsAnonymousUser","asc_CDocInfo","put_Url","put_DirectUrl","directUrl","put_Title","put_Format","put_VKey","vkey","put_Options","put_UserInfo","put_CallbackUrl","callbackUrl","put_Token","put_Permissions","put_EncryptedInfo","encryptionKeys","put_Lang","put_Mode","coEditMode","put_CoEditingMode","macros","asc_putIsEnabledMacroses","asc_putIsEnabledPlugins","onEditorPermissions","onLicenseChanged","onMacrosPermissionRequest","onRunAutostartMacroses","asc_setDocInfo","asc_getEditorPermissions","licenseUrl","customerId","setDataDoc","licType","asc_getLicenseType","c_oLicenseResult","Expired","ExpiredTrial","NotBefore","ExpiredLimited","Success","SuccessLimit","setPermissionOptions","applyMode","asc_LoadDocument","results","processArrayScripts","scriptpath","_translate","spreadsheet_api","bindEvents","asc_setFontRenderingMode","onExternalMessage","asc_Resize","onUpdateVersion","onServerVersion","onPrintUrl","onDocumentName","_onLongActionEnd","onDownloadCancel","initCellInfo","initEditorStyles","initFonts","styleSize","asc_setThumbnailStylesSizes","resetFontsRecent","addSchemes","isDRM","asc_CDRMAdvancedOptions","txtIncorrectPwd","advDRMOptions","textOpenFile","onAdvancedOptions","_isDocReady","can","setCanUndo","setCanRedo","editStart","isEditEnd","setEditCell","setEditFormulaMode","isFormula","editFormula","setFunctionsDisabled","editText","onChangeProtectSheet","onRenameText","onEntriesListMenu","_document$querySelect","coord","asc_getActiveCellCoord","widthCell","heightCell","leftPosition","tooltipCell","onNeedUpdateExternalReference","links","asc_getExternalReferences","asc_updateExternalReferences","validation","boxSdk","dropdownListTarget","replaced","_this$getWSProps","getWSProps","setWsLock","setWsProps","wsProtection","asc_isProtectedSheet","asc_getProtectedSheet","Open","onDocumentContentReady","appSettings","isEditMailMerge","isEditDiagram","asc_setZoom","updateWindowTitle","needToUpdateVersion","canAnalytics","onProcessSaveResult","onProcessRightsChange","onDownloadAs","applyLicense","changeDocReady","initThemeColors","asc_setViewMode","asc_setRestriction","OnlyComments","onDocumentModifiedChanged","onDocumentCanSaveChanged","onbeforeunload","onBeforeUnload","onunload","onUnload","Connections","UsersCount","ConnectionsOS","UsersCountOS","trialMode","c_oLicenseMode","Limited","ConnectionsLive","ConnectionsLiveOS","UsersViewCount","UsersViewCountOS","warnNoLicense","__COMPANY_NAME__","warnNoLicenseUsers","textNoLicenseTitle","warnLicenseExceeded","warnLicenseUsersExceeded","errorOpensource","isAnonymousSupport","warnLicenseAnonymous","license","permissionsLicense","textBuyNow","textContactUs","__SALES_EMAIL__","warnLicenseLimitedRenewed","textPaidFeature","textCustomLoader","textClose","asc_runAutostartMacroses","textHasMacros","textRemember","macrosRequest","textRequestMacros","isFromGatewayDownloadAs","edit","continueSavingTimer","leavePageText","_this8","errorUpdateVersion","titleUpdateVersion","changeServerVersion","errorServerVersion","titleServerVersion","iframePrint","print","isModified","asc_isDocumentCanSave","isCanSave","asc_OnSaveEnd","errorProcessSaveResult","old_rights","warnProcessRightsChange","_format","_supported","XLSM","XLSB","JPG","PNG","asc_setIsSaveAs","_this9","isDocumentModified","_this10","initSdk","f7params","_React$Component","consoleLogger","output","Logger","concreteLogger","logger","debug","deprecate","lvl","debugOnly","clone","baseLogger","EventEmitter","numListeners","numTimesAdded","defer","rej","makeString","lastOfPathSeparatorRegExp","getLastOfPath","Empty","cleanKey","canNotTraverseDeeper","stackIndex","setPath","getPath","deepExtend","overwrite","regexEscape","_entityMap","chars","looksLikeObjectPathRegExpCache","capacity","regExpMap","regExpQueue","getRegExp","regExpFromCache","regExpNew","deepFind","keySeparator","nextPath","getCleanedCode","ResourceStore","addNamespaces","removeNamespaces","getResource","addResource","silent","addResources","addResourceBundle","skipCopy","pack","removeResourceBundle","getResourceBundle","compatibilityAPI","getDataByLanguage","hasLanguageSomeTranslations","postProcessor","processors","addPostProcessor","translator","checkedLoadedFor","Translator","changeLanguage","exists","interpolation","extractFromKey","nsSeparator","wouldCheckForNsInKey","seemsNaturalLanguage","userDefinedKeySeparator","userDefinedNsSeparator","possibleChars","looksLikeObjectPath","interpolator","nestingRegexp","lastKey","overloadTranslationOptionHandler","returnDetails","appendNamespaceToCIMode","usedKey","exactUsedKey","usedLng","usedNS","usedParams","getUsedParamsDetails","resUsedKey","resExactUsedKey","resType","joinArrays","handleAsObjectInI18nFormat","i18nFormat","handleAsObject","returnedObjectHandler","resTypeIsArray","newKeyToUse","deepKey","extendTranslation","usedDefault","needsPluralHandling","hasDefaultValue","defaultValueSuffix","pluralResolver","getSuffix","defaultValueSuffixOrdinalFallback","ordinal","needsZeroSuffixLookup","shouldUseIntlApi","pluralSeparator","isValidLookup","resForMissing","missingKeyNoValueFallbackToKey","updateMissing","lngs","fallbackLngs","languageUtils","getFallbackCodes","saveMissingTo","toResolveHierarchy","specificDefaultValue","defaultForMissing","missingKeyHandler","saveMissing","saveMissingPlurals","getSuffixes","appendNamespaceToMissingKey","parseMissingKeyHandler","defaultVariables","skipInterpolation","skipOnVariables","nestBef","nest","postProcess","postProcessorNames","applyPostProcessor","postProcessPassResolved","i18nResolved","extracted","fallbackNS","needsContextHandling","codes","finalKeys","addLookupKeys","pluralSuffix","zeroSuffix","ordinalPrefix","contextKey","contextSeparator","possibleKey","returnNull","returnEmptyString","resourceStore","optionsKeys","useOptionsReplaceForData","option","capitalize","LanguageUtil","supportedLngs","getScriptPartFromCode","formatLanguageCode","getLanguagePartFromCode","specialCases","lowerCaseLng","cleanCode","isSupportedCode","nonExplicitSupportedLngs","getBestMatchFromCodes","cleanedLng","lngOnly","supportedLng","fallbacks","fallbackCode","fallbackCodes","addCode","sets","nr","_rulesPluralsTypes","nonIntlVersions","intlVersions","suffixesOrder","zero","one","two","few","many","PluralResolver","compatibilityJSON","PluralRules","rules","numbers","plurals","createRules","addRule","getRule","needsPlural","rule","resolvedOptions","pluralCategories","getPluralFormsOfKey","pluralCategory1","pluralCategory2","pluralCategory","getSuffixRetroCompatible","noAbs","simplifyPluralSuffix","returnSuffix","deepFindWithDefaults","defaultData","getPathWithDefaults","Interpolator","escapeValue","iOpts","useRawValueToEscape","prefixEscaped","suffixEscaped","formatSeparator","unescapePrefix","unescapeSuffix","nestingPrefix","nestingPrefixEscaped","nestingSuffix","nestingSuffixEscaped","nestingOptionsSeparator","maxReplaces","alwaysFormat","resetRegExp","getOrResetRegExp","existingRegExp","regexpUnescape","replaces","regexSafe","handleFormat","interpolationkey","missingInterpolationHandler","todos","safeValue","todo","matchedVar","temp","clonedOptions","handleHasOptions","inheritedOptions","sep","optionsString","matchedSingleQuotes","matchedDoubleQuotes","formatters","doReduce","createCachedFormatter","formatter","Formatter","formats","NumberFormat","currency","relativetime","RelativeTimeFormat","ListFormat","addCached","mem","formatStr","optStr","parseFormatStr","formatted","valOptions","formatParams","Connector","waitingReads","maxParallelReads","readingCalls","maxRetries","retryTimeout","queueLoad","toLoad","toLoadLanguages","toLoadNamespaces","hasAllNamespaces","pendingCount","errors","pushPath","removePending","loadedKeys","read","fcName","tried","resolver","prepareLoading","loadOne","fallbackValue","isUpdate","clb","initImmediate","tDescription","transformOptions","I18n","isClone","isInitializing","defOpts","createClassOnDemand","ClassOrObject","lu","languageDetector","detection","deferred","loadResources","usedCallback","resolvedLanguage","setResolvedLanguage","reloadResources","lngInLngs","setLngProps","setLng","cacheUserLanguage","detect","fixedT","resultKey","setDefaultNamespace","preResult","preloaded","newLngs","createInstance","cloneInstance","forkResourceStore","mergedOptions","loadPath","addPath","multiSeparator","allowMultiLoading","requestOptions","BackendError","retry","getLoadPath","funcOrVal","loadUrl","readMulti","arrify","currentLang","defaultLang","makeObservable","changeFocus","_focusObjects","_cellInfo","resetFocusObjects","resetCellInfo","isObj","_objects","get_ObjectType","c_oAscTypeSelectElement","get_ObjectValue","Hyperlink","resultArr","intf","getSelections","getShapeObject","getImageObject","getChartObject","asc_getGraphicObjectProps","asc_getObjectType","asc_getObjectValue","asc_getProtectionLocked","asc_getProtectionLockText","asc_getState","asc_getView","idArray","usersArray","idOriginal","userAttr","getFunctions","groupname","asc_getGroupName","funcarr","asc_getFormulasArray","_name","asc_getLocaleName","binaryFormat","heightOne","offsets","responseType","overrideMimeType","setRequestHeader","Uint8Array","openBinary","arrayBuffer","binaryAlpha","memorySize","isOffsets","Uint8ClampedArray","binaryIndex","binaryLen","len0","tmpValue","moduleCur","imagePixels","canvas","ctx","getContext","dataTmp","createImageData","sizeImage","alphaChannel","pixelsCount","putImageData","customTextColors","initTextSettings","initFontSettings","initEditorFonts","initFontInfo","changeCustomTextColors","listItemHeight","loadSprite","xfs","asc_getXfs","asc_getFontName","asc_getFontSize","asc_getFontBold","asc_getFontItalic","asc_getFontUnderline","asc_getFontColor","resetTextColor","asc_getHorAlign","asc_getVertAlign","fontId","asc_getFontId","asc_getFontThumbnail","asc_getFontType","FONT_THUMBNAIL_HEIGHT","CThumbnailLoader","fontObj","get_auto","get_value","getRegDataCodes","langInfo","asc_getFill","sdkColor","get_color","_sizes","initCellSettings","initTextFormat","initTextOrientation","initCellStyles","formatsArr","asc_getFillColor","resetColor","asc_getStyleName","hAlign","vAlign","asc_getWrapText","asc_getAngle","guestName","textGuest","textAnonymous","targetApp","canCreateNew","createUrl","canOpenRecent","recent","fileChoiceUrl","mergeFolderUrl","canBack","hasUrl","canPlugins","setCurrentName","asc_getRights","c_oRights","asc_getCustomization","asc_getCanBranding","modifyFilter","asc_getIsAnalyticsEnable","isLightVersion","asc_getIsLight","asc_getBuildVersion","asc_isOffline","editCommentAuthorOnly","deleteCommentAuthorOnly","commentAuthorOnly","canChat","chat","asc_getLicenseMode","download","reviewGroups","reviewPermissions","canUseCommentPermissions","commentGroups","canUseUserInfoPermissions","userInfoGroups","setReviewPermissions","setCommentPermissions","setUserInfoPermissions","canHistoryClose","asc_getLiveViewerSupport","asc_isAnonymousSupport","widthContainer","_types","areaNormal","areaStacked","areaStackedPer","line3d","widthDocument","heightDocument","groupCollectionComments","removeShowComment","findComment","collection","system","isWorksheetLocked"],"sourceRoot":""}
\ No newline at end of file
diff --git a/apps/spreadsheeteditor/mobile/index.html b/apps/spreadsheeteditor/mobile/index.html
new file mode 100644
index 00000000000..470187fc1cf
--- /dev/null
+++ b/apps/spreadsheeteditor/mobile/index.html
@@ -0,0 +1,270 @@
+Spreadsheet Editor
\ No newline at end of file
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-01.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-01.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-02.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-02.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-03.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-03.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-04.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-04.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-05.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-05.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-06.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-06.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-07.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-07.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-08.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-08.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-09.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-09.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-10.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-10.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-11.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-11.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-12.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-12.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-13.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-13.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-14.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-14.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-15.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-15.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-16.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-16.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-17.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-17.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-18.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-18.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-19.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-19.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-20.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-20.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-21.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-21.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-22.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-22.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-23.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-23.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-24.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-24.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/resources/img/charts/chart-25.png b/apps/spreadsheeteditor/mobile/resources/img/charts/chart-25.png
old mode 100755
new mode 100644
diff --git a/apps/spreadsheeteditor/mobile/src/controller/Main.jsx b/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
index b5f5993f46f..54dc0e94a2b 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
@@ -1203,6 +1203,7 @@ class MainController extends Component {
}
onProcessSaveResult (data) {
+ console.log("axing onProcessSaveResult", data)
this.api.asc_OnSaveEnd(data.result);
if (data && data.result === false) {
@@ -1215,7 +1216,13 @@ class MainController extends Component {
}
}
+ /**
+ * 这是权限改变之后的操作,和存储无关
+ * @param data
+ */
+
onProcessRightsChange (data) {
+ console.log("axing onProcessRightsChange", data)
if (data && data.enabled === false) {
const appOptions = this.props.storeAppOptions;
const old_rights = appOptions.lostEditingRights;
@@ -1241,7 +1248,7 @@ class MainController extends Component {
onDownloadAs(format) {
const appOptions = this.props.storeAppOptions;
-
+ console.log("axing onDownloadAs", format, appOptions)
if(!appOptions.canDownload) {
const { t } = this.props;
const _t = t('Controller.Main', { returnObjects:true });
diff --git "a/apps/spreadsheeteditor/mobile/src/controller/\346\226\260\345\273\272 \346\226\207\346\234\254\346\226\207\346\241\243.txt" "b/apps/spreadsheeteditor/mobile/src/controller/\346\226\260\345\273\272 \346\226\207\346\234\254\346\226\207\346\241\243.txt"
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/apps/spreadsheeteditor/mobile/src/lib/patch.jsx b/apps/spreadsheeteditor/mobile/src/lib/patch.jsx
index ec7b37a2ce0..27e4d89ca7b 100644
--- a/apps/spreadsheeteditor/mobile/src/lib/patch.jsx
+++ b/apps/spreadsheeteditor/mobile/src/lib/patch.jsx
@@ -1,6 +1,7 @@
const EditorUIController = () => null;
-EditorUIController.isSupportEditFeature = () => false;
+EditorUIController.isSupportEditFeature = () => true;
+// EditorUIController.isSupportEditFeature = () => false;
export default EditorUIController;
diff --git a/build/common.json b/build/common.json
index 17e3465e67e..b57f41c7b58 100644
--- a/build/common.json
+++ b/build/common.json
@@ -1,7 +1,7 @@
{
"name": "common",
"version": "4.3.0",
- "build": 39,
+ "build": 41,
"homepage": "http://www.onlyoffice.com",
"private": true,
"sdk": {
@@ -17,7 +17,7 @@
"src": [
"Images/*",
"Images/placeholders/*",
- "Images/content_controls/*",
+ "Images/content_controls/*",
"Native/*.js",
"libfont/js/fonts.*",
"libfont/wasm/fonts.*"
diff --git a/build/documenteditor.json b/build/documenteditor.json
index 99cf4e60cd0..38d352cc54c 100644
--- a/build/documenteditor.json
+++ b/build/documenteditor.json
@@ -1,7 +1,7 @@
{
"name": "documenteditor",
"version": "4.3.0",
- "build": 1150,
+ "build": 1152,
"homepage": "http://www.onlyoffice.com",
"private": true,
"main": {
diff --git a/build/pdfeditor.json b/build/pdfeditor.json
index f4ac274c78c..ee125494d43 100644
--- a/build/pdfeditor.json
+++ b/build/pdfeditor.json
@@ -1,7 +1,7 @@
{
"name": "pdfeditor",
"version": "4.3.0",
- "build": 1152,
+ "build": 1154,
"homepage": "http://www.onlyoffice.com",
"private": true,
"main": {
diff --git a/build/presentationeditor.json b/build/presentationeditor.json
index cf7230b8f6f..6746edccf14 100644
--- a/build/presentationeditor.json
+++ b/build/presentationeditor.json
@@ -1,7 +1,7 @@
{
"name": "presentationeditor",
"version": "4.3.0",
- "build": 790,
+ "build": 792,
"homepage": "http://www.onlyoffice.com",
"private": true,
"main": {
diff --git a/build/spreadsheeteditor.json b/build/spreadsheeteditor.json
index 310aa972135..f69da5b9271 100644
--- a/build/spreadsheeteditor.json
+++ b/build/spreadsheeteditor.json
@@ -1,7 +1,7 @@
{
"name": "spreadsheeteditor",
"version": "4.3.0",
- "build": 903,
+ "build": 905,
"homepage": "http://www.onlyoffice.com",
"private": true,
"main": {
diff --git a/build/sprites.sh b/build/sprites.sh
old mode 100755
new mode 100644
diff --git a/vendor/backbone/docs/public/fonts/aller-bold.eot b/vendor/backbone/docs/public/fonts/aller-bold.eot
old mode 100755
new mode 100644
diff --git a/vendor/backbone/docs/public/fonts/aller-bold.ttf b/vendor/backbone/docs/public/fonts/aller-bold.ttf
old mode 100755
new mode 100644
diff --git a/vendor/backbone/docs/public/fonts/aller-bold.woff b/vendor/backbone/docs/public/fonts/aller-bold.woff
old mode 100755
new mode 100644
diff --git a/vendor/backbone/docs/public/fonts/aller-light.eot b/vendor/backbone/docs/public/fonts/aller-light.eot
old mode 100755
new mode 100644
diff --git a/vendor/backbone/docs/public/fonts/aller-light.ttf b/vendor/backbone/docs/public/fonts/aller-light.ttf
old mode 100755
new mode 100644
diff --git a/vendor/backbone/docs/public/fonts/aller-light.woff b/vendor/backbone/docs/public/fonts/aller-light.woff
old mode 100755
new mode 100644
diff --git a/vendor/backbone/test/vendor/qunit.css b/vendor/backbone/test/vendor/qunit.css
old mode 100755
new mode 100644
diff --git a/vendor/backbone/test/vendor/qunit.js b/vendor/backbone/test/vendor/qunit.js
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/Gruntfile.js b/vendor/perfect-scrollbar/Gruntfile.js
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/README.md b/vendor/perfect-scrollbar/README.md
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/bower.json b/vendor/perfect-scrollbar/bower.json
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/examples/azusa.jpg b/vendor/perfect-scrollbar/examples/azusa.jpg
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/examples/options-default.html b/vendor/perfect-scrollbar/examples/options-default.html
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/examples/options-minScrollbarLength.html b/vendor/perfect-scrollbar/examples/options-minScrollbarLength.html
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/examples/options-suppressScrollAxis.html b/vendor/perfect-scrollbar/examples/options-suppressScrollAxis.html
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/examples/options-useBothWheelAxes.html b/vendor/perfect-scrollbar/examples/options-useBothWheelAxes.html
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/examples/options-wheelPropagation.html b/vendor/perfect-scrollbar/examples/options-wheelPropagation.html
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/examples/options-wheelSpeed.html b/vendor/perfect-scrollbar/examples/options-wheelSpeed.html
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/examples/reach-the-end-callback.html b/vendor/perfect-scrollbar/examples/reach-the-end-callback.html
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/examples/text-content.html b/vendor/perfect-scrollbar/examples/text-content.html
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/min/perfect-scrollbar-0.4.9.min.css b/vendor/perfect-scrollbar/min/perfect-scrollbar-0.4.9.min.css
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/min/perfect-scrollbar-0.4.9.min.js b/vendor/perfect-scrollbar/min/perfect-scrollbar-0.4.9.min.js
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/min/perfect-scrollbar-0.4.9.with-mousewheel.min.js b/vendor/perfect-scrollbar/min/perfect-scrollbar-0.4.9.with-mousewheel.min.js
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/package.json b/vendor/perfect-scrollbar/package.json
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/perfect-scrollbar.jquery.json b/vendor/perfect-scrollbar/perfect-scrollbar.jquery.json
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/src/jquery.mousewheel.js b/vendor/perfect-scrollbar/src/jquery.mousewheel.js
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/src/perfect-scrollbar.css b/vendor/perfect-scrollbar/src/perfect-scrollbar.css
old mode 100755
new mode 100644
diff --git a/vendor/perfect-scrollbar/src/perfect-scrollbar.js b/vendor/perfect-scrollbar/src/perfect-scrollbar.js
old mode 100755
new mode 100644
diff --git a/vendor/underscore/docs/public/fonts/aller-bold.eot b/vendor/underscore/docs/public/fonts/aller-bold.eot
old mode 100755
new mode 100644
diff --git a/vendor/underscore/docs/public/fonts/aller-bold.ttf b/vendor/underscore/docs/public/fonts/aller-bold.ttf
old mode 100755
new mode 100644
diff --git a/vendor/underscore/docs/public/fonts/aller-bold.woff b/vendor/underscore/docs/public/fonts/aller-bold.woff
old mode 100755
new mode 100644
diff --git a/vendor/underscore/docs/public/fonts/aller-light.eot b/vendor/underscore/docs/public/fonts/aller-light.eot
old mode 100755
new mode 100644
diff --git a/vendor/underscore/docs/public/fonts/aller-light.ttf b/vendor/underscore/docs/public/fonts/aller-light.ttf
old mode 100755
new mode 100644
diff --git a/vendor/underscore/docs/public/fonts/aller-light.woff b/vendor/underscore/docs/public/fonts/aller-light.woff
old mode 100755
new mode 100644
diff --git a/vendor/underscore/docs/public/fonts/novecento-bold.eot b/vendor/underscore/docs/public/fonts/novecento-bold.eot
old mode 100755
new mode 100644
diff --git a/vendor/underscore/docs/public/fonts/novecento-bold.ttf b/vendor/underscore/docs/public/fonts/novecento-bold.ttf
old mode 100755
new mode 100644
diff --git a/vendor/underscore/docs/public/fonts/novecento-bold.woff b/vendor/underscore/docs/public/fonts/novecento-bold.woff
old mode 100755
new mode 100644