@oscarpalmer/oui 0.17.0 → 0.19.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 (72) hide show
  1. package/dist/css/badge.css +13 -13
  2. package/dist/css/button.css +9 -9
  3. package/dist/css/color.css +99 -99
  4. package/dist/css/content.css +10 -12
  5. package/dist/css/flex.css +39 -39
  6. package/dist/css/form.css +47 -60
  7. package/dist/css/message.css +10 -6
  8. package/dist/css/reset.css +178 -57
  9. package/dist/css/table.css +4 -4
  10. package/dist/css/tooltip.css +26 -1
  11. package/dist/js/attributable.full.js +36 -0
  12. package/dist/js/attributable.js +30 -45
  13. package/dist/js/floatable.full.js +398 -0
  14. package/dist/js/floatable.js +254 -169
  15. package/dist/js/focus-trap/embedded.full.js +408 -0
  16. package/dist/js/focus-trap/embedded.js +131 -131
  17. package/dist/js/focus-trap/standalone.full.js +447 -0
  18. package/dist/js/focus-trap/standalone.js +4 -4
  19. package/dist/js/index.js +3 -4
  20. package/dist/js/oui.full.js +1573 -0
  21. package/dist/js/popover.full.js +760 -0
  22. package/dist/js/popover.js +84 -163
  23. package/dist/js/splitter.full.js +769 -0
  24. package/dist/js/splitter.js +264 -246
  25. package/dist/js/tooltip.full.js +613 -0
  26. package/dist/js/tooltip.js +160 -151
  27. package/package.json +35 -63
  28. package/src/css/a11y.scss +1 -1
  29. package/src/css/badge.scss +23 -19
  30. package/src/css/button.scss +9 -9
  31. package/src/css/color.scss +99 -99
  32. package/src/css/content.scss +6 -9
  33. package/src/css/flex.scss +21 -20
  34. package/src/css/form.scss +47 -62
  35. package/src/css/message.scss +11 -12
  36. package/src/css/mixins.scss +16 -10
  37. package/src/css/popover.scss +2 -2
  38. package/src/css/reset.scss +181 -55
  39. package/src/css/splitter.scss +15 -13
  40. package/src/css/table.scss +11 -11
  41. package/src/css/tooltip.scss +31 -2
  42. package/src/js/attributable.ts +3 -10
  43. package/src/js/floatable.ts +370 -141
  44. package/src/js/focus-trap/embedded.ts +141 -74
  45. package/src/js/focus-trap/standalone.ts +4 -4
  46. package/src/js/index.ts +1 -0
  47. package/src/js/popover.ts +52 -122
  48. package/src/js/splitter.ts +248 -131
  49. package/src/js/tooltip.ts +143 -68
  50. package/types/floatable.d.ts +17 -10
  51. package/types/focus-trap/embedded.d.ts +18 -5
  52. package/types/index.d.ts +1 -0
  53. package/types/popover.d.ts +2 -0
  54. package/types/splitter.d.ts +13 -1
  55. package/types/tooltip.d.ts +2 -1
  56. package/dist/css/value.css +0 -1
  57. package/dist/js/attributable.cjs +0 -51
  58. package/dist/js/floatable.cjs +0 -176
  59. package/dist/js/focus-trap/embedded.cjs +0 -150
  60. package/dist/js/focus-trap/standalone.cjs +0 -8
  61. package/dist/js/index.cjs +0 -6
  62. package/dist/js/popover.cjs +0 -166
  63. package/dist/js/splitter.cjs +0 -272
  64. package/dist/js/tooltip.cjs +0 -166
  65. package/types/attributable.d.cts +0 -5
  66. package/types/floatable.d.cts +0 -20
  67. package/types/focus-trap/embedded.d.cts +0 -15
  68. package/types/focus-trap/standalone.d.cts +0 -3
  69. package/types/index.d.cts +0 -14
  70. package/types/popover.d.cts +0 -14
  71. package/types/splitter.d.cts +0 -10
  72. package/types/tooltip.d.cts +0 -3
@@ -1,166 +1,87 @@
1
- import { isNullableOrWhitespace } from "@oscarpalmer/atoms/is";
2
- import { on } from "@oscarpalmer/toretto/event";
3
- import { findAncestor } from "@oscarpalmer/toretto/find";
4
- import { getFocusable } from "@oscarpalmer/toretto/focusable";
5
- import { Floatable, deactivate, activate } from "./floatable.js";
1
+ import { Floatable } from "./floatable.js";
6
2
  import { createFocusTrap } from "./focus-trap/embedded.js";
