fb-slides 0.8.0 → 0.9.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.
- package/CHANGELOG.md +60 -0
- package/README.md +47 -10
- package/lib/assets.mjs +227 -0
- package/lib/config.mjs +11 -2
- package/lib/dev.mjs +5 -4
- package/lib/edit.mjs +15 -2
- package/package.json +1 -1
- package/runtime/assets.js +556 -0
- package/runtime/edit.js +65 -15
- package/runtime/snippets.js +198 -69
- package/runtime/syntax.js +64 -0
- package/runtime/theme.base.css +470 -10
- package/templates/starter/assets/screen_2026_08_05_00_24_16.png +0 -0
package/runtime/theme.base.css
CHANGED
|
@@ -1228,16 +1228,99 @@ body.edit-open #deck-edit { transform: none; }
|
|
|
1228
1228
|
transition: flex-grow 0.25s ease, flex-basis 0.25s ease,
|
|
1229
1229
|
padding 0.25s ease, border-width 0.25s ease;
|
|
1230
1230
|
}
|
|
1231
|
-
|
|
1231
|
+
/* The slide box is the wrapper syntax.js builds around the textarea — or the
|
|
1232
|
+
bare textarea itself, on a deck with no highlight plugin to build one, which
|
|
1233
|
+
is what the child combinator tells apart. */
|
|
1234
|
+
#deck-edit > #deck-edit-source,
|
|
1235
|
+
#deck-edit .deck-edit-code { flex: 1 1 0; }
|
|
1232
1236
|
#deck-edit-notes { flex: 0 0 120px; }
|
|
1233
|
-
#deck-edit[data-focus='notes'] #deck-edit-source
|
|
1237
|
+
#deck-edit[data-focus='notes'] > #deck-edit-source,
|
|
1238
|
+
#deck-edit[data-focus='notes'] .deck-edit-code {
|
|
1234
1239
|
flex: 0 0 0px;
|
|
1235
|
-
padding-block: 0;
|
|
1236
1240
|
border-width: 0;
|
|
1237
|
-
overflow: hidden;
|
|
1238
1241
|
}
|
|
1242
|
+
#deck-edit[data-focus='notes'] > #deck-edit-source { padding-block: 0; overflow: hidden; }
|
|
1239
1243
|
#deck-edit[data-focus='notes'] #deck-edit-notes { flex: 1 1 0; }
|
|
1240
1244
|
|
|
1245
|
+
/* --- the slide box, coloured ---------------------------------------------
|
|
1246
|
+
syntax.js wraps the slide's textarea in `.deck-edit-code` and slips a <pre>
|
|
1247
|
+
of the same text under it, highlighted as markdown. The wrapper is the box
|
|
1248
|
+
you see — background, border, radius, and the flex sizing above; the two
|
|
1249
|
+
layers inside are stacked on it, sharing a font, a padding and a wrapping
|
|
1250
|
+
mode so the letters land on each other. The textarea keeps its ink
|
|
1251
|
+
transparent and lends only its caret, its selection and its scrollbar.
|
|
1252
|
+
|
|
1253
|
+
Without the highlight plugin the wrapper is never built and the plain
|
|
1254
|
+
textarea rules above are the whole story. */
|
|
1255
|
+
#deck-edit .deck-edit-code {
|
|
1256
|
+
position: relative;
|
|
1257
|
+
margin: 0 12px;
|
|
1258
|
+
min-height: 0;
|
|
1259
|
+
overflow: hidden;
|
|
1260
|
+
font: 400 13px/1.55 var(--mono);
|
|
1261
|
+
background: color-mix(in srgb, var(--card) 70%, transparent);
|
|
1262
|
+
border: 1px solid var(--line);
|
|
1263
|
+
border-radius: 8px;
|
|
1264
|
+
transition: flex-grow 0.25s ease, flex-basis 0.25s ease, border-width 0.25s ease;
|
|
1265
|
+
}
|
|
1266
|
+
#deck-edit .deck-edit-code:focus-within { border-color: color-mix(in srgb, var(--accent) 55%, transparent); }
|
|
1267
|
+
#deck-edit .deck-edit-code > textarea,
|
|
1268
|
+
#deck-edit .deck-edit-ink {
|
|
1269
|
+
position: absolute;
|
|
1270
|
+
inset: 0;
|
|
1271
|
+
margin: 0;
|
|
1272
|
+
padding: 10px 12px;
|
|
1273
|
+
font: inherit;
|
|
1274
|
+
border: 0;
|
|
1275
|
+
background: transparent;
|
|
1276
|
+
white-space: pre-wrap;
|
|
1277
|
+
overflow-wrap: break-word;
|
|
1278
|
+
-moz-tab-size: 2;
|
|
1279
|
+
tab-size: 2;
|
|
1280
|
+
}
|
|
1281
|
+
/* The layer never scrolls itself — syntax.js hands it the textarea's offset —
|
|
1282
|
+
and it stops short of the scrollbar's width, or the two would wrap at
|
|
1283
|
+
different columns. Nothing on it can be clicked: the textarea is the page. */
|
|
1284
|
+
#deck-edit .deck-edit-ink {
|
|
1285
|
+
right: var(--code-gutter, 0px);
|
|
1286
|
+
overflow: hidden;
|
|
1287
|
+
pointer-events: none;
|
|
1288
|
+
color: var(--text);
|
|
1289
|
+
}
|
|
1290
|
+
/* The browser gives <code> a monospace of its own choosing, which is not the
|
|
1291
|
+
one the textarea is wearing — half a pixel of advance is all it takes to
|
|
1292
|
+
walk the two layers apart down a long line. */
|
|
1293
|
+
#deck-edit .deck-edit-ink > code { font: inherit; }
|
|
1294
|
+
#deck-edit .deck-edit-code > textarea {
|
|
1295
|
+
color: transparent;
|
|
1296
|
+
caret-color: var(--text);
|
|
1297
|
+
}
|
|
1298
|
+
/* A solid selection would paint over the colours; this one is a wash. */
|
|
1299
|
+
#deck-edit .deck-edit-code > textarea::selection {
|
|
1300
|
+
background: color-mix(in srgb, var(--accent) 30%, transparent);
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
/* The markdown palette is this theme's, not the monokai the slides wear: these
|
|
1304
|
+
selectors outrank that stylesheet's single classes, so the drawer follows
|
|
1305
|
+
whatever the deck is dressed in — a light reveal theme included. Bold and
|
|
1306
|
+
italic are safe in a monospace face, where they keep the same advance. */
|
|
1307
|
+
.deck-edit-ink .hljs-section { color: var(--accent); font-weight: 600; }
|
|
1308
|
+
.deck-edit-ink .hljs-bullet { color: var(--accent); font-weight: 600; }
|
|
1309
|
+
.deck-edit-ink .hljs-strong { color: var(--text); font-weight: 700; }
|
|
1310
|
+
.deck-edit-ink .hljs-emphasis { color: var(--accent-2); font-style: italic; font-weight: 400; }
|
|
1311
|
+
.deck-edit-ink .hljs-quote { color: var(--muted); font-style: italic; font-weight: 400; }
|
|
1312
|
+
.deck-edit-ink .hljs-code { color: var(--accent-2); font-weight: 400; }
|
|
1313
|
+
.deck-edit-ink .hljs-link { color: var(--accent); font-weight: 400; }
|
|
1314
|
+
.deck-edit-ink .hljs-string,
|
|
1315
|
+
.deck-edit-ink .hljs-symbol { color: var(--accent-2); font-weight: 400; }
|
|
1316
|
+
/* The HTML a slide drops into its markdown, and the `<!-- .element -->`
|
|
1317
|
+
comments that steer reveal: chrome, not content. */
|
|
1318
|
+
.deck-edit-ink .hljs-tag { color: var(--muted); font-weight: 400; }
|
|
1319
|
+
.deck-edit-ink .hljs-name { color: var(--accent); font-weight: 600; }
|
|
1320
|
+
.deck-edit-ink .hljs-attr { color: var(--accent-2); font-weight: 400; }
|
|
1321
|
+
.deck-edit-ink .hljs-comment,
|
|
1322
|
+
.deck-edit-ink .hljs-meta { color: var(--muted); font-weight: 400; }
|
|
1323
|
+
|
|
1241
1324
|
#deck-edit > footer {
|
|
1242
1325
|
display: flex;
|
|
1243
1326
|
align-items: center;
|
|
@@ -1319,13 +1402,21 @@ body.edit-open #deck-edit { transform: none; }
|
|
|
1319
1402
|
}
|
|
1320
1403
|
.deck-edit-confirm-delete:hover { background: #f2555a; }
|
|
1321
1404
|
|
|
1322
|
-
/* The label line over the slide box carries the block picker's
|
|
1405
|
+
/* The label line over the slide box carries the block picker's `+` and the
|
|
1406
|
+
drop button beside it. */
|
|
1323
1407
|
.deck-edit-row {
|
|
1324
1408
|
display: flex;
|
|
1325
1409
|
align-items: center;
|
|
1326
1410
|
justify-content: space-between;
|
|
1327
1411
|
padding-right: 12px;
|
|
1328
1412
|
}
|
|
1413
|
+
.deck-edit-row-acts {
|
|
1414
|
+
display: flex;
|
|
1415
|
+
align-items: center;
|
|
1416
|
+
gap: 6px;
|
|
1417
|
+
}
|
|
1418
|
+
.deck-edit-drop[hidden] { display: none; }
|
|
1419
|
+
.deck-edit-drop,
|
|
1329
1420
|
.deck-edit-snip {
|
|
1330
1421
|
display: grid;
|
|
1331
1422
|
place-items: center;
|
|
@@ -1338,10 +1429,12 @@ body.edit-open #deck-edit { transform: none; }
|
|
|
1338
1429
|
color: var(--muted);
|
|
1339
1430
|
cursor: pointer;
|
|
1340
1431
|
}
|
|
1432
|
+
.deck-edit-drop:hover,
|
|
1341
1433
|
.deck-edit-snip:hover {
|
|
1342
1434
|
border-color: color-mix(in srgb, var(--accent) 55%, transparent);
|
|
1343
1435
|
color: var(--text);
|
|
1344
1436
|
}
|
|
1437
|
+
.deck-edit-drop svg,
|
|
1345
1438
|
.deck-edit-snip svg { display: block; width: 14px; height: 14px; }
|
|
1346
1439
|
|
|
1347
1440
|
/* The block picker (snippets.js) — over the drawer, like the delete question,
|
|
@@ -1388,6 +1481,7 @@ body.edit-open #deck-edit { transform: none; }
|
|
|
1388
1481
|
border-radius: 8px;
|
|
1389
1482
|
cursor: pointer;
|
|
1390
1483
|
}
|
|
1484
|
+
.deck-snip-list[hidden],
|
|
1391
1485
|
.deck-snip-list li[hidden] { display: none; }
|
|
1392
1486
|
.deck-snip-list li span { font: 600 13px/1.3 var(--sans); color: var(--text); }
|
|
1393
1487
|
.deck-snip-list li small { font: 400 11.5px/1.45 var(--sans); color: var(--muted); }
|
|
@@ -1395,21 +1489,386 @@ body.edit-open #deck-edit { transform: none; }
|
|
|
1395
1489
|
the pointer moving over an entry takes it. */
|
|
1396
1490
|
.deck-snip-list li.is-current { background: color-mix(in srgb, var(--accent) 18%, transparent); }
|
|
1397
1491
|
|
|
1492
|
+
/* The group headers are furniture between the rows — quiet, and never a target. */
|
|
1493
|
+
.deck-snip-list li.deck-snip-head {
|
|
1494
|
+
padding: 10px 10px 2px;
|
|
1495
|
+
font: 600 10.5px/1.3 var(--sans);
|
|
1496
|
+
letter-spacing: 0.08em;
|
|
1497
|
+
text-transform: uppercase;
|
|
1498
|
+
color: color-mix(in srgb, var(--muted) 75%, transparent);
|
|
1499
|
+
cursor: default;
|
|
1500
|
+
}
|
|
1501
|
+
|
|
1502
|
+
/* Under the list: the markup the highlighted row would write, and the line
|
|
1503
|
+
for a search that came back with nothing. */
|
|
1504
|
+
.deck-snip-preview {
|
|
1505
|
+
flex: 0 0 auto;
|
|
1506
|
+
max-height: 140px;
|
|
1507
|
+
overflow: auto;
|
|
1508
|
+
margin: 0;
|
|
1509
|
+
padding: 9px 12px;
|
|
1510
|
+
font: 400 11px/1.55 var(--mono);
|
|
1511
|
+
color: var(--muted);
|
|
1512
|
+
background: color-mix(in srgb, var(--card) 80%, transparent);
|
|
1513
|
+
border: 1px solid var(--line);
|
|
1514
|
+
border-radius: 8px;
|
|
1515
|
+
white-space: pre;
|
|
1516
|
+
}
|
|
1517
|
+
.deck-snip-preview[hidden] { display: none; }
|
|
1518
|
+
.deck-snip-preview:empty { display: none; }
|
|
1519
|
+
|
|
1520
|
+
.deck-snip-empty {
|
|
1521
|
+
margin: 0;
|
|
1522
|
+
padding: 2px 10px;
|
|
1523
|
+
font: 400 12.5px/1.4 var(--sans);
|
|
1524
|
+
color: var(--muted);
|
|
1525
|
+
}
|
|
1526
|
+
.deck-snip-empty[hidden] { display: none; }
|
|
1527
|
+
|
|
1398
1528
|
/* The hairline the outline list and the drawer's boxes wear. */
|
|
1399
|
-
.deck-snip-list::-webkit-scrollbar
|
|
1400
|
-
.deck-snip-
|
|
1401
|
-
.deck-snip-list::-webkit-scrollbar-
|
|
1529
|
+
.deck-snip-list::-webkit-scrollbar,
|
|
1530
|
+
.deck-snip-preview::-webkit-scrollbar { width: 5px; height: 5px; }
|
|
1531
|
+
.deck-snip-list::-webkit-scrollbar-track,
|
|
1532
|
+
.deck-snip-preview::-webkit-scrollbar-track { background: transparent; }
|
|
1533
|
+
.deck-snip-list::-webkit-scrollbar-thumb,
|
|
1534
|
+
.deck-snip-preview::-webkit-scrollbar-thumb {
|
|
1402
1535
|
border-radius: 999px;
|
|
1403
1536
|
background: var(--outline-bar);
|
|
1404
1537
|
}
|
|
1405
|
-
.deck-snip-list::-webkit-scrollbar-thumb:hover
|
|
1538
|
+
.deck-snip-list::-webkit-scrollbar-thumb:hover,
|
|
1539
|
+
.deck-snip-preview::-webkit-scrollbar-thumb:hover { background: var(--outline-bar-hover); }
|
|
1406
1540
|
@supports not selector(::-webkit-scrollbar) {
|
|
1407
|
-
.deck-snip-list
|
|
1541
|
+
.deck-snip-list,
|
|
1542
|
+
.deck-snip-preview {
|
|
1408
1543
|
scrollbar-width: thin;
|
|
1409
1544
|
scrollbar-color: var(--outline-bar) transparent;
|
|
1410
1545
|
}
|
|
1411
1546
|
}
|
|
1412
1547
|
|
|
1548
|
+
|
|
1549
|
+
/* --- dropping files into assets/ (assets.js) -------------------------------
|
|
1550
|
+
The panel is the picker's neighbour — an overlay inside the drawer — and the
|
|
1551
|
+
sheet is the whole page: while the drawer is open, a file dragged anywhere
|
|
1552
|
+
over the deck is a file for this talk, and the folders are the targets. */
|
|
1553
|
+
|
|
1554
|
+
.deck-assets {
|
|
1555
|
+
position: absolute;
|
|
1556
|
+
inset: 0;
|
|
1557
|
+
z-index: 3;
|
|
1558
|
+
display: flex;
|
|
1559
|
+
flex-direction: column;
|
|
1560
|
+
gap: 10px;
|
|
1561
|
+
padding: 14px 12px;
|
|
1562
|
+
background: color-mix(in srgb, var(--bg) 80%, transparent);
|
|
1563
|
+
backdrop-filter: blur(6px);
|
|
1564
|
+
}
|
|
1565
|
+
.deck-assets[hidden] { display: none; }
|
|
1566
|
+
|
|
1567
|
+
.deck-assets > header {
|
|
1568
|
+
display: flex;
|
|
1569
|
+
align-items: center;
|
|
1570
|
+
justify-content: space-between;
|
|
1571
|
+
}
|
|
1572
|
+
.deck-assets-title,
|
|
1573
|
+
.deck-assets-where label {
|
|
1574
|
+
font: 600 10px/1 var(--sans);
|
|
1575
|
+
letter-spacing: 0.12em;
|
|
1576
|
+
text-transform: uppercase;
|
|
1577
|
+
color: var(--muted);
|
|
1578
|
+
}
|
|
1579
|
+
.deck-assets-close {
|
|
1580
|
+
display: grid;
|
|
1581
|
+
place-items: center;
|
|
1582
|
+
width: 24px;
|
|
1583
|
+
height: 24px;
|
|
1584
|
+
padding: 0;
|
|
1585
|
+
border: 0;
|
|
1586
|
+
border-radius: 999px;
|
|
1587
|
+
background: transparent;
|
|
1588
|
+
color: var(--muted);
|
|
1589
|
+
cursor: pointer;
|
|
1590
|
+
}
|
|
1591
|
+
.deck-assets-close:hover { background: color-mix(in srgb, var(--text) 10%, transparent); color: var(--text); }
|
|
1592
|
+
.deck-assets-close svg { display: block; width: 14px; height: 14px; }
|
|
1593
|
+
|
|
1594
|
+
.deck-assets-where {
|
|
1595
|
+
display: flex;
|
|
1596
|
+
align-items: center;
|
|
1597
|
+
gap: 10px;
|
|
1598
|
+
}
|
|
1599
|
+
.deck-assets-dir,
|
|
1600
|
+
.deck-assets-new {
|
|
1601
|
+
flex: 1;
|
|
1602
|
+
min-width: 0;
|
|
1603
|
+
padding: 7px 10px;
|
|
1604
|
+
font: 400 12.5px/1.3 var(--mono);
|
|
1605
|
+
color: var(--text);
|
|
1606
|
+
background: color-mix(in srgb, var(--card) 80%, transparent);
|
|
1607
|
+
border: 1px solid var(--line);
|
|
1608
|
+
border-radius: 8px;
|
|
1609
|
+
}
|
|
1610
|
+
.deck-assets-dir:focus,
|
|
1611
|
+
.deck-assets-new:focus {
|
|
1612
|
+
outline: none;
|
|
1613
|
+
border-color: color-mix(in srgb, var(--accent) 55%, transparent);
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
.deck-assets-name-row { display: flex; gap: 8px; }
|
|
1617
|
+
.deck-assets-name-row[hidden] { display: none; }
|
|
1618
|
+
.deck-assets-go {
|
|
1619
|
+
flex: 0 0 auto;
|
|
1620
|
+
padding: 7px 12px;
|
|
1621
|
+
font: 600 12px/1 var(--sans);
|
|
1622
|
+
color: #fff;
|
|
1623
|
+
background: var(--accent);
|
|
1624
|
+
border: 0;
|
|
1625
|
+
border-radius: 8px;
|
|
1626
|
+
cursor: pointer;
|
|
1627
|
+
}
|
|
1628
|
+
.deck-assets-go[hidden] { display: none; }
|
|
1629
|
+
.deck-assets-go:hover { background: color-mix(in srgb, var(--accent) 85%, #fff); }
|
|
1630
|
+
|
|
1631
|
+
.deck-assets-waiting {
|
|
1632
|
+
margin: -4px 0 0;
|
|
1633
|
+
font: 400 11.5px/1.4 var(--sans);
|
|
1634
|
+
color: var(--accent-2);
|
|
1635
|
+
}
|
|
1636
|
+
.deck-assets-waiting[hidden] { display: none; }
|
|
1637
|
+
|
|
1638
|
+
/* The zone is a reminder more than a control: the gesture is the drag, and the
|
|
1639
|
+
click is for the times the file is not in a window you can drag from. */
|
|
1640
|
+
.deck-assets-zone {
|
|
1641
|
+
display: flex;
|
|
1642
|
+
flex-direction: column;
|
|
1643
|
+
gap: 4px;
|
|
1644
|
+
align-items: center;
|
|
1645
|
+
padding: 20px 12px;
|
|
1646
|
+
font: 500 13px/1.4 var(--sans);
|
|
1647
|
+
color: var(--muted);
|
|
1648
|
+
background: transparent;
|
|
1649
|
+
border: 1px dashed color-mix(in srgb, var(--text) 22%, transparent);
|
|
1650
|
+
border-radius: 10px;
|
|
1651
|
+
cursor: pointer;
|
|
1652
|
+
}
|
|
1653
|
+
.deck-assets-zone:hover {
|
|
1654
|
+
border-color: color-mix(in srgb, var(--accent) 55%, transparent);
|
|
1655
|
+
color: var(--text);
|
|
1656
|
+
}
|
|
1657
|
+
.deck-assets-zone small { font: 400 11.5px/1.4 var(--sans); }
|
|
1658
|
+
|
|
1659
|
+
.deck-assets-list {
|
|
1660
|
+
flex: 1 1 auto;
|
|
1661
|
+
display: flex;
|
|
1662
|
+
flex-direction: column;
|
|
1663
|
+
gap: 4px;
|
|
1664
|
+
margin: 0;
|
|
1665
|
+
padding: 0;
|
|
1666
|
+
list-style: none;
|
|
1667
|
+
overflow-y: auto;
|
|
1668
|
+
}
|
|
1669
|
+
.deck-assets-list li {
|
|
1670
|
+
display: flex;
|
|
1671
|
+
align-items: center;
|
|
1672
|
+
justify-content: space-between;
|
|
1673
|
+
gap: 8px;
|
|
1674
|
+
padding: 7px 10px;
|
|
1675
|
+
border-radius: 8px;
|
|
1676
|
+
background: color-mix(in srgb, var(--card) 55%, transparent);
|
|
1677
|
+
}
|
|
1678
|
+
.deck-assets-list code {
|
|
1679
|
+
min-width: 0;
|
|
1680
|
+
font: 500 11.5px/1.5 var(--mono);
|
|
1681
|
+
color: var(--accent-2);
|
|
1682
|
+
overflow: hidden;
|
|
1683
|
+
text-overflow: ellipsis;
|
|
1684
|
+
white-space: nowrap;
|
|
1685
|
+
}
|
|
1686
|
+
.deck-assets-file {
|
|
1687
|
+
min-width: 0;
|
|
1688
|
+
font: 400 12px/1.5 var(--sans);
|
|
1689
|
+
color: var(--text);
|
|
1690
|
+
overflow: hidden;
|
|
1691
|
+
text-overflow: ellipsis;
|
|
1692
|
+
white-space: nowrap;
|
|
1693
|
+
}
|
|
1694
|
+
.deck-assets-pct,
|
|
1695
|
+
.deck-assets-size {
|
|
1696
|
+
flex: 0 0 auto;
|
|
1697
|
+
font: 400 11px/1.5 var(--mono);
|
|
1698
|
+
color: var(--muted);
|
|
1699
|
+
}
|
|
1700
|
+
/* The row grows to the path and the size is pinned right of it, so a long name
|
|
1701
|
+
truncates rather than pushing the buttons off the edge. */
|
|
1702
|
+
.deck-assets-list li code { flex: 1 1 auto; }
|
|
1703
|
+
/* Put there in this session — the row you are most likely reaching for. */
|
|
1704
|
+
.deck-assets-list li.is-fresh { background: color-mix(in srgb, var(--accent) 14%, transparent); }
|
|
1705
|
+
.deck-assets-none {
|
|
1706
|
+
justify-content: center;
|
|
1707
|
+
padding: 14px 10px;
|
|
1708
|
+
font: 400 12px/1.5 var(--sans);
|
|
1709
|
+
color: var(--muted);
|
|
1710
|
+
background: none;
|
|
1711
|
+
}
|
|
1712
|
+
.deck-assets-list li.is-failed { background: color-mix(in srgb, #e5484d 16%, transparent); }
|
|
1713
|
+
.deck-assets-list li.is-failed .deck-assets-pct { color: #ff8589; }
|
|
1714
|
+
|
|
1715
|
+
.deck-assets-acts {
|
|
1716
|
+
flex: 0 0 auto;
|
|
1717
|
+
display: flex;
|
|
1718
|
+
gap: 4px;
|
|
1719
|
+
}
|
|
1720
|
+
.deck-assets-copy,
|
|
1721
|
+
.deck-assets-insert,
|
|
1722
|
+
.deck-assets-trash {
|
|
1723
|
+
display: grid;
|
|
1724
|
+
place-items: center;
|
|
1725
|
+
width: 24px;
|
|
1726
|
+
height: 24px;
|
|
1727
|
+
padding: 0;
|
|
1728
|
+
border: 1px solid var(--line);
|
|
1729
|
+
border-radius: 999px;
|
|
1730
|
+
background: transparent;
|
|
1731
|
+
color: var(--muted);
|
|
1732
|
+
cursor: pointer;
|
|
1733
|
+
}
|
|
1734
|
+
.deck-assets-copy:hover,
|
|
1735
|
+
.deck-assets-insert:hover {
|
|
1736
|
+
border-color: color-mix(in srgb, var(--accent) 55%, transparent);
|
|
1737
|
+
color: var(--text);
|
|
1738
|
+
}
|
|
1739
|
+
/* The one button here that takes something away wears the colour that says so. */
|
|
1740
|
+
.deck-assets-trash:hover { border-color: #e5484d; color: #ff8589; }
|
|
1741
|
+
/* The one moment of feedback a copy can have: the button answers for a beat. */
|
|
1742
|
+
.deck-assets-copy.is-done {
|
|
1743
|
+
border-color: var(--accent);
|
|
1744
|
+
color: var(--accent);
|
|
1745
|
+
}
|
|
1746
|
+
.deck-assets-copy svg,
|
|
1747
|
+
.deck-assets-insert svg,
|
|
1748
|
+
.deck-assets-trash svg { display: block; width: 13px; height: 13px; }
|
|
1749
|
+
|
|
1750
|
+
/* Deleting is the only thing in this drawer a reload cannot undo, so it is a
|
|
1751
|
+
layer of its own over the list — and the word has to be typed. */
|
|
1752
|
+
.deck-assets-confirm {
|
|
1753
|
+
position: absolute;
|
|
1754
|
+
inset: 0;
|
|
1755
|
+
z-index: 1;
|
|
1756
|
+
display: flex;
|
|
1757
|
+
flex-direction: column;
|
|
1758
|
+
align-items: center;
|
|
1759
|
+
justify-content: center;
|
|
1760
|
+
gap: 14px;
|
|
1761
|
+
padding: 24px;
|
|
1762
|
+
text-align: center;
|
|
1763
|
+
background: color-mix(in srgb, var(--bg) 80%, transparent);
|
|
1764
|
+
backdrop-filter: blur(5px);
|
|
1765
|
+
}
|
|
1766
|
+
.deck-assets-confirm[hidden] { display: none; }
|
|
1767
|
+
.deck-assets-confirm p {
|
|
1768
|
+
margin: 0;
|
|
1769
|
+
font: 400 13px/1.6 var(--sans);
|
|
1770
|
+
color: var(--text);
|
|
1771
|
+
}
|
|
1772
|
+
.deck-assets-confirm p code {
|
|
1773
|
+
font: 500 12px var(--mono);
|
|
1774
|
+
color: var(--accent-2);
|
|
1775
|
+
overflow-wrap: anywhere;
|
|
1776
|
+
}
|
|
1777
|
+
.deck-assets-word {
|
|
1778
|
+
width: 190px;
|
|
1779
|
+
padding: 8px 12px;
|
|
1780
|
+
font: 600 13px/1.2 var(--mono);
|
|
1781
|
+
letter-spacing: 0.14em;
|
|
1782
|
+
text-align: center;
|
|
1783
|
+
color: var(--text);
|
|
1784
|
+
background: color-mix(in srgb, var(--card) 80%, transparent);
|
|
1785
|
+
border: 1px solid var(--line);
|
|
1786
|
+
border-radius: 8px;
|
|
1787
|
+
}
|
|
1788
|
+
.deck-assets-word:focus {
|
|
1789
|
+
outline: none;
|
|
1790
|
+
border-color: color-mix(in srgb, #e5484d 60%, transparent);
|
|
1791
|
+
}
|
|
1792
|
+
.deck-assets-confirm > div { display: flex; gap: 10px; }
|
|
1793
|
+
.deck-assets-cancel,
|
|
1794
|
+
.deck-assets-confirm-delete {
|
|
1795
|
+
padding: 8px 16px;
|
|
1796
|
+
font: 600 12.5px/1 var(--sans);
|
|
1797
|
+
border-radius: 8px;
|
|
1798
|
+
cursor: pointer;
|
|
1799
|
+
}
|
|
1800
|
+
.deck-assets-cancel {
|
|
1801
|
+
color: var(--text);
|
|
1802
|
+
background: transparent;
|
|
1803
|
+
border: 1px solid var(--line);
|
|
1804
|
+
}
|
|
1805
|
+
.deck-assets-cancel:hover { background: color-mix(in srgb, var(--text) 10%, transparent); }
|
|
1806
|
+
.deck-assets-confirm-delete {
|
|
1807
|
+
color: #fff;
|
|
1808
|
+
background: #e5484d;
|
|
1809
|
+
border: 0;
|
|
1810
|
+
}
|
|
1811
|
+
.deck-assets-confirm-delete:hover { background: #f2555a; }
|
|
1812
|
+
/* Until the word is typed it is a button that plainly does nothing yet. */
|
|
1813
|
+
.deck-assets-confirm-delete:disabled {
|
|
1814
|
+
opacity: 0.4;
|
|
1815
|
+
cursor: default;
|
|
1816
|
+
background: #e5484d;
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
/* The sheet — over everything, drawer included: the drop is the whole page. */
|
|
1820
|
+
#deck-drop {
|
|
1821
|
+
position: fixed;
|
|
1822
|
+
inset: 0;
|
|
1823
|
+
z-index: 70;
|
|
1824
|
+
display: grid;
|
|
1825
|
+
place-items: center;
|
|
1826
|
+
background: color-mix(in srgb, var(--bg) 74%, transparent);
|
|
1827
|
+
backdrop-filter: blur(8px);
|
|
1828
|
+
}
|
|
1829
|
+
#deck-drop[hidden] { display: none; }
|
|
1830
|
+
|
|
1831
|
+
.deck-drop-sheet {
|
|
1832
|
+
width: min(620px, 80vw);
|
|
1833
|
+
text-align: center;
|
|
1834
|
+
}
|
|
1835
|
+
.deck-drop-sheet h2 {
|
|
1836
|
+
margin: 0 0 18px;
|
|
1837
|
+
font: 600 17px/1.35 var(--sans);
|
|
1838
|
+
color: var(--text);
|
|
1839
|
+
}
|
|
1840
|
+
.deck-drop-sheet h2 code { font: 600 16px var(--mono); color: var(--accent-2); }
|
|
1841
|
+
|
|
1842
|
+
.deck-drop-targets {
|
|
1843
|
+
display: flex;
|
|
1844
|
+
flex-wrap: wrap;
|
|
1845
|
+
gap: 10px;
|
|
1846
|
+
justify-content: center;
|
|
1847
|
+
margin: 0;
|
|
1848
|
+
padding: 0;
|
|
1849
|
+
list-style: none;
|
|
1850
|
+
}
|
|
1851
|
+
.deck-drop-targets li {
|
|
1852
|
+
min-width: 130px;
|
|
1853
|
+
padding: 16px 18px;
|
|
1854
|
+
font: 500 13px/1.3 var(--mono);
|
|
1855
|
+
color: var(--muted);
|
|
1856
|
+
background: color-mix(in srgb, var(--card) 70%, transparent);
|
|
1857
|
+
border: 1px dashed color-mix(in srgb, var(--text) 24%, transparent);
|
|
1858
|
+
border-radius: 12px;
|
|
1859
|
+
transition: transform 0.12s ease, border-color 0.12s ease, background 0.12s ease;
|
|
1860
|
+
}
|
|
1861
|
+
/* Where the last drop went: the one you probably mean again. */
|
|
1862
|
+
.deck-drop-targets li.is-last { color: var(--text); border-style: solid; }
|
|
1863
|
+
.deck-drop-targets li.is-new { font-family: var(--sans); }
|
|
1864
|
+
.deck-drop-targets li.is-over {
|
|
1865
|
+
color: var(--text);
|
|
1866
|
+
background: color-mix(in srgb, var(--accent) 22%, transparent);
|
|
1867
|
+
border-color: var(--accent);
|
|
1868
|
+
border-style: solid;
|
|
1869
|
+
transform: scale(1.04);
|
|
1870
|
+
}
|
|
1871
|
+
|
|
1413
1872
|
/* The open drawer's button wears the accent — it draws in nothing, like the
|
|
1414
1873
|
pointer's; the id outweighs the generic armed-tool rule. */
|
|
1415
1874
|
#tool-edit[aria-pressed='true'] {
|
|
@@ -1647,6 +2106,7 @@ html.deck-pointer-on * { cursor: none !important; }
|
|
|
1647
2106
|
#deck-tools,
|
|
1648
2107
|
#deck-menu,
|
|
1649
2108
|
#deck-outline,
|
|
2109
|
+
#deck-drop,
|
|
1650
2110
|
#deck-edit { display: none; }
|
|
1651
2111
|
/* The signature stays on the exported PDF — but the pill behind it does not
|
|
1652
2112
|
survive a white page. */
|
|
Binary file
|