@getflip/swirl-components 0.71.3 → 0.72.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 (42) hide show
  1. package/components.json +120 -1
  2. package/dist/cjs/index-506fe4ea.js +8 -0
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/cjs/swirl-app-layout_7.cjs.entry.js +1 -1
  5. package/dist/cjs/swirl-components.cjs.js +1 -1
  6. package/dist/cjs/swirl-image-grid-item.cjs.entry.js +28 -0
  7. package/dist/cjs/swirl-image-grid.cjs.entry.js +33 -0
  8. package/dist/collection/assets/pdfjs/pdf.worker.min.js +1 -1
  9. package/dist/collection/collection-manifest.json +2 -0
  10. package/dist/collection/components/swirl-image-grid/swirl-image-grid.css +44 -0
  11. package/dist/collection/components/swirl-image-grid/swirl-image-grid.js +61 -0
  12. package/dist/collection/components/swirl-image-grid/swirl-image-grid.spec.js +92 -0
  13. package/dist/collection/components/swirl-image-grid/swirl-image-grid.stories.js +24 -0
  14. package/dist/collection/components/swirl-image-grid-item/swirl-image-grid-item.css +82 -0
  15. package/dist/collection/components/swirl-image-grid-item/swirl-image-grid-item.js +101 -0
  16. package/dist/collection/components/swirl-image-grid-item/swirl-image-grid-item.spec.js +20 -0
  17. package/dist/collection/components/swirl-image-grid-item/swirl-image-grid-item.stories.js +23 -0
  18. package/dist/collection/components/swirl-resource-list-item/swirl-resource-list-item.css +6 -1
  19. package/dist/collection/utils.js +4 -1
  20. package/dist/components/assets/pdfjs/pdf.worker.min.js +1 -1
  21. package/dist/components/swirl-image-grid-item.d.ts +11 -0
  22. package/dist/components/swirl-image-grid-item.js +48 -0
  23. package/dist/components/swirl-image-grid.d.ts +11 -0
  24. package/dist/components/swirl-image-grid.js +51 -0
  25. package/dist/components/swirl-resource-list-item2.js +1 -1
  26. package/dist/esm/index-99d0060d.js +8 -0
  27. package/dist/esm/loader.js +1 -1
  28. package/dist/esm/swirl-app-layout_7.entry.js +1 -1
  29. package/dist/esm/swirl-components.js +1 -1
  30. package/dist/esm/swirl-image-grid-item.entry.js +24 -0
  31. package/dist/esm/swirl-image-grid.entry.js +29 -0
  32. package/dist/swirl-components/p-11c739fb.entry.js +1 -0
  33. package/dist/swirl-components/p-4345e137.entry.js +1 -0
  34. package/dist/swirl-components/{p-74852d21.entry.js → p-a16a6381.entry.js} +1 -1
  35. package/dist/swirl-components/swirl-components.esm.js +1 -1
  36. package/dist/types/components/swirl-image-grid/swirl-image-grid.d.ts +8 -0
  37. package/dist/types/components/swirl-image-grid/swirl-image-grid.stories.d.ts +14 -0
  38. package/dist/types/components/swirl-image-grid-item/swirl-image-grid-item.d.ts +7 -0
  39. package/dist/types/components/swirl-image-grid-item/swirl-image-grid-item.stories.d.ts +14 -0
  40. package/dist/types/components.d.ts +36 -0
  41. package/package.json +1 -1
  42. package/vscode-data.json +38 -0
@@ -192,6 +192,8 @@
192
192
  "./components/swirl-icon/icons/swirl-icon-visibility.js",
193
193
  "./components/swirl-icon/icons/swirl-icon-voice.js",
194
194
  "./components/swirl-icon/icons/swirl-icon-warning.js",
195
+ "./components/swirl-image-grid/swirl-image-grid.js",
196
+ "./components/swirl-image-grid-item/swirl-image-grid-item.js",
195
197
  "./components/swirl-lightbox/swirl-lightbox.js",
196
198
  "./components/swirl-list/swirl-list.js",
197
199
  "./components/swirl-menu-item/swirl-menu-item.js",
