blue-web 1.3.1 β†’ 1.3.3

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 (40) hide show
  1. package/dist/js/actions.bundle.js +1 -0
  2. package/dist/js/actions.d.ts +6 -0
  3. package/dist/js/actions.js +70 -0
  4. package/dist/js/color-mode.bundle.js +1 -0
  5. package/dist/js/color-mode.d.ts +4 -0
  6. package/dist/js/color-mode.js +37 -0
  7. package/dist/js/edit-view.bundle.js +1 -0
  8. package/dist/js/edit-view.d.ts +14 -0
  9. package/dist/js/edit-view.js +56 -0
  10. package/dist/js/input-splitted.bundle.js +1 -0
  11. package/dist/js/input-splitted.d.ts +19 -0
  12. package/dist/js/input-splitted.js +229 -0
  13. package/dist/js/read-view.bundle.js +1 -0
  14. package/dist/js/read-view.d.ts +35 -0
  15. package/dist/js/read-view.js +123 -0
  16. package/dist/js/select-list.bundle.js +1 -0
  17. package/dist/js/select-list.d.ts +31 -0
  18. package/dist/js/select-list.js +112 -0
  19. package/dist/js/side-layout.bundle.js +1 -0
  20. package/dist/js/side-layout.d.ts +7 -0
  21. package/dist/js/side-layout.js +171 -0
  22. package/dist/merged.scss +12455 -0
  23. package/dist/style.css +9317 -5694
  24. package/dist/style.css.map +1 -0
  25. package/dist/style.min.css +9 -13
  26. package/dist/style.scss +1 -1
  27. package/dist/styles/_action-menu.scss +4 -0
  28. package/dist/styles/_caret.scss +4 -0
  29. package/dist/styles/_general.scss +14 -1
  30. package/dist/styles/_layout.scss +27 -0
  31. package/dist/styles/_search.scss +4 -0
  32. package/dist/styles/_sidebar.scss +8 -0
  33. package/dist/styles/_status.scss +9 -29
  34. package/dist/styles/_tooltips.scss +16 -0
  35. package/dist/styles/mixins/_action-menu.scss +5 -0
  36. package/dist/styles/mixins/_menu-item.scss +12 -0
  37. package/dist/styles/mixins/_misc.scss +8 -0
  38. package/dist/styles/mixins/_sidebar.scss +8 -0
  39. package/dist/styles/mixins/_switch.scss +16 -10
  40. package/package.json +6 -6
