@planningcenter/topbar 12.1.1 → 12.2.0-rc.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/dist/topbar.js CHANGED
@@ -41,7 +41,7 @@ var churchCenter__namespace = /*#__PURE__*/_interopNamespaceDefault(churchCenter
41
41
  var people__namespace = /*#__PURE__*/_interopNamespaceDefault(people);
42
42
  var toolbar__namespace = /*#__PURE__*/_interopNamespaceDefault(toolbar);
43
43
 
44
- var styles$c = {"accessibility-toolbar":"accessibility-toolbar-jgjUG"};
44
+ var styles$d = {"accessibility-toolbar":"accessibility-toolbar-jgjUG"};
45
45
 
46
46
  const AccessibilityToolbar = ({
47
47
  children
@@ -53,7 +53,7 @@ const AccessibilityToolbar = ({
53
53
  (_a = document.getElementById("main-content")) === null || _a === void 0 ? void 0 : _a.focus();
54
54
  };
55
55
  return /*#__PURE__*/React.createElement("div", {
56
- className: styles$c["accessibility-toolbar"]
56
+ className: styles$d["accessibility-toolbar"]
57
57
  }, /*#__PURE__*/React.createElement(tapestry.Link, {
58
58
  href: "#main-content",
59
59
  kind: "primary",
@@ -370,11 +370,11 @@ const X = ({
370
370
  fill: fill
371
371
  })));
372
372
 
373
- var styles$b = {"announcement":"announcement-pI5tM","announcement--platform":"announcement--platform-EcUn2","announcement--promo":"announcement--promo-FarUk","announcement-icon":"announcement-icon-Ov39-","announcement-content":"announcement-content-q2ad6","dismiss":"dismiss-wUAoU","dismiss--promo":"dismiss--promo-7zvO4"};
373
+ var styles$c = {"announcement":"announcement-pI5tM","announcement--platform":"announcement--platform-EcUn2","announcement--promo":"announcement--promo-FarUk","announcement-icon":"announcement-icon-Ov39-","announcement-content":"announcement-content-q2ad6","dismiss":"dismiss-wUAoU","dismiss--promo":"dismiss--promo-7zvO4"};
374
374
 
375
375
  function AnnouncementIcon() {
376
376
  return /*#__PURE__*/React.createElement("svg", {
377
- className: styles$b["announcement-icon"],
377
+ className: styles$c["announcement-icon"],
378
378
  width: "16",
379
379
  height: "16",
380
380
  viewBox: "0 0 16 16",
@@ -499,7 +499,7 @@ let StyledAnnouncement$1 = class StyledAnnouncement extends React.Component {
499
499
  } = this.props;
500
500
  const isPromo = variant === "promo";
501
501
  return /*#__PURE__*/React.createElement("div", {
502
- className: classnames(styles$b["announcement"], styles$b[`announcement--${variant !== null && variant !== void 0 ? variant : "platform"}`]),
502
+ className: classnames(styles$c["announcement"], styles$c[`announcement--${variant !== null && variant !== void 0 ? variant : "platform"}`]),
503
503
  "data-announcement-variant": variant !== null && variant !== void 0 ? variant : "platform",
504
504
  style: isPromo ? {
505
505
  backgroundImage: promoBackgroundUrl,
@@ -508,7 +508,7 @@ let StyledAnnouncement$1 = class StyledAnnouncement extends React.Component {
508
508
  backgroundSize: "cover"
509
509
  } : undefined
510
510
  }, !isPromo && /*#__PURE__*/React.createElement(AnnouncementIcon, null), /*#__PURE__*/React.createElement("div", {
511
- className: styles$b["announcement-content"],
511
+ className: styles$c["announcement-content"],
512
512
  style: style,
513
513
  ...platformProps
514
514
  }));
@@ -557,7 +557,7 @@ function StyledDismissButton$1({
557
557
  const isPromo = variant === "promo";
558
558
  return /*#__PURE__*/React.createElement("button", {
559
559
  type: "button",
560
- className: classnames(styles$b.dismiss, isPromo && styles$b["dismiss--promo"]),
560
+ className: classnames(styles$c.dismiss, isPromo && styles$c["dismiss--promo"]),
561
561
  ...props
562
562
  }, /*#__PURE__*/React.createElement(X, {
563
563
  fill: isPromo ? "currentColor" : "white",
@@ -637,9 +637,9 @@ class StyledAnnouncement extends React.Component {
637
637
  ...platformProps
638
638
  } = this.props;
639
639
  return /*#__PURE__*/React.createElement("div", {
640
- className: styles$b["announcement"]
640
+ className: styles$c["announcement"]
641
641
  }, /*#__PURE__*/React.createElement(AnnouncementIcon, null), /*#__PURE__*/React.createElement("div", {
642
- className: styles$b["announcement-content"],
642
+ className: styles$c["announcement-content"],
643
643
  style: style,
644
644
  ...platformProps
645
645
  }));
@@ -650,7 +650,7 @@ function StyledDismissButton({
650
650
  }) {
651
651
  return /*#__PURE__*/React.createElement("button", {
652
652
  type: "button",
653
- className: styles$b.dismiss,
653
+ className: styles$c.dismiss,
654
654
  ...props
655
655
  }, /*#__PURE__*/React.createElement(X, {
656
656
  fill: "white",
@@ -1897,7 +1897,7 @@ function MonoAppName({
1897
1897
  })) : (/*#__PURE__*/React.createElement("div", null, "appName not supported"));
1898
1898
  }
1899
1899
 
1900
- var styles$a = {"unbutton":"unbutton-lEbTR"};
1900
+ var styles$b = {"unbutton":"unbutton-lEbTR"};
1901
1901
 
1902
1902
  function Unbutton({
1903
1903
  className,
@@ -1906,7 +1906,7 @@ function Unbutton({
1906
1906
  ...nativeProps
1907
1907
  }) {
1908
1908
  return /*#__PURE__*/React.createElement("button", {
1909
- className: classnames(styles$a.unbutton, className),
1909
+ className: classnames(styles$b.unbutton, className),
1910
1910
  style: {
1911
1911
  ...style
1912
1912
  },
@@ -1915,7 +1915,7 @@ function Unbutton({
1915
1915
  });
1916
1916
  }
1917
1917
 
1918
- var styles$9 = {"button":"button-XMbeQ","button-accounts":"button-accounts-nNh-z","chevron":"chevron-RRg9k","is-expanded":"is-expanded-zD0A0"};
1918
+ var styles$a = {"button":"button-XMbeQ","button-accounts":"button-accounts-nNh-z","chevron":"chevron-RRg9k","is-expanded":"is-expanded-zD0A0"};
1919
1919
 
1920
1920
  const AppsButton = ({
1921
1921
  appName,
@@ -1930,8 +1930,8 @@ const AppsButton = ({
1930
1930
  "aria-haspopup": "true",
1931
1931
  "aria-label": `App switcher: ${appName}`,
1932
1932
  onClick: onClick,
1933
- className: classnames(styles$9.button, {
1934
- [styles$9["is-expanded"]]: expanded
1933
+ className: classnames(styles$a.button, {
1934
+ [styles$a["is-expanded"]]: expanded
1935
1935
  }),
1936
1936
  type: "button",
1937
1937
  style: style,
@@ -1940,7 +1940,7 @@ const AppsButton = ({
1940
1940
  appName: "Accounts",
1941
1941
  colors: colors
1942
1942
  }), /*#__PURE__*/React.createElement("div", {
1943
- className: styles$9["button-accounts"]
1943
+ className: styles$a["button-accounts"]
1944
1944
  }, "Account settings"))) : (/*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ColorAppIcon, {
1945
1945
  appName: appName.replace(/[\s-]/, "")
1946
1946
  }), /*#__PURE__*/React.createElement(MonoAppName, {
@@ -1948,7 +1948,7 @@ const AppsButton = ({
1948
1948
  key: "mono-app-name",
1949
1949
  size: 24
1950
1950
  }))), /*#__PURE__*/React.createElement(DisclosureChevronIcon, {
1951
- className: styles$9.chevron,
1951
+ className: styles$a.chevron,
1952
1952
  key: "disclosure-chevron-icon"
1953
1953
  }));
1954
1954
  };
@@ -2036,7 +2036,7 @@ const IEFlex1 = {
2036
2036
  flex: "1 1 auto"
2037
2037
  };
2038
2038
 
2039
- var styles$8 = {"popup":"popup-sJ-Nv"};
2039
+ var styles$9 = {"popup":"popup-sJ-Nv"};
2040
2040
 
2041
2041
  const HoverableListItem = ({
2042
2042
  active = false,
@@ -2093,7 +2093,7 @@ class Outsider extends React.Component {
2093
2093
  }
2094
2094
  }
2095
2095
 
2096
- var styles$7 = {"popup-root":"popup-root-SeL5u","popup":"popup-nQXYW","is-visible":"is-visible-3DAUP"};
2096
+ var styles$8 = {"popup-root":"popup-root-SeL5u","popup":"popup-nQXYW","is-visible":"is-visible-3DAUP"};
2097
2097
 
2098
2098
  const Popup = ({
2099
2099
  className,
@@ -2101,8 +2101,8 @@ const Popup = ({
2101
2101
  isVisible,
2102
2102
  ...nativeProps
2103
2103
  }) => (/*#__PURE__*/React.createElement(C, {
2104
- className: classnames(styles$7.popup, {
2105
- [styles$7["is-visible"]]: isVisible
2104
+ className: classnames(styles$8.popup, {
2105
+ [styles$8["is-visible"]]: isVisible
2106
2106
  }, className),
2107
2107
  ...nativeProps
2108
2108
  }));
@@ -2110,7 +2110,7 @@ const Popup = ({
2110
2110
  const PopupRoot = ({
2111
2111
  ...nativeProps
2112
2112
  }) => (/*#__PURE__*/React.createElement("div", {
2113
- className: styles$7["popup-root"],
2113
+ className: styles$8["popup-root"],
2114
2114
  ...nativeProps
2115
2115
  }));
2116
2116
 
@@ -2150,7 +2150,7 @@ const AppsMenu = ({
2150
2150
  cleanup: !visible,
2151
2151
  component: Outsider,
2152
2152
  onOutsideClick: toggle,
2153
- className: styles$8.popup,
2153
+ className: styles$9.popup,
2154
2154
  isVisible: visible
2155
2155
  }, /*#__PURE__*/React.createElement("menu", {
2156
2156
  ref: menuRef,
@@ -3046,9 +3046,9 @@ function StyledRoot({
3046
3046
  `), children);
3047
3047
  }
3048
3048
 
3049
- var styles$6 = {"route":"route--8BWe","is-active":"is-active-FsU9Y","apps-routes-separator":"apps-routes-separator-Nlm-N"};
3049
+ var styles$7 = {"route":"route--8BWe","is-active":"is-active-FsU9Y","apps-routes-separator":"apps-routes-separator-Nlm-N"};
3050
3050
 
3051
- var styles$5 = {"popup":"popup-mDNKn","trigger-wrap":"trigger-wrap-Jd-KR","trigger":"trigger-WgRT5","is-visible":"is-visible-GZC0-","trigger-orgname":"trigger-orgname-TDHCc"};
3051
+ var styles$6 = {"popup":"popup-mDNKn","trigger-wrap":"trigger-wrap-Jd-KR","trigger":"trigger-WgRT5","is-visible":"is-visible-GZC0-","trigger-orgname":"trigger-orgname-TDHCc"};
3052
3052
 
3053
3053
  const UserMenu = ({
3054
3054
  appName,
@@ -3067,7 +3067,7 @@ const UserMenu = ({
3067
3067
  component: Outsider,
3068
3068
  onOutsideClick: () => setUserMenuVisible(false),
3069
3069
  cleanup: !userMenuVisible,
3070
- className: styles$5.popup,
3070
+ className: styles$6.popup,
3071
3071
  isVisible: userMenuVisible
3072
3072
  }, /*#__PURE__*/React.createElement("div", null, hasConnectedPeople ? (/*#__PURE__*/React.createElement("div", {
3073
3073
  style: {
@@ -3211,11 +3211,11 @@ const UserMenuTrigger = ({
3211
3211
  userMenuVisible
3212
3212
  }) => {
3213
3213
  return /*#__PURE__*/React.createElement("div", {
3214
- className: styles$5["trigger-wrap"],
3214
+ className: styles$6["trigger-wrap"],
3215
3215
  "data-pendo": "topbar-org-switcher"
3216
3216
  }, /*#__PURE__*/React.createElement(Hoverable, {
3217
- className: classnames(styles$5["trigger"], {
3218
- [styles$5["is-visible"]]: userMenuVisible
3217
+ className: classnames(styles$6["trigger"], {
3218
+ [styles$6["is-visible"]]: userMenuVisible
3219
3219
  }),
3220
3220
  component: "button",
3221
3221
  type: "button",
@@ -3227,7 +3227,7 @@ const UserMenuTrigger = ({
3227
3227
  requestConnectedPeopleFetch();
3228
3228
  }
3229
3229
  }, showOrgName && (/*#__PURE__*/React.createElement("span", {
3230
- className: styles$5["trigger-orgname"]
3230
+ className: styles$6["trigger-orgname"]
3231
3231
  }, orgName)), /*#__PURE__*/React.createElement(DisclosureChevronIcon, null)));
3232
3232
  };
3233
3233
 
@@ -3284,7 +3284,7 @@ const NotSmallTopbar = ({
3284
3284
  },
3285
3285
  appName: props.appName
3286
3286
  }), /*#__PURE__*/React.createElement("div", {
3287
- className: styles$6["apps-routes-separator"]
3287
+ className: styles$7["apps-routes-separator"]
3288
3288
  }), routesVisible && props.routes, /*#__PURE__*/React.createElement("div", {
3289
3289
  style: {
3290
3290
  margin: "auto"
@@ -3322,12 +3322,12 @@ const NotSmallRoute = ({
3322
3322
  ...nativeProps
3323
3323
  }) => {
3324
3324
  return /*#__PURE__*/React.createElement("a", {
3325
- className: classnames(styles$6["route"], className, active && styles$6["is-active"]),
3325
+ className: classnames(styles$7["route"], className, active && styles$7["is-active"]),
3326
3326
  ...nativeProps
3327
3327
  });
3328
3328
  };
3329
3329
 
3330
- var styles$4 = {"avatar":"avatar-tW-wn"};
3330
+ var styles$5 = {"avatar":"avatar-tW-wn"};
3331
3331
 
3332
3332
  function Avatar({
3333
3333
  env,
@@ -3337,7 +3337,7 @@ function Avatar({
3337
3337
  }) {
3338
3338
  const url = incomingUrl || `${pcoUrl$1(env)("people")}/static/no_photo_thumbnail_gray.svg`;
3339
3339
  return /*#__PURE__*/React.createElement("div", {
3340
- className: styles$4.avatar,
3340
+ className: styles$5.avatar,
3341
3341
  style: {
3342
3342
  backgroundImage: `url(${url})`,
3343
3343
  ...style
@@ -3359,14 +3359,14 @@ ClientStorage.defaultProps = {
3359
3359
  method: "localStorage"
3360
3360
  };
3361
3361
 
3362
- var styles$3 = {"appmenu-button":"appmenu-button-b0UvT","appmenu-layer":"appmenu-layer-0IQpN","appmenu-container":"appmenu-container-gackd","appmenu-scroll":"appmenu-scroll-mPSx0","appmenu-list":"appmenu-list-h7clX","appmenu-list-a":"appmenu-list-a-rGIQN","appmenu-list-a--top":"appmenu-list-a--top-RT-2F","appmenu-list-a--bottom":"appmenu-list-a--bottom-YDeBC","appmenu-close-button":"appmenu-close-button-vv9bV","current-route":"current-route-wpJgz","is-active":"is-active-wy8Bg","routes":"routes-Nmt1S","route":"route-kkknQ","profile-button":"profile-button-a2WO2"};
3362
+ var styles$4 = {"appmenu-button":"appmenu-button-b0UvT","appmenu-layer":"appmenu-layer-0IQpN","appmenu-container":"appmenu-container-gackd","appmenu-scroll":"appmenu-scroll-mPSx0","appmenu-list":"appmenu-list-h7clX","appmenu-list-a":"appmenu-list-a-rGIQN","appmenu-list-a--top":"appmenu-list-a--top-RT-2F","appmenu-list-a--bottom":"appmenu-list-a--bottom-YDeBC","appmenu-close-button":"appmenu-close-button-vv9bV","current-route":"current-route-wpJgz","is-active":"is-active-wy8Bg","routes":"routes-Nmt1S","route":"route-kkknQ","profile-button":"profile-button-a2WO2"};
3363
3363
 
3364
3364
  function AccountSettingsLink({
3365
3365
  env
3366
3366
  }) {
3367
3367
  const accountsName = "accounts";
3368
3368
  return /*#__PURE__*/React.createElement("a", {
3369
- className: classnames(styles$3["appmenu-list-a"], styles$3["appmenu-list-a--bottom"]),
3369
+ className: classnames(styles$4["appmenu-list-a"], styles$4["appmenu-list-a--bottom"]),
3370
3370
  "data-pendo": `app-switcher--change-app--${accountsName}`,
3371
3371
  "data-turbolinks": false,
3372
3372
  href: pcoUrl$1(env)(accountsName) + getAppsSwitchProductPath(accountsName)
@@ -3389,7 +3389,7 @@ const CloseMenuButton = ({
3389
3389
  }) => (/*#__PURE__*/React.createElement("button", {
3390
3390
  "aria-label": "Close menu",
3391
3391
  type: "button",
3392
- className: styles$3["appmenu-close-button"],
3392
+ className: styles$4["appmenu-close-button"],
3393
3393
  style: style
3394
3394
  }, /*#__PURE__*/React.createElement(X, {
3395
3395
  fill: color,
@@ -3470,7 +3470,7 @@ const SmallTopbar = ({
3470
3470
  "aria-haspopup": "true",
3471
3471
  "aria-label": `App switcher: ${props.appName}`,
3472
3472
  type: "button",
3473
- className: styles$3["appmenu-button"],
3473
+ className: styles$4["appmenu-button"],
3474
3474
  onClick: () => {
3475
3475
  props.requestAppsFetch();
3476
3476
  props.requestConnectedPeopleFetch();
@@ -3480,12 +3480,12 @@ const SmallTopbar = ({
3480
3480
  }, /*#__PURE__*/React.createElement(ColorAppIcon, {
3481
3481
  appName: props.appName.replace(/[\s-]/, "")
3482
3482
  })), routesMenuVisible && (/*#__PURE__*/React.createElement("div", {
3483
- className: styles$3["routes"]
3483
+ className: styles$4["routes"]
3484
3484
  }, props.routes)), /*#__PURE__*/React.createElement(ClientStorage, {
3485
3485
  item: "Topbar:Small:Menus:Products:visibility",
3486
3486
  render: () => (/*#__PURE__*/React.createElement("div", {
3487
3487
  ref: appMenuRef,
3488
- className: styles$3["appmenu-layer"],
3488
+ className: styles$4["appmenu-layer"],
3489
3489
  style: {
3490
3490
  ...(productSwitcherVisible && {
3491
3491
  display: "block"
@@ -3504,44 +3504,44 @@ const SmallTopbar = ({
3504
3504
  e.stopPropagation();
3505
3505
  }
3506
3506
  },
3507
- className: styles$3["appmenu-container"]
3507
+ className: styles$4["appmenu-container"]
3508
3508
  }, /*#__PURE__*/React.createElement("a", {
3509
3509
  "aria-current": props.appName === (homeProduct === null || homeProduct === void 0 ? void 0 : homeProduct.name) ? "page" : undefined,
3510
3510
  "aria-label": homeProduct ? homeProduct.name : props.appName,
3511
3511
  "data-pendo": `app-switcher--change-app--${homeProduct === null || homeProduct === void 0 ? void 0 : homeProduct.name}`,
3512
3512
  "data-turbolinks": false,
3513
- className: classnames(styles$3["appmenu-list-a"], styles$3["appmenu-list-a--top"]),
3513
+ className: classnames(styles$4["appmenu-list-a"], styles$4["appmenu-list-a--top"]),
3514
3514
  href: homeProduct ? pcoUrl$1(props.env)("accounts") + getAppsSwitchProductPath(homeProduct === null || homeProduct === void 0 ? void 0 : homeProduct.name) : undefined
3515
3515
  }, /*#__PURE__*/React.createElement(UserMenuAppLockup, {
3516
3516
  appName: homeProduct ? homeProduct.name : props.appName
3517
3517
  })), /*#__PURE__*/React.createElement("div", {
3518
- className: styles$3["appmenu-scroll"]
3518
+ className: styles$4["appmenu-scroll"]
3519
3519
  }, /*#__PURE__*/React.createElement("ul", {
3520
3520
  "data-pendo": "app-switcher",
3521
- className: styles$3["appmenu-list"]
3521
+ className: styles$4["appmenu-list"]
3522
3522
  }, appsMenuFormatter(restProducts).map(({
3523
3523
  name
3524
3524
  }) => (/*#__PURE__*/React.createElement("li", {
3525
3525
  key: name,
3526
- className: styles$3["appmenu-list-li"]
3526
+ className: styles$4["appmenu-list-li"]
3527
3527
  }, /*#__PURE__*/React.createElement("a", {
3528
3528
  "aria-current": name === props.appName ? "page" : undefined,
3529
3529
  "aria-label": name,
3530
3530
  "data-pendo": `app-switcher--change-app--${name}`,
3531
3531
  "data-turbolinks": false,
3532
- className: styles$3["appmenu-list-a"],
3532
+ className: styles$4["appmenu-list-a"],
3533
3533
  href: pcoUrl$1(props.env)("accounts") + getAppsSwitchProductPath(name)
3534
3534
  }, /*#__PURE__*/React.createElement(UserMenuAppLockup, {
3535
3535
  appName: name
3536
3536
  }))))), accountsProduct && (/*#__PURE__*/React.createElement("li", {
3537
- className: styles$3["appmenu-list-li"]
3537
+ className: styles$4["appmenu-list-li"]
3538
3538
  }, /*#__PURE__*/React.createElement(AccountSettingsLink, {
3539
3539
  env: props.env
3540
3540
  }))))))))
3541
3541
  }), /*#__PURE__*/React.createElement("button", {
3542
3542
  type: "button",
3543
- className: classnames(styles$3["current-route"], {
3544
- [styles$3["is-active"]]: routesMenuVisible
3543
+ className: classnames(styles$4["current-route"], {
3544
+ [styles$4["is-active"]]: routesMenuVisible
3545
3545
  }),
3546
3546
  onClick: props.routes.length > 0 ? () => {
3547
3547
  setProductSwitcherVisible(false);
@@ -3549,7 +3549,7 @@ const SmallTopbar = ({
3549
3549
  } : null
3550
3550
  }, /*#__PURE__*/React.createElement(CurrentRouteComponent, null, capitalize(currentRouteText)), props.routes.length > 0 && /*#__PURE__*/React.createElement(DisclosureChevronIcon, null)), /*#__PURE__*/React.createElement("button", {
3551
3551
  type: "button",
3552
- className: styles$3["profile-button"],
3552
+ className: styles$4["profile-button"],
3553
3553
  onClick: () => {
3554
3554
  var _a, _b;
3555
3555
  props.requestConnectedPeopleFetch();
@@ -3565,7 +3565,7 @@ const SmallRoute = ({
3565
3565
  className,
3566
3566
  ...props
3567
3567
  }) => (/*#__PURE__*/React.createElement("a", {
3568
- className: classnames(styles$3["route"], className, active && styles$3["is-active"]),
3568
+ className: classnames(styles$4["route"], className, active && styles$4["is-active"]),
3569
3569
  ...props
3570
3570
  }));
3571
3571
 
@@ -3704,7 +3704,7 @@ const topbarTheme = {
3704
3704
  id: "topbar"
3705
3705
  };
3706
3706
 
3707
- var styles$2 = {"drawer-wrap":"drawer-wrap-J0rSL","is-visible":"is-visible-KTME8","drawer":"drawer-j7f4l"};
3707
+ var styles$3 = {"drawer-wrap":"drawer-wrap-J0rSL","is-visible":"is-visible-KTME8","drawer":"drawer-j7f4l"};
3708
3708
 
3709
3709
  function Drawer({
3710
3710
  children,
@@ -3712,7 +3712,7 @@ function Drawer({
3712
3712
  }) {
3713
3713
  return /*#__PURE__*/React.createElement("div", {
3714
3714
  id: id,
3715
- className: styles$2["drawer"]
3715
+ className: styles$3["drawer"]
3716
3716
  }, children);
3717
3717
  }
3718
3718
  function DrawerWrap({
@@ -3722,7 +3722,7 @@ function DrawerWrap({
3722
3722
  ...props
3723
3723
  }) {
3724
3724
  return /*#__PURE__*/React.createElement("div", {
3725
- className: classnames(styles$2["drawer-wrap"], className, isVisible && styles$2["is-visible"]),
3725
+ className: classnames(styles$3["drawer-wrap"], className, isVisible && styles$3["is-visible"]),
3726
3726
  ...props
3727
3727
  }, children);
3728
3728
  }
@@ -3906,7 +3906,7 @@ const SwitchView = ({
3906
3906
  }));
3907
3907
  };
3908
3908
 
3909
- var styles$1 = {"color-mode-switcher":"color-mode-switcher-JpczO","color-mode-switcher-label":"color-mode-switcher-label-3jPM2","color-mode-switcher-modes":"color-mode-switcher-modes-u-bic"};
3909
+ var styles$2 = {"color-mode-switcher":"color-mode-switcher-JpczO","color-mode-switcher-label":"color-mode-switcher-label-3jPM2","color-mode-switcher-modes":"color-mode-switcher-modes-u-bic"};
3910
3910
 
3911
3911
  const COLOR_MODES = [{
3912
3912
  label: "Light",
@@ -3926,11 +3926,11 @@ function ColorModeSwitcher() {
3926
3926
  const updateStore = useUpdateStore();
3927
3927
  const [counter] = React.useState(() => COLOR_MODE_INSTANCE_COUNTER++);
3928
3928
  return /*#__PURE__*/React.createElement("fieldset", {
3929
- className: styles$1["color-mode-switcher"]
3929
+ className: styles$2["color-mode-switcher"]
3930
3930
  }, /*#__PURE__*/React.createElement("legend", {
3931
- className: styles$1["color-mode-switcher-label"]
3931
+ className: styles$2["color-mode-switcher-label"]
3932
3932
  }, "Appearance", " "), /*#__PURE__*/React.createElement("div", {
3933
- className: styles$1["color-mode-switcher-modes"]
3933
+ className: styles$2["color-mode-switcher-modes"]
3934
3934
  }, COLOR_MODES.map(({
3935
3935
  value,
3936
3936
  label
@@ -4201,20 +4201,67 @@ const useToolbarReducer = overrides => React__namespace.useReducer(reducer, {
4201
4201
  ...overrides
4202
4202
  });
4203
4203
 
4204
- var styles = {"toolbar":"toolbar-KHJR5","toolbar-button":"toolbar-button-Ye4h5","is-current":"is-current-DZK47","toolbar-button--avatar":"toolbar-button--avatar-5FUik","toolbar-button--home":"toolbar-button--home-Pthd0"};
4204
+ var styles$1 = {"toolbar":"toolbar-KHJR5","toolbar-button":"toolbar-button-Ye4h5","is-current":"is-current-DZK47","toolbar-button--avatar":"toolbar-button--avatar-5FUik","toolbar-button--home":"toolbar-button--home-Pthd0"};
4205
4205
 
4206
4206
  const pcoUrl = pcoUrl$1;
4207
4207
 
4208
- // The route rides in the iframe URL fragment (`…/topbar#conversations/abc`),
4209
- // not the path, so updating it is a same-document navigation that doesn't
4210
- // reload the iframe, but also lets the route survive a forced reload (e.g.
4211
- // Turbo re-parenting the topbar).
4212
- function buildPicobotSrc(origin, path) {
4213
- const [rawPath, queryPart] = path.replace(/^\/+/, "").split("?", 2);
4214
- const safePath = rawPath.split("/").filter(segment => segment && segment !== "." && segment !== "..").join("/");
4215
- const fragment = queryPart !== undefined ? `${safePath}?${queryPart}` : safePath;
4216
- const base = new URL("topbar", origin).toString();
4217
- return fragment ? `${base}#${fragment}` : base;
4208
+ var styles = {"banner":"banner-YfQ37","content":"content-lNjWf","icon":"icon-abz7q","iconShape":"iconShape-6uyot","iconWand":"iconWand-yEhh4","text":"text--Vlhl","title":"title-zOEOR","subtitle":"subtitle-ufLnk","chevron":"chevron-oOUA-"};
4209
+
4210
+ function AskAIBanner({
4211
+ onClick
4212
+ }) {
4213
+ return /*#__PURE__*/React.createElement("button", {
4214
+ className: styles.banner,
4215
+ onClick: () => onClick(),
4216
+ type: "button"
4217
+ }, /*#__PURE__*/React.createElement("span", {
4218
+ className: styles.content
4219
+ }, /*#__PURE__*/React.createElement(AskAIIcon, null), /*#__PURE__*/React.createElement("span", {
4220
+ className: styles.text
4221
+ }, /*#__PURE__*/React.createElement("span", {
4222
+ className: styles.title
4223
+ }, "Ask AI"), /*#__PURE__*/React.createElement("span", {
4224
+ className: styles.subtitle
4225
+ }, "Support answers tailored to you"))), /*#__PURE__*/React.createElement(tapestryReact.Icon, {
4226
+ className: styles.chevron,
4227
+ name: "general.rightChevron",
4228
+ size: "16px"
4229
+ }));
4230
+ }
4231
+ const GRADIENT_ID = "ask-ai-banner-icon-gradient";
4232
+ function AskAIIcon() {
4233
+ return /*#__PURE__*/React.createElement("span", {
4234
+ className: styles.icon
4235
+ }, /*#__PURE__*/React.createElement("svg", {
4236
+ className: styles.iconShape,
4237
+ viewBox: "0 0 32 32",
4238
+ "aria-hidden": "true"
4239
+ }, /*#__PURE__*/React.createElement("path", {
4240
+ d: "M15.9994 0C3.19766 0 0 3.20025 0 16C0 28.7998 3.19766 32 15.9994 32C28.8011 32 32 28.8022 32 16C32 3.19779 28.7999 0 15.9994 0Z",
4241
+ fill: `url(#${GRADIENT_ID})`
4242
+ }), /*#__PURE__*/React.createElement("defs", null, /*#__PURE__*/React.createElement("linearGradient", {
4243
+ id: GRADIENT_ID,
4244
+ x1: "0",
4245
+ y1: "0",
4246
+ x2: "38.0356",
4247
+ y2: "21.1413",
4248
+ gradientUnits: "userSpaceOnUse"
4249
+ }, /*#__PURE__*/React.createElement("stop", {
4250
+ stopColor: "#49D4BB"
4251
+ }), /*#__PURE__*/React.createElement("stop", {
4252
+ offset: "0.352694",
4253
+ stopColor: "#7CA8FE"
4254
+ }), /*#__PURE__*/React.createElement("stop", {
4255
+ offset: "0.656242",
4256
+ stopColor: "#B883E2"
4257
+ }), /*#__PURE__*/React.createElement("stop", {
4258
+ offset: "1",
4259
+ stopColor: "#F28B54"
4260
+ })))), /*#__PURE__*/React.createElement(tapestryReact.Icon, {
4261
+ className: styles.iconWand,
4262
+ name: "general.magicWand",
4263
+ size: "18px"
4264
+ }));
4218
4265
  }
4219
4266
 
4220
4267
  // The article heading lives in the deepest populated hierarchy level (lvl0 is
@@ -4368,6 +4415,74 @@ const DocumentationSearch = ({
4368
4415
  }));
4369
4416
  };
4370
4417
 
4418
+ // The route rides in the iframe URL fragment (`…/topbar#conversations/abc`),
4419
+ // not the path, so updating it is a same-document navigation that doesn't
4420
+ // reload the iframe, but also lets the route survive a forced reload (e.g.
4421
+ // Turbo re-parenting the topbar).
4422
+ function buildPicobotSrc(origin, path) {
4423
+ const [rawPath, queryPart] = path.replace(/^\/+/, "").split("?", 2);
4424
+ const safePath = rawPath.split("/").filter(segment => segment && segment !== "." && segment !== "..").join("/");
4425
+ const fragment = queryPart !== undefined ? `${safePath}?${queryPart}` : safePath;
4426
+ const base = new URL("topbar", origin).toString();
4427
+ return fragment ? `${base}#${fragment}` : base;
4428
+ }
4429
+
4430
+ function createPicobotIframe(picobotOrigin) {
4431
+ return /*#__PURE__*/React.forwardRef(function PicobotIframe({
4432
+ currentPath: iframePath,
4433
+ onChangePath: onIframeChangePath,
4434
+ onMessage
4435
+ }, ref) {
4436
+ const iframeRef = React.useRef(null);
4437
+ // Keep the fragment in sync in both directions—external opens (deeplink /
4438
+ // Contact support) and picobot's own NEW_ROUTE_RENDERED reports—so it
4439
+ // always reflects the live conversation. See buildPicobotSrc.
4440
+ const [loadedPath, setLoadedPath] = React.useState(iframePath || "");
4441
+ React.useEffect(function subscribeToGuestMessages() {
4442
+ if (!onIframeChangePath && !onMessage) return undefined;
4443
+ function handleGuestMessage(e) {
4444
+ var _a, _b;
4445
+ if (e.origin !== picobotOrigin) return;
4446
+ if (!e.source || !iframeRef.current) return;
4447
+ if (e.source !== iframeRef.current.contentWindow) return;
4448
+ if (((_a = e.data) === null || _a === void 0 ? void 0 : _a.type) === "NEW_ROUTE_RENDERED" && onIframeChangePath) {
4449
+ const reportedPath = String((_b = e.data.payload) !== null && _b !== void 0 ? _b : "");
4450
+ setLoadedPath(reportedPath);
4451
+ onIframeChangePath(reportedPath);
4452
+ }
4453
+ if (onMessage) onMessage(e.data);
4454
+ }
4455
+ window.addEventListener("message", handleGuestMessage);
4456
+ return () => window.removeEventListener("message", handleGuestMessage);
4457
+ }, [onIframeChangePath, onMessage]);
4458
+ React.useEffect(function syncLoadedPathFromProp() {
4459
+ setLoadedPath(iframePath || "");
4460
+ }, [iframePath]);
4461
+ // A one-way channel for sending messages to picobot. Topbar just
4462
+ // forwards the envelope to the iframe and holds no message semantics of
4463
+ // its own—the consumer decides what to send and when.
4464
+ React.useImperativeHandle(ref, () => ({
4465
+ postMessage(message) {
4466
+ var _a, _b;
4467
+ (_b = (_a = iframeRef.current) === null || _a === void 0 ? void 0 : _a.contentWindow) === null || _b === void 0 ? void 0 : _b.postMessage(message, picobotOrigin);
4468
+ }
4469
+ }), []);
4470
+ const iframeSrc = buildPicobotSrc(picobotOrigin, loadedPath);
4471
+ return /*#__PURE__*/React.createElement("iframe", {
4472
+ ref: iframeRef,
4473
+ src: iframeSrc,
4474
+ allow: "clipboard-write",
4475
+ style: {
4476
+ border: 0,
4477
+ flex: 1,
4478
+ height: "100%",
4479
+ width: "100%"
4480
+ },
4481
+ title: "Picobot"
4482
+ });
4483
+ });
4484
+ }
4485
+
4371
4486
  const {
4372
4487
  LoadingIndicator: LoadingIndicator$1,
4373
4488
  StackView: StackView$1
@@ -4393,52 +4508,7 @@ function HelpdeskComponent({
4393
4508
  helpdeskConfig,
4394
4509
  onChangePath
4395
4510
  }) {
4396
- const PicobotIframe = React.useMemo(() => {
4397
- const picobotOrigin = pcoUrl(env)("picobot");
4398
- return function PicobotIframe({
4399
- currentPath: iframePath,
4400
- onChangePath: onIframeChangePath,
4401
- onMessage
4402
- }) {
4403
- const ref = React.useRef(null);
4404
- // Keep the fragment in sync in both directions—external opens (deeplink /
4405
- // Contact support) and picobot's own NEW_ROUTE_RENDERED reports—so it
4406
- // always reflects the live conversation. See buildPicobotSrc.
4407
- const [loadedPath, setLoadedPath] = React.useState(iframePath || "");
4408
- React.useEffect(() => {
4409
- if (!onIframeChangePath && !onMessage) return undefined;
4410
- const handler = e => {
4411
- var _a, _b;
4412
- if (e.origin !== picobotOrigin) return;
4413
- if (!e.source || !ref.current) return;
4414
- if (e.source !== ref.current.contentWindow) return;
4415
- if (((_a = e.data) === null || _a === void 0 ? void 0 : _a.type) === "NEW_ROUTE_RENDERED" && onIframeChangePath) {
4416
- const reportedPath = String((_b = e.data.payload) !== null && _b !== void 0 ? _b : "");
4417
- setLoadedPath(reportedPath);
4418
- onIframeChangePath(reportedPath);
4419
- }
4420
- if (onMessage) onMessage(e.data);
4421
- };
4422
- window.addEventListener("message", handler);
4423
- return () => window.removeEventListener("message", handler);
4424
- }, [onIframeChangePath, onMessage]);
4425
- React.useEffect(() => {
4426
- setLoadedPath(iframePath || "");
4427
- }, [iframePath]);
4428
- const iframeSrc = buildPicobotSrc(picobotOrigin, loadedPath);
4429
- return /*#__PURE__*/React.createElement("iframe", {
4430
- ref: ref,
4431
- src: iframeSrc,
4432
- style: {
4433
- border: 0,
4434
- flex: 1,
4435
- height: "100%",
4436
- width: "100%"
4437
- },
4438
- title: "Picobot"
4439
- });
4440
- };
4441
- }, [env]);
4511
+ const PicobotIframe = React.useMemo(() => createPicobotIframe(pcoUrl(env)("picobot")), [env]);
4442
4512
  return /*#__PURE__*/React.createElement(addOns.UiExtensionFirstPartyComponent, {
4443
4513
  grow: 1,
4444
4514
  display: "flex",
@@ -4453,6 +4523,15 @@ function HelpdeskComponent({
4453
4523
  spacing: 1
4454
4524
  }, /*#__PURE__*/React.createElement(DrawerHeading, null, "Help and support"), /*#__PURE__*/React.createElement(LoadingIndicator$1, null)))),
4455
4525
  additionalComponents: {
4526
+ AskAIBanner: {
4527
+ component: AskAIBanner,
4528
+ properties: {
4529
+ onClick: {
4530
+ event: false,
4531
+ type: Function
4532
+ }
4533
+ }
4534
+ },
4456
4535
  CalendlyWidget: {
4457
4536
  component: CalendlyWidget,
4458
4537
  properties: {
@@ -4489,6 +4568,7 @@ function HelpdeskComponent({
4489
4568
  DrawerHeading,
4490
4569
  PicobotIframe: {
4491
4570
  component: PicobotIframe,
4571
+ methods: ["postMessage"],
4492
4572
  properties: {
4493
4573
  currentPath: {
4494
4574
  attribute: false
@@ -5733,18 +5813,18 @@ function Toolbar({
5733
5813
  return /*#__PURE__*/React.createElement(tapestryReact.ThemeProvider, {
5734
5814
  theme: topbarTheme
5735
5815
  }, /*#__PURE__*/React.createElement(addOns.UiExtensionDataContext, null, /*#__PURE__*/React.createElement("div", {
5736
- className: styles["toolbar"],
5816
+ className: styles$1["toolbar"],
5737
5817
  "data-pendo": "toolbar-profile-support-wrapper"
5738
5818
  }, /*#__PURE__*/React.createElement(ToolbarButton, {
5739
5819
  "aria-label": `Open ${userName}’s profile drawer`,
5740
5820
  onClick: () => toggleDrawer(Profile),
5741
5821
  "data-pendo": "toolbar-profile",
5742
- className: styles["toolbar-button--avatar"]
5822
+ className: styles$1["toolbar-button--avatar"]
5743
5823
  }, /*#__PURE__*/React.createElement(Avatar, {
5744
5824
  env: env,
5745
5825
  url: userAvatarPath
5746
5826
  })), /*#__PURE__*/React.createElement(ToolbarButton, {
5747
- className: styles["toolbar-button--home"],
5827
+ className: styles$1["toolbar-button--home"],
5748
5828
  onClick: () => closeDrawer()
5749
5829
  }, /*#__PURE__*/React.createElement(tapestryReact.Icon, {
5750
5830
  name: "toolbar.planningCenter",
@@ -5782,7 +5862,7 @@ const ToolbarButton = ({
5782
5862
  }) => {
5783
5863
  return /*#__PURE__*/React.createElement("button", {
5784
5864
  type: "button",
5785
- className: classnames(styles["toolbar-button"], className, current && styles["is-current"]),
5865
+ className: classnames(styles$1["toolbar-button"], className, current && styles$1["is-current"]),
5786
5866
  onClick: onClick,
5787
5867
  "data-toolbar-link": "true",
5788
5868
  ...restProps