polaris_view_components 0.8.1 → 0.10.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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/icons/polaris/AnalyticsMinor.svg +1 -0
  3. data/app/assets/icons/polaris/AppsMinor.svg +1 -0
  4. data/app/assets/icons/polaris/BlockMinor.svg +1 -0
  5. data/app/assets/icons/polaris/ButtonMinor.svg +1 -0
  6. data/app/assets/icons/polaris/CaretDownMinor.svg +1 -1
  7. data/app/assets/icons/polaris/CaretUpMinor.svg +1 -1
  8. data/app/assets/icons/polaris/CircleTickMinor.svg +1 -0
  9. data/app/assets/icons/polaris/Columns3Minor.svg +1 -0
  10. data/app/assets/icons/polaris/CustomersMinor.svg +1 -1
  11. data/app/assets/icons/polaris/DiscountsMinor.svg +1 -0
  12. data/app/assets/icons/polaris/DropdownMinor.svg +1 -1
  13. data/app/assets/icons/polaris/FinancesMajor.svg +1 -0
  14. data/app/assets/icons/polaris/FinancesMinor.svg +1 -0
  15. data/app/assets/icons/polaris/HomeMinor.svg +1 -0
  16. data/app/assets/icons/polaris/MarketingMinor.svg +1 -0
  17. data/app/assets/icons/polaris/OnlineStoreMinor.svg +1 -0
  18. data/app/assets/icons/polaris/OrdersMinor.svg +1 -0
  19. data/app/assets/icons/polaris/ProductsMinor.svg +1 -0
  20. data/app/assets/icons/polaris/QuestionMarkInverseMajor.svg +1 -0
  21. data/app/assets/icons/polaris/QuestionMarkInverseMinor.svg +1 -0
  22. data/app/assets/icons/polaris/SelectMinor.svg +1 -1
  23. data/app/assets/icons/polaris/TitleMinor.svg +1 -0
  24. data/app/assets/icons/polaris/WandMinor.svg +1 -0
  25. data/app/assets/javascripts/polaris_view_components/collapsible_controller.js +19 -0
  26. data/app/assets/javascripts/polaris_view_components/dropzone_controller.js +15 -3
  27. data/app/assets/javascripts/polaris_view_components/frame_controller.js +1 -1
  28. data/app/assets/javascripts/polaris_view_components/index.js +2 -0
  29. data/app/assets/javascripts/polaris_view_components/polaris_controller.js +4 -0
  30. data/app/assets/javascripts/polaris_view_components/text_field_controller.js +5 -0
  31. data/app/assets/javascripts/polaris_view_components/toast_controller.js +13 -2
  32. data/app/assets/javascripts/polaris_view_components/{utils.js → utils/index.js} +3 -1
  33. data/app/assets/javascripts/polaris_view_components/utils/use-transition.js +162 -0
  34. data/app/assets/javascripts/polaris_view_components.js +201 -162
  35. data/app/assets/stylesheets/polaris_view_components/custom.css +37 -0
  36. data/app/assets/stylesheets/polaris_view_components.css +68 -33
  37. data/app/components/polaris/action_list/item_component.rb +2 -1
  38. data/app/components/polaris/button_component.html.erb +2 -2
  39. data/app/components/polaris/collapsible_component.rb +37 -0
  40. data/app/components/polaris/dropzone_component.html.erb +9 -6
  41. data/app/components/polaris/filters_component.rb +3 -1
  42. data/app/components/polaris/headless_button.html.erb +2 -2
  43. data/app/components/polaris/headless_button.rb +3 -1
  44. data/app/components/polaris/keyboard_key_component.rb +20 -0
  45. data/app/components/polaris/page_component.html.erb +81 -10
  46. data/app/components/polaris/page_component.rb +85 -28
  47. data/app/components/polaris/resource_item_component.rb +7 -2
  48. data/app/components/polaris/skeleton_display_text_component.rb +32 -0
  49. data/app/components/polaris/skeleton_thumbnail_component.rb +31 -0
  50. data/app/components/polaris/text_field_component.html.erb +1 -1
  51. data/app/components/polaris/text_field_component.rb +1 -1
  52. data/app/components/polaris/visually_hidden_component.rb +0 -3
  53. data/app/helpers/polaris/form_builder.rb +1 -1
  54. data/app/helpers/polaris/view_helper.rb +4 -0
  55. data/lib/polaris/view_components/version.rb +1 -1
  56. metadata +111 -15
