@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
@@ -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
 
package/package.json CHANGED
@@ -1,11 +1,20 @@
1
1
  {
2
2
  "name": "@qualified-salesforce/web",
3
- "version": "0.0.1-oidc-bootstrap",
4
- "description": "Embeddable Qualified messenger widget for self-hosted deployments.",
3
+ "version": "0.1.1",
4
+ "description": "Embeddable Qualified messenger widget (text-only ESM build).",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
+ "private": false,
6
7
  "type": "module",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/FatbearLabs/fireball.git",
11
+ "directory": "npm-package/package-esm"
12
+ },
7
13
  "exports": {
8
- ".": "./packs/widget/esm/index.js",
14
+ ".": {
15
+ "types": "./packs/widget/esm/index.d.ts",
16
+ "default": "./packs/widget/esm/index.js"
17
+ },
9
18
  "./qualified.css": "./packs/widget/esm/qualified.css"
10
19
  },
11
20
  "sideEffects": [
@@ -16,5 +25,10 @@
16
25
  "./widget/multimodal_v2/index.panda.js",
17
26
  "./widget/utils/native_globals.js",
18
27
  "./packs/widget/esm/index.js"
19
- ]
28
+ ],
29
+ "publishConfig": {
30
+ "access": "public",
31
+ "provenance": false,
32
+ "tag": "next"
33
+ }
20
34
  }
@@ -205,6 +205,29 @@ function swapMarginWithPadding(body) {
205
205
  whenBodyAvailable((body)=>{
206
206
  markOverflowTraps(body);
207
207
  observeBodyChildList(body);
208
+ reScanOnLoad(body);
209
+ });
210
+ }
211
+ /**
212
+ * Re-runs {@link markOverflowTraps} once the document has finished loading.
213
+ *
214
+ * Both of the scan's decisions read layout that late content can still change:
215
+ * whether an element clips overflowing content, and whether `<body>` ends up
216
+ * scrollable (see {@link restoreStrandedScrollers}). A pass that runs while
217
+ * images / async sections are still arriving can therefore miss a trap, or
218
+ * roll one back that should have stood.
219
+ *
220
+ * Nothing else closes that window: the childList observer is skipped once the
221
+ * document is complete and disconnects after
222
+ * {@link OVERFLOW_TRAP_OBSERVER_LIFETIME_MS}, and `reEvaluate` only re-enters
223
+ * on host navigation. `applyOnce` keeps repeated `reEvaluate` calls from
224
+ * stacking listeners.
225
+ */ function reScanOnLoad(body) {
226
+ if (document.readyState === "complete") return;
227
+ applyOnce(body, "" + DOCKING_PROXY_MARKER + "_overflow_trap_load", (b)=>{
228
+ __nativeWindowAddEventListener("load", ()=>markOverflowTraps(b), {
229
+ once: true
230
+ });
208
231
  });
209
232
  }
210
233
  /** Bounds the MutationObserver's lifetime so long-lived pages don't keep re-scanning. */ const OVERFLOW_TRAP_OBSERVER_LIFETIME_MS = 5000;
