@schukai/monster 4.137.8 → 4.138.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 (140) hide show
  1. package/package.json +1 -1
  2. package/source/components/accessibility/stylesheet/locale-picker.mjs +1 -1
  3. package/source/components/content/stylesheet/camera-capture.mjs +1 -1
  4. package/source/components/content/stylesheet/copy.mjs +1 -1
  5. package/source/components/content/stylesheet/fetch-box.mjs +1 -1
  6. package/source/components/content/stylesheet/viewer.mjs +1 -1
  7. package/source/components/content/viewer/stylesheet/html.mjs +1 -1
  8. package/source/components/content/viewer/stylesheet/message.mjs +1 -1
  9. package/source/components/data/stylesheet/kpi-tile.mjs +1 -1
  10. package/source/components/data/stylesheet/metric-graph.mjs +1 -1
  11. package/source/components/data/stylesheet/metric.mjs +1 -1
  12. package/source/components/datatable/columnbar.mjs +11 -8
  13. package/source/components/datatable/pagination.mjs +9 -19
  14. package/source/components/datatable/stylesheet/change-button.mjs +1 -1
  15. package/source/components/datatable/stylesheet/column-bar.mjs +1 -1
  16. package/source/components/datatable/stylesheet/dataset.mjs +1 -1
  17. package/source/components/datatable/stylesheet/datasource.mjs +1 -1
  18. package/source/components/datatable/stylesheet/datatable.mjs +1 -1
  19. package/source/components/datatable/stylesheet/embedded-pagination.mjs +1 -1
  20. package/source/components/datatable/stylesheet/filter-button.mjs +1 -1
  21. package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +1 -1
  22. package/source/components/datatable/stylesheet/filter-date-range.mjs +1 -1
  23. package/source/components/datatable/stylesheet/filter-range.mjs +1 -1
  24. package/source/components/datatable/stylesheet/filter-select.mjs +1 -1
  25. package/source/components/datatable/stylesheet/filter.mjs +1 -1
  26. package/source/components/datatable/stylesheet/pagination.mjs +1 -1
  27. package/source/components/datatable/stylesheet/save-button.mjs +1 -1
  28. package/source/components/datatable/stylesheet/status.mjs +1 -1
  29. package/source/components/form/button-bar.mjs +7 -1054
  30. package/source/components/form/control-bar.mjs +1162 -0
  31. package/source/components/form/style/button-bar.pcss +9 -4
  32. package/source/components/form/style/confirm-button.pcss +6 -1
  33. package/source/components/form/style/control-bar.pcss +91 -0
  34. package/source/components/form/stylesheet/action-button.mjs +1 -1
  35. package/source/components/form/stylesheet/button-bar.mjs +1 -1
  36. package/source/components/form/stylesheet/button.mjs +1 -1
  37. package/source/components/form/stylesheet/buy-box.mjs +1 -1
  38. package/source/components/form/stylesheet/cart-control.mjs +1 -1
  39. package/source/components/form/stylesheet/confirm-button.mjs +1 -1
  40. package/source/components/form/stylesheet/context-error.mjs +1 -1
  41. package/source/components/form/stylesheet/context-help.mjs +1 -1
  42. package/source/components/form/stylesheet/control-bar.mjs +38 -0
  43. package/source/components/form/stylesheet/digits.mjs +1 -1
  44. package/source/components/form/stylesheet/dropzone.mjs +1 -1
  45. package/source/components/form/stylesheet/field-layout.mjs +1 -1
  46. package/source/components/form/stylesheet/field-set.mjs +1 -1
  47. package/source/components/form/stylesheet/form.mjs +1 -1
  48. package/source/components/form/stylesheet/input-group.mjs +1 -1
  49. package/source/components/form/stylesheet/invalid.mjs +1 -1
  50. package/source/components/form/stylesheet/login.mjs +1 -1
  51. package/source/components/form/stylesheet/message-state-button.mjs +1 -1
  52. package/source/components/form/stylesheet/password.mjs +1 -1
  53. package/source/components/form/stylesheet/popper-button.mjs +1 -1
  54. package/source/components/form/stylesheet/quantity.mjs +1 -1
  55. package/source/components/form/stylesheet/register-wizard.mjs +1 -1
  56. package/source/components/form/stylesheet/repeat-field-set-items.mjs +1 -1
  57. package/source/components/form/stylesheet/repeat-field-set.mjs +1 -1
  58. package/source/components/form/stylesheet/select.mjs +1 -1
  59. package/source/components/form/stylesheet/sheet.mjs +1 -1
  60. package/source/components/form/stylesheet/state-button.mjs +1 -1
  61. package/source/components/form/stylesheet/toggle-switch.mjs +1 -1
  62. package/source/components/form/stylesheet/tree-select.mjs +1 -1
  63. package/source/components/form/stylesheet/variant-select.mjs +1 -1
  64. package/source/components/form/stylesheet/wizard.mjs +1 -1
  65. package/source/components/host/stylesheet/call-button.mjs +1 -1
  66. package/source/components/host/stylesheet/host.mjs +1 -1
  67. package/source/components/host/stylesheet/toggle-button.mjs +1 -1
  68. package/source/components/layout/stylesheet/board.mjs +1 -1
  69. package/source/components/layout/stylesheet/collapse.mjs +1 -1
  70. package/source/components/layout/stylesheet/details.mjs +1 -1
  71. package/source/components/layout/stylesheet/full-screen.mjs +1 -1
  72. package/source/components/layout/stylesheet/iframe.mjs +1 -1
  73. package/source/components/layout/stylesheet/overlay.mjs +1 -1
  74. package/source/components/layout/stylesheet/panel.mjs +1 -1
  75. package/source/components/layout/stylesheet/popper.mjs +1 -1
  76. package/source/components/layout/stylesheet/slider.mjs +1 -1
  77. package/source/components/layout/stylesheet/split-panel.mjs +1 -1
  78. package/source/components/layout/stylesheet/tabs.mjs +1 -1
  79. package/source/components/layout/stylesheet/width-toggle.mjs +1 -1
  80. package/source/components/navigation/site-navigation.mjs +4 -2
  81. package/source/components/navigation/stylesheet/site-navigation.mjs +1 -1
  82. package/source/components/navigation/stylesheet/table-of-content.mjs +1 -1
  83. package/source/components/navigation/stylesheet/wizard-navigation.mjs +1 -1
  84. package/source/components/notify/stylesheet/message.mjs +1 -1
  85. package/source/components/notify/stylesheet/notify.mjs +1 -1
  86. package/source/components/state/stylesheet/log.mjs +1 -1
  87. package/source/components/state/stylesheet/state.mjs +1 -1
  88. package/source/components/state/stylesheet/thread.mjs +1 -1
  89. package/source/components/style/accessibility.css +6 -6
  90. package/source/components/style/badge.css +49 -49
  91. package/source/components/style/border.css +4 -4
  92. package/source/components/style/button.css +96 -92
  93. package/source/components/style/card.css +21 -15
  94. package/source/components/style/common.css +20 -11
  95. package/source/components/style/control.css +3 -3
  96. package/source/components/style/data-grid.css +82 -82
  97. package/source/components/style/floating-ui.css +25 -25
  98. package/source/components/style/form.css +12 -10
  99. package/source/components/style/host.css +3 -3
  100. package/source/components/style/icons.css +266 -266
  101. package/source/components/style/link.css +4 -2
  102. package/source/components/style/normalize.css +2 -2
  103. package/source/components/style/popper.css +21 -21
  104. package/source/components/style/property.css +3 -2
  105. package/source/components/style/ripple.css +4 -4
  106. package/source/components/style/skeleton.css +10 -10
  107. package/source/components/style/spinner.css +1 -1
  108. package/source/components/style/table.css +10 -10
  109. package/source/components/style/theme.css +2 -2
  110. package/source/components/style/typography.css +29 -29
  111. package/source/components/stylesheet/accessibility.mjs +1 -1
  112. package/source/components/stylesheet/badge.mjs +1 -1
  113. package/source/components/stylesheet/border.mjs +1 -1
  114. package/source/components/stylesheet/button.mjs +1 -1
  115. package/source/components/stylesheet/card.mjs +1 -1
  116. package/source/components/stylesheet/common.mjs +1 -1
  117. package/source/components/stylesheet/control.mjs +1 -1
  118. package/source/components/stylesheet/data-grid.mjs +1 -1
  119. package/source/components/stylesheet/floating-ui.mjs +1 -1
  120. package/source/components/stylesheet/form.mjs +1 -1
  121. package/source/components/stylesheet/host.mjs +1 -1
  122. package/source/components/stylesheet/icons.mjs +1 -1
  123. package/source/components/stylesheet/link.mjs +1 -1
  124. package/source/components/stylesheet/popper.mjs +1 -1
  125. package/source/components/stylesheet/ripple.mjs +1 -1
  126. package/source/components/stylesheet/skeleton.mjs +1 -1
  127. package/source/components/stylesheet/spinner.mjs +1 -1
  128. package/source/components/stylesheet/table.mjs +1 -1
  129. package/source/components/stylesheet/theme.mjs +1 -1
  130. package/source/components/stylesheet/typography.mjs +1 -1
  131. package/source/components/time/stylesheet/day.mjs +1 -1
  132. package/source/components/time/stylesheet/month-calendar.mjs +1 -1
  133. package/source/components/time/timeline/stylesheet/appointment.mjs +1 -1
  134. package/source/components/time/timeline/stylesheet/segment.mjs +1 -1
  135. package/source/components/tree-menu/stylesheet/tree-menu.mjs +1 -1
  136. package/source/dom/resource/data.mjs +5 -2
  137. package/source/monster.mjs +1 -0
  138. package/test/cases/components/form/button-bar.mjs +27 -0
  139. package/test/cases/components/form/confirm-button.mjs +14 -0
  140. package/test/cases/components/form/control-bar.mjs +230 -0
