@qualified-salesforce/web 0.0.1-oidc-bootstrap → 0.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.
Files changed (98) hide show
  1. package/CAPABILITY-REFERENCE.md +41 -0
  2. package/CHANGELOG.md +84 -0
  3. package/README.md +65 -0
  4. package/constants.generated.js +30 -2
  5. package/css/widget/multimodal_v2/index.split-css.panda.css +265 -47
  6. package/package.json +18 -4
  7. package/packs/widget/api/docking/viewport_lock.js +93 -2
  8. package/packs/widget/esm/index.d.ts +134 -0
  9. package/packs/widget/esm/index.js +18 -2
  10. package/packs/widget/esm/qualified.css +265 -47
  11. package/src/graphql-types.js +74 -1
  12. package/src/url.js +4 -1
  13. package/vendor/actioncable/connection.js +40 -3
  14. package/vendor/actioncable/connection_monitor.js +8 -0
  15. package/vendor/actioncable/consumer.js +7 -1
  16. package/vendor/actioncable/index.js +5 -2
  17. package/vendor/actioncable/sse_socket.js +262 -0
  18. package/widget/analytics.js +8 -0
  19. package/widget/api_handler/base_api_handler.js +24 -0
  20. package/widget/booker_outcome_tracker.js +58 -20
  21. package/widget/capabilities.js +190 -0
  22. package/widget/channel.js +38 -6
  23. package/widget/constants.generated.js +2 -1
  24. package/widget/multimodal_v2/components/AppLayout.js +1 -1
  25. package/widget/multimodal_v2/components/app/Foreground.js +10 -9
  26. package/widget/multimodal_v2/components/app/Input.js +8 -3
  27. package/widget/multimodal_v2/components/app/LightboxExperience.js +17 -3
  28. package/widget/multimodal_v2/components/app/Main.js +87 -31
  29. package/widget/multimodal_v2/components/app/MessengerButton.js +18 -1
  30. package/widget/multimodal_v2/components/chat/ChatInputForm.js +8 -6
  31. package/widget/multimodal_v2/components/chat/timeline/CalendarEventPickRenderer.js +2 -2
  32. package/widget/multimodal_v2/components/chat/timeline/PresentDeckRenderer.js +346 -170
  33. package/widget/multimodal_v2/components/chat/timeline/SystemRenderer.js +4 -7
  34. package/widget/multimodal_v2/components/decks/index.js +506 -52
  35. package/widget/multimodal_v2/components/helpers/content_click_payloads.js +67 -1
  36. package/widget/multimodal_v2/components/lightbox_gather/index.js +4 -4
  37. package/widget/multimodal_v2/components/meetings/MeetingBookerEntry.js +8 -1
  38. package/widget/multimodal_v2/components/meetings/MeetingOfferEmailStep.js +1 -1
  39. package/widget/multimodal_v2/components/meetings/MeetingSummaryRail.js +1 -1
  40. package/widget/multimodal_v2/components/meetings/MeetingTimeSelector.js +1 -1
  41. package/widget/multimodal_v2/components/multimodal/Controls.js +11 -3
  42. package/widget/multimodal_v2/components/multimodal/useMultimodal.js +19 -7
  43. package/widget/multimodal_v2/components/presentations/index.js +61 -0
  44. package/widget/multimodal_v2/constants.js +1 -1
  45. package/widget/multimodal_v2/images/icons.js +17 -1
  46. package/widget/multimodal_v2/index.panda.js +2 -2
  47. package/widget/multimodal_v2/locales/cs.js +8 -1
  48. package/widget/multimodal_v2/locales/da.js +8 -1
  49. package/widget/multimodal_v2/locales/de.js +8 -1
  50. package/widget/multimodal_v2/locales/en.js +8 -1
  51. package/widget/multimodal_v2/locales/en_AU.js +8 -1
  52. package/widget/multimodal_v2/locales/en_GB.js +8 -1
  53. package/widget/multimodal_v2/locales/es.js +8 -1
  54. package/widget/multimodal_v2/locales/es_LA.js +8 -1
  55. package/widget/multimodal_v2/locales/fi.js +8 -1
  56. package/widget/multimodal_v2/locales/fr.js +8 -1
  57. package/widget/multimodal_v2/locales/fr_CA.js +8 -1
  58. package/widget/multimodal_v2/locales/id.js +8 -1
  59. package/widget/multimodal_v2/locales/it.js +8 -1
  60. package/widget/multimodal_v2/locales/ja.js +8 -1
  61. package/widget/multimodal_v2/locales/ko.js +8 -1
  62. package/widget/multimodal_v2/locales/nb.js +8 -1
  63. package/widget/multimodal_v2/locales/nl.js +8 -1
  64. package/widget/multimodal_v2/locales/pl.js +8 -1
  65. package/widget/multimodal_v2/locales/pt_BR.js +8 -1
  66. package/widget/multimodal_v2/locales/ru.js +8 -1
  67. package/widget/multimodal_v2/locales/sv.js +8 -1
  68. package/widget/multimodal_v2/locales/th.js +8 -1
  69. package/widget/multimodal_v2/locales/tr.js +8 -1
  70. package/widget/multimodal_v2/locales/vi.js +8 -1
  71. package/widget/multimodal_v2/locales/zh_CN.js +8 -1
  72. package/widget/multimodal_v2/locales/zh_TW.js +8 -1
  73. package/widget/multimodal_v2/multimodal.js +5 -1
  74. package/widget/multimodal_v2/multimodal_channel.js +13 -8
  75. package/widget/multimodal_v2/signals/messages_signal.js +4 -0
  76. package/widget/multimodal_v2/stores/ai_conversation_store.js +6 -2
  77. package/widget/multimodal_v2/stores/artifact_store.js +352 -27
  78. package/widget/multimodal_v2/stores/call_store.js +40 -1
  79. package/widget/multimodal_v2/stores/call_ui_adapter.js +1 -1
  80. package/widget/multimodal_v2/stores/decks_store.js +405 -39
  81. package/widget/multimodal_v2/stores/meeting_store.js +15 -10
  82. package/widget/multimodal_v2/stores/presentation_ga_adapter.js +64 -0
  83. package/widget/multimodal_v2/stores/presentation_telemetry_store.js +556 -0
  84. package/widget/multimodal_v2/stores/presentations_store.js +1 -0
  85. package/widget/multimodal_v2/stores/root_store.js +157 -268
  86. package/widget/multimodal_v2/stores/screen_share_store.js +41 -21
  87. package/widget/multimodal_v2/stores/translation_store.js +9 -0
  88. package/widget/multimodal_v2/stores/ui_store.js +7 -7
  89. package/widget/multimodal_v2/stores/website_navigation_store.js +3 -1
  90. package/widget/multimodal_v2/text_turn_response_tracker.js +419 -0
  91. package/widget/multimodal_v2/types.js +21 -1
  92. package/widget/multimodal_v2/utils/locale.js +2 -1
  93. package/widget/multimodal_v2/utils/signals.js +35 -4
  94. package/widget/pardot_visitor.js +7 -1
  95. package/widget/server-logger.js +97 -2
  96. package/widget/tracker.js +69 -21
  97. package/widget/widget/page_mirror_factory.js +9 -1
  98. package/widget/widget/widget.js +29 -4
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Public TypeScript declarations for `@qualified-salesforce/web`.
3
+ *
4
+ * The curated public contract: the symbols the package exports and the types they reference. See
5
+ * `CAPABILITY-REFERENCE.md` (shipped in this package) for what each capability unlocks, the data
6
+ * egress it permits, and its default.
7
+ */
8
+
9
+ /**
10
+ * The optional features a self-hosted consumer can enroll via `setup({ capabilities })`.
11
+ * Default-deny: a capability not listed stays off, and Qualified cannot turn it on. Voice is
12
+ * intentionally absent — this build ships text-only and cannot activate a call.
13
+ *
14
+ * A literal union rather than `string`, so a typo'd key is a compile error and an editor offers the
15
+ * valid keys. `CAPABILITY_KEYS` is the same set as a runtime value.
16
+ *
17
+ * See `CAPABILITY-REFERENCE.md` (shipped in this package) for what each key unlocks, the data
18
+ * egress it permits, and its default.
19
+ */
20
+ export type Capability =
21
+ | "pardot"
22
+ | "liveView"
23
+ | "agentNavigation"
24
+ | "analytics"
25
+ | "slidePerception"
26
+ | "formCapture"
27
+ | "marketingIdentity";
28
+
29
+ /**
30
+ * Every capability key, as a runtime value — the same set the boundary enforces. Enumerate it to
31
+ * build a settings UI or validate consumer input before passing `capabilities` to `setup()`.
32
+ */
33
+ export declare const CAPABILITY_KEYS: readonly Capability[];
34
+
35
+ /**
36
+ * Host/CDN/websocket origins and versions for a Qualified environment.
37
+ *
38
+ * Normally the runtime-config endpoint serves this; pass it to `setup({ environment })` only to pin
39
+ * it explicitly. Public because it is part of the `setup()` option surface, so it is a SemVer
40
+ * contract rather than an internal shape.
41
+ */
42
+ export interface EnvironmentConfig {
43
+ version: string;
44
+ host: string;
45
+ cdnHost: string;
46
+ wsHost: string;
47
+ assetsHost?: string;
48
+ frontendVersion: string;
49
+ meetingLinkHost: string;
50
+ heartbeatPingDivisor?: number;
51
+ staleThresholdSeconds?: number;
52
+ }
53
+
54
+ /**
55
+ * The widget's full runtime configuration, as the CORS-enabled endpoint serves it: the environment
56
+ * origins, the opaque team config, and the Sentry proxy URL.
57
+ */
58
+ export interface RuntimeConfig {
59
+ /** Host/CDN/WS origins and versions. Overridden by `setup({ environment })` when passed. */
60
+ environment?: EnvironmentConfig;
61
+ /**
62
+ * Team settings, exactly as `q("initialize", token, config)` takes them. Deliberately opaque —
63
+ * this stays Qualified's contract with its own server, not a public interface.
64
+ */
65
+ config: Record<string, unknown>;
66
+ /** Where the widget's Sentry clients POST envelopes; null on localhost. */
67
+ sentryProxyUrl?: string | null;
68
+ }
69
+
70
+ /**
71
+ * The `q(...)` command function `setup()` resolves to — the same interface a CDN consumer gets, so
72
+ * `teardown`, `identify` and the rest are called as `qualified("teardown")`.
73
+ */
74
+ export type QualifiedFunction = (command: string, ...args: unknown[]) => unknown;
75
+
76
+ /** Options for {@link setup}. */
77
+ export interface QualifiedSetupOptions {
78
+ /** Team credential. The consumer decides where this comes from. */
79
+ token: string;
80
+ /**
81
+ * Qualified's API origin — where the runtime-config endpoint lives and where the widget talks.
82
+ * Required unless `runtimeConfigUrl` points somewhere self-contained: `setup()` fetches the
83
+ * runtime config from `${apiHost}/w/1/${token}/runtime_config`.
84
+ */
85
+ apiHost?: string;
86
+ /**
87
+ * Full environment config, when the consumer would rather pin it than take what the endpoint
88
+ * returns. When set, it wins over the fetched `environment`.
89
+ */
90
+ environment?: EnvironmentConfig;
91
+ /**
92
+ * Base URL the package's own assets (stylesheet, fonts) are served from. Omit when the consumer
93
+ * bundles the package (the bundler rewrites the asset URLs); pass the served directory when the
94
+ * consumer instead copies `dist/` to a static path — required for web fonts to resolve.
95
+ */
96
+ packageBase?: string;
97
+ /**
98
+ * Fetch the runtime config from this URL instead of the `/w/1/:token/runtime_config` endpoint.
99
+ * Must serve the same JSON shape. Intended for offline test harnesses.
100
+ */
101
+ runtimeConfigUrl?: string;
102
+ /**
103
+ * Default-deny allowlist of optional features this consumer permits. A capability not
104
+ * listed stays off and Qualified cannot turn it on. **Omitting this installs an empty allowlist —
105
+ * every gated feature off**; pass the ones you want enabled.
106
+ */
107
+ capabilities?: readonly Capability[];
108
+ }
109
+
110
+ /**
111
+ * Boots Qualified from the consumer's own bundle. Nothing runs until this is called: importing the
112
+ * package has no side effects, so the consumer decides when and with which credential Qualified
113
+ * starts.
114
+ *
115
+ * Resolves to the `q(...)` command function. Rejects loudly — booting nothing — if the runtime
116
+ * config cannot be fetched (bad token, unreachable host, CORS not granted).
117
+ *
118
+ * Awaiting is optional. Boot begins as soon as `setup()` is called and completes on its own, so the
119
+ * widget starts and renders whether or not the returned promise is awaited. Await it (or use
120
+ * `.then()`) only when you need the resolved `q(...)` command function — to call `identify`,
121
+ * `teardown`, etc. — or want to handle a boot failure.
122
+ */
123
+ export declare function setup(options: QualifiedSetupOptions): Promise<QualifiedFunction>;
124
+
125
+ /**
126
+ * Fetches the widget's runtime configuration from the CORS-enabled JSON endpoint, without booting
127
+ * the widget. `setup()` calls this internally; it is exported so the fetch and its failure modes
128
+ * are testable in isolation. Most consumers call {@link setup} instead.
129
+ */
130
+ export declare function fetchRuntimeConfig(options: {
131
+ host?: string;
132
+ token: string;
133
+ runtimeConfigUrl?: string;
134
+ }): Promise<RuntimeConfig>;
@@ -1,6 +1,7 @@
1
1
  import "../../../widget/multimodal_v2/index.split-css.panda.js";
