@flamingo-stack/openframe-frontend-core 0.0.718 → 0.0.720

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 (175) hide show
  1. package/dist/{chunk-MIQLUUVF.cjs → chunk-2C72EWQR.cjs} +93 -29
  2. package/dist/{chunk-IWCPXJEE.js → chunk-3HZ6XSZC.js} +2 -4
  3. package/dist/{chunk-ZXCZYMN4.cjs → chunk-4SIZCHVZ.cjs} +13 -15
  4. package/dist/{chunk-BOTM373R.cjs → chunk-5XDCCQ4A.cjs} +15 -15
  5. package/dist/{chunk-DXCBOZVT.cjs → chunk-6BLN5WDS.cjs} +41 -41
  6. package/dist/{chunk-DCD5WZUF.js → chunk-6W46LVK4.js} +5 -5
  7. package/dist/{chunk-JHQ334WS.js → chunk-742BGXNX.js} +2 -0
  8. package/dist/{chunk-AECTRMGQ.cjs → chunk-7GRPR7XA.cjs} +13 -1
  9. package/dist/{chunk-45F7PXUI.js → chunk-7HYEQKN6.js} +6 -6
  10. package/dist/{chunk-N2PF5CFX.js → chunk-7IOU6BJE.js} +12 -11
  11. package/dist/{chunk-BWIN42ZA.cjs → chunk-7LPR4RZ3.cjs} +34 -36
  12. package/dist/chunk-AFTRPEXO.js +13 -0
  13. package/dist/{chunk-JPD4NXH6.js → chunk-AZRI4XBP.js} +1 -1
  14. package/dist/{chunk-4QFWGLZO.js → chunk-B2N4YX66.js} +1 -1
  15. package/dist/{chunk-QXZCLQNV.js → chunk-B5LNX4GZ.js} +2 -2
  16. package/dist/{chunk-GN4A7PMB.cjs → chunk-DHNJSQGX.cjs} +91 -91
  17. package/dist/{chunk-NDZ5ZXOQ.cjs → chunk-DOPOHO6H.cjs} +20 -20
  18. package/dist/{chunk-Z3CVSPO3.cjs → chunk-DYDDAA6O.cjs} +519 -518
  19. package/dist/{chunk-2RKFMUNW.cjs → chunk-EVMM3JE6.cjs} +64 -63
  20. package/dist/chunk-EWPR7662.cjs +13 -0
  21. package/dist/{chunk-AGVXKD4K.js → chunk-FSQQZFVG.js} +12 -0
  22. package/dist/{chunk-TTVOLEUS.js → chunk-GANIUMRU.js} +89 -2
  23. package/dist/{chunk-S2FUFMLW.cjs → chunk-HFEYEPOG.cjs} +27 -27
  24. package/dist/{chunk-LE5WKGJV.cjs → chunk-HTS46FFY.cjs} +3 -3
  25. package/dist/{chunk-6A43ZDWV.cjs → chunk-IL3ZWNM2.cjs} +4 -4
  26. package/dist/{chunk-PSVSEN4J.cjs → chunk-IMTY3GRR.cjs} +2 -0
  27. package/dist/{chunk-YC5COB5V.cjs → chunk-ISCZ6UNF.cjs} +85 -89
  28. package/dist/{chunk-XGHGGBM3.js → chunk-K2BYVPGR.js} +3 -3
  29. package/dist/{chunk-HWVUR735.cjs → chunk-KSGMZHVV.cjs} +2 -2
  30. package/dist/{chunk-SGFTTJKO.js → chunk-LO3KCLEF.js} +1 -1
  31. package/dist/{chunk-MA4Q5RBP.cjs → chunk-NYSMDM4J.cjs} +2 -2
  32. package/dist/{chunk-67QBMN4R.js → chunk-O3MKJU6A.js} +6 -6
  33. package/dist/{chunk-APJZBDQN.js → chunk-PSMJYZMV.js} +27 -26
  34. package/dist/{chunk-JH2SIWPQ.js → chunk-PXAKSPLZ.js} +1586 -1263
  35. package/dist/{chunk-TBCZCRQ5.js → chunk-Q5327DXK.js} +13 -17
  36. package/dist/{chunk-EZC2F5OT.cjs → chunk-QF464PPL.cjs} +39 -39
  37. package/dist/{chunk-UWQWMGJ7.cjs → chunk-RDP5UZXQ.cjs} +888 -565
  38. package/dist/{chunk-ETYLOZOB.cjs → chunk-RFUOIQSG.cjs} +100 -13
  39. package/dist/{chunk-DC4RTYWK.cjs → chunk-RZQGIWK3.cjs} +3 -3
  40. package/dist/{chunk-PQ6HBLZ7.js → chunk-TORERAXD.js} +105 -41
  41. package/dist/{chunk-6YPTUHM7.js → chunk-URW23QUM.js} +1 -1
  42. package/dist/{chunk-QBCDSTLE.cjs → chunk-UWJMDFDO.cjs} +18 -18
  43. package/dist/{chunk-YEMCCYIF.js → chunk-V6B2FBZK.js} +5 -5
  44. package/dist/{chunk-JIWMBIVZ.js → chunk-VBHGJFA3.js} +10 -10
  45. package/dist/{chunk-Z5UWW3Z2.cjs → chunk-VF2CJXZ2.cjs} +81 -65
  46. package/dist/{chunk-DEZDMTBM.js → chunk-VYVPII4W.js} +8 -10
  47. package/dist/{chunk-MM7MCIXL.js → chunk-VYZCKY5K.js} +9 -9
  48. package/dist/{chunk-E7YCPY7K.cjs → chunk-XSM46FHD.cjs} +3 -3
  49. package/dist/{chunk-NZ5BHDFZ.js → chunk-XW3Q623Q.js} +1 -1
  50. package/dist/{chunk-LOYPRJWA.js → chunk-YK3X74SF.js} +67 -51
  51. package/dist/{chunk-WALCXC7J.cjs → chunk-ZHD3F2TH.cjs} +3 -3
  52. package/dist/{chunk-KBJJQFYU.js → chunk-ZPHOQDAE.js} +1 -1
  53. package/dist/{cloud-tenants-TAKOWXLD.js → cloud-tenants-RKQRSDNE.js} +9 -9
  54. package/dist/{cloud-tenants-PFDF7O5U.cjs → cloud-tenants-UQZASXUB.cjs} +10 -10
  55. package/dist/components/case-studies/index.cjs +23 -23
  56. package/dist/components/case-studies/index.js +10 -10
  57. package/dist/components/chat/ask-prompts.d.ts +10 -2
  58. package/dist/components/chat/ask-prompts.d.ts.map +1 -1
  59. package/dist/components/chat/assistant-ask-prompts.d.ts +27 -0
  60. package/dist/components/chat/assistant-ask-prompts.d.ts.map +1 -0
  61. package/dist/components/chat/entity-cards/dispatch.d.ts.map +1 -1
  62. package/dist/components/chat/hooks/index.d.ts +1 -0
  63. package/dist/components/chat/hooks/index.d.ts.map +1 -1
  64. package/dist/components/chat/hooks/use-ask-prompts.d.ts +63 -0
  65. package/dist/components/chat/hooks/use-ask-prompts.d.ts.map +1 -0
  66. package/dist/components/chat/index.cjs +23 -6
  67. package/dist/components/chat/index.d.ts +1 -0
  68. package/dist/components/chat/index.d.ts.map +1 -1
  69. package/dist/components/chat/index.js +22 -5
  70. package/dist/components/chat/utils/icon-library.d.ts.map +1 -1
  71. package/dist/components/contact/index.cjs +11 -11
  72. package/dist/components/contact/index.js +10 -10
  73. package/dist/components/docs/index.cjs +14 -14
  74. package/dist/components/docs/index.js +13 -13
  75. package/dist/components/embeds/index.cjs +11 -11
  76. package/dist/components/embeds/index.js +10 -10
  77. package/dist/components/faq/faq-ask-card.d.ts +44 -0
  78. package/dist/components/faq/faq-ask-card.d.ts.map +1 -0
  79. package/dist/components/faq/faq-document-page.d.ts +5 -1
  80. package/dist/components/faq/faq-document-page.d.ts.map +1 -1
  81. package/dist/components/faq/faq-section.d.ts +18 -5
  82. package/dist/components/faq/faq-section.d.ts.map +1 -1
  83. package/dist/components/faq/index.cjs +13 -12
  84. package/dist/components/faq/index.d.ts +1 -0
  85. package/dist/components/faq/index.d.ts.map +1 -1
  86. package/dist/components/faq/index.js +12 -11
  87. package/dist/components/features/auth/auth-benefits-panel.d.ts.map +1 -1
  88. package/dist/components/features/index.cjs +10 -10
  89. package/dist/components/features/index.js +9 -9
  90. package/dist/components/features/remote-session/remote-desktop-view.d.ts +6 -2
  91. package/dist/components/features/remote-session/remote-desktop-view.d.ts.map +1 -1
  92. package/dist/components/help-center-pages/index.cjs +104 -105
  93. package/dist/components/help-center-pages/index.js +28 -29
  94. package/dist/components/help-center-pages/trust-center-page.d.ts +4 -1
  95. package/dist/components/help-center-pages/trust-center-page.d.ts.map +1 -1
  96. package/dist/components/index.cjs +109 -197
  97. package/dist/components/index.js +228 -316
  98. package/dist/components/meeting-scheduler/index.cjs +50 -51
  99. package/dist/components/meeting-scheduler/index.js +12 -13
  100. package/dist/components/navigation/index.cjs +13 -13
  101. package/dist/components/navigation/index.js +12 -12
  102. package/dist/components/navigation/mingo-ai-button.d.ts +1 -1
  103. package/dist/components/navigation/mingo-ai-button.d.ts.map +1 -1
  104. package/dist/components/onboarding-guides/index.cjs +13 -14
  105. package/dist/components/onboarding-guides/index.js +12 -13
  106. package/dist/components/product-demo/index.cjs +7 -7
  107. package/dist/components/product-demo/index.js +7 -7
  108. package/dist/components/related-content/index.cjs +5 -7
  109. package/dist/components/related-content/index.js +4 -6
  110. package/dist/components/related-content/related-content-section.d.ts +6 -6
  111. package/dist/components/related-content/related-content-section.d.ts.map +1 -1
  112. package/dist/components/tickets/index.cjs +15 -15
  113. package/dist/components/tickets/index.js +14 -14
  114. package/dist/components/ui/index.cjs +26 -10
  115. package/dist/components/ui/index.js +25 -9
  116. package/dist/contexts/assistant-runtime-context.d.ts +74 -0
  117. package/dist/contexts/assistant-runtime-context.d.ts.map +1 -0
  118. package/dist/contexts/index.cjs +7 -1
  119. package/dist/contexts/index.d.ts +1 -0
  120. package/dist/contexts/index.d.ts.map +1 -1
  121. package/dist/contexts/index.js +6 -0
  122. package/dist/{devices-KRCGZMGA.cjs → devices-7Q2EUM7B.cjs} +11 -11
  123. package/dist/{devices-LHEX7O5T.js → devices-U3Y4IIW4.js} +9 -9
  124. package/dist/hooks/index.cjs +3 -4
  125. package/dist/hooks/index.js +2 -3
  126. package/dist/hooks/use-self-fetch.d.ts +3 -0
  127. package/dist/hooks/use-self-fetch.d.ts.map +1 -1
  128. package/dist/index.cjs +34 -14
  129. package/dist/index.js +33 -13
  130. package/dist/{knowledge-RZSFNR33.js → knowledge-NST53EXE.js} +9 -9
  131. package/dist/{knowledge-KLVPVEYZ.cjs → knowledge-UYIZ74MA.cjs} +11 -11
  132. package/dist/{logs-OX3XTVL2.cjs → logs-HTH7X7KV.cjs} +18 -18
  133. package/dist/{logs-E5DOV5JO.js → logs-JVTRG232.js} +9 -9
  134. package/dist/{policies-MC2S4S5G.js → policies-DTXTRK56.js} +9 -9
  135. package/dist/{policies-FOSCIZGK.cjs → policies-MXK2HB4W.cjs} +14 -14
  136. package/dist/{remote-session-JQ2BPIE3.js → remote-session-LAJZKQBN.js} +3 -3
  137. package/dist/{remote-session-DRFE5XZE.cjs → remote-session-SKKF4PBV.cjs} +5 -5
  138. package/dist/{software-update-D4OEIH65.js → software-update-6RHMPM3W.js} +9 -9
  139. package/dist/{software-update-HOBSTWVO.cjs → software-update-P6BSM6HX.cjs} +14 -14
  140. package/dist/utils/index.cjs +26 -2
  141. package/dist/utils/index.d.ts +1 -0
  142. package/dist/utils/index.d.ts.map +1 -1
  143. package/dist/utils/index.js +25 -3
  144. package/dist/utils/list-url.d.ts.map +1 -1
  145. package/dist/utils/source-icons.d.ts.map +1 -1
  146. package/dist/utils/trial.d.ts +18 -0
  147. package/dist/utils/trial.d.ts.map +1 -0
  148. package/package.json +1 -1
  149. package/src/components/chat/ask-prompts.tsx +25 -3
  150. package/src/components/chat/assistant-ask-prompts.tsx +78 -0
  151. package/src/components/chat/entity-cards/dispatch.tsx +38 -4
  152. package/src/components/chat/hooks/index.ts +12 -0
  153. package/src/components/chat/hooks/use-ask-prompts.ts +188 -0
  154. package/src/components/chat/index.ts +1 -0
  155. package/src/components/chat/utils/icon-library.tsx +6 -0
  156. package/src/components/faq/faq-ask-card.tsx +115 -0
  157. package/src/components/faq/faq-document-page.tsx +6 -1
  158. package/src/components/faq/faq-section.tsx +27 -5
  159. package/src/components/faq/index.ts +1 -0
  160. package/src/components/features/auth/auth-benefits-panel.tsx +5 -4
  161. package/src/components/features/remote-session/remote-desktop-view.tsx +86 -63
  162. package/src/components/help-center-pages/trust-center-page.tsx +5 -2
  163. package/src/components/navigation/mingo-ai-button.tsx +27 -6
  164. package/src/components/related-content/related-content-section.tsx +46 -47
  165. package/src/contexts/assistant-runtime-context.tsx +84 -0
  166. package/src/contexts/index.ts +9 -0
  167. package/src/hooks/use-self-fetch.ts +7 -0
  168. package/src/utils/index.ts +1 -0
  169. package/src/utils/list-url.ts +4 -0
  170. package/src/utils/source-icons.ts +10 -2
  171. package/src/utils/trial.ts +19 -0
  172. package/dist/chunk-AUMKE74M.cjs +0 -16
  173. package/dist/chunk-G3GRYDMS.js +0 -16
  174. package/dist/chunk-GEDY7HQI.cjs +0 -85
  175. package/dist/chunk-YBQQNDC7.js +0 -85
