@allxsmith/bestax-bulma 5.36.1 → 5.37.0
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/dist/bestax.css +1 -1
- package/dist/bestax.css.map +1 -1
- package/dist/esm/components/EmptyState.js +2 -2
- package/dist/esm/components/Timeline.js +5 -5
- package/dist/esm/components/Timeline.js.map +1 -1
- package/dist/esm/components/TreeView.js +192 -0
- package/dist/esm/components/TreeView.js.map +1 -0
- package/dist/esm/helpers/typeahead.js +82 -0
- package/dist/esm/helpers/typeahead.js.map +1 -0
- package/dist/esm/helpers/useMenuKeys.js +8 -58
- package/dist/esm/helpers/useMenuKeys.js.map +1 -1
- package/dist/esm/helpers/useTreeView.js +380 -0
- package/dist/esm/helpers/useTreeView.js.map +1 -0
- package/dist/extras.css +1 -1
- package/dist/extras.css.map +1 -1
- package/dist/index.cjs +1945 -1368
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +1 -0
- package/dist/index.esm.js.map +1 -1
- package/dist/types/components/TreeView.d.ts +115 -0
- package/dist/types/helpers/typeahead.d.ts +41 -0
- package/dist/types/helpers/useMenuKeys.d.ts +1 -2
- package/dist/types/helpers/useTreeView.d.ts +88 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types-cjs/components/TreeView.d.ts +115 -0
- package/dist/types-cjs/helpers/typeahead.d.ts +41 -0
- package/dist/types-cjs/helpers/useMenuKeys.d.ts +1 -2
- package/dist/types-cjs/helpers/useTreeView.d.ts +88 -0
- package/dist/types-cjs/index.d.ts +1 -0
- package/dist/versions/bestax-no-dark-mode.css +1 -1
- package/dist/versions/bestax-no-dark-mode.css.map +1 -1
- package/dist/versions/bestax-no-helpers-prefixed.css +1 -1
- package/dist/versions/bestax-no-helpers-prefixed.css.map +1 -1
- package/dist/versions/bestax-no-helpers.css +1 -1
- package/dist/versions/bestax-no-helpers.css.map +1 -1
- package/dist/versions/bestax-prefixed.css +1 -1
- package/dist/versions/bestax-prefixed.css.map +1 -1
- package/package.json +1 -1
- package/src/scss/components/_index.scss +1 -0
- package/src/scss/components/_treeview.scss +252 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
// Bestax Extras - TreeView Styles
|
|
2
|
+
// A tree of items you browse and pick from, drawn to look like Bulma's menu.
|
|
3
|
+
//
|
|
4
|
+
// The tree has its own classes and its own variables. Each default here is
|
|
5
|
+
// the base token Bulma's menu variable defaults to, so a tree matches the
|
|
6
|
+
// menu as Bulma ships it and follows a theme's base tokens, while a theme
|
|
7
|
+
// that changes `--bulma-menu-*` doesn't reach it. Bulma registers those on
|
|
8
|
+
// `.menu` alone, so a tree outside a menu couldn't read them anyway.
|
|
9
|
+
|
|
10
|
+
@use "bulma/sass/utilities/initial-variables" as iv;
|
|
11
|
+
@use "bulma/sass/utilities/css-variables" as cv;
|
|
12
|
+
@use "../mixins" as *;
|
|
13
|
+
|
|
14
|
+
// The row: the menu item's colors, radius and padding.
|
|
15
|
+
$tree-view-item-h: cv.getVar("scheme-h") !default;
|
|
16
|
+
$tree-view-item-s: cv.getVar("scheme-s") !default;
|
|
17
|
+
$tree-view-item-background-l: cv.getVar("scheme-main-l") !default;
|
|
18
|
+
$tree-view-item-background-l-delta: 0% !default;
|
|
19
|
+
$tree-view-item-hover-background-l-delta: cv.getVar("hover-background-l-delta") !default;
|
|
20
|
+
$tree-view-item-active-background-l-delta: cv.getVar("active-background-l-delta") !default;
|
|
21
|
+
$tree-view-item-color-l: cv.getVar("text-l") !default;
|
|
22
|
+
$tree-view-item-radius: cv.getVar("radius-small") !default;
|
|
23
|
+
$tree-view-item-padding: 0.5em 0.75em !default;
|
|
24
|
+
// The selected row: the link color, with its invert as the text.
|
|
25
|
+
$tree-view-item-selected-h: cv.getVar("link-h") !default;
|
|
26
|
+
$tree-view-item-selected-s: cv.getVar("link-s") !default;
|
|
27
|
+
$tree-view-item-selected-background-l: cv.getVar("link-l") !default;
|
|
28
|
+
$tree-view-item-selected-color-l: cv.getVar("link-invert-l") !default;
|
|
29
|
+
$tree-view-line-height: 1.25 !default;
|
|
30
|
+
// The group: the nested menu list's guide line and indent.
|
|
31
|
+
$tree-view-group-border: 1px solid cv.getVar("border") !default;
|
|
32
|
+
$tree-view-group-margin: 0.75em !default;
|
|
33
|
+
$tree-view-group-padding: 0.75em !default;
|
|
34
|
+
// The tree's own, with no menu variable to copy.
|
|
35
|
+
$tree-view-item-disabled-color: cv.getVar("text-weak") !default;
|
|
36
|
+
$tree-view-gap: 0.375em !default;
|
|
37
|
+
$tree-view-toggle-size: 1em !default;
|
|
38
|
+
$tree-view-toggle-color: currentColor !default;
|
|
39
|
+
$tree-view-toggle-duration: cv.getVar("duration") !default;
|
|
40
|
+
|
|
41
|
+
.#{iv.$class-prefix}tree-view {
|
|
42
|
+
@include cv.register-vars(
|
|
43
|
+
(
|
|
44
|
+
"tree-view-item-h": #{$tree-view-item-h},
|
|
45
|
+
"tree-view-item-s": #{$tree-view-item-s},
|
|
46
|
+
"tree-view-item-background-l": #{$tree-view-item-background-l},
|
|
47
|
+
"tree-view-item-background-l-delta": #{$tree-view-item-background-l-delta},
|
|
48
|
+
"tree-view-item-hover-background-l-delta": #{$tree-view-item-hover-background-l-delta},
|
|
49
|
+
"tree-view-item-active-background-l-delta": #{$tree-view-item-active-background-l-delta},
|
|
50
|
+
"tree-view-item-color-l": #{$tree-view-item-color-l},
|
|
51
|
+
"tree-view-item-radius": #{$tree-view-item-radius},
|
|
52
|
+
"tree-view-item-padding": #{$tree-view-item-padding},
|
|
53
|
+
"tree-view-item-selected-h": #{$tree-view-item-selected-h},
|
|
54
|
+
"tree-view-item-selected-s": #{$tree-view-item-selected-s},
|
|
55
|
+
"tree-view-item-selected-background-l": #{$tree-view-item-selected-background-l},
|
|
56
|
+
"tree-view-item-selected-color-l": #{$tree-view-item-selected-color-l},
|
|
57
|
+
"tree-view-line-height": #{$tree-view-line-height},
|
|
58
|
+
"tree-view-group-border": #{$tree-view-group-border},
|
|
59
|
+
"tree-view-group-margin": #{$tree-view-group-margin},
|
|
60
|
+
"tree-view-group-padding": #{$tree-view-group-padding},
|
|
61
|
+
"tree-view-item-disabled-color": #{$tree-view-item-disabled-color},
|
|
62
|
+
"tree-view-gap": #{$tree-view-gap},
|
|
63
|
+
"tree-view-toggle-size": #{$tree-view-toggle-size},
|
|
64
|
+
"tree-view-toggle-color": #{$tree-view-toggle-color},
|
|
65
|
+
"tree-view-toggle-duration": #{$tree-view-toggle-duration},
|
|
66
|
+
)
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// The sizes are the menu's: the font size, which the padding, the indent and
|
|
71
|
+
// the chevron follow, since they're all in em.
|
|
72
|
+
.#{iv.$class-prefix}tree-view {
|
|
73
|
+
font-size: cv.getVar("size-normal");
|
|
74
|
+
line-height: cv.getVar("tree-view-line-height");
|
|
75
|
+
list-style: none;
|
|
76
|
+
margin: 0;
|
|
77
|
+
padding: 0;
|
|
78
|
+
|
|
79
|
+
&.#{iv.$class-prefix}is-small {
|
|
80
|
+
font-size: cv.getVar("size-small");
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
&.#{iv.$class-prefix}is-medium {
|
|
84
|
+
font-size: cv.getVar("size-medium");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
&.#{iv.$class-prefix}is-large {
|
|
88
|
+
font-size: cv.getVar("size-large");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// The nested menu list's guide line, inline margins and indent. The menu
|
|
93
|
+
// gives a nested list the same margin above and below, which leaves a gap
|
|
94
|
+
// over and under every open group, so the block margin is dropped.
|
|
95
|
+
.#{iv.$class-prefix}tree-view-group {
|
|
96
|
+
border-inline-start: cv.getVar("tree-view-group-border");
|
|
97
|
+
list-style: none;
|
|
98
|
+
margin-block: 0;
|
|
99
|
+
margin-inline: cv.getVar("tree-view-group-margin");
|
|
100
|
+
padding: 0;
|
|
101
|
+
padding-inline-start: cv.getVar("tree-view-group-padding");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Focus shows on the row, outside it, so it's seen on the selected fill too.
|
|
105
|
+
.#{iv.$class-prefix}tree-view-item {
|
|
106
|
+
&:focus {
|
|
107
|
+
outline: none;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
&:focus-visible > .#{iv.$class-prefix}tree-view-row {
|
|
111
|
+
@include extras-focus-outline;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// The menu item's row, laid out as a line of its parts.
|
|
116
|
+
.#{iv.$class-prefix}tree-view-row {
|
|
117
|
+
align-items: center;
|
|
118
|
+
background-color: hsl(
|
|
119
|
+
#{cv.getVar("tree-view-item-h")},
|
|
120
|
+
#{cv.getVar("tree-view-item-s")},
|
|
121
|
+
calc(
|
|
122
|
+
#{cv.getVar("tree-view-item-background-l")} + #{cv.getVar("tree-view-item-background-l-delta")}
|
|
123
|
+
)
|
|
124
|
+
);
|
|
125
|
+
border-radius: cv.getVar("tree-view-item-radius");
|
|
126
|
+
color: hsl(
|
|
127
|
+
#{cv.getVar("tree-view-item-h")},
|
|
128
|
+
#{cv.getVar("tree-view-item-s")},
|
|
129
|
+
#{cv.getVar("tree-view-item-color-l")}
|
|
130
|
+
);
|
|
131
|
+
cursor: pointer;
|
|
132
|
+
display: flex;
|
|
133
|
+
gap: cv.getVar("tree-view-gap");
|
|
134
|
+
padding: cv.getVar("tree-view-item-padding");
|
|
135
|
+
|
|
136
|
+
&:hover {
|
|
137
|
+
@include cv.register-vars(
|
|
138
|
+
(
|
|
139
|
+
"tree-view-item-background-l-delta": #{cv.getVar("tree-view-item-hover-background-l-delta")},
|
|
140
|
+
)
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
&:active {
|
|
145
|
+
@include cv.register-vars(
|
|
146
|
+
(
|
|
147
|
+
"tree-view-item-background-l-delta": #{cv.getVar("tree-view-item-active-background-l-delta")},
|
|
148
|
+
)
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
&.#{iv.$class-prefix}is-selected {
|
|
153
|
+
@include cv.register-vars(
|
|
154
|
+
(
|
|
155
|
+
"tree-view-item-h": #{cv.getVar("tree-view-item-selected-h")},
|
|
156
|
+
"tree-view-item-s": #{cv.getVar("tree-view-item-selected-s")},
|
|
157
|
+
"tree-view-item-background-l": #{cv.getVar("tree-view-item-selected-background-l")},
|
|
158
|
+
"tree-view-item-color-l": #{cv.getVar("tree-view-item-selected-color-l")},
|
|
159
|
+
)
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// After the hover and press tints, which it takes away.
|
|
164
|
+
&.#{iv.$class-prefix}is-disabled {
|
|
165
|
+
@include cv.register-vars(
|
|
166
|
+
(
|
|
167
|
+
"tree-view-item-background-l-delta": 0%,
|
|
168
|
+
)
|
|
169
|
+
);
|
|
170
|
+
color: cv.getVar("tree-view-item-disabled-color");
|
|
171
|
+
cursor: default;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// The chevron's box is on every row, so the labels line up whether an item
|
|
176
|
+
// is a parent or not.
|
|
177
|
+
.#{iv.$class-prefix}tree-view-toggle {
|
|
178
|
+
align-items: center;
|
|
179
|
+
display: inline-flex;
|
|
180
|
+
flex: none;
|
|
181
|
+
height: cv.getVar("tree-view-toggle-size");
|
|
182
|
+
justify-content: center;
|
|
183
|
+
width: cv.getVar("tree-view-toggle-size");
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// The chevron, on a parent, drawn the way Bulma's `%arrow` draws the
|
|
187
|
+
// `.select` arrow: two sides of a square, turned. It points to the end of
|
|
188
|
+
// the line while closed and down while open. It's in the row's text color,
|
|
189
|
+
// where Bulma's arrow takes the link color, which would vanish on the
|
|
190
|
+
// selected fill. It's a border, so it stays in forced colors.
|
|
191
|
+
.#{iv.$class-prefix}tree-view-item[aria-expanded] > .#{iv.$class-prefix}tree-view-row > .#{iv.$class-prefix}tree-view-toggle::after {
|
|
192
|
+
// The square's bottom and left sides before it's turned, so physical
|
|
193
|
+
// sides, like the turn.
|
|
194
|
+
border-color: cv.getVar("tree-view-toggle-color");
|
|
195
|
+
border-style: solid;
|
|
196
|
+
border-width: 0 0 0.125em 0.125em;
|
|
197
|
+
content: "";
|
|
198
|
+
height: 0.5em;
|
|
199
|
+
transform: translateX(-15%) rotate(-135deg);
|
|
200
|
+
transition-duration: cv.getVar("tree-view-toggle-duration");
|
|
201
|
+
transition-property: transform;
|
|
202
|
+
width: 0.5em;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.#{iv.$class-prefix}tree-view-item[aria-expanded="false"]:dir(rtl) > .#{iv.$class-prefix}tree-view-row > .#{iv.$class-prefix}tree-view-toggle::after {
|
|
206
|
+
transform: translateX(15%) rotate(45deg);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.#{iv.$class-prefix}tree-view-item[aria-expanded="true"] > .#{iv.$class-prefix}tree-view-row > .#{iv.$class-prefix}tree-view-toggle::after {
|
|
210
|
+
transform: translateY(-15%) rotate(-45deg);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.#{iv.$class-prefix}tree-view-check,
|
|
214
|
+
.#{iv.$class-prefix}tree-view-icon {
|
|
215
|
+
display: inline-flex;
|
|
216
|
+
flex: none;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// The box is Checkbox's, drawn the way Checkbox draws it. A press on it is
|
|
220
|
+
// the row's, so it never takes focus and the row's click checks it.
|
|
221
|
+
.#{iv.$class-prefix}tree-view-check > * {
|
|
222
|
+
pointer-events: none;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.#{iv.$class-prefix}tree-view-label {
|
|
226
|
+
flex: 1 1 auto;
|
|
227
|
+
min-width: 0;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
@media (forced-colors: active) {
|
|
231
|
+
// Forced colors takes the fill away, so the selected row asks for the
|
|
232
|
+
// system's own pair, and keeps its text and chevron in it.
|
|
233
|
+
.#{iv.$class-prefix}tree-view-row.#{iv.$class-prefix}is-selected {
|
|
234
|
+
background-color: Highlight;
|
|
235
|
+
color: HighlightText;
|
|
236
|
+
forced-color-adjust: none;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.#{iv.$class-prefix}tree-view-row.#{iv.$class-prefix}is-disabled {
|
|
240
|
+
color: GrayText;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.#{iv.$class-prefix}tree-view-item:focus-visible > .#{iv.$class-prefix}tree-view-row {
|
|
244
|
+
outline-color: CanvasText;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
@media (prefers-reduced-motion: reduce) {
|
|
249
|
+
.#{iv.$class-prefix}tree-view-item[aria-expanded] > .#{iv.$class-prefix}tree-view-row > .#{iv.$class-prefix}tree-view-toggle::after {
|
|
250
|
+
transition: none;
|
|
251
|
+
}
|
|
252
|
+
}
|