2
2
  import "../../../widget/widget.split-css.js";
3
3
  import "../../../widget/multimodal_v2/host.split-css.js";
4
+ import { filterRuntimeConfig, installCapabilityBoundary } from "../../../widget/capabilities.js";
4
5
  import { default as LinkedWidgetV2 } from "../../../widget/widget/linked_widget_v2.js";
5
6
  import { Sentry } from "../../../widget/widget/sentry.js";
6
7
  import { widgetBootstrap } from "../../../widget/widget_bootstrap.js";
@@ -30,6 +31,12 @@ import { _extends } from "../../../js/4101.js";
30
31
 
31
32
 
32
33
 
34
+
35
+ // Re-exported so a consumer can enumerate the allowlist keys at runtime and get a compile-time
36
+ // error on a typo'd capability (QAI-5919): `import { CAPABILITY_KEYS, type Capability } from
37
+ // "@qualified-salesforce/web"`. Sourced from the same module the boundary enforces, so the value
38
+ // a consumer reads and the set `setup()` installs can never drift apart.
39
+
33
40
  /** Those URLs, or null in any build that is not the npm packaging (the hosted widget, Jest). */ function packagedAssetUrls() {
34
41
  if (false) {}
35
42
  return _extends({
@@ -112,7 +119,7 @@ let bootPromise = null;
112
119
  }
113
120
  if (bootPromise) return bootPromise;
114
121
  const promise = (async ()=>{
115
- var _options_apiHost, _options_environment;
122
+ var _options_apiHost, _options_environment, _options_capabilities;
116
123
  var _globalThis_location, _options_environment1;
117
124
  // npm-native telemetry origin (QAI-5770). Our code is inlined into the consumer's
118
125
  // content-hashed chunk, so `script_time_to_start_ms` has no `qualified.js` resource entry to
@@ -147,6 +154,12 @@ let bootPromise = null;
147
154
  if (!(environment == null ? void 0 : environment.host)) {
148
155
  throw new Error("Qualified setup(): the runtime config carried no `environment`, and none was passed. " + "The widget will not boot.");
149
156
  }
157
+ // Install the consumer's allowlist now that the boot is actually proceeding — after the fetch,
158
+ // before any dispatch or the config filter below. Installing here (not before the fetch) means
159
+ // a failed boot never locks the boundary, so a retry may pass a different allowlist (QAI-5862).
160
+ // Sourced from `options.capabilities` alone, so the fetched config is narrowed against a
161
+ // boundary our server had no say in.
162
+ installCapabilityBoundary((_options_capabilities = options.capabilities) != null ? _options_capabilities : []);
150
163
  // The classic entry's import-time side effects, performed here instead.
151
164
  // The base `call_store.ts` resolves the call machine against when it has nothing better — a
152
165
  // filename appended to a directory. That works for a tarball served as laid out, but not when
@@ -167,7 +180,9 @@ let bootPromise = null;
167
180
  // — the widget's own shadow-root mirror picks it up once applied.
168
181
  injectStylesheet(stylesheetUrl);
169
182
  const qualified = LinkedWidgetV2.start(environment);
170
- qualified("initialize", options.token, runtime.config);
183
+ // Narrow the server config against the allowlist before the widget sees it (QAI-5862): the
184
+ // filter only deletes denied enablers, so the server can't switch on a disallowed capability.
185
+ qualified("initialize", options.token, filterRuntimeConfig(runtime.config));
171
186
  return qualified;
172
187
  })();
173
188
  // A rejected boot must not stay cached: a transient failure (a network blip during the config
@@ -181,3 +196,4 @@ let bootPromise = null;
181
196
  }
182
197
 
183
198
  export { fetchRuntimeConfig, setup };
199
+ export { CAPABILITY_KEYS } from "../../../widget/capabilities.js";
@@ -737,8 +737,8 @@
737
737
  padding: 0 16px 0 8px;
738
738
  }
