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