@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.
Files changed (93) hide show
  1. package/README.md +266 -6
  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 +3155 -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 +37 -39
  92. package/js/index.js +0 -816
  93. package/js/index.ts +0 -987
package/css/tabs.scss CHANGED
@@ -1,123 +1,154 @@
1
- @use "properties";
2
- @use "parameters" as *;
3
-
4
- .tabs-container {
5
- display: flex;
6
- flex-direction: column;
7
- overflow: hidden;
8
-
9
- li {
10
- list-style: none;
11
- }
12
-
13
- &.tabs-vertical {
14
- flex-direction: row;
15
- min-height: 300px;
16
- }
17
- }
18
-
19
- .tabs-header {
20
- border-bottom: 1px solid var(--divider);
21
- }
22
-
23
- .tabs-list {
24
- display: flex;
25
- margin: 0;
26
- padding: 0;
27
- overflow-x: auto;
28
- scrollbar-width: none;
29
-
30
- &::-webkit-scrollbar {
31
- display: none;
32
- }
33
- }
34
-
35
- .tab-item {
36
- padding: calc($spacing * 0.75) calc($spacing * 1.25);
37
- cursor: pointer;
38
- font-size: 0.875rem;
39
- font-weight: 500;
40
- color: var(--secondary-text);
41
- white-space: nowrap;
42
- user-select: none;
43
- transition: color 0.15s ease, border-color 0.15s ease;
44
- border-bottom: 2px solid transparent;
45
-
46
- &:hover {
47
- color: var(--accent-color);
48
- }
49
-
50
- &.active {
51
- color: var(--accent-color);
52
- font-weight: 600;
53
- border-bottom-color: var(--accent-color);
54
- }
55
- }
56
-
57
- .tabs-content {
58
- padding: calc($spacing * 1.5);
59
- }
60
-
61
- .tab-panel {
62
- display: none;
63
-
64
- &.active {
65
- display: block;
66
- }
67
- }
68
-
69
- .tabs-container.tabs-vertical {
70
- .tabs-header {
71
- border-bottom: none;
72
- border-right: 1px solid var(--divider);
73
- min-width: 200px;
74
- }
75
-
76
- .tabs-list {
77
- flex-direction: column;
78
- }
79
-
80
- .tab-item {
81
- width: 100%;
82
- box-sizing: border-box;
83
- border-bottom: none;
84
- border-left: 2px solid transparent;
85
-
86
- &.active {
87
- border-left-color: var(--accent-color);
88
- font-weight: 600;
89
- }
90
- }
91
-
92
- .tabs-content {
93
- flex: 1;
94
- }
95
- }
96
-
97
- @media (max-width: 768px) {
98
- .tabs-container.tabs-vertical {
99
- flex-direction: column;
100
-
101
- .tabs-header {
102
- width: 100%;
103
- border-right: none;
104
- border-bottom: 1px solid var(--divider);
105
- }
106
-
107
- .tabs-list {
108
- flex-direction: row;
109
- overflow-x: auto;
110
- }
111
-
112
- .tab-item {
113
- width: auto;
114
- flex-shrink: 0;
115
- border-left: none;
116
- border-bottom: 2px solid transparent;
117
-
118
- &.active {
119
- border-bottom-color: var(--accent-color);
120
- }
121
- }
122
- }
123
- }
1
+ @use "properties";
2
+ @use "parameters" as *;
3
+
4
+ .tabs-container {
5
+ display: flex;
6
+ flex-direction: column;
7
+ overflow: hidden;
8
+
9
+ li {
10
+ list-style: none;
11
+ }
12
+
13
+ &.tabs-vertical {
14
+ flex-direction: row;
15
+ min-height: 300px;
16
+ }
17
+ }
18
+
19
+ .tabs-header {
20
+ border-bottom: 1px solid var(--divider);
21
+ }
22
+
23
+ .tabs-list {
24
+ display: flex;
25
+ margin: 0;
26
+ padding: 0;
27
+ overflow-x: auto;
28
+ scrollbar-width: none;
29
+
30
+ &::-webkit-scrollbar {
31
+ display: none;
32
+ }
33
+ }
34
+
35
+ .tab-item {
36
+ padding: calc($spacing * 0.75) calc($spacing * 1.25);
37
+ cursor: pointer;
38
+ font-size: 0.875rem;
39
+ font-weight: 500;
40
+ color: var(--secondary-text);
41
+ white-space: nowrap;
42
+ user-select: none;
43
+ transition: color 0.15s ease, border-color 0.15s ease;
44
+ border-bottom: 2px solid transparent;
45
+
46
+ &:hover {
47
+ color: var(--accent-color);
48
+ }
49
+
50
+ &.active {
51
+ color: var(--accent-color);
52
+ font-weight: 600;
53
+ border-bottom-color: var(--accent-color);
54
+ }
55
+ }
56
+
57
+ .tabs-content {
58
+ padding: calc($spacing * 1.5);
59
+ }
60
+
61
+ .tab-panel {
62
+ display: none;
63
+
64
+ &.active {
65
+ display: block;
66
+ }
67
+ }
68
+
69
+ .tabs-container.tabs-vertical {
70
+ .tabs-header {
71
+ border-bottom: none;
72
+ border-right: 1px solid var(--divider);
73
+ min-width: 200px;
74
+ }
75
+
76
+ .tabs-list {
77
+ flex-direction: column;
78
+ }
79
+
80
+ .tab-item {
81
+ width: 100%;
82
+ box-sizing: border-box;
83
+ border-bottom: none;
84
+ border-left: 2px solid transparent;
85
+
86
+ &.active {
87
+ border-left-color: var(--accent-color);
88
+ font-weight: 600;
89
+ }
90
+ }
91
+
92
+ .tabs-content {
93
+ flex: 1;
94
+ }
95
+ }
96
+
97
+ // ── Pills variant ─────────────────────────────────────────────────────────────
98
+
99
+ .tabs-container.tabs-pills {
100
+ .tabs-header {
101
+ border-bottom: none;
102
+ padding-bottom: calc($spacing * 0.5);
103
+ }
104
+
105
+ .tabs-list {
106
+ gap: calc($spacing * 0.375);
107
+ }
108
+
109
+ .tab-item {
110
+ border-bottom: none;
111
+ border-radius: calc($border-radius * 5);
112
+ padding: calc($spacing * 0.4) calc($spacing * 1);
113
+ background: transparent;
114
+
115
+ &:hover {
116
+ background: var(--hover);
117
+ color: var(--primary-text);
118
+ }
119
+
120
+ &.active {
121
+ background: var(--accent-color);
122
+ color: #fff;
123
+ border-bottom-color: transparent;
124
+ }
125
+ }
126
+ }
127
+
128
+ @media (max-width: 768px) {
129
+ .tabs-container.tabs-vertical {
130
+ flex-direction: column;
131
+
132
+ .tabs-header {
133
+ width: 100%;
134
+ border-right: none;
135
+ border-bottom: 1px solid var(--divider);
136
+ }
137
+
138
+ .tabs-list {
139
+ flex-direction: row;
140
+ overflow-x: auto;
141
+ }
142
+
143
+ .tab-item {
144
+ width: auto;
145
+ flex-shrink: 0;
146
+ border-left: none;
147
+ border-bottom: 2px solid transparent;
148
+
149
+ &.active {
150
+ border-bottom-color: var(--accent-color);
151
+ }
152
+ }
153
+ }
154
+ }
package/css/timeline.scss CHANGED
@@ -1,71 +1,116 @@
1
1
  @use "properties";
