@scattered-light/loomiere-base-ui 0.6.1 → 0.7.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.
Files changed (100) hide show
  1. package/README.md +135 -5
  2. package/dist/chunk-JUUPOOQQ.js +3723 -0
  3. package/dist/chunk-JUUPOOQQ.js.map +1 -0
  4. package/dist/chunk-M7KJASGK.js +802 -0
  5. package/dist/chunk-M7KJASGK.js.map +1 -0
  6. package/dist/chunk-Y2CPBMFJ.js +147 -0
  7. package/dist/chunk-Y2CPBMFJ.js.map +1 -0
  8. package/dist/custom/collection/index.d.ts +540 -0
  9. package/dist/custom/collection/index.js +1489 -0
  10. package/dist/custom/collection/index.js.map +1 -0
  11. package/dist/custom/index.d.ts +5 -0
  12. package/dist/custom/index.js +4 -0
  13. package/dist/custom/index.js.map +1 -0
  14. package/dist/design-system/components/Badge/README.md +35 -0
  15. package/dist/design-system/components/Badge/preview.html +19 -0
  16. package/dist/design-system/components/Collection/README.md +14 -0
  17. package/dist/design-system/components/CollectionPagination/README.md +15 -0
  18. package/dist/design-system/components/CollectionToolbar/README.md +29 -0
  19. package/dist/design-system/components/DataList/README.md +39 -0
  20. package/dist/design-system/components/DataList/preview.html +475 -0
  21. package/dist/design-system/components/DataTable/README.md +41 -0
  22. package/dist/design-system/components/DataTable/preview.html +475 -0
  23. package/dist/design-system/components/DatePicker/README.md +55 -0
  24. package/dist/design-system/components/DatePicker/preview.html +475 -0
  25. package/dist/design-system/components/EditableList/README.md +33 -0
  26. package/dist/design-system/components/EditableList/preview.html +475 -0
  27. package/dist/design-system/components/EmptyState/README.md +60 -0
  28. package/dist/design-system/components/EmptyState/preview.html +475 -0
  29. package/dist/design-system/components/ListDetail/README.md +43 -0
  30. package/dist/design-system/components/ListDetail/preview.html +475 -0
  31. package/dist/design-system/components/MoneyField/README.md +52 -0
  32. package/dist/design-system/components/MoneyField/preview.html +475 -0
  33. package/dist/design-system/components/Splitter/README.md +42 -0
  34. package/dist/design-system/components/Splitter/preview.html +475 -0
  35. package/dist/design-system/components/Table/README.md +2 -1
  36. package/dist/design-system/components/Table/preview.html +1 -1
  37. package/dist/design-system/components/bundle.js +7 -5
  38. package/dist/design-system/components/index.d.ts +3 -21
  39. package/dist/design-system/components/styles.css +2349 -186
  40. package/dist/index-ChJXlxzq.d.ts +809 -0
  41. package/dist/index.d.ts +3 -21
  42. package/dist/index.js +176 -891
  43. package/dist/index.js.map +1 -1
  44. package/dist/styles/components/Accordion.css +1 -1
  45. package/dist/styles/components/AlertDialog.css +1 -1
  46. package/dist/styles/components/Autocomplete.css +1 -1
  47. package/dist/styles/components/Avatar.css +1 -1
  48. package/dist/styles/components/Button.css +1 -1
  49. package/dist/styles/components/Checkbox.css +1 -1
  50. package/dist/styles/components/CheckboxGroup.css +1 -1
  51. package/dist/styles/components/Collapsible.css +1 -1
  52. package/dist/styles/components/Combobox.css +1 -1
  53. package/dist/styles/components/ContextMenu.css +1 -1
  54. package/dist/styles/components/Dialog.css +1 -1
  55. package/dist/styles/components/Drawer.css +1 -1
  56. package/dist/styles/components/Field.css +1 -1
  57. package/dist/styles/components/Fieldset.css +1 -1
  58. package/dist/styles/components/Form.css +1 -1
  59. package/dist/styles/components/Input.css +1 -1
  60. package/dist/styles/components/Menu.css +1 -1
  61. package/dist/styles/components/Menubar.css +1 -1
  62. package/dist/styles/components/Meter.css +1 -1
  63. package/dist/styles/components/NavigationMenu.css +1 -1
  64. package/dist/styles/components/NumberField.css +1 -1
  65. package/dist/styles/components/OTPField.css +1 -1
  66. package/dist/styles/components/Popover.css +1 -1
  67. package/dist/styles/components/PreviewCard.css +1 -1
  68. package/dist/styles/components/Progress.css +1 -1
  69. package/dist/styles/components/Radio.css +1 -1
  70. package/dist/styles/components/ScrollArea.css +1 -1
  71. package/dist/styles/components/Select.css +1 -1
  72. package/dist/styles/components/Separator.css +1 -1
  73. package/dist/styles/components/Slider.css +1 -1
  74. package/dist/styles/components/Switch.css +1 -1
  75. package/dist/styles/components/Tabs.css +1 -1
  76. package/dist/styles/components/Toast.css +1 -1
  77. package/dist/styles/components/Toggle.css +1 -1
  78. package/dist/styles/components/ToggleGroup.css +1 -1
  79. package/dist/styles/components/Toolbar.css +1 -1
  80. package/dist/styles/components/Tooltip.css +1 -1
  81. package/dist/styles/custom/Badge.css +104 -0
  82. package/dist/styles/custom/Collection.css +15 -0
  83. package/dist/styles/custom/CollectionPagination.css +24 -0
  84. package/dist/styles/custom/CollectionToolbar.css +140 -0
  85. package/dist/styles/custom/DataList.css +123 -0
  86. package/dist/styles/custom/DataTable.css +120 -0
  87. package/dist/styles/custom/DatePicker.css +572 -0
  88. package/dist/styles/custom/EditableList.css +98 -0
  89. package/dist/styles/custom/EmptyState.css +255 -0
  90. package/dist/styles/custom/ListDetail.css +126 -0
  91. package/dist/styles/custom/MoneyField.css +344 -0
  92. package/dist/styles/custom/Splitter.css +207 -0
  93. package/dist/styles/{components → custom}/Table.css +31 -4
  94. package/dist/styles/index.css +12 -2
  95. package/dist/styles/reset/accessibility.css +1 -1
  96. package/dist/styles/reset/reset-accessibility.css +1 -1
  97. package/dist/styles/reset/reset-tailwind.css +1 -1
  98. package/dist/styles/reset/reset.css +1 -1
  99. package/dist/styles/tailwind.css +12 -2
  100. package/package.json +35 -7
