@quilltap/theme-storybook 1.0.43 → 1.0.45

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,12 @@
2
2
 
3
3
  All notable changes to `@quilltap/theme-storybook` will be documented in this file.
4
4
 
5
+ ## [1.0.44] - 2026-06-14
6
+
7
+ ### Added
8
+ - Roleplay-template style classes: the four high-contrast chips `qt-roleplay-1..4` (with `--qt-roleplay-1..4-bg/fg` tokens themes override), the semantic chips `qt-roleplay-danger/warning/success/info/muted/code`, and the add-on flourish classes (`qt-rp-bold`, `qt-rp-italic`, `qt-rp-reverse`, `qt-rp-underline`, `qt-rp-underline-double`, `qt-rp-border`, `qt-rp-border-dashed`, `qt-rp-font-{sans,serif,mono,display,script}`). Mirrors the app-side definitions.
9
+ - `Chat` story: a "Roleplay-Template Styles" section previewing the four chips, the semantic set, and a row of add-on combinations so theme authors can see them across themes.
10
+
5
11
  ## [1.0.43] - 2026-06-11
6
12
 
7
13
  ### Added
@@ -1534,6 +1534,34 @@ var Chat = () => {
1534
1534
  ] })
1535
1535
  ] })
1536
1536
  ] }),
