@visns-studio/visns-components 6.21.0 → 6.23.1

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.
@@ -234,6 +234,15 @@ $sms-mono: 'SFMono-Regular', 'Menlo', 'Consolas', monospace;
234
234
  }
235
235
  }
236
236
 
237
+ // A ghost button that is currently ON — the Select toggle while the timeline is
238
+ // in picking mode. Tinted rather than filled: it is a mode, not the pane's
239
+ // primary action.
240
+ .ghostButtonOn {
241
+ border-color: var(--s-primary);
242
+ background: var(--s-tint);
243
+ color: var(--s-primary);
244
+ }
245
+
237
246
  .iconButton {
238
247
  @include sms-reset;
239
248
  @include sms-focus;
@@ -1521,6 +1530,101 @@ $sms-mono: 'SFMono-Regular', 'Menlo', 'Consolas', monospace;
1521
1530
  font-weight: 600;
1522
1531
  }
1523
1532
 
1533
+ // --------------------------------------------------- picking and annotations
1534
+ //
1535
+ // Both are off unless the host asked for them: `.pickRow` only ever wraps a
1536
+ // bubble while the panel is in Select mode, and `.annotations` renders only
1537
+ // where the host supplied chips.
1538
+
1539
+ // The whole row is the hit target while picking. The checkbox sits on the
1540
+ // bubble's own side of the pane so the ticks line up down one margin rather
1541
+ // than zig-zagging with the conversation.
1542
+ .pickRow {
1543
+ display: flex;
1544
+ gap: 0.5rem;
1545
+ align-items: center;
1546
+ max-width: 100%;
1547
+ padding: 0.15rem 0.25rem;
1548
+ border: 1px solid transparent;
1549
+ border-radius: 14px;
1550
+ cursor: pointer;
1551
+
1552
+ &:hover {
1553
+ background: var(--s-hover);
1554
+ }
1555
+ }
1556
+
1557
+ .bubbleOut .pickRow {
1558
+ flex-direction: row-reverse;
1559
+ }
1560
+
1561
+ .pickRowOn {
1562
+ border-color: color-mix(in srgb, var(--s-primary) 45%, transparent);
1563
+ background: var(--s-tint);
1564
+ }
1565
+
1566
+ // A message that has not reached the server yet — nothing to file it against.
1567
+ .pickRowOff {
1568
+ opacity: 0.5;
1569
+ cursor: default;
1570
+
1571
+ &:hover {
1572
+ background: none;
1573
+ }
1574
+ }
1575
+
1576
+ .pickBox {
1577
+ flex-shrink: 0;
1578
+ width: 15px;
1579
+ height: 15px;
1580
+ margin: 0;
1581
+ accent-color: var(--s-primary);
1582
+ cursor: inherit;
1583
+ }
1584
+
1585
+ // Host-supplied chips under a bubble, on the bubble's own side.
1586
+ .annotations {
1587
+ display: flex;
1588
+ flex-wrap: wrap;
1589
+ gap: 0.25rem;
1590
+ max-width: min(60ch, 64%);
1591
+ margin-top: 0.25rem;
1592
+ padding: 0 0.25rem;
1593
+ }
1594
+
1595
+ .bubbleOut .annotations {
1596
+ justify-content: flex-end;
1597
+ }
1598
+
1599
+ .annotation {
1600
+ @include sms-reset;
1601
+
1602
+ display: inline-flex;
1603
+ gap: 0.25rem;
1604
+ align-items: center;
1605
+ max-width: 100%;
1606
+ padding: 0.1rem 0.5rem;
1607
+ border: 1px solid color-mix(in srgb, var(--s-primary) 30%, transparent);
1608
+ border-radius: 999px;
1609
+ background: var(--s-tint);
1610
+ color: var(--s-primary);
1611
+ font-size: 0.7rem;
1612
+ font-weight: 600;
1613
+ text-align: left;
1614
+ overflow-wrap: anywhere;
1615
+ }
1616
+
1617
+ .annotationAction {
1618
+ @include sms-focus;
1619
+
1620
+ cursor: pointer;
1621
+
1622
+ &:hover {
1623
+ border-color: var(--s-primary);
1624
+ background: color-mix(in srgb, var(--s-primary) 16%, var(--s-background));
1625
+ }
1626
+ }
1627
+
1524
1628
  .retryButton {
1525
1629
  @include sms-reset;
1526
1630
  @include sms-focus;
@@ -1599,6 +1703,33 @@ $sms-mono: 'SFMono-Regular', 'Menlo', 'Consolas', monospace;
1599
1703
  background: var(--s-surface);
1600
1704
  }
1601
1705
 
1706
+ // Stands exactly where the composer does while the timeline is being picked
1707
+ // over, so the pane keeps its height and its one footer.
1708
+ .selectBar {
1709
+ display: flex;
1710
+ flex-wrap: wrap;
1711
+ gap: 0.5rem 0.75rem;
1712
+ align-items: center;
1713
+ justify-content: space-between;
1714
+ box-sizing: border-box;
1715
+ padding: 0.6rem 0.7rem 0.7rem;
1716
+ border-top: 1px solid var(--s-line);
1717
+ background: var(--s-surface);
1718
+ }
1719
+
1720
+ .selectCount {
1721
+ color: var(--s-paragraph);
1722
+ font-size: 0.8rem;
1723
+ font-weight: 600;
1724
+ }
1725
+
1726
+ .selectActions {
1727
+ display: inline-flex;
1728
+ gap: 0.5rem;
1729
+ align-items: center;
1730
+ margin-left: auto;
1731
+ }
1732
+
1602
1733
  // One card: the text on top, every control in a bar along its bottom edge.
1603
1734
  // Buttons beside a textarea line up with nothing once the box grows; a bar
