@thinkpixellab-public/px-vue 3.0.23 → 3.0.25

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.
@@ -3,29 +3,48 @@
3
3
  to scroll to the beginning or end of the container.
4
4
 
5
5
  <px-arrow-scroller :arrow-start-src="require(...)" :arrow-end-src="require(...)">
6
+
7
+ <template #button>
8
+ // this can look like a button but it will ultimately be wrapped by a button
9
+ // element so it should probably be a span
10
+ </template>
6
11
  ...
7
12
  </px-arrow-scroller>
13
+ ar
14
+
8
15
 
9
16
  -->
10
17
  <template>
11
18
  <div :class="bem()">
12
- <px-icon-button
13
- :class="[bem('arrow', { start: true, visible: arrowStartVisible }), arrowClass]"
14
- :src="arrowStartSrc"
15
- size="0.8em"
16
- @click="scrollTo(0)"
17
- />
19
+ <button
20
+ :class="[bem('button', { start: true, visible: arrowStartVisible }), buttonClass]"
21
+ @click="scrollPages(-1)"
22
+ aria-label="Scroll to previous"
23
+ :disabled="!arrowStartVisible"
24
+ >
25
+ <slot name="button" :location="'start'">
26
+ <span :class="bem('arrow-icon')">
27
+ <px-icon :src="arrowStartSrc" size="0.8em" />
28
+ </span>
29
+ </slot>
30
+ </button>
18
31
 
19
32
  <div :class="bem('scroller')" ref="scroller" @scroll="updateScrollArrows">
20
33
  <slot />
21
34
  </div>
22
35
 
23
- <px-icon-button
24
- :class="[bem('arrow', { end: true, visible: arrowEndVisible }), arrowClass]"
25
- :src="arrowEndSrc"
26
- size="0.8em"
27
- @click="scrollTo(100000)"
28
- />
36
+ <button
37
+ :class="[bem('button', { end: true, visible: arrowEndVisible }), buttonClass]"
38
+ @click="scrollPages(1)"
39
+ aria-label="Scroll to next"
40
+ :disabled="!arrowEndVisible"
41
+ >
42
+ <slot name="button" :location="'end'">
43
+ <span :class="bem('arrow-icon')">
44
+ <px-icon :src="arrowEndSrc" size="0.8em" />
45
+ </span>
46
+ </slot>
47
+ </button>
29
48
  </div>
30
49
  </template>
31
50
 
@@ -34,16 +53,16 @@
34
53
  // import Component from '~/components/Component.vue';
35
54
  // import Mixin from '~/components/Mixin.vue';
36
55
  import PxBaseResize from './PxBaseResize.vue';
37
- import PxIconButton from '@thinkpixellab-public/px-vue/components/PxIconButton.vue';
56
+ import PxIcon from '@thinkpixellab-public/px-vue/components/PxIcon.vue';
38
57
 
39
58
  export default {
40
59
  name: 'px-arrow-scroller',
41
- components: { PxIconButton },
42
- mixins: [PxBaseResize, PxIconButton],
60
+ components: { PxIcon },
61
+ mixins: [PxBaseResize, PxIcon],
43
62
  props: {
44
- arrowStartSrc: { type: String, default: null },
45
- arrowEndSrc: { type: String, default: null },
46
- arrowClass: { type: String, default: null },
63
+ arrowStartSrc: { type: String, default: require('../assets/icons/nav-prev.svg') },
64
+ arrowEndSrc: { type: String, default: require('../assets/icons/nav-next.svg') },
65
+ buttonClass: { type: String, default: null },
47
66
  },
48
67
  data() {
49
68
  return {
@@ -74,6 +93,14 @@ export default {
74
93
  this.arrowEndVisible = fromEnd > 2;
75
94
  },
76
95
 
96
+ scrollPages(pageCount) {
97
+ if (this.$refs.scroller) {
98
+ let pageSize = this.$refs.scroller.offsetWidth;
99
+ let scrollX = Math.max(0, this.$refs.scroller.scrollLeft + pageSize * pageCount);
100
+ this.scrollTo(scrollX);
101
+ }
102
+ },
103
+
77
104
  scrollTo(x) {
78
105
  if (this.$refs.scroller) {
79
106
  this.$refs.scroller.scrollTo({
@@ -96,8 +123,9 @@ export default {
96
123
  'arrow-start | scroller | arrow-end | auto'
97
124
  ));
98
125
 
99
- &__arrow {
100
- padding: 0.1em 1em 0.25em;
126
+ &__button {
127
+ position: relative;
128
+ align-self: center;
101
129
 
102
130
  &--start {
103
131
  grid-area: arrow-start;
@@ -115,6 +143,18 @@ export default {
115
143
  opacity: 1;
116
144
  pointer-events: visible;
117
145
  }
146
+
147
+ .px-arrow-scroller__arrow-icon {
148
+ @include button-icon(
149
+ (
150
+ padding: 0.1em 1em 0.25em,
151
+ cursor: pointer,
152
+ display: block,
153
+ alignItems: center,
154
+ min-height: null,
155
+ )
156
+ );
157
+ }
118
158
  }
119
159
 
120
160
  &__scroller {
@@ -305,7 +305,7 @@ export default {
305
305
  rowIndex++;
306
306
  }
307
307
 
308
- if (!this.padOrphans && itemIndex > itemCount) {
308
+ if (rows?.length && !this.padOrphans && itemIndex > itemCount) {
309
309
  // remove empty
310
310
  rows[rows.length - 1] = rows[rows.length - 1].filter(sp => {
311
311
  sp.cards = sp.cards.filter(card => !!card);
@@ -81,7 +81,6 @@ export default {
81
81
 
82
82
  try {
83
83
  this.config = JSON.parse(configStr);
84
- console.log(`this.config: 👉 ${JSON.stringify(this.config, null, 4)}`);
85
84
  } catch {
86
85
  console.error('Could not parse px-styles config string.');
87
86
  }
@@ -664,9 +664,7 @@ export default {
664
664
  },
665
665
  },
666
666
  methods: {
667
- toggleButtonChange(nv) {
668
- console.log(`selectedKeys: 👉 ${JSON.stringify(nv, null, 4)}`);
669
- },
667
+ toggleButtonChange() {},
670
668
  onValidChanged(isValid, id) {
671
669
  this.$set(this.validation, id, isValid);
672
670
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thinkpixellab-public/px-vue",
3
- "version": "3.0.23",
3
+ "version": "3.0.25",
4
4
  "description": "General purpose Vue components and helpers that can be used across projects.",
5
5
  "author": "Pixel Lab",
6
6
  "license": "MIT",
package/utils/utils.js CHANGED
@@ -81,6 +81,25 @@ export default {
81
81
  }
82
82
  },
83
83
 
84
+ /**
85
+ * Breaks an array into "chunks" of n items. Returns an array of arrays.
86
+ * @param {} arr The array
87
+ * @param {} size The number of items in each chunk
88
+ */
89
+ arrayChunk: function (arr, size) {
90
+ if (!arr || arr.length == 0) {
91
+ return [[]];
92
+ }
93
+
94
+ const chunks = [];
95
+
96
+ for (let i = 0; i < arr.length; i += size) {
97
+ chunks.push(arr.slice(i, i + size));
98
+ }
99
+
100
+ return chunks;
101
+ },
102
+
84
103
  /**
85
104
  * Returns an object representing the current query string parameters.
86
105
  */