@runtypelabs/persona 3.0.0 → 3.1.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/dist/widget.css CHANGED
@@ -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
 
@@ -1299,6 +1299,7 @@
1299
1299
  /* Ensure user message paragraphs and lists have proper styling too */
1300
1300
  .vanilla-message-user-bubble p {
1301
1301
  margin: 0;
1302
+ color: inherit;
1302
1303
  }
1303
1304
 
1304
1305
  .vanilla-message-user-bubble p + p {
@@ -1322,13 +1323,19 @@
1322
1323
  .vanilla-message-user-bubble li {
1323
1324
  margin: 0.25rem 0;
1324
1325
  padding-left: 0.25rem;
1326
+ color: inherit;
1327
+ }
1328
+
1329
+ .vanilla-message-assistant-bubble p,
1330
+ .vanilla-message-assistant-bubble li {
1331
+ color: inherit;
1325
1332
  }
1326
1333
 
1327
1334
  /* ============================================
1328
1335
  Markdown Header Styles
1329
1336
  ============================================ */
1330
1337
  .vanilla-message-bubble h1,
1331
- #persona-root .persona-markdown-bubble h1 {
1338
+ [data-persona-root] .persona-markdown-bubble h1 {
1332
1339
  font-size: var(--persona-md-h1-size);
1333
1340
  font-weight: var(--persona-md-h1-weight);
1334
1341
  margin: var(--persona-md-h1-margin);
@@ -1337,7 +1344,7 @@
1337
1344
  }
1338
1345
 
1339
1346
  .vanilla-message-bubble h2,
1340
- #persona-root .persona-markdown-bubble h2 {
1347
+ [data-persona-root] .persona-markdown-bubble h2 {
1341
1348
  font-size: var(--persona-md-h2-size);
1342
1349
  font-weight: var(--persona-md-h2-weight);
1343
1350
  margin: var(--persona-md-h2-margin);
@@ -1346,7 +1353,7 @@
1346
1353
  }
1347
1354
 
1348
1355
  .vanilla-message-bubble h3,
1349
- #persona-root .persona-markdown-bubble h3 {
1356
+ [data-persona-root] .persona-markdown-bubble h3 {
1350
1357
  font-size: var(--persona-md-h3-size);
1351
1358
  font-weight: var(--persona-md-h3-weight);
1352
1359
  margin: var(--persona-md-h3-margin);
@@ -1355,7 +1362,7 @@
1355
1362
  }
1356
1363
 
1357
1364
  .vanilla-message-bubble h4,
1358
- #persona-root .persona-markdown-bubble h4 {
1365
+ [data-persona-root] .persona-markdown-bubble h4 {
1359
1366
  font-size: var(--persona-md-h4-size);
1360
1367
  font-weight: var(--persona-md-h4-weight);
1361
1368
  margin: var(--persona-md-h4-margin);
@@ -1364,7 +1371,7 @@
1364
1371
  }
1365
1372
 
1366
1373
  .vanilla-message-bubble h5,
1367
- #persona-root .persona-markdown-bubble h5 {
1374
+ [data-persona-root] .persona-markdown-bubble h5 {
1368
1375
  font-size: var(--persona-md-h5-size);
1369
1376
  font-weight: var(--persona-md-h5-weight);
1370
1377
  margin: var(--persona-md-h5-margin);
@@ -1373,7 +1380,7 @@
1373
1380
  }
1374
1381
 
1375
1382
  .vanilla-message-bubble h6,
1376
- #persona-root .persona-markdown-bubble h6 {
1383
+ [data-persona-root] .persona-markdown-bubble h6 {
1377
1384
  font-size: var(--persona-md-h6-size);
1378
1385
  font-weight: var(--persona-md-h6-weight);
1379
1386
  margin: var(--persona-md-h6-margin);
@@ -2040,12 +2047,12 @@
2040
2047
  Visibility (Tailwind parity — prefix persona-)
2041
2048
  Shipped widget.css is hand-maintained; these utilities are used in TS but not generated by Tailwind at build time.
2042
2049
  ============================================ */
2043
- #persona-root .persona-hidden {
2050
+ [data-persona-root] .persona-hidden {
2044
2051
  display: none !important;
2045
2052
  }
2046
2053
 
2047
2054
  @media (min-width: 768px) {
2048
- #persona-root .md\:persona-hidden {
2055
+ [data-persona-root] .md\:persona-hidden {
2049
2056
  display: none !important;
2050
2057
  }
2051
2058
  }
@@ -2055,12 +2062,12 @@
2055
2062
  Vars set from TS: --persona-artifact-split-gap, --persona-artifact-pane-width,
2056
2063
  --persona-artifact-pane-max-width, --persona-artifact-pane-min-width
2057
2064
  ============================================ */
2058
- #persona-root .persona-artifact-split-root {
2065
+ [data-persona-root] .persona-artifact-split-root {
2059
2066
  gap: var(--persona-artifact-split-gap, 0.5rem);
2060
2067
  }
2061
2068
 
2062
2069
  /* 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 {
2070
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-doc-icon-btn {
2064
2071
  display: inline-flex;
2065
2072
  align-items: center;
2066
2073
  justify-content: center;
@@ -2073,17 +2080,17 @@
2073
2080
  line-height: 1;
2074
2081
  }
2075
2082
 
2076
- #persona-root .persona-artifact-toolbar-document .persona-artifact-doc-icon-btn:hover {
2083
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-doc-icon-btn:hover {
2077
2084
  color: var(--persona-artifact-toolbar-icon-hover-color, inherit);
2078
2085
  background: var(--persona-artifact-toolbar-icon-hover-bg, var(--persona-container, #f3f4f6));
2079
2086
  }
2080
2087
 
2081
- #persona-root .persona-artifact-toolbar-document .persona-artifact-doc-icon-btn[aria-pressed="true"] {
2088
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-doc-icon-btn[aria-pressed="true"] {
2082
2089
  background: var(--persona-artifact-doc-toggle-active-bg, var(--persona-container, #f3f4f6));
2083
2090
  border-color: var(--persona-artifact-doc-toggle-active-border, var(--persona-border, #e5e7eb));
2084
2091
  }
2085
2092
 
2086
- #persona-root .persona-artifact-toolbar-document .persona-artifact-doc-copy-btn {
2093
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-doc-copy-btn {
2087
2094
  display: inline-flex;
2088
2095
  align-items: center;
2089
2096
  gap: 0.35rem;
@@ -2097,63 +2104,63 @@
2097
2104
  line-height: 1.25;
2098
2105
  }
2099
2106
 
2100
- #persona-root .persona-artifact-toolbar-document .persona-artifact-doc-copy-btn:hover {
2107
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-doc-copy-btn:hover {
2101
2108
  background: var(--persona-artifact-toolbar-icon-hover-bg, var(--persona-container, #f3f4f6));
2102
2109
  }
2103
2110
 
2104
- #persona-root .persona-artifact-toolbar-document .persona-artifact-doc-copy-label {
2111
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-doc-copy-label {
2105
2112
  font-weight: 500;
2106
2113
  }
2107
2114
 
2108
2115
  /* Artifact tab theming */
2109
- #persona-root .persona-artifact-tab {
2116
+ [data-persona-root] .persona-artifact-tab {
2110
2117
  background: var(--persona-artifact-tab-bg, transparent);
2111
2118
  border-radius: var(--persona-artifact-tab-radius, 0.5rem);
2112
2119
  color: var(--persona-artifact-tab-color, inherit);
2113
2120
  }
2114
2121
 
2115
- #persona-root .persona-artifact-tab.persona-bg-persona-container {
2122
+ [data-persona-root] .persona-artifact-tab.persona-bg-persona-container {
2116
2123
  background: var(--persona-artifact-tab-active-bg, var(--persona-container, #f3f4f6));
2117
2124
  border-color: var(--persona-artifact-tab-active-border, var(--persona-border, #e5e7eb));
2118
2125
  }
2119
2126
 
2120
2127
  /* Artifact toolbar background theming */
2121
- #persona-root .persona-artifact-toolbar {
2128
+ [data-persona-root] .persona-artifact-toolbar {
2122
2129
  background: var(--persona-artifact-toolbar-bg, var(--persona-surface, #fff));
2123
2130
  }
2124
2131
 
2125
2132
  /* Toggle group gap */
2126
- #persona-root .persona-artifact-toggle-group {
2133
+ [data-persona-root] .persona-artifact-toggle-group {
2127
2134
  gap: var(--persona-artifact-toolbar-toggle-group-gap, 0.25rem);
2128
2135
  }
2129
2136
 
2130
2137
  /* Toggle button border-radius (view/code buttons) */
2131
- #persona-root .persona-artifact-toolbar-document .persona-artifact-view-btn,
2132
- #persona-root .persona-artifact-toolbar-document .persona-artifact-code-btn {
2138
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-view-btn,
2139
+ [data-persona-root] .persona-artifact-toolbar-document .persona-artifact-code-btn {
2133
2140
  border-radius: var(--persona-artifact-toolbar-toggle-radius, var(--persona-artifact-toolbar-icon-radius, var(--persona-radius-md, 0.375rem)));
2134
2141
  }
2135
2142
 
2136
2143
  /* Tab hover */
2137
- #persona-root .persona-artifact-tab:hover {
2144
+ [data-persona-root] .persona-artifact-tab:hover {
2138
2145
  background: var(--persona-artifact-tab-hover-bg, var(--persona-container, #f3f4f6));
2139
2146
  }
2140
2147
 
2141
2148
  /* Tab list container */
2142
- #persona-root .persona-artifact-list {
2149
+ [data-persona-root] .persona-artifact-list {
2143
2150
  background: var(--persona-artifact-tab-list-bg, transparent);
2144
2151
  border-bottom-color: var(--persona-artifact-tab-list-border-color, var(--persona-border, #e5e7eb));
2145
2152
  padding: var(--persona-artifact-tab-list-padding, 0.5rem);
2146
2153
  }
2147
2154
 
2148
2155
  /* Toolbar border override */
2149
- #persona-root .persona-artifact-toolbar-document {
2156
+ [data-persona-root] .persona-artifact-toolbar-document {
2150
2157
  border-bottom: var(--persona-artifact-toolbar-border, 1px solid var(--persona-border, #e5e7eb));
2151
2158
  }
2152
2159
 
2153
2160
  /* ── Composable button utilities ── */
2154
2161
 
2155
2162
  /* Icon button — base for all icon-only buttons created by createIconButton() */
2156
- #persona-root .persona-icon-btn {
2163
+ [data-persona-root] .persona-icon-btn {
2157
2164
  display: inline-flex;
2158
2165
  align-items: center;
2159
2166
  justify-content: center;
@@ -2167,23 +2174,23 @@
2167
2174
  transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
2168
2175
  }
2169
2176
 
2170
- #persona-root .persona-icon-btn:hover {
2177
+ [data-persona-root] .persona-icon-btn:hover {
2171
2178
  background: var(--persona-icon-btn-hover-bg, var(--persona-container, #f3f4f6));
2172
2179
  color: var(--persona-icon-btn-hover-color, inherit);
2173
2180
  }
2174
2181
 
2175
- #persona-root .persona-icon-btn:focus-visible {
2182
+ [data-persona-root] .persona-icon-btn:focus-visible {
2176
2183
  outline: 2px solid var(--persona-accent, #3b82f6);
2177
2184
  outline-offset: 2px;
2178
2185
  }
2179
2186
 
2180
- #persona-root .persona-icon-btn[aria-pressed="true"] {
2187
+ [data-persona-root] .persona-icon-btn[aria-pressed="true"] {
2181
2188
  background: var(--persona-icon-btn-active-bg, var(--persona-container, #f3f4f6));
2182
2189
  border-color: var(--persona-icon-btn-active-border, var(--persona-border, #e5e7eb));
2183
2190
  }
2184
2191
 
2185
2192
  /* Label button — icon + text button created by createLabelButton() */
2186
- #persona-root .persona-label-btn {
2193
+ [data-persona-root] .persona-label-btn {
2187
2194
  display: inline-flex;
2188
2195
  align-items: center;
2189
2196
  gap: var(--persona-label-btn-gap, 0.35rem);
@@ -2200,84 +2207,84 @@
2200
2207
  transition: background-color 0.15s ease, color 0.15s ease;
2201
2208
  }
2202
2209
 
2203
- #persona-root .persona-label-btn:hover {
2210
+ [data-persona-root] .persona-label-btn:hover {
2204
2211
  background: var(--persona-label-btn-hover-bg, var(--persona-container, #f3f4f6));
2205
2212
  }
2206
2213
 
2207
- #persona-root .persona-label-btn:focus-visible {
2214
+ [data-persona-root] .persona-label-btn:focus-visible {
2208
2215
  outline: 2px solid var(--persona-accent, #3b82f6);
2209
2216
  outline-offset: 2px;
2210
2217
  }
2211
2218
 
2212
- #persona-root .persona-label-btn--sm {
2219
+ [data-persona-root] .persona-label-btn--sm {
2213
2220
  padding: var(--persona-label-btn-padding, 0.25rem 0.5rem);
2214
2221
  font-size: var(--persona-label-btn-font-size, 0.75rem);
2215
2222
  }
2216
2223
 
2217
- #persona-root .persona-label-btn--md {
2224
+ [data-persona-root] .persona-label-btn--md {
2218
2225
  padding: 0.375rem 0.75rem;
2219
2226
  font-size: 0.8125rem;
2220
2227
  }
2221
2228
 
2222
- #persona-root .persona-label-btn--primary {
2229
+ [data-persona-root] .persona-label-btn--primary {
2223
2230
  background: var(--persona-primary, #3b82f6);
2224
2231
  color: var(--persona-text-inverse, #ffffff);
2225
2232
  border-color: transparent;
2226
2233
  }
2227
2234
 
2228
- #persona-root .persona-label-btn--primary:hover {
2235
+ [data-persona-root] .persona-label-btn--primary:hover {
2229
2236
  opacity: 0.9;
2230
2237
  }
2231
2238
 
2232
- #persona-root .persona-label-btn--destructive {
2239
+ [data-persona-root] .persona-label-btn--destructive {
2233
2240
  color: var(--persona-label-btn-destructive-color, #ef4444);
2234
2241
  }
2235
2242
 
2236
- #persona-root .persona-label-btn--ghost {
2243
+ [data-persona-root] .persona-label-btn--ghost {
2237
2244
  border: none;
2238
2245
  background: transparent;
2239
2246
  }
2240
2247
 
2241
- #persona-root .persona-label-btn--ghost:hover {
2248
+ [data-persona-root] .persona-label-btn--ghost:hover {
2242
2249
  background: var(--persona-label-btn-hover-bg, var(--persona-container, #f3f4f6));
2243
2250
  }
2244
2251
 
2245
2252
  /* Toggle group — mutually exclusive button set created by createToggleGroup() */
2246
- #persona-root .persona-toggle-group {
2253
+ [data-persona-root] .persona-toggle-group {
2247
2254
  display: inline-flex;
2248
2255
  gap: var(--persona-toggle-group-gap, 0);
2249
2256
  }
2250
2257
 
2251
- #persona-root .persona-toggle-group > .persona-icon-btn {
2258
+ [data-persona-root] .persona-toggle-group > .persona-icon-btn {
2252
2259
  border-radius: 0;
2253
2260
  }
2254
2261
 
2255
- #persona-root .persona-toggle-group > .persona-icon-btn:first-child {
2262
+ [data-persona-root] .persona-toggle-group > .persona-icon-btn:first-child {
2256
2263
  border-top-left-radius: var(--persona-toggle-group-radius, var(--persona-icon-btn-radius, var(--persona-radius-md, 0.375rem)));
2257
2264
  border-bottom-left-radius: var(--persona-toggle-group-radius, var(--persona-icon-btn-radius, var(--persona-radius-md, 0.375rem)));
2258
2265
  }
2259
2266
 
2260
- #persona-root .persona-toggle-group > .persona-icon-btn:last-child {
2267
+ [data-persona-root] .persona-toggle-group > .persona-icon-btn:last-child {
2261
2268
  border-top-right-radius: var(--persona-toggle-group-radius, var(--persona-icon-btn-radius, var(--persona-radius-md, 0.375rem)));
2262
2269
  border-bottom-right-radius: var(--persona-toggle-group-radius, var(--persona-icon-btn-radius, var(--persona-radius-md, 0.375rem)));
2263
2270
  }
2264
2271
 
2265
2272
  /* Combo button — label + chevron with dropdown */
2266
- #persona-root .persona-combo-btn {
2273
+ [data-persona-root] .persona-combo-btn {
2267
2274
  font-size: var(--persona-combo-btn-font-size, 0.8125rem);
2268
2275
  font-weight: var(--persona-combo-btn-font-weight, 600);
2269
2276
  color: var(--persona-combo-btn-color, var(--persona-text, #111827));
2270
2277
  user-select: none;
2271
2278
  }
2272
2279
 
2273
- #persona-root .persona-combo-btn-label {
2280
+ [data-persona-root] .persona-combo-btn-label {
2274
2281
  white-space: nowrap;
2275
2282
  overflow: hidden;
2276
2283
  text-overflow: ellipsis;
2277
2284
  }
2278
2285
 
2279
2286
  /* Dropdown menu utility */
2280
- #persona-root .persona-dropdown-menu {
2287
+ [data-persona-root] .persona-dropdown-menu {
2281
2288
  z-index: 100;
2282
2289
  min-width: 160px;
2283
2290
  background: var(--persona-dropdown-bg, var(--persona-surface, #fff));
@@ -2287,7 +2294,7 @@
2287
2294
  box-shadow: var(--persona-dropdown-shadow, 0 4px 16px rgba(0,0,0,0.12));
2288
2295
  }
2289
2296
 
2290
- #persona-root .persona-dropdown-menu button {
2297
+ [data-persona-root] .persona-dropdown-menu button {
2291
2298
  display: flex;
2292
2299
  align-items: center;
2293
2300
  gap: 0.625rem;
@@ -2302,22 +2309,22 @@
2302
2309
  white-space: nowrap;
2303
2310
  }
2304
2311
 
2305
- #persona-root .persona-dropdown-menu button:hover {
2312
+ [data-persona-root] .persona-dropdown-menu button:hover {
2306
2313
  background: var(--persona-dropdown-item-hover-bg, var(--persona-container, #f3f4f6));
2307
2314
  }
2308
2315
 
2309
- #persona-root .persona-dropdown-menu button[data-destructive] {
2316
+ [data-persona-root] .persona-dropdown-menu button[data-destructive] {
2310
2317
  color: var(--persona-dropdown-destructive-color, #ef4444);
2311
2318
  }
2312
2319
 
2313
- #persona-root .persona-dropdown-menu hr {
2320
+ [data-persona-root] .persona-dropdown-menu hr {
2314
2321
  border: none;
2315
2322
  border-top: 1px solid var(--persona-dropdown-hr, var(--persona-border, #e5e7eb));
2316
2323
  margin: 0.25rem 0;
2317
2324
  }
2318
2325
 
2319
2326
  /* Draggable split handle (desktop split only; hidden in drawer / narrow host / small viewport) */
2320
- #persona-root .persona-artifact-split-handle {
2327
+ [data-persona-root] .persona-artifact-split-handle {
2321
2328
  width: 6px;
2322
2329
  flex-shrink: 0;
2323
2330
  cursor: col-resize;
@@ -2330,24 +2337,24 @@
2330
2337
  box-sizing: border-box;
2331
2338
  }
2332
2339
 
2333
- #persona-root .persona-artifact-split-handle:hover,
2334
- #persona-root .persona-artifact-split-handle:focus-visible {
2340
+ [data-persona-root] .persona-artifact-split-handle:hover,
2341
+ [data-persona-root] .persona-artifact-split-handle:focus-visible {
2335
2342
  background: color-mix(in srgb, var(--persona-border, #e5e7eb) 55%, transparent);
2336
2343
  outline: none;
2337
2344
  }
2338
2345
 
2339
- #persona-root.persona-artifact-narrow-host .persona-artifact-split-handle {
2346
+ [data-persona-root].persona-artifact-narrow-host .persona-artifact-split-handle {
2340
2347
  display: none !important;
2341
2348
  }
2342
2349
 
2343
2350
  @media (max-width: 640px) {
2344
- #persona-root .persona-artifact-split-handle {
2351
+ [data-persona-root] .persona-artifact-split-handle {
2345
2352
  display: none !important;
2346
2353
  }
2347
2354
  }
2348
2355
 
2349
2356
  @media (min-width: 641px) {
2350
- #persona-root .persona-artifact-pane {
2357
+ [data-persona-root] .persona-artifact-pane {
2351
2358
  width: var(--persona-artifact-pane-width, 40%);
2352
2359
  max-width: var(--persona-artifact-pane-max-width, 28rem);
2353
2360
  min-width: var(--persona-artifact-pane-min-width, 0);
@@ -2357,7 +2364,7 @@
2357
2364
  }
2358
2365
 
2359
2366
  /* paneBorderRadius — works on any paneAppearance; overflow clips content to rounded shape */
2360
- #persona-root .persona-artifact-pane {
2367
+ [data-persona-root] .persona-artifact-pane {
2361
2368
  border-radius: var(--persona-artifact-pane-radius, 0);
2362
2369
  overflow: hidden;
2363
2370
  /* Layout paneBackground → theme components.artifact.pane.background → semantic surface */
@@ -2369,12 +2376,12 @@
2369
2376
 
2370
2377
  /* paneAppearance: 'seamless' — flush with chat, no border/shadow/gap */
2371
2378
  /* `position: relative` for resizer overlay; gap 0; positioning is applied in ui.ts */
2372
- #persona-root.persona-artifact-appearance-seamless .persona-artifact-split-root {
2379
+ [data-persona-root].persona-artifact-appearance-seamless .persona-artifact-split-root {
2373
2380
  position: relative;
2374
2381
  gap: 0 !important;
2375
2382
  }
2376
2383
 
2377
- #persona-root.persona-artifact-appearance-seamless .persona-artifact-pane {
2384
+ [data-persona-root].persona-artifact-appearance-seamless .persona-artifact-pane {
2378
2385
  border-left-width: 0 !important;
2379
2386
  border-left-color: transparent !important;
2380
2387
  box-shadow: none !important;
@@ -2386,22 +2393,22 @@
2386
2393
  }
2387
2394
 
2388
2395
  /* layout.paneBorder / paneBorderLeft — theme overrides (after appearance defaults) */
2389
- #persona-root.persona-artifact-border-full .persona-artifact-pane {
2396
+ [data-persona-root].persona-artifact-border-full .persona-artifact-pane {
2390
2397
  border: var(--persona-artifact-pane-border) !important;
2391
2398
  }
2392
2399
 
2393
- #persona-root.persona-artifact-border-left .persona-artifact-pane {
2400
+ [data-persona-root].persona-artifact-border-left .persona-artifact-pane {
2394
2401
  border-top: none !important;
2395
2402
  border-right: none !important;
2396
2403
  border-bottom: none !important;
2397
2404
  border-left: var(--persona-artifact-pane-border-left) !important;
2398
2405
  }
2399
2406
 
2400
- #persona-root.persona-artifact-appearance-seamless.persona-artifact-border-left .persona-artifact-pane {
2407
+ [data-persona-root].persona-artifact-appearance-seamless.persona-artifact-border-left .persona-artifact-pane {
2401
2408
  border-left: var(--persona-artifact-pane-border-left) !important;
2402
2409
  }
2403
2410
 
2404
- #persona-root.persona-artifact-appearance-seamless.persona-artifact-border-full .persona-artifact-pane {
2411
+ [data-persona-root].persona-artifact-appearance-seamless.persona-artifact-border-full .persona-artifact-pane {
2405
2412
  border: var(--persona-artifact-pane-border) !important;
2406
2413
  }
2407
2414
 
@@ -2410,12 +2417,12 @@
2410
2417
  * Main chat card (.persona-widget-container) loses inner-right rounding; artifact gains matching outer-right.
2411
2418
  */
2412
2419
  @media (min-width: 641px) {
2413
- #persona-root:not(.persona-artifact-narrow-host).persona-artifact-unified-split .persona-widget-container {
2420
+ [data-persona-root]:not(.persona-artifact-narrow-host).persona-artifact-unified-split .persona-widget-container {
2414
2421
  border-top-right-radius: 0 !important;
2415
2422
  border-bottom-right-radius: 0 !important;
2416
2423
  }
2417
2424
 
2418
- #persona-root:not(.persona-artifact-narrow-host).persona-artifact-unified-split .persona-artifact-pane {
2425
+ [data-persona-root]:not(.persona-artifact-narrow-host).persona-artifact-unified-split .persona-artifact-pane {
2419
2426
  border-top-left-radius: 0 !important;
2420
2427
  border-bottom-left-radius: 0 !important;
2421
2428
  border-top-right-radius: var(--persona-artifact-unified-outer-radius, var(--persona-radius-lg, 1rem)) !important;
@@ -2425,14 +2432,14 @@
2425
2432
  }
2426
2433
 
2427
2434
  /* Narrow floating panel: drawer inside panel (class toggled by JS from panel width) */
2428
- #persona-root.persona-artifact-narrow-host .persona-artifact-backdrop {
2435
+ [data-persona-root].persona-artifact-narrow-host .persona-artifact-backdrop {
2429
2436
  position: absolute !important;
2430
2437
  inset: 0 !important;
2431
2438
  z-index: 55 !important;
2432
2439
  }
2433
2440
 
2434
2441
  @media (min-width: 641px) {
2435
- #persona-root.persona-artifact-narrow-host .persona-artifact-pane {
2442
+ [data-persona-root].persona-artifact-narrow-host .persona-artifact-pane {
2436
2443
  position: absolute;
2437
2444
  top: 0;
2438
2445
  right: 0;
@@ -2444,13 +2451,13 @@
2444
2451
  transition: transform 0.2s ease;
2445
2452
  box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12);
2446
2453
  }
2447
- #persona-root.persona-artifact-narrow-host .persona-artifact-pane.persona-artifact-drawer-open {
2454
+ [data-persona-root].persona-artifact-narrow-host .persona-artifact-pane.persona-artifact-drawer-open {
2448
2455
  transform: translateX(0);
2449
2456
  }
2450
2457
  }
2451
2458
 
2452
2459
  @media (max-width: 640px) {
2453
- #persona-root .persona-artifact-pane {
2460
+ [data-persona-root] .persona-artifact-pane {
2454
2461
  position: fixed;
2455
2462
  top: 0;
2456
2463
  right: 0;
@@ -2461,7 +2468,7 @@
2461
2468
  transition: transform 0.2s ease;
2462
2469
  box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12);
2463
2470
  }
2464
- #persona-root .persona-artifact-pane.persona-artifact-drawer-open {
2471
+ [data-persona-root] .persona-artifact-pane.persona-artifact-drawer-open {
2465
2472
  transform: translateX(0);
2466
2473
  }
2467
2474
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runtypelabs/persona",
3
- "version": "3.0.0",
3
+ "version": "3.1.1",
4
4
  "description": "Themeable, pluggable streaming agent widget for websites, in plain JS with support for voice input and reasoning / tool output.",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -38,9 +38,7 @@
38
38
  "eslint": "^8.57.0",
39
39
  "eslint-config-prettier": "^9.1.0",
40
40
  "fake-indexeddb": "^6.2.5",
41
- "postcss": "^8.4.38",
42
41
  "rimraf": "^5.0.5",
43
- "tailwindcss": "^3.4.10",
44
42
  "tsup": "^8.0.1",
45
43
  "typescript": "^5.4.5",
46
44
  "vitest": "^4.0.9"
@@ -203,8 +203,8 @@ export function createArtifactPane(
203
203
  });
204
204
 
205
205
  if (copyMenuChevronBtn && copyMenuItems?.length) {
206
- // Resolve the portal target — #persona-root for CSS var inheritance, escaping overflow: hidden
207
- const resolvePortal = (): HTMLElement => shell.closest("#persona-root") as HTMLElement ?? document.body;
206
+ // Resolve the portal target — widget root for CSS var inheritance, escaping overflow: hidden
207
+ const resolvePortal = (): HTMLElement => shell.closest("[data-persona-root]") as HTMLElement ?? document.body;
208
208
 
209
209
  const initDropdown = () => {
210
210
  copyMenuDropdown = createDropdownMenu({
@@ -402,7 +402,7 @@ export function createArtifactPane(
402
402
  shell.classList.toggle("persona-hidden", !has);
403
403
  if (backdrop) {
404
404
  const root =
405
- typeof shell.closest === "function" ? shell.closest("#persona-root") : null;
405
+ typeof shell.closest === "function" ? shell.closest("[data-persona-root]") : null;
406
406
  const narrowHost = root?.classList.contains("persona-artifact-narrow-host") ?? false;
407
407
  const isMobile =
408
408
  narrowHost ||
@@ -2,7 +2,7 @@ import { createElement, createElementInDocument } from "../utils/dom";
2
2
  import { renderLucideIcon } from "../utils/icons";
3
3
  import { AgentWidgetConfig } from "../types";
4
4
 
5
- /** CSS `color` values; variables are set on `#persona-root` from `theme.components.header`. */
5
+ /** CSS `color` values; variables are set on `[data-persona-root]` from `theme.components.header`. */
6
6
  export const HEADER_THEME_CSS = {
7
7
  titleColor:
8
8
  "var(--persona-header-title-fg, var(--persona-primary, #2563eb))",