739
739
 
740
- .q-eUlsAQ {
741
- padding: 0 8px;
740
+ .q-dqRdNH {
741
+ padding: 0;
742
742
  }
743
743
 
744
744
  .q-ffAOcM {
@@ -795,10 +795,6 @@
795
795
  border: 1.5px solid #d7dde2;
796
796
  }
797
797
 
798
- .q-dqRdNH {
799
- padding: 0;
800
- }
801
-
802
798
  .q-kgRGeM {
803
799
  margin: -1px;
804
800
  }
@@ -999,6 +995,10 @@
999
995
  border: 1px solid \$colors\.border;
1000
996
  }
1001
997
 
998
+ .q-kWIjhW {
999
+ font: inherit;
1000
+ }
1001
+
1002
1002
  .q-gPyWWT {
1003
1003
  border: 1px solid;
1004
1004
  }
@@ -1284,6 +1284,16 @@
1284
1284
  gap: 10px;
1285
1285
  }
1286
1286
 
1287
+ .q-cfDrIW {
1288
+ border-radius: 16px;
1289
+ border-radius: var(--q-dxfumK);
1290
+ }
1291
+
1292
+ .q-iainBx {
1293
+ gap: 16px;
1294
+ gap: var(--q-jugHdA);
1295
+ }
1296
+
1287
1297
  .q-hMIFSa {
1288
1298
  transition: background-color .2s;
1289
1299
  }
