@crestapps/ai-chat-ui 2.0.0-preview.199 → 2.0.0-preview.215
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/ai-chat.js +4 -1
- package/dist/ai-chat.js.map +1 -1
- package/dist/ai-chat.min.js +1 -1
- package/dist/ai-chat.min.js.map +1 -1
- package/dist/chat-image-carousel.css +277 -0
- package/dist/chat-image-carousel.css.map +1 -0
- package/dist/chat-image-carousel.js +485 -0
- package/dist/chat-image-carousel.js.map +1 -0
- package/dist/chat-image-carousel.min.css +1 -0
- package/dist/chat-image-carousel.min.js +2 -0
- package/dist/chat-image-carousel.min.js.map +1 -0
- package/dist/chat-interaction.js +4 -1
- package/dist/chat-interaction.js.map +1 -1
- package/dist/chat-interaction.min.js +1 -1
- package/dist/chat-interaction.min.js.map +1 -1
- package/dist/chat-markers.js +77 -28
- package/dist/chat-markers.js.map +1 -1
- package/dist/chat-markers.min.js +1 -1
- package/dist/chat-markers.min.js.map +1 -1
- package/dist/realtime-audio.js +99 -5
- package/dist/realtime-audio.js.map +1 -1
- package/dist/realtime-audio.min.js +1 -1
- package/dist/realtime-audio.min.js.map +1 -1
- package/package.json +10 -2
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/* ── Stacked image carousel ── */
|
|
2
|
+
/* The pictures of one run are laid over each other in a single grid cell, so the stage is as tall as the
|
|
3
|
+
tallest of them and does not jump as the reader moves between pictures of different heights. The current
|
|
4
|
+
picture sits in front; its neighbours are pushed out to either side and shrunk, far enough that their
|
|
5
|
+
edges show and can be clicked. Cards further out are stacked out of sight behind the last visible one.
|
|
6
|
+
|
|
7
|
+
The selectors that size and place a card are deliberately specific: the chat surfaces already style
|
|
8
|
+
.generated-image-container -- the widget through .ai-chat-widget-messages, one host through a <style> of
|
|
9
|
+
its own -- and a card has to win over all of them wherever this file happens to be loaded. */
|
|
10
|
+
.ai-image-carousel {
|
|
11
|
+
--ai-image-carousel-card-width: 70%;
|
|
12
|
+
display: block;
|
|
13
|
+
width: 100%;
|
|
14
|
+
max-width: 520px;
|
|
15
|
+
margin: 0.5rem 0;
|
|
16
|
+
border-radius: 0.5rem;
|
|
17
|
+
transition: max-width 0.25s ease;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* The reader's choice from the size picker; medium is the default. */
|
|
21
|
+
.ai-image-carousel[data-carousel-size="small"] {
|
|
22
|
+
max-width: 360px;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.ai-image-carousel[data-carousel-size="large"] {
|
|
26
|
+
max-width: 760px;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.ai-image-carousel:focus {
|
|
30
|
+
outline: none;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.ai-image-carousel:focus-visible {
|
|
34
|
+
outline: 2px solid var(--bs-primary, #0d6efd);
|
|
35
|
+
outline-offset: 4px;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* The widget's panel is narrow, so the card takes more of it and the fan stays inside it. */
|
|
39
|
+
.ai-chat-widget-messages .ai-image-carousel {
|
|
40
|
+
--ai-image-carousel-card-width: 78%;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.ai-image-carousel-stage {
|
|
44
|
+
display: grid;
|
|
45
|
+
align-items: center;
|
|
46
|
+
justify-items: center;
|
|
47
|
+
padding: 0.25rem 0;
|
|
48
|
+
/* The cards are layered with z-index, and without a stacking context of their own those values are compared
|
|
49
|
+
with everything else on the page -- including the zoomed picture and its overlay, which carry none, so the
|
|
50
|
+
cards behind were drawn over the picture being looked at. Isolated, they only order among themselves. */
|
|
51
|
+
isolation: isolate;
|
|
52
|
+
/* A horizontal swipe is the carousel's; a vertical one still scrolls the conversation. */
|
|
53
|
+
touch-action: pan-y;
|
|
54
|
+
user-select: none;
|
|
55
|
+
-webkit-user-select: none;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.ai-image-carousel-stage > .generated-image-container.ai-image-carousel-item {
|
|
59
|
+
grid-area: 1 / 1;
|
|
60
|
+
display: block;
|
|
61
|
+
width: var(--ai-image-carousel-card-width);
|
|
62
|
+
margin: 0;
|
|
63
|
+
cursor: pointer;
|
|
64
|
+
transform-origin: center;
|
|
65
|
+
transition: transform 0.35s cubic-bezier(0.2, 0.7, 0.2, 1), opacity 0.35s ease, filter 0.35s ease;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.ai-image-carousel-stage > .generated-image-container.ai-image-carousel-item img {
|
|
69
|
+
display: block;
|
|
70
|
+
width: 100%;
|
|
71
|
+
max-width: 100% !important;
|
|
72
|
+
-webkit-user-drag: none;
|
|
73
|
+
box-shadow: 0 0.375rem 1.25rem rgba(0, 0, 0, 0.14);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset="0"] {
|
|
77
|
+
z-index: 4;
|
|
78
|
+
cursor: default;
|
|
79
|
+
/* Set on the stage while the reader drags, so the card follows the pointer. */
|
|
80
|
+
transform: translateX(var(--ai-image-carousel-drag, 0px));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset="-1"],
|
|
84
|
+
.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset="1"] {
|
|
85
|
+
z-index: 3;
|
|
86
|
+
opacity: 0.85;
|
|
87
|
+
filter: brightness(0.94);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset="-1"] {
|
|
91
|
+
transform: translateX(-16%) scale(0.88);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset="1"] {
|
|
95
|
+
transform: translateX(16%) scale(0.88);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset="-2"],
|
|
99
|
+
.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset="2"] {
|
|
100
|
+
z-index: 2;
|
|
101
|
+
opacity: 0.55;
|
|
102
|
+
filter: brightness(0.9);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset="-2"] {
|
|
106
|
+
transform: translateX(-26%) scale(0.76);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset="2"] {
|
|
110
|
+
transform: translateX(26%) scale(0.76);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset="-3"],
|
|
114
|
+
.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset="3"] {
|
|
115
|
+
z-index: 1;
|
|
116
|
+
opacity: 0;
|
|
117
|
+
pointer-events: none;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset="-3"] {
|
|
121
|
+
transform: translateX(-26%) scale(0.7);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset="3"] {
|
|
125
|
+
transform: translateX(26%) scale(0.7);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Pointing at a card behind says it can be brought forward. */
|
|
129
|
+
.ai-image-carousel-stage > .ai-image-carousel-item:not(.is-active):hover {
|
|
130
|
+
opacity: 1;
|
|
131
|
+
filter: none;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.ai-image-carousel-stage > .generated-image-container.ai-image-carousel-item:not(.is-active) img {
|
|
135
|
+
cursor: pointer;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* Only the picture in front is downloaded; a click on one behind brings it forward instead. */
|
|
139
|
+
.ai-image-carousel-stage > .ai-image-carousel-item:not(.is-active) .ai-download-image {
|
|
140
|
+
display: none;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* While dragging, the card is moved by the pointer, not eased toward it. */
|
|
144
|
+
.ai-image-carousel-stage.is-dragging > .ai-image-carousel-item {
|
|
145
|
+
transition: none;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.ai-image-carousel-controls {
|
|
149
|
+
display: flex;
|
|
150
|
+
align-items: center;
|
|
151
|
+
gap: 0.75rem;
|
|
152
|
+
margin-top: 0.5rem;
|
|
153
|
+
font-size: 0.8125rem;
|
|
154
|
+
line-height: 1.25;
|
|
155
|
+
color: var(--bs-secondary-color, #6c757d);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.ai-image-carousel-caption {
|
|
159
|
+
flex: 1 1 auto;
|
|
160
|
+
min-width: 0;
|
|
161
|
+
overflow: hidden;
|
|
162
|
+
text-overflow: ellipsis;
|
|
163
|
+
white-space: nowrap;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.ai-image-carousel-navigation {
|
|
167
|
+
display: inline-flex;
|
|
168
|
+
flex: none;
|
|
169
|
+
align-items: center;
|
|
170
|
+
gap: 0.375rem;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.ai-image-carousel-button {
|
|
174
|
+
display: inline-flex;
|
|
175
|
+
align-items: center;
|
|
176
|
+
justify-content: center;
|
|
177
|
+
width: 1.75rem;
|
|
178
|
+
height: 1.75rem;
|
|
179
|
+
padding: 0;
|
|
180
|
+
border: 1px solid var(--bs-border-color, #dee2e6);
|
|
181
|
+
border-radius: 50%;
|
|
182
|
+
color: var(--bs-body-color, #212529);
|
|
183
|
+
background-color: var(--bs-body-bg, #ffffff);
|
|
184
|
+
transition: background-color 0.15s ease, opacity 0.15s ease;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.ai-image-carousel-button:hover:not(:disabled) {
|
|
188
|
+
background-color: var(--bs-tertiary-bg, #f8f9fa);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.ai-image-carousel-button:disabled {
|
|
192
|
+
opacity: 0.4;
|
|
193
|
+
cursor: default;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.ai-image-carousel-dots {
|
|
197
|
+
display: inline-flex;
|
|
198
|
+
align-items: center;
|
|
199
|
+
gap: 0.375rem;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.ai-image-carousel-dot {
|
|
203
|
+
position: relative;
|
|
204
|
+
width: 0.5rem;
|
|
205
|
+
height: 0.5rem;
|
|
206
|
+
padding: 0;
|
|
207
|
+
border: 0;
|
|
208
|
+
border-radius: 999px;
|
|
209
|
+
background-color: var(--bs-border-color, #dee2e6);
|
|
210
|
+
transition: width 0.2s ease, background-color 0.2s ease;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/* The dot is small to look at but not to hit. */
|
|
214
|
+
.ai-image-carousel-dot::after {
|
|
215
|
+
content: "";
|
|
216
|
+
position: absolute;
|
|
217
|
+
inset: -0.375rem -0.25rem;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.ai-image-carousel-dot.is-active {
|
|
221
|
+
width: 1.25rem;
|
|
222
|
+
background-color: var(--bs-primary, #0d6efd);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.ai-image-carousel-sizes {
|
|
226
|
+
display: inline-flex;
|
|
227
|
+
flex: none;
|
|
228
|
+
overflow: hidden;
|
|
229
|
+
border: 1px solid var(--bs-border-color, #dee2e6);
|
|
230
|
+
border-radius: 0.375rem;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.ai-image-carousel-size {
|
|
234
|
+
min-width: 1.5rem;
|
|
235
|
+
height: 1.5rem;
|
|
236
|
+
padding: 0 0.375rem;
|
|
237
|
+
border: 0;
|
|
238
|
+
font-size: 0.6875rem;
|
|
239
|
+
font-weight: 600;
|
|
240
|
+
line-height: 1;
|
|
241
|
+
color: var(--bs-secondary-color, #6c757d);
|
|
242
|
+
background-color: var(--bs-body-bg, #ffffff);
|
|
243
|
+
transition: background-color 0.15s ease, color 0.15s ease;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.ai-image-carousel-size + .ai-image-carousel-size {
|
|
247
|
+
border-left: 1px solid var(--bs-border-color, #dee2e6);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.ai-image-carousel-size:hover {
|
|
251
|
+
color: var(--bs-body-color, #212529);
|
|
252
|
+
background-color: var(--bs-tertiary-bg, #f8f9fa);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.ai-image-carousel-size[aria-pressed="true"] {
|
|
256
|
+
color: #ffffff;
|
|
257
|
+
background-color: var(--bs-primary, #0d6efd);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/* The widget's panel is narrower than even the small preset, so there is nothing for the picker to change. */
|
|
261
|
+
.ai-chat-widget-messages .ai-image-carousel-sizes {
|
|
262
|
+
display: none;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/* With one picture left -- the others could not be loaded -- there is nothing to move between. */
|
|
266
|
+
.ai-image-carousel[data-image-count="1"] .ai-image-carousel-navigation {
|
|
267
|
+
display: none;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
@media (prefers-reduced-motion: reduce) {
|
|
271
|
+
.ai-image-carousel-stage > .generated-image-container.ai-image-carousel-item,
|
|
272
|
+
.ai-image-carousel-dot {
|
|
273
|
+
transition: none;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/*# sourceMappingURL=chat-image-carousel.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["chat-image-carousel.css"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"chat-image-carousel.css","sourcesContent":["/* ── Stacked image carousel ── */\n/* The pictures of one run are laid over each other in a single grid cell, so the stage is as tall as the\n tallest of them and does not jump as the reader moves between pictures of different heights. The current\n picture sits in front; its neighbours are pushed out to either side and shrunk, far enough that their\n edges show and can be clicked. Cards further out are stacked out of sight behind the last visible one.\n\n The selectors that size and place a card are deliberately specific: the chat surfaces already style\n .generated-image-container -- the widget through .ai-chat-widget-messages, one host through a <style> of\n its own -- and a card has to win over all of them wherever this file happens to be loaded. */\n.ai-image-carousel {\n --ai-image-carousel-card-width: 70%;\n display: block;\n width: 100%;\n max-width: 520px;\n margin: 0.5rem 0;\n border-radius: 0.5rem;\n transition: max-width 0.25s ease;\n}\n\n/* The reader's choice from the size picker; medium is the default. */\n.ai-image-carousel[data-carousel-size=\"small\"] {\n max-width: 360px;\n}\n\n.ai-image-carousel[data-carousel-size=\"large\"] {\n max-width: 760px;\n}\n\n.ai-image-carousel:focus {\n outline: none;\n}\n\n.ai-image-carousel:focus-visible {\n outline: 2px solid var(--bs-primary, #0d6efd);\n outline-offset: 4px;\n}\n\n/* The widget's panel is narrow, so the card takes more of it and the fan stays inside it. */\n.ai-chat-widget-messages .ai-image-carousel {\n --ai-image-carousel-card-width: 78%;\n}\n\n.ai-image-carousel-stage {\n display: grid;\n align-items: center;\n justify-items: center;\n padding: 0.25rem 0;\n /* The cards are layered with z-index, and without a stacking context of their own those values are compared\n with everything else on the page -- including the zoomed picture and its overlay, which carry none, so the\n cards behind were drawn over the picture being looked at. Isolated, they only order among themselves. */\n isolation: isolate;\n /* A horizontal swipe is the carousel's; a vertical one still scrolls the conversation. */\n touch-action: pan-y;\n user-select: none;\n -webkit-user-select: none;\n}\n\n.ai-image-carousel-stage > .generated-image-container.ai-image-carousel-item {\n grid-area: 1 / 1;\n display: block;\n width: var(--ai-image-carousel-card-width);\n margin: 0;\n cursor: pointer;\n transform-origin: center;\n transition: transform 0.35s cubic-bezier(0.2, 0.7, 0.2, 1), opacity 0.35s ease, filter 0.35s ease;\n}\n\n.ai-image-carousel-stage > .generated-image-container.ai-image-carousel-item img {\n display: block;\n width: 100%;\n max-width: 100% !important;\n -webkit-user-drag: none;\n box-shadow: 0 0.375rem 1.25rem rgba(0, 0, 0, 0.14);\n}\n\n.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset=\"0\"] {\n z-index: 4;\n cursor: default;\n /* Set on the stage while the reader drags, so the card follows the pointer. */\n transform: translateX(var(--ai-image-carousel-drag, 0px));\n}\n\n.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset=\"-1\"],\n.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset=\"1\"] {\n z-index: 3;\n opacity: 0.85;\n filter: brightness(0.94);\n}\n\n.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset=\"-1\"] {\n transform: translateX(-16%) scale(0.88);\n}\n\n.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset=\"1\"] {\n transform: translateX(16%) scale(0.88);\n}\n\n.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset=\"-2\"],\n.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset=\"2\"] {\n z-index: 2;\n opacity: 0.55;\n filter: brightness(0.9);\n}\n\n.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset=\"-2\"] {\n transform: translateX(-26%) scale(0.76);\n}\n\n.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset=\"2\"] {\n transform: translateX(26%) scale(0.76);\n}\n\n.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset=\"-3\"],\n.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset=\"3\"] {\n z-index: 1;\n opacity: 0;\n pointer-events: none;\n}\n\n.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset=\"-3\"] {\n transform: translateX(-26%) scale(0.7);\n}\n\n.ai-image-carousel-stage > .ai-image-carousel-item[data-stack-offset=\"3\"] {\n transform: translateX(26%) scale(0.7);\n}\n\n/* Pointing at a card behind says it can be brought forward. */\n.ai-image-carousel-stage > .ai-image-carousel-item:not(.is-active):hover {\n opacity: 1;\n filter: none;\n}\n\n.ai-image-carousel-stage > .generated-image-container.ai-image-carousel-item:not(.is-active) img {\n cursor: pointer;\n}\n\n/* Only the picture in front is downloaded; a click on one behind brings it forward instead. */\n.ai-image-carousel-stage > .ai-image-carousel-item:not(.is-active) .ai-download-image {\n display: none;\n}\n\n/* While dragging, the card is moved by the pointer, not eased toward it. */\n.ai-image-carousel-stage.is-dragging > .ai-image-carousel-item {\n transition: none;\n}\n\n.ai-image-carousel-controls {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-top: 0.5rem;\n font-size: 0.8125rem;\n line-height: 1.25;\n color: var(--bs-secondary-color, #6c757d);\n}\n\n.ai-image-carousel-caption {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ai-image-carousel-navigation {\n display: inline-flex;\n flex: none;\n align-items: center;\n gap: 0.375rem;\n}\n\n.ai-image-carousel-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n padding: 0;\n border: 1px solid var(--bs-border-color, #dee2e6);\n border-radius: 50%;\n color: var(--bs-body-color, #212529);\n background-color: var(--bs-body-bg, #ffffff);\n transition: background-color 0.15s ease, opacity 0.15s ease;\n}\n\n.ai-image-carousel-button:hover:not(:disabled) {\n background-color: var(--bs-tertiary-bg, #f8f9fa);\n}\n\n.ai-image-carousel-button:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.ai-image-carousel-dots {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n}\n\n.ai-image-carousel-dot {\n position: relative;\n width: 0.5rem;\n height: 0.5rem;\n padding: 0;\n border: 0;\n border-radius: 999px;\n background-color: var(--bs-border-color, #dee2e6);\n transition: width 0.2s ease, background-color 0.2s ease;\n}\n\n/* The dot is small to look at but not to hit. */\n.ai-image-carousel-dot::after {\n content: \"\";\n position: absolute;\n inset: -0.375rem -0.25rem;\n}\n\n.ai-image-carousel-dot.is-active {\n width: 1.25rem;\n background-color: var(--bs-primary, #0d6efd);\n}\n\n.ai-image-carousel-sizes {\n display: inline-flex;\n flex: none;\n overflow: hidden;\n border: 1px solid var(--bs-border-color, #dee2e6);\n border-radius: 0.375rem;\n}\n\n.ai-image-carousel-size {\n min-width: 1.5rem;\n height: 1.5rem;\n padding: 0 0.375rem;\n border: 0;\n font-size: 0.6875rem;\n font-weight: 600;\n line-height: 1;\n color: var(--bs-secondary-color, #6c757d);\n background-color: var(--bs-body-bg, #ffffff);\n transition: background-color 0.15s ease, color 0.15s ease;\n}\n\n.ai-image-carousel-size + .ai-image-carousel-size {\n border-left: 1px solid var(--bs-border-color, #dee2e6);\n}\n\n.ai-image-carousel-size:hover {\n color: var(--bs-body-color, #212529);\n background-color: var(--bs-tertiary-bg, #f8f9fa);\n}\n\n.ai-image-carousel-size[aria-pressed=\"true\"] {\n color: #ffffff;\n background-color: var(--bs-primary, #0d6efd);\n}\n\n/* The widget's panel is narrower than even the small preset, so there is nothing for the picker to change. */\n.ai-chat-widget-messages .ai-image-carousel-sizes {\n display: none;\n}\n\n/* With one picture left -- the others could not be loaded -- there is nothing to move between. */\n.ai-image-carousel[data-image-count=\"1\"] .ai-image-carousel-navigation {\n display: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .ai-image-carousel-stage > .generated-image-container.ai-image-carousel-item,\n .ai-image-carousel-dot {\n transition: none;\n }\n}\n"]}
|