@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/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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livelayer/react",
3
- "version": "0.6.2",
3
+ "version": "0.9.0",
4
4
  "description": "LiveLayer agent widget for React — avatar video, team switching, responsive layouts, full-fidelity embed",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",