@@ -1441,11 +1451,6 @@
1441
1451
  gap: 24px;
1442
1452
  }
1443
1453
 
1444
- .q-iainBx {
1445
- gap: 16px;
1446
- gap: var(--q-jugHdA);
1447
- }
1448
-
1449
1454
  .q-bMcXFr {
1450
1455
  border-radius: 8px;
1451
1456
  border-radius: var(--q-control-border-radius, 8px);
@@ -1618,6 +1623,23 @@
1618
1623
  transition: opacity .2s, box-shadow .2s, transform .2s;
1619
1624
  }
1620
1625
 
1626
+ .q-bkgpAA {
1627
+ inset-inline: 16px;
1628
+ }
1629
+
1630
+ .q-NGWtr {
1631
+ inset-inline: 8px;
1632
+ }
1633
+
1634
+ .q-DHTGQ {
1635
+ inset-inline: -20px;
1636
+ }
1637
+
1638
+ .q-fNJrUv {
1639
+ border-radius: 8px;
1640
+ border-radius: var(--q-bewZvn);
1641
+ }
1642
+
1621
1643
  .q-brKOqO {
1622
1644
  overscroll-behavior: contain;
1623
1645
  }
@@ -2212,6 +2234,18 @@
2212
2234
  resize: none;
2213
2235
  }