@@ -2,6 +2,163 @@ import { Controller } from "@hotwired/stimulus";
2
2
 
3
3
  import { get } from "@rails/request.js";
4
4
 
5
+ const alpineNames = {
6
+ enterFromClass: "enter",
7
+ enterActiveClass: "enterStart",
8
+ enterToClass: "enterEnd",
9
+ leaveFromClass: "leave",
10
+ leaveActiveClass: "leaveStart",
11
+ leaveToClass: "leaveEnd"
12
+ };
13
+
14
+ const defaultOptions = {
15
+ transitioned: false,
16
+ hiddenClass: "hidden",
17
+ preserveOriginalClass: true,
18
+ removeToClasses: true
19
+ };
20
+
21
+ const useTransition = (controller, options = {}) => {
22
+ var _a, _b, _c;
23
+ const targetName = controller.element.dataset.transitionTarget;
24
+ let targetFromAttribute;
25
+ if (targetName) {
26
+ targetFromAttribute = controller[`${targetName}Target`];
27
+ }
28
+ const targetElement = (options === null || options === void 0 ? void 0 : options.element) || targetFromAttribute || controller.element;
29
+ if (!(targetElement instanceof HTMLElement || targetElement instanceof SVGElement)) return;
30
+ const dataset = targetElement.dataset;
31
+ const leaveAfter = parseInt(dataset.leaveAfter || "") || options.leaveAfter || 0;
32
+ const {transitioned: transitioned, hiddenClass: hiddenClass, preserveOriginalClass: preserveOriginalClass, removeToClasses: removeToClasses} = Object.assign(defaultOptions, options);
33
+ const controllerEnter = (_a = controller.enter) === null || _a === void 0 ? void 0 : _a.bind(controller);
34
+ const controllerLeave = (_b = controller.leave) === null || _b === void 0 ? void 0 : _b.bind(controller);
35
+ const controllerToggleTransition = (_c = controller.toggleTransition) === null || _c === void 0 ? void 0 : _c.bind(controller);
36
+ async function enter(event) {
37
+ if (controller.transitioned) return;
38
+ controller.transitioned = true;
39
+ controllerEnter && controllerEnter(event);
40
+ const enterFromClasses = getAttribute("enterFrom", options, dataset);
41
+ const enterActiveClasses = getAttribute("enterActive", options, dataset);
42
+ const enterToClasses = getAttribute("enterTo", options, dataset);
43
+ const leaveToClasses = getAttribute("leaveTo", options, dataset);
44
+ if (!!hiddenClass) {
45
+ targetElement.classList.remove(hiddenClass);
46
+ }
47
+ if (!removeToClasses) {
48
+ removeClasses(targetElement, leaveToClasses);
49
+ }
50
+ await transition(targetElement, enterFromClasses, enterActiveClasses, enterToClasses, hiddenClass, preserveOriginalClass, removeToClasses);
51
+ if (leaveAfter > 0) {
52
+ setTimeout((() => {
53
+ leave(event);
54
+ }), leaveAfter);
55
+ }
56
+ }
57
+ async function leave(event) {
58
+ if (!controller.transitioned) return;
59
+ controller.transitioned = false;
60
+ controllerLeave && controllerLeave(event);
61
+ const leaveFromClasses = getAttribute("leaveFrom", options, dataset);
62
+ const leaveActiveClasses = getAttribute("leaveActive", options, dataset);
63
+ const leaveToClasses = getAttribute("leaveTo", options, dataset);
64
+ const enterToClasses = getAttribute("enterTo", options, dataset);
65
+ if (!removeToClasses) {
66
+ removeClasses(targetElement, enterToClasses);
67
+ }
68
+ await transition(targetElement, leaveFromClasses, leaveActiveClasses, leaveToClasses, hiddenClass, preserveOriginalClass, removeToClasses);
69
+ if (!!hiddenClass) {
70
+ targetElement.classList.add(hiddenClass);
71
+ }
72
+ }
73
+ function toggleTransition(event) {
74
+ controllerToggleTransition && controllerToggleTransition(event);
75
+ if (controller.transitioned) {
76
+ leave();
77
+ } else {
78
+ enter();
79
+ }
80
+ }
81
+ async function transition(element, initialClasses, activeClasses, endClasses, hiddenClass, preserveOriginalClass, removeEndClasses) {
82
+ const stashedClasses = [];
83
+ if (preserveOriginalClass) {
84
+ initialClasses.forEach((cls => element.classList.contains(cls) && cls !== hiddenClass && stashedClasses.push(cls)));
85
+ activeClasses.forEach((cls => element.classList.contains(cls) && cls !== hiddenClass && stashedClasses.push(cls)));
86
+ endClasses.forEach((cls => element.classList.contains(cls) && cls !== hiddenClass && stashedClasses.push(cls)));
87
+ }
88
+ addClasses(element, initialClasses);
89
+ removeClasses(element, stashedClasses);
90
+ addClasses(element, activeClasses);
91
+ await nextAnimationFrame();
92
+ removeClasses(element, initialClasses);
93
+ addClasses(element, endClasses);
94
+ await afterTransition(element);
95
+ removeClasses(element, activeClasses);
96
+ if (removeEndClasses) {
97
+ removeClasses(element, endClasses);
98
+ }
99
+ addClasses(element, stashedClasses);
100
+ }
101
+ function initialState() {
102
+ controller.transitioned = transitioned;
103
+ if (transitioned) {
104
+ if (!!hiddenClass) {
105
+ targetElement.classList.remove(hiddenClass);
106
+ }
107
+ enter();
108
+ } else {
109
+ if (!!hiddenClass) {
110
+ targetElement.classList.add(hiddenClass);
111
+ }
112
+ leave();
113
+ }
114
+ }
115
+ function addClasses(element, classes) {
116
+ if (classes.length > 0) {
117
+ element.classList.add(...classes);
118
+ }
119
+ }
120
+ function removeClasses(element, classes) {
121
+ if (classes.length > 0) {
122
+ element.classList.remove(...classes);
123
+ }
124
+ }
125
+ initialState();
126
+ Object.assign(controller, {
127
+ enter: enter,
128
+ leave: leave,
129
+ toggleTransition: toggleTransition
130
+ });
131
+ return [ enter, leave, toggleTransition ];
132
+ };
133
+
134
+ function getAttribute(name, options, dataset) {
135
+ const datasetName = `transition${name[0].toUpperCase()}${name.substr(1)}`;
136
+ const datasetAlpineName = alpineNames[name];
137
+ const classes = options[name] || dataset[datasetName] || dataset[datasetAlpineName] || " ";
138
+ return isEmpty(classes) ? [] : classes.split(" ");
139
+ }
140
+
141
+ async function afterTransition(element) {
142
+ return new Promise((resolve => {
143
+ const duration = Number(getComputedStyle(element).transitionDuration.split(",")[0].replace("s", "")) * 1e3;
144
+ setTimeout((() => {
145
+ resolve(duration);
146
+ }), duration);
147
+ }));
148
+ }
149
+
150
+ async function nextAnimationFrame() {
151
+ return new Promise((resolve => {
152
+ requestAnimationFrame((() => {
153
+ requestAnimationFrame(resolve);
154
+ }));
155
+ }));
156
+ }
157
+
158
+ function isEmpty(str) {
159
+ return str.length === 0 || !str.trim();
160
+ }
161
+
5
162
  function debounce$1(fn, wait) {
6
163
  let timeoutId;
7
164
  return (...args) => {
@@ -165,6 +322,23 @@ class Button extends Controller {
165
322
  }
166
323
  }
167
324
 
325
+ class Collapsible extends Controller {
326
+ toggle() {
327
+ if (this.isClosed) {
328
+ this.element.style.maxHeight = "none";
329
+ this.element.style.overflow = "visible";
330
+ this.element.classList.remove("Polaris-Collapsible--isFullyClosed");
331
+ } else {
332
+ this.element.style.maxHeight = "0px";
333
+ this.element.style.overflow = "hidden";
334
+ this.element.classList.add("Polaris-Collapsible--isFullyClosed");
335
+ }
336
+ }
337
+ get isClosed() {
338
+ return this.element.classList.contains("Polaris-Collapsible--isFullyClosed");
339
+ }
340
+ }
341
+
168
342
  const dragEvents = [ "dragover", "dragenter", "drop" ];
169
343
 
170
344
  const SIZES = {
@@ -285,6 +459,7 @@ class Dropzone extends Controller {
285
459
  onDirectUploadsEnd=() => {
286
460
  this.enable();
287
461
  this.clearFiles();
462
+ if (this.acceptedFiles.length === 0) return;
288
463
  this.loaderTarget.classList.remove("Polaris--hidden");
289
464
  };
290
465
  onDirectUploadInitialize=event => {
@@ -292,9 +467,15 @@ class Dropzone extends Controller {
292
467
  const {id: id, file: file} = detail;
293
468
  const dropzone = target.closest(".Polaris-DropZone");
294
469
  if (!dropzone) return;
295
- const content = dropzone.querySelector(`[data-file-name="${file.name}"]`);
296
- const progressBar = content.parentElement.querySelector('[data-target="progress-bar"]');
297
- progressBar.id = `direct-upload-${id}`;
470
+ if (this.acceptedFiles.length === 0) return;
471
+ if (this.sizeValue == "small") {
472
+ this.clearFiles();
473
+ this.loaderTarget.classList.remove("Polaris--hidden");
474
+ } else {
475
+ const content = dropzone.querySelector(`[data-file-name="${file.name}"]`);
476
+ const progressBar = content.parentElement.querySelector('[data-target="progress-bar"]');
477
+ progressBar.id = `direct-upload-${id}`;
478
+ }
298
479
  };
299
480
  onDirectUploadStart=event => {
300
481
  const {id: id} = event.detail;
@@ -364,6 +545,7 @@ class Dropzone extends Controller {
364
545
  this.toggleFileUpload(false);
365
546
  this.toggleErrorOverlay(true);
366
547
  const dropRejectedEvent = new CustomEvent("polaris-dropzone:drop-rejected", {
548
+ bubbles: true,
367
549
  detail: {
368
550
  rejectedFiles: this.rejectedFiles
369
551
  }
@@ -376,6 +558,7 @@ class Dropzone extends Controller {
376
558
  }
377
559
  this.toggleErrorOverlay(false);
378
560
  const dropAcceptedEvent = new CustomEvent("polaris-dropzone:drop-accepted", {
561
+ bubbles: true,
379
562
  detail: {
380
563
  acceptedFiles: this.acceptedFiles
381
564
  }
@@ -383,6 +566,7 @@ class Dropzone extends Controller {
383
566
  this.element.dispatchEvent(dropAcceptedEvent);
384
567
  }
385
568
  const dropEvent = new CustomEvent("polaris-dropzone:drop", {
569
+ bubbles: true,
386
570
  detail: {
387
571
  files: this.files,
388
572
  acceptedFiles: this.acceptedFiles,
@@ -547,163 +731,6 @@ function isChangeEvent(event) {
547
731
  return event.type === "change";
548
732
  }
549
733
 
550
- const alpineNames = {
551
- enterFromClass: "enter",
552
- enterActiveClass: "enterStart",
553
- enterToClass: "enterEnd",
554
- leaveFromClass: "leave",
555
- leaveActiveClass: "leaveStart",
556
- leaveToClass: "leaveEnd"
557
- };
558
-
559
- const defaultOptions = {
560
- transitioned: false,
561
- hiddenClass: "hidden",
562
- preserveOriginalClass: true,
563
- removeToClasses: true
564
- };
565
-
566
- const useTransition = (controller, options = {}) => {
567
- var _a, _b, _c;
568
- const targetName = controller.element.dataset.transitionTarget;
569
- let targetFromAttribute;
570
- if (targetName) {
571
- targetFromAttribute = controller[`${targetName}Target`];
572
- }
573
- const targetElement = (options === null || options === void 0 ? void 0 : options.element) || targetFromAttribute || controller.element;
574
- if (!(targetElement instanceof HTMLElement || targetElement instanceof SVGElement)) return;
575
- const dataset = targetElement.dataset;
576
- const leaveAfter = parseInt(dataset.leaveAfter || "") || options.leaveAfter || 0;
577
- const {transitioned: transitioned, hiddenClass: hiddenClass, preserveOriginalClass: preserveOriginalClass, removeToClasses: removeToClasses} = Object.assign(defaultOptions, options);
578
- const controllerEnter = (_a = controller.enter) === null || _a === void 0 ? void 0 : _a.bind(controller);
579
- const controllerLeave = (_b = controller.leave) === null || _b === void 0 ? void 0 : _b.bind(controller);
580
- const controllerToggleTransition = (_c = controller.toggleTransition) === null || _c === void 0 ? void 0 : _c.bind(controller);
581
- async function enter(event) {
582
- if (controller.transitioned) return;
583
- controller.transitioned = true;
584
- controllerEnter && controllerEnter(event);
585
- const enterFromClasses = getAttribute("enterFrom", options, dataset);
586
- const enterActiveClasses = getAttribute("enterActive", options, dataset);
587
- const enterToClasses = getAttribute("enterTo", options, dataset);
588
- const leaveToClasses = getAttribute("leaveTo", options, dataset);
589
- if (!!hiddenClass) {
590
- targetElement.classList.remove(hiddenClass);
591
- }
592
- if (!removeToClasses) {
593
- removeClasses(targetElement, leaveToClasses);
594
- }
595
- await transition(targetElement, enterFromClasses, enterActiveClasses, enterToClasses, hiddenClass, preserveOriginalClass, removeToClasses);
596
- if (leaveAfter > 0) {
597
- setTimeout((() => {
598
- leave(event);
599
- }), leaveAfter);
600
- }
601
- }
602
- async function leave(event) {
603
- if (!controller.transitioned) return;
604
- controller.transitioned = false;
605
- controllerLeave && controllerLeave(event);
606
- const leaveFromClasses = getAttribute("leaveFrom", options, dataset);
607
- const leaveActiveClasses = getAttribute("leaveActive", options, dataset);
608
- const leaveToClasses = getAttribute("leaveTo", options, dataset);
609
- const enterToClasses = getAttribute("enterTo", options, dataset);
610
- if (!removeToClasses) {
611
- removeClasses(targetElement, enterToClasses);
612
- }
613
- await transition(targetElement, leaveFromClasses, leaveActiveClasses, leaveToClasses, hiddenClass, preserveOriginalClass, removeToClasses);
614
- if (!!hiddenClass) {
615
- targetElement.classList.add(hiddenClass);
616
- }
617
- }
618
- function toggleTransition(event) {
619
- controllerToggleTransition && controllerToggleTransition(event);
620
- if (controller.transitioned) {
621
- leave();
622
- } else {
623
- enter();
624
- }
625
- }
626
- async function transition(element, initialClasses, activeClasses, endClasses, hiddenClass, preserveOriginalClass, removeEndClasses) {
627
- const stashedClasses = [];
628
- if (preserveOriginalClass) {
629
- initialClasses.forEach((cls => element.classList.contains(cls) && cls !== hiddenClass && stashedClasses.push(cls)));
630
- activeClasses.forEach((cls => element.classList.contains(cls) && cls !== hiddenClass && stashedClasses.push(cls)));
631
- endClasses.forEach((cls => element.classList.contains(cls) && cls !== hiddenClass && stashedClasses.push(cls)));
632
- }
633
- addClasses(element, initialClasses);
634
- removeClasses(element, stashedClasses);
635
- addClasses(element, activeClasses);
636
- await nextAnimationFrame();
637
- removeClasses(element, initialClasses);
638
- addClasses(element, endClasses);
639
- await afterTransition(element);
640
- removeClasses(element, activeClasses);
641
- if (removeEndClasses) {
642
- removeClasses(element, endClasses);
643
- }
644
- addClasses(element, stashedClasses);
645
- }
646
- function initialState() {
647
- controller.transitioned = transitioned;
648
- if (transitioned) {
649
- if (!!hiddenClass) {
650
- targetElement.classList.remove(hiddenClass);
651
- }
652
- enter();
653
- } else {
654
- if (!!hiddenClass) {
655
- targetElement.classList.add(hiddenClass);
656
- }
657
- leave();
658
- }
659
- }
660
- function addClasses(element, classes) {
661
- if (classes.length > 0) {
662
- element.classList.add(...classes);
663
- }
664
- }
665
- function removeClasses(element, classes) {
666
- if (classes.length > 0) {
667
- element.classList.remove(...classes);
668
- }
669
- }
670
- initialState();
671
- Object.assign(controller, {
672
- enter: enter,
673
- leave: leave,
674
- toggleTransition: toggleTransition
675
- });
676
- return [ enter, leave, toggleTransition ];
677
- };
678
-
679
- function getAttribute(name, options, dataset) {
680
- const datasetName = `transition${name[0].toUpperCase()}${name.substr(1)}`;
681
- const datasetAlpineName = alpineNames[name];
682
- const classes = options[name] || dataset[datasetName] || dataset[datasetAlpineName] || " ";
683
- return isEmpty(classes) ? [] : classes.split(" ");
684
- }
685
-
686
- async function afterTransition(element) {
687
- return new Promise((resolve => {
688
- const duration = Number(getComputedStyle(element).transitionDuration.split(",")[0].replace("s", "")) * 1e3;
689
- setTimeout((() => {
690
- resolve(duration);
691
- }), duration);
692
- }));
693
- }
694
-
695
- async function nextAnimationFrame() {
696
- return new Promise((resolve => {
697
- requestAnimationFrame((() => {
698
- requestAnimationFrame(resolve);
699
- }));
700
- }));
701
- }
702
-
703
- function isEmpty(str) {
704
- return str.length === 0 || !str.trim();
705
- }
706
-
707
734
  class Frame extends Controller {
708
735
  static targets=[ "navigationOverlay", "navigation", "saveBar" ];
709
736
  connect() {
@@ -803,6 +830,9 @@ class Polaris extends Controller {
803
830
  showToast() {
804
831
  this.findElement("toast").show();
805
832
  }
833
+ toggleCollapsible() {
834
+ this.findElement("collapsible").toggle();
835
+ }
806
836
  findElement(type) {
807
837
  const targetId = this.element.dataset.target.replace("#", "");
808
838
  const target = document.getElementById(targetId);
@@ -2372,7 +2402,11 @@ class TextField extends Controller {
2372
2402
  this.valueValue = this.inputTarget.value;
2373
2403
  }
2374
2404
  clear() {
2405
+ const oldValue = this.value;
2375
2406
  this.value = null;
2407
+ if (this.value != oldValue) {
2408
+ this.inputTarget.dispatchEvent(new Event("change"));
2409
+ }
2376
2410
  }
2377
2411
  increase() {
2378
2412
  this.changeNumber(1);
@@ -2465,8 +2499,9 @@ class Toast extends Controller {
2465
2499
  this.element.removeEventListener("transitionend", this.updatePositions, false);
2466
2500
  };
2467
2501
  getStyle(position) {
2468
- const translateIn = -80 * position;
2469
- const translateOut = 150 - 80 * position;
2502
+ const height = this.element.offsetHeight + this.heightOffset;
2503
+ const translateIn = height * -1;
2504
+ const translateOut = 150 - height;
2470
2505
  return `--toast-translate-y-in: ${translateIn}px; --toast-translate-y-out: ${translateOut}px;`;
2471
2506
  }
2472
2507
  get timeoutDuration() {
@@ -2487,11 +2522,15 @@ class Toast extends Controller {
2487
2522
  get position() {
2488
2523
  return this.visibleToasts.filter((el => !this.element.isEqualNode(el))).length + 1;
2489
2524
  }
2525
+ get heightOffset() {
2526
+ return this.visibleToasts.filter((el => !this.element.isEqualNode(el) && this.element.dataset.position > el.dataset.position)).map((el => el.offsetHeight)).reduce(((a, b) => a + b), 0);
2527
+ }
2490
2528
  }
2491
2529
 
2492
2530
  function registerPolarisControllers(application) {
2493
2531
  application.register("polaris-autocomplete", Autocomplete);
2494
2532
  application.register("polaris-button", Button);
2533
+ application.register("polaris-collapsible", Collapsible);
2495
2534
  application.register("polaris-dropzone", Dropzone);
2496
2535
  application.register("polaris-frame", Frame);
2497
2536
  application.register("polaris-modal", Modal);
@@ -116,6 +116,15 @@ a.Polaris-Tag__Button {
116
116
  justify-content: center;
117
117
  }
118
118
 
119
+ &--sizeMedium {
120
+ justify-content: center;
121
+ text-align: center;
122
+
123
+ .Polaris-Stack.Polaris-Stack--alignmentCenter {
124
+ justify-content: center;
125
+ }
126
+ }
127
+
119
128
  &--sizeSmall {
120
129
  padding: 0;
121
130
  justify-content: center;
@@ -137,5 +146,33 @@ a.Polaris-Tag__Button {
137
146
  align-items: center;
138
147
  text-align: center;
139
148
  justify-content: center;
149
+
150
+ .Polaris-Spinner--sizeSmall {
151
+ height: 20px;
152
+ }
153
+ }
154
+ }
155
+
156
+ /* ActionMenu */
157
+ .Polaris-ActionMenu {
158
+ &--mobile {
159
+ @media (min-width: 768px){
160
+ display: none;
161
+ }
162
+ }
163
+
164
+ &--desktop {
165
+ display: none;
166
+
167
+ @media (min-width: 768px){
168
+ display: block;
169
+ }
170
+ }
171
+ }
172
+
173
+ /* Page Pagination */
174
+ @media (max-width: 768px){
175
+ .Polaris-Page-Header__PaginationWrapper {
176
+ display: none;
140
177
  }
141
178
  }