@dodlhuat/basix 1.3.5 → 1.4.1
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/README.md +92 -7
- package/css/checkbox.scss +15 -2
- package/css/color-picker.scss +278 -0
- package/css/datepicker.scss +5 -3
- package/css/push-menu.scss +7 -0
- package/css/stepper.scss +1 -1
- package/css/style.css +291 -6
- package/css/style.css.map +1 -1
- package/css/style.min.css +1 -1
- package/css/style.min.css.map +1 -1
- package/css/style.scss +1 -0
- package/css/table.scss +33 -0
- package/js/bottom-sheet.d.ts +0 -2
- package/js/bottom-sheet.js +0 -2
- package/js/calendar.d.ts +9 -17
- package/js/calendar.js +4 -7
- package/js/carousel.d.ts +0 -2
- package/js/carousel.js +1 -3
- package/js/chart.d.ts +6 -14
- package/js/chart.js +3 -5
- package/js/code-viewer.d.ts +2 -1
- package/js/code-viewer.js +8 -2
- package/js/color-picker.d.ts +50 -0
- package/js/color-picker.js +291 -0
- package/js/context-menu.d.ts +0 -3
- package/js/context-menu.js +0 -3
- package/js/datepicker.d.ts +0 -4
- package/js/datepicker.js +0 -1
- package/js/docs-nav.js +1 -0
- package/js/dropdown.d.ts +1 -4
- package/js/dropdown.js +0 -1
- package/js/editor.d.ts +0 -4
- package/js/editor.js +3 -5
- package/js/file-uploader.d.ts +0 -4
- package/js/file-uploader.js +0 -1
- package/js/flyout-menu.d.ts +0 -2
- package/js/flyout-menu.js +0 -1
- package/js/gallery.d.ts +1 -4
- package/js/gallery.js +18 -23
- package/js/group-picker.d.ts +0 -5
- package/js/group-picker.js +6 -8
- package/js/lightbox.d.ts +1 -4
- package/js/lightbox.js +6 -10
- package/js/modal.d.ts +0 -2
- package/js/modal.js +0 -1
- package/js/popover.d.ts +0 -3
- package/js/popover.js +0 -2
- package/js/position.d.ts +0 -13
- package/js/position.js +0 -12
- package/js/push-menu.d.ts +0 -3
- package/js/push-menu.js +6 -11
- package/js/range-slider.d.ts +0 -1
- package/js/range-slider.js +2 -3
- package/js/scroll.d.ts +0 -2
- package/js/scroll.js +5 -6
- package/js/scrollbar.d.ts +2 -10
- package/js/scrollbar.js +25 -42
- package/js/select.d.ts +2 -3
- package/js/select.js +6 -9
- package/js/sidebar-nav.d.ts +4 -15
- package/js/sidebar-nav.js +21 -35
- package/js/stepper.d.ts +5 -2
- package/js/stepper.js +42 -6
- package/js/table.d.ts +1 -56
- package/js/table.js +4 -56
- package/js/tabs.d.ts +1 -32
- package/js/tabs.js +7 -39
- package/js/theme.d.ts +0 -44
- package/js/theme.js +0 -44
- package/js/timepicker.d.ts +1 -4
- package/js/timepicker.js +1 -2
- package/js/toast.d.ts +0 -2
- package/js/toast.js +0 -1
- package/js/tooltip.d.ts +0 -4
- package/js/tooltip.js +0 -1
- package/js/tree.d.ts +0 -3
- package/js/tree.js +9 -11
- package/js/utils.d.ts +0 -10
- package/js/utils.js +2 -42
- package/js/virtual-dropdown.d.ts +3 -5
- package/js/virtual-dropdown.js +17 -66
- package/package.json +6 -2
package/js/virtual-dropdown.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { escapeHtml } from './utils.js';
|
|
2
|
-
/** Virtualised dropdown that renders only visible items for performance with large option lists. */
|
|
3
2
|
class VirtualDropdown {
|
|
4
3
|
container;
|
|
5
4
|
options;
|
|
@@ -9,8 +8,6 @@ class VirtualDropdown {
|
|
|
9
8
|
renderLimit;
|
|
10
9
|
itemHeight;
|
|
11
10
|
onSelect;
|
|
12
|
-
// Unique CSS anchor name for this instance — prevents conflicts when
|
|
13
|
-
// multiple dropdowns exist on the same page.
|
|
14
11
|
anchorName;
|
|
15
12
|
trigger;
|
|
16
13
|
triggerText;
|
|
@@ -24,7 +21,7 @@ class VirtualDropdown {
|
|
|
24
21
|
filteredOptions;
|
|
25
22
|
isOpen;
|
|
26
23
|
scrollTop;
|
|
27
|
-
|
|
24
|
+
abortController = new AbortController();
|
|
28
25
|
constructor(config) {
|
|
29
26
|
const containerElement = typeof config.container === 'string'
|
|
30
27
|
? document.querySelector(config.container)
|
|
@@ -45,7 +42,6 @@ class VirtualDropdown {
|
|
|
45
42
|
this.filteredOptions = [...this.options];
|
|
46
43
|
this.isOpen = false;
|
|
47
44
|
this.scrollTop = 0;
|
|
48
|
-
this.boundHandlers = new Map();
|
|
49
45
|
this.init();
|
|
50
46
|
}
|
|
51
47
|
init() {
|
|
@@ -77,8 +73,6 @@ class VirtualDropdown {
|
|
|
77
73
|
this.scroller = this.querySelector('.dropdown-list-scroller');
|
|
78
74
|
this.spacer = this.querySelector('.virtual-spacer');
|
|
79
75
|
this.content = this.querySelector('.virtual-content');
|
|
80
|
-
// Wire up anchor positioning: each instance gets a unique anchor name
|
|
81
|
-
// so multiple dropdowns on the same page don't interfere.
|
|
82
76
|
this.trigger.style.setProperty('anchor-name', this.anchorName);
|
|
83
77
|
this.menu.style.setProperty('position-anchor', this.anchorName);
|
|
84
78
|
if (this.searchable) {
|
|
@@ -93,10 +87,9 @@ class VirtualDropdown {
|
|
|
93
87
|
return element;
|
|
94
88
|
}
|
|
95
89
|
bindEvents() {
|
|
96
|
-
const
|
|
97
|
-
this.trigger.addEventListener('click',
|
|
98
|
-
this.
|
|
99
|
-
const handleTriggerKeydown = (e) => {
|
|
90
|
+
const sig = { signal: this.abortController.signal };
|
|
91
|
+
this.trigger.addEventListener('click', () => this.toggle(), sig);
|
|
92
|
+
this.trigger.addEventListener('keydown', (e) => {
|
|
100
93
|
if (e.key === 'Enter' || e.key === ' ') {
|
|
101
94
|
e.preventDefault();
|
|
102
95
|
this.toggle();
|
|
@@ -104,46 +97,29 @@ class VirtualDropdown {
|
|
|
104
97
|
else if (e.key === 'Escape' && this.isOpen) {
|
|
105
98
|
this.close();
|
|
106
99
|
}
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
this.boundHandlers.set('triggerKeydown', handleTriggerKeydown);
|
|
110
|
-
// Close when clicking outside. Still needed because popover="manual"
|
|
111
|
-
// does not auto-dismiss on outside clicks.
|
|
112
|
-
const handleDocumentClick = (e) => {
|
|
100
|
+
}, sig);
|
|
101
|
+
document.addEventListener('click', (e) => {
|
|
113
102
|
if (!this.container.contains(e.target) && !this.menu.contains(e.target)) {
|
|
114
103
|
this.close();
|
|
115
104
|
}
|
|
116
|
-
};
|
|
117
|
-
document.addEventListener('click', handleDocumentClick);
|
|
118
|
-
this.boundHandlers.set('documentClick', handleDocumentClick);
|
|
105
|
+
}, sig);
|
|
119
106
|
if (this.searchable && this.searchInput) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
};
|
|
124
|
-
this.searchInput.addEventListener('input', handleSearchInput);
|
|
125
|
-
this.boundHandlers.set('searchInput', handleSearchInput);
|
|
107
|
+
this.searchInput.addEventListener('input', (e) => {
|
|
108
|
+
this.handleSearch(e.target.value);
|
|
109
|
+
}, sig);
|
|
126
110
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
this.scrollTop = target.scrollTop;
|
|
111
|
+
this.listWrapper.addEventListener('scroll', (e) => {
|
|
112
|
+
this.scrollTop = e.target.scrollTop;
|
|
130
113
|
this.renderList();
|
|
131
|
-
};
|
|
132
|
-
this.
|
|
133
|
-
this.boundHandlers.set('scroll', handleScroll);
|
|
134
|
-
// Sync isOpen if the browser closes the popover externally (e.g. another
|
|
135
|
-
// popover="auto" element stealing focus — not typical for "manual" but
|
|
136
|
-
// good defensive practice).
|
|
137
|
-
const handlePopoverToggle = (e) => {
|
|
114
|
+
}, sig);
|
|
115
|
+
this.menu.addEventListener('toggle', (e) => {
|
|
138
116
|
const te = e;
|
|
139
117
|
if (te.newState === 'closed' && this.isOpen) {
|
|
140
118
|
this.isOpen = false;
|
|
141
119
|
this.container.classList.remove('open');
|
|
142
120
|
this.trigger.setAttribute('aria-expanded', 'false');
|
|
143
121
|
}
|
|
144
|
-
};
|
|
145
|
-
this.menu.addEventListener('toggle', handlePopoverToggle);
|
|
146
|
-
this.boundHandlers.set('popoverToggle', handlePopoverToggle);
|
|
122
|
+
}, sig);
|
|
147
123
|
}
|
|
148
124
|
toggle() {
|
|
149
125
|
this.isOpen ? this.close() : this.open();
|
|
@@ -290,34 +266,9 @@ class VirtualDropdown {
|
|
|
290
266
|
}
|
|
291
267
|
}
|
|
292
268
|
destroy() {
|
|
293
|
-
if (this.isOpen)
|
|
269
|
+
if (this.isOpen)
|
|
294
270
|
this.menu.hidePopover();
|
|
295
|
-
|
|
296
|
-
const triggerClick = this.boundHandlers.get('triggerClick');
|
|
297
|
-
if (triggerClick) {
|
|
298
|
-
this.trigger.removeEventListener('click', triggerClick);
|
|
299
|
-
}
|
|
300
|
-
const triggerKeydown = this.boundHandlers.get('triggerKeydown');
|
|
301
|
-
if (triggerKeydown) {
|
|
302
|
-
this.trigger.removeEventListener('keydown', triggerKeydown);
|
|
303
|
-
}
|
|
304
|
-
const documentClick = this.boundHandlers.get('documentClick');
|
|
305
|
-
if (documentClick) {
|
|
306
|
-
document.removeEventListener('click', documentClick);
|
|
307
|
-
}
|
|
308
|
-
const searchInput = this.boundHandlers.get('searchInput');
|
|
309
|
-
if (searchInput && this.searchInput) {
|
|
310
|
-
this.searchInput.removeEventListener('input', searchInput);
|
|
311
|
-
}
|
|
312
|
-
const scroll = this.boundHandlers.get('scroll');
|
|
313
|
-
if (scroll) {
|
|
314
|
-
this.listWrapper.removeEventListener('scroll', scroll);
|
|
315
|
-
}
|
|
316
|
-
const popoverToggle = this.boundHandlers.get('popoverToggle');
|
|
317
|
-
if (popoverToggle) {
|
|
318
|
-
this.menu.removeEventListener('toggle', popoverToggle);
|
|
319
|
-
}
|
|
320
|
-
this.boundHandlers.clear();
|
|
271
|
+
this.abortController.abort();
|
|
321
272
|
this.container.innerHTML = '';
|
|
322
273
|
this.container.classList.remove('custom-dropdown', 'open');
|
|
323
274
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dodlhuat/basix",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "Basix is intended as a starter for the rapid development of a design. Each design element can be added individually to include only the data required. It is using plain javascript / typescript and therefore is not dependent on any plugin.",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./css/*": "./css/*",
|
|
@@ -33,6 +33,10 @@
|
|
|
33
33
|
},
|
|
34
34
|
"homepage": "https://github.com/dodlhuat/basix#readme",
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"
|
|
36
|
+
"eslint": "^10.5.0",
|
|
37
|
+
"eslint-config-prettier": "^10.1.8",
|
|
38
|
+
"prettier": "^3.8.4",
|
|
39
|
+
"typescript": "^6.0.0",
|
|
40
|
+
"typescript-eslint": "^8.61.0"
|
|
37
41
|
}
|
|
38
42
|
}
|