@keenaioc/data-view 0.0.0-poc.1 → 0.2.0-alpha.11

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 (129) hide show
  1. package/CHANGELOG.md +138 -0
  2. package/DATA-PRIVACY.md +20 -0
  3. package/INTEGRATION.md +258 -0
  4. package/KNOWN-LIMITATIONS.md +63 -0
  5. package/LICENSE +41 -0
  6. package/README.md +73 -5
  7. package/dist/column-actions.d.ts +47 -0
  8. package/dist/column-actions.d.ts.map +1 -0
  9. package/dist/column-actions.js +92 -0
  10. package/dist/column-actions.js.map +1 -0
  11. package/dist/column-menu.d.ts +25 -0
  12. package/dist/column-menu.d.ts.map +1 -0
  13. package/dist/column-menu.js +64 -0
  14. package/dist/column-menu.js.map +1 -0
  15. package/dist/contracts.d.ts +33 -0
  16. package/dist/contracts.d.ts.map +1 -0
  17. package/dist/contracts.js +84 -0
  18. package/dist/contracts.js.map +1 -0
  19. package/dist/data-view.d.ts +3 -0
  20. package/dist/data-view.d.ts.map +1 -0
  21. package/dist/data-view.js +883 -0
  22. package/dist/data-view.js.map +1 -0
  23. package/dist/engine.d.ts +35 -0
  24. package/dist/engine.d.ts.map +1 -0
  25. package/dist/engine.js +315 -0
  26. package/dist/engine.js.map +1 -0
  27. package/dist/field-order.d.ts +8 -0
  28. package/dist/field-order.d.ts.map +1 -0
  29. package/dist/field-order.js +28 -0
  30. package/dist/field-order.js.map +1 -0
  31. package/dist/gantt-bar.d.ts +17 -0
  32. package/dist/gantt-bar.d.ts.map +1 -0
  33. package/dist/gantt-bar.js +142 -0
  34. package/dist/gantt-bar.js.map +1 -0
  35. package/dist/gantt-dependencies.d.ts +27 -0
  36. package/dist/gantt-dependencies.d.ts.map +1 -0
  37. package/dist/gantt-dependencies.js +218 -0
  38. package/dist/gantt-dependencies.js.map +1 -0
  39. package/dist/gantt-dependency-ui.d.ts +37 -0
  40. package/dist/gantt-dependency-ui.d.ts.map +1 -0
  41. package/dist/gantt-dependency-ui.js +79 -0
  42. package/dist/gantt-dependency-ui.js.map +1 -0
  43. package/dist/gantt-grid.d.ts +27 -0
  44. package/dist/gantt-grid.d.ts.map +1 -0
  45. package/dist/gantt-grid.js +72 -0
  46. package/dist/gantt-grid.js.map +1 -0
  47. package/dist/gantt-operations.d.ts +14 -0
  48. package/dist/gantt-operations.d.ts.map +1 -0
  49. package/dist/gantt-operations.js +103 -0
  50. package/dist/gantt-operations.js.map +1 -0
  51. package/dist/group-order.d.ts +8 -0
  52. package/dist/group-order.d.ts.map +1 -0
  53. package/dist/group-order.js +24 -0
  54. package/dist/group-order.js.map +1 -0
  55. package/dist/group-settings.d.ts +17 -0
  56. package/dist/group-settings.d.ts.map +1 -0
  57. package/dist/group-settings.js +44 -0
  58. package/dist/group-settings.js.map +1 -0
  59. package/dist/index.d.ts +17 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +17 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/operations.d.ts +11 -0
  64. package/dist/operations.d.ts.map +1 -0
  65. package/dist/operations.js +117 -0
  66. package/dist/operations.js.map +1 -0
  67. package/dist/registry.d.ts +17 -0
  68. package/dist/registry.d.ts.map +1 -0
  69. package/dist/registry.js +482 -0
  70. package/dist/registry.js.map +1 -0
  71. package/dist/remote-data.d.ts +19 -0
  72. package/dist/remote-data.d.ts.map +1 -0
  73. package/dist/remote-data.js +67 -0
  74. package/dist/remote-data.js.map +1 -0
  75. package/dist/row-move.d.ts +7 -0
  76. package/dist/row-move.d.ts.map +1 -0
  77. package/dist/row-move.js +27 -0
  78. package/dist/row-move.js.map +1 -0
  79. package/dist/schedule-view.d.ts +27 -0
  80. package/dist/schedule-view.d.ts.map +1 -0
  81. package/dist/schedule-view.js +122 -0
  82. package/dist/schedule-view.js.map +1 -0
  83. package/dist/schedule.d.ts +28 -0
  84. package/dist/schedule.d.ts.map +1 -0
  85. package/dist/schedule.js +97 -0
  86. package/dist/schedule.js.map +1 -0
  87. package/dist/style.css +1028 -0
  88. package/dist/timeline.d.ts +25 -0
  89. package/dist/timeline.d.ts.map +1 -0
  90. package/dist/timeline.js +58 -0
  91. package/dist/timeline.js.map +1 -0
  92. package/dist/toolbar.d.ts +10 -0
  93. package/dist/toolbar.d.ts.map +1 -0
  94. package/dist/toolbar.js +31 -0
  95. package/dist/toolbar.js.map +1 -0
  96. package/dist/types.d.ts +474 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +22 -0
  99. package/dist/types.js.map +1 -0
  100. package/dist/use-remote-data.d.ts +18 -0
  101. package/dist/use-remote-data.d.ts.map +1 -0
  102. package/dist/use-remote-data.js +12 -0
  103. package/dist/use-remote-data.js.map +1 -0
  104. package/dist/use-row-move.d.ts +12 -0
  105. package/dist/use-row-move.d.ts.map +1 -0
  106. package/dist/use-row-move.js +151 -0
  107. package/dist/use-row-move.js.map +1 -0
  108. package/dist/v2-panels.d.ts +37 -0
  109. package/dist/v2-panels.d.ts.map +1 -0
  110. package/dist/v2-panels.js +118 -0
  111. package/dist/v2-panels.js.map +1 -0
  112. package/dist/view-state.d.ts +30 -0
  113. package/dist/view-state.d.ts.map +1 -0
  114. package/dist/view-state.js +94 -0
  115. package/dist/view-state.js.map +1 -0
  116. package/dist/view-workspace.d.ts +3 -0
  117. package/dist/view-workspace.d.ts.map +1 -0
  118. package/dist/view-workspace.js +95 -0
  119. package/dist/view-workspace.js.map +1 -0
  120. package/dist/virtual-list.d.ts +12 -0
  121. package/dist/virtual-list.d.ts.map +1 -0
  122. package/dist/virtual-list.js +46 -0
  123. package/dist/virtual-list.js.map +1 -0
  124. package/package.json +19 -16
  125. package/index.d.ts +0 -2
  126. package/index.js +0 -5
  127. package/react.d.ts +0 -2
  128. package/react.js +0 -8
  129. package/style.css +0 -1