@@ -15,33 +15,33 @@ import {
15
15
  PACKAGE_SEARCH_LABEL,
16
16
  PACKAGE_SEARCH_PLACEHOLDER,
17
17
  SoftwareActionForm
18
- } from "./chunk-N2PF5CFX.js";
18
+ } from "./chunk-7IOU6BJE.js";
19
19
  import "./chunk-ILNN6QRW.js";
20
20
  import "./chunk-LQYXMEYF.js";
21
21
  import "./chunk-4JPLYOS6.js";
22
22
  import {
23
23
  Autocomplete
24
- } from "./chunk-LOYPRJWA.js";
25
- import "./chunk-IWCPXJEE.js";
24
+ } from "./chunk-YK3X74SF.js";
25
+ import "./chunk-3HZ6XSZC.js";
26
26
  import "./chunk-3K5ZLZE7.js";
27
27
  import "./chunk-HFL2F4RM.js";
28
28
  import "./chunk-YYYVS7CX.js";
29
29
  import "./chunk-WSDT7LYL.js";
30
- import "./chunk-G3GRYDMS.js";
31
30
  import "./chunk-PLWMIU72.js";
32
- import "./chunk-JH2SIWPQ.js";
31
+ import "./chunk-PXAKSPLZ.js";
33
32
  import "./chunk-2NASBO7O.js";
34
- import "./chunk-KBJJQFYU.js";
33
+ import "./chunk-AFTRPEXO.js";
34
+ import "./chunk-ZPHOQDAE.js";
35
35
  import "./chunk-P3JMAMHP.js";
36
36
  import "./chunk-CMZ3QTFQ.js";
37
37
  import "./chunk-34I6XI3N.js";
38
38
  import "./chunk-GY4IZG22.js";
39
- import "./chunk-TTVOLEUS.js";
39
+ import "./chunk-GANIUMRU.js";
40
40
  import "./chunk-H3PKYE4N.js";
41
- import "./chunk-JHQ334WS.js";
41
+ import "./chunk-742BGXNX.js";
42
42
  import "./chunk-IYVFSLWJ.js";
43
43
  import "./chunk-FBZMAPWO.js";
44
- import "./chunk-AGVXKD4K.js";
44
+ import "./chunk-FSQQZFVG.js";
45
45
  import "./chunk-E4ABZWTJ.js";
46
46
  import "./chunk-KEKCQENI.js";
47
47
  import "./chunk-ADBE7QF3.js";
@@ -15,33 +15,33 @@ var _chunkKHXZFLINcjs = require('./chunk-KHXZFLIN.cjs');
15
15
 
16
16
 
17
17
 
18
- var _chunkZ3CVSPO3cjs = require('./chunk-Z3CVSPO3.cjs');
18
+ var _chunkDYDDAA6Ocjs = require('./chunk-DYDDAA6O.cjs');
19
19
  require('./chunk-4HJRHEXD.cjs');
20
20
  require('./chunk-HQQE74RO.cjs');
21
21
  require('./chunk-DEY6XXGO.cjs');
22
22
 
23
23
 
24
- var _chunkZ5UWW3Z2cjs = require('./chunk-Z5UWW3Z2.cjs');
25
- require('./chunk-ZXCZYMN4.cjs');
24
+ var _chunkVF2CJXZ2cjs = require('./chunk-VF2CJXZ2.cjs');
25
+ require('./chunk-4SIZCHVZ.cjs');
26
26
  require('./chunk-B4NCVYEQ.cjs');
27
27
  require('./chunk-MZ4KBSH7.cjs');
28
28
  require('./chunk-A6P6DHEZ.cjs');