@@ -0,0 +1,230 @@
1
+ import * as chai from "chai";
2
+ import { chaiDom } from "../../../util/chai-dom.mjs";
3
+ import { initJSDOM } from "../../../util/jsdom.mjs";
4
+ import { ResizeObserverMock } from "../../../util/resize-observer.mjs";
5
+
6
+ let expect = chai.expect;
7
+ chai.use(chaiDom);
8
+
9
+ const html = `
10
+ <div id="test1">
11
+ <monster-control-bar id="bar">
12
+ <input id="query" type="search">
13
+ <select id="mode"><option>All</option></select>
14
+ <button id="apply">Apply</button>
15
+ </monster-control-bar>
16
+ <monster-control-bar
17
+ id="bar-right"
18
+ data-monster-option-layout-alignment="right"
19
+ ></monster-control-bar>
20
+ </div>
21
+ `;
22
+
23
+ let ControlBar;
24
+
25
+ describe("ControlBar", function () {
26
+ before(function (done) {
27
+ this.timeout(5000);
28
+ initJSDOM()
29
+ .then(() => {
30
+ import("../../../../source/components/form/control-bar.mjs")
31
+ .then((m) => {
32
+ ControlBar = m.ControlBar;
33
+ done();
34
+ })
35
+ .catch((e) => done(e));
36
+ })
37
+ .catch((e) => done(e));
38
+ });
39
+
40
+ beforeEach(() => {
41
+ const mocks = document.getElementById("mocks");
42
+ mocks.innerHTML = html;
43
+ });
44
+
45
+ afterEach(() => {
46
+ const mocks = document.getElementById("mocks");
47
+ mocks.innerHTML = "";
48
+ });
49
+
50
+ it("should create a control bar element", function () {
51
+ const bar = document.getElementById("bar");
52
+ expect(bar).to.be.instanceof(ControlBar);
53
+ });
54
+
55
+ it("should keep the popper switch hidden when no controls are slotted", function (done) {
56
+ const bar = document.getElementById("bar-right");
57
+
58
+ setTimeout(() => {
59
+ try {
60
+ const switchButton = bar.shadowRoot.querySelector(
61
+ '[data-monster-role="switch"]',
62
+ );
63
+ expect(switchButton).to.be.instanceof(HTMLButtonElement);
64
+ expect(switchButton.hasAttribute("hidden")).to.be.true;
65
+ expect(switchButton.classList.contains("hidden")).to.be.true;
66
+ done();
67
+ } catch (e) {
68
+ done(e);
69
+ }
70
+ }, 50);
71
+ });
72
+
73
+ it("should default the control bar layout alignment to left", function () {
74
+ const bar = document.getElementById("bar");
75
+ const controlBar = bar.shadowRoot.querySelector(
76
+ '[data-monster-role="control-bar"]',
77
+ );
78
+
79
+ expect(controlBar.getAttribute("data-monster-layout-alignment")).to.equal(
80
+ "left",
81
+ );
82
+ });
83
+
84
+ it("should allow configuring the control bar layout alignment to right", function (done) {
85
+ const bar = document.getElementById("bar-right");
86
+
87
+ setTimeout(() => {
88
+ try {
89
+ const controlBar = bar.shadowRoot.querySelector(
90
+ '[data-monster-role="control-bar"]',
91
+ );
92
+
93
+ expect(
94
+ controlBar.getAttribute("data-monster-layout-alignment"),
95
+ ).to.equal("right");
96
+ done();
97
+ } catch (e) {
98
+ done(e);
99
+ }
100
+ }, 50);
101
+ });
102
+
103
+ it("should map popper position attributes to the popper placement option", function () {
104
+ const bar = document.getElementById("bar");
105
+
106
+ bar.setAttribute("data-monster-popper-position", "bottom");
107
+
108
+ expect(bar.getOption("popper.placement")).to.equal("bottom");
109
+ });
110
+
111
+ it("should render mixed controls with joined heights and popper layout styles", function () {
112
+ const cssText = ControlBar.getCSSStyleSheet()
113
+ .flatMap((styleSheet) => Array.from(styleSheet.cssRules))
114
+ .map((rule) => rule.cssText)
115
+ .join("\n");
116
+
117
+ expect(cssText).to.contain("--monster-control-bar-height");
118
+ expect(cssText).to.contain("slot[name=popper]");
119
+ expect(cssText).to.contain("align-items: stretch");
120
+ expect(cssText).to.contain("margin-right");
121
+ expect(cssText).to.contain("margin-top");
122
+ });
123
+
124
+ it("should move overflowing mixed controls into the popper", async function () {
125
+ const OriginalResizeObserver = window.ResizeObserver;
126
+ const originalGlobalResizeObserver = globalThis.ResizeObserver;
127
+ const originalRequestAnimationFrame = window.requestAnimationFrame;
128
+ const originalGlobalRequestAnimationFrame = globalThis.requestAnimationFrame;
129
+
130
+ class TrackingResizeObserver extends ResizeObserverMock {
131
+ static instances = [];
132
+
133
+ constructor(callback) {
134
+ super(callback);
135
+ TrackingResizeObserver.instances.push(this);
136
+ }
137
+ }
138
+
139
+ const scheduledCallbacks = [];
140
+ const flushFrames = async () => {
141
+ while (scheduledCallbacks.length > 0) {
142
+ scheduledCallbacks.shift()();
143
+ await new Promise((resolve) => setTimeout(resolve, 0));
144
+ }
145
+ };
146
+
147
+ try {
148
+ window.ResizeObserver = TrackingResizeObserver;
149
+ globalThis.ResizeObserver = TrackingResizeObserver;
150
+ window.requestAnimationFrame = (callback) => {
151
+ scheduledCallbacks.push(callback);
152
+ return scheduledCallbacks.length;
153
+ };
154
+ globalThis.requestAnimationFrame = window.requestAnimationFrame;
155
+
156
+ const mocks = document.getElementById("mocks");
157
+ mocks.innerHTML = `
158
+ <div id="control-bar-wrapper">
159
+ <monster-control-bar id="overflow-bar">
160
+ <input id="overflow-input" type="search">
161
+ <select id="overflow-select"><option>One</option></select>
162
+ <button id="overflow-button">Run</button>
163
+ </monster-control-bar>
164
+ </div>
165
+ `;
166
+
167
+ const wrapper = document.getElementById("control-bar-wrapper");
168
+ const bar = document.getElementById("overflow-bar");
169
+ const controls = [
170
+ document.getElementById("overflow-input"),
171
+ document.getElementById("overflow-select"),
172
+ document.getElementById("overflow-button"),
173
+ ];
174
+
175
+ wrapper.style.boxSizing = "border-box";
176
+ wrapper.style.width = "90px";
177
+ Object.defineProperty(wrapper, "clientWidth", {
178
+ configurable: true,
179
+ value: 90,
180
+ });
181
+
182
+ for (const control of controls) {
183
+ Object.defineProperty(control, "offsetWidth", {
184
+ configurable: true,
185
+ value: 50,
186
+ });
187
+ Object.defineProperty(control, "offsetHeight", {
188
+ configurable: true,
189
+ value: 30,
190
+ });
191
+ control.getBoundingClientRect = () => ({
192
+ width: 50,
193
+ height: 30,
194
+ top: 0,
195
+ right: 50,
196
+ bottom: 30,
197
+ left: 0,
198
+ x: 0,
199
+ y: 0,
200
+ toJSON: () => {},
201
+ });
202
+ }
203
+
204
+ const switchButton = bar.shadowRoot.querySelector(
205
+ '[data-monster-role="switch"]',
206
+ );
207
+ Object.defineProperty(switchButton, "offsetWidth", {
208
+ configurable: true,
209
+ value: 20,
210
+ });
211
+
212
+ await flushFrames();
213
+ await new Promise((resolve) => setTimeout(resolve, 0));
214
+ await new Promise((resolve) => setTimeout(resolve, 0));
215
+
216
+ expect(switchButton.hasAttribute("hidden")).to.be.false;
217
+ expect(document.getElementById("overflow-input").hasAttribute("slot")).to
218
+ .be.false;
219
+ expect(document.getElementById("overflow-select").getAttribute("slot")).to
220
+ .equal("popper");
221
+ expect(document.getElementById("overflow-button").getAttribute("slot")).to
222
+ .equal("popper");
223
+ } finally {
224
+ window.ResizeObserver = OriginalResizeObserver;
225
+ globalThis.ResizeObserver = originalGlobalResizeObserver;
226
+ window.requestAnimationFrame = originalRequestAnimationFrame;
227
+ globalThis.requestAnimationFrame = originalGlobalRequestAnimationFrame;
228
+ }
229
+ });
230
+ });