package/dist/style.css ADDED
@@ -0,0 +1,1028 @@
1
+ .hy-dv,
2
+ .hy-dv * {
3
+ box-sizing: border-box;
4
+ }
5
+
6
+ .hy-dv {
7
+ container-type: inline-size;
8
+ --hy-ink: #26322b;
9
+ --hy-muted: #6d776f;
10
+ --hy-line: #d6d8d2;
11
+ --hy-line-soft: #e7e8e3;
12
+ --hy-paper: #fffefa;
13
+ --hy-panel: #f6f5ef;
14
+ --hy-accent: #315d4b;
15
+ --hy-accent-soft: #e1eee7;
16
+ color: var(--hy-ink);
17
+ border: 1px solid var(--hy-line);
18
+ background: var(--hy-paper);
19
+ font-family: Arial, "Noto Sans TC", sans-serif;
20
+ font-size: 0.875rem;
21
+ min-width: 0;
22
+ }
23
+
24
+ /* V2 extends the existing workspace visual language. */
25
+ .hy-dv-view-tabs, .hy-dv-schedule-nav, .hy-dv-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 9px 12px; }
26
+ .hy-dv-view-tabs { border-bottom: 1px solid var(--hy-line); background: #fff; }
27
+ .hy-dv-view-tabs button, .hy-dv-schedule button, .hy-dv-dialog button, .hy-dv-detail-button { font: inherit; color: var(--hy-ink); border: 1px solid #bdc8c0; border-radius: 4px; padding: 7px 11px; background: #fff; cursor: pointer; min-height: 34px; }
28
+ .hy-dv-view-tabs button[aria-pressed="true"] { background: var(--hy-accent); color: #fff; border-color: var(--hy-accent); }
29
+ .hy-dv-operation { display: flex; align-items: center; gap: 10px; padding: 8px 12px; background: #edf5ee; overflow-wrap: anywhere; }
30
+ .hy-dv-operation.is-failed, .hy-dv-operation.is-conflict, .hy-dv-confirm { background: #fff2e5; color: #863e19; }
31
+ .hy-dv-form { display: grid; gap: 12px; }
32
+ .hy-dv-form label { display: grid; gap: 5px; font-size: .875rem; }
33
+ .hy-dv-form fieldset { min-width: 0; display: grid; gap: 10px; border: 1px solid var(--hy-line); border-radius: 4px; padding: 12px; }
34
+ .hy-dv-form legend { font-weight: 700; padding: 0 5px; }
35
+ .hy-dv-form h4 { margin: 12px 0 0; }
36
+ .hy-dv-form input:not([type="checkbox"]), .hy-dv-form select, .hy-dv-form textarea, .hy-dv-schedule input, .hy-dv-column-list select { min-width: 0; max-width: 100%; padding: 7px; border: 1px solid #b9c5bd; border-radius: 4px; font: inherit; background: #fff; color: var(--hy-ink); }
37
+ .hy-dv-form input[type="color"] { width: 100px; height: 40px; padding: 2px; }
38
+ .hy-dv-form p { line-height: 1.6; margin: 0; }
39
+ .hy-dv-form .hy-dv-actions { padding: 0; }
40
+ .hy-dv-dialog { color: var(--hy-ink); background: var(--hy-paper); width: min(620px, calc(100vw - 24px)); max-height: 85vh; border: 1px solid #a9baae; border-radius: 8px; box-shadow: 0 20px 60px #16332540; padding: 18px; overflow: auto; }
41
+ .hy-dv-dialog::backdrop { background: #17291f66; }
42
+ .hy-dv-dialog > header { display: flex; justify-content: space-between; align-items: center; gap: 15px; border-bottom: 1px solid var(--hy-line); margin-bottom: 16px; padding-bottom: 8px; }
43
+ .hy-dv-dialog h3 { font-size: 1.125rem; margin: 0; }
44
+ .hy-dv-dialog .hy-dv-danger { color: #9b3025; border-color: #d7a99f; }
45
+ .hy-dv-dialog .hy-dv-primary { background: var(--hy-accent); color: #fff; border-color: var(--hy-accent); }
46
+ .hy-dv-dialog button:disabled { cursor: default; opacity: .5; }
47
+ .hy-dv-detail { display: grid; gap: 10px; }
48
+ .hy-dv-detail > label { display: grid; grid-template-columns: 110px minmax(0, 1fr); align-items: start; gap: 10px; padding-block: 5px; border-bottom: 1px solid var(--hy-line-soft); }
49
+ .hy-dv-detail > label > span { padding-top: 8px; color: var(--hy-muted); }
50
+ .hy-dv-review-list { display: grid; gap: 8px; max-height: 300px; overflow: auto; }
51
+ .hy-dv-review-list > div { display: grid; gap: 3px; padding: 8px; background: #f0f3ef; overflow-wrap: anywhere; }
52
+ .hy-dv-review-list span { white-space: pre-wrap; }
53
+ .hy-dv-cell-content { height: calc(var(--hy-row-height) - 1px); overflow: hidden; display: flex; align-items: center; }
54
+ .hy-dv-cell-content:has(.hy-dv-editor-wrap) { height: auto; min-height: calc(var(--hy-row-height) - 1px); overflow: visible; }
55
+ .hy-dv-cell-content > * { width: 100%; }
56
+ .hy-dv-cell-content .hy-dv-cell-button { min-height: 0; height: 100%; }
57
+ .hy-dv-table td.is-range { box-shadow: inset 0 0 0 2px #39755b; }
58
+ .hy-dv-table td:focus { outline: 2px solid #235c42; outline-offset: -2px; }
59
+ .hy-dv-table-scroll.is-virtual { height: 560px; max-height: 65vh; overflow-anchor: none; }
60
+ .hy-dv-keyboard-help { margin: 0; padding: 7px 12px; font-size: .75rem; line-height: 1.5; color: var(--hy-muted); background: #f4f5f1; }
61
+ .hy-dv-detail-button { margin-top: 8px; width: 100%; }
62
+ .hy-dv-schedule-nav { border-bottom: 1px solid var(--hy-line-soft); }
63
+ .hy-dv-schedule-nav label { display: flex; align-items: center; gap: 8px; }
64
+ .hy-dv-schedule-nav small { color: var(--hy-muted); font-size: .75rem; }
65
+ .hy-dv-schedule-wide { display: block; }
66
+ /* Responsive visibility must outrank layout classes such as .hy-dv-agenda. */
67
+ .hy-dv .hy-dv-schedule-narrow { display: none; }
68
+ .hy-dv-gantt-scroll { overflow-x: auto; max-height: 65vh; }
69
+ .hy-dv-gantt-header, .hy-dv-gantt-row { display: grid; grid-template-columns: 240px minmax(0, 1fr); }
70
+ .hy-dv-gantt-header { position: sticky; top: 0; z-index: 2; background: #edf1eb; }
71
+ .hy-dv-gantt-header > strong { padding: 10px; }
72
+ .hy-dv-gantt-header > div { display: flex; padding-block: 10px; }
73
+ .hy-dv-gantt-header span { flex: 1; text-align: center; font-size: .75rem; }
74
+ .hy-dv-gantt-row { min-height: 46px; border-bottom: 1px solid var(--hy-line-soft); }
75
+ .hy-dv-gantt-row > button { border: 0; border-radius: 0; border-right: 1px solid var(--hy-line); text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
76
+ .hy-dv-gantt-track { position: relative; background-image: repeating-linear-gradient(90deg, transparent, transparent calc(100% / var(--hy-month-days) - 1px), #ecede8 calc(100% / var(--hy-month-days))); }
77
+ .hy-dv-gantt-track { overflow: hidden; }
78
+ .hy-dv-gantt-track .hy-dv-gantt-bar { position: absolute; top: 8px; height: 30px; border-radius: 5px; font-size: .8125rem; user-select: none; }
79
+ .hy-dv-gantt-bar .hy-dv-gantt-move { position: relative; display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%; min-height: 0; height: 100%; border: 0; border-radius: inherit; padding: 2px 7px; background: transparent; color: inherit; overflow: hidden; touch-action: pan-y; }
80
+ .hy-dv-gantt-bar.is-editable .hy-dv-gantt-move { cursor: move; }
81
+ .hy-dv-gantt-bar.is-preview { outline: 2px solid #204eaa; outline-offset: 1px; z-index: 1; }
82
+ .hy-dv-gantt-bar.is-saving { opacity: .65; }
83
+ .hy-dv-gantt-bar.is-saving .hy-dv-gantt-move { cursor: progress; }
84
+ .hy-dv-gantt-progress { position: absolute; inset: 0 auto 0 0; background: #0000001c; pointer-events: none; }
85
+ .hy-dv-gantt-title { position: relative; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
86
+ .hy-dv-gantt-duration { position: relative; flex-shrink: 0; white-space: nowrap; font-size: .875rem; }
87
+ .hy-dv-gantt-outside-title { position: absolute; left: calc(100% + 6px); top: 5px; color: var(--hy-ink); white-space: nowrap; pointer-events: none; max-width: 260px; overflow: hidden; text-overflow: ellipsis; }
88
+ .hy-dv-gantt-bar .hy-dv-gantt-handle { position: absolute; top: 0; bottom: 0; width: 7px; min-height: 0; padding: 0; border: 0; background: #ffffff66; cursor: ew-resize; touch-action: none; opacity: 0; }
89
+ .hy-dv-gantt-handle.is-start { left: 0; border-radius: 5px 0 0 5px; }
90
+ .hy-dv-gantt-handle.is-end { right: 0; border-radius: 0 5px 5px 0; }
91
+ .hy-dv-gantt-bar:hover .hy-dv-gantt-handle, .hy-dv-gantt-bar:focus-within .hy-dv-gantt-handle { opacity: 1; }
92
+ .hy-dv-gantt-handle[aria-disabled="true"] { cursor: progress; }
93
+ .hy-dv-gantt-move:focus-visible, .hy-dv-gantt-handle:focus-visible { outline: 2px solid #162d52; outline-offset: -2px; }
94
+ .hy-dv-gantt-help { display: grid; gap: 4px; padding: 8px 12px; line-height: 1.5; color: var(--hy-muted); border-bottom: 1px solid var(--hy-line-soft); font-size: .8125rem; }
95
+ .hy-dv-gantt-help [role="status"]:not(:empty) { color: var(--hy-ink); }
96
+ .hy-dv-form .hy-dv-inline-check { display: flex; flex-direction: row; align-items: center; justify-content: flex-start; min-width: 0; gap: 8px; text-align: left; }
97
+ .hy-dv-inline-check input[type="checkbox"] { flex: 0 0 17px; width: 17px; height: 17px; margin: 0; accent-color: var(--hy-accent); }
98
+ .hy-dv-inline-check > span { min-width: 0; white-space: normal; overflow-wrap: anywhere; }
99
+ .hy-dv-color-swatches { display: flex; gap: 8px; flex-wrap: wrap; }
100
+ .hy-dv-color-swatches button { width: 30px; height: 30px; min-height: 30px; padding: 0; border: 2px solid transparent; border-radius: 6px; color: #fff; text-shadow: 0 1px 2px #000; cursor: pointer; }
101
+ .hy-dv-color-swatches button[aria-pressed="true"] { outline: 2px solid var(--hy-accent); outline-offset: 2px; }
102
+ .hy-dv-gantt-group { background: #f0f3ec; padding: 7px 12px; font-weight: 700; }
103
+ .hy-dv-calendar { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); }
104
+ .hy-dv-weekday { text-align: center; padding: 10px; background: #edf1eb; }
105
+ .hy-dv-calendar-day { min-height: 148px; padding: 5px; border-right: 1px solid var(--hy-line-soft); border-bottom: 1px solid var(--hy-line-soft); overflow: hidden; }
106
+ .hy-dv-calendar-day.is-outside { background: #f3f4f0; color: #8b958c; }
107
+ .hy-dv-calendar-day .hy-dv-day-number { border: 0; padding: 2px 6px; min-height: 28px; background: transparent; }
108
+ .hy-dv-calendar-day .hy-dv-event { display: block; margin-top: 3px; padding: 4px 6px; min-height: 27px; width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: left; border: 0; background: #dfebe2; }
109
+ .hy-dv-calendar-day .hy-dv-more { background: transparent; border: 0; color: #315d4b; padding: 2px 5px; font-size: .75rem; }
110
+ .hy-dv-agenda { display: grid; gap: 8px; padding: 12px; }
111
+ .hy-dv-agenda > button { display: grid; gap: 6px; text-align: left; border-left: 4px solid #96b39f; }
112
+ .hy-dv-agenda span { color: var(--hy-muted); font-size: .8125rem; }
113
+ @container hy-data-view (max-width: 767px) {
114
+ .hy-dv .hy-dv-schedule-wide { display: none; }
115
+ .hy-dv .hy-dv-schedule-narrow { display: block; }
116
+ .hy-dv .hy-dv-schedule-narrow.hy-dv-agenda { display: grid; }
117
+ .hy-dv-toolbar { flex-wrap: wrap; overflow: visible; }
118
+ .hy-dv-search { width: 100%; grid-template-columns: 18px minmax(0, 1fr); }
119
+ .hy-dv-keyboard-help { display: none; }
120
+ .hy-dv-detail > label { grid-template-columns: 85px minmax(0, 1fr); }
121
+ }
122
+
123
+ .hy-dv button,
124
+ .hy-dv input,
125
+ .hy-dv select,
126
+ .hy-dv textarea {
127
+ font: inherit;
128
+ }
129
+
130
+ .hy-dv-titlebar {
131
+ min-height: 42px;
132
+ display: flex;
133
+ align-items: center;
134
+ justify-content: space-between;
135
+ gap: 12px;
136
+ padding: 7px 12px;
137
+ background: var(--hy-panel);
138
+ border-bottom: 1px solid var(--hy-line);
139
+ }
140
+
141
+ .hy-dv-titlebar > div,
142
+ .hy-dv-title-status {
143
+ display: flex;
144
+ align-items: baseline;
145
+ gap: 10px;
146
+ }
147
+
148
+ .hy-dv-titlebar h2 {
149
+ margin: 0;
150
+ font-size: 1rem;
151
+ font-weight: 700;
152
+ }
153
+
154
+ .hy-dv-titlebar span {
155
+ color: var(--hy-muted);
156
+ font-size: 0.75rem;
157
+ }
158
+
159
+ .hy-dv-toolbar {
160
+ position: relative;
161
+ display: flex;
162
+ align-items: center;
163
+ gap: 6px;
164
+ overflow-x: auto;
165
+ padding: 7px 9px;
166
+ border-bottom: 1px solid var(--hy-line);
167
+ background: #fff;
168
+ scrollbar-width: thin;
169
+ }
170
+
171
+ .hy-dv-toolbar > button,
172
+ .hy-dv-pagination button,
173
+ .hy-dv-panel button {
174
+ min-height: 32px;
175
+ border: 1px solid #c8ccc5;
176
+ border-radius: 4px;
177
+ background: #fff;
178
+ color: var(--hy-ink);
179
+ padding: 5px 10px;
180
+ white-space: nowrap;
181
+ cursor: pointer;
182
+ }
183
+
184
+ .hy-dv-toolbar > button:hover,
185
+ .hy-dv-pagination button:hover:not(:disabled),
186
+ .hy-dv-panel button:hover:not(:disabled),
187
+ .hy-dv-toolbar > button.is-active {
188
+ border-color: #789486;
189
+ background: var(--hy-accent-soft);
190
+ }
191
+
192
+ .hy-dv button:focus-visible,
193
+ .hy-dv input:focus-visible,
194
+ .hy-dv select:focus-visible,
195
+ .hy-dv textarea:focus-visible {
196
+ outline: 2px solid #2d6a52;
197
+ outline-offset: 1px;
198
+ }
199
+
200
+ .hy-dv button:disabled {
201
+ cursor: default;
202
+ opacity: 0.5;
203
+ }
204
+
205
+ .hy-dv-search {
206
+ display: grid;
207
+ grid-template-columns: 18px minmax(180px, 250px);
208
+ align-items: center;
209
+ height: 32px;
210
+ border: 1px solid #c8ccc5;
211
+ border-radius: 4px;
212
+ background: #fff;
213
+ padding: 0 8px;
214
+ flex: 0 0 auto;
215
+ }
216
+
217
+ .hy-dv-search span {
218
+ color: var(--hy-muted);
219
+ font-size: 1rem;
220
+ }
221
+
222
+ .hy-dv-search input {
223
+ min-width: 0;
224
+ border: 0;
225
+ outline: 0;
226
+ padding: 4px;
227
+ color: var(--hy-ink);
228
+ background: transparent;
229
+ }
230
+
231
+ .hy-dv-panel-wrap {
232
+ position: relative;
233
+ z-index: 50;
234
+ }
235
+
236
+ .hy-dv-panel {
237
+ position: absolute;
238
+ top: 0;
239
+ right: 0;
240
+ width: min(720px, calc(100vw - 24px));
241
+ max-height: min(70vh, 620px);
242
+ overflow: auto;
243
+ border: 1px solid #bec3bb;
244
+ border-radius: 5px;
245
+ background: #faf9f5;
246
+ box-shadow: 0 12px 32px rgb(35 46 39 / 18%);
247
+ padding: 12px;
248
+ }
249
+
250
+ .hy-dv-panel > header {
251
+ display: flex;
252
+ align-items: center;
253
+ justify-content: space-between;
254
+ gap: 16px;
255
+ border-bottom: 1px solid var(--hy-line);
256
+ padding-bottom: 8px;
257
+ }
258
+
259
+ .hy-dv-panel h3,
260
+ .hy-dv-panel p {
261
+ margin: 0;
262
+ }
263
+
264
+ .hy-dv-panel h3 {
265
+ font-size: 1rem;
266
+ }
267
+
268
+ .hy-dv-panel p {
269
+ color: var(--hy-muted);
270
+ font-size: 0.8125rem;
271
+ padding: 8px 0;
272
+ }
273
+
274
+ .hy-dv-rules,
275
+ .hy-dv-column-list {
276
+ display: grid;
277
+ gap: 7px;
278
+ margin-top: 8px;
279
+ }
280
+
281
+ .hy-dv-rule {
282
+ display: grid;
283
+ grid-template-columns: 28px minmax(150px, 1fr) minmax(110px, 0.7fr) auto;
284
+ align-items: center;
285
+ gap: 7px;
286
+ border: 1px solid var(--hy-line-soft);
287
+ border-radius: 4px;
288
+ background: #fff;
289
+ padding: 7px;
290
+ }
291
+
292
+ .hy-dv-rule select,
293
+ .hy-dv-rule input,
294
+ .hy-dv-conjunction select,
295
+ .hy-dv-column-list input[type="number"],
296
+ .hy-dv-pagination select {
297
+ min-width: 0;
298
+ min-height: 32px;
299
+ border: 1px solid #c8ccc5;
300
+ border-radius: 4px;
301
+ background: #fff;
302
+ color: var(--hy-ink);
303
+ padding: 4px 7px;
304
+ }
305
+
306
+ .hy-dv-filter-rule {
307
+ grid-template-columns: minmax(120px, 1fr) minmax(110px, 0.8fr) minmax(120px, 1fr) auto;
308
+ }
309
+
310
+ .hy-dv-conjunction {
311
+ display: flex;
312
+ align-items: center;
313
+ gap: 8px;
314
+ padding-top: 10px;
315
+ }
316
+
317
+ .hy-dv-add {
318
+ justify-self: start;
319
+ }
320
+
321
+ .hy-dv-no-value {
322
+ color: var(--hy-muted);
323
+ font-size: 0.75rem;
324
+ }
325
+
326
+ .hy-dv-column-list > div {
327
+ display: grid;
328
+ grid-template-columns: 28px minmax(150px, 1fr) 110px 80px;
329
+ align-items: center;
330
+ gap: 8px;
331
+ border: 1px solid var(--hy-line-soft);
332
+ border-radius: 4px;
333
+ background: #fff;
334
+ padding: 7px;
335
+ }
336
+
337
+ .hy-dv-column-list > div.is-dragging {
338
+ opacity: 0.45;
339
+ }
340
+
341
+ .hy-dv-column-list label {
342
+ display: flex;
343
+ align-items: center;
344
+ gap: 7px;
345
+ min-width: 0;
346
+ }
347
+
348
+ .hy-dv-drag {
349
+ color: var(--hy-muted);
350
+ cursor: grab;
351
+ font-size: 1rem;
352
+ }
353
+
354
+ .hy-dv-pin {
355
+ color: var(--hy-muted);
356
+ font-size: 0.75rem;
357
+ }
358
+
359
+ .hy-dv-table-scroll {
360
+ max-width: 100%;
361
+ overflow: auto;
362
+ overscroll-behavior-inline: contain;
363
+ }
364
+
365
+ .hy-dv-table {
366
+ table-layout: fixed;
367
+ border-collapse: separate;
368
+ border-spacing: 0;
369
+ min-width: 100%;
370
+ }
371
+
372
+ .hy-dv-table thead {
373
+ position: sticky;
374
+ top: 0;
375
+ z-index: 20;
376
+ }
377
+
378
+ .hy-dv-table th,
379
+ .hy-dv-table td {
380
+ position: relative;
381
+ height: 38px;
382
+ overflow: hidden;
383
+ border-right: 1px solid var(--hy-line-soft);
384
+ border-bottom: 1px solid var(--hy-line-soft);
385
+ background: #fff;
386
+ padding: 0;
387
+ text-align: left;
388
+ vertical-align: middle;
389
+ }
390
+
391
+ .hy-dv-table th {
392
+ height: 36px;
393
+ background: #eef0eb;
394
+ color: #455149;
395
+ font-size: 0.8125rem;
396
+ font-weight: 700;
397
+ padding: 0 8px;
398
+ user-select: none;
399
+ }
400
+
401
+ .hy-dv-table th small {
402
+ margin-left: 5px;
403
+ color: var(--hy-accent);
404
+ font-size: 0.6875rem;
405
+ }
406
+
407
+ .hy-dv-table .is-pinned {
408
+ position: sticky;
409
+ z-index: 12;
410
+ box-shadow: 2px 0 0 var(--hy-line);
411
+ }
412
+
413
+ .hy-dv-table thead .is-pinned {
414
+ z-index: 24;
415
+ background: #e7ebe5;
416
+ }
417
+
418
+ .hy-dv-table tbody tr:hover td,
419
+ .hy-dv-table tbody tr:hover td.is-pinned {
420
+ background: #f8faf7;
421
+ }
422
+
423
+ .hy-dv-table tbody tr.is-selected td,
424
+ .hy-dv-table tbody tr.is-selected td.is-pinned {
425
+ background: #e8f2ec;
426
+ }
427
+
428
+ .hy-dv-selection {
429
+ width: 44px;
430
+ padding: 0 !important;
431
+ text-align: center !important;
432
+ }
433
+
434
+ .hy-dv-selection input,
435
+ .hy-dv-card-select input,
436
+ .hy-dv-column-list input[type="checkbox"] {
437
+ width: 17px;
438
+ height: 17px;
439
+ accent-color: var(--hy-accent);
440
+ }
441
+
442
+ .hy-dv-resize {
443
+ position: absolute;
444
+ top: 0;
445
+ right: -3px;
446
+ width: 7px;
447
+ height: 100%;
448
+ cursor: col-resize;
449
+ }
450
+
451
+ .hy-dv-resize:hover {
452
+ background: #6c8a7a;
453
+ }
454
+
455
+ .hy-dv-cell-button {
456
+ width: 100%;
457
+ min-height: 37px;
458
+ display: flex;
459
+ align-items: center;
460
+ justify-content: space-between;
461
+ gap: 6px;
462
+ border: 0;
463
+ background: transparent;
464
+ color: var(--hy-ink);
465
+ padding: 4px 7px;
466
+ text-align: left;
467
+ cursor: default;
468
+ }
469
+
470
+ .hy-dv-cell-button.is-editable {
471
+ cursor: text;
472
+ }
473
+
474
+ .hy-dv-cell-button.is-toggle.is-editable { cursor: pointer; }
475
+ .hy-dv-cell-button.is-toggle .hy-dv-cell-value { display: flex; align-items: center; }
476
+ .hy-dv-cell-button.is-toggle.is-editable:hover .hy-dv-checkbox { border-color: var(--hy-accent); box-shadow: 0 0 0 2px var(--hy-accent-soft); }
477
+ .hy-dv-cell-button.is-toggle:focus-visible { outline: 2px solid var(--hy-accent); outline-offset: -2px; }
478
+ .hy-dv-cell-button.is-toggle[aria-busy="true"] { cursor: progress; opacity: .6; }
479
+ .hy-dv-table .hy-dv-add-column { padding: 0; text-align: center; box-shadow: -1px 0 0 var(--hy-line); }
480
+ .hy-dv-add-column button { width: 100%; height: 100%; min-height: 36px; border: 0; padding: 0; background: transparent; color: var(--hy-muted); font: inherit; font-size: 1.4rem; cursor: pointer; }
481
+ .hy-dv-add-column button:hover, .hy-dv-add-column button:focus-visible { background: var(--hy-accent-soft); color: var(--hy-accent); }
482
+ .hy-dv-add-column button:disabled { cursor: progress; }
483
+
484
+ .hy-dv-cell-button.is-editable:hover {
485
+ box-shadow: inset 0 0 0 1px #87a294;
486
+ }
487
+
488
+ .hy-dv-cell-value {
489
+ min-width: 0;
490
+ max-width: 100%;
491
+ overflow: hidden;
492
+ text-overflow: ellipsis;
493
+ }
494
+
495
+ .hy-dv-editor-wrap {
496
+ min-height: 37px;
497
+ display: flex;
498
+ align-items: center;
499
+ padding: 2px;
500
+ }
501
+
502
+ .hy-dv-editor {
503
+ width: 100%;
504
+ min-width: 0;
505
+ min-height: 32px;
506
+ border: 1px solid #557c69;
507
+ border-radius: 3px;
508
+ background: #fff;
509
+ color: var(--hy-ink);
510
+ padding: 4px 6px;
511
+ }
512
+
513
+ .hy-dv-textarea {
514
+ min-height: 70px;
515
+ resize: vertical;
516
+ }
517
+
518
+ .hy-dv-multi-select {
519
+ min-height: 76px;
520
+ }
521
+
522
+ .hy-dv-check {
523
+ width: 18px;
524
+ height: 18px;
525
+ accent-color: var(--hy-accent);
526
+ }
527
+
528
+ .hy-dv-checkbox {
529
+ display: inline-grid;
530
+ place-items: center;
531
+ width: 18px;
532
+ height: 18px;
533
+ border: 1px solid #adb4ad;
534
+ border-radius: 3px;
535
+ background: #fff;
536
+ color: #fff;
537
+ font-weight: 800;
538
+ }
539
+
540
+ .hy-dv-checkbox.is-checked {
541
+ border-color: var(--hy-accent);
542
+ background: var(--hy-accent);
543
+ }
544
+
545
+ .hy-dv-prewrap {
546
+ white-space: pre-wrap;
547
+ }
548
+
549
+ .hy-dv-empty,
550
+ .hy-dv-no-access {
551
+ color: #899188;
552
+ }
553
+
554
+ .hy-dv-tags,
555
+ .hy-dv-attachments {
556
+ display: inline-flex;
557
+ align-items: center;
558
+ flex-wrap: wrap;
559
+ gap: 4px;
560
+ }
561
+
562
+ .hy-dv-tag,
563
+ .hy-dv-relation,
564
+ .hy-dv-person {
565
+ display: inline-flex;
566
+ align-items: center;
567
+ gap: 4px;
568
+ max-width: 100%;
569
+ border-radius: 999px;
570
+ background: #e6ebe7;
571
+ color: #31413a;
572
+ padding: 2px 7px;
573
+ font-size: 0.75rem;
574
+ line-height: 1.35;
575
+ }
576
+
577
+ .hy-dv-person {
578
+ background: #eef1f6;
579
+ }
580
+
581
+ .hy-dv-relation {
582
+ border-radius: 4px;
583
+ background: #f2eee5;
584
+ }
585
+
586
+ .hy-dv-avatar {
587
+ display: inline-grid;
588
+ place-items: center;
589
+ width: 17px;
590
+ height: 17px;
591
+ border-radius: 50%;
592
+ background: #65796e;
593
+ color: #fff;
594
+ font-size: 0.625rem;
595
+ }
596
+
597
+ .hy-dv-attachments a {
598
+ color: #235d91;
599
+ text-decoration: underline;
600
+ text-underline-offset: 2px;
601
+ }
602
+
603
+ .hy-dv-upload {
604
+ position: relative;
605
+ display: inline-flex;
606
+ min-height: 32px;
607
+ align-items: center;
608
+ border: 1px solid #557c69;
609
+ border-radius: 4px;
610
+ padding: 4px 9px;
611
+ cursor: pointer;
612
+ }
613
+
614
+ .hy-dv-upload input {
615
+ position: absolute;
616
+ width: 1px;
617
+ height: 1px;
618
+ opacity: 0;
619
+ }
620
+
621
+ .hy-dv-save {
622
+ flex: 0 0 auto;
623
+ color: var(--hy-muted);
624
+ font-size: 0.6875rem;
625
+ white-space: nowrap;
626
+ }
627
+
628
+ .hy-dv-save.is-saved { color: #2d7351; }
629
+ .hy-dv-save.is-failed,
630
+ .hy-dv-save.is-conflict { color: #b23730; }
631
+ .hy-dv-save.is-saving { color: #786624; }
632
+
633
+ .hy-dv-group td {
634
+ height: 34px;
635
+ background: #f0f1ed !important;
636
+ }
637
+
638
+ .hy-dv-group.depth-1 td { background: #f6f5f0 !important; }
639
+ .hy-dv-group.depth-2 td { background: #fbfaf7 !important; }
640
+
641
+ .hy-dv-group button {
642
+ width: 100%;
643
+ min-height: 33px;
644
+ display: flex;
645
+ align-items: center;
646
+ gap: 8px;
647
+ border: 0;
648
+ background: transparent;
649
+ color: #3f4c44;
650
+ padding: 4px 10px;
651
+ text-align: left;
652
+ cursor: pointer;
653
+ }
654
+
655
+ .hy-dv-group.depth-1 button { padding-left: 26px; }
656
+ .hy-dv-group.depth-2 button { padding-left: 42px; }
657
+ .hy-dv-group button span { color: var(--hy-muted); font-size: 0.75rem; }
658
+
659
+ .hy-dv-mobile { display: none; }
660
+
661
+ .hy-dv-pagination {
662
+ min-height: 44px;
663
+ display: flex;
664
+ align-items: center;
665
+ justify-content: flex-end;
666
+ gap: 8px;
667
+ border-top: 1px solid var(--hy-line);
668
+ background: var(--hy-panel);
669
+ padding: 6px 10px;
670
+ color: var(--hy-muted);
671
+ font-size: 0.75rem;
672
+ }
673
+
674
+ .hy-dv-pagination label {
675
+ display: flex;
676
+ align-items: center;
677
+ gap: 5px;
678
+ }
679
+
680
+ .hy-dv-state {
681
+ display: grid;
682
+ place-items: center;
683
+ min-height: 180px;
684
+ border: 1px dashed var(--hy-line);
685
+ background: #fbfbf8;
686
+ color: var(--hy-ink);
687
+ padding: 24px;
688
+ text-align: center;
689
+ }
690
+
691
+ .hy-dv-state p {
692
+ margin: 6px 0 0;
693
+ color: var(--hy-muted);
694
+ }
695
+
696
+ .hy-dv-state.is-warning { background: #fff9e9; }
697
+ .hy-dv-state.is-error { background: #fff3f1; color: #8b2924; }
698
+
699
+ .hy-dv-loading {
700
+ display: grid;
701
+ grid-template-columns: repeat(4, 1fr);
702
+ gap: 8px;
703
+ min-height: 180px;
704
+ padding: 24px;
705
+ }
706
+
707
+ .hy-dv-loading span {
708
+ height: 120px;
709
+ border-radius: 5px;
710
+ background: linear-gradient(90deg, #eff0ec 25%, #f7f7f4 50%, #eff0ec 75%);
711
+ background-size: 200% 100%;
712
+ animation: hy-dv-loading 1.4s infinite linear;
713
+ }
714
+
715
+ @keyframes hy-dv-loading {
716
+ to { background-position: -200% 0; }
717
+ }
718
+
719
+ @media (max-width: 767px) {
720
+ .hy-dv { border-inline: 0; font-size: 0.9375rem; }
721
+ .hy-dv-titlebar { align-items: flex-start; }
722
+ .hy-dv-title-status { align-items: flex-end; flex-direction: column; gap: 3px; }
723
+ .hy-dv-search { grid-template-columns: 18px minmax(180px, 1fr); width: min(78vw, 290px); }
724
+ .hy-dv-desktop { display: none; }
725
+ .hy-dv-mobile { display: grid; gap: 10px; padding: 10px; background: #f1f0eb; }
726
+ .hy-dv-mobile-group { display: grid; gap: 8px; }
727
+ .hy-dv-mobile-group.depth-1,
728
+ .hy-dv-mobile-group.depth-2 { border-left: 2px solid #cbd0c9; padding-left: 8px; }
729
+ .hy-dv-mobile-group-title {
730
+ min-height: 38px;
731
+ display: flex;
732
+ align-items: center;
733
+ gap: 8px;
734
+ border: 1px solid var(--hy-line);
735
+ border-radius: 4px;
736
+ background: #f8f8f4;
737
+ color: var(--hy-ink);
738
+ padding: 6px 10px;
739
+ text-align: left;
740
+ }
741
+ .hy-dv-mobile-group-title span { color: var(--hy-muted); font-size: 0.75rem; }
742
+ .hy-dv-card {
743
+ border: 1px solid #d0d2cc;
744
+ border-radius: 6px;
745
+ background: #fff;
746
+ box-shadow: 0 1px 3px rgb(35 46 39 / 7%);
747
+ padding: 10px;
748
+ }
749
+ .hy-dv-card.is-selected { border-color: #6f9280; background: #f1f8f4; }
750
+ .hy-dv-card-select { display: flex; justify-content: flex-end; align-items: center; gap: 5px; color: var(--hy-muted); font-size: 0.75rem; }
751
+ .hy-dv-card dl { display: grid; grid-template-columns: 88px minmax(0, 1fr); gap: 0; margin: 0; }
752
+ .hy-dv-card dt,
753
+ .hy-dv-card dd { min-width: 0; margin: 0; border-bottom: 1px solid #ecece8; padding: 7px 3px; }
754
+ .hy-dv-card dt { color: var(--hy-muted); font-size: 0.75rem; }
755
+ .hy-dv-card dd { color: var(--hy-ink); }
756
+ .hy-dv-cell-button { min-height: 34px; padding: 1px 3px; }
757
+ .hy-dv-panel { position: fixed; inset: 0; width: 100%; max-height: none; border: 0; border-radius: 0; padding: 14px; }
758
+ .hy-dv-rule,
759
+ .hy-dv-filter-rule { grid-template-columns: 28px minmax(0, 1fr); }
760
+ .hy-dv-filter-rule > :nth-child(3),
761
+ .hy-dv-filter-rule > :nth-child(4),
762
+ .hy-dv-rule > :nth-child(3),
763
+ .hy-dv-rule > :nth-child(4) { grid-column: 2; }
764
+ .hy-dv-column-list > div { grid-template-columns: 28px minmax(0, 1fr) 76px; }
765
+ .hy-dv-column-list .hy-dv-pin { grid-column: 2; }
766
+ .hy-dv-pagination { justify-content: center; flex-wrap: wrap; }
767
+ }
768
+
769
+ @media (prefers-reduced-motion: reduce) {
770
+ .hy-dv-loading span { animation: none; }
771
+ }
772
+
773
+ .hy-dv-table tbody td { height: var(--hy-row-height, 52px); }
774
+ .hy-dv-column-list > div { grid-template-columns: 20px minmax(90px, 1fr) 105px 70px 146px; gap: 4px; }
775
+ .hy-dv-column-list > div > button { padding-inline: 4px; }
776
+
777
+
778
+ @container (max-width: 700px) {
779
+ .hy-dv-toolbar { flex-wrap: wrap; overflow: visible; }
780
+ .hy-dv .hy-dv-search { width: 100%; grid-template-columns: 18px minmax(0, 1fr); }
781
+ .hy-dv .hy-dv-column-list > div { grid-template-columns: 20px minmax(80px, 1fr) 80px; }
782
+ .hy-dv-panel { width: 100%; max-height: 75vh; }
783
+ }
784
+
785
+ /* FS dependencies share the existing Gantt rows; no independent business table. */
786
+ .hy-dv-gantt-body { position: relative; }
787
+ .hy-dv-gantt-body .hy-dv-gantt-row { height: 46px; box-sizing: border-box; }
788
+ .hy-dv-gantt-body .hy-dv-gantt-group { height: 32px; box-sizing: border-box; line-height: 18px; overflow: hidden; }
789
+ .hy-dv-dependency-lines { position: absolute; top: 0; left: 240px; width: calc(100% - 240px); overflow: visible; pointer-events: none; z-index: 1; }
790
+ .hy-dv-gantt-track .hy-dv-gantt-outside { position: absolute; top: 8px; min-height: 30px; font-size: .875rem; background: #f0f3f7; color: #38516a; }
791
+ .hy-dv-dependency-list { list-style: none; padding: 0; }
792
+ .hy-dv-dependency-list li { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--hy-line-soft); }
793
+ .hy-dv-dependency-list small { display: block; color: var(--hy-muted); }
794
+ .hy-dv-review-scroll { max-height: 55vh; overflow: auto; }
795
+ .hy-dv-reschedule-table { width: 100%; border-collapse: collapse; font-size: .875rem; }
796
+ .hy-dv-reschedule-table th, .hy-dv-reschedule-table td { padding: 10px; text-align: left; border-bottom: 1px solid var(--hy-line-soft); vertical-align: top; }
797
+ .hy-dv-reschedule-table td { min-width: 110px; }
798
+
799
+ /* Named view management and synchronized Gantt panes. */
800
+ .hy-dv-named-tabs { display: flex; flex-wrap: wrap; gap: 6px; padding: 10px; background: #f3f5f2; border: 1px solid #ccd5cd; }
801
+ .hy-dv-named-tabs button, .hy-dv-view-save button { font: inherit; min-height: 38px; padding: 6px 12px; border: 1px solid #bdc8c0; border-radius: 5px; background: #fff; color: #31413a; cursor: pointer; }
802
+ .hy-dv-named-tabs button[aria-pressed="true"] { background: #dcece2; border-color: #557c69; font-weight: 700; }
803
+ .hy-dv-named-tabs button:disabled { opacity: .5; cursor: default; }
804
+ .hy-dv-view-save { font-size: .8125rem; padding: 4px 10px; color: #52645a; }
805
+ .hy-dv-view-save[role="alert"] { color: #b23730; }
806
+ .hy-dv-gantt-split { display: grid; min-width: 0; max-width: 100%; }
807
+ .hy-dv-gantt-pane { overflow: auto; max-height: 560px; min-width: 0; overscroll-behavior: contain; scrollbar-gutter: stable; }
808
+ .hy-dv-gantt-left .hy-dv-table { min-width: 0; }
809
+ .hy-dv-gantt-left .hy-dv-table thead { height: 48px; }
810
+ .hy-dv-gantt-left .hy-dv-table th { height: 48px; box-sizing: border-box; }
811
+ .hy-dv-gantt-left .hy-dv-table td { height: var(--hy-row-height); box-sizing: border-box; }
812
+ .hy-dv-gantt-left .hy-dv-group button { height: calc(var(--hy-row-height) - 1px); min-height: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
813
+ .hy-dv-gantt-cell { height: calc(var(--hy-row-height) - 1px); display: flex; align-items: center; overflow: hidden; }
814
+ .hy-dv-gantt-cell .hy-dv-editor-wrap { width: 100%; }
815
+ .hy-dv-gantt-cell .hy-dv-cell-button { border: 0; border-radius: 0; min-height: 30px; padding: 4px 7px; }
816
+ .hy-dv-split-handle { background: #dbe2dc; cursor: col-resize; touch-action: none; border-inline: 1px solid #becbc1; }
817
+ .hy-dv-split-handle:hover, .hy-dv-split-handle:focus-visible { background: #739582; outline: 2px solid #355b46; }
818
+ .hy-dv-timeline-header { height: 48px; position: sticky; top: 0; z-index: 4; background: #eef0eb; border-bottom: 1px solid #cdd5ce; box-sizing: border-box; }
819
+ .hy-dv-timeline-header span { position: absolute; top: 16px; font-size: 11px; padding-left: 3px; white-space: nowrap; }
820
+ .hy-dv-timeline-body { position: relative; }
821
+ .hy-dv-timeline-body .hy-dv-gantt-track { border-bottom: 1px solid var(--hy-line-soft); box-sizing: border-box; }
822
+ .hy-dv-timeline-group { height: var(--hy-row-height); background: #f0f1ed; border-bottom: 1px solid var(--hy-line-soft); box-sizing: border-box; position: relative; }
823
+ .hy-dv-timeline-body .hy-dv-gantt-bar { top: calc((var(--hy-row-height) - 30px) / 2); }
824
+ .hy-dv-timeline-body .hy-dv-dependency-lines { left: 0; width: 100%; }
825
+ .hy-dv-time-background { position: absolute; inset: 0; pointer-events: none; }
826
+ .hy-dv-time-background i { position: absolute; top: 0; bottom: 0; background: #edf0f466; }
827
+ .hy-dv-today-line { position: absolute; top: 0; bottom: 0; border-left: 2px solid #6495ff; z-index: 2; }
828
+ .hy-dv-schedule-card { border: 1px solid #d4dbd5; border-radius: 6px; padding: 8px; background: #fff; }
829
+ .hy-dv-schedule-card > button { width: 100%; text-align: left; }
830
+ .hy-dv-schedule-card > button span { display: block; font-size: .8rem; color: #617167; }
831
+ .hy-dv-schedule-fields { display: grid; grid-template-columns: 90px minmax(0, 1fr); margin: 8px 0 0; }
832
+ .hy-dv-schedule-fields dt, .hy-dv-schedule-fields dd { margin: 0; min-width: 0; padding: 4px; border-top: 1px solid #e4e8e2; }
833
+ .hy-dv-schedule-fields dt { font-size: .8rem; color: #617167; }
834
+ .hy-dv-schedule-fields .hy-dv-cell-button { min-height: 44px; border: 0; padding: 4px; }
835
+ .hy-dv-schedule-nav select { font: inherit; min-height: 36px; border: 1px solid #b9c5bd; background: #fff; padding: 4px; border-radius: 4px; }
836
+ @media (max-width: 767px) {
837
+ .hy-dv-named-tabs { flex-wrap: nowrap; overflow-x: auto; }
838
+ .hy-dv-named-tabs button { flex-shrink: 0; min-height: 44px; }
839
+ .hy-dv button { min-height: 40px; }
840
+ .hy-dv-panel > header { position: sticky; top: -14px; background: #faf9f5; z-index: 2; }
841
+ .hy-dv .hy-dv-column-list > div { grid-template-columns: 20px minmax(80px, 1fr) 80px; }
842
+ .hy-dv-column-list > div > select { grid-column: 2; }
843
+ .hy-dv-column-list > div > input[type="number"] { grid-column: 3; }
844
+ .hy-dv-schedule-nav label { flex-wrap: wrap; }
845
+ .hy-dv-schedule-nav input { max-width: 170px; }
846
+ }
847
+ .hy-dv-attachment-cell { display: flex; align-items: center; flex-wrap: nowrap; gap: 6px; height: 100%; min-height: 28px; min-width: 0; box-sizing: border-box; padding: 0 4px; }
848
+ .hy-dv-attachment-cell > .hy-dv-attachments { min-width: 0; flex: 0 1 auto; overflow: hidden; }
849
+ .hy-dv .hy-dv-attachment-cell > .hy-dv-attachment-add { display: inline-flex; flex: 0 0 28px; align-items: center; justify-content: center; width: 28px; height: 28px; min-height: 0; padding: 0; border: 0; background: transparent; color: inherit; border-radius: 4px; cursor: pointer; }
850
+ .hy-dv-attachment-add:hover { background: #eceeeb; }
851
+ .hy-dv-attachment-add:focus-visible { outline: 2px solid #617b68; outline-offset: -2px; }
852
+ .hy-dv-relation-cell { display: flex; align-items: center; height: 100%; min-width: 0; }
853
+ .hy-dv .hy-dv-relation-select { width: 100%; min-width: 0; height: 100%; min-height: 28px; padding: 0 6px; border: 0; border-radius: 0; background: transparent; color: inherit; font: inherit; cursor: pointer; }
854
+ .hy-dv-relation-select:focus-visible { outline: 2px solid #617b68; outline-offset: -2px; }
855
+ .hy-dv-table-scroll { max-height: 560px; }
856
+ .hy-dv-mobile, .hy-dv-mobile-scroll { max-height: 65vh; overflow: auto; overscroll-behavior: contain; }
857
+
858
+ /* Public metrics, shared by the table, Gantt, editors and virtual offsets. */
859
+ .hy-dv { font-size: var(--hy-cell-font, 14px); }
860
+ .hy-dv-table th, .hy-dv-gantt-left .hy-dv-table th { height: var(--hy-header-height, 36px); box-sizing: border-box; font-size: var(--hy-header-font, 13px); padding: 0 var(--hy-header-right, 12px) 0 var(--hy-header-left, 6px); }
861
+ .hy-dv-table thead, .hy-dv-gantt-left .hy-dv-table thead, .hy-dv-timeline-header { height: var(--hy-header-height, 36px); }
862
+ .hy-dv-timeline-header span { top: 50%; transform: translateY(-50%); }
863
+ .hy-dv-table td, .hy-dv-gantt-left .hy-dv-table td { height: var(--hy-row-height, 52px); box-sizing: border-box; padding: 0 var(--hy-cell-padding, 6px); font-size: var(--hy-cell-font, 14px); line-height: var(--hy-cell-line, 16px); }
864
+ .hy-dv-cell-content, .hy-dv-gantt-cell, .hy-dv-cell-content:has(.hy-dv-editor-wrap) { height: calc(var(--hy-row-height) - 1px); min-height: 0; overflow: hidden; }
865
+ .hy-dv .hy-dv-cell-button, .hy-dv-gantt-cell .hy-dv-cell-button { font: inherit; min-height: 0; height: 100%; padding: 0; border: 0; border-radius: 0; cursor: pointer; gap: 4px; }
866
+ .hy-dv-cell-button:disabled { opacity: 1; }
867
+ .hy-dv-cell-button[aria-busy="true"] { opacity: .6; }
868
+ .hy-dv-cell-content .hy-dv-editor-wrap { height: var(--hy-control-height, 28px); min-height: 0; padding: 0; }
869
+ .hy-dv-cell-content .hy-dv-editor { height: var(--hy-control-height, 28px); min-height: 0; padding: 0 6px; font: inherit; box-sizing: border-box; }
870
+ .hy-dv-cell-content .hy-dv-textarea { resize: none; }
871
+ .hy-dv-cell-value { white-space: nowrap; flex: 1; }
872
+ .hy-dv-cell-value .hy-dv-prewrap { white-space: nowrap; }
873
+ .hy-dv-cell-arrow { flex: 0 0 auto; color: var(--hy-muted); }
874
+ .hy-dv-tags { flex-wrap: nowrap; min-width: 0; max-width: 100%; overflow: hidden; }
875
+ .hy-dv-tag, .hy-dv-person, .hy-dv-relation, .hy-dv-group-label { height: var(--hy-badge-height, 20px); max-width: 100%; min-width: 0; box-sizing: border-box; font-size: var(--hy-badge-font, 11px); line-height: var(--hy-badge-height, 20px); padding: 0 var(--hy-badge-padding, 8px); border-radius: 999px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; vertical-align: middle; font-weight: 400; }
876
+ .hy-dv-tags > span { min-width: 0; }
877
+ .hy-dv-pill-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
878
+ .hy-dv-system-value { display: inline-block; background: #eceeeb; color: #667067; border-radius: 3px; min-height: 20px; line-height: 20px; padding: 0 6px; font-size: 12px; max-width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; vertical-align: middle; }
879
+ .hy-dv-table .hy-dv-group td, .hy-dv-gantt-left .hy-dv-table .hy-dv-group td { height: inherit; padding: 0; }
880
+ .hy-dv .hy-dv-group button, .hy-dv-gantt-left .hy-dv-group button { min-height: 0; height: var(--hy-group-height, 28px); padding-block: 0; white-space: nowrap; overflow: hidden; }
881
+ .hy-dv-table tr[aria-hidden] td { height: inherit; padding: 0; border: 0; }
882
+ .hy-dv-table-scroll, .hy-dv-table-scroll.is-virtual, .hy-dv-gantt-pane { height: var(--hy-viewport-height, 560px); max-height: var(--hy-viewport-height, 560px); }
883
+ .hy-dv-table .hy-dv-add-column button { min-height: 0; height: 100%; }
884
+ .hy-dv-bottom-scroll { position: sticky; bottom: 0; z-index: 25; overflow-x: auto; height: var(--hy-scrollbar-height, 16px); background: #eff2f4; }
885
+ .hy-dv-bottom-scroll::-webkit-scrollbar { height: var(--hy-scrollbar-thumb, 12px); }
886
+ .hy-dv-bottom-scroll::-webkit-scrollbar-thumb { background: #9aa7ad; border-radius: 6px; }
887
+ .hy-dv-load-status { position: sticky; bottom: 0; padding: 8px 12px; background: #eff6ff; color: #234778; z-index: 26; }
888
+ .hy-dv-load-status[role="alert"] { color: #952525; background: #fff0ed; }
889
+ .hy-dv-row-controls { display: flex; align-items: center; justify-content: center; gap: 2px; }
890
+ .hy-dv-row-controls button { min-height: 0; height: var(--hy-action-height, 24px); padding: 0 3px; }
891
+ .hy-dv .hy-dv-row-drag { cursor: grab; touch-action: none; user-select: none; min-width: 24px; }
892
+ .hy-dv tr.is-moving td { opacity: .55; }
893
+ .hy-dv tr.is-drop-before td { box-shadow: inset 0 2px #246bff; }
894
+ .hy-dv tr.is-drop-after td { box-shadow: inset 0 -2px #246bff; }
895
+ .hy-dv-action-cell { display: flex; align-items: center; min-width: 0; border: 0; margin: 0; padding: 0; }
896
+ .hy-dv-action-cell button { min-height: 0; height: var(--hy-action-height, 24px); padding: 0 6px; font-size: inherit; }
897
+ .hy-dv-reference-editor { display: grid; gap: 8px; }
898
+ .hy-dv-reference-editor > div { display: grid; max-height: 240px; overflow: auto; gap: 4px; }
899
+ .hy-dv-reference-editor button { text-align: left; }
900
+ .hy-dv-reference-editor button[aria-pressed="true"] { background: #e2ebff; }
901
+ .hy-dv-reference-editor footer { display: flex; gap: 8px; }
902
+ .hy-dv-detail .hy-dv-cell-button { min-height: 32px; }
903
+ .hy-dv-mobile-field-settings > div { display: grid; grid-template-columns: minmax(0, 1fr) 146px; align-items: center; gap: 6px; min-width: 0; min-height: 32px; }
904
+ .hy-dv-field-order-actions { display: grid; grid-template-columns: repeat(4, 32px); gap: 6px; min-height: 32px; }
905
+ .hy-dv .hy-dv-field-order-actions > button { width: 32px; min-width: 0; height: 32px; min-height: 32px; padding: 0; }
906
+ .hy-dv-column-list label > span { min-width: 0; overflow-wrap: anywhere; }
907
+ @container (max-width: 700px) {
908
+ .hy-dv-column-list > div > select { grid-column: 2; }
909
+ .hy-dv-column-list > div > input[type="number"] { grid-column: 3; }
910
+ .hy-dv-column-list > div > .hy-dv-field-order-actions { grid-column: 2 / -1; justify-self: end; }
911
+ }
912
+ @media (max-width: 767px) {
913
+ .hy-dv-column-list > div > .hy-dv-field-order-actions { grid-column: 2 / -1; justify-self: end; }
914
+ }
915
+ .hy-dv-card, .hy-dv-schedule-card { content-visibility: auto; contain-intrinsic-size: auto 180px; }
916
+ @media (max-width: 767px) {
917
+ .hy-dv-bottom-scroll { display: none; }
918
+ .hy-dv-mobile .hy-dv-cell-button { min-height: 36px; }
919
+ .hy-dv-mobile.mobile-compact .hy-dv-card { border-radius: 0; border-inline: 0; padding: 6px 10px; margin: 0; }
920
+ .hy-dv-mobile.mobile-compact dl { grid-template-columns: 80px minmax(0, 1fr); }
921
+ .hy-dv-mobile.mobile-compact .hy-dv-cell-button { min-height: 28px; }
922
+ .hy-dv-dialog { max-height: calc(100dvh - 24px); overscroll-behavior: contain; }
923
+ .hy-dv-dialog input, .hy-dv-dialog textarea { scroll-margin-block: 70px; }
924
+ .hy-dv-reference-editor > div { max-height: min(240px, 35dvh); }
925
+ }
926
+
927
+ /* alpha.8: responsive presentation is independent of device viewport width. */
928
+ .hy-dv { container-name: hy-data-view; }
929
+ .hy-dv .hy-dv-desktop { display: block; }
930
+ .hy-dv .hy-dv-mobile { display: none; }
931
+ .hy-dv .hy-dv-bottom-scroll { display: block; }
932
+ .hy-dv-tool-icon { display: none; }
933
+ .hy-dv-heading { min-width: 0; }
934
+ .hy-dv-body { min-width: 0; min-height: 0; }
935
+ .hy-dv.chrome-compact .hy-dv-heading { display: flex; align-items: center; flex-wrap: wrap; border-bottom: 1px solid var(--hy-line); }
936
+ .hy-dv.chrome-compact .hy-dv-titlebar { flex: 1 1 auto; min-width: 0; min-height: 32px; padding: 2px 6px; gap: 6px; border: 0; flex-wrap: wrap; }
937
+ .hy-dv.chrome-compact .hy-dv-titlebar h2 { font-size: 13px; }
938
+ .hy-dv.chrome-compact .hy-dv-titlebar > div { min-width: 0; flex-wrap: wrap; }
939
+ .hy-dv.chrome-compact .hy-dv-view-tabs { padding: 2px 6px; gap: 4px; border: 0; flex-wrap: nowrap; overflow-x: auto; max-width: 100%; }
940
+ .hy-dv.chrome-compact .hy-dv-view-tabs button { flex-shrink: 0; min-height: var(--hy-control-height); padding: 2px 6px; font-size: 12px; }
941
+ .hy-dv .hy-dv-toolbar.is-compact { flex-wrap: nowrap; overflow: visible; padding: 3px 6px; min-height: 34px; gap: 4px; z-index: 35; }
942
+ .hy-dv-toolbar.is-compact > button, .hy-dv-toolbar.is-compact select { min-height: var(--hy-control-height); padding: 2px 6px; flex-shrink: 0; font: inherit; }
943
+ .hy-dv .hy-dv-toolbar.is-compact .hy-dv-search { height: var(--hy-control-height); padding: 0 4px; flex: 1 1 180px; min-width: 50px; max-width: 240px; width: auto; grid-template-columns: 16px minmax(0,1fr); }
944
+ .hy-dv-toolbar.is-compact .hy-dv-search input { min-width: 0; width: 100%; height: 100%; min-height: 0; padding: 2px 4px; }
945
+ .hy-dv-toolbar-slot { display: flex; min-width: 0; max-width: 25%; overflow-x: auto; }
946
+ .hy-dv-toolbar-more { position: absolute; right: 6px; top: 100%; display: flex; flex-direction: column; align-items: stretch; gap: 4px; width: min(280px, calc(100% - 12px)); max-height: min(420px, 65dvh); overflow: auto; padding: 8px; background: var(--hy-paper); border: 1px solid var(--hy-line); box-shadow: 0 6px 18px #0002; z-index: 50; }
947
+ .hy-dv-toolbar-more button { min-height: 32px; text-align: left; font: inherit; border: 1px solid var(--hy-line); background: #fff; padding: 4px 8px; cursor: pointer; }
948
+ .hy-dv-toolbar-more button.is-active { background: var(--hy-accent-soft); }
949
+ .hy-dv.chrome-compact .hy-dv-schedule-nav { padding: 3px 6px; gap: 4px; }
950
+ .hy-dv.chrome-compact .hy-dv-schedule-nav button, .hy-dv.chrome-compact .hy-dv-schedule-nav select, .hy-dv.chrome-compact .hy-dv-schedule-nav input { min-height: var(--hy-control-height); padding: 2px 4px; font-size: 12px; }
951
+ .hy-dv.chrome-compact .hy-dv-keyboard-help { display: none; }
952
+ .hy-dv.chrome-compact .hy-dv-gantt-help { padding: 3px 6px; font-size: 12px; }
953
+ .hy-dv.density-workbench .hy-dv-group button { height: var(--hy-group-height); min-height: 0; }
954
+ .hy-dv .hy-dv-mobile, .hy-dv .hy-dv-mobile-scroll { max-height: var(--hy-viewport-height); }
955
+ .hy-dv.has-total-height { display: flex; flex-direction: column; min-height: 0; }
956
+ .hy-dv.has-total-height > :not(.hy-dv-body) { flex-shrink: 0; }
957
+ .hy-dv.has-total-height > .hy-dv-body { flex: 1 1 0; display: flex; flex-direction: column; overflow: hidden; }
958
+ .hy-dv.has-total-height .hy-dv-desktop { flex: 1 1 0; min-height: 0; }
959
+ .hy-dv.has-total-height .hy-dv-table-scroll { height: 100%; max-height: none; }
960
+ .hy-dv.has-total-height .hy-dv-mobile { flex: 1 1 0; min-height: 0; max-height: none; }
961
+ .hy-dv.has-total-height .hy-dv-body > .hy-dv-schedule { flex: 1 1 0; min-height: 0; display: flex; flex-direction: column; overflow: hidden; }
962
+ .hy-dv.has-total-height .hy-dv-schedule > :not(.hy-dv-schedule-nav):not(.hy-dv-gantt-help):not(.hy-dv-keyboard-help) { flex: 1 1 0; min-height: 0; overflow: auto; }
963
+ .hy-dv.has-total-height .hy-dv-gantt-split { height: 100%; }
964
+ .hy-dv.has-total-height .hy-dv-gantt-pane { height: 100%; max-height: none; }
965
+ .hy-dv.has-total-height .hy-dv-schedule-nav, .hy-dv.has-total-height .hy-dv-gantt-help { flex-shrink: 0; }
966
+ .hy-dv.has-total-height .hy-dv-keyboard-help { margin: 0; padding: 3px 6px; flex-shrink: 0; }
967
+ .hy-dv.has-total-height .hy-dv-state { overflow: auto; }
968
+ .hy-dv.has-total-height .hy-dv-panel-wrap { position: relative; height: 0; z-index: 40; }
969
+ .hy-dv.has-total-height .hy-dv-panel-wrap > .hy-dv-panel { position: absolute; top: 0; right: 0; max-height: min(420px, 70dvh); overflow: auto; }
970
+ @container hy-data-view (max-width: 767px) {
971
+ .hy-dv.presentation-auto .hy-dv-desktop, .hy-dv.presentation-auto .hy-dv-bottom-scroll { display: none; }
972
+ .hy-dv.presentation-auto .hy-dv-mobile { display: block; }
973
+ .hy-dv.chrome-compact .hy-dv-tool .hy-dv-tool-icon { display: inline-flex; gap: 2px; }
974
+ .hy-dv.chrome-compact .hy-dv-tool .hy-dv-tool-label { display: none; }
975
+ }
976
+ .hy-dv.presentation-cards .hy-dv-desktop, .hy-dv.presentation-cards .hy-dv-bottom-scroll, .hy-dv.presentation-cards .hy-dv-schedule-wide { display: none; }
977
+ .hy-dv.presentation-cards .hy-dv-mobile, .hy-dv.presentation-cards .hy-dv-schedule-narrow { display: block; }
978
+ .hy-dv.presentation-cards .hy-dv-schedule-narrow.hy-dv-agenda { display: grid; }
979
+ .hy-dv.presentation-table .hy-dv-desktop, .hy-dv.presentation-table .hy-dv-schedule-wide { display: block; }
980
+ .hy-dv.presentation-table .hy-dv-calendar.hy-dv-schedule-wide { display: grid; }
981
+ .hy-dv.presentation-table .hy-dv-mobile, .hy-dv.presentation-table .hy-dv-schedule-narrow { display: none; }
982
+ .hy-dv .hy-dv-mobile { background: #f1f0eb; padding: 6px; overflow: auto; }
983
+ .hy-dv .hy-dv-card { border: 1px solid var(--hy-line); padding: 8px; margin-bottom: 6px; background: var(--hy-paper); }
984
+ .hy-dv .hy-dv-card dl { display: grid; grid-template-columns: 85px minmax(0,1fr); gap: 4px; margin: 0; }
985
+ .hy-dv .hy-dv-card dt, .hy-dv .hy-dv-card dd { margin: 0; min-width: 0; }
986
+ .hy-dv .hy-dv-card .hy-dv-cell-button { min-height: 36px; }
987
+ .hy-dv .hy-dv-card-select { display: flex; justify-content: flex-end; }
988
+ .hy-dv .hy-dv-mobile-group-title { min-height: 36px; width: 100%; text-align: left; }
989
+ .hy-dv.presentation-cards .hy-dv-keyboard-help { display: none; }
990
+ .hy-dv-workspace.has-total-height { display: flex; flex-direction: column; min-height: 0; }
991
+ .hy-dv-workspace.has-total-height > .hy-dv { flex: 1 1 0; min-height: 0; }
992
+ .hy-dv-workspace.has-total-height > :not(.hy-dv) { flex-shrink: 0; }
993
+ .hy-dv-workspace.chrome-compact > .hy-dv-named-tabs { flex-wrap: nowrap; overflow-x: auto; padding: 2px 6px; gap: 4px; }
994
+ .hy-dv-workspace.chrome-compact > .hy-dv-named-tabs button { min-height: 28px; padding: 2px 6px; white-space: nowrap; }
995
+ .hy-dv-workspace.chrome-compact > .hy-dv-view-save:empty { display: none; }
996
+
997
+ @media (pointer: coarse) {
998
+ .hy-dv.chrome-compact .hy-dv-toolbar > button, .hy-dv.chrome-compact .hy-dv-toolbar select,
999
+ .hy-dv.chrome-compact .hy-dv-view-tabs button, .hy-dv.chrome-compact .hy-dv-schedule-nav button,
1000
+ .hy-dv.chrome-compact .hy-dv-schedule-nav select, .hy-dv.chrome-compact .hy-dv-schedule-nav input,
1001
+ .hy-dv.chrome-compact .hy-dv-toolbar-more button { min-height: 40px; }
1002
+ .hy-dv.chrome-compact .hy-dv-toolbar .hy-dv-search { height: 40px; }
1003
+ }
1004
+
1005
+ .hy-dv-group-rule { min-width: 0; border: 1px solid var(--hy-line-soft); border-radius: 4px; padding: 8px; }
1006
+ .hy-dv-group-order { min-width: 0; }
1007
+ .hy-dv-group-order > header { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; margin-top: 8px; }
1008
+ .hy-dv-group-order h4 { margin: 0; font: inherit; font-weight: 600; }
1009
+ .hy-dv-group-order-list { list-style: none; max-height: 280px; overflow: auto; margin: 0; padding: 0; }
1010
+ .hy-dv-group-order-list > li { display: grid; grid-template-columns: 18px minmax(0, 1fr) 146px; align-items: center; gap: 6px; padding: 6px 0; border-top: 1px solid var(--hy-line-soft); }
1011
+ .hy-dv-group-order-label { min-width: 0; overflow-wrap: anywhere; }
1012
+
1013
+ /* Header actions reserve their space and use the browser top layer above sticky columns. */
1014
+ .hy-dv-column-heading { display: flex; align-items: center; gap: 4px; min-width: 0; }
1015
+ .hy-dv-column-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1016
+ .hy-dv .hy-dv-header-menu-trigger { flex: 0 0 24px; width: 24px; height: 24px; min-height: 0; padding: 0; border: 0; border-radius: 4px; background: transparent; color: inherit; font: inherit; cursor: pointer; opacity: 0; }
1017
+ .hy-dv th:hover .hy-dv-header-menu-trigger, .hy-dv th:focus-within .hy-dv-header-menu-trigger, .hy-dv .hy-dv-header-menu-trigger[aria-expanded="true"] { opacity: 1; }
1018
+ .hy-dv .hy-dv-header-menu-trigger:hover, .hy-dv .hy-dv-header-menu-trigger[aria-expanded="true"] { background: var(--hy-accent-soft); }
1019
+ .hy-dv-header-menu { position: fixed; inset: auto; margin: 0; width: 264px; max-width: calc(100vw - 16px); max-height: min(520px, calc(100vh - 16px)); overflow: auto; overscroll-behavior: contain; padding: 5px; border: 1px solid var(--hy-line); border-radius: 6px; background: var(--hy-paper); color: var(--hy-ink); box-shadow: 0 8px 28px #16332530; }
1020
+ .hy-dv-header-menu button, .hy-dv-header-menu-fallback button { display: flex; align-items: center; gap: 10px; width: 100%; min-height: 34px; padding: 7px 10px; border: 0; border-radius: 3px; background: transparent; color: var(--hy-ink); font: inherit; text-align: left; cursor: pointer; }
1021
+ .hy-dv-header-menu button > span:first-child, .hy-dv-header-menu-fallback button > span:first-child { flex: 0 0 18px; text-align: center; }
1022
+ .hy-dv-header-menu button > span:last-child, .hy-dv-header-menu-fallback button > span:last-child { min-width: 0; overflow-wrap: anywhere; }
1023
+ .hy-dv-header-menu button.has-separator, .hy-dv-header-menu-fallback button.has-separator { margin-top: 4px; border-top: 1px solid var(--hy-line); border-radius: 0; }
1024
+ .hy-dv-header-menu button:enabled:hover, .hy-dv-header-menu-fallback button:enabled:hover { background: var(--hy-accent-soft); }
1025
+ .hy-dv-header-menu button.hy-dv-danger, .hy-dv-header-menu-fallback button.hy-dv-danger { color: #9b3025; }
1026
+ .hy-dv-header-menu button:disabled, .hy-dv-header-menu-fallback button:disabled { opacity: .5; cursor: default; }
1027
+ .hy-dv-header-menu button:focus-visible, .hy-dv-header-menu-fallback button:focus-visible, .hy-dv .hy-dv-header-menu-trigger:focus-visible { outline: 2px solid var(--hy-accent); outline-offset: -2px; }
1028
+ @media (hover: none) { .hy-dv .hy-dv-header-menu-trigger { opacity: 1; } }