2214
2236
 
2237
+ .q-kGHEMe {
2238
+ align-self: flex-start;
2239
+ }
2240
+
2241
+ .q-cOEFXT {
2242
+ transform: rotate(180deg);
2243
+ }
2244
+
2245
+ .q-kTBjet {
2246
+ align-items: stretch;
2247
+ }
2248
+
2215
2249
  .q-bSTPIv {
2216
2250
  box-shadow: 0 8px 32px #0000004d;
2217
2251
  }
@@ -2233,14 +2267,27 @@
2233
2267
  transform-origin: bottom;
2234
2268
  }
2235
2269
 
2236
- .q-loatqo {
2237
- background-color: #fff6;
2270
+ .q-jcVpEa {
2271
+ line-height: 22px;
2238
2272
  }
2239
2273
 
2240
2274
  .q-iCfjvi {
2241
2275
  flex-grow: 1;
2242
2276
  }
2243
2277
 
2278
+ .q-gasSYy {
2279
+ flex-wrap: wrap;
2280
+ }
2281
+
2282
+ .q-loatqo {
2283
+ background-color: #fff6;
2284
+ }
2285
+
2286
+ .q-hdUyV {
2287
+ background-color: #e6e9ec;
2288
+ background-color: var(--q-gjomaU);
2289
+ }
2290
+
2244
2291
  .q-eIsAcC {
2245
2292
  -webkit-user-select: none;
2246
2293
  user-select: none;
@@ -2263,18 +2310,10 @@
2263
2310
  transform: translateY(8px);
2264
2311
  }
2265
2312
 
2266
- .q-gasSYy {
2267
- flex-wrap: wrap;
2268
- }
2269
-
2270
2313
  .q-hxBzcr {
2271
2314
  align-items: flex-end;
2272
2315
  }
2273
2316
 
2274
- .q-kTBjet {
2275
- align-items: stretch;
2276
- }
2277
-
2278
2317
  .q-hYhvQY {
2279
2318
  box-shadow: none;
2280
2319
  box-shadow: var(--q-jLtLHp);
@@ -2337,10 +2376,6 @@
2337
2376
  container-name: bookerPanel;
2338
2377
  }
2339
2378
 
2340
- .q-cOEFXT {
2341
- transform: rotate(180deg);
2342
- }
2343
-
2344
2379
  .q-hBOzJB {
2345
2380
  color: #e4251b;
2346
2381
  }
@@ -2592,10 +2627,6 @@
2592
2627
  background-color: #2dd272;
2593
2628
  }