@@ -0,0 +1,98 @@
1
+ /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
2
+ /* EditableList
3
+ *
4
+ * One table at every width, so a field is not submitted twice. Under the stack width each
5
+ * field shows its own label, so the lost header association does not matter: the input's
6
+ * name comes from that label, not from the column header.
7
+ *
8
+ * Move up / Move down would be quiet buttons in the last cell, ahead of any future drag handle.
9
+ */
10
+
11
+ .EditableList {
12
+ container-type: inline-size;
13
+ }
14
+
15
+ .EditableListAdd,
16
+ .EditableListError,
17
+ .EditableListBalance {
18
+ margin-block-start: var(--sl-collection-toolbar-gap);
19
+ }
20
+
21
+ .EditableListFieldLabel {
22
+ display: none;
23
+ }
24
+
25
+ .EditableListBalance {
26
+ font-family: var(--sl-font-body-condense-font-family);
27
+ font-size: var(--sl-font-body-condense-font-size);
28
+ font-weight: var(--sl-font-body-condense-font-weight);
29
+ line-height: var(--sl-font-body-condense-line-height);
30
+ letter-spacing: var(--sl-font-body-condense-letter-spacing);
31
+ padding: var(--sl-space-2) var(--sl-space-3);
32
+ border-radius: var(--sl-radius-control);
33
+ }
34
+
35
+ .EditableListBalance[data-color] {
36
+ background: var(--sl-scope-soft);
37
+ color: var(--sl-scope-on-soft);
38
+ }
39
+
40
+ .EditableListStackedTitle {
41
+ display: none;
42
+ font-family: var(--sl-font-subtitle-condense-font-family);
43
+ font-size: var(--sl-font-subtitle-condense-font-size);
44
+ font-weight: var(--sl-font-subtitle-condense-font-weight);
45
+ line-height: var(--sl-font-subtitle-condense-line-height);
46
+ letter-spacing: var(--sl-font-subtitle-condense-letter-spacing);
47
+ }
48
+
49
+ .EditableList[data-stacked] .EditableListStackedTitle {
50
+ display: block;
51
+ }
52
+
53
+ .EditableListRowLead {
54
+ width: 0;
55
+ padding: 0;
56
+ border: 0;
57
+ }
58
+
59
+ .EditableList td .Input,
60
+ .EditableList td input,
61
+ .EditableList td select {
62
+ width: 100%;
63
+ }
64
+
65
+ /* The width token is measured in JS. data-stacked is that measurement. */
66
+ .EditableList[data-stacked] {
67
+ .EditableListTable,
68
+ .EditableListTable thead,
69
+ .EditableListTable tbody,
70
+ .EditableListTable tr,
71
+ .EditableListTable td {
72
+ display: block;
73
+ width: 100%;
74
+ height: auto;
75
+ }
76
+
77
+ .EditableListTable thead {
78
+ position: absolute;
79
+ width: var(--sl-space-px);
80
+ height: var(--sl-space-px);
81
+ overflow: hidden;
82
+ clip: rect(0, 0, 0, 0);
83
+ }
84
+
85
+ .EditableListTable tr {
86
+ padding-block: var(--sl-collection-list-row-padding-block);
87
+ border-bottom: var(--sl-stroke-default) solid var(--sl-table-row-border-color);
88
+ }
89
+
90
+ .EditableListFieldLabel {
91
+ display: block;
92
+ font-family: var(--sl-font-subtitle-condense-font-family);
93
+ font-size: var(--sl-font-subtitle-condense-font-size);
94
+ font-weight: var(--sl-font-subtitle-condense-font-weight);
95
+ line-height: var(--sl-font-subtitle-condense-line-height);
96
+ letter-spacing: var(--sl-font-subtitle-condense-letter-spacing);
97
+ }
98
+ }
@@ -0,0 +1,255 @@
1
+ /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
2
+ /* EmptyState
3
+ *
4
+ * The block a page, pane, table, list or popup shows when it has nothing to show.
5
+ * One look for every kind. data-kind only picks the media tone and, in the component,
6
+ * the default icon and whether the block is announced. Sizes are empty.*
7
+ * (tokens/semantic/empty.json). No border and no fill: the container provides those.
8
+ *
9
+ * The circle uses the subtle emphasis level (--sl-e-bg, --sl-e-fg), the same variables
10
+ * Badge uses. data-status on the media recolors it. A parent data-color does too:
11
+ * the subtle chrome pin skips this circle when a color scope is on an ancestor
12
+ * (Badge keeps the pin). A brand pair re-points fill and text, not that chrome
13
+ * scope. The circle stays chrome subtle inside a pair, the same as Badge, so a
14
+ * pair does not get its own selector. High contrast and the vision themes come
15
+ * with those variables. The title stays
16
+ * text-primary and the description text-secondary: an error's title is not red,
17
+ * because a sentence has to stay readable. Neutral kinds use the chrome palette,
18
+ * which is what subtle resolves to when no status is set.
19
+ *
20
+ * Text is a whole style per size, not a font-size on its own. Compact is a table
21
+ * row or a popup, so the title is subtitle-condense (bold, the row's size) and the
22
+ * description is body-condense. Standard is a pane: title-condense, the section
23
+ * heading, with body-base under it. Spacious is a page: title-magnify, the next
24
+ * title up, still body-base so the sentence doesn't grow with the heading.
25
+ * Unselected is the quiet pane beside a list, so it drops the circle, the icon is
26
+ * text-tertiary, and the title steps down one tier: subtitle-minimize where the
27
+ * others use a condense style (there is no title at minimize), and title-condense
28
+ * where the others use title-magnify.
29
+ *
30
+ * Compact is a row (icon, text, actions) centered across the cell. Standard and
31
+ * spacious are a column. They take margin-block: auto so a flex or grid column
32
+ * centers them in the leftover space; in normal flow that margin is zero, so a
33
+ * page that isn't a column doesn't grow a hole. There is no data-fill attribute.
34
+ *
35
+ * The icon for unselected is left_click: the pane is waiting for a choice in the
36
+ * list beside it, which an empty inbox would not say.
37
+ *
38
+ * A popup's empty slot already pads a plain sentence (popup-empty). When the child
39
+ * is an EmptyState, that padding drops so the two don't add. Menu.Empty has no
40
+ * popup-empty padding of its own, so it needs nothing here.
41
+ */
42
+
43
+ /* ============================================
44
+ ROOT
45
+ ============================================ */
46
+
47
+ .EmptyState {
48
+ box-sizing: border-box;
49
+ display: flex;
50
+ flex-direction: column;
51
+ align-items: center;
52
+ justify-content: center;
53
+ gap: var(--sl-empty-gap-standard);
54
+ width: 100%;
55
+ padding-block: var(--sl-empty-padding-block-standard);
56
+ padding-inline: var(--sl-empty-padding-inline-standard);
57
+ color: var(--sl-text-primary);
58
+ text-align: center;
59
+ }
60
+
61
+ /* ============================================
62
+ MEDIA
63
+ ============================================ */
64
+
65
+ .EmptyStateMedia {
66
+ display: inline-flex;
67
+ flex-shrink: 0;
68
+ align-items: center;
69
+ justify-content: center;
70
+ width: var(--sl-empty-media-size-standard);
71
+ height: var(--sl-empty-media-size-standard);
72
+ border-radius: var(--sl-radius-pill);
73
+ background: var(--sl-e-bg);
74
+ color: var(--sl-e-fg);
75
+ }
76
+
77
+ .EmptyStateMedia:not([data-custom]) .material-symbols-outlined,
78
+ .EmptyStateMedia:not([data-custom]) svg {
79
+ width: var(--sl-icon-size-magnify);
80
+ height: var(--sl-icon-size-magnify);
81
+ font-size: var(--sl-icon-size-magnify);
82
+ line-height: 1;
83
+ }
84
+
85
+ /* An illustration the app passed in. No circle and no tint. */
86
+ .EmptyStateMedia[data-custom] {
87
+ width: auto;
88
+ height: auto;
89
+ background: none;
90
+ color: inherit;
91
+ }
92
+
93
+ /* ============================================
94
+ TEXT
95
+ ============================================ */
96
+
97
+ .EmptyStateText {
98
+ display: flex;
99
+ flex-direction: column;
100
+ align-items: center;
101
+ gap: var(--sl-empty-text-gap-standard);
102
+ min-width: 0;
103
+ max-width: var(--sl-empty-description-max-width);
104
+ }
105
+
106
+ .EmptyStateTitle {
107
+ font-family: var(--sl-font-title-condense-font-family);
108
+ font-size: var(--sl-font-title-condense-font-size);
109
+ font-weight: var(--sl-font-title-condense-font-weight);
110
+ line-height: var(--sl-font-title-condense-line-height);
111
+ letter-spacing: var(--sl-font-title-condense-letter-spacing);
112
+ margin: 0;
113
+ max-width: 100%;
114
+ color: var(--sl-text-primary);
115
+ }
116
+
117
+ .EmptyStateDescription {
118
+ font-family: var(--sl-font-body-base-font-family);
119
+ font-size: var(--sl-font-body-base-font-size);
120
+ font-weight: var(--sl-font-body-base-font-weight);
121
+ line-height: var(--sl-font-body-base-line-height);
122
+ letter-spacing: var(--sl-font-body-base-letter-spacing);
123
+ margin: 0;
124
+ max-width: 100%;
125
+ color: var(--sl-text-secondary);
126
+ }
127
+
128
+ /* ============================================
129
+ ACTIONS
130
+ ============================================ */
131
+
132
+ .EmptyStateActions {
133
+ display: flex;
134
+ flex-wrap: wrap;
135
+ align-items: center;
136
+ justify-content: center;
137
+ gap: var(--sl-empty-actions-gap);
138
+ }
139
+
140
+ /* ============================================
141
+ SIZES
142
+ ============================================ */
143
+
144
+ .EmptyState[data-size='compact'] {
145
+ flex-direction: row;
146
+ flex-wrap: wrap;
147
+ gap: var(--sl-empty-gap-compact);
148
+ padding-block: var(--sl-empty-padding-block-compact);
149
+ padding-inline: var(--sl-empty-padding-inline-compact);
150
+ }
151
+
152
+ .EmptyState[data-size='compact'] .EmptyStateText {
153
+ gap: var(--sl-empty-text-gap-compact);
154
+ }
155
+
156
+ .EmptyState[data-size='compact'] .EmptyStateTitle {
157
+ font-family: var(--sl-font-subtitle-condense-font-family);
158
+ font-size: var(--sl-font-subtitle-condense-font-size);
159
+ font-weight: var(--sl-font-subtitle-condense-font-weight);
160
+ line-height: var(--sl-font-subtitle-condense-line-height);
161
+ letter-spacing: var(--sl-font-subtitle-condense-letter-spacing);
162
+ }
163
+
164
+ .EmptyState[data-size='compact'] .EmptyStateDescription {
165
+ font-family: var(--sl-font-body-condense-font-family);
166
+ font-size: var(--sl-font-body-condense-font-size);
167
+ font-weight: var(--sl-font-body-condense-font-weight);
168
+ line-height: var(--sl-font-body-condense-line-height);
169
+ letter-spacing: var(--sl-font-body-condense-letter-spacing);
170
+ }
171
+
172
+ /* Icon only. The tone stays on the glyph, so an error is still an error. */
173
+ .EmptyState[data-size='compact'] .EmptyStateMedia {
174
+ width: auto;
175
+ height: auto;
176
+ background: none;
177
+ }
178
+
179
+ .EmptyState[data-size='compact'] .EmptyStateMedia:not([data-custom]) .material-symbols-outlined,
180
+ .EmptyState[data-size='compact'] .EmptyStateMedia:not([data-custom]) svg {
181
+ width: var(--sl-icon-size-condense);
182
+ height: var(--sl-icon-size-condense);
183
+ font-size: var(--sl-icon-size-condense);
184
+ }
185
+
186
+ .EmptyState[data-size='spacious'] {
187
+ gap: var(--sl-empty-gap-spacious);
188
+ padding-block: var(--sl-empty-padding-block-spacious);
189
+ padding-inline: var(--sl-empty-padding-inline-spacious);
190
+ }
191
+
192
+ .EmptyState[data-size='spacious'] .EmptyStateText {
193
+ gap: var(--sl-empty-text-gap-spacious);
194
+ }
195
+
196
+ .EmptyState[data-size='spacious'] .EmptyStateTitle {
197
+ font-family: var(--sl-font-title-magnify-font-family);
198
+ font-size: var(--sl-font-title-magnify-font-size);
199
+ font-weight: var(--sl-font-title-magnify-font-weight);
200
+ line-height: var(--sl-font-title-magnify-line-height);
201
+ letter-spacing: var(--sl-font-title-magnify-letter-spacing);
202
+ }
203
+
204
+ .EmptyState[data-size='spacious'] .EmptyStateMedia {
205
+ width: var(--sl-empty-media-size-spacious);
206
+ height: var(--sl-empty-media-size-spacious);
207
+ }
208
+
209
+ .EmptyState[data-size='spacious'] .EmptyStateMedia:not([data-custom]) .material-symbols-outlined,
210
+ .EmptyState[data-size='spacious'] .EmptyStateMedia:not([data-custom]) svg {
211
+ width: var(--sl-icon-size-maximize);
212
+ height: var(--sl-icon-size-maximize);
213
+ font-size: var(--sl-icon-size-maximize);
214
+ }
215
+
216
+ /* ============================================
217
+ PLACES
218
+ ============================================ */
219
+
220
+ /* A flex or grid column centers the block in the space left over. */
221
+ .EmptyState:is([data-size='standard'], [data-size='spacious']) {
222
+ margin-block: auto;
223
+ }
224
+
225
+ /* The detail pane before a row is picked. Quieter than the list beside it. */
226
+ .EmptyState[data-kind='unselected'] .EmptyStateMedia {
227
+ width: auto;
228
+ height: auto;
229
+ background: none;
230
+ color: var(--sl-text-tertiary);
231
+ }
232
+
233
+ .EmptyState[data-kind='unselected'][data-size='compact'] .EmptyStateTitle,
234
+ .EmptyState[data-kind='unselected'][data-size='standard'] .EmptyStateTitle {
235
+ font-family: var(--sl-font-subtitle-minimize-font-family);
236
+ font-size: var(--sl-font-subtitle-minimize-font-size);
237
+ font-weight: var(--sl-font-subtitle-minimize-font-weight);
238
+ line-height: var(--sl-font-subtitle-minimize-line-height);
239
+ letter-spacing: var(--sl-font-subtitle-minimize-letter-spacing);
240
+ }
241
+
242
+ .EmptyState[data-kind='unselected'][data-size='spacious'] .EmptyStateTitle {
243
+ font-family: var(--sl-font-title-condense-font-family);
244
+ font-size: var(--sl-font-title-condense-font-size);
245
+ font-weight: var(--sl-font-title-condense-font-weight);
246
+ line-height: var(--sl-font-title-condense-line-height);
247
+ letter-spacing: var(--sl-font-title-condense-letter-spacing);
248
+ }
249
+
250
+ /* The popup slot pads a plain sentence. An EmptyState brings its own padding. */
251
+ .ComboboxEmpty:has(> .EmptyState),
252
+ .AutocompleteEmpty:has(> .EmptyState) {
253
+ padding: 0;
254
+ color: inherit;
255
+ }
@@ -0,0 +1,126 @@
1
+ /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
2
+ /* ListDetail
3
+ *
4
+ * The detail of one item, next to its list. Not a Base UI part. It is a Splitter
5
+ * when this element is at least list-detail.split-min-width wide, measured on the
6
+ * element itself so it still works inside another panel. Narrower, the detail is
7
+ * the existing Drawer (the default) or it replaces the list, which stays mounted
8
+ * and hidden so its scroll position survives Back.
9
+ *
10
+ * The list stays in the splitter's first panel whether the detail is open, closed,
11
+ * or in a drawer, so its scroll survives. The detail is portaled into a node the
12
+ * component created, and that node moves. The list sits on the page surface. The
13
+ * detail sits on surface.raised: a pane
14
+ * beside the list, one step off the page, with the splitter line as the only
15
+ * divider. A modal surface would make the pane look like a dialog stuck in the
16
+ * layout. Drawer mode does not restyle that; it uses the Drawer's own modal
17
+ * surface, title and Close, so it matches every other drawer.
18
+ *
19
+ * The header title is text-title-condense. title-amplify is for a dialog or a
20
+ * drawer, a layer over the page. A pane heading shares the view with the list,
21
+ * so the condensed title fits the row. Close is a quiet icon-only Button: a
22
+ * text Close would compete with the title and the actions in a short header.
23
+ * Page mode puts Back, icon and word, where Close was.
24
+ *
25
+ * Focus moves to the heading when the detail opens, and back to the row when it
26
+ * closes. Changing the title because another row was picked does not move focus.
27
+ * Escape closes only when it bubbles out of the detail, so an open menu handles
28
+ * it first. Nothing listens on window. Page changes are announced by that focus
29
+ * move; there is no live region.
30
+ *
31
+ * data-layout is split, drawer or page. data-open is set while the detail is open.
32
+ */
33
+
34
+ .ListDetail {
35
+ display: flex;
36
+ flex-direction: column;
37
+ width: 100%;
38
+ height: 100%;
39
+ min-width: 0;
40
+ min-height: 0;
41
+ }
42
+
43
+ .ListDetailHost,
44
+ .ListDetailSlot,
45
+ .ListDetailSplit,
46
+ .ListDetailList,
47
+ .ListDetailDetail {
48
+ display: flex;
49
+ flex-direction: column;
50
+ min-width: 0;
51
+ min-height: 0;
52
+ height: 100%;
53
+ flex: 1;
54
+ }
55
+
56
+ .ListDetailList {
57
+ overflow: auto;
58
+ background: transparent;
59
+ }
60
+
61
+ .ListDetail[data-layout='split'],
62
+ .ListDetail[data-layout='drawer'],
63
+ .ListDetail[data-layout='page'] {
64
+ min-width: 0;
65
+ }
66
+
67
+ .ListDetail[data-open] .ListDetailList {
68
+ min-height: 0;
69
+ }
70
+
71
+ .ListDetailDetail[data-layout='split'],
72
+ .ListDetailDetail[data-layout='page'] {
73
+ background: var(--sl-surface-raised);
74
+ }
75
+
76
+ .ListDetailDetail[data-layout='drawer'] {
77
+ background: transparent;
78
+ }
79
+
80
+ .DrawerPopup .ListDetailHeader,
81
+ .ListDetailDetail[data-layout='drawer'] .ListDetailBody {
82
+ padding: 0;
83
+ }
84
+
85
+ .ListDetailHeader {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: var(--sl-list-detail-header-gap);
89
+ padding: var(--sl-list-detail-header-padding);
90
+ flex: none;
91
+ }
92
+
93
+ .ListDetailTitle {
94
+ font-family: var(--sl-font-title-condense-font-family);
95
+ font-size: var(--sl-font-title-condense-font-size);
96
+ font-weight: var(--sl-font-title-condense-font-weight);
97
+ line-height: var(--sl-font-title-condense-line-height);
98
+ letter-spacing: var(--sl-font-title-condense-letter-spacing);
99
+ margin: 0;
100
+ flex: 1;
101
+ min-width: 0;
102
+ }
103
+
104
+ .ListDetailHeader .DrawerTitle {
105
+ flex: 1;
106
+ min-width: 0;
107
+ }
108
+
109
+ .ListDetailActions {
110
+ display: flex;
111
+ align-items: center;
112
+ gap: var(--sl-list-detail-header-gap);
113
+ flex: none;
114
+ }
115
+
116
+ .ListDetailBody {
117
+ flex: 1;
118
+ min-height: 0;
119
+ overflow: auto;
120
+ padding-inline: var(--sl-list-detail-header-padding);
121
+ padding-block-end: var(--sl-list-detail-header-padding);
122
+ }
123
+
124
+ .ListDetail[data-layout='drawer'] .ListDetailDetail {
125
+ background: transparent;
126
+ }