@@ -0,0 +1,44 @@
1
+ :host {
2
+ display: block;
3
+ }
4
+
5
+ :host * {
6
+ box-sizing: border-box;
7
+ }
8
+
9
+ .image-grid {
10
+ display: grid;
11
+ overflow: hidden;
12
+ width: 100%;
13
+ min-height: 0;
14
+ border-radius: var(--s-border-radius-sm);
15
+ gap: var(--s-space-2);
16
+ }
17
+
18
+ .image-grid--item-count-1 {
19
+ grid-template-columns: 100%;
20
+ grid-template-rows: 100%;
21
+ }
22
+
23
+ .image-grid--item-count-2 {
24
+ grid-template-columns: repeat(2, 50%);
25
+ }
26
+
27
+ .image-grid--item-count-3 {
28
+ grid-template-columns: calc(100% / 3 * 2) calc(100% / 3);
29
+ }
30
+
31
+ .image-grid--item-count-3 ::slotted(*:nth-child(1)) {
32
+ grid-column-start: 1;
33
+ grid-row-start: 1;
34
+ grid-row-end: 3;
35
+ }
36
+
37
+ .image-grid--item-count-3 ::slotted(*:nth-child(3)) {
38
+ grid-column-start: 2;
39
+ }
40
+
41
+ .image-grid--item-count-4 {
42
+ grid-template-columns: repeat(2, 50%);
43
+ grid-template-rows: repeat(2, 50%);
44
+ }
@@ -0,0 +1,61 @@
1
+ import { h, Host } from "@stencil/core";
2
+ import classnames from "classnames";
3
+ export class SwirlImageGrid {
4
+ constructor() {
5
+ this.updateItems = () => {
6
+ this.items = Array.from(this.el.children);
7
+ if (this.items.length > 4) {
8
+ this.items[3].overlay = `+${this.items.length - 4}`;
9
+ }
10
+ };
11
+ this.aspectRatio = "1/1";
12
+ this.items = [];
13
+ }
14
+ componentWillLoad() {
15
+ this.updateItems();
16
+ }
17
+ render() {
18
+ const className = classnames("image-grid", `image-grid--item-count-${Math.min(4, this.items.length)}`);
19
+ return (h(Host, null, h("div", { class: className, role: "list", style: { aspectRatio: this.aspectRatio } }, h("slot", { onSlotchange: this.updateItems }))));
20
+ }
21
+ static get is() { return "swirl-image-grid"; }
22
+ static get encapsulation() { return "shadow"; }
23
+ static get originalStyleUrls() {
24
+ return {
25
+ "$": ["swirl-image-grid.css"]
26
+ };
27
+ }
28
+ static get styleUrls() {
29
+ return {
30
+ "$": ["swirl-image-grid.css"]
31
+ };
32
+ }
33
+ static get properties() {
34
+ return {
35
+ "aspectRatio": {
36
+ "type": "string",
37
+ "mutable": false,
38
+ "complexType": {
39
+ "original": "string",
40
+ "resolved": "string",
41
+ "references": {}
42
+ },
43
+ "required": false,
44
+ "optional": true,
45
+ "docs": {
46
+ "tags": [],
47
+ "text": ""
48
+ },
49
+ "attribute": "aspect-ratio",
50
+ "reflect": false,
51
+ "defaultValue": "\"1/1\""
52
+ }
53
+ };
54
+ }
55
+ static get states() {
56
+ return {
57
+ "items": {}
58
+ };
59
+ }
60
+ static get elementRef() { return "el"; }
61
+ }
@@ -0,0 +1,92 @@
1
+ import { newSpecPage } from "@stencil/core/testing";
2
+ import { SwirlImageGrid } from "./swirl-image-grid";
3
+ import { SwirlImageGridItem } from "../swirl-image-grid-item/swirl-image-grid-item";
4
+ describe("swirl-image-grid", () => {
5
+ it("renders a single item", async () => {
6
+ const page = await newSpecPage({
7
+ components: [SwirlImageGrid, SwirlImageGridItem],
8
+ html: `
9
+ <swirl-image-grid aspect-ratio="4 / 3">
10
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
11
+ </swirl-image-grid>
12
+ `,
13
+ });
14
+ expect(page.root).toEqualHtml(`
15
+ <swirl-image-grid aspect-ratio="4 / 3">
16
+ <mock:shadow-root>
17
+ <div class="image-grid image-grid--item-count-1" role="list" style="aspect-ratio: 4 / 3;">
18
+ <slot></slot>
19
+ </div>
20
+ </mock:shadow-root>
21
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive="" role="listitem" src="/sample.jpg">
22
+ <mock:shadow-root>
23
+ <button class="image-grid-item" type="button">
24
+ <div class="image-grid-item__background" style="background-image: url(/sample.jpg);"></div>
25
+ <img alt="Cute dog in a blanket" class="image-grid-item__image" src="/sample.jpg">
26
+ </button>
27
+ </mock:shadow-root>
28
+ </swirl-image-grid-item>
29
+ </swirl-image-grid>
30
+ `);
31
+ });
32
+ it("renders a two items correctly", async () => {
33
+ const page = await newSpecPage({
34
+ components: [SwirlImageGrid, SwirlImageGridItem],
35
+ html: `
36
+ <swirl-image-grid aspect-ratio="4 / 3">
37
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
38
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
39
+ </swirl-image-grid>
40
+ `,
41
+ });
42
+ expect(page.root.shadowRoot.children[0].classList.contains("image-grid--item-count-2")).toBe(true);
43
+ });
44
+ it("renders a two items correctly", async () => {
45
+ const page = await newSpecPage({
46
+ components: [SwirlImageGrid, SwirlImageGridItem],
47
+ html: `
48
+ <swirl-image-grid aspect-ratio="4 / 3">
49
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
50
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
51
+ </swirl-image-grid>
52
+ `,
53
+ });
54
+ expect(page.root.shadowRoot.children[0].classList.contains("image-grid--item-count-2")).toBe(true);
55
+ });
56
+ it("renders a three items correctly", async () => {
57
+ const page = await newSpecPage({
58
+ components: [SwirlImageGrid, SwirlImageGridItem],
59
+ html: `
60
+ <swirl-image-grid aspect-ratio="4 / 3">
61
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
62
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
63
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
64
+ </swirl-image-grid>
65
+ `,
66
+ });
67
+ expect(page.root.shadowRoot.children[0].classList.contains("image-grid--item-count-3")).toBe(true);
68
+ });
69
+ it("renders overflowing items correctly", async () => {
70
+ const page = await newSpecPage({
71
+ components: [SwirlImageGrid, SwirlImageGridItem],
72
+ html: `
73
+ <swirl-image-grid aspect-ratio="4 / 3">
74
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
75
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
76
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
77
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
78
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
79
+ <swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
80
+ </swirl-image-grid>
81
+ `,
82
+ });
83
+ const el = page.root.shadowRoot.children[0];
84
+ const items = Array.from(page.root.querySelectorAll("swirl-image-grid-item"));
85
+ expect(el.classList.contains("image-grid--item-count-4")).toBe(true);
86
+ expect(items[3].shadowRoot
87
+ .querySelector(".image-grid-item")
88
+ .classList.contains("image-grid-item--has-overlay")).toBe(true);
89
+ expect(items[3].shadowRoot.querySelector(".image-grid-item")
90
+ .innerText).toEqual("+2");
91
+ });
92
+ });
@@ -0,0 +1,24 @@
1
+ import { generateStoryElement } from "../../utils";
2
+ import Docs from "./swirl-image-grid.mdx";
3
+ export default {
4
+ component: "swirl-image-grid",
5
+ tags: ["autodocs"],
6
+ parameters: {
7
+ docs: {
8
+ page: Docs,
9
+ },
10
+ },
11
+ title: "Components/SwirlImageGrid",
12
+ };
13
+ const Template = (args) => {
14
+ const element = generateStoryElement("swirl-image-grid", args);
15
+ element.innerHTML = args.slot;
16
+ return element;
17
+ };
18
+ export const SwirlImageGrid = Template.bind({});
19
+ SwirlImageGrid.args = {
20
+ aspectRatio: "16 / 9",
21
+ slot: `<swirl-image-grid-item alt="Cute dog in a blanket" interactive src="/sample.jpg"></swirl-image-grid-item>
22
+ <swirl-image-grid-item alt="Another cute dog in a blanket" interactive src="/sample-2.jpg"></swirl-image-grid-item>
23
+ <swirl-image-grid-item alt="Third cute dog in a blanket" interactive src="/sample-3.jpg"></swirl-image-grid-item>`,
24
+ };
@@ -0,0 +1,82 @@
1
+ :host {
2
+ display: block;
3
+ width: 100%;
4
+ min-height: 0;
5
+ }
6
+
7
+ :host * {
8
+ box-sizing: border-box;
9
+ }
10
+
11
+ :host(:not(:only-child)) .image-grid-item__background {
12
+ display: none;
13
+ }
14
+
15
+ :host(:not(:only-child)) .image-grid-item__image {
16
+ -o-object-fit: cover;
17
+ object-fit: cover;
18
+ }
19
+
20
+ :host(:nth-child(n+5)) {
21
+ display: none;
22
+ }
23
+
24
+ .image-grid-item {
25
+ position: relative;
26
+ display: inline-flex;
27
+ overflow: hidden;
28
+ width: 100%;
29
+ height: 100%;
30
+ }
31
+
32
+ button.image-grid-item {
33
+ padding: 0;
34
+ border: none;
35
+ background-color: transparent;
36
+ cursor: pointer;
37
+ }
38
+
39
+ button.image-grid-item:focus:not(:focus-visible) {
40
+ outline: none;
41
+ }
42
+
43
+ button.image-grid-item:focus-visible {
44
+ z-index: 1;
45
+ outline-color: var(--s-focus-default);
46
+ outline-offset: var(--s-space-2);
47
+ }
48
+
49
+ .image-grid-item--has-overlay .image-grid-item__image {
50
+ scale: 1.1;
51
+ filter: blur(5px);
52
+ }
53
+
54
+ .image-grid-item__background {
55
+ position: absolute;
56
+ background-size: cover;
57
+ inset: -40px;
58
+ filter: blur(20px);
59
+ }
60
+
61
+ .image-grid-item__image {
62
+ z-index: 1;
63
+ display: inline-flex;
64
+ width: 100%;
65
+ height: 100%;
66
+ -o-object-fit: contain;
67
+ object-fit: contain;
68
+ -o-object-position: center;
69
+ object-position: center;
70
+ }
71
+
72
+ .image-grid-item__overlay {
73
+ position: absolute;
74
+ z-index: 2;
75
+ inset: 0;
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ background-color: rgba(0, 0, 0, 0.4);
80
+ color: var(--s-text-on-image);
81
+ font-size: var(--s-font-size-2xl);
82
+ }
@@ -0,0 +1,101 @@
1
+ import { h, Host } from "@stencil/core";
2
+ import classnames from "classnames";
3
+ export class SwirlImageGridItem {
4
+ constructor() {
5
+ this.alt = undefined;
6
+ this.interactive = undefined;
7
+ this.overlay = undefined;
8
+ this.src = undefined;
9
+ }
10
+ render() {
11
+ const Tag = this.interactive ? "button" : "div";
12
+ const className = classnames("image-grid-item", {
13
+ "image-grid-item--has-overlay": this.overlay,
14
+ });
15
+ return (h(Host, { role: "listitem" }, h(Tag, { class: className, type: this.interactive ? "button" : undefined }, h("div", { class: "image-grid-item__background", style: { backgroundImage: `url(${this.src})` } }), h("img", { alt: this.alt, class: "image-grid-item__image", src: this.src }), this.overlay && (h("div", { class: "image-grid-item__overlay" }, this.overlay)))));
16
+ }
17
+ static get is() { return "swirl-image-grid-item"; }
18
+ static get encapsulation() { return "shadow"; }
19
+ static get originalStyleUrls() {
20
+ return {
21
+ "$": ["swirl-image-grid-item.css"]
22
+ };
23
+ }
24
+ static get styleUrls() {
25
+ return {
26
+ "$": ["swirl-image-grid-item.css"]
27
+ };
28
+ }
29
+ static get properties() {
30
+ return {
31
+ "alt": {
32
+ "type": "string",
33
+ "mutable": false,
34
+ "complexType": {
35
+ "original": "string",
36
+ "resolved": "string",
37
+ "references": {}
38
+ },
39
+ "required": true,
40
+ "optional": false,
41
+ "docs": {
42
+ "tags": [],
43
+ "text": ""
44
+ },
45
+ "attribute": "alt",
46
+ "reflect": false
47
+ },
48
+ "interactive": {
49
+ "type": "boolean",
50
+ "mutable": false,
51
+ "complexType": {
52
+ "original": "boolean",
53
+ "resolved": "boolean",
54
+ "references": {}
55
+ },
56
+ "required": false,
57
+ "optional": true,
58
+ "docs": {
59
+ "tags": [],
60
+ "text": ""
61
+ },
62
+ "attribute": "interactive",
63
+ "reflect": false
64
+ },
65
+ "overlay": {
66
+ "type": "string",
67
+ "mutable": false,
68
+ "complexType": {
69
+ "original": "string",
70
+ "resolved": "string",
71
+ "references": {}
72
+ },
73
+ "required": false,
74
+ "optional": true,
75
+ "docs": {
76
+ "tags": [],
77
+ "text": ""
78
+ },
79
+ "attribute": "overlay",
80
+ "reflect": false
81
+ },
82
+ "src": {
83
+ "type": "string",
84
+ "mutable": false,
85
+ "complexType": {
86
+ "original": "string",
87
+ "resolved": "string",
88
+ "references": {}
89
+ },
90
+ "required": true,
91
+ "optional": false,
92
+ "docs": {
93
+ "tags": [],
94
+ "text": ""
95
+ },
96
+ "attribute": "src",
97
+ "reflect": false
98
+ }
99
+ };
100
+ }
101
+ }
@@ -0,0 +1,20 @@
1
+ import { newSpecPage } from "@stencil/core/testing";
2
+ import { SwirlImageGridItem } from "./swirl-image-grid-item";
3
+ describe("swirl-image-grid-item", () => {
4
+ it("renders its image", async () => {
5
+ const page = await newSpecPage({
6
+ components: [SwirlImageGridItem],
7
+ html: `<swirl-image-grid-item alt="Dog in a blanket" src="/image.jpg"></swirl-image-grid-item>`,
8
+ });
9
+ expect(page.root).toEqualHtml(`
10
+ <swirl-image-grid-item alt="Dog in a blanket" role="listitem" src="/image.jpg">
11
+ <mock:shadow-root>
12
+ <div class="image-grid-item">
13
+ <div class="image-grid-item__background" style="background-image: url(/image.jpg);"></div>
14
+ <img alt="Dog in a blanket" class="image-grid-item__image" src="/image.jpg">
15
+ </div>
16
+ </mock:shadow-root>
17
+ </swirl-image-grid-item>
18
+ `);
19
+ });
20
+ });
@@ -0,0 +1,23 @@
1
+ import { generateStoryElement } from "../../utils";
2
+ import Docs from "./swirl-image-grid-item.mdx";
3
+ export default {
4
+ component: "swirl-image-grid-item",
5
+ tags: ["autodocs"],
6
+ parameters: {
7
+ docs: {
8
+ page: Docs,
9
+ },
10
+ },
11
+ title: "Components/SwirlImageGridItem",
12
+ };
13
+ const Template = (args) => {
14
+ const container = document.createElement("swirl-image-grid");
15
+ const element = generateStoryElement("swirl-image-grid-item", args);
16
+ container.append(element);
17
+ return container;
18
+ };
19
+ export const SwirlImageGridItem = Template.bind({});
20
+ SwirlImageGridItem.args = {
21
+ alt: "Dog in a blanket",
22
+ src: "/sample.jpg",
23
+ };
@@ -103,9 +103,14 @@
103
103
  background-color: var(--s-surface-overlay-pressed);
104
104
  }
105
105
 
106
+ .resource-list-item--disabled.resource-list-item--checked .resource-list-item__checkbox {
107
+ border-color: var(--s-icon-disabled);
108
+ background-color: var(--s-icon-disabled);
109
+ }
110
+
106
111
  .resource-list-item--disabled .resource-list-item__checkbox {
107
112
  border-color: var(--s-icon-disabled);
108
- background-color: var(--s-icon-disabled);
113
+ background-color: transparent;
109
114
  }
110
115
 
111
116
  .resource-list-item--disabled .resource-list-item__checkbox-icon {
@@ -84,7 +84,10 @@ export function fullscreenStoryDecorator(padded = true) {
84
84
  export function generateStoryElement(tag, args, content) {
85
85
  const element = document.createElement(tag);
86
86
  Object.entries(args)
87
- .filter((arg) => arg[1] !== undefined && arg[1] !== null && arg[1] !== "")
87
+ .filter((arg) => arg[1] !== undefined &&
88
+ arg[1] !== null &&
89
+ arg[1] !== "" &&
90
+ arg[0] !== "slot")
88
91
  .forEach(([attr, value]) => {
89
92
  if (typeof value === "object") {
90
93
  element[attr] = value;