@dodlhuat/basix 1.2.0 → 1.2.2
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 +266 -6
- package/css/accordion.scss +86 -87
- package/css/alert.scss +137 -137
- package/css/button.scss +48 -0
- package/css/calendar.scss +957 -0
- package/css/card.scss +65 -65
- package/css/chart.scss +270 -157
- package/css/chat-bubbles.scss +134 -68
- package/css/chips.scss +109 -19
- package/css/colors.scss +32 -32
- package/css/datepicker.scss +336 -336
- package/css/defaults.scss +90 -90
- package/css/docs.scss +529 -0
- package/css/editor.scss +36 -0
- package/css/file-uploader.scss +1 -1
- package/css/flyout-menu.scss +361 -361
- package/css/form.scss +0 -15
- package/css/gallery.scss +65 -6
- package/css/grid.scss +41 -40
- package/css/group-picker.scss +345 -0
- package/css/guitar-chords.css +250 -250
- package/css/icons.scss +330 -330
- package/css/parameters.scss +3 -3
- package/css/placeholder.scss +33 -33
- package/css/popover.scss +206 -0
- package/css/progress.scss +76 -32
- package/css/properties.scss +51 -36
- package/css/push-menu.scss +302 -174
- package/css/reset.scss +39 -39
- package/css/scrollbar.scss +62 -5
- package/css/sidebar-nav.scss +92 -0
- package/css/spinner.scss +65 -65
- package/css/stepper.scss +48 -12
- package/css/style.css +3155 -254
- package/css/style.css.map +1 -1
- package/css/style.min.css +1 -1
- package/css/style.scss +51 -45
- package/css/table.scss +199 -199
- package/css/tabs.scss +154 -123
- package/css/timeline.scss +83 -38
- package/css/timepicker.scss +100 -5
- package/css/toast.scss +81 -81
- package/css/virtual-dropdown.scss +35 -29
- package/js/calendar.js +532 -0
- package/js/calendar.ts +706 -0
- package/js/chart.js +573 -257
- package/js/chart.ts +692 -0
- package/js/code-viewer.js +10 -10
- package/js/code-viewer.ts +188 -188
- package/js/datepicker.ts +627 -627
- package/js/docs-nav.js +204 -0
- package/js/dropdown.ts +179 -179
- package/js/editor.js +50 -6
- package/js/editor.ts +483 -444
- package/js/file-uploader.js +1 -0
- package/js/file-uploader.ts +1 -0
- package/js/flyout-menu.js +14 -14
- package/js/flyout-menu.ts +249 -249
- package/js/form-builder.js +106 -106
- package/js/gallery.js +14 -8
- package/js/gallery.ts +245 -236
- package/js/group-picker.js +342 -0
- package/js/group-picker.ts +447 -0
- package/js/guitar-chords.js +268 -268
- package/js/lazy-loader.js +121 -121
- package/js/modal.ts +166 -166
- package/js/popover.js +163 -0
- package/js/popover.ts +219 -0
- package/js/position.js +108 -0
- package/js/position.ts +111 -0
- package/js/push-menu.js +113 -0
- package/js/push-menu.ts +284 -145
- package/js/request.js +50 -50
- package/js/scroll.ts +47 -47
- package/js/scrollbar.js +13 -0
- package/js/scrollbar.ts +324 -307
- package/js/select.ts +216 -216
- package/js/sidebar-nav.js +41 -0
- package/js/sidebar-nav.ts +66 -0
- package/js/table.ts +452 -452
- package/js/tabs.ts +279 -279
- package/js/theme.js +17 -6
- package/js/theme.ts +234 -224
- package/js/toast.ts +137 -137
- package/js/tooltip.js +6 -60
- package/js/tooltip.ts +184 -251
- package/js/tsconfig.json +18 -18
- package/js/utils.ts +83 -83
- package/js/virtual-dropdown.js +25 -25
- package/js/virtual-dropdown.ts +365 -365
- package/package.json +37 -39
- package/js/index.js +0 -816
- package/js/index.ts +0 -987
package/js/toast.ts
CHANGED
|
@@ -1,138 +1,138 @@
|
|
|
1
|
-
type ToastType = 'success' | 'error' | 'warning' | 'info';
|
|
2
|
-
|
|
3
|
-
interface ToastOptions {
|
|
4
|
-
content: string;
|
|
5
|
-
header?: string;
|
|
6
|
-
type?: ToastType;
|
|
7
|
-
closeable?: boolean;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
class Toast {
|
|
11
|
-
private readonly content: string;
|
|
12
|
-
private readonly header: string;
|
|
13
|
-
private readonly type?: ToastType;
|
|
14
|
-
private readonly closeable: boolean;
|
|
15
|
-
private readonly closureIcon: string = '<div class="icon icon-close close"></div>';
|
|
16
|
-
private readonly template: string;
|
|
17
|
-
private toastElement: HTMLDivElement | null = null;
|
|
18
|
-
private timerId: number | null = null;
|
|
19
|
-
|
|
20
|
-
constructor(options: ToastOptions);
|
|
21
|
-
constructor(content: string, header?: string, type?: ToastType, closeable?: boolean);
|
|
22
|
-
constructor(
|
|
23
|
-
contentOrOptions: string | ToastOptions,
|
|
24
|
-
header: string = '',
|
|
25
|
-
type?: ToastType,
|
|
26
|
-
closeable: boolean = true
|
|
27
|
-
) {
|
|
28
|
-
if (typeof contentOrOptions === 'object') {
|
|
29
|
-
this.content = contentOrOptions.content;
|
|
30
|
-
this.header = contentOrOptions.header ?? '';
|
|
31
|
-
this.type = contentOrOptions.type;
|
|
32
|
-
this.closeable = contentOrOptions.closeable ?? true;
|
|
33
|
-
} else {
|
|
34
|
-
this.content = contentOrOptions;
|
|
35
|
-
this.header = header;
|
|
36
|
-
this.type = type;
|
|
37
|
-
this.closeable = closeable;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
this.template = this.buildTemplate();
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
public show(ms?: number): void {
|
|
44
|
-
const div = document.createElement('div');
|
|
45
|
-
div.className = 'toast';
|
|
46
|
-
|
|
47
|
-
if (this.type) {
|
|
48
|
-
div.classList.add(this.type);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
div.innerHTML = this.template;
|
|
52
|
-
document.body.appendChild(div);
|
|
53
|
-
this.toastElement = div;
|
|
54
|
-
|
|
55
|
-
requestAnimationFrame(() => {
|
|
56
|
-
requestAnimationFrame(() => {
|
|
57
|
-
this.toastElement?.classList.add('show');
|
|
58
|
-
|
|
59
|
-
const closeButton = this.toastElement?.querySelector<HTMLElement>('.close');
|
|
60
|
-
if (closeButton) {
|
|
61
|
-
closeButton.addEventListener('click', this.handleClose);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (ms !== undefined && ms > 0) {
|
|
65
|
-
this.startTimer(ms);
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
public hide = (): void => {
|
|
72
|
-
if (this.timerId !== null) {
|
|
73
|
-
clearTimeout(this.timerId);
|
|
74
|
-
this.timerId = null;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
this.toastElement?.classList.remove('show');
|
|
78
|
-
|
|
79
|
-
setTimeout(() => {
|
|
80
|
-
const closeButton = this.toastElement?.querySelector<HTMLElement>('.close');
|
|
81
|
-
if (closeButton) {
|
|
82
|
-
closeButton.removeEventListener('click', this.handleClose);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
this.toastElement?.remove();
|
|
86
|
-
this.toastElement = null;
|
|
87
|
-
}, 150);
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
private handleClose = (): void => {
|
|
91
|
-
this.hide();
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
private startTimer(ms: number, elapsed: number = 0): void {
|
|
95
|
-
const stepSize = 250;
|
|
96
|
-
|
|
97
|
-
if (elapsed >= ms) {
|
|
98
|
-
this.hide();
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
this.timerId = window.setTimeout(() => {
|
|
103
|
-
elapsed += stepSize;
|
|
104
|
-
const width = 100 - (100 / ms) * elapsed;
|
|
105
|
-
|
|
106
|
-
const barElement = this.toastElement?.querySelector<HTMLElement>('.bar');
|
|
107
|
-
if (barElement) {
|
|
108
|
-
barElement.style.width = `${width}%`;
|
|
109
|
-
this.startTimer(ms, elapsed);
|
|
110
|
-
}
|
|
111
|
-
}, stepSize);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
private buildTemplate(): string {
|
|
115
|
-
const parts: string[] = ['<div class="bar"></div>'];
|
|
116
|
-
|
|
117
|
-
if (this.closeable) {
|
|
118
|
-
parts.push(this.closureIcon);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
if (this.header) {
|
|
122
|
-
parts.push(`<div class="header">${this.escapeHtml(this.header)}</div>`);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
parts.push(`<div class="content">${this.escapeHtml(this.content)}</div>`);
|
|
126
|
-
|
|
127
|
-
return parts.join('');
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
private escapeHtml(text: string): string {
|
|
131
|
-
const div = document.createElement('div');
|
|
132
|
-
div.textContent = text;
|
|
133
|
-
return div.innerHTML;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export { Toast };
|
|
1
|
+
type ToastType = 'success' | 'error' | 'warning' | 'info';
|
|
2
|
+
|
|
3
|
+
interface ToastOptions {
|
|
4
|
+
content: string;
|
|
5
|
+
header?: string;
|
|
6
|
+
type?: ToastType;
|
|
7
|
+
closeable?: boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
class Toast {
|
|
11
|
+
private readonly content: string;
|
|
12
|
+
private readonly header: string;
|
|
13
|
+
private readonly type?: ToastType;
|
|
14
|
+
private readonly closeable: boolean;
|
|
15
|
+
private readonly closureIcon: string = '<div class="icon icon-close close"></div>';
|
|
16
|
+
private readonly template: string;
|
|
17
|
+
private toastElement: HTMLDivElement | null = null;
|
|
18
|
+
private timerId: number | null = null;
|
|
19
|
+
|
|
20
|
+
constructor(options: ToastOptions);
|
|
21
|
+
constructor(content: string, header?: string, type?: ToastType, closeable?: boolean);
|
|
22
|
+
constructor(
|
|
23
|
+
contentOrOptions: string | ToastOptions,
|
|
24
|
+
header: string = '',
|
|
25
|
+
type?: ToastType,
|
|
26
|
+
closeable: boolean = true
|
|
27
|
+
) {
|
|
28
|
+
if (typeof contentOrOptions === 'object') {
|
|
29
|
+
this.content = contentOrOptions.content;
|
|
30
|
+
this.header = contentOrOptions.header ?? '';
|
|
31
|
+
this.type = contentOrOptions.type;
|
|
32
|
+
this.closeable = contentOrOptions.closeable ?? true;
|
|
33
|
+
} else {
|
|
34
|
+
this.content = contentOrOptions;
|
|
35
|
+
this.header = header;
|
|
36
|
+
this.type = type;
|
|
37
|
+
this.closeable = closeable;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
this.template = this.buildTemplate();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public show(ms?: number): void {
|
|
44
|
+
const div = document.createElement('div');
|
|
45
|
+
div.className = 'toast';
|
|
46
|
+
|
|
47
|
+
if (this.type) {
|
|
48
|
+
div.classList.add(this.type);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
div.innerHTML = this.template;
|
|
52
|
+
document.body.appendChild(div);
|
|
53
|
+
this.toastElement = div;
|
|
54
|
+
|
|
55
|
+
requestAnimationFrame(() => {
|
|
56
|
+
requestAnimationFrame(() => {
|
|
57
|
+
this.toastElement?.classList.add('show');
|
|
58
|
+
|
|
59
|
+
const closeButton = this.toastElement?.querySelector<HTMLElement>('.close');
|
|
60
|
+
if (closeButton) {
|
|
61
|
+
closeButton.addEventListener('click', this.handleClose);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (ms !== undefined && ms > 0) {
|
|
65
|
+
this.startTimer(ms);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public hide = (): void => {
|
|
72
|
+
if (this.timerId !== null) {
|
|
73
|
+
clearTimeout(this.timerId);
|
|
74
|
+
this.timerId = null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
this.toastElement?.classList.remove('show');
|
|
78
|
+
|
|
79
|
+
setTimeout(() => {
|
|
80
|
+
const closeButton = this.toastElement?.querySelector<HTMLElement>('.close');
|
|
81
|
+
if (closeButton) {
|
|
82
|
+
closeButton.removeEventListener('click', this.handleClose);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
this.toastElement?.remove();
|
|
86
|
+
this.toastElement = null;
|
|
87
|
+
}, 150);
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
private handleClose = (): void => {
|
|
91
|
+
this.hide();
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
private startTimer(ms: number, elapsed: number = 0): void {
|
|
95
|
+
const stepSize = 250;
|
|
96
|
+
|
|
97
|
+
if (elapsed >= ms) {
|
|
98
|
+
this.hide();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
this.timerId = window.setTimeout(() => {
|
|
103
|
+
elapsed += stepSize;
|
|
104
|
+
const width = 100 - (100 / ms) * elapsed;
|
|
105
|
+
|
|
106
|
+
const barElement = this.toastElement?.querySelector<HTMLElement>('.bar');
|
|
107
|
+
if (barElement) {
|
|
108
|
+
barElement.style.width = `${width}%`;
|
|
109
|
+
this.startTimer(ms, elapsed);
|
|
110
|
+
}
|
|
111
|
+
}, stepSize);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private buildTemplate(): string {
|
|
115
|
+
const parts: string[] = ['<div class="bar"></div>'];
|
|
116
|
+
|
|
117
|
+
if (this.closeable) {
|
|
118
|
+
parts.push(this.closureIcon);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (this.header) {
|
|
122
|
+
parts.push(`<div class="header">${this.escapeHtml(this.header)}</div>`);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
parts.push(`<div class="content">${this.escapeHtml(this.content)}</div>`);
|
|
126
|
+
|
|
127
|
+
return parts.join('');
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
private escapeHtml(text: string): string {
|
|
131
|
+
const div = document.createElement('div');
|
|
132
|
+
div.textContent = text;
|
|
133
|
+
return div.innerHTML;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export { Toast };
|
|
138
138
|
export type { ToastOptions, ToastType };
|
package/js/tooltip.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// tooltip.ts
|
|
2
|
+
import { computePosition } from './position.js';
|
|
1
3
|
class Tooltip {
|
|
2
4
|
constructor(trigger, content, options = {}) {
|
|
3
5
|
this.tooltipElement = null;
|
|
@@ -105,66 +107,10 @@ class Tooltip {
|
|
|
105
107
|
position() {
|
|
106
108
|
if (!this.tooltipElement)
|
|
107
109
|
return;
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
position = this.determineAutoPosition(triggerRect, tooltipRect);
|
|
113
|
-
}
|
|
114
|
-
const coords = this.calculatePosition(position, triggerRect, tooltipRect);
|
|
115
|
-
this.tooltipElement.style.left = `${coords.left}px`;
|
|
116
|
-
this.tooltipElement.style.top = `${coords.top}px`;
|
|
117
|
-
this.tooltipElement.setAttribute('data-position', position);
|
|
118
|
-
}
|
|
119
|
-
determineAutoPosition(triggerRect, tooltipRect) {
|
|
120
|
-
const spaceTop = triggerRect.top;
|
|
121
|
-
const spaceBottom = window.innerHeight - triggerRect.bottom;
|
|
122
|
-
const spaceLeft = triggerRect.left;
|
|
123
|
-
const spaceRight = window.innerWidth - triggerRect.right;
|
|
124
|
-
const canFitTop = spaceTop >= tooltipRect.height + this.options.offset;
|
|
125
|
-
const canFitBottom = spaceBottom >= tooltipRect.height + this.options.offset;
|
|
126
|
-
const canFitLeft = spaceLeft >= tooltipRect.width + this.options.offset;
|
|
127
|
-
const canFitRight = spaceRight >= tooltipRect.width + this.options.offset;
|
|
128
|
-
if (canFitTop && spaceTop >= Math.max(spaceBottom, spaceLeft, spaceRight)) {
|
|
129
|
-
return 'top';
|
|
130
|
-
}
|
|
131
|
-
else if (canFitBottom && spaceBottom >= Math.max(spaceTop, spaceLeft, spaceRight)) {
|
|
132
|
-
return 'bottom';
|
|
133
|
-
}
|
|
134
|
-
else if (canFitLeft && spaceLeft >= Math.max(spaceTop, spaceBottom, spaceRight)) {
|
|
135
|
-
return 'left';
|
|
136
|
-
}
|
|
137
|
-
else if (canFitRight) {
|
|
138
|
-
return 'right';
|
|
139
|
-
}
|
|
140
|
-
return spaceBottom > spaceTop ? 'bottom' : 'top';
|
|
141
|
-
}
|
|
142
|
-
calculatePosition(position, triggerRect, tooltipRect) {
|
|
143
|
-
let left = 0;
|
|
144
|
-
let top = 0;
|
|
145
|
-
switch (position) {
|
|
146
|
-
case 'top':
|
|
147
|
-
left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2;
|
|
148
|
-
top = triggerRect.top - tooltipRect.height - this.options.offset;
|
|
149
|
-
break;
|
|
150
|
-
case 'bottom':
|
|
151
|
-
left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2;
|
|
152
|
-
top = triggerRect.bottom + this.options.offset;
|
|
153
|
-
break;
|
|
154
|
-
case 'left':
|
|
155
|
-
left = triggerRect.left - tooltipRect.width - this.options.offset;
|
|
156
|
-
top = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2;
|
|
157
|
-
break;
|
|
158
|
-
case 'right':
|
|
159
|
-
left = triggerRect.right + this.options.offset;
|
|
160
|
-
top = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2;
|
|
161
|
-
break;
|
|
162
|
-
}
|
|
163
|
-
// Clamp to viewport
|
|
164
|
-
const margin = 8;
|
|
165
|
-
left = Math.max(margin, Math.min(window.innerWidth - tooltipRect.width - margin, left));
|
|
166
|
-
top = Math.max(margin, Math.min(window.innerHeight - tooltipRect.height - margin, top));
|
|
167
|
-
return { left, top };
|
|
110
|
+
const { left, top, placement } = computePosition(this.trigger.getBoundingClientRect(), this.tooltipElement.getBoundingClientRect(), { placement: this.options.position, offset: this.options.offset });
|
|
111
|
+
this.tooltipElement.style.left = `${left}px`;
|
|
112
|
+
this.tooltipElement.style.top = `${top}px`;
|
|
113
|
+
this.tooltipElement.setAttribute('data-position', placement);
|
|
168
114
|
}
|
|
169
115
|
attachEvents() {
|
|
170
116
|
this.trigger.addEventListener('mouseenter', this.handleMouseEnter);
|