1604
1735
  // inside the same border always reads as part of the message being written.
@@ -41,6 +41,11 @@ $vault-mono: 'SFMono-Regular', 'Menlo', 'Consolas', monospace;
41
41
  --v-tint: color-mix(in srgb, var(--v-primary) 12%, var(--v-background));
42
42
  --v-ok: rgb(31, 122, 71);
43
43
  --v-bad: rgb(190, 62, 62);
44
+ // Between the two: something did not happen, and nothing is broken or at
45
+ // risk because of it. Its one user is "the link could not be emailed" —
46
+ // the link itself is fine and on screen right above the line, so painting
47
+ // that in --v-bad would read as "your credential is in trouble".
48
+ --v-warn: rgb(176, 106, 20);
44
49
  }
45
50
 
46
51
  // Undo anything a host may have imposed on a generic element. Applied to every
@@ -1279,6 +1284,74 @@ input.checkControl {
1279
1284
  resize: vertical;
1280
1285
  }
1281
1286
 
1287
+ // ---------------------------------------------------------------------------
1288
+ // Notes: the Formatted / Raw toggle
1289
+ // ---------------------------------------------------------------------------
1290
+ // Notes holding a machine-written JSON backup are READ as a tree (JsonView) and
1291
+ // EDITED as text. Two chips rather than a switch, because a switch has to be
1292
+ // labelled with the state it is not in and there is no good way to word that
1293
+ // here; two chips name both and light the one you are looking at.
1294
+
1295
+ .viewToggle {
1296
+ display: inline-flex;
1297
+ gap: 0.25rem;
1298
+ align-self: flex-start;
1299
+ padding: 0.15rem;
1300
+ border: 1px solid var(--v-line);
1301
+ border-radius: var(--v-btn-br);
1302
+ background: var(--v-surface);
1303
+ }
1304
+
1305
+ .viewChip {
1306
+ @include vault-reset;
1307
+ @include vault-focus;
1308
+
1309
+ display: inline-flex;
1310
+ align-items: center;
1311
+ padding: 0.2rem 0.55rem;
1312
+ border: 1px solid transparent;
1313
+ border-radius: calc(var(--v-btn-br) - 1px);
1314
+ background: none;
1315
+ color: var(--v-muted);
1316
+ font-size: 0.72rem;
1317
+ font-weight: 600;
1318
+ letter-spacing: 0.02em;
1319
+ cursor: pointer;
1320
+
1321
+ &:hover:not(:disabled) {
1322
+ color: var(--v-primary);
1323
+ }
1324
+
1325
+ // Disabled here means "the JSON is broken, so there is nothing to lay
1326
+ // out"; the chip carries a title saying so. Dimmed rather than removed —
1327
+ // a control that disappears takes its own explanation with it.
1328
+ &:disabled {
1329
+ cursor: default;
1330
+ opacity: 0.45;
1331
+ }
1332
+ }
1333
+
1334
+ .viewChipOn {
1335
+ border-color: var(--v-line);
1336
+ background: var(--v-background);
1337
+ color: var(--v-primary);
1338
+ }
1339
+
1340
+ // The tree's container. JsonView declares no height of its own on purpose, so
1341
+ // the cap belongs here: 50vh keeps a 32KB backup scrolling inside the field
1342
+ // instead of pushing Save off the bottom of the dialog.
1343
+ .notesJson {
1344
+ @include vault-focus;
1345
+
1346
+ box-sizing: border-box;
1347
+ max-height: 50vh;
1348
+ padding: 0.5rem 0.6rem;
1349
+ overflow: auto;
1350
+ border: 1px solid var(--v-line);
1351
+ border-radius: var(--v-btn-br);
1352
+ background: var(--v-surface);
1353
+ }
1354
+
1282
1355
  .help {
1283
1356
  margin: 0;
1284
1357
  color: var(--v-muted);
@@ -2312,6 +2385,47 @@ input.checkControl {
2312
2385
  }
2313
2386
  }
2314
2387
 
2388
+ // "Also emailed to dana@acme.example." Quiet, and under the URL rather than
2389
+ // instead of it: the copy-the-link flow is what actually happened, the email is
2390
+ // a convenience on top of it.
2391
+ .shareEmailed {
2392
+ display: flex;
2393
+ gap: 0.35rem;
2394
+ align-items: flex-start;
2395
+ margin: 0;
2396
+ color: var(--v-ok);
2397
+ font-size: 0.78rem;
2398
+ line-height: 1.45;
2399
+
2400
+ svg {
2401
+ flex-shrink: 0;
2402
+ margin-top: 0.15rem;
2403
+ }
2404
+ }
2405
+
2406
+ // The send failed. Louder than the line above, because the sender is about to
2407
+ // close a dialog believing the recipient has the link — but not red: the link
2408
+ // is on screen and copyable, and nothing about the credential is at risk.
2409
+ .shareEmailFailed {
2410
+ display: flex;
2411
+ gap: 0.35rem;
2412
+ align-items: flex-start;
2413
+ margin: 0;
2414
+ padding: 0.5rem 0.6rem;
2415
+ border: 1px solid color-mix(in srgb, var(--v-warn) 40%, transparent);
2416
+ border-radius: var(--v-btn-br);
2417
+ background: color-mix(in srgb, var(--v-warn) 10%, var(--v-background));
2418
+ color: var(--v-warn);
2419
+ font-size: 0.78rem;
2420
+ font-weight: 500;
2421
+ line-height: 1.45;
2422
+
2423
+ svg {
2424
+ flex-shrink: 0;
2425
+ margin-top: 0.15rem;
2426
+ }
2427
+ }
2428
+
2315
2429
  .shareList {
2316
2430
  display: flex;
2317
2431
  flex-direction: column;