zero-query 1.2.5 → 1.2.7

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.
@@ -6,6 +6,7 @@
6
6
  --panel: #151821;
7
7
  --panel-2: #1c2030;
8
8
  --border: #262b38;
9
+ --border-hi: #3a4258;
9
10
  --text: #e8ecf3;
10
11
  --text-muted: #8a93a6;
11
12
  --accent: #5b8def;
@@ -43,7 +44,7 @@ main { flex: 1 1 auto; min-height: 0; }
43
44
  /* ---- Lobby (pre-join) -------------------------------------------------- */
44
45
 
45
46
  .lobby {
46
- max-width: 560px;
47
+ max-width: 620px;
47
48
  margin: 4rem auto;
48
49
  padding: 2rem;
49
50
  background: var(--panel);
@@ -51,7 +52,7 @@ main { flex: 1 1 auto; min-height: 0; }
51
52
  border-radius: 0.75rem;
52
53
  }
53
54
  .lobby h1 { margin: 0 0 0.5rem; font-size: 1.4rem; }
54
- .lobby .lead { color: var(--text-muted); line-height: 1.5; }
55
+ .lobby .lead { color: var(--text-muted); line-height: 1.55; margin: 0.4rem 0; }
55
56
  .lobby code { background: #0d101a; padding: 0.1rem 0.35rem; border-radius: 0.25rem; }
56
57
 
57
58
  .join-form {
@@ -86,22 +87,45 @@ button {
86
87
  font-weight: 600;
87
88
  cursor: pointer;
88
89
  font-family: inherit;
90
+ transition: background .15s, border-color .15s, transform .05s;
91
+ display: inline-flex;
92
+ align-items: center;
93
+ gap: 0.4rem;
94
+ line-height: 1;
89
95
  }
90
- button:hover { background: #232939; }
96
+ button .icon { flex: 0 0 auto; display: block; }
97
+ button:hover { background: #232939; border-color: var(--border-hi); }
98
+ button:active { transform: translateY(1px); }
99
+ button:disabled { opacity: 0.55; cursor: not-allowed; }
91
100
  button.primary { background: var(--accent); border-color: transparent; color: #fff; }
92
101
  button.primary:hover { filter: brightness(1.1); }
93
102
  button.leave { background: var(--danger); border-color: transparent; color: #fff; }
94
103
  button.off { background: #3a2030; color: #f3b6c2; }
95
104
  button.active { background: var(--accent-2); border-color: transparent; color: #fff; }
105
+ button.ghost { background: transparent; }
96
106
 
97
107
  .status { color: var(--text-muted); font-size: 0.9rem; margin: 0.5rem 0 0; }
98
108
  .status.error { color: var(--danger); }
99
109
 
110
+ .device-hint {
111
+ color: var(--warn);
112
+ background: rgba(245, 158, 11, 0.08);
113
+ border: 1px solid rgba(245, 158, 11, 0.25);
114
+ padding: 0.5rem 0.75rem;
115
+ border-radius: 0.375rem;
116
+ font-size: 0.85rem;
117
+ margin-top: 0.75rem;
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 0.5rem;
121
+ }
122
+ .device-hint .icon { flex: 0 0 auto; }
123
+
100
124
  /* ---- Room layout (in-call) -------------------------------------------- */
101
125
 
102
126
  .room {
103
127
  display: grid;
104
- grid-template-columns: 220px 1fr 280px;
128
+ grid-template-columns: 220px 1fr 300px;
105
129
  height: 100%;
106
130
  min-height: 0;
107
131
  }
@@ -125,14 +149,24 @@ button.active { background: var(--accent-2); border-color: transparent; c
125
149
  border-radius: 0.375rem;
126
150
  font-size: 0.9rem;
127
151
  }
128
- .roster-row.me { color: var(--accent); }
129
- .roster-row small { color: var(--text-muted); font-weight: normal; }
152
+ .roster-row.broken { color: var(--danger); }
153
+ .roster-row.me { color: var(--accent); }
154
+ .roster-row .who { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
155
+ .roster-row .who small { color: var(--text-muted); font-weight: normal; }
130
156
  .roster-row .dot {
131
157
  width: 8px; height: 8px; border-radius: 50%;
132
158
  background: var(--accent-2);
133
159
  flex: 0 0 auto;
134
160
  }
135
161
  .roster-row .dot.off { background: var(--text-muted); }
162
+ .roster-row .roster-icons {
163
+ display: inline-flex;
164
+ align-items: center;
165
+ gap: 0.25rem;
166
+ color: var(--text-muted);
167
+ white-space: nowrap;
168
+ }
169
+ .roster-row.me .roster-icons { color: var(--accent); }
136
170
 
137
171
  .sidebar .leave { margin-top: 0.5rem; }
138
172
 
@@ -145,34 +179,113 @@ button.active { background: var(--accent-2); border-color: transparent; c
145
179
  background: var(--bg);
146
180
  }
147
181
 
148
- .tiles {
182
+ .stage-area {
183
+ flex: 1 1 auto;
184
+ min-height: 0;
185
+ display: flex;
186
+ flex-direction: column;
187
+ gap: 0.5rem;
188
+ padding: 0.6rem;
189
+ }
190
+
191
+ /* Main tile area - flexes to fill remaining space. */
192
+ .stage-main {
149
193
  flex: 1 1 auto;
150
194
  min-height: 0;
151
- overflow-y: auto;
152
- padding: 0.75rem;
153
195
  display: grid;
154
- grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
155
- grid-auto-rows: minmax(180px, auto);
156
- gap: 0.75rem;
196
+ gap: 0.5rem;
197
+ align-content: stretch;
198
+ }
199
+
200
+ /* Tile-count adaptive grids. */
201
+ .stage-main-1 { grid-template-columns: 1fr; grid-template-rows: 1fr; }
202
+ .stage-main-2 { grid-template-columns: 1fr 1fr; grid-template-rows: 1fr; }
203
+ .stage-main-4 { grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; }
204
+ .stage-main-6 { grid-template-columns: 1fr 1fr 1fr; grid-template-rows: 1fr 1fr; }
205
+ .stage-main-9 { grid-template-columns: 1fr 1fr 1fr; grid-template-rows: 1fr 1fr 1fr; }
206
+
207
+ /* Camera-only mode keeps a 16:9 floor so tiny grids don't span the screen. */
208
+ .room:not(.has-focus) .stage-main {
209
+ align-content: start;
210
+ grid-auto-rows: minmax(180px, 1fr);
211
+ }
212
+
213
+ /* Strip of thumbnails for the non-focused tiles when a screen is on stage. */
214
+ .stage-strip {
215
+ flex: 0 0 auto;
216
+ display: flex;
217
+ gap: 0.5rem;
218
+ overflow-x: auto;
219
+ padding-bottom: 0.25rem;
220
+ scrollbar-width: thin;
221
+ }
222
+ .stage-strip::-webkit-scrollbar { height: 6px; }
223
+ .stage-strip::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
224
+
225
+ .stage-empty {
226
+ flex: 1 1 auto;
227
+ display: flex; flex-direction: column;
228
+ align-items: center; justify-content: center;
229
+ color: var(--text-muted);
230
+ border: 1px dashed var(--border);
231
+ border-radius: 0.5rem;
157
232
  }
233
+ .stage-empty .empty-title { font-size: 1rem; color: var(--text); margin-bottom: 0.25rem; }
234
+ .stage-empty .empty-sub { font-size: 0.85rem; }
235
+
236
+ /* ---- Tiles ------------------------------------------------------------- */
237
+
158
238
  .tile {
159
239
  background: #000;
160
240
  border: 1px solid var(--border);
161
241
  border-radius: 0.5rem;
162
242
  overflow: hidden;
163
- aspect-ratio: 16 / 9;
164
243
  position: relative;
244
+ min-height: 0;
165
245
  }
166
- .tile.self { border-color: var(--accent); }
167
- .tile video { width: 100%; height: 100%; object-fit: cover; background: #000; }
168
- .tile .label {
246
+ .tile.self { border-color: var(--accent); }
247
+ .tile.tile-screen { border-color: var(--accent-2); }
248
+ .tile video {
249
+ width: 100%; height: 100%;
250
+ object-fit: cover; background: #000;
251
+ display: block;
252
+ }
253
+ .tile.tile-screen video { object-fit: contain; background: #000; }
254
+ .tile.tile-cam video { object-fit: cover; }
255
+
256
+ .tile.thumb {
257
+ flex: 0 0 auto;
258
+ width: 200px;
259
+ aspect-ratio: 16 / 9;
260
+ }
261
+ .tile.tile-strip { /* alias of .thumb so future tweaks have a hook */ }
262
+
263
+ .tile .label {
169
264
  position: absolute;
170
- left: 0.5rem; bottom: 0.5rem;
171
- background: rgba(0, 0, 0, 0.65);
172
- padding: 0.15rem 0.5rem;
173
- border-radius: 0.25rem;
174
- font-size: 0.8rem;
265
+ left: 0.45rem; bottom: 0.45rem;
266
+ display: inline-flex; align-items: center; gap: 0.35rem;
267
+ background: rgba(0, 0, 0, 0.62);
268
+ padding: 0.18rem 0.5rem;
269
+ border-radius: 999px;
270
+ font-size: 0.78rem;
271
+ backdrop-filter: blur(4px);
175
272
  }
273
+ .tile .label-name { font-weight: 600; }
274
+ .tile .chip {
275
+ display: inline-flex;
276
+ align-items: center;
277
+ gap: 0.2rem;
278
+ font-size: 0.78rem;
279
+ line-height: 1;
280
+ padding: 0.2rem 0.35rem;
281
+ border-radius: 999px;
282
+ background: rgba(255,255,255,0.08);
283
+ }
284
+ .tile .chip .icon { display: block; }
285
+ .tile .chip-on { background: rgba(22,163,74,0.25); }
286
+ .tile .chip-off { background: rgba(225,69,92,0.25); }
287
+ .tile .chip-screen { background: rgba(91,141,239,0.25); }
288
+
176
289
  .tile .camoff {
177
290
  position: absolute; inset: 0;
178
291
  display: flex; align-items: center; justify-content: center;
@@ -181,23 +294,52 @@ button.active { background: var(--accent-2); border-color: transparent; c
181
294
  font-size: 0.95rem;
182
295
  }
183
296
 
297
+ .tile .pin-btn {
298
+ position: absolute;
299
+ top: 0.4rem; right: 0.4rem;
300
+ width: 28px; height: 28px;
301
+ padding: 0; line-height: 1;
302
+ border-radius: 6px;
303
+ background: rgba(0, 0, 0, 0.5);
304
+ border: 1px solid rgba(255,255,255,0.15);
305
+ color: #fff;
306
+ display: inline-flex;
307
+ align-items: center;
308
+ justify-content: center;
309
+ gap: 0;
310
+ opacity: 0;
311
+ transition: opacity .15s;
312
+ }
313
+ .tile.self .pin-btn,
314
+ .tile.tile-main .pin-btn { opacity: 1; background: rgba(0, 0, 0, 0.4); }
315
+ .tile:hover .pin-btn { opacity: 1; }
316
+
317
+ .tile.thumb .label { font-size: 0.72rem; padding: 0.1rem 0.4rem; }
318
+ .tile.thumb .chip { display: none; }
319
+
320
+ /* ---- Controls ---------------------------------------------------------- */
321
+
184
322
  .controls {
185
323
  flex: 0 0 auto;
186
- display: flex; gap: 0.5rem; align-items: center;
187
- padding: 0.75rem;
324
+ display: flex; gap: 0.5rem; align-items: center; flex-wrap: wrap;
325
+ padding: 0.6rem 0.75rem;
188
326
  background: var(--panel);
189
327
  border-top: 1px solid var(--border);
190
328
  }
329
+ .ctl-group { display: inline-flex; gap: 0.35rem; align-items: center; }
191
330
  .controls .status-inline {
192
331
  margin-left: auto;
193
332
  color: var(--text-muted);
194
- font-size: 0.85rem;
333
+ font-size: 0.82rem;
195
334
  text-align: right;
196
- max-width: 50%;
335
+ max-width: 55%;
336
+ overflow: hidden;
337
+ text-overflow: ellipsis;
338
+ white-space: nowrap;
197
339
  }
198
340
  .controls .status-inline.error { color: var(--danger); }
199
341
 
200
- /* ---- Chat ------------------------------------------------------------- */
342
+ /* ---- Chat -------------------------------------------------------------- */
201
343
 
202
344
  .chat {
203
345
  background: var(--panel);
@@ -210,6 +352,9 @@ button.active { background: var(--accent-2); border-color: transparent; c
210
352
  padding: 0.75rem 1rem;
211
353
  border-bottom: 1px solid var(--border);
212
354
  font-weight: 600;
355
+ display: flex;
356
+ align-items: center;
357
+ gap: 0.5rem;
213
358
  }
214
359
  .chat-log {
215
360
  flex: 1 1 auto;
@@ -219,10 +364,31 @@ button.active { background: var(--accent-2); border-color: transparent; c
219
364
  flex-direction: column;
220
365
  gap: 0.5rem;
221
366
  }
222
- .chat-log .empty { color: var(--text-muted); font-size: 0.9rem; text-align: center; margin: auto 0; }
223
- .msg .who { color: var(--accent); font-weight: 600; margin-right: 0.4rem; font-size: 0.85rem; }
367
+ .chat-log .empty {
368
+ display: flex;
369
+ flex-direction: column;
370
+ align-items: center;
371
+ gap: 0.4rem;
372
+ color: var(--text-muted);
373
+ font-size: 0.9rem;
374
+ text-align: center;
375
+ margin: auto 0;
376
+ }
377
+ .msg {
378
+ background: rgba(255,255,255,0.02);
379
+ padding: 0.35rem 0.5rem;
380
+ border-radius: 0.4rem;
381
+ border-left: 2px solid var(--border);
382
+ }
383
+ .msg.mine { border-left-color: var(--accent-2); background: rgba(22,163,74,0.06); }
384
+ .msg-head {
385
+ display: flex; justify-content: space-between; align-items: baseline; gap: 0.5rem;
386
+ margin-bottom: 0.1rem;
387
+ }
388
+ .msg .who { color: var(--accent); font-weight: 600; font-size: 0.82rem; }
224
389
  .msg.mine .who { color: var(--accent-2); }
225
- .msg .text { word-wrap: break-word; }
390
+ .msg .when { color: var(--text-muted); font-size: 0.7rem; }
391
+ .msg .text { word-wrap: break-word; font-size: 0.9rem; line-height: 1.4; }
226
392
 
227
393
  .chat-form {
228
394
  flex: 0 0 auto;
@@ -233,6 +399,7 @@ button.active { background: var(--accent-2); border-color: transparent; c
233
399
  }
234
400
  .chat-form input {
235
401
  flex: 1 1 auto;
402
+ min-width: 0;
236
403
  background: #0d101a;
237
404
  color: var(--text);
238
405
  border: 1px solid var(--border);
@@ -243,8 +410,38 @@ button.active { background: var(--accent-2); border-color: transparent; c
243
410
 
244
411
  /* ---- Responsive tweaks ------------------------------------------------- */
245
412
 
413
+ @media (max-width: 1100px) {
414
+ .room { grid-template-columns: 200px 1fr 260px; }
415
+ }
246
416
  @media (max-width: 900px) {
247
- .room { grid-template-columns: 1fr; grid-template-rows: auto 1fr auto; }
248
- .sidebar, .chat { border: none; border-bottom: 1px solid var(--border); }
249
- .chat { max-height: 40vh; }
417
+ .room {
418
+ grid-template-columns: 1fr;
419
+ grid-template-rows: auto 1fr auto;
420
+ }
421
+ .sidebar {
422
+ flex-direction: row;
423
+ align-items: center;
424
+ gap: 0.5rem;
425
+ padding: 0.5rem 0.75rem;
426
+ border-right: none;
427
+ border-bottom: 1px solid var(--border);
428
+ }
429
+ .sidebar .room-meta { border: none; padding: 0; flex: 0 0 auto; }
430
+ .sidebar .roster { display: none; }
431
+ .sidebar .leave { margin: 0 0 0 auto; padding: 0.4rem 0.7rem; font-size: 0.85rem; }
432
+ .chat {
433
+ border-left: none;
434
+ border-top: 1px solid var(--border);
435
+ max-height: 42vh;
436
+ }
437
+ .tile.thumb { width: 140px; }
438
+ .controls { padding: 0.5rem; }
439
+ .controls .status-inline { max-width: 100%; flex: 1 1 100%; text-align: left; margin: 0.25rem 0 0; }
440
+ }
441
+ @media (max-width: 540px) {
442
+ .stage-main-2 { grid-template-columns: 1fr; grid-template-rows: 1fr 1fr; }
443
+ .stage-main-4,
444
+ .stage-main-6,
445
+ .stage-main-9 { grid-template-columns: 1fr 1fr; grid-auto-rows: minmax(140px, 1fr); grid-template-rows: none; }
446
+ .tile.thumb { width: 120px; }
250
447
  }
Binary file
package/dist/zquery.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * zQuery (zeroQuery) v1.2.5
2
+ * zQuery (zeroQuery) v1.2.7
3
3
  * Lightweight Frontend Library
4
4
  * https://github.com/tonywied17/zero-query
5
5
  * (c) 2026 Anthony Wiedman - MIT License
@@ -10449,9 +10449,9 @@ $.TurnError = TurnError;
10449
10449
  $.E2eeError = E2eeError;
10450
10450
 
10451
10451
  // --- Meta ------------------------------------------------------------------
10452
- $.version = '1.2.5';
10452
+ $.version = '1.2.7';
10453
10453
  $.libSize = '~130 KB';
10454
- $.unitTests = {"passed":2348,"failed":0,"total":2534,"suites":620,"duration":8205,"ok":true};
10454
+ $.unitTests = {"passed":2348,"failed":0,"total":2534,"suites":620,"duration":8702,"ok":true};
10455
10455
  $.meta = {}; // populated at build time by CLI bundler
10456
10456
 
10457
10457
  // --- Environment detection -------------------------------------------------