2594
2629
 
2595
- .q-kGHEMe {
2596
- align-self: flex-start;
2597
- }
2598
-
2599
2630
  .q-iMVOnP {
2600
2631
  align-self: center;
2601
2632
  }
@@ -2608,10 +2639,6 @@
2608
2639
  line-height: 14px;
2609
2640
  }
2610
2641
 
2611
- .q-jcVpEa {
2612
- line-height: 22px;
2613
- }
2614
-
2615
2642
  .q-krbBcV {
2616
2643
  white-space: normal;
2617
2644
  }
@@ -2714,6 +2741,45 @@
2714
2741
  justify-content: flex-start;
2715
2742
  }
2716
2743
 
2744
+ .q-bGTgkg {
2745
+ appearance: none;
2746
+ }
2747
+
2748
+ .q-vNRpm {
2749
+ -webkit-appearance: none;
2750
+ }
2751
+
2752
+ .q-jKfYXo {
2753
+ text-align: inherit;
2754
+ }
2755
+
2756
+ .q-irWrst {
2757
+ background-color: #66a8eb;
2758
+ background-color: var(--q-btpljM);
2759
+ }
2760
+
2761
+ .q-gXqRpG {
2762
+ opacity: .45;
2763
+ }
2764
+
2765
+ .q-bMGTxJ {
2766
+ opacity: .75;
2767
+ }
2768
+
2769
+ .q-cqCfxu {
2770
+ -o-object-position: top;
2771
+ object-position: top;
2772
+ }
2773
+
2774
+ .q-boLblZ {
2775
+ filter: blur(12px);
2776
+ }
2777
+
2778
+ .q-hwlKiV {
2779
+ background-color: #152229;
2780
+ background-color: var(--q-ckoJkw);
2781
+ }
2782
+
2717
2783
  .q-fLVKVB {
2718
2784
  scrollbar-width: none;
2719
2785
  }
@@ -2965,6 +3031,10 @@
2965
3031
  height: 48px;
2966
3032
  }
2967
3033
 
3034
+ .q-eRLSQw {
3035
+ width: 48px;
3036
+ }
3037
+
2968
3038
  .q-iWjbPW {
2969
3039
  width: 24px;
2970
3040
  }
@@ -3010,6 +3080,10 @@
3010
3080
  height: 64px;
3011
3081
  }
3012
3082
 
3083
+ .q-cCoqvZ {
3084
+ max-width: 100%;
3085
+ }
3086
+
3013
3087
  .q-dxbJmu {
3014
3088
  min-height: 0;
3015
3089
  }
@@ -3018,14 +3092,52 @@
3018
3092
  width: auto;
3019
3093
  }
3020
3094
 
3021
- .q-cCoqvZ {
3022
- max-width: 100%;
3023
- }
3024
-
3025
3095
  .q-jJlZBc {
3026
3096
  max-height: 100%;
3027
3097
  }
3028
3098
 
3099
+ .q-niSFv {
3100
+ border-bottom-left-radius: 0;
3101
+ }
3102
+
3103
+ .q-gqcmcs {
3104
+ border-bottom-right-radius: 0;
3105
+ }
3106
+
3107
+ .q-hnYqHC {
3108
+ max-height: calc(100% - 124px);
3109
+ }
3110
+
3111
+ .q-dQsKWZ {
3112
+ max-height: calc(100% - 172px);
3113
+ }
3114
+
3115
+ .q-dQrOvv {
3116
+ border-bottom-left-radius: 16px;
3117
+ border-bottom-left-radius: var(--q-dxfumK);
3118
+ }
3119
+
3120
+ .q-kZnTsk {
3121
+ border-bottom-right-radius: 16px;
3122
+ border-bottom-right-radius: var(--q-dxfumK);
3123
+ }
3124
+
3125
+ .q-fSNeID {
3126
+ border-top-left-radius: 0;
3127
+ }
3128
+
3129
+ .q-lmIybk {
3130
+ border-top-right-radius: 0;
3131
+ }
3132
+
3133
+ .q-kEmBGl {
3134
+ min-height: 124px;
3135
+ }
3136
+
3137
+ .q-eeWvqi {
3138
+ min-height: 172px;
3139
+ }
3140
+
3029
3141
  .q-ipiJSk {
3030
3142
  width: 8px;
3031
3143
  }
