@quilltap/theme-storybook 1.0.70 → 1.0.72

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 CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  All notable changes to `@quilltap/theme-storybook` will be documented in this file.
4
4
 
5
+ ## [1.0.71] - 2026-09-19
6
+
7
+ ### Added
8
+ - `.qt-chat-message-regenerating`, `.qt-chat-regenerating`, `.qt-chat-regenerating-original` and `.qt-chat-regenerating-plate(-text)` — the Salon's new in-place regeneration: the line being re-rolled dims under a plate that says so, then gives way to the new prose as it streams.
9
+ - The whole `.qt-chat-message-action-bar*` / `.qt-chat-message-action-icon*` family, which had never been mirrored, including the new `.qt-chat-message-action-bar-disabled` state.
10
+ - The whole `.qt-chat-response-status*` family, also previously unmirrored: the stage strip above the composer, its per-stage colours (now including `regenerating` and `saving`), its fade-in keyframes and its reduced-motion rule.
11
+
12
+ ### Notes
13
+ - The regeneration classes borrow `--qt-response-status-streaming-fg` rather than introducing tokens of their own; a theme that retunes the streaming status colour retunes the regeneration accent with it.
14
+
5
15
  ## [1.0.67] - 2026-08-30
6
16
 
7
17
  ### Added
package/dist/index.css CHANGED
@@ -1474,6 +1474,176 @@ body {
1474
1474
  font-style: italic;
1475
1475
  margin-bottom: 0.25rem;
1476
1476
  }
