@getflip/swirl-components 0.78.1 → 0.80.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 (88) hide show
  1. package/components.json +140 -6
  2. package/dist/cjs/file-manager.cjs.entry.js +2 -1
  3. package/dist/cjs/index-506fe4ea.js +2 -2
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/swirl-app-layout_7.cjs.entry.js +7 -4
  6. package/dist/cjs/swirl-button.cjs.entry.js +3 -1
  7. package/dist/cjs/swirl-components.cjs.js +1 -1
  8. package/dist/cjs/swirl-date-input.cjs.entry.js +1 -1
  9. package/dist/cjs/swirl-lightbox.cjs.entry.js +1 -1
  10. package/dist/cjs/swirl-pdf-reader.cjs.entry.js +2 -2
  11. package/dist/cjs/{swirl-popover.cjs.entry.js → swirl-popover_2.cjs.entry.js} +105 -18
  12. package/dist/cjs/swirl-select.cjs.entry.js +2 -2
  13. package/dist/collection/assets/pdfjs/pdf.worker.min.js +22 -0
  14. package/dist/collection/collection-manifest.json +1 -0
  15. package/dist/collection/components/swirl-button/swirl-button.js +37 -1
  16. package/dist/collection/components/swirl-date-input/swirl-date-input.js +1 -1
  17. package/dist/collection/components/swirl-date-input/swirl-date-input.spec.js +6 -4
  18. package/dist/collection/components/swirl-lightbox/swirl-lightbox.js +1 -1
  19. package/dist/collection/components/swirl-lightbox/swirl-lightbox.spec.js +6 -4
  20. package/dist/collection/components/swirl-menu/swirl-menu.spec.js +38 -14
  21. package/dist/collection/components/swirl-menu/swirl-menu.stories.js +35 -33
  22. package/dist/collection/components/swirl-pdf-reader/swirl-pdf-reader.js +2 -2
  23. package/dist/collection/components/swirl-pdf-reader/swirl-pdf-reader.spec.js +4 -2
  24. package/dist/collection/components/swirl-popover/swirl-popover.js +53 -39
  25. package/dist/collection/components/swirl-popover/swirl-popover.spec.js +20 -11
  26. package/dist/collection/components/swirl-popover/swirl-popover.stories.js +8 -25
  27. package/dist/collection/components/swirl-popover-trigger/swirl-popover-trigger.css +3 -0
  28. package/dist/collection/components/swirl-popover-trigger/swirl-popover-trigger.js +132 -0
  29. package/dist/collection/components/swirl-popover-trigger/swirl-popover-trigger.spec.js +26 -0
  30. package/dist/collection/components/swirl-popover-trigger/swirl-popover-trigger.stories.js +48 -0
  31. package/dist/collection/components/swirl-resource-list-item/swirl-resource-list-item.css +7 -0
  32. package/dist/collection/components/swirl-resource-list-item/swirl-resource-list-item.js +7 -3
  33. package/dist/collection/components/swirl-resource-list-item/swirl-resource-list-item.spec.js +1 -0
  34. package/dist/collection/components/swirl-resource-list-item/swirl-resource-list-item.stories.js +29 -29
  35. package/dist/collection/components/swirl-select/swirl-select.js +2 -2
  36. package/dist/collection/components/swirl-select/swirl-select.spec.js +4 -2
  37. package/dist/collection/prototypes/file-manager/file-manager.js +4 -2
  38. package/dist/components/assets/pdfjs/pdf.worker.min.js +22 -0
  39. package/dist/components/file-manager.js +54 -46
  40. package/dist/components/swirl-button2.js +5 -1
  41. package/dist/components/swirl-date-input.js +13 -7
  42. package/dist/components/swirl-lightbox.js +21 -15
  43. package/dist/components/swirl-pdf-reader.js +48 -42
  44. package/dist/components/swirl-popover-trigger.d.ts +11 -0
  45. package/dist/components/swirl-popover-trigger.js +6 -0
  46. package/dist/components/swirl-popover-trigger2.js +99 -0
  47. package/dist/components/swirl-popover2.js +27 -19
  48. package/dist/components/swirl-resource-list-item2.js +19 -10
  49. package/dist/components/swirl-select.js +18 -12
  50. package/dist/esm/file-manager.entry.js +2 -1
  51. package/dist/esm/index-99d0060d.js +2 -2
  52. package/dist/esm/loader.js +1 -1
  53. package/dist/esm/swirl-app-layout_7.entry.js +7 -4
  54. package/dist/esm/swirl-button.entry.js +3 -1
  55. package/dist/esm/swirl-components.js +1 -1
  56. package/dist/esm/swirl-date-input.entry.js +1 -1
  57. package/dist/esm/swirl-lightbox.entry.js +1 -1
  58. package/dist/esm/swirl-pdf-reader.entry.js +2 -2
  59. package/dist/esm/{swirl-popover.entry.js → swirl-popover_2.entry.js} +105 -19
  60. package/dist/esm/swirl-select.entry.js +2 -2
  61. package/dist/swirl-components/p-0fce283f.entry.js +1 -0
  62. package/dist/swirl-components/p-2278aeae.entry.js +1 -0
  63. package/dist/swirl-components/p-251884ec.entry.js +1 -0
  64. package/dist/swirl-components/{p-a16a6381.entry.js → p-30ae7d5c.entry.js} +1 -1
  65. package/dist/swirl-components/p-3abcd491.entry.js +1 -0
  66. package/dist/swirl-components/p-6832ee6c.entry.js +1 -0
  67. package/dist/swirl-components/p-794d25e2.entry.js +1 -0
  68. package/dist/swirl-components/p-ed921838.entry.js +1 -0
  69. package/dist/swirl-components/swirl-components.esm.js +1 -1
  70. package/dist/types/components/swirl-button/swirl-button.d.ts +2 -0
  71. package/dist/types/components/swirl-popover/swirl-popover.d.ts +4 -5
  72. package/dist/types/components/swirl-popover/swirl-popover.stories.d.ts +0 -3
  73. package/dist/types/components/swirl-popover-trigger/swirl-popover-trigger.d.ts +13 -0
  74. package/dist/types/components/swirl-popover-trigger/swirl-popover-trigger.stories.d.ts +22 -0
  75. package/dist/types/components/swirl-resource-list-item/swirl-resource-list-item.d.ts +1 -0
  76. package/dist/types/components/swirl-resource-list-item/swirl-resource-list-item.stories.d.ts +8 -3
  77. package/dist/types/components.d.ts +26 -5
  78. package/dist/types/prototypes/file-manager/file-manager.d.ts +1 -0
  79. package/package.json +1 -1
  80. package/vscode-data.json +25 -0
  81. package/dist/swirl-components/p-8c507544.entry.js +0 -1
  82. package/dist/swirl-components/p-acd95936.entry.js +0 -1
  83. package/dist/swirl-components/p-b105d565.entry.js +0 -1
  84. package/dist/swirl-components/p-b28fadcf.entry.js +0 -1
  85. package/dist/swirl-components/p-d98edc75.entry.js +0 -1
  86. package/dist/swirl-components/p-ef50db1d.entry.js +0 -1
  87. package/dist/swirl-components/p-f990566c.entry.js +0 -1
  88. package/dist/typings.d.ts +0 -1
