@tomasvn/glightbox 0.0.0-stage → 3.3.4

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 (46) hide show
  1. package/.editorconfig +16 -0
  2. package/.eslintignore +3 -0
  3. package/.eslintrc.json +94 -0
  4. package/.github/FUNDING.yml +3 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.md +41 -0
  6. package/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  7. package/.github/stale.yml +21 -0
  8. package/.github/workflows/greetings.yml +13 -0
  9. package/.husky/pre-commit +3 -0
  10. package/.lando.yml +10 -0
  11. package/.prettierignore +3 -0
  12. package/.prettierrc.json +30 -0
  13. package/CHANGELOG.md +259 -0
  14. package/CONTRIBUTING.md +29 -0
  15. package/LICENSE.md +21 -0
  16. package/README.md +714 -2
  17. package/bower.json +29 -0
  18. package/development/build.js +44 -0
  19. package/development/jscompiler.js +90 -0
  20. package/development/notifications.js +15 -0
  21. package/development/package.js +116 -0
  22. package/development/postcss.js +63 -0
  23. package/development/watcher.js +105 -0
  24. package/dist/css/glightbox.css +939 -0
  25. package/dist/css/glightbox.min.css +1 -0
  26. package/dist/js/glightbox.js +3109 -0
  27. package/dist/js/glightbox.min.js +1 -0
  28. package/index.d.ts +586 -0
  29. package/package.json +60 -4
  30. package/src/js/.jshintrc +6 -0
  31. package/src/js/core/drag.js +203 -0
  32. package/src/js/core/keyboard-navigation.js +101 -0
  33. package/src/js/core/slide-parser.js +236 -0
  34. package/src/js/core/slide.js +251 -0
  35. package/src/js/core/touch-events.js +378 -0
  36. package/src/js/core/touch-navigation.js +291 -0
  37. package/src/js/core/zoom.js +156 -0
  38. package/src/js/glightbox.js +1351 -0
  39. package/src/js/slides/iframe.js +24 -0
  40. package/src/js/slides/image.js +56 -0
  41. package/src/js/slides/inline.js +71 -0
  42. package/src/js/slides/video.js +108 -0
  43. package/src/js/utils/helpers.js +541 -0
  44. package/src/postcss/glightbox.css +725 -0
  45. package/tests/slide.test.mjs +130 -0
  46. package/tests/touch-navigation.test.mjs +13 -0
@@ -0,0 +1,130 @@
1
+ import assert from 'node:assert/strict';
2
+ import { describe, it } from 'node:test';
3
+ import Slide from '../src/js/core/slide.js';
4
+ import { closest } from '../src/js/utils/helpers.js';
5
+
6
+ class FakeElement {
7
+ constructor(nodeName, classes = [], parentElement = null) {
8
+ this.nodeType = 1;
9
+ this.nodeName = nodeName;
10
+ this.parentElement = parentElement;
11
+ this.listeners = {};
12
+ this.children = [];
13
+ this.innerHTML = '';
14
+ this.classList = {
15
+ contains: (name) => classes.includes(name),
16
+ add: (name) => {
17
+ if (!classes.includes(name)) {
18
+ classes.push(name);
19
+ }
20
+ },
21
+ remove: (name) => {
22
+ const index = classes.indexOf(name);
23
+ if (index >= 0) {
24
+ classes.splice(index, 1);
25
+ }
26
+ }
27
+ };
28
+ if (parentElement) {
29
+ parentElement.children.push(this);
30
+ }
31
+ }
32
+
33
+ addEventListener(name, callback) {
34
+ this.listeners[name] = this.listeners[name] || [];
35
+ this.listeners[name].push(callback);
36
+ }
37
+
38
+ removeEventListener(name, callback) {
39
+ this.listeners[name] = (this.listeners[name] || []).filter((listener) => listener !== callback);
40
+ }
41
+
42
+ matches(selector) {
43
+ return selector[0] === '.' && this.classList.contains(selector.slice(1));
44
+ }
45
+
46
+ querySelector(selector) {
47
+ return this.children.find((child) => child.matches(selector)) || null;
48
+ }
49
+
50
+ set innerHTML(value) {
51
+ this._innerHTML = value;
52
+ for (const child of this.children) {
53
+ child.parentElement = null;
54
+ }
55
+ this.children = [];
56
+
57
+ const linkMatch = value.match(/<a [^>]*class="([^"]+)"[^>]*>(.*?)<\/a>/);
58
+ if (linkMatch) {
59
+ const link = new FakeElement('A', linkMatch[1].split(' '), this);
60
+ link.innerHTML = linkMatch[2];
61
+ }
62
+ }
63
+
64
+ get innerHTML() {
65
+ return this._innerHTML;
66
+ }
67
+
68
+ click() {
69
+ const path = [];
70
+ for (let element = this; element; element = element.parentElement) {
71
+ path.push(element);
72
+ }
73
+
74
+ let propagationStopped = false;
75
+ const event = {
76
+ target: this,
77
+ preventDefault() {},
78
+ stopPropagation() {
79
+ propagationStopped = true;
80
+ }
81
+ };
82
+
83
+ for (const element of path) {
84
+ for (const listener of element.listeners.click || []) {
85
+ listener.call(element, event);
86
+ }
87
+ if (propagationStopped) {
88
+ break;
89
+ }
90
+ }
91
+ }
92
+ }
93
+
94
+ describe('description expansion', () => {
95
+ it('does not reach the outside-click handler after detaching the more link', () => {
96
+ const body = new FakeElement('BODY');
97
+ globalThis.document = { body };
98
+ globalThis.window = {};
99
+
100
+ const modal = new FakeElement('DIV', [], body);
101
+ const innerContainer = new FakeElement('DIV', ['ginner-container'], modal);
102
+ const description = new FakeElement('DIV', ['gslide-description'], innerContainer);
103
+ const desc = new FakeElement('DIV', ['gslide-desc'], description);
104
+ const moreLink = new FakeElement('A', ['desc-more'], desc);
105
+ desc.querySelector = (selector) => desc.children.find((child) => child.matches(selector)) || null;
106
+
107
+ let closeCount = 0;
108
+ modal.addEventListener('click', (event) => {
109
+ if (!closest(event.target, '.ginner-container')) {
110
+ closeCount++;
111
+ }
112
+ });
113
+
114
+ const slide = Object.create(Slide.prototype);
115
+ slide.instance = { settings: { lessText: 'See less' } };
116
+ slide.descriptionEvents(desc, {
117
+ description: 'Full description',
118
+ smallDescription: 'Short description'
119
+ });
120
+ moreLink.click();
121
+
122
+ assert.match(desc.innerHTML, /^Full description <a href="#" class="desc-less">See less<\/a>$/);
123
+ assert.equal(closeCount, 0);
124
+
125
+ desc.querySelector('.desc-less').click();
126
+
127
+ assert.equal(desc.innerHTML, 'Short description');
128
+ assert.equal(closeCount, 0);
129
+ });
130
+ });
@@ -0,0 +1,13 @@
1
+ import assert from 'node:assert/strict';
2
+ import { describe, it } from 'node:test';
3
+ import { resetSlideMove } from '../src/js/core/touch-navigation.js';
4
+
5
+ describe('resetSlideMove', () => {
6
+ it('returns when the slide is null', () => {
7
+ assert.equal(resetSlideMove(null), undefined);
8
+ });
9
+
10
+ it('returns when the slide is undefined', () => {
11
+ assert.equal(resetSlideMove(undefined), undefined);
12
+ });
13
+ });