@ks89/angular-modal-gallery 8.0.1 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/CONTRIBUTING.md +3 -3
  3. package/README.md +19 -25
  4. package/{esm2015/ks89-angular-modal-gallery.js → esm2020/ks89-angular-modal-gallery.mjs} +0 -0
  5. package/{esm2015/lib/components/accessibility-default.js → esm2020/lib/components/accessibility-default.mjs} +0 -0
  6. package/{esm2015/lib/components/accessible.component.js → esm2020/lib/components/accessible.component.mjs} +6 -6
  7. package/esm2020/lib/components/carousel/carousel-previews/carousel-previews.component.mjs +462 -0
  8. package/esm2020/lib/components/carousel/carousel.component.mjs +747 -0
  9. package/{esm2015/lib/components/components.js → esm2020/lib/components/components.mjs} +0 -0
  10. package/esm2020/lib/components/current-image/current-image.component.mjs +616 -0
  11. package/esm2020/lib/components/current-image/loading-spinner/loading-spinner.component.mjs +80 -0
  12. package/esm2020/lib/components/dots/dots.component.mjs +127 -0
  13. package/{esm2015/lib/components/modal-gallery/modal-gallery-ref.js → esm2020/lib/components/modal-gallery/modal-gallery-ref.mjs} +0 -0
  14. package/esm2020/lib/components/modal-gallery/modal-gallery.component.mjs +523 -0
  15. package/esm2020/lib/components/modal-gallery/modal-gallery.service.mjs +187 -0
  16. package/{esm2015/lib/components/modal-gallery/modal-gallery.tokens.js → esm2020/lib/components/modal-gallery/modal-gallery.tokens.mjs} +0 -0
  17. package/esm2020/lib/components/plain-gallery/plain-gallery.component.mjs +249 -0
  18. package/esm2020/lib/components/previews/previews.component.mjs +332 -0
  19. package/{esm2015/lib/components/upper-buttons/upper-buttons-default.js → esm2020/lib/components/upper-buttons/upper-buttons-default.mjs} +0 -0
  20. package/esm2020/lib/components/upper-buttons/upper-buttons.component.mjs +249 -0
  21. package/{esm2015/lib/directives/a-tag-bg-image.directive.js → esm2020/lib/directives/a-tag-bg-image.directive.mjs} +3 -3
  22. package/{esm2015/lib/directives/click-outside.directive.js → esm2020/lib/directives/click-outside.directive.mjs} +3 -3
  23. package/{esm2015/lib/directives/description.directive.js → esm2020/lib/directives/description.directive.mjs} +3 -3
  24. package/{esm2015/lib/directives/direction.directive.js → esm2020/lib/directives/direction.directive.mjs} +3 -3
  25. package/{esm2015/lib/directives/directives.js → esm2020/lib/directives/directives.mjs} +0 -0
  26. package/{esm2015/lib/directives/fallback-image.directive.js → esm2020/lib/directives/fallback-image.directive.mjs} +3 -3
  27. package/{esm2015/lib/directives/keyboard-navigation.directive.js → esm2020/lib/directives/keyboard-navigation.directive.mjs} +5 -5
  28. package/{esm2015/lib/directives/margin.directive.js → esm2020/lib/directives/margin.directive.mjs} +3 -3
  29. package/{esm2015/lib/directives/max-size.directive.js → esm2020/lib/directives/max-size.directive.mjs} +3 -3
  30. package/{esm2015/lib/directives/size.directive.js → esm2020/lib/directives/size.directive.mjs} +3 -3
  31. package/{esm2015/lib/directives/wrap.directive.js → esm2020/lib/directives/wrap.directive.mjs} +3 -3
  32. package/{esm2015/lib/modal-gallery.module.js → esm2020/lib/modal-gallery.module.mjs} +7 -7
  33. package/{esm2015/lib/model/accessibility.interface.js → esm2020/lib/model/accessibility.interface.mjs} +0 -0
  34. package/{esm2015/lib/model/action.enum.js → esm2020/lib/model/action.enum.mjs} +0 -0
  35. package/{esm2015/lib/model/buttons-config.interface.js → esm2020/lib/model/buttons-config.interface.mjs} +0 -0
  36. package/{esm2015/lib/model/carousel-config.interface.js → esm2020/lib/model/carousel-config.interface.mjs} +1 -1
  37. package/{esm2015/lib/model/carousel-image-config.interface.js → esm2020/lib/model/carousel-image-config.interface.mjs} +0 -0
  38. package/{esm2015/lib/model/carousel-preview-config.interface.js → esm2020/lib/model/carousel-preview-config.interface.mjs} +0 -0
  39. package/{esm2015/lib/model/current-image-config.interface.js → esm2020/lib/model/current-image-config.interface.mjs} +0 -0
  40. package/{esm2015/lib/model/description.interface.js → esm2020/lib/model/description.interface.mjs} +0 -0
  41. package/{esm2015/lib/model/dots-config.interface.js → esm2020/lib/model/dots-config.interface.mjs} +0 -0
  42. package/{esm2015/lib/model/image-internal.class.js → esm2020/lib/model/image-internal.class.mjs} +0 -0
  43. package/{esm2015/lib/model/image.class.js → esm2020/lib/model/image.class.mjs} +0 -0
  44. package/{esm2015/lib/model/interaction-event.interface.js → esm2020/lib/model/interaction-event.interface.mjs} +0 -0
  45. package/{esm2015/lib/model/keyboard-config.interface.js → esm2020/lib/model/keyboard-config.interface.mjs} +1 -1
  46. package/{esm2015/lib/model/keyboard-service-config.interface.js → esm2020/lib/model/keyboard-service-config.interface.mjs} +0 -0
  47. package/esm2020/lib/model/keyboard.enum.mjs +35 -0
  48. package/{esm2015/lib/model/lib-config.interface.js → esm2020/lib/model/lib-config.interface.mjs} +1 -1
  49. package/{esm2015/lib/model/loading-config.interface.js → esm2020/lib/model/loading-config.interface.mjs} +0 -0
  50. package/{esm2015/lib/model/max-size.interface.js → esm2020/lib/model/max-size.interface.mjs} +0 -0
  51. package/{esm2015/lib/model/modal-gallery-config.interface.js → esm2020/lib/model/modal-gallery-config.interface.mjs} +1 -1
  52. package/esm2020/lib/model/plain-gallery-config.interface.mjs +55 -0
  53. package/{esm2015/lib/model/play-config.interface.js → esm2020/lib/model/play-config.interface.mjs} +0 -0
  54. package/{esm2015/lib/model/preview-config.interface.js → esm2020/lib/model/preview-config.interface.mjs} +0 -0
  55. package/{esm2015/lib/model/size.interface.js → esm2020/lib/model/size.interface.mjs} +0 -0
  56. package/{esm2015/lib/model/slide-config.interface.js → esm2020/lib/model/slide-config.interface.mjs} +0 -0
  57. package/esm2020/lib/services/config.service.mjs +396 -0
  58. package/{esm2015/lib/services/id-validator.service.js → esm2020/lib/services/id-validator.service.mjs} +3 -3
  59. package/{esm2015/lib/services/keyboard.service.js → esm2020/lib/services/keyboard.service.mjs} +3 -3
  60. package/{esm2015/lib/utils/image.util.js → esm2020/lib/utils/image.util.mjs} +0 -0
  61. package/esm2020/lib/utils/user-input.util.mjs +104 -0
  62. package/esm2020/public-api.mjs +42 -0
  63. package/fesm2015/ks89-angular-modal-gallery.mjs +5782 -0
  64. package/fesm2015/ks89-angular-modal-gallery.mjs.map +1 -0
  65. package/{fesm2015/ks89-angular-modal-gallery.js → fesm2020/ks89-angular-modal-gallery.mjs} +264 -432
  66. package/fesm2020/ks89-angular-modal-gallery.mjs.map +1 -0
  67. package/lib/components/accessible.component.d.ts +2 -2
  68. package/lib/components/carousel/carousel-previews/carousel-previews.component.d.ts +0 -7
  69. package/lib/components/carousel/carousel.component.d.ts +25 -67
  70. package/lib/components/current-image/current-image.component.d.ts +3 -3
  71. package/lib/components/modal-gallery/modal-gallery.component.d.ts +3 -20
  72. package/lib/components/modal-gallery/modal-gallery.service.d.ts +1 -0
  73. package/lib/components/plain-gallery/plain-gallery.component.d.ts +6 -10
  74. package/lib/directives/keyboard-navigation.directive.d.ts +1 -1
  75. package/lib/model/carousel-config.interface.d.ts +0 -1
  76. package/lib/model/keyboard-config.interface.d.ts +4 -4
  77. package/lib/model/keyboard.enum.d.ts +11 -8
  78. package/lib/model/lib-config.interface.d.ts +20 -7
  79. package/lib/model/modal-gallery-config.interface.d.ts +2 -2
  80. package/lib/model/plain-gallery-config.interface.d.ts +1 -9
  81. package/lib/utils/user-input.util.d.ts +35 -26
  82. package/package.json +26 -13
  83. package/public-api.d.ts +2 -2
  84. package/bundles/ks89-angular-modal-gallery.umd.js +0 -6221
  85. package/bundles/ks89-angular-modal-gallery.umd.js.map +0 -1
  86. package/esm2015/lib/components/carousel/carousel-previews/carousel-previews.component.js +0 -480
  87. package/esm2015/lib/components/carousel/carousel.component.js +0 -800
  88. package/esm2015/lib/components/current-image/current-image.component.js +0 -621
  89. package/esm2015/lib/components/current-image/loading-spinner/loading-spinner.component.js +0 -93
  90. package/esm2015/lib/components/dots/dots.component.js +0 -132
  91. package/esm2015/lib/components/modal-gallery/modal-gallery.component.js +0 -576
  92. package/esm2015/lib/components/modal-gallery/modal-gallery.service.js +0 -186
  93. package/esm2015/lib/components/plain-gallery/plain-gallery.component.js +0 -259
  94. package/esm2015/lib/components/previews/previews.component.js +0 -337
  95. package/esm2015/lib/components/upper-buttons/upper-buttons.component.js +0 -254
  96. package/esm2015/lib/model/keyboard.enum.js +0 -35
  97. package/esm2015/lib/model/plain-gallery-config.interface.js +0 -64
  98. package/esm2015/lib/services/config.service.js +0 -395
  99. package/esm2015/lib/utils/user-input.util.js +0 -95
  100. package/esm2015/public-api.js +0 -42
  101. package/fesm2015/ks89-angular-modal-gallery.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"ks89-angular-modal-gallery.umd.js","sources":["../../../../node_modules/tslib/tslib.es6.js","../../../../projects/ks89/angular-modal-gallery/src/lib/utils/user-input.util.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/accessible.component.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/model/image.class.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/model/action.enum.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/utils/image.util.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/model/description.interface.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/accessibility-default.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/model/buttons-config.interface.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/model/plain-gallery-config.interface.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/model/loading-config.interface.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/services/config.service.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/modal-gallery/modal-gallery.tokens.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/model/keyboard.enum.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/current-image/loading-spinner/loading-spinner.component.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/current-image/loading-spinner/loading-spinner.html","../../../../projects/ks89/angular-modal-gallery/src/lib/directives/keyboard-navigation.directive.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/directives/fallback-image.directive.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/directives/size.directive.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/directives/description.directive.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/current-image/current-image.component.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/current-image/current-image.html","../../../../projects/ks89/angular-modal-gallery/src/lib/services/keyboard.service.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/services/id-validator.service.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/upper-buttons/upper-buttons-default.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/upper-buttons/upper-buttons.component.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/upper-buttons/upper-buttons.html","../../../../projects/ks89/angular-modal-gallery/src/lib/components/dots/dots.component.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/dots/dots.html","../../../../projects/ks89/angular-modal-gallery/src/lib/components/previews/previews.component.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/previews/previews.html","../../../../projects/ks89/angular-modal-gallery/src/lib/directives/click-outside.directive.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/modal-gallery/modal-gallery.component.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/modal-gallery/modal-gallery.component.html","../../../../projects/ks89/angular-modal-gallery/src/lib/components/modal-gallery/modal-gallery-ref.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/modal-gallery/modal-gallery.service.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/carousel/carousel-previews/carousel-previews.component.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/carousel/carousel-previews/carousel-previews.html","../../../../projects/ks89/angular-modal-gallery/src/lib/directives/max-size.directive.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/carousel/carousel.component.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/carousel/carousel.html","../../../../projects/ks89/angular-modal-gallery/src/lib/directives/wrap.directive.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/directives/direction.directive.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/directives/a-tag-bg-image.directive.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/plain-gallery/plain-gallery.component.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/components/plain-gallery/plain-gallery.html","../../../../projects/ks89/angular-modal-gallery/src/lib/components/components.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/directives/margin.directive.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/directives/directives.ts","../../../../projects/ks89/angular-modal-gallery/src/lib/modal-gallery.module.ts","../../../../projects/ks89/angular-modal-gallery/src/public-api.ts","../../../../projects/ks89/angular-modal-gallery/src/ks89-angular-modal-gallery.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || from);\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\n/**\n * Key of the keyboard's key `enter`\n */\nexport const ENTER_KEY = 'Enter';\n/**\n * Code of the keyboard's key `enter`\n */\nexport const ENTER_CODE = 'Enter';\n\n/**\n * Key of the keyboard's key 'right arrow'\n */\nexport const RIGHT_ARROW_KEY = 'ArrowRight';\n/**\n * Code of the keyboard's key 'right arrow'\n */\nexport const RIGHT_ARROW_CODE = 'ArrowRight';\n/**\n * KeyCode of the keyboard's key 'right arrow'\n * Used in unit tests only\n */\nexport const RIGHT_ARROW_KEYCODE = 39;\n\n/**\n * Key of the keyboard's key 'left arrow'\n */\nexport const LEFT_ARROW_KEY = 'ArrowLeft';\n/**\n * Code of the keyboard's key 'left arrow'\n */\nexport const LEFT_ARROW_CODE = 'ArrowLeft';\n/**\n * KeyCode of the keyboard's key 'left arrow'\n * Used in unit tests only\n */\nexport const LEFT_ARROW_KEYCODE = 37;\n\n/**\n * Key of the keyboard's key `space`\n */\nexport const SPACE_KEY = '';\n/**\n * Code of the keyboard's key `space`\n */\nexport const SPACE_CODE = 'Space';\n/**\n * KeyCode of the keyboard's key 'space'\n * Used in unit tests only\n */\nexport const SPACE_KEYCODE = 32;\n\n/**\n * KeyCode of the main mouse button\n */\nexport const MOUSE_MAIN_BUTTON_CLICK = 0;\n\n/**\n * Const NEXT\n */\nexport const NEXT = 1;\n/**\n * Const PREV\n */\nexport const PREV = -1;\n/**\n * Const NOTHING to represents a situation when it isn't both NEXT and PREV\n */\nexport const NOTHING = 0;\n\n/**\n * Const to represent the right direction\n */\nexport const DIRECTION_RIGHT = 'right';\n/**\n * Const to represent the left direction\n */\nexport const DIRECTION_LEFT = 'left';\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\n\nimport { DIRECTION_RIGHT, MOUSE_MAIN_BUTTON_CLICK, NEXT, NOTHING, PREV, ENTER_CODE, SPACE_CODE } from '../utils/user-input.util';\n\n/**\n * Provides some useful methods to add accessibility features to subclasses.\n * In particular, it exposes a method to handle navigation event with both Keyboard and Mouse\n * and another with also the direction (right or left).\n */\n@Component({\n selector: 'ks-accessible',\n template: ``,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AccessibleComponent {\n constructor() {}\n\n /**\n * Method to handle navigation events with both Keyboard and Mouse.\n * @param string direction of the navigation that can be either 'next' or 'prev'\n * @param KeyboardEvent | MouseEvent event payload\n * @returns number -1 for PREV, 1 for NEXT and 0 for NOTHING\n */\n handleNavigationEvent(direction: string, event: KeyboardEvent | MouseEvent): number {\n if (!event) {\n return NOTHING;\n }\n if (event instanceof KeyboardEvent) {\n return this.handleKeyboardNavigationEvent(direction, event);\n } else if (event instanceof MouseEvent) {\n return this.handleMouseNavigationEvent(direction, event);\n }\n return NOTHING;\n }\n\n /**\n * Method to handle events over an image, for instance a keypress with the Keyboard or a Mouse click.\n * @param KeyboardEvent | MouseEvent event payload\n * @returns number 1 for NEXT and 0 for NOTHING\n */\n handleImageEvent(event: KeyboardEvent | MouseEvent): number {\n if (!event) {\n return NOTHING;\n }\n if (event instanceof KeyboardEvent) {\n return this.handleImageKeyboardEvent(event);\n } else if (event instanceof MouseEvent) {\n return this.handleImageMouseEvent(event);\n }\n return NOTHING;\n }\n\n /**\n * Private method to handle keyboard events over an image.\n * @param KeyboardEvent event payload\n * @returns number 1 for NEXT and 0 for NOTHING\n */\n private handleImageKeyboardEvent(event: KeyboardEvent): number {\n const key: string = event.code;\n if (key === SPACE_CODE || key === ENTER_CODE) {\n return NEXT;\n }\n return NOTHING;\n }\n\n /**\n * Private method to handle mouse events over an image.\n * @param MouseEvent event payload\n * @returns number 1 for NEXT and 0 for NOTHING\n */\n private handleImageMouseEvent(event: MouseEvent): number {\n const mouseBtn: number = event.button;\n if (mouseBtn === MOUSE_MAIN_BUTTON_CLICK) {\n return NEXT;\n }\n return NOTHING;\n }\n\n /**\n * Method to handle events over an image, for instance a keypress with the Keyboard or a Mouse click.\n * @param string direction of the navigation that can be either 'next' or 'prev'\n * @param KeyboardEvent event payload\n * @returns number -1 for PREV, 1 for NEXT and 0 for NOTHING\n */\n private handleKeyboardNavigationEvent(direction: string, event: KeyboardEvent): number {\n const key: string = event.code;\n if (key === SPACE_CODE || key === ENTER_CODE) {\n return direction === DIRECTION_RIGHT ? NEXT : PREV;\n }\n return NOTHING;\n }\n\n /**\n * Method to handle events over an image, for instance a keypress with the Keyboard or a Mouse click.\n * @param string direction of the navigation that can be either 'next' or 'prev'\n * @param MouseEvent event payload\n * @returns number -1 for PREV, 1 for NEXT and 0 for NOTHING\n */\n private handleMouseNavigationEvent(direction: string, event: MouseEvent): number {\n const mouseBtn: number = event.button;\n if (mouseBtn === MOUSE_MAIN_BUTTON_CLICK) {\n return direction === DIRECTION_RIGHT ? NEXT : PREV;\n }\n return NOTHING;\n }\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Action } from './action.enum';\nimport { Size } from './size.interface';\nimport { SafeResourceUrl } from '@angular/platform-browser';\n\n/**\n * Class `Image` that represents an image with both `modal` and `plain` configurations.\n * Both image `id` and `modal` are mandatory, instead `plain` is optional.\n */\nexport class Image {\n id: number;\n\n modal: ModalImage;\n plain?: PlainImage;\n\n constructor(id: number, modal: ModalImage, plain?: PlainImage) {\n this.id = id;\n this.modal = modal;\n this.plain = plain;\n }\n}\n\n/**\n * Interface `ImageData` to configure an image, but it isn't used directly.\n * Please, refers to `PlainImage` or `ModalImage`.\n */\nexport interface ImageData {\n img: string | SafeResourceUrl;\n description?: string;\n title?: string;\n alt?: string;\n ariaLabel?: string;\n fallbackImg?: string | SafeResourceUrl;\n}\n\n/**\n * Interface `ModalImage` to configure the modal image.\n */\nexport interface ModalImage extends ImageData {\n extUrl?: string;\n downloadFileName?: string;\n}\n\n/**\n * Interface `PlainImage` to configure the plain image.\n */\nexport interface PlainImage extends ImageData {\n size?: Size;\n}\n\n/**\n * Class `ImageEvent` that represents the event payload with the result and the triggered action.\n * It also contains the source id of the gallery that emitted this event\n */\nexport class ImageEvent {\n galleryId: number;\n action: Action;\n result: number | boolean;\n\n constructor(galleryId: number, action: Action, result: number | boolean) {\n this.galleryId = galleryId;\n this.action = action;\n this.result = result;\n }\n}\n\n/**\n * Class `ImageModalEvent` that represents the event payload with galleryId, result and the triggered action.\n */\nexport class ImageModalEvent extends ImageEvent {\n constructor(galleryId: number, action: Action, result: number | boolean) {\n super(galleryId, action, result);\n }\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\n/**\n * Enum `Action` with a list of possible actions, based on the source of the action.\n */\nexport enum Action {\n NORMAL, // default value\n CLICK, // mouse click\n KEYBOARD,\n SWIPE,\n LOAD,\n AUTOPLAY\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Image } from '../model/image.class';\n\n/**\n * Utility function to get the index of the input `image` from `arrayOfImages`\n * @param Image image to get the index. The image 'id' must be a number >= 0\n * @param Image[] arrayOfImages to search the image within it\n * @returns number the index of the image. -1 if not found.\n * @throws an Error if either image or arrayOfImages are not valid,\n * or if the input image doesn't contain an 'id', or the 'id' is < 0\n */\nexport function getIndex(image: Image, arrayOfImages: Image[]): number {\n if (!image) {\n throw new Error('image must be a valid Image object');\n }\n\n if (!arrayOfImages) {\n throw new Error('arrayOfImages must be a valid Image[]');\n }\n\n if (!image.id && image.id !== 0) {\n // id = 0 is admitted\n throw new Error(`A numeric Image 'id' is mandatory`);\n }\n\n if (image.id < 0) {\n throw new Error(`Image 'id' must be >= 0`);\n }\n\n return arrayOfImages.findIndex((val: Image) => val.id === image.id);\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\n/**\n * Interface `Description` to change the description, either with a full custom\n * description or with a small and simple customization.\n * Also, you could change margins, background style and so on.\n */\nexport interface Description {\n strategy: DescriptionStrategy;\n customFullDescription?: string;\n imageText?: string;\n numberSeparator?: string;\n beforeTextDescription?: string;\n\n style?: DescriptionStyle;\n}\n\n/**\n * Enum `DescriptionStrategy` with keys and their relative key codes.\n */\nexport enum DescriptionStrategy {\n ALWAYS_HIDDEN = 1,\n ALWAYS_VISIBLE,\n HIDE_IF_EMPTY\n}\n\n/**\n * Interface to change css properties.\n */\nexport interface DescriptionStyle {\n bgColor?: string;\n textColor?: string;\n width?: string;\n height?: string;\n position?: string;\n top?: string;\n bottom?: string;\n left?: string;\n right?: string;\n marginTop?: string;\n marginBottom?: string;\n marginRight?: string;\n marginLeft?: string;\n}\n","import { AccessibilityConfig } from '../model/accessibility.interface';\n\n/**\n * Default accessibility configuration.\n */\nexport const KS_DEFAULT_ACCESSIBILITY_CONFIG: AccessibilityConfig = {\n backgroundAriaLabel: 'Modal gallery full screen background',\n backgroundTitle: '',\n\n plainGalleryContentAriaLabel: 'Plain gallery content',\n plainGalleryContentTitle: '',\n\n modalGalleryContentAriaLabel: 'Modal gallery content',\n modalGalleryContentTitle: '',\n\n loadingSpinnerAriaLabel: 'The current image is loading. Please be patient.',\n loadingSpinnerTitle: 'The current image is loading. Please be patient.',\n\n mainContainerAriaLabel: 'Current image and navigation',\n mainContainerTitle: '',\n mainPrevImageAriaLabel: 'Previous image',\n mainPrevImageTitle: 'Previous image',\n mainNextImageAriaLabel: 'Next image',\n mainNextImageTitle: 'Next image',\n\n dotsContainerAriaLabel: 'Image navigation dots',\n dotsContainerTitle: '',\n dotAriaLabel: 'Navigate to image number',\n\n previewsContainerAriaLabel: 'Image previews',\n previewsContainerTitle: '',\n previewScrollPrevAriaLabel: 'Scroll previous previews',\n previewScrollPrevTitle: 'Scroll previous previews',\n previewScrollNextAriaLabel: 'Scroll next previews',\n previewScrollNextTitle: 'Scroll next previews',\n\n carouselContainerAriaLabel: 'Current image and navigation',\n carouselContainerTitle: '',\n carouselPrevImageAriaLabel: 'Previous image',\n carouselPrevImageTitle: 'Previous image',\n carouselNextImageAriaLabel: 'Next image',\n carouselNextImageTitle: 'Next image',\n carouselPreviewsContainerAriaLabel: 'Image previews',\n carouselPreviewsContainerTitle: '',\n carouselPreviewScrollPrevAriaLabel: 'Scroll previous previews',\n carouselPreviewScrollPrevTitle: 'Scroll previous previews',\n carouselPreviewScrollNextAriaLabel: 'Scroll next previews',\n carouselPreviewScrollNextTitle: 'Scroll next previews'\n};\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Action } from './action.enum';\nimport { InternalLibImage } from './image-internal.class';\nimport { Size } from './size.interface';\n\n/**\n * Interface `ButtonsConfig` to add buttons, show/hide their, and to add the strategy.\n */\nexport interface ButtonsConfig {\n visible: boolean;\n strategy: ButtonsStrategy;\n buttons?: ButtonConfig[];\n}\n\n/**\n * Interface `ButtonConfig` to configure a single button.\n */\nexport interface ButtonConfig {\n className?: string;\n size?: Size;\n fontSize?: string;\n type: ButtonType;\n title?: string;\n ariaLabel?: string;\n extUrlInNewTab?: boolean; // to open the external url in a new tab, instead of the current one\n}\n\n/**\n * Interface `ButtonEvent` to represent the event payload when a button is clicked.\n */\nexport interface ButtonEvent {\n button: ButtonConfig;\n image: InternalLibImage | null;\n action: Action;\n galleryId: number;\n}\n\n/**\n * Enum `ButtonsStrategy` to configure the logic of a button.\n */\nexport enum ButtonsStrategy {\n // don't use 0 here\n // the first index is 1 and all of the following members are auto-incremented from that point on\n DEFAULT = 1,\n SIMPLE,\n ADVANCED,\n FULL,\n CUSTOM\n}\n\n/**\n * Enum `ButtonType` is the type of a button.\n */\nexport enum ButtonType {\n // don't use 0 here\n // the first index is 1 and all of the following members are auto-incremented from that point on\n DELETE = 1,\n EXTURL,\n DOWNLOAD,\n CLOSE,\n CUSTOM,\n FULLSCREEN\n}\n\n/**\n * Array of admitted types of buttons.\n */\nexport const WHITELIST_BUTTON_TYPES: ButtonType[] = [\n ButtonType.FULLSCREEN,\n ButtonType.DELETE,\n ButtonType.EXTURL,\n ButtonType.DOWNLOAD,\n ButtonType.CLOSE,\n ButtonType.CUSTOM\n];\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Size } from './size.interface';\n\n/**\n * Interface `PlainGalleryConfig` to configure plain-gallery features.\n */\nexport interface PlainGalleryConfig {\n strategy: PlainGalleryStrategy;\n layout: PlainGalleryLayout;\n advanced?: AdvancedConfig;\n}\n\n/**\n * Interface `PlainGalleryLayout` to configure the layout. This interface isn't used directly, instead\n * refers to either `LineLayout`, `GridLayout` or `AdvancedLayout`.\n */\n// tslint:disable-next-line no-empty-interface\nexport interface PlainGalleryLayout {}\n\n/**\n * Class `LineLayout` to configure a linear plain gallery.\n */\nexport class LineLayout implements PlainGalleryLayout {\n breakConfig: BreakConfig;\n justify: string;\n size: Size;\n\n constructor(size: Size, breakConfig: BreakConfig, justify: string) {\n this.size = size;\n this.breakConfig = breakConfig;\n this.justify = justify;\n }\n}\n\n/**\n * Class `GridLayout` to configure a grid plain gallery.\n */\nexport class GridLayout implements PlainGalleryLayout {\n breakConfig: BreakConfig;\n size: Size;\n\n constructor(size: Size, breakConfig: BreakConfig) {\n this.size = size;\n this.breakConfig = breakConfig;\n }\n}\n\n/**\n * Class `AdvancedLayout` to configure a fully custom plain gallery.\n */\nexport class AdvancedLayout implements PlainGalleryLayout {\n modalOpenerByIndex: number;\n hideDefaultPlainGallery: boolean;\n\n constructor(modalOpenerByIndex: number, hideDefaultPlainGallery: boolean) {\n this.modalOpenerByIndex = modalOpenerByIndex;\n this.hideDefaultPlainGallery = hideDefaultPlainGallery;\n }\n}\n\n/**\n * Enum `PlainGalleryStrategy` to choose the behaviour of the plain gallery.\n */\nexport enum PlainGalleryStrategy {\n // don't use 0 here\n // the first index is 1 and all of the following members are auto-incremented from that point on\n ROW = 1,\n COLUMN,\n GRID,\n CUSTOM // full custom strategy\n}\n\n/**\n * Interface `BreakConfig` to limit the number of items of the plain gallery or to force it to fill other lines.\n */\nexport interface BreakConfig {\n length: number;\n wrap: boolean;\n}\n\n/**\n * Interface `AdvancedConfig` to use `<a>` tags instead of `<img>`.\n * It also contains a string property to customize the css background property.\n * For more info check here https://www.w3schools.com/cssref/css3_pr_background.asp\n */\nexport interface AdvancedConfig {\n aTags: boolean;\n additionalBackground: string;\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\n/**\n * Interface `LoadingConfig` to configure loading icon.\n */\nexport interface LoadingConfig {\n enable: boolean;\n type: LoadingType;\n}\n\n/**\n * Enum `LoadingType` with a list of possible types.\n */\nexport enum LoadingType {\n STANDARD = 1,\n CIRCULAR,\n BARS,\n DOTS,\n CUBE_FLIPPING,\n CIRCLES,\n EXPLOSING_SQUARES\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Injectable } from '@angular/core';\nimport { SidePreviewsConfig, SlideConfig } from '../model/slide-config.interface';\nimport { PlayConfig } from '../model/play-config.interface';\nimport { KS_DEFAULT_ACCESSIBILITY_CONFIG } from '../components/accessibility-default';\nimport { PreviewConfig } from '../model/preview-config.interface';\nimport { Size } from '../model/size.interface';\nimport { ButtonsConfig, ButtonsStrategy } from '../model/buttons-config.interface';\nimport { DotsConfig } from '../model/dots-config.interface';\nimport { AdvancedLayout, GridLayout, LineLayout, PlainGalleryConfig, PlainGalleryStrategy } from '../model/plain-gallery-config.interface';\nimport { CurrentImageConfig } from '../model/current-image-config.interface';\nimport { LoadingConfig, LoadingType } from '../model/loading-config.interface';\nimport { Description, DescriptionStrategy, DescriptionStyle } from '../model/description.interface';\nimport { CarouselConfig } from '../model/carousel-config.interface';\nimport { CarouselImageConfig } from '../model/carousel-image-config.interface';\nimport { BreakpointsConfig, CarouselPreviewConfig } from '../model/carousel-preview-config.interface';\nimport { KeyboardServiceConfig } from '../model/keyboard-service-config.interface';\nimport { LibConfig } from '../model/lib-config.interface';\n\nexport const DEFAULT_PREVIEW_SIZE: Size = { height: '50px', width: 'auto' };\nexport const DEFAULT_LAYOUT: LineLayout = new LineLayout(DEFAULT_PREVIEW_SIZE, { length: -1, wrap: false }, 'flex-start');\nexport const DEFAULT_PLAIN_CONFIG: PlainGalleryConfig = {\n strategy: PlainGalleryStrategy.ROW,\n layout: DEFAULT_LAYOUT,\n advanced: { aTags: false, additionalBackground: '50% 50%/cover' }\n};\nexport const DEFAULT_LOADING: LoadingConfig = { enable: true, type: LoadingType.STANDARD };\nexport const DEFAULT_DESCRIPTION_STYLE: DescriptionStyle = {\n bgColor: 'rgba(0, 0, 0, .5)',\n textColor: 'white',\n marginTop: '0px',\n marginBottom: '0px',\n marginLeft: '0px',\n marginRight: '0px'\n};\nexport const DEFAULT_DESCRIPTION: Description = {\n strategy: DescriptionStrategy.ALWAYS_VISIBLE,\n imageText: 'Image ',\n numberSeparator: '/',\n beforeTextDescription: ' - ',\n style: DEFAULT_DESCRIPTION_STYLE\n};\nexport const DEFAULT_CAROUSEL_DESCRIPTION: Description = {\n strategy: DescriptionStrategy.ALWAYS_HIDDEN,\n imageText: 'Image ',\n numberSeparator: '/',\n beforeTextDescription: ' - ',\n style: DEFAULT_DESCRIPTION_STYLE\n};\nexport const DEFAULT_CURRENT_IMAGE_CONFIG: CurrentImageConfig = {\n navigateOnClick: true,\n loadingConfig: DEFAULT_LOADING,\n description: DEFAULT_DESCRIPTION,\n downloadable: false,\n invertSwipe: false\n};\nexport const DEFAULT_CAROUSEL_IMAGE_CONFIG: CarouselImageConfig = {\n description: DEFAULT_CAROUSEL_DESCRIPTION,\n invertSwipe: false\n};\nexport const DEFAULT_CURRENT_CAROUSEL_CONFIG: CarouselConfig = {\n maxWidth: '100%',\n maxHeight: '400px',\n showArrows: true,\n objectFit: 'cover',\n keyboardEnable: true,\n modalGalleryEnable: false,\n legacyIE11Mode: false\n};\nexport const DEFAULT_CURRENT_CAROUSEL_PLAY: PlayConfig = {\n autoPlay: true,\n interval: 5000,\n pauseOnHover: true\n};\n\nexport const DEFAULT_CAROUSEL_BREAKPOINTS: BreakpointsConfig = { xSmall: 100, small: 100, medium: 150, large: 200, xLarge: 200 };\nexport const DEFAULT_CAROUSEL_PREVIEWS_CONFIG: CarouselPreviewConfig = {\n visible: true,\n number: 4,\n arrows: true,\n clickable: true,\n width: 100 / 4 + '%',\n maxHeight: '200px',\n breakpoints: DEFAULT_CAROUSEL_BREAKPOINTS\n};\nexport const DEFAULT_KEYBOARD_SERVICE_CONFIG: KeyboardServiceConfig = {\n shortcuts: ['ctrl+s', 'meta+s'],\n disableSsrWorkaround: false\n};\nexport const DEFAULT_SLIDE_CONFIG: SlideConfig = {\n infinite: false,\n playConfig: { autoPlay: false, interval: 5000, pauseOnHover: true } as PlayConfig,\n sidePreviews: { show: true, size: { width: '100px', height: 'auto' } } as SidePreviewsConfig\n};\nexport const DEFAULT_PREVIEW_CONFIG: PreviewConfig = {\n visible: true,\n number: 3,\n arrows: true,\n clickable: true,\n size: DEFAULT_PREVIEW_SIZE\n};\n\nconst DEFAULT_CONFIG: LibConfig = Object.freeze({\n slideConfig: DEFAULT_SLIDE_CONFIG,\n accessibilityConfig: KS_DEFAULT_ACCESSIBILITY_CONFIG,\n previewConfig: DEFAULT_PREVIEW_CONFIG,\n buttonsConfig: { visible: true, strategy: ButtonsStrategy.DEFAULT } as ButtonsConfig,\n dotsConfig: { visible: true } as DotsConfig,\n plainGalleryConfig: DEFAULT_PLAIN_CONFIG,\n currentImageConfig: DEFAULT_CURRENT_IMAGE_CONFIG,\n keyboardConfig: undefined, // by default nothing, because the library uses default buttons automatically\n carouselConfig: DEFAULT_CURRENT_CAROUSEL_CONFIG,\n carouselImageConfig: DEFAULT_CAROUSEL_IMAGE_CONFIG,\n carouselPreviewsConfig: DEFAULT_CAROUSEL_PREVIEWS_CONFIG,\n carouselPlayConfig: DEFAULT_CURRENT_CAROUSEL_PLAY,\n carouselDotsConfig: { visible: true } as DotsConfig,\n enableCloseOutside: true,\n keyboardServiceConfig: DEFAULT_KEYBOARD_SERVICE_CONFIG\n});\n\n/**\n * Service to handle library configuration in a unique place\n */\n@Injectable({ providedIn: 'root' })\nexport class ConfigService {\n configMap: Map<number, LibConfig> = new Map<number, LibConfig>();\n\n getConfig(id: number): LibConfig | undefined {\n this.initIfNotExists(id);\n return this.configMap.get(id);\n }\n\n setConfig(id: number, obj: LibConfig | undefined): void {\n this.initIfNotExists(id);\n if (!obj) {\n return;\n }\n\n if (\n !DEFAULT_CONFIG ||\n !DEFAULT_CONFIG.slideConfig ||\n !DEFAULT_CONFIG.slideConfig.sidePreviews ||\n !DEFAULT_CONFIG.previewConfig ||\n !DEFAULT_CONFIG.previewConfig.size ||\n !DEFAULT_CONFIG.previewConfig.number ||\n !DEFAULT_CONFIG.plainGalleryConfig ||\n !DEFAULT_CONFIG.currentImageConfig ||\n !DEFAULT_CONFIG.currentImageConfig ||\n !DEFAULT_CONFIG.currentImageConfig.description ||\n !DEFAULT_CONFIG.carouselImageConfig ||\n !DEFAULT_CONFIG.carouselImageConfig.description ||\n !DEFAULT_CONFIG.carouselPreviewsConfig ||\n !DEFAULT_CONFIG.carouselPreviewsConfig.breakpoints ||\n !DEFAULT_CAROUSEL_PREVIEWS_CONFIG.number\n ) {\n throw new Error('Internal library error - DEFAULT_CONFIG must be fully initialized!!!');\n }\n\n const newConfig: LibConfig = Object.assign({}, this.configMap.get(id));\n if (obj.slideConfig) {\n let playConfig;\n let sidePreviews;\n let size;\n if (obj.slideConfig.playConfig) {\n playConfig = Object.assign({}, DEFAULT_CONFIG.slideConfig.playConfig, obj.slideConfig.playConfig);\n } else {\n playConfig = DEFAULT_CONFIG.slideConfig.playConfig;\n }\n if (obj.slideConfig.sidePreviews) {\n if (obj.slideConfig.sidePreviews.size) {\n size = Object.assign({}, DEFAULT_CONFIG.slideConfig.sidePreviews.size, obj.slideConfig.sidePreviews.size);\n } else {\n size = DEFAULT_CONFIG.slideConfig.sidePreviews.size;\n }\n sidePreviews = Object.assign({}, DEFAULT_CONFIG.slideConfig.sidePreviews, obj.slideConfig.sidePreviews);\n } else {\n sidePreviews = DEFAULT_CONFIG.slideConfig.sidePreviews;\n size = DEFAULT_CONFIG.slideConfig.sidePreviews.size;\n }\n const newSlideConfig: SlideConfig = Object.assign({}, DEFAULT_CONFIG.slideConfig, obj.slideConfig);\n newSlideConfig.playConfig = playConfig;\n newSlideConfig.sidePreviews = sidePreviews;\n newSlideConfig.sidePreviews.size = size;\n newConfig.slideConfig = newSlideConfig;\n }\n if (obj.accessibilityConfig) {\n newConfig.accessibilityConfig = Object.assign({}, DEFAULT_CONFIG.accessibilityConfig, obj.accessibilityConfig);\n }\n if (obj.previewConfig) {\n let size: Size;\n let num: number;\n if (obj.previewConfig.size) {\n size = Object.assign({}, DEFAULT_CONFIG.previewConfig.size, obj.previewConfig.size);\n } else {\n size = DEFAULT_CONFIG.previewConfig.size;\n }\n if (obj.previewConfig.number) {\n if (obj.previewConfig.number <= 0) {\n // if number is <= 0 reset to default\n num = DEFAULT_CONFIG.previewConfig.number;\n } else {\n num = obj.previewConfig.number;\n }\n } else {\n num = DEFAULT_CONFIG.previewConfig.number;\n }\n const newPreviewConfig: PreviewConfig = Object.assign({}, DEFAULT_CONFIG.previewConfig, obj.previewConfig);\n newPreviewConfig.size = size;\n newPreviewConfig.number = num;\n newConfig.previewConfig = newPreviewConfig;\n }\n if (obj.buttonsConfig) {\n newConfig.buttonsConfig = Object.assign({}, DEFAULT_CONFIG.buttonsConfig, obj.buttonsConfig);\n }\n if (obj.dotsConfig) {\n newConfig.dotsConfig = Object.assign({}, DEFAULT_CONFIG.dotsConfig, obj.dotsConfig);\n }\n if (obj.plainGalleryConfig) {\n let advanced;\n let layout;\n if (obj.plainGalleryConfig.advanced) {\n advanced = Object.assign({}, DEFAULT_CONFIG.plainGalleryConfig.advanced, obj.plainGalleryConfig.advanced);\n } else {\n advanced = DEFAULT_CONFIG.plainGalleryConfig.advanced;\n }\n if (obj.plainGalleryConfig.layout) {\n // it isn't mandatory to use assign, because obj.plainGalleryConfig.layout is an instance of class (LineaLayout, GridLayout, AdvancedLayout)\n layout = obj.plainGalleryConfig.layout;\n } else {\n layout = DEFAULT_CONFIG.plainGalleryConfig.layout;\n }\n const newPlainGalleryConfig: PlainGalleryConfig = Object.assign({}, DEFAULT_CONFIG.plainGalleryConfig, obj.plainGalleryConfig);\n newPlainGalleryConfig.layout = layout;\n newPlainGalleryConfig.advanced = advanced;\n newConfig.plainGalleryConfig = initPlainGalleryConfig(newPlainGalleryConfig);\n }\n if (obj.currentImageConfig) {\n let loading;\n let description;\n let descriptionStyle;\n if (obj.currentImageConfig.loadingConfig) {\n loading = Object.assign({}, DEFAULT_CONFIG.currentImageConfig.loadingConfig, obj.currentImageConfig.loadingConfig);\n } else {\n loading = DEFAULT_CONFIG.currentImageConfig.loadingConfig;\n }\n if (obj.currentImageConfig.description) {\n description = Object.assign({}, DEFAULT_CONFIG.currentImageConfig.description, obj.currentImageConfig.description);\n if (obj.currentImageConfig.description.style) {\n descriptionStyle = Object.assign({}, DEFAULT_CONFIG.currentImageConfig.description.style, obj.currentImageConfig.description.style);\n } else {\n descriptionStyle = DEFAULT_CONFIG.currentImageConfig.description.style;\n }\n } else {\n description = DEFAULT_CONFIG.currentImageConfig.description;\n descriptionStyle = DEFAULT_CONFIG.currentImageConfig.description.style;\n }\n const newCurrentImageConfig: CurrentImageConfig = Object.assign({}, DEFAULT_CONFIG.currentImageConfig, obj.currentImageConfig);\n newCurrentImageConfig.loadingConfig = loading;\n newCurrentImageConfig.description = description;\n newCurrentImageConfig.description.style = descriptionStyle;\n newConfig.currentImageConfig = newCurrentImageConfig;\n }\n if (obj.keyboardConfig) {\n newConfig.keyboardConfig = Object.assign({}, DEFAULT_CONFIG.keyboardConfig, obj.keyboardConfig);\n }\n\n // carousel\n if (obj.carouselConfig) {\n newConfig.carouselConfig = Object.assign({}, DEFAULT_CONFIG.carouselConfig, obj.carouselConfig);\n }\n if (obj.carouselImageConfig) {\n let description;\n let descriptionStyle;\n if (obj.carouselImageConfig.description) {\n description = Object.assign({}, DEFAULT_CONFIG.carouselImageConfig.description, obj.carouselImageConfig.description);\n if (obj.carouselImageConfig.description.style) {\n descriptionStyle = Object.assign({}, DEFAULT_CONFIG.carouselImageConfig.description.style, obj.carouselImageConfig.description.style);\n } else {\n descriptionStyle = DEFAULT_CONFIG.carouselImageConfig.description.style;\n }\n } else {\n description = DEFAULT_CONFIG.carouselImageConfig.description;\n descriptionStyle = DEFAULT_CONFIG.carouselImageConfig.description.style;\n }\n const newCarouselImageConfig: CarouselImageConfig = Object.assign({}, DEFAULT_CONFIG.carouselImageConfig, obj.carouselImageConfig);\n newCarouselImageConfig.description = description;\n newCarouselImageConfig.description.style = descriptionStyle;\n newConfig.carouselImageConfig = newCarouselImageConfig;\n }\n if (obj.carouselPlayConfig) {\n // check values\n if (obj.carouselPlayConfig.interval <= 0) {\n throw new Error(`Carousel's interval must be a number >= 0`);\n }\n newConfig.carouselPlayConfig = Object.assign({}, DEFAULT_CONFIG.carouselPlayConfig, obj.carouselPlayConfig);\n }\n if (obj.carouselPreviewsConfig) {\n // check values\n let num: number;\n let breakpoints: BreakpointsConfig;\n if (!obj.carouselPreviewsConfig.number || obj.carouselPreviewsConfig.number <= 0) {\n num = DEFAULT_CAROUSEL_PREVIEWS_CONFIG.number;\n } else {\n num = obj.carouselPreviewsConfig.number;\n }\n if (obj.carouselPreviewsConfig.breakpoints) {\n breakpoints = Object.assign({}, DEFAULT_CONFIG.carouselPreviewsConfig.breakpoints, obj.carouselPreviewsConfig.breakpoints);\n } else {\n breakpoints = DEFAULT_CONFIG.carouselPreviewsConfig.breakpoints;\n }\n newConfig.carouselPreviewsConfig = Object.assign({}, DEFAULT_CONFIG.carouselPreviewsConfig, obj.carouselPreviewsConfig);\n newConfig.carouselPreviewsConfig.number = num;\n newConfig.carouselPreviewsConfig.breakpoints = breakpoints;\n // Init preview image width based on the number of previews in PreviewConfig\n // Don't move this line above, because I need to be sure that both configPreview.number\n // and configPreview.size are initialized\n newConfig.carouselPreviewsConfig.width = 100 / newConfig.carouselPreviewsConfig.number + '%';\n }\n if (obj.carouselDotsConfig) {\n newConfig.carouselDotsConfig = Object.assign({}, DEFAULT_CONFIG.carouselDotsConfig, obj.carouselDotsConfig);\n }\n if (obj.enableCloseOutside === undefined) {\n newConfig.enableCloseOutside = DEFAULT_CONFIG.enableCloseOutside;\n } else {\n newConfig.enableCloseOutside = obj.enableCloseOutside;\n }\n if (obj.keyboardServiceConfig) {\n newConfig.keyboardServiceConfig = Object.assign({}, DEFAULT_KEYBOARD_SERVICE_CONFIG, obj.keyboardServiceConfig);\n }\n this.configMap.set(id, newConfig);\n }\n\n private initIfNotExists(id: number): void {\n if (!this.configMap.has(id)) {\n this.configMap.set(id, DEFAULT_CONFIG);\n }\n }\n}\n\n/**\n * Function to build and return a `PlainGalleryConfig` object, proving also default values and validating the input object.\n * @param plainGalleryConfig object with the config requested by user\n * @returns PlainGalleryConfig the plain gallery configuration\n * @throws an Error if layout and strategy aren't compatible\n */\nfunction initPlainGalleryConfig(plainGalleryConfig: PlainGalleryConfig): PlainGalleryConfig {\n const newPlayGalleryConfig: PlainGalleryConfig = Object.assign({}, DEFAULT_CONFIG.plainGalleryConfig, plainGalleryConfig);\n\n if (newPlayGalleryConfig.layout instanceof LineLayout) {\n if (newPlayGalleryConfig.strategy !== PlainGalleryStrategy.ROW && newPlayGalleryConfig.strategy !== PlainGalleryStrategy.COLUMN) {\n throw new Error('LineLayout requires either ROW or COLUMN strategy');\n }\n if (!newPlayGalleryConfig.layout || !newPlayGalleryConfig.layout.breakConfig) {\n throw new Error('Both layout and breakConfig must be valid');\n }\n }\n\n if (newPlayGalleryConfig.layout instanceof GridLayout) {\n if (newPlayGalleryConfig.strategy !== PlainGalleryStrategy.GRID) {\n throw new Error('GridLayout requires GRID strategy');\n }\n if (!newPlayGalleryConfig.layout || !newPlayGalleryConfig.layout.breakConfig) {\n throw new Error('Both layout and breakConfig must be valid');\n }\n // force wrap for grid layout\n newPlayGalleryConfig.layout.breakConfig.wrap = true;\n }\n\n if (newPlayGalleryConfig.layout instanceof AdvancedLayout) {\n if (newPlayGalleryConfig.strategy !== PlainGalleryStrategy.CUSTOM) {\n throw new Error('AdvancedLayout requires CUSTOM strategy');\n }\n }\n return newPlayGalleryConfig;\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { InjectionToken } from '@angular/core';\nimport { ModalGalleryConfig } from '../../model/modal-gallery-config.interface';\n\nexport const DIALOG_DATA = new InjectionToken<ModalGalleryConfig>('DIALOG_DATA');\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\n/**\n * Enum `Keyboard` with keys and their relative key codes.\n */\nexport enum Keyboard {\n ESC = 27,\n LEFT_ARROW = 37,\n RIGHT_ARROW = 39,\n UP_ARROW = 38,\n DOWN_ARROW = 40\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core';\n\nimport { AccessibilityConfig } from '../../../model/accessibility.interface';\nimport { LoadingConfig, LoadingType } from '../../../model/loading-config.interface';\n\n/**\n * Component with the loading spinner\n */\n@Component({\n selector: 'ks-loading-spinner',\n styleUrls: [\n 'style-loading-spinner-standard.css',\n 'style-loading-spinner-dots.css',\n 'style-loading-spinner-bars.css',\n 'style-loading-spinner-circular.css',\n 'style-loading-spinner-cube-flipping.css',\n 'style-loading-spinner-circles.css',\n 'style-loading-spinner-explosing-squares.scss'\n ],\n templateUrl: 'loading-spinner.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class LoadingSpinnerComponent {\n /**\n * Object of type `LoadingConfig` exposed to the template.\n * It contains a field to choose a loading spinner.\n */\n @Input()\n loadingConfig: LoadingConfig | undefined;\n /**\n * Object of type `AccessibilityConfig` to init custom accessibility features.\n * For instance, it contains titles, alt texts, aria-labels and so on.\n */\n @Input()\n accessibilityConfig: AccessibilityConfig | undefined;\n\n /**\n * Enum of type `LoadingType` to choose the standard loading spinner.\n * Declared here to be used inside the template.\n */\n loadingStandard: LoadingType = LoadingType.STANDARD;\n /**\n * Enum of type `LoadingType` to choose the bars loading spinner.\n * Declared here to be used inside the template.\n */\n loadingBars: LoadingType = LoadingType.BARS;\n /**\n * Enum of type `LoadingType` to choose the circular loading spinner.\n * Declared here to be used inside the template.\n */\n loadingCircular: LoadingType = LoadingType.CIRCULAR;\n /**\n * Enum of type `LoadingType` to choose the dots loading spinner.\n * Declared here to be used inside the template.\n */\n loadingDots: LoadingType = LoadingType.DOTS;\n /**\n * Enum of type `LoadingType` to choose the cube flipping loading spinner.\n * Declared here to be used inside the template.\n */\n loadingCubeFlipping: LoadingType = LoadingType.CUBE_FLIPPING;\n /**\n * Enum of type `LoadingType` to choose the circles loading spinner.\n * Declared here to be used inside the template.\n */\n loadingCircles: LoadingType = LoadingType.CIRCLES;\n /**\n * Enum of type `LoadingType` to choose the explosing squares loading spinner.\n * Declared here to be used inside the template.\n */\n loadingExplosingSquares: LoadingType = LoadingType.EXPLOSING_SQUARES;\n}\n","<div [attr.aria-label]=\"accessibilityConfig?.loadingSpinnerAriaLabel\"\n [title]=\"accessibilityConfig?.loadingSpinnerTitle\">\n\n <ng-container [ngSwitch]=\"loadingConfig?.type\">\n <ng-container *ngSwitchCase=\"loadingStandard\">\n <div class=\"cssload-loader\">\n <div class=\"cssload-inner cssload-one\"></div>\n <div class=\"cssload-inner cssload-two\"></div>\n <div class=\"cssload-inner cssload-three\"></div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"loadingBars\">\n <div class=\"loader-bars\">\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"loadingCircular\">\n <div class=\"loader-circular\">\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"loadingDots\">\n <div class=\"loader-dots\">\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"loadingCubeFlipping\">\n <div class=\"cube-wrapper\">\n <div class=\"cube-folding\">\n <span class=\"leaf1\"></span>\n <span class=\"leaf2\"></span>\n <span class=\"leaf3\"></span>\n <span class=\"leaf4\"></span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"loadingCircles\">\n <div id=\"preloader\">\n <div id=\"loader\"></div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"loadingExplosingSquares\">\n <div class=\"loader\">\n <span></span>\n <span></span>\n <span></span>\n <span></span>\n </div>\n </ng-container>\n </ng-container>\n</div>\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';\n\n@Directive({\n selector: '[ksKeyboardNavigation]'\n})\nexport class KeyboardNavigationDirective {\n @Input()\n isOpen: boolean | undefined;\n\n @Output()\n keyboardNavigation: EventEmitter<number> = new EventEmitter<number>();\n\n /**\n * Listener to catch keyboard's events and call the right method based on the key.\n * For instance, pressing esc, this will call `closeGallery(Action.KEYBOARD)` and so on.\n * If you passed a valid `keyboardConfig` esc, right and left buttons will be customized based on your data.\n * @param e KeyboardEvent caught by the listener.\n */\n @HostListener('window:keydown', ['$event'])\n onKeyDown(e: KeyboardEvent): void {\n if (!this.isOpen) {\n return;\n }\n this.keyboardNavigation.emit(e.keyCode);\n }\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Directive, ElementRef, EventEmitter, HostListener, Input, Output, Renderer2 } from '@angular/core';\nimport { SafeResourceUrl } from '@angular/platform-browser';\n\n/**\n * Directive to add fallback image if the original one is not reachable.\n */\n@Directive({\n selector: '[ksFallbackImage]'\n})\nexport class FallbackImageDirective {\n @Input()\n fallbackImg: string | SafeResourceUrl | undefined;\n\n @Output()\n fallbackApplied: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n constructor(private renderer: Renderer2, private el: ElementRef) {}\n\n @HostListener('error') onError(): void {\n if (!this.fallbackImg) {\n this.fallbackApplied.emit(false);\n return;\n }\n this.renderer.setAttribute(this.el.nativeElement, 'src', this.fallbackImg.toString());\n this.fallbackApplied.emit(true);\n }\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Directive, ElementRef, Input, OnChanges, OnInit, Renderer2 } from '@angular/core';\nimport { Size } from '../model/size.interface';\n\n/**\n * Directive to change the size of an element.\n */\n@Directive({\n selector: '[ksSize]'\n})\nexport class SizeDirective implements OnInit, OnChanges {\n /**\n * Object of type `Size` to resize the element.\n */\n @Input()\n sizeConfig: Size | undefined;\n\n constructor(private renderer: Renderer2, private el: ElementRef) {}\n\n /**\n * Method ´ngOnInit´ to apply the style of this directive.\n * This is an Angular lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called only one time!!!\n */\n ngOnInit(): void {\n this.applyStyle();\n }\n\n /**\n * Method ´ngOnChanges´ to apply the style of this directive.\n * This is an Angular lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called when any data-bound property of a directive changes!!!\n */\n ngOnChanges(): void {\n this.applyStyle();\n }\n\n /**\n * Private method to change both width and height of an element.\n */\n private applyStyle(): void {\n if (!this.sizeConfig) {\n return;\n }\n // apply [style.width]\n if (this.sizeConfig.width) {\n this.renderer.setStyle(this.el.nativeElement, 'width', this.sizeConfig.width);\n }\n if (this.sizeConfig.height) {\n this.renderer.setStyle(this.el.nativeElement, 'height', this.sizeConfig.height);\n }\n }\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Directive, ElementRef, Input, OnChanges, OnInit, Renderer2 } from '@angular/core';\nimport { Description } from '../model/description.interface';\n\n/**\n * Directive to customize the description.\n */\n@Directive({\n selector: '[ksDescription]'\n})\nexport class DescriptionDirective implements OnInit, OnChanges {\n /**\n * Object of type `Description` to resize the element.\n */\n @Input()\n description: Description | undefined;\n\n constructor(private renderer: Renderer2, private el: ElementRef) {}\n\n /**\n * Method ´ngOnInit´ to apply the style of this directive.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called only one time!!!\n */\n ngOnInit(): void {\n this.applyStyle();\n }\n\n /**\n * Method ´ngOnChanges´ to apply the style of this directive.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called when any data-bound property of a directive changes!!!\n */\n ngOnChanges(): void {\n this.applyStyle();\n }\n\n /**\n * Private method to change description's style.\n */\n private applyStyle(): void {\n if (!this.description) {\n return;\n }\n\n if (this.description.style) {\n this.renderer.setStyle(this.el.nativeElement, 'background', this.description.style.bgColor);\n this.renderer.setStyle(this.el.nativeElement, 'color', this.description.style.textColor);\n\n if (this.description.style.width) {\n this.renderer.setStyle(this.el.nativeElement, 'width', this.description.style.width);\n }\n if (this.description.style.height) {\n this.renderer.setStyle(this.el.nativeElement, 'height', this.description.style.height);\n }\n if (this.description.style.position) {\n this.renderer.setStyle(this.el.nativeElement, 'position', this.description.style.position);\n }\n if (this.description.style.top) {\n this.renderer.setStyle(this.el.nativeElement, 'top', this.description.style.top);\n }\n if (this.description.style.bottom) {\n this.renderer.setStyle(this.el.nativeElement, 'bottom', this.description.style.bottom);\n }\n if (this.description.style.left) {\n this.renderer.setStyle(this.el.nativeElement, 'left', this.description.style.left);\n }\n if (this.description.style.right) {\n this.renderer.setStyle(this.el.nativeElement, 'right', this.description.style.right);\n }\n\n this.renderer.setStyle(this.el.nativeElement, 'margin-top', this.description.style.marginTop ? this.description.style.marginTop : '0px');\n this.renderer.setStyle(this.el.nativeElement, 'margin-bottom', this.description.style.marginBottom ? this.description.style.marginBottom : '0px');\n this.renderer.setStyle(this.el.nativeElement, 'margin-left', this.description.style.marginLeft ? this.description.style.marginLeft : '0px');\n this.renderer.setStyle(this.el.nativeElement, 'margin-right', this.description.style.marginRight ? this.description.style.marginRight : '0px');\n }\n }\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n HostListener,\n Inject,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n PLATFORM_ID,\n SimpleChange,\n SimpleChanges\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\nimport { Subject, timer } from 'rxjs';\nimport { filter, map, switchMap, takeUntil } from 'rxjs/operators';\n\nimport { AccessibleComponent } from '../accessible.component';\n\nimport { AccessibilityConfig } from '../../model/accessibility.interface';\nimport { Action } from '../../model/action.enum';\nimport { DescriptionStrategy } from '../../model/description.interface';\nimport { Image, ImageModalEvent } from '../../model/image.class';\nimport { InternalLibImage } from '../../model/image-internal.class';\nimport { Keyboard } from '../../model/keyboard.enum';\nimport { KeyboardConfig } from '../../model/keyboard-config.interface';\nimport { SlideConfig } from '../../model/slide-config.interface';\n\nimport { NEXT, PREV } from '../../utils/user-input.util';\nimport { getIndex } from '../../utils/image.util';\nimport { CurrentImageConfig } from '../../model/current-image-config.interface';\nimport { ConfigService } from '../../services/config.service';\nimport { LibConfig } from '../../model/lib-config.interface';\n\n/**\n * Interface to describe the Load Event, used to\n * emit an event when the image is finally loaded and the spinner has gone.\n */\nexport interface ImageLoadEvent {\n status: boolean;\n index: number;\n id: number;\n}\n\n/**\n * Component with the current image with some additional elements like arrows and side previews.\n */\n@Component({\n selector: 'ks-current-image',\n styleUrls: ['current-image.scss', '../image-arrows.scss', 'current-image-previews.scss'],\n templateUrl: 'current-image.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CurrentImageComponent extends AccessibleComponent implements OnInit, OnChanges, AfterContentInit, OnDestroy {\n /**\n * Unique id (>=0) of the current instance of this library. This is useful when you are using\n * the service to call modal gallery without open it manually.\n */\n @Input()\n // @ts-ignore\n id: number;\n /**\n * Object of type `InternalLibImage` that represent the visible image.\n */\n @Input()\n // @ts-ignore\n currentImage: InternalLibImage;\n /**\n * Array of `InternalLibImage` that represent the model of this library with all images,\n * thumbs and so on.\n */\n @Input()\n // @ts-ignore\n images: InternalLibImage[];\n /**\n * Boolean that it is true if the modal gallery is visible.\n * If yes, also this component should be visible.\n */\n @Input()\n // @ts-ignore\n isOpen: boolean;\n\n /**\n * Output to emit an event when images are loaded. The payload contains an `ImageLoadEvent`.\n */\n @Output()\n loadImage: EventEmitter<ImageLoadEvent> = new EventEmitter<ImageLoadEvent>();\n /**\n * Output to emit any changes of the current image. The payload contains an `ImageModalEvent`.\n */\n @Output()\n changeImage: EventEmitter<ImageModalEvent> = new EventEmitter<ImageModalEvent>();\n /**\n * Output to emit an event when the modal gallery is closed. The payload contains an `ImageModalEvent`.\n */\n @Output()\n closeGallery: EventEmitter<ImageModalEvent> = new EventEmitter<ImageModalEvent>();\n\n /**\n * Subject to play modal-gallery.\n */\n private start$ = new Subject<void>();\n /**\n * Subject to stop modal-gallery.\n */\n private stop$ = new Subject<void>();\n\n /**\n * Enum of type `Action` that represents a normal action.\n * Declared here to be used inside the template.\n */\n normalAction: Action = Action.NORMAL;\n /**\n * Object of type `AccessibilityConfig` to init custom accessibility features.\n * For instance, it contains titles, alt texts, aria-labels and so on.\n */\n accessibilityConfig: AccessibilityConfig | undefined;\n /**\n * Object of type `SlideConfig` to get `infinite sliding`.\n */\n slideConfig: SlideConfig | undefined;\n /**\n * Object to configure current image in modal-gallery.\n * For instance you can disable navigation on click on current image (enabled by default).\n */\n currentImageConfig: CurrentImageConfig | undefined;\n /**\n * Object of type `KeyboardConfig` to assign custom keys to both ESC, RIGHT and LEFT keyboard's actions.\n */\n keyboardConfig: KeyboardConfig | undefined;\n /**\n * Enum of type `Action` that represents a mouse click on a button.\n * Declared here to be used inside the template.\n */\n clickAction: Action = Action.CLICK;\n /**\n * Enum of type `Action` that represents a keyboard action.\n * Declared here to be used inside the template.\n */\n keyboardAction: Action = Action.KEYBOARD;\n /**\n * Boolean that it's true when you are watching the first image (currently visible).\n * False by default\n */\n isFirstImage = false;\n /**\n * Boolean that it's true when you are watching the last image (currently visible).\n * False by default\n */\n isLastImage = false;\n /**\n * Boolean that it's true if an image of the modal gallery is still loading.\n * True by default\n */\n loading = true;\n\n /**\n * Private object without type to define all swipe actions used by hammerjs.\n */\n private SWIPE_ACTION = {\n LEFT: 'swipeleft',\n RIGHT: 'swiperight',\n UP: 'swipeup',\n DOWN: 'swipedown'\n };\n\n // use public ChangeDetectorRef to be able to call it from spec files to trigger change detection\n // tslint:disable-next-line:no-any\n constructor(@Inject(PLATFORM_ID) private platformId: any, private ngZone: NgZone,\n public ref: ChangeDetectorRef, private configService: ConfigService) {\n super();\n }\n\n /**\n * Listener to stop the gallery when the mouse pointer is over the current image.\n */\n @HostListener('mouseenter')\n onMouseEnter(): void {\n // if carousel feature is disable, don't do anything in any case\n if (!this.slideConfig || !this.slideConfig.playConfig) {\n return;\n }\n if (!this.slideConfig.playConfig.pauseOnHover) {\n return;\n }\n this.stopCarousel();\n }\n\n /**\n * Listener to play the gallery when the mouse pointer leave the current image.\n */\n @HostListener('mouseleave')\n onMouseLeave(): void {\n // if carousel feature is disable, don't do anything in any case\n if (!this.slideConfig || !this.slideConfig.playConfig) {\n return;\n }\n if (!this.slideConfig.playConfig.pauseOnHover || !this.slideConfig.playConfig.autoPlay) {\n return;\n }\n this.playCarousel();\n }\n\n /**\n * Method ´ngOnInit´ to init configuration.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called only one time!!!\n */\n ngOnInit(): void {\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig || !libConfig.buttonsConfig) {\n throw new Error('Internal library error - libConfig and buttonsConfig must be defined');\n }\n this.slideConfig = libConfig.slideConfig;\n this.accessibilityConfig = libConfig.accessibilityConfig;\n this.currentImageConfig = libConfig.currentImageConfig;\n this.keyboardConfig = libConfig.keyboardConfig;\n }\n\n /**\n * Method ´ngOnChanges´ to update `loading` status and emit events.\n * If the gallery is open, then it will also manage boundary arrows and sliding.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called when any data-bound property of a directive changes!!!\n */\n ngOnChanges(changes: SimpleChanges): void {\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n const images: SimpleChange = changes.images;\n const currentImage: SimpleChange = changes.currentImage;\n\n if (currentImage && currentImage.previousValue !== currentImage.currentValue) {\n this.updateIndexes();\n } else if (images && images.previousValue !== images.currentValue) {\n this.updateIndexes();\n }\n\n const slideConfig: SimpleChange = changes.slideConfig;\n if (slideConfig && slideConfig.previousValue !== slideConfig.currentValue) {\n this.slideConfig = libConfig.slideConfig;\n }\n }\n\n /**\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n */\n ngAfterContentInit(): void {\n // interval doesn't play well with SSR and protractor,\n // so we should run it in the browser and outside Angular\n if (isPlatformBrowser(this.platformId)) {\n this.ngZone.runOutsideAngular(() => {\n this.start$\n .pipe(\n map(() => this.slideConfig && this.slideConfig.playConfig && this.slideConfig.playConfig.autoPlay && this.slideConfig.playConfig.interval),\n // tslint:disable-next-line:no-any\n filter((interval: any) => interval > 0),\n switchMap(interval => timer(interval).pipe(takeUntil(this.stop$)))\n )\n .subscribe(() =>\n this.ngZone.run(() => {\n if (!this.isLastImage) {\n this.nextImage(Action.AUTOPLAY);\n }\n this.ref.markForCheck();\n })\n );\n\n this.start$.next();\n });\n }\n }\n\n /**\n * Method to handle keypress based on the `keyboardConfig` input. It gets the keyCode of\n * the key that triggered the keypress event to navigate between images or to close the modal gallery.\n * @param number keyCode of the key that triggered the keypress event\n */\n onKeyPress(keyCode: number): void {\n const esc: number = this.keyboardConfig && this.keyboardConfig.esc ? this.keyboardConfig.esc : Keyboard.ESC;\n const right: number = this.keyboardConfig && this.keyboardConfig.right ? this.keyboardConfig.right : Keyboard.RIGHT_ARROW;\n const left: number = this.keyboardConfig && this.keyboardConfig.left ? this.keyboardConfig.left : Keyboard.LEFT_ARROW;\n\n switch (keyCode) {\n case esc:\n this.closeGallery.emit(new ImageModalEvent(this.id, Action.KEYBOARD, true));\n break;\n case right:\n this.nextImage(Action.KEYBOARD);\n break;\n case left:\n this.prevImage(Action.KEYBOARD);\n break;\n }\n }\n\n /**\n * Method to get the image description based on input params.\n * If you provide a full description this will be the visible description, otherwise,\n * it will be built using the `Description` object, concatenating its fields.\n * @param Image image to get its description. If not provided it will be the current image\n * @returns String description of the image (or the current image if not provided)\n * @throws an Error if description isn't available\n */\n getDescriptionToDisplay(image: Image = this.currentImage): string {\n if (!this.currentImageConfig || !this.currentImageConfig.description) {\n throw new Error('Description input must be a valid object implementing the Description interface');\n }\n\n const imageWithoutDescription: boolean = !image.modal || !image.modal.description || image.modal.description === '';\n\n switch (this.currentImageConfig.description.strategy) {\n case DescriptionStrategy.HIDE_IF_EMPTY:\n return imageWithoutDescription ? '' : image.modal.description + '';\n case DescriptionStrategy.ALWAYS_HIDDEN:\n return '';\n default:\n // ----------- DescriptionStrategy.ALWAYS_VISIBLE -----------------\n return this.buildTextDescription(image, imageWithoutDescription);\n }\n }\n\n /**\n * Method to get `alt attribute`.\n * `alt` specifies an alternate text for an image, if the image cannot be displayed.\n * @param Image image to get its alt description. If not provided it will be the current image\n * @returns String alt description of the image (or the current image if not provided)\n */\n getAltDescriptionByImage(image: Image = this.currentImage): string {\n if (!image) {\n return '';\n }\n return image.modal && image.modal.description ? image.modal.description : `Image ${getIndex(image, this.images) + 1}`;\n }\n\n /**\n * Method to get the title attributes based on descriptions.\n * This is useful to prevent accessibility issues, because if DescriptionStrategy is ALWAYS_HIDDEN,\n * it prevents an empty string as title.\n * @param Image image to get its description. If not provided it will be the current image\n * @returns String title of the image based on descriptions\n * @throws an Error if description isn't available\n */\n getTitleToDisplay(image: Image = this.currentImage): string {\n if (!this.currentImageConfig || !this.currentImageConfig.description) {\n throw new Error('Description input must be a valid object implementing the Description interface');\n }\n const imageWithoutDescription: boolean = !image.modal || !image.modal.description || image.modal.description === '';\n const description: string = this.buildTextDescription(image, imageWithoutDescription);\n return description;\n }\n\n /**\n * Method to get the left side preview image.\n * @returns Image the image to show as size preview on the left\n */\n getLeftPreviewImage(): Image {\n if (!this.slideConfig) {\n throw new Error('Internal library error - slideConfig must be defined');\n }\n const currentIndex: number = getIndex(this.currentImage, this.images);\n if (currentIndex === 0 && this.slideConfig.infinite) {\n // the current image is the first one,\n // so the previous one is the last image\n // because infinite is true\n return this.images[this.images.length - 1];\n }\n this.handleBoundaries(currentIndex);\n return this.images[Math.max(currentIndex - 1, 0)];\n }\n\n /**\n * Method to get the right side preview image.\n * @returns Image the image to show as size preview on the right\n */\n getRightPreviewImage(): Image {\n if (!this.slideConfig) {\n throw new Error('Internal library error - slideConfig must be defined');\n }\n const currentIndex: number = getIndex(this.currentImage, this.images);\n if (currentIndex === this.images.length - 1 && this.slideConfig.infinite) {\n // the current image is the last one,\n // so the next one is the first image\n // because infinite is true\n return this.images[0];\n }\n this.handleBoundaries(currentIndex);\n return this.images[Math.min(currentIndex + 1, this.images.length - 1)];\n }\n\n /**\n * Method called by events from both keyboard and mouse on an image.\n * This will invoke the nextImage method.\n * @param KeyboardEvent | MouseEvent event payload\n * @param Action action that triggered the event or `Action.NORMAL` if not provided\n */\n onImageEvent(event: KeyboardEvent | MouseEvent, action: Action = Action.NORMAL): void {\n if (!this.currentImageConfig) {\n throw new Error('Internal library error - currentImageConfig must be defined');\n }\n // check if triggered by a mouse click\n // If yes, It should block navigation when navigateOnClick is false\n if (action === Action.CLICK && !this.currentImageConfig.navigateOnClick) {\n // a user has requested to block navigation via configCurrentImage.navigateOnClick property\n return;\n }\n\n const result: number = super.handleImageEvent(event);\n if (result === NEXT) {\n this.nextImage(action);\n }\n }\n\n /**\n * Method called by events from both keyboard and mouse on a navigation arrow.\n * @param string direction of the navigation that can be either 'next' or 'prev'\n * @param KeyboardEvent | MouseEvent event payload\n * @param Action action that triggered the event or `Action.NORMAL` if not provided\n * @param boolean disable to disable navigation\n */\n onNavigationEvent(direction: string, event: KeyboardEvent | MouseEvent, action: Action = Action.NORMAL, disable: boolean = false): void {\n if (disable) {\n return;\n }\n const result: number = super.handleNavigationEvent(direction, event);\n if (result === NEXT) {\n this.nextImage(action);\n } else if (result === PREV) {\n this.prevImage(action);\n }\n }\n\n /**\n * Method to go back to the previous image.\n * @param action Enum of type `Action` that represents the source\n * action that moved back to the previous image. `Action.NORMAL` by default.\n */\n prevImage(action: Action = Action.NORMAL): void {\n // check if prevImage should be blocked\n if (this.isPreventSliding(0)) {\n return;\n }\n const prevImage: InternalLibImage = this.getPrevImage();\n this.loading = !prevImage.previouslyLoaded;\n this.changeImage.emit(new ImageModalEvent(this.id, action, getIndex(prevImage, this.images)));\n\n this.start$.next();\n }\n\n /**\n * Method to go back to the previous image.\n * @param action Enum of type `Action` that represents the source\n * action that moved to the next image. `Action.NORMAL` by default.\n */\n nextImage(action: Action = Action.NORMAL): void {\n // check if nextImage should be blocked\n if (this.isPreventSliding(this.images.length - 1)) {\n return;\n }\n const nextImage: InternalLibImage = this.getNextImage();\n this.loading = !nextImage.previouslyLoaded;\n this.changeImage.emit(new ImageModalEvent(this.id, action, getIndex(nextImage, this.images)));\n\n this.start$.next();\n }\n\n /**\n * Method to emit an event as loadImage output to say that the requested image if loaded.\n * This method is invoked by the javascript's 'load' event on an img tag.\n * @param Event event that triggered the load\n */\n onImageLoad(event: Event): void {\n const loadImageData: ImageLoadEvent = {\n status: true,\n index: getIndex(this.currentImage, this.images),\n id: this.currentImage.id\n };\n\n this.loadImage.emit(loadImageData);\n\n this.loading = false;\n }\n\n /**\n * Method used by Hammerjs to support touch gestures (you can also invert the swipe direction with configCurrentImage.invertSwipe).\n * @param action String that represent the direction of the swipe action. 'swiperight' by default.\n */\n swipe(action = this.SWIPE_ACTION.RIGHT): void {\n if (!this.currentImageConfig) {\n throw new Error('Internal library error - currentImageConfig must be defined');\n }\n switch (action) {\n case this.SWIPE_ACTION.RIGHT:\n if (this.currentImageConfig.invertSwipe) {\n this.prevImage(Action.SWIPE);\n } else {\n this.nextImage(Action.SWIPE);\n }\n break;\n case this.SWIPE_ACTION.LEFT:\n if (this.currentImageConfig.invertSwipe) {\n this.nextImage(Action.SWIPE);\n } else {\n this.prevImage(Action.SWIPE);\n }\n break;\n // case this.SWIPE_ACTION.UP:\n // break;\n // case this.SWIPE_ACTION.DOWN:\n // break;\n }\n }\n\n /**\n * Method used in `modal-gallery.component` to get the index of an image to delete.\n * @param Image image to get the index, or the visible image, if not passed\n * @returns number the index of the image\n */\n getIndexToDelete(image: Image = this.currentImage): number {\n return getIndex(image, this.images);\n }\n\n /**\n * Method to play modal gallery.\n */\n playCarousel(): void {\n this.start$.next();\n }\n\n /**\n * Stops modal gallery from cycling through items.\n */\n stopCarousel(): void {\n this.stop$.next();\n }\n\n /**\n * Method to cleanup resources. In fact, this will stop the modal gallery.\n * This is an Angular's lifecycle hook that is called when this component is destroyed.\n */\n ngOnDestroy(): void {\n this.stopCarousel();\n }\n\n /**\n * Private method to update both `isFirstImage` and `isLastImage` based on\n * the index of the current image.\n * @param number currentIndex is the index of the current image\n */\n private handleBoundaries(currentIndex: number): void {\n if (this.images.length === 1) {\n this.isFirstImage = true;\n this.isLastImage = true;\n this.ref.markForCheck();\n return;\n }\n if (!this.slideConfig || this.slideConfig.infinite === true) {\n // infinite sliding enabled\n this.isFirstImage = false;\n this.isLastImage = false;\n this.ref.markForCheck();\n } else {\n // execute this only if infinite sliding is disabled\n switch (currentIndex) {\n case 0:\n this.isFirstImage = true;\n this.isLastImage = false;\n this.ref.markForCheck();\n break;\n case this.images.length - 1:\n this.isFirstImage = false;\n this.isLastImage = true;\n this.ref.markForCheck();\n break;\n default:\n this.isFirstImage = false;\n this.isLastImage = false;\n this.ref.markForCheck();\n break;\n }\n }\n }\n\n /**\n * Private method to check if next/prev actions should be blocked.\n * It checks if slideConfig.infinite === false and if the image index is equals to the input parameter.\n * If yes, it returns true to say that sliding should be blocked, otherwise not.\n * @param number boundaryIndex that could be either the beginning index (0) or the last index\n * of images (this.images.length - 1).\n * @returns boolean true if slideConfig.infinite === false and the current index is\n * either the first or the last one.\n */\n private isPreventSliding(boundaryIndex: number): boolean {\n return !!this.slideConfig && this.slideConfig.infinite === false && getIndex(this.currentImage, this.images) === boundaryIndex;\n }\n\n /**\n * Private method to get the next index.\n * This is necessary because at the end, when you call next again, you'll go to the first image.\n * That happens because all modal images are shown like in a circle.\n */\n private getNextImage(): InternalLibImage {\n const currentIndex: number = getIndex(this.currentImage, this.images);\n let newIndex = 0;\n if (currentIndex >= 0 && currentIndex < this.images.length - 1) {\n newIndex = currentIndex + 1;\n } else {\n newIndex = 0; // start from the first index\n }\n return this.images[newIndex];\n }\n\n /**\n * Private method to get the previous index.\n * This is necessary because at index 0, when you call prev again, you'll go to the last image.\n * That happens because all modal images are shown like in a circle.\n */\n private getPrevImage(): InternalLibImage {\n const currentIndex: number = getIndex(this.currentImage, this.images);\n let newIndex = 0;\n if (currentIndex > 0 && currentIndex <= this.images.length - 1) {\n newIndex = currentIndex - 1;\n } else {\n newIndex = this.images.length - 1; // start from the last index\n }\n return this.images[newIndex];\n }\n\n /**\n * Private method to build a text description.\n * This is used also to create titles.\n * @param Image image to get its description. If not provided it will be the current image.\n * @param boolean imageWithoutDescription is a boolean that it's true if the image hasn't a 'modal' description.\n * @returns String description built concatenating image fields with a specific logic.\n */\n private buildTextDescription(image: Image, imageWithoutDescription: boolean): string {\n if (!this.currentImageConfig || !this.currentImageConfig.description) {\n throw new Error('Description input must be a valid object implementing the Description interface');\n }\n\n // If customFullDescription use it, otherwise proceed to build a description\n if (this.currentImageConfig.description.customFullDescription && this.currentImageConfig.description.customFullDescription !== '') {\n return this.currentImageConfig.description.customFullDescription;\n }\n\n const currentIndex: number = getIndex(image, this.images);\n // If the current image hasn't a description,\n // prevent to write the ' - ' (or this.description.beforeTextDescription)\n\n const prevDescription: string = this.currentImageConfig.description.imageText ? this.currentImageConfig.description.imageText : '';\n const midSeparator: string = this.currentImageConfig.description.numberSeparator ? this.currentImageConfig.description.numberSeparator : '';\n const middleDescription: string = currentIndex + 1 + midSeparator + this.images.length;\n\n if (imageWithoutDescription) {\n return prevDescription + middleDescription;\n }\n\n const currImgDescription: string = image.modal && image.modal.description ? image.modal.description : '';\n const endDescription: string = this.currentImageConfig.description.beforeTextDescription + currImgDescription;\n return prevDescription + middleDescription + endDescription;\n }\n\n /**\n * Private method to call handleBoundaries when ngOnChanges is called.\n */\n private updateIndexes(): void {\n try {\n if (this.isOpen) {\n const index: number = getIndex(this.currentImage, this.images);\n this.handleBoundaries(index);\n }\n } catch (err) {\n console.error('Cannot get the current image index in current-image');\n throw err;\n }\n }\n}\n","<main class=\"main-image-container\"\n ksKeyboardNavigation [isOpen]=\"isOpen\" (keyboardNavigation)=\"onKeyPress($event)\"\n [attr.aria-label]=\"accessibilityConfig?.mainContainerAriaLabel\"\n [title]=\"accessibilityConfig?.mainContainerTitle\">\n\n <div class=\"left-sub-container\">\n <a class=\"nav-left {{isFirstImage ? 'no-pointer' : ''}}\"\n [attr.aria-label]=\"accessibilityConfig?.mainPrevImageAriaLabel\"\n [tabIndex]=\"isFirstImage ? -1 : 0\" role=\"button\"\n (click)=\"onNavigationEvent('left', $event)\" (keyup)=\"onNavigationEvent('left', $event)\">\n <div class=\"inside {{isFirstImage ? 'empty-arrow-image' : 'left-arrow-image'}}\"\n aria-hidden=\"true\"\n [title]=\"isFirstImage ? '' : accessibilityConfig?.mainPrevImageTitle\"></div>\n </a>\n\n <ng-container *ngIf=\"slideConfig?.sidePreviews?.show\">\n <ng-container *ngIf=\"getLeftPreviewImage() as leftPreview\">\n <img *ngIf=\"!isFirstImage; else firstImage\"\n class=\"inside current-image-previous\"\n [src]=\"leftPreview.plain?.img ? leftPreview.plain?.img : leftPreview.modal.img\"\n ksFallbackImage [fallbackImg]=\"leftPreview.plain?.fallbackImg ? leftPreview.plain?.fallbackImg : leftPreview.modal.fallbackImg\"\n [hidden]=\"loading\"\n ksSize [sizeConfig]=\"{width: slideConfig?.sidePreviews?.size.width, height: slideConfig?.sidePreviews?.size.height}\"\n [attr.aria-label]=\"leftPreview.modal.ariaLabel\"\n [title]=\"(leftPreview.modal.title || leftPreview.modal.title === '') ? leftPreview.modal.title : getDescriptionToDisplay(leftPreview)\"\n alt=\"{{leftPreview.modal.alt ? leftPreview.modal.alt : getAltDescriptionByImage(leftPreview)}}\"\n [tabIndex]=\"0\" role=\"img\"\n (click)=\"onNavigationEvent('left', $event, clickAction)\" (keyup)=\"onNavigationEvent('left', $event, keyboardAction)\"/>\n <ng-template #firstImage>\n <div class=\"current-image-previous hidden\"\n ksSize [sizeConfig]=\"{width: slideConfig?.sidePreviews?.size.width, height: slideConfig?.sidePreviews?.size.height}\"></div>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n\n\n <figure id=\"current-figure\" [style.display]=\"loading ? 'none' : ''\">\n <img id=\"current-image\"\n class=\"inside\"\n [ngClass]=\"currentImageConfig?.navigateOnClick ? '' : 'unclickable'\"\n [src]=\"currentImage.modal.img\"\n ksFallbackImage [fallbackImg]=\"currentImage.modal.fallbackImg\"\n [attr.aria-label]=\"currentImage.modal.ariaLabel\"\n [title]=\"(currentImage.modal.title || currentImage.modal.title === '') ? currentImage.modal.title : getTitleToDisplay()\"\n alt=\"{{currentImage.modal.alt ? currentImage.modal.alt : getAltDescriptionByImage()}}\"\n [tabIndex]=\"0\" role=\"img\"\n (load)=\"onImageLoad($event)\"\n (click)=\"onImageEvent($event, clickAction)\" (keyup)=\"onImageEvent($event, keyboardAction)\"\n (swipeleft)=\"swipe($event.type)\"\n (swiperight)=\"swipe($event.type)\"/>\n <figcaption *ngIf=\"getDescriptionToDisplay() !== ''\"\n class=\"inside description\"\n ksDescription [description]=\"currentImageConfig?.description\"\n [innerHTML]=\"getDescriptionToDisplay()\">\n </figcaption>\n </figure>\n\n <div class=\"right-sub-container\">\n <ng-container *ngIf=\"slideConfig?.sidePreviews?.show\">\n <ng-container *ngIf=\"getRightPreviewImage() as rightPreview\">\n <img *ngIf=\"!isLastImage; else lastImage\"\n class=\"inside current-image-next\"\n [src]=\"rightPreview.plain?.img ? rightPreview.plain?.img : rightPreview.modal.img\"\n ksFallbackImage [fallbackImg]=\"rightPreview.plain?.fallbackImg ? rightPreview.plain?.fallbackImg : rightPreview.modal.fallbackImg\"\n [hidden]=\"loading\"\n ksSize [sizeConfig]=\"{width: slideConfig?.sidePreviews?.size.width, height: slideConfig?.sidePreviews?.size.height}\"\n [attr.aria-label]=\"rightPreview.modal.ariaLabel\"\n [title]=\"(rightPreview.modal.title || rightPreview.modal.title === '') ? rightPreview.modal.title : getDescriptionToDisplay(rightPreview)\"\n alt=\"{{rightPreview.modal.alt ? rightPreview.modal.alt : getAltDescriptionByImage(rightPreview)}}\"\n [tabIndex]=\"0\" role=\"img\"\n (click)=\"onNavigationEvent('right', $event, clickAction)\" (keyup)=\"onNavigationEvent('right', $event, keyboardAction)\"/>\n <ng-template #lastImage>\n <div class=\"current-image-next hidden\"\n ksSize [sizeConfig]=\"{width: slideConfig?.sidePreviews?.size.width, height: slideConfig?.sidePreviews?.size.height}\">\n </div>\n </ng-template>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"loading && currentImageConfig?.loadingConfig?.enable\">\n <ks-loading-spinner [loadingConfig]=\"currentImageConfig?.loadingConfig\"\n [accessibilityConfig]=\"accessibilityConfig\"></ks-loading-spinner>\n </ng-container>\n\n <a class=\"nav-right {{isFirstImage ? 'no-pointer' : ''}}\"\n [attr.aria-label]=\"accessibilityConfig?.mainNextImageAriaLabel\"\n [tabIndex]=\"isLastImage ? -1 : 0\" role=\"button\"\n (click)=\"onNavigationEvent('right', $event)\" (keyup)=\"onNavigationEvent('right', $event)\">\n <div class=\"inside {{isLastImage ? 'empty-arrow-image' : 'right-arrow-image'}}\"\n aria-hidden=\"true\"\n [title]=\"isLastImage ? '' : accessibilityConfig?.mainNextImageTitle\"></div>\n </a>\n </div>\n</main>\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\nimport { LibConfig } from '../model/lib-config.interface';\n\n/**\n * Service to intercept ctrl+s (or cmd+s on macOS) using a third-party library, called Mousetrap.\n */\n@Injectable({ providedIn: 'root' })\nexport class KeyboardService {\n /**\n * Private Mousetrap variable to store the instance.\n */\n // tslint:disable-next-line:no-any\n private mousetrapInstance: any;\n\n // tslint:disable-next-line:no-any\n constructor(@Inject(PLATFORM_ID) private platformId: any) {}\n\n init(config: LibConfig): Promise<void> {\n return new Promise((resolve, reject) => {\n // temporary workaround to fix this issue: https://github.com/Ks89/angular-modal-gallery/issues/142\n if (config.keyboardServiceConfig && !config.keyboardServiceConfig.disableSsrWorkaround) {\n // To prevent issues with angular-universal on server-side\n if (isPlatformBrowser(this.platformId)) {\n import('mousetrap')\n // tslint:disable-next-line:no-any\n .then((loaded: any) => {\n // in this case, the .default is required for Typescript Dynamic Imports\n this.mousetrapInstance = loaded.default;\n resolve();\n return;\n })\n .catch(err => {\n reject(err);\n return;\n });\n } else {\n resolve();\n return;\n }\n } else {\n resolve();\n return;\n }\n });\n }\n\n /**\n * Method to add a lister for ctrl+s/cmd+s keyboard events.\n * @param (e: KeyboardEvent, combo: string) => any onBind callback function to add shortcuts\n */\n // tslint:disable-next-line:no-any\n add(onBind: (e: KeyboardEvent, combo: string) => any, config: LibConfig): void {\n // temporary workaround to fix this issue: https://github.com/Ks89/angular-modal-gallery/issues/142\n if (config.keyboardServiceConfig && !config.keyboardServiceConfig.disableSsrWorkaround) {\n // To prevent issues with angular-universal on server-side\n if (isPlatformBrowser(this.platformId)) {\n this.mousetrapInstance.bind(config.keyboardServiceConfig.shortcuts, (event: KeyboardEvent, combo: string) => {\n if (event.preventDefault) {\n event.preventDefault();\n } else {\n // internet explorer\n event.returnValue = false;\n }\n onBind(event, combo);\n });\n }\n }\n }\n\n /**\n * Method to reset all listeners. Please, call this function when needed\n * to free resources ad prevent leaks.\n */\n reset(config: LibConfig): void {\n // temporary workaround to fix this issue: https://github.com/Ks89/angular-modal-gallery/issues/142\n if (config.keyboardServiceConfig && !config.keyboardServiceConfig.disableSsrWorkaround) {\n // To prevent issues with angular-universal on server-side\n if (isPlatformBrowser(this.platformId)) {\n this.mousetrapInstance.reset();\n }\n }\n }\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Injectable } from '@angular/core';\n\n/**\n * Service to check if the provided id is unique\n */\n@Injectable({ providedIn: 'root' })\nexport class IdValidatorService {\n ids = new Map();\n\n /**\n * Method to check and reserve an id for the current instance of the library.\n * In this way, no other instances can use the same id.\n * @param galleryId number or undefined that represents the unique id of the gallery.\n * @return boolean true if success. false is never returned, instead an exception is thrown\n * @throws a error with a message if galleryId is neither unique, < 0 or an integer\n */\n checkAndAdd(galleryId: number | undefined): boolean {\n if (galleryId === undefined || !Number.isInteger(galleryId) || galleryId < 0) {\n throw new Error('You must provide a valid [id]=\"unique integer > 0 here\" to the gallery/carousel in your template');\n }\n if (this.ids.get(galleryId)) {\n throw new Error(`Cannot create gallery with id=${galleryId} because already used in your application. This must be a unique integer >= 0`);\n }\n this.ids.set(galleryId, galleryId);\n return true;\n }\n\n /**\n * Method to remove a reserved id. In this way you are able to use the id again for another instance of the library.\n * @param galleryId number or undefined that represents the unique id of the gallery.\n * @return boolean true if success. false is never returned, instead an exception is thrown*\n * @throws a error with a message if galleryId is neither integer or < 0\n * * this should be improved without return true, because it doesn't make sense! :(\n */\n remove(galleryId: number | undefined): boolean {\n if (galleryId === undefined || !Number.isInteger(galleryId) || galleryId < 0) {\n throw new Error('You must provide a valid [id]=\"unique integer > 0 here\" to the gallery/carousel in your template');\n }\n this.ids.delete(galleryId);\n return true;\n }\n}\n","import { ButtonConfig, ButtonType } from '../../model/buttons-config.interface';\nimport { Size } from '../../model/size.interface';\n\n/**\n * Default button size object\n */\nexport const KS_DEFAULT_SIZE: Size = { height: 'auto', width: '30px' };\n\n/**\n * Default close button object\n */\nexport const KS_DEFAULT_BTN_CLOSE: ButtonConfig = {\n className: 'close-image',\n size: KS_DEFAULT_SIZE,\n type: ButtonType.CLOSE,\n title: 'Close this modal image gallery',\n ariaLabel: 'Close this modal image gallery'\n};\n\n/**\n * Default download button object\n */\nexport const KS_DEFAULT_BTN_DOWNLOAD: ButtonConfig = {\n className: 'download-image',\n size: KS_DEFAULT_SIZE,\n type: ButtonType.DOWNLOAD,\n title: 'Download the current image',\n ariaLabel: 'Download the current image'\n};\n\n/**\n * Default exturl button object\n */\nexport const KS_DEFAULT_BTN_EXTURL: ButtonConfig = {\n className: 'ext-url-image',\n size: KS_DEFAULT_SIZE,\n type: ButtonType.EXTURL,\n title: 'Navigate the current image',\n ariaLabel: 'Navigate the current image'\n};\n// /**\n// * Default refresh button object\n// */\n// export const KS_DEFAULT_BTN_REFRESH: ButtonConfig = {\n// className: 'refresh-image',\n// size: KS_DEFAULT_SIZE,\n// type: ButtonType.REFRESH,\n// title: 'Refresh all images',\n// ariaLabel: 'Refresh all images'\n// };\n\n/**\n * Default delete button object\n */\nexport const KS_DEFAULT_BTN_DELETE: ButtonConfig = {\n className: 'delete-image',\n size: KS_DEFAULT_SIZE,\n type: ButtonType.DELETE,\n title: 'Delete the current image',\n ariaLabel: 'Delete the current image'\n};\n\n/**\n * Default full-screen button object\n */\nexport const KS_DEFAULT_BTN_FULL_SCREEN: ButtonConfig = {\n className: 'fullscreen-image',\n size: KS_DEFAULT_SIZE,\n type: ButtonType.FULLSCREEN,\n title: 'Switch to full-screen',\n ariaLabel: 'Switch to full-screen'\n};\n/**\n * Default rotate button object\n */\n// export const KS_DEFAULT_BTN_ROTATE: ButtonConfig = {\n// className: 'rotate-image',\n// size: KS_DEFAULT_SIZE,\n// type: ButtonType.ROTATE,\n// title: 'Rotate clockwise of 90 degrees the current image',\n// ariaLabel: 'Rotate clockwise of 90 degrees the current image'\n// };\n","/*\n The MIT License (MIT)\n\n Copyright (c) 2017 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\nimport { AccessibleComponent } from '../accessible.component';\n\nimport { Action } from '../../model/action.enum';\nimport { Image } from '../../model/image.class';\nimport { ButtonConfig, ButtonEvent, ButtonsConfig, ButtonsStrategy, ButtonType, WHITELIST_BUTTON_TYPES } from '../../model/buttons-config.interface';\n\nimport {\n KS_DEFAULT_BTN_CLOSE,\n KS_DEFAULT_BTN_DELETE,\n KS_DEFAULT_BTN_DOWNLOAD,\n KS_DEFAULT_BTN_EXTURL,\n KS_DEFAULT_BTN_FULL_SCREEN\n} from './upper-buttons-default';\n\nimport { NEXT } from '../../utils/user-input.util';\nimport { ConfigService } from '../../services/config.service';\nimport { LibConfig } from '../../model/lib-config.interface';\n\n/**\n * Internal representation of `ButtonConfig` with an optional `id` field, used by trackId to improve performances.\n */\nexport interface InternalButtonConfig extends ButtonConfig {\n id?: number; // useful only for trackById, not needed by users\n}\n\n/**\n * Component with all upper buttons.\n * Also it emits click events as outputs.\n */\n@Component({\n selector: 'ks-upper-buttons',\n styleUrls: ['upper-buttons.scss'],\n templateUrl: 'upper-buttons.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class UpperButtonsComponent extends AccessibleComponent implements OnInit {\n /**\n * Unique id (>=0) of the current instance of this library. This is required when you are using\n * the service to call modal gallery.\n */\n @Input()\n id: number | undefined;\n /**\n * Object of type `Image` that represent the visible image.\n */\n @Input()\n currentImage: Image | undefined;\n\n /**\n * Output to emit clicks on refresh button. The payload contains a `ButtonEvent`.\n */\n @Output()\n refresh: EventEmitter<ButtonEvent> = new EventEmitter<ButtonEvent>();\n /**\n * Output to emit clicks on delete button. The payload contains a `ButtonEvent`.\n */\n @Output()\n delete: EventEmitter<ButtonEvent> = new EventEmitter<ButtonEvent>();\n /**\n * Output to emit clicks on navigate button. The payload contains a `ButtonEvent`.\n */\n @Output()\n navigate: EventEmitter<ButtonEvent> = new EventEmitter<ButtonEvent>();\n /**\n * Output to emit clicks on download button. The payload contains a `ButtonEvent`.\n */\n @Output()\n download: EventEmitter<ButtonEvent> = new EventEmitter<ButtonEvent>();\n /**\n * Output to emit clicks on close button. The payload contains a `ButtonEvent`.\n */\n @Output()\n closeButton: EventEmitter<ButtonEvent> = new EventEmitter<ButtonEvent>();\n /**\n * Output to emit clicks on full-screen button. The payload contains a `ButtonEvent`.\n */\n @Output()\n fullscreen: EventEmitter<ButtonEvent> = new EventEmitter<ButtonEvent>();\n /**\n * Output to emit clicks on all custom buttons. The payload contains a `ButtonEvent`.\n */\n @Output()\n customEmit: EventEmitter<ButtonEvent> = new EventEmitter<ButtonEvent>();\n\n /**\n * Object of type `ButtonsConfig` to init UpperButtonsComponent's features.\n * For instance, it contains an array of buttons.\n */\n buttonsConfig: ButtonsConfig | undefined;\n /**\n * Array of `InternalButtonConfig` exposed to the template. This field is initialized\n * applying transformations, default values and so on to the input of the same type.\n */\n buttons: InternalButtonConfig[] | undefined;\n\n /**\n * Default buttons array for standard configuration\n */\n private defaultButtonsDefault: ButtonConfig[] = [KS_DEFAULT_BTN_CLOSE];\n /**\n * Default buttons array for simple configuration\n */\n private simpleButtonsDefault: ButtonConfig[] = [KS_DEFAULT_BTN_DOWNLOAD, ...this.defaultButtonsDefault];\n /**\n * Default buttons array for advanced configuration\n */\n private advancedButtonsDefault: ButtonConfig[] = [KS_DEFAULT_BTN_EXTURL, ...this.simpleButtonsDefault];\n /**\n * Default buttons array for full configuration\n */\n private fullButtonsDefault: ButtonConfig[] = [\n KS_DEFAULT_BTN_FULL_SCREEN,\n KS_DEFAULT_BTN_DELETE,\n ...this.advancedButtonsDefault\n ];\n\n constructor(private configService: ConfigService) {\n super();\n }\n\n /**\n * Method ´ngOnInit´ to build `configButtons` applying a default value and also to\n * init the `buttons` array.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called only one time!!!\n */\n ngOnInit(): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig || !libConfig.buttonsConfig) {\n throw new Error('Internal library error - libConfig and buttonsConfig must be defined');\n }\n this.buttonsConfig = libConfig.buttonsConfig;\n switch (this.buttonsConfig.strategy) {\n case ButtonsStrategy.SIMPLE:\n this.buttons = this.addButtonIds(this.simpleButtonsDefault);\n break;\n case ButtonsStrategy.ADVANCED:\n this.buttons = this.addButtonIds(this.advancedButtonsDefault);\n break;\n case ButtonsStrategy.FULL:\n this.buttons = this.addButtonIds(this.fullButtonsDefault);\n break;\n case ButtonsStrategy.CUSTOM:\n this.buttons = this.addButtonIds(this.validateCustomButtons(this.buttonsConfig.buttons));\n break;\n case ButtonsStrategy.DEFAULT:\n default:\n this.buttons = this.addButtonIds(this.defaultButtonsDefault);\n break;\n }\n }\n\n /**\n * Method called by events from both keyboard and mouse on a button.\n * This will call a private method to trigger an output with the right payload.\n * @param InternalButtonConfig button that called this method\n * @param KeyboardEvent | MouseEvent event payload\n * @param Action action that triggered the source event or `Action.CLICK` if not specified\n * @throws an error if the button type is unknown\n */\n onEvent(button: InternalButtonConfig, event: KeyboardEvent | MouseEvent, action: Action = Action.CLICK): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n if (!event) {\n return;\n }\n const dataToEmit: ButtonEvent = {\n button,\n // current image initialized as null\n // (I'll fill this value inside the parent of this component\n image: null,\n action,\n galleryId: this.id\n };\n switch (button.type) {\n case ButtonType.DELETE:\n this.triggerOnMouseAndKeyboard(this.delete, event, dataToEmit);\n break;\n case ButtonType.EXTURL:\n if (!this.currentImage || !this.currentImage.modal || !this.currentImage.modal.extUrl) {\n return;\n }\n this.triggerOnMouseAndKeyboard(this.navigate, event, dataToEmit);\n break;\n case ButtonType.DOWNLOAD:\n this.triggerOnMouseAndKeyboard(this.download, event, dataToEmit);\n break;\n case ButtonType.CLOSE:\n this.triggerOnMouseAndKeyboard(this.closeButton, event, dataToEmit);\n break;\n case ButtonType.CUSTOM:\n this.triggerOnMouseAndKeyboard(this.customEmit, event, dataToEmit);\n break;\n case ButtonType.FULLSCREEN:\n this.triggerOnMouseAndKeyboard(this.fullscreen, event, dataToEmit);\n break;\n default:\n throw new Error(`Unknown button's type into ButtonConfig`);\n }\n }\n\n /**\n * Method used in the template to track ids in ngFor.\n * @param number index of the array\n * @param Image item of the array\n * @returns number the id of the item or undefined if the item is not valid\n */\n trackById(index: number, item: InternalButtonConfig): number | undefined {\n return item ? item.id : undefined;\n }\n\n /**\n * Private method to emit an event using the specified output as an `EventEmitter`.\n * @param EventEmitter<ButtonEvent> emitter is the output to emit the `ButtonEvent`\n * @param KeyboardEvent | MouseEvent event is the source that triggered this method\n * @param ButtonEvent dataToEmit payload to emit\n */\n private triggerOnMouseAndKeyboard(emitter: EventEmitter<ButtonEvent>, event: KeyboardEvent | MouseEvent, dataToEmit: ButtonEvent): void {\n if (!emitter) {\n throw new Error(`UpperButtonsComponent unknown emitter in triggerOnMouseAndKeyboard`);\n }\n\n const result: number = super.handleImageEvent(event);\n if (result === NEXT) {\n emitter.emit(dataToEmit);\n }\n }\n\n /**\n * Private method to add ids to the array of buttons.\n * It adds ids in a reverse way, to be sure that the last button will always have id = 0.\n * This is really useful in unit testing to be sure that close button always have id = 0, download 1 and so on...\n * It's totally transparent to the user.\n * @param ButtonConfig[] buttons config array\n * @returns ButtonConfig[] the input array with incremental numeric ids\n */\n private addButtonIds(buttons: ButtonConfig[]): ButtonConfig[] {\n return buttons.map((val: ButtonConfig, i: number) => Object.assign(val, { id: buttons.length - 1 - i }));\n }\n\n /**\n * Private method to validate custom buttons received as input.\n * @param ButtonConfig[] buttons config array. [] by default.\n * @returns ButtonConfig[] the same input buttons config array\n * @throws an error is exists a button with an unknown type\n */\n private validateCustomButtons(buttons: ButtonConfig[] = []): ButtonConfig[] {\n buttons.forEach((val: ButtonConfig) => {\n const indexOfButtonType: number = WHITELIST_BUTTON_TYPES.findIndex((type: ButtonType) => type === val.type);\n if (indexOfButtonType === -1) {\n throw new Error(`Unknown ButtonType. For custom types use ButtonType.CUSTOM`);\n }\n });\n return buttons;\n }\n}\n","<header class=\"buttons-container\">\n\n <ng-container *ngIf=\"!buttonsConfig || buttonsConfig?.visible\">\n <a *ngFor=\"let btn of buttons; trackBy: trackById; let index = index\"\n class=\"upper-button\"\n ksSize [sizeConfig]=\"{width: btn.size?.width!, height: btn.size?.height!}\"\n [ngStyle]=\"{'font-size': btn.fontSize}\"\n [attr.aria-label]=\"btn.ariaLabel\"\n [tabIndex]=\"0\" role=\"button\"\n (click)=\"onEvent(btn, $event)\" (keyup)=\"onEvent(btn, $event)\">\n <div class=\"inside {{btn.className}}\" aria-hidden=\"true\" title=\"{{btn.title}}\"></div>\n </a>\n </ng-container>\n</header>\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChange, SimpleChanges } from '@angular/core';\n\nimport { AccessibleComponent } from '../accessible.component';\n\nimport { AccessibilityConfig } from '../../model/accessibility.interface';\nimport { Image } from '../../model/image.class';\nimport { InternalLibImage } from '../../model/image-internal.class';\nimport { DotsConfig } from '../../model/dots-config.interface';\n\nimport { NEXT } from '../../utils/user-input.util';\nimport { getIndex } from '../../utils/image.util';\nimport { ConfigService } from '../../services/config.service';\nimport { LibConfig } from '../../model/lib-config.interface';\n\n/**\n * Component with clickable dots (small circles) to navigate between images inside the modal gallery.\n */\n@Component({\n selector: 'ks-dots',\n styleUrls: ['dots.scss'],\n templateUrl: 'dots.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DotsComponent extends AccessibleComponent implements OnInit, OnChanges {\n /**\n * Unique id (>=0) of the current instance of this library. This is required when you are using\n * the service to call modal gallery.\n */\n @Input()\n id: number | undefined;\n /**\n * Object of type `InternalLibImage` that represent the visible image.\n */\n @Input()\n currentImage: InternalLibImage | undefined;\n /**\n * Array of `InternalLibImage` that represent the model of this library with all images,\n * thumbs and so on.\n */\n @Input()\n images: InternalLibImage[] | undefined;\n /**\n * Object of type `DotsConfig` to init DotsComponent's features.\n * For instance, it contains a param to show/hide this component.\n */\n @Input()\n dotsConfig: DotsConfig | undefined;\n\n /**\n * Output to emit clicks on dots. The payload contains a number that represent\n * the index of the clicked dot.\n */\n @Output()\n clickDot: EventEmitter<number> = new EventEmitter<number>();\n\n /**\n * Object of type `DotsConfig` used in template.\n */\n configDots: DotsConfig | undefined;\n /**\n * Object of type `AccessibilityConfig` to init custom accessibility features.\n * For instance, it contains titles, alt texts, aria-labels and so on.\n */\n accessibilityConfig: AccessibilityConfig | undefined;\n\n constructor(private configService: ConfigService) {\n super();\n }\n\n /**\n * Method ´ngOnInit´ to build `configDots` applying a default value.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called only one time!!!\n */\n ngOnInit(): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n this.accessibilityConfig = libConfig.accessibilityConfig;\n this.configDots = Object.assign({}, this.dotsConfig);\n }\n\n /**\n * Method ´ngOnChanges´ to change `configDots` if the input dotsConfig is changed.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n */\n ngOnChanges(changes: SimpleChanges): void {\n const dotsConfigChanges: SimpleChange = changes.dotsConfig;\n if (dotsConfigChanges && dotsConfigChanges.currentValue !== dotsConfigChanges.previousValue) {\n this.configDots = dotsConfigChanges.currentValue;\n }\n }\n\n /**\n * Method to check if an image is active (i.e. the current image).\n * It checks currentImage and images to prevent errors.\n * @param number index of the image to check if it's active or not\n * @returns boolean true if is active (and input params are valid), false otherwise\n */\n isActive(index: number): boolean {\n if (!this.currentImage || !this.images || this.images.length === 0) {\n return false;\n }\n let imageIndex: number;\n try {\n imageIndex = getIndex(this.currentImage, this.images);\n } catch (err) {\n console.error(`Internal error while trying to show the active 'dot'`, err);\n return false;\n }\n return index === imageIndex;\n }\n\n /**\n * Method called by events from keyboard and mouse.\n * @param number index of the dot\n * @param KeyboardEvent | MouseEvent event payload\n */\n onDotEvent(index: number, event: KeyboardEvent | MouseEvent): void {\n const result: number = super.handleImageEvent(event);\n if (result === NEXT) {\n this.clickDot.emit(index);\n }\n }\n\n /**\n * Method used in the template to track ids in ngFor.\n * @param number index of the array\n * @param Image item of the array\n * @returns number the id of the item\n */\n trackById(index: number, item: Image): number {\n return item.id;\n }\n}\n","<nav class=\"dots-container\" [attr.aria-label]=\"accessibilityConfig?.dotsContainerAriaLabel\"\n [title]=\"accessibilityConfig?.dotsContainerTitle\">\n <ng-container *ngIf=\"!dotsConfig || dotsConfig?.visible\">\n <div class=\"inside dot\"\n *ngFor=\"let img of images; trackBy: trackById; let index = index\"\n [ngClass]=\"{'active': isActive(index)}\"\n [attr.aria-label]=\"accessibilityConfig?.dotAriaLabel + ' ' + (index + 1)\"\n [tabIndex]=\"0\" role=\"navigation\"\n (click)=\"onDotEvent(index, $event)\" (keyup)=\"onDotEvent(index, $event)\"></div>\n </ng-container>\n</nav>\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChange, SimpleChanges } from '@angular/core';\n\nimport { AccessibleComponent } from '../accessible.component';\n\nimport { AccessibilityConfig } from '../../model/accessibility.interface';\nimport { Image, ImageEvent, ImageModalEvent } from '../../model/image.class';\nimport { InternalLibImage } from '../../model/image-internal.class';\nimport { PreviewConfig } from '../../model/preview-config.interface';\nimport { SlideConfig } from '../../model/slide-config.interface';\n\nimport { NEXT, PREV } from '../../utils/user-input.util';\nimport { getIndex } from '../../utils/image.util';\nimport { Action } from '../../model/action.enum';\nimport { ConfigService, DEFAULT_PREVIEW_SIZE } from '../../services/config.service';\nimport { Size } from '../../model/size.interface';\nimport { LibConfig } from '../../model/lib-config.interface';\n\n/**\n * Component with image previews\n */\n@Component({\n selector: 'ks-previews',\n styleUrls: ['previews.scss', '../previews-arrows.scss'],\n templateUrl: 'previews.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PreviewsComponent extends AccessibleComponent implements OnInit, OnChanges {\n /**\n * Unique id (>=0) of the current instance of this library. This is required when you are using\n * the service to call modal gallery.\n */\n @Input()\n id: number | undefined;\n /**\n * Object of type `InternalLibImage` that represent the visible image.\n */\n @Input()\n currentImage: InternalLibImage | undefined;\n /**\n * Array of `InternalLibImage` that represent the model of this library with all images,\n * thumbs and so on.\n */\n @Input()\n images: InternalLibImage[] | undefined;\n\n /**\n * Output to emit the clicked preview. The payload contains the `ImageEvent` associated to the clicked preview.\n */\n @Output()\n clickPreview: EventEmitter<ImageEvent> = new EventEmitter<ImageEvent>();\n\n /**\n * Object of type `AccessibilityConfig` to init custom accessibility features.\n * For instance, it contains titles, alt texts, aria-labels and so on.\n */\n accessibilityConfig: AccessibilityConfig | undefined;\n /**\n * Object of type `SlideConfig` to get `infinite sliding`.\n */\n slideConfig: SlideConfig | undefined;\n /**\n * Object of type `PreviewConfig` to init PreviewsComponent's features.\n * For instance, it contains a param to show/hide this component, sizes.\n */\n previewConfig: PreviewConfig | undefined;\n /**\n * Enum of type `Action` that represents a mouse click on a button.\n * Declared here to be used inside the template.\n */\n clickAction: Action = Action.CLICK;\n /**\n * Enum of type `Action` that represents a keyboard action.\n * Declared here to be used inside the template.\n */\n keyboardAction: Action = Action.KEYBOARD;\n /**\n * Array of `InternalLibImage` exposed to the template. This field is initialized\n * applying transformations, default values and so on to the input of the same type.\n */\n previews: InternalLibImage[] = [];\n /**\n * Start index of the input images used to display previews.\n */\n // @ts-ignore\n start: number;\n /**\n * End index of the input images used to display previews.\n */\n // @ts-ignore\n end: number;\n\n defaultPreviewSize: Size = DEFAULT_PREVIEW_SIZE;\n\n constructor(private configService: ConfigService) {\n super();\n }\n\n /**\n * Method ´ngOnInit´ to build `configPreview` applying a default value and also to\n * init the `previews` array.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called only one time!!!\n */\n ngOnInit(): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n this.accessibilityConfig = libConfig.accessibilityConfig;\n this.slideConfig = libConfig.slideConfig;\n this.previewConfig = libConfig.previewConfig;\n if (!this.currentImage || !this.images) {\n throw new Error('Internal library error - currentImage and images must be defined');\n }\n this.initPreviews(this.currentImage, this.images);\n }\n\n /**\n * Method to check if an image is active (i.e. a preview image).\n * @param InternalLibImage preview is an image to check if it's active or not\n * @returns boolean true if is active, false otherwise\n */\n isActive(preview: InternalLibImage): boolean {\n if (!preview || !this.currentImage) {\n return false;\n }\n return preview.id === this.currentImage.id;\n }\n\n /**\n * Method ´ngOnChanges´ to update `previews` array.\n * Also, both `start` and `end` local variables will be updated accordingly.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called when any data-bound property of a directive changes!!!\n */\n ngOnChanges(changes: SimpleChanges): void {\n const images: SimpleChange = changes.images;\n const currentImage: SimpleChange = changes.currentImage;\n\n let prev;\n let current;\n\n if (currentImage) {\n prev = currentImage.previousValue;\n current = currentImage.currentValue;\n } else {\n current = this.currentImage;\n }\n\n if (current && images && images.previousValue && images.currentValue) {\n // I'm in this if statement, if input images are changed (for instance, because I removed one of them with the 'delete button',\n // or because users changed the images array while modal gallery is still open).\n // In this case, I have to re-init previews, because the input array of images is changed.\n this.initPreviews(current, images.currentValue);\n }\n\n if (prev && current && prev.id !== current.id) {\n this.updatePreviews(prev, current);\n }\n }\n\n /**\n * Method called by events from both keyboard and mouse on a preview.\n * This will trigger the `clickpreview` output with the input preview as its payload.\n * @param InternalLibImage preview that triggered this method\n * @param KeyboardEvent | MouseEvent event payload\n * @param Action action that triggered the source event or `Action.NORMAL` if not specified\n */\n onImageEvent(preview: InternalLibImage, event: KeyboardEvent | MouseEvent, action: Action = Action.NORMAL): void {\n if (!this.id || !this.images) {\n throw new Error('Internal library error - id and images must be defined');\n }\n if (!this.previewConfig || !this.previewConfig.clickable) {\n return;\n }\n const result: number = super.handleImageEvent(event);\n if (result === NEXT || result === PREV) {\n this.clickPreview.emit(new ImageModalEvent(this.id, action, getIndex(preview, this.images)));\n }\n }\n\n /**\n * Method called by events from both keyboard and mouse on a navigation arrow.\n * It also emits an event to specify which arrow.\n * @param string direction of the navigation that can be either 'next' or 'prev'\n * @param KeyboardEvent | MouseEvent event payload\n * @param Action action that triggered the source event or `Action.NORMAL` if not specified\n */\n onNavigationEvent(direction: string, event: KeyboardEvent | MouseEvent, action: Action = Action.NORMAL): void {\n const result: number = super.handleNavigationEvent(direction, event);\n if (result === NEXT) {\n this.next();\n } else if (result === PREV) {\n this.previous();\n }\n }\n\n /**\n * Method used in the template to track ids in ngFor.\n * @param number index of the array\n * @param Image item of the array\n * @returns number the id of the item\n */\n trackById(index: number, item: Image): number {\n return item.id;\n }\n\n /**\n * Private method to init previews based on the currentImage and the full array of images.\n * The current image in mandatory to show always the current preview (as highlighted).\n * @param InternalLibImage currentImage to decide how to show previews, because I always want to see the current image as highlighted\n * @param InternalLibImage[] images is the array of all images.\n */\n private initPreviews(currentImage: InternalLibImage, images: InternalLibImage[]): void {\n let index: number;\n try {\n index = getIndex(currentImage, images);\n } catch (err) {\n throw err;\n }\n switch (index) {\n case 0:\n // first image\n this.setBeginningIndexesPreviews();\n break;\n case images.length - 1:\n // last image\n this.setEndIndexesPreviews();\n break;\n default:\n // other images\n this.setIndexesPreviews();\n break;\n }\n this.previews = images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\n }\n\n /**\n * Private method to init both `start` and `end` to the beginning.\n */\n private setBeginningIndexesPreviews(): void {\n if (!this.previewConfig || !this.images) {\n throw new Error('Internal library error - previewConfig and images must be defined');\n }\n this.start = 0;\n this.end = Math.min(this.previewConfig.number as number, this.images.length);\n }\n\n /**\n * Private method to init both `start` and `end` to the end.\n */\n private setEndIndexesPreviews(): void {\n if (!this.previewConfig || !this.images) {\n throw new Error('Internal library error - previewConfig and images must be defined');\n }\n this.start = this.images.length - 1 - ((this.previewConfig.number as number) - 1);\n this.end = this.images.length;\n }\n\n /**\n * Private method to update both `start` and `end` based on the currentImage.\n */\n private setIndexesPreviews(): void {\n if (!this.previewConfig || !this.images || !this.currentImage) {\n throw new Error('Internal library error - previewConfig, currentImage and images must be defined');\n }\n this.start = getIndex(this.currentImage, this.images) - Math.floor((this.previewConfig.number as number) / 2);\n this.end = getIndex(this.currentImage, this.images) + Math.floor((this.previewConfig.number as number) / 2) + 1;\n }\n\n /**\n * Private method to update the visible previews navigating to the right (next).\n */\n private next(): void {\n if (!this.images) {\n throw new Error('Internal library error - images must be defined');\n }\n // check if nextImage should be blocked\n if (this.isPreventSliding(this.images.length - 1)) {\n return;\n }\n\n if (this.end === this.images.length) {\n return;\n }\n\n this.start++;\n this.end = Math.min(this.end + 1, this.images.length);\n\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\n }\n\n /**\n * Private method to update the visible previews navigating to the left (previous).\n */\n private previous(): void {\n if (!this.images) {\n throw new Error('Internal library error - images must be defined');\n }\n // check if prevImage should be blocked\n if (this.isPreventSliding(0)) {\n return;\n }\n\n if (this.start === 0) {\n return;\n }\n\n this.start = Math.max(this.start - 1, 0);\n this.end = Math.min(this.end - 1, this.images.length);\n\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\n }\n\n /**\n * Private method to block/permit sliding between previews.\n * @param number boundaryIndex is the first or the last index of `images` input array\n * @returns boolean if true block sliding, otherwise not\n */\n private isPreventSliding(boundaryIndex: number): boolean {\n if (!this.images || !this.currentImage) {\n throw new Error('Internal library error - images and currentImage must be defined');\n }\n return !!this.slideConfig && this.slideConfig.infinite === false && getIndex(this.currentImage, this.images) === boundaryIndex;\n }\n\n /**\n * Private method to handle navigation changing the previews array and other variables.\n */\n private updatePreviews(prev: InternalLibImage, current: InternalLibImage): void {\n if (!this.images) {\n throw new Error('Internal library error - images must be defined');\n }\n // to manage infinite sliding I have to reset both `start` and `end` at the beginning\n // to show again previews from the first image.\n // This happens when you navigate over the last image to return to the first one\n let prevIndex: number;\n let currentIndex: number;\n try {\n prevIndex = getIndex(prev, this.images);\n currentIndex = getIndex(current, this.images);\n } catch (err) {\n console.error('Cannot get previous and current image indexes in previews');\n throw err;\n }\n if (prevIndex === this.images.length - 1 && currentIndex === 0) {\n // first image\n this.setBeginningIndexesPreviews();\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\n return;\n }\n // the same for the opposite case, when you navigate back from the fist image to go to the last one.\n if (prevIndex === 0 && currentIndex === this.images.length - 1) {\n // last image\n this.setEndIndexesPreviews();\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\n return;\n }\n\n // otherwise manage standard scenarios\n if (prevIndex > currentIndex) {\n this.previous();\n } else if (prevIndex < currentIndex) {\n this.next();\n }\n }\n}\n","<nav class=\"previews-container\"\n [class.mobile-visible]=\"previewConfig?.mobileVisible\"\n [attr.aria-label]=\"accessibilityConfig?.previewsContainerAriaLabel\"\n [title]=\"accessibilityConfig?.previewsContainerTitle\">\n\n <ng-container *ngIf=\"previewConfig?.visible\">\n <a class=\"nav-left\"\n [attr.aria-label]=\"accessibilityConfig?.previewScrollPrevAriaLabel\"\n [tabIndex]=\"previewConfig?.arrows && start > 0 ? 0 : -1\" role=\"button\"\n (click)=\"onNavigationEvent('left', $event)\" (keyup)=\"onNavigationEvent('left', $event)\">\n <div class=\"inside {{previewConfig?.arrows && start > 0 ? 'left-arrow-preview-image' : 'empty-arrow-preview-image'}}\"\n aria-hidden=\"true\"\n [title]=\"accessibilityConfig?.previewScrollPrevTitle\"></div>\n </a>\n\n <ng-container *ngFor=\"let preview of previews; trackBy: trackById; let index = index\">\n <img *ngIf=\"preview?.modal?.img\"\n class=\"inside preview-image {{isActive(preview) ? 'active' : ''}}{{!previewConfig?.clickable ? ' unclickable' : ''}}\"\n [src]=\"preview.plain?.img ? preview.plain?.img! : preview.modal.img\"\n ksFallbackImage [fallbackImg]=\"preview.plain?.fallbackImg ? preview.plain?.fallbackImg : preview.modal.fallbackImg\"\n ksSize [sizeConfig]=\"{width: previewConfig?.size ? previewConfig?.size?.width! : defaultPreviewSize.width,\n height: previewConfig?.size ? previewConfig?.size?.height! : defaultPreviewSize.height}\"\n [attr.aria-label]=\"preview.modal.ariaLabel ? preview.modal.ariaLabel : ''\"\n [title]=\"(preview.modal.title || preview.modal.title === '') ? preview.modal.title : ''\"\n alt=\"{{preview.modal.alt ? preview.modal.alt : ''}}\"\n [tabIndex]=\"0\" role=\"img\"\n (click)=\"onImageEvent(preview, $event, clickAction)\" (keyup)=\"onImageEvent(preview, $event, keyboardAction)\"/>\n </ng-container>\n\n\n <a class=\"nav-right\"\n [attr.aria-label]=\"accessibilityConfig?.previewScrollNextAriaLabel\"\n [tabIndex]=\"previewConfig?.arrows && end < images.length ? 0 : -1\" role=\"button\"\n (click)=\"onNavigationEvent('right', $event)\" (keyup)=\"onNavigationEvent('right', $event)\">\n <div class=\"inside {{previewConfig?.arrows! && end < images.length ? 'right-arrow-preview-image' : 'empty-arrow-preview-image'}}\"\n aria-hidden=\"true\"\n [title]=\"accessibilityConfig?.previewScrollNextTitle\"></div>\n </a>\n </ng-container>\n\n</nav>\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';\n\n/**\n * Directive to close the modal gallery clicking on the semi-transparent background.\n * In fact, it listens for a click on all elements that aren't 'inside' and it emits\n * an event using `@Output clickOutside`.\n */\n@Directive({\n selector: '[ksClickOutside]'\n})\nexport class ClickOutsideDirective {\n /**\n * Boolean to enable this directive.\n */\n @Input()\n clickOutsideEnable: boolean | undefined;\n /**\n * Output to emit an event if the clicked element class doesn't contain 'inside' or it is 'hidden'. The payload is a boolean.\n */\n @Output()\n clickOutside: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /**\n * Method called by Angular itself every click thanks to `@HostListener`.\n * @param MouseEvent event payload received evey click\n */\n @HostListener('click', ['$event'])\n onClick(event: MouseEvent): void {\n event.stopPropagation();\n\n // tslint:disable-next-line:no-any\n const target: any = event.target;\n\n if (!this.clickOutsideEnable || !target) {\n return;\n }\n\n let isInside = false;\n let isHidden = false;\n\n if (typeof target.className !== 'string') {\n // it happens with @fortawesome/fontawesome 5\n // for some reasons className is an object with 2 empty properties inside\n isInside = true;\n } else {\n // in normal scenarios, use classname, because it's a simple string\n isInside = target.className && target.className.includes('inside');\n isHidden = target.className.includes('hidden');\n }\n\n // if inside => don't close modal gallery\n // if hidden => close modal gallery\n /*\n i i' h | close\n 0 1 0 | 1 => close modal gallery\n 0 1 1 | 1 => close modal gallery\n 1 0 0 | 0\n 1 0 1 | 1 => close modal gallery\n */\n if (!isInside || isHidden) {\n // close modal gallery\n this.clickOutside.emit(true);\n }\n }\n}\n","import { ChangeDetectorRef, Component, HostListener, Inject, OnDestroy, OnInit, PLATFORM_ID, SecurityContext, ViewChild } from '@angular/core';\nimport { isPlatformBrowser, isPlatformServer } from '@angular/common';\nimport { DomSanitizer } from '@angular/platform-browser';\n\nimport { Subscription } from 'rxjs';\n\nimport { DIALOG_DATA } from './modal-gallery.tokens';\nimport { Image, ImageModalEvent } from '../../model/image.class';\nimport { ConfigService } from '../../services/config.service';\nimport { DotsConfig } from '../../model/dots-config.interface';\nimport { ButtonConfig, ButtonEvent, ButtonsConfig, ButtonType } from '../../model/buttons-config.interface';\nimport { InternalLibImage } from '../../model/image-internal.class';\nimport { Action } from '../../model/action.enum';\nimport { CurrentImageComponent, ImageLoadEvent } from '../current-image/current-image.component';\nimport { KeyboardService } from '../../services/keyboard.service';\nimport { IdValidatorService } from '../../services/id-validator.service';\nimport { KeyboardConfig } from '../../model/keyboard-config.interface';\nimport { PreviewConfig } from '../../model/preview-config.interface';\nimport { SlideConfig } from '../../model/slide-config.interface';\nimport { AccessibilityConfig } from '../../model/accessibility.interface';\nimport { PlainGalleryConfig } from '../../model/plain-gallery-config.interface';\nimport { KS_DEFAULT_ACCESSIBILITY_CONFIG } from '../accessibility-default';\nimport { CurrentImageConfig } from '../../model/current-image-config.interface';\nimport { ModalGalleryService } from './modal-gallery.service';\nimport { LibConfig } from '../../model/lib-config.interface';\nimport { ModalGalleryConfig } from '../../model/modal-gallery-config.interface';\n\n@Component({\n selector: 'ks-modal-gallery',\n templateUrl: './modal-gallery.component.html',\n styleUrls: ['./modal-gallery.component.scss']\n})\nexport class ModalGalleryComponent implements OnInit, OnDestroy {\n /**\n * Reference to the CurrentImageComponent to invoke methods on it.\n */\n @ViewChild(CurrentImageComponent, { static: true }) currentImageComponent: CurrentImageComponent | undefined;\n\n /**\n * Unique id (>=0) of the current instance of this library. This is useful when you are using\n * the service to call modal gallery without open it manually.\n */\n id: number;\n /**\n * Object of type `ButtonsConfig` to show/hide buttons.\n */\n buttonsConfig: ButtonsConfig | undefined;\n /**\n * Boolean to enable modal-gallery close behaviour when clicking\n * on the semi-transparent background. Enabled by default.\n */\n enableCloseOutside = true;\n /**\n * Object of type `DotsConfig` to init DotsComponent's features.\n * For instance, it contains a param to show/hide dots.\n */\n dotsConfig: DotsConfig | undefined;\n /**\n * Object of type `PreviewConfig` to init PreviewsComponent's features.\n * For instance, it contains a param to show/hide previews.\n */\n previewConfig: PreviewConfig | undefined;\n /**\n * Object of type `SlideConfig` to init side previews and `infinite sliding`.\n */\n slideConfig: SlideConfig | undefined;\n /**\n * Object of type `AccessibilityConfig` to init custom accessibility features.\n * For instance, it contains titles, alt texts, aria-labels and so on.\n */\n accessibilityConfig: AccessibilityConfig = KS_DEFAULT_ACCESSIBILITY_CONFIG;\n /**\n * Object of type `KeyboardConfig` to assign custom keys to ESC, RIGHT and LEFT keyboard's actions.\n */\n keyboardConfig: KeyboardConfig | undefined;\n /**\n * Object of type `PlainGalleryConfig` to configure the plain gallery.\n */\n plainGalleryConfig: PlainGalleryConfig | undefined;\n /**\n * Array of `InternalLibImage` representing the model of this library with all images, thumbs and so on.\n */\n images: InternalLibImage[];\n /**\n * `Image` that is visible right now.\n */\n currentImage: InternalLibImage;\n /**\n * Boolean to open the modal gallery. False by default.\n */\n showGallery = false;\n /**\n * Object to configure this component.\n */\n libConfig: LibConfig | undefined;\n\n private updateImagesSubscription: Subscription | undefined;\n\n /**\n * HostListener to catch browser's back button and destroy the gallery.\n * This prevents weired behaviour about scrolling.\n * Added to fix this issue: https://github.com/Ks89/angular-modal-gallery/issues/159\n */\n @HostListener('window:popstate', ['$event'])\n onPopState(e: Event): void {\n this.closeGallery();\n }\n\n constructor(\n @Inject(DIALOG_DATA) private dialogContent: ModalGalleryConfig,\n private modalGalleryService: ModalGalleryService,\n private keyboardService: KeyboardService,\n // tslint:disable-next-line:ban-types\n @Inject(PLATFORM_ID) private platformId: Object,\n private changeDetectorRef: ChangeDetectorRef,\n private idValidatorService: IdValidatorService,\n private configService: ConfigService,\n private sanitizer: DomSanitizer\n ) {\n this.id = (this.dialogContent as ModalGalleryConfig).id;\n this.images = (this.dialogContent as ModalGalleryConfig).images as InternalLibImage[];\n this.currentImage = (this.dialogContent as ModalGalleryConfig).currentImage as InternalLibImage;\n this.libConfig = (this.dialogContent as ModalGalleryConfig).libConfig;\n this.configService.setConfig(this.id, this.libConfig);\n\n this.updateImagesSubscription = this.modalGalleryService.updateImages$.subscribe((images: Image[]) => {\n this.images = images.map((image: Image) => {\n const newImage: InternalLibImage = Object.assign({}, image, { previouslyLoaded: false });\n return newImage;\n });\n this.initImages();\n this.images.forEach((image: InternalLibImage) => {\n if (image.id === this.currentImage.id) {\n this.currentImage = image;\n }\n });\n this.changeDetectorRef.markForCheck();\n });\n }\n\n /**\n * Method ´ngOnInit´ to init images calling `initImages()`.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called only one time!!!\n */\n ngOnInit(): void {\n this.idValidatorService.checkAndAdd(this.id);\n\n // id is a mandatory input and must a number > 0\n if ((!this.id && this.id !== 0) || this.id < 0) {\n throw new Error(\n `'[id]=\"a number >= 0\"' is a mandatory input in angular-modal-gallery.` +\n `If you are using multiple instances of this library, please be sure to use different ids`\n );\n }\n\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig || !libConfig.dotsConfig) {\n throw new Error('Internal library error - libConfig and dotsConfig must be defined');\n }\n\n this.dotsConfig = libConfig.dotsConfig;\n\n // call initImages to init images and to emit `hasData` event\n this.initImages();\n this.showModalGallery();\n }\n\n /**\n * Method called by custom upper buttons.\n * @param event ButtonEvent event payload\n */\n onCustomEmit(event: ButtonEvent): void {\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\n this.modalGalleryService.emitButtonBeforeHook(eventToEmit);\n this.modalGalleryService.emitButtonAfterHook(eventToEmit);\n }\n\n /**\n * Method called by the full-screen upper button.\n * @param event ButtonEvent event payload\n */\n onFullScreen(event: ButtonEvent): void {\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\n this.modalGalleryService.emitButtonBeforeHook(eventToEmit);\n\n // tslint:disable-next-line:no-any\n const doc: any = document as any;\n // tslint:disable-next-line:no-any\n const docEl: any = document.documentElement as any;\n\n const fullscreenDisabled: boolean = !doc.fullscreenElement && !doc.webkitFullscreenElement && !doc.mozFullScreenElement && !doc.msFullscreenElement;\n\n // TODO add .then to promises, for instance requestFullscreen() returns a Promise\n if (fullscreenDisabled) {\n if (docEl.requestFullscreen) {\n docEl.requestFullscreen();\n } else if (docEl.webkitRequestFullscreen) {\n docEl.webkitRequestFullscreen();\n } else if (docEl.mozRequestFullScreen) {\n docEl.mozRequestFullScreen();\n } else if (docEl.msRequestFullscreen) {\n docEl.msRequestFullscreen();\n }\n } else {\n if (doc.exitFullscreen) {\n doc.exitFullscreen();\n } else if (doc.msExitFullscreen) {\n doc.msExitFullscreen();\n } else if (doc.mozCancelFullScreen) {\n doc.mozCancelFullScreen();\n } else if (doc.webkitExitFullscreen) {\n doc.webkitExitFullscreen();\n }\n }\n\n this.modalGalleryService.emitButtonAfterHook(eventToEmit);\n }\n\n /**\n * Method called by the delete upper button.\n * @param event ButtonEvent event payload\n */\n onDelete(event: ButtonEvent): void {\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\n this.modalGalleryService.emitButtonBeforeHook(eventToEmit);\n\n if (this.images.length === 1) {\n this.closeGallery();\n }\n\n if (!this.currentImageComponent) {\n throw new Error('currentImageComponent must be defined');\n }\n\n const imageIndexToDelete: number = this.currentImageComponent.getIndexToDelete(event.image as InternalLibImage);\n if (imageIndexToDelete === this.images.length - 1) {\n // last image\n this.currentImageComponent.prevImage();\n } else {\n this.currentImageComponent.nextImage();\n }\n\n this.modalGalleryService.emitButtonAfterHook(eventToEmit);\n }\n\n /**\n * Method called by the navigate upper button.\n * @param event ButtonEvent event payload\n */\n onNavigate(event: ButtonEvent): void {\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\n this.modalGalleryService.emitButtonBeforeHook(eventToEmit);\n // To support SSR\n if (isPlatformBrowser(this.platformId)) {\n if (eventToEmit.image && eventToEmit.image.modal.extUrl) {\n // where I should open this link? The current tab or another one?\n if (eventToEmit.button && eventToEmit.button.extUrlInNewTab) {\n // in this case I should use target _blank to open the url in a new tab, however these is a security issue.\n // Prevent Reverse Tabnabbing's attacks (https://www.owasp.org/index.php/Reverse_Tabnabbing)\n // Some resources:\n // - https://www.owasp.org/index.php/HTML5_Security_Cheat_Sheet#Tabnabbing\n // - https://medium.com/@jitbit/target-blank-the-most-underestimated-vulnerability-ever-96e328301f4c\n // - https://developer.mozilla.org/en-US/docs/Web/API/Window/open\n const newWindow: Window | null = window.open(eventToEmit.image.modal.extUrl, 'noopener,noreferrer,');\n // it returns null if the call failed, so I have to do this check\n if (newWindow) {\n newWindow.opener = null; // required to prevent security issues\n // emit only in case of success\n this.modalGalleryService.emitButtonAfterHook(eventToEmit);\n }\n } else {\n this.updateLocationHref(eventToEmit.image.modal.extUrl);\n // emit only in case of success\n this.modalGalleryService.emitButtonAfterHook(eventToEmit);\n }\n }\n }\n }\n\n /**\n * This method is defined to be spied and replaced in unit testing with a fake method call.\n * It must be public to be able to use jasmine spyOn method.\n * @param newHref string new url\n */\n updateLocationHref(newHref: string) {\n window.location.href = newHref;\n }\n\n /**\n * Method called by the download upper button.\n * @param event ButtonEvent event payload\n */\n onDownload(event: ButtonEvent): void {\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\n this.modalGalleryService.emitButtonBeforeHook(eventToEmit);\n this.downloadImage();\n this.modalGalleryService.emitButtonAfterHook(eventToEmit);\n }\n\n /**\n * Method called by the close upper button.\n * @param event ButtonEvent event payload\n * @param action Action that triggered the close method. `Action.NORMAL` by default\n */\n onCloseGalleryButton(event: ButtonEvent, action: Action = Action.NORMAL): void {\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\n this.modalGalleryService.emitButtonBeforeHook(eventToEmit);\n this.closeGallery(action, false);\n this.modalGalleryService.emitButtonAfterHook(eventToEmit);\n }\n\n /**\n * Method called by CurrentImageComponent and triggered via KeyboardService.\n * @param event ImageModalEvent event payload\n * @param action Action that triggered the close method. `Action.NORMAL` by default\n */\n onCloseGallery(event: ImageModalEvent, action: Action = Action.NORMAL): void {\n // remap ImageModalEvent to ButtonEvent\n const buttonEvent: ButtonEvent = {\n button: {\n type: ButtonType.CLOSE\n } as ButtonConfig,\n image: null,\n action: event.action,\n galleryId: event.galleryId\n };\n this.modalGalleryService.emitButtonBeforeHook(buttonEvent);\n this.closeGallery(action, false);\n this.modalGalleryService.emitButtonAfterHook(buttonEvent);\n }\n\n /**\n * Method to close the modal gallery specifying the action.\n * It also reset the `keyboardService` to prevent multiple listeners.\n * @param action Action action type. `Action.NORMAL` by default\n * @param clickOutside boolean that is true if called clicking on the modal background. False by default.\n * @param isCalledByService boolean isCalledByService is true if called by gallery.service, otherwise false. False by default.\n */\n closeGallery(action: Action = Action.NORMAL, clickOutside: boolean = false, isCalledByService: boolean = false): void {\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n\n this.modalGalleryService.emitClose(new ImageModalEvent(this.id, action, true));\n this.keyboardService.reset(libConfig);\n this.modalGalleryService.close(this.id, clickOutside);\n\n if (isCalledByService) {\n // the following is required, otherwise the view will not be updated\n // this happens only if called by gallery.service\n this.changeDetectorRef.markForCheck();\n }\n }\n\n /**\n * Method called when the image changes and used to update the `currentImage` object.\n * @param event ImageModalEvent event payload\n */\n onChangeCurrentImage(event: ImageModalEvent): void {\n const newIndex: number = event.result as number;\n if (newIndex < 0 || newIndex >= this.images.length) {\n return;\n }\n\n this.currentImage = this.images[newIndex];\n\n // emit first/last event based on newIndex value\n this.emitBoundaryEvent(event.action, newIndex);\n\n // emit current visible image index\n this.modalGalleryService.emitShow(new ImageModalEvent(this.id, event.action, newIndex + 1));\n }\n\n /**\n * Method called when you click 'outside' (i.e. on the semi-transparent background)\n * to close the modal gallery if `enableCloseOutside` is true.\n * @param event boolean that is true to close the modal gallery, false otherwise\n */\n onClickOutside(event: boolean): void {\n if (event && this.enableCloseOutside) {\n this.closeGallery(Action.CLICK, true);\n }\n }\n\n /**\n * Method called when an image is loaded and the loading spinner has gone.\n * It sets the previouslyLoaded flag inside the Image to hide loading spinner when displayed again.\n * @param event ImageLoadEvent event payload\n */\n onImageLoad(event: ImageLoadEvent): void {\n // sets as previously loaded the image with index specified by `event.status`\n this.images = this.images.map((img: InternalLibImage) => {\n if (img && img.id === event.id) {\n return Object.assign({}, img, { previouslyLoaded: event.status });\n }\n return img;\n });\n }\n\n /**\n * Method called when a dot is clicked and used to update the current image.\n * @param index number index of the clicked dot\n */\n onClickDot(index: number): void {\n this.currentImage = this.images[index];\n }\n\n /**\n * Method called when an image preview is clicked and used to update the current image.\n * @param event ImageModalEvent preview image\n */\n onClickPreview(event: ImageModalEvent): void {\n this.onChangeCurrentImage(event);\n }\n\n /**\n * Method to cleanup resources. In fact, this will reset keyboard's service.\n * This is an Angular's lifecycle hook that is called when this component is destroyed.\n */\n ngOnDestroy(): void {\n if (this.keyboardService) {\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (this.id && libConfig) {\n this.keyboardService.reset(libConfig);\n }\n }\n if (this.updateImagesSubscription) {\n this.updateImagesSubscription.unsubscribe();\n }\n this.idValidatorService.remove(this.id);\n }\n\n /**\n * Method to show the modal gallery displaying the currentImage.\n * It will also register a new `keyboardService` to catch keyboard's events to download the current\n * image with keyboard's shortcuts. This service, will be removed either when modal gallery component\n * will be destroyed or when the gallery is closed invoking the `closeGallery` method.\n * @private\n */\n private showModalGallery(): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n\n this.keyboardService.init(libConfig).then(() => {\n this.keyboardService.add((event: KeyboardEvent, combo: string) => {\n if (event.preventDefault) {\n event.preventDefault();\n } else {\n // internet explorer\n event.returnValue = false;\n }\n this.downloadImage();\n }, libConfig);\n\n const currentIndex: number = this.images.indexOf(this.currentImage);\n // emit a new ImageModalEvent with the index of the current image\n this.modalGalleryService.emitShow(new ImageModalEvent(this.id, Action.LOAD, currentIndex + 1));\n this.changeDetectorRef.markForCheck();\n });\n }\n\n /**\n * Method to download the current image, only if `downloadable` is true.\n * It contains also a logic to enable downloading features also for IE11.\n * @private\n */\n private downloadImage(): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n\n const currentImageConfig: CurrentImageConfig | undefined = libConfig.currentImageConfig;\n if (currentImageConfig && !currentImageConfig.downloadable) {\n return;\n }\n // If IE11 or Microsoft Edge use msSaveBlob(...)\n if (this.isIEorEdge()) {\n // I cannot use fetch API because IE11 doesn't support it,\n // so I have to switch to XMLHttpRequest\n this.downloadImageOnlyIEorEdge();\n } else {\n // for all other browsers\n this.downloadImageAllBrowsers();\n }\n }\n\n /**\n * Method to convert a base64 to a Blob\n * @param base64Data string with base64 data\n * @param contentType string with the MIME type\n * @return Blob converted from the input base64Data\n * @private\n */\n private base64toBlob(base64Data: string, contentType: string = ''): Blob {\n const sliceSize = 1024;\n const byteCharacters: string = atob(base64Data);\n const bytesLength: number = byteCharacters.length;\n const slicesCount: number = Math.ceil(bytesLength / sliceSize);\n const byteArrays: Array<Uint8Array> = new Array(slicesCount);\n for (let sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n const begin: number = sliceIndex * sliceSize;\n const end: number = Math.min(begin + sliceSize, bytesLength);\n const bytes: Array<number> = new Array(end - begin);\n for (let offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n return new Blob(byteArrays, { type: contentType });\n }\n\n /**\n * Private method to download the current image for all browsers except for IE11.\n * @private\n */\n private downloadImageAllBrowsers(): void {\n const link = document.createElement('a');\n let isBase64 = false;\n let img: string;\n // convert a SafeResourceUrl to a string\n if (typeof this.currentImage.modal.img === 'string') {\n img = this.currentImage.modal.img as string;\n } else {\n // if it's a SafeResourceUrl\n img = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.currentImage.modal.img) as string;\n }\n if (img.includes('data:image/') || img.includes(';base64,')) {\n const extension: string = img.replace('data:image/', '').split(';base64,')[0];\n const pureBase64: string = img.split(';base64,')[1];\n const blob: Blob = this.base64toBlob(pureBase64, 'image/' + extension);\n link.href = URL.createObjectURL(blob);\n isBase64 = true;\n link.setAttribute('download', this.getFileName(this.currentImage, isBase64, extension));\n } else {\n link.href = img;\n link.setAttribute('download', this.getFileName(this.currentImage, isBase64));\n }\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n /**\n * Private method to download the current image only for IE11 using\n * custom javascript's methods available only on IE.\n * @private\n */\n private downloadImageOnlyIEorEdge(): void {\n if (isPlatformBrowser(this.platformId)) {\n const req = new XMLHttpRequest();\n req.open('GET', this.currentImage.modal.img as string, true);\n req.responseType = 'arraybuffer';\n req.onload = event => {\n const blob = new Blob([req.response], { type: 'image/png' });\n window.navigator.msSaveBlob(blob, this.getFileName(this.currentImage));\n };\n req.send();\n }\n }\n\n /**\n * Private method to get the `ButtonEvent` to emit, merging the input `ButtonEvent`\n * with the current image.\n * @param event ButtonEvent event payload to return\n * @returns ButtonEvent event payload with the current image included\n * @private\n */\n private getButtonEventToEmit(event: ButtonEvent): ButtonEvent {\n return Object.assign(event, { image: this.currentImage });\n }\n\n /**\n * Private method to get the file name from an input path.\n * This is used either to get the image's name from its path or from the Image itself,\n * if specified as 'downloadFileName' by the user.\n * @param image Image image to extract its file name\n * @param isBase64 boolean to set if the image is a base64 file or not. False by default.\n * @param base64Extension string to force the extension of the base64 image. Empty string by default.\n * @returns string string file name of the input image.\n * @private\n */\n private getFileName(image: Image, isBase64: boolean = false, base64Extension: string = ''): string {\n if (!image.modal.downloadFileName || image.modal.downloadFileName.length === 0) {\n if (isBase64) {\n return `Image-${image.id}.${base64Extension !== '' ? base64Extension : 'png'}`;\n } else {\n return (image.modal.img as string).replace(/^.*[\\\\\\/]/, '');\n }\n } else {\n return image.modal.downloadFileName;\n }\n }\n\n /**\n * Private method to initialize `images` as array of `Image`s.\n * Also, it will emit ImageModalEvent to say that images are loaded.\n * @private\n */\n private initImages(): void {\n this.modalGalleryService.emitHasData(new ImageModalEvent(this.id, Action.LOAD, true));\n this.showGallery = this.images.length > 0;\n }\n\n /**\n * Private method to emit events when either the last or the first image are visible.\n * @param action Action Enum of type Action that represents the source of the event that changed the\n * current image to the first one or the last one.\n * @param indexToCheck number is the index number of the image (the first or the last one).\n * @private\n */\n private emitBoundaryEvent(action: Action, indexToCheck: number): void {\n // to emit first/last event\n switch (indexToCheck) {\n case 0:\n this.modalGalleryService.emitFirstImage(new ImageModalEvent(this.id, action, true));\n break;\n case this.images.length - 1:\n this.modalGalleryService.emitLastImage(new ImageModalEvent(this.id, action, true));\n break;\n }\n }\n\n /**\n * Private method to check if this library is running on\n * Microsoft browsers or not (i.e. it detects both IE11 and Edge)\n * supporting also Server-Side Rendering.\n * Inspired by https://msdn.microsoft.com/it-it/library/hh779016(v=vs.85).aspx\n * @returns boolean true if IE11 or Edge, false otherwise\n * @private\n */\n private isIEorEdge(): boolean {\n if (isPlatformBrowser(this.platformId)) {\n // if both Blob constructor and msSaveOrOpenBlob are supported by the current browser\n return !!window.Blob && !!window.navigator.msSaveOrOpenBlob;\n }\n if (isPlatformServer(this.platformId)) {\n // server only\n return true;\n }\n return false;\n }\n}\n","<div id=\"modal-gallery-wrapper\"\n [attr.aria-label]=\"accessibilityConfig.modalGalleryContentAriaLabel\"\n [title]=\"accessibilityConfig.modalGalleryContentTitle\"\n ksClickOutside [clickOutsideEnable]=\"enableCloseOutside\"\n (clickOutside)=\"onClickOutside($event)\">\n\n <div id=\"flex-min-height-ie-fix\">\n <div id=\"modal-gallery-container\">\n\n <ks-upper-buttons [id]=\"id\"\n [currentImage]=\"currentImage\"\n (delete)=\"onDelete($event)\"\n (navigate)=\"onNavigate($event)\"\n (download)=\"onDownload($event)\"\n (closeButton)=\"onCloseGalleryButton($event)\"\n (fullscreen)=\"onFullScreen($event)\"\n (customEmit)=\"onCustomEmit($event)\"></ks-upper-buttons>\n\n <ks-current-image [id]=\"id\"\n [images]=\"images\"\n [currentImage]=\"currentImage\"\n [isOpen]=\"true\"\n (loadImage)=\"onImageLoad($event)\"\n (changeImage)=\"onChangeCurrentImage($event)\"\n (closeGallery)=\"onCloseGallery($event)\"></ks-current-image>\n\n <div>\n <ks-dots [id]=\"id\"\n [images]=\"images\"\n [currentImage]=\"currentImage\"\n [dotsConfig]=\"dotsConfig\"\n (clickDot)=\"onClickDot($event)\"></ks-dots>\n\n <ks-previews [id]=\"id\"\n [images]=\"images\"\n [currentImage]=\"currentImage\"\n (clickPreview)=\"onClickPreview($event)\"></ks-previews>\n </div>\n </div>\n </div>\n</div>\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { OverlayRef } from '@angular/cdk/overlay';\n\nimport { Subject } from 'rxjs';\nimport { ImageModalEvent } from '../../model/image.class';\nimport { ButtonEvent } from '../../model/buttons-config.interface';\n\n/**\n * Class that represents the modal dialog instance.\n * It is returned by the open method.\n */\nexport class ModalGalleryRef {\n private close = new Subject<ImageModalEvent>();\n close$ = this.close.asObservable();\n private show = new Subject<ImageModalEvent>();\n show$ = this.show.asObservable();\n private firstImage = new Subject<ImageModalEvent>();\n firstImage$ = this.firstImage.asObservable();\n private lastImage = new Subject<ImageModalEvent>();\n lastImage$ = this.lastImage.asObservable();\n private hasData = new Subject<ImageModalEvent>();\n hasData$ = this.hasData.asObservable();\n private buttonBeforeHook = new Subject<ButtonEvent>();\n buttonBeforeHook$ = this.buttonBeforeHook.asObservable();\n private buttonAfterHook = new Subject<ButtonEvent>();\n buttonAfterHook$ = this.buttonAfterHook.asObservable();\n\n constructor(private overlayRef: OverlayRef) {}\n\n /**\n * Close modal dialog, disposing the Overlay.\n */\n closeModal(): void {\n this.overlayRef.dispose();\n }\n\n /**\n * Method to emit close event.\n * @param event ImageModalEvent event payload\n */\n emitClose(event: ImageModalEvent): void {\n this.close.next(event);\n }\n\n /**\n * Method to emit show event.\n * @param event ImageModalEvent event payload\n */\n emitShow(event: ImageModalEvent): void {\n this.show.next(event);\n }\n\n /**\n * Method to emit firstImage event.\n * @param event ImageModalEvent event payload\n */\n emitFirstImage(event: ImageModalEvent): void {\n this.firstImage.next(event);\n }\n\n /**\n * Method to emit lastImage event.\n * @param event ImageModalEvent event payload\n */\n emitLastImage(event: ImageModalEvent): void {\n this.lastImage.next(event);\n }\n\n /**\n * Method to emit hasData event.\n * @param event ImageModalEvent event payload\n */\n emitHasData(event: ImageModalEvent): void {\n this.hasData.next(event);\n }\n\n /**\n * Method to emit buttonBeforeHook event.\n * @param event ImageModalEvent event payload\n */\n emitButtonBeforeHook(event: ButtonEvent): void {\n this.buttonBeforeHook.next(event);\n }\n\n /**\n * Method to emit buttonAfterHook event.\n * @param event ImageModalEvent event payload\n */\n emitButtonAfterHook(event: ButtonEvent): void {\n this.buttonAfterHook.next(event);\n }\n}\n","import { Injectable, Injector, ComponentRef } from '@angular/core';\n\nimport { GlobalPositionStrategy, Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\n\nimport { Subject } from 'rxjs';\n\nimport { DIALOG_DATA } from './modal-gallery.tokens';\nimport { ModalGalleryComponent } from './modal-gallery.component';\nimport { ModalGalleryRef } from './modal-gallery-ref';\nimport { Image, ImageModalEvent } from '../../model/image.class';\nimport { ConfigService } from '../../services/config.service';\nimport { ButtonEvent } from '../../model/buttons-config.interface';\nimport { ModalGalleryConfig } from '../../model/modal-gallery-config.interface';\nimport { LibConfig } from '../../model/lib-config.interface';\n\n// private interface used only in this file\ninterface ModalDialogConfig {\n panelClass: string;\n hasBackdrop: boolean;\n backdropClass: string;\n}\n\nconst DEFAULT_DIALOG_CONFIG: ModalDialogConfig = {\n hasBackdrop: true,\n backdropClass: 'ks-modal-gallery-backdrop',\n panelClass: 'ks-modal-gallery-panel'\n};\n\n@Injectable({ providedIn: 'root' })\nexport class ModalGalleryService {\n private updateImages = new Subject<Image[]>();\n updateImages$ = this.updateImages.asObservable();\n\n private dialogRef: ModalGalleryRef | undefined;\n\n constructor(private injector: Injector, private overlay: Overlay, private configService: ConfigService) {}\n\n /**\n * Method to open modal gallery passing the configuration\n * @param config ModalGalleryConfig that contains: id, array of images, current image and optionally the configuration object\n * @return ModalGalleryRef | undefined is the object used to listen for events.\n */\n open(config: ModalGalleryConfig): ModalGalleryRef | undefined {\n // Returns an OverlayRef which is a PortalHost\n const overlayRef: OverlayRef = this.createOverlay();\n // Instantiate a reference to the dialog\n this.dialogRef = new ModalGalleryRef(overlayRef);\n // Attach dialog container\n const overlayComponent: ModalGalleryComponent = this.attachDialogContainer(overlayRef, config, this.dialogRef);\n overlayRef.backdropClick().subscribe(() => {\n if (this.dialogRef) {\n this.dialogRef.closeModal();\n }\n });\n return this.dialogRef;\n }\n\n /**\n * Method to close a modal gallery previously opened.\n * @param id Unique identifier of the modal gallery\n */\n close(id: number, clickOutside: boolean): void {\n const libConfig: LibConfig | undefined = this.configService.getConfig(id);\n if (clickOutside) {\n if (this.dialogRef && libConfig && libConfig.enableCloseOutside) {\n this.dialogRef.closeModal();\n }\n } else {\n if (this.dialogRef) {\n this.dialogRef.closeModal();\n }\n }\n }\n\n /**\n * Method to update images array.\n * @param images Image[] updated array of images\n */\n updateModalImages(images: Image[]): void {\n this.updateImages.next(images);\n }\n\n /**\n * Method to emit close event.\n * @param event ImageModalEvent is the event payload\n */\n emitClose(event: ImageModalEvent): void {\n if (!this.dialogRef) {\n return;\n }\n this.dialogRef.emitClose(event);\n }\n\n /**\n * Method to emit show event.\n * @param event ImageModalEvent is the event payload\n */\n emitShow(event: ImageModalEvent): void {\n if (!this.dialogRef) {\n return;\n }\n this.dialogRef.emitShow(event);\n }\n\n /**\n * Method to emit firstImage event.\n * @param event ImageModalEvent is the event payload\n */\n emitFirstImage(event: ImageModalEvent): void {\n if (!this.dialogRef) {\n return;\n }\n this.dialogRef.emitFirstImage(event);\n }\n\n /**\n * Method to emit lastImage event.\n * @param event ImageModalEvent is the event payload\n */\n emitLastImage(event: ImageModalEvent): void {\n if (!this.dialogRef) {\n return;\n }\n this.dialogRef.emitLastImage(event);\n }\n\n /**\n * Method to emit hasData event.\n * @param event ImageModalEvent is the event payload\n */\n emitHasData(event: ImageModalEvent): void {\n if (!this.dialogRef) {\n return;\n }\n this.dialogRef.emitHasData(event);\n }\n\n /**\n * Method to emit buttonBeforeHook event.\n * @param event ButtonEvent is the event payload\n */\n emitButtonBeforeHook(event: ButtonEvent): void {\n if (!this.dialogRef) {\n return;\n }\n this.dialogRef.emitButtonBeforeHook(event);\n }\n\n /**\n * Method to emit buttonAfterHook event.\n * @param event ButtonEvent is the event payload\n */\n emitButtonAfterHook(event: ButtonEvent): void {\n if (!this.dialogRef) {\n return;\n }\n this.dialogRef.emitButtonAfterHook(event);\n }\n\n /**\n * Private method to create an Overlay using Angular CDK APIs\n * @private\n */\n private createOverlay(): OverlayRef {\n const overlayConfig = this.getOverlayConfig();\n return this.overlay.create(overlayConfig);\n }\n\n /**\n * Private method to attach ModalGalleryComponent to the overlay.\n * @param overlayRef OverlayRef is the Overlay object created using Angular CDK APIs\n * @param config ModalGalleryConfig that contains: id, array of images, current image and optionally the configuration object\n * @param dialogRef ModalGalleryRef is the object to control the dialog instance\n * @private\n */\n private attachDialogContainer(overlayRef: OverlayRef, config: ModalGalleryConfig, dialogRef: ModalGalleryRef): ModalGalleryComponent {\n const injector: Injector = Injector.create({\n parent: this.injector,\n providers: [\n { provide: ModalGalleryRef, useValue: dialogRef },\n { provide: DIALOG_DATA, useValue: config }\n ]\n });\n\n const containerPortal = new ComponentPortal(ModalGalleryComponent, null, injector);\n const containerRef: ComponentRef<ModalGalleryComponent> = overlayRef.attach(containerPortal);\n\n return containerRef.instance;\n }\n\n /**\n * Private method to create an OverlayConfig instance\n * @private\n */\n private getOverlayConfig(): OverlayConfig {\n const positionStrategy: GlobalPositionStrategy = this.overlay.position().global().centerHorizontally().centerVertically();\n\n const overlayConfig: OverlayConfig = new OverlayConfig({\n hasBackdrop: DEFAULT_DIALOG_CONFIG.hasBackdrop,\n backdropClass: DEFAULT_DIALOG_CONFIG.backdropClass,\n panelClass: DEFAULT_DIALOG_CONFIG.panelClass,\n scrollStrategy: this.overlay.scrollStrategies.block(),\n positionStrategy\n });\n\n return overlayConfig;\n }\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n HostBinding,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChange,\n SimpleChanges\n} from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl, SafeStyle } from '@angular/platform-browser';\nimport { BreakpointObserver, Breakpoints, BreakpointState } from '@angular/cdk/layout';\n\nimport { Subscription } from 'rxjs';\n\nimport { AccessibleComponent } from '../../accessible.component';\n\nimport { AccessibilityConfig } from '../../../model/accessibility.interface';\nimport { Image, ImageEvent } from '../../../model/image.class';\nimport { InternalLibImage } from '../../../model/image-internal.class';\nimport { CarouselPreviewConfig } from '../../../model/carousel-preview-config.interface';\nimport { CarouselConfig } from '../../../model/carousel-config.interface';\n\nimport { NEXT, PREV } from '../../../utils/user-input.util';\nimport { getIndex } from '../../../utils/image.util';\nimport { Action } from '../../../model/action.enum';\nimport { ConfigService } from '../../../services/config.service';\nimport { LibConfig } from '../../../model/lib-config.interface';\n\n/**\n * Default max height of previews.\n */\nconst DEFAULT_MAX_HEIGHT = '200px';\n\n/**\n * Component with image previews for carousel\n */\n@Component({\n selector: 'ks-carousel-previews',\n styleUrls: ['carousel-previews.scss', '../../previews-arrows.scss'],\n templateUrl: 'carousel-previews.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CarouselPreviewsComponent extends AccessibleComponent implements OnInit, OnChanges, OnDestroy {\n /**\n * Variable to change the max-width of the host component\n */\n @HostBinding('style.max-width')\n hostMaxWidth = '100%';\n\n /**\n * Variable to set aria-label of the host component\n */\n @HostBinding('attr.aria-label')\n ariaLabel = `Carousel previews`;\n\n /**\n * TODO write doc\n */\n @Input()\n // @ts-ignore\n id: number;\n /**\n * Object of type `InternalLibImage` that represent the visible image.\n */\n @Input()\n // @ts-ignore\n currentImage: InternalLibImage;\n /**\n * Array of `InternalLibImage` that represent the model of this library with all images,\n * thumbs and so on.\n */\n @Input()\n // @ts-ignore\n images: InternalLibImage[];\n\n /**\n * Output to emit the clicked preview. The payload contains the `InternalLibImage` associated to the clicked preview.\n */\n @Output()\n clickPreview: EventEmitter<ImageEvent> = new EventEmitter<ImageEvent>();\n\n /**\n * Object of type `CarouselConfig` to init CarouselComponent's features.\n * For instance, it contains parameters to change the style, how it navigates and so on.\n */\n carouselConfig: CarouselConfig | undefined;\n /**\n * Object of type `CarouselPreviewConfig` to init PreviewsComponent's features.\n * For instance, it contains a param to show/hide this component, sizes.\n */\n previewConfig: CarouselPreviewConfig | undefined;\n /**\n * Object of type `AccessibilityConfig` to init custom accessibility features.\n * For instance, it contains titles, alt texts, aria-labels and so on.\n */\n accessibilityConfig: AccessibilityConfig | undefined;\n /**\n * Enum of type `Action` that represents a mouse click on a button.\n * Declared here to be used inside the template.\n */\n clickAction: Action = Action.CLICK;\n /**\n * Enum of type `Action` that represents a keyboard action.\n * Declared here to be used inside the template.\n */\n keyboardAction: Action = Action.KEYBOARD;\n /**\n * Array of `InternalLibImage` exposed to the template. This field is initialized\n * applying transformations, default values and so on to the input of the same type.\n */\n previews: InternalLibImage[] = [];\n /**\n * Variable with the preview's maxHeight\n */\n previewMaxHeight: string = DEFAULT_MAX_HEIGHT;\n /**\n * Start index (inclusive) of the input images used to display previews.\n */\n // @ts-ignore\n start: number;\n /**\n * End index (non inclusive) of the input images used to display previews.\n */\n // @ts-ignore\n end: number;\n\n private readonly breakpointSubscription: Subscription;\n\n constructor(\n private ref: ChangeDetectorRef,\n private breakpointObserver: BreakpointObserver,\n // sanitizer is used only to sanitize style before add it to background property when legacyIE11Mode is enabled\n private sanitizer: DomSanitizer,\n private configService: ConfigService\n ) {\n super();\n\n // listen for width changes and update preview heights accordingly\n this.breakpointSubscription = breakpointObserver\n .observe([Breakpoints.XSmall, Breakpoints.Small, Breakpoints.Medium, Breakpoints.Large, Breakpoints.XLarge])\n .subscribe((result: BreakpointState) => {\n if (!this.previewConfig || !this.previewConfig.breakpoints) {\n return;\n }\n if (result.breakpoints[Breakpoints.XSmall]) {\n this.updateHeight(this.previewConfig.breakpoints.xSmall);\n } else if (result.breakpoints[Breakpoints.Small]) {\n this.updateHeight(this.previewConfig.breakpoints.small);\n } else if (result.breakpoints[Breakpoints.Medium]) {\n this.updateHeight(this.previewConfig.breakpoints.medium);\n } else if (result.breakpoints[Breakpoints.Large]) {\n this.updateHeight(this.previewConfig.breakpoints.large);\n } else if (result.breakpoints[Breakpoints.XLarge]) {\n this.updateHeight(this.previewConfig.breakpoints.xLarge);\n }\n });\n }\n\n /**\n * Method to update the height of previews, passing the desired height as input.\n * @param configBreakpointHeight is a number that represent the desired height to set.\n */\n private updateHeight(configBreakpointHeight: number): void {\n if (this.previewConfig && this.previewConfig.maxHeight) {\n const heightNum: number = +this.previewConfig.maxHeight.replace('/px/g', '').replace('/%/g', '');\n this.previewMaxHeight = Math.min(configBreakpointHeight, heightNum) + 'px';\n } else {\n const heightNum: number = +DEFAULT_MAX_HEIGHT.replace('/px/g', '').replace('/%/g', '');\n this.previewMaxHeight = Math.min(configBreakpointHeight, heightNum) + 'px';\n }\n this.ref.markForCheck();\n }\n\n /**\n * Method ´ngOnInit´ to build `configPreview` applying a default value and also to\n * init the `previews` array.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called only one time!!!\n */\n ngOnInit(): void {\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n this.carouselConfig = libConfig.carouselConfig;\n this.previewConfig = libConfig.carouselPreviewsConfig;\n this.accessibilityConfig = libConfig.accessibilityConfig;\n\n if (!this.previewConfig || !this.previewConfig.maxHeight || !this.previewConfig.breakpoints) {\n throw new Error('Internal library error - previewConfig must be defined');\n }\n // change the max-width of this component if there is a specified width !== 100% in carouselConfig\n if (this.carouselConfig && this.carouselConfig.maxWidth !== '100%') {\n this.hostMaxWidth = this.carouselConfig.maxWidth;\n }\n\n this.previewMaxHeight = this.previewConfig.maxHeight;\n // init previews based on currentImage and the full array of images\n this.initPreviews(this.currentImage, this.images);\n\n // apply custom height based on responsive breakpoints\n // This is required, because the breakpointSubscription is not triggered at creation,\n // but only when the width changes\n const isXsmallScreen = this.breakpointObserver.isMatched(Breakpoints.XSmall);\n const isSmallScreen = this.breakpointObserver.isMatched(Breakpoints.Small);\n const isMediumScreen = this.breakpointObserver.isMatched(Breakpoints.Medium);\n const isLargeScreen = this.breakpointObserver.isMatched(Breakpoints.Large);\n const isxLargeScreen = this.breakpointObserver.isMatched(Breakpoints.XLarge);\n if (isXsmallScreen) {\n this.updateHeight(this.previewConfig.breakpoints.xSmall);\n } else if (isSmallScreen) {\n this.updateHeight(this.previewConfig.breakpoints.small);\n } else if (isMediumScreen) {\n this.updateHeight(this.previewConfig.breakpoints.medium);\n } else if (isLargeScreen) {\n this.updateHeight(this.previewConfig.breakpoints.large);\n } else if (isxLargeScreen) {\n this.updateHeight(this.previewConfig.breakpoints.xLarge);\n }\n }\n\n /**\n * Method to check if an image is active (i.e. a preview image).\n * @param InternalLibImage preview is an image to check if it's active or not\n * @returns boolean true if is active, false otherwise\n */\n isActive(preview: InternalLibImage): boolean {\n if (!preview || !this.currentImage) {\n return false;\n }\n return preview.id === this.currentImage.id;\n }\n\n /**\n * Method ´ngOnChanges´ to update `previews` array.\n * Also, both `start` and `end` local variables will be updated accordingly.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called when any data-bound property of a directive changes!!!\n */\n ngOnChanges(changes: SimpleChanges): void {\n const simpleChange: SimpleChange = changes.currentImage;\n if (!simpleChange) {\n return;\n }\n\n const prev: InternalLibImage = simpleChange.previousValue;\n const current: InternalLibImage = simpleChange.currentValue;\n\n if (current && changes.images && changes.images.previousValue && changes.images.currentValue) {\n // I'm in this if statement, if input images are changed (for instance, because I removed one of them with the 'delete button',\n // or because users changed the images array while modal gallery is still open).\n // In this case, I have to re-init previews, because the input array of images is changed.\n this.initPreviews(current, changes.images.currentValue);\n }\n\n if (prev && current && prev.id !== current.id) {\n // to manage infinite sliding I have to reset both `start` and `end` at the beginning\n // to show again previews from the first image.\n // This happens when you navigate over the last image to return to the first one\n let prevIndex: number;\n let currentIndex: number;\n try {\n prevIndex = getIndex(prev, this.images);\n currentIndex = getIndex(current, this.images);\n } catch (err) {\n console.error('Cannot get previous and current image indexes in previews');\n throw err;\n }\n\n // apply a formula to get a values to be used to decide if go next, return back or stay without doing anything\n const calc = Math.floor((this.end - this.start) / 2) + this.start;\n\n if (prevIndex === this.images.length - 1 && currentIndex === 0) {\n // first image\n this.setBeginningIndexesPreviews();\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\n return;\n }\n // the same for the opposite case, when you navigate back from the fist image to go to the last one.\n if (prevIndex === 0 && currentIndex === this.images.length - 1) {\n // last image\n this.setEndIndexesPreviews();\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\n return;\n }\n\n if (this.previewConfig && (this.previewConfig.number as number) % 2 === 0) {\n if (calc > currentIndex) {\n this.previous();\n } else {\n this.next();\n }\n } else {\n if (calc > currentIndex) {\n this.previous();\n }\n if (calc < currentIndex) {\n this.next();\n }\n }\n }\n }\n\n /**\n * Method called by events from both keyboard and mouse on a preview.\n * This will trigger the `clickpreview` output with the input preview as its payload.\n * @param InternalLibImage preview that triggered this method\n * @param KeyboardEvent | MouseEvent event payload\n * @param Action that triggered this event (Action.NORMAL by default)\n */\n onImageEvent(preview: InternalLibImage, event: KeyboardEvent | MouseEvent, action: Action = Action.NORMAL): void {\n if (!this.previewConfig || !this.previewConfig.clickable) {\n return;\n }\n const clickedImageIndex: number = this.images.indexOf(preview);\n const result: number = super.handleImageEvent(event);\n if (result === NEXT) {\n this.clickPreview.emit({ action, result: clickedImageIndex } as ImageEvent);\n } else if (result === PREV) {\n this.clickPreview.emit({ action, result: clickedImageIndex } as ImageEvent);\n }\n }\n\n /**\n * Method called by events from both keyboard and mouse on a navigation arrow.\n * @param string direction of the navigation that can be either 'next' or 'prev'\n * @param KeyboardEvent | MouseEvent event payload\n */\n onNavigationEvent(direction: string, event: KeyboardEvent | MouseEvent): void {\n const result: number = super.handleNavigationEvent(direction, event);\n if (result === NEXT) {\n this.next();\n } else if (result === PREV) {\n this.previous();\n }\n }\n\n /**\n * Method to get aria-label text for a preview image.\n * @param Image is the preview\n */\n getAriaLabel(preview: Image): string {\n if (!preview.plain) {\n return preview.modal.ariaLabel || '';\n }\n return preview.plain.ariaLabel || preview.modal.ariaLabel || '';\n }\n\n /**\n * Method to get title text for a preview image.\n * @param Image is the preview\n */\n getTitle(preview: Image): string {\n if (!preview.plain) {\n return preview.modal.title || '';\n }\n return preview.plain.title || preview.modal.title || '';\n }\n\n /**\n * Method to get alt text for a preview image.\n * @param Image is the preview\n */\n getAlt(preview: Image): string {\n if (!preview.plain) {\n return preview.modal.alt || '';\n }\n return preview.plain.alt || preview.modal.alt || '';\n }\n\n /**\n * Method used in the template to track ids in ngFor.\n * @param number index of the array\n * @param Image item of the array\n * @returns number the id of the item\n */\n trackById(index: number, item: Image): number {\n return item.id;\n }\n\n /**\n * Method used in template to sanitize an url when you need legacyIE11Mode.\n * In this way you can set an url as background of a div.\n * @param unsafeStyle is a string or a SafeResourceUrl that represents the url to sanitize.\n * @param unsafeStyleFallback is a string or a SafeResourceUrl that represents the fallback url to sanitize.\n * @returns a SafeStyle object that can be used in template without problems.\n */\n sanitizeUrlBgStyle(unsafeStyle: string | SafeResourceUrl, unsafeStyleFallback: string | SafeResourceUrl): SafeStyle {\n // Method used only to sanitize background-image style before add it to background property when legacyIE11Mode is enabled\n let bg: string = 'url(' + unsafeStyle + ')';\n if (!!unsafeStyleFallback) {\n // if a fallback image is defined, append it. In this way, it will be used by the browser as fallback.\n bg += ', ' + 'url(' + unsafeStyleFallback + ')';\n }\n return this.sanitizer.bypassSecurityTrustStyle(bg);\n }\n\n /**\n * Method to get the background-size value when IE11LegacyMode is enabled.\n * This prevent weired behaviour on IE11 when previews are really small, but original images (.png/.jgp/...) are big.\n * Using 'cover' it's not enough, because it's causing empty background in some cases.\n * After some experiments, I decided to use the double of the height and auto as width.\n */\n getIE11LegacyBgSize(): string {\n if (this.previewConfig && this.previewConfig.maxHeight) {\n const bgHeight: number = +this.previewConfig.maxHeight.replace('px', '');\n return '100% ' + bgHeight * 2 + 'px';\n }\n return 'cover';\n }\n\n /**\n * Method to cleanup resources. In fact, it cleans breakpointSubscription.\n * This is an Angular's lifecycle hook that is called when this component is destroyed.\n */\n ngOnDestroy(): void {\n if (this.breakpointSubscription) {\n this.breakpointSubscription.unsubscribe();\n }\n }\n\n /**\n * Private method to init previews based on the currentImage and the full array of images.\n * The current image in mandatory to show always the current preview (as highlighted).\n * @param InternalLibImage currentImage to decide how to show previews, because I always want to see the current image as highlighted\n * @param InternalLibImage[] images is the array of all images.\n */\n private initPreviews(currentImage: InternalLibImage, images: InternalLibImage[]): void {\n let index: number;\n try {\n index = getIndex(currentImage, images);\n } catch (err) {\n throw err;\n }\n switch (index) {\n case 0:\n // first image\n this.setBeginningIndexesPreviews();\n break;\n case images.length - 1:\n // last image\n this.setEndIndexesPreviews();\n break;\n // default:\n // // other images\n // // TODO unused because it starts always at image 0\n // this.setIndexesPreviews();\n // break;\n }\n this.previews = images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\n }\n\n /**\n * Private method to init both `start` and `end` to the beginning.\n */\n private setBeginningIndexesPreviews(): void {\n if (!this.previewConfig || this.previewConfig.number === undefined) {\n throw new Error('Internal library error - previewConfig and number must be defined');\n }\n\n this.start = 0;\n this.end = Math.min(this.previewConfig.number as number, this.images.length);\n }\n\n /**\n * Private method to init both `start` and `end` to the end.\n */\n private setEndIndexesPreviews(): void {\n if (!this.previewConfig || this.previewConfig.number === undefined) {\n throw new Error('Internal library error - previewConfig and number must be defined');\n }\n\n this.start = this.images.length - 1 - ((this.previewConfig.number as number) - 1);\n this.end = this.images.length;\n }\n\n /**\n * Private method to update the visible previews navigating to the right (next).\n */\n private next(): void {\n // check if nextImage should be blocked\n if (this.isPreventSliding(this.images.length - 1)) {\n return;\n }\n\n if (this.end === this.images.length) {\n return;\n }\n\n this.start++;\n this.end = Math.min(this.end + 1, this.images.length);\n\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\n }\n\n /**\n * Private method to update the visible previews navigating to the left (previous).\n */\n private previous(): void {\n // check if prevImage should be blocked\n if (this.isPreventSliding(0)) {\n return;\n }\n\n if (this.start === 0) {\n return;\n }\n\n this.start = Math.max(this.start - 1, 0);\n this.end = Math.min(this.end - 1, this.images.length);\n\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\n }\n\n /**\n * Private method to block/permit sliding between previews.\n * @param number boundaryIndex is the first or the last index of `images` input array\n * @returns boolean if true block sliding, otherwise not\n */\n private isPreventSliding(boundaryIndex: number): boolean {\n return getIndex(this.currentImage, this.images) === boundaryIndex;\n }\n}\n","<nav *ngIf=\"previewConfig?.visible\"\n class=\"previews-container\"\n [attr.aria-label]=\"accessibilityConfig?.carouselPreviewsContainerAriaLabel\"\n [title]=\"accessibilityConfig?.carouselPreviewsContainerTitle\">\n\n <a class=\"nav-left\"\n [attr.aria-label]=\"accessibilityConfig?.carouselPreviewScrollPrevAriaLabel\"\n [tabIndex]=\"previewConfig?.arrows && start > 0 ? 0 : -1\" role=\"button\"\n (click)=\"onNavigationEvent('left', $event)\" (keyup)=\"onNavigationEvent('left', $event)\">\n <div class=\"inside {{previewConfig?.arrows && start > 0 ? 'left-arrow-preview-image' : 'empty-arrow-preview-image'}}\"\n aria-hidden=\"true\"\n [title]=\"accessibilityConfig?.carouselPreviewScrollPrevTitle\"></div>\n </a>\n\n <div class=\"preview-inner-container\">\n <ng-container *ngFor=\"let preview of previews; trackBy: trackById; let index = index\">\n <ng-container *ngIf=\"!carouselConfig?.legacyIE11Mode; else legacyMode\">\n <img *ngIf=\"preview?.modal?.img\"\n class=\"inside preview-image{{isActive(preview) ? ' active' : ''}}{{!previewConfig?.clickable ? ' unclickable' : ''}}\"\n [src]=\"preview.plain?.img ? preview.plain?.img : preview.modal.img\"\n ksFallbackImage [fallbackImg]=\"preview.plain?.fallbackImg ? preview.plain?.fallbackImg : preview.modal.fallbackImg\"\n ksSize [sizeConfig]=\"{width: previewConfig?.width!,\n height: previewMaxHeight}\"\n [attr.aria-label]=\"getAriaLabel(preview)\"\n [title]=\"getTitle(preview)\"\n alt=\"{{getAlt(preview)}}\"\n [tabIndex]=\"0\" role=\"img\"\n (click)=\"onImageEvent(preview, $event, clickAction)\" (keyup)=\"onImageEvent(preview, $event, keyboardAction)\"/>\n </ng-container>\n <ng-template #legacyMode>\n <div *ngIf=\"preview?.modal?.img\"\n class=\"inside preview-ie11-image{{isActive(preview) ? ' active' : ''}}{{!previewConfig?.clickable ? ' unclickable' : ''}}\"\n [style.background-color]=\"'transparent'\"\n [style.background-image]=\"sanitizeUrlBgStyle(\n preview.plain?.img ? preview.plain?.img : preview.modal.img,\n preview.plain?.fallbackImg ? preview.plain?.fallbackImg : preview.modal.fallbackImg)\"\n [style.background-position]=\"'center center'\"\n [style.background-size]=\"getIE11LegacyBgSize()\"\n [style.background-repeat]=\"'no-repeat'\"\n [style.background-attachment]=\"'scroll'\"\n ksSize [sizeConfig]=\"{width: previewConfig?.width!,\n height: previewMaxHeight}\"\n [attr.aria-label]=\"getAriaLabel(preview)\"\n [title]=\"getTitle(preview)\"\n [tabIndex]=\"0\" role=\"img\"\n (click)=\"onImageEvent(preview, $event, clickAction)\" (keyup)=\"onImageEvent(preview, $event, keyboardAction)\"></div>\n </ng-template>\n </ng-container>\n </div>\n\n <a class=\"nav-right\"\n [attr.aria-label]=\"accessibilityConfig?.carouselPreviewScrollNextAriaLabel\"\n [tabIndex]=\"previewConfig?.arrows && end < images.length ? 0 : -1\" role=\"button\"\n (click)=\"onNavigationEvent('right', $event)\" (keyup)=\"onNavigationEvent('right', $event)\">\n <div class=\"inside {{previewConfig?.arrows && end < images.length ? 'right-arrow-preview-image' : 'empty-arrow-preview-image'}}\"\n aria-hidden=\"true\"\n [title]=\"accessibilityConfig?.carouselPreviewScrollNextTitle\"></div>\n </a>\n\n</nav>\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Directive, ElementRef, Input, OnChanges, OnInit, Renderer2 } from '@angular/core';\nimport { MaxSize } from '../model/max-size.interface';\n\n/**\n * Directive to change the max size of an element.\n */\n@Directive({\n selector: '[ksMaxSize]'\n})\nexport class MaxSizeDirective implements OnInit, OnChanges {\n /**\n * Object of type `MaxSize` to resize the element.\n */\n @Input()\n maxSizeConfig: MaxSize | undefined;\n\n constructor(private renderer: Renderer2, private el: ElementRef) {}\n\n /**\n * Method ´ngOnInit´ to apply the style of this directive.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called only one time!!!\n */\n ngOnInit(): void {\n this.applyStyle();\n }\n\n /**\n * Method ´ngOnChanges´ to apply the style of this directive.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called when any data-bound property of a directive changes!!!\n */\n ngOnChanges(): void {\n this.applyStyle();\n }\n\n /**\n * Private method to change both max-width and max-height of an element.\n */\n private applyStyle(): void {\n if (!this.maxSizeConfig) {\n return;\n }\n if (this.maxSizeConfig.maxWidth) {\n this.renderer.setStyle(this.el.nativeElement, 'max-width', this.maxSizeConfig.maxWidth);\n }\n if (this.maxSizeConfig.maxHeight) {\n this.renderer.setStyle(this.el.nativeElement, 'max-height', this.maxSizeConfig.maxHeight);\n }\n }\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\n// The idea to create a carousel with two Subjects came from ng-bootstrap\n// So a big thank you to the ng-bootstrap team for the interesting implementation that I used here with some customizations.\n\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n HostBinding,\n HostListener,\n Inject,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n PLATFORM_ID,\n SimpleChange,\n SimpleChanges\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\nimport { Subject, timer } from 'rxjs';\nimport { filter, map, switchMap, takeUntil } from 'rxjs/operators';\n\nimport { AccessibleComponent } from '../accessible.component';\n\nimport { AccessibilityConfig } from '../../model/accessibility.interface';\nimport { Image, ImageEvent } from '../../model/image.class';\nimport { Action } from '../../model/action.enum';\nimport { getIndex } from '../../utils/image.util';\nimport { NEXT, PREV } from '../../utils/user-input.util';\nimport { DescriptionStrategy } from '../../model/description.interface';\nimport { DotsConfig } from '../../model/dots-config.interface';\nimport { KS_DEFAULT_ACCESSIBILITY_CONFIG } from '../accessibility-default';\nimport { PlayConfig } from '../../model/play-config.interface';\nimport { CarouselConfig } from '../../model/carousel-config.interface';\nimport { CarouselImageConfig } from '../../model/carousel-image-config.interface';\nimport { DomSanitizer, SafeStyle } from '@angular/platform-browser';\nimport { CarouselPreviewConfig } from '../../model/carousel-preview-config.interface';\nimport { ConfigService } from '../../services/config.service';\nimport { ModalGalleryService } from '../modal-gallery/modal-gallery.service';\nimport { LibConfig } from '../../model/lib-config.interface';\nimport { ModalGalleryConfig } from '../../model/modal-gallery-config.interface';\nimport { KeyboardServiceConfig } from '../../model/keyboard-service-config.interface';\n\n/**\n * Component with configurable inline/plain carousel.\n */\n@Component({\n selector: 'ks-carousel',\n styleUrls: ['carousel.scss', '../image-arrows.scss'],\n templateUrl: 'carousel.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [ConfigService]\n})\nexport class CarouselComponent extends AccessibleComponent implements OnInit, AfterContentInit, OnDestroy, OnChanges {\n /**\n * Attribute to set ariaLabel of the host component\n */\n @HostBinding('attr.aria-label')\n ariaLabel = `Carousel`;\n /**\n * Unique id (>=0) of the current instance of the carousel. This is useful when you are using\n * the carousel's feature to open modal gallery.\n */\n @Input()\n id: number | undefined;\n /**\n * Array of `InternalLibImage` that represent the model of this library with all images,\n * thumbs and so on.\n */\n @Input()\n images: Image[] = [];\n /**\n * Object of type `CarouselConfig` to init CarouselComponent's features.\n * For instance, it contains parameters to change the style, how it navigates and so on.\n */\n @Input()\n carouselConfig: CarouselConfig | undefined;\n /**\n * Object of type `PlayConfig` to init CarouselComponent's features about auto-play.\n * For instance, it contains parameters to enable/disable autoPlay, interval and so on.\n */\n @Input()\n playConfig: PlayConfig | undefined;\n /**\n * Interface to configure current image in carousel.\n * For instance you can change the description.\n */\n @Input()\n carouselImageConfig: CarouselImageConfig | undefined;\n /**\n * Object of type `CarouselPreviewConfig` to init PreviewsComponent's features.\n * For instance, it contains a param to show/hide previews, change sizes and so on.\n */\n @Input()\n previewConfig: CarouselPreviewConfig | undefined;\n /**\n * Object of type `DotsConfig` to init DotsComponent's features.\n * For instance, it contains a param to show/hide this component.\n */\n @Input()\n dotsConfig: DotsConfig | undefined;\n /**\n * boolean to enable/disable infinite sliding. Enabled by default.\n */\n @Input()\n infinite = true;\n /**\n * TODO add description\n */\n @Input()\n disableSsrWorkaround = false;\n /**\n * Object of type `AccessibilityConfig` to init custom accessibility features.\n * For instance, it contains titles, alt texts, aria-labels and so on.\n */\n @Input()\n accessibilityConfig: AccessibilityConfig | undefined;\n\n /**\n * Output to emit an event when an image is changed.\n */\n @Output()\n showImage: EventEmitter<ImageEvent> = new EventEmitter<ImageEvent>();\n /**\n * Output to emit an event when the current image is the first one.\n */\n @Output()\n firstImage: EventEmitter<ImageEvent> = new EventEmitter<ImageEvent>();\n /**\n * Output to emit an event when the current image is the last one.\n */\n @Output()\n lastImage: EventEmitter<ImageEvent> = new EventEmitter<ImageEvent>();\n\n /**\n * Object use in template\n */\n configCarousel: CarouselConfig | undefined;\n /**\n * Object use in template\n */\n configPlay: PlayConfig | undefined;\n /**\n * Object use in template\n */\n configCarouselImage: CarouselImageConfig | undefined;\n /**\n * Object use in template\n */\n configPreview: CarouselPreviewConfig | undefined;\n /**\n * Object use in template\n */\n configDots: DotsConfig | undefined;\n /**\n * Object use in template\n */\n configAccessibility: AccessibilityConfig = KS_DEFAULT_ACCESSIBILITY_CONFIG;\n\n /**\n * Enum of type `Action` that represents a mouse click on a button.\n * Declared here to be used inside the template.\n */\n clickAction: Action = Action.CLICK;\n /**\n * Enum of type `Action` that represents a keyboard action.\n * Declared here to be used inside the template.\n */\n keyboardAction: Action = Action.KEYBOARD;\n /**\n * `Image` that is visible right now.\n */\n currentImage: Image | undefined;\n /**\n * Boolean that it's true when you are watching the first image (currently visible).\n * False by default\n */\n isFirstImage = false;\n /**\n * Boolean that it's true when you are watching the last image (currently visible).\n * False by default\n */\n isLastImage = false;\n\n /**\n * Subject to play the carousel.\n */\n private start$ = new Subject<void>();\n /**\n * Subject to stop the carousel.\n */\n private stop$ = new Subject<void>();\n\n /**\n * Private object without type to define all swipe actions used by hammerjs.\n */\n private SWIPE_ACTION = {\n LEFT: 'swipeleft',\n RIGHT: 'swiperight',\n UP: 'swipeup',\n DOWN: 'swipedown'\n };\n\n /**\n * Listener to stop the gallery when the mouse pointer is over the current image.\n */\n @HostListener('mouseenter')\n onMouseEnter(): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n if (!libConfig.carouselPlayConfig || !libConfig.carouselPlayConfig.pauseOnHover) {\n return;\n }\n this.stopCarousel();\n }\n\n /**\n * Listener to play the gallery when the mouse pointer leave the current image.\n */\n @HostListener('mouseleave')\n onMouseLeave(): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n if (!libConfig.carouselPlayConfig || !libConfig.carouselPlayConfig.pauseOnHover || !libConfig.carouselPlayConfig.autoPlay) {\n return;\n }\n this.playCarousel();\n }\n\n /**\n * Listener to navigate carousel images with keyboard (left).\n */\n @HostListener('keydown.arrowLeft')\n onKeyDownLeft(): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n if (!libConfig.carouselConfig || !libConfig.carouselConfig.keyboardEnable) {\n return;\n }\n this.prevImage();\n }\n\n /**\n * Listener to navigate carousel images with keyboard (right).\n */\n @HostListener('keydown.arrowRight')\n onKeyDownLRight(): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n if (!libConfig.carouselConfig || !libConfig.carouselConfig.keyboardEnable) {\n return;\n }\n this.nextImage();\n }\n\n constructor(\n // tslint:disable-next-line:no-any\n @Inject(PLATFORM_ID) private platformId: any,\n private ngZone: NgZone,\n private modalGalleryService: ModalGalleryService,\n private configService: ConfigService,\n private ref: ChangeDetectorRef,\n // sanitizer is used only to sanitize style before add it to background property when legacyIE11Mode is enabled\n private sanitizer: DomSanitizer\n ) {\n super();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n\n // handle changes of dotsConfig\n const configDotsChange: SimpleChange = changes.dotsConfig;\n if (configDotsChange && configDotsChange.currentValue !== configDotsChange.previousValue) {\n this.configService.setConfig(this.id, {\n carouselDotsConfig: configDotsChange.currentValue\n });\n this.configDots = libConfig.carouselDotsConfig;\n }\n // handle changes of carouselConfig\n const carouselConfigChange: SimpleChange = changes.carouselConfig;\n if (carouselConfigChange && carouselConfigChange.currentValue !== carouselConfigChange.previousValue) {\n this.configService.setConfig(this.id, {\n carouselConfig: carouselConfigChange.currentValue\n });\n this.configCarousel = carouselConfigChange.currentValue;\n }\n // handle changes of playConfig starting/stopping the carousel accordingly\n const playConfigChange: SimpleChange = changes.playConfig;\n if (playConfigChange) {\n const playConfigChangePrev: PlayConfig = playConfigChange.previousValue;\n const playConfigChangeCurr: PlayConfig = playConfigChange.currentValue;\n if (playConfigChangePrev !== playConfigChangeCurr) {\n this.configService.setConfig(this.id, {\n carouselPlayConfig: playConfigChange.currentValue\n });\n // this.configPlay = playConfigChange.currentValue;\n // if autoplay is enabled, and this is not the\n // first change (to prevent multiple starts at the beginning)\n if (playConfigChangeCurr.autoPlay && !playConfigChange.isFirstChange()) {\n this.start$.next();\n } else {\n this.stopCarousel();\n }\n }\n }\n }\n\n ngOnInit(): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n if (!this.images) {\n throw new Error('Internal library error - images must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n this.currentImage = this.images[0];\n\n this.configService.setConfig(this.id, {\n carouselConfig: this.carouselConfig,\n carouselImageConfig: this.carouselImageConfig,\n carouselPlayConfig: this.playConfig,\n carouselPreviewsConfig: this.previewConfig,\n carouselDotsConfig: this.dotsConfig,\n accessibilityConfig: this.accessibilityConfig,\n // this custom config with 'disableSsrWorkaround: true' is required in case of SystemJS\n keyboardServiceConfig: {\n shortcuts: ['ctrl+s', 'meta+s'],\n disableSsrWorkaround: this.disableSsrWorkaround\n }\n });\n this.configCarousel = libConfig.carouselConfig;\n this.configCarouselImage = libConfig.carouselImageConfig;\n this.configPlay = libConfig.carouselPlayConfig;\n this.configPreview = libConfig.carouselPreviewsConfig;\n this.configDots = libConfig.carouselDotsConfig;\n this.configAccessibility = libConfig.accessibilityConfig as AccessibilityConfig;\n this.manageSlideConfig();\n }\n\n ngAfterContentInit(): void {\n // interval doesn't play well with SSR and protractor,\n // so we should run it in the browser and outside Angular\n if (isPlatformBrowser(this.platformId)) {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig || !libConfig.carouselPlayConfig) {\n throw new Error('Internal library error - libConfig and carouselPlayConfig must be defined');\n }\n this.ngZone.runOutsideAngular(() => {\n this.start$\n .pipe(\n map(() => libConfig && libConfig.carouselPlayConfig && libConfig.carouselPlayConfig.interval),\n // tslint:disable-next-line:no-any\n filter((interval: any) => interval > 0),\n switchMap(interval => timer(interval).pipe(takeUntil(this.stop$)))\n )\n .subscribe(() =>\n this.ngZone.run(() => {\n if (this.configPlay && this.configPlay.autoPlay) {\n this.nextImage();\n }\n this.ref.markForCheck();\n })\n );\n\n this.start$.next();\n });\n }\n }\n\n /**\n * Method used in template to sanitize an url when you need legacyIE11Mode.\n * In this way you can set an url as background of a div.\n * @param unsafeStyle is a string and represents the url to sanitize.\n * @param unsafeStyleFallback is a string and represents the fallback url to sanitize.\n * @returns a SafeStyle object that can be used in template without problems.\n */\n sanitizeUrlBgStyle(unsafeStyle: string, unsafeStyleFallback: string): SafeStyle {\n // Method used only to sanitize background-image style before add it to background property when legacyIE11Mode is enabled\n let bg: string = 'url(' + unsafeStyle + ')';\n if (!!unsafeStyleFallback) {\n // if a fallback image is defined, append it. In this way, it will be used by the browser as fallback.\n bg += ', ' + 'url(' + unsafeStyleFallback + ')';\n }\n return this.sanitizer.bypassSecurityTrustStyle(bg);\n }\n\n /**\n * Method called when a dot is clicked and used to update the current image.\n * @param number index of the clicked dot\n */\n onClickDot(index: number): void {\n this.changeCurrentImage(this.images[index], Action.NORMAL);\n }\n\n /**\n * Method called by events from both keyboard and mouse on a navigation arrow.\n * @param string direction of the navigation that can be either 'next' or 'prev'\n * @param KeyboardEvent | MouseEvent event payload\n * @param Action action that triggered the event or `Action.NORMAL` if not provided\n */\n onNavigationEvent(direction: string, event: KeyboardEvent | MouseEvent, action: Action = Action.NORMAL): void {\n const result: number = super.handleNavigationEvent(direction, event);\n if (result === NEXT) {\n this.nextImage(action);\n } else if (result === PREV) {\n this.prevImage(action);\n }\n }\n\n /**\n * Method triggered when you click on the current image.\n * Also, if modalGalleryEnable is true, you can open the modal-gallery.\n */\n onClickCurrentImage(): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig || !libConfig.carouselConfig || !this.currentImage) {\n throw new Error('Internal library error - libConfig, carouselConfig and currentImage must be defined');\n }\n if (!libConfig.carouselConfig.modalGalleryEnable) {\n return;\n }\n const index = getIndex(this.currentImage, this.images);\n this.modalGalleryService.open({\n id: this.id,\n images: this.images,\n currentImage: this.images[index],\n libConfig: {\n // this custom config with 'disableSsrWorkaround: true' is required in case of SystemJS\n keyboardServiceConfig: {\n shortcuts: ['ctrl+s', 'meta+s'],\n disableSsrWorkaround: this.disableSsrWorkaround\n } as KeyboardServiceConfig\n } as LibConfig\n } as ModalGalleryConfig);\n }\n\n /**\n * Method to get the image description based on input params.\n * If you provide a full description this will be the visible description, otherwise,\n * it will be built using the `Description` object, concatenating its fields.\n * @param Image image to get its description. If not provided it will be the current image\n * @returns String description of the image (or the current image if not provided)\n * @throws an Error if description isn't available\n */\n getDescriptionToDisplay(image: Image | undefined = this.currentImage): string {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n const configCurrentImageCarousel: CarouselImageConfig | undefined = libConfig.carouselImageConfig;\n if (!configCurrentImageCarousel || !configCurrentImageCarousel.description) {\n throw new Error('Description input must be a valid object implementing the Description interface');\n }\n if (!image) {\n throw new Error('Internal library error - image must be defined');\n }\n const imageWithoutDescription: boolean = !image || !image.modal || !image.modal.description || image.modal.description === '';\n\n switch (configCurrentImageCarousel.description.strategy) {\n case DescriptionStrategy.HIDE_IF_EMPTY:\n return imageWithoutDescription ? '' : image.modal.description + '';\n case DescriptionStrategy.ALWAYS_HIDDEN:\n return '';\n default:\n // ----------- DescriptionStrategy.ALWAYS_VISIBLE -----------------\n return this.buildTextDescription(image, imageWithoutDescription);\n }\n }\n\n /**\n * Method used by Hammerjs to support touch gestures (you can also invert the swipe direction with configCurrentImage.invertSwipe).\n * @param action String that represent the direction of the swipe action. 'swiperight' by default.\n */\n swipe(action = this.SWIPE_ACTION.RIGHT): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig || !libConfig.carouselImageConfig) {\n throw new Error('Internal library error - libConfig and carouselImageConfig must be defined');\n }\n const configCurrentImageCarousel: CarouselImageConfig = libConfig.carouselImageConfig;\n switch (action) {\n case this.SWIPE_ACTION.RIGHT:\n if (configCurrentImageCarousel.invertSwipe) {\n this.prevImage(Action.SWIPE);\n } else {\n this.nextImage(Action.SWIPE);\n }\n break;\n case this.SWIPE_ACTION.LEFT:\n if (configCurrentImageCarousel.invertSwipe) {\n this.nextImage(Action.SWIPE);\n } else {\n this.prevImage(Action.SWIPE);\n }\n break;\n // case this.SWIPE_ACTION.UP:\n // break;\n // case this.SWIPE_ACTION.DOWN:\n // break;\n }\n }\n\n /**\n * Method to go back to the previous image.\n * @param action Enum of type `Action` that represents the source\n * action that moved back to the previous image. `Action.NORMAL` by default.\n */\n prevImage(action: Action = Action.NORMAL): void {\n // check if prevImage should be blocked\n if (this.isPreventSliding(0)) {\n return;\n }\n this.changeCurrentImage(this.getPrevImage(), action);\n\n this.manageSlideConfig();\n\n this.start$.next();\n }\n\n /**\n * Method to go back to the previous image.\n * @param action Enum of type `Action` that represents the source\n * action that moved to the next image. `Action.NORMAL` by default.\n */\n nextImage(action: Action = Action.NORMAL): void {\n // check if nextImage should be blocked\n if (this.isPreventSliding(this.images.length - 1)) {\n return;\n }\n this.changeCurrentImage(this.getNextImage(), action);\n\n this.manageSlideConfig();\n\n this.start$.next();\n }\n\n /**\n * Method used in the template to track ids in ngFor.\n * @param number index of the array\n * @param Image item of the array\n * @returns number the id of the item\n */\n trackById(index: number, item: Image): number {\n return item.id;\n }\n\n /**\n * Method called when an image preview is clicked and used to update the current image.\n * @param event an ImageEvent object with the relative action and the index of the clicked preview.\n */\n onClickPreview(event: ImageEvent): void {\n const imageFound: Image = this.images[event.result as number];\n if (!!imageFound) {\n this.manageSlideConfig();\n this.changeCurrentImage(imageFound, event.action);\n }\n }\n\n /**\n * Method to play carousel.\n */\n playCarousel(): void {\n this.start$.next();\n }\n\n /**\n * Stops the carousel from cycling through items.\n */\n stopCarousel(): void {\n this.stop$.next();\n }\n\n // TODO remove this because duplicated\n /**\n * Method to get `alt attribute`.\n * `alt` specifies an alternate text for an image, if the image cannot be displayed.\n * @param Image image to get its alt description. If not provided it will be the current image\n * @returns String alt description of the image (or the current image if not provided)\n */\n getAltDescriptionByImage(image: Image | undefined = this.currentImage): string {\n if (!image) {\n return '';\n }\n return image.modal && image.modal.description ? image.modal.description : `Image ${getIndex(image, this.images) + 1}`;\n }\n\n // TODO remove this because duplicated\n /**\n * Method to get the title attributes based on descriptions.\n * This is useful to prevent accessibility issues, because if DescriptionStrategy is ALWAYS_HIDDEN,\n * it prevents an empty string as title.\n * @param Image image to get its description. If not provided it will be the current image\n * @returns String title of the image based on descriptions\n * @throws an Error if description isn't available\n */\n getTitleToDisplay(image: Image | undefined = this.currentImage): string {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig || !libConfig.carouselImageConfig) {\n throw new Error('Internal library error - libConfig and carouselImageConfig must be defined');\n }\n const configCurrentImageCarousel: CarouselImageConfig = libConfig.carouselImageConfig;\n if (!configCurrentImageCarousel || !configCurrentImageCarousel.description) {\n throw new Error('Description input must be a valid object implementing the Description interface');\n }\n const imageWithoutDescription: boolean = !image || !image.modal || !image.modal.description || image.modal.description === '';\n const description: string = this.buildTextDescription(image, imageWithoutDescription);\n return description;\n }\n\n /**\n * Method to reset carousel (force image with index 0 to be the current image and re-init also previews)\n */\n // temporary removed because never tested\n // reset() {\n // if (this.configPlay && this.configPlay.autoPlay) {\n // this.stopCarousel();\n // }\n // this.currentImage = this.images[0];\n // this.handleBoundaries(0);\n // if (this.configPlay && this.configPlay.autoPlay) {\n // this.playCarousel();\n // }\n // this.ref.markForCheck();\n // }\n\n /**\n * Method to cleanup resources. In fact, this will stop the carousel.\n * This is an Angular's lifecycle hook that is called when this component is destroyed.\n */\n ngOnDestroy(): void {\n this.stopCarousel();\n }\n\n /**\n * Method to change the current image, receiving the new image as input the relative action.\n * @param image an Image object that represents the new image to set as current.\n * @param action Enum of type `Action` that represents the source action that triggered the change.\n */\n private changeCurrentImage(image: Image, action: Action): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n this.currentImage = image;\n const index: number = getIndex(image, this.images);\n\n // emit first/last event based on newIndex value\n this.emitBoundaryEvent(action, index);\n\n // emit current visible image index\n this.showImage.emit(new ImageEvent(this.id, action, index + 1));\n }\n\n /**\n * Private method to get the next index.\n * This is necessary because at the end, when you call next again, you'll go to the first image.\n * That happens because all modal images are shown like in a circle.\n */\n private getNextImage(): Image {\n if (!this.currentImage) {\n throw new Error('Internal library error - currentImage must be defined');\n }\n const currentIndex: number = getIndex(this.currentImage, this.images);\n let newIndex = 0;\n if (currentIndex >= 0 && currentIndex < this.images.length - 1) {\n newIndex = currentIndex + 1;\n } else {\n newIndex = 0; // start from the first index\n }\n return this.images[newIndex];\n }\n\n /**\n * Private method to get the previous index.\n * This is necessary because at index 0, when you call prev again, you'll go to the last image.\n * That happens because all modal images are shown like in a circle.\n */\n private getPrevImage(): Image {\n if (!this.currentImage) {\n throw new Error('Internal library error - currentImage must be defined');\n }\n const currentIndex: number = getIndex(this.currentImage, this.images);\n let newIndex = 0;\n if (currentIndex > 0 && currentIndex <= this.images.length - 1) {\n newIndex = currentIndex - 1;\n } else {\n newIndex = this.images.length - 1; // start from the last index\n }\n return this.images[newIndex];\n }\n\n /**\n * Private method to build a text description.\n * This is used also to create titles.\n * @param Image image to get its description. If not provided it will be the current image.\n * @param boolean imageWithoutDescription is a boolean that it's true if the image hasn't a 'modal' description.\n * @returns String description built concatenating image fields with a specific logic.\n */\n private buildTextDescription(image: Image | undefined, imageWithoutDescription: boolean): string {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig || !libConfig.carouselImageConfig) {\n throw new Error('Internal library error - libConfig and carouselImageConfig must be defined');\n }\n const configCurrentImageCarousel: CarouselImageConfig | undefined = libConfig.carouselImageConfig;\n if (!configCurrentImageCarousel || !configCurrentImageCarousel.description) {\n throw new Error('Description input must be a valid object implementing the Description interface');\n }\n if (!image) {\n throw new Error('Internal library error - image must be defined');\n }\n\n // If customFullDescription use it, otherwise proceed to build a description\n if (configCurrentImageCarousel.description.customFullDescription && configCurrentImageCarousel.description.customFullDescription !== '') {\n return configCurrentImageCarousel.description.customFullDescription;\n }\n\n const currentIndex: number = getIndex(image, this.images);\n // If the current image hasn't a description,\n // prevent to write the ' - ' (or this.description.beforeTextDescription)\n\n const prevDescription: string = configCurrentImageCarousel.description.imageText ? configCurrentImageCarousel.description.imageText : '';\n const midSeparator: string = configCurrentImageCarousel.description.numberSeparator ? configCurrentImageCarousel.description.numberSeparator : '';\n const middleDescription: string = currentIndex + 1 + midSeparator + this.images.length;\n\n if (imageWithoutDescription) {\n return prevDescription + middleDescription;\n }\n\n const currImgDescription: string = image.modal && image.modal.description ? image.modal.description : '';\n const endDescription: string = configCurrentImageCarousel.description.beforeTextDescription + currImgDescription;\n return prevDescription + middleDescription + endDescription;\n }\n\n /**\n * Private method to update both `isFirstImage` and `isLastImage` based on\n * the index of the current image.\n * @param number currentIndex is the index of the current image\n */\n private handleBoundaries(currentIndex: number): void {\n if (this.images.length === 1) {\n this.isFirstImage = true;\n this.isLastImage = true;\n return;\n }\n switch (currentIndex) {\n case 0:\n // execute this only if infinite sliding is disabled\n this.isFirstImage = true;\n this.isLastImage = false;\n break;\n case this.images.length - 1:\n // execute this only if infinite sliding is disabled\n this.isFirstImage = false;\n this.isLastImage = true;\n break;\n default:\n this.isFirstImage = false;\n this.isLastImage = false;\n break;\n }\n }\n\n /**\n * Private method to manage boundary arrows and sliding.\n * This is based on the slideConfig input to enable/disable 'infinite sliding'.\n * @param number index of the visible image\n */\n private manageSlideConfig(): void {\n if (!this.currentImage) {\n throw new Error('Internal library error - currentImage must be defined');\n }\n let index: number;\n try {\n index = getIndex(this.currentImage, this.images);\n } catch (err) {\n console.error('Cannot get the current image index in current-image');\n throw err;\n }\n\n if (this.infinite === true) {\n // enable infinite sliding\n this.isFirstImage = false;\n this.isLastImage = false;\n } else {\n this.handleBoundaries(index);\n }\n }\n\n /**\n * Private method to emit events when either the last or the first image are visible.\n * @param action Enum of type Action that represents the source of the event that changed the\n * current image to the first one or the last one.\n * @param indexToCheck is the index number of the image (the first or the last one).\n */\n private emitBoundaryEvent(action: Action, indexToCheck: number): void {\n if (this.id === null || this.id === undefined) {\n return;\n }\n // to emit first/last event\n switch (indexToCheck) {\n case 0:\n this.firstImage.emit(new ImageEvent(this.id, action, true));\n break;\n case this.images.length - 1:\n this.lastImage.emit(new ImageEvent(this.id, action, true));\n break;\n }\n }\n\n /**\n * Private method to check if next/prev actions should be blocked.\n * It checks if slideConfig.infinite === false and if the image index is equals to the input parameter.\n * If yes, it returns true to say that sliding should be blocked, otherwise not.\n * @param number boundaryIndex that could be either the beginning index (0) or the last index\n * of images (this.images.length - 1).\n * @returns boolean true if slideConfig.infinite === false and the current index is\n * either the first or the last one.\n */\n private isPreventSliding(boundaryIndex: number): boolean {\n if (!this.currentImage) {\n throw new Error('Internal library error - currentImage must be defined');\n }\n return !this.infinite && getIndex(this.currentImage, this.images) === boundaryIndex;\n }\n}\n","<main id=\"carousel-container\"\n [attr.aria-label]=\"configAccessibility.carouselContainerAriaLabel\"\n [title]=\"configAccessibility.carouselContainerTitle\"\n ksMaxSize [maxSizeConfig]=\"{maxWidth: configCarousel?.maxWidth,\n maxHeight: ''}\">\n\n\n <!-- Workaround to support 2 ng-content in the same template in 2 ngIf (https://github.com/angular/angular/issues/22972) -->\n <ng-template #content><ng-content></ng-content></ng-template>\n\n <!-- Normal figure used by all browsers except for IE11, because\n it doesn't support object-fit cover.-->\n <figure class=\"current-figure\" *ngIf=\"configCarousel?.legacyIE11Mode === false; else legacyMode\"\n ksSize [sizeConfig]=\"{width: configCarousel?.maxWidth,\n height: ''}\">\n\n <a class=\"nav-left\" *ngIf=\"configCarousel?.showArrows\"\n [attr.aria-label]=\"configAccessibility.carouselPrevImageAriaLabel\"\n [tabIndex]=\"isLastImage && !infinite ? -1 : 0\" role=\"button\"\n (click)=\"onNavigationEvent('left', $event, clickAction)\" (keyup)=\"onNavigationEvent('left', $event, keyboardAction)\">\n <div class=\"inside {{(isFirstImage && !infinite) || !configCarousel.showArrows ? 'empty-arrow-image' : 'left-arrow-image'}}\"\n aria-hidden=\"true\"\n [title]=\"configAccessibility.carouselPrevImageTitle\"></div>\n </a>\n\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n\n <img id=\"current-image\"\n [style.object-fit]=\"configCarousel?.objectFit\"\n ksMaxSize [maxSizeConfig]=\"{maxWidth: configCarousel?.maxWidth,\n maxHeight: configCarousel?.maxHeight}\"\n [src]=\"currentImage.modal.img\"\n ksFallbackImage [fallbackImg]=\"currentImage.modal.fallbackImg\"\n [attr.aria-label]=\"currentImage.modal.ariaLabel\"\n [title]=\"(currentImage.modal.title || currentImage.modal.title === '') ? currentImage.modal.title : getTitleToDisplay()\"\n alt=\"{{currentImage.modal.alt ? currentImage.modal.alt : getAltDescriptionByImage()}}\"\n [tabIndex]=\"0\" role=\"img\"\n (click)=\"onClickCurrentImage()\"\n (swipeleft)=\"swipe($event.type)\"\n (swiperight)=\"swipe($event.type)\"/>\n\n <figcaption *ngIf=\"getDescriptionToDisplay() !== ''\"\n class=\"description\"\n ksDescription [description]=\"configCarouselImage?.description\"\n [innerHTML]=\"getDescriptionToDisplay()\"></figcaption>\n\n <a class=\"nav-right\" *ngIf=\"configCarousel?.showArrows\"\n [attr.aria-label]=\"configAccessibility.carouselNextImageAriaLabel\"\n [tabIndex]=\"isLastImage && !infinite ? -1 : 0\" role=\"button\"\n (click)=\"onNavigationEvent('right', $event, clickAction)\" (keyup)=\"onNavigationEvent('right', $event, keyboardAction)\">\n <div class=\"inside {{(isLastImage && !infinite) || !configCarousel.showArrows ? 'empty-arrow-image' : 'right-arrow-image'}}\"\n aria-hidden=\"true\"\n [title]=\"configAccessibility.carouselNextImageTitle\"></div>\n </a>\n\n <div id=\"dots\">\n <ks-dots [id]=\"id\"\n [currentImage]=\"currentImage\"\n [images]=\"images\"\n [dotsConfig]=\"dotsConfig\"\n (clickDot)=\"onClickDot($event)\"></ks-dots>\n </div>\n\n </figure>\n\n <!-- Legacy mode to support img cover also on IE11,\n because it doesn't support natively object-fit cover. -->\n <ng-template #legacyMode>\n <div class=\"current-figure\"\n ksSize [sizeConfig]=\"{width: configCarousel?.maxWidth,\n height: ''}\">\n\n <a class=\"nav-left\" *ngIf=\"configCarousel?.showArrows\"\n [attr.aria-label]=\"configAccessibility.carouselPrevImageAriaLabel\"\n [tabindex]=\"isLastImage && !infinite ? -1 : 0\" role=\"button\"\n (click)=\"onNavigationEvent('left', $event, clickAction)\" (keyup)=\"onNavigationEvent('left', $event, keyboardAction)\">\n <div class=\"inside {{(isFirstImage && !infinite) || !configCarousel.showArrows ? 'empty-arrow-image' : 'left-arrow-image'}}\"\n aria-hidden=\"true\"\n [title]=\"configAccessibility.carouselPrevImageTitle\"></div>\n </a>\n\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n\n <div id=\"current-image-legacy\"\n [style.background-color]=\"'transparent'\"\n [style.background-image]=\"sanitizeUrlBgStyle(currentImage.modal.img + '', currentImage.modal.fallbackImg + '')\"\n [style.background-position]=\"'center center'\"\n [style.background-size]=\"'cover'\"\n [style.background-repeat]=\"'no-repeat'\"\n [style.background-attachment]=\"'scroll'\"\n ksSize [sizeConfig]=\"{width: '100%',\n height: configCarousel?.maxHeight}\"\n ksMaxSize [maxSizeConfig]=\"{maxWidth: configCarousel?.maxWidth}\"\n [attr.aria-label]=\"currentImage.modal.ariaLabel\"\n [title]=\"(currentImage.modal.title || currentImage.modal.title === '') ? currentImage.modal.title : getTitleToDisplay()\"\n [tabIndex]=\"0\" role=\"img\"\n (click)=\"onClickCurrentImage()\"\n (swipeleft)=\"swipe($event.type)\"\n (swiperight)=\"swipe($event.type)\">\n\n <div *ngIf=\"getDescriptionToDisplay() !== ''\"\n class=\"description-ie11\"\n ksDescription [description]=\"configCarouselImage?.description\"\n [innerHTML]=\"getDescriptionToDisplay()\"></div>\n </div>\n\n <a class=\"nav-right\" *ngIf=\"configCarousel?.showArrows\"\n [attr.aria-label]=\"configAccessibility.carouselNextImageAriaLabel\"\n [tabIndex]=\"isLastImage && !infinite ? -1 : 0\" role=\"button\"\n (click)=\"onNavigationEvent('right', $event, clickAction)\" (keyup)=\"onNavigationEvent('right', $event, keyboardAction)\">\n <div class=\"inside {{(isLastImage && !infinite) || !configCarousel.showArrows ? 'empty-arrow-image' : 'right-arrow-image'}}\"\n aria-hidden=\"true\"\n [title]=\"configAccessibility.carouselNextImageTitle\"></div>\n </a>\n\n <div id=\"dots-ie11\">\n <ks-dots [id]=\"id\"\n [currentImage]=\"currentImage\"\n [images]=\"images\"\n (clickDot)=\"onClickDot($event)\"></ks-dots>\n </div>\n\n </div>\n </ng-template>\n\n</main>\n\n<ks-carousel-previews [id]=\"id\"\n [images]=\"images\"\n [currentImage]=\"currentImage\"\n (clickPreview)=\"onClickPreview($event)\"></ks-carousel-previews>\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Directive, ElementRef, Input, OnChanges, OnInit, Renderer2 } from '@angular/core';\n\n/**\n * Directive to change the flex-wrap css property of an element.\n */\n@Directive({\n selector: '[ksWrap]'\n})\nexport class WrapDirective implements OnInit, OnChanges {\n /**\n * Boolean input that it's true to add 'flex-wrap: wrap', 'flex-wrap: nowrap' otherwise.\n */\n @Input()\n wrap: boolean | undefined;\n /**\n * String input to force the width of the element to be able to see wrapping.\n */\n @Input()\n width: string | undefined;\n\n constructor(private renderer: Renderer2, private el: ElementRef) {}\n\n /**\n * Method ´ngOnInit´ to apply the style of this directive.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called only one time!!!\n */\n ngOnInit(): void {\n this.applyStyle();\n }\n\n /**\n * Method ´ngOnChanges´ to apply the style of this directive.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called when any data-bound property of a directive changes!!!\n */\n ngOnChanges(): void {\n this.applyStyle();\n }\n\n /**\n * Private method to change both width and flex-wrap css properties.\n */\n private applyStyle(): void {\n // TODO is this right???? If wrap is false I cannot apply width and flex-wrap\n if (!this.wrap) {\n return;\n }\n this.renderer.setStyle(this.el.nativeElement, 'width', this.width);\n this.renderer.setStyle(this.el.nativeElement, 'flex-wrap', this.wrap ? 'wrap' : 'nowrap');\n }\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Directive, ElementRef, Input, OnChanges, OnInit, Renderer2 } from '@angular/core';\n\n/**\n * Directive to change the flex-direction of an element, based on two inputs (`direction` and `justify`).\n */\n@Directive({\n selector: '[ksDirection]'\n})\nexport class DirectionDirective implements OnInit, OnChanges {\n /**\n * String input to set the css flex-direction of an element.\n */\n @Input()\n direction: string | undefined;\n /**\n * String input to set the css justify-content of an element.\n */\n @Input()\n justify: string | undefined;\n\n constructor(private renderer: Renderer2, private el: ElementRef) {}\n\n /**\n * Method ´ngOnInit´ to apply the style of this directive.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called only one time!!!\n */\n ngOnInit(): void {\n this.applyStyle();\n }\n\n /**\n * Method ´ngOnChanges´ to apply the style of this directive.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called when any data-bound property of a directive changes!!!\n */\n ngOnChanges(): void {\n this.applyStyle();\n }\n\n /**\n * Private method to change both direction and justify of an element.\n */\n private applyStyle(): void {\n if (!this.direction || !this.justify) {\n return;\n }\n this.renderer.setStyle(this.el.nativeElement, 'flex-direction', this.direction);\n this.renderer.setStyle(this.el.nativeElement, 'justify-content', this.justify);\n }\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Directive, ElementRef, Input, OnChanges, OnInit, Renderer2 } from '@angular/core';\n\nimport { Image } from '../model/image.class';\nimport { SafeResourceUrl } from '@angular/platform-browser';\n\n/**\n * Directive to add an image to an `<a>` tag with some additional custom properties.\n */\n@Directive({\n selector: '[ksATagBgImage]'\n})\nexport class ATagBgImageDirective implements OnInit, OnChanges {\n /**\n * Object of type `Image` that represents the image to add to the `<a>` tag.\n */\n @Input()\n image: Image | undefined;\n /**\n * Additional style to customize the background attribute.\n * Empty string by default.\n */\n @Input()\n style: string | undefined;\n\n constructor(private renderer: Renderer2, private el: ElementRef) {}\n\n /**\n * Method ´ngOnInit´ to apply the style of this directive.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called only one time!!!\n */\n ngOnInit(): void {\n this.applyStyle();\n }\n\n /**\n * Method ´ngOnChanges´ to apply the style of this directive.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called when any data-bound property of a directive changes!!!\n */\n ngOnChanges(): void {\n this.applyStyle();\n }\n\n /**\n * Private method to add an image as background of an `<a>` tag.\n */\n private applyStyle(): void {\n if (!this.image || (!this.image.plain && !this.image.modal)) {\n return;\n }\n\n const imgPath: string | SafeResourceUrl = this.image.plain && this.image.plain.img ? this.image.plain.img : this.image.modal.img;\n let bg = `url(\"${imgPath}\") ${this.style}`;\n\n const fallbackImgPath: string | SafeResourceUrl | undefined =\n this.image.plain && this.image.plain.fallbackImg ? this.image.plain.fallbackImg : this.image.modal.fallbackImg;\n if (!!fallbackImgPath) {\n bg += `, url(\"${fallbackImgPath}\") ${this.style}`;\n }\n\n this.renderer.setStyle(this.el.nativeElement, 'background', bg);\n }\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChange, SimpleChanges } from '@angular/core';\n\nimport { AccessibilityConfig } from '../../model/accessibility.interface';\nimport { Image } from '../../model/image.class';\nimport { Size } from '../../model/size.interface';\nimport { AdvancedLayout, GridLayout, LineLayout, PlainGalleryConfig, PlainGalleryStrategy } from '../../model/plain-gallery-config.interface';\n\nimport { getIndex } from '../../utils/image.util';\nimport { ConfigService } from '../../services/config.service';\nimport { NEXT } from '../../utils/user-input.util';\nimport { AccessibleComponent } from '../accessible.component';\nimport { LibConfig } from '../../model/lib-config.interface';\n\n/**\n * Component with the gallery of thumbs.\n * In receives an array of Images, a boolean to show/hide\n * the gallery (feature used by imagePointer) and a config\n * object to customize the behaviour of this component.\n * Also, it emits click events as outputs.\n */\n@Component({\n selector: 'ks-plain-gallery',\n styleUrls: ['plain-gallery.scss'],\n templateUrl: 'plain-gallery.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PlainGalleryComponent extends AccessibleComponent implements OnInit, OnChanges {\n /**\n * Unique id (>=0) of the current instance of this library. This is required when you are using\n * the service to call modal gallery.\n */\n @Input()\n id: number | undefined;\n\n /**\n * Array of `Image` that represent the model of this library with all images, thumbs and so on.\n */\n @Input()\n images: Image[] = [];\n /**\n * Boolean to show/hide plain gallery. If true the plain gallery will be visible, false otherwise.\n */\n @Input()\n showGallery: boolean | undefined;\n /**\n * Array of `Image` that represent the model of this library with all images, thumbs and so on.\n */\n @Input()\n config: LibConfig | undefined;\n\n /**\n * Output to emit an event when an image is changed.\n */\n @Output()\n showImage: EventEmitter<number> = new EventEmitter<number>();\n\n /**\n * Object of type `PlainGalleryConfig` to configure the plain gallery.\n */\n plainGalleryConfig: PlainGalleryConfig | undefined;\n\n /**\n * Object of type `AccessibilityConfig` to init custom accessibility features.\n * For instance, it contains titles, alt texts, aria-labels and so on.\n */\n accessibilityConfig: AccessibilityConfig | undefined;\n\n /**\n * Bi-dimensional array of `Image` object to store images to display as plain gallery.\n * [] by default.\n */\n imageGrid: Image[][] = [];\n /**\n * Size object used in the template to resize images.\n */\n size: Size | undefined;\n /**\n * Boolean passed as input to `ks-wrap` directive to configure flex-wrap css property.\n * However it's not enough, because you need to limit the width using `widthStyle` public variable.\n * For more info check https://developer.mozilla.org/it/docs/Web/CSS/flex-wrap\n */\n wrapStyle = false;\n /**\n * String passed as input to `ks-wrap` directive to set width to be able to force overflow.\n * In this way, `wrapStyle` (flex-wrap css property) will be used as requested.\n */\n widthStyle = '';\n /**\n * String passed as input to `ks-direction` directive to set the flex-direction css property.\n * For more info check https://developer.mozilla.org/it/docs/Web/CSS/flex-direction\n */\n directionStyle: string | undefined;\n /**\n * String passed as input to `ks-direction` directive to set the justify-content css property.\n * For more info check https://developer.mozilla.org/it/docs/Web/CSS/justify-content\n */\n justifyStyle: string | undefined;\n\n constructor(private configService: ConfigService) {\n super();\n }\n\n /**\n * Method ´ngOnInit´ to init both `configPlainGallery` calling `initPlainGalleryConfig()`\n * and `imageGrid invoking `initImageGrid()`.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called only one time!!!\n */\n ngOnInit(): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n this.configService.setConfig(this.id, this.config);\n\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n this.accessibilityConfig = libConfig.accessibilityConfig;\n this.plainGalleryConfig = libConfig.plainGalleryConfig;\n this.initImageGrid();\n }\n\n /**\n * Method ´ngOnChanges´ to update both `imageGrid` and`plainGalleryConfig`.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called when any data-bound property of a directive changes!!!\n */\n ngOnChanges(changes: SimpleChanges): void {\n if (this.id === null || this.id === undefined) {\n throw new Error('Internal library error - id must be defined');\n }\n const libConfig: LibConfig | undefined = this.configService.getConfig(this.id);\n if (!libConfig) {\n throw new Error('Internal library error - libConfig must be defined');\n }\n\n const imagesChange: SimpleChange = changes.images;\n const configChange: SimpleChange = changes.plainGalleryConfig;\n\n // I'm using !change.firstChange because the first time will be called both onInit and onChange and I don't\n // want to execute initialization two times.\n if (\n configChange &&\n !configChange.firstChange &&\n (configChange.previousValue !== configChange.currentValue || (!configChange.previousValue && !configChange.currentValue))\n ) {\n this.plainGalleryConfig = libConfig.plainGalleryConfig;\n // this.configPlainGallery = this.initPlainGalleryConfig();\n }\n if (imagesChange && !imagesChange.firstChange && imagesChange.previousValue !== imagesChange.currentValue) {\n this.initImageGrid();\n }\n }\n\n /**\n * Method called when you click on an image of the plain (or inline) gallery.\n * This will emit the show event with the image as payload.\n * @param Image img is the Image to show\n */\n showModalGalleryByImage(img: Image): void {\n const index: number = this.images.findIndex((val: Image) => val && img && val.id === img.id);\n this.showModalGallery(index);\n }\n\n /**\n * Method called when you navigate between images.\n * This will emit the show event with the image as payload.\n * @param KeyboardEvent event that triggered the navigation\n * @param Image img is the Image to show\n */\n onNavigationEvent(event: KeyboardEvent, img: Image): void {\n const result: number = super.handleImageEvent(event);\n if (result === NEXT) {\n this.showModalGalleryByImage(img);\n }\n }\n\n /**\n * Method to get `alt attribute`.\n * `alt` specifies an alternate text for an image, if the image cannot be displayed.\n * @param Image image to get its alt description.\n * @returns string alt description of the image\n */\n getAltPlainDescriptionByImage(image: Image): string {\n if (!image) {\n return '';\n }\n return image.plain && image.plain.description ? image.plain.description : `Image ${getIndex(image, this.images) + 1}`;\n }\n\n /**\n * Method to get the title for an image.\n * @param Image image to get its title\n * @returns string the title of the input image\n */\n getTitleDisplay(image: Image): string {\n let description = '';\n\n if (image.plain && image.plain.description) {\n description = image.plain.description;\n } else if (image.modal && image.modal.description) {\n description = image.modal.description;\n }\n\n const currentIndex: number = getIndex(image, this.images);\n const prevDescription: string = 'Image ' + (currentIndex + 1) + '/' + this.images.length;\n let currImgDescription: string = description ? description : '';\n\n if (currImgDescription !== '') {\n currImgDescription = ' - ' + currImgDescription;\n }\n return prevDescription + currImgDescription;\n }\n\n /**\n * Method used in the template to track ids in ngFor.\n * @param number index of the array\n * @param Image item of the array\n * @returns number the id of the item\n */\n trackById(index: number, item: Image): number {\n return item.id;\n }\n\n /**\n * Method called when you click on an image of the plain (or inline) gallery.\n * This will emit the show event with the index number as payload.\n * @param number index of the clicked image\n */\n private showModalGallery(index: number): void {\n this.showImage.emit(index);\n }\n\n /**\n * Private method to init both `imageGrid` and other style variables,\n * based on the layout type.\n */\n private initImageGrid(): void {\n if (!this.plainGalleryConfig) {\n throw new Error('Internal library error - plainGalleryConfig must be defined');\n }\n\n // reset the array to prevent issues in case of GridLayout\n this.imageGrid = [];\n\n if (this.plainGalleryConfig.layout instanceof LineLayout) {\n const layout: LineLayout = this.plainGalleryConfig.layout;\n const row: Image[] = this.images.filter((val: Image, i: number) => i < layout.breakConfig.length || layout.breakConfig.length === -1);\n this.imageGrid = [row];\n\n this.size = this.plainGalleryConfig.layout.size;\n\n switch (this.plainGalleryConfig.strategy) {\n case PlainGalleryStrategy.ROW:\n this.directionStyle = 'row';\n break;\n case PlainGalleryStrategy.COLUMN:\n this.directionStyle = 'column';\n this.wrapStyle = layout.breakConfig.wrap;\n break;\n }\n this.justifyStyle = layout.justify;\n }\n\n if (this.plainGalleryConfig.layout instanceof GridLayout) {\n const layout: GridLayout = this.plainGalleryConfig.layout;\n const count: number = Math.ceil(this.images.length / layout.breakConfig.length);\n let start = 0;\n let end: number = layout.breakConfig.length - 1;\n\n for (let j = 0; j < count; j++) {\n const row: Image[] = this.images.filter((val: Image, i: number) => i >= start && i <= end);\n this.imageGrid.push(row);\n start = end + 1;\n end = start + layout.breakConfig.length - 1;\n }\n\n this.size = this.plainGalleryConfig.layout.size;\n\n const pixels: number = +layout.size.width.replace('px', '');\n\n this.widthStyle = pixels * layout.breakConfig.length + pixels / 2 + 'px';\n this.wrapStyle = layout.breakConfig.wrap;\n\n this.directionStyle = 'row';\n }\n\n if (this.plainGalleryConfig.layout instanceof AdvancedLayout) {\n this.imageGrid = [this.images];\n }\n }\n}\n","<div *ngIf=\"showGallery\"\n class=\"plain-container\"\n ksWrap [wrap]=\"wrapStyle\" [width]=\"widthStyle\"\n ksDirection [direction]=\"directionStyle\" [justify]=\"justifyStyle\"\n [attr.aria-label]=\"accessibilityConfig?.plainGalleryContentAriaLabel\"\n [title]=\"accessibilityConfig?.plainGalleryContentTitle\">\n\n <ng-container *ngFor=\"let imgRow of imageGrid; let i = index\">\n <ng-container *ngFor=\"let imgCol of imgRow; let j = index\">\n\n <ng-container *ngIf=\"!plainGalleryConfig?.advanced?.aTags; else aTags\">\n <img *ngIf=\"imgCol?.modal?.img\"\n [src]=\"imgCol.plain?.img! ? imgCol.plain?.img! : imgCol.modal.img\"\n ksFallbackImage [fallbackImg]=\"imgCol.plain?.fallbackImg ? imgCol.plain?.fallbackImg : imgCol.modal.fallbackImg\"\n class=\"image\"\n ksSize [sizeConfig]=\"{width: size?.width!, height: size?.height!}\"\n [attr.aria-label]=\"imgCol.plain?.ariaLabel\"\n [title]=\"(imgCol.plain?.title || imgCol.plain?.title === '') ? imgCol.plain?.title : getTitleDisplay(imgCol)\"\n alt=\"{{imgCol.plain?.alt! ? imgCol.plain?.alt! : getAltPlainDescriptionByImage(imgCol)}}\"\n [tabIndex]=\"0\" role=\"img\"\n (click)=\"showModalGalleryByImage(imgCol)\" (keyup)=\"onNavigationEvent($event, imgCol)\"/>\n </ng-container>\n\n <!-- Add directive to set background with the image url as param to pass thumb or img-->\n <!-- to do something like this <a style=\"background: url('path to image') 50% 50%/cover\">.-->\n <ng-template #aTags>\n <a *ngIf=\"imgCol?.modal?.img\"\n class=\"a-tag-image\"\n ksATagBgImage [image]=\"imgCol\" [style]=\"plainGalleryConfig?.advanced?.additionalBackground\"\n ksSize [sizeConfig]=\"{width: size?.width!, height: size?.height!}\"\n [attr.aria-label]=\"imgCol.plain?.ariaLabel\"\n [title]=\"(imgCol.plain?.title || imgCol.plain?.title === '') ? imgCol.plain?.title : getTitleDisplay(imgCol)\"\n [tabIndex]=\"0\"\n (click)=\"showModalGalleryByImage(imgCol)\" (keyup)=\"onNavigationEvent($event, imgCol)\"></a>\n </ng-template>\n\n </ng-container>\n </ng-container>\n\n</div>\n\n","/*\n The MIT License (MIT)\n\n Copyright (c) 2017 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { CarouselComponent } from './carousel/carousel.component';\nimport { CarouselPreviewsComponent } from './carousel/carousel-previews/carousel-previews.component';\nimport { UpperButtonsComponent } from './upper-buttons/upper-buttons.component';\nimport { DotsComponent } from './dots/dots.component';\nimport { PreviewsComponent } from './previews/previews.component';\nimport { CurrentImageComponent } from './current-image/current-image.component';\nimport { LoadingSpinnerComponent } from './current-image/loading-spinner/loading-spinner.component';\nimport { AccessibleComponent } from './accessible.component';\nimport { PlainGalleryComponent } from './plain-gallery/plain-gallery.component';\nexport { CarouselComponent } from './carousel/carousel.component';\nimport { ModalGalleryComponent } from './modal-gallery/modal-gallery.component';\n\n/**\n * Array of all components.\n */\nexport const COMPONENTS = [\n PlainGalleryComponent,\n CarouselComponent,\n CarouselPreviewsComponent,\n UpperButtonsComponent,\n DotsComponent,\n PreviewsComponent,\n CurrentImageComponent,\n LoadingSpinnerComponent,\n AccessibleComponent,\n\n ModalGalleryComponent\n];\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { Directive, ElementRef, Input, OnChanges, OnInit, Renderer2 } from '@angular/core';\n\n/**\n * Directive to change margins of an element.\n */\n@Directive({\n selector: '[ksMargin]'\n})\nexport class MarginDirective implements OnInit, OnChanges {\n /**\n * String to set the margin of an element.\n */\n @Input()\n marginLeft: string | undefined;\n /**\n * String to set the margin of an element.\n */\n @Input()\n marginRight: string | undefined;\n /**\n * String to set the margin of an element.\n */\n @Input()\n marginTop: string | undefined;\n /**\n * String to set the margin of an element.\n */\n @Input()\n marginBottom: string | undefined;\n\n constructor(private renderer: Renderer2, private el: ElementRef) {}\n\n /**\n * Method ´ngOnInit´ to apply the style of this directive.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called only one time!!!\n */\n ngOnInit(): void {\n this.applyStyle();\n }\n\n /**\n * Method ´ngOnChanges´ to apply the style of this directive.\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\n * In particular, it's called when any data-bound property of a directive changes!!!\n */\n ngOnChanges(): void {\n this.applyStyle();\n }\n\n /**\n * Private method to change both width and height of an element.\n */\n private applyStyle(): void {\n if (this.marginLeft) {\n this.renderer.setStyle(this.el.nativeElement, 'margin-left', this.marginLeft);\n }\n if (this.marginRight) {\n this.renderer.setStyle(this.el.nativeElement, 'margin-right', this.marginRight);\n }\n if (this.marginTop) {\n this.renderer.setStyle(this.el.nativeElement, 'margin-top', this.marginTop);\n }\n if (this.marginBottom) {\n this.renderer.setStyle(this.el.nativeElement, 'margin-bottom', this.marginBottom);\n }\n }\n}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { ClickOutsideDirective } from './click-outside.directive';\nimport { SizeDirective } from './size.directive';\nimport { KeyboardNavigationDirective } from './keyboard-navigation.directive';\nimport { WrapDirective } from './wrap.directive';\nimport { DirectionDirective } from './direction.directive';\nimport { ATagBgImageDirective } from './a-tag-bg-image.directive';\nimport { DescriptionDirective } from './description.directive';\nimport { MarginDirective } from './margin.directive';\nimport { MaxSizeDirective } from './max-size.directive';\nimport { FallbackImageDirective } from './fallback-image.directive';\n\n/**\n * Array of all directives.\n */\nexport const DIRECTIVES = [\n ClickOutsideDirective,\n SizeDirective,\n KeyboardNavigationDirective,\n WrapDirective,\n DirectionDirective,\n ATagBgImageDirective,\n DescriptionDirective,\n MarginDirective,\n MaxSizeDirective,\n FallbackImageDirective\n];\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\nimport { NgModule, Injectable } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HAMMER_GESTURE_CONFIG, HammerGestureConfig } from '@angular/platform-browser';\n\nimport { OverlayModule } from '@angular/cdk/overlay';\n\nimport { COMPONENTS, CarouselComponent } from './components/components';\nimport { PlainGalleryComponent } from './components/plain-gallery/plain-gallery.component';\nimport { DIRECTIVES } from './directives/directives';\n\n// to prevent bad scrolling behaviour on mobile phone with carousels.\n// From @mohaxspb (https://github.com/Ks89/angular-modal-gallery/pull/187)\n@Injectable()\nexport class KsHammerGestureConfig extends HammerGestureConfig {\n // tslint:disable-next-line:typedef\n buildHammer(element: HTMLElement) {\n return new Hammer(element, {\n touchAction: 'pan-y'\n });\n }\n}\n\n/**\n * Module to import it in the root module of your application.\n */\n@NgModule({\n imports: [CommonModule, OverlayModule],\n declarations: [COMPONENTS, DIRECTIVES],\n exports: [PlainGalleryComponent, CarouselComponent],\n providers: [\n {\n provide: HAMMER_GESTURE_CONFIG,\n useClass: KsHammerGestureConfig\n }\n ]\n})\nexport class GalleryModule {}\n","/*\n The MIT License (MIT)\n\n Copyright (C) 2017-2021 Stefano Cappa (Ks89)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\n/**\n * Index file to export all interfaces, enums, classes and so on.\n * This file represents the public apis.\n */\n\nexport { GalleryModule } from './lib/modal-gallery.module';\n\nexport { Action } from './lib/model/action.enum';\nexport { Image, PlainImage, ModalImage, ImageEvent, ImageModalEvent } from './lib/model/image.class';\nexport { Description, DescriptionStrategy } from './lib/model/description.interface';\nexport { KeyboardConfig } from './lib/model/keyboard-config.interface';\nexport { DotsConfig } from './lib/model/dots-config.interface';\nexport { PreviewConfig } from './lib/model/preview-config.interface';\nexport { AccessibilityConfig } from './lib/model/accessibility.interface';\n\nexport { BreakpointsConfig, CarouselPreviewConfig } from './lib/model/carousel-preview-config.interface';\nexport { CarouselConfig } from './lib/model/carousel-config.interface';\nexport { PlayConfig } from './lib/model/play-config.interface';\nexport { CarouselImageConfig } from './lib/model/carousel-image-config.interface';\n\nexport { Size } from './lib/model/size.interface';\n\nexport { ButtonsConfig, ButtonsStrategy, ButtonType, ButtonEvent } from './lib/model/buttons-config.interface';\n\nexport { LibConfig } from './lib/model/lib-config.interface';\n\nexport { ModalGalleryConfig } from './lib/model/modal-gallery-config.interface';\n\nexport { CurrentImageConfig } from './lib/model/current-image-config.interface';\n\nexport { LoadingConfig, LoadingType } from './lib/model/loading-config.interface';\n\nexport { InteractionEvent } from './lib/model/interaction-event.interface';\n\nexport { KS_DEFAULT_ACCESSIBILITY_CONFIG } from './lib/components/accessibility-default';\nexport {\n KS_DEFAULT_BTN_FULL_SCREEN,\n KS_DEFAULT_BTN_CLOSE,\n KS_DEFAULT_BTN_DELETE,\n KS_DEFAULT_BTN_DOWNLOAD,\n KS_DEFAULT_BTN_EXTURL,\n KS_DEFAULT_SIZE\n} from './lib/components/upper-buttons/upper-buttons-default';\n\nexport {\n PlainGalleryConfig,\n PlainGalleryLayout,\n LineLayout,\n GridLayout,\n AdvancedLayout,\n PlainGalleryStrategy,\n BreakConfig\n} from './lib/model/plain-gallery-config.interface';\n\nexport { ModalGalleryComponent } from './lib/components/modal-gallery/modal-gallery.component';\nexport { PlainGalleryComponent } from './lib/components/plain-gallery/plain-gallery.component';\nexport { CarouselComponent } from './lib/components/carousel/carousel.component';\n\nexport { ModalGalleryService } from './lib/components/modal-gallery/modal-gallery.service';\nexport { ModalGalleryRef } from './lib/components/modal-gallery/modal-gallery-ref';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Component","ChangeDetectionStrategy","Action","DescriptionStrategy","ButtonsStrategy","ButtonType","PlainGalleryStrategy","LoadingType","Injectable","InjectionToken","Input","EventEmitter","Directive","Output","HostListener","Subject","isPlatformBrowser","map","filter","switchMap","timer","takeUntil","PLATFORM_ID","Inject","SecurityContext","isPlatformServer","ViewChild","Injector","ComponentPortal","OverlayConfig","Breakpoints","HostBinding","HammerGestureConfig","CommonModule","OverlayModule","HAMMER_GESTURE_CONFIG","NgModule"],"mappings":"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"}