@unlk/keymaster 1.2.5 → 1.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/js/video-modal.js CHANGED
@@ -5,11 +5,12 @@ import { defineJQueryPlugin } from 'bootstrap/js/src/util/index.js';
5
5
 
6
6
  const NAME = 'videoModal';
7
7
  const DATA_KEY = 'bs.videoModal';
8
- const EVENT_SHOWN = 'shown.bs.modal';
8
+ const EVENT_SHOW = 'show.bs.modal';
9
9
  const EVENT_HIDDEN = 'hidden.bs.modal';
10
10
  const SELECTOR_DIALOG = '.modal-dialog-media';
11
11
  const SELECTOR_RATIO = '.ratio';
12
12
 
13
+ // eslint-disable-next-line no-unused-vars
13
14
  let youTubeAPIReady = false;
14
15
  const youTubeAPIInitPromise = new Promise((resolve) => {
15
16
  if (window.YT?.Player) {
@@ -20,12 +21,14 @@ const youTubeAPIInitPromise = new Promise((resolve) => {
20
21
  youTubeAPIReady = true;
21
22
  resolve();
22
23
  };
24
+
23
25
  const script = document.createElement('script');
24
26
  script.src = 'https://www.youtube.com/iframe_api';
25
27
  document.head.append(script);
26
28
  }
27
29
  });
28
30
 
31
+ // eslint-disable-next-line no-unused-vars
29
32
  let vimeoAPIReady = false;
30
33
  const vimeoAPIInitPromise = new Promise((resolve) => {
31
34
  if (window.Vimeo?.Player) {
@@ -38,6 +41,7 @@ const vimeoAPIInitPromise = new Promise((resolve) => {
38
41
  vimeoAPIReady = true;
39
42
  resolve();
40
43
  });
44
+
41
45
  document.head.append(script);
42
46
  }
43
47
  });
@@ -58,7 +62,7 @@ class VideoModal extends BaseComponent {
58
62
  this._youtubePlayer = null;
59
63
  this._vimeoPlayer = null;
60
64
 
61
- EventHandler.on(this._element, EVENT_SHOWN, () => this._onShown());
65
+ EventHandler.on(this._element, EVENT_SHOW, () => this._onShow());
62
66
  EventHandler.on(this._element, EVENT_HIDDEN, () => this._onHide());
63
67
  }
64
68
 
@@ -67,52 +71,27 @@ class VideoModal extends BaseComponent {
67
71
  super.dispose();
68
72
  }
69
73
 
70
- async _onShown() {
71
- // Reset container each time
72
- this._container.innerHTML = '';
74
+ async _onShow() {
75
+ const { id } = this._element;
76
+ const playerID = `video-${id}-youtube-player`;
73
77
 
74
78
  if (this._vimeoUrl) {
75
79
  await vimeoAPIInitPromise;
76
80
  const vimeoId = this._getVimeoId(this._vimeoUrl);
77
- if (!vimeoId) return;
78
81
  this._vimeoPlayer = new window.Vimeo.Player(this._container, {
79
82
  id: vimeoId,
80
- autoplay: true,
81
- muted: true,
82
- playsinline: true,
83
- dnt: true
83
+ autoplay: true
84
84
  });
85
- this._vimeoPlayer.play?.().catch(() => {});
85
+ return;
86
86
  }
87
87
 
88
88
  if (this._youtubeSrc) {
89
89
  await youTubeAPIInitPromise;
90
90
  const youtubeId = this._getYouTubeId(this._youtubeSrc);
91
- if (!youtubeId) {
92
- console.warn('[VideoModal] No YouTube ID parsed from', this._youtubeSrc);
93
- return;
94
- }
95
-
96
- const playerDiv = document.createElement('div');
97
- playerDiv.className = 'w-100 h-100';
98
- this._container.appendChild(playerDiv);
99
-
91
+ const playerDiv = this._container.querySelector(`#${playerID}`);
100
92
  this._youtubePlayer = new window.YT.Player(playerDiv, {
101
93
  videoId: youtubeId,
102
- host: 'https://www.youtube-nocookie.com',
103
- playerVars: {
104
- autoplay: 1,
105
- rel: 0,
106
- playsinline: 1,
107
- origin: window.location.origin
108
- },
109
- events: {
110
- onReady: (e) => {
111
- try { e.target.mute(); } catch {}
112
- try { e.target.playVideo(); } catch {}
113
- },
114
- onError: (e) => console.warn('[VideoModal] YT error', e?.data)
115
- }
94
+ playerVars: { autoplay: 1, rel: 0 }
116
95
  });
117
96
  }
118
97
  }
@@ -122,22 +101,22 @@ class VideoModal extends BaseComponent {
122
101
  this._vimeoPlayer.unload().catch(() => {});
123
102
  this._vimeoPlayer = null;
124
103
  }
104
+
125
105
  if (this._youtubePlayer) {
126
- try { this._youtubePlayer.destroy(); } catch {}
106
+ this._youtubePlayer.destroy();
127
107
  this._youtubePlayer = null;
128
108
  }
129
- this._container.innerHTML = '';
130
109
  }
131
110
 
132
111
  _getYouTubeId(url) {
133
- if (!url) return '';
134
- // robust: supports v=, youtu.be/, embed/, shorts/
135
- const m = String(url).match(/(?:v=|youtu\.be\/|embed\/|shorts\/)([\w-]{11})/);
136
- return m ? m[1] : '';
112
+ const match = url.match(
113
+ /(?:youtube\.com\/(?:watch\?v=|embed\/|v\/)|youtu\.be\/)([\w-]{11})/
114
+ );
115
+ return match ? match[1] : '';
137
116
  }
138
117
 
139
118
  _getVimeoId(url) {
140
- const match = String(url).match(/vimeo\.com\/(\d+)/);
119
+ const match = url.match(/vimeo\.com\/(\d+)/);
141
120
  return match ? match[1] : '';
142
121
  }
143
122
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unlk/keymaster",
3
- "version": "1.2.5",
3
+ "version": "1.2.7",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -12,6 +12,7 @@
12
12
  }
