@ulu/frontend 0.2.1 → 0.3.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.
- package/README.dev.md +16 -0
- package/dist/es/index.js +18 -16
- package/dist/es/ui/dialog.d.ts +3 -1
- package/dist/es/ui/dialog.d.ts.map +1 -1
- package/dist/es/ui/dialog.js +57 -51
- package/dist/es/ui/modal-builder.d.ts +6 -0
- package/dist/es/ui/modal-builder.d.ts.map +1 -1
- package/dist/es/ui/modal-builder.js +53 -45
- package/dist/es/utils/dialog.d.ts +14 -0
- package/dist/es/utils/dialog.d.ts.map +1 -0
- package/dist/es/utils/dialog.js +16 -0
- package/dist/es/utils/iframe.d.ts +15 -0
- package/dist/es/utils/iframe.d.ts.map +1 -0
- package/dist/es/utils/iframe.js +33 -0
- package/dist/es/utils/index.d.ts +1 -0
- package/dist/umd/frontend.css +1 -1
- package/dist/umd/ulu-frontend.umd.js +12 -12
- package/lib/js/exports.md +1 -0
- package/lib/js/ui/dialog.js +23 -3
- package/lib/js/ui/modal-builder.js +21 -0
- package/lib/js/utils/dialog.js +29 -0
- package/lib/js/utils/iframe.js +59 -0
- package/lib/js/utils/index.js +4 -1
- package/lib/scss/_color.scss +1 -1
- package/lib/scss/_element.scss +15 -0
- package/lib/scss/_utils.scss +22 -0
- package/lib/scss/base/_elements.scss +3 -0
- package/lib/scss/components/_accordion.scss +7 -2
- package/lib/scss/components/_badge.scss +1 -1
- package/lib/scss/components/_button-group.scss +8 -3
- package/lib/scss/components/_card-grid.scss +8 -14
- package/lib/scss/components/_card.scss +15 -13
- package/lib/scss/components/_data-list.scss +270 -0
- package/lib/scss/components/_data-table.scss +3 -1
- package/lib/scss/components/_index.scss +12 -0
- package/lib/scss/components/_menu-stack.scss +1 -1
- package/lib/scss/components/_modal.scss +97 -19
- package/lib/scss/components/_ratio-box.scss +11 -10
- package/lib/scss/components/_table-scroller.scss +63 -0
- package/lib/scss/helpers/_utilities.scss +23 -1
- package/package.json +4 -1
package/lib/scss/_element.scss
CHANGED
|
@@ -430,3 +430,18 @@ $rule-margins: (
|
|
|
430
430
|
content: "";
|
|
431
431
|
}
|
|
432
432
|
}
|
|
433
|
+
|
|
434
|
+
/// Helper function to construct a border using the color module
|
|
435
|
+
/// Returns null if the required parameters are missing or zero, preventing output
|
|
436
|
+
/// @param {Dimension} $width The border width
|
|
437
|
+
/// @param {String|Color} $color The color value/key to resolve through color.get()
|
|
438
|
+
/// @param {String} $style [solid] The border style
|
|
439
|
+
/// @return {List|Null} The combined border shorthand, or null
|
|
440
|
+
|
|
441
|
+
@function optional-border($width, $color, $style: solid) {
|
|
442
|
+
// Not using () breaks syntax highlighting
|
|
443
|
+
@if $width and $width != 0 and $width != none and $color {
|
|
444
|
+
@return $width $style color.get($color);
|
|
445
|
+
}
|
|
446
|
+
@return null;
|
|
447
|
+
}
|
package/lib/scss/_utils.scss
CHANGED
|
@@ -889,4 +889,26 @@ $config: (
|
|
|
889
889
|
|
|
890
890
|
@function is-side($edge) {
|
|
891
891
|
@return not is-end($edge);
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
/// For legacy aspect ratio conversion
|
|
895
|
+
/// - For a given value if it's a percentage number convert to css aspect ratio like 16/9
|
|
896
|
+
/// @param {String|Number} $value The ratio value to normalize.
|
|
897
|
+
/// @return {String} Either the original value or a converted value depending on if it was a percentage number
|
|
898
|
+
|
|
899
|
+
@function normalize-aspect-ratio($value) {
|
|
900
|
+
@if is-number($value) and not math.is-unitless($value) {
|
|
901
|
+
$info: number-info($value);
|
|
902
|
+
@if ($info) {
|
|
903
|
+
$u: map.get($info, "unit");
|
|
904
|
+
$v: map.get($info, "value");
|
|
905
|
+
@if $u == "%" {
|
|
906
|
+
@return string.unquote("100 / #{ $v }");
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
@if is-string($value) {
|
|
911
|
+
@return string.unquote($value);
|
|
912
|
+
}
|
|
913
|
+
@return $value;
|
|
892
914
|
}
|
|
@@ -163,7 +163,7 @@ $config: (
|
|
|
163
163
|
border-bottom-left-radius: 0;
|
|
164
164
|
border-bottom-right-radius: 0;
|
|
165
165
|
|
|
166
|
-
@if (get("summary-border-enabled")) {
|
|
166
|
+
@if (get("summary-border-enabled")) {
|
|
167
167
|
&::after {
|
|
168
168
|
content: "";
|
|
169
169
|
position: absolute;
|
|
@@ -191,7 +191,7 @@ $config: (
|
|
|
191
191
|
align-items: center;
|
|
192
192
|
|
|
193
193
|
@include typography.optional-size(get("summary-type-size"), $only-font-size: true);
|
|
194
|
-
@include element.summary-remove-marker;
|
|
194
|
+
@include element.summary-remove-marker();
|
|
195
195
|
&:hover,
|
|
196
196
|
&:focus {
|
|
197
197
|
background-color: color.get(get("summary-background-color-hover"));
|
|
@@ -262,6 +262,11 @@ $config: (
|
|
|
262
262
|
& > #{ $prefix }__summary {
|
|
263
263
|
border-radius: get("border-radius");
|
|
264
264
|
border-bottom: none;
|
|
265
|
+
@if (get("summary-border-enabled")) {
|
|
266
|
+
&::after {
|
|
267
|
+
content: none;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
265
270
|
}
|
|
266
271
|
}
|
|
267
272
|
}
|
|
@@ -13,11 +13,13 @@
|
|
|
13
13
|
|
|
14
14
|
/// Module Settings
|
|
15
15
|
/// @type Map
|
|
16
|
-
/// @prop {Dimension}
|
|
16
|
+
/// @prop {Dimension} gap [0.45em] Gap between buttons
|
|
17
|
+
/// @prop {Dimension} gap-joined [0] When using --joined modifier optional gap, if 0 the buttons borders will overlap, joined-gap is useful if your buttons don't have borders
|
|
17
18
|
/// @prop {Boolean} no-min-width [true] Buttons within the button group should have no min width
|
|
18
19
|
|
|
19
20
|
$config: (
|
|
20
21
|
"gap": 0.45em,
|
|
22
|
+
"gap-joined" : 0,
|
|
21
23
|
"no-min-width" : true
|
|
22
24
|
) !default;
|
|
23
25
|
|
|
@@ -61,13 +63,16 @@ $config: (
|
|
|
61
63
|
#{ $prefix }--joined {
|
|
62
64
|
flex-wrap: nowrap;
|
|
63
65
|
overflow-x: auto;
|
|
64
|
-
gap:
|
|
66
|
+
gap: get("gap-joined");
|
|
65
67
|
// border-radius: button.get("border-radius");
|
|
66
68
|
#{ $prefix-button } {
|
|
67
69
|
position: relative; // To move to front when hover/active
|
|
68
70
|
border-radius: 0;
|
|
69
71
|
min-width: 0;
|
|
70
|
-
|
|
72
|
+
@if (get("gap-joined") == 0) {
|
|
73
|
+
margin-left: -(button.get("border-width"));
|
|
74
|
+
}
|
|
75
|
+
|
|
71
76
|
&:first-child {
|
|
72
77
|
border-top-left-radius: $button-radius;
|
|
73
78
|
border-bottom-left-radius: $button-radius;
|
|
@@ -11,16 +11,16 @@
|
|
|
11
11
|
|
|
12
12
|
/// Module Settings
|
|
13
13
|
/// @type Map
|
|
14
|
-
/// @prop {
|
|
15
|
-
/// @prop {Dimension}
|
|
16
|
-
/// @prop {Dimension} gap [
|
|
17
|
-
/// @prop {
|
|
14
|
+
/// @prop {Dimension} gap [1.5rem] The grid gap of the card-grid.
|
|
15
|
+
/// @prop {Dimension} min-width [20rem] The min-width for the implicit grid columns.
|
|
16
|
+
/// @prop {Dimension} compact-gap [0.75rem] The grid gap of the card-grid--compact.
|
|
17
|
+
/// @prop {Dimension} compact-min-width [14rem] The min-width for the implicit grid columns of the card-grid--compact.
|
|
18
18
|
|
|
19
19
|
$config: (
|
|
20
20
|
"gap" : 1.5rem,
|
|
21
|
-
"
|
|
21
|
+
"min-width" : 20rem,
|
|
22
22
|
"compact-gap" : 0.75rem,
|
|
23
|
-
"compact-
|
|
23
|
+
"compact-min-width" : 14rem,
|
|
24
24
|
) !default;
|
|
25
25
|
|
|
26
26
|
/// Change modules $config
|
|
@@ -51,12 +51,11 @@ $config: (
|
|
|
51
51
|
|
|
52
52
|
#{ $prefix } {
|
|
53
53
|
display: grid;
|
|
54
|
-
grid-template-columns: get("
|
|
54
|
+
grid-template-columns: repeat(auto-fill, minmax(min(100%, get("min-width")), 1fr));
|
|
55
55
|
grid-auto-rows: 1fr;
|
|
56
56
|
gap: get("gap");
|
|
57
57
|
margin: get("gap") 0;
|
|
58
58
|
#{ $prefix-card } {
|
|
59
|
-
max-width: none;
|
|
60
59
|
margin: 0;
|
|
61
60
|
&:not(#{ $prefix-card }--overlay) {
|
|
62
61
|
height: 100%;
|
|
@@ -64,7 +63,7 @@ $config: (
|
|
|
64
63
|
}
|
|
65
64
|
}
|
|
66
65
|
#{ $prefix }--compact {
|
|
67
|
-
grid-template-columns: get("compact-
|
|
66
|
+
grid-template-columns: repeat(auto-fill, minmax(min(100%, get("compact-min-width")), 1fr));
|
|
68
67
|
gap: get("compact-gap");
|
|
69
68
|
}
|
|
70
69
|
#{ $prefix }--one-column {
|
|
@@ -73,9 +72,4 @@ $config: (
|
|
|
73
72
|
#{ $prefix }--rows-fit {
|
|
74
73
|
grid-auto-rows: auto;
|
|
75
74
|
}
|
|
76
|
-
@include breakpoint.max("small") {
|
|
77
|
-
#{ $prefix } {
|
|
78
|
-
grid-template-columns: 1fr;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
75
|
}
|
|
@@ -235,9 +235,6 @@ $config: (
|
|
|
235
235
|
flex-direction: column;
|
|
236
236
|
min-height: get("body-min-height");
|
|
237
237
|
}
|
|
238
|
-
#{ $prefix }__main {
|
|
239
|
-
flex-grow: 1;
|
|
240
|
-
}
|
|
241
238
|
#{ $prefix }__footer {
|
|
242
239
|
grid-column: 1;
|
|
243
240
|
display: flex;
|
|
@@ -509,19 +506,23 @@ $config: (
|
|
|
509
506
|
}
|
|
510
507
|
}
|
|
511
508
|
}
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
509
|
+
|
|
510
|
+
@include when-clickable($hover: true) {
|
|
511
|
+
&#{ $prefix }--overlay {
|
|
512
|
+
#{ $prefix }__body,
|
|
513
|
+
#{ $prefix }__footer {
|
|
514
|
+
background-color: color.get(get("overlay-background-color-hover"));
|
|
515
|
+
}
|
|
516
|
+
@if (get("overlay-shading")) {
|
|
517
|
+
#{ $prefix }__body {
|
|
518
|
+
@include -overlay-shading-gradient(
|
|
519
|
+
color.get(get("overlay-background-color-hover"))
|
|
520
|
+
);
|
|
521
|
+
}
|
|
522
522
|
}
|
|
523
523
|
}
|
|
524
524
|
}
|
|
525
|
+
|
|
525
526
|
#{ $prefix }--overlay#{ $prefix }--footer-inline {
|
|
526
527
|
grid-template-columns: 1fr auto;
|
|
527
528
|
#{ $prefix }__footer {
|
|
@@ -561,6 +562,7 @@ $config: (
|
|
|
561
562
|
justify-content: space-between;
|
|
562
563
|
}
|
|
563
564
|
#{ $prefix }__main {
|
|
565
|
+
flex-grow: 1;
|
|
564
566
|
max-width: get("horizontal-main-max-width");
|
|
565
567
|
}
|
|
566
568
|
#{ $prefix }__aside {
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
////
|
|
2
|
+
/// @group data-list
|
|
3
|
+
/// A highly flexible, responsive list layout designed for displaying self-explanatory
|
|
4
|
+
/// or loosely structured data without relying on rigid table markup. On large screens,
|
|
5
|
+
/// it perfectly aligns item content into distinct columns using CSS Subgrid, while
|
|
6
|
+
/// seamlessly adapting to a clean, stacked flex view on smaller devices. Because it
|
|
7
|
+
/// is fundamentally a list and not a data table, content within should be comprehensible
|
|
8
|
+
/// when stacked without relying on explicit column headers. It handles complex structures
|
|
9
|
+
/// through nested groupings, supports optional visual headers, and provides interactive
|
|
10
|
+
/// states for clickable rows using simple presets or custom grids.
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
/// Benchmarks:
|
|
14
|
+
/// - size: 3kb (gzip 0.7 KB)
|
|
15
|
+
|
|
16
|
+
@use "sass:map";
|
|
17
|
+
@use "sass:math";
|
|
18
|
+
@use "sass:meta";
|
|
19
|
+
|
|
20
|
+
@use "../selector";
|
|
21
|
+
@use "../utils";
|
|
22
|
+
@use "../color";
|
|
23
|
+
@use "../breakpoint";
|
|
24
|
+
@use "../element";
|
|
25
|
+
|
|
26
|
+
// Used for function fallback
|
|
27
|
+
$-fallbacks: (
|
|
28
|
+
"stacked-breakpoint" : (
|
|
29
|
+
"function" : meta.get-function("get", false, "breakpoint"),
|
|
30
|
+
"property" : "default"
|
|
31
|
+
)
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
/// Module Settings
|
|
35
|
+
/// @type Map
|
|
36
|
+
/// @prop {String} grid-template-columns [1fr] The default master grid columns.
|
|
37
|
+
/// @prop {String} grid-template-columns-stacked [100%] The stacked grid columns (default is single column stack).
|
|
38
|
+
/// @prop {Dimension} row-gap [0] The space between list items (rows). Forced to 0 if overlap-borders is true.
|
|
39
|
+
/// @prop {Dimension} column-gap [1rem] The space between columns.
|
|
40
|
+
/// @prop {Dimension} column-gap-stacked [0.5rem] The space between stacked elements when stacked within an item.
|
|
41
|
+
/// @prop {Dimension} group-gap-stacked [0.25rem] The space between stacked elements inside a nested column when stacked.
|
|
42
|
+
/// @prop {Dimension} padding [1rem clamp(0.65rem, 3vw, 1.5rem),] The padding inside list items.
|
|
43
|
+
/// @prop {Boolean} overlap-borders [true] If true, applies a negative top margin to items to prevent double-thick borders between touching rows, and forces row-gap to 0.
|
|
44
|
+
/// @prop {Dimension} border-width [1px] The border width for the list items.
|
|
45
|
+
/// @prop {String} border-color ["rule-light"] The border color key for the list items.
|
|
46
|
+
/// @prop {Dimension} border-radius [null] The border radius for the list items.
|
|
47
|
+
/// @prop {CssValue} box-shadow [null] The box shadow for the list items.
|
|
48
|
+
/// @prop {Color} background-color [transparent] The default background color for items.
|
|
49
|
+
/// @prop {Color} background-color-even [null] The background color for even-numbered items (for striping).
|
|
50
|
+
/// @prop {Color} background-color-hover [null] The background color for items on hover.
|
|
51
|
+
/// @prop {Color} clickable-background-color-hover [#e8e8e8] The background color for clickable items on hover.
|
|
52
|
+
/// @prop {String} clickable-border-color-hover ["control-border-hover"] The border color for interactive (clickable) items on hover/focus.
|
|
53
|
+
/// @prop {String} stacked-breakpoint [true] The breakpoint below which groups stack. Defaults to the global default breakpoint via function fallback.
|
|
54
|
+
/// @prop {Number} span-count [4] The number of span modifiers to create, increase if needed, (ie. data-list__column--span-2, --span-3, ...)
|
|
55
|
+
/// @prop {CssValue} header-font-weight [bold] The font weight for the header row text.
|
|
56
|
+
/// @prop {Dimension} header-border-bottom-width [2px] The width for the bottom border of the header row.
|
|
57
|
+
/// @prop {String} header-border-bottom-color ["rule"] The color key for the bottom border of the header row.
|
|
58
|
+
|
|
59
|
+
$config: (
|
|
60
|
+
"grid-template-columns": 1fr,
|
|
61
|
+
"grid-template-columns-stacked": 100%,
|
|
62
|
+
"row-gap": 0,
|
|
63
|
+
"column-gap": 1rem,
|
|
64
|
+
"column-gap-stacked": 0.5rem,
|
|
65
|
+
"group-gap-stacked": 0.25rem,
|
|
66
|
+
"padding": 1rem clamp(0.65rem, 3vw, 1.5rem),
|
|
67
|
+
"overlap-borders": true,
|
|
68
|
+
"border-width": 1px,
|
|
69
|
+
"border-color": "rule-light",
|
|
70
|
+
"border-radius": null,
|
|
71
|
+
"box-shadow": null,
|
|
72
|
+
"background-color": transparent,
|
|
73
|
+
"background-color-even": #f9f9f9,
|
|
74
|
+
"background-color-hover": #f0f0f0,
|
|
75
|
+
"clickable-background-color-hover": #e8e8e8, // Slightly darker for interactive indication
|
|
76
|
+
"clickable-border-color-hover": "control-border-hover",
|
|
77
|
+
"stacked-breakpoint": true,
|
|
78
|
+
"span-count" : 6,
|
|
79
|
+
"header-font-weight": bold,
|
|
80
|
+
"header-border-bottom-width": 2px,
|
|
81
|
+
"header-border-bottom-color": "rule",
|
|
82
|
+
) !default;
|
|
83
|
+
|
|
84
|
+
/// Change modules $config
|
|
85
|
+
/// @param {Map} $changes Map of changes
|
|
86
|
+
@mixin set($changes) {
|
|
87
|
+
$config: map.merge($config, $changes) !global;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/// Get a config option
|
|
91
|
+
/// @param {Map} $name Name of property
|
|
92
|
+
@function get($name) {
|
|
93
|
+
$value: utils.require-map-get($config, $name, "data-list [config]");
|
|
94
|
+
@return utils.function-fallback($name, $value, $-fallbacks);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/// Prints component styles
|
|
98
|
+
/// @demo data-list
|
|
99
|
+
@mixin styles {
|
|
100
|
+
@include utils.file-header('component', 'data-list');
|
|
101
|
+
|
|
102
|
+
$prefix: selector.class("data-list");
|
|
103
|
+
$stacked-bp: get("stacked-breakpoint");
|
|
104
|
+
$overlap: get("overlap-borders");
|
|
105
|
+
$border-width: get("border-width");
|
|
106
|
+
|
|
107
|
+
#{ $prefix } {
|
|
108
|
+
display: grid;
|
|
109
|
+
|
|
110
|
+
@if $overlap {
|
|
111
|
+
gap: 0; // Forced to 0 when borders overlap to prevent disjointed negative margins
|
|
112
|
+
} @else {
|
|
113
|
+
gap: var(--ulu-data-list-row-gap, get("row-gap"));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Allows inline override via custom property, falls back to config default
|
|
117
|
+
grid-template-columns: var(--ulu-data-list-columns, get("grid-template-columns"));
|
|
118
|
+
list-style: none;
|
|
119
|
+
margin: 0;
|
|
120
|
+
padding: 0;
|
|
121
|
+
|
|
122
|
+
@include breakpoint.max($stacked-bp) {
|
|
123
|
+
// Switch to stacked grid template (defaults to 100% stack, but can be overridden for persistent cols)
|
|
124
|
+
grid-template-columns: var(--ulu-data-list-columns-stacked, get("grid-template-columns-stacked"));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Row Item (Passes the grid down)
|
|
129
|
+
#{ $prefix }__item {
|
|
130
|
+
display: grid;
|
|
131
|
+
grid-template-columns: subgrid;
|
|
132
|
+
grid-column: 1 / -1;
|
|
133
|
+
gap: var(--ulu-data-list-column-gap, get("column-gap"));
|
|
134
|
+
padding: get("padding");
|
|
135
|
+
background-color: color.get(get("background-color"));
|
|
136
|
+
border: element.optional-border($border-width, get("border-color"));
|
|
137
|
+
border-radius: get("border-radius");
|
|
138
|
+
box-shadow: get("box-shadow");
|
|
139
|
+
|
|
140
|
+
@if $overlap {
|
|
141
|
+
margin-top: calc(-1 * #{ $border-width });
|
|
142
|
+
&:first-child {
|
|
143
|
+
margin-top: 0;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
@include breakpoint.max($stacked-bp) {
|
|
150
|
+
// We keep display: grid/subgrid here to respect the stacked parent grid
|
|
151
|
+
gap: var(--ulu-data-list-column-gap-stacked, get("column-gap-stacked"));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
@if (get("background-color-hover")) {
|
|
155
|
+
&:hover {
|
|
156
|
+
background-color: color.get(get("background-color-hover"));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Interactive z-index management for borders/shadows
|
|
162
|
+
#{ $prefix }__item:hover,
|
|
163
|
+
#{ $prefix }__item:focus-within,
|
|
164
|
+
#{ $prefix }__header #{ $prefix }__item {
|
|
165
|
+
position: relative;
|
|
166
|
+
z-index: 2;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Columns (The cells / wrappers)
|
|
170
|
+
#{ $prefix }__column {
|
|
171
|
+
display: flex;
|
|
172
|
+
align-items: center;
|
|
173
|
+
gap: var(--ulu-data-list-column-gap, get("column-gap"));
|
|
174
|
+
// Defensive Layout: Prevents flexbox/grid from refusing to shrink below intrinsic content size.
|
|
175
|
+
// Without this, a long unbroken word or URL could force the column to expand, blowing out the grid.
|
|
176
|
+
// It allows text-overflow: ellipsis to work safely within a column without breaking the layout.
|
|
177
|
+
min-width: 0;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Automatic Groups (Subgrid on desktop, stack on smaller screens)
|
|
181
|
+
#{ $prefix }__column:has(> #{ $prefix }__column) {
|
|
182
|
+
display: grid;
|
|
183
|
+
grid-template-columns: subgrid;
|
|
184
|
+
// Default span is 1, use modifiers below for larger spans
|
|
185
|
+
|
|
186
|
+
@include breakpoint.max($stacked-bp) {
|
|
187
|
+
display: flex;
|
|
188
|
+
flex-direction: column;
|
|
189
|
+
justify-content: center;
|
|
190
|
+
align-items: stretch;
|
|
191
|
+
gap: var(--ulu-data-list-group-gap-stacked, get("group-gap-stacked")); // Tighter vertical gap when stacked
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Header Row (Optional)
|
|
196
|
+
#{ $prefix }__header {
|
|
197
|
+
display: contents; // Removes wrapper so children participate in grid
|
|
198
|
+
|
|
199
|
+
// Hide headers when stacked since columns stack
|
|
200
|
+
@include breakpoint.max($stacked-bp) {
|
|
201
|
+
display: none;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
#{ $prefix }__item {
|
|
205
|
+
font-weight: get("header-font-weight");
|
|
206
|
+
background-color: transparent;
|
|
207
|
+
border-bottom: element.optional-border(get("header-border-bottom-width"), get("header-border-bottom-color"));
|
|
208
|
+
border-radius: 0; // Prevent rounding on headers
|
|
209
|
+
&:hover {
|
|
210
|
+
background-color: transparent; // No hover effect on headers
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Modifiers
|
|
216
|
+
|
|
217
|
+
// Structural Edge Modifiers (Decorating the default 1fr track)
|
|
218
|
+
#{ $prefix }--prefixed {
|
|
219
|
+
grid-template-columns: var(--ulu-data-list-columns, auto 1fr);
|
|
220
|
+
@include breakpoint.max($stacked-bp) {
|
|
221
|
+
grid-template-columns: var(--ulu-data-list-columns-stacked, auto 1fr);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
#{ $prefix }--suffixed {
|
|
225
|
+
grid-template-columns: var(--ulu-data-list-columns, 1fr auto);
|
|
226
|
+
@include breakpoint.max($stacked-bp) {
|
|
227
|
+
grid-template-columns: var(--ulu-data-list-columns-stacked, 1fr auto);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
#{ $prefix }--prefixed#{ $prefix }--suffixed {
|
|
231
|
+
grid-template-columns: var(--ulu-data-list-columns, auto 1fr auto);
|
|
232
|
+
@include breakpoint.max($stacked-bp) {
|
|
233
|
+
grid-template-columns: var(--ulu-data-list-columns-stacked, auto 1fr auto);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Striped Rows
|
|
238
|
+
#{ $prefix }--striped {
|
|
239
|
+
@if (get("background-color-even")) {
|
|
240
|
+
#{ $prefix }__item:nth-child(even) {
|
|
241
|
+
background-color: color.get(get("background-color-even"));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Interactive Rows (Proxy Click Support)
|
|
247
|
+
// Applied to parent to indicate all rows are interactive
|
|
248
|
+
#{ $prefix }--clickable {
|
|
249
|
+
#{ $prefix }__item {
|
|
250
|
+
cursor: pointer;
|
|
251
|
+
&:hover,
|
|
252
|
+
&:focus-within {
|
|
253
|
+
background-color: color.get(get("clickable-background-color-hover"));
|
|
254
|
+
border-color: color.get(get("clickable-border-color-hover"));
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Spanning (Required when a subgrid contains multiple child columns)
|
|
260
|
+
@for $i from 2 through get("span-count") {
|
|
261
|
+
#{ $prefix }__column--span-#{$i} {
|
|
262
|
+
grid-column: span #{$i};
|
|
263
|
+
|
|
264
|
+
// Reset span when stacked so it fits the simplified grid
|
|
265
|
+
@include breakpoint.max($stacked-bp) {
|
|
266
|
+
grid-column: auto;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
@@ -27,6 +27,7 @@ $-fallbacks: (
|
|
|
27
27
|
/// @prop {Dimension} cell-padding [(0.5em,)] Padding of the th and td elements.
|
|
28
28
|
/// @prop {CssValue} text-align [left] Text align of the table.
|
|
29
29
|
/// @prop {String} type-size ["small"] Font size of the table.
|
|
30
|
+
/// @prop {CssValue} vertical-align [top] Vertical align for td/th
|
|
30
31
|
/// @prop {Color} background-color [white] Background color of table container.
|
|
31
32
|
/// @prop {Color} header-background-color [#f5f4f4] Background color of the the table header.
|
|
32
33
|
/// @prop {Color} body-background-color [white] Background color of table body.
|
|
@@ -58,6 +59,7 @@ $config: (
|
|
|
58
59
|
"cell-padding" : (0.5em,),
|
|
59
60
|
"text-align" : left,
|
|
60
61
|
"type-size" : "small",
|
|
62
|
+
"vertical-align" : top,
|
|
61
63
|
"background-color" : white,
|
|
62
64
|
"header-background-color" : #f5f4f4,
|
|
63
65
|
"body-background-color" : white,
|
|
@@ -148,9 +150,9 @@ $config: (
|
|
|
148
150
|
border-bottom: get("caption-border-bottom");
|
|
149
151
|
}
|
|
150
152
|
th,
|
|
151
|
-
tr,
|
|
152
153
|
td {
|
|
153
154
|
text-align: get("text-align");
|
|
155
|
+
vertical-align: get("vertical-align");
|
|
154
156
|
}
|
|
155
157
|
th {
|
|
156
158
|
min-width: get("column-min-width");
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
@forward "css-icon" as css-icon-*;
|
|
20
20
|
@forward "data-grid" as data-grid-*;
|
|
21
21
|
@forward "data-table" as data-table-*;
|
|
22
|
+
@forward "data-list" as data-list-*;
|
|
22
23
|
@forward "definition-list" as definition-list-*;
|
|
23
24
|
@forward "fill-context" as fill-context-*;
|
|
24
25
|
@forward "flipcard" as flipcard-*;
|
|
@@ -52,6 +53,7 @@
|
|
|
52
53
|
@forward "sticky-list" as sticky-list-*;
|
|
53
54
|
@forward "slider" as slider-*;
|
|
54
55
|
@forward "hero" as hero-*;
|
|
56
|
+
@forward "table-scroller" as table-scroller-*;
|
|
55
57
|
@forward "tabs" as tabs-*;
|
|
56
58
|
@forward "tag" as tag-*;
|
|
57
59
|
@forward "tagged" as tagged-*;
|
|
@@ -82,6 +84,7 @@
|
|
|
82
84
|
@use "css-icon";
|
|
83
85
|
@use "data-grid";
|
|
84
86
|
@use "data-table";
|
|
87
|
+
@use "data-list";
|
|
85
88
|
@use "definition-list";
|
|
86
89
|
@use "fill-context";
|
|
87
90
|
@use "flipcard";
|
|
@@ -116,6 +119,7 @@
|
|
|
116
119
|
@use "slider";
|
|
117
120
|
@use "hero";
|
|
118
121
|
@use "tabs";
|
|
122
|
+
@use "table-scroller";
|
|
119
123
|
@use "tag";
|
|
120
124
|
@use "tagged";
|
|
121
125
|
@use "tile-grid";
|
|
@@ -146,6 +150,7 @@ $all-includes: (
|
|
|
146
150
|
"css-icon",
|
|
147
151
|
"data-grid",
|
|
148
152
|
"data-table",
|
|
153
|
+
"data-list",
|
|
149
154
|
"definition-list",
|
|
150
155
|
"fill-context",
|
|
151
156
|
"flipcard",
|
|
@@ -179,6 +184,7 @@ $all-includes: (
|
|
|
179
184
|
"slider",
|
|
180
185
|
"hero",
|
|
181
186
|
"tabs",
|
|
187
|
+
"table-scroller",
|
|
182
188
|
"tag",
|
|
183
189
|
"tagged",
|
|
184
190
|
"tile-grid",
|
|
@@ -281,6 +287,9 @@ $current-includes: $all-includes;
|
|
|
281
287
|
@if (list.index($includes, "data-table")) {
|
|
282
288
|
@include data-table.styles;
|
|
283
289
|
}
|
|
290
|
+
@if (list.index($includes, "data-list")) {
|
|
291
|
+
@include data-list.styles;
|
|
292
|
+
}
|
|
284
293
|
@if (list.index($includes, "definition-list")) {
|
|
285
294
|
@include definition-list.styles;
|
|
286
295
|
}
|
|
@@ -380,6 +389,9 @@ $current-includes: $all-includes;
|
|
|
380
389
|
@if (list.index($includes, "tabs")) {
|
|
381
390
|
@include tabs.styles;
|
|
382
391
|
}
|
|
392
|
+
@if (list.index($includes, "table-scroller")) {
|
|
393
|
+
@include table-scroller.styles;
|
|
394
|
+
}
|
|
383
395
|
@if (list.index($includes, "tile-grid")) {
|
|
384
396
|
@include tile-grid.styles;
|
|
385
397
|
}
|