@@ -1,10 +1,13 @@
1
1
  import { newSpecPage } from "@stencil/core/testing";
2
2
  import { SwirlPopover } from "./swirl-popover";
3
+ import { SwirlPopoverTrigger } from "../swirl-popover-trigger/swirl-popover-trigger";
3
4
  describe("swirl-popover", () => {
4
5
  const template = `
5
6
  <div>
6
- <button id="trigger">Trigger popover</button>
7
- <swirl-popover label="Popover" popover-id="popover" trigger="trigger">
7
+ <swirl-popover-trigger popover="popover">
8
+ <button id="trigger">Trigger popover</button>
9
+ </swirl-popover-trigger>
10
+ <swirl-popover label="Popover" id="popover">
8
11
  <div>Content</div>
9
12
  </swirl-popover>
10
13
  </div>
@@ -19,13 +22,15 @@ describe("swirl-popover", () => {
19
22
  });
20
23
  it("renders the trigger and content", async () => {
21
24
  const page = await newSpecPage({
22
- components: [SwirlPopover],
25
+ components: [SwirlPopover, SwirlPopoverTrigger],
23
26
  html: template,
24
27
  });
25
28
  expect(page.body).toEqualHtml(`
26
29
  <div>
27
- <button aria-controls="popover" aria-expanded="false" aria-haspopup="dialog" id="trigger">Trigger popover</button>
28
- <swirl-popover id="popover" label="Popover" popover-id="popover" trigger="trigger">
30
+ <swirl-popover-trigger popover="popover">
31
+ <button aria-controls="popover" aria-expanded="false" aria-haspopup="dialog" id="trigger">Trigger popover</button>
32
+ </swirl-popover-trigger>
33
+ <swirl-popover id="popover" label="Popover">
29
34
  <mock:shadow-root>
30
35
  <div class="popover popover--animation-scale-in-xy popover--inactive popover--placement-undefined">
31
36
  <div aria-hidden="true" aria-label="Popover" class="popover__content" part="popover__content" role="dialog" tabindex="-1">
@@ -45,18 +50,20 @@ describe("swirl-popover", () => {
45
50
  });
46
51
  it("opens on click and closes on blur/esc", async () => {
47
52
  const page = await newSpecPage({
48
- components: [SwirlPopover],
53
+ components: [SwirlPopover, SwirlPopoverTrigger],
49
54
  html: template,
50
55
  });
51
56
  function isOpen() {
52
- return !page.root.shadowRoot
53
- .querySelector(".popover")
57
+ return !page.doc
58
+ .querySelector("swirl-popover")
59
+ .shadowRoot.querySelector(".popover")
54
60
  .classList.contains("popover--inactive");
55
61
  }
56
62
  expect(isOpen()).toBeFalsy();
57
63
  // click trigger
58
- const trigger = page.body.querySelector("#trigger");
64
+ const trigger = page.root;
59
65
  trigger.click();
66
+ await new Promise((resolve) => setTimeout(resolve, 150));
60
67
  await page.waitForChanges();
61
68
  expect(isOpen()).toBeTruthy();
62
69
  // blur popover
@@ -66,11 +73,13 @@ describe("swirl-popover", () => {
66
73
  expect(isOpen()).toBeFalsy();
67
74
  // re-open popover
68
75
  trigger.click();
76
+ await new Promise((resolve) => setTimeout(resolve, 150));
69
77
  await page.waitForChanges();
70
78
  expect(isOpen()).toBeTruthy();
71
79
  // close via escape key
72
- page.root.shadowRoot
73
- .querySelector(".popover")
80
+ page.doc
81
+ .querySelector("swirl-popover")
82
+ .shadowRoot.querySelector(".popover")
74
83
  .dispatchEvent(new KeyboardEvent("keydown", { code: "Escape" }));
75
84
  await new Promise((resolve) => setTimeout(resolve, 150));
76
85
  await page.waitForChanges();
@@ -13,7 +13,7 @@ export default {
13
13
  },
14
14
  },
15
15
  trigger: {
16
- description: "ID of the trigger element or the trigger DOM element.",
16
+ description: "**Deprecated! Please use the swirl-popover-trigger component instead.** ID of the trigger element or the trigger DOM element.",
17
17
  control: {
18
18
  type: "text",
19
19
  },
@@ -31,34 +31,18 @@ export default {
31
31
  parameters: {
32
32
  docs: {
33
33
  page: Docs,
34
- source: {
35
- code: `<swirl-button id="trigger" label="Trigger"></swirl-button>
36
-
37
- <swirl-popover label="Popover" popover-id="popover" trigger="trigger">
38
- <swirl-action-list>
39
- <swirl-action-list-section label="Section 1">
40
- <swirl-action-list-item icon="<swirl-icon-mention></swirl-icon-mention>" label="Action item 1"></swirl-action-list-item>
41
- <swirl-action-list-item icon="<swirl-icon-mention></swirl-icon-mention>" label="Action item 2"></swirl-action-list-item>
42
- <swirl-action-list-item icon="<swirl-icon-mention></swirl-icon-mention>" label="Action item 3"></swirl-action-list-item>
43
- </swirl-action-list-section>
44
- <swirl-action-list-section label="Section 2">
45
- <swirl-action-list-item icon="<swirl-icon-mention></swirl-icon-mention>" label="Action item 1"></swirl-action-list-item>
46
- <swirl-action-list-item icon="<swirl-icon-mention></swirl-icon-mention>" label="Action item 2"></swirl-action-list-item>
47
- <swirl-action-list-item icon="<swirl-icon-mention></swirl-icon-mention>" label="Action item 3"></swirl-action-list-item>
48
- </swirl-action-list-section>
49
- </swirl-action-list>
50
- </swirl-popover>`,
51
- },
52
34
  },
53
35
  },
54
36
  title: "Components/SwirlPopover",
55
37
  };
56
38
  const Template = (args) => {
57
39
  const container = document.createElement("div");
58
- const trigger = document.createElement("swirl-button");
40
+ const trigger = document.createElement("swirl-popover-trigger");
59
41
  const element = generateStoryElement("swirl-popover", args);
60
- trigger.id = "trigger";
61
- trigger.label = "Trigger popover";
42
+ trigger.setAttribute("popover", "popover");
43
+ trigger.innerHTML = `
44
+ <swirl-button label="Trigger popover"></swirl-button>
45
+ `;
62
46
  element.innerHTML = `
63
47
  <swirl-action-list>
64
48
  <swirl-action-list-section label="Section 1">
@@ -73,7 +57,7 @@ const Template = (args) => {
73
57
  </swirl-action-list-section>
74
58
  </swirl-action-list>
75
59
  `;
76
- container.append(trigger, element);
60
+ container.append("\n ", trigger, "\n ", element);
77
61
  element.addEventListener("click", (event) => {
78
62
  const target = event.target;
79
63
  if ((target === null || target === void 0 ? void 0 : target.tagName) === "SWIRL-ACTION-LIST-ITEM") {
@@ -84,7 +68,6 @@ const Template = (args) => {
84
68
  };
85
69
  export const SwirlPopover = Template.bind({});
86
70
  SwirlPopover.args = {
71
+ id: "popover",
87
72
  label: "Popover",
88
- popoverId: "popover",
89
- trigger: "trigger",
90
73
  };
@@ -0,0 +1,3 @@
1
+ :host {
2
+ display: contents;
3
+ }
@@ -0,0 +1,132 @@
1
+ import { h, Host } from "@stencil/core";
2
+ export class SwirlPopoverTrigger {
3
+ constructor() {
4
+ this.popoverOpen = false;
5
+ this.onClick = (event) => {
6
+ event.stopPropagation();
7
+ const popoverEl = this.getPopoverEl();
8
+ if (!Boolean(popoverEl)) {
9
+ return;
10
+ }
11
+ if (this.popoverOpen) {
12
+ popoverEl.close();
13
+ return;
14
+ }
15
+ const triggerEl = this.getTriggerEl();
16
+ if (!Boolean(triggerEl)) {
17
+ return;
18
+ }
19
+ popoverEl.open(triggerEl);
20
+ popoverEl.addEventListener("popoverOpen", () => {
21
+ this.popoverOpen = true;
22
+ this.updateTriggerElAriaAttributes(true);
23
+ }, { once: true });
24
+ popoverEl.addEventListener("popoverClose", () => {
25
+ this.popoverOpen = false;
26
+ this.updateTriggerElAriaAttributes(false);
27
+ }, { once: true });
28
+ };
29
+ this.updateTriggerElAriaAttributes = (open) => {
30
+ var _a;
31
+ if (!this.setAriaAttributes) {
32
+ return;
33
+ }
34
+ const triggerEl = this.getTriggerEl();
35
+ const popoverId = typeof this.popover === "string" ? this.popover : (_a = this.popover) === null || _a === void 0 ? void 0 : _a.id;
36
+ if (triggerEl.tagName.startsWith("SWIRL-")) {
37
+ triggerEl.setAttribute("swirl-aria-controls", popoverId);
38
+ triggerEl.setAttribute("swirl-aria-expanded", String(open || "false"));
39
+ triggerEl.setAttribute("swirl-aria-haspopup", "dialog");
40
+ }
41
+ else {
42
+ triggerEl.setAttribute("aria-controls", popoverId);
43
+ triggerEl.setAttribute("aria-expanded", String(open || "false"));
44
+ triggerEl.setAttribute("aria-haspopup", "dialog");
45
+ }
46
+ };
47
+ this.popover = undefined;
48
+ this.setAriaAttributes = true;
49
+ }
50
+ componentDidLoad() {
51
+ this.updateTriggerElAriaAttributes();
52
+ }
53
+ watchPopover() {
54
+ this.updateTriggerElAriaAttributes();
55
+ }
56
+ getPopoverEl() {
57
+ return typeof this.popover === "string"
58
+ ? document.querySelector(`#${this.popover}`)
59
+ : this.popover;
60
+ }
61
+ getTriggerEl() {
62
+ if (this.el.children.length !== 1) {
63
+ console.warn('[Swirl] The "swirl-popover-trigger" component expects exactly one child element.');
64
+ }
65
+ return this.el.children[0];
66
+ }
67
+ render() {
68
+ return (h(Host, { onClick: this.onClick }, h("slot", null)));
69
+ }
70
+ static get is() { return "swirl-popover-trigger"; }
71
+ static get encapsulation() { return "scoped"; }
72
+ static get originalStyleUrls() {
73
+ return {
74
+ "$": ["swirl-popover-trigger.css"]
75
+ };
76
+ }
77
+ static get styleUrls() {
78
+ return {
79
+ "$": ["swirl-popover-trigger.css"]
80
+ };
81
+ }
82
+ static get properties() {
83
+ return {
84
+ "popover": {
85
+ "type": "string",
86
+ "mutable": false,
87
+ "complexType": {
88
+ "original": "string | HTMLSwirlPopoverElement",
89
+ "resolved": "HTMLSwirlPopoverElement | string",
90
+ "references": {
91
+ "HTMLSwirlPopoverElement": {
92
+ "location": "global"
93
+ }
94
+ }
95
+ },
96
+ "required": true,
97
+ "optional": false,
98
+ "docs": {
99
+ "tags": [],
100
+ "text": ""
101
+ },
102
+ "attribute": "popover",
103
+ "reflect": false
104
+ },
105
+ "setAriaAttributes": {
106
+ "type": "boolean",
107
+ "mutable": false,
108
+ "complexType": {
109
+ "original": "boolean",
110
+ "resolved": "boolean",
111
+ "references": {}
112
+ },
113
+ "required": false,
114
+ "optional": true,
115
+ "docs": {
116
+ "tags": [],
117
+ "text": ""
118
+ },
119
+ "attribute": "set-aria-attributes",
120
+ "reflect": false,
121
+ "defaultValue": "true"
122
+ }
123
+ };
124
+ }
125
+ static get elementRef() { return "el"; }
126
+ static get watchers() {
127
+ return [{
128
+ "propName": "popover",
129
+ "methodName": "watchPopover"
130
+ }];
131
+ }
132
+ }
@@ -0,0 +1,26 @@
1
+ import { newSpecPage } from "@stencil/core/testing";
2
+ import { SwirlPopoverTrigger } from "./swirl-popover-trigger";
3
+ import { SwirlButton } from "../swirl-button/swirl-button";
4
+ describe("swirl-popover-trigger", () => {
5
+ it("renders its trigger element and adds aria attributes", async () => {
6
+ const page = await newSpecPage({
7
+ components: [SwirlPopoverTrigger, SwirlButton],
8
+ html: `
9
+ <swirl-popover-trigger popover="popover">
10
+ <swirl-button label="trigger"></swirl-button>
11
+ </swirl-popover-trigger>
12
+ `,
13
+ });
14
+ expect(page.root).toEqualHtml(`
15
+ <swirl-popover-trigger popover="popover">
16
+ <swirl-button label="trigger" swirl-aria-controls="popover" swirl-aria-expanded="false" swirl-aria-haspopup="dialog">
17
+ <button aria-controls="popover" aria-expanded="false" aria-haspopup="dialog" class="button button--icon-position-start button--intent-default button--size-m button--variant-ghost" type="button">
18
+ <span class="button__label">
19
+ trigger
20
+ </span>
21
+ </button>
22
+ </swirl-button>
23
+ </swirl-popover-trigger>
24
+ `);
25
+ });
26
+ });
@@ -0,0 +1,48 @@
1
+ import { generateStoryElement } from "../../utils";
2
+ import Docs from "./swirl-popover-trigger.mdx";
3
+ export default {
4
+ argTypes: {
5
+ popover: {
6
+ description: "ID of a popover element or a reference to a DOM element of type HTMLSwirlPopoverElement.",
7
+ control: {
8
+ type: "text",
9
+ },
10
+ },
11
+ },
12
+ component: "swirl-popover-trigger",
13
+ tags: ["autodocs"],
14
+ parameters: {
15
+ docs: {
16
+ page: Docs,
17
+ },
18
+ },
19
+ title: "Components/SwirlPopoverTrigger",
20
+ };
21
+ const Template = (args) => {
22
+ const container = document.createElement("swirl-stack");
23
+ const element = generateStoryElement("swirl-popover-trigger", args);
24
+ const secondTrigger = generateStoryElement("swirl-popover-trigger", args);
25
+ const popover = document.createElement("swirl-popover");
26
+ container.orientation = "horizontal";
27
+ container.spacing = "16";
28
+ popover.label = "Popover";
29
+ popover.id = "popover";
30
+ popover.placement = "bottom-start";
31
+ popover.innerHTML = `
32
+ <swirl-box padding="12">
33
+ <swirl-text size="sm">Popover</swirl-text>
34
+ </swirl-box>
35
+ `;
36
+ element.innerHTML = `
37
+ <swirl-button label="Trigger element" variant="flat"></swirl-button>
38
+ `;
39
+ secondTrigger.innerHTML = `
40
+ <swirl-button label="Second trigger, same popover" variant="flat"></swirl-button>
41
+ `;
42
+ container.append("\n ", element, "\n ", secondTrigger, "\n ", popover, "\n");
43
+ return container;
44
+ };
45
+ export const SwirlPopoverTrigger = Template.bind({});
46
+ SwirlPopoverTrigger.args = {
47
+ popover: "popover",
48
+ };
@@ -223,6 +223,13 @@
223
223
  transform: translateY(-50%);
224
224
  }
225
225
 
226
+ .resource-list-item__control {
227
+ position: absolute;
228
+ top: 50%;
229
+ right: var(--s-space-16);
230
+ transform: translateY(-50%);
231
+ }
232
+
226
233
  .resource-list-item__checkbox {
227
234
  position: absolute;
228
235
  top: 50%;
@@ -2,6 +2,7 @@ import { h, Host, } from "@stencil/core";
2
2
  import classnames from "classnames";
3
3
  import { getDesktopMediaQuery } from "../../utils";
4
4
  /**
5
+ * @slot control - Used to add a menu button to the item
5
6
  * @slot media - Media displayed inside the item (e.g. swirl-avatar)
6
7
  */
7
8
  export class SwirlResourceListItem {
@@ -56,6 +57,9 @@ export class SwirlResourceListItem {
56
57
  this.forceIconProps(this.desktopMediaQuery.matches);
57
58
  this.updateIconSize(this.desktopMediaQuery.matches);
58
59
  this.desktopMediaQuery.onchange = this.desktopMediaQueryHandler;
60
+ if (Boolean(this.menuTriggerId)) {
61
+ console.warn('[Swirl] The "menu-trigger-id" prop of swirl-resource-list-item is deprecated and will be removed with the next major release. Please use the "control" slot to add a menu button instead. https://swirl-storybook.flip-app.dev/?path=/docs/components-swirlresourcelistitem--docs');
62
+ }
59
63
  }
60
64
  disconnectedCallback() {
61
65
  var _a, _b;
@@ -83,9 +87,9 @@ export class SwirlResourceListItem {
83
87
  ? "a"
84
88
  : "button";
85
89
  const disabled = this.disabled && !Boolean(this.href);
86
- const hasMenu = Boolean(this.menuTriggerId);
90
+ const hasMenu = Boolean(this.menuTriggerId) || this.el.querySelector("[slot='control']");
87
91
  const href = this.interactive && Boolean(this.href) ? this.href : undefined;
88
- const showMenu = hasMenu && !Boolean(this.meta) && !this.selectable;
92
+ const showMenu = Boolean(this.menuTriggerId) && !Boolean(this.meta) && !this.selectable;
89
93
  const showMeta = Boolean(this.meta) && !this.selectable;
90
94
  const ariaChecked = this.selectable ? String(this.checked) : undefined;
91
95
  const role = this.interactive && this.selectable ? "checkbox" : undefined;
@@ -99,7 +103,7 @@ export class SwirlResourceListItem {
99
103
  "resource-list-item--interactive": this.interactive || this.selectable,
100
104
  "resource-list-item--selectable": this.selectable,
101
105
  });
102
- return (h(Host, { role: "row" }, h("div", { class: className, role: "gridcell" }, h(Tag, { "aria-checked": ariaChecked, "aria-disabled": disabled ? "true" : undefined, "aria-labelledby": "label", class: "resource-list-item__content", href: href, disabled: disabled, onClick: this.onClick, part: "resource-list-item__content", role: role, tabIndex: 0 }, this.hasMedia && (h("span", { class: "resource-list-item__media" }, h("slot", { name: "media" }))), h("span", { class: "resource-list-item__label-container" }, h("span", { class: "resource-list-item__label", id: "label", innerHTML: this.label }), this.description && (h("span", { class: "resource-list-item__description" }, this.description)))), this.selectable && (h("span", { "aria-hidden": "true", class: "resource-list-item__checkbox" }, h("span", { class: "resource-list-item__checkbox-icon" }, this.checked && (h("swirl-icon-check-strong", null))))), showMeta && (h("span", { class: "resource-list-item__meta" }, this.meta)), showMenu && (h("swirl-button", { "aria-disabled": disabled ? "true" : undefined, class: "resource-list-item__menu-trigger", disabled: disabled, hideLabel: true, icon: "<swirl-icon-more-horizontal></swirl-icon-more-horizontal>", id: this.menuTriggerId, intent: "primary", label: this.menuTriggerLabel, onClick: this.onMenuTriggerClick }))), this.allowDrag && (h("button", { "aria-describedby": this.dragHandleDescription, "aria-label": `${this.dragHandleLabel} "${this.label}"`, class: "resource-list-item__drag-handle", onKeyDown: this.onDragHandleKeyDown, type: "button" }, h("swirl-icon-drag-handle", { size: this.iconSize })))));
106
+ return (h(Host, { role: "row" }, h("div", { class: className, role: "gridcell" }, h(Tag, { "aria-checked": ariaChecked, "aria-disabled": disabled ? "true" : undefined, "aria-labelledby": "label", class: "resource-list-item__content", href: href, disabled: disabled, onClick: this.onClick, part: "resource-list-item__content", role: role, tabIndex: 0 }, this.hasMedia && (h("span", { class: "resource-list-item__media" }, h("slot", { name: "media" }))), h("span", { class: "resource-list-item__label-container" }, h("span", { class: "resource-list-item__label", id: "label", innerHTML: this.label }), this.description && (h("span", { class: "resource-list-item__description" }, this.description)))), this.selectable && (h("span", { "aria-hidden": "true", class: "resource-list-item__checkbox" }, h("span", { class: "resource-list-item__checkbox-icon" }, this.checked && (h("swirl-icon-check-strong", null))))), showMeta && (h("span", { class: "resource-list-item__meta" }, this.meta)), h("span", { class: "resource-list-item__control" }, h("slot", { name: "control" })), showMenu && (h("swirl-popover-trigger", { popover: this.menuTriggerId }, h("swirl-button", { "aria-disabled": disabled ? "true" : undefined, class: "resource-list-item__menu-trigger", disabled: disabled, hideLabel: true, icon: "<swirl-icon-more-horizontal></swirl-icon-more-horizontal>", intent: "primary", label: this.menuTriggerLabel, onClick: this.onMenuTriggerClick })))), this.allowDrag && (h("button", { "aria-describedby": this.dragHandleDescription, "aria-label": `${this.dragHandleLabel} "${this.label}"`, class: "resource-list-item__drag-handle", onKeyDown: this.onDragHandleKeyDown, type: "button" }, h("swirl-icon-drag-handle", { size: this.iconSize })))));
103
107
  }
104
108
  static get is() { return "swirl-resource-list-item"; }
105
109
  static get encapsulation() { return "scoped"; }
@@ -29,6 +29,7 @@ describe("swirl-resource-list-item", () => {
29
29
  </span>
30
30
  </span>
31
31
  </button>
32
+ <span class="resource-list-item__control"></span>
32
33
  </div>
33
34
  </swirl-resource-list-item>
34
35
  `);
@@ -1,49 +1,48 @@
1
1
  import { generateStoryElement } from "../../utils";
2
2
  import Docs from "./swirl-resource-list-item.mdx";
3
3
  export default {
4
+ argTypes: {
5
+ menuTriggerId: {
6
+ description: "**Deprecated!** Please use the `control` slot to render an item control.",
7
+ },
8
+ menuTriggerLabel: {
9
+ description: "**Deprecated!** Please use the `control` slot to render an item control.",
10
+ },
11
+ },
4
12
  component: "swirl-resource-list-item",
5
13
  tags: ["autodocs"],
6
14
  parameters: {
7
15
  docs: {
8
16
  page: Docs,
9
- source: {
10
- code: `<swirl-resource-list-item
11
- description="With a description"
12
- label="This is a resource item"
13
- media="<swirl-avatar label=&quot;John Doe&quot; src=&quot;https://picsum.photos/id/433/144/144&quot;></swirl-avatar>"
14
- menu-trigger-id="trigger"
15
- >
16
- </swirl-resource-list-item>
17
-
18
- <swirl-popover label="Popover" popover-id="popover" trigger="trigger">
19
- <swirl-action-list>
20
- <swirl-action-list-item
21
- icon="<swirl-icon-mention></swirl-icon-mention>"
22
- label="Action item 1"
23
- ></swirl-action-list-item>
24
- <swirl-action-list-item
25
- icon="<swirl-icon-mention></swirl-icon-mention>"
26
- label="Action item 2"
27
- ></swirl-action-list-item>
28
- </swirl-action-list>
29
- </swirl-popover>`,
30
- },
31
17
  },
32
18
  },
33
19
  title: "Components/SwirlResourceListItem",
34
20
  };
35
21
  const Template = (args) => {
36
22
  const container = document.createElement("div");
23
+ const list = document.createElement("div");
37
24
  const popover = document.createElement("swirl-popover");
25
+ const control = document.createElement("span");
38
26
  const element = generateStoryElement("swirl-resource-list-item", args);
39
27
  element.innerHTML = `
40
- <swirl-avatar label="Jane Doe" src="https://avatars.dicebear.com/api/adventurer-neutral/a.svg?size=144" slot="media"></swirl-avatar>
28
+ <swirl-avatar label="Jane Doe" src="https://avatars.dicebear.com/api/adventurer-neutral/a.svg?size=144" slot="media"></swirl-avatar>
41
29
  `;
42
- container.setAttribute("aria-label", "List");
43
- container.setAttribute("role", "grid");
30
+ control.slot = "control";
31
+ control.innerHTML = `
32
+ <swirl-popover-trigger popover="popover">
33
+ <swirl-button
34
+ hide-label
35
+ icon="<swirl-icon-more-horizontal></swirl-icon-more-horizontal>"
36
+ intent="primary"
37
+ label="Show menu"></swirl-button>
38
+ </swirl-popover-trigger>
39
+ `;
40
+ list.setAttribute("aria-label", "List");
41
+ list.setAttribute("role", "grid");
42
+ popover.id = "popover";
43
+ popover.animation = "scale-in-y";
44
44
  popover.label = "Options";
45
- popover.popoverId = "popover";
46
- popover.trigger = "trigger";
45
+ popover.placement = "bottom-end";
47
46
  popover.innerHTML = `
48
47
  <swirl-action-list>
49
48
  <swirl-action-list-item
@@ -56,12 +55,13 @@ const Template = (args) => {
56
55
  ></swirl-action-list-item>
57
56
  </swirl-action-list>
58
57
  `;
59
- container.append(element, popover);
58
+ element.append(" ", control, "\n ");
59
+ list.append("\n ", element, "\n ");
60
+ container.append("\n ", list, "\n ", popover, "\n");
60
61
  return container;
61
62
  };
62
63
  export const SwirlResourceListItem = Template.bind({});
63
64
  SwirlResourceListItem.args = {
64
65
  description: "With a description",
65
66
  label: "This is a resource item",
66
- menuTriggerId: "trigger",
67
67
  };
@@ -78,9 +78,9 @@ export class SwirlSelect {
78
78
  "select--inline": this.inline,
79
79
  "select--multi": this.multiSelect,
80
80
  });
81
- return (h(Host, { onKeyDown: this.onKeyDown }, h("div", { class: className }, h("input", { "aria-describedby": this.swirlAriaDescribedby, "aria-disabled": this.disabled ? "true" : undefined, "aria-invalid": ariaInvalid, class: "select__input", disabled: this.disabled, id: `trigger-${this.selectId}`, readOnly: true, type: "text", value: label }), h("span", { class: "select__multi-select-values" }, (_c = (_b = this.value) === null || _b === void 0 ? void 0 : _b.map((value) => this.options.find((option) => option.value === value))) === null || _c === void 0 ? void 0 : _c.map((option) => (h("swirl-tag", { "aria-hidden": "true", label: option === null || option === void 0 ? void 0 : option.label,
81
+ return (h(Host, { onKeyDown: this.onKeyDown }, h("div", { class: className }, h("swirl-popover-trigger", { popover: this.popover, setAriaAttributes: false }, h("input", { "aria-describedby": this.swirlAriaDescribedby, "aria-disabled": this.disabled ? "true" : undefined, "aria-invalid": ariaInvalid, class: "select__input", disabled: this.disabled, readOnly: true, type: "text", value: label })), h("span", { class: "select__multi-select-values" }, (_c = (_b = this.value) === null || _b === void 0 ? void 0 : _b.map((value) => this.options.find((option) => option.value === value))) === null || _c === void 0 ? void 0 : _c.map((option) => (h("swirl-tag", { "aria-hidden": "true", label: option === null || option === void 0 ? void 0 : option.label,
82
82
  // eslint-disable-next-line react/jsx-no-bind
83
- onRemove: () => this.unselectOption(option === null || option === void 0 ? void 0 : option.value), removable: !this.disabled && this.allowDeselect })))), h("span", { class: "select__indicator" }, this.open ? (h("swirl-icon-expand-less", null)) : (h("swirl-icon-expand-more", null))), h("swirl-popover", { animation: "scale-in-y", class: "select__popover", label: this.label, offset: [0, offset], onPopoverClose: this.onClose, onPopoverOpen: this.onOpen, popoverId: `select-options-${this.selectId}`, ref: (el) => (this.popover = el), trigger: `trigger-${this.selectId}`, useContainerWidth: "swirl-form-control" }, h("swirl-option-list", { allowDeselect: this.allowDeselect, onValueChange: this.select, multiSelect: this.multiSelect, value: this.value }, h("slot", { onSlotchange: this.onSlotChange }))))));
83
+ onRemove: () => this.unselectOption(option === null || option === void 0 ? void 0 : option.value), removable: !this.disabled && this.allowDeselect })))), h("span", { class: "select__indicator" }, this.open ? (h("swirl-icon-expand-less", null)) : (h("swirl-icon-expand-more", null))), h("swirl-popover", { animation: "scale-in-y", class: "select__popover", id: `select-options-${this.selectId}`, label: this.label, offset: [0, offset], onPopoverClose: this.onClose, onPopoverOpen: this.onOpen, ref: (el) => (this.popover = el), useContainerWidth: "swirl-form-control" }, h("swirl-option-list", { allowDeselect: this.allowDeselect, onValueChange: this.select, multiSelect: this.multiSelect, value: this.value }, h("slot", { onSlotchange: this.onSlotChange }))))));
84
84
  }
85
85
  static get is() { return "swirl-select"; }
86
86
  static get encapsulation() { return "scoped"; }
@@ -26,12 +26,14 @@ describe("swirl-select", () => {
26
26
  expect(page.root).toEqualHtml(`
27
27
  <swirl-select invalid="true" label="Select" required="true">
28
28
  <div class="select select--placement-undefined">
29
- <input aria-invalid="true" class="select__input" id="trigger-${page.root.selectId}" readonly="" type="text" value="">
29
+ <swirl-popover-trigger>
30
+ <input aria-invalid="true" class="select__input" readonly="" type="text" value="">
31
+ </swirl-popover-trigger>
30
32
  <span class="select__multi-select-values"></span>
31
33
  <span class="select__indicator">
32
34
  <swirl-icon-expand-more></swirl-icon-expand-more>
33
35
  </span>
34
- <swirl-popover animation="scale-in-y" class="select__popover" label="Select" popoverid="select-options-${page.root.selectId}" trigger="trigger-${page.root.selectId}" usecontainerwidth="swirl-form-control">
36
+ <swirl-popover animation="scale-in-y" class="select__popover" id="select-options-${page.root.selectId}" label="Select" usecontainerwidth="swirl-form-control">
35
37
  <swirl-option-list allowdeselect="">
36
38
  <swirl-option-list-item label="This is an option 1" value="1"></swirl-option-list-item>
37
39
  <swirl-option-list-item label="This is an option 2" value="2"></swirl-option-list-item>
@@ -46,6 +46,7 @@ export class FileManager {
46
46
  };
47
47
  this.selectedDirectory = undefined;
48
48
  this.selectedFile = undefined;
49
+ this.sortMenu = undefined;
49
50
  }
50
51
  renderNavigation() {
51
52
  const items = Boolean(this.selectedDirectory)
@@ -57,14 +58,15 @@ export class FileManager {
57
58
  }
58
59
  render() {
59
60
  var _a, _b;
60
- return (h(Host, null, h("swirl-app-layout", { appName: "Documents", backToNavigationViewButtonLabel: "Back to documents list", ctaIcon: "<swirl-icon-add></swirl-icon-add>", ctaLabel: "Upload file", navigationLabel: "Documents", onNavigationBackButtonClick: this.resetSelectedDirectory, ref: (el) => (this.layout = el), sidebarCloseButtonLabel: "Close file info", sidebarHeading: "File info", showNavigationBackButton: Boolean(this.selectedDirectory), transitionStyle: "dialog" }, h("swirl-resource-list", { label: "Documents", slot: "navigation" }, this.renderNavigation()), h("swirl-button", { id: "sort-button", label: "Sort items", slot: "navigation-controls" }), h("swirl-stack", { orientation: "horizontal", slot: "app-bar" }, h("swirl-stack", null, h("swirl-heading", { as: "h2", level: 4, text: (_a = this.selectedFile) === null || _a === void 0 ? void 0 : _a.name }), h("swirl-text", { color: "subdued", truncate: true }, (_b = this.selectedFile) === null || _b === void 0 ? void 0 : _b.description))), Boolean(this.selectedFile) ? (h("swirl-file-viewer", { file: this.selectedFile.url, slot: "content", type: this.selectedFile.type })) : (h("swirl-box", { cover: true, centerBlock: true, centerInline: true, padding: "16", slot: "content" }, h("swirl-empty-state", { heading: "Nothing to see here.", illustration: "/images/empty-state-1.svg" }, "Please select a file from the list."))), h("div", { slot: "app-bar-controls" }, this.selectedFile && (h("swirl-button", { "hide-label": true, class: "info-button", icon: "<swirl-icon-info></swirl-icon-info>", label: "Open file info", onClick: this.toggleSidebar }))), h("swirl-box", { padding: "16", slot: "sidebar" }, h("swirl-text", { color: "subdued", weight: "medium" }, "File info goes here \u2026"))), h("swirl-popover", { label: "Sort items", popoverId: "sort-menu", trigger: "sort-button" }, h("swirl-option-list", { value: ["ascending"] }, h("swirl-option-list-item", { icon: "<swirl-icon-expand-less></swirl-icon-expand-less>", label: "Ascending", value: "ascending" }), h("swirl-option-list-item", { icon: "<swirl-icon-expand-more></swirl-icon-expand-more>", label: "Descending", value: "descending" }), h("swirl-option-list-item", { icon: "<swirl-icon-time-outlined></swirl-icon-time-outlined>", label: "By date", value: "date" })))));
61
+ return (h(Host, null, h("swirl-app-layout", { appName: "Documents", backToNavigationViewButtonLabel: "Back to documents list", ctaIcon: "<swirl-icon-add></swirl-icon-add>", ctaLabel: "Upload file", navigationLabel: "Documents", onNavigationBackButtonClick: this.resetSelectedDirectory, ref: (el) => (this.layout = el), sidebarCloseButtonLabel: "Close file info", sidebarHeading: "File info", showNavigationBackButton: Boolean(this.selectedDirectory), transitionStyle: "dialog" }, h("swirl-resource-list", { label: "Documents", slot: "navigation" }, this.renderNavigation()), h("swirl-popover-trigger", { popover: this.sortMenu, slot: "navigation-controls" }, h("swirl-button", { label: "Sort items" })), h("swirl-stack", { orientation: "horizontal", slot: "app-bar" }, h("swirl-stack", null, h("swirl-heading", { as: "h2", level: 4, text: (_a = this.selectedFile) === null || _a === void 0 ? void 0 : _a.name }), h("swirl-text", { color: "subdued", truncate: true }, (_b = this.selectedFile) === null || _b === void 0 ? void 0 : _b.description))), Boolean(this.selectedFile) ? (h("swirl-file-viewer", { file: this.selectedFile.url, slot: "content", type: this.selectedFile.type })) : (h("swirl-box", { cover: true, centerBlock: true, centerInline: true, padding: "16", slot: "content" }, h("swirl-empty-state", { heading: "Nothing to see here.", illustration: "/images/empty-state-1.svg" }, "Please select a file from the list."))), h("div", { slot: "app-bar-controls" }, this.selectedFile && (h("swirl-button", { "hide-label": true, class: "info-button", icon: "<swirl-icon-info></swirl-icon-info>", label: "Open file info", onClick: this.toggleSidebar }))), h("swirl-box", { padding: "16", slot: "sidebar" }, h("swirl-text", { color: "subdued", weight: "medium" }, "File info goes here \u2026"))), h("swirl-popover", { label: "Sort items", ref: (el) => (this.sortMenu = el) }, h("swirl-option-list", { value: ["ascending"] }, h("swirl-option-list-item", { icon: "<swirl-icon-expand-less></swirl-icon-expand-less>", label: "Ascending", value: "ascending" }), h("swirl-option-list-item", { icon: "<swirl-icon-expand-more></swirl-icon-expand-more>", label: "Descending", value: "descending" }), h("swirl-option-list-item", { icon: "<swirl-icon-time-outlined></swirl-icon-time-outlined>", label: "By date", value: "date" })))));
61
62
  }
62
63
  static get is() { return "file-manager"; }
63
64
  static get encapsulation() { return "shadow"; }
64
65
  static get states() {
65
66
  return {
66
67
  "selectedDirectory": {},
67
- "selectedFile": {}
68
+ "selectedFile": {},
69
+ "sortMenu": {}
68
70
  };
69
71
  }
70
72
  }