@helpway/react 0.17.1 → 0.17.3
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 +18 -2
- package/dist/index.js +1462 -611
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/themed/styles.css +315 -87
package/package.json
CHANGED
package/src/themed/styles.css
CHANGED
|
@@ -41,6 +41,20 @@
|
|
|
41
41
|
padding: 0;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
/* Text takes its colour from the widget, not from the page.
|
|
45
|
+
Outside the script embed's shadow root the widget is ordinary DOM, and a
|
|
46
|
+
host stylesheet's prose rules reach in: Carna's `p strong { color:
|
|
47
|
+
var(--ink-1) }` drew every bold word of an answer in near-black on the
|
|
48
|
+
landing's blue panel (Ali, 2026-10-12: "renklerde sorunlar var"). The
|
|
49
|
+
widget never set a colour on these elements — it expected them to inherit —
|
|
50
|
+
so anything the page said won.
|
|
51
|
+
`:where()` keeps this at one class of specificity: it beats a host's
|
|
52
|
+
element rules (`strong`, `p strong`, `.x`-less prose) and still loses to
|
|
53
|
+
every widget rule that follows, so no component colour changes. */
|
|
54
|
+
.hw-widget :where(p, li, strong, b, em, i, u, s, small, a, code, pre, blockquote, h1, h2, h3, h4, h5, h6) {
|
|
55
|
+
color: inherit;
|
|
56
|
+
}
|
|
57
|
+
|
|
44
58
|
/* ── Tokens ──────────────────────────────────────
|
|
45
59
|
Wrapped in :where() so the default token block has zero specificity.
|
|
46
60
|
That way `applyTheme()` (which writes inline styles onto the host
|
|
@@ -1283,6 +1297,14 @@
|
|
|
1283
1297
|
min-width: 0;
|
|
1284
1298
|
scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
|
|
1285
1299
|
scrollbar-width: thin;
|
|
1300
|
+
/* The header has no rule under it and shares the thread's ground, so a
|
|
1301
|
+
message scrolled half out of view was cut along a line nobody could see
|
|
1302
|
+
and looked broken rather than scrolled. The last 12px dissolve instead.
|
|
1303
|
+
12, because the list's own top padding is 16: at rest the first message
|
|
1304
|
+
starts below the fade and is untouched. (The docked placement has had
|
|
1305
|
+
this since it was built, at 16px.) */
|
|
1306
|
+
-webkit-mask-image: linear-gradient(180deg, transparent 0, #000 12px);
|
|
1307
|
+
mask-image: linear-gradient(180deg, transparent 0, #000 12px);
|
|
1286
1308
|
}
|
|
1287
1309
|
|
|
1288
1310
|
.hw-messages::-webkit-scrollbar {
|
|
@@ -1606,19 +1628,36 @@
|
|
|
1606
1628
|
|
|
1607
1629
|
/* ── Streaming cursor ────────────────────── */
|
|
1608
1630
|
|
|
1609
|
-
|
|
1631
|
+
/* Drawn at the end of the last line of the answer: after the last paragraph's
|
|
1632
|
+
text, or the last item of a list that ends it. A code block that ends an
|
|
1633
|
+
answer gets none.
|
|
1634
|
+
|
|
1635
|
+
It fades, it does not switch. The old cursor went from 0.6 to 0 in one step
|
|
1636
|
+
every 0.8s, a hard flash at the end of text that is itself moving. */
|
|
1637
|
+
.hw-msg-bubble--live > span > :last-child:not(ol, ul, pre)::after,
|
|
1638
|
+
.hw-msg-bubble--live > span > :is(ol, ul):last-child > li:last-child::after {
|
|
1639
|
+
content: "";
|
|
1610
1640
|
display: inline-block;
|
|
1611
1641
|
width: 2px;
|
|
1612
1642
|
height: 1em;
|
|
1643
|
+
border-radius: 1px;
|
|
1613
1644
|
background: currentColor;
|
|
1614
|
-
opacity: 0.
|
|
1615
|
-
margin-left:
|
|
1645
|
+
opacity: 0.5;
|
|
1646
|
+
margin-left: 2px;
|
|
1616
1647
|
vertical-align: text-bottom;
|
|
1617
|
-
animation: hw-cursor-
|
|
1648
|
+
animation: hw-cursor-breathe 1.1s ease-in-out infinite;
|
|
1649
|
+
}
|
|
1650
|
+
|
|
1651
|
+
@keyframes hw-cursor-breathe {
|
|
1652
|
+
0%, 100% { opacity: 0.5; }
|
|
1653
|
+
50% { opacity: 0.12; }
|
|
1618
1654
|
}
|
|
1619
1655
|
|
|
1620
|
-
@
|
|
1621
|
-
|
|
1656
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1657
|
+
.hw-msg-bubble--live > span > :last-child:not(ol, ul, pre)::after,
|
|
1658
|
+
.hw-msg-bubble--live > span > :is(ol, ul):last-child > li:last-child::after {
|
|
1659
|
+
animation: none;
|
|
1660
|
+
}
|
|
1622
1661
|
}
|
|
1623
1662
|
|
|
1624
1663
|
/* ── Link preview card ───────────────────── */
|
|
@@ -1645,6 +1684,10 @@
|
|
|
1645
1684
|
color: inherit;
|
|
1646
1685
|
margin-top: 6px;
|
|
1647
1686
|
transition: background 0.15s;
|
|
1687
|
+
/* A card you can hit with a thumb, even when it is a title and nothing else. */
|
|
1688
|
+
min-height: 44px;
|
|
1689
|
+
max-width: 100%;
|
|
1690
|
+
text-align: start;
|
|
1648
1691
|
}
|
|
1649
1692
|
|
|
1650
1693
|
.hw-link-preview:hover {
|
|
@@ -1676,9 +1719,29 @@
|
|
|
1676
1719
|
}
|
|
1677
1720
|
|
|
1678
1721
|
.hw-link-preview-favicon {
|
|
1679
|
-
width:
|
|
1680
|
-
height:
|
|
1681
|
-
|
|
1722
|
+
width: 14px;
|
|
1723
|
+
height: 14px;
|
|
1724
|
+
flex: 0 0 14px;
|
|
1725
|
+
border-radius: 3px;
|
|
1726
|
+
}
|
|
1727
|
+
/* On glass the site's mark is somebody else's colour on ours: Carna's blue
|
|
1728
|
+
knot on the blue panel was a smudge. A small white chip under it, the way a
|
|
1729
|
+
browser tab holds a favicon. White and not a token on purpose: a favicon is
|
|
1730
|
+
drawn for a light ground, whatever the panel around it is. */
|
|
1731
|
+
.hw-widget[data-hw-placement="docked"] .hw-link-preview-favicon {
|
|
1732
|
+
box-sizing: content-box;
|
|
1733
|
+
padding: 2px;
|
|
1734
|
+
background: #ffffff;
|
|
1735
|
+
}
|
|
1736
|
+
|
|
1737
|
+
.hw-link-preview-host {
|
|
1738
|
+
/* A hostname reads left to right in every language. It WRAPS and is never
|
|
1739
|
+
cut here: the end of a host is what says whose site it is, and an
|
|
1740
|
+
ellipsis there would hide it (link-preview.ts shortens it from the start). */
|
|
1741
|
+
direction: ltr;
|
|
1742
|
+
min-width: 0;
|
|
1743
|
+
overflow-wrap: anywhere;
|
|
1744
|
+
word-break: break-all;
|
|
1682
1745
|
}
|
|
1683
1746
|
|
|
1684
1747
|
.hw-link-preview-title {
|
|
@@ -1694,6 +1757,8 @@
|
|
|
1694
1757
|
-webkit-line-clamp: 2;
|
|
1695
1758
|
-webkit-box-orient: vertical;
|
|
1696
1759
|
overflow: hidden;
|
|
1760
|
+
/* A title with no spaces (a URL, a hash) breaks instead of widening the card. */
|
|
1761
|
+
overflow-wrap: anywhere;
|
|
1697
1762
|
}
|
|
1698
1763
|
|
|
1699
1764
|
.hw-link-preview-desc {
|
|
@@ -1704,9 +1769,15 @@
|
|
|
1704
1769
|
-webkit-line-clamp: 2;
|
|
1705
1770
|
-webkit-box-orient: vertical;
|
|
1706
1771
|
overflow: hidden;
|
|
1772
|
+
overflow-wrap: anywhere;
|
|
1707
1773
|
}
|
|
1708
1774
|
|
|
1709
1775
|
.hw-link-preview-url {
|
|
1776
|
+
/* The site, first: a small mark and the host on one quiet line. */
|
|
1777
|
+
display: flex;
|
|
1778
|
+
align-items: center;
|
|
1779
|
+
gap: 6px;
|
|
1780
|
+
min-width: 0;
|
|
1710
1781
|
font-size: 11px;
|
|
1711
1782
|
/* --hw-text-muted is referenced in seven rules and defined in none, so every
|
|
1712
1783
|
one of them silently falls back to a hardcoded grey and stops following
|
|
@@ -2582,22 +2653,6 @@
|
|
|
2582
2653
|
color: var(--hw-text-2);
|
|
2583
2654
|
}
|
|
2584
2655
|
|
|
2585
|
-
/* ════════════════════════════════════════════════
|
|
2586
|
-
RESOLVED BANNER
|
|
2587
|
-
════════════════════════════════════════════════ */
|
|
2588
|
-
|
|
2589
|
-
.hw-resolved-banner {
|
|
2590
|
-
display: flex;
|
|
2591
|
-
align-items: center;
|
|
2592
|
-
justify-content: center;
|
|
2593
|
-
padding: 12px 16px;
|
|
2594
|
-
border-top: 1px solid var(--hw-border);
|
|
2595
|
-
background: var(--hw-bg-subtle);
|
|
2596
|
-
color: var(--hw-text-2);
|
|
2597
|
-
font-size: 13px;
|
|
2598
|
-
flex-shrink: 0;
|
|
2599
|
-
}
|
|
2600
|
-
|
|
2601
2656
|
/* ════════════════════════════════════════════════
|
|
2602
2657
|
NEW CONVERSATION FORM
|
|
2603
2658
|
════════════════════════════════════════════════ */
|
|
@@ -4030,6 +4085,31 @@
|
|
|
4030
4085
|
currentColor, so it inherits the row's measured ink instead of carrying a
|
|
4031
4086
|
second colour decision. The 3/4 arc uses `transparent` rather than color-mix:
|
|
4032
4087
|
this bundle runs on whatever browser a customer's visitor brought. */
|
|
4088
|
+
/* The one action of the "lost" state. Text-weight, not a pill: the band stays
|
|
4089
|
+
a band. Underlined so it reads as pressable without a colour of its own —
|
|
4090
|
+
it takes the panel's ink, which holds on glass and on any brand surface. */
|
|
4091
|
+
.hw-disconnect-retry {
|
|
4092
|
+
flex: none;
|
|
4093
|
+
padding: 2px 4px;
|
|
4094
|
+
margin: -2px 0;
|
|
4095
|
+
border: 0;
|
|
4096
|
+
border-radius: 4px;
|
|
4097
|
+
background: none;
|
|
4098
|
+
color: var(--hw-text);
|
|
4099
|
+
font: inherit;
|
|
4100
|
+
font-weight: 600;
|
|
4101
|
+
text-decoration: underline;
|
|
4102
|
+
text-underline-offset: 2px;
|
|
4103
|
+
cursor: pointer;
|
|
4104
|
+
}
|
|
4105
|
+
.hw-disconnect-retry:hover {
|
|
4106
|
+
text-decoration-thickness: 2px;
|
|
4107
|
+
}
|
|
4108
|
+
.hw-disconnect-retry:focus-visible {
|
|
4109
|
+
outline: 2px solid var(--hw-text);
|
|
4110
|
+
outline-offset: 1px;
|
|
4111
|
+
}
|
|
4112
|
+
|
|
4033
4113
|
.hw-disconnect-spinner {
|
|
4034
4114
|
width: 9px;
|
|
4035
4115
|
height: 9px;
|
|
@@ -4146,94 +4226,98 @@
|
|
|
4146
4226
|
}
|
|
4147
4227
|
|
|
4148
4228
|
/* ════════════════════════════════════════════════
|
|
4149
|
-
RESOLVED CONVERSATION —
|
|
4229
|
+
RESOLVED CONVERSATION — STATUS + RATING
|
|
4230
|
+
One status row, then the rating on a single line. Every colour is a
|
|
4231
|
+
token: the block has no tone of its own, and the brand colour only
|
|
4232
|
+
edges the pressed option — it never sits behind or under the text, so
|
|
4233
|
+
contrast does not depend on what the customer picked.
|
|
4234
|
+
(DESIGN-DECISIONS rule/widget-resolved-block)
|
|
4150
4235
|
════════════════════════════════════════════════ */
|
|
4151
4236
|
|
|
4152
4237
|
.hw-resolved {
|
|
4153
4238
|
display: flex;
|
|
4154
4239
|
flex-direction: column;
|
|
4155
|
-
|
|
4156
|
-
|
|
4157
|
-
padding: 16px 20px;
|
|
4240
|
+
gap: 8px;
|
|
4241
|
+
padding: 10px 14px;
|
|
4158
4242
|
border-top: 1px solid var(--hw-border);
|
|
4159
4243
|
flex-shrink: 0;
|
|
4160
4244
|
}
|
|
4161
4245
|
|
|
4162
|
-
.hw-resolved-
|
|
4163
|
-
font-size: 13px;
|
|
4164
|
-
color: var(--hw-text-3);
|
|
4165
|
-
font-weight: 500;
|
|
4166
|
-
}
|
|
4167
|
-
|
|
4168
|
-
.hw-resolved-actions {
|
|
4246
|
+
.hw-resolved-status {
|
|
4169
4247
|
display: flex;
|
|
4170
|
-
|
|
4171
|
-
|
|
4172
|
-
|
|
4173
|
-
|
|
4174
|
-
padding: 6px 16px;
|
|
4175
|
-
border: 1px solid var(--hw-border-md);
|
|
4176
|
-
border-radius: 8px;
|
|
4177
|
-
background: var(--hw-bg);
|
|
4248
|
+
align-items: center;
|
|
4249
|
+
gap: 6px;
|
|
4250
|
+
font-size: 12.5px;
|
|
4251
|
+
font-weight: 550;
|
|
4178
4252
|
color: var(--hw-text);
|
|
4179
|
-
font-size: 13px;
|
|
4180
|
-
font-weight: 500;
|
|
4181
|
-
cursor: pointer;
|
|
4182
|
-
transition: background 0.15s;
|
|
4183
4253
|
}
|
|
4184
4254
|
|
|
4185
|
-
.hw-resolved-
|
|
4186
|
-
|
|
4255
|
+
.hw-resolved-status svg {
|
|
4256
|
+
flex: none;
|
|
4257
|
+
color: var(--hw-text-2);
|
|
4187
4258
|
}
|
|
4188
4259
|
|
|
4189
|
-
/* CSAT Rating */
|
|
4190
4260
|
.hw-csat {
|
|
4191
4261
|
display: flex;
|
|
4192
|
-
flex-direction: column;
|
|
4193
4262
|
align-items: center;
|
|
4194
|
-
|
|
4263
|
+
justify-content: space-between;
|
|
4264
|
+
flex-wrap: wrap;
|
|
4265
|
+
gap: 6px 10px;
|
|
4195
4266
|
}
|
|
4196
4267
|
|
|
4197
|
-
|
|
4268
|
+
/* text-2, not text-3: at 12px text-3 is under 4.5:1 on both surfaces (the
|
|
4269
|
+
same measurement as .hw-msg-meta). */
|
|
4270
|
+
.hw-csat-label,
|
|
4271
|
+
.hw-csat-error {
|
|
4198
4272
|
font-size: 12px;
|
|
4199
|
-
color: var(--hw-text-
|
|
4273
|
+
color: var(--hw-text-2);
|
|
4274
|
+
}
|
|
4275
|
+
|
|
4276
|
+
.hw-csat-error {
|
|
4277
|
+
color: var(--hw-text);
|
|
4200
4278
|
}
|
|
4201
4279
|
|
|
4202
4280
|
.hw-csat-buttons {
|
|
4203
4281
|
display: flex;
|
|
4204
|
-
gap:
|
|
4282
|
+
gap: 6px;
|
|
4205
4283
|
}
|
|
4206
4284
|
|
|
4207
4285
|
.hw-csat-btn {
|
|
4208
|
-
|
|
4209
|
-
|
|
4286
|
+
display: inline-flex;
|
|
4287
|
+
align-items: center;
|
|
4288
|
+
gap: 5px;
|
|
4289
|
+
height: 30px;
|
|
4290
|
+
padding: 0 11px;
|
|
4210
4291
|
border: 1px solid var(--hw-border-md);
|
|
4211
|
-
border-radius:
|
|
4292
|
+
border-radius: 999px;
|
|
4212
4293
|
background: var(--hw-bg);
|
|
4294
|
+
color: var(--hw-text);
|
|
4295
|
+
font: inherit;
|
|
4296
|
+
font-size: 12px;
|
|
4297
|
+
font-weight: 550;
|
|
4213
4298
|
cursor: pointer;
|
|
4214
|
-
|
|
4215
|
-
align-items: center;
|
|
4216
|
-
justify-content: center;
|
|
4217
|
-
font-size: 18px;
|
|
4218
|
-
transition: transform 0.15s, border-color 0.15s, background 0.15s;
|
|
4299
|
+
transition: background 0.15s, border-color 0.15s;
|
|
4219
4300
|
}
|
|
4220
4301
|
|
|
4221
|
-
.hw-csat-btn
|
|
4222
|
-
|
|
4223
|
-
border-color: var(--hw-text-3);
|
|
4302
|
+
.hw-csat-btn svg {
|
|
4303
|
+
flex: none;
|
|
4224
4304
|
}
|
|
4225
4305
|
|
|
4226
|
-
.hw-csat-btn
|
|
4227
|
-
border-color: var(--hw-primary);
|
|
4306
|
+
.hw-csat-btn:hover {
|
|
4228
4307
|
background: var(--hw-bg-hover);
|
|
4229
|
-
transform: scale(1.15);
|
|
4230
4308
|
}
|
|
4231
4309
|
|
|
4232
|
-
.hw-csat-
|
|
4233
|
-
|
|
4234
|
-
|
|
4235
|
-
|
|
4236
|
-
|
|
4310
|
+
.hw-csat-btn:focus-visible {
|
|
4311
|
+
outline: 2px solid var(--hw-text);
|
|
4312
|
+
outline-offset: 2px;
|
|
4313
|
+
}
|
|
4314
|
+
|
|
4315
|
+
/* The answer, kept. Pressed and read-only: the server takes one rating. */
|
|
4316
|
+
.hw-csat-btn[aria-pressed="true"] {
|
|
4317
|
+
background: var(--hw-bg-hover);
|
|
4318
|
+
border-color: var(--hw-brand, var(--hw-primary));
|
|
4319
|
+
box-shadow: inset 0 0 0 1px var(--hw-brand, var(--hw-primary));
|
|
4320
|
+
cursor: default;
|
|
4237
4321
|
}
|
|
4238
4322
|
|
|
4239
4323
|
/* ════════════════════════════════════════════════
|
|
@@ -4594,16 +4678,6 @@
|
|
|
4594
4678
|
color: #f87171;
|
|
4595
4679
|
}
|
|
4596
4680
|
|
|
4597
|
-
.hw-resolved {
|
|
4598
|
-
border-color: var(--hw-border);
|
|
4599
|
-
}
|
|
4600
|
-
|
|
4601
|
-
.hw-resolved-reopen,
|
|
4602
|
-
.hw-csat-btn {
|
|
4603
|
-
background: var(--hw-bg-hover);
|
|
4604
|
-
border-color: var(--hw-border-md);
|
|
4605
|
-
color: var(--hw-text);
|
|
4606
|
-
}
|
|
4607
4681
|
|
|
4608
4682
|
.hw-hover-preview {
|
|
4609
4683
|
background: #1c1c1e;
|
|
@@ -5748,18 +5822,30 @@
|
|
|
5748
5822
|
|
|
5749
5823
|
/* Sources. A numbered row per entry rather than a card — the answer is the
|
|
5750
5824
|
content, these are the receipts, and receipts should be quiet. */
|
|
5751
|
-
|
|
5825
|
+
/* Attached to the answer they belong to. They sat 8px under the bubble and
|
|
5826
|
+
10px in, so the number lined up with neither the bubble's edge nor its
|
|
5827
|
+
text, and the row read as a separate thing floating above the name line
|
|
5828
|
+
(Ali, 2026-10-12). 4px under it now, and the number starts where the
|
|
5829
|
+
bubble's text starts: 14px in, the bubble's own padding. */
|
|
5830
|
+
.hw-sources { display: flex; flex-direction: column; gap: 2px; margin-top: 4px; }
|
|
5752
5831
|
.hw-source {
|
|
5753
5832
|
display: flex;
|
|
5754
5833
|
align-items: center;
|
|
5755
5834
|
gap: 9px;
|
|
5756
|
-
padding:
|
|
5835
|
+
padding: 5px 14px;
|
|
5757
5836
|
border-radius: 9px;
|
|
5758
5837
|
background: transparent;
|
|
5759
5838
|
color: var(--hw-text);
|
|
5760
5839
|
text-decoration: none;
|
|
5761
5840
|
transition: background 0.15s;
|
|
5762
5841
|
}
|
|
5842
|
+
/* In the docked placement an answer has no bubble and its text starts at the
|
|
5843
|
+
column's edge, so the number does too. The hover ground still gets its 8px
|
|
5844
|
+
of air: it is pulled out by the same amount it is padded. */
|
|
5845
|
+
.hw-widget[data-hw-placement="docked"] .hw-source {
|
|
5846
|
+
margin-inline: -8px;
|
|
5847
|
+
padding-inline: 8px;
|
|
5848
|
+
}
|
|
5763
5849
|
a.hw-source { cursor: pointer; }
|
|
5764
5850
|
a.hw-source:hover { background: var(--hw-bg-hover); }
|
|
5765
5851
|
.hw-source-n {
|
|
@@ -5784,3 +5870,145 @@ a.hw-source:hover { background: var(--hw-bg-hover); }
|
|
|
5784
5870
|
text-overflow: ellipsis;
|
|
5785
5871
|
white-space: nowrap;
|
|
5786
5872
|
}
|
|
5873
|
+
|
|
5874
|
+
/* ── Docked, brand surface ─────────────────────────────────────────────────
|
|
5875
|
+
`theme.dockSurface: "brand"`: the panel, the bar under it and the reply
|
|
5876
|
+
preview are filled with the customer's colour instead of neutral glass.
|
|
5877
|
+
|
|
5878
|
+
Everything here is built from four values that `applyTheme` writes on the
|
|
5879
|
+
host from the brand colour (widget-core dock-ink.ts): the tint, the ink
|
|
5880
|
+
chosen for it, the shade (the far end from the ink) and the quiet inks. Two
|
|
5881
|
+
rules, and both are tested there for 4,096 colours:
|
|
5882
|
+
|
|
5883
|
+
- text is the ink, and the ink clears 4.5:1 on the tint;
|
|
5884
|
+
- the surface only moves toward the SHADE, never toward the ink, so the
|
|
5885
|
+
tint itself is the worst ground any text meets.
|
|
5886
|
+
|
|
5887
|
+
That second rule is why the light patch at the top right is the tint and
|
|
5888
|
+
the rest settles away from it. A patch lifted toward white under white
|
|
5889
|
+
text is how body copy fell to 2.9:1 on the first brand panel.
|
|
5890
|
+
|
|
5891
|
+
The fallbacks (white ink on --hw-primary) are what the panel does when the
|
|
5892
|
+
colour could not be read: a named colour, oklch(), a var(). */
|
|
5893
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] {
|
|
5894
|
+
--hw-dock-tint: var(--hw-primary);
|
|
5895
|
+
--hw-dock-ink: #ffffff;
|
|
5896
|
+
--hw-dock-shade: #000000;
|
|
5897
|
+
--hw-dock-wash: var(--hw-dock-shade);
|
|
5898
|
+
--hw-dock-ink-2: color-mix(in srgb, var(--hw-dock-ink) 86%, var(--hw-dock-tint));
|
|
5899
|
+
--hw-dock-ink-3: color-mix(in srgb, var(--hw-dock-ink) 78%, var(--hw-dock-tint));
|
|
5900
|
+
--hw-dock-ink-4: color-mix(in srgb, var(--hw-dock-ink) 60%, var(--hw-dock-tint));
|
|
5901
|
+
--hw-dock-pill-bg: var(--hw-dock-tint);
|
|
5902
|
+
--hw-dock-pill-fg: var(--hw-dock-ink);
|
|
5903
|
+
--hw-dock-pill-border: color-mix(in srgb, var(--hw-dock-ink) 30%, transparent);
|
|
5904
|
+
}
|
|
5905
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] :is(.hw-window, .hw-dock-bar, .hw-preview) {
|
|
5906
|
+
--hw-text: var(--hw-dock-ink);
|
|
5907
|
+
--hw-text-1: var(--hw-dock-ink);
|
|
5908
|
+
--hw-text-2: var(--hw-dock-ink-2);
|
|
5909
|
+
--hw-text-3: var(--hw-dock-ink-3);
|
|
5910
|
+
--hw-text-4: var(--hw-dock-ink-4);
|
|
5911
|
+
--hw-text-muted: var(--hw-dock-ink-2);
|
|
5912
|
+
--hw-bg: color-mix(in srgb, var(--hw-dock-wash) 12%, transparent);
|
|
5913
|
+
--hw-bg-subtle: transparent;
|
|
5914
|
+
--hw-bg-hover: color-mix(in srgb, var(--hw-dock-wash) 18%, transparent);
|
|
5915
|
+
--hw-border: color-mix(in srgb, var(--hw-dock-ink) 22%, transparent);
|
|
5916
|
+
--hw-border-md: color-mix(in srgb, var(--hw-dock-ink) 34%, transparent);
|
|
5917
|
+
--hw-focus-border: color-mix(in srgb, var(--hw-dock-ink) 60%, transparent);
|
|
5918
|
+
--hw-focus-ring: color-mix(in srgb, var(--hw-dock-ink) 18%, transparent);
|
|
5919
|
+
/* The agent's bubble (the token is misnamed) is unboxed in this placement;
|
|
5920
|
+
where it does show, it is a wash, with the ink on it. */
|
|
5921
|
+
--hw-visitor-bubble-bg: color-mix(in srgb, var(--hw-dock-wash) 14%, transparent);
|
|
5922
|
+
--hw-visitor-bubble-text: var(--hw-dock-ink);
|
|
5923
|
+
/* A solid object on the brand surface is the inverse pair: ink ground,
|
|
5924
|
+
brand-coloured text. Same two colours as the body text, same ratio. */
|
|
5925
|
+
--hw-primary: var(--hw-dock-ink);
|
|
5926
|
+
--hw-primary-hover: var(--hw-dock-ink);
|
|
5927
|
+
--hw-brand: var(--hw-dock-ink);
|
|
5928
|
+
--hw-on-brand: var(--hw-dock-tint);
|
|
5929
|
+
--hw-dock-surface: transparent;
|
|
5930
|
+
--hw-dock-on-surface: var(--hw-dock-ink);
|
|
5931
|
+
color: var(--hw-dock-ink);
|
|
5932
|
+
background:
|
|
5933
|
+
radial-gradient(70% 60% at 86% 8%, var(--hw-dock-tint), transparent 64%),
|
|
5934
|
+
linear-gradient(
|
|
5935
|
+
165deg,
|
|
5936
|
+
color-mix(in srgb, var(--hw-dock-shade) 12%, var(--hw-dock-tint)) 0%,
|
|
5937
|
+
color-mix(in srgb, var(--hw-dock-shade) 30%, var(--hw-dock-tint)) 100%
|
|
5938
|
+
);
|
|
5939
|
+
backdrop-filter: none;
|
|
5940
|
+
-webkit-backdrop-filter: none;
|
|
5941
|
+
box-shadow:
|
|
5942
|
+
0 24px 60px -20px rgba(12, 11, 10, 0.5),
|
|
5943
|
+
inset 0 0 0 1px color-mix(in srgb, var(--hw-dock-ink) 16%, transparent);
|
|
5944
|
+
}
|
|
5945
|
+
/* The visitor's own message. A 16%-white pill on the panel measured 1.49:1
|
|
5946
|
+
against it — it was nearly not there. It is the solid object of the thread. */
|
|
5947
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] .hw-msg--visitor .hw-msg-bubble {
|
|
5948
|
+
background: var(--hw-dock-ink);
|
|
5949
|
+
color: var(--hw-dock-tint);
|
|
5950
|
+
}
|
|
5951
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] .hw-msg--visitor .hw-msg-bubble a,
|
|
5952
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] .hw-msg--visitor .hw-msg-bubble a:hover {
|
|
5953
|
+
color: inherit;
|
|
5954
|
+
}
|
|
5955
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"]
|
|
5956
|
+
:is(
|
|
5957
|
+
.hw-dock-send:not(:disabled),
|
|
5958
|
+
.hw-quick-reply-btn,
|
|
5959
|
+
.hw-quick-reply-btn:hover:not(:disabled),
|
|
5960
|
+
.hw-email-card-submit,
|
|
5961
|
+
.hw-offer,
|
|
5962
|
+
.hw-offer:hover
|
|
5963
|
+
) {
|
|
5964
|
+
background: var(--hw-dock-ink);
|
|
5965
|
+
color: var(--hw-dock-tint);
|
|
5966
|
+
}
|
|
5967
|
+
/* Places the glass block wrote white by hand. They take the ink. */
|
|
5968
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"]
|
|
5969
|
+
:is(
|
|
5970
|
+
.hw-preview-body,
|
|
5971
|
+
.hw-header-close:hover,
|
|
5972
|
+
.hw-header-menu-btn:hover,
|
|
5973
|
+
.hw-preview-close:hover,
|
|
5974
|
+
.hw-quick-reply-btn[data-tapped="true"]
|
|
5975
|
+
) {
|
|
5976
|
+
color: var(--hw-dock-ink);
|
|
5977
|
+
}
|
|
5978
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] :is(.hw-preview-close, .hw-preview-footer) {
|
|
5979
|
+
color: var(--hw-dock-ink-2);
|
|
5980
|
+
}
|
|
5981
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] .hw-quick-reply-btn[data-tapped="true"] {
|
|
5982
|
+
background: color-mix(in srgb, var(--hw-dock-wash) 22%, transparent);
|
|
5983
|
+
}
|
|
5984
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] .hw-window :focus-visible {
|
|
5985
|
+
outline-color: var(--hw-dock-ink);
|
|
5986
|
+
}
|
|
5987
|
+
/* Code and the email row sat on a black wash. Under dark ink that is the
|
|
5988
|
+
wrong direction; the shade is always the right one. */
|
|
5989
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] .hw-msg-bubble :is(pre, code),
|
|
5990
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] .hw-email-card-row {
|
|
5991
|
+
background: color-mix(in srgb, var(--hw-dock-shade) 26%, transparent);
|
|
5992
|
+
}
|
|
5993
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] .hw-header-menu {
|
|
5994
|
+
background: color-mix(in srgb, var(--hw-dock-shade) 34%, var(--hw-dock-tint));
|
|
5995
|
+
color: var(--hw-dock-ink);
|
|
5996
|
+
}
|
|
5997
|
+
/* Initials are a solid object too. A 12%-white disc with white letters is a
|
|
5998
|
+
faint ring on a brand colour, and nothing at all on a light one. */
|
|
5999
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] :is(.hw-header-bot-icon--team, .hw-event-avatar) {
|
|
6000
|
+
background: var(--hw-dock-ink);
|
|
6001
|
+
color: var(--hw-dock-tint);
|
|
6002
|
+
}
|
|
6003
|
+
/* The bar's placeholder is an instruction ("Reply to reopen…"), so it is
|
|
6004
|
+
held to the text floor, not to the 45% a hint gets on glass. */
|
|
6005
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] .hw-dock-input::placeholder {
|
|
6006
|
+
color: var(--hw-dock-ink-3);
|
|
6007
|
+
}
|
|
6008
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] .hw-typing-dot {
|
|
6009
|
+
background: var(--hw-dock-ink-2);
|
|
6010
|
+
}
|
|
6011
|
+
.hw-widget[data-hw-placement="docked"][data-hw-dock-surface="brand"] .hw-disconnect {
|
|
6012
|
+
background: color-mix(in srgb, var(--hw-dock-shade) 16%, transparent);
|
|
6013
|
+
color: var(--hw-dock-ink-2);
|
|
6014
|
+
}
|