1477
+ .qt-chat-message-regenerating {
1478
+ border-color: color-mix(in srgb, var(--qt-response-status-streaming-fg) 45%, transparent);
1479
+ }
1480
+ .qt-chat-regenerating {
1481
+ position: relative;
1482
+ }
1483
+ .qt-chat-regenerating-original {
1484
+ opacity: 0.3;
1485
+ filter: grayscale(0.8);
1486
+ pointer-events: none;
1487
+ -webkit-user-select: none;
1488
+ -moz-user-select: none;
1489
+ user-select: none;
1490
+ }
1491
+ .qt-chat-regenerating-plate {
1492
+ position: absolute;
1493
+ inset: 0;
1494
+ display: flex;
1495
+ align-items: center;
1496
+ justify-content: center;
1497
+ gap: 0.5rem;
1498
+ color: var(--qt-response-status-streaming-fg);
1499
+ }
1500
+ .qt-chat-regenerating-plate-text {
1501
+ font-size: 0.875rem;
1502
+ line-height: 1.25rem;
1503
+ font-weight: 500;
1504
+ padding: 0.375rem 0.75rem;
1505
+ border-radius: 0.375rem;
1506
+ background: color-mix(in srgb, var(--qt-chat-assistant-bg) 88%, transparent);
1507
+ border: 1px solid color-mix(in srgb, var(--qt-response-status-streaming-fg) 35%, transparent);
1508
+ letter-spacing: 0.02em;
1509
+ }
1510
+ .qt-chat-message-action-bar {
1511
+ display: flex;
1512
+ align-items: center;
1513
+ gap: 0.75rem;
1514
+ margin-top: 0.5rem;
1515
+ padding-top: 0.5rem;
1516
+ border-top: 1px solid color-mix(in srgb, var(--color-border) 50%, transparent);
1517
+ }
1518
+ .qt-chat-message-action-bar-icons {
1519
+ display: flex;
1520
+ align-items: center;
1521
+ gap: 0.25rem;
1522
+ }
1523
+ .qt-chat-message-action-bar-disabled {
1524
+ pointer-events: none;
1525
+ opacity: 0.4;
1526
+ }
1527
+ .qt-chat-message-action-icon {
1528
+ padding: 0.375rem;
1529
+ border-radius: 0.25rem;
1530
+ transition-property:
1531
+ color,
1532
+ background-color,
1533
+ border-color,
1534
+ text-decoration-color,
1535
+ fill,
1536
+ stroke;
1537
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1538
+ transition-duration: 150ms;
1539
+ color: var(--color-muted-foreground);
1540
+ cursor: pointer;
1541
+ }
1542
+ .qt-chat-message-action-icon:hover {
1543
+ color: var(--color-foreground);
1544
+ background: color-mix(in srgb, var(--color-muted) 50%, transparent);
1545
+ }
1546
+ .qt-chat-message-action-icon-danger:hover {
1547
+ color: var(--qt-status-danger-fg);
1548
+ background: color-mix(in srgb, var(--qt-status-danger-bg) 50%, transparent);
1549
+ }
1550
+ .qt-chat-message-action-icon svg,
1551
+ .qt-chat-message-action-icon .qt-icon {
1552
+ width: 1rem;
1553
+ height: 1rem;
1554
+ }
1555
+ .qt-chat-message-user .qt-chat-message-action-bar {
1556
+ border-top-color: color-mix(in srgb, var(--qt-chat-user-fg) 30%, transparent);
1557
+ }
1558
+ .qt-chat-message-user .qt-chat-message-action-icon {
1559
+ color: color-mix(in srgb, var(--qt-chat-user-fg) 70%, transparent);
1560
+ }
1561
+ .qt-chat-message-user .qt-chat-message-action-icon:hover {
1562
+ color: var(--qt-chat-user-fg);
1563
+ background: color-mix(in srgb, var(--qt-chat-user-fg) 15%, transparent);
1564
+ }
1565
+ .qt-chat-message-user .qt-chat-message-action-icon-danger:hover {
1566
+ color: hsl(0 100% 85%);
1567
+ background: color-mix(in srgb, hsl(0 70% 50%) 25%, transparent);
1568
+ }
1569
+ .qt-chat-message-action-timestamp {
1570
+ font-size: 0.75rem;
1571
+ line-height: 1rem;
1572
+ color: var(--color-muted-foreground);
1573
+ margin-left: auto;
1574
+ }
1575
+ .qt-chat-message-user .qt-chat-message-action-timestamp {
1576
+ color: color-mix(in srgb, var(--qt-chat-user-fg) 70%, transparent);
1577
+ }
1578
+ .qt-chat-response-status {
1579
+ display: flex;
1580
+ align-items: center;
1581
+ gap: 0.5rem;
1582
+ padding: 0.375rem 0.75rem;
1583
+ font-size: 0.875rem;
1584
+ line-height: 1.25rem;
1585
+ margin-bottom: 0.5rem;
1586
+ border-radius: 0.375rem;
1587
+ background: var(--qt-response-status-bg);
1588
+ color: var(--qt-response-status-fg);
1589
+ border: 1px solid var(--qt-response-status-border);
1590
+ animation: qt-status-fade-in 150ms ease-out;
1591
+ }
1592
+ .qt-chat-response-status-icon {
1593
+ flex-shrink: 0;
1594
+ width: 1rem;
1595
+ height: 1rem;
1596
+ }
1597
+ .qt-chat-response-status-text {
1598
+ font-weight: 500;
1599
+ }
1600
+ .qt-chat-response-status[data-stage=compressing] {
1601
+ color: var(--qt-response-status-compressing-fg);
1602
+ border-color: color-mix(in srgb, var(--qt-response-status-compressing-fg) 30%, transparent);
1603
+ }
1604
+ .qt-chat-response-status[data-stage=gathering] {
1605
+ color: var(--qt-response-status-gathering-fg);
1606
+ border-color: color-mix(in srgb, var(--qt-response-status-gathering-fg) 30%, transparent);
1607
+ }
1608
+ .qt-chat-response-status[data-stage=building] {
1609
+ color: var(--qt-response-status-building-fg);
1610
+ border-color: color-mix(in srgb, var(--qt-response-status-building-fg) 30%, transparent);
1611
+ }
1612
+ .qt-chat-response-status[data-stage=sending] {
1613
+ color: var(--qt-response-status-sending-fg);
1614
+ border-color: color-mix(in srgb, var(--qt-response-status-sending-fg) 30%, transparent);
1615
+ }
1616
+ .qt-chat-response-status[data-stage=streaming] {
1617
+ color: var(--qt-response-status-streaming-fg);
1618
+ border-color: color-mix(in srgb, var(--qt-response-status-streaming-fg) 30%, transparent);
1619
+ }
1620
+ .qt-chat-response-status[data-stage=regenerating],
1621
+ .qt-chat-response-status[data-stage=saving] {
1622
+ color: var(--qt-response-status-streaming-fg);
1623
+ border-color: color-mix(in srgb, var(--qt-response-status-streaming-fg) 30%, transparent);
1624
+ }
1625
+ .qt-chat-response-status[data-stage=tool_executing] {
1626
+ color: var(--qt-response-status-tool-fg);
1627
+ border-color: color-mix(in srgb, var(--qt-response-status-tool-fg) 30%, transparent);
1628
+ }
1629
+ @keyframes qt-status-fade-in {
1630
+ from {
1631
+ opacity: 0;
1632
+ transform: translateY(-4px);
1633
+ }
1634
+ to {
1635
+ opacity: 1;
1636
+ transform: translateY(0);
1637
+ }
1638
+ }
1639
+ @media (prefers-reduced-motion: reduce) {
1640
+ .qt-chat-response-status {
1641
+ animation: none;
1642
+ }
1643
+ .qt-chat-response-status-icon .animate-pulse {
1644
+ animation: none;
1645
+ }
1646
+ }
1477
1647
  .qt-chat-wardrobe-notice {
1478
1648
  background: var(--qt-chat-wardrobe-bg);
1479
1649
  color: var(--qt-chat-wardrobe-fg);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quilltap/theme-storybook",
3
- "version": "1.0.70",
3
+ "version": "1.0.72",
4
4
  "description": "Storybook preset and stories for developing Quilltap theme plugins",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -44,8 +44,8 @@
44
44
  },
