{"version":3,"sources":["node_modules/detect-it/dist/detect-it.esm.js","node_modules/ngx-slider-v2/fesm2022/ngx-slider-v2.mjs","src/app/reader-shared/_modals/shortcuts-modal/shortcuts-modal.component.ts","src/app/reader-shared/_modals/shortcuts-modal/shortcuts-modal.component.html","src/app/manga-reader/_service/managa-reader.service.ts","src/app/_pipes/safe-style.pipe.ts","src/app/manga-reader/_components/canvas-renderer/canvas-renderer.component.ts","src/app/manga-reader/_components/canvas-renderer/canvas-renderer.component.html","src/app/manga-reader/_components/double-renderer/double-renderer.component.ts","src/app/manga-reader/_components/double-renderer/double-renderer.component.html","src/app/manga-reader/_components/double-reverse-renderer/double-reverse-renderer.component.ts","src/app/manga-reader/_components/double-reverse-renderer/double-reverse-renderer.component.html","src/app/manga-reader/_components/single-renderer/single-renderer.component.ts","src/app/manga-reader/_components/single-renderer/single-renderer.component.html","src/app/manga-reader/_components/double-renderer-no-cover/double-no-cover-renderer.component.ts","src/app/manga-reader/_components/double-renderer-no-cover/double-no-cover-renderer.component.html","src/app/_pipes/fullscreen-icon.pipe.ts","src/app/_pipes/reader-mode-icon.pipe.ts","src/app/_pipes/fitting-icon.pipe.ts","src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.ts","src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.html","src/app/ng-swipe/ag-swipe.core.ts","src/app/ng-swipe/ng-swipe.directive.ts","src/app/manga-reader/_components/manga-reader/manga-reader.component.ts","src/app/manga-reader/_components/manga-reader/manga-reader.component.html","src/app/_routes/manga-reader.router.module.ts"],"sourcesContent":["// so it doesn't throw if no window or matchMedia\nvar w = typeof window !== 'undefined' ? window : {\n screen: {},\n navigator: {}\n};\nvar matchMedia = (w.matchMedia || function () {\n return {\n matches: false\n };\n}).bind(w);\n// passive events test\n// adapted from https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\nvar passiveOptionAccessed = false;\nvar options = {\n get passive() {\n return passiveOptionAccessed = true;\n }\n};\n// have to set and remove a no-op listener instead of null\n// (which was used previously), because Edge v15 throws an error\n// when providing a null callback.\n// https://github.com/rafgraph/detect-passive-events/pull/3\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nvar noop = function () {};\nw.addEventListener && w.addEventListener('p', noop, options);\nw.removeEventListener && w.removeEventListener('p', noop, false);\nvar supportsPassiveEvents = passiveOptionAccessed;\nvar supportsPointerEvents = ('PointerEvent' in w);\nvar onTouchStartInWindow = ('ontouchstart' in w);\nvar touchEventInWindow = ('TouchEvent' in w);\n// onTouchStartInWindow is the old-old-legacy way to determine a touch device\n// and many websites interpreted it to mean that the device is a touch only phone,\n// so today browsers on a desktop/laptop computer with a touch screen (primary input mouse)\n// have onTouchStartInWindow as false (to prevent from being confused with a\n// touchOnly phone) even though they support the TouchEvents API, so need to check\n// both onTouchStartInWindow and touchEventInWindow for TouchEvent support,\n// however, some browsers (chromium) support the TouchEvents API even when running on\n// a mouse only device (touchEventInWindow true, but onTouchStartInWindow false)\n// so the touchEventInWindow check needs to include an coarse pointer media query\nvar supportsTouchEvents = onTouchStartInWindow || touchEventInWindow && matchMedia('(any-pointer: coarse)').matches;\nvar hasTouch = (w.navigator.maxTouchPoints || 0) > 0 || supportsTouchEvents;\n// userAgent is used as a backup to correct for known device/browser bugs\n// and when the browser doesn't support interaction media queries (pointer and hover)\n// see https://caniuse.com/css-media-interaction\nvar userAgent = w.navigator.userAgent || '';\n// iPads now support a mouse that can hover, however the media query interaction\n// feature results always say iPads only have a coarse pointer that can't hover\n// even when a mouse is connected (anyFine and anyHover are always false),\n// this unfortunately indicates a touch only device but iPads should\n// be classified as a hybrid device, so determine if it is an iPad\n// to indicate it should be treated as a hybrid device with anyHover true\nvar isIPad = matchMedia('(pointer: coarse)').matches &&\n// both iPad and iPhone can \"request desktop site\", which sets the userAgent to Macintosh\n// so need to check both userAgents to determine if it is an iOS device\n// and screen size to separate iPad from iPhone\n/iPad|Macintosh/.test(userAgent) && Math.min(w.screen.width || 0, w.screen.height || 0) >= 768;\nvar hasCoarsePrimaryPointer = (matchMedia('(pointer: coarse)').matches ||\n// if the pointer is not coarse and not fine then the browser doesn't support\n// interaction media queries (see https://caniuse.com/css-media-interaction)\n// so if it has onTouchStartInWindow assume it has a coarse primary pointer\n!matchMedia('(pointer: fine)').matches && onTouchStartInWindow) &&\n// bug in firefox (as of v81) on hybrid windows devices where the interaction media queries\n// always indicate a touch only device (only has a coarse pointer that can't hover)\n// so assume that the primary pointer is not coarse for firefox windows\n!/Windows.*Firefox/.test(userAgent);\nvar hasAnyHoverOrAnyFinePointer = matchMedia('(any-pointer: fine)').matches || matchMedia('(any-hover: hover)').matches ||\n// iPads might have an input device that can hover, so assume it has anyHover\nisIPad ||\n// if no onTouchStartInWindow then the browser is indicating that it is not a touch only device\n// see above note for supportsTouchEvents\n!onTouchStartInWindow;\n// a hybrid device is one that both hasTouch and\n// any input can hover or has a fine pointer, or the primary pointer is not coarse\n// if it's not a hybrid, then if it hasTouch it's touchOnly, otherwise it's mouseOnly\nvar deviceType = hasTouch && (hasAnyHoverOrAnyFinePointer || !hasCoarsePrimaryPointer) ? 'hybrid' : hasTouch ? 'touchOnly' : 'mouseOnly';\nvar primaryInput = deviceType === 'mouseOnly' ? 'mouse' : deviceType === 'touchOnly' ? 'touch' :\n// if the device is a hybrid, then if the primary pointer is coarse\n// assume the primaryInput is touch, otherwise assume it's mouse\nhasCoarsePrimaryPointer ? 'touch' : 'mouse';\nexport { deviceType, primaryInput, supportsPassiveEvents, supportsPointerEvents, supportsTouchEvents };\n","import * as i0 from '@angular/core';\nimport { InjectionToken, Directive, HostBinding, Inject, Optional, Component, Input, forwardRef, EventEmitter, ChangeDetectionStrategy, Output, ViewChild, ContentChild, HostListener, NgModule } from '@angular/core';\nimport * as i1 from '@angular/common';\nimport { CommonModule } from '@angular/common';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { throttleTime, tap, distinctUntilChanged, filter } from 'rxjs/operators';\nimport { supportsPassiveEvents } from 'detect-passive-events';\n\n/** Label type */\nconst _c0 = (a0, a1, a2) => ({\n tooltip: a0,\n placement: a1,\n content: a2\n});\nfunction TooltipWrapperComponent_ng_container_0_1_ng_template_0_Template(rf, ctx) {}\nfunction TooltipWrapperComponent_ng_container_0_1_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵtemplate(0, TooltipWrapperComponent_ng_container_0_1_ng_template_0_Template, 0, 0, \"ng-template\");\n }\n}\nfunction TooltipWrapperComponent_ng_container_0_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementContainerStart(0);\n i0.ɵɵtemplate(1, TooltipWrapperComponent_ng_container_0_1_Template, 1, 0, null, 1);\n i0.ɵɵelementContainerEnd();\n }\n if (rf & 2) {\n const ctx_r0 = i0.ɵɵnextContext();\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"ngTemplateOutlet\", ctx_r0.template)(\"ngTemplateOutletContext\", i0.ɵɵpureFunction3(2, _c0, ctx_r0.tooltip, ctx_r0.placement, ctx_r0.content));\n }\n}\nfunction TooltipWrapperComponent_ng_container_1_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementContainerStart(0);\n i0.ɵɵelementStart(1, \"div\", 2);\n i0.ɵɵtext(2);\n i0.ɵɵelementEnd();\n i0.ɵɵelementContainerEnd();\n }\n if (rf & 2) {\n const ctx_r0 = i0.ɵɵnextContext();\n i0.ɵɵadvance();\n i0.ɵɵattribute(\"title\", ctx_r0.tooltip)(\"data-tooltip-placement\", ctx_r0.placement);\n i0.ɵɵadvance();\n i0.ɵɵtextInterpolate1(\" \", ctx_r0.content, \" \");\n }\n}\nconst _c1 = [\"tooltipTemplate\"];\nconst _c2 = [\"leftOuterSelectionBar\"];\nconst _c3 = [\"rightOuterSelectionBar\"];\nconst _c4 = [\"fullBar\"];\nconst _c5 = [\"selectionBar\"];\nconst _c6 = [\"minHandle\"];\nconst _c7 = [\"maxHandle\"];\nconst _c8 = [\"floorLabel\"];\nconst _c9 = [\"ceilLabel\"];\nconst _c10 = [\"minHandleLabel\"];\nconst _c11 = [\"maxHandleLabel\"];\nconst _c12 = [\"combinedLabel\"];\nconst _c13 = [\"ticksElement\"];\nconst _c14 = a0 => ({\n \"ngx-slider-selected\": a0\n});\nfunction SliderComponent_span_28_ngx_slider_tooltip_wrapper_2_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelement(0, \"ngx-slider-tooltip-wrapper\", 32);\n }\n if (rf & 2) {\n const t_r1 = i0.ɵɵnextContext().$implicit;\n const ctx_r1 = i0.ɵɵnextContext();\n i0.ɵɵproperty(\"template\", ctx_r1.tooltipTemplate)(\"tooltip\", t_r1.valueTooltip)(\"placement\", t_r1.valueTooltipPlacement)(\"content\", t_r1.value);\n }\n}\nfunction SliderComponent_span_28_span_3_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelement(0, \"span\", 33);\n }\n if (rf & 2) {\n const t_r1 = i0.ɵɵnextContext().$implicit;\n i0.ɵɵproperty(\"innerText\", t_r1.legend);\n }\n}\nfunction SliderComponent_span_28_span_4_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelement(0, \"span\", 34);\n }\n if (rf & 2) {\n const t_r1 = i0.ɵɵnextContext().$implicit;\n i0.ɵɵproperty(\"innerHTML\", t_r1.legend, i0.ɵɵsanitizeHtml);\n }\n}\nfunction SliderComponent_span_28_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"span\", 27);\n i0.ɵɵelement(1, \"ngx-slider-tooltip-wrapper\", 28);\n i0.ɵɵtemplate(2, SliderComponent_span_28_ngx_slider_tooltip_wrapper_2_Template, 1, 4, \"ngx-slider-tooltip-wrapper\", 29)(3, SliderComponent_span_28_span_3_Template, 1, 1, \"span\", 30)(4, SliderComponent_span_28_span_4_Template, 1, 1, \"span\", 31);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const t_r1 = ctx.$implicit;\n const ctx_r1 = i0.ɵɵnextContext();\n i0.ɵɵproperty(\"ngClass\", i0.ɵɵpureFunction1(8, _c14, t_r1.selected))(\"ngStyle\", t_r1.style);\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"template\", ctx_r1.tooltipTemplate)(\"tooltip\", t_r1.tooltip)(\"placement\", t_r1.tooltipPlacement);\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"ngIf\", t_r1.value != null);\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"ngIf\", t_r1.legend != null && ctx_r1.allowUnsafeHtmlInSlider === false);\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"ngIf\", t_r1.legend != null && (ctx_r1.allowUnsafeHtmlInSlider == null || ctx_r1.allowUnsafeHtmlInSlider));\n }\n}\nvar LabelType = /*#__PURE__*/function (LabelType) {\n /** Label above low pointer */\n LabelType[LabelType[\"Low\"] = 0] = \"Low\";\n /** Label above high pointer */\n LabelType[LabelType[\"High\"] = 1] = \"High\";\n /** Label for minimum slider value */\n LabelType[LabelType[\"Floor\"] = 2] = \"Floor\";\n /** Label for maximum slider value */\n LabelType[LabelType[\"Ceil\"] = 3] = \"Ceil\";\n /** Label below legend tick */\n LabelType[LabelType[\"TickValue\"] = 4] = \"TickValue\";\n return LabelType;\n}(LabelType || {});\n/** Slider options */\nclass Options {\n /** Minimum value for a slider.\n Not applicable when using stepsArray. */\n floor = 0;\n /** Maximum value for a slider.\n Not applicable when using stepsArray. */\n ceil = null;\n /** Step between each value.\n Not applicable when using stepsArray. */\n step = 1;\n /** The minimum range authorized on the slider.\n Applies to range slider only.\n When using stepsArray, expressed as index into stepsArray. */\n minRange = null;\n /** The maximum range authorized on the slider.\n Applies to range slider only.\n When using stepsArray, expressed as index into stepsArray. */\n maxRange = null;\n /** Set to true to have a push behavior. When the min handle goes above the max,\n the max is moved as well (and vice-versa). The range between min and max is\n defined by the step option (defaults to 1) and can also be overriden by\n the minRange option. Applies to range slider only. */\n pushRange = false;\n /** The minimum value authorized on the slider.\n When using stepsArray, expressed as index into stepsArray. */\n minLimit = null;\n /** The maximum value authorized on the slider.\n When using stepsArray, expressed as index into stepsArray. */\n maxLimit = null;\n /** Custom translate function. Use this if you want to translate values displayed\n on the slider. */\n translate = null;\n /** Custom function for combining overlapping labels in range slider.\n It takes the min and max values (already translated with translate fuction)\n and should return how these two values should be combined.\n If not provided, the default function will join the two values with\n ' - ' as separator. */\n combineLabels = null;\n /** Use to display legend under ticks (thus, it needs to be used along with\n showTicks or showTicksValues). The function will be called with each tick\n value and returned content will be displayed under the tick as a legend.\n If the returned value is null, then no legend is displayed under\n the corresponding tick.You can also directly provide the legend values\n in the stepsArray option. */\n getLegend = null;\n /** Use to display a custom legend of a stepItem from stepsArray.\n It will be the same as getLegend but for stepsArray. */\n getStepLegend = null;\n /** If you want to display a slider with non linear/number steps.\n Just pass an array with each slider value and that's it; the floor, ceil and step settings\n of the slider will be computed automatically.\n By default, the value model and valueHigh model values will be the value of the selected item\n in the stepsArray.\n They can also be bound to the index of the selected item by setting the bindIndexForStepsArray\n option to true. */\n stepsArray = null;\n /** Set to true to bind the index of the selected item to value model and valueHigh model. */\n bindIndexForStepsArray = false;\n /** When set to true and using a range slider, the range can be dragged by the selection bar.\n Applies to range slider only. */\n draggableRange = false;\n /** Same as draggableRange but the slider range can't be changed.\n Applies to range slider only. */\n draggableRangeOnly = false;\n /** Set to true to always show the selection bar before the slider handle. */\n showSelectionBar = false;\n /** Set to true to always show the selection bar after the slider handle. */\n showSelectionBarEnd = false;\n /** Set a number to draw the selection bar between this value and the slider handle.\n When using stepsArray, expressed as index into stepsArray. */\n showSelectionBarFromValue = null;\n /** Only for range slider. Set to true to visualize in different colour the areas\n on the left/right (top/bottom for vertical range slider) of selection bar between the handles. */\n showOuterSelectionBars = false;\n /** Set to true to hide pointer labels */\n hidePointerLabels = false;\n /** Set to true to hide min / max labels */\n hideLimitLabels = false;\n /** Set to false to disable the auto-hiding behavior of the limit labels. */\n autoHideLimitLabels = true;\n /** Set to true to make the slider read-only. */\n readOnly = false;\n /** Set to true to disable the slider. */\n disabled = false;\n /** Set to true to display a tick for each step of the slider. */\n showTicks = false;\n /** Set to true to display a tick and the step value for each step of the slider.. */\n showTicksValues = false;\n /* The step between each tick to display. If not set, the step value is used.\n Not used when ticksArray is specified. */\n tickStep = null;\n /* The step between displaying each tick step value.\n If not set, then tickStep or step is used, depending on which one is set. */\n tickValueStep = null;\n /** Use to display ticks at specific positions.\n The array contains the index of the ticks that should be displayed.\n For example, [0, 1, 5] will display a tick for the first, second and sixth values. */\n ticksArray = null;\n /** Used to display a tooltip when a tick is hovered.\n Set to a function that returns the tooltip content for a given value. */\n ticksTooltip = null;\n /** Same as ticksTooltip but for ticks values. */\n ticksValuesTooltip = null;\n /** Set to true to display the slider vertically.\n The slider will take the full height of its parent.\n Changing this value at runtime is not currently supported. */\n vertical = false;\n /** Function that returns the current color of the selection bar.\n If your color won't change, don't use this option but set it through CSS.\n If the returned color depends on a model value (either value or valueHigh),\n you should use the argument passed to the function.\n Indeed, when the function is called, there is no certainty that the model\n has already been updated.*/\n getSelectionBarColor = null;\n /** Function that returns the color of a tick. showTicks must be enabled. */\n getTickColor = null;\n /** Function that returns the current color of a pointer.\n If your color won't change, don't use this option but set it through CSS.\n If the returned color depends on a model value (either value or valueHigh),\n you should use the argument passed to the function.\n Indeed, when the function is called, there is no certainty that the model has already been updated.\n To handle range slider pointers independently, you should evaluate pointerType within the given\n function where \"min\" stands for value model and \"max\" for valueHigh model values. */\n getPointerColor = null;\n /** Handles are focusable (on click or with tab) and can be modified using the following keyboard controls:\n Left/bottom arrows: -1\n Right/top arrows: +1\n Page-down: -10%\n Page-up: +10%\n Home: minimum value\n End: maximum value\n */\n keyboardSupport = true;\n /** If you display the slider in an element that uses transform: scale(0.5), set the scale value to 2\n so that the slider is rendered properly and the events are handled correctly. */\n scale = 1;\n /** If you display the slider in an element that uses transform: rotate(90deg), set the rotate value to 90\n so that the slider is rendered properly and the events are handled correctly. Value is in degrees. */\n rotate = 0;\n /** Set to true to force the value(s) to be rounded to the step, even when modified from the outside.\n When set to false, if the model values are modified from outside the slider, they are not rounded\n and can be between two steps. */\n enforceStep = true;\n /** Set to true to force the value(s) to be normalised to allowed range (floor to ceil), even when modified from the outside.\n When set to false, if the model values are modified from outside the slider, and they are outside allowed range,\n the slider may be rendered incorrectly. However, setting this to false may be useful if you want to perform custom normalisation. */\n enforceRange = true;\n /** Set to true to force the value(s) to be rounded to the nearest step value, even when modified from the outside.\n When set to false, if the model values are modified from outside the slider, and they are outside allowed range,\n the slider may be rendered incorrectly. However, setting this to false may be useful if you want to perform custom normalisation. */\n enforceStepsArray = true;\n /** Set to true to prevent to user from switching the min and max handles. Applies to range slider only. */\n noSwitching = false;\n /** Set to true to only bind events on slider handles. */\n onlyBindHandles = false;\n /** Set to true to show graphs right to left.\n If vertical is true it will be from top to bottom and left / right arrow functions reversed. */\n rightToLeft = false;\n /** Set to true to reverse keyboard navigation:\n Right/top arrows: -1\n Left/bottom arrows: +1\n Page-up: -10%\n Page-down: +10%\n End: minimum value\n Home: maximum value\n */\n reversedControls = false;\n /** Set to true to keep the slider labels inside the slider bounds. */\n boundPointerLabels = true;\n /** Set to true to use a logarithmic scale to display the slider. */\n logScale = false;\n /** Function that returns the position on the slider for a given value.\n The position must be a percentage between 0 and 1.\n The function should be monotonically increasing or decreasing; otherwise the slider may behave incorrectly. */\n customValueToPosition = null;\n /** Function that returns the value for a given position on the slider.\n The position is a percentage between 0 and 1.\n The function should be monotonically increasing or decreasing; otherwise the slider may behave incorrectly. */\n customPositionToValue = null;\n /** Precision limit for calculated values.\n Values used in calculations will be rounded to this number of significant digits\n to prevent accumulating small floating-point errors. */\n precisionLimit = 12;\n /** Use to display the selection bar as a gradient.\n The given object must contain from and to properties which are colors. */\n selectionBarGradient = null;\n /** Use to add a label directly to the slider for accessibility. Adds the aria-label attribute. */\n ariaLabel = \"ngx-slider\";\n /** Use instead of ariaLabel to reference the id of an element which will be used to label the slider.\n Adds the aria-labelledby attribute. */\n ariaLabelledBy = null;\n /** Use to add a label directly to the slider range for accessibility. Adds the aria-label attribute. */\n ariaLabelHigh = \"ngx-slider-max\";\n /** Use instead of ariaLabelHigh to reference the id of an element which will be used to label the slider range.\n Adds the aria-labelledby attribute. */\n ariaLabelledByHigh = null;\n /** Use to increase rendering performance. If the value is not provided, the slider calculates the with/height of the handle */\n handleDimension = null;\n /** Use to increase rendering performance. If the value is not provided, the slider calculates the with/height of the bar */\n barDimension = null;\n /** Enable/disable CSS animations */\n animate = true;\n /** Enable/disable CSS animations while moving the slider */\n animateOnMove = false;\n}\nconst AllowUnsafeHtmlInSlider = new InjectionToken(\"AllowUnsafeHtmlInSlider\");\n\n/** Pointer type */\nvar PointerType = /*#__PURE__*/function (PointerType) {\n /** Low pointer */\n PointerType[PointerType[\"Min\"] = 0] = \"Min\";\n /** High pointer */\n PointerType[PointerType[\"Max\"] = 1] = \"Max\";\n return PointerType;\n}(PointerType || {});\nclass ChangeContext {\n value;\n highValue;\n pointerType;\n}\n\n/**\n * Collection of functions to handle conversions/lookups of values\n */\nclass ValueHelper {\n static isNullOrUndefined(value) {\n return value === undefined || value === null;\n }\n static areArraysEqual(array1, array2) {\n if (array1.length !== array2.length) {\n return false;\n }\n for (let i = 0; i < array1.length; ++i) {\n if (array1[i] !== array2[i]) {\n return false;\n }\n }\n return true;\n }\n static linearValueToPosition(val, minVal, maxVal) {\n const range = maxVal - minVal;\n return (val - minVal) / range;\n }\n static logValueToPosition(val, minVal, maxVal) {\n val = Math.log(val);\n minVal = Math.log(minVal);\n maxVal = Math.log(maxVal);\n const range = maxVal - minVal;\n return (val - minVal) / range;\n }\n static linearPositionToValue(percent, minVal, maxVal) {\n return percent * (maxVal - minVal) + minVal;\n }\n static logPositionToValue(percent, minVal, maxVal) {\n minVal = Math.log(minVal);\n maxVal = Math.log(maxVal);\n const value = percent * (maxVal - minVal) + minVal;\n return Math.exp(value);\n }\n static findStepIndex(modelValue, stepsArray) {\n const differences = stepsArray.map(step => Math.abs(modelValue - step.value));\n let minDifferenceIndex = 0;\n for (let index = 0; index < stepsArray.length; index++) {\n if (differences[index] !== differences[minDifferenceIndex] && differences[index] < differences[minDifferenceIndex]) {\n minDifferenceIndex = index;\n }\n }\n return minDifferenceIndex;\n }\n}\n\n/** Helper with compatibility functions to support different browsers */\nclass CompatibilityHelper {\n /** Workaround for TouchEvent constructor sadly not being available on all browsers (e.g. Firefox, Safari) */\n static isTouchEvent(event) {\n if (window.TouchEvent !== undefined) {\n return event instanceof TouchEvent;\n }\n return event.touches !== undefined;\n }\n /** Detect presence of ResizeObserver API */\n static isResizeObserverAvailable() {\n return window.ResizeObserver !== undefined;\n }\n}\n\n/** Helper with mathematical functions */\nclass MathHelper {\n /* Round numbers to a given number of significant digits */\n static roundToPrecisionLimit(value, precisionLimit) {\n return +value.toPrecision(precisionLimit);\n }\n static isModuloWithinPrecisionLimit(value, modulo, precisionLimit) {\n const limit = Math.pow(10, -precisionLimit);\n return Math.abs(value % modulo) <= limit || Math.abs(Math.abs(value % modulo) - modulo) <= limit;\n }\n static clampToRange(value, floor, ceil) {\n return Math.min(Math.max(value, floor), ceil);\n }\n}\nclass EventListener {\n eventName = null;\n events = null;\n eventsSubscription = null;\n teardownCallback = null;\n}\n\n/**\n * Helper class to attach event listeners to DOM elements with debounce support using rxjs\n */\nclass EventListenerHelper {\n renderer;\n constructor(renderer) {\n this.renderer = renderer;\n }\n attachPassiveEventListener(nativeElement, eventName, callback, throttleInterval) {\n // Only use passive event listeners if the browser supports it\n if (supportsPassiveEvents !== true) {\n return this.attachEventListener(nativeElement, eventName, callback, throttleInterval);\n }\n // Angular doesn't support passive event handlers (yet), so we need to roll our own code using native functions\n const listener = new EventListener();\n listener.eventName = eventName;\n listener.events = new Subject();\n const observerCallback = event => {\n listener.events.next(event);\n };\n nativeElement.addEventListener(eventName, observerCallback, {\n passive: true,\n capture: false\n });\n listener.teardownCallback = () => {\n nativeElement.removeEventListener(eventName, observerCallback, {\n passive: true,\n capture: false\n });\n };\n listener.eventsSubscription = listener.events.pipe(!ValueHelper.isNullOrUndefined(throttleInterval) ? throttleTime(throttleInterval, undefined, {\n leading: true,\n trailing: true\n }) : tap(() => {}) // no-op\n ).subscribe(event => {\n callback(event);\n });\n return listener;\n }\n detachEventListener(eventListener) {\n if (!ValueHelper.isNullOrUndefined(eventListener.eventsSubscription)) {\n eventListener.eventsSubscription.unsubscribe();\n eventListener.eventsSubscription = null;\n }\n if (!ValueHelper.isNullOrUndefined(eventListener.events)) {\n eventListener.events.complete();\n eventListener.events = null;\n }\n if (!ValueHelper.isNullOrUndefined(eventListener.teardownCallback)) {\n eventListener.teardownCallback();\n eventListener.teardownCallback = null;\n }\n }\n attachEventListener(nativeElement, eventName, callback, throttleInterval) {\n const listener = new EventListener();\n listener.eventName = eventName;\n listener.events = new Subject();\n const observerCallback = event => {\n listener.events.next(event);\n };\n listener.teardownCallback = this.renderer.listen(nativeElement, eventName, observerCallback);\n listener.eventsSubscription = listener.events.pipe(!ValueHelper.isNullOrUndefined(throttleInterval) ? throttleTime(throttleInterval, undefined, {\n leading: true,\n trailing: true\n }) : tap(() => {}) // no-op\n ).subscribe(event => {\n callback(event);\n });\n return listener;\n }\n}\nlet SliderElementDirective = /*#__PURE__*/(() => {\n class SliderElementDirective {\n elemRef;\n renderer;\n changeDetectionRef;\n _position = 0;\n get position() {\n return this._position;\n }\n _dimension = 0;\n get dimension() {\n return this._dimension;\n }\n _alwaysHide = false;\n get alwaysHide() {\n return this._alwaysHide;\n }\n _vertical = false;\n get vertical() {\n return this._vertical;\n }\n _scale = 1;\n get scale() {\n return this._scale;\n }\n _rotate = 0;\n get rotate() {\n return this._rotate;\n }\n opacity = 1;\n visibility = 'visible';\n left = '';\n bottom = '';\n height = '';\n width = '';\n transform = '';\n eventListenerHelper;\n eventListeners = [];\n constructor(elemRef, renderer, changeDetectionRef) {\n this.elemRef = elemRef;\n this.renderer = renderer;\n this.changeDetectionRef = changeDetectionRef;\n this.eventListenerHelper = new EventListenerHelper(this.renderer);\n }\n setAlwaysHide(hide) {\n this._alwaysHide = hide;\n if (hide) {\n this.visibility = 'hidden';\n } else {\n this.visibility = 'visible';\n }\n }\n hide() {\n this.opacity = 0;\n }\n show() {\n if (this.alwaysHide) {\n return;\n }\n this.opacity = 1;\n }\n isVisible() {\n if (this.alwaysHide) {\n return false;\n }\n return this.opacity !== 0;\n }\n setVertical(vertical) {\n this._vertical = vertical;\n if (this._vertical) {\n this.left = '';\n this.width = '';\n } else {\n this.bottom = '';\n this.height = '';\n }\n }\n setScale(scale) {\n this._scale = scale;\n }\n setRotate(rotate) {\n this._rotate = rotate;\n this.transform = 'rotate(' + rotate + 'deg)';\n }\n getRotate() {\n return this._rotate;\n }\n // Set element left/top position depending on whether slider is horizontal or vertical\n setPosition(pos) {\n if (this._position !== pos && !this.isRefDestroyed()) {\n this.changeDetectionRef.markForCheck();\n }\n this._position = pos;\n if (this._vertical) {\n this.bottom = Math.round(pos) + 'px';\n } else {\n this.left = Math.round(pos) + 'px';\n }\n }\n // Calculate element's width/height depending on whether slider is horizontal or vertical\n calculateDimension() {\n const val = this.getBoundingClientRect();\n if (this.vertical) {\n this._dimension = (val.bottom - val.top) * this.scale;\n } else {\n this._dimension = (val.right - val.left) * this.scale;\n }\n }\n // Set element width/height depending on whether slider is horizontal or vertical\n setDimension(dim) {\n if (this._dimension !== dim && !this.isRefDestroyed()) {\n this.changeDetectionRef.markForCheck();\n }\n this._dimension = dim;\n if (this._vertical) {\n this.height = Math.round(dim) + 'px';\n } else {\n this.width = Math.round(dim) + 'px';\n }\n }\n getBoundingClientRect() {\n return this.elemRef.nativeElement.getBoundingClientRect();\n }\n on(eventName, callback, debounceInterval) {\n const listener = this.eventListenerHelper.attachEventListener(this.elemRef.nativeElement, eventName, callback, debounceInterval);\n this.eventListeners.push(listener);\n }\n onPassive(eventName, callback, debounceInterval) {\n const listener = this.eventListenerHelper.attachPassiveEventListener(this.elemRef.nativeElement, eventName, callback, debounceInterval);\n this.eventListeners.push(listener);\n }\n off(eventName) {\n let listenersToKeep;\n let listenersToRemove;\n if (!ValueHelper.isNullOrUndefined(eventName)) {\n listenersToKeep = this.eventListeners.filter(event => event.eventName !== eventName);\n listenersToRemove = this.eventListeners.filter(event => event.eventName === eventName);\n } else {\n listenersToKeep = [];\n listenersToRemove = this.eventListeners;\n }\n for (const listener of listenersToRemove) {\n this.eventListenerHelper.detachEventListener(listener);\n }\n this.eventListeners = listenersToKeep;\n }\n isRefDestroyed() {\n return ValueHelper.isNullOrUndefined(this.changeDetectionRef) || this.changeDetectionRef['destroyed'];\n }\n static ɵfac = function SliderElementDirective_Factory(t) {\n return new (t || SliderElementDirective)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef));\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: SliderElementDirective,\n selectors: [[\"\", \"ngxSliderElement\", \"\"]],\n hostVars: 14,\n hostBindings: function SliderElementDirective_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵstyleProp(\"opacity\", ctx.opacity)(\"visibility\", ctx.visibility)(\"left\", ctx.left)(\"bottom\", ctx.bottom)(\"height\", ctx.height)(\"width\", ctx.width)(\"transform\", ctx.transform);\n }\n }\n });\n }\n return SliderElementDirective;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet SliderHandleDirective = /*#__PURE__*/(() => {\n class SliderHandleDirective extends SliderElementDirective {\n active = false;\n role = \"\";\n tabindex = \"\";\n ariaOrientation = \"\";\n ariaLabel = \"\";\n ariaLabelledBy = \"\";\n ariaValueNow = \"\";\n ariaValueText = \"\";\n ariaValueMin = \"\";\n ariaValueMax = \"\";\n focus() {\n this.elemRef.nativeElement.focus();\n }\n constructor(elemRef, renderer, changeDetectionRef) {\n super(elemRef, renderer, changeDetectionRef);\n }\n static ɵfac = function SliderHandleDirective_Factory(t) {\n return new (t || SliderHandleDirective)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef));\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: SliderHandleDirective,\n selectors: [[\"\", \"ngxSliderHandle\", \"\"]],\n hostVars: 11,\n hostBindings: function SliderHandleDirective_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵattribute(\"role\", ctx.role)(\"tabindex\", ctx.tabindex)(\"aria-orientation\", ctx.ariaOrientation)(\"aria-label\", ctx.ariaLabel)(\"aria-labelledby\", ctx.ariaLabelledBy)(\"aria-valuenow\", ctx.ariaValueNow)(\"aria-valuetext\", ctx.ariaValueText)(\"aria-valuemin\", ctx.ariaValueMin)(\"aria-valuemax\", ctx.ariaValueMax);\n i0.ɵɵclassProp(\"ngx-slider-active\", ctx.active);\n }\n },\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n return SliderHandleDirective;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet SliderLabelDirective = /*#__PURE__*/(() => {\n class SliderLabelDirective extends SliderElementDirective {\n allowUnsafeHtmlInSlider;\n _value = null;\n get value() {\n return this._value;\n }\n constructor(elemRef, renderer, changeDetectionRef, allowUnsafeHtmlInSlider) {\n super(elemRef, renderer, changeDetectionRef);\n this.allowUnsafeHtmlInSlider = allowUnsafeHtmlInSlider;\n }\n setValue(value) {\n let recalculateDimension = false;\n if (!this.alwaysHide && (ValueHelper.isNullOrUndefined(this.value) || this.value.length !== value.length || this.value.length > 0 && this.dimension === 0)) {\n recalculateDimension = true;\n }\n this._value = value;\n if (this.allowUnsafeHtmlInSlider === false) {\n this.elemRef.nativeElement.innerText = value;\n } else {\n this.elemRef.nativeElement.innerHTML = value;\n }\n // Update dimension only when length of the label have changed\n if (recalculateDimension) {\n this.calculateDimension();\n }\n }\n static ɵfac = function SliderLabelDirective_Factory(t) {\n return new (t || SliderLabelDirective)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(AllowUnsafeHtmlInSlider, 8));\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: SliderLabelDirective,\n selectors: [[\"\", \"ngxSliderLabel\", \"\"]],\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n return SliderLabelDirective;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet TooltipWrapperComponent = /*#__PURE__*/(() => {\n class TooltipWrapperComponent {\n template;\n tooltip;\n placement;\n content;\n static ɵfac = function TooltipWrapperComponent_Factory(t) {\n return new (t || TooltipWrapperComponent)();\n };\n static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: TooltipWrapperComponent,\n selectors: [[\"ngx-slider-tooltip-wrapper\"]],\n inputs: {\n template: \"template\",\n tooltip: \"tooltip\",\n placement: \"placement\",\n content: \"content\"\n },\n decls: 2,\n vars: 2,\n consts: [[4, \"ngIf\"], [4, \"ngTemplateOutlet\", \"ngTemplateOutletContext\"], [1, \"ngx-slider-inner-tooltip\"]],\n template: function TooltipWrapperComponent_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵtemplate(0, TooltipWrapperComponent_ng_container_0_Template, 2, 6, \"ng-container\", 0)(1, TooltipWrapperComponent_ng_container_1_Template, 3, 3, \"ng-container\", 0);\n }\n if (rf & 2) {\n i0.ɵɵproperty(\"ngIf\", ctx.template);\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"ngIf\", !ctx.template);\n }\n },\n dependencies: [i1.NgIf, i1.NgTemplateOutlet],\n styles: [\".ngx-slider-inner-tooltip[_ngcontent-%COMP%]{height:100%}\"]\n });\n }\n return TooltipWrapperComponent;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nclass Tick {\n selected = false;\n style = {};\n tooltip = null;\n tooltipPlacement = null;\n value = null;\n valueTooltip = null;\n valueTooltipPlacement = null;\n legend = null;\n}\nclass Dragging {\n active = false;\n value = 0;\n difference = 0;\n position = 0;\n lowLimit = 0;\n highLimit = 0;\n}\nclass ModelValues {\n value;\n highValue;\n static compare(x, y) {\n if (ValueHelper.isNullOrUndefined(x) && ValueHelper.isNullOrUndefined(y)) {\n return false;\n }\n if (ValueHelper.isNullOrUndefined(x) !== ValueHelper.isNullOrUndefined(y)) {\n return false;\n }\n return x.value === y.value && x.highValue === y.highValue;\n }\n}\nclass ModelChange extends ModelValues {\n // Flag used to by-pass distinctUntilChanged() filter on input values\n // (sometimes there is a need to pass values through even though the model values have not changed)\n forceChange;\n static compare(x, y) {\n if (ValueHelper.isNullOrUndefined(x) && ValueHelper.isNullOrUndefined(y)) {\n return false;\n }\n if (ValueHelper.isNullOrUndefined(x) !== ValueHelper.isNullOrUndefined(y)) {\n return false;\n }\n return x.value === y.value && x.highValue === y.highValue && x.forceChange === y.forceChange;\n }\n}\nclass InputModelChange extends ModelChange {\n internalChange;\n}\nclass OutputModelChange extends ModelChange {\n userEventInitiated;\n}\nconst NGX_SLIDER_CONTROL_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n /* tslint:disable-next-line: no-use-before-declare */\n useExisting: forwardRef(() => SliderComponent),\n multi: true\n};\nlet SliderComponent = /*#__PURE__*/(() => {\n class SliderComponent {\n renderer;\n elementRef;\n changeDetectionRef;\n zone;\n allowUnsafeHtmlInSlider;\n // Model for low value of slider. For simple slider, this is the only input. For range slider, this is the low value.\n value = null;\n // Output for low value slider to support two-way bindings\n valueChange = new EventEmitter();\n // Model for high value of slider. Not used in simple slider. For range slider, this is the high value.\n highValue = null;\n // Output for high value slider to support two-way bindings\n highValueChange = new EventEmitter();\n // An object with all the other options of the slider.\n // Each option can be updated at runtime and the slider will automatically be re-rendered.\n options = new Options();\n // Event emitted when user starts interaction with the slider\n userChangeStart = new EventEmitter();\n // Event emitted on each change coming from user interaction\n userChange = new EventEmitter();\n // Event emitted when user finishes interaction with the slider\n userChangeEnd = new EventEmitter();\n manualRefreshSubscription;\n // Input event that triggers slider refresh (re-positioning of slider elements)\n set manualRefresh(manualRefresh) {\n this.unsubscribeManualRefresh();\n this.manualRefreshSubscription = manualRefresh.subscribe(() => {\n setTimeout(() => this.calculateViewDimensionsAndDetectChanges());\n });\n }\n triggerFocusSubscription;\n // Input event that triggers setting focus on given slider handle\n set triggerFocus(triggerFocus) {\n this.unsubscribeTriggerFocus();\n this.triggerFocusSubscription = triggerFocus.subscribe(pointerType => {\n this.focusPointer(pointerType);\n });\n }\n // Slider type, true means range slider\n get range() {\n return !ValueHelper.isNullOrUndefined(this.value) && !ValueHelper.isNullOrUndefined(this.highValue);\n }\n // Set to true if init method already executed\n initHasRun = false;\n // Changes in model inputs are passed through this subject\n // These are all changes coming in from outside the component through input bindings or reactive form inputs\n inputModelChangeSubject = new Subject();\n inputModelChangeSubscription = null;\n // Changes to model outputs are passed through this subject\n // These are all changes that need to be communicated to output emitters and registered callbacks\n outputModelChangeSubject = new Subject();\n outputModelChangeSubscription = null;\n // Low value synced to model low value\n viewLowValue = null;\n // High value synced to model high value\n viewHighValue = null;\n // Options synced to model options, based on defaults\n viewOptions = new Options();\n // Half of the width or height of the slider handles\n handleHalfDimension = 0;\n // Maximum position the slider handle can have\n maxHandlePosition = 0;\n // Which handle is currently tracked for move events\n currentTrackingPointer = null;\n // Internal variable to keep track of the focus element\n currentFocusPointer = null;\n // Used to call onStart on the first keydown event\n firstKeyDown = false;\n // Current touch id of touch event being handled\n touchId = null;\n // Values recorded when first dragging the bar\n dragging = new Dragging();\n /* Slider DOM elements */\n // Left selection bar outside two handles\n leftOuterSelectionBarElement;\n // Right selection bar outside two handles\n rightOuterSelectionBarElement;\n // The whole slider bar\n fullBarElement;\n // Highlight between two handles\n selectionBarElement;\n // Left slider handle\n minHandleElement;\n // Right slider handle\n maxHandleElement;\n // Floor label\n floorLabelElement;\n // Ceiling label\n ceilLabelElement;\n // Label above the low value\n minHandleLabelElement;\n // Label above the high value\n maxHandleLabelElement;\n // Combined label\n combinedLabelElement;\n // The ticks\n ticksElement;\n // Optional custom template for displaying tooltips\n tooltipTemplate;\n // Host element class bindings\n sliderElementVerticalClass = false;\n sliderElementAnimateClass = false;\n sliderElementWithLegendClass = false;\n sliderElementDisabledAttr = null;\n sliderElementAriaLabel = \"ngx-slider\";\n // CSS styles and class flags\n barStyle = {};\n minPointerStyle = {};\n maxPointerStyle = {};\n fullBarTransparentClass = false;\n selectionBarDraggableClass = false;\n ticksUnderValuesClass = false;\n // Whether to show/hide ticks\n get showTicks() {\n return this.viewOptions.showTicks;\n }\n /* If tickStep is set or ticksArray is specified.\n In this case, ticks values should be displayed below the slider. */\n intermediateTicks = false;\n // Ticks array as displayed in view\n ticks = [];\n // Event listeners\n eventListenerHelper = null;\n onMoveEventListener = null;\n onEndEventListener = null;\n // Whether currently moving the slider (between onStart() and onEnd())\n moving = false;\n // Observer for slider element resize events\n resizeObserver = null;\n // Callbacks for reactive forms support\n onTouchedCallback = null;\n onChangeCallback = null;\n constructor(renderer, elementRef, changeDetectionRef, zone, allowUnsafeHtmlInSlider) {\n this.renderer = renderer;\n this.elementRef = elementRef;\n this.changeDetectionRef = changeDetectionRef;\n this.zone = zone;\n this.allowUnsafeHtmlInSlider = allowUnsafeHtmlInSlider;\n this.eventListenerHelper = new EventListenerHelper(this.renderer);\n }\n // OnInit interface\n ngOnInit() {\n this.viewOptions = new Options();\n Object.assign(this.viewOptions, this.options);\n // We need to run these two things first, before the rest of the init in ngAfterViewInit(),\n // because these two settings are set through @HostBinding and Angular change detection\n // mechanism doesn't like them changing in ngAfterViewInit()\n this.updateDisabledState();\n this.updateVerticalState();\n this.updateAriaLabel();\n }\n // AfterViewInit interface\n ngAfterViewInit() {\n this.applyOptions();\n this.subscribeInputModelChangeSubject();\n this.subscribeOutputModelChangeSubject();\n // Once we apply options, we need to normalise model values for the first time\n this.renormaliseModelValues();\n this.viewLowValue = this.modelValueToViewValue(this.value);\n if (this.range) {\n this.viewHighValue = this.modelValueToViewValue(this.highValue);\n } else {\n this.viewHighValue = null;\n }\n this.updateVerticalState(); // need to run this again to cover changes to slider elements\n this.manageElementsStyle();\n this.updateDisabledState();\n this.calculateViewDimensions();\n this.addAccessibility();\n this.updateCeilLabel();\n this.updateFloorLabel();\n this.initHandles();\n this.manageEventsBindings();\n this.updateAriaLabel();\n this.subscribeResizeObserver();\n this.initHasRun = true;\n // Run change detection manually to resolve some issues when init procedure changes values used in the view\n if (!this.isRefDestroyed()) {\n this.changeDetectionRef.detectChanges();\n }\n }\n // OnChanges interface\n ngOnChanges(changes) {\n // Always apply options first\n if (!ValueHelper.isNullOrUndefined(changes.options) && JSON.stringify(changes.options.previousValue) !== JSON.stringify(changes.options.currentValue)) {\n this.onChangeOptions();\n }\n // Then value changes\n if (!ValueHelper.isNullOrUndefined(changes.value) || !ValueHelper.isNullOrUndefined(changes.highValue)) {\n this.inputModelChangeSubject.next({\n value: this.value,\n highValue: this.highValue,\n forceChange: false,\n internalChange: false\n });\n }\n }\n // OnDestroy interface\n ngOnDestroy() {\n this.unbindEvents();\n this.unsubscribeResizeObserver();\n this.unsubscribeInputModelChangeSubject();\n this.unsubscribeOutputModelChangeSubject();\n this.unsubscribeManualRefresh();\n this.unsubscribeTriggerFocus();\n }\n // ControlValueAccessor interface\n writeValue(obj) {\n if (obj instanceof Array) {\n this.value = obj[0];\n this.highValue = obj[1];\n } else {\n this.value = obj;\n }\n // ngOnChanges() is not called in this instance, so we need to communicate the change manually\n this.inputModelChangeSubject.next({\n value: this.value,\n highValue: this.highValue,\n forceChange: false,\n internalChange: false\n });\n }\n // ControlValueAccessor interface\n registerOnChange(onChangeCallback) {\n this.onChangeCallback = onChangeCallback;\n }\n // ControlValueAccessor interface\n registerOnTouched(onTouchedCallback) {\n this.onTouchedCallback = onTouchedCallback;\n }\n // ControlValueAccessor interface\n setDisabledState(isDisabled) {\n this.viewOptions.disabled = isDisabled;\n this.updateDisabledState();\n }\n setAriaLabel(ariaLabel) {\n this.viewOptions.ariaLabel = ariaLabel;\n this.updateAriaLabel();\n }\n onResize(event) {\n this.calculateViewDimensionsAndDetectChanges();\n }\n subscribeInputModelChangeSubject() {\n this.inputModelChangeSubscription = this.inputModelChangeSubject.pipe(distinctUntilChanged(ModelChange.compare),\n // Hack to reset the status of the distinctUntilChanged() - if a \"fake\" event comes through with forceChange=true,\n // we forcefully by-pass distinctUntilChanged(), but otherwise drop the event\n filter(modelChange => !modelChange.forceChange && !modelChange.internalChange)).subscribe(modelChange => this.applyInputModelChange(modelChange));\n }\n subscribeOutputModelChangeSubject() {\n this.outputModelChangeSubscription = this.outputModelChangeSubject.pipe(distinctUntilChanged(ModelChange.compare)).subscribe(modelChange => this.publishOutputModelChange(modelChange));\n }\n subscribeResizeObserver() {\n if (CompatibilityHelper.isResizeObserverAvailable()) {\n this.resizeObserver = new ResizeObserver(() => this.calculateViewDimensionsAndDetectChanges());\n this.resizeObserver.observe(this.elementRef.nativeElement);\n }\n }\n unsubscribeResizeObserver() {\n if (CompatibilityHelper.isResizeObserverAvailable() && this.resizeObserver !== null) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n unsubscribeOnMove() {\n if (!ValueHelper.isNullOrUndefined(this.onMoveEventListener)) {\n this.eventListenerHelper.detachEventListener(this.onMoveEventListener);\n this.onMoveEventListener = null;\n }\n }\n unsubscribeOnEnd() {\n if (!ValueHelper.isNullOrUndefined(this.onEndEventListener)) {\n this.eventListenerHelper.detachEventListener(this.onEndEventListener);\n this.onEndEventListener = null;\n }\n }\n unsubscribeInputModelChangeSubject() {\n if (!ValueHelper.isNullOrUndefined(this.inputModelChangeSubscription)) {\n this.inputModelChangeSubscription.unsubscribe();\n this.inputModelChangeSubscription = null;\n }\n }\n unsubscribeOutputModelChangeSubject() {\n if (!ValueHelper.isNullOrUndefined(this.outputModelChangeSubscription)) {\n this.outputModelChangeSubscription.unsubscribe();\n this.outputModelChangeSubscription = null;\n }\n }\n unsubscribeManualRefresh() {\n if (!ValueHelper.isNullOrUndefined(this.manualRefreshSubscription)) {\n this.manualRefreshSubscription.unsubscribe();\n this.manualRefreshSubscription = null;\n }\n }\n unsubscribeTriggerFocus() {\n if (!ValueHelper.isNullOrUndefined(this.triggerFocusSubscription)) {\n this.triggerFocusSubscription.unsubscribe();\n this.triggerFocusSubscription = null;\n }\n }\n getPointerElement(pointerType) {\n if (pointerType === PointerType.Min) {\n return this.minHandleElement;\n } else if (pointerType === PointerType.Max) {\n return this.maxHandleElement;\n }\n return null;\n }\n getCurrentTrackingValue() {\n if (this.currentTrackingPointer === PointerType.Min) {\n return this.viewLowValue;\n } else if (this.currentTrackingPointer === PointerType.Max) {\n return this.viewHighValue;\n }\n return null;\n }\n modelValueToViewValue(modelValue) {\n if (ValueHelper.isNullOrUndefined(modelValue)) {\n return NaN;\n }\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.stepsArray) && !this.viewOptions.bindIndexForStepsArray) {\n return ValueHelper.findStepIndex(+modelValue, this.viewOptions.stepsArray);\n }\n return +modelValue;\n }\n viewValueToModelValue(viewValue) {\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.stepsArray) && !this.viewOptions.bindIndexForStepsArray) {\n return this.getStepValue(viewValue);\n }\n return viewValue;\n }\n getStepValue(sliderValue) {\n const step = this.viewOptions.stepsArray[sliderValue];\n return !ValueHelper.isNullOrUndefined(step) ? step.value : NaN;\n }\n applyViewChange() {\n this.value = this.viewValueToModelValue(this.viewLowValue);\n if (this.range) {\n this.highValue = this.viewValueToModelValue(this.viewHighValue);\n }\n this.outputModelChangeSubject.next({\n value: this.value,\n highValue: this.highValue,\n userEventInitiated: true,\n forceChange: false\n });\n // At this point all changes are applied and outputs are emitted, so we should be done.\n // However, input changes are communicated in different stream and we need to be ready to\n // act on the next input change even if it is exactly the same as last input change.\n // Therefore, we send a special event to reset the stream.\n this.inputModelChangeSubject.next({\n value: this.value,\n highValue: this.highValue,\n forceChange: false,\n internalChange: true\n });\n }\n // Apply model change to the slider view\n applyInputModelChange(modelChange) {\n const normalisedModelChange = this.normaliseModelValues(modelChange);\n // If normalised model change is different, apply the change to the model values\n const normalisationChange = !ModelValues.compare(modelChange, normalisedModelChange);\n if (normalisationChange) {\n this.value = normalisedModelChange.value;\n this.highValue = normalisedModelChange.highValue;\n }\n this.viewLowValue = this.modelValueToViewValue(normalisedModelChange.value);\n if (this.range) {\n this.viewHighValue = this.modelValueToViewValue(normalisedModelChange.highValue);\n } else {\n this.viewHighValue = null;\n }\n this.updateLowHandle(this.valueToPosition(this.viewLowValue));\n if (this.range) {\n this.updateHighHandle(this.valueToPosition(this.viewHighValue));\n }\n this.updateSelectionBar();\n this.updateTicksScale();\n this.updateAriaAttributes();\n if (this.range) {\n this.updateCombinedLabel();\n }\n // At the end, we need to communicate the model change to the outputs as well\n // Normalisation changes are also always forced out to ensure that subscribers always end up in correct state\n this.outputModelChangeSubject.next({\n value: normalisedModelChange.value,\n highValue: normalisedModelChange.highValue,\n forceChange: normalisationChange,\n userEventInitiated: false\n });\n }\n // Publish model change to output event emitters and registered callbacks\n publishOutputModelChange(modelChange) {\n const emitOutputs = () => {\n this.valueChange.emit(modelChange.value);\n if (this.range) {\n this.highValueChange.emit(modelChange.highValue);\n }\n if (!ValueHelper.isNullOrUndefined(this.onChangeCallback)) {\n if (this.range) {\n this.onChangeCallback([modelChange.value, modelChange.highValue]);\n } else {\n this.onChangeCallback(modelChange.value);\n }\n }\n if (!ValueHelper.isNullOrUndefined(this.onTouchedCallback)) {\n if (this.range) {\n this.onTouchedCallback([modelChange.value, modelChange.highValue]);\n } else {\n this.onTouchedCallback(modelChange.value);\n }\n }\n };\n if (modelChange.userEventInitiated) {\n // If this change was initiated by a user event, we can emit outputs in the same tick\n emitOutputs();\n this.userChange.emit(this.getChangeContext());\n } else {\n // But, if the change was initated by something else like a change in input bindings,\n // we need to wait until next tick to emit the outputs to keep Angular change detection happy\n setTimeout(() => {\n emitOutputs();\n });\n }\n }\n normaliseModelValues(input) {\n const normalisedInput = new ModelValues();\n normalisedInput.value = input.value;\n normalisedInput.highValue = input.highValue;\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.stepsArray)) {\n // When using steps array, only round to nearest step in the array\n // No other enforcement can be done, as the step array may be out of order, and that is perfectly fine\n if (this.viewOptions.enforceStepsArray) {\n const valueIndex = ValueHelper.findStepIndex(normalisedInput.value, this.viewOptions.stepsArray);\n normalisedInput.value = this.viewOptions.stepsArray[valueIndex].value;\n if (this.range) {\n const highValueIndex = ValueHelper.findStepIndex(normalisedInput.highValue, this.viewOptions.stepsArray);\n normalisedInput.highValue = this.viewOptions.stepsArray[highValueIndex].value;\n }\n }\n return normalisedInput;\n }\n if (this.viewOptions.enforceStep) {\n normalisedInput.value = this.roundStep(normalisedInput.value);\n if (this.range) {\n normalisedInput.highValue = this.roundStep(normalisedInput.highValue);\n }\n }\n if (this.viewOptions.enforceRange) {\n normalisedInput.value = MathHelper.clampToRange(normalisedInput.value, this.viewOptions.floor, this.viewOptions.ceil);\n if (this.range) {\n normalisedInput.highValue = MathHelper.clampToRange(normalisedInput.highValue, this.viewOptions.floor, this.viewOptions.ceil);\n }\n // Make sure that range slider invariant (value <= highValue) is always satisfied\n if (this.range && input.value > input.highValue) {\n // We know that both values are now clamped correctly, they may just be in the wrong order\n // So the easy solution is to swap them... except swapping is sometimes disabled in options, so we make the two values the same\n if (this.viewOptions.noSwitching) {\n normalisedInput.value = normalisedInput.highValue;\n } else {\n const tempValue = input.value;\n normalisedInput.value = input.highValue;\n normalisedInput.highValue = tempValue;\n }\n }\n }\n return normalisedInput;\n }\n renormaliseModelValues() {\n const previousModelValues = {\n value: this.value,\n highValue: this.highValue\n };\n const normalisedModelValues = this.normaliseModelValues(previousModelValues);\n if (!ModelValues.compare(normalisedModelValues, previousModelValues)) {\n this.value = normalisedModelValues.value;\n this.highValue = normalisedModelValues.highValue;\n this.outputModelChangeSubject.next({\n value: this.value,\n highValue: this.highValue,\n forceChange: true,\n userEventInitiated: false\n });\n }\n }\n onChangeOptions() {\n if (!this.initHasRun) {\n return;\n }\n const previousOptionsInfluencingEventBindings = this.getOptionsInfluencingEventBindings(this.viewOptions);\n this.applyOptions();\n const newOptionsInfluencingEventBindings = this.getOptionsInfluencingEventBindings(this.viewOptions);\n // Avoid re-binding events in case nothing changes that can influence it\n // It makes it possible to change options while dragging the slider\n const rebindEvents = !ValueHelper.areArraysEqual(previousOptionsInfluencingEventBindings, newOptionsInfluencingEventBindings);\n // With new options, we need to re-normalise model values if necessary\n this.renormaliseModelValues();\n this.viewLowValue = this.modelValueToViewValue(this.value);\n if (this.range) {\n this.viewHighValue = this.modelValueToViewValue(this.highValue);\n } else {\n this.viewHighValue = null;\n }\n this.resetSlider(rebindEvents);\n }\n // Read the user options and apply them to the slider model\n applyOptions() {\n this.viewOptions = new Options();\n Object.assign(this.viewOptions, this.options);\n this.viewOptions.draggableRange = this.range && this.viewOptions.draggableRange;\n this.viewOptions.draggableRangeOnly = this.range && this.viewOptions.draggableRangeOnly;\n if (this.viewOptions.draggableRangeOnly) {\n this.viewOptions.draggableRange = true;\n }\n this.viewOptions.showTicks = this.viewOptions.showTicks || this.viewOptions.showTicksValues || !ValueHelper.isNullOrUndefined(this.viewOptions.ticksArray);\n if (this.viewOptions.showTicks && (!ValueHelper.isNullOrUndefined(this.viewOptions.tickStep) || !ValueHelper.isNullOrUndefined(this.viewOptions.ticksArray))) {\n this.intermediateTicks = true;\n }\n this.viewOptions.showSelectionBar = this.viewOptions.showSelectionBar || this.viewOptions.showSelectionBarEnd || !ValueHelper.isNullOrUndefined(this.viewOptions.showSelectionBarFromValue);\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.stepsArray)) {\n this.applyStepsArrayOptions();\n } else {\n this.applyFloorCeilOptions();\n }\n if (ValueHelper.isNullOrUndefined(this.viewOptions.combineLabels)) {\n this.viewOptions.combineLabels = (minValue, maxValue) => {\n return minValue + \" - \" + maxValue;\n };\n }\n if (this.viewOptions.logScale && this.viewOptions.floor === 0) {\n throw Error(\"Can't use floor=0 with logarithmic scale\");\n }\n }\n applyStepsArrayOptions() {\n this.viewOptions.floor = 0;\n this.viewOptions.ceil = this.viewOptions.stepsArray.length - 1;\n this.viewOptions.step = 1;\n if (ValueHelper.isNullOrUndefined(this.viewOptions.translate)) {\n this.viewOptions.translate = modelValue => {\n if (this.viewOptions.bindIndexForStepsArray) {\n return String(this.getStepValue(modelValue));\n }\n return String(modelValue);\n };\n }\n }\n applyFloorCeilOptions() {\n if (ValueHelper.isNullOrUndefined(this.viewOptions.step)) {\n this.viewOptions.step = 1;\n } else {\n this.viewOptions.step = +this.viewOptions.step;\n if (this.viewOptions.step <= 0) {\n this.viewOptions.step = 1;\n }\n }\n if (ValueHelper.isNullOrUndefined(this.viewOptions.ceil) || ValueHelper.isNullOrUndefined(this.viewOptions.floor)) {\n throw Error(\"floor and ceil options must be supplied\");\n }\n this.viewOptions.ceil = +this.viewOptions.ceil;\n this.viewOptions.floor = +this.viewOptions.floor;\n if (ValueHelper.isNullOrUndefined(this.viewOptions.translate)) {\n this.viewOptions.translate = value => String(value);\n }\n }\n // Resets slider\n resetSlider(rebindEvents = true) {\n this.manageElementsStyle();\n this.addAccessibility();\n this.updateCeilLabel();\n this.updateFloorLabel();\n if (rebindEvents) {\n this.unbindEvents();\n this.manageEventsBindings();\n }\n this.updateDisabledState();\n this.updateAriaLabel();\n this.calculateViewDimensions();\n // this.refocusPointerIfNeeded();\n }\n // Sets focus on the specified pointer\n focusPointer(pointerType) {\n // If not supplied, use min pointer as default\n if (pointerType !== PointerType.Min && pointerType !== PointerType.Max) {\n pointerType = PointerType.Min;\n }\n if (pointerType === PointerType.Min) {\n this.minHandleElement.focus();\n } else if (this.range && pointerType === PointerType.Max) {\n this.maxHandleElement.focus();\n }\n }\n refocusPointerIfNeeded() {\n if (!ValueHelper.isNullOrUndefined(this.currentFocusPointer)) {\n this.onPointerFocus(this.currentFocusPointer);\n const element = this.getPointerElement(this.currentFocusPointer);\n element.focus();\n }\n }\n // Update each elements style based on options\n manageElementsStyle() {\n this.updateScale();\n this.floorLabelElement.setAlwaysHide(this.viewOptions.showTicksValues || this.viewOptions.hideLimitLabels);\n this.ceilLabelElement.setAlwaysHide(this.viewOptions.showTicksValues || this.viewOptions.hideLimitLabels);\n const hideLabelsForTicks = this.viewOptions.showTicksValues && !this.intermediateTicks;\n this.minHandleLabelElement.setAlwaysHide(hideLabelsForTicks || this.viewOptions.hidePointerLabels);\n this.maxHandleLabelElement.setAlwaysHide(hideLabelsForTicks || !this.range || this.viewOptions.hidePointerLabels);\n this.combinedLabelElement.setAlwaysHide(hideLabelsForTicks || !this.range || this.viewOptions.hidePointerLabels);\n this.selectionBarElement.setAlwaysHide(!this.range && !this.viewOptions.showSelectionBar);\n this.leftOuterSelectionBarElement.setAlwaysHide(!this.range || !this.viewOptions.showOuterSelectionBars);\n this.rightOuterSelectionBarElement.setAlwaysHide(!this.range || !this.viewOptions.showOuterSelectionBars);\n this.fullBarTransparentClass = this.range && this.viewOptions.showOuterSelectionBars;\n this.selectionBarDraggableClass = this.viewOptions.draggableRange && !this.viewOptions.onlyBindHandles;\n this.ticksUnderValuesClass = this.intermediateTicks && this.options.showTicksValues;\n if (this.sliderElementVerticalClass !== this.viewOptions.vertical) {\n this.updateVerticalState();\n // The above change in host component class will not be applied until the end of this cycle\n // However, functions calculating the slider position expect the slider to be already styled as vertical\n // So as a workaround, we need to reset the slider once again to compute the correct values\n setTimeout(() => {\n this.resetSlider();\n });\n }\n // Changing animate class may interfere with slider reset/initialisation, so we should set it separately,\n // after all is properly set up\n if (this.sliderElementAnimateClass !== this.viewOptions.animate) {\n setTimeout(() => {\n this.sliderElementAnimateClass = this.viewOptions.animate;\n });\n }\n this.updateRotate();\n }\n // Manage the events bindings based on readOnly and disabled options\n manageEventsBindings() {\n if (this.viewOptions.disabled || this.viewOptions.readOnly) {\n this.unbindEvents();\n } else {\n this.bindEvents();\n }\n }\n // Set the disabled state based on disabled option\n updateDisabledState() {\n this.sliderElementDisabledAttr = this.viewOptions.disabled ? \"disabled\" : null;\n }\n // Set the aria-label state based on ariaLabel option\n updateAriaLabel() {\n this.sliderElementAriaLabel = this.viewOptions.ariaLabel || \"nxg-slider\";\n }\n // Set vertical state based on vertical option\n updateVerticalState() {\n this.sliderElementVerticalClass = this.viewOptions.vertical;\n for (const element of this.getAllSliderElements()) {\n // This is also called before ngAfterInit, so need to check that view child bindings work\n if (!ValueHelper.isNullOrUndefined(element)) {\n element.setVertical(this.viewOptions.vertical);\n }\n }\n }\n updateScale() {\n for (const element of this.getAllSliderElements()) {\n element.setScale(this.viewOptions.scale);\n }\n }\n updateRotate() {\n for (const element of this.getAllSliderElements()) {\n element.setRotate(this.viewOptions.rotate);\n }\n }\n getAllSliderElements() {\n return [this.leftOuterSelectionBarElement, this.rightOuterSelectionBarElement, this.fullBarElement, this.selectionBarElement, this.minHandleElement, this.maxHandleElement, this.floorLabelElement, this.ceilLabelElement, this.minHandleLabelElement, this.maxHandleLabelElement, this.combinedLabelElement, this.ticksElement];\n }\n // Initialize slider handles positions and labels\n // Run only once during initialization and every time view port changes size\n initHandles() {\n this.updateLowHandle(this.valueToPosition(this.viewLowValue));\n /*\n the order here is important since the selection bar should be\n updated after the high handle but before the combined label\n */\n if (this.range) {\n this.updateHighHandle(this.valueToPosition(this.viewHighValue));\n }\n this.updateSelectionBar();\n if (this.range) {\n this.updateCombinedLabel();\n }\n this.updateTicksScale();\n }\n // Adds accessibility attributes, run only once during initialization\n addAccessibility() {\n this.updateAriaAttributes();\n this.minHandleElement.role = \"slider\";\n if (this.viewOptions.keyboardSupport && !(this.viewOptions.readOnly || this.viewOptions.disabled)) {\n this.minHandleElement.tabindex = \"0\";\n } else {\n this.minHandleElement.tabindex = \"\";\n }\n this.minHandleElement.ariaOrientation = this.viewOptions.vertical || this.viewOptions.rotate !== 0 ? \"vertical\" : \"horizontal\";\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.ariaLabel)) {\n this.minHandleElement.ariaLabel = this.viewOptions.ariaLabel;\n } else if (!ValueHelper.isNullOrUndefined(this.viewOptions.ariaLabelledBy)) {\n this.minHandleElement.ariaLabelledBy = this.viewOptions.ariaLabelledBy;\n }\n if (this.range) {\n this.maxHandleElement.role = \"slider\";\n if (this.viewOptions.keyboardSupport && !(this.viewOptions.readOnly || this.viewOptions.disabled)) {\n this.maxHandleElement.tabindex = \"0\";\n } else {\n this.maxHandleElement.tabindex = \"\";\n }\n this.maxHandleElement.ariaOrientation = this.viewOptions.vertical || this.viewOptions.rotate !== 0 ? \"vertical\" : \"horizontal\";\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.ariaLabelHigh)) {\n this.maxHandleElement.ariaLabel = this.viewOptions.ariaLabelHigh;\n } else if (!ValueHelper.isNullOrUndefined(this.viewOptions.ariaLabelledByHigh)) {\n this.maxHandleElement.ariaLabelledBy = this.viewOptions.ariaLabelledByHigh;\n }\n }\n }\n // Updates aria attributes according to current values\n updateAriaAttributes() {\n this.minHandleElement.ariaValueNow = (+this.value).toString();\n this.minHandleElement.ariaValueText = this.viewOptions.translate(+this.value, LabelType.Low);\n this.minHandleElement.ariaValueMin = this.viewOptions.floor.toString();\n this.minHandleElement.ariaValueMax = this.viewOptions.ceil.toString();\n if (this.range) {\n this.maxHandleElement.ariaValueNow = (+this.highValue).toString();\n this.maxHandleElement.ariaValueText = this.viewOptions.translate(+this.highValue, LabelType.High);\n this.maxHandleElement.ariaValueMin = this.viewOptions.floor.toString();\n this.maxHandleElement.ariaValueMax = this.viewOptions.ceil.toString();\n }\n }\n // Calculate dimensions that are dependent on view port size\n // Run once during initialization and every time view port changes size.\n calculateViewDimensions() {\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.handleDimension)) {\n this.minHandleElement.setDimension(this.viewOptions.handleDimension);\n } else {\n this.minHandleElement.calculateDimension();\n }\n const handleWidth = this.minHandleElement.dimension;\n this.handleHalfDimension = handleWidth / 2;\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.barDimension)) {\n this.fullBarElement.setDimension(this.viewOptions.barDimension);\n } else {\n this.fullBarElement.calculateDimension();\n }\n this.maxHandlePosition = this.fullBarElement.dimension - handleWidth;\n if (this.initHasRun) {\n this.updateFloorLabel();\n this.updateCeilLabel();\n this.initHandles();\n }\n }\n calculateViewDimensionsAndDetectChanges() {\n this.calculateViewDimensions();\n if (!this.isRefDestroyed()) {\n this.changeDetectionRef.detectChanges();\n }\n }\n /**\n * If the slider reference is already destroyed\n * @returns boolean - true if ref is destroyed\n */\n isRefDestroyed() {\n return this.changeDetectionRef[\"destroyed\"];\n }\n // Update the ticks position\n updateTicksScale() {\n if (!this.viewOptions.showTicks && this.sliderElementWithLegendClass) {\n setTimeout(() => {\n this.sliderElementWithLegendClass = false;\n });\n return;\n }\n const ticksArray = !ValueHelper.isNullOrUndefined(this.viewOptions.ticksArray) ? this.viewOptions.ticksArray : this.getTicksArray();\n const translate = this.viewOptions.vertical ? \"translateY\" : \"translateX\";\n if (this.viewOptions.rightToLeft) {\n ticksArray.reverse();\n }\n const tickValueStep = !ValueHelper.isNullOrUndefined(this.viewOptions.tickValueStep) ? this.viewOptions.tickValueStep : !ValueHelper.isNullOrUndefined(this.viewOptions.tickStep) ? this.viewOptions.tickStep : this.viewOptions.step;\n let hasAtLeastOneLegend = false;\n const newTicks = ticksArray.map(value => {\n let position = this.valueToPosition(value);\n if (this.viewOptions.vertical) {\n position = this.maxHandlePosition - position;\n }\n const translation = translate + \"(\" + Math.round(position) + \"px)\";\n const tick = new Tick();\n tick.selected = this.isTickSelected(value);\n tick.style = {\n \"-webkit-transform\": translation,\n \"-moz-transform\": translation,\n \"-o-transform\": translation,\n \"-ms-transform\": translation,\n transform: translation\n };\n if (tick.selected && !ValueHelper.isNullOrUndefined(this.viewOptions.getSelectionBarColor)) {\n tick.style[\"background-color\"] = this.getSelectionBarColor();\n }\n if (!tick.selected && !ValueHelper.isNullOrUndefined(this.viewOptions.getTickColor)) {\n tick.style[\"background-color\"] = this.getTickColor(value);\n }\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.ticksTooltip)) {\n tick.tooltip = this.viewOptions.ticksTooltip(value);\n tick.tooltipPlacement = this.viewOptions.vertical ? \"right\" : \"top\";\n }\n if (this.viewOptions.showTicksValues && !ValueHelper.isNullOrUndefined(tickValueStep) && MathHelper.isModuloWithinPrecisionLimit(value, tickValueStep, this.viewOptions.precisionLimit)) {\n tick.value = this.getDisplayValue(value, LabelType.TickValue);\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.ticksValuesTooltip)) {\n tick.valueTooltip = this.viewOptions.ticksValuesTooltip(value);\n tick.valueTooltipPlacement = this.viewOptions.vertical ? \"right\" : \"top\";\n }\n }\n let legend = null;\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.stepsArray)) {\n const step = this.viewOptions.stepsArray[value];\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.getStepLegend)) {\n legend = this.viewOptions.getStepLegend(step);\n } else if (!ValueHelper.isNullOrUndefined(step)) {\n legend = step.legend;\n }\n } else if (!ValueHelper.isNullOrUndefined(this.viewOptions.getLegend)) {\n legend = this.viewOptions.getLegend(value);\n }\n if (!ValueHelper.isNullOrUndefined(legend)) {\n tick.legend = legend;\n hasAtLeastOneLegend = true;\n }\n return tick;\n });\n if (this.sliderElementWithLegendClass !== hasAtLeastOneLegend) {\n setTimeout(() => {\n this.sliderElementWithLegendClass = hasAtLeastOneLegend;\n });\n }\n // We should avoid re-creating the ticks array if possible\n // This both improves performance and makes CSS animations work correctly\n if (!ValueHelper.isNullOrUndefined(this.ticks) && this.ticks.length === newTicks.length) {\n for (let i = 0; i < newTicks.length; ++i) {\n Object.assign(this.ticks[i], newTicks[i]);\n }\n } else {\n this.ticks = newTicks;\n if (!this.isRefDestroyed()) {\n this.changeDetectionRef.detectChanges();\n }\n }\n }\n getTicksArray() {\n const step = !ValueHelper.isNullOrUndefined(this.viewOptions.tickStep) ? this.viewOptions.tickStep : this.viewOptions.step;\n const ticksArray = [];\n const numberOfValues = 1 + Math.floor(MathHelper.roundToPrecisionLimit(Math.abs(this.viewOptions.ceil - this.viewOptions.floor) / step, this.viewOptions.precisionLimit));\n for (let index = 0; index < numberOfValues; ++index) {\n ticksArray.push(MathHelper.roundToPrecisionLimit(this.viewOptions.floor + step * index, this.viewOptions.precisionLimit));\n }\n return ticksArray;\n }\n isTickSelected(value) {\n if (!this.range) {\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.showSelectionBarFromValue)) {\n const center = this.viewOptions.showSelectionBarFromValue;\n if (this.viewLowValue > center && value >= center && value <= this.viewLowValue) {\n return true;\n } else if (this.viewLowValue < center && value <= center && value >= this.viewLowValue) {\n return true;\n }\n } else if (this.viewOptions.showSelectionBarEnd) {\n if (value >= this.viewLowValue) {\n return true;\n }\n } else if (this.viewOptions.showSelectionBar && value <= this.viewLowValue) {\n return true;\n }\n }\n if (this.range && value >= this.viewLowValue && value <= this.viewHighValue) {\n return true;\n }\n return false;\n }\n // Update position of the floor label\n updateFloorLabel() {\n if (!this.floorLabelElement.alwaysHide) {\n this.floorLabelElement.setValue(this.getDisplayValue(this.viewOptions.floor, LabelType.Floor));\n this.floorLabelElement.calculateDimension();\n const position = this.viewOptions.rightToLeft ? this.fullBarElement.dimension - this.floorLabelElement.dimension : 0;\n this.floorLabelElement.setPosition(position);\n }\n }\n // Update position of the ceiling label\n updateCeilLabel() {\n if (!this.ceilLabelElement.alwaysHide) {\n this.ceilLabelElement.setValue(this.getDisplayValue(this.viewOptions.ceil, LabelType.Ceil));\n this.ceilLabelElement.calculateDimension();\n const position = this.viewOptions.rightToLeft ? 0 : this.fullBarElement.dimension - this.ceilLabelElement.dimension;\n this.ceilLabelElement.setPosition(position);\n }\n }\n // Update slider handles and label positions\n updateHandles(which, newPos) {\n if (which === PointerType.Min) {\n this.updateLowHandle(newPos);\n } else if (which === PointerType.Max) {\n this.updateHighHandle(newPos);\n }\n this.updateSelectionBar();\n this.updateTicksScale();\n if (this.range) {\n this.updateCombinedLabel();\n }\n }\n // Helper function to work out the position for handle labels depending on RTL or not\n getHandleLabelPos(labelType, newPos) {\n const labelDimension = labelType === PointerType.Min ? this.minHandleLabelElement.dimension : this.maxHandleLabelElement.dimension;\n const nearHandlePos = newPos - labelDimension / 2 + this.handleHalfDimension;\n const endOfBarPos = this.fullBarElement.dimension - labelDimension;\n if (!this.viewOptions.boundPointerLabels) {\n return nearHandlePos;\n }\n if (this.viewOptions.rightToLeft && labelType === PointerType.Min || !this.viewOptions.rightToLeft && labelType === PointerType.Max) {\n return Math.min(nearHandlePos, endOfBarPos);\n } else {\n return Math.min(Math.max(nearHandlePos, 0), endOfBarPos);\n }\n }\n // Update low slider handle position and label\n updateLowHandle(newPos) {\n this.minHandleElement.setPosition(newPos);\n this.minHandleLabelElement.setValue(this.getDisplayValue(this.viewLowValue, LabelType.Low));\n this.minHandleLabelElement.setPosition(this.getHandleLabelPos(PointerType.Min, newPos));\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.getPointerColor)) {\n this.minPointerStyle = {\n backgroundColor: this.getPointerColor(PointerType.Min)\n };\n }\n if (this.viewOptions.autoHideLimitLabels) {\n this.updateFloorAndCeilLabelsVisibility();\n }\n }\n // Update high slider handle position and label\n updateHighHandle(newPos) {\n this.maxHandleElement.setPosition(newPos);\n this.maxHandleLabelElement.setValue(this.getDisplayValue(this.viewHighValue, LabelType.High));\n this.maxHandleLabelElement.setPosition(this.getHandleLabelPos(PointerType.Max, newPos));\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.getPointerColor)) {\n this.maxPointerStyle = {\n backgroundColor: this.getPointerColor(PointerType.Max)\n };\n }\n if (this.viewOptions.autoHideLimitLabels) {\n this.updateFloorAndCeilLabelsVisibility();\n }\n }\n // Show/hide floor/ceiling label\n updateFloorAndCeilLabelsVisibility() {\n // Show based only on hideLimitLabels if pointer labels are hidden\n if (this.viewOptions.hidePointerLabels) {\n return;\n }\n let floorLabelHidden = false;\n let ceilLabelHidden = false;\n const isMinLabelAtFloor = this.isLabelBelowFloorLabel(this.minHandleLabelElement);\n const isMinLabelAtCeil = this.isLabelAboveCeilLabel(this.minHandleLabelElement);\n const isMaxLabelAtCeil = this.isLabelAboveCeilLabel(this.maxHandleLabelElement);\n const isCombinedLabelAtFloor = this.isLabelBelowFloorLabel(this.combinedLabelElement);\n const isCombinedLabelAtCeil = this.isLabelAboveCeilLabel(this.combinedLabelElement);\n if (isMinLabelAtFloor) {\n floorLabelHidden = true;\n this.floorLabelElement.hide();\n } else {\n floorLabelHidden = false;\n this.floorLabelElement.show();\n }\n if (isMinLabelAtCeil) {\n ceilLabelHidden = true;\n this.ceilLabelElement.hide();\n } else {\n ceilLabelHidden = false;\n this.ceilLabelElement.show();\n }\n if (this.range) {\n const hideCeil = this.combinedLabelElement.isVisible() ? isCombinedLabelAtCeil : isMaxLabelAtCeil;\n const hideFloor = this.combinedLabelElement.isVisible() ? isCombinedLabelAtFloor : isMinLabelAtFloor;\n if (hideCeil) {\n this.ceilLabelElement.hide();\n } else if (!ceilLabelHidden) {\n this.ceilLabelElement.show();\n }\n // Hide or show floor label\n if (hideFloor) {\n this.floorLabelElement.hide();\n } else if (!floorLabelHidden) {\n this.floorLabelElement.show();\n }\n }\n }\n isLabelBelowFloorLabel(label) {\n const pos = label.position;\n const dim = label.dimension;\n const floorPos = this.floorLabelElement.position;\n const floorDim = this.floorLabelElement.dimension;\n return this.viewOptions.rightToLeft ? pos + dim >= floorPos - 2 : pos <= floorPos + floorDim + 2;\n }\n isLabelAboveCeilLabel(label) {\n const pos = label.position;\n const dim = label.dimension;\n const ceilPos = this.ceilLabelElement.position;\n const ceilDim = this.ceilLabelElement.dimension;\n return this.viewOptions.rightToLeft ? pos <= ceilPos + ceilDim + 2 : pos + dim >= ceilPos - 2;\n }\n // Update slider selection bar, combined label and range label\n updateSelectionBar() {\n let position = 0;\n let dimension = 0;\n const isSelectionBarFromRight = this.viewOptions.rightToLeft ? !this.viewOptions.showSelectionBarEnd : this.viewOptions.showSelectionBarEnd;\n const positionForRange = this.viewOptions.rightToLeft ? this.maxHandleElement.position + this.handleHalfDimension : this.minHandleElement.position + this.handleHalfDimension;\n if (this.range) {\n dimension = Math.abs(this.maxHandleElement.position - this.minHandleElement.position);\n position = positionForRange;\n } else {\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.showSelectionBarFromValue)) {\n const center = this.viewOptions.showSelectionBarFromValue;\n const centerPosition = this.valueToPosition(center);\n const isModelGreaterThanCenter = this.viewOptions.rightToLeft ? this.viewLowValue <= center : this.viewLowValue > center;\n if (isModelGreaterThanCenter) {\n dimension = this.minHandleElement.position - centerPosition;\n position = centerPosition + this.handleHalfDimension;\n } else {\n dimension = centerPosition - this.minHandleElement.position;\n position = this.minHandleElement.position + this.handleHalfDimension;\n }\n } else if (isSelectionBarFromRight) {\n dimension = Math.ceil(Math.abs(this.maxHandlePosition - this.minHandleElement.position) + this.handleHalfDimension);\n position = Math.floor(this.minHandleElement.position + this.handleHalfDimension);\n } else {\n dimension = this.minHandleElement.position + this.handleHalfDimension;\n position = 0;\n }\n }\n this.selectionBarElement.setDimension(dimension);\n this.selectionBarElement.setPosition(position);\n if (this.range && this.viewOptions.showOuterSelectionBars) {\n if (this.viewOptions.rightToLeft) {\n this.rightOuterSelectionBarElement.setDimension(position);\n this.rightOuterSelectionBarElement.setPosition(0);\n this.fullBarElement.calculateDimension();\n this.leftOuterSelectionBarElement.setDimension(this.fullBarElement.dimension - (position + dimension));\n this.leftOuterSelectionBarElement.setPosition(position + dimension);\n } else {\n this.leftOuterSelectionBarElement.setDimension(position);\n this.leftOuterSelectionBarElement.setPosition(0);\n this.fullBarElement.calculateDimension();\n this.rightOuterSelectionBarElement.setDimension(this.fullBarElement.dimension - (position + dimension));\n this.rightOuterSelectionBarElement.setPosition(position + dimension);\n }\n }\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.getSelectionBarColor)) {\n const color = this.getSelectionBarColor();\n this.barStyle = {\n backgroundColor: color\n };\n } else if (!ValueHelper.isNullOrUndefined(this.viewOptions.selectionBarGradient)) {\n const offset = !ValueHelper.isNullOrUndefined(this.viewOptions.showSelectionBarFromValue) ? this.valueToPosition(this.viewOptions.showSelectionBarFromValue) : 0;\n const reversed = offset - position > 0 && !isSelectionBarFromRight || offset - position <= 0 && isSelectionBarFromRight;\n const direction = this.viewOptions.vertical ? reversed ? \"bottom\" : \"top\" : reversed ? \"left\" : \"right\";\n this.barStyle = {\n backgroundImage: \"linear-gradient(to \" + direction + \", \" + this.viewOptions.selectionBarGradient.from + \" 0%,\" + this.viewOptions.selectionBarGradient.to + \" 100%)\"\n };\n if (this.viewOptions.vertical) {\n this.barStyle.backgroundPosition = \"center \" + (offset + dimension + position + (reversed ? -this.handleHalfDimension : 0)) + \"px\";\n this.barStyle.backgroundSize = \"100% \" + (this.fullBarElement.dimension - this.handleHalfDimension) + \"px\";\n } else {\n this.barStyle.backgroundPosition = offset - position + (reversed ? this.handleHalfDimension : 0) + \"px center\";\n this.barStyle.backgroundSize = this.fullBarElement.dimension - this.handleHalfDimension + \"px 100%\";\n }\n }\n }\n // Wrapper around the getSelectionBarColor of the user to pass to correct parameters\n getSelectionBarColor() {\n if (this.range) {\n return this.viewOptions.getSelectionBarColor(this.value, this.highValue);\n }\n return this.viewOptions.getSelectionBarColor(this.value);\n }\n // Wrapper around the getPointerColor of the user to pass to correct parameters\n getPointerColor(pointerType) {\n if (pointerType === PointerType.Max) {\n return this.viewOptions.getPointerColor(this.highValue, pointerType);\n }\n return this.viewOptions.getPointerColor(this.value, pointerType);\n }\n // Wrapper around the getTickColor of the user to pass to correct parameters\n getTickColor(value) {\n return this.viewOptions.getTickColor(value);\n }\n // Update combined label position and value\n updateCombinedLabel() {\n let isLabelOverlap = null;\n if (this.viewOptions.rightToLeft) {\n isLabelOverlap = this.minHandleLabelElement.position - this.minHandleLabelElement.dimension - 10 <= this.maxHandleLabelElement.position;\n } else {\n isLabelOverlap = this.minHandleLabelElement.position + this.minHandleLabelElement.dimension + 10 >= this.maxHandleLabelElement.position;\n }\n if (isLabelOverlap) {\n const lowDisplayValue = this.getDisplayValue(this.viewLowValue, LabelType.Low);\n const highDisplayValue = this.getDisplayValue(this.viewHighValue, LabelType.High);\n const combinedLabelValue = this.viewOptions.rightToLeft ? this.viewOptions.combineLabels(highDisplayValue, lowDisplayValue) : this.viewOptions.combineLabels(lowDisplayValue, highDisplayValue);\n this.combinedLabelElement.setValue(combinedLabelValue);\n const pos = this.viewOptions.boundPointerLabels ? Math.min(Math.max(this.selectionBarElement.position + this.selectionBarElement.dimension / 2 - this.combinedLabelElement.dimension / 2, 0), this.fullBarElement.dimension - this.combinedLabelElement.dimension) : this.selectionBarElement.position + this.selectionBarElement.dimension / 2 - this.combinedLabelElement.dimension / 2;\n this.combinedLabelElement.setPosition(pos);\n this.minHandleLabelElement.hide();\n this.maxHandleLabelElement.hide();\n this.combinedLabelElement.show();\n } else {\n this.updateHighHandle(this.valueToPosition(this.viewHighValue));\n this.updateLowHandle(this.valueToPosition(this.viewLowValue));\n this.maxHandleLabelElement.show();\n this.minHandleLabelElement.show();\n this.combinedLabelElement.hide();\n }\n if (this.viewOptions.autoHideLimitLabels) {\n this.updateFloorAndCeilLabelsVisibility();\n }\n }\n // Return the translated value if a translate function is provided else the original value\n getDisplayValue(value, which) {\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.stepsArray) && !this.viewOptions.bindIndexForStepsArray) {\n value = this.getStepValue(value);\n }\n return this.viewOptions.translate(value, which);\n }\n // Round value to step and precision based on minValue\n roundStep(value, customStep) {\n const step = !ValueHelper.isNullOrUndefined(customStep) ? customStep : this.viewOptions.step;\n let steppedDifference = MathHelper.roundToPrecisionLimit((value - this.viewOptions.floor) / step, this.viewOptions.precisionLimit);\n steppedDifference = Math.round(steppedDifference) * step;\n return MathHelper.roundToPrecisionLimit(this.viewOptions.floor + steppedDifference, this.viewOptions.precisionLimit);\n }\n // Translate value to pixel position\n valueToPosition(val) {\n let fn = ValueHelper.linearValueToPosition;\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.customValueToPosition)) {\n fn = this.viewOptions.customValueToPosition;\n } else if (this.viewOptions.logScale) {\n fn = ValueHelper.logValueToPosition;\n }\n val = MathHelper.clampToRange(val, this.viewOptions.floor, this.viewOptions.ceil);\n let percent = fn(val, this.viewOptions.floor, this.viewOptions.ceil);\n if (ValueHelper.isNullOrUndefined(percent)) {\n percent = 0;\n }\n if (this.viewOptions.rightToLeft) {\n percent = 1 - percent;\n }\n return percent * this.maxHandlePosition;\n }\n // Translate position to model value\n positionToValue(position) {\n let percent = position / this.maxHandlePosition;\n if (this.viewOptions.rightToLeft) {\n percent = 1 - percent;\n }\n let fn = ValueHelper.linearPositionToValue;\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.customPositionToValue)) {\n fn = this.viewOptions.customPositionToValue;\n } else if (this.viewOptions.logScale) {\n fn = ValueHelper.logPositionToValue;\n }\n const value = fn(percent, this.viewOptions.floor, this.viewOptions.ceil);\n return !ValueHelper.isNullOrUndefined(value) ? value : 0;\n }\n // Get the X-coordinate or Y-coordinate of an event\n getEventXY(event, targetTouchId) {\n if (event instanceof MouseEvent) {\n return this.viewOptions.vertical || this.viewOptions.rotate !== 0 ? event.clientY : event.clientX;\n }\n let touchIndex = 0;\n const touches = event.touches;\n if (!ValueHelper.isNullOrUndefined(targetTouchId)) {\n for (let i = 0; i < touches.length; i++) {\n if (touches[i].identifier === targetTouchId) {\n touchIndex = i;\n break;\n }\n }\n }\n // Return the target touch or if the target touch was not found in the event\n // returns the coordinates of the first touch\n return this.viewOptions.vertical || this.viewOptions.rotate !== 0 ? touches[touchIndex].clientY : touches[touchIndex].clientX;\n }\n // Compute the event position depending on whether the slider is horizontal or vertical\n getEventPosition(event, targetTouchId) {\n const sliderElementBoundingRect = this.elementRef.nativeElement.getBoundingClientRect();\n const sliderPos = this.viewOptions.vertical || this.viewOptions.rotate !== 0 ? sliderElementBoundingRect.bottom : sliderElementBoundingRect.left;\n let eventPos = 0;\n if (this.viewOptions.vertical || this.viewOptions.rotate !== 0) {\n eventPos = -this.getEventXY(event, targetTouchId) + sliderPos;\n } else {\n eventPos = this.getEventXY(event, targetTouchId) - sliderPos;\n }\n return eventPos * this.viewOptions.scale - this.handleHalfDimension;\n }\n // Get the handle closest to an event\n getNearestHandle(event) {\n if (!this.range) {\n return PointerType.Min;\n }\n const position = this.getEventPosition(event);\n const distanceMin = Math.abs(position - this.minHandleElement.position);\n const distanceMax = Math.abs(position - this.maxHandleElement.position);\n if (distanceMin < distanceMax) {\n return PointerType.Min;\n } else if (distanceMin > distanceMax) {\n return PointerType.Max;\n } else if (!this.viewOptions.rightToLeft) {\n // if event is at the same distance from min/max then if it's at left of minH, we return minH else maxH\n return position < this.minHandleElement.position ? PointerType.Min : PointerType.Max;\n }\n // reverse in rtl\n return position > this.minHandleElement.position ? PointerType.Min : PointerType.Max;\n }\n // Bind mouse and touch events to slider handles\n bindEvents() {\n const draggableRange = this.viewOptions.draggableRange;\n if (!this.viewOptions.onlyBindHandles) {\n this.selectionBarElement.on(\"mousedown\", event => this.onBarStart(null, draggableRange, event, true, true, true));\n }\n if (this.viewOptions.draggableRangeOnly) {\n this.minHandleElement.on(\"mousedown\", event => this.onBarStart(PointerType.Min, draggableRange, event, true, true));\n this.maxHandleElement.on(\"mousedown\", event => this.onBarStart(PointerType.Max, draggableRange, event, true, true));\n } else {\n this.minHandleElement.on(\"mousedown\", event => this.onStart(PointerType.Min, event, true, true));\n if (this.range) {\n this.maxHandleElement.on(\"mousedown\", event => this.onStart(PointerType.Max, event, true, true));\n }\n if (!this.viewOptions.onlyBindHandles) {\n this.fullBarElement.on(\"mousedown\", event => this.onStart(null, event, true, true, true));\n this.ticksElement.on(\"mousedown\", event => this.onStart(null, event, true, true, true, true));\n }\n }\n if (!this.viewOptions.onlyBindHandles) {\n this.selectionBarElement.onPassive(\"touchstart\", event => this.onBarStart(null, draggableRange, event, true, true, true));\n }\n if (this.viewOptions.draggableRangeOnly) {\n this.minHandleElement.onPassive(\"touchstart\", event => this.onBarStart(PointerType.Min, draggableRange, event, true, true));\n this.maxHandleElement.onPassive(\"touchstart\", event => this.onBarStart(PointerType.Max, draggableRange, event, true, true));\n } else {\n this.minHandleElement.onPassive(\"touchstart\", event => this.onStart(PointerType.Min, event, true, true));\n if (this.range) {\n this.maxHandleElement.onPassive(\"touchstart\", event => this.onStart(PointerType.Max, event, true, true));\n }\n if (!this.viewOptions.onlyBindHandles) {\n this.fullBarElement.onPassive(\"touchstart\", event => this.onStart(null, event, true, true, true));\n this.ticksElement.onPassive(\"touchstart\", event => this.onStart(null, event, false, false, true, true));\n }\n }\n if (this.viewOptions.keyboardSupport) {\n this.minHandleElement.on(\"focus\", () => this.onPointerFocus(PointerType.Min));\n if (this.range) {\n this.maxHandleElement.on(\"focus\", () => this.onPointerFocus(PointerType.Max));\n }\n }\n }\n getOptionsInfluencingEventBindings(options) {\n return [options.disabled, options.readOnly, options.draggableRange, options.draggableRangeOnly, options.onlyBindHandles, options.keyboardSupport];\n }\n // Unbind mouse and touch events to slider handles\n unbindEvents() {\n this.unsubscribeOnMove();\n this.unsubscribeOnEnd();\n for (const element of this.getAllSliderElements()) {\n if (!ValueHelper.isNullOrUndefined(element)) {\n element.off();\n }\n }\n }\n onBarStart(pointerType, draggableRange, event, bindMove, bindEnd, simulateImmediateMove, simulateImmediateEnd) {\n if (draggableRange) {\n this.onDragStart(pointerType, event, bindMove, bindEnd);\n } else {\n this.onStart(pointerType, event, bindMove, bindEnd, simulateImmediateMove, simulateImmediateEnd);\n }\n }\n // onStart event handler\n onStart(pointerType, event, bindMove, bindEnd, simulateImmediateMove, simulateImmediateEnd) {\n event.stopPropagation();\n // Only call preventDefault() when handling non-passive events (passive events don't need it)\n if (!CompatibilityHelper.isTouchEvent(event) && !supportsPassiveEvents) {\n event.preventDefault();\n }\n this.moving = false;\n // We have to do this in case the HTML where the sliders are on\n // have been animated into view.\n this.calculateViewDimensions();\n if (ValueHelper.isNullOrUndefined(pointerType)) {\n pointerType = this.getNearestHandle(event);\n }\n this.currentTrackingPointer = pointerType;\n const pointerElement = this.getPointerElement(pointerType);\n pointerElement.active = true;\n if (this.viewOptions.keyboardSupport) {\n pointerElement.focus();\n }\n if (bindMove) {\n this.unsubscribeOnMove();\n const onMoveCallback = e => this.dragging.active ? this.onDragMove(e) : this.onMove(e);\n if (CompatibilityHelper.isTouchEvent(event)) {\n this.onMoveEventListener = this.eventListenerHelper.attachPassiveEventListener(document, \"touchmove\", onMoveCallback);\n } else {\n this.onMoveEventListener = this.eventListenerHelper.attachEventListener(document, \"mousemove\", onMoveCallback);\n }\n }\n if (bindEnd) {\n this.unsubscribeOnEnd();\n const onEndCallback = e => this.onEnd(e);\n if (CompatibilityHelper.isTouchEvent(event)) {\n this.onEndEventListener = this.eventListenerHelper.attachPassiveEventListener(document, \"touchend\", onEndCallback);\n } else {\n this.onEndEventListener = this.eventListenerHelper.attachEventListener(document, \"mouseup\", onEndCallback);\n }\n }\n this.userChangeStart.emit(this.getChangeContext());\n if (CompatibilityHelper.isTouchEvent(event) && !ValueHelper.isNullOrUndefined(event.changedTouches)) {\n // Store the touch identifier\n if (ValueHelper.isNullOrUndefined(this.touchId)) {\n this.touchId = event.changedTouches[0].identifier;\n }\n }\n // Click events, either with mouse or touch gesture are weird. Sometimes they result in full\n // start, move, end sequence, and sometimes, they don't - they only invoke mousedown\n // As a workaround, we simulate the first move event and the end event if it's necessary\n if (simulateImmediateMove) {\n this.onMove(event, true);\n }\n if (simulateImmediateEnd) {\n this.onEnd(event);\n }\n }\n // onMove event handler\n onMove(event, fromTick) {\n let touchForThisSlider = null;\n if (CompatibilityHelper.isTouchEvent(event)) {\n const changedTouches = event.changedTouches;\n for (let i = 0; i < changedTouches.length; i++) {\n if (changedTouches[i].identifier === this.touchId) {\n touchForThisSlider = changedTouches[i];\n break;\n }\n }\n if (ValueHelper.isNullOrUndefined(touchForThisSlider)) {\n return;\n }\n }\n if (this.viewOptions.animate && !this.viewOptions.animateOnMove) {\n if (this.moving) {\n this.sliderElementAnimateClass = false;\n }\n }\n this.moving = true;\n const newPos = !ValueHelper.isNullOrUndefined(touchForThisSlider) ? this.getEventPosition(event, touchForThisSlider.identifier) : this.getEventPosition(event);\n let newValue;\n const ceilValue = this.viewOptions.rightToLeft ? this.viewOptions.floor : this.viewOptions.ceil;\n const floorValue = this.viewOptions.rightToLeft ? this.viewOptions.ceil : this.viewOptions.floor;\n if (newPos <= 0) {\n newValue = floorValue;\n } else if (newPos >= this.maxHandlePosition) {\n newValue = ceilValue;\n } else {\n newValue = this.positionToValue(newPos);\n if (fromTick && !ValueHelper.isNullOrUndefined(this.viewOptions.tickStep)) {\n newValue = this.roundStep(newValue, this.viewOptions.tickStep);\n } else {\n newValue = this.roundStep(newValue);\n }\n }\n this.positionTrackingHandle(newValue);\n }\n onEnd(event) {\n if (CompatibilityHelper.isTouchEvent(event)) {\n const changedTouches = event.changedTouches;\n if (changedTouches[0].identifier !== this.touchId) {\n return;\n }\n }\n this.moving = false;\n if (this.viewOptions.animate) {\n this.sliderElementAnimateClass = true;\n }\n this.touchId = null;\n if (!this.viewOptions.keyboardSupport) {\n this.minHandleElement.active = false;\n this.maxHandleElement.active = false;\n this.currentTrackingPointer = null;\n }\n this.dragging.active = false;\n this.unsubscribeOnMove();\n this.unsubscribeOnEnd();\n this.userChangeEnd.emit(this.getChangeContext());\n }\n onPointerFocus(pointerType) {\n const pointerElement = this.getPointerElement(pointerType);\n pointerElement.on(\"blur\", () => this.onPointerBlur(pointerElement));\n pointerElement.on(\"keydown\", event => this.onKeyboardEvent(event));\n pointerElement.on(\"keyup\", () => this.onKeyUp());\n pointerElement.active = true;\n this.currentTrackingPointer = pointerType;\n this.currentFocusPointer = pointerType;\n this.firstKeyDown = true;\n }\n onKeyUp() {\n this.firstKeyDown = true;\n this.userChangeEnd.emit(this.getChangeContext());\n }\n onPointerBlur(pointer) {\n pointer.off(\"blur\");\n pointer.off(\"keydown\");\n pointer.off(\"keyup\");\n pointer.active = false;\n if (ValueHelper.isNullOrUndefined(this.touchId)) {\n this.currentTrackingPointer = null;\n this.currentFocusPointer = null;\n }\n }\n getKeyActions(currentValue) {\n const valueRange = this.viewOptions.ceil - this.viewOptions.floor;\n let increaseStep = currentValue + this.viewOptions.step;\n let decreaseStep = currentValue - this.viewOptions.step;\n let increasePage = currentValue + valueRange / 10;\n let decreasePage = currentValue - valueRange / 10;\n if (this.viewOptions.reversedControls) {\n increaseStep = currentValue - this.viewOptions.step;\n decreaseStep = currentValue + this.viewOptions.step;\n increasePage = currentValue - valueRange / 10;\n decreasePage = currentValue + valueRange / 10;\n }\n // Left to right default actions\n const actions = {\n UP: increaseStep,\n DOWN: decreaseStep,\n LEFT: decreaseStep,\n RIGHT: increaseStep,\n PAGEUP: increasePage,\n PAGEDOWN: decreasePage,\n HOME: this.viewOptions.reversedControls ? this.viewOptions.ceil : this.viewOptions.floor,\n END: this.viewOptions.reversedControls ? this.viewOptions.floor : this.viewOptions.ceil\n };\n // right to left means swapping right and left arrows\n if (this.viewOptions.rightToLeft) {\n actions.LEFT = increaseStep;\n actions.RIGHT = decreaseStep;\n // right to left and vertical means we also swap up and down\n if (this.viewOptions.vertical || this.viewOptions.rotate !== 0) {\n actions.UP = decreaseStep;\n actions.DOWN = increaseStep;\n }\n }\n return actions;\n }\n onKeyboardEvent(event) {\n const currentValue = this.getCurrentTrackingValue();\n const keyCode = !ValueHelper.isNullOrUndefined(event.keyCode) ? event.keyCode : event.which;\n const keys = {\n 38: \"UP\",\n 40: \"DOWN\",\n 37: \"LEFT\",\n 39: \"RIGHT\",\n 33: \"PAGEUP\",\n 34: \"PAGEDOWN\",\n 36: \"HOME\",\n 35: \"END\"\n };\n const actions = this.getKeyActions(currentValue);\n const key = keys[keyCode];\n const action = actions[key];\n if (ValueHelper.isNullOrUndefined(action) || ValueHelper.isNullOrUndefined(this.currentTrackingPointer)) {\n return;\n }\n event.preventDefault();\n if (this.firstKeyDown) {\n this.firstKeyDown = false;\n this.userChangeStart.emit(this.getChangeContext());\n }\n const actionValue = MathHelper.clampToRange(action, this.viewOptions.floor, this.viewOptions.ceil);\n const newValue = this.roundStep(actionValue);\n if (!this.viewOptions.draggableRangeOnly) {\n this.positionTrackingHandle(newValue);\n } else {\n const difference = this.viewHighValue - this.viewLowValue;\n let newMinValue;\n let newMaxValue;\n if (this.currentTrackingPointer === PointerType.Min) {\n newMinValue = newValue;\n newMaxValue = newValue + difference;\n if (newMaxValue > this.viewOptions.ceil) {\n newMaxValue = this.viewOptions.ceil;\n newMinValue = newMaxValue - difference;\n }\n } else if (this.currentTrackingPointer === PointerType.Max) {\n newMaxValue = newValue;\n newMinValue = newValue - difference;\n if (newMinValue < this.viewOptions.floor) {\n newMinValue = this.viewOptions.floor;\n newMaxValue = newMinValue + difference;\n }\n }\n this.positionTrackingBar(newMinValue, newMaxValue);\n }\n }\n // onDragStart event handler, handles dragging of the middle bar\n onDragStart(pointerType, event, bindMove, bindEnd) {\n const position = this.getEventPosition(event);\n this.dragging = new Dragging();\n this.dragging.active = true;\n this.dragging.value = this.positionToValue(position);\n this.dragging.difference = this.viewHighValue - this.viewLowValue;\n this.dragging.lowLimit = this.viewOptions.rightToLeft ? this.minHandleElement.position - position : position - this.minHandleElement.position;\n this.dragging.highLimit = this.viewOptions.rightToLeft ? position - this.maxHandleElement.position : this.maxHandleElement.position - position;\n this.onStart(pointerType, event, bindMove, bindEnd);\n }\n /** Get min value depending on whether the newPos is outOfBounds above or below the bar and rightToLeft */\n getMinValue(newPos, outOfBounds, isAbove) {\n const isRTL = this.viewOptions.rightToLeft;\n let value = null;\n if (outOfBounds) {\n if (isAbove) {\n value = isRTL ? this.viewOptions.floor : this.viewOptions.ceil - this.dragging.difference;\n } else {\n value = isRTL ? this.viewOptions.ceil - this.dragging.difference : this.viewOptions.floor;\n }\n } else {\n value = isRTL ? this.positionToValue(newPos + this.dragging.lowLimit) : this.positionToValue(newPos - this.dragging.lowLimit);\n }\n return this.roundStep(value);\n }\n /** Get max value depending on whether the newPos is outOfBounds above or below the bar and rightToLeft */\n getMaxValue(newPos, outOfBounds, isAbove) {\n const isRTL = this.viewOptions.rightToLeft;\n let value = null;\n if (outOfBounds) {\n if (isAbove) {\n value = isRTL ? this.viewOptions.floor + this.dragging.difference : this.viewOptions.ceil;\n } else {\n value = isRTL ? this.viewOptions.ceil : this.viewOptions.floor + this.dragging.difference;\n }\n } else {\n if (isRTL) {\n value = this.positionToValue(newPos + this.dragging.lowLimit) + this.dragging.difference;\n } else {\n value = this.positionToValue(newPos - this.dragging.lowLimit) + this.dragging.difference;\n }\n }\n return this.roundStep(value);\n }\n onDragMove(event) {\n const newPos = this.getEventPosition(event);\n if (this.viewOptions.animate && !this.viewOptions.animateOnMove) {\n if (this.moving) {\n this.sliderElementAnimateClass = false;\n }\n }\n this.moving = true;\n let ceilLimit, floorLimit, floorHandleElement, ceilHandleElement;\n if (this.viewOptions.rightToLeft) {\n ceilLimit = this.dragging.lowLimit;\n floorLimit = this.dragging.highLimit;\n floorHandleElement = this.maxHandleElement;\n ceilHandleElement = this.minHandleElement;\n } else {\n ceilLimit = this.dragging.highLimit;\n floorLimit = this.dragging.lowLimit;\n floorHandleElement = this.minHandleElement;\n ceilHandleElement = this.maxHandleElement;\n }\n const isUnderFloorLimit = newPos <= floorLimit;\n const isOverCeilLimit = newPos >= this.maxHandlePosition - ceilLimit;\n let newMinValue;\n let newMaxValue;\n if (isUnderFloorLimit) {\n if (floorHandleElement.position === 0) {\n return;\n }\n newMinValue = this.getMinValue(newPos, true, false);\n newMaxValue = this.getMaxValue(newPos, true, false);\n } else if (isOverCeilLimit) {\n if (ceilHandleElement.position === this.maxHandlePosition) {\n return;\n }\n newMaxValue = this.getMaxValue(newPos, true, true);\n newMinValue = this.getMinValue(newPos, true, true);\n } else {\n newMinValue = this.getMinValue(newPos, false, false);\n newMaxValue = this.getMaxValue(newPos, false, false);\n }\n this.positionTrackingBar(newMinValue, newMaxValue);\n }\n // Set the new value and position for the entire bar\n positionTrackingBar(newMinValue, newMaxValue) {\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.minLimit) && newMinValue < this.viewOptions.minLimit) {\n newMinValue = this.viewOptions.minLimit;\n newMaxValue = MathHelper.roundToPrecisionLimit(newMinValue + this.dragging.difference, this.viewOptions.precisionLimit);\n }\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.maxLimit) && newMaxValue > this.viewOptions.maxLimit) {\n newMaxValue = this.viewOptions.maxLimit;\n newMinValue = MathHelper.roundToPrecisionLimit(newMaxValue - this.dragging.difference, this.viewOptions.precisionLimit);\n }\n this.viewLowValue = newMinValue;\n this.viewHighValue = newMaxValue;\n this.applyViewChange();\n this.updateHandles(PointerType.Min, this.valueToPosition(newMinValue));\n this.updateHandles(PointerType.Max, this.valueToPosition(newMaxValue));\n }\n // Set the new value and position to the current tracking handle\n positionTrackingHandle(newValue) {\n newValue = this.applyMinMaxLimit(newValue);\n if (this.range) {\n if (this.viewOptions.pushRange) {\n newValue = this.applyPushRange(newValue);\n } else {\n if (this.viewOptions.noSwitching) {\n if (this.currentTrackingPointer === PointerType.Min && newValue > this.viewHighValue) {\n newValue = this.applyMinMaxRange(this.viewHighValue);\n } else if (this.currentTrackingPointer === PointerType.Max && newValue < this.viewLowValue) {\n newValue = this.applyMinMaxRange(this.viewLowValue);\n }\n }\n newValue = this.applyMinMaxRange(newValue);\n /* This is to check if we need to switch the min and max handles */\n if (this.currentTrackingPointer === PointerType.Min && newValue > this.viewHighValue) {\n this.viewLowValue = this.viewHighValue;\n this.applyViewChange();\n this.updateHandles(PointerType.Min, this.maxHandleElement.position);\n this.updateAriaAttributes();\n this.currentTrackingPointer = PointerType.Max;\n this.minHandleElement.active = false;\n this.maxHandleElement.active = true;\n if (this.viewOptions.keyboardSupport) {\n this.maxHandleElement.focus();\n }\n } else if (this.currentTrackingPointer === PointerType.Max && newValue < this.viewLowValue) {\n this.viewHighValue = this.viewLowValue;\n this.applyViewChange();\n this.updateHandles(PointerType.Max, this.minHandleElement.position);\n this.updateAriaAttributes();\n this.currentTrackingPointer = PointerType.Min;\n this.maxHandleElement.active = false;\n this.minHandleElement.active = true;\n if (this.viewOptions.keyboardSupport) {\n this.minHandleElement.focus();\n }\n }\n }\n }\n if (this.getCurrentTrackingValue() !== newValue) {\n if (this.currentTrackingPointer === PointerType.Min) {\n this.viewLowValue = newValue;\n this.applyViewChange();\n } else if (this.currentTrackingPointer === PointerType.Max) {\n this.viewHighValue = newValue;\n this.applyViewChange();\n }\n this.updateHandles(this.currentTrackingPointer, this.valueToPosition(newValue));\n this.updateAriaAttributes();\n }\n }\n applyMinMaxLimit(newValue) {\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.minLimit) && newValue < this.viewOptions.minLimit) {\n return this.viewOptions.minLimit;\n }\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.maxLimit) && newValue > this.viewOptions.maxLimit) {\n return this.viewOptions.maxLimit;\n }\n return newValue;\n }\n applyMinMaxRange(newValue) {\n const oppositeValue = this.currentTrackingPointer === PointerType.Min ? this.viewHighValue : this.viewLowValue;\n const difference = Math.abs(newValue - oppositeValue);\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.minRange)) {\n if (difference < this.viewOptions.minRange) {\n if (this.currentTrackingPointer === PointerType.Min) {\n return MathHelper.roundToPrecisionLimit(this.viewHighValue - this.viewOptions.minRange, this.viewOptions.precisionLimit);\n } else if (this.currentTrackingPointer === PointerType.Max) {\n return MathHelper.roundToPrecisionLimit(this.viewLowValue + this.viewOptions.minRange, this.viewOptions.precisionLimit);\n }\n }\n }\n if (!ValueHelper.isNullOrUndefined(this.viewOptions.maxRange)) {\n if (difference > this.viewOptions.maxRange) {\n if (this.currentTrackingPointer === PointerType.Min) {\n return MathHelper.roundToPrecisionLimit(this.viewHighValue - this.viewOptions.maxRange, this.viewOptions.precisionLimit);\n } else if (this.currentTrackingPointer === PointerType.Max) {\n return MathHelper.roundToPrecisionLimit(this.viewLowValue + this.viewOptions.maxRange, this.viewOptions.precisionLimit);\n }\n }\n }\n return newValue;\n }\n applyPushRange(newValue) {\n const difference = this.currentTrackingPointer === PointerType.Min ? this.viewHighValue - newValue : newValue - this.viewLowValue;\n const minRange = !ValueHelper.isNullOrUndefined(this.viewOptions.minRange) ? this.viewOptions.minRange : this.viewOptions.step;\n const maxRange = this.viewOptions.maxRange;\n // if smaller than minRange\n if (difference < minRange) {\n if (this.currentTrackingPointer === PointerType.Min) {\n this.viewHighValue = MathHelper.roundToPrecisionLimit(Math.min(newValue + minRange, this.viewOptions.ceil), this.viewOptions.precisionLimit);\n newValue = MathHelper.roundToPrecisionLimit(this.viewHighValue - minRange, this.viewOptions.precisionLimit);\n this.applyViewChange();\n this.updateHandles(PointerType.Max, this.valueToPosition(this.viewHighValue));\n } else if (this.currentTrackingPointer === PointerType.Max) {\n this.viewLowValue = MathHelper.roundToPrecisionLimit(Math.max(newValue - minRange, this.viewOptions.floor), this.viewOptions.precisionLimit);\n newValue = MathHelper.roundToPrecisionLimit(this.viewLowValue + minRange, this.viewOptions.precisionLimit);\n this.applyViewChange();\n this.updateHandles(PointerType.Min, this.valueToPosition(this.viewLowValue));\n }\n this.updateAriaAttributes();\n } else if (!ValueHelper.isNullOrUndefined(maxRange) && difference > maxRange) {\n // if greater than maxRange\n if (this.currentTrackingPointer === PointerType.Min) {\n this.viewHighValue = MathHelper.roundToPrecisionLimit(newValue + maxRange, this.viewOptions.precisionLimit);\n this.applyViewChange();\n this.updateHandles(PointerType.Max, this.valueToPosition(this.viewHighValue));\n } else if (this.currentTrackingPointer === PointerType.Max) {\n this.viewLowValue = MathHelper.roundToPrecisionLimit(newValue - maxRange, this.viewOptions.precisionLimit);\n this.applyViewChange();\n this.updateHandles(PointerType.Min, this.valueToPosition(this.viewLowValue));\n }\n this.updateAriaAttributes();\n }\n return newValue;\n }\n getChangeContext() {\n const changeContext = new ChangeContext();\n changeContext.pointerType = this.currentTrackingPointer;\n changeContext.value = +this.value;\n if (this.range) {\n changeContext.highValue = +this.highValue;\n }\n return changeContext;\n }\n static ɵfac = function SliderComponent_Factory(t) {\n return new (t || SliderComponent)(i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(AllowUnsafeHtmlInSlider, 8));\n };\n static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: SliderComponent,\n selectors: [[\"ngx-slider\"]],\n contentQueries: function SliderComponent_ContentQueries(rf, ctx, dirIndex) {\n if (rf & 1) {\n i0.ɵɵcontentQuery(dirIndex, _c1, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.tooltipTemplate = _t.first);\n }\n },\n viewQuery: function SliderComponent_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(_c2, 5, SliderElementDirective);\n i0.ɵɵviewQuery(_c3, 5, SliderElementDirective);\n i0.ɵɵviewQuery(_c4, 5, SliderElementDirective);\n i0.ɵɵviewQuery(_c5, 5, SliderElementDirective);\n i0.ɵɵviewQuery(_c6, 5, SliderHandleDirective);\n i0.ɵɵviewQuery(_c7, 5, SliderHandleDirective);\n i0.ɵɵviewQuery(_c8, 5, SliderLabelDirective);\n i0.ɵɵviewQuery(_c9, 5, SliderLabelDirective);\n i0.ɵɵviewQuery(_c10, 5, SliderLabelDirective);\n i0.ɵɵviewQuery(_c11, 5, SliderLabelDirective);\n i0.ɵɵviewQuery(_c12, 5, SliderLabelDirective);\n i0.ɵɵviewQuery(_c13, 5, SliderElementDirective);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.leftOuterSelectionBarElement = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.rightOuterSelectionBarElement = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.fullBarElement = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.selectionBarElement = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.minHandleElement = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.maxHandleElement = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.floorLabelElement = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ceilLabelElement = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.minHandleLabelElement = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.maxHandleLabelElement = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.combinedLabelElement = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ticksElement = _t.first);\n }\n },\n hostAttrs: [1, \"ngx-slider\"],\n hostVars: 8,\n hostBindings: function SliderComponent_HostBindings(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵlistener(\"resize\", function SliderComponent_resize_HostBindingHandler($event) {\n return ctx.onResize($event);\n }, false, i0.ɵɵresolveWindow);\n }\n if (rf & 2) {\n i0.ɵɵattribute(\"disabled\", ctx.sliderElementDisabledAttr)(\"aria-label\", ctx.sliderElementAriaLabel);\n i0.ɵɵclassProp(\"vertical\", ctx.sliderElementVerticalClass)(\"animate\", ctx.sliderElementAnimateClass)(\"with-legend\", ctx.sliderElementWithLegendClass);\n }\n },\n inputs: {\n value: \"value\",\n highValue: \"highValue\",\n options: \"options\",\n manualRefresh: \"manualRefresh\",\n triggerFocus: \"triggerFocus\"\n },\n outputs: {\n valueChange: \"valueChange\",\n highValueChange: \"highValueChange\",\n userChangeStart: \"userChangeStart\",\n userChange: \"userChange\",\n userChangeEnd: \"userChangeEnd\"\n },\n features: [i0.ɵɵProvidersFeature([NGX_SLIDER_CONTROL_VALUE_ACCESSOR]), i0.ɵɵNgOnChangesFeature],\n decls: 29,\n vars: 13,\n consts: [[\"leftOuterSelectionBar\", \"\"], [\"rightOuterSelectionBar\", \"\"], [\"fullBar\", \"\"], [\"selectionBar\", \"\"], [\"minHandle\", \"\"], [\"maxHandle\", \"\"], [\"floorLabel\", \"\"], [\"ceilLabel\", \"\"], [\"minHandleLabel\", \"\"], [\"maxHandleLabel\", \"\"], [\"combinedLabel\", \"\"], [\"ticksElement\", \"\"], [\"ngxSliderElement\", \"\", 1, \"ngx-slider-span\", \"ngx-slider-bar-wrapper\", \"ngx-slider-left-out-selection\"], [1, \"ngx-slider-span\", \"ngx-slider-bar\"], [\"ngxSliderElement\", \"\", 1, \"ngx-slider-span\", \"ngx-slider-bar-wrapper\", \"ngx-slider-right-out-selection\"], [\"ngxSliderElement\", \"\", 1, \"ngx-slider-span\", \"ngx-slider-bar-wrapper\", \"ngx-slider-full-bar\"], [\"ngxSliderElement\", \"\", 1, \"ngx-slider-span\", \"ngx-slider-bar-wrapper\", \"ngx-slider-selection-bar\"], [1, \"ngx-slider-span\", \"ngx-slider-bar\", \"ngx-slider-selection\", 3, \"ngStyle\"], [\"ngxSliderHandle\", \"\", 1, \"ngx-slider-span\", \"ngx-slider-pointer\", \"ngx-slider-pointer-min\", 3, \"ngStyle\"], [\"ngxSliderHandle\", \"\", 1, \"ngx-slider-span\", \"ngx-slider-pointer\", \"ngx-slider-pointer-max\", 3, \"ngStyle\"], [\"ngxSliderLabel\", \"\", 1, \"ngx-slider-span\", \"ngx-slider-bubble\", \"ngx-slider-limit\", \"ngx-slider-floor\"], [\"ngxSliderLabel\", \"\", 1, \"ngx-slider-span\", \"ngx-slider-bubble\", \"ngx-slider-limit\", \"ngx-slider-ceil\"], [\"ngxSliderLabel\", \"\", 1, \"ngx-slider-span\", \"ngx-slider-bubble\", \"ngx-slider-model-value\"], [\"ngxSliderLabel\", \"\", 1, \"ngx-slider-span\", \"ngx-slider-bubble\", \"ngx-slider-model-high\"], [\"ngxSliderLabel\", \"\", 1, \"ngx-slider-span\", \"ngx-slider-bubble\", \"ngx-slider-combined\"], [\"ngxSliderElement\", \"\", 1, \"ngx-slider-ticks\", 3, \"hidden\"], [\"class\", \"ngx-slider-tick\", 3, \"ngClass\", \"ngStyle\", 4, \"ngFor\", \"ngForOf\"], [1, \"ngx-slider-tick\", 3, \"ngClass\", \"ngStyle\"], [3, \"template\", \"tooltip\", \"placement\"], [\"class\", \"ngx-slider-span ngx-slider-tick-value\", 3, \"template\", \"tooltip\", \"placement\", \"content\", 4, \"ngIf\"], [\"class\", \"ngx-slider-span ngx-slider-tick-legend\", 3, \"innerText\", 4, \"ngIf\"], [\"class\", \"ngx-slider-span ngx-slider-tick-legend\", 3, \"innerHTML\", 4, \"ngIf\"], [1, \"ngx-slider-span\", \"ngx-slider-tick-value\", 3, \"template\", \"tooltip\", \"placement\", \"content\"], [1, \"ngx-slider-span\", \"ngx-slider-tick-legend\", 3, \"innerText\"], [1, \"ngx-slider-span\", \"ngx-slider-tick-legend\", 3, \"innerHTML\"]],\n template: function SliderComponent_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"span\", 12, 0);\n i0.ɵɵelement(2, \"span\", 13);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(3, \"span\", 14, 1);\n i0.ɵɵelement(5, \"span\", 13);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(6, \"span\", 15, 2);\n i0.ɵɵelement(8, \"span\", 13);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(9, \"span\", 16, 3);\n i0.ɵɵelement(11, \"span\", 17);\n i0.ɵɵelementEnd();\n i0.ɵɵelement(12, \"span\", 18, 4)(14, \"span\", 19, 5)(16, \"span\", 20, 6)(18, \"span\", 21, 7)(20, \"span\", 22, 8)(22, \"span\", 23, 9)(24, \"span\", 24, 10);\n i0.ɵɵelementStart(26, \"span\", 25, 11);\n i0.ɵɵtemplate(28, SliderComponent_span_28_Template, 5, 10, \"span\", 26);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n i0.ɵɵadvance(6);\n i0.ɵɵclassProp(\"ngx-slider-transparent\", ctx.fullBarTransparentClass);\n i0.ɵɵadvance(3);\n i0.ɵɵclassProp(\"ngx-slider-draggable\", ctx.selectionBarDraggableClass);\n i0.ɵɵadvance(2);\n i0.ɵɵproperty(\"ngStyle\", ctx.barStyle);\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"ngStyle\", ctx.minPointerStyle);\n i0.ɵɵadvance(2);\n i0.ɵɵstyleProp(\"display\", ctx.range ? \"inherit\" : \"none\");\n i0.ɵɵproperty(\"ngStyle\", ctx.maxPointerStyle);\n i0.ɵɵadvance(12);\n i0.ɵɵclassProp(\"ngx-slider-ticks-values-under\", ctx.ticksUnderValuesClass);\n i0.ɵɵproperty(\"hidden\", !ctx.showTicks);\n i0.ɵɵadvance(2);\n i0.ɵɵproperty(\"ngForOf\", ctx.ticks);\n }\n },\n dependencies: [i1.NgClass, i1.NgForOf, i1.NgIf, i1.NgStyle, SliderElementDirective, SliderHandleDirective, SliderLabelDirective, TooltipWrapperComponent],\n styles: [\".ngx-slider{display:inline-block;position:relative;height:4px;width:100%;margin:35px 0 15px;vertical-align:middle;-webkit-user-select:none;user-select:none;touch-action:pan-y} .ngx-slider.with-legend{margin-bottom:40px} .ngx-slider[disabled]{cursor:not-allowed} .ngx-slider[disabled] .ngx-slider-pointer{cursor:not-allowed;background-color:#d8e0f3} .ngx-slider[disabled] .ngx-slider-draggable{cursor:not-allowed} .ngx-slider[disabled] .ngx-slider-selection{background:#8b91a2} .ngx-slider[disabled] .ngx-slider-tick{cursor:not-allowed} .ngx-slider[disabled] .ngx-slider-tick.ngx-slider-selected{background:#8b91a2} .ngx-slider .ngx-slider-span{white-space:nowrap;position:absolute;display:inline-block} .ngx-slider .ngx-slider-base{width:100%;height:100%;padding:0} .ngx-slider .ngx-slider-bar-wrapper{left:0;box-sizing:border-box;margin-top:-16px;padding-top:16px;width:100%;height:32px;z-index:1} .ngx-slider .ngx-slider-draggable{cursor:move} .ngx-slider .ngx-slider-bar{left:0;width:100%;height:4px;z-index:1;background:#d8e0f3;border-radius:2px} .ngx-slider .ngx-slider-bar-wrapper.ngx-slider-transparent .ngx-slider-bar{background:transparent} .ngx-slider .ngx-slider-bar-wrapper.ngx-slider-left-out-selection .ngx-slider-bar{background:#df002d} .ngx-slider .ngx-slider-bar-wrapper.ngx-slider-right-out-selection .ngx-slider-bar{background:#03a688} .ngx-slider .ngx-slider-selection{z-index:2;background:#0db9f0;border-radius:2px} .ngx-slider .ngx-slider-pointer{cursor:pointer;width:32px;height:32px;top:-14px;background-color:#0db9f0;z-index:3;border-radius:16px} .ngx-slider .ngx-slider-pointer:after{content:\\\"\\\";width:8px;height:8px;position:absolute;top:12px;left:12px;border-radius:4px;background:#fff} .ngx-slider .ngx-slider-pointer:hover:after{background-color:#fff} .ngx-slider .ngx-slider-pointer.ngx-slider-active{z-index:4} .ngx-slider .ngx-slider-pointer.ngx-slider-active:after{background-color:#451aff} .ngx-slider .ngx-slider-bubble{cursor:default;bottom:16px;padding:1px 3px;color:#55637d;font-size:16px} .ngx-slider .ngx-slider-bubble.ngx-slider-limit{color:#55637d} .ngx-slider .ngx-slider-ticks{box-sizing:border-box;width:100%;height:0;position:absolute;left:0;top:-3px;margin:0;z-index:1;list-style:none} .ngx-slider .ngx-slider-ticks-values-under .ngx-slider-tick-value{top:auto;bottom:-36px} .ngx-slider .ngx-slider-tick{text-align:center;cursor:pointer;width:10px;height:10px;background:#d8e0f3;border-radius:50%;position:absolute;top:0;left:0;margin-left:11px} .ngx-slider .ngx-slider-tick.ngx-slider-selected{background:#0db9f0} .ngx-slider .ngx-slider-tick-value{position:absolute;top:-34px;transform:translate(-50%)} .ngx-slider .ngx-slider-tick-legend{position:absolute;top:24px;transform:translate(-50%);max-width:50px;white-space:normal} .ngx-slider.vertical{position:relative;width:4px;height:100%;margin:0 20px;padding:0;vertical-align:baseline;touch-action:pan-x} .ngx-slider.vertical .ngx-slider-base{width:100%;height:100%;padding:0} .ngx-slider.vertical .ngx-slider-bar-wrapper{top:auto;left:0;margin:0 0 0 -16px;padding:0 0 0 16px;height:100%;width:32px} .ngx-slider.vertical .ngx-slider-bar{bottom:0;left:auto;width:4px;height:100%} .ngx-slider.vertical .ngx-slider-pointer{left:-14px!important;top:auto;bottom:0} .ngx-slider.vertical .ngx-slider-bubble{left:16px!important;bottom:0} .ngx-slider.vertical .ngx-slider-ticks{height:100%;width:0;left:-3px;top:0;z-index:1} .ngx-slider.vertical .ngx-slider-tick{vertical-align:middle;margin-left:auto;margin-top:11px} .ngx-slider.vertical .ngx-slider-tick-value{left:24px;top:auto;transform:translateY(-28%)} .ngx-slider.vertical .ngx-slider-tick-legend{top:auto;right:24px;transform:translateY(-28%);max-width:none;white-space:nowrap} .ngx-slider.vertical .ngx-slider-ticks-values-under .ngx-slider-tick-value{bottom:auto;left:auto;right:24px} .ngx-slider *{transition:none} .ngx-slider.animate .ngx-slider-bar-wrapper{transition:all linear .3s} .ngx-slider.animate .ngx-slider-selection{transition:background-color linear .3s} .ngx-slider.animate .ngx-slider-pointer{transition:all linear .3s} .ngx-slider.animate .ngx-slider-pointer:after{transition:all linear .3s} .ngx-slider.animate .ngx-slider-bubble{transition:all linear .3s} .ngx-slider.animate .ngx-slider-bubble.ngx-slider-limit{transition:opacity linear .3s} .ngx-slider.animate .ngx-slider-bubble.ngx-slider-combined{transition:opacity linear .3s} .ngx-slider.animate .ngx-slider-tick{transition:background-color linear .3s}\"],\n changeDetection: 0\n });\n }\n return SliderComponent;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * NgxSlider module\n *\n * The module exports the slider component\n */\nlet NgxSliderModule = /*#__PURE__*/(() => {\n class NgxSliderModule {\n static ɵfac = function NgxSliderModule_Factory(t) {\n return new (t || NgxSliderModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: NgxSliderModule\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [CommonModule]\n });\n }\n return NgxSliderModule;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { AllowUnsafeHtmlInSlider, ChangeContext, LabelType, NgxSliderModule, Options, PointerType, SliderComponent };\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport {NgbActiveModal, NgbModalModule} from '@ng-bootstrap/ng-bootstrap';\r\nimport {CommonModule} from \"@angular/common\";\r\nimport {TranslocoDirective} from \"@ngneat/transloco\";\r\n\r\nexport interface KeyboardShortcut {\r\n /**\r\n * String representing key or key combo. Should use + for combos. Will render as upper case\r\n */\r\n key: string;\r\n /**\r\n * Description of how it works\r\n */\r\n description: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-shortcuts-modal',\r\n standalone: true,\r\n imports: [CommonModule, NgbModalModule, TranslocoDirective],\r\n templateUrl: './shortcuts-modal.component.html',\r\n styleUrls: ['./shortcuts-modal.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ShortcutsModalComponent {\r\n\r\n @Input() shortcuts: Array = [];\r\n\r\n constructor(public modal: NgbActiveModal) { }\r\n\r\n close() {\r\n this.modal.close();\r\n }\r\n}\r\n","\r\n
\r\n

{{t('title')}}

\r\n \r\n
\r\n
\r\n
\r\n
\r\n {{shortcut.key}} {{t(shortcut.description)}}\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n","import { ElementRef, Injectable, Renderer2, RendererFactory2 } from '@angular/core';\r\nimport { PageSplitOption } from 'src/app/_models/preferences/page-split-option';\r\nimport { ScalingOption } from 'src/app/_models/preferences/scaling-option';\r\nimport { ReaderService } from 'src/app/_services/reader.service';\r\nimport { ChapterInfo } from '../_models/chapter-info';\r\nimport { DimensionMap } from '../_models/file-dimension';\r\nimport { FITTING_OPTION } from '../_models/reader-enums';\r\nimport { BookmarkInfo } from 'src/app/_models/manga-reader/bookmark-info';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ManagaReaderService {\r\n\r\n private pageDimensions: DimensionMap = {};\r\n private pairs: {[key: number]: number} = {};\r\n private renderer: Renderer2;\r\n\r\n constructor(rendererFactory: RendererFactory2, private readerService: ReaderService) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n }\r\n\r\n load(chapterInfo: ChapterInfo | BookmarkInfo) {\r\n chapterInfo.pageDimensions!.forEach(d => {\r\n this.pageDimensions[d.pageNumber] = {\r\n height: d.height,\r\n width: d.width,\r\n isWide: d.isWide\r\n };\r\n });\r\n this.pairs = chapterInfo.doublePairs!;\r\n }\r\n\r\n adjustForDoubleReader(page: number) {\r\n if (!this.pairs.hasOwnProperty(page)) return page;\r\n return this.pairs[page];\r\n }\r\n\r\n getPageDimensions(pageNum: number) {\r\n if (!this.pageDimensions.hasOwnProperty(pageNum)) return null;\r\n return this.pageDimensions[pageNum];\r\n }\r\n\r\n /**\r\n * If the image's width is greater than it's height\r\n * @param pageNum Page number - Expected to call loadPageDimensions before this call\r\n */\r\n isWidePage(pageNum: number) {\r\n if (!this.pageDimensions.hasOwnProperty(pageNum)) return false;\r\n return this.pageDimensions[pageNum].isWide;\r\n }\r\n\r\n maxHeight() {\r\n return Object.values(this.pageDimensions).reduce((max, obj) => Math.max(max, obj.height), 0);\r\n }\r\n\r\n maxWidth() {\r\n return Object.values(this.pageDimensions).reduce((max, obj) => Math.max(max, obj.width), 0);\r\n }\r\n\r\n\r\n\r\n /**\r\n * If pageNumber is 0 aka first page, which on double page rendering should always render as a single.\r\n *\r\n * @param pageNumber current page number\r\n * @returns\r\n */\r\n isCoverImage(pageNumber: number) {\r\n return pageNumber === 0;\r\n }\r\n\r\n /**\r\n * Does the image need\r\n * @returns If the current model reflects no split of fit split\r\n * @remarks Fit to Screen falls under no split\r\n */\r\n isNoSplit(pageSplitOption: PageSplitOption) {\r\n const splitValue = parseInt(pageSplitOption + '', 10); // Just in case it's a string from form\r\n return splitValue === PageSplitOption.NoSplit || splitValue === PageSplitOption.FitSplit;\r\n }\r\n\r\n /**\r\n * If the split option is Left to Right. This means that the Left side of the image renders before the Right side.\r\n * In other words, If you were to visualize the parts as pages, Left is Page 0, Right is Page 1\r\n */\r\n isSplitLeftToRight(pageSplitOption: PageSplitOption) {\r\n return parseInt(pageSplitOption + '', 10) === PageSplitOption.SplitLeftToRight;\r\n }\r\n\r\n /**\r\n * If the current page is second to last image\r\n */\r\n isSecondLastImage(pageNum: number, maxPages: number) {\r\n return (maxPages - 2) === pageNum;\r\n }\r\n\r\n /**\r\n * If the current image is last image\r\n */\r\n isLastImage(pageNum: number, maxPages: number) {\r\n return maxPages - 1 === pageNum;\r\n }\r\n\r\n /**\r\n * Should Canvas Renderer be used\r\n * @param img\r\n * @param pageSplitOption\r\n * @returns\r\n */\r\n shouldSplit(img: HTMLImageElement, pageSplitOption: PageSplitOption) {\r\n const needsSplitting = this.isWidePage(this.readerService.imageUrlToPageNum(img?.src));\r\n return !(this.isNoSplit(pageSplitOption) || !needsSplitting)\r\n }\r\n\r\n shouldRenderAsFitSplit(pageSplitOption: PageSplitOption) {\r\n // Some pages aren't cover images but might need fit split renderings\r\n if (parseInt(pageSplitOption + '', 10) !== PageSplitOption.FitSplit) return false;\r\n return true;\r\n }\r\n\r\n\r\n translateScalingOption(option: ScalingOption) {\r\n switch (option) {\r\n case (ScalingOption.Automatic):\r\n {\r\n const windowWidth = window.innerWidth\r\n || document.documentElement.clientWidth\r\n || document.body.clientWidth;\r\n const windowHeight = window.innerHeight\r\n || document.documentElement.clientHeight\r\n || document.body.clientHeight;\r\n\r\n const ratio = windowWidth / windowHeight;\r\n if (windowHeight > windowWidth) {\r\n return FITTING_OPTION.WIDTH;\r\n }\r\n\r\n if (windowWidth >= windowHeight || ratio > 1.0) {\r\n return FITTING_OPTION.HEIGHT;\r\n }\r\n return FITTING_OPTION.WIDTH;\r\n }\r\n case (ScalingOption.FitToHeight):\r\n return FITTING_OPTION.HEIGHT;\r\n case (ScalingOption.FitToWidth):\r\n return FITTING_OPTION.WIDTH;\r\n default:\r\n return FITTING_OPTION.ORIGINAL;\r\n }\r\n }\r\n\r\n\r\n applyBookmarkEffect(elements: Array) {\r\n if (elements.length > 0) {\r\n elements.forEach(elem => this.renderer.addClass(elem, 'bookmark-effect'));\r\n setTimeout(() => {\r\n elements.forEach(elem => this.renderer.removeClass(elem, 'bookmark-effect'));\r\n }, 1000);\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n}\r\n","import { inject } from '@angular/core';\r\nimport { Pipe, PipeTransform } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@Pipe({\r\n name: 'safeStyle',\r\n standalone: true\r\n})\r\nexport class SafeStylePipe implements PipeTransform {\r\n private readonly sanitizer: DomSanitizer = inject(DomSanitizer);\r\n constructor(){}\r\n\r\n transform(style: string) {\r\n return this.sanitizer.bypassSecurityTrustStyle(style);\r\n }\r\n\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component, DestroyRef,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n Input,\r\n OnInit,\r\n Output,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { filter, map, Observable, of, tap } from 'rxjs';\r\nimport { PageSplitOption } from 'src/app/_models/preferences/page-split-option';\r\nimport { ReaderService } from 'src/app/_services/reader.service';\r\nimport { LayoutMode } from '../../_models/layout-mode';\r\nimport { FITTING_OPTION, PAGING_DIRECTION, SPLIT_PAGE_PART } from '../../_models/reader-enums';\r\nimport { ReaderSetting } from '../../_models/reader-setting';\r\nimport { ImageRenderer } from '../../_models/renderer';\r\nimport { ManagaReaderService } from '../../_service/managa-reader.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport { SafeStylePipe } from '../../../_pipes/safe-style.pipe';\r\nimport { NgClass, AsyncPipe } from '@angular/common';\r\n\r\nconst ValidSplits = [PageSplitOption.SplitLeftToRight, PageSplitOption.SplitRightToLeft];\r\n\r\n@Component({\r\n selector: 'app-canvas-renderer',\r\n templateUrl: './canvas-renderer.component.html',\r\n styleUrls: ['./canvas-renderer.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [NgClass, AsyncPipe, SafeStylePipe]\r\n})\r\nexport class CanvasRendererComponent implements OnInit, AfterViewInit, ImageRenderer {\r\n\r\n @Input({required: true}) readerSettings$!: Observable;\r\n @Input({required: true}) image$!: Observable;\r\n @Input({required: true}) bookmark$!: Observable;\r\n @Input({required: true}) showClickOverlay$!: Observable;\r\n @Input() imageFit$!: Observable;\r\n @Output() imageHeight: EventEmitter = new EventEmitter();\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n @ViewChild('content') canvas: ElementRef | undefined;\r\n private ctx!: CanvasRenderingContext2D;\r\n\r\n currentImageSplitPart: SPLIT_PAGE_PART = SPLIT_PAGE_PART.NO_SPLIT;\r\n pagingDirection: PAGING_DIRECTION = PAGING_DIRECTION.FORWARD;\r\n\r\n fit: FITTING_OPTION = FITTING_OPTION.ORIGINAL;\r\n pageSplit: PageSplitOption = PageSplitOption.FitSplit;\r\n layoutMode: LayoutMode = LayoutMode.Single;\r\n\r\n canvasImage: HTMLImageElement | null = null;\r\n showClickOverlayClass$!: Observable;\r\n /**\r\n * Maps darkness value to the filter style\r\n */\r\n darkness$: Observable = of('brightness(100%)');\r\n /**\r\n * Maps image fit value to the classes for image fitting\r\n */\r\n imageFitClass$!: Observable;\r\n renderWithCanvas: boolean = false;\r\n\r\n\r\n\r\n constructor(private readonly cdRef: ChangeDetectorRef, private mangaReaderService: ManagaReaderService, private readerService: ReaderService) { }\r\n\r\n ngOnInit(): void {\r\n this.readerSettings$.pipe(takeUntilDestroyed(this.destroyRef), tap((value: ReaderSetting) => {\r\n this.fit = value.fitting;\r\n this.pageSplit = value.pageSplit;\r\n this.layoutMode = value.layoutMode;\r\n const rerenderNeeded = this.pageSplit != value.pageSplit;\r\n this.pagingDirection = value.pagingDirection;\r\n if (rerenderNeeded) {\r\n this.reset();\r\n }\r\n })).subscribe(() => {});\r\n\r\n this.darkness$ = this.readerSettings$.pipe(\r\n map(values => 'brightness(' + values.darkness + '%)'),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.imageFitClass$ = this.readerSettings$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n map((values: ReaderSetting) => values.fitting),\r\n map(fit => {\r\n if (fit === FITTING_OPTION.WIDTH) return fit; // || this.layoutMode === LayoutMode.Single (so that we can check the wide stuff)\r\n if (this.canvasImage === null) return fit;\r\n\r\n // Would this ever execute given that we perform splitting only in this renderer?\r\n if (\r\n this.mangaReaderService.isWidePage(this.readerService.imageUrlToPageNum(this.canvasImage.src)) &&\r\n this.mangaReaderService.shouldRenderAsFitSplit(this.pageSplit)\r\n ) {\r\n // Rewriting to fit to width for this cover image\r\n return FITTING_OPTION.WIDTH;\r\n }\r\n return fit;\r\n }),\r\n filter(() => this.isValid()),\r\n );\r\n\r\n\r\n this.bookmark$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n tap(_ => {\r\n if (this.currentImageSplitPart === SPLIT_PAGE_PART.NO_SPLIT) return;\r\n if (!this.canvas) return;\r\n\r\n const elements = [this.canvas?.nativeElement];\r\n this.mangaReaderService.applyBookmarkEffect(elements);\r\n })\r\n ).subscribe(() => {});\r\n\r\n this.showClickOverlayClass$ = this.showClickOverlay$.pipe(\r\n map(showOverlay => showOverlay ? 'blur' : ''),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.canvas) {\r\n this.ctx = this.canvas.nativeElement.getContext('2d', { alpha: false });\r\n }\r\n }\r\n\r\n\r\n reset() {\r\n this.currentImageSplitPart = SPLIT_PAGE_PART.NO_SPLIT;\r\n }\r\n\r\n updateSplitPage() {\r\n if (this.canvasImage == null) return;\r\n const needsSplitting = this.mangaReaderService.isWidePage(this.readerService.imageUrlToPageNum(this.canvasImage.src));\r\n\r\n if (!needsSplitting || this.mangaReaderService.isNoSplit(this.pageSplit)) {\r\n this.currentImageSplitPart = SPLIT_PAGE_PART.NO_SPLIT;\r\n return needsSplitting;\r\n }\r\n const splitLeftToRight = this.mangaReaderService.isSplitLeftToRight(this.pageSplit);\r\n\r\n if (this.pagingDirection === PAGING_DIRECTION.FORWARD) {\r\n switch (this.currentImageSplitPart) {\r\n case SPLIT_PAGE_PART.NO_SPLIT:\r\n this.currentImageSplitPart = splitLeftToRight ? SPLIT_PAGE_PART.LEFT_PART : SPLIT_PAGE_PART.RIGHT_PART;\r\n break;\r\n case SPLIT_PAGE_PART.LEFT_PART:\r\n const r2lSplittingPart = (needsSplitting ? SPLIT_PAGE_PART.RIGHT_PART : SPLIT_PAGE_PART.NO_SPLIT);\r\n this.currentImageSplitPart = splitLeftToRight ? SPLIT_PAGE_PART.RIGHT_PART : r2lSplittingPart;\r\n break;\r\n case SPLIT_PAGE_PART.RIGHT_PART:\r\n const l2rSplittingPart = (needsSplitting ? SPLIT_PAGE_PART.LEFT_PART : SPLIT_PAGE_PART.NO_SPLIT);\r\n this.currentImageSplitPart = splitLeftToRight ? l2rSplittingPart : SPLIT_PAGE_PART.LEFT_PART;\r\n break;\r\n }\r\n } else if (this.pagingDirection === PAGING_DIRECTION.BACKWARDS) {\r\n switch (this.currentImageSplitPart) {\r\n case SPLIT_PAGE_PART.NO_SPLIT:\r\n this.currentImageSplitPart = splitLeftToRight ? SPLIT_PAGE_PART.RIGHT_PART : SPLIT_PAGE_PART.LEFT_PART;\r\n break;\r\n case SPLIT_PAGE_PART.LEFT_PART:\r\n const l2rSplittingPart = (needsSplitting ? SPLIT_PAGE_PART.RIGHT_PART : SPLIT_PAGE_PART.NO_SPLIT);\r\n this.currentImageSplitPart = splitLeftToRight? l2rSplittingPart : SPLIT_PAGE_PART.RIGHT_PART;\r\n break;\r\n case SPLIT_PAGE_PART.RIGHT_PART:\r\n this.currentImageSplitPart = splitLeftToRight ? SPLIT_PAGE_PART.LEFT_PART : (needsSplitting ? SPLIT_PAGE_PART.LEFT_PART : SPLIT_PAGE_PART.NO_SPLIT);\r\n break;\r\n }\r\n }\r\n return needsSplitting;\r\n }\r\n\r\n\r\n isValid() {\r\n return this.renderWithCanvas;\r\n }\r\n\r\n /**\r\n * This renderer does not render when splitting is not needed\r\n * @param img\r\n * @returns\r\n */\r\n renderPage(img: Array) {\r\n this.renderWithCanvas = false;\r\n if (img === null || img.length === 0 || img[0] === null) return;\r\n if (!this.ctx || !this.canvas) return;\r\n this.canvasImage = img[0];\r\n this.cdRef.markForCheck();\r\n\r\n if (this.layoutMode !== LayoutMode.Single || !ValidSplits.includes(this.pageSplit)) {\r\n return;\r\n }\r\n\r\n const needsSplitting = this.updateSplitPage();\r\n if (!needsSplitting) return;\r\n\r\n // This is toggling true when manga reader shouldn't use this code\r\n\r\n this.renderWithCanvas = true;\r\n if (this.currentImageSplitPart === SPLIT_PAGE_PART.NO_SPLIT) return;\r\n\r\n this.setCanvasSize();\r\n\r\n if (needsSplitting && this.currentImageSplitPart === SPLIT_PAGE_PART.LEFT_PART) {\r\n this.canvas.nativeElement.width = this.canvasImage.width / 2;\r\n this.ctx.drawImage(this.canvasImage, 0, 0, this.canvasImage.width, this.canvasImage.height, 0, 0, this.canvasImage.width, this.canvasImage.height);\r\n this.cdRef.markForCheck();\r\n } else if (needsSplitting && this.currentImageSplitPart === SPLIT_PAGE_PART.RIGHT_PART) {\r\n this.canvas.nativeElement.width = this.canvasImage.width / 2;\r\n this.ctx.drawImage(this.canvasImage, 0, 0, this.canvasImage.width, this.canvasImage.height, -this.canvasImage.width / 2, 0, this.canvasImage.width, this.canvasImage.height);\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n getPageAmount(direction: PAGING_DIRECTION) {\r\n if (this.canvasImage === null) return 1;\r\n if (!this.mangaReaderService.isWidePage(this.readerService.imageUrlToPageNum(this.canvasImage.src))) return 1;\r\n switch(direction) {\r\n case PAGING_DIRECTION.FORWARD:\r\n return this.shouldMoveNext() ? 1 : 0;\r\n case PAGING_DIRECTION.BACKWARDS:\r\n return this.shouldMovePrev() ? 1 : 0;\r\n }\r\n }\r\n\r\n shouldMoveNext() {\r\n if (this.mangaReaderService.isNoSplit(this.pageSplit)) return true;\r\n const isSplitLeftToRight = this.mangaReaderService.isSplitLeftToRight(this.pageSplit);\r\n return this.currentImageSplitPart !== (this.mangaReaderService.isSplitLeftToRight(this.pageSplit) ? SPLIT_PAGE_PART.LEFT_PART : SPLIT_PAGE_PART.RIGHT_PART);\r\n }\r\n\r\n shouldMovePrev() {\r\n if (this.mangaReaderService.isNoSplit(this.pageSplit)) return true;\r\n return this.currentImageSplitPart !== (this.mangaReaderService.isSplitLeftToRight(this.pageSplit) ? SPLIT_PAGE_PART.RIGHT_PART : SPLIT_PAGE_PART.LEFT_PART);\r\n }\r\n\r\n /**\r\n * There are some hard limits on the size of canvas' that we must cap at. https://github.com/jhildenbiddle/canvas-size#test-results\r\n * For Safari, it's 16,777,216, so we cap at 4096x4096 when this happens. The drawImage in render will perform bi-cubic scaling for us.\r\n */\r\n setCanvasSize() {\r\n if (this.canvasImage == null) return;\r\n if (!this.ctx || !this.canvas) { return; }\r\n const isSafari = [\r\n 'iPad Simulator',\r\n 'iPhone Simulator',\r\n 'iPod Simulator',\r\n 'iPad',\r\n 'iPhone',\r\n 'iPod'\r\n ].includes(navigator.platform)\r\n // iPad on iOS 13 detection\r\n || (navigator.userAgent.includes(\"Mac\") && \"ontouchend\" in document);\r\n const canvasLimit = isSafari ? 16_777_216 : 124_992_400;\r\n const needsScaling = this.canvasImage.width * this.canvasImage.height > canvasLimit;\r\n if (needsScaling) {\r\n this.canvas.nativeElement.width = isSafari ? 4_096 : 16_384;\r\n this.canvas.nativeElement.height = isSafari ? 4_096 : 16_384;\r\n } else {\r\n this.canvas.nativeElement.width = this.canvasImage.width;\r\n this.canvas.nativeElement.height = this.canvasImage.height;\r\n }\r\n this.imageHeight.emit(this.canvas.nativeElement.height);\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n getBookmarkPageCount(): number {\r\n return 1;\r\n }\r\n}\r\n","
\r\n \r\n
\r\n\r\n","import { DOCUMENT, NgIf, NgClass, AsyncPipe } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component, DestroyRef,\r\n EventEmitter,\r\n inject,\r\n Inject,\r\n Input,\r\n OnInit,\r\n Output\r\n} from '@angular/core';\r\nimport { Observable, of, map, tap, shareReplay, filter, combineLatest } from 'rxjs';\r\nimport { PageSplitOption } from 'src/app/_models/preferences/page-split-option';\r\nimport { ReaderMode } from 'src/app/_models/preferences/reader-mode';\r\nimport { ReaderService } from 'src/app/_services/reader.service';\r\nimport { LayoutMode } from '../../_models/layout-mode';\r\nimport { FITTING_OPTION, PAGING_DIRECTION } from '../../_models/reader-enums';\r\nimport { ReaderSetting } from '../../_models/reader-setting';\r\nimport { DEBUG_MODES, ImageRenderer } from '../../_models/renderer';\r\nimport { ManagaReaderService } from '../../_service/managa-reader.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport { SafeStylePipe } from '../../../_pipes/safe-style.pipe';\r\n\r\n/**\r\n * Renders 2 pages except on first page, last page, and before a wide image\r\n */\r\n@Component({\r\n selector: 'app-double-renderer',\r\n templateUrl: './double-renderer.component.html',\r\n styleUrls: ['./double-renderer.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [NgIf, NgClass, AsyncPipe, SafeStylePipe]\r\n})\r\nexport class DoubleRendererComponent implements OnInit, ImageRenderer {\r\n\r\n @Input({required: true}) readerSettings$!: Observable;\r\n @Input({required: true}) image$!: Observable;\r\n @Input({required: true}) bookmark$!: Observable;\r\n @Input({required: true}) showClickOverlay$!: Observable;\r\n @Input({required: true}) pageNum$!: Observable<{pageNum: number, maxPages: number}>;\r\n @Input({required: true}) getPage!: (pageNum: number) => HTMLImageElement;\r\n @Output() imageHeight: EventEmitter = new EventEmitter();\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n debugMode: DEBUG_MODES = DEBUG_MODES.None;\r\n imageFitClass$!: Observable;\r\n showClickOverlayClass$!: Observable;\r\n readerModeClass$!: Observable;\r\n layoutClass$!: Observable;\r\n darkness$: Observable = of('brightness(100%)');\r\n emulateBookClass$: Observable = of('');\r\n layoutMode: LayoutMode = LayoutMode.Single;\r\n pageSplit: PageSplitOption = PageSplitOption.FitSplit;\r\n pageNum: number = 0;\r\n maxPages: number = 0;\r\n\r\n /**\r\n * Used to render a page on the canvas or in the image tag. This Image element is prefetched by the cachedImages buffer.\r\n * @remarks Used for rendering to screen.\r\n */\r\n currentImage = new Image();\r\n /**\r\n * Used solely for LayoutMode.Double rendering.\r\n * @remarks Used for rendering to screen.\r\n */\r\n currentImage2 = new Image();\r\n\r\n /**\r\n * Determines if we should render a double page.\r\n * The general gist is if we are on double layout mode, the current page (first page) is not a cover image or a wide image\r\n * and the next page is not a wide image (as only non-wides should be shown next to each other).\r\n * @remarks This will always fail if the window's width is greater than the height\r\n */\r\n shouldRenderDouble$!: Observable;\r\n\r\n\r\n protected readonly ReaderMode = ReaderMode;\r\n protected readonly LayoutMode = LayoutMode;\r\n\r\n\r\n constructor(private readonly cdRef: ChangeDetectorRef, public mangaReaderService: ManagaReaderService,\r\n @Inject(DOCUMENT) private document: Document, public readerService: ReaderService) { }\r\n\r\n ngOnInit(): void {\r\n this.readerModeClass$ = this.readerSettings$.pipe(\r\n map(values => values.readerMode),\r\n map(mode => mode === ReaderMode.LeftRight || mode === ReaderMode.UpDown ? '' : 'd-none'),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.darkness$ = this.readerSettings$.pipe(\r\n map(values => 'brightness(' + values.darkness + '%)'),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.emulateBookClass$ = this.readerSettings$.pipe(\r\n map(data => data.emulateBook),\r\n map(enabled => enabled ? 'book-shadow' : ''),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.showClickOverlayClass$ = this.showClickOverlay$.pipe(\r\n map(showOverlay => showOverlay ? 'blur' : ''),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.pageNum$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n tap(pageInfo => {\r\n this.pageNum = pageInfo.pageNum;\r\n this.maxPages = pageInfo.maxPages;\r\n\r\n this.currentImage = this.getPage(this.pageNum);\r\n this.currentImage2 = this.getPage(this.pageNum + 1);\r\n\r\n this.cdRef.markForCheck();\r\n }),\r\n filter(_ => this.isValid()),\r\n ).subscribe(() => {});\r\n\r\n this.shouldRenderDouble$ = this.pageNum$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n map((_) => this.shouldRenderDouble()),\r\n filter(_ => this.isValid()),\r\n );\r\n\r\n this.imageFitClass$ = this.readerSettings$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n map(values => values.fitting),\r\n filter(_ => this.isValid()),\r\n shareReplay()\r\n );\r\n\r\n this.layoutClass$ = combineLatest([this.shouldRenderDouble$, this.readerSettings$]).pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n map((value) => {\r\n if (value[0] && value[1].fitting === FITTING_OPTION.WIDTH) return 'fit-to-width-double-offset';\r\n if (value[0] && value[1].fitting === FITTING_OPTION.HEIGHT) return 'fit-to-height-double-offset';\r\n if (value[0] && value[1].fitting === FITTING_OPTION.ORIGINAL) return 'original-double-offset';\r\n if (this.mangaReaderService.isWidePage(this.pageNum) ) return 'double-offset';\r\n return '';\r\n }),\r\n filter(_ => this.isValid()),\r\n );\r\n\r\n\r\n this.readerSettings$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n tap(values => {\r\n this.layoutMode = values.layoutMode;\r\n this.pageSplit = values.pageSplit;\r\n this.cdRef.markForCheck();\r\n })\r\n ).subscribe(() => {});\r\n\r\n this.bookmark$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n tap(_ => {\r\n const elements = [];\r\n const image1 = this.document.querySelector('#image-1');\r\n if (image1 != null) elements.push(image1);\r\n\r\n const image2 = this.document.querySelector('#image-2');\r\n if (image2 != null) elements.push(image2);\r\n\r\n this.mangaReaderService.applyBookmarkEffect(elements);\r\n }),\r\n filter(_ => this.isValid()),\r\n ).subscribe(() => {});\r\n }\r\n\r\n\r\n shouldRenderDouble() {\r\n if (!this.isValid()) return false;\r\n\r\n if (this.mangaReaderService.isCoverImage(this.pageNum)) {\r\n this.debugLog('Not rendering double as current page is cover image');\r\n return false;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum) ) {\r\n this.debugLog('Not rendering double as current page is wide image');\r\n return false;\r\n }\r\n\r\n if (this.mangaReaderService.isSecondLastImage(this.pageNum, this.maxPages)) {\r\n this.debugLog('Not rendering double as current page is last');\r\n return false;\r\n }\r\n\r\n if (this.mangaReaderService.isLastImage(this.pageNum, this.maxPages)) {\r\n this.debugLog('Not rendering double as current page is last');\r\n return false;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum + 1) ) {\r\n this.debugLog('Not rendering double as next page is wide image');\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n isValid() {\r\n return this.layoutMode === LayoutMode.Double;\r\n }\r\n\r\n renderPage(img: Array): void {\r\n if (img === null || img.length === 0 || img[0] === null) return;\r\n if (!this.isValid()) return;\r\n\r\n // First load, switching from double manga -> double, this is 0 and thus not rendering\r\n if (!this.shouldRenderDouble() && (this.currentImage.height || img[0].height) > 0) {\r\n this.imageHeight.emit(this.currentImage.height || img[0].height);\r\n return;\r\n }\r\n\r\n this.cdRef.markForCheck();\r\n this.imageHeight.emit(Math.max(this.currentImage.height, this.currentImage2.height));\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n shouldMovePrev(): boolean {\r\n return true;\r\n }\r\n shouldMoveNext(): boolean {\r\n return true;\r\n }\r\n getPageAmount(direction: PAGING_DIRECTION): number {\r\n if (!this.isValid()) return 0;\r\n\r\n switch (direction) {\r\n case PAGING_DIRECTION.FORWARD:\r\n if (this.mangaReaderService.isCoverImage(this.pageNum)) {\r\n this.debugLog('Moving forward 1 page as on cover image');\r\n return 1;\r\n }\r\n if (this.mangaReaderService.isWidePage(this.pageNum)) {\r\n this.debugLog('Moving forward 1 page as current page is wide');\r\n return 1;\r\n }\r\n if (this.mangaReaderService.isWidePage(this.pageNum + 1)) {\r\n this.debugLog('Moving forward 1 page as next page is wide');\r\n return 1;\r\n }\r\n if (this.mangaReaderService.isSecondLastImage(this.pageNum, this.maxPages)) {\r\n this.debugLog('Moving forward 1 page as 2 pages left');\r\n return 1;\r\n }\r\n if (this.mangaReaderService.isLastImage(this.pageNum, this.maxPages)) {\r\n this.debugLog('Moving forward 1 page as 1 page left');\r\n return 1;\r\n }\r\n this.debugLog('Moving forward 2 pages');\r\n return 2;\r\n case PAGING_DIRECTION.BACKWARDS:\r\n if (this.mangaReaderService.isCoverImage(this.pageNum)) {\r\n this.debugLog('Moving back 1 page as on cover image');\r\n return 1;\r\n }\r\n\r\n if (this.mangaReaderService.adjustForDoubleReader(this.pageNum - 1) != this.pageNum - 1 && !this.mangaReaderService.isWidePage(this.pageNum - 2)) {\r\n this.debugLog('Moving back 2 pages as previous pair should be in a pair');\r\n return 2;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum)) {\r\n this.debugLog('Moving back 1 page as current page is wide');\r\n return 1;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum - 1)) {\r\n this.debugLog('Moving back 1 page as prev page is wide');\r\n return 1;\r\n }\r\n if (this.mangaReaderService.isWidePage(this.pageNum - 2)) {\r\n this.debugLog('Moving back 1 page as 2 pages back is wide');\r\n return 1;\r\n }\r\n\r\n this.debugLog('Moving back 2 pages');\r\n return 2;\r\n }\r\n }\r\n reset(): void {}\r\n\r\n getBookmarkPageCount(): number {\r\n return this.shouldRenderDouble() ? 2 : 1;\r\n }\r\n\r\n debugLog(message: string, extraData?: any) {\r\n if (!(this.debugMode & DEBUG_MODES.Logs)) return;\r\n\r\n if (extraData !== undefined) {\r\n console.log(message, extraData);\r\n } else {\r\n console.log(message);\r\n }\r\n }\r\n}\r\n","\r\n
\r\n \r\n \"\r\n \r\n \r\n \"\r\n \r\n
\r\n
\r\n","import { DOCUMENT, NgIf, NgClass, AsyncPipe } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component, DestroyRef,\r\n EventEmitter,\r\n inject,\r\n Inject,\r\n Input,\r\n OnInit,\r\n Output\r\n} from '@angular/core';\r\nimport { Observable, of, map, tap, shareReplay, filter, combineLatest } from 'rxjs';\r\nimport { PageSplitOption } from 'src/app/_models/preferences/page-split-option';\r\nimport { ReaderMode } from 'src/app/_models/preferences/reader-mode';\r\nimport { ReaderService } from 'src/app/_services/reader.service';\r\nimport { LayoutMode } from '../../_models/layout-mode';\r\nimport { FITTING_OPTION, PAGING_DIRECTION } from '../../_models/reader-enums';\r\nimport { ReaderSetting } from '../../_models/reader-setting';\r\nimport { DEBUG_MODES, ImageRenderer } from '../../_models/renderer';\r\nimport { ManagaReaderService } from '../../_service/managa-reader.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport { SafeStylePipe } from '../../../_pipes/safe-style.pipe';\r\n\r\n/**\r\n * This is aimed at manga. Double page renderer but where if we have page = 10, you will see\r\n * page 11 page 10.\r\n */\r\n@Component({\r\n selector: 'app-double-reverse-renderer',\r\n templateUrl: './double-reverse-renderer.component.html',\r\n styleUrls: ['./double-reverse-renderer.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [NgIf, NgClass, AsyncPipe, SafeStylePipe]\r\n})\r\nexport class DoubleReverseRendererComponent implements OnInit, ImageRenderer {\r\n\r\n\r\n @Input({required: true}) readerSettings$!: Observable;\r\n @Input({required: true}) image$!: Observable;\r\n @Input({required: true}) bookmark$!: Observable;\r\n @Input({required: true}) showClickOverlay$!: Observable;\r\n @Input({required: true}) pageNum$!: Observable<{pageNum: number, maxPages: number}>;\r\n @Input({required: true}) getPage!: (pageNum: number) => HTMLImageElement;\r\n @Output() imageHeight: EventEmitter = new EventEmitter();\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n debugMode: DEBUG_MODES = DEBUG_MODES.None;\r\n\r\n imageFitClass$!: Observable;\r\n showClickOverlayClass$!: Observable;\r\n readerModeClass$!: Observable;\r\n layoutClass$!: Observable;\r\n darkness$: Observable = of('brightness(100%)');\r\n emulateBookClass$: Observable = of('');\r\n layoutMode: LayoutMode = LayoutMode.Single;\r\n pageSplit: PageSplitOption = PageSplitOption.FitSplit;\r\n pageNum: number = 0;\r\n maxPages: number = 0;\r\n\r\n /**\r\n * Used to render a page on the canvas or in the image tag. This Image element is prefetched by the cachedImages buffer.\r\n * @remarks Used for rendering to screen.\r\n */\r\n leftImage = new Image();\r\n /**\r\n * Used solely for LayoutMode.Double rendering. Will always hold the next image to currentImage\r\n * @remarks Used for rendering to screen.\r\n */\r\n rightImage = new Image();\r\n\r\n /**\r\n * Determines if we should render a double page.\r\n * The general gist is if we are on double layout mode, the current page (first page) is not a cover image or a wide image\r\n * and the next page is not a wide image (as only non-wides should be shown next to each other).\r\n * @remarks This will always fail if the window's width is greater than the height\r\n */\r\n shouldRenderDouble$!: Observable;\r\n\r\n get ReaderMode() {return ReaderMode;}\r\n get FITTING_OPTION() {return FITTING_OPTION;}\r\n get LayoutMode() {return LayoutMode;}\r\n\r\n\r\n\r\n constructor(private readonly cdRef: ChangeDetectorRef, public mangaReaderService: ManagaReaderService,\r\n @Inject(DOCUMENT) private document: Document, public readerService: ReaderService) { }\r\n\r\n ngOnInit(): void {\r\n this.readerModeClass$ = this.readerSettings$.pipe(\r\n filter(_ => this.isValid()),\r\n map(values => values.readerMode),\r\n map(mode => mode === ReaderMode.LeftRight || mode === ReaderMode.UpDown ? '' : 'd-none'),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.darkness$ = this.readerSettings$.pipe(\r\n map(values => 'brightness(' + values.darkness + '%)'),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.emulateBookClass$ = this.readerSettings$.pipe(\r\n map(data => data.emulateBook),\r\n map(enabled => enabled ? 'book-shadow' : ''),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.showClickOverlayClass$ = this.showClickOverlay$.pipe(\r\n map(showOverlay => showOverlay ? 'blur' : ''),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.pageNum$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n tap(pageInfo => {\r\n this.pageNum = pageInfo.pageNum;\r\n this.maxPages = pageInfo.maxPages;\r\n\r\n this.leftImage = this.getPage(this.pageNum);\r\n this.rightImage = this.getPage(this.pageNum + 1);\r\n }),\r\n filter(_ => this.isValid()),\r\n ).subscribe(() => {});\r\n\r\n this.shouldRenderDouble$ = this.pageNum$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n map(() => this.shouldRenderDouble()),\r\n filter(() => this.isValid()),\r\n shareReplay()\r\n );\r\n\r\n this.imageFitClass$ = this.readerSettings$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n map(values => values.fitting),\r\n filter(_ => this.isValid()),\r\n shareReplay()\r\n );\r\n\r\n this.layoutClass$ = combineLatest([this.shouldRenderDouble$, this.readerSettings$]).pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n map((value) => {\r\n if (value[0] && value[1].fitting === FITTING_OPTION.WIDTH) return 'fit-to-width-double-offset';\r\n if (value[0] && value[1].fitting === FITTING_OPTION.HEIGHT) return 'fit-to-height-double-offset';\r\n if (value[0] && value[1].fitting === FITTING_OPTION.ORIGINAL) return 'original-double-offset';\r\n if (this.mangaReaderService.isWidePage(this.pageNum) ) return 'double-offset';\r\n return '';\r\n }),\r\n filter(_ => this.isValid()),\r\n );\r\n\r\n\r\n this.readerSettings$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n tap(values => {\r\n this.layoutMode = values.layoutMode;\r\n this.pageSplit = values.pageSplit;\r\n this.cdRef.markForCheck();\r\n })\r\n ).subscribe(() => {});\r\n\r\n this.bookmark$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n tap(_ => {\r\n const elements = [];\r\n const image1 = this.document.querySelector('#image-1');\r\n if (image1 != null) elements.push(image1);\r\n\r\n const image2 = this.document.querySelector('#image-2');\r\n if (image2 != null) elements.push(image2);\r\n\r\n this.mangaReaderService.applyBookmarkEffect(elements);\r\n }),\r\n filter(_ => this.isValid()),\r\n ).subscribe(() => {});\r\n }\r\n\r\n shouldRenderDouble() {\r\n if (!this.isValid()) return false;\r\n\r\n if (this.mangaReaderService.isCoverImage(this.pageNum)) {\r\n this.debugLog('Not rendering double as current page is cover image');\r\n return false;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum)) {\r\n this.debugLog('Not rendering double as current page is wide image');\r\n return false;\r\n }\r\n\r\n if (this.mangaReaderService.isSecondLastImage(this.pageNum, this.maxPages)) {\r\n this.debugLog('Not rendering double as current page is last');\r\n return false;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum + 1) ) {\r\n this.debugLog('Not rendering double as next page is wide image');\r\n return false;\r\n }\r\n\r\n if (this.mangaReaderService.isLastImage(this.pageNum, this.maxPages)) {\r\n this.debugLog('Not rendering double as current page is last and there are an odd number of pages');\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n isValid() {\r\n return this.layoutMode === LayoutMode.DoubleReversed;\r\n }\r\n\r\n renderPage(img: Array): void {\r\n if (img === null || img.length === 0 || img[0] === null) return;\r\n if (!this.isValid()) return;\r\n\r\n this.imageHeight.emit(Math.max(this.leftImage.height, this.rightImage.height));\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n shouldMovePrev(): boolean {\r\n return true;\r\n }\r\n shouldMoveNext(): boolean {\r\n return true;\r\n }\r\n getPageAmount(direction: PAGING_DIRECTION): number {\r\n if (this.layoutMode !== LayoutMode.DoubleReversed) return 0;\r\n\r\n switch (direction) {\r\n case PAGING_DIRECTION.FORWARD:\r\n if (this.mangaReaderService.isCoverImage(this.pageNum)) {\r\n this.debugLog('Moving forward 1 page as on cover image');\r\n return 1;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum)) {\r\n this.debugLog('Moving forward 1 page as current page is wide');\r\n return 1;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum + 1)) {\r\n this.debugLog('Moving forward 1 page as current page is wide');\r\n return 1;\r\n }\r\n\r\n if (this.mangaReaderService.isSecondLastImage(this.pageNum, this.maxPages)) {\r\n this.debugLog('Moving forward 1 page as 2 pages left');\r\n return 1;\r\n }\r\n\r\n if (this.mangaReaderService.isLastImage(this.pageNum, this.maxPages)) {\r\n this.debugLog('Moving forward 2 pages as right image is the last page and we just rendered double page');\r\n return 2;\r\n }\r\n\r\n this.debugLog('Moving forward 2 pages');\r\n return 2;\r\n case PAGING_DIRECTION.BACKWARDS:\r\n if (this.mangaReaderService.isCoverImage(this.pageNum)) {\r\n this.debugLog('Moving back 1 page as on cover image');\r\n return 1;\r\n }\r\n\r\n if (this.mangaReaderService.adjustForDoubleReader(this.pageNum - 1) != this.pageNum - 1 && !this.mangaReaderService.isWidePage(this.pageNum - 2)) {\r\n this.debugLog('Moving back 2 pages as previous pair should be in a pair');\r\n return 2;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum)) {\r\n this.debugLog('Moving back 1 page as left page is wide');\r\n return 1;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum) && (!this.mangaReaderService.isWidePage(this.pageNum - 4))) {\r\n this.debugLog('Moving back 1 page as left page is wide');\r\n return 1;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum - 1)) {\r\n this.debugLog('Moving back 1 page as prev page is wide');\r\n return 1;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum - 2)) {\r\n this.debugLog('Moving back 1 page as 2 pages back is wide');\r\n return 1;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum + 2)) {\r\n this.debugLog('Moving back 2 page as 2 pages back is wide');\r\n return 1;\r\n }\r\n // Not sure about this condition on moving backwards\r\n if (this.mangaReaderService.isSecondLastImage(this.pageNum, this.maxPages)) {\r\n this.debugLog('Moving back 1 page as 2 pages left');\r\n return 1;\r\n }\r\n this.debugLog('Moving back 2 pages');\r\n return 2;\r\n }\r\n }\r\n reset(): void {}\r\n\r\n getBookmarkPageCount(): number {\r\n return this.shouldRenderDouble() ? 2 : 1;\r\n }\r\n\r\n debugLog(message: string, extraData?: any) {\r\n if (!(this.debugMode & DEBUG_MODES.Logs)) return;\r\n\r\n if (extraData !== undefined) {\r\n console.log(message, extraData);\r\n } else {\r\n console.log(message);\r\n }\r\n }\r\n}\r\n","\r\n
\r\n \r\n \"\r\n \r\n \r\n \" \r\n \r\n
\r\n
\r\n","import { DOCUMENT, NgIf, AsyncPipe } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component, DestroyRef,\r\n EventEmitter,\r\n inject,\r\n Inject,\r\n Input,\r\n OnInit,\r\n Output\r\n} from '@angular/core';\r\nimport {combineLatest, filter, map, Observable, of, shareReplay, switchMap, tap} from 'rxjs';\r\nimport { PageSplitOption } from 'src/app/_models/preferences/page-split-option';\r\nimport { ReaderMode } from 'src/app/_models/preferences/reader-mode';\r\nimport { LayoutMode } from '../../_models/layout-mode';\r\nimport { FITTING_OPTION, PAGING_DIRECTION } from '../../_models/reader-enums';\r\nimport { ReaderSetting } from '../../_models/reader-setting';\r\nimport { ImageRenderer } from '../../_models/renderer';\r\nimport { ManagaReaderService } from '../../_service/managa-reader.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport { SafeStylePipe } from '../../../_pipes/safe-style.pipe';\r\n\r\n@Component({\r\n selector: 'app-single-renderer',\r\n templateUrl: './single-renderer.component.html',\r\n styleUrls: ['./single-renderer.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [AsyncPipe, SafeStylePipe]\r\n})\r\nexport class SingleRendererComponent implements OnInit, ImageRenderer {\r\n\r\n @Input({required: true}) readerSettings$!: Observable;\r\n @Input({required: true}) image$!: Observable;\r\n @Input({required: true}) bookmark$!: Observable;\r\n @Input({required: true}) showClickOverlay$!: Observable;\r\n @Input({required: true}) pageNum$!: Observable<{pageNum: number, maxPages: number}>;\r\n\r\n @Output() imageHeight: EventEmitter = new EventEmitter();\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n imageFitClass$!: Observable;\r\n imageContainerHeight$!: Observable;\r\n showClickOverlayClass$!: Observable;\r\n readerModeClass$!: Observable;\r\n darkness$: Observable = of('brightness(100%)');\r\n emulateBookClass$!: Observable;\r\n currentImage!: HTMLImageElement;\r\n layoutMode: LayoutMode = LayoutMode.Single;\r\n pageSplit: PageSplitOption = PageSplitOption.FitSplit;\r\n\r\n pageNum: number = 0;\r\n maxPages: number = 1;\r\n\r\n /**\r\n * Width override for maunal width control\r\n */\r\n widthOverride$ : Observable = new Observable();\r\n\r\n get ReaderMode() {return ReaderMode;}\r\n get LayoutMode() {return LayoutMode;}\r\n\r\n constructor(private readonly cdRef: ChangeDetectorRef, public mangaReaderService: ManagaReaderService,\r\n @Inject(DOCUMENT) private document: Document) { }\r\n\r\n ngOnInit(): void {\r\n this.readerModeClass$ = this.readerSettings$.pipe(\r\n map(values => values.readerMode),\r\n map(mode => mode === ReaderMode.LeftRight || mode === ReaderMode.UpDown ? '' : 'd-none'),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n //handle manual width\r\n this.widthOverride$ = this.readerSettings$.pipe(\r\n map(values => (parseInt(values.widthSlider) <= 0) ? '' : values.widthSlider + '%'),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n\r\n this.emulateBookClass$ = this.readerSettings$.pipe(\r\n map(data => data.emulateBook),\r\n map(enabled => enabled ? 'book-shadow' : ''),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.imageContainerHeight$ = this.image$.pipe(\r\n filter(_ => this.isValid()),\r\n switchMap(img => {\r\n this.cdRef.markForCheck();\r\n return this.calculateImageContainerHeight$();\r\n }),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n\r\n this.pageNum$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n tap(pageInfo => {\r\n this.pageNum = pageInfo.pageNum;\r\n this.maxPages = pageInfo.maxPages;\r\n }),\r\n ).subscribe(() => {});\r\n\r\n this.darkness$ = this.readerSettings$.pipe(\r\n map(values => 'brightness(' + values.darkness + '%)'),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.showClickOverlayClass$ = this.showClickOverlay$.pipe(\r\n map(showOverlay => showOverlay ? 'blur' : ''),\r\n takeUntilDestroyed(this.destroyRef),\r\n filter(_ => this.isValid()),\r\n );\r\n\r\n this.readerSettings$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n tap(values => {\r\n this.layoutMode = values.layoutMode;\r\n this.pageSplit = values.pageSplit;\r\n this.cdRef.markForCheck();\r\n })\r\n ).subscribe(() => {});\r\n\r\n this.bookmark$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n tap(_ => {\r\n const elements = [];\r\n const image1 = this.document.querySelector('#image-1');\r\n if (image1 != null) elements.push(image1);\r\n this.mangaReaderService.applyBookmarkEffect(elements);\r\n }),\r\n filter(_ => this.isValid()),\r\n ).subscribe(() => {});\r\n\r\n this.imageFitClass$ = combineLatest([this.readerSettings$, this.pageNum$]).pipe(\r\n map(values => values[0].fitting),\r\n map(fit => {\r\n if (\r\n this.mangaReaderService.isWidePage(this.pageNum) &&\r\n this.mangaReaderService.shouldRenderAsFitSplit(this.pageSplit)\r\n ) {\r\n // Rewriting to fit to width for this cover image\r\n return FITTING_OPTION.WIDTH + ' fit-to-screen wide';\r\n }\r\n\r\n return fit;\r\n }),\r\n shareReplay({refCount: true, bufferSize: 1}),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef),\r\n );\r\n }\r\n\r\n private calculateImageContainerHeight$(): Observable {\r\n return this.readerSettings$.pipe(\r\n map(values => values.fitting),\r\n map(mode => {\r\n if (mode !== FITTING_OPTION.HEIGHT) return '';\r\n\r\n const readingArea = this.document.querySelector('.reading-area');\r\n if (!readingArea) return 'calc(100dvh)';\r\n\r\n // If you ever see fit to height and a bit of scrollbar, it's due to currentImage not being ready on first load\r\n if (this.currentImage?.width - readingArea.scrollWidth > 0) {\r\n // we also need to check if this is FF or Chrome. FF doesn't require the -34px as it doesn't render a scrollbar\r\n return 'calc(100dvh)';\r\n }\r\n return 'calc(100dvh)';\r\n }),\r\n filter(_ => this.isValid())\r\n );\r\n }\r\n\r\n isValid() {\r\n return this.layoutMode === LayoutMode.Single;\r\n }\r\n\r\n renderPage(img: Array): void {\r\n if (img === null || img.length === 0 || img[0] === null) return;\r\n if (!this.isValid()) return;\r\n\r\n this.currentImage = img[0];\r\n this.cdRef.markForCheck();\r\n this.imageHeight.emit(this.currentImage.height);\r\n }\r\n\r\n shouldMovePrev(): boolean {\r\n return true;\r\n }\r\n shouldMoveNext(): boolean {\r\n return true;\r\n }\r\n getPageAmount(direction: PAGING_DIRECTION): number {\r\n if (!this.isValid() || this.mangaReaderService.shouldSplit(this.currentImage, this.pageSplit)) return 0;\r\n return 1;\r\n }\r\n reset(): void {}\r\n\r\n getBookmarkPageCount(): number {\r\n return 1;\r\n }\r\n}\r\n","@if(isValid() && !mangaReaderService.shouldSplit(currentImage, pageSplit)) {\r\n
\r\n @if(currentImage) {\r\n \"\r\n }\r\n
\r\n}\r\n","import { DOCUMENT, NgIf, NgClass, AsyncPipe } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component, DestroyRef,\r\n EventEmitter,\r\n inject,\r\n Inject,\r\n Input,\r\n OnInit,\r\n Output\r\n} from '@angular/core';\r\nimport { Observable, of, map, tap, shareReplay, filter, combineLatest } from 'rxjs';\r\nimport { PageSplitOption } from 'src/app/_models/preferences/page-split-option';\r\nimport { ReaderMode } from 'src/app/_models/preferences/reader-mode';\r\nimport { ReaderService } from 'src/app/_services/reader.service';\r\nimport { LayoutMode } from '../../_models/layout-mode';\r\nimport { FITTING_OPTION, PAGING_DIRECTION } from '../../_models/reader-enums';\r\nimport { ReaderSetting } from '../../_models/reader-setting';\r\nimport { DEBUG_MODES } from '../../_models/renderer';\r\nimport { ManagaReaderService } from '../../_service/managa-reader.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport { SafeStylePipe } from '../../../_pipes/safe-style.pipe';\r\n\r\n/**\r\n * Renders 2 pages except on last page, and before a wide image\r\n */\r\n@Component({\r\n selector: 'app-double-no-cover-renderer',\r\n templateUrl: './double-no-cover-renderer.component.html',\r\n styleUrls: ['./double-no-cover-renderer.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [NgIf, NgClass, AsyncPipe, SafeStylePipe]\r\n})\r\nexport class DoubleNoCoverRendererComponent implements OnInit {\r\n\r\n @Input({required: true}) readerSettings$!: Observable;\r\n @Input({required: true}) image$!: Observable;\r\n @Input({required: true}) bookmark$!: Observable;\r\n @Input({required: true}) showClickOverlay$!: Observable;\r\n @Input({required: true}) pageNum$!: Observable<{pageNum: number, maxPages: number}>;\r\n @Input({required: true}) getPage!: (pageNum: number) => HTMLImageElement;\r\n @Output() imageHeight: EventEmitter = new EventEmitter();\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n debugMode: DEBUG_MODES = DEBUG_MODES.Logs;\r\n imageFitClass$!: Observable;\r\n showClickOverlayClass$!: Observable;\r\n readerModeClass$!: Observable;\r\n layoutClass$!: Observable;\r\n darkness$: Observable = of('brightness(100%)');\r\n emulateBookClass$: Observable = of('');\r\n layoutMode: LayoutMode = LayoutMode.Single;\r\n pageSplit: PageSplitOption = PageSplitOption.FitSplit;\r\n pageNum: number = 0;\r\n maxPages: number = 0;\r\n\r\n /**\r\n * Used to render a page on the canvas or in the image tag. This Image element is prefetched by the cachedImages buffer.\r\n * @remarks Used for rendering to screen.\r\n */\r\n currentImage = new Image();\r\n /**\r\n * Used solely for LayoutMode.Double rendering.\r\n * @remarks Used for rendering to screen.\r\n */\r\n currentImage2 = new Image();\r\n\r\n /**\r\n * Determines if we should render a double page.\r\n * The general gist is if we are on double layout mode, the current page (first page) is not a cover image or a wide image\r\n * and the next page is not a wide image (as only non-wides should be shown next to each other).\r\n * @remarks This will always fail if the window's width is greater than the height\r\n */\r\n shouldRenderDouble$!: Observable;\r\n\r\n\r\n get ReaderMode() {return ReaderMode;}\r\n get FITTING_OPTION() {return FITTING_OPTION;}\r\n get LayoutMode() {return LayoutMode;}\r\n\r\n\r\n\r\n constructor(private readonly cdRef: ChangeDetectorRef, public mangaReaderService: ManagaReaderService,\r\n @Inject(DOCUMENT) private document: Document, public readerService: ReaderService) { }\r\n\r\n ngOnInit(): void {\r\n this.readerModeClass$ = this.readerSettings$.pipe(\r\n map(values => values.readerMode),\r\n map(mode => mode === ReaderMode.LeftRight || mode === ReaderMode.UpDown ? '' : 'd-none'),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.darkness$ = this.readerSettings$.pipe(\r\n map(values => 'brightness(' + values.darkness + '%)'),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.emulateBookClass$ = this.readerSettings$.pipe(\r\n map(data => data.emulateBook),\r\n map(enabled => enabled ? 'book-shadow' : ''),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.showClickOverlayClass$ = this.showClickOverlay$.pipe(\r\n map(showOverlay => showOverlay ? 'blur' : ''),\r\n filter(_ => this.isValid()),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.pageNum$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n tap(pageInfo => {\r\n this.pageNum = pageInfo.pageNum;\r\n this.maxPages = pageInfo.maxPages;\r\n\r\n this.currentImage = this.getPage(this.pageNum);\r\n this.currentImage2 = this.getPage(this.pageNum + 1);\r\n\r\n this.cdRef.markForCheck();\r\n }),\r\n filter(_ => this.isValid()),\r\n ).subscribe(() => {});\r\n\r\n this.shouldRenderDouble$ = this.pageNum$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n map((_) => this.shouldRenderDouble()),\r\n filter(_ => this.isValid()),\r\n );\r\n\r\n this.imageFitClass$ = this.readerSettings$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n map(values => values.fitting),\r\n filter(_ => this.isValid()),\r\n shareReplay()\r\n );\r\n\r\n this.layoutClass$ = combineLatest([this.shouldRenderDouble$, this.readerSettings$]).pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n map((value) => {\r\n if (value[0] && value[1].fitting === FITTING_OPTION.WIDTH) return 'fit-to-width-double-offset';\r\n if (value[0] && value[1].fitting === FITTING_OPTION.HEIGHT) return 'fit-to-height-double-offset';\r\n if (value[0] && value[1].fitting === FITTING_OPTION.ORIGINAL) return 'original-double-offset';\r\n return '';\r\n }),\r\n filter(_ => this.isValid()),\r\n );\r\n\r\n\r\n this.readerSettings$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n tap(values => {\r\n this.layoutMode = values.layoutMode;\r\n this.pageSplit = values.pageSplit;\r\n this.cdRef.markForCheck();\r\n })\r\n ).subscribe(() => {});\r\n\r\n this.bookmark$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n tap(_ => {\r\n const elements = [];\r\n const image1 = this.document.querySelector('#image-1');\r\n if (image1 != null) elements.push(image1);\r\n\r\n const image2 = this.document.querySelector('#image-2');\r\n if (image2 != null) elements.push(image2);\r\n\r\n this.mangaReaderService.applyBookmarkEffect(elements);\r\n }),\r\n filter(_ => this.isValid()),\r\n ).subscribe(() => {});\r\n }\r\n\r\n shouldRenderDouble() {\r\n if (!this.isValid()) return false;\r\n\r\n // if (this.mangaReaderService.isCoverImage(this.pageNum)) {\r\n // this.debugLog('Not rendering double as current page is cover image');\r\n // return false;\r\n // }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum) ) {\r\n this.debugLog('Not rendering double as current page is wide image');\r\n return false;\r\n }\r\n\r\n if (this.mangaReaderService.isSecondLastImage(this.pageNum, this.maxPages)) {\r\n this.debugLog('Not rendering double as current page is last');\r\n return false;\r\n }\r\n\r\n if (this.mangaReaderService.isLastImage(this.pageNum, this.maxPages)) {\r\n this.debugLog('Not rendering double as current page is last');\r\n return false;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum + 1) ) {\r\n this.debugLog('Not rendering double as next page is wide image');\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n isValid() {\r\n return this.layoutMode === LayoutMode.DoubleNoCover;\r\n }\r\n\r\n renderPage(img: Array): void {\r\n if (img === null || img.length === 0 || img[0] === null) return;\r\n if (!this.isValid()) return;\r\n\r\n // First load, switching from double manga -> double, this is 0 and thus not rendering\r\n if (!this.shouldRenderDouble() && (this.currentImage.height || img[0].height) > 0) {\r\n this.imageHeight.emit(this.currentImage.height || img[0].height);\r\n return;\r\n }\r\n\r\n this.cdRef.markForCheck();\r\n this.imageHeight.emit(Math.max(this.currentImage.height, this.currentImage2.height));\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n shouldMovePrev(): boolean {\r\n return true;\r\n }\r\n shouldMoveNext(): boolean {\r\n return true;\r\n }\r\n getPageAmount(direction: PAGING_DIRECTION): number {\r\n if (!this.isValid()) return 0;\r\n\r\n switch (direction) {\r\n case PAGING_DIRECTION.FORWARD:\r\n if (this.mangaReaderService.isWidePage(this.pageNum)) {\r\n this.debugLog('Moving forward 1 page as current page is wide');\r\n return 1;\r\n }\r\n if (this.mangaReaderService.isWidePage(this.pageNum + 1)) {\r\n this.debugLog('Moving forward 1 page as next page is wide');\r\n return 1;\r\n }\r\n if (this.mangaReaderService.isCoverImage(this.pageNum)) {\r\n this.debugLog('Moving forward 2 page as on cover image');\r\n return 2;\r\n }\r\n if (this.mangaReaderService.isSecondLastImage(this.pageNum, this.maxPages)) {\r\n this.debugLog('Moving forward 1 page as 2 pages left');\r\n return 1;\r\n }\r\n if (this.mangaReaderService.isLastImage(this.pageNum, this.maxPages)) {\r\n this.debugLog('Moving forward 1 page as 1 page left');\r\n return 1;\r\n }\r\n this.debugLog('Moving forward 2 pages');\r\n return 2;\r\n case PAGING_DIRECTION.BACKWARDS:\r\n\r\n if (this.mangaReaderService.isCoverImage(this.pageNum - 1)) {\r\n // TODO: If we are moving back and prev page is cover and we are not showing on right side, then move back twice as if we did once, we would show pageNum twice\r\n this.debugLog('Moving back 1 page as on cover image');\r\n return 2;\r\n }\r\n\r\n if (this.mangaReaderService.isCoverImage(this.pageNum)) {\r\n this.debugLog('Moving back 1 page as on cover image');\r\n return 2;\r\n }\r\n\r\n if (this.mangaReaderService.adjustForDoubleReader(this.pageNum - 1) != this.pageNum - 1 && !this.mangaReaderService.isWidePage(this.pageNum - 2)) {\r\n this.debugLog('Moving back 2 pages as previous pair should be in a pair');\r\n return 2;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum)) {\r\n this.debugLog('Moving back 1 page as current page is wide');\r\n return 1;\r\n }\r\n\r\n if (this.mangaReaderService.isWidePage(this.pageNum - 1)) {\r\n this.debugLog('Moving back 1 page as prev page is wide');\r\n return 1;\r\n }\r\n if (this.mangaReaderService.isWidePage(this.pageNum - 2)) {\r\n this.debugLog('Moving back 1 page as 2 pages back is wide');\r\n return 1;\r\n }\r\n\r\n this.debugLog('Moving back 2 pages');\r\n return 2;\r\n }\r\n }\r\n reset(): void {}\r\n\r\n getBookmarkPageCount(): number {\r\n return this.shouldRenderDouble() ? 2 : 1;\r\n }\r\n\r\n debugLog(message: string, extraData?: any) {\r\n if (!(this.debugMode & DEBUG_MODES.Logs)) return;\r\n\r\n if (extraData !== undefined) {\r\n console.log(message, extraData);\r\n } else {\r\n console.log(message);\r\n }\r\n }\r\n}\r\n","\r\n
\r\n \r\n \"\r\n \r\n \r\n \"\r\n \r\n
\r\n
\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n/**\r\n * Returns the icon for the given state of fullscreen mode\r\n */\r\n@Pipe({\r\n name: 'fullscreenIcon',\r\n standalone: true,\r\n})\r\nexport class FullscreenIconPipe implements PipeTransform {\r\n\r\n transform(isFullscreen: boolean): string {\r\n return isFullscreen ? 'fa-compress-alt' : 'fa-expand-alt';\r\n }\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { ReaderMode } from 'src/app/_models/preferences/reader-mode';\r\n\r\n@Pipe({\r\n name: 'readerModeIcon',\r\n standalone: true,\r\n})\r\nexport class ReaderModeIconPipe implements PipeTransform {\r\n\r\n transform(readerMode: ReaderMode): string {\r\n switch(readerMode) {\r\n case ReaderMode.LeftRight:\r\n return 'fa-exchange-alt';\r\n case ReaderMode.UpDown:\r\n return 'fa-exchange-alt fa-rotate-90';\r\n case ReaderMode.Webtoon:\r\n return 'fa-arrows-alt-v';\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { FITTING_OPTION } from '../manga-reader/_models/reader-enums';\r\n\r\n@Pipe({\r\n name: 'fittingIcon',\r\n pure: true,\r\n standalone: true,\r\n})\r\nexport class FittingIconPipe implements PipeTransform {\r\n\r\n transform(fit: FITTING_OPTION): string {\r\n switch(fit) {\r\n case FITTING_OPTION.HEIGHT:\r\n return 'fa fa-arrows-alt-v';\r\n case FITTING_OPTION.WIDTH:\r\n return 'fa fa-arrows-alt-h';\r\n case FITTING_OPTION.ORIGINAL:\r\n return 'fa fa-expand-arrows-alt';\r\n }\r\n }\r\n\r\n}\r\n","import {DOCUMENT, AsyncPipe, NgStyle} from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component, DestroyRef,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n Inject,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n Renderer2,\r\n SimpleChanges, ViewChild\r\n} from '@angular/core';\r\nimport {BehaviorSubject, fromEvent, map, Observable, of, ReplaySubject} from 'rxjs';\r\nimport { debounceTime } from 'rxjs/operators';\r\nimport { ScrollService } from 'src/app/_services/scroll.service';\r\nimport { ReaderService } from '../../../_services/reader.service';\r\nimport { PAGING_DIRECTION } from '../../_models/reader-enums';\r\nimport { WebtoonImage } from '../../_models/webtoon-image';\r\nimport { ManagaReaderService } from '../../_service/managa-reader.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport {TranslocoDirective} from \"@ngneat/transloco\";\r\nimport {InfiniteScrollModule} from \"ngx-infinite-scroll\";\r\nimport {ReaderSetting} from \"../../_models/reader-setting\";\r\nimport {SafeStylePipe} from \"../../../_pipes/safe-style.pipe\";\r\n\r\n/**\r\n * How much additional space should pass, past the original bottom of the document height before we trigger the next chapter load\r\n */\r\nconst SPACER_SCROLL_INTO_PX = 200;\r\n\r\n/**\r\n * Bitwise enums for configuring how much debug information we want\r\n */\r\nconst enum DEBUG_MODES {\r\n /**\r\n * No Debug information\r\n */\r\n None = 0,\r\n /**\r\n * Turn on debug logging\r\n */\r\n Logs = 2,\r\n /**\r\n * Turn on the action bar in UI\r\n */\r\n ActionBar = 4,\r\n /**\r\n * Turn on Page outline\r\n */\r\n Outline = 8\r\n}\r\n\r\n@Component({\r\n selector: 'app-infinite-scroller',\r\n templateUrl: './infinite-scroller.component.html',\r\n styleUrls: ['./infinite-scroller.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [AsyncPipe, TranslocoDirective, InfiniteScrollModule, SafeStylePipe, NgStyle]\r\n})\r\nexport class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy, AfterViewInit {\r\n\r\n private readonly mangaReaderService = inject(ManagaReaderService);\r\n private readonly readerService = inject(ReaderService);\r\n private readonly renderer = inject(Renderer2);\r\n private readonly scrollService = inject(ScrollService);\r\n private readonly cdRef = inject(ChangeDetectorRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n /**\r\n * Current page number aka what's recorded on screen\r\n */\r\n @Input() pageNum: number = 0;\r\n /**\r\n * Number of pages to prefetch ahead of position\r\n */\r\n @Input() bufferPages: number = 5;\r\n /**\r\n * Total number of pages\r\n */\r\n @Input() totalPages: number = 0;\r\n /**\r\n * Method to generate the src for Image loading\r\n */\r\n @Input({required: true}) urlProvider!: (page: number) => string;\r\n @Input({required: true}) readerSettings$!: Observable;\r\n @Output() pageNumberChange: EventEmitter = new EventEmitter();\r\n @Output() loadNextChapter: EventEmitter = new EventEmitter();\r\n @Output() loadPrevChapter: EventEmitter = new EventEmitter();\r\n\r\n @Input() goToPage: BehaviorSubject | undefined;\r\n @Input() bookmarkPage: ReplaySubject = new ReplaySubject();\r\n @Input() fullscreenToggled: ReplaySubject = new ReplaySubject();\r\n\r\n @ViewChild('bottomSpacer', {static: false}) bottomSpacer!: ElementRef;\r\n bottomSpacerIntersectionObserver: IntersectionObserver = new IntersectionObserver((entries) => this.handleBottomIntersection(entries),\r\n { threshold: 1.0 });\r\n\r\n darkness$: Observable = of('brightness(100%)');\r\n\r\n readerElemRef!: ElementRef;\r\n\r\n /**\r\n * Stores and emits all the src urls\r\n */\r\n webtoonImages: BehaviorSubject = new BehaviorSubject([]);\r\n\r\n /**\r\n * Responsible for calculating current page on screen and uses hooks to trigger prefetching.\r\n * Note: threshold will fire differently due to size of images. 1 requires full image on screen. 0 means 1px on screen. We use 0.01 as 0 does not work currently.\r\n */\r\n intersectionObserver: IntersectionObserver = new IntersectionObserver((entries) => this.handleIntersection(entries), { threshold: 0.01 });\r\n /**\r\n * Direction we are scrolling. Controls calculations for prefetching\r\n */\r\n scrollingDirection: PAGING_DIRECTION = PAGING_DIRECTION.FORWARD;\r\n /**\r\n * Temp variable to keep track of scrolling position between scrolls to caclulate direction\r\n */\r\n prevScrollPosition: number = 0;\r\n /**\r\n * Temp variable to keep track of when the scrollTo() finishes, so we can start capturing scroll events again\r\n */\r\n currentPageElem: Element | null = null;\r\n /**\r\n * The minimum width of images in webtoon. On image loading, this is checked and updated. All images will get this assigned to them for rendering.\r\n */\r\n webtoonImageWidth: number = window.innerWidth || this.document.body.clientWidth || this.document.documentElement.clientWidth;\r\n /**\r\n * Used to tell if a scrollTo() operation is in progress\r\n */\r\n isScrolling: boolean = false;\r\n /**\r\n * Whether all prefetched images have loaded on the screen (not neccesarily in viewport)\r\n */\r\n allImagesLoaded: boolean = false;\r\n /**\r\n * Denotes each page that has been loaded or not. If pruning is implemented, the key will be deleted.\r\n */\r\n imagesLoaded: {[key: number]: number} = {};\r\n /**\r\n * If the user has scrolled all the way to the bottom. This is used solely for continuous reading\r\n */\r\n atBottom: boolean = false;\r\n /**\r\n * If the user has scrolled all the way to the top. This is used solely for continuous reading\r\n */\r\n atTop: boolean = false;\r\n /**\r\n * If the manga reader is in fullscreen. Some math changes based on this value.\r\n */\r\n isFullscreenMode: boolean = false;\r\n /**\r\n * Keeps track of the previous scrolling height for restoring scroll position after we inject spacer block\r\n */\r\n previousScrollHeightMinusTop: number = 0;\r\n /**\r\n * Tracks the first load, until all the initial prefetched images are loaded. We use this to reduce opacity so images can load without jerk.\r\n */\r\n initFinished: boolean = false;\r\n /**\r\n * Debug mode. Will show extra information. Use bitwise (|) operators between different modes to enable different output\r\n */\r\n debugMode: DEBUG_MODES = DEBUG_MODES.None;\r\n /**\r\n * Debug mode. Will filter out any messages in here so they don't hit the log\r\n */\r\n debugLogFilter: Array = ['[PREFETCH]', '[Intersection]', '[Visibility]', '[Image Load]'];\r\n\r\n /**\r\n * Width override for maunal width control\r\n * 2 observables needed to avoid flickering, probably due to data races, when changing the width\r\n * this allows to precicely define execution order\r\n */\r\n widthOverride$ : Observable = new Observable();\r\n widthSliderValue$ : Observable = new Observable();\r\n\r\n get minPageLoaded() {\r\n return Math.min(...Object.values(this.imagesLoaded));\r\n }\r\n\r\n get maxPageLoaded() {\r\n return Math.max(...Object.values(this.imagesLoaded));\r\n }\r\n\r\n get areImagesWiderThanWindow() {\r\n let [_, innerWidth] = this.getInnerDimensions();\r\n return this.webtoonImageWidth > (innerWidth || document.body.clientWidth);\r\n }\r\n\r\n constructor(@Inject(DOCUMENT) private readonly document: Document) {\r\n // This will always exist at this point in time since this is used within manga reader\r\n const reader = document.querySelector('.reading-area');\r\n if (reader !== null) {\r\n this.readerElemRef = new ElementRef(reader as HTMLDivElement);\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.hasOwnProperty('totalPages') && changes['totalPages'].previousValue != changes['totalPages'].currentValue) {\r\n this.totalPages = changes['totalPages'].currentValue;\r\n this.cdRef.markForCheck();\r\n this.initWebtoonReader();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.intersectionObserver.disconnect();\r\n }\r\n\r\n /**\r\n * Responsible for binding the scroll handler to the correct event. On non-fullscreen, body is correct. However, on fullscreen, we must use the reader as that is what\r\n * gets promoted to fullscreen.\r\n */\r\n initScrollHandler() {\r\n //console.log('Setting up Scroll handler on ', this.isFullscreenMode ? this.readerElemRef.nativeElement : this.document.body);\r\n fromEvent(this.isFullscreenMode ? this.readerElemRef.nativeElement : this.document.body, 'scroll')\r\n .pipe(debounceTime(20), takeUntilDestroyed(this.destroyRef))\r\n .subscribe((event) => this.handleScrollEvent(event));\r\n\r\n fromEvent(this.isFullscreenMode ? this.readerElemRef.nativeElement : this.document.body, 'scrollend')\r\n .pipe(debounceTime(20), takeUntilDestroyed(this.destroyRef))\r\n .subscribe((event) => this.handleScrollEndEvent(event));\r\n }\r\n\r\n ngOnInit(): void {\r\n this.initScrollHandler();\r\n\r\n this.recalculateImageWidth();\r\n\r\n this.darkness$ = this.readerSettings$.pipe(\r\n map(values => 'brightness(' + values.darkness + '%)'),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n\r\n this.widthSliderValue$ = this.readerSettings$.pipe(\r\n map(values => (parseInt(values.widthSlider) <= 0) ? '' : values.widthSlider + '%'),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n this.widthOverride$ = this.widthSliderValue$;\r\n\r\n //perfom jump so the page stays in view\r\n this.widthSliderValue$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(val => {\r\n this.currentPageElem = this.document.querySelector('img#page-' + this.pageNum);\r\n if(!this.currentPageElem)\r\n return;\r\n\r\n let images = Array.from(document.querySelectorAll('img[id^=\"page-\"]')) as HTMLImageElement[];\r\n images.forEach((img) => {\r\n this.renderer.setStyle(img, \"width\", val);\r\n });\r\n\r\n this.widthOverride$ = this.widthSliderValue$;\r\n this.prevScrollPosition = this.currentPageElem.getBoundingClientRect().top;\r\n this.currentPageElem.scrollIntoView();\r\n this.cdRef.markForCheck();\r\n });\r\n\r\n if (this.goToPage) {\r\n this.goToPage.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(page => {\r\n const isSamePage = this.pageNum === page;\r\n if (isSamePage) { return; }\r\n this.debugLog('[GoToPage] jump has occured from ' + this.pageNum + ' to ' + page);\r\n\r\n if (this.pageNum < page) {\r\n this.scrollingDirection = PAGING_DIRECTION.FORWARD;\r\n } else {\r\n this.scrollingDirection = PAGING_DIRECTION.BACKWARDS;\r\n }\r\n\r\n this.setPageNum(page, true);\r\n });\r\n }\r\n\r\n if (this.bookmarkPage) {\r\n this.bookmarkPage.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(page => {\r\n const image = document.querySelector('img[id^=\"page-' + page + '\"]');\r\n if (image) {\r\n this.renderer.addClass(image, 'bookmark-effect');\r\n\r\n setTimeout(() => {\r\n this.renderer.removeClass(image, 'bookmark-effect');\r\n }, 1000);\r\n }\r\n });\r\n }\r\n\r\n if (this.fullscreenToggled) {\r\n this.fullscreenToggled.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(isFullscreen => {\r\n this.debugLog('[FullScreen] Fullscreen mode: ', isFullscreen);\r\n this.isFullscreenMode = isFullscreen;\r\n this.cdRef.markForCheck();\r\n\r\n this.recalculateImageWidth();\r\n this.initScrollHandler();\r\n this.setPageNum(this.pageNum, true);\r\n });\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.bottomSpacerIntersectionObserver.observe(this.bottomSpacer.nativeElement);\r\n }\r\n\r\n recalculateImageWidth() {\r\n const [_, innerWidth] = this.getInnerDimensions();\r\n this.webtoonImageWidth = innerWidth || document.body.clientWidth || document.documentElement.clientWidth;\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n getVerticalOffset() {\r\n const reader = this.isFullscreenMode ? this.readerElemRef.nativeElement : this.document.body;\r\n\r\n let offset = 0;\r\n if (reader instanceof Window) {\r\n offset = reader.scrollY;\r\n } else {\r\n offset = reader.scrollTop;\r\n }\r\n\r\n return (offset\r\n || document.body.scrollTop\r\n || document.documentElement.scrollTop\r\n || 0);\r\n }\r\n\r\n /**\r\n * On scroll in document, calculate if the user/javascript has scrolled to the current image element (and it's visible), update that scrolling has ended completely,\r\n * and calculate the direction the scrolling is occuring. This is not used for prefetching.\r\n * @param event Scroll Event\r\n */\r\n handleScrollEvent(event?: any) {\r\n const verticalOffset = this.getVerticalOffset();\r\n\r\n if (verticalOffset > this.prevScrollPosition) {\r\n this.scrollingDirection = PAGING_DIRECTION.FORWARD;\r\n } else {\r\n this.scrollingDirection = PAGING_DIRECTION.BACKWARDS;\r\n }\r\n this.prevScrollPosition = verticalOffset;\r\n\r\n if (this.isScrolling && this.currentPageElem != null && this.isElementVisible(this.currentPageElem)) {\r\n this.debugLog('[Scroll] Image is visible from scroll, isScrolling is now false');\r\n this.isScrolling = false;\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n if (!this.isScrolling) {\r\n // Use offset of the image against the scroll container to test if the most of the image is visible on the screen. We can use this\r\n // to mark the current page and separate the prefetching code.\r\n const midlineImages = Array.from(document.querySelectorAll('img[id^=\"page-\"]'))\r\n .filter(entry => this.shouldElementCountAsCurrentPage(entry));\r\n\r\n if (midlineImages.length > 0) {\r\n this.setPageNum(parseInt(midlineImages[0].getAttribute('page') || this.pageNum + '', 10));\r\n }\r\n }\r\n\r\n // Check if we hit the last page\r\n this.checkIfShouldTriggerContinuousReader();\r\n }\r\n\r\n handleScrollEndEvent(event?: any) {\r\n if (!this.isScrolling) {\r\n\r\n const closestImages = Array.from(document.querySelectorAll('img[id^=\"page-\"]')) as HTMLImageElement[];\r\n const img = this.findClosestVisibleImage(closestImages);\r\n\r\n if (img != null) {\r\n this.setPageNum(parseInt(img.getAttribute('page') || this.pageNum + '', 10));\r\n }\r\n }\r\n }\r\n\r\n getTotalHeight() {\r\n let totalHeight = 0;\r\n document.querySelectorAll('img[id^=\"page-\"]').forEach(img => totalHeight += img.getBoundingClientRect().height);\r\n return Math.round(totalHeight);\r\n }\r\n\r\n getTotalScroll() {\r\n if (this.isFullscreenMode) {\r\n return this.readerElemRef.nativeElement.offsetHeight + this.readerElemRef.nativeElement.scrollTop;\r\n }\r\n return document.body.offsetHeight + document.body.scrollTop;\r\n }\r\n\r\n getScrollTop() {\r\n if (this.isFullscreenMode) {\r\n return this.readerElemRef.nativeElement.scrollTop;\r\n }\r\n return document.body.scrollTop;\r\n }\r\n\r\n checkIfShouldTriggerContinuousReader() {\r\n if (this.isScrolling) return;\r\n\r\n if (this.scrollingDirection === PAGING_DIRECTION.FORWARD) {\r\n const totalHeight = this.getTotalHeight();\r\n const totalScroll = this.getTotalScroll();\r\n\r\n // If we were at top but have started scrolling down past page 0, remove top spacer\r\n if (this.atTop && this.pageNum > 0) {\r\n this.atTop = false;\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n if (totalHeight != 0 && totalScroll >= totalHeight && !this.atBottom) {\r\n this.atBottom = true;\r\n this.cdRef.markForCheck();\r\n this.setPageNum(this.totalPages);\r\n\r\n // Scroll user back to original location\r\n this.previousScrollHeightMinusTop = this.getScrollTop();\r\n requestAnimationFrame(() => {\r\n document.body.scrollTop = this.previousScrollHeightMinusTop + (SPACER_SCROLL_INTO_PX / 2);\r\n this.cdRef.markForCheck();\r\n });\r\n this.checkIfShouldTriggerContinuousReader()\r\n } else if (totalScroll >= totalHeight + SPACER_SCROLL_INTO_PX && this.atBottom) {\r\n // This if statement will fire once we scroll into the spacer at all\r\n this.loadNextChapter.emit();\r\n this.cdRef.markForCheck();\r\n }\r\n } else {\r\n // < 5 because debug mode and FF (mobile) can report non 0, despite being at 0\r\n if (this.getScrollTop() < 5 && this.pageNum === 0 && !this.atTop) {\r\n this.atBottom = false;\r\n this.atTop = true;\r\n this.cdRef.markForCheck();\r\n\r\n // Scroll user back to original location\r\n this.previousScrollHeightMinusTop = document.body.scrollHeight - document.body.scrollTop;\r\n\r\n const reader = this.isFullscreenMode ? this.readerElemRef.nativeElement : this.document.body;\r\n requestAnimationFrame(() => this.scrollService.scrollTo((SPACER_SCROLL_INTO_PX / 2), reader));\r\n } else if (this.getScrollTop() < 5 && this.pageNum === 0 && this.atTop) {\r\n // If already at top, then we moving on\r\n this.loadPrevChapter.emit();\r\n this.cdRef.markForCheck();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @returns Height, Width\r\n */\r\n getInnerDimensions() {\r\n let innerHeight = window.innerHeight;\r\n let innerWidth = window.innerWidth;\r\n\r\n if (this.isFullscreenMode) {\r\n innerHeight = this.readerElemRef.nativeElement.clientHeight;\r\n innerWidth = this.readerElemRef.nativeElement.clientWidth;\r\n }\r\n return [innerHeight, innerWidth];\r\n }\r\n\r\n /**\r\n * Is any part of the element visible in the scrollport. Does not take into account\r\n * style properties, just scroll port visibility.\r\n * @param elem\r\n * @returns\r\n */\r\n isElementVisible(elem: Element) {\r\n if (elem === null || elem === undefined) { return false; }\r\n\r\n this.debugLog('[Visibility] Checking if Page ' + elem.getAttribute('id') + ' is visible');\r\n // NOTE: This will say an element is visible if it is 1 px offscreen on top\r\n const rect = elem.getBoundingClientRect();\r\n\r\n const [innerHeight, innerWidth] = this.getInnerDimensions();\r\n\r\n return (rect.bottom >= 0 &&\r\n rect.right >= 0 &&\r\n rect.top <= (innerHeight || document.body.clientHeight) &&\r\n rect.left <= (innerWidth || document.body.clientWidth)\r\n );\r\n }\r\n\r\n /**\r\n * Is any part of the element visible in the scrollport and is it above the midline trigger.\r\n * The midline trigger does not mean it is half of the screen. It may be top 25%.\r\n * @param elem HTML Element\r\n * @returns If above midline\r\n */\r\n shouldElementCountAsCurrentPage(elem: Element) {\r\n if (elem === null || elem === undefined) { return false; }\r\n\r\n const rect = elem.getBoundingClientRect();\r\n const [innerHeight, innerWidth] = this.getInnerDimensions();\r\n\r\n if (rect.bottom >= 0 &&\r\n rect.right >= 0 &&\r\n rect.top <= (innerHeight || document.body.clientHeight) &&\r\n rect.left <= (innerWidth || document.body.clientWidth)\r\n ) {\r\n const topX = (innerHeight || document.body.clientHeight);\r\n return Math.abs(rect.top / topX) <= 0.25;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Find the closest visible image within the viewport.\r\n * @param images An array of HTML Image Elements\r\n * @returns Closest visible image or null if none are visible\r\n */\r\n findClosestVisibleImage(images: HTMLImageElement[]): HTMLImageElement | null {\r\n let closestImage: HTMLImageElement | null = null;\r\n let closestDistanceToTop = Number.MAX_VALUE; // Initialize to a high value.\r\n\r\n for (const image of images) {\r\n // Get the bounding rectangle of the image.\r\n const rect = image.getBoundingClientRect();\r\n\r\n // Calculate the distance of the current image to the top of the viewport.\r\n const distanceToTop = Math.abs(rect.top);\r\n\r\n // Check if the image is visible within the viewport.\r\n if (distanceToTop < closestDistanceToTop) {\r\n closestDistanceToTop = distanceToTop;\r\n closestImage = image;\r\n }\r\n }\r\n\r\n return closestImage;\r\n }\r\n\r\n\r\n initWebtoonReader() {\r\n this.initFinished = false;\r\n this.recalculateImageWidth();\r\n this.imagesLoaded = {};\r\n this.webtoonImages.next([]);\r\n this.atBottom = false;\r\n this.checkIfShouldTriggerContinuousReader();\r\n this.cdRef.markForCheck();\r\n const [startingIndex, endingIndex] = this.calculatePrefetchIndecies();\r\n\r\n\r\n this.debugLog('[INIT] Prefetching pages ' + startingIndex + ' to ' + endingIndex + '. Current page: ', this.pageNum);\r\n for(let i = startingIndex; i <= endingIndex; i++) {\r\n this.loadWebtoonImage(i);\r\n }\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n /**\r\n * Callback for an image onLoad. At this point the image is already rendered in DOM (may not be visible)\r\n * This will be used to scroll to current page for intial load\r\n * @param event\r\n */\r\n onImageLoad(event: any) {\r\n const imagePage = this.readerService.imageUrlToPageNum(event.target.src);\r\n this.debugLog('[Image Load] Image loaded: ', imagePage);\r\n\r\n if (event.target.width < this.webtoonImageWidth) {\r\n this.webtoonImageWidth = event.target.width;\r\n }\r\n\r\n this.renderer.setAttribute(event.target, 'width', this.mangaReaderService.maxWidth() + '');\r\n this.renderer.setAttribute(event.target, 'height', event.target.height + '');\r\n\r\n this.attachIntersectionObserverElem(event.target);\r\n\r\n if (imagePage === this.pageNum) {\r\n Promise.all(Array.from(this.document.querySelectorAll('img'))\r\n .filter((img: any) => !img.complete)\r\n .map((img: any) => new Promise(resolve => { img.onload = img.onerror = resolve; })))\r\n .then(() => {\r\n this.debugLog('[Initialization] All images have loaded from initial prefetch, initFinished = true');\r\n this.debugLog('[Image Load] ! Loaded current page !', this.pageNum);\r\n this.currentPageElem = this.document.querySelector('img#page-' + this.pageNum);\r\n // There needs to be a bit of time before we scroll\r\n if (this.currentPageElem && !this.isElementVisible(this.currentPageElem)) {\r\n this.scrollToCurrentPage();\r\n } else {\r\n this.initFinished = true;\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n this.allImagesLoaded = true;\r\n this.cdRef.markForCheck();\r\n });\r\n }\r\n }\r\n\r\n handleBottomIntersection(entries: IntersectionObserverEntry[]) {\r\n if (entries.length > 0 && this.pageNum > this.totalPages - 5 && this.initFinished) {\r\n this.debugLog('[Intersection] The whole bottom spacer is visible', entries[0].isIntersecting);\r\n this.loadNextChapter.emit();\r\n }\r\n }\r\n\r\n handleIntersection(entries: IntersectionObserverEntry[]) {\r\n if (!this.allImagesLoaded || this.isScrolling) {\r\n this.debugLog('[Intersection] Images are not loaded (or performing scrolling action), skipping any scroll calculations');\r\n return;\r\n }\r\n\r\n entries.forEach(entry => {\r\n const imagePage = parseInt(entry.target.attributes.getNamedItem('page')?.value + '', 10);\r\n this.debugLog('[Intersection] Page ' + imagePage + ' is visible: ', entry.isIntersecting);\r\n if (entry.isIntersecting) {\r\n this.debugLog('[Intersection] ! Page ' + imagePage + ' just entered screen');\r\n this.prefetchWebtoonImages(imagePage);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Set the page number, invoke prefetching and optionally scroll to the new page.\r\n * @param pageNum Page number to set to. Will trigger the pageNumberChange event emitter.\r\n * @param scrollToPage Optional (default false) parameter to trigger scrolling to the newly set page\r\n */\r\n setPageNum(pageNum: number, scrollToPage: boolean = false) {\r\n if (pageNum >= this.totalPages) {\r\n pageNum = this.totalPages - 1;\r\n } else if (pageNum < 0) {\r\n pageNum = 0;\r\n }\r\n this.pageNum = pageNum;\r\n this.pageNumberChange.emit(this.pageNum);\r\n this.cdRef.markForCheck();\r\n\r\n this.prefetchWebtoonImages();\r\n\r\n if (scrollToPage) {\r\n this.scrollToCurrentPage();\r\n }\r\n }\r\n\r\n isScrollingForwards() {\r\n return this.scrollingDirection === PAGING_DIRECTION.FORWARD;\r\n }\r\n\r\n /**\r\n * Performs the scroll for the current page element. Updates any state variables needed.\r\n */\r\n scrollToCurrentPage() {\r\n this.currentPageElem = document.querySelector('img#page-' + this.pageNum);\r\n if (!this.currentPageElem) { return; }\r\n this.debugLog('[GoToPage] Scrolling to page', this.pageNum);\r\n\r\n // Update prevScrollPosition, so the next scroll event properly calculates direction\r\n this.prevScrollPosition = this.currentPageElem.getBoundingClientRect().top;\r\n this.isScrolling = true;\r\n this.cdRef.markForCheck();\r\n\r\n setTimeout(() => {\r\n if (this.currentPageElem) {\r\n this.debugLog('[Scroll] Scrolling to page ', this.pageNum);\r\n this.currentPageElem.scrollIntoView({behavior: 'smooth'});\r\n this.initFinished = true;\r\n this.cdRef.markForCheck();\r\n }\r\n }, 600);\r\n }\r\n\r\n loadWebtoonImage(page: number) {\r\n if (this.imagesLoaded.hasOwnProperty(page)) {\r\n this.debugLog('\\t[PREFETCH] Skipping prefetch of ', page);\r\n return;\r\n }\r\n\r\n this.debugLog('\\t[PREFETCH] Prefetching ', page);\r\n\r\n const data = this.webtoonImages.value.concat({src: this.urlProvider(page), page});\r\n\r\n data.sort((a: WebtoonImage, b: WebtoonImage) => {\r\n if (a.page < b.page) { return -1; }\r\n else if (a.page > b.page) { return 1; }\r\n else return 0;\r\n });\r\n\r\n this.allImagesLoaded = false;\r\n this.cdRef.markForCheck();\r\n this.webtoonImages.next(data);\r\n\r\n if (!this.imagesLoaded.hasOwnProperty(page)) {\r\n this.imagesLoaded[page] = page;\r\n }\r\n }\r\n\r\n attachIntersectionObserverElem(elem: HTMLImageElement) {\r\n if (elem !== null) {\r\n this.intersectionObserver.observe(elem);\r\n this.debugLog('[Intersection] Attached Intersection Observer to page', this.readerService.imageUrlToPageNum(elem.src));\r\n } else {\r\n console.error('Could not attach observer on elem'); // This never happens\r\n }\r\n }\r\n\r\n /**\r\n * Finds the ranges of indecies to load from backend. totalPages - 1 is due to backend will automatically return last page for any page number\r\n * above totalPages. Webtoon reader might ask for that which results in duplicate last pages.\r\n * @param pageNum\r\n * @returns\r\n */\r\n calculatePrefetchIndecies(pageNum: number = -1) {\r\n if (pageNum == -1) {\r\n pageNum = this.pageNum;\r\n }\r\n\r\n let startingIndex = 0;\r\n let endingIndex = 0;\r\n if (this.isScrollingForwards()) {\r\n startingIndex = Math.min(Math.max(pageNum - this.bufferPages, 0), this.totalPages - 1);\r\n endingIndex = Math.min(Math.max(pageNum + this.bufferPages, 0), this.totalPages - 1);\r\n\r\n if (startingIndex === this.totalPages) {\r\n return [0, 0];\r\n }\r\n } else {\r\n startingIndex = Math.min(Math.max(pageNum - this.bufferPages, 0), this.totalPages - 1);\r\n endingIndex = Math.min(Math.max(pageNum + this.bufferPages, 0), this.totalPages - 1);\r\n }\r\n\r\n\r\n if (startingIndex > endingIndex) {\r\n const temp = startingIndex;\r\n startingIndex = endingIndex;\r\n endingIndex = temp;\r\n }\r\n\r\n return [startingIndex, endingIndex];\r\n }\r\n\r\n range(size: number, startAt: number = 0): ReadonlyArray {\r\n return [...Array(size).keys()].map(i => i + startAt);\r\n }\r\n\r\n prefetchWebtoonImages(pageNum: number = -1) {\r\n if (pageNum === -1) {\r\n pageNum = this.pageNum;\r\n }\r\n\r\n const [startingIndex, endingIndex] = this.calculatePrefetchIndecies(pageNum);\r\n if (startingIndex === 0 && endingIndex === 0) { return; }\r\n\r\n this.debugLog('\\t[PREFETCH] prefetching pages: ' + startingIndex + ' to ' + endingIndex);\r\n for(let i = startingIndex; i <= endingIndex; i++) {\r\n this.loadWebtoonImage(i);\r\n }\r\n\r\n Promise.all(Array.from(document.querySelectorAll('img'))\r\n .filter((img: any) => !img.complete)\r\n .map((img: any) => new Promise(resolve => { img.onload = img.onerror = resolve; })))\r\n .then(() => {\r\n this.allImagesLoaded = true;\r\n this.cdRef.markForCheck();\r\n });\r\n }\r\n\r\n debugLog(message: string, extraData?: any) {\r\n if (!(this.debugMode & DEBUG_MODES.Logs)) return;\r\n\r\n if (this.debugLogFilter.filter(str => message.replace('\\t', '').startsWith(str)).length > 0) return;\r\n if (extraData !== undefined) {\r\n console.log(message, extraData);\r\n } else {\r\n console.log(message);\r\n }\r\n }\r\n\r\n showDebugBar() {\r\n return this.debugMode & DEBUG_MODES.ActionBar;\r\n }\r\n\r\n showDebugOutline() {\r\n return this.debugMode & DEBUG_MODES.Outline;\r\n }\r\n}\r\n","\r\n\r\n @if (showDebugBar()) {\r\n
\r\n Captures Scroll Events: {{!this.isScrolling && this.allImagesLoaded}}\r\n Is Scrolling: {{isScrollingForwards() ? 'Forwards' : 'Backwards'}} {{this.isScrolling}}\r\n All Images Loaded: {{this.allImagesLoaded}}\r\n Prefetched {{minPageLoaded}}-{{maxPageLoaded}}\r\n Pages: {{pageNum}} / {{totalPages - 1}}\r\n At Top: {{atTop}}\r\n At Bottom: {{atBottom}}\r\n Total Height: {{getTotalHeight()}}\r\n Total Scroll: {{getTotalScroll()}}\r\n Scroll Top: {{getScrollTop()}}\r\n
\r\n }\r\n\r\n @if (atTop) {\r\n
\r\n
\r\n
\r\n \r\n {{t('continuous-reading-prev-chapter')}}\r\n \r\n {{t('continuous-reading-prev-chapter-alt')}}\r\n
\r\n
\r\n }\r\n\r\n
\r\n @for(item of webtoonImages | async; let index = $index; track item.src) {\r\n \"image\"\r\n\r\n }\r\n
\r\n\r\n
\r\n
\r\n \r\n {{t('continuous-reading-next-chapter')}}\r\n \r\n {{t('continuous-reading-next-chapter-alt')}}\r\n
\r\n
\r\n
\r\n\r\n
\r\n","import { fromEvent, Observable, race, Subscription } from 'rxjs';\r\nimport { elementAt, map, switchMap, takeUntil, tap } from 'rxjs/operators';\r\n\r\nexport interface SwipeCoordinates {\r\n x: number;\r\n y: number;\r\n }\r\n \r\n export enum SwipeDirection {\r\n X = 'x',\r\n Y = 'y'\r\n }\r\n \r\n export interface SwipeStartEvent {\r\n x: number;\r\n y: number;\r\n direction: SwipeDirection;\r\n }\r\n \r\n export interface SwipeEvent {\r\n direction: SwipeDirection;\r\n distance: number;\r\n }\r\n \r\n export interface SwipeSubscriptionConfig {\r\n domElement: HTMLElement;\r\n onSwipeMove?: (event: SwipeEvent) => void;\r\n onSwipeEnd?: (event: SwipeEvent) => void;\r\n }\r\n\r\n\r\nexport function createSwipeSubscription({ domElement, onSwipeMove, onSwipeEnd }: SwipeSubscriptionConfig): Subscription {\r\n if (!(domElement instanceof HTMLElement)) {\r\n throw new Error('Provided domElement should be an instance of HTMLElement');\r\n }\r\n\r\n if ((typeof onSwipeMove !== 'function') && (typeof onSwipeEnd !== 'function')) {\r\n throw new Error('At least one of the following swipe event handler functions should be provided: onSwipeMove and/or onSwipeEnd');\r\n }\r\n\r\n const touchStarts$ = fromEvent(domElement, 'touchstart').pipe(map(getTouchCoordinates));\r\n const touchMoves$ = fromEvent(domElement, 'touchmove').pipe(map(getTouchCoordinates));\r\n const touchEnds$ = fromEvent(domElement, 'touchend').pipe(map(getTouchCoordinates));\r\n const touchCancels$ = fromEvent(domElement, 'touchcancel');\r\n\r\n const touchStartsWithDirection$: Observable = touchStarts$.pipe(\r\n switchMap((touchStartEvent: SwipeCoordinates) => touchMoves$.pipe(\r\n elementAt(3),\r\n map((touchMoveEvent: SwipeCoordinates) => ({\r\n x: touchStartEvent.x,\r\n y: touchStartEvent.y,\r\n direction: getTouchDirection(touchStartEvent, touchMoveEvent)\r\n })\r\n ))\r\n )\r\n );\r\n\r\n return touchStartsWithDirection$.pipe(\r\n switchMap(touchStartEvent => touchMoves$.pipe(\r\n map(touchMoveEvent => getTouchDistance(touchStartEvent, touchMoveEvent)),\r\n tap((coordinates: SwipeCoordinates) => {\r\n if (typeof onSwipeMove !== 'function') { return; }\r\n onSwipeMove(getSwipeEvent(touchStartEvent, coordinates));\r\n }),\r\n takeUntil(race(\r\n touchEnds$.pipe(\r\n map(touchEndEvent => getTouchDistance(touchStartEvent, touchEndEvent)),\r\n tap((coordinates: SwipeCoordinates) => {\r\n if (typeof onSwipeEnd !== 'function') { return; }\r\n onSwipeEnd(getSwipeEvent(touchStartEvent, coordinates));\r\n })\r\n ),\r\n touchCancels$\r\n ))\r\n ))\r\n ).subscribe();\r\n}\r\n\r\nfunction getTouchCoordinates(touchEvent: TouchEvent): SwipeCoordinates {\r\n return {\r\n x: touchEvent.changedTouches[0].clientX,\r\n y: touchEvent.changedTouches[0].clientY\r\n };\r\n}\r\n\r\nfunction getTouchDistance(startCoordinates: SwipeCoordinates, moveCoordinates: SwipeCoordinates): SwipeCoordinates {\r\n return {\r\n x: moveCoordinates.x - startCoordinates.x,\r\n y: moveCoordinates.y - startCoordinates.y\r\n };\r\n}\r\n\r\nfunction getTouchDirection(startCoordinates: SwipeCoordinates, moveCoordinates: SwipeCoordinates): SwipeDirection {\r\n const { x, y } = getTouchDistance(startCoordinates, moveCoordinates);\r\n return Math.abs(x) < Math.abs(y) ? SwipeDirection.Y : SwipeDirection.X;\r\n}\r\n\r\nfunction getSwipeEvent(touchStartEvent: SwipeStartEvent, coordinates: SwipeCoordinates): SwipeEvent {\r\n return {\r\n direction: touchStartEvent.direction,\r\n distance: coordinates[touchStartEvent.direction]\r\n };\r\n}\r\n","import { Directive, ElementRef, EventEmitter, NgZone, OnDestroy, OnInit, Output } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { createSwipeSubscription, SwipeEvent } from './ag-swipe.core';\r\n\r\n@Directive({\r\n selector: '[ngSwipe]',\r\n standalone: true\r\n})\r\nexport class SwipeDirective implements OnInit, OnDestroy {\r\n private swipeSubscription: Subscription | undefined;\r\n\r\n @Output() swipeMove: EventEmitter = new EventEmitter();\r\n @Output() swipeEnd: EventEmitter = new EventEmitter();\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private zone: NgZone\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.zone.runOutsideAngular(() => {\r\n this.swipeSubscription = createSwipeSubscription({\r\n domElement: this.elementRef.nativeElement,\r\n onSwipeMove: (swipeMoveEvent: SwipeEvent) => this.swipeMove.emit(swipeMoveEvent),\r\n onSwipeEnd: (swipeEndEvent: SwipeEvent) => this.swipeEnd.emit(swipeEndEvent)\r\n });\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.swipeSubscription?.unsubscribe?.();\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n EventEmitter,\r\n HostListener,\r\n inject,\r\n Inject,\r\n OnDestroy,\r\n OnInit,\r\n ViewChild\r\n} from '@angular/core';\r\nimport {AsyncPipe, DOCUMENT, NgClass, NgFor, NgIf, NgStyle, NgSwitch, NgSwitchCase, PercentPipe} from '@angular/common';\r\nimport {ActivatedRoute, Router} from '@angular/router';\r\nimport {\r\n BehaviorSubject,\r\n debounceTime,\r\n distinctUntilChanged,\r\n filter,\r\n forkJoin,\r\n fromEvent,\r\n map,\r\n merge,\r\n Observable,\r\n ReplaySubject,\r\n Subject,\r\n take,\r\n tap\r\n} from 'rxjs';\r\nimport {ChangeContext, LabelType, NgxSliderModule, Options} from 'ngx-slider-v2';\r\nimport {animate, state, style, transition, trigger} from '@angular/animations';\r\nimport {FormBuilder, FormControl, FormGroup, ReactiveFormsModule} from '@angular/forms';\r\nimport {NgbModal, NgbProgressbar} from '@ng-bootstrap/ng-bootstrap';\r\nimport {ToastrService} from 'ngx-toastr';\r\nimport {ShortcutsModalComponent} from 'src/app/reader-shared/_modals/shortcuts-modal/shortcuts-modal.component';\r\nimport {Stack} from 'src/app/shared/data-structures/stack';\r\nimport {Breakpoint, KEY_CODES, UtilityService} from 'src/app/shared/_services/utility.service';\r\nimport {LibraryType} from 'src/app/_models/library/library';\r\nimport {MangaFormat} from 'src/app/_models/manga-format';\r\nimport {PageSplitOption} from 'src/app/_models/preferences/page-split-option';\r\nimport {layoutModes, pageSplitOptions} from 'src/app/_models/preferences/preferences';\r\nimport {ReaderMode} from 'src/app/_models/preferences/reader-mode';\r\nimport {ReadingDirection} from 'src/app/_models/preferences/reading-direction';\r\nimport {ScalingOption} from 'src/app/_models/preferences/scaling-option';\r\nimport {User} from 'src/app/_models/user';\r\nimport {AccountService} from 'src/app/_services/account.service';\r\nimport {MemberService} from 'src/app/_services/member.service';\r\nimport {NavService} from 'src/app/_services/nav.service';\r\nimport {ReaderService} from 'src/app/_services/reader.service';\r\nimport {LayoutMode} from '../../_models/layout-mode';\r\nimport {FITTING_OPTION, PAGING_DIRECTION} from '../../_models/reader-enums';\r\nimport {ReaderSetting} from '../../_models/reader-setting';\r\nimport {ManagaReaderService} from '../../_service/managa-reader.service';\r\nimport {CanvasRendererComponent} from '../canvas-renderer/canvas-renderer.component';\r\nimport {DoubleRendererComponent} from '../double-renderer/double-renderer.component';\r\nimport {DoubleReverseRendererComponent} from '../double-reverse-renderer/double-reverse-renderer.component';\r\nimport {SingleRendererComponent} from '../single-renderer/single-renderer.component';\r\nimport {ChapterInfo} from '../../_models/chapter-info';\r\nimport {DoubleNoCoverRendererComponent} from '../double-renderer-no-cover/double-no-cover-renderer.component';\r\nimport {SwipeEvent} from 'src/app/ng-swipe/ag-swipe.core';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport {FullscreenIconPipe} from '../../../_pipes/fullscreen-icon.pipe';\r\nimport {ReaderModeIconPipe} from '../../../_pipes/reader-mode-icon.pipe';\r\nimport {FittingIconPipe} from '../../../_pipes/fitting-icon.pipe';\r\nimport {InfiniteScrollerComponent} from '../infinite-scroller/infinite-scroller.component';\r\nimport {SwipeDirective} from '../../../ng-swipe/ng-swipe.directive';\r\nimport {LoadingComponent} from '../../../shared/loading/loading.component';\r\nimport {translate, TranslocoDirective} from \"@ngneat/transloco\";\r\nimport {shareReplay} from \"rxjs/operators\";\r\n\r\n\r\nconst PREFETCH_PAGES = 10;\r\n\r\nconst CHAPTER_ID_NOT_FETCHED = -2;\r\nconst CHAPTER_ID_DOESNT_EXIST = -1;\r\n\r\nconst ANIMATION_SPEED = 200;\r\nconst OVERLAY_AUTO_CLOSE_TIME = 3000;\r\nconst CLICK_OVERLAY_TIMEOUT = 3000;\r\n\r\nenum ChapterInfoPosition {\r\n Previous = 0,\r\n Current = 1,\r\n Next = 2\r\n}\r\n\r\nenum KeyDirection {\r\n Right = 0,\r\n Left = 1,\r\n Up = 2,\r\n Down = 3\r\n}\r\n\r\n@Component({\r\n selector: 'app-manga-reader',\r\n templateUrl: './manga-reader.component.html',\r\n styleUrls: ['./manga-reader.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [ManagaReaderService],\r\n animations: [\r\n trigger('slideFromTop', [\r\n state('in', style({ transform: 'translateY(0)' })),\r\n transition('void => *', [\r\n style({ transform: 'translateY(-100%)' }),\r\n animate(ANIMATION_SPEED)\r\n ]),\r\n transition('* => void', [\r\n animate(ANIMATION_SPEED, style({ transform: 'translateY(-100%)' })),\r\n ])\r\n ]),\r\n trigger('slideFromBottom', [\r\n state('in', style({ transform: 'translateY(0)' })),\r\n transition('void => *', [\r\n style({ transform: 'translateY(100%)' }),\r\n animate(ANIMATION_SPEED)\r\n ]),\r\n transition('* => void', [\r\n animate(ANIMATION_SPEED, style({ transform: 'translateY(100%)' })),\r\n ])\r\n ])\r\n ],\r\n standalone: true,\r\n imports: [NgStyle, NgIf, LoadingComponent, SwipeDirective, CanvasRendererComponent, SingleRendererComponent,\r\n DoubleRendererComponent, DoubleReverseRendererComponent, DoubleNoCoverRendererComponent, InfiniteScrollerComponent,\r\n NgxSliderModule, ReactiveFormsModule, NgFor, NgSwitch, NgSwitchCase, FittingIconPipe, ReaderModeIconPipe,\r\n FullscreenIconPipe, TranslocoDirective, NgbProgressbar, PercentPipe, NgClass, AsyncPipe]\r\n})\r\nexport class MangaReaderComponent implements OnInit, AfterViewInit, OnDestroy {\r\n\r\n\r\n @ViewChild('reader') reader!: ElementRef;\r\n @ViewChild('readingArea') readingArea!: ElementRef;\r\n @ViewChild('content') canvas: ElementRef | undefined;\r\n\r\n @ViewChild(CanvasRendererComponent, { static: false }) canvasRenderer!: CanvasRendererComponent;\r\n @ViewChild(SingleRendererComponent, { static: false }) singleRenderer!: SingleRendererComponent;\r\n @ViewChild(DoubleRendererComponent, { static: false }) doubleRenderer!: DoubleRendererComponent;\r\n @ViewChild(DoubleReverseRendererComponent, { static: false }) doubleReverseRenderer!: DoubleReverseRendererComponent;\r\n @ViewChild(DoubleNoCoverRendererComponent, { static: false }) doubleNoCoverRenderer!: DoubleNoCoverRendererComponent;\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly route = inject(ActivatedRoute);\r\n private readonly router = inject(Router);\r\n private readonly accountService = inject(AccountService);\r\n private readonly formBuilder = inject(FormBuilder);\r\n private readonly navService = inject(NavService);\r\n private readonly memberService = inject(MemberService);\r\n private readonly modalService = inject(NgbModal);\r\n private readonly cdRef = inject(ChangeDetectorRef);\r\n private readonly toastr = inject(ToastrService);\r\n public readonly readerService = inject(ReaderService);\r\n public readonly utilityService = inject(UtilityService);\r\n public readonly mangaReaderService = inject(ManagaReaderService);\r\n\r\n protected readonly KeyDirection = KeyDirection;\r\n protected readonly ReaderMode = ReaderMode;\r\n protected readonly LayoutMode = LayoutMode;\r\n protected readonly ReadingDirection = ReadingDirection;\r\n protected readonly Breakpoint = Breakpoint;\r\n protected readonly Math = Math;\r\n\r\n libraryId!: number;\r\n seriesId!: number;\r\n volumeId!: number;\r\n chapterId!: number;\r\n /**\r\n * Reading List id. Defaults to -1.\r\n */\r\n readingListId: number = CHAPTER_ID_DOESNT_EXIST;\r\n\r\n /**\r\n * If this is true, no progress will be saved.\r\n */\r\n incognitoMode: boolean = false;\r\n /**\r\n * If this is true, we are reading a bookmark. ChapterId will be 0. There is no continuous reading. Progress is not saved. Bookmark control is removed.\r\n */\r\n bookmarkMode: boolean = false;\r\n\r\n /**\r\n * If this is true, chapters will be fetched in the order of a reading list, rather than natural series order.\r\n */\r\n readingListMode: boolean = false;\r\n /**\r\n * The current page. UI will show this number + 1.\r\n */\r\n pageNum = 0;\r\n /**\r\n * Total pages in the given Chapter\r\n */\r\n maxPages = 1;\r\n totalSeriesPages = 0;\r\n totalSeriesPagesRead = 0;\r\n user!: User;\r\n generalSettingsForm!: FormGroup;\r\n\r\n readingDirection = ReadingDirection.LeftToRight;\r\n scalingOption = ScalingOption.FitToHeight;\r\n pageSplitOption = PageSplitOption.FitSplit;\r\n\r\n isFullscreen: boolean = false;\r\n autoCloseMenu: boolean = true;\r\n\r\n readerMode: ReaderMode = ReaderMode.LeftRight;\r\n readerModeSubject = new BehaviorSubject(this.readerMode);\r\n readerMode$: Observable = this.readerModeSubject.asObservable();\r\n\r\n pagingDirection: PAGING_DIRECTION = PAGING_DIRECTION.FORWARD;\r\n pagingDirectionSubject: Subject = new BehaviorSubject(this.pagingDirection);\r\n pagingDirection$: Observable = this.pagingDirectionSubject.asObservable();\r\n\r\n\r\n pageSplitOptionsTranslated = pageSplitOptions.map(this.translatePrefOptions);\r\n layoutModesTranslated = layoutModes.map(this.translatePrefOptions);\r\n\r\n isLoading = true;\r\n hasBookmarkRights: boolean = false; // TODO: This can be an observable\r\n\r\n\r\n getPageFn!: (pageNum: number) => HTMLImageElement;\r\n\r\n\r\n /**\r\n * Used to render a page on the canvas or in the image tag. This Image element is prefetched by the cachedImages buffer.\r\n * @remarks Used for rendering to screen.\r\n */\r\n canvasImage = new Image();\r\n\r\n /**\r\n * A circular array of size PREFETCH_PAGES. Maintains prefetched Images around the current page to load from to avoid loading animation.\r\n * @see CircularArray\r\n */\r\n cachedImages: Array = [];\r\n /**\r\n * A stack of the chapter ids we come across during continuous reading mode. When we traverse a boundary, we use this to avoid extra API calls.\r\n * @see Stack\r\n */\r\n continuousChaptersStack: Stack = new Stack();\r\n\r\n continuousChapterInfos: Array = [undefined, undefined, undefined];\r\n\r\n /**\r\n * An event emitter when a page change occurs. Used solely by the webtoon reader.\r\n */\r\n goToPageEvent!: BehaviorSubject; // Renderer interaction\r\n\r\n /**\r\n * An event emitter when a bookmark on a page change occurs. Used solely by the webtoon reader.\r\n */\r\n showBookmarkEffectEvent: ReplaySubject = new ReplaySubject();\r\n showBookmarkEffect$: Observable = this.showBookmarkEffectEvent.asObservable();\r\n /**\r\n * An event emitter when fullscreen mode is toggled. Used solely by the webtoon reader.\r\n */\r\n fullscreenEvent: ReplaySubject = new ReplaySubject();\r\n /**\r\n * If the menu is open/visible.\r\n */\r\n menuOpen = false;\r\n /**\r\n * If the prev page allows a page change to occur.\r\n */\r\n prevPageDisabled = false;\r\n /**\r\n * If the next page allows a page change to occur.\r\n */\r\n nextPageDisabled = false;\r\n pageOptions: Options = {\r\n floor: 0,\r\n ceil: 0,\r\n step: 1,\r\n boundPointerLabels: true,\r\n showSelectionBar: true,\r\n translate: (value: number, label: LabelType) => {\r\n if (label == LabelType.Floor) {\r\n return 1 + '';\r\n } else if (label === LabelType.Ceil) {\r\n return this.maxPages + '';\r\n }\r\n return (this.pageNum + 1) + '';\r\n },\r\n animate: false\r\n };\r\n refreshSlider: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Used to store the Series name for UI\r\n */\r\n title: string = '';\r\n /**\r\n * Used to store the Volume/Chapter information\r\n */\r\n subtitle: string = '';\r\n /**\r\n * Timeout id for auto-closing menu overlay\r\n */\r\n menuTimeout: any;\r\n /**\r\n * If the click overlay is rendered on screen\r\n */\r\n showClickOverlay: boolean = false;\r\n private showClickOverlaySubject: ReplaySubject = new ReplaySubject();\r\n showClickOverlay$ = this.showClickOverlaySubject.asObservable();\r\n /**\r\n * Next Chapter Id. This is not guaranteed to be a valid ChapterId. Prefetched on page load (non-blocking).\r\n */\r\n nextChapterId: number = CHAPTER_ID_NOT_FETCHED;\r\n /**\r\n * Previous Chapter Id. This is not guaranteed to be a valid ChapterId. Prefetched on page load (non-blocking).\r\n */\r\n prevChapterId: number = CHAPTER_ID_NOT_FETCHED;\r\n /**\r\n * Is there a next chapter. If not, this will disable UI controls.\r\n */\r\n nextChapterDisabled: boolean = false;\r\n /**\r\n * Is there a previous chapter. If not, this will disable UI controls.\r\n */\r\n prevChapterDisabled: boolean = false;\r\n /**\r\n * Has the next chapter been prefetched. Prefetched means the backend will cache the files.\r\n */\r\n nextChapterPrefetched: boolean = false;\r\n /**\r\n * Has the previous chapter been prefetched. Prefetched means the backend will cache the files.\r\n */\r\n prevChapterPrefetched: boolean = false;\r\n /**\r\n * If extended settings area is visible. Blocks auto-closing of menu.\r\n */\r\n settingsOpen: boolean = false;\r\n /**\r\n * A map of bookmarked pages to anything. Used for O(1) lookup time if a page is bookmarked or not.\r\n */\r\n bookmarks: {[key: string]: number} = {};\r\n /**\r\n * Library Type used for rendering chapter or issue\r\n */\r\n libraryType: LibraryType = LibraryType.Manga;\r\n /**\r\n * Used for webtoon reader. When loading pages or data, this will disable the reader\r\n */\r\n inSetup: boolean = true;\r\n /**\r\n * If we render 2 pages at once or 1\r\n */\r\n layoutMode: LayoutMode = LayoutMode.Single;\r\n /**\r\n * Background color for canvas/reader. User configured.\r\n */\r\n backgroundColor: string = '#FFFFFF';\r\n\r\n /**\r\n * This is here as absolute layout requires us to calculate a negative right property for the right pagination when there is overflow. This is calculated on scroll.\r\n */\r\n rightPaginationOffset = 0;\r\n\r\n /**\r\n * Previous amount of scroll left. Used for swipe to paginate functionality.\r\n */\r\n prevScrollLeft = 0;\r\n /**\r\n * Previous amount of scroll top. Used for swipe to paginate functionality.\r\n */\r\n prevScrollTop = 0;\r\n\r\n prevIsHorizontalScrollLeft = true;\r\n prevIsVerticalScrollLeft = true;\r\n\r\n /**\r\n * Has the user scrolled to the far right side. This is used for swipe to next page and must ensure user is at end of scroll then on next swipe, will move pages.\r\n */\r\n hasHitRightScroll = false;\r\n /**\r\n * Has the user scrolled once for the current page\r\n */\r\n hasScrolledX: boolean = false;\r\n /**\r\n * Has the user scrolled once in the Y axis for the current page\r\n */\r\n hasScrolledY: boolean = false;\r\n /**\r\n * Has the user scrolled to far left size. This doesn't include starting from no scroll\r\n */\r\n hasHitZeroScroll: boolean = false;\r\n /**\r\n * Has the user scrolled to the far top of the screen\r\n */\r\n hasHitZeroTopScroll: boolean = false;\r\n /**\r\n * Has the user scrolled to the far bottom of the screen\r\n */\r\n hasHitBottomTopScroll: boolean = false;\r\n\r\n /**\r\n * Show and log debug information\r\n */\r\n debugMode: boolean = false;\r\n /**\r\n * Width override label for manual width control\r\n */\r\n widthOverrideLabel$ : Observable = new Observable();\r\n\r\n // Renderer interaction\r\n readerSettings$!: Observable;\r\n private currentImage: Subject = new ReplaySubject(1);\r\n currentImage$: Observable = this.currentImage.asObservable().pipe(\r\n shareReplay({refCount: true, bufferSize: 2})\r\n );\r\n\r\n private pageNumSubject: Subject<{pageNum: number, maxPages: number}> = new ReplaySubject();\r\n pageNum$: Observable<{pageNum: number, maxPages: number}> = this.pageNumSubject.asObservable();\r\n\r\n getPageUrl = (pageNum: number, chapterId: number = this.chapterId) => {\r\n if (this.bookmarkMode) return this.readerService.getBookmarkPageUrl(this.seriesId, this.user.apiKey, pageNum);\r\n return this.readerService.getPageUrl(chapterId, pageNum);\r\n }\r\n\r\n get CurrentPageBookmarked() {\r\n return this.bookmarks.hasOwnProperty(this.pageNum);\r\n }\r\n\r\n get WindowWidth() {\r\n return this.readingArea?.nativeElement.scrollWidth + 'px';\r\n }\r\n\r\n get ImageHeight() {\r\n if (this.FittingOption !== FITTING_OPTION.HEIGHT) {\r\n return this.mangaReaderService.getPageDimensions(this.pageNum)?.height + 'px';\r\n }\r\n\r\n return this.readingArea?.nativeElement?.clientHeight + 'px';\r\n }\r\n\r\n // This is for the pagination area\r\n get MaxHeight() {\r\n return '100dvh';\r\n }\r\n\r\n get RightPaginationOffset() {\r\n if (this.readerMode === ReaderMode.LeftRight && this.FittingOption !== FITTING_OPTION.WIDTH) {\r\n return (this.readingArea?.nativeElement?.scrollLeft || 0) * -1;\r\n }\r\n return 0;\r\n }\r\n\r\n get SplitIconClass() {\r\n if (this.mangaReaderService.isSplitLeftToRight(this.pageSplitOption)) {\r\n return 'left-side';\r\n } else if (this.mangaReaderService.isNoSplit(this.pageSplitOption)) {\r\n return 'none';\r\n }\r\n return 'right-side';\r\n }\r\n\r\n get FittingOption() { return this.generalSettingsForm?.get('fittingOption')?.value || FITTING_OPTION.HEIGHT; }\r\n get ReadingAreaWidth() {\r\n return this.readingArea?.nativeElement.scrollWidth - this.readingArea?.nativeElement.clientWidth;\r\n }\r\n\r\n get ReadingAreaHeight() {\r\n return this.readingArea?.nativeElement.scrollHeight - this.readingArea?.nativeElement.clientHeight;\r\n }\r\n\r\n\r\n constructor(@Inject(DOCUMENT) private document: Document) {\r\n this.navService.hideNavBar();\r\n this.navService.hideSideNav();\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n ngOnInit(): void {\r\n const libraryId = this.route.snapshot.paramMap.get('libraryId');\r\n const seriesId = this.route.snapshot.paramMap.get('seriesId');\r\n const chapterId = this.route.snapshot.paramMap.get('chapterId');\r\n if (libraryId === null || seriesId === null || chapterId === null) {\r\n this.router.navigateByUrl('/home');\r\n return;\r\n }\r\n\r\n this.getPageFn = this.getPage.bind(this);\r\n\r\n this.libraryId = parseInt(libraryId, 10);\r\n this.seriesId = parseInt(seriesId, 10);\r\n this.chapterId = parseInt(chapterId, 10);\r\n this.incognitoMode = this.route.snapshot.queryParamMap.get('incognitoMode') === 'true';\r\n this.bookmarkMode = this.route.snapshot.queryParamMap.get('bookmarkMode') === 'true';\r\n\r\n const readingListId = this.route.snapshot.queryParamMap.get('readingListId');\r\n if (readingListId != null) {\r\n this.readingListMode = true;\r\n this.readingListId = parseInt(readingListId, 10);\r\n }\r\n\r\n this.continuousChaptersStack.push(this.chapterId);\r\n\r\n this.accountService.currentUser$.pipe(take(1)).subscribe(user => {\r\n if (!user) {\r\n this.router.navigateByUrl('/login');\r\n return;\r\n }\r\n\r\n this.user = user;\r\n this.hasBookmarkRights = this.accountService.hasBookmarkRole(user) || this.accountService.hasAdminRole(user);\r\n this.readingDirection = this.user.preferences.readingDirection;\r\n this.scalingOption = this.user.preferences.scalingOption;\r\n this.pageSplitOption = this.user.preferences.pageSplitOption;\r\n this.autoCloseMenu = this.user.preferences.autoCloseMenu;\r\n this.readerMode = this.user.preferences.readerMode;\r\n this.layoutMode = this.user.preferences.layoutMode || LayoutMode.Single;\r\n this.backgroundColor = this.user.preferences.backgroundColor || '#000000';\r\n this.readerService.setOverrideStyles(this.backgroundColor);\r\n\r\n this.generalSettingsForm = this.formBuilder.nonNullable.group({\r\n autoCloseMenu: new FormControl(this.autoCloseMenu),\r\n pageSplitOption: new FormControl(this.pageSplitOption),\r\n fittingOption: new FormControl(this.mangaReaderService.translateScalingOption(this.scalingOption)),\r\n widthSlider: new FormControl('none'),\r\n layoutMode: new FormControl(this.layoutMode),\r\n darkness: new FormControl(100),\r\n emulateBook: new FormControl(this.user.preferences.emulateBook),\r\n swipeToPaginate: new FormControl(this.user.preferences.swipeToPaginate)\r\n });\r\n\r\n this.readerModeSubject.next(this.readerMode);\r\n this.pagingDirectionSubject.next(this.pagingDirection);\r\n\r\n // We need a mergeMap when page changes\r\n this.readerSettings$ = merge(this.generalSettingsForm.valueChanges, this.pagingDirection$, this.readerMode$).pipe(\r\n map(_ => this.createReaderSettingsUpdate()),\r\n takeUntilDestroyed(this.destroyRef),\r\n );\r\n\r\n this.updateForm();\r\n\r\n this.pagingDirection$.pipe(\r\n distinctUntilChanged(),\r\n tap(dir => {\r\n this.pagingDirection = dir;\r\n this.cdRef.markForCheck();\r\n }),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe(() => {});\r\n\r\n this.readerMode$.pipe(\r\n distinctUntilChanged(),\r\n tap(mode => {\r\n this.readerMode = mode;\r\n this.disableDoubleRendererIfScreenTooSmall();\r\n this.cdRef.markForCheck();\r\n }),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe(() => {});\r\n\r\n this.setupWidthOverrideTriggers();\r\n\r\n this.generalSettingsForm.get('layoutMode')?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(val => {\r\n\r\n const changeOccurred = parseInt(val, 10) !== this.layoutMode;\r\n this.layoutMode = parseInt(val, 10);\r\n\r\n if (this.layoutMode === LayoutMode.Single) {\r\n this.generalSettingsForm.get('pageSplitOption')?.setValue(this.user.preferences.pageSplitOption);\r\n this.generalSettingsForm.get('pageSplitOption')?.enable();\r\n this.generalSettingsForm.get('widthSlider')?.enable();\r\n this.generalSettingsForm.get('fittingOption')?.enable();\r\n this.generalSettingsForm.get('emulateBook')?.enable();\r\n } else {\r\n this.generalSettingsForm.get('pageSplitOption')?.setValue(PageSplitOption.NoSplit);\r\n this.generalSettingsForm.get('pageSplitOption')?.disable();\r\n this.generalSettingsForm.get('widthSlider')?.disable();\r\n this.generalSettingsForm.get('fittingOption')?.setValue(this.mangaReaderService.translateScalingOption(ScalingOption.FitToHeight));\r\n this.generalSettingsForm.get('fittingOption')?.disable();\r\n this.generalSettingsForm.get('emulateBook')?.enable();\r\n }\r\n this.cdRef.markForCheck();\r\n\r\n // Re-render the current page when we switch layouts\r\n if (changeOccurred) {\r\n this.setPageNum(this.adjustPagesForDoubleRenderer(this.pageNum));\r\n this.loadPage();\r\n }\r\n });\r\n\r\n this.generalSettingsForm.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\r\n this.autoCloseMenu = this.generalSettingsForm.get('autoCloseMenu')?.value;\r\n this.pageSplitOption = parseInt(this.generalSettingsForm.get('pageSplitOption')?.value, 10);\r\n\r\n const needsSplitting = this.mangaReaderService.isWidePage(this.readerService.imageUrlToPageNum(this.canvasImage.src));\r\n // If we need to split on a menu change, then we need to re-render.\r\n if (needsSplitting) {\r\n // If we need to re-render, to ensure things layout properly, let's update paging direction & reset render\r\n this.pagingDirectionSubject.next(PAGING_DIRECTION.FORWARD);\r\n this.canvasRenderer.reset();\r\n this.loadPage();\r\n }\r\n });\r\n\r\n this.memberService.hasReadingProgress(this.libraryId).pipe(take(1)).subscribe(progress => {\r\n if (!progress) {\r\n this.toggleMenu();\r\n this.toastr.info(translate('manga-reader.first-time-reading-manga'));\r\n }\r\n });\r\n });\r\n\r\n this.init();\r\n }\r\n\r\n ngAfterViewInit() {\r\n fromEvent(this.readingArea.nativeElement, 'scroll').pipe(debounceTime(20), takeUntilDestroyed(this.destroyRef)).subscribe(() => {\r\n if (this.readerMode === ReaderMode.Webtoon) return;\r\n if (this.readerMode === ReaderMode.LeftRight && this.FittingOption === FITTING_OPTION.HEIGHT) {\r\n this.rightPaginationOffset = (this.readingArea.nativeElement.scrollLeft) * -1;\r\n this.cdRef.markForCheck();\r\n return;\r\n }\r\n this.rightPaginationOffset = 0;\r\n this.cdRef.markForCheck();\r\n });\r\n\r\n fromEvent(this.readingArea.nativeElement, 'click').pipe(debounceTime(200), takeUntilDestroyed(this.destroyRef)).subscribe((event: MouseEvent | any) => {\r\n if (event.detail > 1) return;\r\n this.toggleMenu();\r\n });\r\n\r\n fromEvent(this.readingArea.nativeElement, 'scroll').pipe(debounceTime(200), takeUntilDestroyed(this.destroyRef)).subscribe(() => {\r\n this.prevScrollLeft = this.readingArea?.nativeElement?.scrollLeft || 0;\r\n this.prevScrollTop = this.readingArea?.nativeElement?.scrollTop || 0;\r\n this.hasScrolledX = true;\r\n this.hasScrolledY = true;\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.readerService.resetOverrideStyles();\r\n this.navService.showNavBar();\r\n this.navService.showSideNav();\r\n this.showBookmarkEffectEvent.complete();\r\n if (this.goToPageEvent !== undefined) this.goToPageEvent.complete();\r\n this.readerService.disableWakeLock();\r\n }\r\n\r\n\r\n @HostListener('window:resize', ['$event'])\r\n @HostListener('window:orientationchange', ['$event'])\r\n onResize() {\r\n this.disableDoubleRendererIfScreenTooSmall();\r\n }\r\n\r\n @HostListener('window:keyup', ['$event'])\r\n handleKeyPress(event: KeyboardEvent) {\r\n switch (this.readerMode) {\r\n case ReaderMode.LeftRight:\r\n if (event.key === KEY_CODES.RIGHT_ARROW) {\r\n if (!this.checkIfPaginationAllowed(KeyDirection.Right)) return;\r\n this.readingDirection === ReadingDirection.LeftToRight ? this.nextPage() : this.prevPage();\r\n } else if (event.key === KEY_CODES.LEFT_ARROW) {\r\n if (!this.checkIfPaginationAllowed(KeyDirection.Left)) return;\r\n this.readingDirection === ReadingDirection.LeftToRight ? this.prevPage() : this.nextPage();\r\n }\r\n break;\r\n case ReaderMode.UpDown:\r\n if (event.key === KEY_CODES.UP_ARROW) {\r\n if (!this.checkIfPaginationAllowed(KeyDirection.Up)) return;\r\n this.prevPage();\r\n } else if (event.key === KEY_CODES.DOWN_ARROW) {\r\n if (!this.checkIfPaginationAllowed(KeyDirection.Down)) return;\r\n this.nextPage();\r\n }\r\n break;\r\n case ReaderMode.Webtoon:\r\n break;\r\n }\r\n\r\n if (event.key === KEY_CODES.ESC_KEY) {\r\n if (this.menuOpen) {\r\n this.toggleMenu();\r\n event.stopPropagation();\r\n event.preventDefault();\r\n return;\r\n }\r\n this.closeReader();\r\n } else if (event.key === KEY_CODES.SPACE) {\r\n this.toggleMenu();\r\n } else if (event.key === KEY_CODES.G) {\r\n const goToPageNum = this.promptForPage();\r\n if (goToPageNum === null) { return; }\r\n this.goToPage(parseInt(goToPageNum.trim(), 10));\r\n } else if (event.key === KEY_CODES.B) {\r\n this.bookmarkPage();\r\n } else if (event.key === KEY_CODES.F) {\r\n this.toggleFullscreen();\r\n } else if (event.key === KEY_CODES.H) {\r\n this.openShortcutModal();\r\n }\r\n }\r\n\r\n /**\r\n * Width override is only valid under the following conditions:\r\n * Image Scaling is Width\r\n * Reader Mode is Webtoon\r\n *\r\n * In all other cases, the form will be disabled and set to 0 which indicates default/off state.\r\n */\r\n setupWidthOverrideTriggers() {\r\n const widthOverrideControl = this.generalSettingsForm.get('widthSlider')!;\r\n\r\n const enableWidthOverride = () => {\r\n widthOverrideControl.enable();\r\n };\r\n\r\n const disableWidthOverride = () => {\r\n widthOverrideControl.setValue(0);\r\n widthOverrideControl.disable();\r\n };\r\n\r\n const handleControlChanges = () => {\r\n const fitting = this.generalSettingsForm.get('fittingOption')?.value;\r\n const splitting = this.generalSettingsForm.get('pageSplitOption')?.value;\r\n\r\n if ((PageSplitOption.FitSplit == splitting && FITTING_OPTION.WIDTH == fitting) || this.readerMode === ReaderMode.Webtoon) {\r\n enableWidthOverride();\r\n } else {\r\n disableWidthOverride();\r\n }\r\n };\r\n\r\n // Reader mode changes\r\n this.readerModeSubject.asObservable()\r\n .pipe(\r\n filter(v => v === ReaderMode.Webtoon),\r\n tap(enableWidthOverride),\r\n takeUntilDestroyed(this.destroyRef)\r\n )\r\n .subscribe();\r\n\r\n // Page split option changes\r\n this.generalSettingsForm.get('pageSplitOption')?.valueChanges.pipe(\r\n distinctUntilChanged(),\r\n tap(handleControlChanges),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe();\r\n\r\n // Fitting option changes\r\n this.generalSettingsForm.get('fittingOption')?.valueChanges.pipe(\r\n tap(handleControlChanges),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe();\r\n\r\n // Set the default override to 0\r\n widthOverrideControl.setValue(0);\r\n\r\n //send the current width override value to the label\r\n this.widthOverrideLabel$ = this.readerSettings$?.pipe(\r\n map(values => (parseInt(values.widthSlider) <= 0) ? '' : values.widthSlider + '%'),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n }\r\n\r\n createReaderSettingsUpdate() {\r\n return {\r\n pageSplit: parseInt(this.generalSettingsForm.get('pageSplitOption')?.value, 10),\r\n fitting: (this.generalSettingsForm.get('fittingOption')?.value as FITTING_OPTION),\r\n widthSlider: this.generalSettingsForm.get('widthSlider')?.value,\r\n layoutMode: this.layoutMode,\r\n darkness: parseInt(this.generalSettingsForm.get('darkness')?.value + '', 10) || 100,\r\n pagingDirection: this.pagingDirection,\r\n readerMode: this.readerMode,\r\n emulateBook: this.generalSettingsForm.get('emulateBook')?.value,\r\n };\r\n }\r\n\r\n // If we are in double mode, we need to check if our current page is on a right edge or not, if so adjust by decrementing by 1\r\n adjustPagesForDoubleRenderer(pageNum: number) {\r\n if (pageNum === this.maxPages - 1) return pageNum;\r\n if (this.readerMode !== ReaderMode.Webtoon && this.layoutMode !== LayoutMode.Single) {\r\n return this.mangaReaderService.adjustForDoubleReader(pageNum);\r\n }\r\n return pageNum;\r\n }\r\n\r\n disableDoubleRendererIfScreenTooSmall() {\r\n if (window.innerWidth > window.innerHeight) {\r\n this.generalSettingsForm.get('layoutMode')?.enable();\r\n this.cdRef.markForCheck();\r\n return;\r\n }\r\n if (this.layoutMode === LayoutMode.Single || this.readerMode === ReaderMode.Webtoon) return;\r\n\r\n this.generalSettingsForm.get('layoutMode')?.setValue(LayoutMode.Single);\r\n this.generalSettingsForm.get('layoutMode')?.disable();\r\n this.toastr.info(translate('manga-reader.layout-mode-switched'));\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n /**\r\n * Gets a page from cache else gets a brand new Image\r\n * @param pageNum Page Number to load\r\n * @param forceNew Forces to fetch a new image\r\n * @param chapterId ChapterId to fetch page from. Defaults to current chapterId. Not used when in bookmark mode\r\n * @returns HTMLImageElement | undefined\r\n */\r\n getPage(pageNum: number, chapterId: number = this.chapterId, forceNew: boolean = false) {\r\n\r\n let img: HTMLImageElement | undefined;\r\n if (this.bookmarkMode) img = this.cachedImages.find(img => this.readerService.imageUrlToPageNum(img.src) === pageNum);\r\n else img = this.cachedImages.find(img => this.readerService.imageUrlToPageNum(img.src) === pageNum\r\n && (this.readerService.imageUrlToChapterId(img.src) == chapterId || this.readerService.imageUrlToChapterId(img.src) === -1)\r\n );\r\n\r\n //console.log('Requesting page ', pageNum, ' found page: ', img, ' and app is requesting new image? ', forceNew);\r\n if (!img || forceNew) {\r\n img = new Image();\r\n img.src = this.getPageUrl(pageNum, chapterId);\r\n img.onload = (evt) => {\r\n this.currentImage.next(img!);\r\n this.cdRef.markForCheck();\r\n }\r\n // img.onerror = (evt) => {\r\n // const event = evt as Event;\r\n // const page = this.readerService.imageUrlToPageNum((event.target as HTMLImageElement).src);\r\n // console.error('Image failed to load: ', page);\r\n // (event.target as HTMLImageElement).onerror = null;\r\n // const newSrc = this.getPageUrl(pageNum, chapterId) + '#' + new Date().getTime();\r\n // console.log('requesting page ', page, ' with url: ', newSrc);\r\n // (event.target as HTMLImageElement).src = newSrc;\r\n // this.cdRef.markForCheck();\r\n // }\r\n }\r\n\r\n return img;\r\n }\r\n\r\n\r\n\r\n isHorizontalScrollLeft() {\r\n const scrollLeft = this.readingArea?.nativeElement?.scrollLeft || 0;\r\n // if scrollLeft is 0 and this.ReadingAreaWidth is 0, then there is no scroll needed\r\n // if they equal each other, it means we are at the end of the scroll area\r\n if (scrollLeft === 0 && this.ReadingAreaWidth === 0) return false;\r\n if (scrollLeft === this.ReadingAreaWidth) return false;\r\n return scrollLeft < this.ReadingAreaWidth;\r\n }\r\n\r\n isVerticalScrollLeft() {\r\n const scrollTop = this.readingArea?.nativeElement?.scrollTop || 0;\r\n return scrollTop < this.ReadingAreaHeight;\r\n }\r\n\r\n /**\r\n * Is there any room to scroll in the direction we are giving? If so, return false. Otherwise, return true.\r\n * @param direction\r\n * @returns\r\n */\r\n checkIfPaginationAllowed(direction: KeyDirection) {\r\n if (this.readingArea === undefined || this.readingArea.nativeElement === undefined) return true;\r\n\r\n const scrollLeft = this.readingArea?.nativeElement?.scrollLeft || 0;\r\n const scrollTop = this.readingArea?.nativeElement?.scrollTop || 0;\r\n\r\n switch (direction) {\r\n case KeyDirection.Right:\r\n if (this.prevIsHorizontalScrollLeft && !this.isHorizontalScrollLeft()) { return true; }\r\n this.prevIsHorizontalScrollLeft = this.isHorizontalScrollLeft();\r\n\r\n if (this.isHorizontalScrollLeft()) {\r\n return false;\r\n }\r\n break;\r\n case KeyDirection.Left:\r\n this.prevIsHorizontalScrollLeft = this.isHorizontalScrollLeft();\r\n if (scrollLeft > 0 || this.prevScrollLeft > 0) {\r\n return false;\r\n }\r\n break;\r\n case KeyDirection.Up:\r\n this.prevIsVerticalScrollLeft = this.isVerticalScrollLeft();\r\n if (scrollTop > 0|| this.prevScrollTop > 0) {\r\n return false;\r\n }\r\n break;\r\n case KeyDirection.Down:\r\n if (this.prevIsVerticalScrollLeft && !this.isVerticalScrollLeft()) { return true; }\r\n this.prevIsVerticalScrollLeft = this.isVerticalScrollLeft();\r\n\r\n if (this.isVerticalScrollLeft()) {\r\n return false;\r\n }\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n\r\n\r\n init() {\r\n this.nextChapterId = CHAPTER_ID_NOT_FETCHED;\r\n this.prevChapterId = CHAPTER_ID_NOT_FETCHED;\r\n this.nextChapterDisabled = false;\r\n this.prevChapterDisabled = false;\r\n this.nextChapterPrefetched = false;\r\n this.pageNum = 0;\r\n this.pagingDirectionSubject.next(PAGING_DIRECTION.FORWARD);\r\n this.inSetup = true;\r\n this.canvasImage.src = '';\r\n this.cdRef.markForCheck();\r\n\r\n this.cachedImages = [];\r\n for (let i = 0; i < PREFETCH_PAGES; i++) {\r\n this.cachedImages.push(new Image());\r\n }\r\n\r\n if (this.goToPageEvent) {\r\n // There was a bug where goToPage was emitting old values into infinite scroller between chapter loads. We explicitly clear it out between loads,\r\n // and we use a BehaviourSubject to ensure only latest value is sent\r\n this.goToPageEvent.complete();\r\n }\r\n\r\n if (this.bookmarkMode) {\r\n this.readerService.getBookmarkInfo(this.seriesId).subscribe(bookmarkInfo => {\r\n this.setPageNum(0);\r\n this.title = bookmarkInfo.seriesName;\r\n this.subtitle = translate('manga-reader.bookmarks-title');\r\n this.libraryType = bookmarkInfo.libraryType;\r\n this.maxPages = bookmarkInfo.pages;\r\n this.mangaReaderService.load(bookmarkInfo);\r\n\r\n // Due to change detection rules in Angular, we need to re-create the options object to apply the change\r\n const newOptions: Options = Object.assign({}, this.pageOptions);\r\n newOptions.ceil = this.maxPages - 1; // We -1 so that the slider UI shows us hitting the end, since visually we +1 everything.\r\n this.pageOptions = newOptions;\r\n this.inSetup = false;\r\n this.cdRef.markForCheck();\r\n\r\n this.goToPageEvent = new BehaviorSubject(this.pageNum);\r\n\r\n this.render();\r\n });\r\n\r\n setTimeout(() => {\r\n this.readerService.enableWakeLock(this.reader.nativeElement);\r\n }, 1000);\r\n return;\r\n }\r\n\r\n forkJoin({\r\n progress: this.readerService.getProgress(this.chapterId),\r\n chapterInfo: this.readerService.getChapterInfo(this.chapterId, true),\r\n bookmarks: this.readerService.getBookmarks(this.chapterId),\r\n }).pipe(take(1)).subscribe(results => {\r\n if (this.readingListMode && (results.chapterInfo.seriesFormat === MangaFormat.EPUB || results.chapterInfo.seriesFormat === MangaFormat.PDF)) {\r\n // Redirect to the book reader.\r\n const params = this.readerService.getQueryParamsObject(this.incognitoMode, this.readingListMode, this.readingListId);\r\n this.router.navigate(this.readerService.getNavigationArray(results.chapterInfo.libraryId, results.chapterInfo.seriesId, this.chapterId, results.chapterInfo.seriesFormat), {queryParams: params});\r\n return;\r\n }\r\n\r\n this.mangaReaderService.load(results.chapterInfo);\r\n\r\n this.continuousChapterInfos[ChapterInfoPosition.Current] = results.chapterInfo;\r\n this.volumeId = results.chapterInfo.volumeId;\r\n this.maxPages = results.chapterInfo.pages;\r\n let page = results.progress.pageNum;\r\n if (page > this.maxPages) {\r\n page = this.maxPages - 1;\r\n }\r\n\r\n page = this.adjustPagesForDoubleRenderer(page);\r\n\r\n this.totalSeriesPages = results.chapterInfo.seriesTotalPages;\r\n this.totalSeriesPagesRead = results.chapterInfo.seriesTotalPagesRead - page;\r\n\r\n this.setPageNum(page); // first call\r\n this.goToPageEvent = new BehaviorSubject(this.pageNum);\r\n\r\n // Due to change detection rules in Angular, we need to re-create the options object to apply the change\r\n const newOptions: Options = Object.assign({}, this.pageOptions);\r\n newOptions.ceil = this.maxPages - 1; // We -1 so that the slider UI shows us hitting the end, since visually we +1 everything.\r\n this.pageOptions = newOptions;\r\n\r\n this.libraryType = results.chapterInfo.libraryType;\r\n this.title = results.chapterInfo.title;\r\n this.subtitle = results.chapterInfo.subtitle;\r\n\r\n this.inSetup = false;\r\n\r\n this.disableDoubleRendererIfScreenTooSmall();\r\n\r\n\r\n // From bookmarks, create map of pages to make lookup time O(1)\r\n this.bookmarks = {};\r\n results.bookmarks.forEach(bookmark => {\r\n this.bookmarks[bookmark.page] = 1;\r\n });\r\n this.cdRef.markForCheck();\r\n\r\n this.readerService.getNextChapter(this.seriesId, this.volumeId, this.chapterId, this.readingListId).pipe(take(1)).subscribe(chapterId => {\r\n this.nextChapterId = chapterId;\r\n if (chapterId === CHAPTER_ID_DOESNT_EXIST || chapterId === this.chapterId) {\r\n this.nextChapterDisabled = true;\r\n this.cdRef.markForCheck();\r\n } else {\r\n // Fetch the first page of next chapter\r\n this.getPage(0, this.nextChapterId);\r\n\r\n }\r\n });\r\n this.readerService.getPrevChapter(this.seriesId, this.volumeId, this.chapterId, this.readingListId).pipe(take(1)).subscribe(chapterId => {\r\n this.prevChapterId = chapterId;\r\n if (chapterId === CHAPTER_ID_DOESNT_EXIST || chapterId === this.chapterId) {\r\n this.prevChapterDisabled = true;\r\n this.cdRef.markForCheck();\r\n } else {\r\n // Fetch the last page of prev chapter\r\n this.getPage(1000000, this.prevChapterId);\r\n }\r\n });\r\n\r\n this.render();\r\n }, () => {\r\n setTimeout(() => {\r\n this.closeReader();\r\n }, 200);\r\n });\r\n }\r\n\r\n closeReader() {\r\n this.readerService.closeReader(this.readingListMode, this.readingListId);\r\n }\r\n\r\n render() {\r\n if (this.readerMode === ReaderMode.Webtoon) {\r\n this.isLoading = false;\r\n this.cdRef.markForCheck();\r\n } else {\r\n this.loadPage();\r\n }\r\n }\r\n\r\n cancelMenuCloseTimer() {\r\n if (this.menuTimeout) {\r\n clearTimeout(this.menuTimeout);\r\n }\r\n }\r\n\r\n /**\r\n * Whenever the menu is interacted with, restart the timer. However, if the settings menu is open, don't restart, just cancel the timeout.\r\n */\r\n resetMenuCloseTimer() {\r\n if (this.menuTimeout) {\r\n clearTimeout(this.menuTimeout);\r\n if (!this.settingsOpen && this.autoCloseMenu) {\r\n this.startMenuCloseTimer();\r\n }\r\n }\r\n }\r\n\r\n startMenuCloseTimer() {\r\n if (!this.autoCloseMenu) { return; }\r\n\r\n this.menuTimeout = setTimeout(() => {\r\n this.toggleMenu();\r\n }, OVERLAY_AUTO_CLOSE_TIME);\r\n }\r\n\r\n\r\n toggleMenu() {\r\n this.menuOpen = !this.menuOpen;\r\n this.cdRef.markForCheck();\r\n\r\n if (this.menuTimeout) {\r\n clearTimeout(this.menuTimeout);\r\n }\r\n\r\n if (this.menuOpen && !this.settingsOpen) {\r\n this.startMenuCloseTimer();\r\n } else {\r\n this.showClickOverlay = false;\r\n this.settingsOpen = false;\r\n this.cdRef.markForCheck();\r\n }\r\n }\r\n\r\n resetSwipeModifiers() {\r\n this.prevScrollLeft = 0;\r\n this.prevScrollTop = 0;\r\n this.hasScrolledX = false;\r\n this.hasScrolledY = false;\r\n this.hasHitRightScroll = false;\r\n this.hasHitZeroScroll = false;\r\n this.hasHitBottomTopScroll = false;\r\n this.hasHitZeroTopScroll = false;\r\n }\r\n\r\n /**\r\n * This executes BEFORE fromEvent('scroll')\r\n * @returns\r\n * @param _\r\n */\r\n onSwipeMove(_: SwipeEvent) {\r\n this.prevScrollLeft = this.readingArea?.nativeElement?.scrollLeft || 0;\r\n this.prevScrollTop = this.readingArea?.nativeElement?.scrollTop || 0\r\n }\r\n\r\n triggerSwipePagination(direction: KeyDirection) {\r\n if (!this.generalSettingsForm.get('swipeToPaginate')?.value) return;\r\n\r\n switch(direction) {\r\n case KeyDirection.Down:\r\n this.nextPage();\r\n break;\r\n case KeyDirection.Right:\r\n this.readingDirection === ReadingDirection.LeftToRight ? this.nextPage() : this.prevPage();\r\n break;\r\n case KeyDirection.Up:\r\n this.prevPage();\r\n break;\r\n case KeyDirection.Left:\r\n this.readingDirection === ReadingDirection.LeftToRight ? this.prevPage() : this.nextPage();\r\n break;\r\n }\r\n\r\n }\r\n\r\n onSwipeEnd(event: SwipeEvent) {\r\n // Positive number means swiping right/down, negative means left\r\n switch (this.readerMode) {\r\n case ReaderMode.Webtoon: break;\r\n case ReaderMode.LeftRight:\r\n {\r\n if (event.direction !== 'x') return;\r\n const scrollLeft = this.readingArea?.nativeElement?.scrollLeft || 0;\r\n const direction = event.distance < 0 ? KeyDirection.Right : KeyDirection.Left;\r\n if (!this.checkIfPaginationAllowed(direction)) {\r\n return;\r\n }\r\n\r\n\r\n // We just came from a swipe where pagination was required, and we are now at the end of the swipe, so make the user do it once more\r\n if (direction === KeyDirection.Right) {\r\n this.hasHitZeroScroll = false;\r\n if (scrollLeft === 0 && this.ReadingAreaWidth === 0) {\r\n this.triggerSwipePagination(direction);\r\n return;\r\n }\r\n if (!this.hasHitRightScroll && this.checkIfPaginationAllowed(direction)) {\r\n this.hasHitRightScroll = true;\r\n return;\r\n }\r\n } else if (direction === KeyDirection.Left) {\r\n this.hasHitRightScroll = false;\r\n\r\n // If we have not scrolled then let the user page back\r\n if (scrollLeft === 0 && this.prevScrollLeft === 0) {\r\n if (!this.hasScrolledX || this.hasHitZeroScroll) {\r\n this.triggerSwipePagination(direction);\r\n return;\r\n }\r\n this.hasHitZeroScroll = true;\r\n return;\r\n }\r\n }\r\n\r\n if (!this.hasHitRightScroll) {\r\n return;\r\n }\r\n\r\n this.triggerSwipePagination(direction);\r\n break;\r\n }\r\n case ReaderMode.UpDown:\r\n {\r\n if (event.direction !== 'y') return;\r\n const direction = event.distance < 0 ? KeyDirection.Down : KeyDirection.Up;\r\n const scrollTop = this.readingArea?.nativeElement?.scrollTop || 0;\r\n if (!this.checkIfPaginationAllowed(direction)) return;\r\n\r\n\r\n if (direction === KeyDirection.Down) {\r\n this.hasHitZeroTopScroll = false;\r\n if (!this.hasHitBottomTopScroll && this.checkIfPaginationAllowed(direction)) {\r\n this.hasHitBottomTopScroll = true;\r\n return;\r\n }\r\n } else if (direction === KeyDirection.Up) {\r\n this.hasHitBottomTopScroll = false;\r\n\r\n // If we have not scrolled then let the user page back\r\n if (scrollTop === 0 && this.prevScrollTop === 0) {\r\n if (!this.hasScrolledY || this.hasHitZeroTopScroll) {\r\n this.triggerSwipePagination(direction);\r\n return;\r\n }\r\n this.hasHitZeroTopScroll = true;\r\n return;\r\n }\r\n }\r\n\r\n if (!this.hasHitBottomTopScroll) {\r\n return;\r\n }\r\n\r\n this.triggerSwipePagination(direction);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n handlePageChange(event: any, direction: KeyDirection) {\r\n if (this.readerMode === ReaderMode.Webtoon) {\r\n if (direction === KeyDirection.Right) {\r\n this.nextPage(event);\r\n } else {\r\n this.prevPage(event);\r\n }\r\n return;\r\n }\r\n if (direction === KeyDirection.Right) {\r\n this.readingDirection === ReadingDirection.LeftToRight ? this.nextPage(event) : this.prevPage(event);\r\n } else if (direction === KeyDirection.Left) {\r\n this.readingDirection === ReadingDirection.LeftToRight ? this.prevPage(event) : this.nextPage(event);\r\n }\r\n }\r\n\r\n nextPage(event?: any) {\r\n if (event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n\r\n this.resetSwipeModifiers();\r\n\r\n this.isLoading = true;\r\n this.cdRef.markForCheck();\r\n\r\n this.pagingDirectionSubject.next(PAGING_DIRECTION.FORWARD);\r\n\r\n const pageAmount = Math.max(this.canvasRenderer.getPageAmount(PAGING_DIRECTION.FORWARD), this.singleRenderer.getPageAmount(PAGING_DIRECTION.FORWARD),\r\n this.doubleRenderer.getPageAmount(PAGING_DIRECTION.FORWARD),\r\n this.doubleReverseRenderer.getPageAmount(PAGING_DIRECTION.FORWARD),\r\n this.doubleNoCoverRenderer.getPageAmount(PAGING_DIRECTION.FORWARD)\r\n );\r\n // If we are on last page with split mode, we need to be able to progress, hence why we check if we could move backwards or not\r\n const isSplitRendering = [PageSplitOption.SplitRightToLeft, PageSplitOption.SplitRightToLeft].includes(parseInt(this.generalSettingsForm.get('pageSplitOption')?.value, 10));\r\n const notInSplit = this.canvasRenderer.getPageAmount(PAGING_DIRECTION.BACKWARDS) === 0;\r\n const isASpread = this.mangaReaderService.isWidePage(this.pageNum);\r\n\r\n\r\n if ((this.pageNum + pageAmount >= this.maxPages && (!isASpread || !isSplitRendering || notInSplit))) {\r\n // Move to next volume/chapter automatically\r\n this.loadNextChapter();\r\n return;\r\n }\r\n\r\n this.setPageNum(this.pageNum + pageAmount);\r\n this.loadPage();\r\n }\r\n\r\n prevPage(event?: any) {\r\n if (event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n\r\n this.resetSwipeModifiers();\r\n\r\n this.isLoading = true;\r\n this.cdRef.markForCheck();\r\n\r\n this.pagingDirectionSubject.next(PAGING_DIRECTION.BACKWARDS);\r\n\r\n\r\n const pageAmount = this.readerMode === ReaderMode.Webtoon ? 1 : Math.max(this.canvasRenderer.getPageAmount(PAGING_DIRECTION.BACKWARDS),\r\n this.singleRenderer.getPageAmount(PAGING_DIRECTION.BACKWARDS),\r\n this.doubleRenderer.getPageAmount(PAGING_DIRECTION.BACKWARDS),\r\n this.doubleNoCoverRenderer.getPageAmount(PAGING_DIRECTION.BACKWARDS),\r\n this.doubleReverseRenderer.getPageAmount(PAGING_DIRECTION.BACKWARDS)\r\n );\r\n\r\n const notInSplit = this.readerMode === ReaderMode.Webtoon ? true : this.canvasRenderer.shouldMovePrev();\r\n\r\n if ((this.pageNum - 1 < 0 && notInSplit)) {\r\n // Move to next volume/chapter automatically\r\n this.loadPrevChapter();\r\n return;\r\n }\r\n\r\n this.setPageNum(this.pageNum - pageAmount);\r\n this.loadPage();\r\n }\r\n\r\n /**\r\n * Sets canvasImage's src to current page, but first attempts to use a pre-fetched image\r\n */\r\n setCanvasImage() {\r\n if (this.cachedImages === undefined) return;\r\n\r\n this.canvasImage = this.getPage(this.pageNum, this.chapterId, this.layoutMode !== LayoutMode.Single);\r\n if (!this.canvasImage.complete) {\r\n this.canvasImage.addEventListener('load', () => {\r\n this.currentImage.next(this.canvasImage);\r\n }, false);\r\n } else {\r\n this.currentImage.next(this.canvasImage);\r\n }\r\n\r\n\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n\r\n loadNextChapter() {\r\n if (this.nextPageDisabled || this.nextChapterDisabled || this.bookmarkMode) {\r\n this.toastr.info(translate('manga-reader.no-next-chapter'));\r\n this.isLoading = false;\r\n this.cdRef.markForCheck();\r\n return;\r\n }\r\n\r\n if (this.nextChapterId === CHAPTER_ID_NOT_FETCHED || this.nextChapterId === this.chapterId) {\r\n this.readerService.getNextChapter(this.seriesId, this.volumeId, this.chapterId, this.readingListId).pipe(take(1)).subscribe(chapterId => {\r\n this.nextChapterId = chapterId;\r\n this.loadChapter(chapterId, 'Next');\r\n });\r\n } else {\r\n this.loadChapter(this.nextChapterId, 'Next');\r\n }\r\n }\r\n\r\n loadPrevChapter() {\r\n if (this.prevPageDisabled || this.prevChapterDisabled || this.bookmarkMode) {\r\n this.toastr.info(translate('manga-reader.no-prev-chapter'));\r\n this.isLoading = false;\r\n this.cdRef.markForCheck();\r\n return;\r\n }\r\n this.continuousChaptersStack.pop();\r\n const prevChapter = this.continuousChaptersStack.peek();\r\n if (prevChapter != this.chapterId) {\r\n if (prevChapter !== undefined) {\r\n this.chapterId = prevChapter;\r\n this.init();\r\n return;\r\n }\r\n }\r\n\r\n if (this.prevChapterId === CHAPTER_ID_NOT_FETCHED || this.prevChapterId === this.chapterId) {\r\n this.readerService.getPrevChapter(this.seriesId, this.volumeId, this.chapterId, this.readingListId).pipe(take(1)).subscribe(chapterId => {\r\n this.prevChapterId = chapterId;\r\n this.loadChapter(chapterId, 'Prev');\r\n });\r\n } else {\r\n this.loadChapter(this.prevChapterId, 'Prev');\r\n }\r\n }\r\n\r\n loadChapter(chapterId: number, direction: 'Next' | 'Prev') {\r\n if (chapterId > 0) {\r\n this.isLoading = true;\r\n this.cdRef.markForCheck();\r\n\r\n this.chapterId = chapterId;\r\n this.continuousChaptersStack.push(chapterId);\r\n // Load chapter Id onto route but don't reload\r\n const newRoute = this.readerService.getNextChapterUrl(this.router.url, this.chapterId, this.incognitoMode, this.readingListMode, this.readingListId);\r\n window.history.replaceState({}, '', newRoute);\r\n this.init();\r\n const msg = translate(direction === 'Next' ? 'toasts.load-next-chapter' : 'toasts.load-prev-chapter', {entity: this.utilityService.formatChapterName(this.libraryType).toLowerCase()});\r\n this.toastr.info(msg, '', {timeOut: 3000});\r\n } else {\r\n // This will only happen if no actual chapter can be found\r\n const msg = translate(direction === 'Next' ? 'toasts.no-next-chapter' : 'toasts.no-prev-chapter',\r\n {entity: this.utilityService.formatChapterName(this.libraryType).toLowerCase()});\r\n this.toastr.warning(msg);\r\n this.isLoading = false;\r\n if (direction === 'Prev') {\r\n this.prevPageDisabled = true;\r\n } else {\r\n this.nextPageDisabled = true;\r\n }\r\n this.cdRef.markForCheck();\r\n }\r\n }\r\n\r\n\r\n\r\n renderPage() {\r\n const page = [this.canvasImage];\r\n\r\n this.canvasRenderer?.renderPage(page);\r\n this.singleRenderer?.renderPage(page);\r\n this.doubleRenderer?.renderPage(page);\r\n this.doubleNoCoverRenderer?.renderPage(page);\r\n this.doubleReverseRenderer?.renderPage(page);\r\n\r\n // Originally this was only for fit to height, but when swiping was introduced, it made more sense to do it always to reset to the same view\r\n this.readingArea.nativeElement.scroll(0,0);\r\n\r\n this.isLoading = false;\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n /**\r\n * Maintains an array of images (that are requested from backend) around the user's current page. This allows for quick loading (seamless to user)\r\n * and also maintains page info (wide image, etc.) due to onload event.\r\n */\r\n prefetch() {\r\n // NOTE: This doesn't allow for any directionality\r\n // NOTE: This doesn't maintain 1 image behind at all times\r\n for(let i = 0; i <= PREFETCH_PAGES - 3; i++) {\r\n let numOffset = this.pageNum + i;\r\n\r\n if (numOffset > this.maxPages - 1) {\r\n continue;\r\n }\r\n\r\n const index = (numOffset % this.cachedImages.length + this.cachedImages.length) % this.cachedImages.length;\r\n const cachedImagePageNum = this.readerService.imageUrlToPageNum(this.cachedImages[index].src);\r\n if (cachedImagePageNum !== numOffset) {\r\n this.cachedImages[index] = this.getPage(numOffset, this.chapterId);\r\n }\r\n }\r\n }\r\n\r\n\r\n /**\r\n * This is responsible for setting up the image variables. This will be moved out to different renderers\r\n */\r\n loadPage() {\r\n if (this.readerMode === ReaderMode.Webtoon) return;\r\n\r\n this.isLoading = true;\r\n this.setCanvasImage();\r\n this.cdRef.markForCheck();\r\n\r\n this.renderPage();\r\n this.isLoading = false;\r\n this.cdRef.markForCheck();\r\n\r\n this.prefetch();\r\n }\r\n\r\n setReadingDirection() {\r\n if (this.readingDirection === ReadingDirection.LeftToRight) {\r\n this.readingDirection = ReadingDirection.RightToLeft;\r\n } else {\r\n this.readingDirection = ReadingDirection.LeftToRight;\r\n }\r\n\r\n if (this.menuOpen && this.user.preferences.showScreenHints) {\r\n this.showClickOverlay = true;\r\n this.showClickOverlaySubject.next(true);\r\n setTimeout(() => {\r\n this.showClickOverlay = false;\r\n this.showClickOverlaySubject.next(false);\r\n }, CLICK_OVERLAY_TIMEOUT);\r\n }\r\n }\r\n\r\n\r\n sliderDragUpdate(context: ChangeContext) {\r\n // This will update the value for value except when in webtoon due to how the webtoon reader\r\n // responds to page changes\r\n if (this.readerMode !== ReaderMode.Webtoon) {\r\n this.setPageNum(context.value);\r\n }\r\n }\r\n\r\n sliderPageUpdate(context: ChangeContext) {\r\n const page = context.value;\r\n\r\n if (page > this.pageNum) {\r\n this.pagingDirectionSubject.next(PAGING_DIRECTION.FORWARD);\r\n } else {\r\n this.pagingDirectionSubject.next(PAGING_DIRECTION.BACKWARDS);\r\n }\r\n\r\n this.setPageNum(this.adjustPagesForDoubleRenderer(page));\r\n this.refreshSlider.emit();\r\n this.goToPageEvent.next(this.pageNum);\r\n this.render();\r\n }\r\n\r\n setPageNum(pageNum: number) {\r\n this.pageNum = Math.max(Math.min(pageNum, this.maxPages - 1), 0);\r\n this.pageNumSubject.next({pageNum: this.pageNum, maxPages: this.maxPages});\r\n this.cdRef.markForCheck();\r\n\r\n if (this.pageNum >= this.maxPages - 10) {\r\n // Tell server to cache the next chapter\r\n if (this.nextChapterId > 0 && !this.nextChapterPrefetched) {\r\n this.readerService.getChapterInfo(this.nextChapterId).pipe(take(1)).subscribe(res => {\r\n this.continuousChapterInfos[ChapterInfoPosition.Next] = res;\r\n this.nextChapterPrefetched = true;\r\n this.prefetchStartOfChapter(this.nextChapterId, PAGING_DIRECTION.FORWARD);\r\n });\r\n }\r\n } else if (this.pageNum <= 10) {\r\n if (this.prevChapterId > 0 && !this.prevChapterPrefetched) {\r\n this.readerService.getChapterInfo(this.prevChapterId).pipe(take(1)).subscribe(res => {\r\n this.continuousChapterInfos[ChapterInfoPosition.Previous] = res;\r\n this.prevChapterPrefetched = true;\r\n this.prefetchStartOfChapter(this.nextChapterId, PAGING_DIRECTION.BACKWARDS);\r\n });\r\n }\r\n }\r\n\r\n // Due to the fact that we start at image 0, but page 1, we need the last page to have progress as page + 1 to be completed\r\n let tempPageNum = this.pageNum;\r\n if (this.pageNum == this.maxPages - 1 && this.pagingDirection === PAGING_DIRECTION.FORWARD) {\r\n tempPageNum = this.pageNum + 1;\r\n }\r\n\r\n if (!this.incognitoMode && !this.bookmarkMode) {\r\n this.readerService.saveProgress(this.libraryId, this.seriesId, this.volumeId, this.chapterId, tempPageNum).pipe(take(1)).subscribe(() => {/* No operation */});\r\n }\r\n }\r\n\r\n /**\r\n * Loads the first 5 images (throwaway cache) from the given chapterId\r\n * @param chapterId\r\n * @param direction Used to indicate if the chapter is behind or ahead of current chapter\r\n */\r\n prefetchStartOfChapter(chapterId: number, direction: PAGING_DIRECTION) {\r\n let pages = [];\r\n\r\n if (direction === PAGING_DIRECTION.BACKWARDS) {\r\n if (this.continuousChapterInfos[ChapterInfoPosition.Previous] === undefined) return;\r\n const n = this.continuousChapterInfos[ChapterInfoPosition.Previous]!.pages;\r\n pages = Array.from({length: n + 1}, (v, k) => n - k);\r\n } else {\r\n pages = [0, 1, 2, 3, 4];\r\n }\r\n\r\n let images = [];\r\n pages.forEach((_, i: number) => {\r\n let img = new Image();\r\n img.src = this.getPageUrl(i, chapterId);\r\n images.push(img)\r\n });\r\n }\r\n\r\n goToPage(pageNum: number) {\r\n let page = pageNum;\r\n\r\n if (page === undefined || this.pageNum === page) { return; }\r\n\r\n if (page > this.maxPages) {\r\n page = this.maxPages;\r\n } else if (page < 0) {\r\n page = 0;\r\n }\r\n\r\n if (!(page === 0 || page === this.maxPages - 1)) {\r\n page -= 1;\r\n }\r\n\r\n if (page > this.pageNum) {\r\n this.pagingDirectionSubject.next(PAGING_DIRECTION.FORWARD);\r\n } else {\r\n this.pagingDirectionSubject.next(PAGING_DIRECTION.BACKWARDS);\r\n }\r\n\r\n this.setPageNum(this.adjustPagesForDoubleRenderer(page));\r\n this.goToPageEvent.next(page);\r\n this.render();\r\n }\r\n\r\n // This is menu code\r\n clickOverlayClass(side: 'right' | 'left') {\r\n if (!this.showClickOverlay) {\r\n return '';\r\n }\r\n\r\n if (this.readingDirection === ReadingDirection.LeftToRight) {\r\n return side === 'right' ? 'highlight' : 'highlight-2';\r\n }\r\n return side === 'right' ? 'highlight-2' : 'highlight';\r\n }\r\n\r\n // This is menu only code\r\n promptForPage() {\r\n const question = translate('book-reader.go-to-page-prompt', {totalPages: this.maxPages});\r\n const goToPageNum = window.prompt(question, '');\r\n if (goToPageNum === null || goToPageNum.trim().length === 0) { return null; }\r\n return goToPageNum;\r\n }\r\n\r\n // This is menu only code\r\n toggleFullscreen() {\r\n this.readerService.toggleFullscreen(this.reader.nativeElement, () => {\r\n this.isFullscreen = true;\r\n this.fullscreenEvent.next(true);\r\n this.render();\r\n });\r\n }\r\n\r\n // This is menu only code\r\n toggleReaderMode() {\r\n switch(this.readerMode) {\r\n case ReaderMode.LeftRight:\r\n this.pagingDirectionSubject.next(PAGING_DIRECTION.FORWARD);\r\n this.readerModeSubject.next(ReaderMode.UpDown);\r\n break;\r\n case ReaderMode.UpDown:\r\n this.readerModeSubject.next(ReaderMode.Webtoon);\r\n break;\r\n case ReaderMode.Webtoon:\r\n this.readerModeSubject.next(ReaderMode.LeftRight);\r\n break;\r\n }\r\n\r\n // We must set this here because loadPage from render doesn't call if we aren't page splitting\r\n if (this.readerMode !== ReaderMode.Webtoon) {\r\n this.canvasImage = this.getPage(this.pageNum);\r\n this.currentImage.next(this.canvasImage);\r\n this.pageNumSubject.next({pageNum: this.pageNum, maxPages: this.maxPages});\r\n //this.isLoading = true;\r\n this.cdRef.detectChanges(); // Must use detectChanges to ensure ViewChildren get updated again\r\n }\r\n\r\n this.updateForm();\r\n\r\n this.render();\r\n }\r\n\r\n // This is menu only code\r\n updateForm() {\r\n if ( this.readerMode === ReaderMode.Webtoon) {\r\n this.generalSettingsForm.get('pageSplitOption')?.disable()\r\n this.generalSettingsForm.get('fittingOption')?.disable()\r\n this.generalSettingsForm.get('layoutMode')?.disable();\r\n } else {\r\n this.generalSettingsForm.get('fittingOption')?.enable()\r\n this.generalSettingsForm.get('pageSplitOption')?.enable();\r\n this.generalSettingsForm.get('layoutMode')?.enable();\r\n\r\n if (this.layoutMode !== LayoutMode.Single) {\r\n this.generalSettingsForm.get('pageSplitOption')?.disable();\r\n this.generalSettingsForm.get('fittingOption')?.disable();\r\n }\r\n }\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n handleWebtoonPageChange(updatedPageNum: number) {\r\n this.setPageNum(updatedPageNum);\r\n }\r\n\r\n /**\r\n * Bookmarks the current page for the chapter\r\n */\r\n bookmarkPage(event: MouseEvent | undefined = undefined) {\r\n if (event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n if (this.bookmarkMode) return;\r\n\r\n const pageNum = this.pageNum;\r\n // if canvasRenderer and doubleRenderer is undefined, then we are in webtoon mode\r\n const isDouble = this.canvasRenderer !== undefined && this.doubleRenderer !== undefined && Math.max(this.canvasRenderer.getBookmarkPageCount(), this.singleRenderer.getBookmarkPageCount(),\r\n this.doubleRenderer.getBookmarkPageCount(), this.doubleReverseRenderer.getBookmarkPageCount(), this.doubleNoCoverRenderer.getBookmarkPageCount()) > 1;\r\n\r\n if (this.CurrentPageBookmarked) {\r\n let apis = [this.readerService.unbookmark(this.seriesId, this.volumeId, this.chapterId, pageNum)];\r\n if (isDouble) apis.push(this.readerService.unbookmark(this.seriesId, this.volumeId, this.chapterId, pageNum + 1));\r\n forkJoin(apis).pipe(take(1)).subscribe(() => {\r\n delete this.bookmarks[pageNum];\r\n if (isDouble) delete this.bookmarks[pageNum + 1];\r\n this.cdRef.detectChanges();\r\n });\r\n } else {\r\n let apis = [this.readerService.bookmark(this.seriesId, this.volumeId, this.chapterId, pageNum)];\r\n if (isDouble) apis.push(this.readerService.bookmark(this.seriesId, this.volumeId, this.chapterId, pageNum + 1));\r\n forkJoin(apis).pipe(take(1)).subscribe(() => {\r\n this.bookmarks[pageNum] = 1;\r\n if (isDouble) this.bookmarks[pageNum + 1] = 1;\r\n this.cdRef.detectChanges();\r\n });\r\n }\r\n\r\n // Show an effect on the image to show that it was bookmarked\r\n this.showBookmarkEffectEvent.next(pageNum);\r\n }\r\n\r\n // This is menu only code\r\n /**\r\n * Turns off Incognito mode. This can only happen once if the user clicks the icon. This will modify URL state\r\n */\r\n turnOffIncognito() {\r\n this.incognitoMode = false;\r\n const newRoute = this.readerService.getNextChapterUrl(this.router.url, this.chapterId, this.incognitoMode, this.readingListMode, this.readingListId);\r\n window.history.replaceState({}, '', newRoute);\r\n this.toastr.info(translate('toasts.incognito-off'));\r\n if (!this.bookmarkMode) {\r\n this.readerService.saveProgress(this.libraryId, this.seriesId, this.volumeId, this.chapterId, this.pageNum).pipe(take(1)).subscribe(() => {/* No operation */});\r\n }\r\n }\r\n\r\n // This is menu only code\r\n openShortcutModal() {\r\n const ref = this.modalService.open(ShortcutsModalComponent, { scrollable: true, size: 'md' });\r\n ref.componentInstance.shortcuts = [\r\n {key: '⇽', description: 'prev-page'},\r\n {key: '⇾', description: 'next-page'},\r\n {key: '↑', description: 'prev-page'},\r\n {key: '↓', description: 'next-page'},\r\n {key: 'G', description: 'go-to'},\r\n {key: 'B', description: 'bookmark'},\r\n {key: translate('shortcuts-modal.double-click'), description: 'bookmark'},\r\n {key: 'ESC', description: 'close-reader'},\r\n {key: 'SPACE', description: 'toggle-menu'},\r\n ];\r\n }\r\n\r\n // menu only code\r\n savePref() {\r\n const modelSettings = this.generalSettingsForm.value;\r\n // Get latest preferences from user, overwrite with what we manage in this UI, then save\r\n this.accountService.currentUser$.pipe(take(1)).subscribe(user => {\r\n if (!user) return;\r\n const data = {...user.preferences};\r\n data.layoutMode = parseInt(modelSettings.layoutMode, 10);\r\n data.readerMode = this.readerMode;\r\n data.autoCloseMenu = this.autoCloseMenu;\r\n data.readingDirection = this.readingDirection;\r\n data.emulateBook = modelSettings.emulateBook;\r\n data.swipeToPaginate = modelSettings.swipeToPaginate;\r\n data.pageSplitOption = parseInt(modelSettings.pageSplitOption, 10);\r\n data.locale = data.locale || 'en';\r\n\r\n this.accountService.updatePreferences(data).subscribe(updatedPrefs => {\r\n this.toastr.success(translate('manga-reader.user-preferences-updated'));\r\n if (this.user) {\r\n this.user.preferences = updatedPrefs;\r\n this.cdRef.markForCheck();\r\n }\r\n })\r\n });\r\n }\r\n\r\n translatePrefOptions(o: {text: string, value: any}) {\r\n const d = {...o};\r\n d.text = translate('preferences.' + o.text);\r\n return d;\r\n }\r\n\r\n}\r\n","\r\n
\r\n @if(debugMode) {\r\n
\r\n @for(img of cachedImages; track img.src) {\r\n \r\n {{this.readerService.imageUrlToPageNum(img.src)}}\r\n \r\n }\r\n
\r\n }\r\n
\r\n
\r\n \r\n\r\n
\r\n
{{title}} ({{t('incognito-title')}})
\r\n
\r\n {{subtitle}} 0\">{{t('series-progress', {percentage: (Math.min(1, ((totalSeriesPagesRead + pageNum) / totalSeriesPages)) | percent)}) }}\r\n
\r\n
\r\n\r\n
\r\n \r\n @if (!bookmarkMode && hasBookmarkRights) {\r\n \r\n }\r\n
\r\n
\r\n
\r\n \r\n
\r\n\r\n \r\n
\r\n \r\n \r\n
\r\n\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n
\r\n\r\n
\r\n\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n \r\n
\r\n \r\n \r\n
0; else noSlider\">\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n  \r\n
\r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n  \r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n  \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {{generalSettingsForm.get('darkness')?.value + '%'}}\r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n","import { Routes } from '@angular/router';\r\nimport { MangaReaderComponent } from '../manga-reader/_components/manga-reader/manga-reader.component';\r\n\r\nexport const routes: Routes = [\r\n {\r\n path: ':chapterId',\r\n component: MangaReaderComponent\r\n },\r\n {\r\n // This will allow the MangaReader to have a list to use for next/prev chapters rather than natural sort order\r\n path: ':chapterId/list/:listId',\r\n component: MangaReaderComponent\r\n }\r\n];\r\n\r\n"],"mappings":"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","names":["w","matchMedia","passiveOptionAccessed","options","noop","supportsPassiveEvents","supportsPointerEvents","onTouchStartInWindow","touchEventInWindow","supportsTouchEvents","hasTouch","userAgent","isIPad","hasCoarsePrimaryPointer","hasAnyHoverOrAnyFinePointer","_c0","a0","a1","a2","TooltipWrapperComponent_ng_container_0_1_ng_template_0_Template","rf","ctx","TooltipWrapperComponent_ng_container_0_1_Template","ɵɵtemplate","TooltipWrapperComponent_ng_container_0_Template","ɵɵelementContainerStart","ɵɵelementContainerEnd","ctx_r0","ɵɵnextContext","ɵɵadvance","ɵɵproperty","ɵɵpureFunction3","TooltipWrapperComponent_ng_container_1_Template","ɵɵelementStart","ɵɵtext","ɵɵelementEnd","ɵɵattribute","ɵɵtextInterpolate1","_c1","_c2","_c3","_c4","_c5","_c6","_c7","_c8","_c9","_c10","_c11","_c12","_c13","_c14","SliderComponent_span_28_ngx_slider_tooltip_wrapper_2_Template","ɵɵelement","t_r1","ctx_r1","SliderComponent_span_28_span_3_Template","SliderComponent_span_28_span_4_Template","ɵɵsanitizeHtml","SliderComponent_span_28_Template","ɵɵpureFunction1","LabelType","Options","AllowUnsafeHtmlInSlider","InjectionToken","PointerType","ChangeContext","ValueHelper","value","array1","array2","i","val","minVal","maxVal","range","percent","modelValue","stepsArray","differences","step","minDifferenceIndex","index","CompatibilityHelper","event","MathHelper","precisionLimit","modulo","limit","floor","ceil","EventListener","EventListenerHelper","renderer","nativeElement","eventName","callback","throttleInterval","supportsPassiveEvents","listener","Subject","observerCallback","tap","throttleTime","eventListener","SliderElementDirective","elemRef","changeDetectionRef","hide","vertical","scale","rotate","pos","dim","debounceInterval","listenersToKeep","listenersToRemove","t","ɵɵdirectiveInject","ElementRef","Renderer2","ChangeDetectorRef","ɵɵdefineDirective","ɵɵstyleProp","SliderHandleDirective","ɵɵclassProp","ɵɵInheritDefinitionFeature","SliderLabelDirective","allowUnsafeHtmlInSlider","recalculateDimension","TooltipWrapperComponent","ɵɵdefineComponent","NgIf","NgTemplateOutlet","Tick","Dragging","ModelValues","x","y","ModelChange","NGX_SLIDER_CONTROL_VALUE_ACCESSOR","NG_VALUE_ACCESSOR","forwardRef","SliderComponent","EventEmitter","Options","manualRefresh","triggerFocus","pointerType","ValueHelper","Subject","Dragging","renderer","elementRef","changeDetectionRef","zone","allowUnsafeHtmlInSlider","EventListenerHelper","changes","obj","onChangeCallback","onTouchedCallback","isDisabled","ariaLabel","event","distinctUntilChanged","ModelChange","filter","modelChange","CompatibilityHelper","PointerType","modelValue","viewValue","sliderValue","step","normalisedModelChange","normalisationChange","ModelValues","emitOutputs","input","normalisedInput","valueIndex","highValueIndex","MathHelper","tempValue","previousModelValues","normalisedModelValues","previousOptionsInfluencingEventBindings","newOptionsInfluencingEventBindings","rebindEvents","minValue","maxValue","value","hideLabelsForTicks","element","LabelType","handleWidth","ticksArray","translate","tickValueStep","hasAtLeastOneLegend","newTicks","position","translation","tick","Tick","legend","i","numberOfValues","index","center","which","newPos","labelType","labelDimension","nearHandlePos","endOfBarPos","floorLabelHidden","ceilLabelHidden","isMinLabelAtFloor","isMinLabelAtCeil","isMaxLabelAtCeil","isCombinedLabelAtFloor","isCombinedLabelAtCeil","hideCeil","hideFloor","label","pos","dim","floorPos","floorDim","ceilPos","ceilDim","dimension","isSelectionBarFromRight","positionForRange","centerPosition","offset","reversed","direction","color","isLabelOverlap","lowDisplayValue","highDisplayValue","combinedLabelValue","customStep","steppedDifference","val","fn","percent","targetTouchId","touchIndex","touches","sliderElementBoundingRect","sliderPos","eventPos","distanceMin","distanceMax","draggableRange","options","bindMove","bindEnd","simulateImmediateMove","simulateImmediateEnd","supportsPassiveEvents","pointerElement","onMoveCallback","e","onEndCallback","fromTick","touchForThisSlider","changedTouches","newValue","ceilValue","floorValue","pointer","currentValue","valueRange","increaseStep","decreaseStep","increasePage","decreasePage","actions","keyCode","keys","key","action","actionValue","difference","newMinValue","newMaxValue","outOfBounds","isAbove","isRTL","ceilLimit","floorLimit","floorHandleElement","ceilHandleElement","isUnderFloorLimit","isOverCeilLimit","oppositeValue","minRange","maxRange","changeContext","ChangeContext","t","ɵɵdirectiveInject","Renderer2","ElementRef","ChangeDetectorRef","NgZone","AllowUnsafeHtmlInSlider","ɵɵdefineComponent","rf","ctx","dirIndex","ɵɵcontentQuery","_c1","_t","ɵɵqueryRefresh","ɵɵloadQuery","ɵɵviewQuery","_c2","SliderElementDirective","_c3","_c4","_c5","_c6","SliderHandleDirective","_c7","_c8","SliderLabelDirective","_c9","_c10","_c11","_c12","_c13","ɵɵlistener","$event","ɵɵresolveWindow","ɵɵattribute","ɵɵclassProp","ɵɵProvidersFeature","ɵɵNgOnChangesFeature","ɵɵelementStart","ɵɵelement","ɵɵelementEnd","ɵɵtemplate","SliderComponent_span_28_Template","ɵɵadvance","ɵɵproperty","ɵɵstyleProp","NgClass","NgForOf","NgIf","NgStyle","TooltipWrapperComponent","NgxSliderModule","ɵɵdefineNgModule","ɵɵdefineInjector","CommonModule","ɵɵelementStart","ɵɵtext","ɵɵelementEnd","ɵɵadvance","ɵɵtextInterpolate","shortcut_r3","key","ɵɵtextInterpolate1","t_r4","description","ɵɵelementContainerStart","ɵɵlistener","ɵɵrestoreView","_r1","ctx_r1","ɵɵnextContext","ɵɵresetView","close","ɵɵtemplate","ShortcutsModalComponent_ng_container_0_div_7_Template","ɵɵproperty","shortcuts","ShortcutsModalComponent","constructor","modal","ɵɵdirectiveInject","NgbActiveModal","selectors","inputs","standalone","features","ɵɵStandaloneFeature","decls","vars","consts","template","rf","ctx","ShortcutsModalComponent_ng_container_0_Template","CommonModule","NgForOf","NgbModalModule","TranslocoDirective","changeDetection","_ShortcutsModalComponent","ManagaReaderService","constructor","rendererFactory","readerService","pageDimensions","pairs","renderer","createRenderer","load","chapterInfo","forEach","d","pageNumber","height","width","isWide","doublePairs","adjustForDoubleReader","page","hasOwnProperty","getPageDimensions","pageNum","isWidePage","maxHeight","Object","values","reduce","max","obj","Math","maxWidth","isCoverImage","isNoSplit","pageSplitOption","splitValue","parseInt","PageSplitOption","NoSplit","FitSplit","isSplitLeftToRight","SplitLeftToRight","isSecondLastImage","maxPages","isLastImage","shouldSplit","img","needsSplitting","imageUrlToPageNum","src","shouldRenderAsFitSplit","translateScalingOption","option","ScalingOption","Automatic","windowWidth","window","innerWidth","document","documentElement","clientWidth","body","windowHeight","innerHeight","clientHeight","ratio","FITTING_OPTION","WIDTH","HEIGHT","FitToHeight","FitToWidth","ORIGINAL","applyBookmarkEffect","elements","length","elem","addClass","setTimeout","removeClass","ɵɵinject","RendererFactory2","ReaderService","factory","ɵfac","providedIn","_ManagaReaderService","SafeStylePipe","constructor","sanitizer","inject","DomSanitizer","transform","style","bypassSecurityTrustStyle","pure","standalone","_SafeStylePipe","ValidSplits","PageSplitOption","SplitLeftToRight","SplitRightToLeft","CanvasRendererComponent","constructor","cdRef","mangaReaderService","readerService","imageHeight","EventEmitter","destroyRef","inject","DestroyRef","currentImageSplitPart","SPLIT_PAGE_PART","NO_SPLIT","pagingDirection","PAGING_DIRECTION","FORWARD","fit","FITTING_OPTION","ORIGINAL","pageSplit","FitSplit","layoutMode","LayoutMode","Single","canvasImage","darkness$","of","renderWithCanvas","ngOnInit","readerSettings$","pipe","takeUntilDestroyed","tap","value","fitting","rerenderNeeded","reset","subscribe","map","values","darkness","filter","_","isValid","imageFitClass$","WIDTH","isWidePage","imageUrlToPageNum","src","shouldRenderAsFitSplit","bookmark$","canvas","elements","nativeElement","applyBookmarkEffect","showClickOverlayClass$","showClickOverlay$","showOverlay","ngAfterViewInit","ctx","getContext","alpha","updateSplitPage","needsSplitting","isNoSplit","splitLeftToRight","isSplitLeftToRight","LEFT_PART","RIGHT_PART","r2lSplittingPart","l2rSplittingPart","BACKWARDS","renderPage","img","length","markForCheck","includes","setCanvasSize","width","drawImage","height","getPageAmount","direction","shouldMoveNext","shouldMovePrev","isSafari","navigator","platform","userAgent","document","canvasLimit","emit","getBookmarkPageCount","ɵɵdirectiveInject","ChangeDetectorRef","ManagaReaderService","ReaderService","selectors","viewQuery","rf","ɵɵelementStart","ɵɵelement","ɵɵelementEnd","ɵɵclassMapInterpolate1","ɵɵpipeBind1","ɵɵstyleProp","tmp_2_0","undefined","ɵɵproperty","ɵɵpureFunction1","_c1","ɵɵadvance","ɵɵclassMap","NgClass","AsyncPipe","SafeStylePipe","styles","changeDetection","_CanvasRendererComponent","ɵɵelementContainerStart","ɵɵelement","ɵɵadvance","ɵɵclassMapInterpolate3","ɵɵpipeBind1","ctx_r0","imageFitClass$","readerModeClass$","showClickOverlayClass$","ɵɵproperty","currentImage","src","ɵɵsanitizeUrl","currentImage2","ɵɵelementStart","ɵɵtemplate","DoubleRendererComponent_ng_container_0_ng_container_8_Template","DoubleRendererComponent_ng_container_0_ng_container_9_Template","ɵɵelementEnd","layoutClass$","emulateBookClass$","ɵɵstyleProp","tmp_2_0","darkness$","undefined","ɵɵpureFunction1","_c0","shouldRenderDouble$","DoubleRendererComponent","constructor","cdRef","mangaReaderService","document","readerService","imageHeight","EventEmitter","destroyRef","inject","DestroyRef","debugMode","of","layoutMode","LayoutMode","Single","pageSplit","PageSplitOption","FitSplit","pageNum","maxPages","Image","ReaderMode","ngOnInit","readerSettings$","pipe","map","values","readerMode","mode","LeftRight","UpDown","filter","_","isValid","takeUntilDestroyed","darkness","data","emulateBook","enabled","showClickOverlay$","showOverlay","pageNum$","tap","pageInfo","getPage","markForCheck","subscribe","shouldRenderDouble","fitting","shareReplay","combineLatest","value","FITTING_OPTION","WIDTH","HEIGHT","ORIGINAL","isWidePage","bookmark$","elements","image1","querySelector","push","image2","applyBookmarkEffect","isCoverImage","debugLog","isSecondLastImage","isLastImage","Double","renderPage","img","length","height","emit","Math","max","shouldMovePrev","shouldMoveNext","getPageAmount","direction","PAGING_DIRECTION","FORWARD","BACKWARDS","adjustForDoubleReader","reset","getBookmarkPageCount","message","extraData","console","log","ɵɵdirectiveInject","ChangeDetectorRef","ManagaReaderService","DOCUMENT","ReaderService","selectors","inputs","image$","outputs","standalone","features","ɵɵStandaloneFeature","decls","vars","consts","template","rf","ctx","DoubleRendererComponent_ng_container_0_Template","NgIf","NgClass","AsyncPipe","SafeStylePipe","styles","changeDetection","_DoubleRendererComponent","ɵɵelementContainerStart","ɵɵelement","ɵɵadvance","ɵɵclassMapInterpolate3","ɵɵpipeBind1","ctx_r0","imageFitClass$","readerModeClass$","showClickOverlayClass$","ɵɵproperty","leftImage","src","ɵɵsanitizeUrl","rightImage","ɵɵelementStart","ɵɵtemplate","DoubleReverseRendererComponent_ng_container_0_ng_container_8_Template","DoubleReverseRendererComponent_ng_container_0_ng_container_9_Template","ɵɵelementEnd","ɵɵclassMapInterpolate2","layoutClass$","emulateBookClass$","ɵɵstyleProp","tmp_2_0","darkness$","undefined","ɵɵpureFunction2","_c0","shouldRenderDouble$","DoubleReverseRendererComponent","ReaderMode","FITTING_OPTION","LayoutMode","constructor","cdRef","mangaReaderService","document","readerService","imageHeight","EventEmitter","destroyRef","inject","DestroyRef","debugMode","of","layoutMode","Single","pageSplit","PageSplitOption","FitSplit","pageNum","maxPages","Image","ngOnInit","readerSettings$","pipe","filter","_","isValid","map","values","readerMode","mode","LeftRight","UpDown","takeUntilDestroyed","darkness","data","emulateBook","enabled","showClickOverlay$","showOverlay","pageNum$","tap","pageInfo","getPage","subscribe","shouldRenderDouble","shareReplay","fitting","combineLatest","value","WIDTH","HEIGHT","ORIGINAL","isWidePage","markForCheck","bookmark$","elements","image1","querySelector","push","image2","applyBookmarkEffect","isCoverImage","debugLog","isSecondLastImage","isLastImage","DoubleReversed","renderPage","img","length","emit","Math","max","height","shouldMovePrev","shouldMoveNext","getPageAmount","direction","PAGING_DIRECTION","FORWARD","BACKWARDS","adjustForDoubleReader","reset","getBookmarkPageCount","message","extraData","console","log","ɵɵdirectiveInject","ChangeDetectorRef","ManagaReaderService","DOCUMENT","ReaderService","selectors","inputs","image$","outputs","standalone","features","ɵɵStandaloneFeature","decls","vars","consts","template","rf","ctx","DoubleReverseRendererComponent_ng_container_0_Template","NgIf","NgClass","AsyncPipe","SafeStylePipe","styles","changeDetection","_DoubleReverseRendererComponent","ɵɵelement","ɵɵstyleMapInterpolate1","ɵɵpipeBind1","ctx_r0","widthOverride$","ɵɵclassMapInterpolate3","imageFitClass$","readerModeClass$","showClickOverlayClass$","ɵɵproperty","currentImage","src","ɵɵsanitizeUrl","ɵɵelementStart","ɵɵtemplate","SingleRendererComponent_Conditional_0_Conditional_7_Template","ɵɵelementEnd","ɵɵclassMapInterpolate2","emulateBookClass$","ɵɵstyleProp","tmp_2_0","darkness$","undefined","tmp_3_0","imageContainerHeight$","ɵɵadvance","ɵɵconditional","SingleRendererComponent","ReaderMode","LayoutMode","constructor","cdRef","mangaReaderService","document","imageHeight","EventEmitter","destroyRef","inject","DestroyRef","of","layoutMode","Single","pageSplit","PageSplitOption","FitSplit","pageNum","maxPages","Observable","ngOnInit","readerSettings$","pipe","map","values","readerMode","mode","LeftRight","UpDown","filter","_","isValid","takeUntilDestroyed","parseInt","widthSlider","data","emulateBook","enabled","image$","switchMap","img","markForCheck","calculateImageContainerHeight$","pageNum$","tap","pageInfo","subscribe","darkness","showClickOverlay$","showOverlay","bookmark$","elements","image1","querySelector","push","applyBookmarkEffect","combineLatest","fitting","fit","isWidePage","shouldRenderAsFitSplit","FITTING_OPTION","WIDTH","shareReplay","refCount","bufferSize","HEIGHT","readingArea","width","scrollWidth","renderPage","length","emit","height","shouldMovePrev","shouldMoveNext","getPageAmount","direction","shouldSplit","reset","getBookmarkPageCount","ɵɵdirectiveInject","ChangeDetectorRef","ManagaReaderService","DOCUMENT","selectors","inputs","outputs","standalone","features","ɵɵStandaloneFeature","decls","vars","consts","template","rf","ctx","SingleRendererComponent_Conditional_0_Template","AsyncPipe","SafeStylePipe","styles","changeDetection","_SingleRendererComponent","ɵɵelementContainerStart","ɵɵelement","ɵɵadvance","ɵɵclassMapInterpolate3","ɵɵpipeBind1","ctx_r0","imageFitClass$","readerModeClass$","showClickOverlayClass$","ɵɵproperty","currentImage","src","ɵɵsanitizeUrl","currentImage2","ɵɵelementStart","ɵɵtemplate","DoubleNoCoverRendererComponent_ng_container_0_ng_container_8_Template","DoubleNoCoverRendererComponent_ng_container_0_ng_container_9_Template","ɵɵelementEnd","layoutClass$","emulateBookClass$","ɵɵstyleProp","tmp_2_0","darkness$","undefined","ɵɵpureFunction1","_c0","shouldRenderDouble$","DoubleNoCoverRendererComponent","ReaderMode","FITTING_OPTION","LayoutMode","constructor","cdRef","mangaReaderService","document","readerService","imageHeight","EventEmitter","destroyRef","inject","DestroyRef","debugMode","of","layoutMode","Single","pageSplit","PageSplitOption","FitSplit","pageNum","maxPages","Image","ngOnInit","readerSettings$","pipe","map","values","readerMode","mode","LeftRight","UpDown","filter","_","isValid","takeUntilDestroyed","darkness","data","emulateBook","enabled","showClickOverlay$","showOverlay","pageNum$","tap","pageInfo","getPage","markForCheck","subscribe","shouldRenderDouble","fitting","shareReplay","combineLatest","value","WIDTH","HEIGHT","ORIGINAL","bookmark$","elements","image1","querySelector","push","image2","applyBookmarkEffect","isWidePage","debugLog","isSecondLastImage","isLastImage","DoubleNoCover","renderPage","img","length","height","emit","Math","max","shouldMovePrev","shouldMoveNext","getPageAmount","direction","PAGING_DIRECTION","FORWARD","isCoverImage","BACKWARDS","adjustForDoubleReader","reset","getBookmarkPageCount","message","extraData","console","log","ɵɵdirectiveInject","ChangeDetectorRef","ManagaReaderService","DOCUMENT","ReaderService","selectors","inputs","image$","outputs","standalone","features","ɵɵStandaloneFeature","decls","vars","consts","template","rf","ctx","DoubleNoCoverRendererComponent_ng_container_0_Template","NgIf","NgClass","AsyncPipe","SafeStylePipe","styles","changeDetection","_DoubleNoCoverRendererComponent","FullscreenIconPipe","transform","isFullscreen","pure","standalone","_FullscreenIconPipe","ReaderModeIconPipe","transform","readerMode","ReaderMode","LeftRight","UpDown","Webtoon","pure","standalone","_ReaderModeIconPipe","FittingIconPipe","transform","fit","FITTING_OPTION","HEIGHT","WIDTH","ORIGINAL","pure","standalone","_FittingIconPipe","ɵɵelementStart","ɵɵtext","ɵɵelementEnd","ɵɵadvance","ɵɵtextInterpolate1","ctx_r1","isScrolling","allImagesLoaded","ɵɵtextInterpolate2","isScrollingForwards","minPageLoaded","maxPageLoaded","pageNum","totalPages","atTop","atBottom","getTotalHeight","getTotalScroll","getScrollTop","ɵɵlistener","ɵɵrestoreView","_r3","ɵɵnextContext","ɵɵresetView","loadPrevChapter","emit","ɵɵelement","ɵɵtextInterpolate","t_r4","$event","_r5","onImageLoad","ɵɵclassMapInterpolate2","item_r6","page","showDebugOutline","areImagesWiderThanWindow","ɵɵstyleProp","ɵɵpipeBind1","tmp_14_0","darkness$","undefined","ɵɵpropertyInterpolate","src","ɵɵsanitizeUrl","ɵɵpropertyInterpolate1","ɵɵproperty","ɵɵpureFunction1","_c1","widthOverride$","ɵɵelementContainerStart","ɵɵtemplate","InfiniteScrollerComponent_ng_container_0_Conditional_1_Template","InfiniteScrollerComponent_ng_container_0_Conditional_2_Template","ɵɵrepeaterCreate","InfiniteScrollerComponent_ng_container_0_For_5_Template","_forTrack0","_r1","loadNextChapter","ɵɵconditional","showDebugBar","ɵɵrepeater","webtoonImages","SPACER_SCROLL_INTO_PX","InfiniteScrollerComponent","Math","min","Object","values","imagesLoaded","max","_","innerWidth","getInnerDimensions","webtoonImageWidth","document","body","clientWidth","constructor","mangaReaderService","inject","ManagaReaderService","readerService","ReaderService","renderer","Renderer2","scrollService","ScrollService","cdRef","ChangeDetectorRef","destroyRef","DestroyRef","bufferPages","pageNumberChange","EventEmitter","bookmarkPage","ReplaySubject","fullscreenToggled","bottomSpacerIntersectionObserver","IntersectionObserver","entries","handleBottomIntersection","threshold","of","BehaviorSubject","intersectionObserver","handleIntersection","scrollingDirection","PAGING_DIRECTION","FORWARD","prevScrollPosition","currentPageElem","window","documentElement","isFullscreenMode","previousScrollHeightMinusTop","initFinished","debugMode","debugLogFilter","Observable","widthSliderValue$","reader","querySelector","readerElemRef","ElementRef","ngOnChanges","changes","hasOwnProperty","previousValue","currentValue","markForCheck","initWebtoonReader","ngOnDestroy","disconnect","initScrollHandler","fromEvent","nativeElement","pipe","debounceTime","takeUntilDestroyed","subscribe","event","handleScrollEvent","handleScrollEndEvent","ngOnInit","recalculateImageWidth","readerSettings$","map","darkness","parseInt","widthSlider","val","Array","from","querySelectorAll","forEach","img","setStyle","getBoundingClientRect","top","scrollIntoView","goToPage","debugLog","BACKWARDS","setPageNum","image","addClass","setTimeout","removeClass","isFullscreen","ngAfterViewInit","observe","bottomSpacer","getVerticalOffset","offset","Window","scrollY","scrollTop","verticalOffset","isElementVisible","midlineImages","filter","entry","shouldElementCountAsCurrentPage","length","getAttribute","checkIfShouldTriggerContinuousReader","closestImages","findClosestVisibleImage","totalHeight","height","round","offsetHeight","totalScroll","requestAnimationFrame","scrollHeight","scrollTo","innerHeight","clientHeight","elem","rect","bottom","right","left","topX","abs","images","closestImage","closestDistanceToTop","Number","MAX_VALUE","distanceToTop","next","startingIndex","endingIndex","calculatePrefetchIndecies","i","loadWebtoonImage","imagePage","imageUrlToPageNum","target","width","setAttribute","maxWidth","attachIntersectionObserverElem","Promise","all","complete","resolve","onload","onerror","then","scrollToCurrentPage","isIntersecting","attributes","getNamedItem","value","prefetchWebtoonImages","scrollToPage","behavior","data","concat","urlProvider","sort","a","b","console","error","temp","range","size","startAt","keys","message","extraData","str","replace","startsWith","log","ɵɵdirectiveInject","DOCUMENT","selectors","viewQuery","rf","ctx","InfiniteScrollerComponent_ng_container_0_Template","AsyncPipe","TranslocoDirective","InfiniteScrollModule","InfiniteScrollDirective","SafeStylePipe","NgStyle","styles","changeDetection","_InfiniteScrollerComponent","SwipeDirection","createSwipeSubscription","domElement","onSwipeMove","onSwipeEnd","HTMLElement","Error","touchStarts$","fromEvent","pipe","map","getTouchCoordinates","touchMoves$","touchEnds$","touchCancels$","switchMap","touchStartEvent","elementAt","touchMoveEvent","x","y","direction","getTouchDirection","getTouchDistance","tap","coordinates","getSwipeEvent","takeUntil","race","touchEndEvent","subscribe","touchEvent","changedTouches","clientX","clientY","startCoordinates","moveCoordinates","Math","abs","Y","X","distance","SwipeDirective","constructor","elementRef","zone","swipeMove","EventEmitter","swipeEnd","ngOnInit","runOutsideAngular","swipeSubscription","createSwipeSubscription","domElement","nativeElement","onSwipeMove","swipeMoveEvent","emit","onSwipeEnd","swipeEndEvent","ngOnDestroy","unsubscribe","ɵɵdirectiveInject","ElementRef","NgZone","selectors","outputs","standalone","_SwipeDirective","ɵɵelementContainerStart","ɵɵelementStart","ɵɵtext","ɵɵelementEnd","ɵɵadvance","ɵɵproperty","ɵɵpureFunction2","_c5","imageNum_r2","ctx_r3","pageNum","img_r3","complete","ɵɵtextInterpolate","readerService","imageUrlToPageNum","src","ɵɵtemplate","MangaReaderComponent_ng_container_0_Conditional_3_For_2_ng_container_0_Template","ɵɵrepeaterCreate","MangaReaderComponent_ng_container_0_Conditional_3_For_2_Template","_forTrack0","ɵɵrepeater","cachedImages","ɵɵlistener","ɵɵrestoreView","_r6","ɵɵnextContext","ɵɵresetView","turnOffIncognito","ɵɵelement","t_r7","ɵɵpureFunction1","_c6","ɵɵpipeBind1","Math","min","totalSeriesPagesRead","totalSeriesPages","_r8","bookmarkPage","ɵɵpropertyInterpolate","CurrentPageBookmarked","ɵɵclassMapInterpolate1","_r5","closeReader","MangaReaderComponent_ng_container_0_div_4_span_9_Template","MangaReaderComponent_ng_container_0_div_4_span_12_Template","openShortcutModal","MangaReaderComponent_ng_container_0_div_4_Conditional_18_Template","menuOpen","ɵɵtextInterpolate1","title","incognitoMode","subtitle","ɵɵconditional","bookmarkMode","hasBookmarkRights","ɵɵclassMapInterpolate2","readingDirection","ReadingDirection","RightToLeft","readerMode","ReaderMode","LeftRight","LeftToRight","$event","_r9","handlePageChange","KeyDirection","Left","MangaReaderComponent_ng_container_0_ng_container_9_div_5_Template","Right","MangaReaderComponent_ng_container_0_ng_container_9_div_7_Template","readerSettings$","currentImage$","showBookmarkEffect$","showClickOverlay$","clickOverlayClass","_c7","MaxHeight","showClickOverlay","ɵɵpureFunction3","_c8","RightPaginationOffset","pageNum$","getPageFn","_r10","handleWebtoonPageChange","loadNextChapter","loadPrevChapter","goToPageEvent","maxPages","getPageUrl","showBookmarkEffectEvent","fullscreenEvent","MangaReaderComponent_ng_container_0_ng_template_10_div_0_Template","isLoading","inSetup","_r13","sliderPageUpdate","startMenuCloseTimer","sliderDragUpdate","cancelMenuCloseTimer","pageOptions","refreshSlider","_r14","_r12","resetMenuCloseTimer","goToPage","MangaReaderComponent_ng_container_0_div_12_div_1_div_7_Template","MangaReaderComponent_ng_container_0_div_12_div_1_ng_template_8_Template","ɵɵtemplateRefExtractor","prevChapterDisabled","prevPageDisabled","ceil","noSlider_r15","nextPageDisabled","nextChapterDisabled","opt_r17","value","text","opt_r18","widthOverrideLabel_r19","MangaReaderComponent_ng_container_0_div_12_div_25_option_10_Template","MangaReaderComponent_ng_container_0_div_12_div_25_ng_container_30_Template","MangaReaderComponent_ng_container_0_div_12_div_25_ng_container_31_Template","MangaReaderComponent_ng_container_0_div_12_div_25_ng_container_32_Template","MangaReaderComponent_ng_container_0_div_12_div_25_option_34_Template","MangaReaderComponent_ng_container_0_div_12_div_25_Conditional_65_Template","MangaReaderComponent_ng_container_0_div_12_div_25_Conditional_67_Template","_r16","savePref","generalSettingsForm","ɵɵclassMap","SplitIconClass","pageSplitOptionsTranslated","FittingOption","layoutMode","LayoutMode","Single","Double","DoubleReversed","layoutModesTranslated","tmp_25_0","get","tmp_27_0","widthOverrideLabel$","MangaReaderComponent_ng_container_0_div_12_div_1_Template","_r11","setReadingDirection","toggleReaderMode","toggleFullscreen","settingsOpen","MangaReaderComponent_ng_container_0_div_12_div_25_Template","undefined","Webtoon","UpDown","isFullscreen","MangaReaderComponent_ng_container_0_Conditional_3_Template","MangaReaderComponent_ng_container_0_div_4_Template","_r1","onSwipeEnd","onSwipeMove","MangaReaderComponent_ng_container_0_ng_container_9_Template","MangaReaderComponent_ng_container_0_ng_template_10_Template","MangaReaderComponent_ng_container_0_div_12_Template","_c3","debugMode","tmp_8_0","_c4","backgroundColor","webtoon_r20","PREFETCH_PAGES","CHAPTER_ID_NOT_FETCHED","CHAPTER_ID_DOESNT_EXIST","ANIMATION_SPEED","OVERLAY_AUTO_CLOSE_TIME","CLICK_OVERLAY_TIMEOUT","ChapterInfoPosition","MangaReaderComponent","bookmarks","hasOwnProperty","WindowWidth","readingArea","nativeElement","scrollWidth","ImageHeight","FITTING_OPTION","HEIGHT","mangaReaderService","getPageDimensions","height","clientHeight","WIDTH","scrollLeft","isSplitLeftToRight","pageSplitOption","isNoSplit","ReadingAreaWidth","clientWidth","ReadingAreaHeight","scrollHeight","constructor","document","destroyRef","inject","DestroyRef","route","ActivatedRoute","router","Router","accountService","AccountService","formBuilder","FormBuilder","navService","NavService","memberService","MemberService","modalService","NgbModal","cdRef","ChangeDetectorRef","toastr","ToastrService","ReaderService","utilityService","UtilityService","ManagaReaderService","Breakpoint","readingListId","readingListMode","scalingOption","ScalingOption","FitToHeight","PageSplitOption","FitSplit","autoCloseMenu","readerModeSubject","BehaviorSubject","readerMode$","asObservable","pagingDirection","PAGING_DIRECTION","FORWARD","pagingDirectionSubject","pagingDirection$","pageSplitOptions","map","translatePrefOptions","layoutModes","canvasImage","Image","continuousChaptersStack","Stack","continuousChapterInfos","ReplaySubject","floor","step","boundPointerLabels","showSelectionBar","translate","label","LabelType","Floor","Ceil","animate","EventEmitter","showClickOverlaySubject","nextChapterId","prevChapterId","nextChapterPrefetched","prevChapterPrefetched","libraryType","LibraryType","Manga","rightPaginationOffset","prevScrollLeft","prevScrollTop","prevIsHorizontalScrollLeft","prevIsVerticalScrollLeft","hasHitRightScroll","hasScrolledX","hasScrolledY","hasHitZeroScroll","hasHitZeroTopScroll","hasHitBottomTopScroll","Observable","currentImage","pipe","shareReplay","refCount","bufferSize","pageNumSubject","chapterId","getBookmarkPageUrl","seriesId","user","apiKey","hideNavBar","hideSideNav","markForCheck","ngOnInit","libraryId","snapshot","paramMap","navigateByUrl","getPage","bind","parseInt","queryParamMap","push","currentUser$","take","subscribe","hasBookmarkRole","hasAdminRole","preferences","setOverrideStyles","nonNullable","group","FormControl","fittingOption","translateScalingOption","widthSlider","darkness","emulateBook","swipeToPaginate","next","merge","valueChanges","_","createReaderSettingsUpdate","takeUntilDestroyed","updateForm","distinctUntilChanged","tap","dir","mode","disableDoubleRendererIfScreenTooSmall","setupWidthOverrideTriggers","val","changeOccurred","setValue","enable","NoSplit","disable","setPageNum","adjustPagesForDoubleRenderer","loadPage","isWidePage","canvasRenderer","reset","hasReadingProgress","progress","toggleMenu","info","init","ngAfterViewInit","fromEvent","debounceTime","event","detail","scrollTop","ngOnDestroy","resetOverrideStyles","showNavBar","showSideNav","disableWakeLock","onResize","handleKeyPress","key","KEY_CODES","RIGHT_ARROW","checkIfPaginationAllowed","nextPage","prevPage","LEFT_ARROW","UP_ARROW","Up","DOWN_ARROW","Down","ESC_KEY","stopPropagation","preventDefault","SPACE","G","goToPageNum","promptForPage","trim","B","F","H","widthOverrideControl","enableWidthOverride","disableWidthOverride","handleControlChanges","fitting","splitting","filter","v","values","pageSplit","adjustForDoubleReader","window","innerWidth","innerHeight","forceNew","img","find","imageUrlToChapterId","onload","evt","isHorizontalScrollLeft","isVerticalScrollLeft","direction","i","getBookmarkInfo","bookmarkInfo","seriesName","pages","load","newOptions","Object","assign","render","setTimeout","enableWakeLock","reader","forkJoin","getProgress","chapterInfo","getChapterInfo","getBookmarks","results","seriesFormat","MangaFormat","EPUB","PDF","params","getQueryParamsObject","navigate","getNavigationArray","queryParams","Current","volumeId","page","seriesTotalPages","seriesTotalPagesRead","forEach","bookmark","getNextChapter","getPrevChapter","menuTimeout","clearTimeout","resetSwipeModifiers","triggerSwipePagination","distance","pageAmount","max","getPageAmount","singleRenderer","doubleRenderer","doubleReverseRenderer","doubleNoCoverRenderer","isSplitRendering","SplitRightToLeft","includes","notInSplit","BACKWARDS","isASpread","shouldMovePrev","setCanvasImage","addEventListener","loadChapter","pop","prevChapter","peek","newRoute","getNextChapterUrl","url","history","replaceState","msg","entity","formatChapterName","toLowerCase","timeOut","warning","renderPage","scroll","prefetch","numOffset","index","length","showScreenHints","context","emit","res","Next","prefetchStartOfChapter","Previous","tempPageNum","saveProgress","n","Array","from","k","images","side","question","totalPages","prompt","detectChanges","updatedPageNum","isDouble","getBookmarkPageCount","apis","unbookmark","ref","open","ShortcutsModalComponent","scrollable","size","componentInstance","shortcuts","description","modelSettings","data","__spreadValues","locale","updatePreferences","updatedPrefs","success","o","d","ɵɵdirectiveInject","DOCUMENT","selectors","viewQuery","rf","ctx","CanvasRendererComponent","SingleRendererComponent","DoubleRendererComponent","DoubleReverseRendererComponent","DoubleNoCoverRendererComponent","ɵɵresolveWindow","ɵɵStandaloneFeature","decls","vars","consts","template","MangaReaderComponent_ng_container_0_Template","NgStyle","NgIf","LoadingComponent","SwipeDirective","InfiniteScrollerComponent","NgxSliderModule","SliderComponent","ReactiveFormsModule","ɵNgNoValidate","NgSelectOption","ɵNgSelectMultipleOption","DefaultValueAccessor","RangeValueAccessor","CheckboxControlValueAccessor","SelectControlValueAccessor","NgControlStatus","NgControlStatusGroup","FormGroupDirective","FormControlName","NgFor","NgSwitch","NgSwitchCase","FittingIconPipe","ReaderModeIconPipe","FullscreenIconPipe","TranslocoDirective","PercentPipe","NgClass","AsyncPipe","styles","animation","trigger","state","style","transform","transition","changeDetection","_MangaReaderComponent","routes","path","component","MangaReaderComponent"],"x_google_ignoreList":[0,1]}