2
2
  @use "parameters" as *;
3
3
 
4
+ // ── Timeline shell ────────────────────────────────────────────────────────────
5
+
6
+ $marker-size: 1.25rem;
7
+
4
8
  .timeline {
5
9
  position: relative;
6
- max-width: 800px;
7
- padding: calc($spacing * 1.25) 0;
8
10
  list-style: none;
9
- }
11
+ padding: 0;
12
+ margin: 0;
10
13
 
11
- .timeline::before {
12
- content: '';
13
- position: absolute;
14
- top: 0;
15
- bottom: 0;
16
- left: calc($spacing * 1.25);
17
- width: 2px;
18
- background: var(--divider);
14
+ // Vertical connector line — centered on the marker column
15
+ &::before {
16
+ content: '';
17
+ position: absolute;
18
+ left: calc($marker-size / 2 - 1px);
19
+ top: 0;
20
+ bottom: 0;
21
+ width: 2px;
22
+ background: var(--divider);
23
+ }
19
24
  }
20
25
 
26
+ // ── Item ──────────────────────────────────────────────────────────────────────
27
+
21
28
  .timeline-item {
22
- position: relative;
29
+ display: flex;
30
+ gap: calc($spacing * 1.25);
31
+ align-items: flex-start;
23
32
  margin-bottom: calc($spacing * 2);
24
- padding-left: calc($spacing * 3);
33
+ position: relative;
34
+
35
+ &:last-child { margin-bottom: 0; }
25
36
  }
26
37
 
