yummy-guide-generic-administrate 0.8.7 → 0.8.8

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0520a5cdee147e08194dab9b3db2bd7c07a1ab16378069dd33075092a0d26fa5
4
- data.tar.gz: 929494186a5804c39b86503635520ec5b0a5898fc2c306cdd679787dac48b361
3
+ metadata.gz: 74f5b683cf773df946e0d0e56e1abd66d931e9e5c660afa77c30b80472ae23c6
4
+ data.tar.gz: e3a282a8a3cfdedf00d02a5071ce9ae325ea164e905931e14ebcdc7f8bf1aad5
5
5
  SHA512:
6
- metadata.gz: 043eb9eae3d408ef080935b7ab1072f8f5df4e965549f6b8285c5b3f0dd0e50408c92f0174bac1ede3dceaaee976c107bc900cacb389e294bb66cf3882fe2767
7
- data.tar.gz: 2cf1472d84a48a940408f1dec4138966f0efd331c0097f3152ccbaa9564e8faf74a246dcf0b195a63393f1934299961a0b334a1b4dc4e66ccea34b2f14bc400f
6
+ metadata.gz: 410dbc0171c5cfc6c0b83c12e7943d58a959707d214c13b570f83973941214394741447654ea658df789c3c3b3f20c097be41fdc8d1fa0f8201ecf723f796f8a
7
+ data.tar.gz: 1f750eec8e2b1561d5dde53484be393dfa9194c0af204c6dc251ae27dd6b7a605880de00fae2db9d8e51dfe7901ba8b55d89a28f50fe5296e7055f513695cd6e
data/README.md CHANGED
@@ -51,7 +51,6 @@ bundle install
51
51
  - 管理画面フォーム用の number input text 化 helper
52
52
  - 共通 partial / assets
53
53
  - collection partial
54
- - fixed table header partial
55
54
  - filter form partial
56
55
  - `clipboards.js`
57
56
  - `datetime_input.js`
@@ -59,7 +58,6 @@ bundle install
59
58
  - `filter_controls.js`
60
59
  - `filter_form.js`
61
60
  - `sticky_left_columns.js`
62
- - `sticky_table_headers.js`
63
61
  - `tooltips.js`
64
62
  - `components.css`
65
63
  - 共通 field
@@ -143,18 +141,27 @@ engine の共通 partial に委譲します。
143
141
  #### 1. 最小構成
144
142
 
145
143
  gem 付属の collection partial をそのまま使う場合、table wrapper と table 本体に
146
- 必要な `data-*` 属性はすでに入っています。そのため、JS / CSS を読み込めば固定
147
- ヘッダーとカラム幅調整は自動で有効になります。カラム幅調整を使う場合は
144
+ 必要な `data-*` 属性はすでに入っています。`data-css-sticky-table` sticky 対象の
145
+ 識別子として使い、wrapper 自体には縦横スクロールを持たせません。そのため、ページ
146
+ スクロールに合わせて `thead th` が sticky で固定されます。カラム幅調整を使う場合は
148
147
  `yummy_guide_administrate/column_resizer.js` も読み込んでください。
149
148
 
150
149
  内部的には以下のような構造になります。
151
150
 