13
13
  }
14
14
 
15
+
15
16
  @each $color, $value in $theme-colors {
16
17
  .btn-link-#{$color} {
17
18
  @if $color == "action" {
@@ -21,9 +22,6 @@
21
22
  );
22
23
  }
23
24
  }
24
- }
25
-
26
- @each $color, $value in $theme-colors {
27
25
  .btn-#{$color} {
28
26
  @if $color == "secondary" {
29
27
  @include button-variant(
@@ -49,4 +47,77 @@
49
47
  );
50
48
  }
51
49
  }
50
+ .btn-icon-#{$color} {
51
+ @if $color == "secondary" {
52
+ @include button-icon-variant(
53
+ $value,
54
+ $value,
55
+ $hover-background: tint-color($value, $btn-hover-bg-shade-amount),
56
+ $hover-border: tint-color($value, $btn-hover-border-shade-amount),
57
+ $active-background: tint-color($value, $btn-active-bg-shade-amount),
58
+ $active-border: tint-color($value, $btn-active-border-shade-amount),
59
+ $disabled-color: $gray-950
60
+ );
61
+ } @else {
62
+ @include button-icon-variant(
63
+ $value,
64
+ $value,
65
+ $hover-background: shade-color($value, $btn-hover-bg-shade-amount),
66
+ $hover-border: shade-color($value, $btn-hover-border-shade-amount),
67
+ $active-background: shade-color($value, $btn-active-bg-shade-amount),
68
+ $active-border: shade-color($value, $btn-active-border-shade-amount),
69
+ $disabled-color: $white
70
+ );
71
+ }
72
+ }
73
+ .btn-icon-outline-#{$color} {
74
+ @include button-icon-outline-variant(
75
+ $value,
76
+ $value,
77
+ $hover-background: $value,
78
+ $hover-border: $value,
79
+ $active-background: shade-color($value, $btn-active-bg-shade-amount),
80
+ $active-border: shade-color($value, $btn-active-border-shade-amount),
81
+ $disabled-color: $white
82
+ );
83
+ }
84
+ }
85
+
86
+ [class*="btn-icon-"],
87
+ [class*="btn-icon-outline-"] {
88
+
89
+ &.btn-sm {
90
+ width: rfs-value(32px);
91
+ height: rfs-value(32px);
92
+ --#{$prefix}btn-padding-x: 0;
93
+ --#{$prefix}btn-padding-y: 0;
94
+ }
95
+
96
+ &.btn-lg {
97
+ width: rfs-value(48px);
98
+ height: rfs-value(48px);
99
+ }
100
+ }
101
+ .btn-sm {
102
+ > i + *,
103
+ > .icon + * {
104
+ margin-left: $spacer * .375;
105
+ }
106
+
107
+ > * + i,
108
+ > * + .icon {
109
+ margin-left: $spacer * .375;
110
+ }
111
+ }
112
+
113
+ .btn-lg {
114
+ > i + *,
115
+ > .icon + * {
116
+ margin-left: $spacer * .625;
117
+ }
118
+
119
+ > * + i,
120
+ > * + .icon {
121
+ margin-left: $spacer * .625;
122
+ }
52
123
  }