29
29
  require('./chunk-WBNAEYTQ.cjs');
30
- require('./chunk-AUMKE74M.cjs');
31
30
  require('./chunk-LX22Y43B.cjs');
32
- require('./chunk-UWQWMGJ7.cjs');
31
+ require('./chunk-RDP5UZXQ.cjs');
33
32
  require('./chunk-KT3U3ZRP.cjs');
34
- require('./chunk-DC4RTYWK.cjs');
33
+ require('./chunk-EWPR7662.cjs');
34
+ require('./chunk-RZQGIWK3.cjs');
35
35
  require('./chunk-FFT56TYB.cjs');
36
36
  require('./chunk-GQ7JJUIT.cjs');
37
37
  require('./chunk-WVOTC7HW.cjs');
38
38
  require('./chunk-7DNL734S.cjs');
39
- require('./chunk-ETYLOZOB.cjs');
39
+ require('./chunk-RFUOIQSG.cjs');
40
40
  require('./chunk-AL2GUHAJ.cjs');
41
- require('./chunk-PSVSEN4J.cjs');
41
+ require('./chunk-IMTY3GRR.cjs');
42
42
  require('./chunk-F5BPGWGT.cjs');
43
43
  require('./chunk-MGHIV4L6.cjs');
44
- require('./chunk-AECTRMGQ.cjs');
44
+ require('./chunk-7GRPR7XA.cjs');
45
45
  require('./chunk-UJ7AXHRZ.cjs');
46
46
  require('./chunk-AAYNCJMW.cjs');
47
47
  require('./chunk-ULWVKHSI.cjs');
@@ -116,14 +116,14 @@ var noop = () => {
116
116
  var HIDDEN_WHEN_COMPACT = ["organization"];
117
117
  function StaticPackageField({ value }) {
118
118
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
119
- _chunkZ5UWW3Z2cjs.Autocomplete,
119
+ _chunkVF2CJXZ2cjs.Autocomplete,
120
120
  {
121
- label: _chunkZ3CVSPO3cjs.PACKAGE_SEARCH_LABEL,
121
+ label: _chunkDYDDAA6Ocjs.PACKAGE_SEARCH_LABEL,
122
122
  labelVariant: "large",
123
123
  options: value ? [{ value: value.id, label: value.name, description: _nullishCoalesce(value.description, () => ( void 0)) }] : [],
124
124
  value: _nullishCoalesce(_optionalChain([value, 'optionalAccess', _ => _.id]), () => ( null)),
125
125
  onChange: noop,
126
- placeholder: _chunkZ3CVSPO3cjs.PACKAGE_SEARCH_PLACEHOLDER
126
+ placeholder: _chunkDYDDAA6Ocjs.PACKAGE_SEARCH_PLACEHOLDER
127
127
  }
128
128
  );
129
129
  }
@@ -137,7 +137,7 @@ function SoftwareUpdateScreen({ compact = false }) {
137
137
  [fixture.devices, fixture.selectedIds]
138
138
  );