@@ -3520,6 +3632,41 @@
3520
3632
  border-top-left-radius: 4px;
3521
3633
  }
3522
3634
 
3635
+ .q-cBlWNH {
3636
+ min-height: 32px;
3637
+ }
3638
+
3639
+ .q-kJvXpK {
3640
+ padding-top: 12px;
3641
+ padding-top: var(--q-cXTyBO);
3642
+ }
3643
+
3644
+ .q-dlHacb {
3645
+ top: 6px;
3646
+ }
3647
+
3648
+ .q-iHDoAO {
3649
+ top: -20px;
3650
+ }
3651
+
3652
+ .q-bYDZOv {
3653
+ width: calc(100% + 40px);
3654
+ }
3655
+
3656
+ .q-jQmYcu {
3657
+ height: calc(100% + 40px);
3658
+ }
3659
+
3660
+ .q-lnCtVe {
3661
+ right: 8px;
3662
+ right: var(--q-cSaSxh);
3663
+ }
3664
+
3665
+ .q-jgAsJt {
3666
+ bottom: 8px;
3667
+ bottom: var(--q-cSaSxh);
3668
+ }
3669
+
3523
3670
  .q-ilCorh {
3524
3671
  line-clamp: 1;
3525
3672
  }
@@ -3789,10 +3936,19 @@
3789
3936
  color: var(--q-ekJvRZ);
3790
3937
  }
3791
3938
 
3939
+ .q-eHRSUh:empty {
3940
+ display: none;
3941
+ }
3942
+
3792
3943
  .q-ldTxnm[data-active="true"] {
3793
3944
  background-color: #fffffff2;
3794
3945
  }
3795
3946
 
3947
+ .q-hmyJss[data-active="true"] {
3948
+ background-color: #0070d2;
3949
+ background-color: var(--q-bebYds);
3950
+ }
3951
+
3796
3952
  .q-bEFJjx:disabled {
3797
3953
  opacity: .6;
3798
3954
  }
@@ -4487,6 +4643,12 @@
4487
4643
  background: #e6e9ec;
4488
4644
  }
4489
4645
 
4646
+ .q-kEebOH:is(:hover, :focus-visible) [data-component-name="Button.StyledButton"] {
4647
+ background: #fff linear-gradient(#0070d2e6, #0070d2e6);
4648
+ background: linear-gradient(var(--q-bQGTFq),var(--q-bQGTFq)) #fff;
4649
+ background: linear-gradient(var(--q-bQGTFq),var(--q-bQGTFq)) var(--q-button-hover-background-layer, #fff);
4650
+ }
4651
+
4490
4652
  .q-fRIQMO:focus-visible {
4491
4653
  outline: 2px solid #0070d2;
4492
4654
  outline: 2px solid var(--q-bebYds);
@@ -4549,6 +4711,11 @@
4549
4711
  outline: none;
4550
4712
  }
4551
4713
 
4714
+ .q-hHgwIf:is(:hover, :focus-visible) [data-component-name="Button.StyledButton"] {
4715
+ border-color: #0000;
4716
+ border-color: var(--q-eBDiUw);
4717
+ }
4718
+
4552
4719
  .q-jtPCJn:has(select:focus-visible) {
4553
4720
  outline: 2px solid #0070d2;
4554
4721
  outline: 2px solid var(--q-bebYds);
@@ -4626,6 +4793,10 @@
4626
4793
  visibility: visible;
4627
4794
  }
4628
4795
 
4796
+ .q-kELdYL:is(:hover, :focus-visible) [data-component-name="Button.StyledButton"] {
4797
+ color: var(--q-kHrcNZ);
4798
+ }
4799
+
4629
4800
  .q-iayYaR:has(select:focus-visible) {
4630
4801
  outline-offset: -2px;
4631
4802
  }
@@ -4636,11 +4807,16 @@
4636
4807
  background: linear-gradient(var(--q-bQGTFq),var(--q-bQGTFq)) var(--q-button-hover-background-layer, #fff);
4637
4808
  }
4638
4809
 
4810
+ .q-hnauCG:hover {
4811
+ background: none;
4812
+ background: var(--q-cWcXnW);
4813
+ }
4814
+
4639
4815
  .q-jjvLow:hover {
4640
4816
  background: #e6e9ec;
4641
4817
  }
4642
4818
 
4643
- .q-hKPjHd:hover, .q-ixOhNh:hover:not(:disabled) {
4819
+ .q-ixOhNh:hover:not(:disabled), .q-hKPjHd:hover {
4644
4820
  background: #0000000f;
4645
4821
  }
4646
4822
 
@@ -4689,6 +4865,10 @@
4689
4865
  color: var(--q-kHrcNZ);
4690
4866
  }
4691
4867
 
4868
+ .q-crUTNY:hover {
4869
+ box-shadow: none;
4870
+ }
4871
+
4692
4872
  .q-MuFSQ:hover {
4693
4873
  color: var(--q-ckoJkw);
4694
4874
  }
@@ -4880,10 +5060,6 @@
4880
5060
  height: 100%;
4881
5061
  }
