@regcheq/ui-vue-2 1.11.0 → 1.12.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.
package/dist/index.esm.js CHANGED
@@ -39174,6 +39174,52 @@ const __vue_component__$1 = /*#__PURE__*/normalizeComponent({
39174
39174
  //
39175
39175
  //
39176
39176
 
39177
+
39178
+ // Registro de bloqueos compartido entre todas las instancias: guarda cuántos
39179
+ // drawers abiertos dependen de cada contenedor y cuál era su overflow original.
39180
+ // Sin el contador, cerrar un drawer devolvería el scroll aunque siguiera otro
39181
+ // abierto sobre el mismo contenedor.
39182
+ const scrollLocks = new Map();
39183
+
39184
+ // El scroll de fondo no siempre vive en el body: muchas apps scrollean en un
39185
+ // contenedor interno. Se bloquean todos los ancestros scrolleables más el body.
39186
+ function scrollableAncestors(node) {
39187
+ const targets = [];
39188
+ let el = node;
39189
+ while (el && el !== document.body && el.nodeType === 1) {
39190
+ const {
39191
+ overflowY
39192
+ } = window.getComputedStyle(el);
39193
+ if (overflowY === 'auto' || overflowY === 'scroll') targets.push(el);
39194
+ el = el.parentElement;
39195
+ }
39196
+ targets.push(document.body);
39197
+ return targets;
39198
+ }
39199
+ function lockScroll(targets) {
39200
+ targets.forEach(el => {
39201
+ const lock = scrollLocks.get(el);
39202
+ if (lock) {
39203
+ lock.count += 1;
39204
+ return;
39205
+ }
39206
+ scrollLocks.set(el, {
39207
+ count: 1,
39208
+ previousOverflow: el.style.overflow
39209
+ });
39210
+ el.style.overflow = 'hidden';
39211
+ });
39212
+ }
39213
+ function unlockScroll(targets) {
39214
+ targets.forEach(el => {
39215
+ const lock = scrollLocks.get(el);
39216
+ if (!lock) return;
39217
+ lock.count -= 1;
39218
+ if (lock.count > 0) return;
39219
+ el.style.overflow = lock.previousOverflow;
39220
+ scrollLocks.delete(el);
39221
+ });
39222
+ }
39177
39223
  var script = {
39178
39224
  name: 'Drawer',
39179
39225
  props: {
@@ -39202,21 +39248,33 @@ var script = {
39202
39248
  }
39203
39249
  },
39204
39250
  watch: {
39205
- open: {
39206
- immediate: true,
39207
- handler(isOpen) {
39208
- document.body.style.overflow = isOpen ? 'hidden' : '';
39209
- }
39251
+ open(isOpen) {
39252
+ this.setScrollLock(isOpen);
39210
39253
  }
39211
39254
  },
39255
+ created() {
39256
+ this.locked = false;
39257
+ this.scrollTargets = [];
39258
+ },
39212
39259
  mounted() {
39260
+ // Se resuelven acá y no en cada apertura: en mounted el drawer todavía está
39261
+ // en su lugar del DOM y los ancestros son los que corresponden.
39262
+ this.scrollTargets = scrollableAncestors(this.$el.parentElement);
39213
39263
  document.addEventListener('keydown', this.handleKeydown);
39264
+ if (this.open) this.setScrollLock(true);
39214
39265
  },
39215
39266
  beforeDestroy() {
39216
39267
  document.removeEventListener('keydown', this.handleKeydown);
39217
- document.body.style.overflow = '';
39268
+ this.setScrollLock(false);
39218
39269
  },
39219
39270
  methods: {
39271
+ // Idempotente: solo actúa cuando cambia el estado, para no descuadrar el
39272
+ // contador del registro compartido.
39273
+ setScrollLock(shouldLock) {
39274
+ if (shouldLock === this.locked) return;
39275
+ this.locked = shouldLock;
39276
+ if (shouldLock) lockScroll(this.scrollTargets);else unlockScroll(this.scrollTargets);
39277
+ },
39220
39278
  handleKeydown(e) {
39221
39279
  if (e.key === 'Escape' && this.open) {
39222
39280
  this.$emit('close');
package/dist/index.js CHANGED
@@ -39176,6 +39176,52 @@ const __vue_component__$1 = /*#__PURE__*/normalizeComponent({
39176
39176
  //
39177
39177
  //
39178
39178
 
39179
+
39180
+ // Registro de bloqueos compartido entre todas las instancias: guarda cuántos
39181
+ // drawers abiertos dependen de cada contenedor y cuál era su overflow original.
39182
+ // Sin el contador, cerrar un drawer devolvería el scroll aunque siguiera otro
39183
+ // abierto sobre el mismo contenedor.
39184
+ const scrollLocks = new Map();
39185
+
39186
+ // El scroll de fondo no siempre vive en el body: muchas apps scrollean en un
39187
+ // contenedor interno. Se bloquean todos los ancestros scrolleables más el body.
39188
+ function scrollableAncestors(node) {
39189
+ const targets = [];
39190
+ let el = node;
39191
+ while (el && el !== document.body && el.nodeType === 1) {
39192
+ const {
39193
+ overflowY
39194
+ } = window.getComputedStyle(el);
39195
+ if (overflowY === 'auto' || overflowY === 'scroll') targets.push(el);
39196
+ el = el.parentElement;
39197
+ }
39198
+ targets.push(document.body);
39199
+ return targets;
39200
+ }
39201
+ function lockScroll(targets) {
39202
+ targets.forEach(el => {
39203
+ const lock = scrollLocks.get(el);
39204
+ if (lock) {
39205
+ lock.count += 1;
39206
+ return;
39207
+ }
39208
+ scrollLocks.set(el, {
39209
+ count: 1,
39210
+ previousOverflow: el.style.overflow
39211
+ });
39212
+ el.style.overflow = 'hidden';
39213
+ });
39214
+ }
39215
+ function unlockScroll(targets) {
39216
+ targets.forEach(el => {
39217
+ const lock = scrollLocks.get(el);
39218
+ if (!lock) return;
39219
+ lock.count -= 1;
39220
+ if (lock.count > 0) return;
39221
+ el.style.overflow = lock.previousOverflow;
39222
+ scrollLocks.delete(el);
39223
+ });
39224
+ }
39179
39225
  var script = {
39180
39226
  name: 'Drawer',
39181
39227
  props: {
@@ -39204,21 +39250,33 @@ var script = {
39204
39250
  }
39205
39251
  },
39206
39252
  watch: {
39207
- open: {
39208
- immediate: true,
39209
- handler(isOpen) {
39210
- document.body.style.overflow = isOpen ? 'hidden' : '';
39211
- }
39253
+ open(isOpen) {
39254
+ this.setScrollLock(isOpen);
39212
39255
  }
39213
39256
  },
39257
+ created() {
39258
+ this.locked = false;
39259
+ this.scrollTargets = [];
39260
+ },
39214
39261
  mounted() {
39262
+ // Se resuelven acá y no en cada apertura: en mounted el drawer todavía está
39263
+ // en su lugar del DOM y los ancestros son los que corresponden.
39264
+ this.scrollTargets = scrollableAncestors(this.$el.parentElement);
39215
39265
  document.addEventListener('keydown', this.handleKeydown);
39266
+ if (this.open) this.setScrollLock(true);
39216
39267
  },
39217
39268
  beforeDestroy() {
39218
39269
  document.removeEventListener('keydown', this.handleKeydown);
39219
- document.body.style.overflow = '';
39270
+ this.setScrollLock(false);
39220
39271
  },
39221
39272
  methods: {
39273
+ // Idempotente: solo actúa cuando cambia el estado, para no descuadrar el
39274
+ // contador del registro compartido.
39275
+ setScrollLock(shouldLock) {
39276
+ if (shouldLock === this.locked) return;
39277
+ this.locked = shouldLock;
39278
+ if (shouldLock) lockScroll(this.scrollTargets);else unlockScroll(this.scrollTargets);
39279
+ },
39222
39280
  handleKeydown(e) {
39223
39281
  if (e.key === 'Escape' && this.open) {
39224
39282
  this.$emit('close');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@regcheq/ui-vue-2",
3
- "version": "1.11.0",
3
+ "version": "1.12.0",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.esm.js",
6
6
  "files": [