152
151
  ```erb
153
- <div class="scroll-table" data-fixed-header-scroll>
152
+ <% table_definition = yummy_guide_administrate_collection_table_definition(
153
+ page: page,
154
+ collection_presenter: collection_presenter
155
+ ) %>
156
+
157
+ <div class="scroll-table" data-css-sticky-table>
154
158
  <table
155
159
  aria-labelledby="<%= table_title %>"
156
- data-fixed-columns-count="<%= yummy_guide_administrate_collection_table_fixed_columns_count(page: page, collection_presenter: collection_presenter) %>"
157
- data-fixed-header-source
160
+ data-fixed-columns-count="<%= table_definition.fixed_columns_count %>"
161
+ data-mobile-fixed-columns-count="<%= table_definition.mobile_fixed_columns_count %>"
162
+ <% if table_definition.table_style.present? %>
163
+ style="<%= table_definition.table_style %>"
164
+ <% end %>
158
165
  >
159
166
  ...
160
167
  </table>
@@ -163,63 +170,39 @@ gem 付属の collection partial をそのまま使う場合、table wrapper と
163
170
 
164
171
  複数画面で幅設定を共有したい場合は、render local に `column_width_storage_scope: "admin.reservations"` のような任意の scope 名を渡してください。
165
172
 
166
- #### 2. ヘッダー位置を明示したい場合
167
-
168
- 固定ヘッダーの表示位置をページ上部の特定箇所に合わせたい場合は、
169
- `data-fixed-table-header` を持つ slot を `.main-content` 配下に置きます。
170
- gem には専用 partial があります。
171
-
172
- ```erb
173
- <header class="main-content__header">
174
- <h1 id="page-title">Articles</h1>
175
- <%= render "yummy_guide/administrate/administrate/application/fixed_table_header" %>
176
- </header>
177
-
178
- <section class="main-content__body main-content__body--flush">
179
- <%= render "yummy_guide/administrate/administrate/application/collection",
180
- collection_presenter: collection_presenter,
181
- page: page,
182
- resources: resources,
183
- table_title: "page-title",
184
- namespace: :admin,
185
- resource_class: resource_class,
186
- collection_field_name: resource_name %>
187
- </section>
188
- ```
189
-
190
- `fixed_table_header` partial 自体は以下の 1 行です。
191
-
192
- ```erb
193
- <div class="yummy-guide-administrate-fixed-table-header" data-fixed-table-header hidden></div>
194
- ```
195
-
196
- この slot を置かない場合でも、JS が table の直前に自動生成します。配置を制御
197
- したいときだけ明示してください。desktop では LMJ と同じく、`main-content__body--flush`
198
- と組み合わせることで fixed header のクリップ幅が一覧 body と揃い、一覧 wrapper
199
- 自体には縦スクロールを持たせません。
200
-
201
- #### 3. 自前の table partial を使う場合
173
+ #### 2. 自前の table partial を使う場合
202
174
 
203
175
  独自の collection partial を書く場合は、少なくとも以下を満たしてください。
204
176
 
205
- - 横スクロール wrapper に `data-fixed-header-scroll` を付ける
206
- - table に `data-fixed-header-source` を付ける
177
+ - table wrapper に `data-css-sticky-table` を付ける
178
+ - `data-css-sticky-table` を付けた wrapper に縦横スクロールを持たせない
207
179
  - table に `data-fixed-columns-count` を付ける
180
+ - table に `data-mobile-fixed-columns-count` を付ける
181
+ - 固定列数・列幅・固定列class/styleは `yummy_guide_administrate_collection_table_definition` から参照する
208
182
  - header の `aria-labelledby` がページタイトルと対応している
209
183
 
210
184
  ```erb
211
- <%= render "yummy_guide/administrate/administrate/application/fixed_table_header" %>
185
+ <% table_definition = yummy_guide_administrate_collection_table_definition(
186
+ page: page,
187
+ collection_presenter: collection_presenter,
188
+ column_names: %i[id name]
189
+ ) %>
212
190
 
213
- <div class="scroll-table" data-fixed-header-scroll>
191
+ <div class="scroll-table" data-css-sticky-table>
214
192
  <table
215
193
  aria-labelledby="page-title"
216
- data-fixed-header-source
217
- data-fixed-columns-count="<%= yummy_guide_administrate_collection_table_fixed_columns_count(page: page, collection_presenter: collection_presenter) %>"
194
+ data-fixed-columns-count="<%= table_definition.fixed_columns_count %>"
195
+ data-mobile-fixed-columns-count="<%= table_definition.mobile_fixed_columns_count %>"
196
+ <% if table_definition.table_style.present? %>
197
+ style="<%= table_definition.table_style %>"
198
+ <% end %>
218
199
  >