27
- .timeline-item::before {
28
- content: '';
29
- position: absolute;
30
- left: calc($spacing / 2);
31
- top: 5px;
32
- width: calc($spacing * 1.25);
33
- height: calc($spacing * 1.25);
38
+ // ── Marker dot ────────────────────────────────────────────────────────────────
39
+
40
+ .timeline-marker {
41
+ flex-shrink: 0;
42
+ width: $marker-size;
43
+ height: $marker-size;
34
44
  border-radius: 50%;
35
- border: 3px solid var(--divider);
36
- z-index: 1;
45
+ border: 2px solid var(--divider);
37
46
  background: var(--background);
38
- }
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ color: var(--secondary-text);
51
+ position: relative;
52
+ z-index: 1;
53
+ margin-top: 0.15rem; // align with first line of content text
54
+
55
+ // ── Color variants ────────────────────────────────────────────────────────
56
+ &.success {
57
+ border-color: var(--success);
58
+ background: var(--success);
59
+ color: #fff;
60
+ }
39
61
 
40
- .timeline-item.active::before {
41
- border-color: var(--accent-color);
42
- background-color: color-mix(in srgb, var(--accent-color) 12%, var(--background));
62
+ &.warning {
63
+ border-color: var(--warning);
64
+ background: var(--warning);
65
+ color: #fff;
66
+ }
67
+
68
+ &.error {
69
+ border-color: var(--error);
70
+ background: var(--error);
71
+ color: #fff;
72
+ }
73
+
74
+ &.accent {
75
+ border-color: var(--accent-color);
76
+ background: var(--accent-color);
77
+ color: #fff;
78
+ }
79
+
80
+ svg { display: block; }
43
81
  }
44
82
 
83
+ // ── Content card ──────────────────────────────────────────────────────────────
84
+
45
85
  .timeline-content {
46
- padding: calc($spacing * 1.5);
86
+ flex: 1;
87
+ min-width: 0;
88
+ padding: calc($spacing * 1.25);
89
+ border: 1px solid var(--divider);
47
90
  border-radius: $border-radius;
91
+ background: var(--background);
48
92
  box-shadow: $shadow;
49
- border: 1px solid var(--divider);
50
93
  }
51
94
 
52
- .timeline-date {
53
- font-size: 0.85rem;
54
- color: var(--secondary-text);
55
- font-weight: 600;
56
- margin-bottom: calc($spacing / 2);
95
+ // ── Content elements ──────────────────────────────────────────────────────────
96
+
97
+ .timeline-time {
57
98
  display: block;
99
+ font-size: 0.78rem;
100
+ font-weight: 600;
101
+ color: var(--secondary-text);
102
+ margin-bottom: 0.2rem;
58
103
  }
59
104
 
60
105
  .timeline-title {
61
- font-size: 1.1rem;
62
- font-weight: 700;
63
- margin: 0 0 calc($spacing / 2) 0;
106
+ font-size: 0.95rem;
107
+ font-weight: 600;
64
108
  color: var(--primary-text);
109
+ margin: 0 0 0.3rem;
65
110
  }
66
111
 
67
- .timeline-body {
68
- font-size: 0.95rem;
112
+ .timeline-content p {
113
+ font-size: 0.875rem;
69
114
  line-height: 1.6;
70
115
  color: var(--secondary-text);
71
116
  margin: 0;
@@ -9,10 +9,19 @@
9
9
  border-radius: $border-radius;
10
10
  overflow: hidden;
11
11
  box-shadow: $shadow;
12
- transition: border-color 0.2s ease;
12
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
13
+
14
+ &:focus-within {
15
+ border-color: var(--accent-color);
16
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-color) 12%, transparent);
17
+ }
13
18
 
14
19
  &.is-error {
15
20
  border-color: var(--error);
21
+
22
+ &:focus-within {
23
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--error) 12%, transparent);
24
+ }
16
25
  }
17
26
  }
18
27
 
@@ -22,6 +31,7 @@
22
31
  flex-direction: column;
23
32
  padding: calc($spacing * 0.75) $spacing;
24
33
  min-width: 0;
34
+ position: relative;
25
35
 
26
36
  label {
27
37
  font-size: 0.6875rem;
@@ -32,6 +42,15 @@
32
42
  margin-bottom: calc($spacing / 4);
33
43
  pointer-events: none;
34
44
  display: block;
45
+ transition: color 0.15s ease;
46
+ }
47
+
48
+ &:focus-within label {
49
+ color: var(--accent-color);
50
+ }
51
+
52
+ .timespan-picker.is-error .timespan-field-end:focus-within & label {
53
+ color: var(--error);
35
54
  }