139
139
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full bg-ods-bg pt-[var(--spacing-system-l)]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
140
- _chunkZ3CVSPO3cjs.SoftwareActionForm,
140
+ _chunkDYDDAA6Ocjs.SoftwareActionForm,
141
141
  {
142
142
  action: fixture.action,
143
143
  showHeader: false,
@@ -149,7 +149,7 @@ function SoftwareUpdateScreen({ compact = false }) {
149
149
  initialValues: fixture.initialValues,
150
150
  renderPackageSearch,
151
151
  renderDevicePicker: () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
152
- _chunkZ3CVSPO3cjs.DeviceSelector,
152
+ _chunkDYDDAA6Ocjs.DeviceSelector,
153
153
  {
154
154
  devices: selected,
155
155
  loading: false,
@@ -654,6 +654,16 @@ function formatWebinarTimeMeta(at, opts) {
654
654
  const time = formatProgramTimeRange(at, { startAt: opts.startAt, withZoneLabel: opts.withZoneLabel });
655
655
  return [time, duration].filter(Boolean).join(" \xB7 ");
656
656
  }
657
+
658
+ // src/utils/trial.ts
659
+ var TRIAL_DAYS = 14;
660
+ var TRIAL_LABELS = {
661
+ /** "14 day free trial" */
662
+ length: `${TRIAL_DAYS} day free trial`,
663
+ noCard: "No card required",
664
+ cancel: "Cancel Anytime",
665
+ noContract: "No Contract"
666
+ };
657
667
  var PLAY_ICON_PATH = "M4.875 5.006c0-2.501 2.793-3.989 4.87-2.592l9.78 6.578c2.135 1.437 2.135 4.58 0 6.016l-9.78 6.579c-2.077 1.396-4.87-.091-4.87-2.593zm2.25 13.988c0 .7.783 1.118 1.364.727l9.78-6.58c.81-.545.81-1.738 0-2.283L8.488 4.28a.875.875 0 0 0-1.364.726v13.988Z";
658
668
 
659
669
  // src/utils/color-analysis.ts
@@ -3487,8 +3497,12 @@ var SOURCE_ICON_NAMES = {
3487
3497
  "audience-msp": "hierarchy-02",
3488
3498
  "audience-mssp": "shield-lock",
3489
3499
  "audience-it-team": "buildings",
3490
- // Trust (single-record live source over the public Vanta projection)
3491
- "trust-center": "shield",
3500
+ // Trust (single-record live source over the public Vanta projection): the icon its menu entry draws
3501
+ "trust-center": "shield-check",
3502
+ // The public website's own pages (live source): the site's own mark, as a glyph in the slot's colour
3503
+ "website-pages": "flamingo-logo-grey",
3504
+ // The OpenMSP vendor directory: the icon the site menu's "Tool directory" entry draws (it reads this one)
3505
+ vendors: "package-search",
3492
3506
  // Financials
3493
3507
  "investor-updates": "mail",
3494
3508
  "financial-kpis": "activity",
@@ -3551,6 +3565,8 @@ var SOURCE_LABELS_BY_TABLE = {
3551
3565
  faqs: "FAQs",
3552
3566
  // Trust
3553
3567
  "trust-center": "Trust Center",
3568
+ "website-pages": "Website",
3569
+ vendors: "Vendor Directory",
3554
3570
  // Financials
3555
3571
  "investor-updates": "Investor Updates",
3556
3572
  "financial-kpis": "Financial KPIs",
@@ -3618,6 +3634,8 @@ var DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID = {
3618
3634
  faq: "faqs",
3619
3635
  // Trust
3620
3636
  trust_center: "trust-center",
3637
+ site_page: "website-pages",
3638
+ vendor: "vendors",
3621
3639
  // Financials
3622
3640
  investor_update: "investor-updates",
3623
3641
  financial_kpi: "financial-kpis",
@@ -5169,6 +5187,10 @@ var BUILDERS = {
5169
5187
  design_doc: (ids, b) => `${b}/api/design-docs?ids=${ids.join(",")}`,
5170
5188
  openframe_tenant: (ids, b) => `${b}/api/openframe-tenants?ids=${ids.join(",")}`,
5171
5189
  prospect_call: (ids, b) => `${b}/api/prospect-calls?ids=${ids.join(",")}`,
5190
+ // The public website's own pages (live source; ChatRef-shaped items like the objects above).
5191
+ site_page: (ids, b) => `${b}/api/site-pages?ids=${ids.join(",")}`,
5192
+ // The OpenMSP vendor directory (indexed source).
5193
+ vendor: (ids, b) => `${b}/api/vendors/cards?ids=${ids.join(",")}`,
5172
5194
  // Code intelligence — per-object card hydration, same `handleEntityCardList`
5173
5195
  // shape as the internal objects above.
5174
5196
  code_rule: (ids, b) => `${b}/api/code-rules/cards?ids=${ids.join(",")}`,
@@ -6520,6 +6542,8 @@ exports.STICKY_HEADER_OFFSET_PX = STICKY_HEADER_OFFSET_PX;
6520
6542
  exports.TAILWIND_STEP_TO_ODS_TOKEN = TAILWIND_STEP_TO_ODS_TOKEN;
6521
6543
  exports.TICKET_OPEN_PARAM = TICKET_OPEN_PARAM;
6522
6544
  exports.TICKET_STATUS_OPTIONS = TICKET_STATUS_OPTIONS;
6545
+ exports.TRIAL_DAYS = TRIAL_DAYS;
6546
+ exports.TRIAL_LABELS = TRIAL_LABELS;
6523
6547
  exports.VENDOR_CLASSIFICATIONS = VENDOR_CLASSIFICATIONS;
6524
6548
  exports.VIEWER_TIMEZONE = VIEWER_TIMEZONE;
6525
6549
  exports.WALKTHROUGH_OPEN_QUERY_PARAM = WALKTHROUGH_OPEN_QUERY_PARAM;
@@ -1,6 +1,7 @@
1
1
  export { cn } from './cn';
2
2
  export { getPlatformUrl, getPlatformProductionUrl, getAllPlatformBaseDomains, getDeploymentUrl, getRequestOrigin, isLocalUrl, resolveRedirectTarget, } from '../platform-domains';
3
3
  export { formatDate, formatNumber, formatPrice, formatBytes } from './format';
4
+ export { TRIAL_DAYS, TRIAL_LABELS } from './trial';
4
5
  export { VENDOR_CLASSIFICATIONS, OPENFRAME_CLASSIFICATIONS, isVendorClassification, isOpenFrameClassification, type VendorClassificationValue, type OpenFrameClassification, type OpenFrameClassificationCopy, } from './vendor-classification';
5
6
  export { PLAY_ICON_PATH } from '../components/icons-v2-generated/media-playback/play-icon';
6
7
  export { getPlatformAccentColor, getCurrentPlatform, getPlatformConfig, usePlatformColors, switchPlatformTheme, getSemanticColor, type ColorCategory, HEX_PATTERN, getReadableTextColor, hexToRgb, rgbToHex, deriveHoverColor, deriveActiveColor, } from './ods-color-utils';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
@@ -648,6 +648,16 @@ function formatWebinarTimeMeta(at, opts) {
648
648
  const time = formatProgramTimeRange(at, { startAt: opts.startAt, withZoneLabel: opts.withZoneLabel });
649
649
  return [time, duration].filter(Boolean).join(" \xB7 ");
650
650
  }
651
+
652
+ // src/utils/trial.ts
653
+ var TRIAL_DAYS = 14;
654
+ var TRIAL_LABELS = {
655
+ /** "14 day free trial" */
656
+ length: `${TRIAL_DAYS} day free trial`,
657
+ noCard: "No card required",
658
+ cancel: "Cancel Anytime",
659
+ noContract: "No Contract"
660
+ };
651
661
  var PLAY_ICON_PATH = "M4.875 5.006c0-2.501 2.793-3.989 4.87-2.592l9.78 6.578c2.135 1.437 2.135 4.58 0 6.016l-9.78 6.579c-2.077 1.396-4.87-.091-4.87-2.593zm2.25 13.988c0 .7.783 1.118 1.364.727l9.78-6.58c.81-.545.81-1.738 0-2.283L8.488 4.28a.875.875 0 0 0-1.364.726v13.988Z";
652
662
 
653
663
  // src/utils/color-analysis.ts
@@ -3481,8 +3491,12 @@ var SOURCE_ICON_NAMES = {
3481
3491
  "audience-msp": "hierarchy-02",
3482
3492
  "audience-mssp": "shield-lock",
3483
3493
  "audience-it-team": "buildings",
3484
- // Trust (single-record live source over the public Vanta projection)
3485
- "trust-center": "shield",
3494
+ // Trust (single-record live source over the public Vanta projection): the icon its menu entry draws
3495
+ "trust-center": "shield-check",
3496
+ // The public website's own pages (live source): the site's own mark, as a glyph in the slot's colour
3497
+ "website-pages": "flamingo-logo-grey",
3498
+ // The OpenMSP vendor directory: the icon the site menu's "Tool directory" entry draws (it reads this one)
3499
+ vendors: "package-search",
3486
3500
  // Financials
3487
3501
  "investor-updates": "mail",
3488
3502
  "financial-kpis": "activity",
@@ -3545,6 +3559,8 @@ var SOURCE_LABELS_BY_TABLE = {
3545
3559
  faqs: "FAQs",
3546
3560
  // Trust
3547
3561
  "trust-center": "Trust Center",
3562
+ "website-pages": "Website",
3563
+ vendors: "Vendor Directory",
3548
3564
  // Financials
3549
3565
  "investor-updates": "Investor Updates",
3550
3566
  "financial-kpis": "Financial KPIs",
@@ -3612,6 +3628,8 @@ var DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID = {
3612
3628
  faq: "faqs",
3613
3629
  // Trust
3614
3630
  trust_center: "trust-center",
3631
+ site_page: "website-pages",
3632
+ vendor: "vendors",
3615
3633
  // Financials
3616
3634
  investor_update: "investor-updates",
3617
3635
  financial_kpi: "financial-kpis",
@@ -5163,6 +5181,10 @@ var BUILDERS = {
5163
5181
  design_doc: (ids, b) => `${b}/api/design-docs?ids=${ids.join(",")}`,
5164
5182
  openframe_tenant: (ids, b) => `${b}/api/openframe-tenants?ids=${ids.join(",")}`,
5165
5183
  prospect_call: (ids, b) => `${b}/api/prospect-calls?ids=${ids.join(",")}`,
5184
+ // The public website's own pages (live source; ChatRef-shaped items like the objects above).
5185
+ site_page: (ids, b) => `${b}/api/site-pages?ids=${ids.join(",")}`,
5186
+ // The OpenMSP vendor directory (indexed source).
5187
+ vendor: (ids, b) => `${b}/api/vendors/cards?ids=${ids.join(",")}`,
5166
5188
  // Code intelligence — per-object card hydration, same `handleEntityCardList`
5167
5189
  // shape as the internal objects above.
5168
5190
  code_rule: (ids, b) => `${b}/api/code-rules/cards?ids=${ids.join(",")}`,
@@ -6430,4 +6452,4 @@ function pathMatchesAny(pathname, patterns) {
6430
6452
  return (patterns ?? []).some((pattern) => matchesPathPattern(pathname, pattern));
6431
6453
  }
6432
6454
 
6433
- export { ACTIVE_ANCHOR_ATTRIBUTE, ANTHROPIC_SUPPORTED_IMAGE_MIME, AUTO_CONTINUATION_DIRECTIVE_PREFIX, BADGE_PALETTE, BITE_ID_RE, BRAND_MARK_SVGS, CHAT_ATTACHMENT_MARKDOWN_PATTERN, CHAT_ATTACHMENT_VIEW_TOKEN_QUERY_PARAM, CHAT_ATTACHMENT_VIEW_URL_PREFIX, CHAT_ATTACHMENT_VIEW_URL_PREFIX_REGEX_ESCAPED, COMPLIANCE_STANDARDS, CONTENT_REF_GROUPS, CSV_CONTENT_TYPE, CUSTOM_ITEM_ID, DEFAULT_CONTENT_SUFFIXES, DEFAULT_FOLDER_INDEX_FILE, DEFAULT_MIN_FILL_MS, DEFAULT_OS_PLATFORM, DELIVERY_TASK_TYPE_OPTIONS, DESIGN_DOC_READINESS, DESIGN_DOC_READINESS_DISPLAY, DESIGN_PALETTE, DESKTOP_OSES, DEV_SECTION_PARAM_KEYS, DOC_TABLE_TYPES, ELAPSED_MS_FIELD, EMBED_PROXY_OPTIONAL_HEADERS, FIRST_TOUCH_ATTRIBUTION_KEY, FORM_DRAFT_STATUSES, FORM_RESCUE_ATTEMPT_FIELD, FORM_RESCUE_DEBOUNCE_MS, FORM_RESCUE_EVENTS, FORM_RESCUE_MAX_FIELDS, FORM_RESCUE_MAX_VALUE_CHARS, FORM_RESCUE_RESUME_FIELD, FORM_RESCUE_RESUME_PARAM, FORM_RESCUE_SKIP_REASONS, FORM_RESCUE_SUBMIT_KEYS, FORM_RESCUE_VALUE_FIELDS, FullscreenSwitchController, GENERIC_EMAIL_DOMAINS, HEADING_EMOJI_RE, HEX_PATTERN, HONEYPOT_FIELD, HUBSPOT_DO_NOT_COLLECT_FORM_PROPS, HUB_HEADER_OFFSET_PX, HUMANITY_SIGNAL_KEYS, ICON_REGISTRY, IMAGE_FILE_ACCEPT, LOCATION_HASH_SYNC_EVENT, MAX_MONTH_OFFSET, MEDIA_FILE_ACCEPT, MEDIA_TYPE, NO_CLIENT_CACHE, ODS_SPACING_PROPS, ODS_SPACING_TOKENS, ODS_SPACING_TOKEN_PATTERN, ODS_STEM_CLASSES, ODS_STEM_TOKENS, OPENFRAME_CLASSIFICATIONS, OPENFRAME_DEV_SECTIONS, OS_PLATFORMS, PAGE_PARAM_LIMITS, PLATFORM_BRAND, PLATFORM_SURFACE, PLATFORM_THEME, PLAY_ICON_PATH, PROGRAM_META_RENDERERS, RESCUE_FORMS, ROADMAP_STATUS_OPTIONS, SCHEDULING_SLUG_SHAPE, SCROLL_ANCHOR, SCROLL_ANCHOR_WIRE_KEY, SECTION_HERO_ICON_CLASS, SEO_DESCRIPTION_MAX_LENGTH, SEO_TITLE_MAX_LENGTH, SOCIAL_PLATFORM_ALIASES, SOCIAL_PLATFORM_ALT_HOSTS, SOURCE_ICON_NAMES, SOURCE_LABELS_BY_TABLE, STICKY_HEADER_OFFSET_PX, TAILWIND_STEP_TO_ODS_TOKEN, TICKET_OPEN_PARAM, TICKET_STATUS_OPTIONS, VENDOR_CLASSIFICATIONS, VIEWER_TIMEZONE, WALKTHROUGH_OPEN_QUERY_PARAM, WALKTHROUGH_VIDEO_DISMISS_KEY, analyzeImageColor, announcementDismissCookieName, applyProxyAuth, brandMarkDataUri, buildAutoContinuationDirective, buildChatAttachmentViewUrl, buildDefaultHref, buildDiscussAddendum, buildDocumentTree, buildGroupedSource, buildListUrl, buildOgPlaceholderUrl, buildSuggestionUrl, buildTicketOpenHref, canonicalContentRefType, captureFirstTouchAttribution, captureFormRescueEvent, clamp, clampPageToTotal, classifySocialHost, cleanEmailDomain, clearAnnouncementDismissals, clearDismissCookie, clearEmbedProxyAuth, clearFirstTouchAttribution, clearLegacyAnnouncementCache, clearWalkthroughDismissal, clickupTaskUrl, cn, complianceStandardForName, consumeAccessCode, copyrightLine, createFenceTracker, createHeadingIdDeduper, createSearchParams, createSseSubscription, createUTCTimestamp, csvEscape, deepClone, defineParamSchema, defineRescueForm, delay, deriveActiveColor, deriveHoverColor, designDocReadiness, desktopOsOf, detectDesktopOs, detectVisitorOs, devSectionAnchorId, dismissAnnouncement, dismissWalkthrough, embedAuthedFetch, ensureBiteIds, errorMessage, escapeMarkdownInline, escapeRegExp, evaluateHumanitySignals, eventAudience, extractCardItems, extractDomainFromEmail, extractDominantColor, extractEntityIdFilter, extractHumanitySignals, extractImageEdgeColorAsync, extractItemId, extractItems, extractSections, faqItemAnchor, faqSectionSlug, fetchPriorityProp, fileContentKey, fileMediaType, filledRescueFields, findAnchorElementByNormalizedId, findDocNodeByPath, findHoneypotCopySource, firstParamValue, flattenAssistantContent, formatAbbreviatedNumber, formatAbsoluteDate, formatBioText, formatBytes, formatBytesShort, formatChatAttachmentMarkdownForBubble, formatCitationIndices, formatClassification, formatCompactMetric, formatCompletionLabel, formatCompletionLabelWithBlockers, formatCurrency, formatDate, formatDateRange, formatDateShort, formatDateSlashUTC, formatDateTime, formatDateTimeAt, formatDateTimeYmd, formatDateUTC, formatDateWithTimezone, formatDocName, formatDuration, formatDurationCompact, formatDurationFromMs, formatDurationFromRange, formatDurationMMSS, formatEntryMonthUTC, formatFileSize, formatLargeNumber, formatLegalDate, formatNumber, formatPercent, formatPhoneE164, formatPrice, formatPricingModel, formatProgramDate, formatProgramDateRange, formatProgramTimeRange, formatRelativeTime, formatReleaseDate, formatSingularLookupInvocation, formatTicketFullTimestamp, formatTicketRelativeTime, formatTimeWithTimezone, formatUnderscoreText, formatWebinarTimeMeta, formatWholeDollars, fromKeys, generateBiteId, generateImageSizes, generateRandomString, getAllPlatformBaseDomains, getBestContrastColor, getConfidenceBgClass, getConfidenceBorderClass, getConfidenceColorClass, getConfidenceLabel, getConfidenceLevel, getConfidenceTextClass, getContentRefLabel, getContentRefLabelOrTitleCase, getContrastRatio, getCountryByCode, getCountryByName, getCountryPhoneData, getCurrentPlatform, getDefaultColorForPlatform, getDefaultIconForPlatform, getDeploymentUrl, getDetailedTimeDifference, getDocAncestorNodeIds, getDocSourceDefaultPath, getDynamicIcon, getEmbedProxyAuth, getFirstTouchAttribution, getFlagFromCountryName, getIconComponent, getInitialExpandedNodeIds, getOSIcon, getOSLabel, getOSPlatformId, getOSTypeDefinition, getPersistedProxyEmail, getPlatformAccentColor, getPlatformBackgroundVarName, getPlatformBrand, getPlatformBrandClasses, getPlatformColor, getPlatformConfig, getPlatformDescription, getPlatformDisplayName, getPlatformIcon, getPlatformIconComponent, getPlatformIconComponent as getPlatformLogo, getPlatformProductionUrl, getPlatformSecondaryColor, getPlatformShortName, getPlatformSlogan, getPlatformTextVarName, getPlatformUrl, getProxiedImageUrl, getReadableTextColor, getRequestOrigin, getRescueForm, getSemanticColor, getShellIcon, getShellLabel, getSlackCommunityJoinUrl, getSmallPlatformIcon, getSourceIconName, getSourceLabel, getStatusColorScheme, getTaskTypeLabel, getToolLabel, getToolTypeAliases, getTrendColors, groupSourcesByTable, groupsByTable, hasGenericEmailDomain, hexToRgb2 as hexToRgb, hostMatches, isAnnouncementDismissed, isBadgePaletteKey, isBlankLine, isCrossOriginUrl, isDismissedCookieValue, isExcludedRescueField, isFigmaSlidesUrl, isFormAttemptId, isGenericDomain, isGenericWebsiteDomain, isHumanitySignalKey, isImageMedia, isListedSchedulingName, isLocalUrl, isOSPlatform, isOpenFrameClassification, isOrderedRange, isPublishableMediaType, isRescueEmail, isResumeToken, isScrollSyncedHash, isToday, isValidEmailDomain, isValidPathPattern, isValidSchedulingSlug, isValidToolType, isVendorClassification, isVideoMedia, isWalkthroughDismissed, isWithinMinutes, listRescueForms, makeComposeContentUrl, markdownToPlainText, matchBiteElement, matchesPathPattern, mediaNameKey, nameInitials, navigateSamePageHash, normalizeAnchorId, normalizeDocPath, normalizeDomain, normalizeHashFragment, normalizeIconKey, normalizeOSType, normalizeSchedulingSlug, normalizeSocialPlatform, normalizeToolType, normalizeToolTypeWithFallback, openInNewTab, orderContentRefTypes, pageCount, parseAttributionFromUrl, parseFaqHash, parseFormDraftSaveRequest, parseSchedulingLinkName, parseSchemaParams, parseScrollAnchor, parseWireCommandOverride, partitionMediaByType, pathMatchesAny, pathToNodeId, personFirstName, personInitials, pick, pickBadgePaletteColor, pickReadableTextColor, pickSocialLink, platformAccentToken, platformAccentVarName, platformColors, platformDescriptions, platformDisplayNames, platformHexColors, platformIconNames, platformIcons, platformSecondaryToken, platformSecondaryVarName, platformShortNames, platformSlogans, positiveInt, programDateInstant, programMetaFormatters, programMetaLine, programStr, readDismissCookie, readLeadingDecisionFrame, recordCountLabel, releaseTypeToBadgeColor, replaceLocationHash, rescueCompletionPct, resolveContentFetchPath, resolveRedirectTarget, resolveReleaseCover, rgbToHex, sanitizeLandingUrl, sanitizeRescueFieldName, sanitizeRescueValues, sanitizeTitleForChat, scanHeadings, schedulingAudienceKey, scrollElementIntoView, serializeJsonLd, serializeSchemaParams, setEmbedAuthAdapter, setEmbedProxyAuth, shortcutLabel, shouldIncludeInUrl, shouldProxyImage, singleInitial, skipsImageOptimizer, slugifyHeadingBase, slugifyHeadingText, socialPlatformHosts, sortTreeChildren, splitCsvEnv, stripChatAttachmentMarkdown, stripFolderIndexFromPath, stripHeadingEmojis, stripHtml, stripInlineMarkdown, switchPlatformTheme, titleCaseFromSlug, toClaudeEmbedUrl, toClaudeMirrorPath, toCsv, toDocSlug, toFigmaEmbedUrl, toFigmaOriginalUrl, toGoogleSheetsEmbedUrl, toGoogleSheetsOriginalUrl, toToolLabel, transformPlatformConfigsToOptions, truncateString, urlPathLooksLikeSvg, usePlatformColors, usesCommandKey, validateAccessCode, validateAndConsumeAccessCode, validateEmailDomain, validateEmailDomainList, validatePhoneNumber, walkthroughDismissCookieName, webinarTiming, withFirstTouchAttribution, withQuery, withWalkthroughOpenParam, writeDismissCookie };
6455
+ export { ACTIVE_ANCHOR_ATTRIBUTE, ANTHROPIC_SUPPORTED_IMAGE_MIME, AUTO_CONTINUATION_DIRECTIVE_PREFIX, BADGE_PALETTE, BITE_ID_RE, BRAND_MARK_SVGS, CHAT_ATTACHMENT_MARKDOWN_PATTERN, CHAT_ATTACHMENT_VIEW_TOKEN_QUERY_PARAM, CHAT_ATTACHMENT_VIEW_URL_PREFIX, CHAT_ATTACHMENT_VIEW_URL_PREFIX_REGEX_ESCAPED, COMPLIANCE_STANDARDS, CONTENT_REF_GROUPS, CSV_CONTENT_TYPE, CUSTOM_ITEM_ID, DEFAULT_CONTENT_SUFFIXES, DEFAULT_FOLDER_INDEX_FILE, DEFAULT_MIN_FILL_MS, DEFAULT_OS_PLATFORM, DELIVERY_TASK_TYPE_OPTIONS, DESIGN_DOC_READINESS, DESIGN_DOC_READINESS_DISPLAY, DESIGN_PALETTE, DESKTOP_OSES, DEV_SECTION_PARAM_KEYS, DOC_TABLE_TYPES, ELAPSED_MS_FIELD, EMBED_PROXY_OPTIONAL_HEADERS, FIRST_TOUCH_ATTRIBUTION_KEY, FORM_DRAFT_STATUSES, FORM_RESCUE_ATTEMPT_FIELD, FORM_RESCUE_DEBOUNCE_MS, FORM_RESCUE_EVENTS, FORM_RESCUE_MAX_FIELDS, FORM_RESCUE_MAX_VALUE_CHARS, FORM_RESCUE_RESUME_FIELD, FORM_RESCUE_RESUME_PARAM, FORM_RESCUE_SKIP_REASONS, FORM_RESCUE_SUBMIT_KEYS, FORM_RESCUE_VALUE_FIELDS, FullscreenSwitchController, GENERIC_EMAIL_DOMAINS, HEADING_EMOJI_RE, HEX_PATTERN, HONEYPOT_FIELD, HUBSPOT_DO_NOT_COLLECT_FORM_PROPS, HUB_HEADER_OFFSET_PX, HUMANITY_SIGNAL_KEYS, ICON_REGISTRY, IMAGE_FILE_ACCEPT, LOCATION_HASH_SYNC_EVENT, MAX_MONTH_OFFSET, MEDIA_FILE_ACCEPT, MEDIA_TYPE, NO_CLIENT_CACHE, ODS_SPACING_PROPS, ODS_SPACING_TOKENS, ODS_SPACING_TOKEN_PATTERN, ODS_STEM_CLASSES, ODS_STEM_TOKENS, OPENFRAME_CLASSIFICATIONS, OPENFRAME_DEV_SECTIONS, OS_PLATFORMS, PAGE_PARAM_LIMITS, PLATFORM_BRAND, PLATFORM_SURFACE, PLATFORM_THEME, PLAY_ICON_PATH, PROGRAM_META_RENDERERS, RESCUE_FORMS, ROADMAP_STATUS_OPTIONS, SCHEDULING_SLUG_SHAPE, SCROLL_ANCHOR, SCROLL_ANCHOR_WIRE_KEY, SECTION_HERO_ICON_CLASS, SEO_DESCRIPTION_MAX_LENGTH, SEO_TITLE_MAX_LENGTH, SOCIAL_PLATFORM_ALIASES, SOCIAL_PLATFORM_ALT_HOSTS, SOURCE_ICON_NAMES, SOURCE_LABELS_BY_TABLE, STICKY_HEADER_OFFSET_PX, TAILWIND_STEP_TO_ODS_TOKEN, TICKET_OPEN_PARAM, TICKET_STATUS_OPTIONS, TRIAL_DAYS, TRIAL_LABELS, VENDOR_CLASSIFICATIONS, VIEWER_TIMEZONE, WALKTHROUGH_OPEN_QUERY_PARAM, WALKTHROUGH_VIDEO_DISMISS_KEY, analyzeImageColor, announcementDismissCookieName, applyProxyAuth, brandMarkDataUri, buildAutoContinuationDirective, buildChatAttachmentViewUrl, buildDefaultHref, buildDiscussAddendum, buildDocumentTree, buildGroupedSource, buildListUrl, buildOgPlaceholderUrl, buildSuggestionUrl, buildTicketOpenHref, canonicalContentRefType, captureFirstTouchAttribution, captureFormRescueEvent, clamp, clampPageToTotal, classifySocialHost, cleanEmailDomain, clearAnnouncementDismissals, clearDismissCookie, clearEmbedProxyAuth, clearFirstTouchAttribution, clearLegacyAnnouncementCache, clearWalkthroughDismissal, clickupTaskUrl, cn, complianceStandardForName, consumeAccessCode, copyrightLine, createFenceTracker, createHeadingIdDeduper, createSearchParams, createSseSubscription, createUTCTimestamp, csvEscape, deepClone, defineParamSchema, defineRescueForm, delay, deriveActiveColor, deriveHoverColor, designDocReadiness, desktopOsOf, detectDesktopOs, detectVisitorOs, devSectionAnchorId, dismissAnnouncement, dismissWalkthrough, embedAuthedFetch, ensureBiteIds, errorMessage, escapeMarkdownInline, escapeRegExp, evaluateHumanitySignals, eventAudience, extractCardItems, extractDomainFromEmail, extractDominantColor, extractEntityIdFilter, extractHumanitySignals, extractImageEdgeColorAsync, extractItemId, extractItems, extractSections, faqItemAnchor, faqSectionSlug, fetchPriorityProp, fileContentKey, fileMediaType, filledRescueFields, findAnchorElementByNormalizedId, findDocNodeByPath, findHoneypotCopySource, firstParamValue, flattenAssistantContent, formatAbbreviatedNumber, formatAbsoluteDate, formatBioText, formatBytes, formatBytesShort, formatChatAttachmentMarkdownForBubble, formatCitationIndices, formatClassification, formatCompactMetric, formatCompletionLabel, formatCompletionLabelWithBlockers, formatCurrency, formatDate, formatDateRange, formatDateShort, formatDateSlashUTC, formatDateTime, formatDateTimeAt, formatDateTimeYmd, formatDateUTC, formatDateWithTimezone, formatDocName, formatDuration, formatDurationCompact, formatDurationFromMs, formatDurationFromRange, formatDurationMMSS, formatEntryMonthUTC, formatFileSize, formatLargeNumber, formatLegalDate, formatNumber, formatPercent, formatPhoneE164, formatPrice, formatPricingModel, formatProgramDate, formatProgramDateRange, formatProgramTimeRange, formatRelativeTime, formatReleaseDate, formatSingularLookupInvocation, formatTicketFullTimestamp, formatTicketRelativeTime, formatTimeWithTimezone, formatUnderscoreText, formatWebinarTimeMeta, formatWholeDollars, fromKeys, generateBiteId, generateImageSizes, generateRandomString, getAllPlatformBaseDomains, getBestContrastColor, getConfidenceBgClass, getConfidenceBorderClass, getConfidenceColorClass, getConfidenceLabel, getConfidenceLevel, getConfidenceTextClass, getContentRefLabel, getContentRefLabelOrTitleCase, getContrastRatio, getCountryByCode, getCountryByName, getCountryPhoneData, getCurrentPlatform, getDefaultColorForPlatform, getDefaultIconForPlatform, getDeploymentUrl, getDetailedTimeDifference, getDocAncestorNodeIds, getDocSourceDefaultPath, getDynamicIcon, getEmbedProxyAuth, getFirstTouchAttribution, getFlagFromCountryName, getIconComponent, getInitialExpandedNodeIds, getOSIcon, getOSLabel, getOSPlatformId, getOSTypeDefinition, getPersistedProxyEmail, getPlatformAccentColor, getPlatformBackgroundVarName, getPlatformBrand, getPlatformBrandClasses, getPlatformColor, getPlatformConfig, getPlatformDescription, getPlatformDisplayName, getPlatformIcon, getPlatformIconComponent, getPlatformIconComponent as getPlatformLogo, getPlatformProductionUrl, getPlatformSecondaryColor, getPlatformShortName, getPlatformSlogan, getPlatformTextVarName, getPlatformUrl, getProxiedImageUrl, getReadableTextColor, getRequestOrigin, getRescueForm, getSemanticColor, getShellIcon, getShellLabel, getSlackCommunityJoinUrl, getSmallPlatformIcon, getSourceIconName, getSourceLabel, getStatusColorScheme, getTaskTypeLabel, getToolLabel, getToolTypeAliases, getTrendColors, groupSourcesByTable, groupsByTable, hasGenericEmailDomain, hexToRgb2 as hexToRgb, hostMatches, isAnnouncementDismissed, isBadgePaletteKey, isBlankLine, isCrossOriginUrl, isDismissedCookieValue, isExcludedRescueField, isFigmaSlidesUrl, isFormAttemptId, isGenericDomain, isGenericWebsiteDomain, isHumanitySignalKey, isImageMedia, isListedSchedulingName, isLocalUrl, isOSPlatform, isOpenFrameClassification, isOrderedRange, isPublishableMediaType, isRescueEmail, isResumeToken, isScrollSyncedHash, isToday, isValidEmailDomain, isValidPathPattern, isValidSchedulingSlug, isValidToolType, isVendorClassification, isVideoMedia, isWalkthroughDismissed, isWithinMinutes, listRescueForms, makeComposeContentUrl, markdownToPlainText, matchBiteElement, matchesPathPattern, mediaNameKey, nameInitials, navigateSamePageHash, normalizeAnchorId, normalizeDocPath, normalizeDomain, normalizeHashFragment, normalizeIconKey, normalizeOSType, normalizeSchedulingSlug, normalizeSocialPlatform, normalizeToolType, normalizeToolTypeWithFallback, openInNewTab, orderContentRefTypes, pageCount, parseAttributionFromUrl, parseFaqHash, parseFormDraftSaveRequest, parseSchedulingLinkName, parseSchemaParams, parseScrollAnchor, parseWireCommandOverride, partitionMediaByType, pathMatchesAny, pathToNodeId, personFirstName, personInitials, pick, pickBadgePaletteColor, pickReadableTextColor, pickSocialLink, platformAccentToken, platformAccentVarName, platformColors, platformDescriptions, platformDisplayNames, platformHexColors, platformIconNames, platformIcons, platformSecondaryToken, platformSecondaryVarName, platformShortNames, platformSlogans, positiveInt, programDateInstant, programMetaFormatters, programMetaLine, programStr, readDismissCookie, readLeadingDecisionFrame, recordCountLabel, releaseTypeToBadgeColor, replaceLocationHash, rescueCompletionPct, resolveContentFetchPath, resolveRedirectTarget, resolveReleaseCover, rgbToHex, sanitizeLandingUrl, sanitizeRescueFieldName, sanitizeRescueValues, sanitizeTitleForChat, scanHeadings, schedulingAudienceKey, scrollElementIntoView, serializeJsonLd, serializeSchemaParams, setEmbedAuthAdapter, setEmbedProxyAuth, shortcutLabel, shouldIncludeInUrl, shouldProxyImage, singleInitial, skipsImageOptimizer, slugifyHeadingBase, slugifyHeadingText, socialPlatformHosts, sortTreeChildren, splitCsvEnv, stripChatAttachmentMarkdown, stripFolderIndexFromPath, stripHeadingEmojis, stripHtml, stripInlineMarkdown, switchPlatformTheme, titleCaseFromSlug, toClaudeEmbedUrl, toClaudeMirrorPath, toCsv, toDocSlug, toFigmaEmbedUrl, toFigmaOriginalUrl, toGoogleSheetsEmbedUrl, toGoogleSheetsOriginalUrl, toToolLabel, transformPlatformConfigsToOptions, truncateString, urlPathLooksLikeSvg, usePlatformColors, usesCommandKey, validateAccessCode, validateAndConsumeAccessCode, validateEmailDomain, validateEmailDomainList, validatePhoneNumber, walkthroughDismissCookieName, webinarTiming, withFirstTouchAttribution, withQuery, withWalkthroughOpenParam, writeDismissCookie };
@@ -1 +1 @@
1
- {"version":3,"file":"list-url.d.ts","sourceRoot":"","sources":["../../src/utils/list-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAaH;;;;iEAIiE;AACjE,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAKtE;AAsFD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,SAAK,GAAG,MAAM,GAAG,IAAI,CAa5F"}
1
+ {"version":3,"file":"list-url.d.ts","sourceRoot":"","sources":["../../src/utils/list-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAaH;;;;iEAIiE;AACjE,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAKtE;AA0FD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,SAAK,GAAG,MAAM,GAAG,IAAI,CAa5F"}
@@ -1 +1 @@
1
- {"version":3,"file":"source-icons.d.ts","sourceRoot":"","sources":["../../src/utils/source-icons.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgFpD,CAAC;AAEF;;6DAE6D;AAC7D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGxF;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyEzD,CAAC;AAEF;;kEAEkE;AAClE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAmEpE,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEjF;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK5E"}
1
+ {"version":3,"file":"source-icons.d.ts","sourceRoot":"","sources":["../../src/utils/source-icons.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoFpD,CAAC;AAEF;;6DAE6D;AAC7D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGxF;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA2EzD,CAAC;AAEF;;kEAEkE;AAClE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAqEpE,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEjF;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK5E"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The free trial's facts and the words every surface says them with: the
3
+ * sign-up panel here, and the host site's trial buttons, trust rows and pricing
4
+ * copy. Stated once, so a trial that changes length changes everywhere.
5
+ *
6
+ * Server-safe (no React, no DOM).
7
+ */
8
+ /** How long the free trial runs, in days. */
9
+ export declare const TRIAL_DAYS = 14;
10
+ /** The reassurance labels shown beside a trial button. */
11
+ export declare const TRIAL_LABELS: {
12
+ /** "14 day free trial" */
13
+ readonly length: "14 day free trial";
14
+ readonly noCard: "No card required";
15
+ readonly cancel: "Cancel Anytime";
16
+ readonly noContract: "No Contract";
17
+ };
18
+ //# sourceMappingURL=trial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trial.d.ts","sourceRoot":"","sources":["../../src/utils/trial.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,6CAA6C;AAC7C,eAAO,MAAM,UAAU,KAAK,CAAC;AAE7B,0DAA0D;AAC1D,eAAO,MAAM,YAAY;IACvB,0BAA0B;;;;;CAKlB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.718",
3
+ "version": "0.0.720",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -35,6 +35,12 @@ export interface AskPromptsProps {
35
35
  label?: string;
36
36
  /** The assistant's configured glyph. Absent: the packaged Mingo mark. */
37
37
  icon?: ReactNode;
38
+ /**
39
+ * How a question opens the chat and asks it. Absent: the `ask-ai:open`
40
+ * event of `source` (`openAskAi`). The launcher beside the questions takes
41
+ * its opener from the assistant runtime, never from here.
42
+ */
43
+ onOpen?: (request: { prompt?: string }) => void;
38
44
  /** After the chat was asked (analytics). */
39
45
  onAsk?: (prompt: AskPrompt) => void;
40
46
  /** The surface the row sits on, as a CSS colour: what its edge fade dissolves into. Default: the page background. */
@@ -86,9 +92,13 @@ function QuestionChips({
86
92
  count,
87
93
  loading,
88
94
  source,
95
+ onOpen,
89
96
  onAsk,
90
97
  slotClassName,
91
- }: Pick<AskPromptsProps, 'prompts' | 'loading' | 'source' | 'onAsk'> & { count: number; slotClassName?: string }) {
98
+ }: Pick<AskPromptsProps, 'prompts' | 'loading' | 'source' | 'onOpen' | 'onAsk'> & {
99
+ count: number;
100
+ slotClassName?: string;
101
+ }) {
92
102
  return (
93
103
  <>
94
104
  {Array.from({ length: count }, (_, slot) => {
@@ -106,7 +116,9 @@ function QuestionChips({
106
116
  label={prompt.label}
107
117
  icon={prompt.icon}
108
118
  onSelect={() => {
109
- openAskAi(source, { prompt: prompt.prompt ?? prompt.label });
119
+ const request = { prompt: prompt.prompt ?? prompt.label };
120
+ if (onOpen) onOpen(request);
121
+ else openAskAi(source, request);
110
122
  onAsk?.(prompt);
111
123
  }}
112
124
  />
@@ -137,6 +149,7 @@ export function AskPrompts({
137
149
  source,
138
150
  label,
139
151
  icon,
152
+ onOpen,
140
153
  onAsk,
141
154
  fadeColor,
142
155
  className,
@@ -157,6 +170,7 @@ export function AskPrompts({
157
170
  count={count}
158
171
  loading={loading}
159
172
  source={source}
173
+ onOpen={onOpen}
160
174
  onAsk={onAsk}
161
175
  slotClassName={cn(ROW_CHIP_SLOT_CLASS, end && 'content-md:justify-end')}
162
176
  />
@@ -189,6 +203,7 @@ export function AskCard({
189
203
  source,
190
204
  label,
191
205
  icon,
206
+ onOpen,
192
207
  onAsk,
193
208
  shortcutHint = true,
194
209
  className,
@@ -210,7 +225,14 @@ export function AskCard({
210
225
  </div>
211
226
  {(loading || prompts.length > 0) && (
212
227
  <div className="flex min-w-0 flex-col items-start gap-2">
213
- <QuestionChips prompts={prompts} count={count} loading={loading} source={source} onAsk={onAsk} />
228
+ <QuestionChips
229
+ prompts={prompts}
230
+ count={count}
231
+ loading={loading}
232
+ source={source}
233
+ onOpen={onOpen}
234
+ onAsk={onAsk}
235
+ />
214
236
  </div>
215
237
  )}
216
238
  <MingoAiButton
@@ -0,0 +1,78 @@
1
+ 'use client';
2
+
3
+ import { useMemo } from 'react';
4
+ import {
5
+ AssistantRuntimeContext,
6
+ useAssistantRuntime,
7
+ type AssistantOpenRequest,
8
+ } from '../../contexts/assistant-runtime-context';
9
+ import { AskPrompts, type AskPromptsProps } from './ask-prompts';
10
+ import {
11
+ assistantAvailable,
12
+ ASK_PROMPTS_DEFAULT_COUNT,
13
+ useAskPrompts,
14
+ useAssistantOpen,
15
+ useShownAskPrompts,
16
+ } from './hooks/use-ask-prompts';
17
+
18
+ export interface AssistantAskPromptsProps extends Pick<AskPromptsProps, 'align' | 'fadeColor' | 'className'> {
19
+ /** What this row is about: any string the host's questions endpoint knows. Reported with every click. */
20
+ topic?: string;
21
+ /** How many questions the row offers: the same number of slots on every load. */
22
+ count?: number;
23
+ /** The launcher's name. Absent: the assistant's configured name, else the launcher's default. */
24
+ label?: string;
25
+ /** Something else the row waits for (the host is still reading the name it will show). */
26
+ loading?: boolean;
27
+ /** How the chat is opened from THIS row. Absent: the assistant runtime's opener. */
28
+ onOpen?: (request: AssistantOpenRequest) => void;
29
+ }
30
+
31
+ /**
32
+ * A row of questions for the host's assistant, wired by itself: the launcher
33
+ * with the assistant's name and glyph, then the questions the host picked for
34
+ * this row's `topic`, each opening the chat and asking it. Everything comes
35
+ * from the nearest assistant runtime (`AssistantRuntimeContext`): whether a
36
+ * chat is there, the identity, the questions endpoint and the opener. While
37
+ * the pick is on its way the row is the SAME block (a chip skeleton in every
38
+ * slot), so nothing moves when the questions land. The row tells the page
39
+ * which questions it shows, so the FAQ's card never repeats one. Nothing
40
+ * renders with no chat, or once the pick has settled empty.
41
+ */
42
+ export function AssistantAskPrompts({
43
+ topic,
44
+ count = ASK_PROMPTS_DEFAULT_COUNT,
45
+ label,
46
+ loading = false,
47
+ onOpen,
48
+ align,
49
+ fadeColor,
50
+ className,
51
+ }: AssistantAskPromptsProps) {
52
+ const assistant = useAssistantRuntime();
53
+ const { prompts, isLoading, supported } = useAskPrompts({ topic, count });
54
+ const open = useAssistantOpen(topic, onOpen);
55
+ const shown = assistantAvailable(assistant) && supported;
56
+ // Nothing to say where the row shows nothing; `null` while its pick is on its way.
57
+ useShownAskPrompts(shown ? (isLoading ? null : prompts.map(prompt => prompt.id)) : undefined);
58
+ // The row's launcher opens the same chat as its questions, with the row's topic: it reads the runtime.
59
+ const scoped = useMemo(() => (assistant ? { ...assistant, open } : null), [assistant, open]);
60
+ if (!assistantAvailable(assistant) || !supported) return null;
61
+ return (
62
+ <AssistantRuntimeContext.Provider value={scoped}>
63
+ <AskPrompts
64
+ prompts={prompts}
65
+ loading={isLoading || loading}
66
+ count={count}
67
+ source={assistant.source}
68
+ label={label ?? assistant.name ?? undefined}
69
+ icon={assistant.icon}
70
+ onOpen={open}
71
+ onAsk={prompt => assistant.onAsk?.({ promptId: prompt.id, topic })}
72
+ align={align}
73
+ fadeColor={fadeColor}
74
+ className={className}
75
+ />
76
+ </AssistantRuntimeContext.Provider>
77
+ );
78
+ }
@@ -56,6 +56,7 @@ import { faqItemAnchor } from '../../../utils/faq-anchor';
56
56
  import { formatDateUTC as formatDate } from '../../../utils/format';
57
57
  import { programMetaFormatters, programMetaLine } from '../../../utils/program-instant';
58
58
  import { PROGRAM_META_RENDERERS } from '../../../utils/program-meta-renderers';
59
+ import { EntityIcon } from '../../icon-display';
59
60
  import { MingoIcon } from '../../icons';
60
61
  import { ArrowRightUpIcon } from '../../icons-v2-generated/arrows/arrow-right-up-icon';
61
62
  import { ClickupLogoIcon } from '../../icons-v2-generated/brand-logos/clickup-logo-icon';
@@ -97,6 +98,7 @@ import { TrophyIcon } from '../../icons-v2-generated/sport/trophy-icon';
97
98
  import { Rocket02Icon } from '../../icons-v2-generated/vehicles-and-delivery/rocket-02-icon';
98
99
  import { TruckFastIcon } from '../../icons-v2-generated/vehicles-and-delivery/truck-fast-icon';
99
100
  import type { ActionsMenuGroup } from '../../ui/actions-menu';
101
+ import { VendorIcon } from '../../vendor-icon';
100
102
  import { useChatPanel } from '../chat-panel-context';
101
103
  import type { ChatRef } from '../chat-ref.types';
102
104
  import { useChatCardItem } from '../hooks/use-chat-card-item';
@@ -114,7 +116,7 @@ import { clickupTaskUrl } from '../utils/external-app-urls';
114
116
  import { resolveIcon } from '../utils/icon-library';
115
117
  import { computeIsNewTab, buildAnchorProps } from '../utils/nav-anchor-props';
116
118
  import { readFetchedCardTitle } from '../utils/resolve-fetched-card-href';
117
- import { getSourceLabel } from '../utils/source-icons';
119
+ import { getSourceLabel, SOURCE_ICON_NAMES } from '../utils/source-icons';
118
120
  import { resolveSourceIcon, sourceRowCtxFromRuntime } from '../utils/source-row-cta';
119
121
  import { BlockCard } from './block-card';
120
122
  import { BlogCardSkeleton } from './blog-card';
@@ -1429,6 +1431,23 @@ function financialRegistryEntries(): Record<string, ChatCardRegistryEntry> {
1429
1431
  );
1430
1432
  }
1431
1433
 
1434
+ /** A string field the card route attached to a hydrated ref beside the `ChatRef` ones (`logo_url`, `icon_name`). */
1435
+ function refText(ref: ChatRef | undefined, key: string): string | null {
1436
+ const value = (ref as Record<string, unknown> | undefined)?.[key];
1437
+ return typeof value === 'string' && value.length > 0 ? value : null;
1438
+ }
1439
+
1440
+ /** A vendor's own logo, through the shared `VendorIcon` (its logo rule and proxying); the directory's source icon without one. */
1441
+ function VendorGlyph({ title, logoUrl }: { title: string; logoUrl: string | null }) {
1442
+ if (!logoUrl) return <EntityIcon icon={{ name: SOURCE_ICON_NAMES.vendors }} size={24} />;
1443
+ return <VendorIcon vendor={{ title, logo_url: logoUrl }} size="xs" showBackground={false} />;
1444
+ }
1445
+
1446
+ /** A website page's menu icon (the one its navigation entry draws), through `EntityIcon`; the site's own mark for a page without one. */
1447
+ function SitePageGlyph({ iconName }: { iconName: string | null }) {
1448
+ return <EntityIcon icon={{ name: iconName ?? SOURCE_ICON_NAMES['website-pages'] }} size={24} />;
1449
+ }
1450
+
1432
1451
  interface GitHubCardConfig {
1433
1452
  label: string;
1434
1453
  kind: GitHubActivityKind;
@@ -1443,7 +1462,12 @@ const GITHUB_CARD_CONFIGS: Record<string, GitHubCardConfig> = {
1443
1462
  };
1444
1463
  interface GlyphCardConfig {
1445
1464
  label: string;
1446
- icon: () => React.ReactNode;
1465
+ /**
1466
+ * The card's leading glyph. It is handed the hydrated ref, so a type whose
1467
+ * records carry their own mark (a vendor's logo, a page's menu icon) draws
1468
+ * that and keeps a generic glyph for a record without one.
1469
+ */
1470
+ icon: (ref?: ChatRef) => React.ReactNode;
1447
1471
  /**
1448
1472
  * Video-bearing ref types: render the media card (cover from the ref's
1449
1473
  * `metadata.videoPoster`, else the host's OG placeholder; the type label as the
@@ -1480,6 +1504,11 @@ const REF_GLYPH_CARD_CONFIGS: Record<string, GlyphCardConfig> = {
1480
1504
  // A change set: pull requests across repositories declared as one change, with the ClickUp tasks and design
1481
1505
  // docs its pull requests are attached to. ONE card for it wherever a set is shown (chat, a design doc's page).
1482
1506
  change_set: { label: 'Change set', icon: () => <CodingMergeIcon size={24} /> },
1507
+ // A page of the public website (pricing, product, legal, and every page the navigation lists), read live
1508
+ // from the data the page shows. A glyph card: a page has no cover of its own, and the card opens the page.
1509
+ site_page: { label: 'Website page', icon: ref => <SitePageGlyph iconName={refText(ref, 'icon_name')} /> },
1510
+ // A vendor (product) of the OpenMSP directory. A glyph card; it opens the vendor's page there.
1511
+ vendor: { label: 'Vendor', icon: ref => <VendorGlyph title={ref?.title ?? ''} logoUrl={refText(ref, 'logo_url')} /> },
1483
1512
  };
1484
1513
  function refGlyphRegistryEntries(): Record<string, ChatCardRegistryEntry> {
1485
1514
  return registryEntries(REF_GLYPH_CARD_CONFIGS, (cfg, docType) =>
@@ -1492,7 +1521,7 @@ function refGlyphRegistryEntries(): Record<string, ChatCardRegistryEntry> {
1492
1521
  displayRef.metadata?.videoPoster,
1493
1522
  opts.extras?.buildOgPlaceholderUrl?.(displayRef.title ?? '') ?? null,
1494
1523
  )}
1495
- fallbackIcon={cfg.icon()}
1524
+ fallbackIcon={cfg.icon(displayRef)}
1496
1525
  status={{ label: cfg.label, variant: 'grey' }}
1497
1526
  chatRef={displayRef}
1498
1527
  isNewTab={opts.isNewTab}
@@ -1500,7 +1529,12 @@ function refGlyphRegistryEntries(): Record<string, ChatCardRegistryEntry> {
1500
1529
  menuAriaLabel={`${cfg.label} actions`}
1501
1530
  />
1502
1531
  ) : (
1503
- <GlyphChatCard chatRef={displayRef} icon={cfg.icon()} isNewTab={opts.isNewTab} discuss={opts.discuss} />
1532
+ <GlyphChatCard
1533
+ chatRef={displayRef}
1534
+ icon={cfg.icon(displayRef)}
1535
+ isNewTab={opts.isNewTab}
1536
+ discuss={opts.discuss}
1537
+ />
1504
1538
  ),
1505
1539
  ),
1506
1540
  );