@runtypelabs/persona 2.3.1 → 3.1.0

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.
Files changed (43) hide show
  1. package/README.md +222 -5
  2. package/dist/index.cjs +42 -42
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +832 -571
  5. package/dist/index.d.ts +832 -571
  6. package/dist/index.global.js +88 -88
  7. package/dist/index.global.js.map +1 -1
  8. package/dist/index.js +42 -42
  9. package/dist/index.js.map +1 -1
  10. package/dist/widget.css +257 -67
  11. package/package.json +2 -4
  12. package/src/components/artifact-card.ts +39 -5
  13. package/src/components/artifact-pane.ts +68 -127
  14. package/src/components/composer-builder.ts +3 -23
  15. package/src/components/header-builder.ts +29 -34
  16. package/src/components/header-layouts.ts +109 -41
  17. package/src/components/launcher.ts +10 -7
  18. package/src/components/message-bubble.ts +7 -11
  19. package/src/components/panel.ts +4 -4
  20. package/src/defaults.ts +22 -93
  21. package/src/index.ts +20 -7
  22. package/src/presets.ts +66 -51
  23. package/src/runtime/host-layout.test.ts +333 -0
  24. package/src/runtime/host-layout.ts +346 -27
  25. package/src/runtime/init.test.ts +113 -8
  26. package/src/runtime/init.ts +1 -1
  27. package/src/styles/widget.css +257 -67
  28. package/src/types/theme.ts +76 -0
  29. package/src/types.ts +86 -97
  30. package/src/ui.docked.test.ts +203 -7
  31. package/src/ui.ts +125 -92
  32. package/src/utils/artifact-gate.ts +1 -1
  33. package/src/utils/buttons.ts +417 -0
  34. package/src/utils/code-generators.test.ts +43 -7
  35. package/src/utils/code-generators.ts +9 -25
  36. package/src/utils/deep-merge.ts +26 -0
  37. package/src/utils/dock.ts +18 -5
  38. package/src/utils/dropdown.ts +178 -0
  39. package/src/utils/theme.test.ts +90 -15
  40. package/src/utils/theme.ts +20 -46
  41. package/src/utils/tokens.ts +108 -11
  42. package/src/styles/tailwind.css +0 -20
  43. package/src/utils/migration.ts +0 -220