36
55
 
37
56
  input[type="time"] {
@@ -81,7 +100,7 @@
81
100
  border-right: 1px solid var(--divider);
82
101
  background: var(--background);
83
102
  min-width: 4.5rem;
84
- gap: calc($spacing / 5);
103
+ gap: calc($spacing / 4);
85
104
  flex-shrink: 0;
86
105
  }
87
106
 
@@ -89,6 +108,15 @@
89
108
  font-size: 1rem;
90
109
  color: var(--secondary-text);
91
110
  line-height: 1;
111
+ transition: color 0.2s ease, transform 0.2s ease;
112
+
113
+ .timespan-picker:focus-within & {
114
+ color: var(--accent-color);
115
+ }
116
+
117
+ .timespan-picker.is-error & {
118
+ color: var(--error);
119
+ }
92
120
  }
93
121
 
94
122
  .timespan-duration {
@@ -99,19 +127,29 @@
99
127
  white-space: nowrap;
100
128
  line-height: 1;
101
129
  min-height: 0.75rem;
130
+ padding: 2px 6px;
131
+ border-radius: calc($border-radius * 2);
132
+ background: color-mix(in srgb, var(--accent-color) 10%, transparent);
133
+ transition: color 0.2s ease, background 0.2s ease, transform 0.25s cubic-bezier(0.2, 0, 0, 1);
134
+
135
+ &:empty {
136
+ background: transparent;
137
+ padding: 0;
138
+ }
102
139
 
103
140
  .timespan-picker.is-error & {
104
141
  color: var(--error);
142
+ background: color-mix(in srgb, var(--error) 10%, transparent);
105
143
  }
106
144
  }
107
145
 
108
146
  // 24h position bar
109
147
  .timespan-bar {
110
148
  margin-top: calc($spacing / 2);
111
- height: 3px;
149
+ height: 6px;
112
150
  background: var(--divider);
113
151
  border-radius: 99px;
114
- overflow: hidden;
152
+ overflow: visible;
115
153
  position: relative;
116
154
  }
117
155
 
@@ -122,13 +160,66 @@
122
160
  height: 100%;
123
161
  background: var(--accent-color);
124
162
  border-radius: inherit;
125
- transition: left 0.3s ease, width 0.3s ease;
163
+ transition: left 0.3s cubic-bezier(0.2, 0, 0, 1), width 0.3s cubic-bezier(0.2, 0, 0, 1);
164
+
165
+ // Start/end dot markers
166
+ &::before,
167
+ &::after {
168
+ content: '';
169
+ position: absolute;
170
+ top: 50%;
171
+ width: 12px;
172
+ height: 12px;
173
+ border-radius: 50%;
174
+ background: var(--accent-color);
175
+ border: 2px solid var(--background);
176
+ transform: translateY(-50%);
177
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
178
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
179
+ opacity: 0;
180
+ }
181
+
182
+ &::before {
183
+ left: -6px;
184
+ }
185
+
186
+ &::after {
187
+ right: -6px;
188
+ }
189
+
190
+ // Only show dots when the bar has width (values are set)
191
+ &[style*="width"]:not([style*="width: 0"]):not([style*="width:0"]) {
192
+ &::before,
193
+ &::after {
194
+ opacity: 1;
195
+ }
196
+ }
126
197
 
127
198
  .timespan-picker.is-error ~ .timespan-bar & {
128
199
  background: var(--error);
200
+
201
+ &::before,
202
+ &::after {
203
+ background: var(--error);
204
+ }
205
+ }
206
+ }
207
+
208
+ // Error shake
209
+ @media (prefers-reduced-motion: no-preference) {
210
+ .timespan-picker.is-error {
211
+ animation: timespan-shake 0.35s cubic-bezier(0.2, 0, 0, 1);
129
212
  }
130
213
  }
131
214
 
215
+ @keyframes timespan-shake {
216
+ 0%, 100% { transform: translateX(0); }
217
+ 20% { transform: translateX(-4px); }
218
+ 40% { transform: translateX(4px); }
219
+ 60% { transform: translateX(-2px); }
220
+ 80% { transform: translateX(2px); }
221
+ }
222
+
132
223
  @media (max-width: 480px) {
133
224
  .timespan-picker {
134
225
  flex-direction: column;
@@ -145,6 +236,10 @@
145
236
  min-width: unset;
146
237
  }
147
238
 
239
+ .timespan-arrow {
240
+ transform: rotate(90deg);
241
+ }
242
+
148
243
  .timespan-field input[type="time"] {
149
244
  font-size: 2rem;
150
245
  }