219
200
  <thead>
220
201
  <tr>
221
- <th>ID</th>
222
- <th>Name</th>
202
+ <% id_column = table_definition.sticky_column(:id) %>
203
+ <th class="<%= id_column[:class] %>" style="<%= id_column[:style] %>">ID</th>
204
+ <% name_column = table_definition.sticky_column(:name) %>
205
+ <th class="<%= name_column[:class] %>" style="<%= name_column[:style] %>">Name</th>
223
206
  <th class="sticky actions-column">Actions</th>
224
207
  </tr>
225
208
  </thead>
@@ -502,7 +485,6 @@ block を使わない場合、tooltip 本文はテキストとして扱われ、
502
485
  //= require yummy_guide_administrate/filter_controls
503
486
  //= require yummy_guide_administrate/filter_form
504
487
  //= require yummy_guide_administrate/sticky_left_columns
505
- //= require yummy_guide_administrate/sticky_table_headers
506
488
  //= require yummy_guide_administrate/tooltips
507
489
  ```
508
490
 
@@ -6,7 +6,6 @@
6
6
  var DRAGGING_BODY_CLASS = 'admin-column-resizer--dragging';
7
7
  var APPLYING_BODY_CLASS = 'admin-column-resizer--applying';
8
8
  var PREVIEW_CLASS = 'admin-column-resizer__preview';
9
- var FIXED_HEADER_TABLE_CLASS = 'table-fixed-header__table';
10
9
  var ADJUSTED_COLUMNS_ATTRIBUTE = 'data-admin-column-resizer-adjusted-columns';
11
10
  var STORAGE_PREFIX = 'yummyGuideAdminColumnWidths:v1:';
12
11
  var STYLE_ELEMENT_ID = 'admin-column-resizer-rules';
@@ -20,14 +19,10 @@
20
19
  var generatedRuleCount = 0;
21
20
  var initializedHandles = new WeakSet();
22
21
  var tableStates = new WeakMap();
23
- var stickyRefreshFrame = null;
24
- var stickyRefreshCallbacks = [];
25
22
  var applyingWidth = false;
26
23
 
27
24
  function storageScopeForTable(table) {
28
- var sourceTable = matchingSourceTable(table);
29
- var scopedTable = sourceTable || table;
30
- var scope = scopedTable && scopedTable.getAttribute('data-column-resizer-storage-scope');
25
+ var scope = table && table.getAttribute('data-column-resizer-storage-scope');
31
26
 
32
27
  return scope || window.location.pathname;
33
28
  }
@@ -115,39 +110,15 @@
115
110
  .replace(/\s+/g, ' ');
116
111
  }
117
112
 
118
- function headerSignature(table) {
119
- return columnHeaders(table).map(function(header, index) {
120
- return normalizedIdentifier(header.dataset.columnId || headerLabel(header) || ('column_' + (index + 1)));
121
- }).join('__');
122
- }
123
-
124
- function matchingSourceTable(table) {
125
- if (!table) return null;
126
- if (!table.classList.contains(FIXED_HEADER_TABLE_CLASS)) return null;
127
-
128
- var signature = headerSignature(table);
129
- return sourceTables().find(function(sourceTable) {
130
- return headerSignature(sourceTable) === signature;
131
- }) || null;
132
- }
133
-
134
113
  function tableIdentifier(table) {
135
114
  if (table.dataset.adminColumnResizerTableId) return table.dataset.adminColumnResizerTableId;
136
115
 
137
- var sourceTable = matchingSourceTable(table);
138
- if (sourceTable) {
139
- table.dataset.adminColumnResizerTableId = tableIdentifier(sourceTable);
140
- return table.dataset.adminColumnResizerTableId;
141
- }
142
-
143
116
  var tableLabel = table.id ||
144
117
  table.getAttribute('aria-labelledby') ||
145
- table.getAttribute('data-admin-column-resizer-table') ||
146
- table.getAttribute('data-fixed-header-source');
118
+ table.getAttribute('data-admin-column-resizer-table');
147
119
 
148
120
  if (!tableLabel) {
149
- var index = sourceTables().indexOf(table);
150
- tableLabel = 'table_' + (index >= 0 ? index + 1 : allTrackedTables().indexOf(table) + 1);
121
+ tableLabel = 'table_' + (allTrackedTables().indexOf(table) + 1);
151
122
  }
152
123
 
153
124
  table.dataset.adminColumnResizerTableId = normalizedIdentifier(tableLabel);
@@ -259,19 +230,12 @@
259
230
  return Array.from(document.querySelectorAll(TABLE_SELECTOR));
260
231
  }
261
232
 
262
- function sourceTables() {
263
- return allTrackedTables().filter(function(table) {
264
- return table.getAttribute('aria-hidden') !== 'true' && !table.classList.contains(FIXED_HEADER_TABLE_CLASS);
265
- });
266
- }
267
-
268
233
  function stateForTable(table) {
269
234
  return tableStates.get(table) || configureTable(table);
270
235
  }
271
236
 
272
237
  function ensureManagedColgroup(table, columnCount) {
273
- var fixedHeaderColgroup = table.querySelector('colgroup[data-fixed-header-colgroup]');
274
- var colgroup = fixedHeaderColgroup || table.querySelector('colgroup[data-admin-column-resizer-colgroup]');
238
+ var colgroup = table.querySelector('colgroup[data-admin-column-resizer-colgroup]');
275
239
 
276
240
  if (!colgroup) {
277
241
  colgroup = document.createElement('colgroup');
@@ -407,7 +371,7 @@
407
371
  }
408
372
 
409
373
  function managedColumnWidth(table, index) {
410
- var colgroup = table && table.querySelector('colgroup[data-admin-column-resizer-colgroup], colgroup[data-fixed-header-colgroup]');
374
+ var colgroup = table && table.querySelector('colgroup[data-admin-column-resizer-colgroup]');
411
375
  var col = colgroup && colgroup.children[index];
412
376
 
413
377
  return col ? parsedPixelValue(col.style.width) : 0;
@@ -447,7 +411,7 @@
447
411
  }
448
412
 
449
413
  function refreshCssStickyLeftColumns(table) {
450
- if (!table || table.getAttribute('aria-hidden') === 'true' || table.classList.contains(FIXED_HEADER_TABLE_CLASS)) return;
414
+ if (!table || table.getAttribute('aria-hidden') === 'true') return;
451
415
 
452
416
  refreshCssStickyLeftColumnSet(table, 'sticky-left', '--sticky-left', '--sticky-width');
453
417
  refreshCssStickyLeftColumnSet(table, 'sticky-left-mobile', '--sticky-mobile-left', '--sticky-mobile-width');
@@ -491,41 +455,10 @@
491
455
  });
492
456
  }
493
457
 
494
- function dispatchStickyRefresh() {
495
- stickyRefreshFrame = null;
496
- window.dispatchEvent(new Event('resize'));
497
-
498
- var callbacks = stickyRefreshCallbacks;
499
- stickyRefreshCallbacks = [];
500
- callbacks.forEach(function(callback) {
501
- callback();
502
- });
503
- }
504
-
505
- function scheduleStickyRefresh(callback) {
506
- if (callback) {
507
- stickyRefreshCallbacks.push(callback);
508
- }
509
-
510
- if (stickyRefreshFrame) return;
511
-
512
- stickyRefreshFrame = window.requestAnimationFrame(dispatchStickyRefresh);
513
- }
514
-
515
458
  function sourceTableForHandle(handle) {
516
- var header = handle.closest('th');
517
- if (!header) return null;
518
-
519
459
  var table = handle.closest(TABLE_SELECTOR);
520
- var columnId = headerColumnId(header);
521
460
 
522
- if (table && table.getAttribute('aria-hidden') !== 'true' && !table.classList.contains(FIXED_HEADER_TABLE_CLASS)) {
523
- return table;
524
- }
525
-
526
- return sourceTables().find(function(sourceTable) {
527
- return columnHeader(sourceTable, columnId);
528
- }) || matchingSourceTable(table) || null;
461
+ return table && table.getAttribute('aria-hidden') !== 'true' ? table : null;
529
462
  }
530
463
 
531
464
  function previewBoundsForTable(table, header) {
@@ -533,10 +466,8 @@
533
466
  var tableRect = table.getBoundingClientRect();
534
467
  var scrollContainer = table.closest('.sticky-table-scroll, .scroll-table, .home-table__wrapper');
535
468
  var scrollRect = scrollContainer ? scrollContainer.getBoundingClientRect() : tableRect;
536
- var headerTable = header.closest(TABLE_SELECTOR);
537
- var fromFixedHeader = headerTable && headerTable.classList.contains(FIXED_HEADER_TABLE_CLASS);
538
469
  var viewportBottom = viewportHeight();
539
- var top = fromFixedHeader ? headerRect.top : Math.max(tableRect.top, scrollRect.top);
470
+ var top = Math.max(tableRect.top, scrollRect.top);
540
471
  var bottom = Math.min(viewportBottom, Math.max(tableRect.bottom, scrollRect.bottom, headerRect.bottom));
541
472
 
542
473
  top = Math.max(0, Math.min(top, viewportBottom));
@@ -551,6 +482,10 @@
551
482
  };
552
483
  }
553
484
 
485
+ function previewParentForTable(table) {
486
+ return table.closest('.main-content, .admin-main') || document.body;
487
+ }
488
+
554
489
  function updateDragPreview(preview, width) {
555
490
  if (!preview) return;
556
491
 
@@ -567,7 +502,7 @@
567
502
  element.style.top = cssPixelValue(bounds.top);
568
503
  element.style.height = cssPixelValue(bounds.height);
569
504
 
570
- document.body.appendChild(element);
505
+ previewParentForTable(table).appendChild(element);
571
506
 
572
507
  var preview = {
573
508
  element: element
@@ -673,37 +608,6 @@
673
608
  });
674
609
  }
675
610
 
676
- function refreshStickyHeaderColumn(pendingWidth, callback) {
677
- var api = window.YummyGuideAdministrateStickyTableHeaders;
678
-
679
- if (api && typeof api.refreshColumnWidth === 'function') {
680
- var refreshed = api.refreshColumnWidth({
681
- sourceTable: pendingWidth.sourceTable,
682
- columnId: pendingWidth.columnId,
683
- width: pendingWidth.width
684
- });
685
-
686
- if (refreshed) {
687
- window.requestAnimationFrame(callback);
688
- return;
689
- }
690
- }
691
-
692
- scheduleStickyRefresh(callback);
693
- }
694
-
695
- function refreshStickyHeaderTable(sourceTable, callback) {
696
- var api = window.YummyGuideAdministrateStickyTableHeaders;
697
-
698
- if (api && typeof api.refreshTable === 'function') {
699
- var refreshed = api.refreshTable(sourceTable, callback);
700
-
701
- if (refreshed) return;
702
- }
703
-
704
- scheduleStickyRefresh(callback);
705
- }
706
-
707
611
  function refreshStickyLeftColumns(sourceTable) {
708
612
  var api = window.YummyGuideAdministrateStickyLeftColumns;
709
613
 
@@ -767,7 +671,7 @@
767
671
  widths[pendingWidth.columnId] = preciseNumber(pendingWidth.width);
768
672
  safeWriteWidths(pendingWidth.storageKey, widths);
769
673
  refreshStickyLeftColumnsForWidth(pendingWidth);
770
- refreshStickyHeaderColumn(pendingWidth, function() {
674
+ window.requestAnimationFrame(function() {
771
675
  stopApplyingWidth(pendingWidth.preview);
772
676
  });
773
677
  } catch (error) {
@@ -888,15 +792,12 @@
888
792
  clearColumnWidth(columnId, key);
889
793
  startApplyingWidth();
890
794
  if (sourceTable) {
891
- refreshStickyHeaderTable(sourceTable, function() {
892
- refreshStickyLeftColumns(sourceTable);
893
- stopApplyingWidth(null);
894
- });
895
- } else {
896
- scheduleStickyRefresh(function() {
897
- stopApplyingWidth(null);
898
- });
795
+ refreshStickyLeftColumns(sourceTable);
899
796
  }
797
+
798
+ window.requestAnimationFrame(function() {
799
+ stopApplyingWidth(null);
800
+ });
900
801
  }
901
802
 
902
803
  function stopHandleClick(event) {
@@ -1,4 +1,4 @@
1
- table.admin-column-resizer__table:not(.table-fixed-header__table) {
1
+ table.admin-column-resizer__table {
2
2
  table-layout: auto !important;
3
3
  width: max-content !important;
4
4
  min-width: 100% !important;
@@ -56,7 +56,7 @@ table.admin-column-resizer__table:not(.table-fixed-header__table) {
56
56
 
57
57
  .admin-column-resizer__preview {
58
58
  position: fixed;
59
- z-index: 10000;
59
+ z-index: var(--admin-column-resizer-preview-z-index, 14);
60
60
  box-sizing: border-box;
61
61
  pointer-events: none;
62
62
  background: rgba(37, 99, 235, 0.12);
@@ -67,14 +67,6 @@ table.admin-column-resizer__table:not(.table-fixed-header__table) {
67
67
  will-change: width;
68
68
  }
69
69
 
70
- [data-fixed-table-header] .admin-column-resizer__handle {
71
- pointer-events: auto;
72
- }
73
-
74
- [data-fixed-table-header] .table-fixed-header__table th.admin-column-resizer__header:not(.sticky):not(.sticky-left) {
75
- position: relative;
76
- }
77
-
78
70
  @media (pointer: coarse), screen and (max-width: 767px) {
79
71
  .admin-column-resizer__handle {
80
72
  right: -14px;
@@ -3,15 +3,30 @@
3
3
  body.admin-body > aside {
4
4
  --admin-navigation-default-width: 240px;
5
5
  align-self: flex-start;
6
+ background: var(--admin-page-background, #f6f7f7);
7
+ box-shadow:
8
+ calc(0px - var(--admin-layout-inline-padding, 0px)) 0 0 var(--admin-layout-inline-padding, 0px) var(--admin-page-background, #f6f7f7),
9
+ 0 calc(0px - var(--admin-navigation-top, 1rem)) 0 var(--admin-navigation-top, 1rem) var(--admin-page-background, #f6f7f7),
10
+ 0 var(--admin-navigation-bottom, 1rem) 0 var(--admin-navigation-bottom, 1rem) var(--admin-page-background, #f6f7f7);
6
11
  box-sizing: border-box;
12
+ display: flex;
7
13
  flex: 0 0 clamp(25px, var(--admin-navigation-width, var(--admin-navigation-default-width)), 250px);
8
- max-height: calc(100vh - 2rem);
14
+ flex-direction: column;
15
+ bottom: var(--admin-navigation-bottom, 1rem);
16
+ height: calc(100vh - var(--admin-navigation-top, 1rem) - var(--admin-navigation-bottom, 1rem));
17
+ height: calc(100dvh - var(--admin-navigation-top, 1rem) - var(--admin-navigation-bottom, 1rem));
18
+ max-height: calc(100vh - var(--admin-navigation-top, 1rem) - var(--admin-navigation-bottom, 1rem));
19
+ max-height: calc(100dvh - var(--admin-navigation-top, 1rem) - var(--admin-navigation-bottom, 1rem));
20
+ min-height: 0;
9
21
  min-width: 25px;
10
22
  max-width: 250px;
11
- overflow: visible;
12
- position: sticky;
13
- top: 1rem;
23
+ overflow-x: hidden;
24
+ overflow-y: auto;
25
+ position: fixed;
26
+ top: var(--admin-navigation-top, 1rem);
27
+ left: var(--admin-layout-inline-padding, 0);
14
28
  width: clamp(25px, var(--admin-navigation-width, var(--admin-navigation-default-width)), 250px);
29
+ z-index: var(--admin-navigation-z-index, 40);
15
30
  }
16
31
 
17
32
  body.admin-body > aside:not(.navigation) {
@@ -19,22 +34,28 @@
19
34
  }
20
35
 
21
36
  .app-container > .navigation {
22
- max-height: calc(100vh - 3em);
23
- max-height: calc(100dvh - 3em);
24
- top: 1.5em;
37
+ top: var(--admin-navigation-top, 1.5rem);
25
38
  }
26
39
 
27
- .app-container > .main-content,
28
- body.admin-body > main.admin-main {
29
- flex: 1 1 auto;
40
+ .app-container > .main-content {
41
+ flex: 0 0 calc(100% - var(--admin-main-left-offset, 0px));
42
+ margin-left: var(--admin-main-left-offset, 0);
30
43
  min-width: 0;
31
44
  position: relative;
45
+ inline-size: calc(100% - var(--admin-main-left-offset, 0px));
46
+ max-inline-size: calc(100% - var(--admin-main-left-offset, 0px));
47
+ width: calc(100% - var(--admin-main-left-offset, 0px));
32
48
  z-index: 1;
33
- width: auto;
34
49
  }
35
50
 
36
- body.admin-body > main.main-content {
37
- width: auto;
51
+ body.admin-body > main.admin-main {
52
+ box-sizing: border-box;
53
+ margin-left: var(--admin-sticky-page-header-left, var(--admin-main-left-offset, 0px));
54
+ min-width: 0;
55
+ position: relative;
56
+ max-inline-size: calc(100% - var(--admin-sticky-page-header-left, var(--admin-main-left-offset, 0px)) - var(--admin-layout-inline-padding, 0px));
57
+ width: calc(100% - var(--admin-sticky-page-header-left, var(--admin-main-left-offset, 0px)) - var(--admin-layout-inline-padding, 0px));
58
+ z-index: 1;
38
59
  }
39
60
 
40
61
  .admin-navigation-resize-handle {
@@ -68,12 +89,21 @@
68
89
  }
69
90
 
70
91
  .admin-navigation-scroll-area {
92
+ background: inherit;
93
+ display: flex;
94
+ flex: 1 1 auto;
95
+ flex-direction: column;
71
96
  max-height: inherit;
97
+ min-height: 0;
72
98
  overflow-x: hidden;
73
99
  overflow-y: auto;
74
100
  overscroll-behavior: contain;
75
101
  }
76
102
 
103
+ .admin-navigation-scroll-area > * {
104
+ flex: 0 0 auto;
105
+ }
106
+
77
107
  .admin-navigation-scroll-area .menubar,
78
108
  .admin-navigation-scroll-area .menubar a,
79
109
  .admin-navigation-scroll-area .menubar__group-label,
@@ -108,12 +138,15 @@
108
138
  }
109
139
 
110
140
  .admin-navigation-scroll-area .button_to {
141
+ flex: 0 0 auto;
111
142
  margin: 0;
112
143
  }
113
144
 
145
+ .admin-navigation-scroll-area .loginas,
114
146
  .admin-navigation-scroll-area .btn_public,
115
147
  .admin-navigation-scroll-area .btn_logout {
116
148
  box-sizing: border-box;
149
+ flex: 0 0 auto;
117
150
  margin-left: 0;
118
151
  margin-right: 0;
119
152
  min-width: 0;