@livelayer/react 0.6.2 → 0.9.0
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.
- package/dist/index.d.ts +62 -2
- package/dist/index.js +3 -3
- package/dist/index.mjs +1983 -1682
- package/dist/styles.css +189 -0
- package/package.json +1 -1
package/dist/styles.css
CHANGED
|
@@ -123,6 +123,53 @@
|
|
|
123
123
|
top: auto;
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
+
/* ── Embedded experience mode ──────────────────────────────────────
|
|
127
|
+
When `experienceMode="EMBEDDED"`, the widget renders inline within
|
|
128
|
+
the host container instead of as a fixed-position floating overlay.
|
|
129
|
+
The host owns size, position, and stacking — we just unstick the
|
|
130
|
+
widget from the viewport corners and let .ll-expanded fill its
|
|
131
|
+
parent. Locked to displayMode="expanded" in TS (minimize/hide are
|
|
132
|
+
floating-widget concepts that don't apply inline). */
|
|
133
|
+
.ll-widget[data-experience-mode="embedded"] {
|
|
134
|
+
position: relative;
|
|
135
|
+
inset: auto;
|
|
136
|
+
width: 100%;
|
|
137
|
+
height: 100%;
|
|
138
|
+
pointer-events: auto;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* Disable the corner-anchoring rules in embedded mode regardless of
|
|
142
|
+
what `position` was passed (we keep the prop for API symmetry). */
|
|
143
|
+
.ll-widget[data-experience-mode="embedded"][data-position="bottom-right"],
|
|
144
|
+
.ll-widget[data-experience-mode="embedded"][data-position="bottom-left"],
|
|
145
|
+
.ll-widget[data-experience-mode="embedded"][data-position="top-right"],
|
|
146
|
+
.ll-widget[data-experience-mode="embedded"][data-position="top-left"] {
|
|
147
|
+
inset: auto;
|
|
148
|
+
left: auto;
|
|
149
|
+
right: auto;
|
|
150
|
+
top: auto;
|
|
151
|
+
bottom: auto;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* Override the mobile sheet behavior — no full-width bottom in embedded. */
|
|
155
|
+
.ll-widget[data-experience-mode="embedded"].ll-widget--mobile.ll-widget--expanded {
|
|
156
|
+
position: relative;
|
|
157
|
+
left: auto;
|
|
158
|
+
right: auto;
|
|
159
|
+
top: auto;
|
|
160
|
+
bottom: auto;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* The expanded panel fills its parent in embedded mode (host drives size).
|
|
164
|
+
No floating shadow chrome — the host card already has its own. */
|
|
165
|
+
.ll-widget[data-experience-mode="embedded"] .ll-expanded--desktop,
|
|
166
|
+
.ll-widget[data-experience-mode="embedded"] .ll-expanded--mobile {
|
|
167
|
+
width: 100%;
|
|
168
|
+
height: 100%;
|
|
169
|
+
border-radius: inherit;
|
|
170
|
+
box-shadow: none;
|
|
171
|
+
}
|
|
172
|
+
|
|
126
173
|
/* ── Hidden mode: edge chevron tab ────────────────────────────────── */
|
|
127
174
|
/* Solid-black tab docked to the screen edge with a white chevron.
|
|
128
175
|
Designed to be unmistakably visible on light AND dark pages — no
|
|
@@ -576,6 +623,15 @@
|
|
|
576
623
|
background: rgba(0, 0, 0, 0.5);
|
|
577
624
|
}
|
|
578
625
|
|
|
626
|
+
/* Caller-controlled "transforming" overlay (avatar swap, voice swap, etc.).
|
|
627
|
+
Wins over every other overlay in the expanded surface — z-index sits
|
|
628
|
+
above the connecting/gesture overlays (4) and the local PIP (5) so the
|
|
629
|
+
caller-driven status takes priority while the swap is in flight. */
|
|
630
|
+
.ll-expanded__overlay--transforming {
|
|
631
|
+
z-index: 20;
|
|
632
|
+
background: rgba(0, 0, 0, 0.45);
|
|
633
|
+
}
|
|
634
|
+
|
|
579
635
|
.ll-expanded__overlay-text {
|
|
580
636
|
margin: 0;
|
|
581
637
|
font-size: 13px;
|
|
@@ -1369,6 +1425,47 @@
|
|
|
1369
1425
|
background: none;
|
|
1370
1426
|
}
|
|
1371
1427
|
|
|
1428
|
+
/* ── OverflowPopover ─────────────────────────────────────────── */
|
|
1429
|
+
|
|
1430
|
+
/* Floating panel anchored above the ••• trigger button. Sits inside
|
|
1431
|
+
the same offsetParent as the toolbar — no portal needed. */
|
|
1432
|
+
.ll-overflow-popover {
|
|
1433
|
+
min-width: 160px;
|
|
1434
|
+
padding: 6px;
|
|
1435
|
+
border-radius: 12px;
|
|
1436
|
+
border: 1px solid rgba(255, 255, 255, 0.14);
|
|
1437
|
+
background: rgba(0, 0, 0, 0.85);
|
|
1438
|
+
-webkit-backdrop-filter: blur(20px);
|
|
1439
|
+
backdrop-filter: blur(20px);
|
|
1440
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45), 0 2px 6px rgba(0, 0, 0, 0.3);
|
|
1441
|
+
color: #fff;
|
|
1442
|
+
z-index: 4;
|
|
1443
|
+
}
|
|
1444
|
+
|
|
1445
|
+
/* Full-width row buttons inside the popover. */
|
|
1446
|
+
.ll-overflow-popover__item {
|
|
1447
|
+
display: flex;
|
|
1448
|
+
align-items: center;
|
|
1449
|
+
gap: 10px;
|
|
1450
|
+
width: 100%;
|
|
1451
|
+
padding: 8px 12px;
|
|
1452
|
+
border-radius: 8px;
|
|
1453
|
+
border: none;
|
|
1454
|
+
background: transparent;
|
|
1455
|
+
color: rgba(255, 255, 255, 0.85);
|
|
1456
|
+
font-family: inherit;
|
|
1457
|
+
font-size: 13px;
|
|
1458
|
+
line-height: 1.4;
|
|
1459
|
+
text-align: left;
|
|
1460
|
+
cursor: pointer;
|
|
1461
|
+
transition: background 0.12s ease, color 0.12s ease;
|
|
1462
|
+
}
|
|
1463
|
+
|
|
1464
|
+
.ll-overflow-popover__item:hover {
|
|
1465
|
+
background: rgba(255, 255, 255, 0.1);
|
|
1466
|
+
color: #fff;
|
|
1467
|
+
}
|
|
1468
|
+
|
|
1372
1469
|
/* ── Focus rings (accessibility) ─────────────────────────────── */
|
|
1373
1470
|
|
|
1374
1471
|
.ll-widget button:focus-visible,
|
|
@@ -1377,3 +1474,95 @@
|
|
|
1377
1474
|
outline: 2px solid var(--ll-color-primary);
|
|
1378
1475
|
outline-offset: 2px;
|
|
1379
1476
|
}
|
|
1477
|
+
|
|
1478
|
+
/* ── Compact toolbar (3-button) ────────────────────────────
|
|
1479
|
+
Used when compactControls=true. Renders mic | ••• | end-call,
|
|
1480
|
+
with secondary controls tucked behind the OverflowPopover. */
|
|
1481
|
+
.ll-toolbar--compact {
|
|
1482
|
+
gap: 12px; /* roomier than the standard toolbar's 4px since only 3 buttons */
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
/* ── Overflow popover items: language pill ─────────────────
|
|
1486
|
+
The disabled "EN English" row needs a subtle code badge; matches the
|
|
1487
|
+
compact language pill style used in the regular topbar. */
|
|
1488
|
+
.ll-overflow-popover__item:disabled {
|
|
1489
|
+
cursor: default;
|
|
1490
|
+
opacity: 0.7;
|
|
1491
|
+
}
|
|
1492
|
+
.ll-overflow-popover__lang-code {
|
|
1493
|
+
display: inline-flex;
|
|
1494
|
+
align-items: center;
|
|
1495
|
+
justify-content: center;
|
|
1496
|
+
width: 24px;
|
|
1497
|
+
height: 18px;
|
|
1498
|
+
border-radius: 4px;
|
|
1499
|
+
background: rgba(255, 255, 255, 0.15);
|
|
1500
|
+
color: rgba(255, 255, 255, 0.95);
|
|
1501
|
+
font-size: 10px;
|
|
1502
|
+
font-weight: 600;
|
|
1503
|
+
letter-spacing: 0.04em;
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1506
|
+
/* Item glyphs (svg) sit at the start of the row. */
|
|
1507
|
+
.ll-overflow-popover__item > svg {
|
|
1508
|
+
width: 16px;
|
|
1509
|
+
height: 16px;
|
|
1510
|
+
flex-shrink: 0;
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1513
|
+
/* When `is-on`, item gets the same treatment as `.ll-tool.is-on` —
|
|
1514
|
+
subtle white background to indicate the toggle is active. */
|
|
1515
|
+
.ll-overflow-popover__item.is-on {
|
|
1516
|
+
background: rgba(255, 255, 255, 0.16);
|
|
1517
|
+
color: #fff;
|
|
1518
|
+
}
|
|
1519
|
+
|
|
1520
|
+
/* ── Compact status pill ───────────────────────────────────────────────
|
|
1521
|
+
Tiny live-state indicator at top-left of the avatar when the
|
|
1522
|
+
topbar is hidden in compact mode. Pulses when speaking/listening
|
|
1523
|
+
so it reads as "live" without taking screen real estate. */
|
|
1524
|
+
.ll-compact-status {
|
|
1525
|
+
position: absolute;
|
|
1526
|
+
top: 12px;
|
|
1527
|
+
left: 12px;
|
|
1528
|
+
z-index: 3;
|
|
1529
|
+
display: inline-flex;
|
|
1530
|
+
align-items: center;
|
|
1531
|
+
gap: 6px;
|
|
1532
|
+
padding: 4px 10px;
|
|
1533
|
+
border-radius: 999px;
|
|
1534
|
+
background: rgba(0, 0, 0, 0.55);
|
|
1535
|
+
-webkit-backdrop-filter: blur(20px);
|
|
1536
|
+
backdrop-filter: blur(20px);
|
|
1537
|
+
color: rgba(255, 255, 255, 0.95);
|
|
1538
|
+
font-size: 11px;
|
|
1539
|
+
font-weight: 500;
|
|
1540
|
+
letter-spacing: 0.02em;
|
|
1541
|
+
text-transform: lowercase;
|
|
1542
|
+
pointer-events: none;
|
|
1543
|
+
}
|
|
1544
|
+
|
|
1545
|
+
.ll-compact-status__dot {
|
|
1546
|
+
width: 6px;
|
|
1547
|
+
height: 6px;
|
|
1548
|
+
border-radius: 999px;
|
|
1549
|
+
background: rgba(255, 255, 255, 0.85);
|
|
1550
|
+
flex-shrink: 0;
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
.ll-compact-status[data-state="listening"] .ll-compact-status__dot {
|
|
1554
|
+
background: #34d399; /* green */
|
|
1555
|
+
animation: ll-pulse 1.4s ease-in-out infinite;
|
|
1556
|
+
}
|
|
1557
|
+
.ll-compact-status[data-state="speaking"] .ll-compact-status__dot {
|
|
1558
|
+
background: #fbbf24; /* amber */
|
|
1559
|
+
}
|
|
1560
|
+
.ll-compact-status[data-state="thinking"] .ll-compact-status__dot {
|
|
1561
|
+
background: #a78bfa; /* violet */
|
|
1562
|
+
animation: ll-pulse 1.4s ease-in-out infinite;
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
@keyframes ll-pulse {
|
|
1566
|
+
0%, 100% { opacity: 1; transform: scale(1); }
|
|
1567
|
+
50% { opacity: 0.55; transform: scale(0.7); }
|
|
1568
|
+
}
|
package/package.json
CHANGED