@@ -0,0 +1,112 @@
1
+ /**
2
+ * A Web Component that provides a keyboard-accessible selectable list, typically used for dropdowns or autocomplete lists.
3
+ * Together with `popover` and CSS Anchoring, it's also useful to create a dropdown list.
4
+ * Supports keyboard navigation and selection, and integrates with an input element for combobox behavior.
5
+ *
6
+ * The Web Component will automatically set attributes for accessibility.
7
+ *
8
+ * @element blue-select-list
9
+ * @attr {string} for - The id of the input element to associate as the combobox controller.
10
+ * @slot - The list options.
11
+ * @example
12
+ * <input id="my-input" />
13
+ * <blue-select-list for="my-input">
14
+ * <div>Option 1</div>
15
+ * <div>Option 2</div>
16
+ * </blue-select-list>
17
+ */
18
+ export class SelectList extends HTMLElement {
19
+ constructor() {
20
+ super();
21
+ this.attachShadow({
22
+ mode: "open"
23
+ });
24
+ this.shadowRoot.innerHTML = `<slot style="border-radius: inherit"></slot>`;
25
+ this.activeIndex = -1;
26
+ this.items = [];
27
+ this.inputElement = null;
28
+ }
29
+ connectedCallback() {
30
+ this.setAttribute("role", "listbox");
31
+ this.tabIndex = -1;
32
+ this.updateItems();
33
+
34
+ // Input zuweisen ΓΌber Attribut oder fallback
35
+ const inputId = this.getAttribute("for");
36
+ this.inputElement = inputId ? document.getElementById(inputId) : null;
37
+ if (this.inputElement) {
38
+ this.inputElement.setAttribute("role", "combobox");
39
+ this.inputElement.setAttribute("aria-controls", this.id);
40
+ this.inputElement.setAttribute("aria-expanded", "true");
41
+ this.inputElement.addEventListener("keydown", this.onKeyDown.bind(this));
42
+ }
43
+ this.addEventListener("keydown", this.onKeyDown.bind(this));
44
+ this.addEventListener("click", e => {
45
+ const target = e.target instanceof Element ? e.target.closest("[data-blue-select-list-index]") : null;
46
+ if (target && target.hasAttribute("data-blue-select-list-index")) {
47
+ const index = Number(target.getAttribute("data-blue-select-list-index"));
48
+ this.select(index);
49
+ }
50
+ });
51
+ }
52
+ updateItems() {
53
+ this.items = Array.from(this.children);
54
+ this.items.forEach((el, i) => {
55
+ if (!el.hasAttribute("id")) {
56
+ el.setAttribute("id", `${this.id}-option-${i}`);
57
+ }
58
+ el.setAttribute("data-blue-select-list-index", i.toString());
59
+ el.setAttribute("aria-selected", "false");
60
+ el.setAttribute("role", "option");
61
+ el.tabIndex = -1;
62
+ });
63
+ }
64
+ onKeyDown(e) {
65
+ console.log("select-list onKeyDown");
66
+ if (!this.items.length) return;
67
+ if (e.key === "ArrowDown") {
68
+ e.preventDefault();
69
+ this.activeIndex = (this.activeIndex + 1) % this.items.length;
70
+ this.updateActiveItem();
71
+ } else if (e.key === "ArrowUp") {
72
+ e.preventDefault();
73
+ this.activeIndex = (this.activeIndex - 1 + this.items.length) % this.items.length;
74
+ this.updateActiveItem();
75
+ } else if (e.key === "Enter" && this.activeIndex >= 0) {
76
+ const item = this.items[this.activeIndex];
77
+ item?.click();
78
+ }
79
+ }
80
+ updateActiveItem() {
81
+ this.items.forEach((el, i) => {
82
+ const active = i === this.activeIndex;
83
+ el.classList.toggle("active", active);
84
+ el.setAttribute("aria-selected", active.toString());
85
+ });
86
+ const activeItem = this.items[this.activeIndex];
87
+ if (activeItem && this.inputElement) {
88
+ this.inputElement.setAttribute("aria-activedescendant", activeItem.id);
89
+ activeItem.scrollIntoView({
90
+ block: "nearest"
91
+ });
92
+ }
93
+ }
94
+ select(index) {
95
+ this.activeIndex = index;
96
+ this.updateActiveItem();
97
+ const selectedItem = this.items[index];
98
+ if (selectedItem) {
99
+ // Fire a custom event with the selected item and index
100
+ this.dispatchEvent(new CustomEvent("bl-select", {
101
+ detail: {
102
+ index,
103
+ item: selectedItem
104
+ },
105
+ bubbles: true,
106
+ composed: true
107
+ }));
108
+ selectedItem.click();
109
+ }
110
+ }
111
+ }
112
+ customElements.define("bl-select-list", SelectList);
@@ -0,0 +1 @@
1
+ (()=>{"use strict";class n extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}connectedCallback(){this.render(),this.addEventListeners()}render(){if(!this.shadowRoot)return;const n=(document.documentElement.lang||navigator.language).startsWith("de")?"Seitenleiste umschalten":"Toggle sidebar";this.shadowRoot.innerHTML=`\n <style>\n :host {\n --spacing: 0.25rem;\n --drawer-side-shadow:\n rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px,\n rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px,\n rgba(0, 0, 0, 0.25) 0px 25px 50px -12px;\n --toggler-size: calc(\n var(--bs-btn-border-width, 1px) + var(--bs-btn-padding-y, 0.375rem) +\n (var(--bs-btn-font-size, 1rem) * var(--bs-btn-line-height, 1.5)) +\n var(--bs-btn-padding-y, 0.375rem) + var(--bs-btn-border-width, 1px)\n );\n --side-width: 18rem;\n --base-z-index: 0;\n }\n\n .root {\n position: relative;\n display: grid;\n height: 100%;\n grid-template-columns:\n 0 var(--toggler-size) calc(var(--side-width) - var(--toggler-size))\n auto;\n grid-template-rows: var(--toggler-size) auto;\n }\n\n .hidden-input {\n position: fixed;\n --size: 0;\n height: var(--size);\n width: var(--size);\n appearance: none;\n opacity: 0;\n }\n\n .toggler {\n grid-column-start: 2;\n }\n\n .hidden-input:focus-visible + .toggler ::slotted(*) {\n --trigger-box-shadow: var(--trigger-focus-box-shadow, inset 0 0 0.25rem);\n }\n\n @media (width < 64rem) {\n .toggler[for="layout-expand"] {\n display: none;\n }\n }\n\n @media (width >= 64rem) {\n .toggler[for="layout-drawer"] {\n display: none;\n }\n }\n\n .header {\n grid-column-start: 3;\n grid-column-end: 5;\n }\n\n .side {\n overflow: auto;\n }\n\n @media (width < 64rem) {\n .side {\n translate: -100% 0;\n height: 100%;\n transition: translate 0.2s ease;\n }\n\n #layout-drawer:checked ~ .side {\n position: fixed;\n top: 0;\n left: 0;\n z-index: calc(var(--base-z-index) + 1);\n translate: 0;\n width: calc(var(--spacing) * 80);\n box-shadow: var(--drawer-side-shadow);\n }\n }\n\n @media (width >= 64rem) {\n #layout-expand:checked ~ .side {\n grid-column-start: 2;\n grid-column-end: 4;\n }\n }\n\n .main {\n overflow: auto;\n grid-column-start: 2;\n grid-column-end: 5;\n }\n\n @media (width >= 64rem) {\n #layout-expand:checked ~ .main {\n grid-column-start: 4;\n }\n }\n\n .overlay {\n position: fixed;\n z-index: var(--base-z-index);\n inset: 0;\n display: none;\n }\n\n @media (width < 64rem) {\n #layout-drawer:checked ~ .overlay {\n display: block;\n }\n }\n </style>\n\n <div class="root">\n <input\n id="layout-expand"\n type="checkbox"\n class="hidden-input"\n ${localStorage.getItem("side-layout-shrink")?"":"checked"}\n />\n <label class="toggler" for="layout-expand" title="${n}" role="button">\n <slot name="expand-toggler">πŸ”</slot>\n </label>\n\n <input id="layout-drawer" type="checkbox" class="hidden-input" />\n <label class="toggler" for="layout-drawer" title="${n}" role="button">\n <slot name="drawer-toggler">πŸ”</slot>\n </label>\n\n <header class="header"><slot name="header"></slot></header>\n <div class="side"><slot name="side"></slot></div>\n <main class="main"><slot></slot></main>\n <label aria-label="Close sidebar" for="layout-drawer" class="overlay"\n ><slot name="overlay"></slot\n ></label>\n </div>\n `}addEventListeners(){this.shadowRoot&&this.shadowRoot.querySelector("#layout-expand").addEventListener("change",this.handleLayoutExpandChange.bind(this))}handleLayoutExpandChange(n){n.target.checked?localStorage.removeItem("side-layout-shrink"):localStorage.setItem("side-layout-shrink","true")}}customElements.define("bl-side-layout",n)})();
@@ -0,0 +1,7 @@
1
+ export declare class SideLayout extends HTMLElement {
2
+ constructor();
3
+ connectedCallback(): void;
4
+ render(): void;
5
+ addEventListeners(): void;
6
+ handleLayoutExpandChange(event: Event): void;
7
+ }
@@ -0,0 +1,171 @@
1
+ export class SideLayout extends HTMLElement {
2
+ constructor() {
3
+ super();
4
+ this.attachShadow({
5
+ mode: "open"
6
+ });
7
+ }
8
+ connectedCallback() {
9
+ this.render();
10
+ this.addEventListeners();
11
+ }
12
+ render() {
13
+ if (!this.shadowRoot) return;
14
+ const language = document.documentElement.lang || navigator.language;
15
+ const toggleSidebarText = language.startsWith("de") ? "Seitenleiste umschalten" : "Toggle sidebar";
16
+ this.shadowRoot.innerHTML = /* HTML */`
17
+ <style>
18
+ :host {
19
+ --spacing: 0.25rem;
20
+ --drawer-side-shadow:
21
+ rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px,
22
+ rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px,
23
+ rgba(0, 0, 0, 0.25) 0px 25px 50px -12px;
24
+ --toggler-size: calc(
25
+ var(--bs-btn-border-width, 1px) + var(--bs-btn-padding-y, 0.375rem) +
26
+ (var(--bs-btn-font-size, 1rem) * var(--bs-btn-line-height, 1.5)) +
27
+ var(--bs-btn-padding-y, 0.375rem) + var(--bs-btn-border-width, 1px)
28
+ );
29
+ --side-width: 18rem;
30
+ --base-z-index: 0;
31
+ }
32
+
33
+ .root {
34
+ position: relative;
35
+ display: grid;
36
+ height: 100%;
37
+ grid-template-columns:
38
+ 0 var(--toggler-size) calc(var(--side-width) - var(--toggler-size))
39
+ auto;
40
+ grid-template-rows: var(--toggler-size) auto;
41
+ }
42
+
43
+ .hidden-input {
44
+ position: fixed;
45
+ --size: 0;
46
+ height: var(--size);
47
+ width: var(--size);
48
+ appearance: none;
49
+ opacity: 0;
50
+ }
51
+
52
+ .toggler {
53
+ grid-column-start: 2;
54
+ }
55
+
56
+ .hidden-input:focus-visible + .toggler ::slotted(*) {
57
+ --trigger-box-shadow: var(--trigger-focus-box-shadow, inset 0 0 0.25rem);
58
+ }
59
+
60
+ @media (width < 64rem) {
61
+ .toggler[for="layout-expand"] {
62
+ display: none;
63
+ }
64
+ }
65
+
66
+ @media (width >= 64rem) {
67
+ .toggler[for="layout-drawer"] {
68
+ display: none;
69
+ }
70
+ }
71
+
72
+ .header {
73
+ grid-column-start: 3;
74
+ grid-column-end: 5;
75
+ }
76
+
77
+ .side {
78
+ overflow: auto;
79
+ }
80
+
81
+ @media (width < 64rem) {
82
+ .side {
83
+ translate: -100% 0;
84
+ height: 100%;
85
+ transition: translate 0.2s ease;
86
+ }
87
+
88
+ #layout-drawer:checked ~ .side {
89
+ position: fixed;
90
+ top: 0;
91
+ left: 0;
92
+ z-index: calc(var(--base-z-index) + 1);
93
+ translate: 0;
94
+ width: calc(var(--spacing) * 80);
95
+ box-shadow: var(--drawer-side-shadow);
96
+ }
97
+ }
98
+
99
+ @media (width >= 64rem) {
100
+ #layout-expand:checked ~ .side {
101
+ grid-column-start: 2;
102
+ grid-column-end: 4;
103
+ }
104
+ }
105
+
106
+ .main {
107
+ overflow: auto;
108
+ grid-column-start: 2;
109
+ grid-column-end: 5;
110
+ }
111
+
112
+ @media (width >= 64rem) {
113
+ #layout-expand:checked ~ .main {
114
+ grid-column-start: 4;
115
+ }
116
+ }
117
+
118
+ .overlay {
119
+ position: fixed;
120
+ z-index: var(--base-z-index);
121
+ inset: 0;
122
+ display: none;
123
+ }
124
+
125
+ @media (width < 64rem) {
126
+ #layout-drawer:checked ~ .overlay {
127
+ display: block;
128
+ }
129
+ }
130
+ </style>
131
+
132
+ <div class="root">
133
+ <input
134
+ id="layout-expand"
135
+ type="checkbox"
136
+ class="hidden-input"
137
+ ${!localStorage.getItem("side-layout-shrink") ? "checked" : ""}
138
+ />
139
+ <label class="toggler" for="layout-expand" title="${toggleSidebarText}" role="button">
140
+ <slot name="expand-toggler">πŸ”</slot>
141
+ </label>
142
+
143
+ <input id="layout-drawer" type="checkbox" class="hidden-input" />
144
+ <label class="toggler" for="layout-drawer" title="${toggleSidebarText}" role="button">
145
+ <slot name="drawer-toggler">πŸ”</slot>
146
+ </label>
147
+
148
+ <header class="header"><slot name="header"></slot></header>
149
+ <div class="side"><slot name="side"></slot></div>
150
+ <main class="main"><slot></slot></main>
151
+ <label aria-label="Close sidebar" for="layout-drawer" class="overlay"
152
+ ><slot name="overlay"></slot
153
+ ></label>
154
+ </div>
155
+ `;
156
+ }
157
+ addEventListeners() {
158
+ if (!this.shadowRoot) return;
159
+ const layoutExpandInput = this.shadowRoot.querySelector("#layout-expand");
160
+ layoutExpandInput.addEventListener("change", this.handleLayoutExpandChange.bind(this));
161
+ }
162
+ handleLayoutExpandChange(event) {
163
+ const input = event.target;
164
+ if (input.checked) {
165
+ localStorage.removeItem("side-layout-shrink");
166
+ } else {
167
+ localStorage.setItem("side-layout-shrink", "true");
168
+ }
169
+ }
170
+ }
171
+ customElements.define("bl-side-layout", SideLayout);