4882
5062
 
4883
- .q-gfNJoW {
4884
- height: 40%;
4885
- }
4886
-
4887
5063
  .q-jMeGMD {
4888
5064
  height: 50%;
4889
5065
  }
@@ -4914,7 +5090,7 @@
4914
5090
  height: 24px;
4915
5091
  }
4916
5092
 
4917
- .q-cAmJVr > [part="multimodal"], .q-kSIGpb > [part="multimodal"] {
5093
+ .q-kSIGpb > [part="multimodal"], .q-cAmJVr > [part="multimodal"] {
4918
5094
  padding: 0;
4919
5095
  }
4920
5096
 
@@ -4926,7 +5102,28 @@
4926
5102
  z-index: 1001;
4927
5103
  }
4928
5104
 
4929
- .q-cEUyLT > [part="toolbar"], .q-kxvSgE > [part="chat"], .q-kxvSgE > [part="input"], .q-kxvSgE > [part="privacy"] {
5105
+ .q-kxvSgE > [part="chat"], .q-kxvSgE > [part="input"], .q-kxvSgE > [part="privacy"] {
5106
+ display: none;
5107
+ }
5108
+
5109
+ .q-iNDLkz > [part="artifact"] {
5110
+ background-color: #00000080;
5111
+ }
5112
+
5113
+ .q-isJuhH > [part="artifact"] {
5114
+ -webkit-backdrop-filter: blur(2px);
5115
+ backdrop-filter: blur(2px);
5116
+ }
5117
+
5118
+ .q-cbBLhX > [part="artifact"] {
5119
+ z-index: 2;
5120
+ }
5121
+
5122
+ .q-gTaxHS > [part="multimodal"] {
5123
+ z-index: 3;
5124
+ }
5125
+
5126
+ .q-cEUyLT > [part="toolbar"] {
4930
5127
  display: none;
4931
5128
  }
4932
5129
 
@@ -5007,13 +5204,30 @@
5007
5204
  width: 100%;
5008
5205
  }
5009
5206
 
5010
- .q-kdQNtG > [part="artifact"] {
5011
- height: 60%;
5207
+ .q-xjpwZ > [part="artifact"] {
5208
+ height: 100%;
5012
5209
  }
5013
5210
 
5014
5211
  .q-gZeTFg > [part="artifact"] {
5015
5212
  height: 80%;
5016
5213
  }
5214
+
5215
+ .q-hSCbuw > [part="multimodal"] {
5216
+ bottom: 24px;
5217
+ bottom: calc(24px + var(--q-bottom-offset, 0px));
5218
+ }
5219
+
5220
+ .q-iWYrFM > [part="multimodal"] {
5221
+ right: 24px;
5222
+ }
5223
+
5224
+ .q-gUeaVj > [part="multimodal"] {
5225
+ width: fit-content;
5226
+ }
5227
+
5228
+ .q-bEbKWC > [part="multimodal"] {
5229
+ height: auto;
5230
+ }
5017
5231
  }
5018
5232
 
5019
5233
  @container bookerPanel (width <= 720px) {
@@ -5178,7 +5392,7 @@
5178
5392
  transform: translateY(calc(-100% - 8px));
5179
5393
  }
5180
5394
 
5181
- .q-eQFZen > [data-chat-controls], .q-lgmAsb > [part="controls"] {
5395
+ .q-lgmAsb > [part="controls"], .q-eQFZen > [data-chat-controls] {
5182
5396
  opacity: 1;
5183
5397
  }
5184
5398
 
@@ -5235,6 +5449,10 @@
5235
5449
  .q-iLwSqI {
5236
5450
  opacity: .14;
5237
5451
  }
5452
+
5453
+ .q-bfvFLs:hover {
5454
+ transform: none;
5455
+ }
5238
5456
  }
5239
5457
  }
5240
5458