@runtypelabs/persona 3.17.0 → 3.19.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.
- package/README.md +143 -1
- package/dist/animations/glyph-cycle.d.cts +1 -1
- package/dist/animations/glyph-cycle.d.ts +1 -1
- package/dist/animations/{types-HPZY7oAI.d.cts → types-cwY5HaFD.d.cts} +25 -0
- package/dist/animations/{types-HPZY7oAI.d.ts → types-cwY5HaFD.d.ts} +25 -0
- package/dist/animations/wipe.d.cts +1 -1
- package/dist/animations/wipe.d.ts +1 -1
- package/dist/index.cjs +47 -47
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +580 -4
- package/dist/index.d.ts +580 -4
- package/dist/index.global.js +102 -1636
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +45 -45
- package/dist/index.js.map +1 -1
- package/dist/theme-editor.cjs +2844 -752
- package/dist/theme-editor.d.cts +337 -1
- package/dist/theme-editor.d.ts +337 -1
- package/dist/theme-editor.js +2958 -752
- package/dist/theme-reference.cjs +1 -1
- package/dist/theme-reference.d.cts +14 -0
- package/dist/theme-reference.d.ts +14 -0
- package/dist/widget.css +780 -0
- package/package.json +1 -1
- package/src/client.test.ts +134 -0
- package/src/client.ts +71 -0
- package/src/components/ask-user-question-bubble.test.ts +583 -0
- package/src/components/ask-user-question-bubble.ts +924 -0
- package/src/components/composer-builder.test.ts +52 -0
- package/src/components/composer-builder.ts +67 -490
- package/src/components/composer-parts.test.ts +152 -0
- package/src/components/composer-parts.ts +452 -0
- package/src/components/header-builder.ts +22 -299
- package/src/components/header-parts.ts +360 -0
- package/src/components/messages.ts +33 -1
- package/src/components/panel.test.ts +61 -0
- package/src/components/panel.ts +303 -9
- package/src/components/pill-composer-builder.test.ts +85 -0
- package/src/components/pill-composer-builder.ts +183 -0
- package/src/defaults.ts +21 -0
- package/src/index.ts +20 -1
- package/src/plugins/types.ts +57 -0
- package/src/runtime/init.ts +4 -2
- package/src/runtime/persist-state.test.ts +152 -0
- package/src/session.test.ts +183 -0
- package/src/session.ts +242 -3
- package/src/styles/widget.css +780 -0
- package/src/types/theme.ts +15 -0
- package/src/types.ts +271 -1
- package/src/ui.ask-user-question-plugin.test.ts +649 -0
- package/src/ui.component-directive.test.ts +183 -0
- package/src/ui.composer-bar.test.ts +1009 -0
- package/src/ui.ts +1439 -76
- package/src/utils/attachment-manager.ts +1 -1
- package/src/utils/dock.test.ts +45 -0
- package/src/utils/dock.ts +3 -0
- package/src/utils/icons.ts +314 -58
- package/src/utils/storage.ts +10 -2
- package/src/utils/stream-animation.ts +7 -2
- package/src/utils/theme.test.ts +36 -0
- package/src/utils/tokens.ts +23 -0
package/src/styles/widget.css
CHANGED
|
@@ -1759,6 +1759,30 @@
|
|
|
1759
1759
|
animation: persona-message-actions-fade-in 0.3s ease-out forwards;
|
|
1760
1760
|
}
|
|
1761
1761
|
|
|
1762
|
+
/* ask_user_question — collapsed answered state.
|
|
1763
|
+
* When the user picks an option, the interactive card is replaced with a
|
|
1764
|
+
* plain assistant bubble showing the question text. A short fade + slight
|
|
1765
|
+
* upward slide sells the "card resolved into history" feel.
|
|
1766
|
+
*/
|
|
1767
|
+
@keyframes persona-ask-resolved {
|
|
1768
|
+
from {
|
|
1769
|
+
opacity: 0;
|
|
1770
|
+
transform: translateY(-4px);
|
|
1771
|
+
}
|
|
1772
|
+
to {
|
|
1773
|
+
opacity: 1;
|
|
1774
|
+
transform: translateY(0);
|
|
1775
|
+
}
|
|
1776
|
+
}
|
|
1777
|
+
[data-ask-answered="true"] {
|
|
1778
|
+
animation: persona-ask-resolved 0.22s ease-out;
|
|
1779
|
+
}
|
|
1780
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1781
|
+
[data-ask-answered="true"] {
|
|
1782
|
+
animation: none;
|
|
1783
|
+
}
|
|
1784
|
+
}
|
|
1785
|
+
|
|
1762
1786
|
/* Action bar alignment */
|
|
1763
1787
|
.persona-message-actions-left {
|
|
1764
1788
|
justify-content: flex-start;
|
|
@@ -2957,3 +2981,759 @@
|
|
|
2957
2981
|
background-clip: border-box !important;
|
|
2958
2982
|
}
|
|
2959
2983
|
}
|
|
2984
|
+
|
|
2985
|
+
/* ========================================================================
|
|
2986
|
+
* ask_user_question — built-in answer-pill sheet
|
|
2987
|
+
* Slides in over the composer when the assistant invokes `ask_user_question`.
|
|
2988
|
+
* Overridable via `config.features.askUserQuestion.styles`.
|
|
2989
|
+
* ======================================================================== */
|
|
2990
|
+
|
|
2991
|
+
[data-persona-root] .persona-hidden {
|
|
2992
|
+
display: none !important;
|
|
2993
|
+
}
|
|
2994
|
+
|
|
2995
|
+
/* In-transcript stub — small "Awaiting…" chip. */
|
|
2996
|
+
[data-persona-root] .persona-ask-stub {
|
|
2997
|
+
padding: 0.35rem 0.7rem;
|
|
2998
|
+
border-radius: 999px;
|
|
2999
|
+
font-size: 0.8rem;
|
|
3000
|
+
color: var(--persona-muted, #6b7280);
|
|
3001
|
+
background: var(--persona-container, #f3f4f6);
|
|
3002
|
+
border: 1px dashed var(--persona-border, #e5e7eb);
|
|
3003
|
+
}
|
|
3004
|
+
|
|
3005
|
+
[data-persona-root] .persona-ask-stub-label {
|
|
3006
|
+
font-weight: 500;
|
|
3007
|
+
}
|
|
3008
|
+
|
|
3009
|
+
/* Sheet container — absolute inside composerOverlay. */
|
|
3010
|
+
[data-persona-root] .persona-ask-sheet {
|
|
3011
|
+
position: absolute;
|
|
3012
|
+
left: 0.75rem;
|
|
3013
|
+
right: 0.75rem;
|
|
3014
|
+
bottom: calc(100% + 0.5rem);
|
|
3015
|
+
box-sizing: border-box;
|
|
3016
|
+
padding: 0.85rem 1rem;
|
|
3017
|
+
background: var(--persona-ask-sheet-bg, var(--persona-surface, #ffffff));
|
|
3018
|
+
border: 1px solid var(--persona-ask-sheet-border, var(--persona-border, #e5e7eb));
|
|
3019
|
+
border-radius: 1rem;
|
|
3020
|
+
box-shadow: var(--persona-ask-sheet-shadow, 0 12px 28px -10px rgba(0, 0, 0, 0.15), 0 4px 10px -6px rgba(0, 0, 0, 0.08));
|
|
3021
|
+
transition: transform var(--persona-ask-sheet-duration, 180ms) ease, opacity var(--persona-ask-sheet-duration, 180ms) ease;
|
|
3022
|
+
opacity: 1;
|
|
3023
|
+
transform: translateY(0);
|
|
3024
|
+
}
|
|
3025
|
+
|
|
3026
|
+
[data-persona-root] .persona-ask-sheet.persona-ask-sheet-enter {
|
|
3027
|
+
opacity: 0;
|
|
3028
|
+
transform: translateY(8px);
|
|
3029
|
+
}
|
|
3030
|
+
|
|
3031
|
+
[data-persona-root] .persona-ask-sheet.persona-ask-sheet-leave {
|
|
3032
|
+
opacity: 0;
|
|
3033
|
+
transform: translateY(8px);
|
|
3034
|
+
pointer-events: none;
|
|
3035
|
+
}
|
|
3036
|
+
|
|
3037
|
+
/* Header row — question + close button */
|
|
3038
|
+
[data-persona-root] .persona-ask-sheet-header {
|
|
3039
|
+
margin-bottom: 0.55rem;
|
|
3040
|
+
}
|
|
3041
|
+
|
|
3042
|
+
[data-persona-root] .persona-ask-sheet-question {
|
|
3043
|
+
font-size: 0.92rem;
|
|
3044
|
+
font-weight: 500;
|
|
3045
|
+
line-height: 1.35;
|
|
3046
|
+
color: var(--persona-text, #1f2937);
|
|
3047
|
+
min-height: 1.35em;
|
|
3048
|
+
}
|
|
3049
|
+
|
|
3050
|
+
[data-persona-root] .persona-ask-question-skeleton {
|
|
3051
|
+
display: block;
|
|
3052
|
+
width: 60%;
|
|
3053
|
+
height: 0.85rem;
|
|
3054
|
+
border-radius: 0.3rem;
|
|
3055
|
+
background: linear-gradient(90deg,
|
|
3056
|
+
var(--persona-container, #f3f4f6) 0%,
|
|
3057
|
+
var(--persona-border, #e5e7eb) 50%,
|
|
3058
|
+
var(--persona-container, #f3f4f6) 100%);
|
|
3059
|
+
background-size: 200% 100%;
|
|
3060
|
+
animation: persona-ask-skeleton-shimmer 1.2s ease-in-out infinite;
|
|
3061
|
+
color: transparent;
|
|
3062
|
+
}
|
|
3063
|
+
|
|
3064
|
+
[data-persona-root] .persona-ask-sheet-step-inline {
|
|
3065
|
+
flex: 0 0 auto;
|
|
3066
|
+
font-size: 0.78rem;
|
|
3067
|
+
line-height: 1;
|
|
3068
|
+
color: var(--persona-text-muted, #6b7280);
|
|
3069
|
+
font-variant-numeric: tabular-nums;
|
|
3070
|
+
letter-spacing: 0.01em;
|
|
3071
|
+
white-space: nowrap;
|
|
3072
|
+
}
|
|
3073
|
+
|
|
3074
|
+
[data-persona-root] .persona-ask-sheet-step-inline:empty {
|
|
3075
|
+
display: none;
|
|
3076
|
+
}
|
|
3077
|
+
|
|
3078
|
+
/* Option list — stacked one per row by default ("rows" layout). The "pills"
|
|
3079
|
+
layout opt-in switches to horizontal wrap with compact pills; see also
|
|
3080
|
+
horizontalPillsAskPlugin example for a custom variant. */
|
|
3081
|
+
[data-persona-root] .persona-ask-pills {
|
|
3082
|
+
display: flex;
|
|
3083
|
+
flex-direction: column;
|
|
3084
|
+
flex-wrap: nowrap;
|
|
3085
|
+
row-gap: 0.4rem;
|
|
3086
|
+
column-gap: 0;
|
|
3087
|
+
}
|
|
3088
|
+
|
|
3089
|
+
[data-persona-root] .persona-ask-pills--rows {
|
|
3090
|
+
flex-direction: column;
|
|
3091
|
+
flex-wrap: nowrap;
|
|
3092
|
+
gap: 0.4rem;
|
|
3093
|
+
}
|
|
3094
|
+
|
|
3095
|
+
/* Pills layout opt-in — horizontal wrap, auto-width compact pills. */
|
|
3096
|
+
[data-persona-root] .persona-ask-sheet--pills .persona-ask-pills:not(.persona-ask-pills--rows) {
|
|
3097
|
+
flex-direction: row;
|
|
3098
|
+
flex-wrap: wrap;
|
|
3099
|
+
gap: 0.4rem;
|
|
3100
|
+
}
|
|
3101
|
+
|
|
3102
|
+
[data-persona-root] .persona-ask-sheet--pills .persona-ask-pills:not(.persona-ask-pills--rows) .persona-ask-pill {
|
|
3103
|
+
width: auto;
|
|
3104
|
+
padding: 0.4rem 0.9rem;
|
|
3105
|
+
border-radius: var(--persona-ask-pill-radius, 9999px);
|
|
3106
|
+
}
|
|
3107
|
+
|
|
3108
|
+
[data-persona-root] .persona-ask-pill {
|
|
3109
|
+
display: flex;
|
|
3110
|
+
align-items: center;
|
|
3111
|
+
justify-content: flex-start;
|
|
3112
|
+
width: 100%;
|
|
3113
|
+
text-align: left;
|
|
3114
|
+
padding: 0.65rem 0.9rem;
|
|
3115
|
+
border-radius: var(--persona-ask-pill-radius, 0.6rem);
|
|
3116
|
+
background: var(--persona-ask-pill-bg, transparent);
|
|
3117
|
+
color: var(--persona-ask-pill-fg, var(--persona-text, #1f2937));
|
|
3118
|
+
border: 1px solid var(--persona-border, #e5e7eb);
|
|
3119
|
+
font-size: 0.9rem;
|
|
3120
|
+
font-weight: 500;
|
|
3121
|
+
cursor: pointer;
|
|
3122
|
+
transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease, transform 0.1s ease;
|
|
3123
|
+
}
|
|
3124
|
+
|
|
3125
|
+
[data-persona-root] .persona-ask-pill:hover:not(:disabled):not(.persona-ask-pill-skeleton):not(.persona-ask-pill-selected):not([aria-pressed="true"]) {
|
|
3126
|
+
border-color: var(--persona-text, #1f2937);
|
|
3127
|
+
background: var(--persona-container, #f3f4f6);
|
|
3128
|
+
}
|
|
3129
|
+
|
|
3130
|
+
[data-persona-root] .persona-ask-pill:active {
|
|
3131
|
+
transform: translateY(1px);
|
|
3132
|
+
}
|
|
3133
|
+
|
|
3134
|
+
[data-persona-root] .persona-ask-pill-selected,
|
|
3135
|
+
[data-persona-root] .persona-ask-pill[aria-pressed="true"] {
|
|
3136
|
+
background: var(--persona-ask-pill-bg-selected, var(--persona-accent, #0f0f0f));
|
|
3137
|
+
color: var(--persona-ask-pill-fg-selected, #fafafa);
|
|
3138
|
+
border-color: var(--persona-ask-pill-bg-selected, var(--persona-accent, #0f0f0f));
|
|
3139
|
+
}
|
|
3140
|
+
|
|
3141
|
+
[data-persona-root] .persona-ask-pill:focus:not(:focus-visible) {
|
|
3142
|
+
outline: none;
|
|
3143
|
+
}
|
|
3144
|
+
|
|
3145
|
+
[data-persona-root] .persona-ask-pill:focus-visible {
|
|
3146
|
+
outline: 2px solid var(--persona-accent, #0f0f0f);
|
|
3147
|
+
outline-offset: 2px;
|
|
3148
|
+
}
|
|
3149
|
+
|
|
3150
|
+
[data-persona-root] .persona-ask-pill-custom {
|
|
3151
|
+
border-style: dashed;
|
|
3152
|
+
}
|
|
3153
|
+
|
|
3154
|
+
[data-persona-root] .persona-ask-pill-skeleton {
|
|
3155
|
+
min-width: 5rem;
|
|
3156
|
+
height: 2rem;
|
|
3157
|
+
padding: 0;
|
|
3158
|
+
border: 1px solid var(--persona-border, #e5e7eb);
|
|
3159
|
+
background: linear-gradient(90deg,
|
|
3160
|
+
var(--persona-container, #f3f4f6) 0%,
|
|
3161
|
+
var(--persona-border, #e5e7eb) 50%,
|
|
3162
|
+
var(--persona-container, #f3f4f6) 100%);
|
|
3163
|
+
background-size: 200% 100%;
|
|
3164
|
+
animation: persona-ask-skeleton-shimmer 1.2s ease-in-out infinite;
|
|
3165
|
+
}
|
|
3166
|
+
|
|
3167
|
+
@keyframes persona-ask-skeleton-shimmer {
|
|
3168
|
+
0% { background-position: 100% 50%; }
|
|
3169
|
+
100% { background-position: -100% 50%; }
|
|
3170
|
+
}
|
|
3171
|
+
|
|
3172
|
+
/* Row layout — full-width stacked rows with always-visible description
|
|
3173
|
+
and a right-edge affordance (number badge for single-select, check for
|
|
3174
|
+
multi-select). Layered on top of .persona-ask-pill base styles. */
|
|
3175
|
+
[data-persona-root] .persona-ask-row {
|
|
3176
|
+
align-items: stretch;
|
|
3177
|
+
justify-content: space-between;
|
|
3178
|
+
gap: 0.75rem;
|
|
3179
|
+
padding: 0.7rem 0.9rem;
|
|
3180
|
+
}
|
|
3181
|
+
|
|
3182
|
+
[data-persona-root] .persona-ask-row-content {
|
|
3183
|
+
display: flex;
|
|
3184
|
+
flex-direction: column;
|
|
3185
|
+
gap: 0.15rem;
|
|
3186
|
+
flex: 1 1 auto;
|
|
3187
|
+
min-width: 0;
|
|
3188
|
+
}
|
|
3189
|
+
|
|
3190
|
+
[data-persona-root] .persona-ask-row-label {
|
|
3191
|
+
font-size: 0.92rem;
|
|
3192
|
+
font-weight: 600;
|
|
3193
|
+
line-height: 1.25;
|
|
3194
|
+
color: inherit;
|
|
3195
|
+
white-space: normal;
|
|
3196
|
+
overflow-wrap: anywhere;
|
|
3197
|
+
}
|
|
3198
|
+
|
|
3199
|
+
[data-persona-root] .persona-ask-row-description {
|
|
3200
|
+
font-size: 0.82rem;
|
|
3201
|
+
font-weight: 400;
|
|
3202
|
+
line-height: 1.35;
|
|
3203
|
+
color: var(--persona-text-muted, #6b7280);
|
|
3204
|
+
white-space: normal;
|
|
3205
|
+
overflow-wrap: anywhere;
|
|
3206
|
+
}
|
|
3207
|
+
|
|
3208
|
+
[data-persona-root] .persona-ask-pill-selected .persona-ask-row-description,
|
|
3209
|
+
[data-persona-root] .persona-ask-pill[aria-pressed="true"] .persona-ask-row-description {
|
|
3210
|
+
color: var(--persona-ask-pill-fg-selected, #fafafa);
|
|
3211
|
+
opacity: 0.85;
|
|
3212
|
+
}
|
|
3213
|
+
|
|
3214
|
+
[data-persona-root] .persona-ask-row-affordance {
|
|
3215
|
+
display: inline-flex;
|
|
3216
|
+
align-items: center;
|
|
3217
|
+
justify-content: center;
|
|
3218
|
+
flex: 0 0 auto;
|
|
3219
|
+
align-self: center;
|
|
3220
|
+
}
|
|
3221
|
+
|
|
3222
|
+
[data-persona-root] .persona-ask-row-badge {
|
|
3223
|
+
display: inline-flex;
|
|
3224
|
+
align-items: center;
|
|
3225
|
+
justify-content: center;
|
|
3226
|
+
width: 1.5rem;
|
|
3227
|
+
height: 1.5rem;
|
|
3228
|
+
border-radius: 0.4rem;
|
|
3229
|
+
border: 1px solid var(--persona-border, #e5e7eb);
|
|
3230
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
3231
|
+
font-size: 0.78rem;
|
|
3232
|
+
font-weight: 600;
|
|
3233
|
+
color: var(--persona-text-muted, #6b7280);
|
|
3234
|
+
background: transparent;
|
|
3235
|
+
}
|
|
3236
|
+
|
|
3237
|
+
[data-persona-root] .persona-ask-pill-selected .persona-ask-row-badge,
|
|
3238
|
+
[data-persona-root] .persona-ask-pill[aria-pressed="true"] .persona-ask-row-badge {
|
|
3239
|
+
border-color: var(--persona-ask-pill-fg-selected, #fafafa);
|
|
3240
|
+
color: var(--persona-ask-pill-fg-selected, #fafafa);
|
|
3241
|
+
}
|
|
3242
|
+
|
|
3243
|
+
[data-persona-root] .persona-ask-row-check {
|
|
3244
|
+
display: inline-flex;
|
|
3245
|
+
align-items: center;
|
|
3246
|
+
justify-content: center;
|
|
3247
|
+
width: 1.4rem;
|
|
3248
|
+
height: 1.4rem;
|
|
3249
|
+
border-radius: 0.35rem;
|
|
3250
|
+
border: 1.5px solid var(--persona-border, #d1d5db);
|
|
3251
|
+
background: transparent;
|
|
3252
|
+
position: relative;
|
|
3253
|
+
}
|
|
3254
|
+
|
|
3255
|
+
[data-persona-root] .persona-ask-pill-selected .persona-ask-row-check,
|
|
3256
|
+
[data-persona-root] .persona-ask-pill[aria-pressed="true"] .persona-ask-row-check {
|
|
3257
|
+
background: var(--persona-ask-pill-fg-selected, #fafafa);
|
|
3258
|
+
border-color: var(--persona-ask-pill-fg-selected, #fafafa);
|
|
3259
|
+
}
|
|
3260
|
+
|
|
3261
|
+
[data-persona-root] .persona-ask-pill-selected .persona-ask-row-check::after,
|
|
3262
|
+
[data-persona-root] .persona-ask-pill[aria-pressed="true"] .persona-ask-row-check::after {
|
|
3263
|
+
content: "";
|
|
3264
|
+
width: 0.45rem;
|
|
3265
|
+
height: 0.75rem;
|
|
3266
|
+
border-right: 2px solid var(--persona-ask-pill-bg-selected, var(--persona-accent, #0f0f0f));
|
|
3267
|
+
border-bottom: 2px solid var(--persona-ask-pill-bg-selected, var(--persona-accent, #0f0f0f));
|
|
3268
|
+
transform: rotate(45deg) translate(-1px, -1px);
|
|
3269
|
+
}
|
|
3270
|
+
|
|
3271
|
+
[data-persona-root] .persona-ask-row.persona-ask-pill-skeleton {
|
|
3272
|
+
height: 3rem;
|
|
3273
|
+
}
|
|
3274
|
+
|
|
3275
|
+
/* Other row (rows mode) — composite row that contains the free-text input
|
|
3276
|
+
* directly. The input fills the row body; the badge sits on the right. */
|
|
3277
|
+
[data-persona-root] .persona-ask-row--other {
|
|
3278
|
+
cursor: text;
|
|
3279
|
+
}
|
|
3280
|
+
|
|
3281
|
+
[data-persona-root] .persona-ask-row-input {
|
|
3282
|
+
flex: 1;
|
|
3283
|
+
min-width: 0;
|
|
3284
|
+
border: none;
|
|
3285
|
+
background: transparent;
|
|
3286
|
+
padding: 0;
|
|
3287
|
+
margin: 0;
|
|
3288
|
+
font: inherit;
|
|
3289
|
+
font-size: 0.92rem;
|
|
3290
|
+
color: inherit;
|
|
3291
|
+
outline: none;
|
|
3292
|
+
width: 100%;
|
|
3293
|
+
}
|
|
3294
|
+
|
|
3295
|
+
[data-persona-root] .persona-ask-row-input::placeholder {
|
|
3296
|
+
color: var(--persona-text-muted, #6b7280);
|
|
3297
|
+
opacity: 1;
|
|
3298
|
+
}
|
|
3299
|
+
|
|
3300
|
+
/* Free-text expansion row (pills layout only) */
|
|
3301
|
+
[data-persona-root] .persona-ask-free-text {
|
|
3302
|
+
width: 100%;
|
|
3303
|
+
}
|
|
3304
|
+
|
|
3305
|
+
[data-persona-root] .persona-ask-free-text--rows {
|
|
3306
|
+
margin-top: 0.4rem;
|
|
3307
|
+
}
|
|
3308
|
+
|
|
3309
|
+
[data-persona-root] .persona-ask-free-text-input {
|
|
3310
|
+
padding: 0.5rem 0.8rem;
|
|
3311
|
+
border: 1px solid var(--persona-border, #e5e7eb);
|
|
3312
|
+
border-radius: 0.55rem;
|
|
3313
|
+
font-size: 0.88rem;
|
|
3314
|
+
background: var(--persona-ask-input-bg, var(--persona-surface, #ffffff));
|
|
3315
|
+
color: var(--persona-text, #1f2937);
|
|
3316
|
+
}
|
|
3317
|
+
|
|
3318
|
+
[data-persona-root] .persona-ask-free-text-input:focus {
|
|
3319
|
+
outline: 2px solid var(--persona-accent, #0f0f0f);
|
|
3320
|
+
outline-offset: 1px;
|
|
3321
|
+
}
|
|
3322
|
+
|
|
3323
|
+
[data-persona-root] .persona-ask-free-text-submit,
|
|
3324
|
+
[data-persona-root] .persona-ask-multi-submit {
|
|
3325
|
+
padding: 0.5rem 1rem;
|
|
3326
|
+
border: none;
|
|
3327
|
+
border-radius: 0.55rem;
|
|
3328
|
+
background: var(--persona-accent, #0f0f0f);
|
|
3329
|
+
color: #fafafa;
|
|
3330
|
+
font-size: 0.85rem;
|
|
3331
|
+
font-weight: 600;
|
|
3332
|
+
cursor: pointer;
|
|
3333
|
+
transition: opacity 0.15s ease;
|
|
3334
|
+
}
|
|
3335
|
+
|
|
3336
|
+
[data-persona-root] .persona-ask-free-text-submit:disabled,
|
|
3337
|
+
[data-persona-root] .persona-ask-multi-submit:disabled {
|
|
3338
|
+
opacity: 0.4;
|
|
3339
|
+
cursor: not-allowed;
|
|
3340
|
+
}
|
|
3341
|
+
|
|
3342
|
+
/* Nav row — Back / Skip / Next-or-Submit buttons for grouped payloads. */
|
|
3343
|
+
[data-persona-root] .persona-ask-nav-back,
|
|
3344
|
+
[data-persona-root] .persona-ask-nav-skip {
|
|
3345
|
+
padding: 0.45rem 0.85rem;
|
|
3346
|
+
border: 1px solid transparent;
|
|
3347
|
+
border-radius: 0.55rem;
|
|
3348
|
+
background: transparent;
|
|
3349
|
+
color: var(--persona-text-muted, #6b7280);
|
|
3350
|
+
font-size: 0.85rem;
|
|
3351
|
+
font-weight: 500;
|
|
3352
|
+
cursor: pointer;
|
|
3353
|
+
transition: background 0.15s ease, color 0.15s ease;
|
|
3354
|
+
}
|
|
3355
|
+
|
|
3356
|
+
[data-persona-root] .persona-ask-nav-back:hover:not(:disabled),
|
|
3357
|
+
[data-persona-root] .persona-ask-nav-skip:hover:not(:disabled) {
|
|
3358
|
+
background: var(--persona-container, #f3f4f6);
|
|
3359
|
+
color: var(--persona-text, #1f2937);
|
|
3360
|
+
}
|
|
3361
|
+
|
|
3362
|
+
[data-persona-root] .persona-ask-nav-back:disabled {
|
|
3363
|
+
opacity: 0.35;
|
|
3364
|
+
cursor: not-allowed;
|
|
3365
|
+
}
|
|
3366
|
+
|
|
3367
|
+
[data-persona-root] .persona-ask-nav-next {
|
|
3368
|
+
padding: 0.5rem 1rem;
|
|
3369
|
+
border: none;
|
|
3370
|
+
border-radius: 0.55rem;
|
|
3371
|
+
background: var(--persona-accent, #0f0f0f);
|
|
3372
|
+
color: #fafafa;
|
|
3373
|
+
font-size: 0.85rem;
|
|
3374
|
+
font-weight: 600;
|
|
3375
|
+
cursor: pointer;
|
|
3376
|
+
transition: opacity 0.15s ease;
|
|
3377
|
+
}
|
|
3378
|
+
|
|
3379
|
+
[data-persona-root] .persona-ask-nav-next:disabled {
|
|
3380
|
+
opacity: 0.4;
|
|
3381
|
+
cursor: not-allowed;
|
|
3382
|
+
}
|
|
3383
|
+
|
|
3384
|
+
@media (prefers-reduced-motion: reduce) {
|
|
3385
|
+
[data-persona-root] .persona-ask-sheet,
|
|
3386
|
+
[data-persona-root] .persona-ask-pill-skeleton,
|
|
3387
|
+
[data-persona-root] .persona-ask-question-skeleton {
|
|
3388
|
+
transition: none !important;
|
|
3389
|
+
animation: none !important;
|
|
3390
|
+
}
|
|
3391
|
+
}
|
|
3392
|
+
|
|
3393
|
+
/* ===========================================================================
|
|
3394
|
+
* Composer-bar mode (`launcher.mountMode: "composer-bar"`)
|
|
3395
|
+
*
|
|
3396
|
+
* Geometry (position, width, height) is set per-state inline by
|
|
3397
|
+
* `applyComposerBarGeometry()` in ui.ts. The pill composer
|
|
3398
|
+
* (`pill-composer-builder.ts`) ships with its own clean className
|
|
3399
|
+
* (`persona-pill-composer`, no `persona-flex-col` / `persona-rounded-2xl`
|
|
3400
|
+
* baggage), so layout CSS does not need to fight utility classes — no
|
|
3401
|
+
* !important. The pill is the visible element in both collapsed and
|
|
3402
|
+
* expanded states; only the panel above it appears/disappears.
|
|
3403
|
+
*
|
|
3404
|
+
* Avoid `transform: scale(...)` on the wrapper — it breaks the textarea
|
|
3405
|
+
* caret/IME.
|
|
3406
|
+
* ======================================================================= */
|
|
3407
|
+
.persona-widget-wrapper[data-persona-composer-bar] {
|
|
3408
|
+
/* Flex column so the inner panel (which has `flex-1`) fills the wrapper.
|
|
3409
|
+
* Without this, the panel would shrink-wrap its children (chat container
|
|
3410
|
+
* + pill) and a gap would appear between the pill and the wrapper's
|
|
3411
|
+
* `bottom: 16px` edge. */
|
|
3412
|
+
display: flex;
|
|
3413
|
+
flex-direction: column;
|
|
3414
|
+
transition:
|
|
3415
|
+
max-width 220ms ease,
|
|
3416
|
+
bottom 220ms ease,
|
|
3417
|
+
top 220ms ease,
|
|
3418
|
+
left 220ms ease,
|
|
3419
|
+
right 220ms ease,
|
|
3420
|
+
transform 220ms ease,
|
|
3421
|
+
border-radius 220ms ease,
|
|
3422
|
+
height 220ms ease,
|
|
3423
|
+
width 220ms ease;
|
|
3424
|
+
}
|
|
3425
|
+
|
|
3426
|
+
/* Modal and anchored: the wrapper goes from collapsed (no inline geometry,
|
|
3427
|
+
* so `top/left/transform` resolve to their auto/none defaults) to its
|
|
3428
|
+
* expanded position. The default `transform 220ms ease` transition would
|
|
3429
|
+
* interpolate `none → translate(...)` and visibly slide the wrapper from
|
|
3430
|
+
* its static-default origin toward its target — diagonally for modal,
|
|
3431
|
+
* horizontally from the right for anchored. Neither mode is morphing
|
|
3432
|
+
* something the user can see (the wrapper is invisible when collapsed
|
|
3433
|
+
* because the pill lives in pillRoot, not the wrapper), so the slide
|
|
3434
|
+
* is pure motion noise. Disable geometry transitions for both; the
|
|
3435
|
+
* container's opacity fade-in keyframe is the reveal.
|
|
3436
|
+
*
|
|
3437
|
+
* Fullscreen intentionally keeps its geometry transition — that's the
|
|
3438
|
+
* one mode where the wrapper genuinely morphs (empty → full viewport),
|
|
3439
|
+
* and the staggered fade-in cascade below is built to mask the
|
|
3440
|
+
* outer-edge/inner-content desync during that morph. */
|
|
3441
|
+
.persona-widget-wrapper[data-persona-composer-bar][data-expanded-size="modal"],
|
|
3442
|
+
.persona-widget-wrapper[data-persona-composer-bar][data-expanded-size="anchored"] {
|
|
3443
|
+
transition: none;
|
|
3444
|
+
}
|
|
3445
|
+
|
|
3446
|
+
/* --- Pill composer chrome (always visible in composer-bar mode) -------- */
|
|
3447
|
+
|
|
3448
|
+
/* Pill is a single-row grid: paperclip · textarea · mic + send. */
|
|
3449
|
+
.persona-pill-composer {
|
|
3450
|
+
display: grid;
|
|
3451
|
+
grid-template-columns: auto 1fr auto;
|
|
3452
|
+
align-items: center;
|
|
3453
|
+
gap: 8px;
|
|
3454
|
+
padding: 6px 14px;
|
|
3455
|
+
border-radius: 9999px;
|
|
3456
|
+
background: var(--persona-surface, #ffffff);
|
|
3457
|
+
border: 1px solid var(--persona-border, #e5e7eb);
|
|
3458
|
+
box-shadow:
|
|
3459
|
+
0 6px 24px rgba(15, 23, 42, 0.10),
|
|
3460
|
+
0 1px 2px rgba(15, 23, 42, 0.04);
|
|
3461
|
+
}
|
|
3462
|
+
|
|
3463
|
+
.persona-pill-composer .persona-composer-textarea {
|
|
3464
|
+
/* Single line by default; the autoresize closure expands up to the
|
|
3465
|
+
* max-height set inline by pill-composer-builder (100px). Width 100%
|
|
3466
|
+
* fills the `1fr` middle grid cell so wrapping only happens once the
|
|
3467
|
+
* pill itself can't grow any wider. */
|
|
3468
|
+
min-height: 24px;
|
|
3469
|
+
width: 100%;
|
|
3470
|
+
padding: 4px 0;
|
|
3471
|
+
}
|
|
3472
|
+
|
|
3473
|
+
/* Responsive default width for the collapsed pill — applied only when
|
|
3474
|
+
* `applyComposerBarGeometry()` leaves the wrapper's inline width empty
|
|
3475
|
+
* (i.e., the user did NOT set `composerBar.collapsedMaxWidth`). Inline
|
|
3476
|
+
* width from a user config still wins via specificity (inline > class). */
|
|
3477
|
+
/* Pill responsive widths now live on the viewport-fixed pillRoot below;
|
|
3478
|
+
* the wrapper no longer doubles as the pill container. */
|
|
3479
|
+
|
|
3480
|
+
/* The action cells host inline-flex buttons; without explicit flex layout
|
|
3481
|
+
* on the cell, the buttons sit on the inline baseline and the cell extends
|
|
3482
|
+
* below them with descender space, making the buttons look top-aligned. */
|
|
3483
|
+
.persona-pill-composer__left,
|
|
3484
|
+
.persona-pill-composer__right {
|
|
3485
|
+
display: flex;
|
|
3486
|
+
align-items: center;
|
|
3487
|
+
gap: 4px;
|
|
3488
|
+
}
|
|
3489
|
+
|
|
3490
|
+
/* Footer wrapping the pill: transparent surface, vertical stack with
|
|
3491
|
+
* room above the pill for the previews row. */
|
|
3492
|
+
.persona-widget-footer--pill {
|
|
3493
|
+
background: transparent;
|
|
3494
|
+
border-top: none;
|
|
3495
|
+
padding: 0;
|
|
3496
|
+
display: flex;
|
|
3497
|
+
flex-direction: column;
|
|
3498
|
+
gap: 8px;
|
|
3499
|
+
}
|
|
3500
|
+
|
|
3501
|
+
/* Attachment previews row (above the pill). AttachmentManager toggles
|
|
3502
|
+
* display:flex when items are added; default is display:none. */
|
|
3503
|
+
.persona-pill-composer__previews {
|
|
3504
|
+
padding: 0 8px;
|
|
3505
|
+
}
|
|
3506
|
+
|
|
3507
|
+
/* --- Container chrome ---------------------------------------------------
|
|
3508
|
+
*
|
|
3509
|
+
* Container chrome (background, border, border-radius, box-shadow) is
|
|
3510
|
+
* applied inline by `applyFullHeightStyles()` in ui.ts so it can flow through
|
|
3511
|
+
* the same `theme.components.panel.{shadow,border,borderRadius}` contract
|
|
3512
|
+
* used by every other mount mode. Collapsed hides the container entirely
|
|
3513
|
+
* (only the pill is visible); expanded re-applies the chrome. The
|
|
3514
|
+
* `fullscreen` expanded variant intentionally stays chrome-less. */
|
|
3515
|
+
|
|
3516
|
+
/* Composer overlay (interactive sheets like ask_user_question) hidden in
|
|
3517
|
+
* collapsed; the pill has no room and the panel above is gone anyway. */
|
|
3518
|
+
[data-persona-composer-bar][data-state="collapsed"] .persona-composer-overlay {
|
|
3519
|
+
display: none;
|
|
3520
|
+
}
|
|
3521
|
+
|
|
3522
|
+
/* --- Pill root: viewport-fixed sibling of the wrapper ------------------
|
|
3523
|
+
*
|
|
3524
|
+
* In composer-bar mode the pill (`footer`) and peek banner live in a
|
|
3525
|
+
* viewport-fixed sibling of the wrapper, NOT inside the wrapper. Reason:
|
|
3526
|
+
* modal mode applies `transform: translate(-50%, -50%)` to the wrapper,
|
|
3527
|
+
* which establishes a containing block for `position: fixed` descendants —
|
|
3528
|
+
* a fixed pill inside a transformed wrapper would be positioned relative
|
|
3529
|
+
* to the wrapper, not the viewport.
|
|
3530
|
+
*
|
|
3531
|
+
* Bottom offset and (optionally) width are written inline by ui.ts based
|
|
3532
|
+
* on `launcher.composerBar.{bottomOffset, collapsedMaxWidth}`; otherwise
|
|
3533
|
+
* the responsive defaults below apply. The pillRoot mirrors the wrapper's
|
|
3534
|
+
* `[data-state]` and `[data-expanded-size]` attributes so peek/pill rules
|
|
3535
|
+
* keyed off those attributes still cascade. */
|
|
3536
|
+
.persona-widget-pill-root {
|
|
3537
|
+
position: fixed;
|
|
3538
|
+
bottom: 16px;
|
|
3539
|
+
left: 50%;
|
|
3540
|
+
transform: translateX(-50%);
|
|
3541
|
+
width: 90vw;
|
|
3542
|
+
max-width: calc(100vw - 32px);
|
|
3543
|
+
display: flex;
|
|
3544
|
+
flex-direction: column;
|
|
3545
|
+
gap: 8px;
|
|
3546
|
+
}
|
|
3547
|
+
@media (min-width: 640px) {
|
|
3548
|
+
.persona-widget-pill-root {
|
|
3549
|
+
width: 70vw;
|
|
3550
|
+
}
|
|
3551
|
+
}
|
|
3552
|
+
@media (min-width: 1024px) {
|
|
3553
|
+
.persona-widget-pill-root {
|
|
3554
|
+
width: 50vw;
|
|
3555
|
+
}
|
|
3556
|
+
}
|
|
3557
|
+
|
|
3558
|
+
/* Container hidden when the chat is collapsed — only the pill is visible. */
|
|
3559
|
+
[data-persona-composer-bar][data-state="collapsed"] .persona-widget-container {
|
|
3560
|
+
display: none;
|
|
3561
|
+
}
|
|
3562
|
+
|
|
3563
|
+
/* --- Peek banner ------------------------------------------------------- */
|
|
3564
|
+
/* The peek is the chrome-less row above the pill (composer-bar mode only)
|
|
3565
|
+
* that previews the trailing 100 chars of the most recent assistant
|
|
3566
|
+
* message. ui.ts toggles `--visible` based on streaming/hover/open state;
|
|
3567
|
+
* pointer-events are gated so the faded-out peek never swallows clicks
|
|
3568
|
+
* targeted at the pill below. */
|
|
3569
|
+
.persona-pill-peek {
|
|
3570
|
+
display: flex;
|
|
3571
|
+
align-items: center;
|
|
3572
|
+
gap: 8px;
|
|
3573
|
+
padding: 6px 14px;
|
|
3574
|
+
/* Frosted-glass chrome so the text stays readable over arbitrary host
|
|
3575
|
+
* backgrounds (busy hero images, dark sections, brand colors). The
|
|
3576
|
+
* translucent fill + backdrop blur turns the underlying area into a
|
|
3577
|
+
* neutral surface; the hairline border + soft shadow define the edge
|
|
3578
|
+
* without competing with the pill below. */
|
|
3579
|
+
background: rgba(255, 255, 255, 0.78);
|
|
3580
|
+
-webkit-backdrop-filter: blur(10px) saturate(1.5);
|
|
3581
|
+
backdrop-filter: blur(10px) saturate(1.5);
|
|
3582
|
+
border: 1px solid rgba(0, 0, 0, 0.06);
|
|
3583
|
+
border-radius: 9999px;
|
|
3584
|
+
box-shadow: 0 2px 8px rgba(15, 23, 42, 0.06);
|
|
3585
|
+
color: var(--persona-primary, #111827);
|
|
3586
|
+
font: inherit;
|
|
3587
|
+
font-size: 13px;
|
|
3588
|
+
line-height: 1.4;
|
|
3589
|
+
cursor: pointer;
|
|
3590
|
+
opacity: 0;
|
|
3591
|
+
pointer-events: none;
|
|
3592
|
+
transform: translateY(2px);
|
|
3593
|
+
transition:
|
|
3594
|
+
opacity 150ms ease,
|
|
3595
|
+
transform 150ms ease,
|
|
3596
|
+
background-color 150ms ease;
|
|
3597
|
+
text-align: left;
|
|
3598
|
+
/* Full-width row that matches the pill below — text takes the middle
|
|
3599
|
+
* (flex: 1 1 auto) and the chevron pins to the right edge. */
|
|
3600
|
+
width: 100%;
|
|
3601
|
+
align-self: stretch;
|
|
3602
|
+
}
|
|
3603
|
+
|
|
3604
|
+
/* Browsers without backdrop-filter support (older Firefox, some webviews)
|
|
3605
|
+
* fall through to a slightly more opaque solid surface so the underlying
|
|
3606
|
+
* page can't bleed through. The non-supports rule above already gives a
|
|
3607
|
+
* usable look (78% opacity); this just hardens it for non-blur fallback. */
|
|
3608
|
+
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
|
|
3609
|
+
.persona-pill-peek {
|
|
3610
|
+
background: rgba(255, 255, 255, 0.95);
|
|
3611
|
+
}
|
|
3612
|
+
}
|
|
3613
|
+
|
|
3614
|
+
.persona-pill-peek--visible {
|
|
3615
|
+
opacity: 1;
|
|
3616
|
+
pointer-events: auto;
|
|
3617
|
+
transform: translateY(0);
|
|
3618
|
+
}
|
|
3619
|
+
|
|
3620
|
+
.persona-pill-peek:hover {
|
|
3621
|
+
background: rgba(255, 255, 255, 0.92);
|
|
3622
|
+
}
|
|
3623
|
+
|
|
3624
|
+
.persona-pill-peek__icon,
|
|
3625
|
+
.persona-pill-peek__caret {
|
|
3626
|
+
display: inline-flex;
|
|
3627
|
+
flex-shrink: 0;
|
|
3628
|
+
color: currentColor;
|
|
3629
|
+
}
|
|
3630
|
+
|
|
3631
|
+
.persona-pill-peek__text {
|
|
3632
|
+
overflow: hidden;
|
|
3633
|
+
text-overflow: ellipsis;
|
|
3634
|
+
white-space: nowrap;
|
|
3635
|
+
flex: 1 1 auto;
|
|
3636
|
+
min-width: 0;
|
|
3637
|
+
}
|
|
3638
|
+
|
|
3639
|
+
/* Per-char/per-word animated spans render as inline-block, which interacts
|
|
3640
|
+
* with the peek's nowrap+ellipsis chrome. Setting `vertical-align: baseline`
|
|
3641
|
+
* keeps the spans on the same baseline as surrounding text so reveal
|
|
3642
|
+
* transforms (translateY, scale) don't bump the line height. */
|
|
3643
|
+
[data-persona-root] .persona-pill-peek__text .persona-stream-char,
|
|
3644
|
+
[data-persona-root] .persona-pill-peek__text .persona-stream-word {
|
|
3645
|
+
vertical-align: baseline;
|
|
3646
|
+
}
|
|
3647
|
+
|
|
3648
|
+
/* Peek-scaled skeleton: the bubble-sized 260×10 bar would dwarf a 14px-line
|
|
3649
|
+
* pill. Inside the peek we shrink to a single, full-flex bar that hints at
|
|
3650
|
+
* "more is coming" without dominating the chrome. Used when
|
|
3651
|
+
* `streamAnimation.placeholder === "skeleton"` AND content trims to empty
|
|
3652
|
+
* (e.g. `buffer: "line"` between line completions). */
|
|
3653
|
+
[data-persona-root] .persona-pill-peek__text .persona-pill-peek__skeleton {
|
|
3654
|
+
display: inline-flex;
|
|
3655
|
+
vertical-align: middle;
|
|
3656
|
+
width: 100%;
|
|
3657
|
+
max-width: 200px;
|
|
3658
|
+
padding: 0;
|
|
3659
|
+
}
|
|
3660
|
+
[data-persona-root] .persona-pill-peek__text .persona-pill-peek__skeleton .persona-stream-skeleton-line {
|
|
3661
|
+
height: 8px;
|
|
3662
|
+
}
|
|
3663
|
+
|
|
3664
|
+
/* --- Expanded states: geometry safety nets ----------------------------- */
|
|
3665
|
+
|
|
3666
|
+
/* `fullscreen`: ui.ts clears all inline geometry so this rule lights up. */
|
|
3667
|
+
.persona-widget-wrapper[data-persona-composer-bar][data-state="expanded"][data-expanded-size="fullscreen"] {
|
|
3668
|
+
inset: 0;
|
|
3669
|
+
top: 0;
|
|
3670
|
+
right: 0;
|
|
3671
|
+
bottom: 0;
|
|
3672
|
+
left: 0;
|
|
3673
|
+
transform: none;
|
|
3674
|
+
max-width: none;
|
|
3675
|
+
width: 100%;
|
|
3676
|
+
height: 100%;
|
|
3677
|
+
border-radius: 0;
|
|
3678
|
+
}
|
|
3679
|
+
|
|
3680
|
+
/* Fullscreen "panel behind pill": the chat body fills the full viewport
|
|
3681
|
+
* (including the area behind the fixed pill) so messages scroll under the
|
|
3682
|
+
* pill. The body itself drops its bottom padding so its background extends
|
|
3683
|
+
* to the viewport edge; reachability for the last bubble comes from
|
|
3684
|
+
* padding-bottom on the messages wrapper (body's last child) — that
|
|
3685
|
+
* pushes the final message above the pill area rather than hiding it
|
|
3686
|
+
* behind. */
|
|
3687
|
+
.persona-widget-wrapper[data-persona-composer-bar][data-expanded-size="fullscreen"] .persona-widget-body {
|
|
3688
|
+
padding-bottom: 0;
|
|
3689
|
+
}
|
|
3690
|
+
.persona-widget-wrapper[data-persona-composer-bar][data-expanded-size="fullscreen"] .persona-widget-body > :last-child {
|
|
3691
|
+
padding-bottom: calc(var(--persona-pill-bottom, 16px) + var(--persona-pill-area-height, 80px) + 16px);
|
|
3692
|
+
}
|
|
3693
|
+
|
|
3694
|
+
/* `modal` and `anchored` get their geometry inline from ui.ts; nothing
|
|
3695
|
+
* needed in CSS for those. */
|
|
3696
|
+
|
|
3697
|
+
/* --- Expand fade-in cascade -------------------------------------------- */
|
|
3698
|
+
/*
|
|
3699
|
+
* Two staggered fades that mask the visual desync between the wrapper's
|
|
3700
|
+
* fast-traveling outer edges and the inner content (which is constrained
|
|
3701
|
+
* by `contentMaxWidth` + `margin: auto` and therefore moves at a fraction
|
|
3702
|
+
* of the wrapper's growth rate). Without this, the user perceives an
|
|
3703
|
+
* empty "gap" inside the wrapper as it morphs to fullscreen.
|
|
3704
|
+
*
|
|
3705
|
+
* - Chrome (container background, border, shadow, and the absolute close +
|
|
3706
|
+
* clear buttons) fades in across the same 220ms as the geometry transition,
|
|
3707
|
+
* so the box appears to materialize as it grows rather than snap into
|
|
3708
|
+
* existence at frame 0.
|
|
3709
|
+
* - Body content (intro card, messages, composer overlay) fades in AFTER
|
|
3710
|
+
* the geometry has settled — `animation-delay: 220ms` plus
|
|
3711
|
+
* `animation-fill-mode: both` keeps it at opacity 0 during the morph.
|
|
3712
|
+
*
|
|
3713
|
+
* Because `[data-state="collapsed"] .persona-widget-container { display:
|
|
3714
|
+
* none }`, the container leaves and re-enters the rendering tree on each
|
|
3715
|
+
* expand, which retriggers the keyframe animation cleanly without
|
|
3716
|
+
* needing a JS class toggle.
|
|
3717
|
+
*/
|
|
3718
|
+
@keyframes persona-composer-bar-fade-in {
|
|
3719
|
+
from { opacity: 0; }
|
|
3720
|
+
to { opacity: 1; }
|
|
3721
|
+
}
|
|
3722
|
+
|
|
3723
|
+
.persona-widget-wrapper[data-persona-composer-bar][data-state="expanded"] .persona-widget-container {
|
|
3724
|
+
animation: persona-composer-bar-fade-in 220ms ease both;
|
|
3725
|
+
}
|
|
3726
|
+
|
|
3727
|
+
.persona-widget-wrapper[data-persona-composer-bar][data-state="expanded"] .persona-widget-body {
|
|
3728
|
+
animation: persona-composer-bar-fade-in 200ms ease 220ms both;
|
|
3729
|
+
}
|
|
3730
|
+
|
|
3731
|
+
@media (prefers-reduced-motion: reduce) {
|
|
3732
|
+
.persona-widget-wrapper[data-persona-composer-bar] {
|
|
3733
|
+
transition: none !important;
|
|
3734
|
+
}
|
|
3735
|
+
.persona-widget-wrapper[data-persona-composer-bar][data-state="expanded"] .persona-widget-container,
|
|
3736
|
+
.persona-widget-wrapper[data-persona-composer-bar][data-state="expanded"] .persona-widget-body {
|
|
3737
|
+
animation: none !important;
|
|
3738
|
+
}
|
|
3739
|
+
}
|