45
45
  "devDependencies": {
46
46
  "@storybook/react": "^10.6.0",
47
- "@types/react": "^19.2.18",
48
- "react": "^19.2.8",
47
+ "@types/react": "^19.3.0",
48
+ "react": "^19.3.0",
49
49
  "storybook": "^10.6.0",
50
50
  "tsup": "^8.5.1",
51
51
  "typescript": "^5.9.3"
@@ -1793,6 +1793,207 @@
1793
1793
  margin-bottom: 0.25rem;
1794
1794
  }
1795
1795
 
1796
+ /**
1797
+ * Regeneration — a line being re-rolled in place.
1798
+ *
1799
+ * Two states, one bubble. Before the first token the old line is still there
1800
+ * but visibly out of service (dimmed, desaturated, unselectable) under a plate
1801
+ * that says what is happening. From the first token the plate and the old line
1802
+ * are both gone and the new prose streams in their place.
1803
+ */
1804
+ .qt-chat-message-regenerating {
1805
+ border-color: color-mix(in srgb, var(--qt-response-status-streaming-fg) 45%, transparent);
1806
+ }
1807
+
1808
+ .qt-chat-regenerating {
1809
+ position: relative;
1810
+ }
1811
+
1812
+ .qt-chat-regenerating-original {
1813
+ opacity: 0.3;
1814
+ filter: grayscale(0.8);
1815
+ pointer-events: none;
1816
+ user-select: none;
1817
+ }
1818
+
1819
+ .qt-chat-regenerating-plate {
1820
+ position: absolute;
1821
+ inset: 0;
1822
+ display: flex;
1823
+ align-items: center;
1824
+ justify-content: center;
1825
+ gap: 0.5rem;
1826
+ color: var(--qt-response-status-streaming-fg);
1827
+ }
1828
+
1829
+ .qt-chat-regenerating-plate-text {
1830
+ font-size: 0.875rem;
1831
+ line-height: 1.25rem;
1832
+ font-weight: 500;
1833
+ padding: 0.375rem 0.75rem;
1834
+ border-radius: 0.375rem;
1835
+ background: color-mix(in srgb, var(--qt-chat-assistant-bg) 88%, transparent);
1836
+ border: 1px solid color-mix(in srgb, var(--qt-response-status-streaming-fg) 35%, transparent);
1837
+ letter-spacing: 0.02em;
1838
+ }
1839
+
1840
+ /**
1841
+ * Message action bar — the per-message toolbar (copy, source, edit, delete,
1842
+ * regenerate, swipe arrows) along the bottom of a bubble.
1843
+ */
1844
+ .qt-chat-message-action-bar {
1845
+ display: flex;
1846
+ align-items: center;
1847
+ gap: 0.75rem;
1848
+ margin-top: 0.5rem;
1849
+ padding-top: 0.5rem;
1850
+ border-top: 1px solid color-mix(in srgb, var(--color-border) 50%, transparent);
1851
+ }
1852
+
1853
+ .qt-chat-message-action-bar-icons {
1854
+ display: flex;
1855
+ align-items: center;
1856
+ gap: 0.25rem;
1857
+ }
1858
+
1859
+ /** The bar of a line that is mid-replacement: nothing on it is safe to press. */
1860
+ .qt-chat-message-action-bar-disabled {
1861
+ pointer-events: none;
1862
+ opacity: 0.4;
1863
+ }
1864
+
1865
+ .qt-chat-message-action-icon {
1866
+ padding: 0.375rem;
1867
+ border-radius: 0.25rem;
1868
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
1869
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1870
+ transition-duration: 150ms;
1871
+ color: var(--color-muted-foreground);
1872
+ cursor: pointer;
1873
+ }
1874
+
1875
+ .qt-chat-message-action-icon:hover {
1876
+ color: var(--color-foreground);
1877
+ background: color-mix(in srgb, var(--color-muted) 50%, transparent);
1878
+ }
1879
+
1880
+ .qt-chat-message-action-icon-danger:hover {
1881
+ color: var(--qt-status-danger-fg);
1882
+ background: color-mix(in srgb, var(--qt-status-danger-bg) 50%, transparent);
1883
+ }
1884
+
1885
+ .qt-chat-message-action-icon svg,
1886
+ .qt-chat-message-action-icon .qt-icon {
1887
+ width: 1rem;
1888
+ height: 1rem;
1889
+ }
1890
+
1891
+ /** User message action icons — light colours on the user bubble's ground. */
1892
+ .qt-chat-message-user .qt-chat-message-action-bar {
1893
+ border-top-color: color-mix(in srgb, var(--qt-chat-user-fg) 30%, transparent);
1894
+ }
1895
+
1896
+ .qt-chat-message-user .qt-chat-message-action-icon {
1897
+ color: color-mix(in srgb, var(--qt-chat-user-fg) 70%, transparent);
1898
+ }
1899
+
1900
+ .qt-chat-message-user .qt-chat-message-action-icon:hover {
1901
+ color: var(--qt-chat-user-fg);
1902
+ background: color-mix(in srgb, var(--qt-chat-user-fg) 15%, transparent);
1903
+ }
1904
+
1905
+ .qt-chat-message-user .qt-chat-message-action-icon-danger:hover {
1906
+ color: hsl(0 100% 85%);
1907
+ background: color-mix(in srgb, hsl(0 70% 50%) 25%, transparent);
1908
+ }
1909
+
1910
+ .qt-chat-message-action-timestamp {
1911
+ font-size: 0.75rem;
1912
+ line-height: 1rem;
1913
+ color: var(--color-muted-foreground);
1914
+ margin-left: auto;
1915
+ }
1916
+
1917
+ .qt-chat-message-user .qt-chat-message-action-timestamp {
1918
+ color: color-mix(in srgb, var(--qt-chat-user-fg) 70%, transparent);
1919
+ }
1920
+
1921
+ /**
1922
+ * Response status strip — the line above the composer that narrates a turn as
1923
+ * it happens ("Gathering memories and context...", "Ada is responding...",
1924
+ * "Regenerating Ada's reply..."). Coloured per stage.
1925
+ */
1926
+ .qt-chat-response-status {
1927
+ display: flex;
1928
+ align-items: center;
1929
+ gap: 0.5rem;
1930
+ padding: 0.375rem 0.75rem;
1931
+ font-size: 0.875rem;
1932
+ line-height: 1.25rem;
1933
+ margin-bottom: 0.5rem;
1934
+ border-radius: 0.375rem;
1935
+ background: var(--qt-response-status-bg);
1936
+ color: var(--qt-response-status-fg);
1937
+ border: 1px solid var(--qt-response-status-border);
1938
+ animation: qt-status-fade-in 150ms ease-out;
1939
+ }
1940
+
1941
+ .qt-chat-response-status-icon {
1942
+ flex-shrink: 0;
1943
+ width: 1rem;
1944
+ height: 1rem;
1945
+ }
1946
+
1947
+ .qt-chat-response-status-text {
1948
+ font-weight: 500;
1949
+ }
1950
+
1951
+ .qt-chat-response-status[data-stage="compressing"] {
1952
+ color: var(--qt-response-status-compressing-fg);
1953
+ border-color: color-mix(in srgb, var(--qt-response-status-compressing-fg) 30%, transparent);
1954
+ }
1955
+
1956
+ .qt-chat-response-status[data-stage="gathering"] {
1957
+ color: var(--qt-response-status-gathering-fg);
1958
+ border-color: color-mix(in srgb, var(--qt-response-status-gathering-fg) 30%, transparent);
1959
+ }
1960
+
1961
+ .qt-chat-response-status[data-stage="building"] {
1962
+ color: var(--qt-response-status-building-fg);
1963
+ border-color: color-mix(in srgb, var(--qt-response-status-building-fg) 30%, transparent);
1964
+ }
1965
+
1966
+ .qt-chat-response-status[data-stage="sending"] {
1967
+ color: var(--qt-response-status-sending-fg);
1968
+ border-color: color-mix(in srgb, var(--qt-response-status-sending-fg) 30%, transparent);
1969
+ }
1970
+
1971
+ .qt-chat-response-status[data-stage="streaming"] {
1972
+ color: var(--qt-response-status-streaming-fg);
1973
+ border-color: color-mix(in srgb, var(--qt-response-status-streaming-fg) 30%, transparent);
1974
+ }
1975
+
1976
+ .qt-chat-response-status[data-stage="regenerating"],
1977
+ .qt-chat-response-status[data-stage="saving"] {
1978
+ color: var(--qt-response-status-streaming-fg);
1979
+ border-color: color-mix(in srgb, var(--qt-response-status-streaming-fg) 30%, transparent);
1980
+ }
1981
+
1982
+ .qt-chat-response-status[data-stage="tool_executing"] {
1983
+ color: var(--qt-response-status-tool-fg);
1984
+ border-color: color-mix(in srgb, var(--qt-response-status-tool-fg) 30%, transparent);
1985
+ }
1986
+
1987
+ @keyframes qt-status-fade-in {
1988
+ from { opacity: 0; transform: translateY(-4px); }
1989
+ to { opacity: 1; transform: translateY(0); }
1990
+ }
1991
+
1992
+ @media (prefers-reduced-motion: reduce) {
1993
+ .qt-chat-response-status { animation: none; }
1994
+ .qt-chat-response-status-icon .animate-pulse { animation: none; }
1995
+ }
1996
+
1796
1997
  /**
1797
1998
  * Wardrobe action notice — inline summary of outfit changes.
1798
1999
  * Double border with warm amber/gold tones, distinct from whisper (dashed) and silent (dotted).