1537
+ /* @__PURE__ */ jsxs13("section", { style: { marginBottom: "2rem" }, children: [
1538
+ /* @__PURE__ */ jsx13("h3", { style: { fontSize: "1.125rem", fontWeight: 700, marginBottom: "1rem", borderBottom: "1px solid var(--color-border)", paddingBottom: "0.5rem" }, children: "Roleplay-Template Styles" }),
1539
+ /* @__PURE__ */ jsx13("p", { style: { color: "var(--color-muted-foreground)", marginBottom: "1rem" }, children: "Style classes a roleplay-template delimiter can be assigned: four high-contrast chips (each theme picks its own four hues) plus a semantic set. Add-on flourishes (bold, italic, reverse, underline, border, font) compose on top." }),
1540
+ /* @__PURE__ */ jsxs13("div", { className: "qt-chat-message-content", style: { display: "flex", flexDirection: "column", gap: "1rem", maxWidth: "36rem" }, children: [
1541
+ /* @__PURE__ */ jsxs13("div", { style: { display: "flex", flexWrap: "wrap", gap: "0.5rem", alignItems: "center" }, children: [
1542
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-1", children: "Style 1" }),
1543
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-2", children: "Style 2" }),
1544
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-3", children: "Style 3" }),
1545
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-4", children: "Style 4" })
1546
+ ] }),
1547
+ /* @__PURE__ */ jsxs13("div", { style: { display: "flex", flexWrap: "wrap", gap: "0.5rem", alignItems: "center" }, children: [
1548
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-danger", children: "Danger" }),
1549
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-warning", children: "Warning" }),
1550
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-success", children: "Success" }),
1551
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-info", children: "Info" }),
1552
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-muted", children: "Muted" }),
1553
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-code", children: "code" })
1554
+ ] }),
1555
+ /* @__PURE__ */ jsxs13("div", { style: { display: "flex", flexWrap: "wrap", gap: "0.5rem", alignItems: "center" }, children: [
1556
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-2 qt-rp-bold", children: "Bold" }),
1557
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-3 qt-rp-italic", children: "Italic" }),
1558
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-1 qt-rp-reverse", children: "Reverse" }),
1559
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-4 qt-rp-underline-double", children: "Underline" }),
1560
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-info qt-rp-border-dashed", children: "Dashed border" }),
1561
+ /* @__PURE__ */ jsx13("span", { className: "qt-roleplay-muted qt-rp-font-serif", children: "Serif font" })
1562
+ ] })
1563
+ ] })
1564
+ ] }),
1537
1565
  /* @__PURE__ */ jsxs13("section", { style: { marginBottom: "2rem" }, children: [
1538
1566
  /* @__PURE__ */ jsx13("h3", { style: { fontSize: "1.125rem", fontWeight: 700, marginBottom: "1rem", borderBottom: "1px solid var(--color-border)", paddingBottom: "0.5rem" }, children: "Whisper Messages" }),
1539
1567
  /* @__PURE__ */ jsx13("p", { style: { color: "var(--color-muted-foreground)", marginBottom: "1rem" }, children: "Private messages visible only to sender and recipient. Overheard whispers have a faded style." }),
package/dist/index.css CHANGED
@@ -390,6 +390,14 @@ body {
390
390
  --qt-rp-button-internal-fg: hsl(0 0% 100%);
391
391
  --qt-rp-button-ooc-bg: hsl(152 60% 28%);
392
392
  --qt-rp-button-ooc-fg: hsl(152 60% 80%);
393
+ --qt-roleplay-1-bg: hsl(217 91% 53%);
394
+ --qt-roleplay-1-fg: hsl(0 0% 100%);
395
+ --qt-roleplay-2-bg: hsl(270 65% 55%);
396
+ --qt-roleplay-2-fg: hsl(0 0% 100%);
397
+ --qt-roleplay-3-bg: hsl(38 92% 50%);
398
+ --qt-roleplay-3-fg: hsl(30 45% 12%);
399
+ --qt-roleplay-4-bg: hsl(168 78% 36%);
400
+ --qt-roleplay-4-fg: hsl(0 0% 100%);
393
401
  --qt-queue-badge-radius: var(--radius-sm);
394
402
  --qt-queue-badge-padding-x: 0.375rem;
395
403
  --qt-queue-badge-padding-y: 0.125rem;
@@ -2138,3 +2146,121 @@ body {
2138
2146
  background-color: var(--qt-terminal-closed-badge-bg);
2139
2147
  color: var(--qt-terminal-closed-badge-fg);
2140
2148
  }
2149
+ .qt-roleplay-1,
2150
+ .qt-roleplay-2,
2151
+ .qt-roleplay-3,
2152
+ .qt-roleplay-4,
2153
+ .qt-roleplay-danger,
2154
+ .qt-roleplay-warning,
2155
+ .qt-roleplay-success,
2156
+ .qt-roleplay-info,
2157
+ .qt-roleplay-muted,
2158
+ .qt-roleplay-code {
2159
+ padding: 0.125rem 0.375rem;
2160
+ border-radius: 0.1875rem;
2161
+ box-decoration-break: clone;
2162
+ -webkit-box-decoration-break: clone;
2163
+ }
2164
+ .qt-roleplay-1 {
2165
+ --qt-rp-fg: var(--qt-roleplay-1-fg);
2166
+ --qt-rp-bg: var(--qt-roleplay-1-bg);
2167
+ color: var(--qt-rp-fg);
2168
+ background: var(--qt-rp-bg);
2169
+ }
2170
+ .qt-roleplay-2 {
2171
+ --qt-rp-fg: var(--qt-roleplay-2-fg);
2172
+ --qt-rp-bg: var(--qt-roleplay-2-bg);
2173
+ color: var(--qt-rp-fg);
2174
+ background: var(--qt-rp-bg);
2175
+ }
2176
+ .qt-roleplay-3 {
2177
+ --qt-rp-fg: var(--qt-roleplay-3-fg);
2178
+ --qt-rp-bg: var(--qt-roleplay-3-bg);
2179
+ color: var(--qt-rp-fg);
2180
+ background: var(--qt-rp-bg);
2181
+ }
2182
+ .qt-roleplay-4 {
2183
+ --qt-rp-fg: var(--qt-roleplay-4-fg);
2184
+ --qt-rp-bg: var(--qt-roleplay-4-bg);
2185
+ color: var(--qt-rp-fg);
2186
+ background: var(--qt-rp-bg);
2187
+ }
2188
+ .qt-roleplay-danger {
2189
+ --qt-rp-fg: var(--color-destructive-foreground);
2190
+ --qt-rp-bg: var(--color-destructive);
2191
+ color: var(--qt-rp-fg);
2192
+ background: var(--qt-rp-bg);
2193
+ }
2194
+ .qt-roleplay-warning {
2195
+ --qt-rp-fg: var(--color-warning-foreground);
2196
+ --qt-rp-bg: var(--color-warning);
2197
+ color: var(--qt-rp-fg);
2198
+ background: var(--qt-rp-bg);
2199
+ }
2200
+ .qt-roleplay-success {
2201
+ --qt-rp-fg: var(--color-success-foreground);
2202
+ --qt-rp-bg: var(--color-success);
2203
+ color: var(--qt-rp-fg);
2204
+ background: var(--qt-rp-bg);
2205
+ }
2206
+ .qt-roleplay-info {
2207
+ --qt-rp-fg: var(--color-info-foreground);
2208
+ --qt-rp-bg: var(--color-info);
2209
+ color: var(--qt-rp-fg);
2210
+ background: var(--qt-rp-bg);
2211
+ }
2212
+ .qt-roleplay-muted {
2213
+ --qt-rp-fg: var(--color-muted-foreground);
2214
+ --qt-rp-bg: var(--color-muted);
2215
+ color: var(--qt-rp-fg);
2216
+ background: var(--qt-rp-bg);
2217
+ }
2218
+ .qt-roleplay-code {
2219
+ --qt-rp-fg: var(--color-foreground);
2220
+ --qt-rp-bg: var(--color-muted);
2221
+ color: var(--qt-rp-fg);
2222
+ background: var(--qt-rp-bg);
2223
+ font-family: var(--font-mono);
2224
+ }
2225
+ .qt-rp-bold {
2226
+ font-weight: 700;
2227
+ }
2228
+ .qt-rp-italic {
2229
+ font-style: italic;
2230
+ }
2231
+ .qt-rp-underline {
2232
+ text-decoration: underline;
2233
+ }
2234
+ .qt-rp-underline-double {
2235
+ text-decoration: underline;
2236
+ text-decoration-style: double;
2237
+ }
2238
+ .qt-rp-border {
2239
+ border: 1px solid currentColor;
2240
+ padding: 0.0625rem 0.25rem;
2241
+ border-radius: 0.1875rem;
2242
+ }
2243
+ .qt-rp-border-dashed {
2244
+ border: 1px dashed currentColor;
2245
+ padding: 0.0625rem 0.25rem;
2246
+ border-radius: 0.1875rem;
2247
+ }
2248
+ .qt-rp-reverse {
2249
+ color: var(--qt-rp-bg, var(--color-background));
2250
+ background-color: var(--qt-rp-fg, var(--color-foreground));
2251
+ }
2252
+ .qt-rp-font-sans {
2253
+ font-family: var(--theme-font-sans, ui-sans-serif, system-ui, sans-serif);
2254
+ }
2255
+ .qt-rp-font-serif {
2256
+ font-family: var(--theme-font-serif, ui-serif, Georgia, "Times New Roman", serif);
2257
+ }
2258
+ .qt-rp-font-mono {
2259
+ font-family: var(--theme-font-mono, ui-monospace, "SFMono-Regular", Menlo, monospace);
2260
+ }
2261
+ .qt-rp-font-display {
2262
+ font-family: var(--qt-rp-font-display, var(--theme-font-serif, Georgia, "Times New Roman", serif));
2263
+ }
2264
+ .qt-rp-font-script {
2265
+ font-family: var(--qt-rp-font-script, "Segoe Script", "Brush Script MT", cursive);
2266
+ }
package/dist/index.js CHANGED
@@ -1643,6 +1643,34 @@ var Chat = () => {
1643
1643
  ] })
1644
1644
  ] })