7
- const mapped = /* @__PURE__ */ new Map();
8
- let index = 0;
9
- class OuiPopoverElement extends HTMLElement {
10
- #floatable;
11
- #focusTrap;
12
- constructor() {
13
- super();
14
- const content = this.querySelector(":scope > [oui-popover-content]");
15
- const toggle2 = this.querySelector(":scope > [oui-popover-toggle]");
16
- if (!(content instanceof HTMLElement)) {
17
- throw new Error(
18
- "A oui-popover must have a direct child element with the [oui-popover-content]-attribute"
19
- );
20
- }
21
- if (!(toggle2 instanceof HTMLButtonElement)) {
22
- throw new Error(
23
- "A oui-popover must have a direct child element with the [oui-popover-toggle]-attribute and be a button"
24
- );
25
- }
26
- content.hidden = true;
27
- content.setAttribute("role", "dialog");
28
- content.setAttribute("oui-focus-trap", "");
29
- content.setAttribute("oui-focus-trap-noescape", "");
30
- if (isNullableOrWhitespace(content.id)) {
31
- content.setAttribute("id", `oui-popover-content-${++index}`);
32
- }
33
- toggle2.setAttribute("aria-controls", content.id);
34
- toggle2.setAttribute("aria-haspopup", "dialog");
35
- this.#floatable = new Floatable(
36
- toggle2,
37
- content,
38
- "position",
39
- "below-start",
40
- false
41
- );
42
- this.#focusTrap = createFocusTrap(content);
43
- mapped.set(toggle2, this.#floatable);
44
- mapped.set(content, this.#floatable);
45
- }
46
- close() {
47
- this.hidePopover();
48
- }
49
- hidePopover() {
50
- if (this.#floatable.active) {
51
- closeAbove(this.#floatable.content);
52
- deactivate(this.#floatable, active, order);
53
- this.#floatable.anchor.focus();
54
- }
55
- }
56
- open() {
57
- this.showPopover();
58
- }
59
- showPopover() {
60
- if (!this.#floatable.active) {
61
- toggle(this.#floatable.anchor);
62
- }
63
- }
64
- toggle() {
65
- this.togglePopover();
66
- }
67
- togglePopover(options) {
68
- if (typeof options === "boolean") {
69
- if (options === true) {
70
- this.showPopover();
71
- } else {
72
- this.hidePopover();
73
- }
74
- return options;
75
- }
76
- if (this.#floatable.active) {
77
- this.hidePopover();
78
- return false;
79
- }
80
- this.showPopover();
81
- return true;
82
- }
83
- }
84
- function closeAll() {
85
- for (const floatable of active) {
86
- deactivate(floatable, active, order);
87
- }
88
- }
89
- function closeAbove(element) {
90
- const index2 = order.findIndex(
91
- (floatable) => floatable.anchor === element || floatable.content === element
92
- );
93
- if (index2 === -1 || index2 === order.length - 1) {
94
- return;
95
- }
96
- while (index2 < order.length - 1) {
97
- const floatable = order.pop();
98
- if (floatable != null) {
99
- deactivate(floatable, active, order);
100
- }
101
- }
102
- focus(order[index2].content);
103
- }
3
+ import { getFocusable } from "@oscarpalmer/toretto/focusable";
4
+ import { isNullableOrWhitespace } from "@oscarpalmer/atoms/is";
5
+ var index = 0;
6
+ var OuiPopoverElement = class extends HTMLElement {
7
+ #floatable;
8
+ #focusTrap;
9
+ constructor() {
10
+ super();
11
+ const content = this.querySelector(SELECTOR_CONTENT);
12
+ const toggle = this.querySelector(SELECTOR_TOGGLE);
13
+ if (!(content instanceof HTMLElement)) throw new Error("A oui-popover must have a direct child element with the [oui-popover-content]-attribute");
14
+ if (!(toggle instanceof HTMLButtonElement)) throw new Error("A oui-popover must have a direct child element with the [oui-popover-toggle]-attribute and be a button");
15
+ content.hidden = true;
16
+ content.setAttribute("role", "dialog");
17
+ content.setAttribute("aria-modal", "true");
18
+ if (isNullableOrWhitespace(content.id)) content.setAttribute("id", `${ATTRIBUTE_ID_PREFIX}_${++index}`);
19
+ toggle.setAttribute("aria-controls", content.id);
20
+ toggle.setAttribute("aria-haspopup", "dialog");
21
+ this.#floatable = new Floatable({
22
+ content,
23
+ anchor: toggle,
24
+ defaultPosition: "below-start",
25
+ interactive: true,
26
+ positionAttribute: "position",
27
+ preferAbove: false,
28
+ onAfter: (active) => {
29
+ if (active) focus(content);
30
+ else if (!this.#floatable.ignoreFocus) toggle.focus();
31
+ }
32
+ });
33
+ this.#focusTrap = createFocusTrap(content, { noescape: true });
34
+ POPOVERS.set(toggle, this.#floatable);
35
+ POPOVERS.set(content, this.#floatable);
36
+ }
37
+ close() {
38
+ this.hidePopover();
39
+ }
40
+ connectedCallback() {
41
+ this.#floatable.enable();
42
+ this.#focusTrap.connect();
43
+ }
44
+ disconnectedCallback() {
45
+ this.#floatable.disable();
46
+ this.#focusTrap.disconnect();
47
+ }
48
+ hidePopover() {
49
+ if (this.#floatable.active && this.isConnected) this.#floatable.toggle(false);
50
+ }
51
+ open() {
52
+ this.showPopover();
53
+ }
54
+ showPopover() {
55
+ if (!this.#floatable.active && this.isConnected) this.#floatable.toggle(true);
56
+ }
57
+ toggle() {
58
+ this.togglePopover();
59
+ }
60
+ togglePopover(options) {
61
+ if (typeof options === "boolean") {
62
+ if (options === true) this.showPopover();
63
+ else this.hidePopover();
64
+ return options;
65
+ }
66
+ if (this.#floatable.active) {
67
+ this.hidePopover();
68
+ return false;
69
+ }
70
+ this.showPopover();
71
+ return true;
72
+ }
73
+ };
104
74
  function focus(content) {
105
- let target = getFocusable(content)[0];
106
- if (!(target instanceof HTMLElement)) {
107
- target = content;
108
- }
109
- requestAnimationFrame(() => {
110
- target.focus();
111
- });
112
- }
113
- function onClick(event) {
114
- const related = findAncestor(
115
- event.target,
116
- "[oui-popover-toggle], [oui-popover-content]"
117
- );
118
- if (!(related instanceof HTMLElement)) {
119
- closeAll();
120
- } else if (related.hasAttribute("oui-popover-content")) {
121
- closeAbove(related);
122
- } else {
123
- toggle(related);
124
- }
75
+ let target = getFocusable(content)[0];
76
+ if (!(target instanceof HTMLElement)) target = content;
77
+ requestAnimationFrame(() => {
78
+ target.focus();
79
+ });
125
80
  }
126
- function onKeydown(event) {
127
- if (event.key !== "Escape" || order.length === 0) {
128
- return;
129
- }
130
- const related = findAncestor(event.target, "[oui-popover-content]");
131
- if (!(related instanceof HTMLElement)) {
132
- return;
133
- }
134
- closeAbove(related);
135
- const floatable = mapped.get(related);
136
- if (floatable != null) {
137
- deactivate(floatable, active, order);
138
- floatable.anchor.focus();
139
- }
140
- }
141
- function toggle(anchor) {
142
- const content = findAncestor(anchor, "[oui-popover-content]");
143
- if (content instanceof HTMLElement) {
144
- closeAbove(content);
145
- } else {
146
- closeAll();
147
- }
148
- const floatable = mapped.get(anchor);
149
- if (floatable == null) {
150
- return;
151
- }
152
- if (floatable.active) {
153
- deactivate(floatable, active, order);
154
- } else {
155
- activate(floatable, active, order);
156
- focus(floatable.content);
157
- }
158
- }
159
- customElements.define("oui-popover", OuiPopoverElement);
160
- on(document, "click", onClick);
161
- on(document, "keydown", onKeydown);
162
- const active = /* @__PURE__ */ new Set();
163
- const order = [];
164
- export {
165
- OuiPopoverElement
166
- };
81
+ var ATTRIBUTE_ID_PREFIX = "oui_popover_content_";
82
+ var POPOVERS = /* @__PURE__ */ new Map();
83
+ var SELECTOR = "oui-popover";
84
+ var SELECTOR_CONTENT = `:scope > [${SELECTOR}-content]`;
85
+ var SELECTOR_TOGGLE = `:scope > [${SELECTOR}-toggle]`;
86
+ customElements.define(SELECTOR, OuiPopoverElement);
87
+ export { OuiPopoverElement };