@@ -1,4 +1,4 @@
1
- #persona-root {
1
+ [data-persona-root] {
2
2
  all: initial;
3
3
  font-family: var(--persona-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", sans-serif);
4
4
  font-size: var(--persona-font-size, 1rem);
@@ -17,7 +17,7 @@
17
17
  --persona-md-blockquote-text-color: var(--persona-muted, #6b7280);
18
18
  }
19
19
 
20
- #persona-root * {
20
+ [data-persona-root] * {
21
21
  box-sizing: border-box;
22
22
  }
23
23
 
@@ -94,7 +94,7 @@
94
94
  }
95
95
 
96
96
  /* Widget CSS Variables - scoped to widget root to avoid polluting global namespace */
97
- #persona-root {
97
+ [data-persona-root] {
98
98
  --persona-radius-sm: 0.125rem;
99
99
  --persona-radius-md: 0.375rem;
100
100
  --persona-radius-lg: 0.5rem;
@@ -1165,37 +1165,37 @@
1165
1165
  border-color: var(--persona-message-assistant-border, var(--persona-border, #e5e7eb));
1166
1166
  }
1167
1167
 
1168
- #persona-root .vanilla-message-assistant-bubble.persona-shadow-sm {
1168
+ [data-persona-root] .vanilla-message-assistant-bubble.persona-shadow-sm {
1169
1169
  box-shadow: var(--persona-message-assistant-shadow, 0 1px 2px 0 rgb(0 0 0 / 0.05));
1170
1170
  }
1171
1171
 
1172
- #persona-root .vanilla-message-user-bubble.persona-shadow-sm {
1172
+ [data-persona-root] .vanilla-message-user-bubble.persona-shadow-sm {
1173
1173
  box-shadow: var(--persona-message-user-shadow, 0 5px 15px rgba(15, 23, 42, 0.08));
1174
1174
  }
1175
1175
 
1176
- #persona-root .vanilla-tool-bubble.persona-shadow-sm {
1176
+ [data-persona-root] .vanilla-tool-bubble.persona-shadow-sm {
1177
1177
  box-shadow: var(--persona-tool-bubble-shadow, 0 5px 15px rgba(15, 23, 42, 0.08));
1178
1178
  }
1179
1179
 
1180
- #persona-root .vanilla-reasoning-bubble.persona-shadow-sm {
1180
+ [data-persona-root] .vanilla-reasoning-bubble.persona-shadow-sm {
1181
1181
  box-shadow: var(--persona-reasoning-bubble-shadow, 0 5px 15px rgba(15, 23, 42, 0.08));
1182
1182
  }
1183
1183
 
1184
1184
  /* Artifact markdown (no .vanilla-message-bubble wrapper) */
1185
- #persona-root .persona-markdown-bubble {
1185
+ [data-persona-root] .persona-markdown-bubble {
1186
1186
  color: var(--persona-text, #111827);
1187
1187
  font-family: var(--persona-md-prose-font-family, inherit);
1188
1188
  }
1189
1189
 
1190
- #persona-root .persona-markdown-bubble p {
1190
+ [data-persona-root] .persona-markdown-bubble p {
1191
1191
  margin: 0 0 1.5em;
1192
1192
  }
1193
1193
 
1194
- #persona-root .persona-markdown-bubble p:last-child {
1194
+ [data-persona-root] .persona-markdown-bubble p:last-child {
1195
1195
  margin-bottom: 0;
1196
1196
  }
1197
1197
 
1198
- #persona-root .persona-markdown-bubble code:not(pre code) {
1198
+ [data-persona-root] .persona-markdown-bubble code:not(pre code) {
1199
1199
  background-color: var(--persona-md-inline-code-bg);
1200
1200
  color: var(--persona-md-inline-code-color, inherit);
1201
1201
  padding: var(--persona-md-inline-code-padding);
@@ -1203,12 +1203,12 @@
1203
1203
  font-size: var(--persona-md-inline-code-font-size);
1204
1204
  }
1205
1205
 
1206
- #persona-root .persona-markdown-bubble a {
1206
+ [data-persona-root] .persona-markdown-bubble a {
1207
1207
  color: var(--persona-md-link-color, var(--persona-accent, #3b82f6));
1208
1208
  text-decoration: underline;
1209
1209
  }
1210
1210
 
1211
- #persona-root .persona-markdown-bubble pre {
1211
+ [data-persona-root] .persona-markdown-bubble pre {
1212
1212
  background-color: var(--persona-md-code-block-bg);
1213
1213
  border: 1px solid var(--persona-md-code-block-border-color);
1214
1214
  border-radius: var(--persona-radius-md, 0.375rem);
@@ -1243,7 +1243,7 @@
1243
1243
  text-decoration: underline;
1244
1244
  }
1245
1245
 
1246
- #persona-root .vanilla-message-assistant-bubble a {
1246
+ [data-persona-root] .vanilla-message-assistant-bubble a {
1247
1247
  color: var(--persona-md-link-color, var(--persona-accent, #3b82f6));
1248
1248
  }
1249
1249
 
@@ -1328,7 +1328,7 @@
1328
1328
  Markdown Header Styles
1329
1329
  ============================================ */
1330
1330
  .vanilla-message-bubble h1,
1331
- #persona-root .persona-markdown-bubble h1 {
1331
+ [data-persona-root] .persona-markdown-bubble h1 {
1332
1332
  font-size: var(--persona-md-h1-size);
1333
1333
  font-weight: var(--persona-md-h1-weight);
1334
1334
  margin: var(--persona-md-h1-margin);
@@ -1337,7 +1337,7 @@
1337
1337
  }
1338
1338
 
1339
1339
  .vanilla-message-bubble h2,
1340
- #persona-root .persona-markdown-bubble h2 {
1340
+ [data-persona-root] .persona-markdown-bubble h2 {
1341
1341
  font-size: var(--persona-md-h2-size);
1342
1342
  font-weight: var(--persona-md-h2-weight);
1343
1343
  margin: var(--persona-md-h2-margin);
@@ -1346,7 +1346,7 @@
1346
1346
  }
1347
1347
 
1348
1348
  .vanilla-message-bubble h3,
1349
- #persona-root .persona-markdown-bubble h3 {
1349
+ [data-persona-root] .persona-markdown-bubble h3 {
1350
1350
  font-size: var(--persona-md-h3-size);
1351
1351
  font-weight: var(--persona-md-h3-weight);
1352
1352
  margin: var(--persona-md-h3-margin);
@@ -1355,7 +1355,7 @@
1355
1355
  }
1356
1356
 
1357
1357
  .vanilla-message-bubble h4,
1358
- #persona-root .persona-markdown-bubble h4 {
1358
+ [data-persona-root] .persona-markdown-bubble h4 {
1359
1359
  font-size: var(--persona-md-h4-size);
1360
1360
  font-weight: var(--persona-md-h4-weight);
1361
1361
  margin: var(--persona-md-h4-margin);
@@ -1364,7 +1364,7 @@
1364
1364
  }
1365
1365
 
1366
1366
  .vanilla-message-bubble h5,
1367
- #persona-root .persona-markdown-bubble h5 {
1367
+ [data-persona-root] .persona-markdown-bubble h5 {
1368
1368
  font-size: var(--persona-md-h5-size);
1369
1369
  font-weight: var(--persona-md-h5-weight);
1370
1370
  margin: var(--persona-md-h5-margin);
@@ -1373,7 +1373,7 @@
1373
1373
  }
1374
1374
 
1375
1375
  .vanilla-message-bubble h6,
1376
- #persona-root .persona-markdown-bubble h6 {
1376
+ [data-persona-root] .persona-markdown-bubble h6 {
1377
1377
  font-size: var(--persona-md-h6-size);
1378
1378
  font-weight: var(--persona-md-h6-weight);
1379
1379
  margin: var(--persona-md-h6-margin);
@@ -2040,12 +2040,12 @@
2040
2040
  Visibility (Tailwind parity — prefix persona-)
2041
2041
  Shipped widget.css is hand-maintained; these utilities are used in TS but not generated by Tailwind at build time.
2042
2042
  ============================================ */
2043
- #persona-root .persona-hidden {
2043
+ [data-persona-root] .persona-hidden {
2044
2044
  display: none !important;
2045
2045
  }
2046
2046
 
2047
2047
  @media (min-width: 768px) {
2048
- #persona-root .md\:persona-hidden {
2048
+ [data-persona-root] .md\:persona-hidden {
2049
2049
  display: none !important;
2050
2050
  }
2051
2051
  }
@@ -2055,35 +2055,35 @@
2055
2055
  Vars set from TS: --persona-artifact-split-gap, --persona-artifact-pane-width,
2056
2056
  --persona-artifact-pane-max-width, --persona-artifact-pane-min-width
2057
2057
  ============================================ */
2058
- #persona-root .persona-artifact-split-root {
2058
+ [data-persona-root] .persona-artifact-split-root {
2059
2059
  gap: var(--persona-artifact-split-gap, 0.5rem);
2060
2060
  }
2061
2061
 
2062
2062
  /* Document toolbar preset — optional layout vars: --persona-artifact-doc-toolbar-icon-color, etc. */
2063
- #persona-root .persona-artifact-toolbar-document .persona-artifact-doc-icon-btn {
2063
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-doc-icon-btn {
2064
2064
  display: inline-flex;
2065
2065
  align-items: center;
2066
2066
  justify-content: center;
2067
2067
  padding: var(--persona-artifact-toolbar-icon-padding, 0.25rem);
2068
2068
  border-radius: var(--persona-artifact-toolbar-icon-radius, var(--persona-radius-md, 0.375rem));
2069
2069
  border: var(--persona-artifact-toolbar-icon-border, 1px solid var(--persona-border, #e5e7eb));
2070
- background: var(--persona-surface, #ffffff);
2070
+ background: var(--persona-artifact-toolbar-icon-bg, var(--persona-surface, #ffffff));
2071
2071
  color: var(--persona-artifact-doc-toolbar-icon-color, var(--persona-text, #111827));
2072
2072
  cursor: pointer;
2073
2073
  line-height: 1;
2074
2074
  }
2075
2075
 
2076
- #persona-root .persona-artifact-toolbar-document .persona-artifact-doc-icon-btn:hover {
2076
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-doc-icon-btn:hover {
2077
2077
  color: var(--persona-artifact-toolbar-icon-hover-color, inherit);
2078
2078
  background: var(--persona-artifact-toolbar-icon-hover-bg, var(--persona-container, #f3f4f6));
2079
2079
  }
2080
2080
 
2081
- #persona-root .persona-artifact-toolbar-document .persona-artifact-doc-icon-btn[aria-pressed="true"] {
2081
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-doc-icon-btn[aria-pressed="true"] {
2082
2082
  background: var(--persona-artifact-doc-toggle-active-bg, var(--persona-container, #f3f4f6));
2083
2083
  border-color: var(--persona-artifact-doc-toggle-active-border, var(--persona-border, #e5e7eb));
2084
2084
  }
2085
2085
 
2086
- #persona-root .persona-artifact-toolbar-document .persona-artifact-doc-copy-btn {
2086
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-doc-copy-btn {
2087
2087
  display: inline-flex;
2088
2088
  align-items: center;
2089
2089
  gap: 0.35rem;
@@ -2097,45 +2097,227 @@
2097
2097
  line-height: 1.25;
2098
2098
  }
2099
2099
 
2100
- #persona-root .persona-artifact-toolbar-document .persona-artifact-doc-copy-btn:hover {
2100
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-doc-copy-btn:hover {
2101
2101
  background: var(--persona-artifact-toolbar-icon-hover-bg, var(--persona-container, #f3f4f6));
2102
2102
  }
2103
2103
 
2104
- #persona-root .persona-artifact-toolbar-document .persona-artifact-doc-copy-label {
2104
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-doc-copy-label {
2105
2105
  font-weight: 500;
2106
2106
  }
2107
2107
 
2108
- /* Copy menu dropdown theming */
2109
- #persona-root .persona-artifact-doc-copy-menu {
2110
- background: var(--persona-artifact-toolbar-copy-menu-bg, var(--persona-surface, #fff));
2111
- border: var(--persona-artifact-toolbar-copy-menu-border, 1px solid var(--persona-border, #e5e7eb));
2112
- box-shadow: var(--persona-artifact-toolbar-copy-menu-shadow, 0 4px 6px -1px rgba(0,0,0,.1));
2113
- border-radius: var(--persona-artifact-toolbar-copy-menu-radius, 0.375rem);
2114
- }
2115
-
2116
- #persona-root .persona-artifact-doc-copy-menu button:hover {
2117
- background: var(--persona-artifact-toolbar-copy-menu-item-hover-bg, var(--persona-container, #f3f4f6));
2118
- }
2119
-
2120
2108
  /* Artifact tab theming */
2121
- #persona-root .persona-artifact-tab {
2109
+ [data-persona-root] .persona-artifact-tab {
2122
2110
  background: var(--persona-artifact-tab-bg, transparent);
2123
2111
  border-radius: var(--persona-artifact-tab-radius, 0.5rem);
2124
2112
  color: var(--persona-artifact-tab-color, inherit);
2125
2113
  }
2126
2114
 
2127
- #persona-root .persona-artifact-tab.persona-bg-persona-container {
2115
+ [data-persona-root] .persona-artifact-tab.persona-bg-persona-container {
2128
2116
  background: var(--persona-artifact-tab-active-bg, var(--persona-container, #f3f4f6));
2129
2117
  border-color: var(--persona-artifact-tab-active-border, var(--persona-border, #e5e7eb));
2130
2118
  }
2131
2119
 
2132
2120
  /* Artifact toolbar background theming */
2133
- #persona-root .persona-artifact-toolbar {
2121
+ [data-persona-root] .persona-artifact-toolbar {
2134
2122
  background: var(--persona-artifact-toolbar-bg, var(--persona-surface, #fff));
2135
2123
  }
2136
2124
 
2125
+ /* Toggle group gap */
2126
+ [data-persona-root] .persona-artifact-toggle-group {
2127
+ gap: var(--persona-artifact-toolbar-toggle-group-gap, 0.25rem);
2128
+ }
2129
+
2130
+ /* Toggle button border-radius (view/code buttons) */
2131
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-view-btn,
2132
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-code-btn {
2133
+ border-radius: var(--persona-artifact-toolbar-toggle-radius, var(--persona-artifact-toolbar-icon-radius, var(--persona-radius-md, 0.375rem)));
2134
+ }
2135
+
2136
+ /* Tab hover */
2137
+ [data-persona-root] .persona-artifact-tab:hover {
2138
+ background: var(--persona-artifact-tab-hover-bg, var(--persona-container, #f3f4f6));
2139
+ }
2140
+
2141
+ /* Tab list container */
2142
+ [data-persona-root] .persona-artifact-list {
2143
+ background: var(--persona-artifact-tab-list-bg, transparent);
2144
+ border-bottom-color: var(--persona-artifact-tab-list-border-color, var(--persona-border, #e5e7eb));
2145
+ padding: var(--persona-artifact-tab-list-padding, 0.5rem);
2146
+ }
2147
+
2148
+ /* Toolbar border override */
2149
+ [data-persona-root] .persona-artifact-toolbar-document {
2150
+ border-bottom: var(--persona-artifact-toolbar-border, 1px solid var(--persona-border, #e5e7eb));
2151
+ }
2152
+
2153
+ /* ── Composable button utilities ── */
2154
+
2155
+ /* Icon button — base for all icon-only buttons created by createIconButton() */
2156
+ [data-persona-root] .persona-icon-btn {
2157
+ display: inline-flex;
2158
+ align-items: center;
2159
+ justify-content: center;
2160
+ padding: var(--persona-icon-btn-padding, 0.25rem);
2161
+ border-radius: var(--persona-icon-btn-radius, var(--persona-radius-md, 0.375rem));
2162
+ border: var(--persona-icon-btn-border, 1px solid var(--persona-border, #e5e7eb));
2163
+ background: var(--persona-icon-btn-bg, var(--persona-surface, #ffffff));
2164
+ color: var(--persona-icon-btn-color, var(--persona-text, #111827));
2165
+ cursor: pointer;
2166
+ line-height: 1;
2167
+ transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
2168
+ }
2169
+
2170
+ [data-persona-root] .persona-icon-btn:hover {
2171
+ background: var(--persona-icon-btn-hover-bg, var(--persona-container, #f3f4f6));
2172
+ color: var(--persona-icon-btn-hover-color, inherit);
2173
+ }
2174
+
2175
+ [data-persona-root] .persona-icon-btn:focus-visible {
2176
+ outline: 2px solid var(--persona-accent, #3b82f6);
2177
+ outline-offset: 2px;
2178
+ }
2179
+
2180
+ [data-persona-root] .persona-icon-btn[aria-pressed="true"] {
2181
+ background: var(--persona-icon-btn-active-bg, var(--persona-container, #f3f4f6));
2182
+ border-color: var(--persona-icon-btn-active-border, var(--persona-border, #e5e7eb));
2183
+ }
2184
+
2185
+ /* Label button — icon + text button created by createLabelButton() */
2186
+ [data-persona-root] .persona-label-btn {
2187
+ display: inline-flex;
2188
+ align-items: center;
2189
+ gap: var(--persona-label-btn-gap, 0.35rem);
2190
+ padding: var(--persona-label-btn-padding, 0.25rem 0.5rem);
2191
+ border-radius: var(--persona-label-btn-radius, var(--persona-radius-md, 0.375rem));
2192
+ border: var(--persona-label-btn-border, 1px solid var(--persona-border, #e5e7eb));
2193
+ background: var(--persona-label-btn-bg, var(--persona-surface, #ffffff));
2194
+ color: var(--persona-label-btn-color, var(--persona-text, #111827));
2195
+ cursor: pointer;
2196
+ font-size: var(--persona-label-btn-font-size, 0.75rem);
2197
+ font-weight: 500;
2198
+ line-height: 1.25;
2199
+ white-space: nowrap;
2200
+ transition: background-color 0.15s ease, color 0.15s ease;
2201
+ }
2202
+
2203
+ [data-persona-root] .persona-label-btn:hover {
2204
+ background: var(--persona-label-btn-hover-bg, var(--persona-container, #f3f4f6));
2205
+ }
2206
+
2207
+ [data-persona-root] .persona-label-btn:focus-visible {
2208
+ outline: 2px solid var(--persona-accent, #3b82f6);
2209
+ outline-offset: 2px;
2210
+ }
2211
+
2212
+ [data-persona-root] .persona-label-btn--sm {
2213
+ padding: var(--persona-label-btn-padding, 0.25rem 0.5rem);
2214
+ font-size: var(--persona-label-btn-font-size, 0.75rem);
2215
+ }
2216
+
2217
+ [data-persona-root] .persona-label-btn--md {
2218
+ padding: 0.375rem 0.75rem;
2219
+ font-size: 0.8125rem;
2220
+ }
2221
+
2222
+ [data-persona-root] .persona-label-btn--primary {
2223
+ background: var(--persona-primary, #3b82f6);
2224
+ color: var(--persona-text-inverse, #ffffff);
2225
+ border-color: transparent;
2226
+ }
2227
+
2228
+ [data-persona-root] .persona-label-btn--primary:hover {
2229
+ opacity: 0.9;
2230
+ }
2231
+
2232
+ [data-persona-root] .persona-label-btn--destructive {
2233
+ color: var(--persona-label-btn-destructive-color, #ef4444);
2234
+ }
2235
+
2236
+ [data-persona-root] .persona-label-btn--ghost {
2237
+ border: none;
2238
+ background: transparent;
2239
+ }
2240
+
2241
+ [data-persona-root] .persona-label-btn--ghost:hover {
2242
+ background: var(--persona-label-btn-hover-bg, var(--persona-container, #f3f4f6));
2243
+ }
2244
+
2245
+ /* Toggle group — mutually exclusive button set created by createToggleGroup() */
2246
+ [data-persona-root] .persona-toggle-group {
2247
+ display: inline-flex;
2248
+ gap: var(--persona-toggle-group-gap, 0);
2249
+ }
2250
+
2251
+ [data-persona-root] .persona-toggle-group > .persona-icon-btn {
2252
+ border-radius: 0;
2253
+ }
2254
+
2255
+ [data-persona-root] .persona-toggle-group > .persona-icon-btn:first-child {
2256
+ border-top-left-radius: var(--persona-toggle-group-radius, var(--persona-icon-btn-radius, var(--persona-radius-md, 0.375rem)));
2257
+ border-bottom-left-radius: var(--persona-toggle-group-radius, var(--persona-icon-btn-radius, var(--persona-radius-md, 0.375rem)));
2258
+ }
2259
+
2260
+ [data-persona-root] .persona-toggle-group > .persona-icon-btn:last-child {
2261
+ border-top-right-radius: var(--persona-toggle-group-radius, var(--persona-icon-btn-radius, var(--persona-radius-md, 0.375rem)));
2262
+ border-bottom-right-radius: var(--persona-toggle-group-radius, var(--persona-icon-btn-radius, var(--persona-radius-md, 0.375rem)));
2263
+ }
2264
+
2265
+ /* Combo button — label + chevron with dropdown */
2266
+ [data-persona-root] .persona-combo-btn {
2267
+ font-size: var(--persona-combo-btn-font-size, 0.8125rem);
2268
+ font-weight: var(--persona-combo-btn-font-weight, 600);
2269
+ color: var(--persona-combo-btn-color, var(--persona-text, #111827));
2270
+ user-select: none;
2271
+ }
2272
+
2273
+ [data-persona-root] .persona-combo-btn-label {
2274
+ white-space: nowrap;
2275
+ overflow: hidden;
2276
+ text-overflow: ellipsis;
2277
+ }
2278
+
2279
+ /* Dropdown menu utility */
2280
+ [data-persona-root] .persona-dropdown-menu {
2281
+ z-index: 100;
2282
+ min-width: 160px;
2283
+ background: var(--persona-dropdown-bg, var(--persona-surface, #fff));
2284
+ border: var(--persona-dropdown-border, 1px solid var(--persona-border, #e5e7eb));
2285
+ border-radius: var(--persona-dropdown-radius, 0.625rem);
2286
+ padding: 0.25rem 0;
2287
+ box-shadow: var(--persona-dropdown-shadow, 0 4px 16px rgba(0,0,0,0.12));
2288
+ }
2289
+
2290
+ [data-persona-root] .persona-dropdown-menu button {
2291
+ display: flex;
2292
+ align-items: center;
2293
+ gap: 0.625rem;
2294
+ width: 100%;
2295
+ padding: 0.5rem 0.875rem;
2296
+ border: none;
2297
+ background: transparent;
2298
+ color: var(--persona-dropdown-item-color, var(--persona-text, #1f2937));
2299
+ font-size: 0.8125rem;
2300
+ cursor: pointer;
2301
+ text-align: left;
2302
+ white-space: nowrap;
2303
+ }
2304
+
2305
+ [data-persona-root] .persona-dropdown-menu button:hover {
2306
+ background: var(--persona-dropdown-item-hover-bg, var(--persona-container, #f3f4f6));
2307
+ }
2308
+
2309
+ [data-persona-root] .persona-dropdown-menu button[data-destructive] {
2310
+ color: var(--persona-dropdown-destructive-color, #ef4444);
2311
+ }
2312
+
2313
+ [data-persona-root] .persona-dropdown-menu hr {
2314
+ border: none;
2315
+ border-top: 1px solid var(--persona-dropdown-hr, var(--persona-border, #e5e7eb));
2316
+ margin: 0.25rem 0;
2317
+ }
2318
+
2137
2319
  /* Draggable split handle (desktop split only; hidden in drawer / narrow host / small viewport) */
2138
- #persona-root .persona-artifact-split-handle {
2320
+ [data-persona-root] .persona-artifact-split-handle {
2139
2321
  width: 6px;
2140
2322
  flex-shrink: 0;
2141
2323
  cursor: col-resize;
@@ -2148,24 +2330,24 @@
2148
2330
  box-sizing: border-box;
2149
2331
  }
2150
2332
 
2151
- #persona-root .persona-artifact-split-handle:hover,
2152
- #persona-root .persona-artifact-split-handle:focus-visible {
2333
+ [data-persona-root] .persona-artifact-split-handle:hover,
2334
+ [data-persona-root] .persona-artifact-split-handle:focus-visible {
2153
2335
  background: color-mix(in srgb, var(--persona-border, #e5e7eb) 55%, transparent);
2154
2336
  outline: none;
2155
2337
  }
2156
2338
 
2157
- #persona-root.persona-artifact-narrow-host .persona-artifact-split-handle {
2339
+ [data-persona-root].persona-artifact-narrow-host .persona-artifact-split-handle {
2158
2340
  display: none !important;
2159
2341
  }
2160
2342
 
2161
2343
  @media (max-width: 640px) {
2162
- #persona-root .persona-artifact-split-handle {
2344
+ [data-persona-root] .persona-artifact-split-handle {
2163
2345
  display: none !important;
2164
2346
  }
2165
2347
  }
2166
2348
 
2167
2349
  @media (min-width: 641px) {
2168
- #persona-root .persona-artifact-pane {
2350
+ [data-persona-root] .persona-artifact-pane {
2169
2351
  width: var(--persona-artifact-pane-width, 40%);
2170
2352
  max-width: var(--persona-artifact-pane-max-width, 28rem);
2171
2353
  min-width: var(--persona-artifact-pane-min-width, 0);
@@ -2175,43 +2357,51 @@
2175
2357
  }
2176
2358
 
2177
2359
  /* paneBorderRadius — works on any paneAppearance; overflow clips content to rounded shape */
2178
- #persona-root .persona-artifact-pane {
2360
+ [data-persona-root] .persona-artifact-pane {
2179
2361
  border-radius: var(--persona-artifact-pane-radius, 0);
2180
2362
  overflow: hidden;
2181
- background-color: var(--persona-artifact-pane-bg, var(--persona-surface, #ffffff));
2363
+ /* Layout paneBackground → theme components.artifact.pane.background → semantic surface */
2364
+ background-color: var(
2365
+ --persona-artifact-pane-bg,
2366
+ var(--persona-components-artifact-pane-background, var(--persona-surface, #ffffff))
2367
+ );
2182
2368
  }
2183
2369
 
2184
2370
  /* paneAppearance: 'seamless' — flush with chat, no border/shadow/gap */
2185
2371
  /* `position: relative` for resizer overlay; gap 0; positioning is applied in ui.ts */
2186
- #persona-root.persona-artifact-appearance-seamless .persona-artifact-split-root {
2372
+ [data-persona-root].persona-artifact-appearance-seamless .persona-artifact-split-root {
2187
2373
  position: relative;
2188
2374
  gap: 0 !important;
2189
2375
  }
2190
2376
 
2191
- #persona-root.persona-artifact-appearance-seamless .persona-artifact-pane {
2377
+ [data-persona-root].persona-artifact-appearance-seamless .persona-artifact-pane {
2192
2378
  border-left-width: 0 !important;
2193
2379
  border-left-color: transparent !important;
2194
2380
  box-shadow: none !important;
2195
- background-color: var(--persona-artifact-pane-bg, var(--persona-container, #f8fafc));
2381
+ /* Same token chain; final fallback stays container for flush split chrome */
2382
+ background-color: var(
2383
+ --persona-artifact-pane-bg,
2384
+ var(--persona-components-artifact-pane-background, var(--persona-container, #f8fafc))
2385
+ );
2196
2386
  }
2197
2387
 
2198
2388
  /* layout.paneBorder / paneBorderLeft — theme overrides (after appearance defaults) */
2199
- #persona-root.persona-artifact-border-full .persona-artifact-pane {
2389
+ [data-persona-root].persona-artifact-border-full .persona-artifact-pane {
2200
2390
  border: var(--persona-artifact-pane-border) !important;
2201
2391
  }
2202
2392
 
2203
- #persona-root.persona-artifact-border-left .persona-artifact-pane {
2393
+ [data-persona-root].persona-artifact-border-left .persona-artifact-pane {
2204
2394
  border-top: none !important;
2205
2395
  border-right: none !important;
2206
2396
  border-bottom: none !important;
2207
2397
  border-left: var(--persona-artifact-pane-border-left) !important;
2208
2398
  }
2209
2399
 
2210
- #persona-root.persona-artifact-appearance-seamless.persona-artifact-border-left .persona-artifact-pane {
2400
+ [data-persona-root].persona-artifact-appearance-seamless.persona-artifact-border-left .persona-artifact-pane {
2211
2401
  border-left: var(--persona-artifact-pane-border-left) !important;
2212
2402
  }
2213
2403
 
2214
- #persona-root.persona-artifact-appearance-seamless.persona-artifact-border-full .persona-artifact-pane {
2404
+ [data-persona-root].persona-artifact-appearance-seamless.persona-artifact-border-full .persona-artifact-pane {
2215
2405
  border: var(--persona-artifact-pane-border) !important;
2216
2406
  }
2217
2407
 
@@ -2220,12 +2410,12 @@
2220
2410
  * Main chat card (.persona-widget-container) loses inner-right rounding; artifact gains matching outer-right.
2221
2411
  */
2222
2412
  @media (min-width: 641px) {
2223
- #persona-root:not(.persona-artifact-narrow-host).persona-artifact-unified-split .persona-widget-container {
2413
+ [data-persona-root]:not(.persona-artifact-narrow-host).persona-artifact-unified-split .persona-widget-container {
2224
2414
  border-top-right-radius: 0 !important;
2225
2415
  border-bottom-right-radius: 0 !important;
2226
2416
  }
2227
2417
 
2228
- #persona-root:not(.persona-artifact-narrow-host).persona-artifact-unified-split .persona-artifact-pane {
2418
+ [data-persona-root]:not(.persona-artifact-narrow-host).persona-artifact-unified-split .persona-artifact-pane {
2229
2419
  border-top-left-radius: 0 !important;
2230
2420
  border-bottom-left-radius: 0 !important;
2231
2421
  border-top-right-radius: var(--persona-artifact-unified-outer-radius, var(--persona-radius-lg, 1rem)) !important;
@@ -2235,14 +2425,14 @@
2235
2425
  }
2236
2426
 
2237
2427
  /* Narrow floating panel: drawer inside panel (class toggled by JS from panel width) */
2238
- #persona-root.persona-artifact-narrow-host .persona-artifact-backdrop {
2428
+ [data-persona-root].persona-artifact-narrow-host .persona-artifact-backdrop {
2239
2429
  position: absolute !important;
2240
2430
  inset: 0 !important;
2241
2431
  z-index: 55 !important;
2242
2432
  }
2243
2433
 
2244
2434
  @media (min-width: 641px) {
2245
- #persona-root.persona-artifact-narrow-host .persona-artifact-pane {
2435
+ [data-persona-root].persona-artifact-narrow-host .persona-artifact-pane {
2246
2436
  position: absolute;
2247
2437
  top: 0;
2248
2438
  right: 0;
@@ -2254,13 +2444,13 @@
2254
2444
  transition: transform 0.2s ease;
2255
2445
  box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12);
2256
2446
  }
2257
- #persona-root.persona-artifact-narrow-host .persona-artifact-pane.persona-artifact-drawer-open {
2447
+ [data-persona-root].persona-artifact-narrow-host .persona-artifact-pane.persona-artifact-drawer-open {
2258
2448
  transform: translateX(0);
2259
2449
  }
2260
2450
  }
2261
2451
 
2262
2452
  @media (max-width: 640px) {
2263
- #persona-root .persona-artifact-pane {
2453
+ [data-persona-root] .persona-artifact-pane {
2264
2454
  position: fixed;
2265
2455
  top: 0;
2266
2456
  right: 0;
@@ -2271,7 +2461,7 @@
2271
2461
  transition: transform 0.2s ease;
2272
2462
  box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12);
2273
2463
  }
2274
- #persona-root .persona-artifact-pane.persona-artifact-drawer-open {
2464
+ [data-persona-root] .persona-artifact-pane.persona-artifact-drawer-open {
2275
2465
  transform: translateX(0);
2276
2466
  }
2277
2467
  }