@allxsmith/bestax-bulma 5.36.0 → 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.
Files changed (44) hide show
  1. package/dist/bestax.css +1 -1
  2. package/dist/bestax.css.map +1 -1
  3. package/dist/esm/components/EmptyState.js +2 -2
  4. package/dist/esm/components/Menu.js +9 -2
  5. package/dist/esm/components/Menu.js.map +1 -1
  6. package/dist/esm/components/Timeline.js +5 -5
  7. package/dist/esm/components/Timeline.js.map +1 -1
  8. package/dist/esm/components/TreeView.js +192 -0
  9. package/dist/esm/components/TreeView.js.map +1 -0
  10. package/dist/esm/helpers/typeahead.js +82 -0
  11. package/dist/esm/helpers/typeahead.js.map +1 -0
  12. package/dist/esm/helpers/useMenuKeys.js +8 -58
  13. package/dist/esm/helpers/useMenuKeys.js.map +1 -1
  14. package/dist/esm/helpers/useTreeView.js +380 -0
  15. package/dist/esm/helpers/useTreeView.js.map +1 -0
  16. package/dist/extras.css +1 -1
  17. package/dist/extras.css.map +1 -1
  18. package/dist/index.cjs +1954 -1370
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.esm.js +1 -0
  21. package/dist/index.esm.js.map +1 -1
  22. package/dist/types/components/Menu.d.ts +5 -0
  23. package/dist/types/components/TreeView.d.ts +115 -0
  24. package/dist/types/helpers/typeahead.d.ts +41 -0
  25. package/dist/types/helpers/useMenuKeys.d.ts +1 -2
  26. package/dist/types/helpers/useTreeView.d.ts +88 -0
  27. package/dist/types/index.d.ts +1 -0
  28. package/dist/types-cjs/components/Menu.d.ts +5 -0
  29. package/dist/types-cjs/components/TreeView.d.ts +115 -0
  30. package/dist/types-cjs/helpers/typeahead.d.ts +41 -0
  31. package/dist/types-cjs/helpers/useMenuKeys.d.ts +1 -2
  32. package/dist/types-cjs/helpers/useTreeView.d.ts +88 -0
  33. package/dist/types-cjs/index.d.ts +1 -0
  34. package/dist/versions/bestax-no-dark-mode.css +1 -1
  35. package/dist/versions/bestax-no-dark-mode.css.map +1 -1
  36. package/dist/versions/bestax-no-helpers-prefixed.css +1 -1
  37. package/dist/versions/bestax-no-helpers-prefixed.css.map +1 -1
  38. package/dist/versions/bestax-no-helpers.css +1 -1
  39. package/dist/versions/bestax-no-helpers.css.map +1 -1
  40. package/dist/versions/bestax-prefixed.css +1 -1
  41. package/dist/versions/bestax-prefixed.css.map +1 -1
  42. package/package.json +1 -1
  43. package/src/scss/components/_index.scss +1 -0
  44. 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
+ }