1645
1645
  ] }),
1646
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("section", { style: { marginBottom: "2rem" }, children: [
1647
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("h3", { style: { fontSize: "1.125rem", fontWeight: 700, marginBottom: "1rem", borderBottom: "1px solid var(--color-border)", paddingBottom: "0.5rem" }, children: "Roleplay-Template Styles" }),
1648
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { style: { color: "var(--color-muted-foreground)", marginBottom: "1rem" }, children: "Style classes a roleplay-template delimiter can be assigned: four high-contrast chips (each theme picks its own four hues) plus a semantic set. Add-on flourishes (bold, italic, reverse, underline, border, font) compose on top." }),
1649
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "qt-chat-message-content", style: { display: "flex", flexDirection: "column", gap: "1rem", maxWidth: "36rem" }, children: [
1650
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: { display: "flex", flexWrap: "wrap", gap: "0.5rem", alignItems: "center" }, children: [
1651
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-1", children: "Style 1" }),
1652
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-2", children: "Style 2" }),
1653
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-3", children: "Style 3" }),
1654
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-4", children: "Style 4" })
1655
+ ] }),
1656
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: { display: "flex", flexWrap: "wrap", gap: "0.5rem", alignItems: "center" }, children: [
1657
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-danger", children: "Danger" }),
1658
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-warning", children: "Warning" }),
1659
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-success", children: "Success" }),
1660
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-info", children: "Info" }),
1661
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-muted", children: "Muted" }),
1662
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-code", children: "code" })
1663
+ ] }),
1664
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: { display: "flex", flexWrap: "wrap", gap: "0.5rem", alignItems: "center" }, children: [
1665
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-2 qt-rp-bold", children: "Bold" }),
1666
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-3 qt-rp-italic", children: "Italic" }),
1667
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-1 qt-rp-reverse", children: "Reverse" }),
1668
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-4 qt-rp-underline-double", children: "Underline" }),
1669
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-info qt-rp-border-dashed", children: "Dashed border" }),
1670
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "qt-roleplay-muted qt-rp-font-serif", children: "Serif font" })
1671
+ ] })
1672
+ ] })
1673
+ ] }),
1646
1674
  /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("section", { style: { marginBottom: "2rem" }, children: [
1647
1675
  /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("h3", { style: { fontSize: "1.125rem", fontWeight: 700, marginBottom: "1rem", borderBottom: "1px solid var(--color-border)", paddingBottom: "0.5rem" }, children: "Whisper Messages" }),
1648
1676
  /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { style: { color: "var(--color-muted-foreground)", marginBottom: "1rem" }, children: "Private messages visible only to sender and recipient. Overheard whispers have a faded style." }),
package/dist/index.mjs CHANGED
@@ -20,7 +20,7 @@ import {
20
20
  Terminal,
21
21
  ThemeComparison,
22
22
  Typography
23
- } from "./chunk-MKFVWQPL.mjs";
23
+ } from "./chunk-77W5TNBS.mjs";
24
24
  import "./chunk-WUKYLWAZ.mjs";
25
25
 
26
26
  // src/preview.tsx
@@ -1580,6 +1580,34 @@ var Chat = () => {
1580
1580
  ] })
