@dodlhuat/basix 1.2.0 → 1.2.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.
Files changed (93) hide show
  1. package/README.md +56 -1
  2. package/css/accordion.scss +86 -87
  3. package/css/alert.scss +137 -137
  4. package/css/button.scss +48 -0
  5. package/css/calendar.scss +957 -0
  6. package/css/card.scss +65 -65
  7. package/css/chart.scss +270 -157
  8. package/css/chat-bubbles.scss +134 -68
  9. package/css/chips.scss +109 -19
  10. package/css/colors.scss +32 -32
  11. package/css/datepicker.scss +336 -336
  12. package/css/defaults.scss +90 -90
  13. package/css/docs.scss +529 -0
  14. package/css/editor.scss +36 -0
  15. package/css/file-uploader.scss +1 -1
  16. package/css/flyout-menu.scss +361 -361
  17. package/css/form.scss +0 -15
  18. package/css/gallery.scss +65 -6
  19. package/css/grid.scss +41 -40
  20. package/css/group-picker.scss +345 -0
  21. package/css/guitar-chords.css +250 -250
  22. package/css/icons.scss +330 -330
  23. package/css/parameters.scss +3 -3
  24. package/css/placeholder.scss +33 -33
  25. package/css/popover.scss +206 -0
  26. package/css/progress.scss +76 -32
  27. package/css/properties.scss +51 -36
  28. package/css/push-menu.scss +302 -174
  29. package/css/reset.scss +39 -39
  30. package/css/scrollbar.scss +62 -5
  31. package/css/sidebar-nav.scss +92 -0
  32. package/css/spinner.scss +65 -65
  33. package/css/stepper.scss +48 -12
  34. package/css/style.css +3159 -254
  35. package/css/style.css.map +1 -1
  36. package/css/style.min.css +1 -1
  37. package/css/style.scss +51 -45
  38. package/css/table.scss +199 -199
  39. package/css/tabs.scss +154 -123
  40. package/css/timeline.scss +83 -38
  41. package/css/timepicker.scss +100 -5
  42. package/css/toast.scss +81 -81
  43. package/css/virtual-dropdown.scss +35 -29
  44. package/js/calendar.js +532 -0
  45. package/js/calendar.ts +706 -0
  46. package/js/chart.js +573 -257
  47. package/js/chart.ts +692 -0
  48. package/js/code-viewer.js +10 -10
  49. package/js/code-viewer.ts +188 -188
  50. package/js/datepicker.ts +627 -627
  51. package/js/docs-nav.js +204 -0
  52. package/js/dropdown.ts +179 -179
  53. package/js/editor.js +50 -6
  54. package/js/editor.ts +483 -444
  55. package/js/file-uploader.js +1 -0
  56. package/js/file-uploader.ts +1 -0
  57. package/js/flyout-menu.js +14 -14
  58. package/js/flyout-menu.ts +249 -249
  59. package/js/form-builder.js +106 -106
  60. package/js/gallery.js +14 -8
  61. package/js/gallery.ts +245 -236
  62. package/js/group-picker.js +342 -0
  63. package/js/group-picker.ts +447 -0
  64. package/js/guitar-chords.js +268 -268
  65. package/js/lazy-loader.js +121 -121
  66. package/js/modal.ts +166 -166
  67. package/js/popover.js +163 -0
  68. package/js/popover.ts +219 -0
  69. package/js/position.js +108 -0
  70. package/js/position.ts +111 -0
  71. package/js/push-menu.js +113 -0
  72. package/js/push-menu.ts +284 -145
  73. package/js/request.js +50 -50
  74. package/js/scroll.ts +47 -47
  75. package/js/scrollbar.js +13 -0
  76. package/js/scrollbar.ts +324 -307
  77. package/js/select.ts +216 -216
  78. package/js/sidebar-nav.js +41 -0
  79. package/js/sidebar-nav.ts +66 -0
  80. package/js/table.ts +452 -452
  81. package/js/tabs.ts +279 -279
  82. package/js/theme.js +17 -6
  83. package/js/theme.ts +234 -224
  84. package/js/toast.ts +137 -137
  85. package/js/tooltip.js +6 -60
  86. package/js/tooltip.ts +184 -251
  87. package/js/tsconfig.json +18 -18
  88. package/js/utils.ts +83 -83
  89. package/js/virtual-dropdown.js +25 -25
  90. package/js/virtual-dropdown.ts +365 -365
  91. package/package.json +39 -39
  92. package/js/index.js +0 -816
  93. 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 triggerRect = this.trigger.getBoundingClientRect();
109
- const tooltipRect = this.tooltipElement.getBoundingClientRect();
110
- let position = this.options.position;
111
- if (position === 'auto') {
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);