@schukai/monster 4.150.3 → 4.150.4

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.
package/package.json CHANGED
@@ -1 +1 @@
1
- {"author":"Volker Schukai","dependencies":{"@floating-ui/dom":"^1.7.6"},"description":"Monster is a simple library for creating fast, robust and lightweight websites.","homepage":"https://monsterjs.org/","keywords":["framework","web","dom","css","sass","mobile-first","app","front-end","templates","schukai","core","shopcloud","alvine","monster","buildmap","stack","observer","observable","uuid","node","nodelist","css-in-js","logger","log","theme"],"license":"AGPL 3.0","main":"source/monster.mjs","module":"source/monster.mjs","name":"@schukai/monster","repository":{"type":"git","url":"https://gitlab.schukai.com/oss/libraries/javascript/monster.git"},"type":"module","version":"4.150.3"}
1
+ {"author":"Volker Schukai","dependencies":{"@floating-ui/dom":"^1.7.6"},"description":"Monster is a simple library for creating fast, robust and lightweight websites.","homepage":"https://monsterjs.org/","keywords":["framework","web","dom","css","sass","mobile-first","app","front-end","templates","schukai","core","shopcloud","alvine","monster","buildmap","stack","observer","observable","uuid","node","nodelist","css-in-js","logger","log","theme"],"license":"AGPL 3.0","main":"source/monster.mjs","module":"source/monster.mjs","name":"@schukai/monster","repository":{"type":"git","url":"https://gitlab.schukai.com/oss/libraries/javascript/monster.git"},"type":"module","version":"4.150.4"}
@@ -560,9 +560,9 @@ monster-state[data-monster-role=empty-without-action]::part(action) {
560
560
  & :is(monster-button-bar, .monster-button-group) {
561
561
  --monster-button-bar-gap: 0;
562
562
  --monster-button-bar-item-spacing: 0;
563
- --monster-control-bar-button-inline-size: 100%;
563
+ --monster-control-bar-button-inline-size: max-content;
564
564
  --monster-control-bar-height: max(2.75rem, 44px);
565
- --monster-control-bar-item-flex: 1 1 0;
565
+ --monster-control-bar-item-flex: 0 0 auto;
566
566
  --monster-control-bar-slot-flex: 1 1 auto;
567
567
  box-sizing: border-box;
568
568
  display: flex;
@@ -99,7 +99,7 @@ try {
99
99
  --monster-theme-control-bg-color,var(--monster-bg-color-primary-1)
100
100
  );border:0;border-bottom:1px solid var(--monster-theme-control-border-color);border-left:1px solid var(--monster-theme-control-border-color);border-right:1px solid var(--monster-theme-control-border-color);display:grid;gap:.35rem .75rem;grid-template-columns:minmax(5.5rem,.35fr) minmax(0,1fr);justify-content:stretch;min-height:2.75rem;overflow:visible;padding:.625rem .75rem;white-space:normal;word-break:break-word}.center:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div),.end:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div),.start:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div){justify-content:stretch}[data-monster-datatable-row-start]:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div){border-radius:var(--monster-theme-control-border-radius) var(--monster-theme-control-border-radius) 0 0;border-top:1px solid var(--monster-theme-control-border-color);margin-top:.75rem}[data-monster-datatable-row-end]:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div){border-radius:0 0 var(--monster-theme-control-border-radius) var(--monster-theme-control-border-radius);margin-bottom:.75rem}[data-monster-datatable-row-start][data-monster-datatable-row-end]:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div){border-radius:var(--monster-theme-control-border-radius)}[data-monster-features~=select]:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div){align-items:center;background-color:var(
101
101
  --monster-theme-surface-subtle,var(--monster-bg-color-primary-2)
102
- );display:flex;min-height:max(2.75rem,var(--monster-control-min-block-size,44px))}:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div):has(:is(monster-button,monster-button-bar,monster-action-button,monster-select,monster-filter-select,select[multiple])){grid-template-columns:minmax(0,1fr)}:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div) :is(monster-select,monster-filter-select,select[multiple]){box-sizing:border-box;display:block;max-width:100%;min-width:0;width:100%}:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div) :is(monster-button-bar,.monster-button-group){--monster-button-bar-gap:0;--monster-button-bar-item-spacing:0;--monster-control-bar-button-inline-size:100%;--monster-control-bar-height:max(2.75rem,44px);--monster-control-bar-item-flex:1 1 0;--monster-control-bar-slot-flex:1 1 auto;box-sizing:border-box;display:flex;flex-wrap:wrap;gap:0;max-width:100%;min-width:0;width:100%}:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div) :is(monster-button,monster-action-button,button,[role=button]){box-sizing:border-box;flex:1 1 8rem;min-height:max(2.75rem,var(--monster-control-min-block-size,44px));min-width:0}:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div)>:is(monster-button,monster-action-button){display:block;width:100%}.selected:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div){background-color:var(
102
+ );display:flex;min-height:max(2.75rem,var(--monster-control-min-block-size,44px))}:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div):has(:is(monster-button,monster-button-bar,monster-action-button,monster-select,monster-filter-select,select[multiple])){grid-template-columns:minmax(0,1fr)}:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div) :is(monster-select,monster-filter-select,select[multiple]){box-sizing:border-box;display:block;max-width:100%;min-width:0;width:100%}:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div) :is(monster-button-bar,.monster-button-group){--monster-button-bar-gap:0;--monster-button-bar-item-spacing:0;--monster-control-bar-button-inline-size:max-content;--monster-control-bar-height:max(2.75rem,44px);--monster-control-bar-item-flex:0 0 auto;--monster-control-bar-slot-flex:1 1 auto;box-sizing:border-box;display:flex;flex-wrap:wrap;gap:0;max-width:100%;min-width:0;width:100%}:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div) :is(monster-button,monster-action-button,button,[role=button]){box-sizing:border-box;flex:1 1 8rem;min-height:max(2.75rem,var(--monster-control-min-block-size,44px));min-width:0}:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div)>:is(monster-button,monster-action-button){display:block;width:100%}.selected:is(:is(.small[data-monster-role=control] [data-monster-role=datatable])>div){background-color:var(
103
103
  --monster-theme-accent-subtle,var(--monster-bg-color-selection-2)
104
104
  );color:var(
105
105
  --monster-theme-accent,var(--monster-color-selection-2)
@@ -30,6 +30,7 @@ import { isArray, isObject, isString } from "../../types/is.mjs";
30
30
  import { ID } from "../../types/id.mjs";
31
31
  import { clone } from "../../util/clone.mjs";
32
32
 
33
+ import "./button.mjs";
33
34
  import { SheetStyleSheet } from "./stylesheet/sheet.mjs";
34
35
 
35
36
  export { Sheet };
@@ -391,13 +392,17 @@ function syncToolbarState() {
391
392
 
392
393
  this[addRowButtonSymbol].hidden = !addRow;
393
394
  this[addColumnButtonSymbol].hidden = !addCol;
394
- this[addRowButtonSymbol].disabled =
395
- this.getOption("disabled", false) || !addRow;
396
- this[addColumnButtonSymbol].disabled =
397
- this.getOption("disabled", false) || !addCol;
395
+ this[addRowButtonSymbol].setOption(
396
+ "disabled",
397
+ this.getOption("disabled", false) || !addRow,
398
+ );
399
+ this[addColumnButtonSymbol].setOption(
400
+ "disabled",
401
+ this.getOption("disabled", false) || !addCol,
402
+ );
398
403
 
399
- this[addRowButtonSymbol].className = buttonClass;
400
- this[addColumnButtonSymbol].className = buttonClass;
404
+ this[addRowButtonSymbol].setOption("classes.button", buttonClass);
405
+ this[addColumnButtonSymbol].setOption("classes.button", buttonClass);
401
406
  if (isString(labels.addRow)) {
402
407
  this[addRowButtonSymbol].textContent = labels.addRow;
403
408
  }
@@ -2427,8 +2432,8 @@ function getTemplate() {
2427
2432
  return `
2428
2433
  <div data-monster-role="control" part="control">
2429
2434
  <div data-monster-role="toolbar" part="toolbar">
2430
- <button type="button" data-monster-role="add-row" part="add-row"></button>
2431
- <button type="button" data-monster-role="add-column" part="add-column"></button>
2435
+ <monster-button data-monster-role="add-row" part="add-row"></monster-button>
2436
+ <monster-button data-monster-role="add-column" part="add-column"></monster-button>
2432
2437
  </div>
2433
2438
  <div data-monster-role="grid-wrapper" part="grid-wrapper">
2434
2439
  <div data-monster-role="grid" part="grid"></div>
@@ -80,6 +80,24 @@ describe("Datatable mobile layout", () => {
80
80
  expect(generated).not.to.include("--monster-button-bar-gap:0.5rem");
81
81
  });
82
82
 
83
+ it("measures responsive row actions at their compact width", () => {
84
+ expect(source).to.include(
85
+ "--monster-control-bar-button-inline-size: max-content",
86
+ );
87
+ expect(source).to.include(
88
+ "--monster-control-bar-item-flex: 0 0 auto",
89
+ );
90
+ expect(source).not.to.include(
91
+ "--monster-control-bar-button-inline-size: 100%",
92
+ );
93
+ expect(generated).to.include(
94
+ "--monster-control-bar-button-inline-size:max-content",
95
+ );
96
+ expect(generated).to.include(
97
+ "--monster-control-bar-item-flex:0 0 auto",
98
+ );
99
+ });
100
+
83
101
  it("keeps icon-only row overflow menus compact", () => {
84
102
  expect(source).to.include("& > monster-button-bar");
85
103
  expect(source).to.include("--monster-action-menu-min-inline-size: auto");
@@ -27,6 +27,46 @@ describe("Sheet", function () {
27
27
  expect(document.createElement("monster-sheet")).to.be.instanceof(Sheet);
28
28
  });
29
29
 
30
+ it("should use Monster controls for visible toolbar actions", async function () {
31
+ const sheet = document.createElement("monster-sheet");
32
+ sheet.setOptions({
33
+ classes: { button: "monster-button-outline-secondary" },
34
+ features: { addRows: true, addColumns: true },
35
+ labels: { addRow: "Append row", addColumn: "Append column" },
36
+ });
37
+ document.getElementById("mocks").appendChild(sheet);
38
+
39
+ const addRow = sheet.shadowRoot.querySelector(
40
+ '[data-monster-role="add-row"]',
41
+ );
42
+ const addColumn = sheet.shadowRoot.querySelector(
43
+ '[data-monster-role="add-column"]',
44
+ );
45
+ const menuItems = sheet.shadowRoot.querySelectorAll(
46
+ '[data-monster-role="context-menu"] [role="menuitem"]',
47
+ );
48
+
49
+ expect(addRow.tagName).to.equal("MONSTER-BUTTON");
50
+ expect(addColumn.tagName).to.equal("MONSTER-BUTTON");
51
+ expect(addRow.textContent).to.equal("Append row");
52
+ expect(addColumn.textContent).to.equal("Append column");
53
+ expect(addRow.getOption("classes.button")).to.equal(
54
+ "monster-button-outline-secondary",
55
+ );
56
+ expect(addRow.getOption("disabled")).to.equal(false);
57
+ expect(Array.from(menuItems).every((item) => item.tagName === "BUTTON")).to
58
+ .equal(true);
59
+
60
+ const rowCount = sheet.value.rows.length;
61
+ addRow.click();
62
+ expect(sheet.value.rows).to.have.length(rowCount + 1);
63
+
64
+ sheet.setOption("disabled", true);
65
+ await new Promise((resolve) => setTimeout(resolve, 0));
66
+ expect(addRow.getOption("disabled")).to.equal(true);
67
+ expect(addColumn.getOption("disabled")).to.equal(true);
68
+ });
69
+
30
70
  it("should name editable cells from their row and column labels", function () {
31
71
  const sheet = document.createElement("monster-sheet");
32
72
  sheet.setOptions({