@livenetworks/ashlar 1.5.1 → 1.6.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.md +189 -177
- package/js/COMPONENTS.md +55 -49
- package/js/index.js +22 -5
- package/js/ln-accordion/README.md +186 -137
- package/js/ln-accordion/ln-accordion.js +1 -1
- package/js/ln-ajax/README.md +73 -4
- package/js/ln-ajax/ln-ajax.js +1 -1
- package/js/ln-ajax/src/ln-ajax.js +13 -13
- package/js/ln-api-connector/README.md +261 -150
- package/js/ln-api-connector/ln-api-connector.js +1 -1
- package/js/ln-api-connector/src/ln-api-connector.js +368 -265
- package/js/ln-api-queue/README.md +219 -0
- package/js/ln-api-queue/ln-api-queue.js +1 -0
- package/js/ln-api-queue/src/ln-api-queue.js +320 -0
- package/js/ln-api-queue/src/queue-storage.js +455 -0
- package/js/ln-autoresize/README.md +47 -0
- package/js/ln-autoresize/ln-autoresize.js +1 -1
- package/js/ln-autosave/README.md +33 -1
- package/js/ln-autosave/ln-autosave.js +1 -1
- package/js/ln-autosave/src/ln-autosave.js +4 -4
- package/js/ln-circular-progress/README.md +27 -13
- package/js/ln-circular-progress/ln-circular-progress.js +1 -1
- package/js/ln-circular-progress/src/ln-circular-progress.js +18 -5
- package/js/ln-confirm/README.md +165 -86
- package/js/ln-confirm/_ln-confirm.scss +11 -0
- package/js/ln-confirm/ln-confirm.js +1 -1
- package/js/ln-confirm/src/ln-confirm.js +82 -42
- package/js/ln-core/README.md +896 -0
- package/js/ln-core/hash.js +92 -0
- package/js/ln-core/helpers.js +337 -8
- package/js/ln-core/index.js +4 -2
- package/js/ln-core/persist.js +29 -3
- package/js/ln-core/positioning.js +1 -35
- package/js/ln-core/window-cache.js +213 -0
- package/js/ln-couchdb-connector/README.md +177 -156
- package/js/ln-couchdb-connector/ln-couchdb-connector.js +1 -1
- package/js/ln-couchdb-connector/src/ln-couchdb-connector.js +398 -348
- package/js/ln-data-coordinator/README.md +536 -165
- package/js/ln-data-coordinator/ln-data-coordinator.js +1 -1
- package/js/ln-data-coordinator/src/data-read-policy.js +18 -0
- package/js/ln-data-coordinator/src/ln-data-coordinator.js +1042 -249
- package/js/ln-data-coordinator/src/mutation-receipts.js +46 -0
- package/js/ln-data-store/README.md +241 -94
- package/js/ln-data-store/ln-data-store.js +1 -1
- package/js/ln-data-store/src/ln-data-store.js +694 -699
- package/js/ln-date/README.md +39 -1
- package/js/ln-date/ln-date-dev.scss +14 -0
- package/js/ln-date/ln-date.js +1 -1
- package/js/ln-date/src/ln-date.js +236 -178
- package/js/ln-debug/README.md +58 -0
- package/js/ln-debug/ln-debug.js +1 -0
- package/js/ln-debug/src/ln-debug.js +19 -0
- package/js/ln-dropdown/README.md +31 -8
- package/js/ln-dropdown/ln-dropdown.js +1 -1
- package/js/ln-dropdown/src/ln-dropdown.js +30 -13
- package/js/ln-editor/README.md +274 -0
- package/js/ln-editor/ln-editor.js +1 -0
- package/js/ln-editor/ln-editor.scss +43 -0
- package/js/ln-editor/src/ln-editor.js +619 -0
- package/js/ln-external-links/README.md +44 -5
- package/js/ln-external-links/ln-external-links.js +1 -1
- package/js/ln-fill/README.md +199 -0
- package/js/ln-fill/ln-fill.js +1 -0
- package/js/ln-fill/src/ln-fill.js +87 -0
- package/js/ln-filter/README.md +92 -2
- package/js/ln-filter/ln-filter-dev.scss +8 -0
- package/js/ln-filter/ln-filter.js +1 -1
- package/js/ln-filter/src/ln-filter.js +22 -7
- package/js/ln-form/README.md +212 -49
- package/js/ln-form/ln-form.js +1 -1
- package/js/ln-form/src/ln-form.js +99 -199
- package/js/ln-http/README.md +125 -89
- package/js/ln-http/ln-http.js +1 -1
- package/js/ln-http/src/ln-http.js +32 -13
- package/js/ln-icon/README.md +130 -0
- package/js/ln-icon/ln-icon.js +1 -0
- package/js/{ln-icons/src/ln-icons.js → ln-icon/src/ln-icon.js} +20 -15
- package/js/ln-link/README.md +47 -9
- package/js/ln-link/ln-link.js +1 -1
- package/js/ln-link/src/ln-link.js +22 -6
- package/js/ln-list/README.md +129 -0
- package/js/ln-list/ln-list.js +1 -0
- package/js/ln-list/ln-list.scss +28 -0
- package/js/ln-list/src/ln-list.js +1216 -0
- package/js/ln-modal/README.md +185 -154
- package/js/ln-modal/ln-modal-dev.scss +13 -0
- package/js/ln-modal/ln-modal.js +1 -1
- package/js/ln-modal/ln-modal.scss +28 -4
- package/js/ln-modal/src/ln-modal.js +137 -201
- package/js/ln-modal-coordinator/README.md +99 -0
- package/js/ln-modal-coordinator/ln-modal-coordinator-dev.scss +8 -0
- package/js/ln-modal-coordinator/ln-modal-coordinator.js +1 -0
- package/js/ln-modal-coordinator/src/ln-modal-coordinator.js +345 -0
- package/js/ln-nav/README.md +46 -3
- package/js/ln-nav/ln-nav.js +1 -1
- package/js/ln-nav/src/ln-nav.js +92 -127
- package/js/ln-number/README.md +28 -1
- package/js/ln-number/ln-number-dev.scss +13 -0
- package/js/ln-number/ln-number.js +1 -1
- package/js/ln-number/src/ln-number.js +443 -350
- package/js/ln-options/README.md +66 -0
- package/js/ln-options/ln-options.js +1 -0
- package/js/ln-options/src/ln-options.js +74 -0
- package/js/ln-popover/README.md +40 -5
- package/js/ln-popover/ln-popover.js +1 -1
- package/js/ln-popover/src/ln-popover.js +38 -11
- package/js/ln-progress/README.md +413 -442
- package/js/ln-progress/ln-progress.js +1 -1
- package/js/ln-progress/src/ln-progress.js +98 -150
- package/js/ln-router/README.md +432 -0
- package/js/ln-router/ln-router.js +1 -0
- package/js/ln-router/src/ln-router.js +539 -0
- package/js/ln-search/README.md +158 -83
- package/js/ln-search/ln-search-dev.scss +8 -0
- package/js/ln-search/ln-search.js +1 -1
- package/js/ln-search/src/ln-search.js +12 -9
- package/js/ln-slug/README.md +110 -0
- package/js/ln-slug/ln-slug.js +1 -0
- package/js/ln-slug/src/ln-slug.js +74 -0
- package/js/ln-sort/README.md +170 -0
- package/js/ln-sort/ln-sort-dev.scss +8 -0
- package/js/ln-sort/ln-sort.js +1 -0
- package/js/ln-sort/src/ln-sort.js +178 -0
- package/js/ln-sortable/README.md +133 -95
- package/js/ln-sortable/ln-sortable.js +1 -1
- package/js/ln-stat/README.md +55 -0
- package/js/ln-stat/ln-stat.js +1 -0
- package/js/ln-stat/src/ln-stat.js +55 -0
- package/js/ln-table/README.md +285 -101
- package/js/ln-table/ln-table-dev.scss +17 -0
- package/js/ln-table/ln-table.js +1 -1
- package/js/ln-table/ln-table.scss +1 -1
- package/js/ln-table/src/ln-table.js +1493 -473
- package/js/ln-table-coordinator/README.md +73 -0
- package/js/ln-table-coordinator/ln-table-coordinator.js +1 -0
- package/js/ln-table-coordinator/src/ln-table-coordinator.js +160 -0
- package/js/ln-tabs/README.md +221 -137
- package/js/ln-tabs/ln-tabs-dev.scss +18 -0
- package/js/ln-tabs/ln-tabs.js +1 -1
- package/js/ln-tabs/src/ln-tabs.js +41 -24
- package/js/ln-time/README.md +14 -0
- package/js/ln-time/ln-time.js +1 -1
- package/js/ln-time/src/ln-time.js +223 -192
- package/js/ln-toast/README.md +178 -122
- package/js/ln-toast/ln-toast.js +1 -15
- package/js/ln-toast/src/ln-toast.js +232 -210
- package/js/ln-toast/template.html +16 -12
- package/js/ln-toggle/README.md +61 -2
- package/js/ln-toggle/ln-toggle-dev.scss +13 -0
- package/js/ln-toggle/ln-toggle.js +1 -1
- package/js/ln-toggle/src/ln-toggle.js +56 -43
- package/js/ln-tooltip/README.md +95 -58
- package/js/ln-tooltip/ln-tooltip-dev.scss +9 -0
- package/js/ln-tooltip/ln-tooltip.js +1 -1
- package/js/ln-tooltip/src/ln-tooltip.js +45 -6
- package/js/ln-translations/README.md +118 -96
- package/js/ln-translations/ln-translations.js +1 -1
- package/js/ln-translations/src/ln-translations.js +10 -5
- package/js/ln-upload/README.md +85 -10
- package/js/ln-upload/ln-upload.js +1 -1
- package/js/ln-upload/src/ln-upload.js +26 -10
- package/js/ln-validate/README.md +72 -0
- package/js/ln-validate/ln-validate-dev.scss +15 -0
- package/js/ln-validate/ln-validate.js +1 -1
- package/js/ln-validate/src/ln-validate.js +64 -0
- package/package.json +61 -56
- package/scss/base/_global.scss +2 -2
- package/scss/base/_typography.scss +1 -2
- package/scss/components/_date.scss +1 -0
- package/scss/components/_dropdown.scss +0 -5
- package/scss/components/_editor.scss +5 -0
- package/scss/components/_filter.scss +26 -25
- package/scss/components/_form.scss +7 -0
- package/scss/components/_ln-table.scss +13 -3
- package/scss/components/_sort.scss +10 -0
- package/scss/components/_table.scss +36 -23
- package/scss/components/_toast.scss +68 -41
- package/scss/components/_toggle.scss +16 -0
- package/scss/config/_density.scss +205 -117
- package/scss/config/_icons.scss +10 -9
- package/scss/config/_tokens.scss +69 -47
- package/scss/config/mixins/_accordion.scss +2 -7
- package/scss/config/mixins/_alert.scss +4 -4
- package/scss/config/mixins/_breadcrumbs.scss +2 -2
- package/scss/config/mixins/_btn.scss +1 -1
- package/scss/config/mixins/_card.scss +89 -14
- package/scss/config/mixins/_collapsible.scss +3 -0
- package/scss/config/mixins/_colors.scss +1 -1
- package/scss/config/mixins/_diagnostics.scss +11 -0
- package/scss/config/mixins/_display.scss +1 -0
- package/scss/config/mixins/_dropdown.scss +3 -5
- package/scss/config/mixins/_editor.scss +124 -0
- package/scss/config/mixins/_empty-state.scss +7 -0
- package/scss/config/mixins/_filter.scss +3 -5
- package/scss/config/mixins/_footer.scss +1 -2
- package/scss/config/mixins/_form.scss +207 -21
- package/scss/config/mixins/_index.scss +2 -0
- package/scss/config/mixins/_ln-table.scss +41 -2
- package/scss/config/mixins/_modal.scss +149 -66
- package/scss/config/mixins/_nav.scss +3 -4
- package/scss/config/mixins/_popover.scss +39 -0
- package/scss/config/mixins/_sidebar.scss +1 -1
- package/scss/config/mixins/_sort.scss +42 -0
- package/scss/config/mixins/_table.scss +85 -60
- package/scss/config/mixins/_toast.scss +179 -152
- package/scss/config/mixins/_tooltip.scss +17 -7
- package/scss/config/mixins/_typography.scss +4 -2
- package/scss/ln-ashlar-dev.scss +27 -9
- package/scss/ln-ashlar.scss +7 -1
- package/js/ln-data-table/README.md +0 -110
- package/js/ln-data-table/ln-data-table.js +0 -1
- package/js/ln-data-table/ln-data-table.scss +0 -10
- package/js/ln-data-table/src/ln-data-table.js +0 -1087
- package/js/ln-icons/README.md +0 -88
- package/js/ln-icons/ln-icons.js +0 -1
- package/js/ln-table/ln-table-sort.js +0 -1
- package/js/ln-table/src/ln-table-sort.js +0 -156
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
@use 'borders' as *;
|
|
3
3
|
@use 'motion' as *;
|
|
4
4
|
@use 'card' as *;
|
|
5
|
+
@use 'form' as *;
|
|
6
|
+
@use 'focus' as *;
|
|
5
7
|
|
|
6
8
|
@mixin popover {
|
|
7
9
|
@include floating-panel;
|
|
8
10
|
display: none;
|
|
9
11
|
position: fixed;
|
|
12
|
+
inset: auto;
|
|
13
|
+
margin: 0;
|
|
10
14
|
min-width: 14rem;
|
|
11
15
|
max-width: 24rem;
|
|
12
16
|
padding: var(--padding-y) var(--padding-x);
|
|
@@ -22,4 +26,39 @@
|
|
|
22
26
|
&:focus {
|
|
23
27
|
outline: none;
|
|
24
28
|
}
|
|
29
|
+
|
|
30
|
+
// Filter popover content: optional search + checkbox option list
|
|
31
|
+
> input[type="search"] {
|
|
32
|
+
width: 100%;
|
|
33
|
+
margin-bottom: var(--size-xs);
|
|
34
|
+
box-sizing: border-box;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
> ul {
|
|
38
|
+
list-style: none;
|
|
39
|
+
padding: 0;
|
|
40
|
+
margin: 0;
|
|
41
|
+
max-height: var(--filter-options-max-height, 15rem);
|
|
42
|
+
overflow-y: auto;
|
|
43
|
+
|
|
44
|
+
// Nav-link treatment for filter options (accent-tint wash on checked).
|
|
45
|
+
// Visually-hidden input (below) keeps the checkbox keyboard-focusable.
|
|
46
|
+
@include check-list-nav;
|
|
47
|
+
|
|
48
|
+
> li > label > input {
|
|
49
|
+
// Override pill's display:none — keep in focus order for keyboard nav
|
|
50
|
+
display: revert;
|
|
51
|
+
position: absolute;
|
|
52
|
+
width: 1px;
|
|
53
|
+
height: 1px;
|
|
54
|
+
overflow: hidden;
|
|
55
|
+
clip-path: inset(50%);
|
|
56
|
+
white-space: nowrap;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Focus ring on label when the hidden input receives keyboard focus
|
|
60
|
+
> li > label:has(> input:focus-visible) {
|
|
61
|
+
@include focus-ring;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
25
64
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
@use 'display' as *;
|
|
2
|
+
@use 'table' as *;
|
|
3
|
+
|
|
4
|
+
// ─── Sort control — 3-trigger cycle (none → asc → desc → none) ─────────
|
|
5
|
+
// Only one <button data-ln-sort-dir> is visible at a time; the circular
|
|
6
|
+
// order lives HERE in CSS, not in JS (js/ln-sort/README.md "No cycle
|
|
7
|
+
// logic in JS"). [data-ln-sort-state] on the root decides which trigger
|
|
8
|
+
// shows — the visible button is always the NEXT action, but the icon it
|
|
9
|
+
// carries reports the CURRENT state, not that action (icon-per-button
|
|
10
|
+
// mapping: js/ln-sort/README.md "Icon convention").
|
|
11
|
+
|
|
12
|
+
@mixin sort {
|
|
13
|
+
@include inline-flex;
|
|
14
|
+
list-style: none !important;
|
|
15
|
+
list-style-type: none !important;
|
|
16
|
+
margin: 0;
|
|
17
|
+
padding: 0;
|
|
18
|
+
vertical-align: middle;
|
|
19
|
+
|
|
20
|
+
li {
|
|
21
|
+
list-style: none !important;
|
|
22
|
+
list-style-type: none !important;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
button {
|
|
26
|
+
@include table-header-btn-base;
|
|
27
|
+
display: none;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
&[data-ln-sort-state="none"] [data-ln-sort-dir="asc"],
|
|
31
|
+
&[data-ln-sort-state="asc"] [data-ln-sort-dir="desc"],
|
|
32
|
+
&[data-ln-sort-state="desc"] [data-ln-sort-dir="none"] {
|
|
33
|
+
display: inline-flex;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@mixin sort-active {
|
|
38
|
+
[data-ln-sort-dir] {
|
|
39
|
+
opacity: 1;
|
|
40
|
+
color: var(--color-accent);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -36,13 +36,9 @@
|
|
|
36
36
|
}
|
|
37
37
|
font-variant-numeric: tabular-nums;
|
|
38
38
|
|
|
39
|
-
// Row hover transition color.
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
@if $sticky {
|
|
43
|
-
$bg-hover: hsl(from var(--bg-base) h s calc(l - 4));
|
|
44
|
-
}
|
|
45
|
-
--bg-row-hover: #{$bg-hover};
|
|
39
|
+
// Row hover transition color. Default to a discrete tint of the primary color
|
|
40
|
+
// mixed with transparent to create a harmonious background shift across themes.
|
|
41
|
+
--bg-row-hover: var(--color-row-hover, color-mix(in srgb, var(--color-primary) 6%, transparent));
|
|
46
42
|
|
|
47
43
|
thead {
|
|
48
44
|
--color-bg: var(--bg-sunken);
|
|
@@ -63,58 +59,58 @@
|
|
|
63
59
|
|
|
64
60
|
th {
|
|
65
61
|
@include text-left;
|
|
66
|
-
padding: var(--padding-y) var(--padding-x);
|
|
62
|
+
padding: var(--table-cell-padding-y) var(--table-cell-padding-x);
|
|
67
63
|
@include font-semibold;
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
letter-spacing: 0.4px;
|
|
64
|
+
@include typography(label-sm);
|
|
65
|
+
letter-spacing: 0.06em;
|
|
71
66
|
@include uppercase;
|
|
72
67
|
color: var(--color-fg);
|
|
73
68
|
position: relative;
|
|
74
69
|
top: auto;
|
|
75
70
|
z-index: auto;
|
|
76
71
|
|
|
77
|
-
// Shared header-button stack — keyed off the unprefixed structural button
|
|
78
|
-
//
|
|
79
|
-
|
|
80
|
-
|
|
72
|
+
// Shared header-button stack — keyed off the unprefixed structural filter button
|
|
73
|
+
// class and the [data-ln-sort] JS-component selector, so table / ln-table /
|
|
74
|
+
// ln-data-table all share one positioning rule.
|
|
75
|
+
&:has([data-ln-sort]):has(.table-filter) {
|
|
76
|
+
padding-inline-end: calc(var(--padding-x, var(--size-md)) + 3.75rem);
|
|
81
77
|
|
|
82
78
|
.table-filter {
|
|
83
79
|
position: absolute;
|
|
84
80
|
top: 50%;
|
|
85
81
|
transform: translateY(-50%);
|
|
86
|
-
right: var(--padding-x);
|
|
82
|
+
right: var(--padding-x, var(--size-md));
|
|
87
83
|
margin: 0;
|
|
88
84
|
}
|
|
89
|
-
|
|
85
|
+
[data-ln-sort] {
|
|
90
86
|
position: absolute;
|
|
91
87
|
top: 50%;
|
|
92
88
|
transform: translateY(-50%);
|
|
93
|
-
right: calc(var(--padding-x) + 1.
|
|
89
|
+
right: calc(var(--padding-x, var(--size-md)) + 1.75rem);
|
|
94
90
|
margin: 0;
|
|
95
91
|
}
|
|
96
92
|
}
|
|
97
93
|
|
|
98
|
-
&:has(
|
|
99
|
-
padding-inline-end: calc(var(--padding-x) +
|
|
94
|
+
&:has([data-ln-sort]):not(:has(.table-filter)) {
|
|
95
|
+
padding-inline-end: calc(var(--padding-x, var(--size-md)) + 2rem);
|
|
100
96
|
|
|
101
|
-
|
|
97
|
+
[data-ln-sort] {
|
|
102
98
|
position: absolute;
|
|
103
99
|
top: 50%;
|
|
104
100
|
transform: translateY(-50%);
|
|
105
|
-
right: var(--padding-x);
|
|
101
|
+
right: var(--padding-x, var(--size-md));
|
|
106
102
|
margin: 0;
|
|
107
103
|
}
|
|
108
104
|
}
|
|
109
105
|
|
|
110
|
-
&:has(.table-filter):not(:has(
|
|
111
|
-
padding-inline-end: calc(var(--padding-x) +
|
|
106
|
+
&:has(.table-filter):not(:has([data-ln-sort])) {
|
|
107
|
+
padding-inline-end: calc(var(--padding-x, var(--size-md)) + 2rem);
|
|
112
108
|
|
|
113
109
|
.table-filter {
|
|
114
110
|
position: absolute;
|
|
115
111
|
top: 50%;
|
|
116
112
|
transform: translateY(-50%);
|
|
117
|
-
right: var(--padding-x);
|
|
113
|
+
right: var(--padding-x, var(--size-md));
|
|
118
114
|
margin: 0;
|
|
119
115
|
}
|
|
120
116
|
}
|
|
@@ -131,7 +127,7 @@
|
|
|
131
127
|
}
|
|
132
128
|
|
|
133
129
|
td {
|
|
134
|
-
padding: var(--padding-y) var(--padding-x);
|
|
130
|
+
padding: var(--table-cell-padding-y) var(--table-cell-padding-x);
|
|
135
131
|
@include border-b;
|
|
136
132
|
font-size: var(--font-size);
|
|
137
133
|
line-height: var(--line-height);
|
|
@@ -161,13 +157,13 @@
|
|
|
161
157
|
// Sticky section footer inside sticky/enhanced tables
|
|
162
158
|
@if $sticky {
|
|
163
159
|
> footer {
|
|
164
|
-
padding: var(--padding-y) var(--padding-x);
|
|
160
|
+
padding: var(--table-cell-padding-y) var(--table-cell-padding-x);
|
|
165
161
|
border-block-start: var(--border-block-start, var(--border-width) solid var(--color-border));
|
|
166
162
|
--color-bg: var(--bg-sunken);
|
|
167
163
|
background: var(--color-bg);
|
|
168
164
|
--color-fg: var(--fg-muted);
|
|
169
165
|
color: var(--color-fg);
|
|
170
|
-
|
|
166
|
+
@include typography(body-sm);
|
|
171
167
|
position: sticky;
|
|
172
168
|
z-index: var(--z-sticky);
|
|
173
169
|
}
|
|
@@ -273,45 +269,33 @@
|
|
|
273
269
|
|
|
274
270
|
// ─── Column sort & filter buttons ──────────────────────────────
|
|
275
271
|
|
|
276
|
-
@mixin table-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
272
|
+
@mixin table-header-btn-base {
|
|
273
|
+
width: 1.75rem;
|
|
274
|
+
height: 1.75rem;
|
|
275
|
+
display: inline-flex;
|
|
276
|
+
align-items: center;
|
|
277
|
+
justify-content: center;
|
|
278
|
+
padding: 0;
|
|
279
|
+
border-radius: 50%;
|
|
280
|
+
background: transparent;
|
|
283
281
|
border: none;
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
282
|
+
color: inherit;
|
|
283
|
+
cursor: pointer;
|
|
284
|
+
box-shadow: none;
|
|
285
|
+
opacity: 0.45;
|
|
286
|
+
transition: all 0.15s ease-in-out;
|
|
289
287
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
288
|
+
&:hover {
|
|
289
|
+
background-color: hsl(var(--color-primary) / 0.12);
|
|
290
|
+
color: hsl(var(--color-primary));
|
|
291
|
+
opacity: 1;
|
|
293
292
|
}
|
|
294
293
|
}
|
|
295
294
|
|
|
296
|
-
@mixin table-sort-active {
|
|
297
|
-
opacity: 1;
|
|
298
|
-
color: var(--color-accent);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
295
|
@mixin table-filter {
|
|
302
|
-
|
|
303
|
-
@include motion-safe {
|
|
304
|
-
transition: opacity 0.15s;
|
|
305
|
-
}
|
|
306
|
-
@include cursor-pointer;
|
|
307
|
-
background: none;
|
|
308
|
-
border: none;
|
|
309
|
-
--btn-padding-y: var(--size-2xs);
|
|
310
|
-
--btn-padding-x: var(--size-2xs);
|
|
311
|
-
--margin-inline: var(--size-2xs);
|
|
312
|
-
margin-inline-start: var(--margin-inline);
|
|
296
|
+
@include table-header-btn-base;
|
|
313
297
|
vertical-align: middle;
|
|
314
|
-
|
|
298
|
+
position: relative;
|
|
315
299
|
}
|
|
316
300
|
|
|
317
301
|
@mixin table-filter-active {
|
|
@@ -382,3 +366,44 @@
|
|
|
382
366
|
}
|
|
383
367
|
}
|
|
384
368
|
|
|
369
|
+
@mixin table-row-actions {
|
|
370
|
+
display: flex;
|
|
371
|
+
align-items: center;
|
|
372
|
+
gap: var(--size-xs);
|
|
373
|
+
position: absolute;
|
|
374
|
+
right: var(--padding-x, 1rem);
|
|
375
|
+
top: 50%;
|
|
376
|
+
transform: translateY(-50%);
|
|
377
|
+
opacity: 0;
|
|
378
|
+
pointer-events: none;
|
|
379
|
+
visibility: hidden;
|
|
380
|
+
transition: opacity var(--transition-fast, 0.15s) ease-in-out, visibility var(--transition-fast, 0.15s);
|
|
381
|
+
background: var(--bg-row-hover, var(--color-bg));
|
|
382
|
+
padding-left: var(--size-md);
|
|
383
|
+
margin: 0;
|
|
384
|
+
list-style: none;
|
|
385
|
+
z-index: 2;
|
|
386
|
+
|
|
387
|
+
&::before {
|
|
388
|
+
content: '';
|
|
389
|
+
position: absolute;
|
|
390
|
+
top: 0;
|
|
391
|
+
bottom: 0;
|
|
392
|
+
left: -2rem;
|
|
393
|
+
width: 2rem;
|
|
394
|
+
background: linear-gradient(to right, transparent, var(--bg-row-hover, var(--color-bg)));
|
|
395
|
+
pointer-events: none;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
li {
|
|
399
|
+
display: inline-flex;
|
|
400
|
+
align-items: center;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
form {
|
|
404
|
+
display: inline-flex;
|
|
405
|
+
margin: 0;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
|
|
@@ -1,152 +1,179 @@
|
|
|
1
|
-
@use 'display' as *;
|
|
2
|
-
@use 'spacing' as *;
|
|
3
|
-
@use 'sizing' as *;
|
|
4
|
-
@use 'typography' as *;
|
|
5
|
-
@use 'colors' as *;
|
|
6
|
-
@use 'borders' as *;
|
|
7
|
-
@use 'shadows' as *;
|
|
8
|
-
@use 'position' as *;
|
|
9
|
-
@use 'transitions' as *;
|
|
10
|
-
@use 'interaction' as *;
|
|
11
|
-
@use 'motion' as *;
|
|
12
|
-
@use 'btn' as *;
|
|
13
|
-
@use 'card' as *;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
opacity:
|
|
62
|
-
@include motion-safe {
|
|
63
|
-
transform:
|
|
64
|
-
transition: all var(--transition-
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
@include
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
@include
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
@
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
--
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
1
|
+
@use 'display' as *;
|
|
2
|
+
@use 'spacing' as *;
|
|
3
|
+
@use 'sizing' as *;
|
|
4
|
+
@use 'typography' as *;
|
|
5
|
+
@use 'colors' as *;
|
|
6
|
+
@use 'borders' as *;
|
|
7
|
+
@use 'shadows' as *;
|
|
8
|
+
@use 'position' as *;
|
|
9
|
+
@use 'transitions' as *;
|
|
10
|
+
@use 'interaction' as *;
|
|
11
|
+
@use 'motion' as *;
|
|
12
|
+
@use 'btn' as *;
|
|
13
|
+
@use 'card' as *;
|
|
14
|
+
@use 'breakpoints' as *;
|
|
15
|
+
|
|
16
|
+
// Toast notification -- side-accent card with icon, title, body, close button.
|
|
17
|
+
// The <li> IS the card; the type IS its class (.success/.error/.warn/.info).
|
|
18
|
+
//
|
|
19
|
+
// Usage:
|
|
20
|
+
// [data-ln-toast] { @include toast-container; }
|
|
21
|
+
// [data-ln-toast] > li { @include toast-item; @include toast-card; }
|
|
22
|
+
//
|
|
23
|
+
// Tone: the type class on the <li> rebinds --color-primary/--color-accent via
|
|
24
|
+
// semantic-color() — see components/_toast.scss. SSR authors the class; the
|
|
25
|
+
// dynamic path fills it (data-ln-attr="class:type"). warn maps to the warning
|
|
26
|
+
// family in that binding.
|
|
27
|
+
|
|
28
|
+
@mixin toast-container {
|
|
29
|
+
@include fixed;
|
|
30
|
+
@include z-toast;
|
|
31
|
+
border: none;
|
|
32
|
+
background: transparent;
|
|
33
|
+
inset: auto;
|
|
34
|
+
right: var(--size-lg);
|
|
35
|
+
bottom: var(--size-lg);
|
|
36
|
+
list-style: none;
|
|
37
|
+
padding: 0;
|
|
38
|
+
margin: 0;
|
|
39
|
+
pointer-events: none;
|
|
40
|
+
display: flex;
|
|
41
|
+
flex-direction: column-reverse;
|
|
42
|
+
overflow: visible;
|
|
43
|
+
|
|
44
|
+
&:popover-open {
|
|
45
|
+
display: flex;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@include mq-down(md) {
|
|
49
|
+
right: 0;
|
|
50
|
+
bottom: 0;
|
|
51
|
+
left: 0;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Base = final visible resting state, so SSR-authored <li> render with
|
|
56
|
+
// zero JS. .ln-enter (below) is a transient pre-mount override applied
|
|
57
|
+
// only to JS-created items — see ln-toast.js _buildItem/_append.
|
|
58
|
+
@mixin toast-item {
|
|
59
|
+
list-style: none;
|
|
60
|
+
pointer-events: auto;
|
|
61
|
+
opacity: 1;
|
|
62
|
+
@include motion-safe {
|
|
63
|
+
transform: translateX(0);
|
|
64
|
+
transition: all var(--transition-base) var(--easing-standard);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
& + & {
|
|
68
|
+
--margin-block: var(--size-md);
|
|
69
|
+
margin-bottom: var(--margin-block);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@mixin toast-item-enter {
|
|
74
|
+
opacity: 0;
|
|
75
|
+
@include motion-safe {
|
|
76
|
+
transform: translateX(30px);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@mixin toast-item-out {
|
|
81
|
+
opacity: 0 !important;
|
|
82
|
+
@include motion-safe {
|
|
83
|
+
transform: scale(0.95) !important;
|
|
84
|
+
transition: all var(--transition-fast) !important;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@mixin toast-card {
|
|
89
|
+
@include floating-panel;
|
|
90
|
+
@include flex;
|
|
91
|
+
min-width: 320px;
|
|
92
|
+
max-width: 450px;
|
|
93
|
+
@include overflow-hidden;
|
|
94
|
+
|
|
95
|
+
@include mq-down(md) {
|
|
96
|
+
min-width: 0;
|
|
97
|
+
max-width: none;
|
|
98
|
+
width: 100%;
|
|
99
|
+
border-radius: 0;
|
|
100
|
+
border-inline: 0;
|
|
101
|
+
border-block-end: 0;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@mixin toast-icon {
|
|
106
|
+
--color-accent: hsl(var(--color-primary));
|
|
107
|
+
--color-accent-fg: hsl(var(--color-white));
|
|
108
|
+
flex: 0 0 44px;
|
|
109
|
+
@include flex;
|
|
110
|
+
align-items: flex-start;
|
|
111
|
+
@include justify-center;
|
|
112
|
+
--padding-y: var(--size-md);
|
|
113
|
+
padding-top: var(--padding-y);
|
|
114
|
+
background: var(--color-accent);
|
|
115
|
+
color: var(--color-accent-fg);
|
|
116
|
+
|
|
117
|
+
&::before {
|
|
118
|
+
width: 2rem;
|
|
119
|
+
height: 2rem;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// The icon variant list — 4 authored icons, CSS shows the one matching the
|
|
124
|
+
// card's type class (see components/_toast.scss for the when-toggle).
|
|
125
|
+
// display:contents dissolves the <ul> box so the visible <li> becomes a direct
|
|
126
|
+
// flex child of .icon (parity with the SSR path's direct <svg> child).
|
|
127
|
+
@mixin toast-icon-list {
|
|
128
|
+
display: contents;
|
|
129
|
+
|
|
130
|
+
> li { @include hidden; }
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@mixin toast-content {
|
|
134
|
+
@include flex-1;
|
|
135
|
+
--padding-y: var(--size-md);
|
|
136
|
+
--padding-x: var(--size-md);
|
|
137
|
+
padding: var(--padding-y) var(--padding-x) var(--padding-y) var(--size-sm); // 4th arm: icon-side gutter, component-design intrinsic.
|
|
138
|
+
@include relative;
|
|
139
|
+
|
|
140
|
+
button[data-ln-toast-close] {
|
|
141
|
+
--btn-padding-y: var(--size-2xs);
|
|
142
|
+
--btn-padding-x: var(--size-2xs);
|
|
143
|
+
@include absolute;
|
|
144
|
+
// Geometric — close button positioned inside content padding.
|
|
145
|
+
top: var(--size-sm);
|
|
146
|
+
right: var(--size-sm);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
@mixin toast-title {
|
|
151
|
+
@include font-bold;
|
|
152
|
+
@include text-base;
|
|
153
|
+
color: var(--color-fg);
|
|
154
|
+
line-height: 1.25;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
@mixin toast-body {
|
|
158
|
+
--color-fg: var(--fg-muted);
|
|
159
|
+
--margin-block: var(--size-sm);
|
|
160
|
+
margin-top: var(--margin-block);
|
|
161
|
+
font-size: var(--text-base);
|
|
162
|
+
color: var(--color-fg);
|
|
163
|
+
line-height: 1.5;
|
|
164
|
+
|
|
165
|
+
p { @include m(0); }
|
|
166
|
+
|
|
167
|
+
ul {
|
|
168
|
+
--margin-block: var(--size-sm);
|
|
169
|
+
margin: var(--margin-block) 0 0 0;
|
|
170
|
+
--padding-x: var(--size-md-up);
|
|
171
|
+
padding-left: var(--padding-x);
|
|
172
|
+
@include text-sm;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
li + li {
|
|
176
|
+
--margin-block: var(--size-xs);
|
|
177
|
+
margin-top: var(--margin-block);
|
|
178
|
+
}
|
|
179
|
+
}
|