luxen-ui 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cdn/chunks/decorate.js +2 -0
- package/cdn/chunks/decorate.js.map +1 -0
- package/cdn/chunks/lit.js +3 -0
- package/cdn/chunks/lit.js.map +1 -0
- package/cdn/custom-elements.json +14430 -0
- package/cdn/define.d.ts +9 -0
- package/cdn/define.d.ts.map +1 -0
- package/cdn/define.js +2 -0
- package/cdn/define.js.map +1 -0
- package/cdn/elements/avatar/avatar.d.ts +21 -0
- package/cdn/elements/avatar/avatar.d.ts.map +1 -0
- package/cdn/elements/avatar/avatar.js +18 -0
- package/cdn/elements/avatar/avatar.js.map +1 -0
- package/cdn/elements/avatar/index.d.ts +8 -0
- package/cdn/elements/avatar/index.d.ts.map +1 -0
- package/cdn/elements/avatar/index.js +2 -0
- package/cdn/elements/avatar/index.js.map +1 -0
- package/cdn/elements/badge/badge.d.ts +17 -0
- package/cdn/elements/badge/badge.d.ts.map +1 -0
- package/cdn/elements/badge/badge.js +2 -0
- package/cdn/elements/badge/badge.js.map +1 -0
- package/cdn/elements/badge/index.d.ts +8 -0
- package/cdn/elements/badge/index.d.ts.map +1 -0
- package/cdn/elements/badge/index.js +2 -0
- package/cdn/elements/badge/index.js.map +1 -0
- package/cdn/elements/carousel/carousel.d.ts +148 -0
- package/cdn/elements/carousel/carousel.d.ts.map +1 -0
- package/cdn/elements/carousel/carousel.js +87 -0
- package/cdn/elements/carousel/carousel.js.map +1 -0
- package/cdn/elements/carousel/index.d.ts +8 -0
- package/cdn/elements/carousel/index.d.ts.map +1 -0
- package/cdn/elements/carousel/index.js +2 -0
- package/cdn/elements/carousel/index.js.map +1 -0
- package/cdn/elements/carousel-item/carousel-item.d.ts +13 -0
- package/cdn/elements/carousel-item/carousel-item.d.ts.map +1 -0
- package/cdn/elements/carousel-item/carousel-item.js +2 -0
- package/cdn/elements/carousel-item/carousel-item.js.map +1 -0
- package/cdn/elements/carousel-item/index.d.ts +8 -0
- package/cdn/elements/carousel-item/index.d.ts.map +1 -0
- package/cdn/elements/carousel-item/index.js +2 -0
- package/cdn/elements/carousel-item/index.js.map +1 -0
- package/cdn/elements/dialog/dialog.d.ts +56 -0
- package/cdn/elements/dialog/dialog.d.ts.map +1 -0
- package/cdn/elements/dialog/dialog.js +18 -0
- package/cdn/elements/dialog/dialog.js.map +1 -0
- package/cdn/elements/dialog/dialog.styles.d.ts +8 -0
- package/cdn/elements/dialog/dialog.styles.d.ts.map +1 -0
- package/cdn/elements/dialog/dialog.styles.js +2 -0
- package/cdn/elements/dialog/dialog.styles.js.map +1 -0
- package/cdn/elements/dialog/index.d.ts +8 -0
- package/cdn/elements/dialog/index.d.ts.map +1 -0
- package/cdn/elements/dialog/index.js +2 -0
- package/cdn/elements/dialog/index.js.map +1 -0
- package/cdn/elements/divider/divider.d.ts +23 -0
- package/cdn/elements/divider/divider.d.ts.map +1 -0
- package/cdn/elements/divider/divider.js +2 -0
- package/cdn/elements/divider/divider.js.map +1 -0
- package/cdn/elements/divider/index.d.ts +8 -0
- package/cdn/elements/divider/index.d.ts.map +1 -0
- package/cdn/elements/divider/index.js +2 -0
- package/cdn/elements/divider/index.js.map +1 -0
- package/cdn/elements/drawer/drawer.d.ts +34 -0
- package/cdn/elements/drawer/drawer.d.ts.map +1 -0
- package/cdn/elements/drawer/drawer.js +2 -0
- package/cdn/elements/drawer/drawer.js.map +1 -0
- package/cdn/elements/drawer/index.d.ts +8 -0
- package/cdn/elements/drawer/index.d.ts.map +1 -0
- package/cdn/elements/drawer/index.js +2 -0
- package/cdn/elements/drawer/index.js.map +1 -0
- package/cdn/elements/dropdown/dropdown.d.ts +64 -0
- package/cdn/elements/dropdown/dropdown.d.ts.map +1 -0
- package/cdn/elements/dropdown/dropdown.js +20 -0
- package/cdn/elements/dropdown/dropdown.js.map +1 -0
- package/cdn/elements/dropdown/index.d.ts +8 -0
- package/cdn/elements/dropdown/index.d.ts.map +1 -0
- package/cdn/elements/dropdown/index.js +2 -0
- package/cdn/elements/dropdown/index.js.map +1 -0
- package/cdn/elements/dropdown-item/dropdown-item.d.ts +25 -0
- package/cdn/elements/dropdown-item/dropdown-item.d.ts.map +1 -0
- package/cdn/elements/dropdown-item/dropdown-item.js +34 -0
- package/cdn/elements/dropdown-item/dropdown-item.js.map +1 -0
- package/cdn/elements/dropdown-item/index.d.ts +8 -0
- package/cdn/elements/dropdown-item/index.d.ts.map +1 -0
- package/cdn/elements/dropdown-item/index.js +2 -0
- package/cdn/elements/dropdown-item/index.js.map +1 -0
- package/cdn/elements/icon/icon.d.ts +18 -0
- package/cdn/elements/icon/icon.d.ts.map +1 -0
- package/cdn/elements/icon/icon.js +7 -0
- package/cdn/elements/icon/icon.js.map +1 -0
- package/cdn/elements/icon/index.d.ts +8 -0
- package/cdn/elements/icon/index.d.ts.map +1 -0
- package/cdn/elements/icon/index.js +2 -0
- package/cdn/elements/icon/index.js.map +1 -0
- package/cdn/elements/input-otp/index.d.ts +8 -0
- package/cdn/elements/input-otp/index.d.ts.map +1 -0
- package/cdn/elements/input-otp/index.js +2 -0
- package/cdn/elements/input-otp/index.js.map +1 -0
- package/cdn/elements/input-otp/input-otp.d.ts +31 -0
- package/cdn/elements/input-otp/input-otp.d.ts.map +1 -0
- package/cdn/elements/input-otp/input-otp.js +2 -0
- package/cdn/elements/input-otp/input-otp.js.map +1 -0
- package/cdn/elements/input-stepper/index.d.ts +8 -0
- package/cdn/elements/input-stepper/index.d.ts.map +1 -0
- package/cdn/elements/input-stepper/index.js +2 -0
- package/cdn/elements/input-stepper/index.js.map +1 -0
- package/cdn/elements/input-stepper/input-stepper.d.ts +63 -0
- package/cdn/elements/input-stepper/input-stepper.d.ts.map +1 -0
- package/cdn/elements/input-stepper/input-stepper.js +2 -0
- package/cdn/elements/input-stepper/input-stepper.js.map +1 -0
- package/cdn/elements/popover/index.d.ts +8 -0
- package/cdn/elements/popover/index.d.ts.map +1 -0
- package/cdn/elements/popover/index.js +2 -0
- package/cdn/elements/popover/index.js.map +1 -0
- package/cdn/elements/popover/popover.d.ts +62 -0
- package/cdn/elements/popover/popover.d.ts.map +1 -0
- package/cdn/elements/popover/popover.js +17 -0
- package/cdn/elements/popover/popover.js.map +1 -0
- package/cdn/elements/rating/index.d.ts +8 -0
- package/cdn/elements/rating/index.d.ts.map +1 -0
- package/cdn/elements/rating/index.js +2 -0
- package/cdn/elements/rating/index.js.map +1 -0
- package/cdn/elements/rating/rating.d.ts +38 -0
- package/cdn/elements/rating/rating.d.ts.map +1 -0
- package/cdn/elements/rating/rating.js +41 -0
- package/cdn/elements/rating/rating.js.map +1 -0
- package/cdn/elements/skeleton/index.d.ts +8 -0
- package/cdn/elements/skeleton/index.d.ts.map +1 -0
- package/cdn/elements/skeleton/index.js +2 -0
- package/cdn/elements/skeleton/index.js.map +1 -0
- package/cdn/elements/skeleton/skeleton.d.ts +12 -0
- package/cdn/elements/skeleton/skeleton.d.ts.map +1 -0
- package/cdn/elements/skeleton/skeleton.js +2 -0
- package/cdn/elements/skeleton/skeleton.js.map +1 -0
- package/cdn/elements/spinner/index.d.ts +8 -0
- package/cdn/elements/spinner/index.d.ts.map +1 -0
- package/cdn/elements/spinner/index.js +2 -0
- package/cdn/elements/spinner/index.js.map +1 -0
- package/cdn/elements/spinner/spinner.d.ts +16 -0
- package/cdn/elements/spinner/spinner.d.ts.map +1 -0
- package/cdn/elements/spinner/spinner.js +18 -0
- package/cdn/elements/spinner/spinner.js.map +1 -0
- package/cdn/elements/tabs/index.d.ts +8 -0
- package/cdn/elements/tabs/index.d.ts.map +1 -0
- package/cdn/elements/tabs/index.js +2 -0
- package/cdn/elements/tabs/index.js.map +1 -0
- package/cdn/elements/tabs/tabs.d.ts +48 -0
- package/cdn/elements/tabs/tabs.d.ts.map +1 -0
- package/cdn/elements/tabs/tabs.js +2 -0
- package/cdn/elements/tabs/tabs.js.map +1 -0
- package/cdn/elements/toast/index.d.ts +9 -0
- package/cdn/elements/toast/index.d.ts.map +1 -0
- package/cdn/elements/toast/index.js +2 -0
- package/cdn/elements/toast/index.js.map +1 -0
- package/cdn/elements/toast/toast.d.ts +72 -0
- package/cdn/elements/toast/toast.d.ts.map +1 -0
- package/cdn/elements/toast/toast.js +2 -0
- package/cdn/elements/toast/toast.js.map +1 -0
- package/cdn/elements/tooltip/index.d.ts +8 -0
- package/cdn/elements/tooltip/index.d.ts.map +1 -0
- package/cdn/elements/tooltip/index.js +2 -0
- package/cdn/elements/tooltip/index.js.map +1 -0
- package/cdn/elements/tooltip/tooltip.d.ts +59 -0
- package/cdn/elements/tooltip/tooltip.d.ts.map +1 -0
- package/cdn/elements/tooltip/tooltip.js +17 -0
- package/cdn/elements/tooltip/tooltip.js.map +1 -0
- package/cdn/elements/tree/index.d.ts +8 -0
- package/cdn/elements/tree/index.d.ts.map +1 -0
- package/cdn/elements/tree/index.js +2 -0
- package/cdn/elements/tree/index.js.map +1 -0
- package/cdn/elements/tree/tree.d.ts +76 -0
- package/cdn/elements/tree/tree.d.ts.map +1 -0
- package/cdn/elements/tree/tree.js +14 -0
- package/cdn/elements/tree/tree.js.map +1 -0
- package/cdn/elements/tree-item/index.d.ts +8 -0
- package/cdn/elements/tree-item/index.d.ts.map +1 -0
- package/cdn/elements/tree-item/index.js +2 -0
- package/cdn/elements/tree-item/index.js.map +1 -0
- package/cdn/elements/tree-item/tree-item.d.ts +74 -0
- package/cdn/elements/tree-item/tree-item.d.ts.map +1 -0
- package/cdn/elements/tree-item/tree-item.js +83 -0
- package/cdn/elements/tree-item/tree-item.js.map +1 -0
- package/cdn/index.d.ts +6 -0
- package/cdn/index.d.ts.map +1 -0
- package/cdn/index.js +1 -0
- package/cdn/registry.d.ts +22 -0
- package/cdn/registry.d.ts.map +1 -0
- package/cdn/registry.js +2 -0
- package/cdn/registry.js.map +1 -0
- package/cdn/shared/controllers/popover.d.ts +44 -0
- package/cdn/shared/controllers/popover.d.ts.map +1 -0
- package/cdn/shared/controllers/popover.js +2 -0
- package/cdn/shared/controllers/popover.js.map +1 -0
- package/cdn/shared/luxen-element.d.ts +20 -0
- package/cdn/shared/luxen-element.d.ts.map +1 -0
- package/cdn/shared/luxen-element.js +2 -0
- package/cdn/shared/luxen-element.js.map +1 -0
- package/cdn/shared/luxen-form-associated-element.d.ts +49 -0
- package/cdn/shared/luxen-form-associated-element.d.ts.map +1 -0
- package/cdn/shared/luxen-form-associated-element.js +2 -0
- package/cdn/shared/luxen-form-associated-element.js.map +1 -0
- package/cdn/shared/styles/host.styles.d.ts +9 -0
- package/cdn/shared/styles/host.styles.d.ts.map +1 -0
- package/cdn/shared/styles/host.styles.js +2 -0
- package/cdn/shared/styles/host.styles.js.map +1 -0
- package/cdn/styles/elements/avatar.css +20 -0
- package/cdn/styles/elements/badge.css +159 -0
- package/cdn/styles/elements/button.css +171 -0
- package/cdn/styles/elements/close-button/circle.css +66 -0
- package/cdn/styles/elements/close-button/ring.css +71 -0
- package/cdn/styles/elements/close-button/square.css +70 -0
- package/cdn/styles/elements/disclosure.css +137 -0
- package/cdn/styles/elements/divider.css +75 -0
- package/cdn/styles/elements/input-otp.css +164 -0
- package/cdn/styles/elements/input-stepper/default.css +245 -0
- package/cdn/styles/elements/input-stepper/rounded.css +238 -0
- package/cdn/styles/elements/kbd.css +21 -0
- package/cdn/styles/elements/progress.css +114 -0
- package/cdn/styles/elements/select.css +71 -0
- package/cdn/styles/elements/skeleton.css +89 -0
- package/cdn/styles/elements/tabs/enclosed.css +148 -0
- package/cdn/styles/elements/tabs/line.css +138 -0
- package/cdn/styles/elements/toast.css +260 -0
- package/cdn/styles/index.css +885 -0
- package/cdn/vite-env.d.js +0 -0
- package/dist/custom-elements.json +174 -168
- package/package.json +35 -28
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carousel.js","names":["defaultOptions"],"sources":["../../../../../node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/embla-carousel.esm.js","../../../../../node_modules/.pnpm/embla-carousel-autoplay@8.6.0_embla-carousel@8.6.0/node_modules/embla-carousel-autoplay/esm/embla-carousel-autoplay.esm.js","../../../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/directives/map.js","../../../src/html/elements/carousel/carousel.css?inline","../../../src/html/elements/carousel/carousel.ts"],"sourcesContent":["function isNumber(subject) {\n return typeof subject === 'number';\n}\nfunction isString(subject) {\n return typeof subject === 'string';\n}\nfunction isBoolean(subject) {\n return typeof subject === 'boolean';\n}\nfunction isObject(subject) {\n return Object.prototype.toString.call(subject) === '[object Object]';\n}\nfunction mathAbs(n) {\n return Math.abs(n);\n}\nfunction mathSign(n) {\n return Math.sign(n);\n}\nfunction deltaAbs(valueB, valueA) {\n return mathAbs(valueB - valueA);\n}\nfunction factorAbs(valueB, valueA) {\n if (valueB === 0 || valueA === 0) return 0;\n if (mathAbs(valueB) <= mathAbs(valueA)) return 0;\n const diff = deltaAbs(mathAbs(valueB), mathAbs(valueA));\n return mathAbs(diff / valueB);\n}\nfunction roundToTwoDecimals(num) {\n return Math.round(num * 100) / 100;\n}\nfunction arrayKeys(array) {\n return objectKeys(array).map(Number);\n}\nfunction arrayLast(array) {\n return array[arrayLastIndex(array)];\n}\nfunction arrayLastIndex(array) {\n return Math.max(0, array.length - 1);\n}\nfunction arrayIsLastIndex(array, index) {\n return index === arrayLastIndex(array);\n}\nfunction arrayFromNumber(n, startAt = 0) {\n return Array.from(Array(n), (_, i) => startAt + i);\n}\nfunction objectKeys(object) {\n return Object.keys(object);\n}\nfunction objectsMergeDeep(objectA, objectB) {\n return [objectA, objectB].reduce((mergedObjects, currentObject) => {\n objectKeys(currentObject).forEach(key => {\n const valueA = mergedObjects[key];\n const valueB = currentObject[key];\n const areObjects = isObject(valueA) && isObject(valueB);\n mergedObjects[key] = areObjects ? objectsMergeDeep(valueA, valueB) : valueB;\n });\n return mergedObjects;\n }, {});\n}\nfunction isMouseEvent(evt, ownerWindow) {\n return typeof ownerWindow.MouseEvent !== 'undefined' && evt instanceof ownerWindow.MouseEvent;\n}\n\nfunction Alignment(align, viewSize) {\n const predefined = {\n start,\n center,\n end\n };\n function start() {\n return 0;\n }\n function center(n) {\n return end(n) / 2;\n }\n function end(n) {\n return viewSize - n;\n }\n function measure(n, index) {\n if (isString(align)) return predefined[align](n);\n return align(viewSize, n, index);\n }\n const self = {\n measure\n };\n return self;\n}\n\nfunction EventStore() {\n let listeners = [];\n function add(node, type, handler, options = {\n passive: true\n }) {\n let removeListener;\n if ('addEventListener' in node) {\n node.addEventListener(type, handler, options);\n removeListener = () => node.removeEventListener(type, handler, options);\n } else {\n const legacyMediaQueryList = node;\n legacyMediaQueryList.addListener(handler);\n removeListener = () => legacyMediaQueryList.removeListener(handler);\n }\n listeners.push(removeListener);\n return self;\n }\n function clear() {\n listeners = listeners.filter(remove => remove());\n }\n const self = {\n add,\n clear\n };\n return self;\n}\n\nfunction Animations(ownerDocument, ownerWindow, update, render) {\n const documentVisibleHandler = EventStore();\n const fixedTimeStep = 1000 / 60;\n let lastTimeStamp = null;\n let accumulatedTime = 0;\n let animationId = 0;\n function init() {\n documentVisibleHandler.add(ownerDocument, 'visibilitychange', () => {\n if (ownerDocument.hidden) reset();\n });\n }\n function destroy() {\n stop();\n documentVisibleHandler.clear();\n }\n function animate(timeStamp) {\n if (!animationId) return;\n if (!lastTimeStamp) {\n lastTimeStamp = timeStamp;\n update();\n update();\n }\n const timeElapsed = timeStamp - lastTimeStamp;\n lastTimeStamp = timeStamp;\n accumulatedTime += timeElapsed;\n while (accumulatedTime >= fixedTimeStep) {\n update();\n accumulatedTime -= fixedTimeStep;\n }\n const alpha = accumulatedTime / fixedTimeStep;\n render(alpha);\n if (animationId) {\n animationId = ownerWindow.requestAnimationFrame(animate);\n }\n }\n function start() {\n if (animationId) return;\n animationId = ownerWindow.requestAnimationFrame(animate);\n }\n function stop() {\n ownerWindow.cancelAnimationFrame(animationId);\n lastTimeStamp = null;\n accumulatedTime = 0;\n animationId = 0;\n }\n function reset() {\n lastTimeStamp = null;\n accumulatedTime = 0;\n }\n const self = {\n init,\n destroy,\n start,\n stop,\n update,\n render\n };\n return self;\n}\n\nfunction Axis(axis, contentDirection) {\n const isRightToLeft = contentDirection === 'rtl';\n const isVertical = axis === 'y';\n const scroll = isVertical ? 'y' : 'x';\n const cross = isVertical ? 'x' : 'y';\n const sign = !isVertical && isRightToLeft ? -1 : 1;\n const startEdge = getStartEdge();\n const endEdge = getEndEdge();\n function measureSize(nodeRect) {\n const {\n height,\n width\n } = nodeRect;\n return isVertical ? height : width;\n }\n function getStartEdge() {\n if (isVertical) return 'top';\n return isRightToLeft ? 'right' : 'left';\n }\n function getEndEdge() {\n if (isVertical) return 'bottom';\n return isRightToLeft ? 'left' : 'right';\n }\n function direction(n) {\n return n * sign;\n }\n const self = {\n scroll,\n cross,\n startEdge,\n endEdge,\n measureSize,\n direction\n };\n return self;\n}\n\nfunction Limit(min = 0, max = 0) {\n const length = mathAbs(min - max);\n function reachedMin(n) {\n return n < min;\n }\n function reachedMax(n) {\n return n > max;\n }\n function reachedAny(n) {\n return reachedMin(n) || reachedMax(n);\n }\n function constrain(n) {\n if (!reachedAny(n)) return n;\n return reachedMin(n) ? min : max;\n }\n function removeOffset(n) {\n if (!length) return n;\n return n - length * Math.ceil((n - max) / length);\n }\n const self = {\n length,\n max,\n min,\n constrain,\n reachedAny,\n reachedMax,\n reachedMin,\n removeOffset\n };\n return self;\n}\n\nfunction Counter(max, start, loop) {\n const {\n constrain\n } = Limit(0, max);\n const loopEnd = max + 1;\n let counter = withinLimit(start);\n function withinLimit(n) {\n return !loop ? constrain(n) : mathAbs((loopEnd + n) % loopEnd);\n }\n function get() {\n return counter;\n }\n function set(n) {\n counter = withinLimit(n);\n return self;\n }\n function add(n) {\n return clone().set(get() + n);\n }\n function clone() {\n return Counter(max, get(), loop);\n }\n const self = {\n get,\n set,\n add,\n clone\n };\n return self;\n}\n\nfunction DragHandler(axis, rootNode, ownerDocument, ownerWindow, target, dragTracker, location, animation, scrollTo, scrollBody, scrollTarget, index, eventHandler, percentOfView, dragFree, dragThreshold, skipSnaps, baseFriction, watchDrag) {\n const {\n cross: crossAxis,\n direction\n } = axis;\n const focusNodes = ['INPUT', 'SELECT', 'TEXTAREA'];\n const nonPassiveEvent = {\n passive: false\n };\n const initEvents = EventStore();\n const dragEvents = EventStore();\n const goToNextThreshold = Limit(50, 225).constrain(percentOfView.measure(20));\n const snapForceBoost = {\n mouse: 300,\n touch: 400\n };\n const freeForceBoost = {\n mouse: 500,\n touch: 600\n };\n const baseSpeed = dragFree ? 43 : 25;\n let isMoving = false;\n let startScroll = 0;\n let startCross = 0;\n let pointerIsDown = false;\n let preventScroll = false;\n let preventClick = false;\n let isMouse = false;\n function init(emblaApi) {\n if (!watchDrag) return;\n function downIfAllowed(evt) {\n if (isBoolean(watchDrag) || watchDrag(emblaApi, evt)) down(evt);\n }\n const node = rootNode;\n initEvents.add(node, 'dragstart', evt => evt.preventDefault(), nonPassiveEvent).add(node, 'touchmove', () => undefined, nonPassiveEvent).add(node, 'touchend', () => undefined).add(node, 'touchstart', downIfAllowed).add(node, 'mousedown', downIfAllowed).add(node, 'touchcancel', up).add(node, 'contextmenu', up).add(node, 'click', click, true);\n }\n function destroy() {\n initEvents.clear();\n dragEvents.clear();\n }\n function addDragEvents() {\n const node = isMouse ? ownerDocument : rootNode;\n dragEvents.add(node, 'touchmove', move, nonPassiveEvent).add(node, 'touchend', up).add(node, 'mousemove', move, nonPassiveEvent).add(node, 'mouseup', up);\n }\n function isFocusNode(node) {\n const nodeName = node.nodeName || '';\n return focusNodes.includes(nodeName);\n }\n function forceBoost() {\n const boost = dragFree ? freeForceBoost : snapForceBoost;\n const type = isMouse ? 'mouse' : 'touch';\n return boost[type];\n }\n function allowedForce(force, targetChanged) {\n const next = index.add(mathSign(force) * -1);\n const baseForce = scrollTarget.byDistance(force, !dragFree).distance;\n if (dragFree || mathAbs(force) < goToNextThreshold) return baseForce;\n if (skipSnaps && targetChanged) return baseForce * 0.5;\n return scrollTarget.byIndex(next.get(), 0).distance;\n }\n function down(evt) {\n const isMouseEvt = isMouseEvent(evt, ownerWindow);\n isMouse = isMouseEvt;\n preventClick = dragFree && isMouseEvt && !evt.buttons && isMoving;\n isMoving = deltaAbs(target.get(), location.get()) >= 2;\n if (isMouseEvt && evt.button !== 0) return;\n if (isFocusNode(evt.target)) return;\n pointerIsDown = true;\n dragTracker.pointerDown(evt);\n scrollBody.useFriction(0).useDuration(0);\n target.set(location);\n addDragEvents();\n startScroll = dragTracker.readPoint(evt);\n startCross = dragTracker.readPoint(evt, crossAxis);\n eventHandler.emit('pointerDown');\n }\n function move(evt) {\n const isTouchEvt = !isMouseEvent(evt, ownerWindow);\n if (isTouchEvt && evt.touches.length >= 2) return up(evt);\n const lastScroll = dragTracker.readPoint(evt);\n const lastCross = dragTracker.readPoint(evt, crossAxis);\n const diffScroll = deltaAbs(lastScroll, startScroll);\n const diffCross = deltaAbs(lastCross, startCross);\n if (!preventScroll && !isMouse) {\n if (!evt.cancelable) return up(evt);\n preventScroll = diffScroll > diffCross;\n if (!preventScroll) return up(evt);\n }\n const diff = dragTracker.pointerMove(evt);\n if (diffScroll > dragThreshold) preventClick = true;\n scrollBody.useFriction(0.3).useDuration(0.75);\n animation.start();\n target.add(direction(diff));\n evt.preventDefault();\n }\n function up(evt) {\n const currentLocation = scrollTarget.byDistance(0, false);\n const targetChanged = currentLocation.index !== index.get();\n const rawForce = dragTracker.pointerUp(evt) * forceBoost();\n const force = allowedForce(direction(rawForce), targetChanged);\n const forceFactor = factorAbs(rawForce, force);\n const speed = baseSpeed - 10 * forceFactor;\n const friction = baseFriction + forceFactor / 50;\n preventScroll = false;\n pointerIsDown = false;\n dragEvents.clear();\n scrollBody.useDuration(speed).useFriction(friction);\n scrollTo.distance(force, !dragFree);\n isMouse = false;\n eventHandler.emit('pointerUp');\n }\n function click(evt) {\n if (preventClick) {\n evt.stopPropagation();\n evt.preventDefault();\n preventClick = false;\n }\n }\n function pointerDown() {\n return pointerIsDown;\n }\n const self = {\n init,\n destroy,\n pointerDown\n };\n return self;\n}\n\nfunction DragTracker(axis, ownerWindow) {\n const logInterval = 170;\n let startEvent;\n let lastEvent;\n function readTime(evt) {\n return evt.timeStamp;\n }\n function readPoint(evt, evtAxis) {\n const property = evtAxis || axis.scroll;\n const coord = `client${property === 'x' ? 'X' : 'Y'}`;\n return (isMouseEvent(evt, ownerWindow) ? evt : evt.touches[0])[coord];\n }\n function pointerDown(evt) {\n startEvent = evt;\n lastEvent = evt;\n return readPoint(evt);\n }\n function pointerMove(evt) {\n const diff = readPoint(evt) - readPoint(lastEvent);\n const expired = readTime(evt) - readTime(startEvent) > logInterval;\n lastEvent = evt;\n if (expired) startEvent = evt;\n return diff;\n }\n function pointerUp(evt) {\n if (!startEvent || !lastEvent) return 0;\n const diffDrag = readPoint(lastEvent) - readPoint(startEvent);\n const diffTime = readTime(evt) - readTime(startEvent);\n const expired = readTime(evt) - readTime(lastEvent) > logInterval;\n const force = diffDrag / diffTime;\n const isFlick = diffTime && !expired && mathAbs(force) > 0.1;\n return isFlick ? force : 0;\n }\n const self = {\n pointerDown,\n pointerMove,\n pointerUp,\n readPoint\n };\n return self;\n}\n\nfunction NodeRects() {\n function measure(node) {\n const {\n offsetTop,\n offsetLeft,\n offsetWidth,\n offsetHeight\n } = node;\n const offset = {\n top: offsetTop,\n right: offsetLeft + offsetWidth,\n bottom: offsetTop + offsetHeight,\n left: offsetLeft,\n width: offsetWidth,\n height: offsetHeight\n };\n return offset;\n }\n const self = {\n measure\n };\n return self;\n}\n\nfunction PercentOfView(viewSize) {\n function measure(n) {\n return viewSize * (n / 100);\n }\n const self = {\n measure\n };\n return self;\n}\n\nfunction ResizeHandler(container, eventHandler, ownerWindow, slides, axis, watchResize, nodeRects) {\n const observeNodes = [container].concat(slides);\n let resizeObserver;\n let containerSize;\n let slideSizes = [];\n let destroyed = false;\n function readSize(node) {\n return axis.measureSize(nodeRects.measure(node));\n }\n function init(emblaApi) {\n if (!watchResize) return;\n containerSize = readSize(container);\n slideSizes = slides.map(readSize);\n function defaultCallback(entries) {\n for (const entry of entries) {\n if (destroyed) return;\n const isContainer = entry.target === container;\n const slideIndex = slides.indexOf(entry.target);\n const lastSize = isContainer ? containerSize : slideSizes[slideIndex];\n const newSize = readSize(isContainer ? container : slides[slideIndex]);\n const diffSize = mathAbs(newSize - lastSize);\n if (diffSize >= 0.5) {\n emblaApi.reInit();\n eventHandler.emit('resize');\n break;\n }\n }\n }\n resizeObserver = new ResizeObserver(entries => {\n if (isBoolean(watchResize) || watchResize(emblaApi, entries)) {\n defaultCallback(entries);\n }\n });\n ownerWindow.requestAnimationFrame(() => {\n observeNodes.forEach(node => resizeObserver.observe(node));\n });\n }\n function destroy() {\n destroyed = true;\n if (resizeObserver) resizeObserver.disconnect();\n }\n const self = {\n init,\n destroy\n };\n return self;\n}\n\nfunction ScrollBody(location, offsetLocation, previousLocation, target, baseDuration, baseFriction) {\n let scrollVelocity = 0;\n let scrollDirection = 0;\n let scrollDuration = baseDuration;\n let scrollFriction = baseFriction;\n let rawLocation = location.get();\n let rawLocationPrevious = 0;\n function seek() {\n const displacement = target.get() - location.get();\n const isInstant = !scrollDuration;\n let scrollDistance = 0;\n if (isInstant) {\n scrollVelocity = 0;\n previousLocation.set(target);\n location.set(target);\n scrollDistance = displacement;\n } else {\n previousLocation.set(location);\n scrollVelocity += displacement / scrollDuration;\n scrollVelocity *= scrollFriction;\n rawLocation += scrollVelocity;\n location.add(scrollVelocity);\n scrollDistance = rawLocation - rawLocationPrevious;\n }\n scrollDirection = mathSign(scrollDistance);\n rawLocationPrevious = rawLocation;\n return self;\n }\n function settled() {\n const diff = target.get() - offsetLocation.get();\n return mathAbs(diff) < 0.001;\n }\n function duration() {\n return scrollDuration;\n }\n function direction() {\n return scrollDirection;\n }\n function velocity() {\n return scrollVelocity;\n }\n function useBaseDuration() {\n return useDuration(baseDuration);\n }\n function useBaseFriction() {\n return useFriction(baseFriction);\n }\n function useDuration(n) {\n scrollDuration = n;\n return self;\n }\n function useFriction(n) {\n scrollFriction = n;\n return self;\n }\n const self = {\n direction,\n duration,\n velocity,\n seek,\n settled,\n useBaseFriction,\n useBaseDuration,\n useFriction,\n useDuration\n };\n return self;\n}\n\nfunction ScrollBounds(limit, location, target, scrollBody, percentOfView) {\n const pullBackThreshold = percentOfView.measure(10);\n const edgeOffsetTolerance = percentOfView.measure(50);\n const frictionLimit = Limit(0.1, 0.99);\n let disabled = false;\n function shouldConstrain() {\n if (disabled) return false;\n if (!limit.reachedAny(target.get())) return false;\n if (!limit.reachedAny(location.get())) return false;\n return true;\n }\n function constrain(pointerDown) {\n if (!shouldConstrain()) return;\n const edge = limit.reachedMin(location.get()) ? 'min' : 'max';\n const diffToEdge = mathAbs(limit[edge] - location.get());\n const diffToTarget = target.get() - location.get();\n const friction = frictionLimit.constrain(diffToEdge / edgeOffsetTolerance);\n target.subtract(diffToTarget * friction);\n if (!pointerDown && mathAbs(diffToTarget) < pullBackThreshold) {\n target.set(limit.constrain(target.get()));\n scrollBody.useDuration(25).useBaseFriction();\n }\n }\n function toggleActive(active) {\n disabled = !active;\n }\n const self = {\n shouldConstrain,\n constrain,\n toggleActive\n };\n return self;\n}\n\nfunction ScrollContain(viewSize, contentSize, snapsAligned, containScroll, pixelTolerance) {\n const scrollBounds = Limit(-contentSize + viewSize, 0);\n const snapsBounded = measureBounded();\n const scrollContainLimit = findScrollContainLimit();\n const snapsContained = measureContained();\n function usePixelTolerance(bound, snap) {\n return deltaAbs(bound, snap) <= 1;\n }\n function findScrollContainLimit() {\n const startSnap = snapsBounded[0];\n const endSnap = arrayLast(snapsBounded);\n const min = snapsBounded.lastIndexOf(startSnap);\n const max = snapsBounded.indexOf(endSnap) + 1;\n return Limit(min, max);\n }\n function measureBounded() {\n return snapsAligned.map((snapAligned, index) => {\n const {\n min,\n max\n } = scrollBounds;\n const snap = scrollBounds.constrain(snapAligned);\n const isFirst = !index;\n const isLast = arrayIsLastIndex(snapsAligned, index);\n if (isFirst) return max;\n if (isLast) return min;\n if (usePixelTolerance(min, snap)) return min;\n if (usePixelTolerance(max, snap)) return max;\n return snap;\n }).map(scrollBound => parseFloat(scrollBound.toFixed(3)));\n }\n function measureContained() {\n if (contentSize <= viewSize + pixelTolerance) return [scrollBounds.max];\n if (containScroll === 'keepSnaps') return snapsBounded;\n const {\n min,\n max\n } = scrollContainLimit;\n return snapsBounded.slice(min, max);\n }\n const self = {\n snapsContained,\n scrollContainLimit\n };\n return self;\n}\n\nfunction ScrollLimit(contentSize, scrollSnaps, loop) {\n const max = scrollSnaps[0];\n const min = loop ? max - contentSize : arrayLast(scrollSnaps);\n const limit = Limit(min, max);\n const self = {\n limit\n };\n return self;\n}\n\nfunction ScrollLooper(contentSize, limit, location, vectors) {\n const jointSafety = 0.1;\n const min = limit.min + jointSafety;\n const max = limit.max + jointSafety;\n const {\n reachedMin,\n reachedMax\n } = Limit(min, max);\n function shouldLoop(direction) {\n if (direction === 1) return reachedMax(location.get());\n if (direction === -1) return reachedMin(location.get());\n return false;\n }\n function loop(direction) {\n if (!shouldLoop(direction)) return;\n const loopDistance = contentSize * (direction * -1);\n vectors.forEach(v => v.add(loopDistance));\n }\n const self = {\n loop\n };\n return self;\n}\n\nfunction ScrollProgress(limit) {\n const {\n max,\n length\n } = limit;\n function get(n) {\n const currentLocation = n - max;\n return length ? currentLocation / -length : 0;\n }\n const self = {\n get\n };\n return self;\n}\n\nfunction ScrollSnaps(axis, alignment, containerRect, slideRects, slidesToScroll) {\n const {\n startEdge,\n endEdge\n } = axis;\n const {\n groupSlides\n } = slidesToScroll;\n const alignments = measureSizes().map(alignment.measure);\n const snaps = measureUnaligned();\n const snapsAligned = measureAligned();\n function measureSizes() {\n return groupSlides(slideRects).map(rects => arrayLast(rects)[endEdge] - rects[0][startEdge]).map(mathAbs);\n }\n function measureUnaligned() {\n return slideRects.map(rect => containerRect[startEdge] - rect[startEdge]).map(snap => -mathAbs(snap));\n }\n function measureAligned() {\n return groupSlides(snaps).map(g => g[0]).map((snap, index) => snap + alignments[index]);\n }\n const self = {\n snaps,\n snapsAligned\n };\n return self;\n}\n\nfunction SlideRegistry(containSnaps, containScroll, scrollSnaps, scrollContainLimit, slidesToScroll, slideIndexes) {\n const {\n groupSlides\n } = slidesToScroll;\n const {\n min,\n max\n } = scrollContainLimit;\n const slideRegistry = createSlideRegistry();\n function createSlideRegistry() {\n const groupedSlideIndexes = groupSlides(slideIndexes);\n const doNotContain = !containSnaps || containScroll === 'keepSnaps';\n if (scrollSnaps.length === 1) return [slideIndexes];\n if (doNotContain) return groupedSlideIndexes;\n return groupedSlideIndexes.slice(min, max).map((group, index, groups) => {\n const isFirst = !index;\n const isLast = arrayIsLastIndex(groups, index);\n if (isFirst) {\n const range = arrayLast(groups[0]) + 1;\n return arrayFromNumber(range);\n }\n if (isLast) {\n const range = arrayLastIndex(slideIndexes) - arrayLast(groups)[0] + 1;\n return arrayFromNumber(range, arrayLast(groups)[0]);\n }\n return group;\n });\n }\n const self = {\n slideRegistry\n };\n return self;\n}\n\nfunction ScrollTarget(loop, scrollSnaps, contentSize, limit, targetVector) {\n const {\n reachedAny,\n removeOffset,\n constrain\n } = limit;\n function minDistance(distances) {\n return distances.concat().sort((a, b) => mathAbs(a) - mathAbs(b))[0];\n }\n function findTargetSnap(target) {\n const distance = loop ? removeOffset(target) : constrain(target);\n const ascDiffsToSnaps = scrollSnaps.map((snap, index) => ({\n diff: shortcut(snap - distance, 0),\n index\n })).sort((d1, d2) => mathAbs(d1.diff) - mathAbs(d2.diff));\n const {\n index\n } = ascDiffsToSnaps[0];\n return {\n index,\n distance\n };\n }\n function shortcut(target, direction) {\n const targets = [target, target + contentSize, target - contentSize];\n if (!loop) return target;\n if (!direction) return minDistance(targets);\n const matchingTargets = targets.filter(t => mathSign(t) === direction);\n if (matchingTargets.length) return minDistance(matchingTargets);\n return arrayLast(targets) - contentSize;\n }\n function byIndex(index, direction) {\n const diffToSnap = scrollSnaps[index] - targetVector.get();\n const distance = shortcut(diffToSnap, direction);\n return {\n index,\n distance\n };\n }\n function byDistance(distance, snap) {\n const target = targetVector.get() + distance;\n const {\n index,\n distance: targetSnapDistance\n } = findTargetSnap(target);\n const reachedBound = !loop && reachedAny(target);\n if (!snap || reachedBound) return {\n index,\n distance\n };\n const diffToSnap = scrollSnaps[index] - targetSnapDistance;\n const snapDistance = distance + shortcut(diffToSnap, 0);\n return {\n index,\n distance: snapDistance\n };\n }\n const self = {\n byDistance,\n byIndex,\n shortcut\n };\n return self;\n}\n\nfunction ScrollTo(animation, indexCurrent, indexPrevious, scrollBody, scrollTarget, targetVector, eventHandler) {\n function scrollTo(target) {\n const distanceDiff = target.distance;\n const indexDiff = target.index !== indexCurrent.get();\n targetVector.add(distanceDiff);\n if (distanceDiff) {\n if (scrollBody.duration()) {\n animation.start();\n } else {\n animation.update();\n animation.render(1);\n animation.update();\n }\n }\n if (indexDiff) {\n indexPrevious.set(indexCurrent.get());\n indexCurrent.set(target.index);\n eventHandler.emit('select');\n }\n }\n function distance(n, snap) {\n const target = scrollTarget.byDistance(n, snap);\n scrollTo(target);\n }\n function index(n, direction) {\n const targetIndex = indexCurrent.clone().set(n);\n const target = scrollTarget.byIndex(targetIndex.get(), direction);\n scrollTo(target);\n }\n const self = {\n distance,\n index\n };\n return self;\n}\n\nfunction SlideFocus(root, slides, slideRegistry, scrollTo, scrollBody, eventStore, eventHandler, watchFocus) {\n const focusListenerOptions = {\n passive: true,\n capture: true\n };\n let lastTabPressTime = 0;\n function init(emblaApi) {\n if (!watchFocus) return;\n function defaultCallback(index) {\n const nowTime = new Date().getTime();\n const diffTime = nowTime - lastTabPressTime;\n if (diffTime > 10) return;\n eventHandler.emit('slideFocusStart');\n root.scrollLeft = 0;\n const group = slideRegistry.findIndex(group => group.includes(index));\n if (!isNumber(group)) return;\n scrollBody.useDuration(0);\n scrollTo.index(group, 0);\n eventHandler.emit('slideFocus');\n }\n eventStore.add(document, 'keydown', registerTabPress, false);\n slides.forEach((slide, slideIndex) => {\n eventStore.add(slide, 'focus', evt => {\n if (isBoolean(watchFocus) || watchFocus(emblaApi, evt)) {\n defaultCallback(slideIndex);\n }\n }, focusListenerOptions);\n });\n }\n function registerTabPress(event) {\n if (event.code === 'Tab') lastTabPressTime = new Date().getTime();\n }\n const self = {\n init\n };\n return self;\n}\n\nfunction Vector1D(initialValue) {\n let value = initialValue;\n function get() {\n return value;\n }\n function set(n) {\n value = normalizeInput(n);\n }\n function add(n) {\n value += normalizeInput(n);\n }\n function subtract(n) {\n value -= normalizeInput(n);\n }\n function normalizeInput(n) {\n return isNumber(n) ? n : n.get();\n }\n const self = {\n get,\n set,\n add,\n subtract\n };\n return self;\n}\n\nfunction Translate(axis, container) {\n const translate = axis.scroll === 'x' ? x : y;\n const containerStyle = container.style;\n let previousTarget = null;\n let disabled = false;\n function x(n) {\n return `translate3d(${n}px,0px,0px)`;\n }\n function y(n) {\n return `translate3d(0px,${n}px,0px)`;\n }\n function to(target) {\n if (disabled) return;\n const newTarget = roundToTwoDecimals(axis.direction(target));\n if (newTarget === previousTarget) return;\n containerStyle.transform = translate(newTarget);\n previousTarget = newTarget;\n }\n function toggleActive(active) {\n disabled = !active;\n }\n function clear() {\n if (disabled) return;\n containerStyle.transform = '';\n if (!container.getAttribute('style')) container.removeAttribute('style');\n }\n const self = {\n clear,\n to,\n toggleActive\n };\n return self;\n}\n\nfunction SlideLooper(axis, viewSize, contentSize, slideSizes, slideSizesWithGaps, snaps, scrollSnaps, location, slides) {\n const roundingSafety = 0.5;\n const ascItems = arrayKeys(slideSizesWithGaps);\n const descItems = arrayKeys(slideSizesWithGaps).reverse();\n const loopPoints = startPoints().concat(endPoints());\n function removeSlideSizes(indexes, from) {\n return indexes.reduce((a, i) => {\n return a - slideSizesWithGaps[i];\n }, from);\n }\n function slidesInGap(indexes, gap) {\n return indexes.reduce((a, i) => {\n const remainingGap = removeSlideSizes(a, gap);\n return remainingGap > 0 ? a.concat([i]) : a;\n }, []);\n }\n function findSlideBounds(offset) {\n return snaps.map((snap, index) => ({\n start: snap - slideSizes[index] + roundingSafety + offset,\n end: snap + viewSize - roundingSafety + offset\n }));\n }\n function findLoopPoints(indexes, offset, isEndEdge) {\n const slideBounds = findSlideBounds(offset);\n return indexes.map(index => {\n const initial = isEndEdge ? 0 : -contentSize;\n const altered = isEndEdge ? contentSize : 0;\n const boundEdge = isEndEdge ? 'end' : 'start';\n const loopPoint = slideBounds[index][boundEdge];\n return {\n index,\n loopPoint,\n slideLocation: Vector1D(-1),\n translate: Translate(axis, slides[index]),\n target: () => location.get() > loopPoint ? initial : altered\n };\n });\n }\n function startPoints() {\n const gap = scrollSnaps[0];\n const indexes = slidesInGap(descItems, gap);\n return findLoopPoints(indexes, contentSize, false);\n }\n function endPoints() {\n const gap = viewSize - scrollSnaps[0] - 1;\n const indexes = slidesInGap(ascItems, gap);\n return findLoopPoints(indexes, -contentSize, true);\n }\n function canLoop() {\n return loopPoints.every(({\n index\n }) => {\n const otherIndexes = ascItems.filter(i => i !== index);\n return removeSlideSizes(otherIndexes, viewSize) <= 0.1;\n });\n }\n function loop() {\n loopPoints.forEach(loopPoint => {\n const {\n target,\n translate,\n slideLocation\n } = loopPoint;\n const shiftLocation = target();\n if (shiftLocation === slideLocation.get()) return;\n translate.to(shiftLocation);\n slideLocation.set(shiftLocation);\n });\n }\n function clear() {\n loopPoints.forEach(loopPoint => loopPoint.translate.clear());\n }\n const self = {\n canLoop,\n clear,\n loop,\n loopPoints\n };\n return self;\n}\n\nfunction SlidesHandler(container, eventHandler, watchSlides) {\n let mutationObserver;\n let destroyed = false;\n function init(emblaApi) {\n if (!watchSlides) return;\n function defaultCallback(mutations) {\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n emblaApi.reInit();\n eventHandler.emit('slidesChanged');\n break;\n }\n }\n }\n mutationObserver = new MutationObserver(mutations => {\n if (destroyed) return;\n if (isBoolean(watchSlides) || watchSlides(emblaApi, mutations)) {\n defaultCallback(mutations);\n }\n });\n mutationObserver.observe(container, {\n childList: true\n });\n }\n function destroy() {\n if (mutationObserver) mutationObserver.disconnect();\n destroyed = true;\n }\n const self = {\n init,\n destroy\n };\n return self;\n}\n\nfunction SlidesInView(container, slides, eventHandler, threshold) {\n const intersectionEntryMap = {};\n let inViewCache = null;\n let notInViewCache = null;\n let intersectionObserver;\n let destroyed = false;\n function init() {\n intersectionObserver = new IntersectionObserver(entries => {\n if (destroyed) return;\n entries.forEach(entry => {\n const index = slides.indexOf(entry.target);\n intersectionEntryMap[index] = entry;\n });\n inViewCache = null;\n notInViewCache = null;\n eventHandler.emit('slidesInView');\n }, {\n root: container.parentElement,\n threshold\n });\n slides.forEach(slide => intersectionObserver.observe(slide));\n }\n function destroy() {\n if (intersectionObserver) intersectionObserver.disconnect();\n destroyed = true;\n }\n function createInViewList(inView) {\n return objectKeys(intersectionEntryMap).reduce((list, slideIndex) => {\n const index = parseInt(slideIndex);\n const {\n isIntersecting\n } = intersectionEntryMap[index];\n const inViewMatch = inView && isIntersecting;\n const notInViewMatch = !inView && !isIntersecting;\n if (inViewMatch || notInViewMatch) list.push(index);\n return list;\n }, []);\n }\n function get(inView = true) {\n if (inView && inViewCache) return inViewCache;\n if (!inView && notInViewCache) return notInViewCache;\n const slideIndexes = createInViewList(inView);\n if (inView) inViewCache = slideIndexes;\n if (!inView) notInViewCache = slideIndexes;\n return slideIndexes;\n }\n const self = {\n init,\n destroy,\n get\n };\n return self;\n}\n\nfunction SlideSizes(axis, containerRect, slideRects, slides, readEdgeGap, ownerWindow) {\n const {\n measureSize,\n startEdge,\n endEdge\n } = axis;\n const withEdgeGap = slideRects[0] && readEdgeGap;\n const startGap = measureStartGap();\n const endGap = measureEndGap();\n const slideSizes = slideRects.map(measureSize);\n const slideSizesWithGaps = measureWithGaps();\n function measureStartGap() {\n if (!withEdgeGap) return 0;\n const slideRect = slideRects[0];\n return mathAbs(containerRect[startEdge] - slideRect[startEdge]);\n }\n function measureEndGap() {\n if (!withEdgeGap) return 0;\n const style = ownerWindow.getComputedStyle(arrayLast(slides));\n return parseFloat(style.getPropertyValue(`margin-${endEdge}`));\n }\n function measureWithGaps() {\n return slideRects.map((rect, index, rects) => {\n const isFirst = !index;\n const isLast = arrayIsLastIndex(rects, index);\n if (isFirst) return slideSizes[index] + startGap;\n if (isLast) return slideSizes[index] + endGap;\n return rects[index + 1][startEdge] - rect[startEdge];\n }).map(mathAbs);\n }\n const self = {\n slideSizes,\n slideSizesWithGaps,\n startGap,\n endGap\n };\n return self;\n}\n\nfunction SlidesToScroll(axis, viewSize, slidesToScroll, loop, containerRect, slideRects, startGap, endGap, pixelTolerance) {\n const {\n startEdge,\n endEdge,\n direction\n } = axis;\n const groupByNumber = isNumber(slidesToScroll);\n function byNumber(array, groupSize) {\n return arrayKeys(array).filter(i => i % groupSize === 0).map(i => array.slice(i, i + groupSize));\n }\n function bySize(array) {\n if (!array.length) return [];\n return arrayKeys(array).reduce((groups, rectB, index) => {\n const rectA = arrayLast(groups) || 0;\n const isFirst = rectA === 0;\n const isLast = rectB === arrayLastIndex(array);\n const edgeA = containerRect[startEdge] - slideRects[rectA][startEdge];\n const edgeB = containerRect[startEdge] - slideRects[rectB][endEdge];\n const gapA = !loop && isFirst ? direction(startGap) : 0;\n const gapB = !loop && isLast ? direction(endGap) : 0;\n const chunkSize = mathAbs(edgeB - gapB - (edgeA + gapA));\n if (index && chunkSize > viewSize + pixelTolerance) groups.push(rectB);\n if (isLast) groups.push(array.length);\n return groups;\n }, []).map((currentSize, index, groups) => {\n const previousSize = Math.max(groups[index - 1] || 0);\n return array.slice(previousSize, currentSize);\n });\n }\n function groupSlides(array) {\n return groupByNumber ? byNumber(array, slidesToScroll) : bySize(array);\n }\n const self = {\n groupSlides\n };\n return self;\n}\n\nfunction Engine(root, container, slides, ownerDocument, ownerWindow, options, eventHandler) {\n // Options\n const {\n align,\n axis: scrollAxis,\n direction,\n startIndex,\n loop,\n duration,\n dragFree,\n dragThreshold,\n inViewThreshold,\n slidesToScroll: groupSlides,\n skipSnaps,\n containScroll,\n watchResize,\n watchSlides,\n watchDrag,\n watchFocus\n } = options;\n // Measurements\n const pixelTolerance = 2;\n const nodeRects = NodeRects();\n const containerRect = nodeRects.measure(container);\n const slideRects = slides.map(nodeRects.measure);\n const axis = Axis(scrollAxis, direction);\n const viewSize = axis.measureSize(containerRect);\n const percentOfView = PercentOfView(viewSize);\n const alignment = Alignment(align, viewSize);\n const containSnaps = !loop && !!containScroll;\n const readEdgeGap = loop || !!containScroll;\n const {\n slideSizes,\n slideSizesWithGaps,\n startGap,\n endGap\n } = SlideSizes(axis, containerRect, slideRects, slides, readEdgeGap, ownerWindow);\n const slidesToScroll = SlidesToScroll(axis, viewSize, groupSlides, loop, containerRect, slideRects, startGap, endGap, pixelTolerance);\n const {\n snaps,\n snapsAligned\n } = ScrollSnaps(axis, alignment, containerRect, slideRects, slidesToScroll);\n const contentSize = -arrayLast(snaps) + arrayLast(slideSizesWithGaps);\n const {\n snapsContained,\n scrollContainLimit\n } = ScrollContain(viewSize, contentSize, snapsAligned, containScroll, pixelTolerance);\n const scrollSnaps = containSnaps ? snapsContained : snapsAligned;\n const {\n limit\n } = ScrollLimit(contentSize, scrollSnaps, loop);\n // Indexes\n const index = Counter(arrayLastIndex(scrollSnaps), startIndex, loop);\n const indexPrevious = index.clone();\n const slideIndexes = arrayKeys(slides);\n // Animation\n const update = ({\n dragHandler,\n scrollBody,\n scrollBounds,\n options: {\n loop\n }\n }) => {\n if (!loop) scrollBounds.constrain(dragHandler.pointerDown());\n scrollBody.seek();\n };\n const render = ({\n scrollBody,\n translate,\n location,\n offsetLocation,\n previousLocation,\n scrollLooper,\n slideLooper,\n dragHandler,\n animation,\n eventHandler,\n scrollBounds,\n options: {\n loop\n }\n }, alpha) => {\n const shouldSettle = scrollBody.settled();\n const withinBounds = !scrollBounds.shouldConstrain();\n const hasSettled = loop ? shouldSettle : shouldSettle && withinBounds;\n const hasSettledAndIdle = hasSettled && !dragHandler.pointerDown();\n if (hasSettledAndIdle) animation.stop();\n const interpolatedLocation = location.get() * alpha + previousLocation.get() * (1 - alpha);\n offsetLocation.set(interpolatedLocation);\n if (loop) {\n scrollLooper.loop(scrollBody.direction());\n slideLooper.loop();\n }\n translate.to(offsetLocation.get());\n if (hasSettledAndIdle) eventHandler.emit('settle');\n if (!hasSettled) eventHandler.emit('scroll');\n };\n const animation = Animations(ownerDocument, ownerWindow, () => update(engine), alpha => render(engine, alpha));\n // Shared\n const friction = 0.68;\n const startLocation = scrollSnaps[index.get()];\n const location = Vector1D(startLocation);\n const previousLocation = Vector1D(startLocation);\n const offsetLocation = Vector1D(startLocation);\n const target = Vector1D(startLocation);\n const scrollBody = ScrollBody(location, offsetLocation, previousLocation, target, duration, friction);\n const scrollTarget = ScrollTarget(loop, scrollSnaps, contentSize, limit, target);\n const scrollTo = ScrollTo(animation, index, indexPrevious, scrollBody, scrollTarget, target, eventHandler);\n const scrollProgress = ScrollProgress(limit);\n const eventStore = EventStore();\n const slidesInView = SlidesInView(container, slides, eventHandler, inViewThreshold);\n const {\n slideRegistry\n } = SlideRegistry(containSnaps, containScroll, scrollSnaps, scrollContainLimit, slidesToScroll, slideIndexes);\n const slideFocus = SlideFocus(root, slides, slideRegistry, scrollTo, scrollBody, eventStore, eventHandler, watchFocus);\n // Engine\n const engine = {\n ownerDocument,\n ownerWindow,\n eventHandler,\n containerRect,\n slideRects,\n animation,\n axis,\n dragHandler: DragHandler(axis, root, ownerDocument, ownerWindow, target, DragTracker(axis, ownerWindow), location, animation, scrollTo, scrollBody, scrollTarget, index, eventHandler, percentOfView, dragFree, dragThreshold, skipSnaps, friction, watchDrag),\n eventStore,\n percentOfView,\n index,\n indexPrevious,\n limit,\n location,\n offsetLocation,\n previousLocation,\n options,\n resizeHandler: ResizeHandler(container, eventHandler, ownerWindow, slides, axis, watchResize, nodeRects),\n scrollBody,\n scrollBounds: ScrollBounds(limit, offsetLocation, target, scrollBody, percentOfView),\n scrollLooper: ScrollLooper(contentSize, limit, offsetLocation, [location, offsetLocation, previousLocation, target]),\n scrollProgress,\n scrollSnapList: scrollSnaps.map(scrollProgress.get),\n scrollSnaps,\n scrollTarget,\n scrollTo,\n slideLooper: SlideLooper(axis, viewSize, contentSize, slideSizes, slideSizesWithGaps, snaps, scrollSnaps, offsetLocation, slides),\n slideFocus,\n slidesHandler: SlidesHandler(container, eventHandler, watchSlides),\n slidesInView,\n slideIndexes,\n slideRegistry,\n slidesToScroll,\n target,\n translate: Translate(axis, container)\n };\n return engine;\n}\n\nfunction EventHandler() {\n let listeners = {};\n let api;\n function init(emblaApi) {\n api = emblaApi;\n }\n function getListeners(evt) {\n return listeners[evt] || [];\n }\n function emit(evt) {\n getListeners(evt).forEach(e => e(api, evt));\n return self;\n }\n function on(evt, cb) {\n listeners[evt] = getListeners(evt).concat([cb]);\n return self;\n }\n function off(evt, cb) {\n listeners[evt] = getListeners(evt).filter(e => e !== cb);\n return self;\n }\n function clear() {\n listeners = {};\n }\n const self = {\n init,\n emit,\n off,\n on,\n clear\n };\n return self;\n}\n\nconst defaultOptions = {\n align: 'center',\n axis: 'x',\n container: null,\n slides: null,\n containScroll: 'trimSnaps',\n direction: 'ltr',\n slidesToScroll: 1,\n inViewThreshold: 0,\n breakpoints: {},\n dragFree: false,\n dragThreshold: 10,\n loop: false,\n skipSnaps: false,\n duration: 25,\n startIndex: 0,\n active: true,\n watchDrag: true,\n watchResize: true,\n watchSlides: true,\n watchFocus: true\n};\n\nfunction OptionsHandler(ownerWindow) {\n function mergeOptions(optionsA, optionsB) {\n return objectsMergeDeep(optionsA, optionsB || {});\n }\n function optionsAtMedia(options) {\n const optionsAtMedia = options.breakpoints || {};\n const matchedMediaOptions = objectKeys(optionsAtMedia).filter(media => ownerWindow.matchMedia(media).matches).map(media => optionsAtMedia[media]).reduce((a, mediaOption) => mergeOptions(a, mediaOption), {});\n return mergeOptions(options, matchedMediaOptions);\n }\n function optionsMediaQueries(optionsList) {\n return optionsList.map(options => objectKeys(options.breakpoints || {})).reduce((acc, mediaQueries) => acc.concat(mediaQueries), []).map(ownerWindow.matchMedia);\n }\n const self = {\n mergeOptions,\n optionsAtMedia,\n optionsMediaQueries\n };\n return self;\n}\n\nfunction PluginsHandler(optionsHandler) {\n let activePlugins = [];\n function init(emblaApi, plugins) {\n activePlugins = plugins.filter(({\n options\n }) => optionsHandler.optionsAtMedia(options).active !== false);\n activePlugins.forEach(plugin => plugin.init(emblaApi, optionsHandler));\n return plugins.reduce((map, plugin) => Object.assign(map, {\n [plugin.name]: plugin\n }), {});\n }\n function destroy() {\n activePlugins = activePlugins.filter(plugin => plugin.destroy());\n }\n const self = {\n init,\n destroy\n };\n return self;\n}\n\nfunction EmblaCarousel(root, userOptions, userPlugins) {\n const ownerDocument = root.ownerDocument;\n const ownerWindow = ownerDocument.defaultView;\n const optionsHandler = OptionsHandler(ownerWindow);\n const pluginsHandler = PluginsHandler(optionsHandler);\n const mediaHandlers = EventStore();\n const eventHandler = EventHandler();\n const {\n mergeOptions,\n optionsAtMedia,\n optionsMediaQueries\n } = optionsHandler;\n const {\n on,\n off,\n emit\n } = eventHandler;\n const reInit = reActivate;\n let destroyed = false;\n let engine;\n let optionsBase = mergeOptions(defaultOptions, EmblaCarousel.globalOptions);\n let options = mergeOptions(optionsBase);\n let pluginList = [];\n let pluginApis;\n let container;\n let slides;\n function storeElements() {\n const {\n container: userContainer,\n slides: userSlides\n } = options;\n const customContainer = isString(userContainer) ? root.querySelector(userContainer) : userContainer;\n container = customContainer || root.children[0];\n const customSlides = isString(userSlides) ? container.querySelectorAll(userSlides) : userSlides;\n slides = [].slice.call(customSlides || container.children);\n }\n function createEngine(options) {\n const engine = Engine(root, container, slides, ownerDocument, ownerWindow, options, eventHandler);\n if (options.loop && !engine.slideLooper.canLoop()) {\n const optionsWithoutLoop = Object.assign({}, options, {\n loop: false\n });\n return createEngine(optionsWithoutLoop);\n }\n return engine;\n }\n function activate(withOptions, withPlugins) {\n if (destroyed) return;\n optionsBase = mergeOptions(optionsBase, withOptions);\n options = optionsAtMedia(optionsBase);\n pluginList = withPlugins || pluginList;\n storeElements();\n engine = createEngine(options);\n optionsMediaQueries([optionsBase, ...pluginList.map(({\n options\n }) => options)]).forEach(query => mediaHandlers.add(query, 'change', reActivate));\n if (!options.active) return;\n engine.translate.to(engine.location.get());\n engine.animation.init();\n engine.slidesInView.init();\n engine.slideFocus.init(self);\n engine.eventHandler.init(self);\n engine.resizeHandler.init(self);\n engine.slidesHandler.init(self);\n if (engine.options.loop) engine.slideLooper.loop();\n if (container.offsetParent && slides.length) engine.dragHandler.init(self);\n pluginApis = pluginsHandler.init(self, pluginList);\n }\n function reActivate(withOptions, withPlugins) {\n const startIndex = selectedScrollSnap();\n deActivate();\n activate(mergeOptions({\n startIndex\n }, withOptions), withPlugins);\n eventHandler.emit('reInit');\n }\n function deActivate() {\n engine.dragHandler.destroy();\n engine.eventStore.clear();\n engine.translate.clear();\n engine.slideLooper.clear();\n engine.resizeHandler.destroy();\n engine.slidesHandler.destroy();\n engine.slidesInView.destroy();\n engine.animation.destroy();\n pluginsHandler.destroy();\n mediaHandlers.clear();\n }\n function destroy() {\n if (destroyed) return;\n destroyed = true;\n mediaHandlers.clear();\n deActivate();\n eventHandler.emit('destroy');\n eventHandler.clear();\n }\n function scrollTo(index, jump, direction) {\n if (!options.active || destroyed) return;\n engine.scrollBody.useBaseFriction().useDuration(jump === true ? 0 : options.duration);\n engine.scrollTo.index(index, direction || 0);\n }\n function scrollNext(jump) {\n const next = engine.index.add(1).get();\n scrollTo(next, jump, -1);\n }\n function scrollPrev(jump) {\n const prev = engine.index.add(-1).get();\n scrollTo(prev, jump, 1);\n }\n function canScrollNext() {\n const next = engine.index.add(1).get();\n return next !== selectedScrollSnap();\n }\n function canScrollPrev() {\n const prev = engine.index.add(-1).get();\n return prev !== selectedScrollSnap();\n }\n function scrollSnapList() {\n return engine.scrollSnapList;\n }\n function scrollProgress() {\n return engine.scrollProgress.get(engine.offsetLocation.get());\n }\n function selectedScrollSnap() {\n return engine.index.get();\n }\n function previousScrollSnap() {\n return engine.indexPrevious.get();\n }\n function slidesInView() {\n return engine.slidesInView.get();\n }\n function slidesNotInView() {\n return engine.slidesInView.get(false);\n }\n function plugins() {\n return pluginApis;\n }\n function internalEngine() {\n return engine;\n }\n function rootNode() {\n return root;\n }\n function containerNode() {\n return container;\n }\n function slideNodes() {\n return slides;\n }\n const self = {\n canScrollNext,\n canScrollPrev,\n containerNode,\n internalEngine,\n destroy,\n off,\n on,\n emit,\n plugins,\n previousScrollSnap,\n reInit,\n rootNode,\n scrollNext,\n scrollPrev,\n scrollProgress,\n scrollSnapList,\n scrollTo,\n selectedScrollSnap,\n slideNodes,\n slidesInView,\n slidesNotInView\n };\n activate(userOptions, userPlugins);\n setTimeout(() => eventHandler.emit('init'), 0);\n return self;\n}\nEmblaCarousel.globalOptions = undefined;\n\nexport { EmblaCarousel as default };\n//# sourceMappingURL=embla-carousel.esm.js.map\n","const defaultOptions = {\n active: true,\n breakpoints: {},\n delay: 4000,\n jump: false,\n playOnInit: true,\n stopOnFocusIn: true,\n stopOnInteraction: true,\n stopOnMouseEnter: false,\n stopOnLastSnap: false,\n rootNode: null\n};\n\nfunction normalizeDelay(emblaApi, delay) {\n const scrollSnaps = emblaApi.scrollSnapList();\n if (typeof delay === 'number') {\n return scrollSnaps.map(() => delay);\n }\n return delay(scrollSnaps, emblaApi);\n}\nfunction getAutoplayRootNode(emblaApi, rootNode) {\n const emblaRootNode = emblaApi.rootNode();\n return rootNode && rootNode(emblaRootNode) || emblaRootNode;\n}\n\nfunction Autoplay(userOptions = {}) {\n let options;\n let emblaApi;\n let destroyed;\n let delay;\n let timerStartTime = null;\n let timerId = 0;\n let autoplayActive = false;\n let mouseIsOver = false;\n let playOnDocumentVisible = false;\n let jump = false;\n function init(emblaApiInstance, optionsHandler) {\n emblaApi = emblaApiInstance;\n const {\n mergeOptions,\n optionsAtMedia\n } = optionsHandler;\n const optionsBase = mergeOptions(defaultOptions, Autoplay.globalOptions);\n const allOptions = mergeOptions(optionsBase, userOptions);\n options = optionsAtMedia(allOptions);\n if (emblaApi.scrollSnapList().length <= 1) return;\n jump = options.jump;\n destroyed = false;\n delay = normalizeDelay(emblaApi, options.delay);\n const {\n eventStore,\n ownerDocument\n } = emblaApi.internalEngine();\n const isDraggable = !!emblaApi.internalEngine().options.watchDrag;\n const root = getAutoplayRootNode(emblaApi, options.rootNode);\n eventStore.add(ownerDocument, 'visibilitychange', visibilityChange);\n if (isDraggable) {\n emblaApi.on('pointerDown', pointerDown);\n }\n if (isDraggable && !options.stopOnInteraction) {\n emblaApi.on('pointerUp', pointerUp);\n }\n if (options.stopOnMouseEnter) {\n eventStore.add(root, 'mouseenter', mouseEnter);\n }\n if (options.stopOnMouseEnter && !options.stopOnInteraction) {\n eventStore.add(root, 'mouseleave', mouseLeave);\n }\n if (options.stopOnFocusIn) {\n emblaApi.on('slideFocusStart', stopAutoplay);\n }\n if (options.stopOnFocusIn && !options.stopOnInteraction) {\n eventStore.add(emblaApi.containerNode(), 'focusout', startAutoplay);\n }\n if (options.playOnInit) startAutoplay();\n }\n function destroy() {\n emblaApi.off('pointerDown', pointerDown).off('pointerUp', pointerUp).off('slideFocusStart', stopAutoplay);\n stopAutoplay();\n destroyed = true;\n autoplayActive = false;\n }\n function setTimer() {\n const {\n ownerWindow\n } = emblaApi.internalEngine();\n ownerWindow.clearTimeout(timerId);\n timerId = ownerWindow.setTimeout(next, delay[emblaApi.selectedScrollSnap()]);\n timerStartTime = new Date().getTime();\n emblaApi.emit('autoplay:timerset');\n }\n function clearTimer() {\n const {\n ownerWindow\n } = emblaApi.internalEngine();\n ownerWindow.clearTimeout(timerId);\n timerId = 0;\n timerStartTime = null;\n emblaApi.emit('autoplay:timerstopped');\n }\n function startAutoplay() {\n if (destroyed) return;\n if (documentIsHidden()) {\n playOnDocumentVisible = true;\n return;\n }\n if (!autoplayActive) emblaApi.emit('autoplay:play');\n setTimer();\n autoplayActive = true;\n }\n function stopAutoplay() {\n if (destroyed) return;\n if (autoplayActive) emblaApi.emit('autoplay:stop');\n clearTimer();\n autoplayActive = false;\n }\n function visibilityChange() {\n if (documentIsHidden()) {\n playOnDocumentVisible = autoplayActive;\n return stopAutoplay();\n }\n if (playOnDocumentVisible) startAutoplay();\n }\n function documentIsHidden() {\n const {\n ownerDocument\n } = emblaApi.internalEngine();\n return ownerDocument.visibilityState === 'hidden';\n }\n function pointerDown() {\n if (!mouseIsOver) stopAutoplay();\n }\n function pointerUp() {\n if (!mouseIsOver) startAutoplay();\n }\n function mouseEnter() {\n mouseIsOver = true;\n stopAutoplay();\n }\n function mouseLeave() {\n mouseIsOver = false;\n startAutoplay();\n }\n function play(jumpOverride) {\n if (typeof jumpOverride !== 'undefined') jump = jumpOverride;\n startAutoplay();\n }\n function stop() {\n if (autoplayActive) stopAutoplay();\n }\n function reset() {\n if (autoplayActive) startAutoplay();\n }\n function isPlaying() {\n return autoplayActive;\n }\n function next() {\n const {\n index\n } = emblaApi.internalEngine();\n const nextIndex = index.clone().add(1).get();\n const lastIndex = emblaApi.scrollSnapList().length - 1;\n const kill = options.stopOnLastSnap && nextIndex === lastIndex;\n if (emblaApi.canScrollNext()) {\n emblaApi.scrollNext(jump);\n } else {\n emblaApi.scrollTo(0, jump);\n }\n emblaApi.emit('autoplay:select');\n if (kill) return stopAutoplay();\n startAutoplay();\n }\n function timeUntilNext() {\n if (!timerStartTime) return null;\n const currentDelay = delay[emblaApi.selectedScrollSnap()];\n const timePastSinceStart = new Date().getTime() - timerStartTime;\n return currentDelay - timePastSinceStart;\n }\n const self = {\n name: 'autoplay',\n options: userOptions,\n init,\n destroy,\n play,\n stop,\n reset,\n isPlaying,\n timeUntilNext\n };\n return self;\n}\nAutoplay.globalOptions = undefined;\n\nexport { Autoplay as default };\n//# sourceMappingURL=embla-carousel-autoplay.esm.js.map\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nfunction*o(o,f){if(void 0!==o){let i=0;for(const t of o)yield f(t,i++)}}export{o as map};\n//# sourceMappingURL=map.js.map\n",":host {\n --slide-height: 19rem;\n --slide-size: 100%;\n --slide-gap: 0;\n\n --button-size: 48px;\n --button-arrow-size: 20px;\n --button-arrow-color: #4b5563;\n --button-offset: 8px;\n --button-border-color: #e5e7eb;\n --button-border-radius: 8px;\n --button-bg: rgba(255, 255, 255, 0.8);\n --button-color: inherit;\n --button-box-shadow-hover: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n\n --dot-color: #9ca3af;\n --dot-color-active: #111827;\n --dot-margin: 0.5rem 0;\n\n --scrollbar-color: #d1d5db transparent;\n\n display: block;\n /* Note: moving this elsewhere (e.g wrapper) may bug the container translate position */\n position: relative;\n container-type: inline-size;\n}\n\n:host([single]) {\n --slide-size: 100%;\n --slide-gap: 0;\n}\n\n:host([axis='y']) .container {\n flex-direction: column;\n max-height: var(--slide-height);\n}\n\n:host([axis='y']) .viewport {\n max-height: var(--slide-height);\n}\n\n.viewport {\n overflow: hidden;\n}\n\n:host([with-scrollbar]) .viewport {\n overflow-x: scroll;\n scrollbar-color: var(--scrollbar-color); /* progress / track */\n scrollbar-gutter: stable both-edges;\n scrollbar-width: thin;\n}\n\n.container {\n backface-visibility: hidden;\n display: flex;\n gap: var(--slide-gap);\n touch-action: pan-y pinch-zoom;\n}\n\n::slotted(l-carousel-item) {\n flex: 0 0 var(--slide-size);\n min-width: 0;\n}\n\n/*\n ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬\n SCROLL BUTTONS\n ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬\n */\n.scroll-buttons--inside {\n position: absolute;\n inset: 0;\n pointer-events: none;\n}\n\n.scroll-buttons--outside {\n display: flex;\n gap: 8px;\n justify-content: end;\n padding-block: 8px;\n}\n\n.scroll-buttons--disabled,\n.inactive .scroll-buttons {\n display: none;\n}\n\n.button-next,\n.button-previous,\n.button-fullscreen {\n display: flex;\n align-items: center;\n justify-content: center;\n appearance: none;\n touch-action: manipulation;\n border: 1px solid var(--button-border-color);\n border-radius: var(--button-border-radius);\n width: var(--button-size);\n height: var(--button-size);\n background-color: var(--button-bg);\n color: var(--button-color);\n cursor: pointer;\n pointer-events: auto;\n -webkit-tap-highlight-color: rgba(49, 49, 49, 0.5);\n}\n\n.scroll-buttons--inside .button-previous,\n.scroll-buttons--inside .button-next,\n.button-fullscreen {\n position: absolute;\n top: calc(50% - (var(--button-size) / 2));\n z-index: 1;\n}\n\n.scroll-buttons--inside .button-previous {\n left: var(--button-offset);\n}\n\n.scroll-buttons--inside .button-next {\n right: var(--button-offset);\n}\n\n.scroll-buttons--inside .button:disabled {\n visibility: hidden;\n}\n\n.button:disabled {\n cursor: not-allowed;\n pointer-events: none;\n opacity: 0.4;\n}\n\n.button-fullscreen {\n border-radius: 4px;\n right: var(--button-offset);\n top: var(--button-offset);\n width: calc(var(--button-size) * 0.75);\n height: calc(var(--button-size) * 0.75);\n}\n\n@container (min-width: 640px) {\n .button-fullscreen {\n width: var(--button-size);\n height: var(--button-size);\n }\n}\n\n@media (hover: hover) {\n .button:hover:not(:disabled) {\n box-shadow: var(--button-box-shadow-hover);\n }\n}\n\n.button svg {\n width: var(--button-arrow-size);\n height: var(--button-arrow-size);\n color: var(--button-arrow-color);\n}\n\n/*\n ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬\n DOTS\n ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬\n */\n\n.dots {\n display: flex;\n justify-content: center;\n margin: var(--dot-margin);\n}\n\n.dot {\n appearance: none;\n display: inline-flex;\n align-items: center;\n justify-items: center;\n touch-action: manipulation;\n background: none;\n padding-inline: 0.25rem;\n padding-block: 0.5rem;\n border: 0;\n cursor: pointer;\n}\n\n.dot--bar i {\n background: var(--dot-color);\n height: 0.125rem;\n width: 1rem;\n}\n\n.dot--selected i {\n background: var(--dot-color-active);\n}\n\n.dot--circle i {\n display: inline-block;\n width: 10px;\n height: 10px;\n border-radius: 8px;\n border: 2px solid var(--dot-color-active);\n}\n\n.dot--circle.dot--selected i {\n width: 30px;\n}\n","import type { EmblaCarouselType, EmblaOptionsType } from 'embla-carousel';\nimport EmblaCarousel from 'embla-carousel';\n\ntype AxisOptionType = 'x' | 'y';\ntype AlignmentOptionType =\n | 'start'\n | 'center'\n | 'end'\n | ((viewSize: number, snapSize: number, index: number) => number);\ntype SlidesToScrollOptionType = 'auto' | number;\ntype ScrollContainOptionType = 'trimSnaps' | 'keepSnaps' | false;\nimport Autoplay from 'embla-carousel-autoplay';\nimport { html, unsafeCSS, type PropertyValues, type CSSResultGroup } from 'lit';\nimport { property, query, queryAll } from 'lit/decorators.js';\nimport { map } from 'lit/directives/map.js';\nimport { LuxenElement } from '../../shared/luxen-element';\nimport hostStyles from '../../shared/styles/host.styles';\nimport rawStyles from './carousel.css?inline';\n\nconst styles = unsafeCSS(rawStyles);\n\n/**\n * Carousel custom element based on Embla Carousel.\n *\n * @csspart viewport - The carousel viewport container.\n * @csspart container - The slides container slot.\n * @csspart scroll-buttons - The scroll buttons wrapper.\n * @csspart button - Any navigation button.\n * @csspart button-previous - The previous slide navigation button.\n * @csspart button-next - The next slide navigation button.\n * @csspart button-dot - Any dot navigation button.\n * @csspart dots - The dots navigation wrapper.\n * @csspart button-fullscreen - The fullscreen button.\n * @csspart button-icon - Any button icon SVG.\n *\n * @cssproperty --slide-height - Height of slides in vertical axis mode.\n * @cssproperty --slide-size - Width of each slide (e.g. `100%`, `calc(100% / 3)`).\n * @cssproperty --slide-gap - Gap between slides.\n * @cssproperty --button-size - Size of navigation buttons.\n * @cssproperty --button-arrow-size - Size of arrow icons inside buttons.\n * @cssproperty --button-arrow-color - Color of arrow icons.\n * @cssproperty --button-offset - Offset of inside-positioned buttons from edges.\n * @cssproperty --button-border-color - Border color of buttons.\n * @cssproperty --button-border-radius - Border radius of buttons.\n * @cssproperty --button-bg - Background color of buttons.\n * @cssproperty --button-color - Text/icon color of buttons.\n * @cssproperty --dot-color - Color of inactive dots.\n * @cssproperty --dot-color-active - Color of active dot.\n * @cssproperty --dot-margin - Margin around dots container.\n */\nexport class LuxenCarousel extends LuxenElement {\n static override styles: CSSResultGroup = [hostStyles, styles];\n\n embla!: EmblaCarouselType;\n\n /**\n * Choose a delay between transitions in milliseconds (default: 4000).\n */\n @property({ type: Number, reflect: true })\n accessor autoplay = 0;\n\n /**\n * Configure autoplay options.\n *\n * @link https://www.embla-carousel.com/plugins/autoplay/#options\n */\n @property({ type: Object, attribute: 'autoplay-options' })\n accessor autoplayOptions: any;\n\n /**\n * Choose scroll axis between x and y.\n *\n * @link https://www.embla-carousel.com/api/options/#axis\n */\n @property()\n accessor axis: AxisOptionType = 'x';\n\n /**\n * Align the slides relative to the carousel viewport.\n *\n * @link https://www.embla-carousel.com/api/options/#align\n */\n @property()\n accessor align: AlignmentOptionType = 'start';\n\n /**\n * Breakpoint overrides for options.\n */\n @property({ type: Object, reflect: true })\n accessor breakpoints: any = {};\n\n /**\n * Enables infinite looping.\n *\n * @link https://www.embla-carousel.com/api/options/#loop\n */\n @property({ type: Boolean })\n accessor loop = false;\n\n /**\n * Enables momentum scrolling (drag free).\n *\n * @link https://www.embla-carousel.com/api/options/#dragfree\n */\n @property({ type: Boolean, attribute: 'drag-free' })\n accessor dragFree = false;\n\n /**\n * Set scroll duration when triggered by API methods.\n *\n * @link https://www.embla-carousel.com/api/options/#duration\n */\n @property({ type: Number })\n accessor duration = 20;\n\n /**\n * Allow skipping scroll snaps on vigorous drag.\n *\n * @link https://www.embla-carousel.com/api/options/#skipsnaps\n */\n @property({ type: Boolean, attribute: 'skip-snaps' })\n accessor skipSnaps = false;\n\n /**\n * Group slides together for navigation.\n *\n * @link https://www.embla-carousel.com/api/options/#slidestoscroll\n */\n @property({ attribute: 'slides-to-scroll' })\n accessor slidesToScroll: SlidesToScrollOptionType = 1;\n\n /**\n * Set the initial scroll snap index.\n *\n * @link https://www.embla-carousel.com/api/options/#startindex\n */\n @property({ type: Number, attribute: 'start-index' })\n accessor startIndex = 0;\n\n /**\n * Clear leading and trailing empty space.\n *\n * @link https://www.embla-carousel.com/api/options/#containscroll\n */\n @property({ attribute: 'contain-scroll' })\n accessor containScroll: ScrollContainOptionType = 'trimSnaps';\n\n @property({ type: Boolean })\n accessor single = false;\n\n @property({ type: Boolean, attribute: 'with-dots' })\n accessor withDots = false;\n\n @property({ type: Boolean, attribute: 'with-scrollbar' })\n accessor withScrollbar = false;\n\n @property({ type: Boolean, attribute: 'with-fullscreen' })\n accessor withFullscreen = false;\n\n @property({ type: String, attribute: 'dot-appearance' })\n accessor dotAppearance: 'circle' | 'bar' = 'bar';\n\n @property({ type: String, attribute: 'scroll-buttons-position' })\n accessor scrollButtonsPosition: 'inside' | 'outside' = 'inside';\n\n @query('.scroll-buttons') scrollButtons!: HTMLElement;\n @query('.button-previous') previousBtn!: HTMLButtonElement;\n @query('.button-next') nextBtn!: HTMLButtonElement;\n @query('.container') container!: HTMLSlotElement;\n @queryAll('.dot') dotNodes!: HTMLButtonElement[];\n\n constructor() {\n super();\n this.next = this.next.bind(this);\n this.previous = this.previous.bind(this);\n this.onInit = this.onInit.bind(this);\n this.onReInit = this.onReInit.bind(this);\n this.onResize = this.onResize.bind(this);\n this.onSelect = this.onSelect.bind(this);\n this.onSlidesInView = this.onSlidesInView.bind(this);\n this.detachEventListeners = this.detachEventListeners.bind(this);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.createEmbla();\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n if (this.embla) {\n this.embla.destroy();\n }\n }\n\n protected override firstUpdated(): void {\n this.attachEventListeners();\n }\n\n protected createEmbla() {\n this.embla = EmblaCarousel(this, this.options());\n this.embla\n .on('init', this.onInit)\n .on('reInit', this.onReInit)\n .on('resize', this.onResize)\n .on('slidesInView', this.onSlidesInView)\n .on('select', this.onSelect)\n .on('destroy', this.detachEventListeners);\n }\n\n protected onSlidesInView() {\n this.emit('slides-in-view', {\n detail: { indexes: this.embla.slidesInView() },\n });\n }\n\n protected onInit() {\n this.updateNavigation();\n }\n\n protected onReInit() {\n this.updateNavigation();\n this.requestUpdate();\n }\n\n protected onSelect() {\n this.emit('select', {\n detail: { index: this.embla.selectedScrollSnap() },\n });\n this.updateNavigation();\n }\n\n protected onResize() {\n this.requestUpdate();\n }\n\n protected attachEventListeners() {\n this.previousBtn.addEventListener('click', this.previous);\n this.nextBtn.addEventListener('click', this.next);\n }\n\n protected detachEventListeners() {\n this.previousBtn.removeEventListener('click', this.previous);\n this.nextBtn.removeEventListener('click', this.next);\n }\n\n protected updateNavigation() {\n const canScroll = this.embla.canScrollPrev() || this.embla.canScrollNext();\n\n this.previousBtn.toggleAttribute('disabled', !this.embla.canScrollPrev());\n this.nextBtn.toggleAttribute('disabled', !this.embla.canScrollNext());\n this.scrollButtons.classList.toggle('scroll-buttons--disabled', !canScroll);\n\n if (this.withDots) {\n const previous = this.embla.previousScrollSnap();\n const selected = this.embla.selectedScrollSnap();\n this.dotNodes[previous]?.classList.remove('dot--selected');\n this.dotNodes[previous]?.removeAttribute('aria-selected');\n this.dotNodes[selected]?.classList.add('dot--selected');\n this.dotNodes[selected]?.setAttribute('aria-selected', 'true');\n }\n }\n\n override async updated(changedProperties: PropertyValues<this>) {\n if (changedProperties.has('autoplay') && this.autoplay) {\n this.initAutoplay();\n }\n }\n\n private initAutoplay() {\n this.embla.reInit(this.options(), [Autoplay(this.autoplayOptions || { delay: this.autoplay })]);\n }\n\n private handleSlotChange(event: Event) {\n const slot = event.target as HTMLSlotElement;\n if (slot.assignedElements().length > 0) {\n this.embla.reInit(this.options());\n }\n }\n\n private handleDotClick(event: Event) {\n const button = event.currentTarget as HTMLButtonElement;\n this.goToSlide(Number(button.dataset.index));\n }\n\n options(): EmblaOptionsType {\n const container = this.shadowRoot!.querySelector('slot')!;\n\n if (!container) {\n return {\n container: this,\n slides: [],\n };\n }\n\n return {\n container: container,\n slides: container.assignedElements() as HTMLElement[],\n containScroll: this.containScroll,\n breakpoints: this.breakpoints,\n axis: this.axis,\n align: this.align,\n dragFree: this.dragFree,\n duration: this.duration,\n loop: this.loop,\n slidesToScroll: this.slidesToScroll,\n skipSnaps: this.skipSnaps,\n startIndex: this.startIndex,\n };\n }\n\n next() {\n this.embla.scrollNext();\n }\n\n previous() {\n this.embla.scrollPrev();\n }\n\n goToSlide(index: number, jump?: boolean) {\n this.embla.scrollTo(index, jump);\n }\n\n slideNodes() {\n this.embla.slideNodes();\n }\n\n slidesInView() {\n this.embla.slidesInView();\n }\n\n isActive() {\n return this.embla?.internalEngine().options.active;\n }\n\n renderFullscreenButton() {\n return html`<button\n type=\"button\"\n part=\"button button-fullscreen\"\n class=\"button button-fullscreen\"\n @click=${() => this.emit('fullscreen')}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 512\"\n fill=\"currentColor\"\n part=\"button-icon button-icon-fullscreen\"\n >\n <path\n d=\"M295 183c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l135-135 0 86.1c0 13.3 10.7 24 24 24s24-10.7 24-24l0-144c0-13.3-10.7-24-24-24L344 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l86.1 0-135 135zM217 329c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0L48 430.1 48 344c0-13.3-10.7-24-24-24S0 330.7 0 344L0 488c0 13.3 10.7 24 24 24l144 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-86.1 0 135-135z\"\n />\n </svg>\n </button>`;\n }\n\n renderNextPreviousButtons() {\n return html`<div\n class=\"scroll-buttons scroll-buttons--${this.scrollButtonsPosition}\"\n part=\"scroll-buttons\"\n >\n <button\n part=\"button button-previous\"\n class=\"button button-previous\"\n type=\"button\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 512\"\n fill=\"currentColor\"\n part=\"button-icon button-icon-previous\"\n >\n <path\n d=\"M7 239c-9.4 9.4-9.4 24.6 0 33.9L175 441c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9L81.9 280 488 280c13.3 0 24-10.7 24-24s-10.7-24-24-24L81.9 232 209 105c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0L7 239z\"\n />\n </svg>\n </button>\n\n <button\n part=\"button button-next\"\n class=\"button button-next\"\n type=\"button\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 512\"\n fill=\"currentColor\"\n part=\"button-icon button-icon-next\"\n >\n <path\n d=\"M505 273c9.4-9.4 9.4-24.6 0-33.9L337 71c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l127 127-406.1 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l406.1 0-127 127c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0L505 273z\"\n />\n </svg>\n </button>\n </div>`;\n }\n\n override render() {\n return html`\n <div class=\"wrapper ${this.isActive() ? '' : 'inactive'}\">\n <div\n part=\"viewport\"\n class=\"viewport\"\n >\n <slot\n part=\"container\"\n class=\"container\"\n @slotchange=${this.handleSlotChange}\n ></slot>\n </div>\n ${this.withFullscreen ? this.renderFullscreenButton() : ''}\n ${this.renderNextPreviousButtons()}\n ${this.withDots\n ? html`<div\n class=\"dots\"\n part=\"dots\"\n role=\"tablist\"\n >\n ${map(this.embla.scrollSnapList(), (_, index) => {\n return html`<button\n part=\"button-dot\"\n type=\"button\"\n role=\"tab\"\n class=\"dot dot--${this.dotAppearance}\"\n aria-label=\"Go to slide ${index + 1}\"\n data-index=\"${index}\"\n @click=${this.handleDotClick}\n >\n <i></i>\n </button>`;\n })}\n </div> `\n : ''}\n </div>\n `;\n }\n}\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/carousel/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,cAAc,YAAY,CAAC;AAG3B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,YAAY,EAAE,aAAa,CAAC;KAC7B;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/html/elements/carousel/index.ts"],"sourcesContent":["import { define } from '../../define';\nimport { LuxenCarousel } from './carousel';\nexport * from './carousel';\ndefine('carousel', LuxenCarousel);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'l-carousel': LuxenCarousel;\n }\n}\n"],"mappings":"uFAGA,EAAO,WAAY,EAAc"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CSSResultGroup } from 'lit';
|
|
2
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
3
|
+
/**
|
|
4
|
+
* A single slide inside an `<l-carousel>`.
|
|
5
|
+
*
|
|
6
|
+
* @cssproperty --aspect-ratio - Aspect ratio of the slide.
|
|
7
|
+
*/
|
|
8
|
+
export declare class LuxenCarouselItem extends LuxenElement {
|
|
9
|
+
static styles: CSSResultGroup;
|
|
10
|
+
connectedCallback(): void;
|
|
11
|
+
render(): import('lit').TemplateResult<1>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=carousel-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carousel-item.d.ts","sourceRoot":"","sources":["../../../src/html/elements/carousel-item/carousel-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAM1D;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,OAAgB,MAAM,EAAE,cAAc,CAAwB;IAErD,iBAAiB;IAKjB,MAAM;CAGhB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as e,i as t}from"../../chunks/lit.js";import{LuxenElement as n}from"../../shared/luxen-element.js";import r from"../../shared/styles/host.styles.js";var i=e(`:host{--aspect-ratio:inherit;width:100%;max-height:100%;aspect-ratio:var(--aspect-ratio);flex-direction:column;justify-content:start;align-items:center;display:flex}`),a=class extends n{static{this.styles=[r,i]}connectedCallback(){super.connectedCallback(),this.setAttribute(`role`,`group`)}render(){return t` <slot></slot> `}};export{a as LuxenCarouselItem};
|
|
2
|
+
//# sourceMappingURL=carousel-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carousel-item.js","names":[],"sources":["../../../src/html/elements/carousel-item/carousel-item.css?inline","../../../src/html/elements/carousel-item/carousel-item.ts"],"sourcesContent":[":host {\n --aspect-ratio: inherit;\n\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: start;\n width: 100%;\n max-height: 100%;\n aspect-ratio: var(--aspect-ratio);\n}\n","import { html, unsafeCSS, type CSSResultGroup } from 'lit';\nimport { LuxenElement } from '../../shared/luxen-element';\nimport hostStyles from '../../shared/styles/host.styles';\nimport rawStyles from './carousel-item.css?inline';\n\nconst styles = unsafeCSS(rawStyles);\n\n/**\n * A single slide inside an `<l-carousel>`.\n *\n * @cssproperty --aspect-ratio - Aspect ratio of the slide.\n */\nexport class LuxenCarouselItem extends LuxenElement {\n static override styles: CSSResultGroup = [hostStyles, styles];\n\n override connectedCallback() {\n super.connectedCallback();\n this.setAttribute('role', 'group');\n }\n\n override render() {\n return html` <slot></slot> `;\n }\n}\n"],"mappings":"8JCKA,IAAM,EAAS,0KAAoB,CAOtB,EAAb,cAAuC,CAAa,oBACT,CAAC,EAAY,EAAO,CAE7D,mBAA6B,CAC3B,MAAM,mBAAmB,CACzB,KAAK,aAAa,OAAQ,QAAQ,CAGpC,QAAkB,CAChB,MAAO,EAAI"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/carousel-item/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,cAAc,iBAAiB,CAAC;AAGhC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,iBAAiB,CAAC;KACtC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/html/elements/carousel-item/index.ts"],"sourcesContent":["import { define } from '../../define';\nimport { LuxenCarouselItem } from './carousel-item';\nexport * from './carousel-item';\ndefine('carousel-item', LuxenCarouselItem);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'l-carousel-item': LuxenCarouselItem;\n }\n}\n"],"mappings":"gGAGA,EAAO,gBAAiB,EAAkB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { PropertyValues } from 'lit';
|
|
2
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
3
|
+
/**
|
|
4
|
+
* A modal dialog rendered in the top layer via the native `<dialog>` element.
|
|
5
|
+
*
|
|
6
|
+
* Open and close by toggling the `open` property (or the `--show` / `--hide`
|
|
7
|
+
* Invoker commands). There are no public `show()` / `close()` methods.
|
|
8
|
+
*
|
|
9
|
+
* @slot - Body content.
|
|
10
|
+
* @slot close - Close button (typically `<button class="l-close">`).
|
|
11
|
+
* @slot footer - Footer actions.
|
|
12
|
+
*
|
|
13
|
+
* @csspart dialog - The native `<dialog>` element.
|
|
14
|
+
* @csspart header - The header wrapper containing the title and close slot.
|
|
15
|
+
* @csspart title - The dialog title heading.
|
|
16
|
+
* @csspart body - The body wrapper around the default slot.
|
|
17
|
+
* @csspart footer - The footer wrapper around the footer slot.
|
|
18
|
+
*
|
|
19
|
+
* @cssproperty --width - Dialog width. Default `31rem`.
|
|
20
|
+
* @cssproperty --border-radius - Dialog border radius. Default `6px`.
|
|
21
|
+
* @cssproperty --show-duration - Open transition duration. Default `200ms`.
|
|
22
|
+
* @cssproperty --hide-duration - Close transition duration. Default `200ms`.
|
|
23
|
+
* @cssproperty --backdrop - Backdrop color.
|
|
24
|
+
* @cssproperty --backdrop-blur - Backdrop blur amount (any CSS length). Default `0` (no blur). Set to e.g. `4px` for a subtle frost.
|
|
25
|
+
*
|
|
26
|
+
* @event show - Fired when the dialog opens. Not cancelable.
|
|
27
|
+
* @event after-show - Fired after the open animation completes.
|
|
28
|
+
* @event hide - Fired when the dialog is about to close. Cancelable — call `event.preventDefault()` to keep it open.
|
|
29
|
+
* @event after-hide - Fired after the close animation completes.
|
|
30
|
+
*/
|
|
31
|
+
export declare class LuxenDialog extends LuxenElement {
|
|
32
|
+
static styles: import('lit').CSSResult[];
|
|
33
|
+
/** Dialog title rendered in the header. */
|
|
34
|
+
title: string;
|
|
35
|
+
/** Whether the dialog is open. */
|
|
36
|
+
open: boolean;
|
|
37
|
+
/** Close when the backdrop is clicked. */
|
|
38
|
+
lightDismiss: boolean;
|
|
39
|
+
dialog: HTMLDialogElement;
|
|
40
|
+
private _mouseDownTarget;
|
|
41
|
+
private _commandListener;
|
|
42
|
+
connectedCallback(): void;
|
|
43
|
+
disconnectedCallback(): void;
|
|
44
|
+
firstUpdated(): void;
|
|
45
|
+
updated(changed: PropertyValues<this>): void;
|
|
46
|
+
private _onCommand;
|
|
47
|
+
private _onCancel;
|
|
48
|
+
private _onNativeClose;
|
|
49
|
+
private _onDialogClick;
|
|
50
|
+
private _nudgeAnimation?;
|
|
51
|
+
private _nudgeDismiss;
|
|
52
|
+
private _emitAfter;
|
|
53
|
+
private _focusAutofocusTarget;
|
|
54
|
+
render(): import('lit').TemplateResult<1>;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../../src/html/elements/dialog/dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAwB1D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,MAAM,CAAC,MAAM,4BAAwB;IAErC,2CAA2C;IAE3C,KAAK,SAAM;IAEX,kCAAkC;IAElC,IAAI,UAAS;IAEb,0CAA0C;IAE1C,YAAY,UAAS;IAGrB,MAAM,EAAG,iBAAiB,CAAC;IAE3B,OAAO,CAAC,gBAAgB,CAA4B;IAEpD,OAAO,CAAC,gBAAgB,CAEtB;IAIF,iBAAiB;IAKjB,oBAAoB;IAKpB,YAAY;IASZ,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;IA0BrC,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,eAAe,CAAC,CAAY;IAEpC,OAAO,CAAC,aAAa;YAcP,UAAU;IAUxB,OAAO,CAAC,qBAAqB;IAK7B,MAAM;CAoBP"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import{i as e,n as t}from"../../chunks/lit.js";import{LuxenElement as n}from"../../shared/luxen-element.js";import{a as r,r as i,t as a}from"../../chunks/decorate.js";import o from"../../shared/styles/host.styles.js";import s from"./dialog.styles.js";var c=typeof HTMLDialogElement<`u`&&`closedBy`in HTMLDialogElement.prototype,l=Symbol.for(`luxen-dialog-scroll-lock`);if(typeof document<`u`&&!(l in document)){let e=new CSSStyleSheet;e.replaceSync(`html:has([data-modal]) { overflow: hidden; scrollbar-gutter: stable; }`),document.adoptedStyleSheets.push(e),Object.defineProperty(document,l,{value:e})}var u=class extends n{constructor(...e){super(...e),this.title=``,this.open=!1,this.lightDismiss=!1,this._mouseDownTarget=null,this._commandListener={handleEvent:e=>this._onCommand(e)}}static{this.styles=[o,s]}connectedCallback(){super.connectedCallback(),this.addEventListener(`command`,this._commandListener)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener(`command`,this._commandListener)}firstUpdated(){this.dialog.addEventListener(`cancel`,e=>this._onCancel(e)),this.dialog.addEventListener(`close`,()=>this._onNativeClose()),this.dialog.addEventListener(`mousedown`,e=>{this._mouseDownTarget=e.target}),this.dialog.addEventListener(`click`,e=>this._onDialogClick(e))}updated(e){if(e.has(`open`)){if(this.open&&!this.dialog.open)this.emit(`show`),this.toggleAttribute(`data-modal`,!0),this.dialog.showModal(),this._focusAutofocusTarget(),this._emitAfter(`after-show`);else if(!this.open&&this.dialog.open){if(!this.emit(`hide`,{cancelable:!0})){this.open=!0;return}this.dialog.close()}}}_onCommand(e){switch(e.command){case`--hide`:this.open=!1;break;case`--show`:this.open=!0;break}}_onCancel(e){this.emit(`hide`,{cancelable:!0})||e.preventDefault()}_onNativeClose(){this.open=!1,this.removeAttribute(`data-modal`),this._emitAfter(`after-hide`)}_onDialogClick(e){let t=e.target===this.dialog&&this._mouseDownTarget===this.dialog;if(this._mouseDownTarget=null,t){if(this.lightDismiss){c||(this.open=!1);return}this._nudgeDismiss()}}_nudgeDismiss(){matchMedia(`(prefers-reduced-motion: reduce)`).matches||(this._nudgeAnimation?.cancel(),this._nudgeAnimation=this.dialog.animate([{transform:`scale(1)`},{transform:`scale(1.02)`},{transform:`scale(1)`}],{duration:250,easing:`ease-in-out`}))}async _emitAfter(e){await new Promise(e=>requestAnimationFrame(()=>e(null)));let t=this.dialog.getAnimations({subtree:!1});await Promise.all(t.map(e=>e.finished.catch(()=>{}))),e===`after-show`===this.open&&this.emit(e)}_focusAutofocusTarget(){this.querySelector(`[autofocus]`)?.focus({preventScroll:!0})}render(){return e`
|
|
2
|
+
<dialog
|
|
3
|
+
part="dialog"
|
|
4
|
+
closedby=${this.lightDismiss&&c?`any`:t}
|
|
5
|
+
>
|
|
6
|
+
<header part="header">
|
|
7
|
+
<h2 part="title">${this.title}</h2>
|
|
8
|
+
<slot name="close"></slot>
|
|
9
|
+
</header>
|
|
10
|
+
<div part="body">
|
|
11
|
+
<slot></slot>
|
|
12
|
+
</div>
|
|
13
|
+
<footer part="footer">
|
|
14
|
+
<slot name="footer"></slot>
|
|
15
|
+
</footer>
|
|
16
|
+
</dialog>
|
|
17
|
+
`}};a([r()],u.prototype,`title`,void 0),a([r({type:Boolean,reflect:!0})],u.prototype,`open`,void 0),a([r({type:Boolean,reflect:!0,attribute:`light-dismiss`})],u.prototype,`lightDismiss`,void 0),a([i(`dialog`)],u.prototype,`dialog`,void 0);export{u as LuxenDialog};
|
|
18
|
+
//# sourceMappingURL=dialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.js","names":[],"sources":["../../../src/html/elements/dialog/dialog.ts"],"sourcesContent":["import { html, nothing, type PropertyValues } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { LuxenElement } from '../../shared/luxen-element';\nimport hostStyles from '../../shared/styles/host.styles';\nimport styles from './dialog.styles';\n\ninterface CommandEventLike extends Event {\n command: string;\n source: Element | null;\n}\n\nconst supportsClosedBy =\n typeof HTMLDialogElement !== 'undefined' && 'closedBy' in HTMLDialogElement.prototype;\n\n// Native <dialog> doesn't lock body scroll. Inject a global rule that uses\n// `:has()` to freeze the root scroll container whenever any modal l-dialog\n// is open. Purely declarative — no manual lock/unlock bookkeeping.\n// Symbol guard makes the injection idempotent across HMR reloads.\nconst SCROLL_LOCK_SHEET = Symbol.for('luxen-dialog-scroll-lock');\nif (typeof document !== 'undefined' && !(SCROLL_LOCK_SHEET in document)) {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(`html:has([data-modal]) { overflow: hidden; scrollbar-gutter: stable; }`);\n document.adoptedStyleSheets.push(sheet);\n Object.defineProperty(document, SCROLL_LOCK_SHEET, { value: sheet });\n}\n\n/**\n * A modal dialog rendered in the top layer via the native `<dialog>` element.\n *\n * Open and close by toggling the `open` property (or the `--show` / `--hide`\n * Invoker commands). There are no public `show()` / `close()` methods.\n *\n * @slot - Body content.\n * @slot close - Close button (typically `<button class=\"l-close\">`).\n * @slot footer - Footer actions.\n *\n * @csspart dialog - The native `<dialog>` element.\n * @csspart header - The header wrapper containing the title and close slot.\n * @csspart title - The dialog title heading.\n * @csspart body - The body wrapper around the default slot.\n * @csspart footer - The footer wrapper around the footer slot.\n *\n * @cssproperty --width - Dialog width. Default `31rem`.\n * @cssproperty --border-radius - Dialog border radius. Default `6px`.\n * @cssproperty --show-duration - Open transition duration. Default `200ms`.\n * @cssproperty --hide-duration - Close transition duration. Default `200ms`.\n * @cssproperty --backdrop - Backdrop color.\n * @cssproperty --backdrop-blur - Backdrop blur amount (any CSS length). Default `0` (no blur). Set to e.g. `4px` for a subtle frost.\n *\n * @event show - Fired when the dialog opens. Not cancelable.\n * @event after-show - Fired after the open animation completes.\n * @event hide - Fired when the dialog is about to close. Cancelable — call `event.preventDefault()` to keep it open.\n * @event after-hide - Fired after the close animation completes.\n */\nexport class LuxenDialog extends LuxenElement {\n static styles = [hostStyles, styles];\n\n /** Dialog title rendered in the header. */\n @property()\n title = '';\n\n /** Whether the dialog is open. */\n @property({ type: Boolean, reflect: true })\n open = false;\n\n /** Close when the backdrop is clicked. */\n @property({ type: Boolean, reflect: true, attribute: 'light-dismiss' })\n lightDismiss = false;\n\n @query('dialog')\n dialog!: HTMLDialogElement;\n\n private _mouseDownTarget: EventTarget | null = null;\n\n private _commandListener: EventListenerObject = {\n handleEvent: (e: Event) => this._onCommand(e as CommandEventLike),\n };\n\n // --- Lifecycle ---\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener('command', this._commandListener);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('command', this._commandListener);\n }\n\n firstUpdated() {\n this.dialog.addEventListener('cancel', (e) => this._onCancel(e));\n this.dialog.addEventListener('close', () => this._onNativeClose());\n this.dialog.addEventListener('mousedown', (e) => {\n this._mouseDownTarget = e.target;\n });\n this.dialog.addEventListener('click', (e) => this._onDialogClick(e));\n }\n\n updated(changed: PropertyValues<this>) {\n if (!changed.has('open')) return;\n\n if (this.open && !this.dialog.open) {\n // Opening — not cancelable.\n this.emit('show');\n this.toggleAttribute('data-modal', true);\n this.dialog.showModal();\n this._focusAutofocusTarget();\n this._emitAfter('after-show');\n } else if (!this.open && this.dialog.open) {\n // Closing — cancelable. Revert the property if consumer prevents.\n if (!this.emit('hide', { cancelable: true })) {\n this.open = true;\n return;\n }\n this.dialog.close();\n // `after-hide` is emitted from `_onNativeClose` (runs for every close path).\n }\n }\n\n // --- Event handlers ---\n\n // Custom commands on a custom element must start with `--`.\n // Built-in commands like \"close\" are reserved for native elements\n // and won't fire here.\n private _onCommand(e: CommandEventLike) {\n switch (e.command) {\n case '--hide':\n this.open = false;\n break;\n case '--show':\n this.open = true;\n break;\n }\n }\n\n // Fires on Escape and on `closedby=\"any\"` close requests.\n // Does NOT fire when script calls `.close()`, so `updated()`'s cancelable\n // `hide` emit doesn't collide with this one.\n private _onCancel(e: Event) {\n if (!this.emit('hide', { cancelable: true })) {\n e.preventDefault();\n }\n }\n\n private _onNativeClose() {\n this.open = false;\n this.removeAttribute('data-modal');\n this._emitAfter('after-hide');\n }\n\n private _onDialogClick(e: MouseEvent) {\n // With `dialog { padding: 0 }`, `e.target === this.dialog` only fires\n // for backdrop clicks. The mousedown guard prevents drag-out dismissal.\n const clickedBackdrop = e.target === this.dialog && this._mouseDownTarget === this.dialog;\n this._mouseDownTarget = null;\n if (!clickedBackdrop) return;\n\n if (this.lightDismiss) {\n // When `supportsClosedBy`, the native `closedby=\"any\"` already closed.\n if (!supportsClosedBy) this.open = false;\n return;\n }\n this._nudgeDismiss();\n }\n\n private _nudgeAnimation?: Animation;\n\n private _nudgeDismiss() {\n if (matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n this._nudgeAnimation?.cancel();\n this._nudgeAnimation = this.dialog.animate(\n [{ transform: 'scale(1)' }, { transform: 'scale(1.02)' }, { transform: 'scale(1)' }],\n { duration: 250, easing: 'ease-in-out' },\n );\n }\n\n // Awaits every active animation on the dialog (transitions + @keyframes)\n // and then emits. Resolves immediately when no animations are running,\n // which covers `prefers-reduced-motion` and consumers that zero the\n // duration custom properties — cases where `transitionend` never fires.\n // Waits one frame first so @starting-style transitions have registered.\n private async _emitAfter(name: 'after-show' | 'after-hide') {\n await new Promise((r) => requestAnimationFrame(() => r(null)));\n const anims = this.dialog.getAnimations({ subtree: false });\n await Promise.all(anims.map((a) => a.finished.catch(() => {})));\n if ((name === 'after-show') !== this.open) return;\n this.emit(name);\n }\n\n // Firefox/Safari don't reliably resolve `[autofocus]` when `<dialog>`\n // is in shadow DOM and the target is in light DOM. Resolve it manually.\n private _focusAutofocusTarget() {\n const target = this.querySelector<HTMLElement>('[autofocus]');\n target?.focus({ preventScroll: true });\n }\n\n render() {\n const closedby = this.lightDismiss && supportsClosedBy ? 'any' : nothing;\n return html`\n <dialog\n part=\"dialog\"\n closedby=${closedby}\n >\n <header part=\"header\">\n <h2 part=\"title\">${this.title}</h2>\n <slot name=\"close\"></slot>\n </header>\n <div part=\"body\">\n <slot></slot>\n </div>\n <footer part=\"footer\">\n <slot name=\"footer\"></slot>\n </footer>\n </dialog>\n `;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrapper module: imported by both `dialog.ts` and `drawer.ts`.
|
|
3
|
+
* `unsafeCSS()` is called once here so both importers share the same
|
|
4
|
+
* `CSSResult` instance (one constructed `CSSStyleSheet`, not two).
|
|
5
|
+
*/
|
|
6
|
+
declare const _default: import('lit').CSSResult;
|
|
7
|
+
export default _default;
|
|
8
|
+
//# sourceMappingURL=dialog.styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.styles.d.ts","sourceRoot":"","sources":["../../../src/html/elements/dialog/dialog.styles.ts"],"names":[],"mappings":"AAGA;;;;GAIG;;AACH,wBAA8B"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as e}from"../../chunks/lit.js";var t=e(`:host{--width:31rem;--border-radius:6px;--show-duration:.2s;--hide-duration:.2s;--backdrop:var(--l-backdrop);--backdrop-blur:0;display:contents}dialog{box-sizing:border-box;width:var(--width);max-inline-size:min(90vw, var(--width));border-radius:var(--border-radius);background-color:var(--l-color-surface-overlay);max-block-size:min(80dvb,100%);color:var(--l-color-text-primary);opacity:0;transition-property:opacity,display,overlay;transition-duration:var(--hide-duration);transition-behavior:allow-discrete;border:0;margin:auto;padding:0;position:fixed;inset:0}dialog::backdrop{background:var(--backdrop);-webkit-backdrop-filter:blur(var(--backdrop-blur));backdrop-filter:blur(var(--backdrop-blur))}dialog[open]{opacity:1;transition-duration:var(--show-duration);grid-template-rows:auto minmax(0,1fr) auto;display:grid}@starting-style{dialog[open]{opacity:0}}[part=header]{justify-content:space-between;align-items:center;gap:1rem;padding:1.5rem;display:flex}[part=title]{margin:0;font-size:1.125rem;font-weight:600;line-height:1.4}[part=body]{padding:0 1.5rem;overflow-y:auto}[part=footer]{place-content:end;gap:.5rem;padding:1.5rem;display:flex}::slotted(menu[slot=footer]){display:contents}@media (prefers-reduced-motion:reduce){:host{--show-duration:0s;--hide-duration:0s}}`);export{t as default};
|
|
2
|
+
//# sourceMappingURL=dialog.styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.styles.js","names":[],"sources":["../../../src/html/elements/dialog/dialog.css?inline","../../../src/html/elements/dialog/dialog.styles.ts"],"sourcesContent":[":host {\n --width: 31rem;\n --border-radius: 6px;\n --show-duration: 200ms;\n --hide-duration: 200ms;\n --backdrop: var(--l-backdrop);\n --backdrop-blur: 0;\n\n display: contents;\n}\n\ndialog {\n position: fixed;\n inset: 0;\n box-sizing: border-box;\n width: var(--width);\n max-inline-size: min(90vw, var(--width));\n max-block-size: min(80dvb, 100%);\n margin: auto;\n padding: 0;\n border: 0;\n border-radius: var(--border-radius);\n background-color: var(--l-color-surface-overlay);\n color: var(--l-color-text-primary);\n\n /* EXIT STATE */\n opacity: 0;\n\n transition-property: opacity, display, overlay;\n transition-duration: var(--hide-duration);\n transition-behavior: allow-discrete;\n\n &::backdrop {\n background: var(--backdrop);\n backdrop-filter: blur(var(--backdrop-blur));\n }\n\n /* OPEN STATE */\n /* grid layout pins header/footer; the middle row (body) scrolls via\n overflow on [part='body'] and minmax(0, 1fr) allowing it to shrink. */\n &[open] {\n display: grid;\n grid-template-rows: auto minmax(0, 1fr) auto;\n opacity: 1;\n transition-duration: var(--show-duration);\n }\n\n /* BEFORE-OPEN STATE */\n @starting-style {\n &[open] {\n opacity: 0;\n }\n }\n}\n\n[part='header'] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 1rem;\n padding: 1.5rem;\n}\n\n[part='title'] {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 600;\n line-height: 1.4;\n}\n\n[part='body'] {\n padding: 0 1.5rem;\n overflow-y: auto;\n}\n\n[part='footer'] {\n display: flex;\n place-content: end;\n gap: 0.5rem;\n padding: 1.5rem;\n}\n\n::slotted(menu[slot='footer']) {\n display: contents;\n}\n\n@media (prefers-reduced-motion: reduce) {\n :host {\n --show-duration: 0ms;\n --hide-duration: 0ms;\n }\n}\n","import { unsafeCSS } from 'lit';\nimport raw from './dialog.css?inline';\n\n/**\n * Wrapper module: imported by both `dialog.ts` and `drawer.ts`.\n * `unsafeCSS()` is called once here so both importers share the same\n * `CSSResult` instance (one constructed `CSSStyleSheet`, not two).\n */\nexport default unsafeCSS(raw);\n"],"mappings":"wCCQA,IAAA,EAAe,qwCAAc"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/dialog/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,cAAc,UAAU,CAAC;AAGzB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,WAAW,CAAC;KACzB;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/html/elements/dialog/index.ts"],"sourcesContent":["import { define } from '../../define';\nimport { LuxenDialog } from './dialog';\nexport * from './dialog';\ndefine('dialog', LuxenDialog);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'l-dialog': LuxenDialog;\n }\n}\n"],"mappings":"mFAGA,EAAO,SAAU,EAAY"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
2
|
+
export type DividerOrientation = 'horizontal' | 'vertical';
|
|
3
|
+
/**
|
|
4
|
+
* @summary Dividers visually separate or group elements.
|
|
5
|
+
*
|
|
6
|
+
* @example <l-divider></l-divider>
|
|
7
|
+
*
|
|
8
|
+
* @cssproperty --color - The color of the divider line.
|
|
9
|
+
* @cssproperty --width - The thickness of the divider line.
|
|
10
|
+
* @cssproperty --spacing - The spacing between the divider and its neighboring elements.
|
|
11
|
+
*
|
|
12
|
+
* @customElement l-divider
|
|
13
|
+
*/
|
|
14
|
+
export declare class LuxenDivider extends LuxenElement {
|
|
15
|
+
createRenderRoot(): this;
|
|
16
|
+
/** The divider's orientation. */
|
|
17
|
+
orientation: DividerOrientation;
|
|
18
|
+
/** Optional text label displayed over the divider line. */
|
|
19
|
+
label?: string;
|
|
20
|
+
connectedCallback(): void;
|
|
21
|
+
updated(changed: Map<string, unknown>): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=divider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"divider.d.ts","sourceRoot":"","sources":["../../../src/html/elements/divider/divider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,UAAU,CAAC;AAE3D;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,SAAQ,YAAY;IACnC,gBAAgB;IAIzB,iCAAiC;IAEjC,WAAW,EAAE,kBAAkB,CAAgB;IAE/C,2DAA2D;IAE3D,KAAK,CAAC,EAAE,MAAM,CAAC;IAEN,iBAAiB;IAKjB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;CAS/C"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{LuxenElement as e}from"../../shared/luxen-element.js";import{a as t,t as n}from"../../chunks/decorate.js";var r=class extends e{constructor(...e){super(...e),this.orientation=`horizontal`}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),this.setAttribute(`role`,`separator`)}updated(e){e.has(`orientation`)&&(this.orientation===`vertical`?this.setAttribute(`aria-orientation`,`vertical`):this.removeAttribute(`aria-orientation`))}};n([t({reflect:!0})],r.prototype,`orientation`,void 0),n([t({reflect:!0})],r.prototype,`label`,void 0);export{r as LuxenDivider};
|
|
2
|
+
//# sourceMappingURL=divider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"divider.js","names":[],"sources":["../../../src/html/elements/divider/divider.ts"],"sourcesContent":["import { property } from 'lit/decorators.js';\nimport { LuxenElement } from '../../shared/luxen-element';\n\nexport type DividerOrientation = 'horizontal' | 'vertical';\n\n/**\n * @summary Dividers visually separate or group elements.\n *\n * @example <l-divider></l-divider>\n *\n * @cssproperty --color - The color of the divider line.\n * @cssproperty --width - The thickness of the divider line.\n * @cssproperty --spacing - The spacing between the divider and its neighboring elements.\n *\n * @customElement l-divider\n */\nexport class LuxenDivider extends LuxenElement {\n override createRenderRoot() {\n return this;\n }\n\n /** The divider's orientation. */\n @property({ reflect: true })\n orientation: DividerOrientation = 'horizontal';\n\n /** Optional text label displayed over the divider line. */\n @property({ reflect: true })\n label?: string;\n\n override connectedCallback() {\n super.connectedCallback();\n this.setAttribute('role', 'separator');\n }\n\n override updated(changed: Map<string, unknown>) {\n if (changed.has('orientation')) {\n if (this.orientation === 'vertical') {\n this.setAttribute('aria-orientation', 'vertical');\n } else {\n this.removeAttribute('aria-orientation');\n }\n }\n }\n}\n"],"mappings":"iHAgBA,IAAa,EAAb,cAAkC,CAAa,gDAOX,aANlC,kBAA4B,CAC1B,OAAO,KAWT,mBAA6B,CAC3B,MAAM,mBAAmB,CACzB,KAAK,aAAa,OAAQ,YAAY,CAGxC,QAAiB,EAA+B,CAC1C,EAAQ,IAAI,cAAc,GACxB,KAAK,cAAgB,WACvB,KAAK,aAAa,mBAAoB,WAAW,CAEjD,KAAK,gBAAgB,mBAAmB,OAjB7C,EAAS,CAAE,QAAS,GAAM,CAAC,CAAA,CAAA,EAAA,UAAA,cAAA,IAAA,GAAA,IAI3B,EAAS,CAAE,QAAS,GAAM,CAAC,CAAA,CAAA,EAAA,UAAA,QAAA,IAAA,GAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/divider/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,cAAc,WAAW,CAAC;AAG1B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,YAAY,CAAC;KAC3B;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/html/elements/divider/index.ts"],"sourcesContent":["import { define } from '../../define';\nimport { LuxenDivider } from './divider';\nexport * from './divider';\ndefine('divider', LuxenDivider);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'l-divider': LuxenDivider;\n }\n}\n"],"mappings":"qFAGA,EAAO,UAAW,EAAa"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { LuxenDialog } from '../dialog/dialog';
|
|
2
|
+
/**
|
|
3
|
+
* A drawer that slides in from a screen edge. Extends `<l-dialog>`.
|
|
4
|
+
*
|
|
5
|
+
* Open and close by toggling the `open` property (or the `--show` / `--hide`
|
|
6
|
+
* Invoker commands). Always opens as modal.
|
|
7
|
+
*
|
|
8
|
+
* @slot - Body content.
|
|
9
|
+
* @slot close - Close button (typically `<button class="l-close">`).
|
|
10
|
+
* @slot footer - Footer actions.
|
|
11
|
+
*
|
|
12
|
+
* @csspart dialog - The native `<dialog>` element.
|
|
13
|
+
* @csspart header - The header wrapper containing the title and close slot.
|
|
14
|
+
* @csspart title - The drawer title heading.
|
|
15
|
+
* @csspart body - The body wrapper around the default slot.
|
|
16
|
+
* @csspart footer - The footer wrapper around the footer slot.
|
|
17
|
+
*
|
|
18
|
+
* @cssproperty --size - Drawer size on the axis perpendicular to its edge (width for `start`/`end`, height for `bottom`). Default `320px`.
|
|
19
|
+
* @cssproperty --border-radius - Drawer border radius on the inner edges. Default `0.75rem`.
|
|
20
|
+
* @cssproperty --show-duration - Open transition duration. Default `200ms`.
|
|
21
|
+
* @cssproperty --hide-duration - Close transition duration. Default `200ms`.
|
|
22
|
+
* @cssproperty --backdrop - Backdrop color.
|
|
23
|
+
*
|
|
24
|
+
* @event show - Fired when the drawer opens. Not cancelable.
|
|
25
|
+
* @event after-show - Fired after the open animation completes.
|
|
26
|
+
* @event hide - Fired when the drawer is about to close. Cancelable — call `event.preventDefault()` to keep it open.
|
|
27
|
+
* @event after-hide - Fired after the close animation completes.
|
|
28
|
+
*/
|
|
29
|
+
export declare class LuxenDrawer extends LuxenDialog {
|
|
30
|
+
static styles: import('lit').CSSResult[];
|
|
31
|
+
/** Edge the drawer slides in from. Defaults to the start (inline-start) edge. */
|
|
32
|
+
placement?: 'start' | 'end' | 'bottom';
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=drawer.d.ts.map
|