1581
1581
  ] })
1582
1582
  ] }),
1583
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("section", { style: { marginBottom: "2rem" }, children: [
1584
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("h3", { style: { fontSize: "1.125rem", fontWeight: 700, marginBottom: "1rem", borderBottom: "1px solid var(--color-border)", paddingBottom: "0.5rem" }, children: "Roleplay-Template Styles" }),
1585
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { style: { color: "var(--color-muted-foreground)", marginBottom: "1rem" }, children: "Style classes a roleplay-template delimiter can be assigned: four high-contrast chips (each theme picks its own four hues) plus a semantic set. Add-on flourishes (bold, italic, reverse, underline, border, font) compose on top." }),
1586
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "qt-chat-message-content", style: { display: "flex", flexDirection: "column", gap: "1rem", maxWidth: "36rem" }, children: [
1587
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: { display: "flex", flexWrap: "wrap", gap: "0.5rem", alignItems: "center" }, children: [
1588
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-1", children: "Style 1" }),
1589
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-2", children: "Style 2" }),
1590
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-3", children: "Style 3" }),
1591
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-4", children: "Style 4" })
1592
+ ] }),
1593
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: { display: "flex", flexWrap: "wrap", gap: "0.5rem", alignItems: "center" }, children: [
1594
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-danger", children: "Danger" }),
1595
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-warning", children: "Warning" }),
1596
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-success", children: "Success" }),
1597
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-info", children: "Info" }),
1598
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-muted", children: "Muted" }),
1599
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-code", children: "code" })
1600
+ ] }),
1601
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: { display: "flex", flexWrap: "wrap", gap: "0.5rem", alignItems: "center" }, children: [
1602
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-2 qt-rp-bold", children: "Bold" }),
1603
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-3 qt-rp-italic", children: "Italic" }),
1604
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-1 qt-rp-reverse", children: "Reverse" }),
1605
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-4 qt-rp-underline-double", children: "Underline" }),
1606
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-info qt-rp-border-dashed", children: "Dashed border" }),
1607
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "qt-roleplay-muted qt-rp-font-serif", children: "Serif font" })
1608
+ ] })
1609
+ ] })
1610
+ ] }),
1583
1611
  /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("section", { style: { marginBottom: "2rem" }, children: [
1584
1612
  /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("h3", { style: { fontSize: "1.125rem", fontWeight: 700, marginBottom: "1rem", borderBottom: "1px solid var(--color-border)", paddingBottom: "0.5rem" }, children: "Whisper Messages" }),
1585
1613
  /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { style: { color: "var(--color-muted-foreground)", marginBottom: "1rem" }, children: "Private messages visible only to sender and recipient. Overheard whispers have a faded style." }),
@@ -20,7 +20,7 @@ import {
20
20
  Terminal,
21
21
  ThemeComparison,
22
22
  Typography
23
- } from "../chunk-MKFVWQPL.mjs";
23
+ } from "../chunk-77W5TNBS.mjs";
24
24
  import "../chunk-WUKYLWAZ.mjs";
25
25
  export {
26
26
  Avatars,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quilltap/theme-storybook",
3
- "version": "1.0.43",
3
+ "version": "1.0.45",
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",
@@ -43,10 +43,10 @@
43
43
  "storybook": ">=8.0.0"
44
44
  },
45
45
  "devDependencies": {
46
- "@storybook/react": "^10.4.2",
47
- "@types/react": "^19.2.16",
46
+ "@storybook/react": "^10.4.6",
47
+ "@types/react": "^19.2.17",
48
48
  "react": "^19.2.7",
49
- "storybook": "^10.4.2",
49
+ "storybook": "^10.4.6",
50
50
  "tsup": "^8.5.1",
51
51
  "typescript": "^5.9.3"
52
52
  },
@@ -287,6 +287,17 @@
287
287
  --qt-rp-button-ooc-bg: hsl(152 60% 28%);
288
288
  --qt-rp-button-ooc-fg: hsl(152 60% 80%);
289
289
 
290
+ /* Roleplay-template palette (qt-roleplay-1..4): four distinct high-contrast
291
+ chips a delimiter can opt into. Themes override these four pairs to taste. */
292
+ --qt-roleplay-1-bg: hsl(217 91% 53%);
293
+ --qt-roleplay-1-fg: hsl(0 0% 100%);
294
+ --qt-roleplay-2-bg: hsl(270 65% 55%);
295
+ --qt-roleplay-2-fg: hsl(0 0% 100%);
296
+ --qt-roleplay-3-bg: hsl(38 92% 50%);
297
+ --qt-roleplay-3-fg: hsl(30 45% 12%);
298
+ --qt-roleplay-4-bg: hsl(168 78% 36%);
299
+ --qt-roleplay-4-fg: hsl(0 0% 100%);
300
+
290
301
  /* Queue badge variables */
291
302
  --qt-queue-badge-radius: var(--radius-sm);
292
303
  --qt-queue-badge-padding-x: 0.375rem;
@@ -2546,3 +2557,44 @@
2546
2557
  background-color: var(--qt-terminal-closed-badge-bg);
2547
2558
  color: var(--qt-terminal-closed-badge-fg);
2548
2559
  }
