@livenetworks/ashlar 1.4.1 → 1.6.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/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 +162 -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 +77 -41
- 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 +189 -99
- 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 -55
- 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 -0
- package/scss/components/_form.scss +7 -0
- package/scss/components/_ln-table.scss +14 -5
- package/scss/components/_sort.scss +10 -0
- package/scss/components/_table.scss +68 -1
- 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 +48 -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 +47 -0
- package/scss/config/mixins/_footer.scss +1 -2
- package/scss/config/mixins/_form.scss +207 -21
- package/scss/config/mixins/_index.scss +4 -1
- package/scss/config/mixins/_ln-table.scss +51 -93
- 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 +232 -38
- 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 +39 -0
- package/scss/ln-ashlar.scss +8 -2
- 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 -1103
- 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 -168
- package/scss/components/_data-table.scss +0 -83
- package/scss/config/mixins/_data-table.scss +0 -346
|
@@ -1,346 +0,0 @@
|
|
|
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 'form' as *;
|
|
13
|
-
@use 'btn' as *;
|
|
14
|
-
@use 'card' as *;
|
|
15
|
-
@use 'ln-table';
|
|
16
|
-
|
|
17
|
-
// Data Table -- enhanced table with toolbar, sort, filter, virtual scroll.
|
|
18
|
-
//
|
|
19
|
-
// Usage:
|
|
20
|
-
// [data-ln-data-table] { @include data-table; }
|
|
21
|
-
//
|
|
22
|
-
// State-driven CSS (loading, selected, focused, spacer) stays in
|
|
23
|
-
// the co-located JS SCSS file.
|
|
24
|
-
|
|
25
|
-
@mixin data-table {
|
|
26
|
-
@include relative;
|
|
27
|
-
|
|
28
|
-
// Row hover token — local to data-table so chrome (toolbar, thead,
|
|
29
|
-
// footer) reading --bg-sunken stays visually distinct from the row
|
|
30
|
-
// the cursor is on. --bg-elevated is unsuitable: it equals --bg-base
|
|
31
|
-
// in light theme, making hover invisible. Derive a 4-point lightness
|
|
32
|
-
// step from --bg-base via CSS relative color syntax (number form, see
|
|
33
|
-
// _btn.scss header for percentage-vs-number rationale).
|
|
34
|
-
//
|
|
35
|
-
// Light theme: hsl(white) → ~hsl(0 0% 96%)
|
|
36
|
-
// Dark theme: hsl(220 16% 13%) → hsl(220 16% 17%) ≈ --bg-elevated dark
|
|
37
|
-
//
|
|
38
|
-
// The 4-point step is monotonically distinct from --bg-sunken
|
|
39
|
-
// (light: neutral-100 ≈ 95%; dark: 220 16% 20%) on both sides.
|
|
40
|
-
--bg-row-hover: hsl(from var(--bg-base) h s calc(l - 4));
|
|
41
|
-
|
|
42
|
-
// Override @mixin table-base's `tbody tr:hover` to use the local hover
|
|
43
|
-
// token instead of --bg-sunken. Default hover stays --bg-sunken for
|
|
44
|
-
// standalone tables; data-table re-binds so its hover disambiguates from
|
|
45
|
-
// chrome that also uses --bg-sunken.
|
|
46
|
-
> table tbody tr:hover {
|
|
47
|
-
--color-bg: var(--bg-row-hover);
|
|
48
|
-
background: var(--color-bg);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Inner table — `border-collapse: separate` + `border-spacing: 0` is
|
|
52
|
-
// required for `position: sticky` on `<thead> th` to actually pin in
|
|
53
|
-
// Chrome. With the `border-collapse: collapse` that `@mixin table-base`
|
|
54
|
-
// sets by default, Chrome silently drops sticky behavior on table cells —
|
|
55
|
-
// the same reason `@mixin ln-table` applies this exact override. Borders
|
|
56
|
-
// are restored cell-by-cell via table-base's `td { @include border-b }`,
|
|
57
|
-
// so no visual change.
|
|
58
|
-
> table {
|
|
59
|
-
border-collapse: separate;
|
|
60
|
-
border-spacing: 0;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
// Sticky header - Pins the entire thead (including the in-thead toolbar) at top:0
|
|
66
|
-
thead {
|
|
67
|
-
@include sticky-top;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
thead th {
|
|
71
|
-
position: relative;
|
|
72
|
-
top: auto;
|
|
73
|
-
z-index: auto;
|
|
74
|
-
background: var(--bg-sunken);
|
|
75
|
-
|
|
76
|
-
&[data-ln-col] {
|
|
77
|
-
// Maintain standard table-cell layout so columns don't break or stack vertically
|
|
78
|
-
white-space: normal;
|
|
79
|
-
|
|
80
|
-
// Add padding-inline-end to prevent text from overlapping absolute buttons
|
|
81
|
-
|
|
82
|
-
// Case 1: Has both sort and filter buttons
|
|
83
|
-
&:has([data-ln-col-sort]):has([data-ln-col-filter]) {
|
|
84
|
-
padding-inline-end: calc(var(--padding-x) + 2.5rem);
|
|
85
|
-
|
|
86
|
-
[data-ln-col-filter] {
|
|
87
|
-
position: absolute;
|
|
88
|
-
top: 50%;
|
|
89
|
-
transform: translateY(-50%);
|
|
90
|
-
right: var(--padding-x);
|
|
91
|
-
margin: 0;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
[data-ln-col-sort] {
|
|
95
|
-
position: absolute;
|
|
96
|
-
top: 50%;
|
|
97
|
-
transform: translateY(-50%);
|
|
98
|
-
right: calc(var(--padding-x) + 1.25rem);
|
|
99
|
-
margin: 0;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Case 2: Has only sort button
|
|
104
|
-
&:has([data-ln-col-sort]):not(:has([data-ln-col-filter])) {
|
|
105
|
-
padding-inline-end: calc(var(--padding-x) + 1.25rem);
|
|
106
|
-
|
|
107
|
-
[data-ln-col-sort] {
|
|
108
|
-
position: absolute;
|
|
109
|
-
top: 50%;
|
|
110
|
-
transform: translateY(-50%);
|
|
111
|
-
right: var(--padding-x);
|
|
112
|
-
margin: 0;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Case 3: Has only filter button
|
|
117
|
-
&:has([data-ln-col-filter]):not(:has([data-ln-col-sort])) {
|
|
118
|
-
padding-inline-end: calc(var(--padding-x) + 1.25rem);
|
|
119
|
-
|
|
120
|
-
[data-ln-col-filter] {
|
|
121
|
-
position: absolute;
|
|
122
|
-
top: 50%;
|
|
123
|
-
transform: translateY(-50%);
|
|
124
|
-
right: var(--padding-x);
|
|
125
|
-
margin: 0;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Support for the in-thead toolbar row inside ln-data-table
|
|
132
|
-
thead > tr:first-child:has(> th[colspan]) > th {
|
|
133
|
-
@include ln-table.ln-table-thead-toolbar;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Section footer — sibling of <table>, NOT inside it. Moved out of
|
|
137
|
-
// <tfoot> because Chromium drops sticky on table cells when a
|
|
138
|
-
// virtual-scroll spacer <tr> sits between the data and the tfoot row.
|
|
139
|
-
// As a section-level <footer> sticky works reliably and shares the
|
|
140
|
-
// same scroll container as the toolbar.
|
|
141
|
-
//
|
|
142
|
-
// Chrome surface visually symmetric with panel-header: --bg-sunken
|
|
143
|
-
// fill, muted fg, body-sm text, border-block-start for separation.
|
|
144
|
-
> footer {
|
|
145
|
-
padding: var(--padding-y) var(--padding-x);
|
|
146
|
-
border-block-start: var(--border-block-start, var(--border-width) solid var(--color-border));
|
|
147
|
-
--color-bg: var(--bg-sunken);
|
|
148
|
-
background: var(--color-bg);
|
|
149
|
-
--color-fg: var(--fg-muted);
|
|
150
|
-
color: var(--color-fg);
|
|
151
|
-
font-size: var(--text-body-sm);
|
|
152
|
-
position: sticky;
|
|
153
|
-
bottom: 0;
|
|
154
|
-
z-index: var(--z-sticky);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// ─── Sort indicators ──────────────────────────────────────
|
|
159
|
-
|
|
160
|
-
@mixin data-table-sort-button {
|
|
161
|
-
opacity: 0.4;
|
|
162
|
-
@include motion-safe {
|
|
163
|
-
transition: opacity 0.15s;
|
|
164
|
-
}
|
|
165
|
-
@include cursor-pointer;
|
|
166
|
-
background: none;
|
|
167
|
-
border: none;
|
|
168
|
-
--btn-padding-y: var(--size-2xs);
|
|
169
|
-
--btn-padding-x: var(--size-2xs);
|
|
170
|
-
--margin-inline: var(--size-xs);
|
|
171
|
-
margin-inline-start: var(--margin-inline);
|
|
172
|
-
vertical-align: middle;
|
|
173
|
-
|
|
174
|
-
// Icon-trio visibility — neutral state shows the dual-arrow icon.
|
|
175
|
-
// Active states (.ln-sort-asc / .ln-sort-desc on ancestor <th>)
|
|
176
|
-
// flip to a single directional icon. See component file for the
|
|
177
|
-
// active-state overrides.
|
|
178
|
-
[data-ln-sort-icon="asc"],
|
|
179
|
-
[data-ln-sort-icon="desc"] {
|
|
180
|
-
display: none;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
@mixin data-table-sort-active {
|
|
185
|
-
opacity: 1;
|
|
186
|
-
color: var(--color-accent);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// ─── Filter button ────────────────────────────────────────
|
|
190
|
-
|
|
191
|
-
@mixin data-table-filter-button {
|
|
192
|
-
opacity: 0.4;
|
|
193
|
-
@include motion-safe {
|
|
194
|
-
transition: opacity 0.15s;
|
|
195
|
-
}
|
|
196
|
-
@include cursor-pointer;
|
|
197
|
-
background: none;
|
|
198
|
-
border: none;
|
|
199
|
-
--btn-padding-y: var(--size-2xs);
|
|
200
|
-
--btn-padding-x: var(--size-2xs);
|
|
201
|
-
--margin-inline: var(--size-2xs);
|
|
202
|
-
margin-inline-start: var(--margin-inline);
|
|
203
|
-
vertical-align: middle;
|
|
204
|
-
@include relative;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
@mixin data-table-filter-active {
|
|
208
|
-
opacity: 1;
|
|
209
|
-
color: var(--color-accent);
|
|
210
|
-
|
|
211
|
-
&::after {
|
|
212
|
-
content: '';
|
|
213
|
-
@include absolute;
|
|
214
|
-
top: 0;
|
|
215
|
-
right: 0;
|
|
216
|
-
width: 0.375rem;
|
|
217
|
-
height: 0.375rem;
|
|
218
|
-
border-radius: var(--radius-full);
|
|
219
|
-
background: var(--color-accent);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// ─── Row action buttons ───────────────────────────────────
|
|
224
|
-
//
|
|
225
|
-
// `[data-ln-row-action]` is the ln-data-table attribute for in-row
|
|
226
|
-
// action buttons (edit, delete, custom). They're conventionally
|
|
227
|
-
// icon-only and live in narrow `<td>` cells — full button chrome
|
|
228
|
-
// inflates row height and visually competes with the row content.
|
|
229
|
-
//
|
|
230
|
-
// Style is ghost: no bg, no border, no shadow, dim opacity at rest,
|
|
231
|
-
// full opacity on hover. Targets the BUTTON via its own attribute,
|
|
232
|
-
// not via ancestor selectors — a `data-ln-row-action` button looks
|
|
233
|
-
// the same anywhere.
|
|
234
|
-
|
|
235
|
-
@mixin data-table-row-action {
|
|
236
|
-
background: none;
|
|
237
|
-
border: none;
|
|
238
|
-
--shadow: none;
|
|
239
|
-
--btn-padding-y: var(--size-2xs);
|
|
240
|
-
--btn-padding-x: var(--size-2xs);
|
|
241
|
-
opacity: 0.5;
|
|
242
|
-
@include motion-safe {
|
|
243
|
-
transition: opacity 0.15s;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
&:hover:not(:disabled) {
|
|
247
|
-
background: none;
|
|
248
|
-
opacity: 1;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
// Destructive variant — semantic-color cascade via --color-primary
|
|
253
|
-
// rebind so the icon and any confirm-state overlay both read the
|
|
254
|
-
// same source. Applied on top of `data-table-row-action`.
|
|
255
|
-
@mixin data-table-row-action-delete {
|
|
256
|
-
--color-primary: var(--color-error);
|
|
257
|
-
color: hsl(var(--color-primary));
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// ─── Filter dropdown ──────────────────────────────────────
|
|
261
|
-
|
|
262
|
-
@mixin data-table-filter-dropdown {
|
|
263
|
-
@include absolute;
|
|
264
|
-
top: 100%;
|
|
265
|
-
left: 0;
|
|
266
|
-
z-index: var(--z-dropdown);
|
|
267
|
-
--color-bg: var(--bg-elevated);
|
|
268
|
-
background: var(--color-bg);
|
|
269
|
-
--shadow: var(--shadow-floating);
|
|
270
|
-
border-block-start: var(--border-block-start, var(--border-width) solid var(--color-border));
|
|
271
|
-
border-block-end: var(--border-block-end, var(--border-width) solid var(--color-border));
|
|
272
|
-
border-inline-start: var(--border-inline-start, var(--border-width) solid var(--color-border));
|
|
273
|
-
border-inline-end: var(--border-inline-end, var(--border-width) solid var(--color-border));
|
|
274
|
-
border-radius: var(--radius);
|
|
275
|
-
box-shadow: var(--shadow);
|
|
276
|
-
--padding-y: var(--size-sm);
|
|
277
|
-
--padding-x: var(--size-sm);
|
|
278
|
-
padding: var(--padding-y) var(--padding-x);
|
|
279
|
-
min-width: 12rem;
|
|
280
|
-
max-height: 20rem;
|
|
281
|
-
overflow-y: auto;
|
|
282
|
-
|
|
283
|
-
[data-ln-filter-search] {
|
|
284
|
-
@include form-input;
|
|
285
|
-
width: 100%;
|
|
286
|
-
--margin-block: var(--size-sm);
|
|
287
|
-
margin-bottom: var(--margin-block);
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
ul {
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
li {
|
|
294
|
-
--padding-y: var(--size-xs);
|
|
295
|
-
padding: var(--padding-y) 0;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
label {
|
|
299
|
-
display: flex;
|
|
300
|
-
align-items: center;
|
|
301
|
-
gap: var(--gap);
|
|
302
|
-
@include cursor-pointer;
|
|
303
|
-
font-size: var(--text-sm);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
[data-ln-filter-clear] {
|
|
307
|
-
@include btn;
|
|
308
|
-
width: 100%;
|
|
309
|
-
--margin-block: var(--size-sm);
|
|
310
|
-
margin-top: var(--margin-block);
|
|
311
|
-
font-size: var(--text-sm);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// Row interaction state — applied to JS-marked clickable rows.
|
|
316
|
-
|
|
317
|
-
@mixin data-table-row {
|
|
318
|
-
cursor: pointer;
|
|
319
|
-
|
|
320
|
-
&:hover {
|
|
321
|
-
--color-bg: var(--bg-sunken);
|
|
322
|
-
background: var(--color-bg);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
@mixin data-table-row-selected {
|
|
327
|
-
background: var(--color-accent-tint);
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
@mixin data-table-row-focused {
|
|
331
|
-
// Derive focus from --color-accent at this scope (same hue/saturation,
|
|
332
|
-
// lightness +8). Number form (not percentage) — see _btn.scss for the
|
|
333
|
-
// syntax rationale.
|
|
334
|
-
--color-accent-focus: hsl(from var(--color-accent) h s calc(l + 8));
|
|
335
|
-
outline: 2px solid var(--color-accent-focus);
|
|
336
|
-
outline-offset: -2px;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// Virtual-scroll spacer rows (JS-injected) — neutralize default cell padding/border.
|
|
340
|
-
|
|
341
|
-
@mixin data-table-spacer-row {
|
|
342
|
-
td {
|
|
343
|
-
padding: 0 !important;
|
|
344
|
-
border: none !important;
|
|
345
|
-
}
|
|
346
|
-
}
|