@@ -235,6 +258,11 @@ function swapMarginWithPadding(body) {
235
258
  * its art keeps its clip, but low enough to catch tall content sections
236
259
  * (~1.4× viewport) that would otherwise trap the wheel.
237
260
  */ const SHELL_PASS_THROUGH_VIEWPORT_RATIO = 1.25;
261
+ /**
262
+ * Margin by which `scrollHeight` must exceed `clientHeight` before an element
263
+ * counts as having overflowing content. Covers sub-pixel rounding and
264
+ * scrollbar-gutter reservation.
265
+ */ const SCROLL_OVERFLOW_SLACK_PX = 4;
238
266
  /**
239
267
  * Walks body's subtree post-order, marking each qualifying scroll trap. Post-
240
268
  * order is load-bearing: marking an inner trap exposes its previously-clipped
@@ -255,6 +283,10 @@ function swapMarginWithPadding(body) {
255
283
  for (const el of body.querySelectorAll("[" + OVERFLOW_TRAP_ATTRIBUTE + "]")){
256
284
  el.removeAttribute(OVERFLOW_TRAP_ATTRIBUTE);
257
285
  }
286
+ // Scroll containers this pass clipped, with the range each one lost, so
287
+ // {@link restoreStrandedScrollers} can tell a real handoff to `<body>` from
288
+ // one that left the content unreachable.
289
+ const clipped = [];
258
290
  const visit = (el, depth)=>{
259
291
  if (depth < OVERFLOW_TRAP_MAX_DEPTH) {
260
292
  for (const child of el.children){
@@ -262,12 +294,72 @@ function swapMarginWithPadding(body) {
262
294
  }
263
295
  }
264
296
  if (isOverflowTrap(el, depth, dims)) {
297
+ // Measure before the write — the attribute changes the computed overflow.
298
+ const lostRange = scrollRangeOf(el);
299
+ if (lostRange > 0) clipped.push({
300
+ el,
301
+ lostRange
302
+ });
265
303
  el.setAttribute(OVERFLOW_TRAP_ATTRIBUTE, "");
266
304
  }
267
305
  };
268
306
  for (const child of body.children){
269
307
  if (child instanceof HTMLElement) visit(child, 1);
270
308
  }
309
+ restoreStrandedScrollers(body, clipped);
310
+ }
311
+ /**
312
+ * How far `el` can currently be scrolled, or 0 when it is not a functioning
313
+ * scroll container.
314
+ *
315
+ * A `hidden` / `clip` trap scores 0 even when its content overflows: it eats
316
+ * the wheel without ever scrolling, so opening it up cannot take scrolling
317
+ * away. Only `auto` / `scroll` elements can lose something.
318
+ */ function scrollRangeOf(el) {
319
+ const { overflowY } = getComputedStyle(el);
320
+ if (!/auto|scroll/.test(overflowY)) return 0;
321
+ const range = el.scrollHeight - el.clientHeight;
322
+ return range > SCROLL_OVERFLOW_SLACK_PX ? range : 0;
323
+ }
324
+ /**
325
+ * Undoes trap marks that took the page's scrolling away without giving
326
+ * `<body>` anything to scroll in exchange.
327
+ *
328
+ * Opening up an `overflow-y: auto` shell is only sound when its content can
329
+ * flow into body's scroll range once the clip is lifted. On a host whose shell
330
+ * chain is pinned to the viewport (`height: 100vh` the whole way down) it
331
+ * cannot: the marked element keeps its fixed height, body's `scrollHeight`
332
+ * never grows, and `overflow: clip` has meanwhile destroyed the only scroller
333
+ * on the page — so the document freezes and the visitor can't reach the
334
+ * content below the fold.
335
+ *
336
+ * Only marks on live scroll containers roll back. A `hidden` / `clip` trap
337
+ * never scrolled, so opening it up can't take scrolling away, and leaving
338
+ * those marked preserves the original heuristic's behaviour.
339
+ *
340
+ * The handoff is judged by range rather than by "body scrolls at all": a
341
+ * pinned shell can carry a little unrelated body overflow (a banner, a
342
+ * stray footer) while the clipped scroller gave up hundreds of pixels, and
343
+ * treating those few pixels as success would leave the content unreachable.
344
+ * `<body>` has to gain at least as much range as the largest clipped
345
+ * scroller lost. Largest rather than total, since nested scrollers overlap
346
+ * and summing them would demand range the page never had.
347
+ *
348
+ * A zero-height body means layout isn't available (jsdom, or a pass that ran
349
+ * before first paint) and the comparison would be meaningless, so leave the
350
+ * marks alone — `markOverflowTraps` is idempotent and later passes re-decide
351
+ * against real numbers.
352
+ */ function restoreStrandedScrollers(body, clipped) {
353
+ if (clipped.length === 0) return;
354
+ if (body.clientHeight === 0) return;
355
+ // This read flushes the attribute writes above, so body's scrollHeight
356
+ // already reflects the clipped descendants.
357
+ const bodyRange = body.scrollHeight - body.clientHeight;
358
+ const lostRange = Math.max(...clipped.map((c)=>c.lostRange));
359
+ if (bodyRange >= lostRange) return;
360
+ for (const { el } of clipped){
361
+ el.removeAttribute(OVERFLOW_TRAP_ATTRIBUTE);
362
+ }
271
363
  }
272
364
  function isOverflowTrap(el, depth, dims) {
273
365
  const { overflowY, position } = getComputedStyle(el);
@@ -284,8 +376,7 @@ function isOverflowTrap(el, depth, dims) {
284
376
  if (position && position !== "static" && position !== "relative") return false;
285
377
  if (el.offsetWidth < dims.minW) return false;
286
378
  // Active trap: full-size clipper with currently-overflowing content.
287
- // 4px slack covers sub-pixel rounding and scrollbar-gutter reservation.
288
- if (el.offsetHeight >= dims.minH && el.scrollHeight > el.clientHeight + 4) {
379
+ if (el.offsetHeight >= dims.minH && el.scrollHeight > el.clientHeight + SCROLL_OVERFLOW_SLACK_PX) {
289
380
  return true;
290
381
  }
291
382
  // Page-shell pass-through: tall clipper whose scrollHeight === clientHeight