2560
+
2561
+ /* ==========================================================================
2562
+ ROLEPLAY-TEMPLATE STYLES
2563
+ The chips + add-on flourishes a roleplay-template delimiter can opt into. In
2564
+ the app these are scoped under .qt-chat-message-content to override prose; the
2565
+ stylebook has no prose layer, so they are declared plainly here for preview.
2566
+ ========================================================================== */
2567
+ .qt-roleplay-1, .qt-roleplay-2, .qt-roleplay-3, .qt-roleplay-4,
2568
+ .qt-roleplay-danger, .qt-roleplay-warning, .qt-roleplay-success,
2569
+ .qt-roleplay-info, .qt-roleplay-muted, .qt-roleplay-code {
2570
+ padding: 0.125rem 0.375rem;
2571
+ border-radius: 0.1875rem;
2572
+ box-decoration-break: clone;
2573
+ -webkit-box-decoration-break: clone;
2574
+ }
2575
+
2576
+ .qt-roleplay-1 { --qt-rp-fg: var(--qt-roleplay-1-fg); --qt-rp-bg: var(--qt-roleplay-1-bg); color: var(--qt-rp-fg); background: var(--qt-rp-bg); }
2577
+ .qt-roleplay-2 { --qt-rp-fg: var(--qt-roleplay-2-fg); --qt-rp-bg: var(--qt-roleplay-2-bg); color: var(--qt-rp-fg); background: var(--qt-rp-bg); }
2578
+ .qt-roleplay-3 { --qt-rp-fg: var(--qt-roleplay-3-fg); --qt-rp-bg: var(--qt-roleplay-3-bg); color: var(--qt-rp-fg); background: var(--qt-rp-bg); }
2579
+ .qt-roleplay-4 { --qt-rp-fg: var(--qt-roleplay-4-fg); --qt-rp-bg: var(--qt-roleplay-4-bg); color: var(--qt-rp-fg); background: var(--qt-rp-bg); }
2580
+
2581
+ .qt-roleplay-danger { --qt-rp-fg: var(--color-destructive-foreground); --qt-rp-bg: var(--color-destructive); color: var(--qt-rp-fg); background: var(--qt-rp-bg); }
2582
+ .qt-roleplay-warning { --qt-rp-fg: var(--color-warning-foreground); --qt-rp-bg: var(--color-warning); color: var(--qt-rp-fg); background: var(--qt-rp-bg); }
2583
+ .qt-roleplay-success { --qt-rp-fg: var(--color-success-foreground); --qt-rp-bg: var(--color-success); color: var(--qt-rp-fg); background: var(--qt-rp-bg); }
2584
+ .qt-roleplay-info { --qt-rp-fg: var(--color-info-foreground); --qt-rp-bg: var(--color-info); color: var(--qt-rp-fg); background: var(--qt-rp-bg); }
2585
+ .qt-roleplay-muted { --qt-rp-fg: var(--color-muted-foreground); --qt-rp-bg: var(--color-muted); color: var(--qt-rp-fg); background: var(--qt-rp-bg); }
2586
+ .qt-roleplay-code { --qt-rp-fg: var(--color-foreground); --qt-rp-bg: var(--color-muted); color: var(--qt-rp-fg); background: var(--qt-rp-bg); font-family: var(--font-mono); }
2587
+
2588
+ /* Add-on flourishes (composed on top of any base style). */
2589
+ .qt-rp-bold { font-weight: 700; }
2590
+ .qt-rp-italic { font-style: italic; }
2591
+ .qt-rp-underline { text-decoration: underline; }
2592
+ .qt-rp-underline-double { text-decoration: underline; text-decoration-style: double; }
2593
+ .qt-rp-border { border: 1px solid currentColor; padding: 0.0625rem 0.25rem; border-radius: 0.1875rem; }
2594
+ .qt-rp-border-dashed { border: 1px dashed currentColor; padding: 0.0625rem 0.25rem; border-radius: 0.1875rem; }
2595
+ .qt-rp-reverse { color: var(--qt-rp-bg, var(--color-background)); background-color: var(--qt-rp-fg, var(--color-foreground)); }
2596
+ .qt-rp-font-sans { font-family: var(--theme-font-sans, ui-sans-serif, system-ui, sans-serif); }
2597
+ .qt-rp-font-serif { font-family: var(--theme-font-serif, ui-serif, Georgia, "Times New Roman", serif); }
2598
+ .qt-rp-font-mono { font-family: var(--theme-font-mono, ui-monospace, "SFMono-Regular", Menlo, monospace); }
2599
+ .qt-rp-font-display { font-family: var(--qt-rp-font-display, var(--theme-font-serif, Georgia, "Times New Roman", serif)); }
2600
+ .qt-rp-font-script { font-family: var(--qt-rp-font-script, "Segoe Script", "Brush Script MT", cursive); }
@@ -193,6 +193,40 @@ export const Chat: React.FC = () => {
193
193
  </div>
194
194
  </section>
195
195
 
196
+ {/* Roleplay-Template Styles */}
197
+ <section style={{ marginBottom: '2rem' }}>
198
+ <h3 style={{ fontSize: '1.125rem', fontWeight: 700, marginBottom: '1rem', borderBottom: '1px solid var(--color-border)', paddingBottom: '0.5rem' }}>
199
+ Roleplay-Template Styles
200
+ </h3>
201
+ <p style={{ color: 'var(--color-muted-foreground)', marginBottom: '1rem' }}>
202
+ Style classes a roleplay-template delimiter can be assigned: four high-contrast chips (each theme picks its own four hues) plus a semantic set. Add-on flourishes (bold, italic, reverse, underline, border, font) compose on top.
203
+ </p>
204
+ <div className="qt-chat-message-content" style={{ display: 'flex', flexDirection: 'column', gap: '1rem', maxWidth: '36rem' }}>
205
+ <div style={{ display: 'flex', flexWrap: 'wrap', gap: '0.5rem', alignItems: 'center' }}>
206
+ <span className="qt-roleplay-1">Style 1</span>
207
+ <span className="qt-roleplay-2">Style 2</span>
208
+ <span className="qt-roleplay-3">Style 3</span>
209
+ <span className="qt-roleplay-4">Style 4</span>
210
+ </div>
211
+ <div style={{ display: 'flex', flexWrap: 'wrap', gap: '0.5rem', alignItems: 'center' }}>
212
+ <span className="qt-roleplay-danger">Danger</span>
213
+ <span className="qt-roleplay-warning">Warning</span>
214
+ <span className="qt-roleplay-success">Success</span>
215
+ <span className="qt-roleplay-info">Info</span>
216
+ <span className="qt-roleplay-muted">Muted</span>
217
+ <span className="qt-roleplay-code">code</span>
218
+ </div>
219
+ <div style={{ display: 'flex', flexWrap: 'wrap', gap: '0.5rem', alignItems: 'center' }}>
220
+ <span className="qt-roleplay-2 qt-rp-bold">Bold</span>
221
+ <span className="qt-roleplay-3 qt-rp-italic">Italic</span>
222
+ <span className="qt-roleplay-1 qt-rp-reverse">Reverse</span>
223
+ <span className="qt-roleplay-4 qt-rp-underline-double">Underline</span>
224
+ <span className="qt-roleplay-info qt-rp-border-dashed">Dashed border</span>
225
+ <span className="qt-roleplay-muted qt-rp-font-serif">Serif font</span>
226
+ </div>
227
+ </div>
228
+ </section>
229
+
196
230
  {/* Whisper Messages */}
197
231
  <section style={{ marginBottom: '2rem' }}>
198
232
  <h3 style={{ fontSize: '1.125rem', fontWeight: 700, marginBottom: '1rem', borderBottom: '1px solid var(--color-border)', paddingBottom: '0.5rem' }}>