@@ -54,3 +54,69 @@
54
54
  --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix(color-contrast($primary), $primary, 15%))};
55
55
  text-decoration: none;
56
56
  }
57
+
58
+ @mixin button-icon-variant(
59
+ $background,
60
+ $border,
61
+ $color: color-contrast($background),
62
+ $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),
63
+ $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),
64
+ $hover-color: color-contrast($hover-background),
65
+ $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),
66
+ $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),
67
+ $active-color: color-contrast($active-background),
68
+ $disabled-background: rgba($background, 1),
69
+ $disabled-border: rgba($border, 1),
70
+ $disabled-color: color-contrast($disabled-background)
71
+ ) {
72
+ width: rfs-value(40px);
73
+ height: rfs-value(40px);
74
+ line-height: 1;
75
+ text-align: center;
76
+ --#{$prefix}btn-padding-x: #{$spacer * .5};
77
+ --#{$prefix}btn-padding-y: #{$spacer * .5};
78
+ --#{$prefix}btn-color: #{$color};
79
+ --#{$prefix}btn-bg: #{$background};
80
+ --#{$prefix}btn-border-color: #{$border};
81
+ --#{$prefix}btn-border-radius: #{$btn-border-radius};
82
+ --#{$prefix}btn-hover-color: #{$hover-color};
83
+ --#{$prefix}btn-hover-bg: #{$hover-background};
84
+ --#{$prefix}btn-hover-border-color: #{$hover-border};
85
+ --#{$prefix}btn-active-color: #{$active-color};
86
+ --#{$prefix}btn-active-bg: #{$active-background};
87
+ --#{$prefix}btn-active-border-color: #{$active-border};
88
+ --#{$prefix}btn-disabled-color: #{$disabled-color};
89
+ --#{$prefix}btn-disabled-border-color: #{$disabled-border};
90
+ }
91
+
92
+ @mixin button-icon-outline-variant(
93
+ $border,
94
+ $color,
95
+ $hover-background: $color,
96
+ $hover-border: $color,
97
+ $hover-color: color-contrast($hover-background),
98
+ $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),
99
+ $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),
100
+ $active-color: color-contrast($active-background),
101
+ $disabled-background: transparent,
102
+ $disabled-border: rgba($border, 1),
103
+ $disabled-color: color-contrast($disabled-background)
104
+ ) {
105
+ width: rfs-value(40px);
106
+ height: rfs-value(40px);
107
+ line-height: 1;
108
+ --#{$prefix}btn-padding-x: #{$spacer * .5};
109
+ --#{$prefix}btn-padding-y: #{$spacer * .5};
110
+ --#{$prefix}btn-color: #{$color};
111
+ --#{$prefix}btn-bg: transparent;
112
+ --#{$prefix}btn-border-color: #{$border};
113
+ --#{$prefix}btn-border-radius: #{$btn-border-radius};
114
+ --#{$prefix}btn-hover-color: #{$hover-color};
115
+ --#{$prefix}btn-hover-bg: #{$hover-background};
116
+ --#{$prefix}btn-hover-border-color: #{$hover-border};
117
+ --#{$prefix}btn-active-color: #{$active-color};
118
+ --#{$prefix}btn-active-bg: #{$active-background};
119
+ --#{$prefix}btn-active-border-color: #{$active-border};
120
+ --#{$prefix}btn-disabled-color: #{$disabled-color};
121
+ --#{$prefix}btn-disabled-border-color: #{$disabled-border};
122
+ }