@flamingo-stack/openframe-frontend-core 0.0.741 → 0.0.743

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 (117) hide show
  1. package/dist/build/export-map.json +1 -1
  2. package/dist/{chunk-SFY4UYPY.cjs → chunk-4A6OF4HI.cjs} +44 -44
  3. package/dist/{chunk-VA7OMDZO.cjs → chunk-4FWURR3W.cjs} +50 -50
  4. package/dist/{chunk-WBANGORJ.cjs → chunk-4N7KGOBS.cjs} +3 -3
  5. package/dist/{chunk-PQ2M7P2U.cjs → chunk-5TCIRWHL.cjs} +9 -9
  6. package/dist/{chunk-FQN6STIM.cjs → chunk-6XCQXGQA.cjs} +20 -20
  7. package/dist/{chunk-BV5WZVOP.cjs → chunk-7YDF3QBN.cjs} +258 -257
  8. package/dist/{chunk-7ZFCR7UY.cjs → chunk-ABLUMGCI.cjs} +3 -3
  9. package/dist/{chunk-PX7FY655.cjs → chunk-ASMNNSUQ.cjs} +3 -3
  10. package/dist/{chunk-CWRVTQUO.cjs → chunk-BM6JZRVD.cjs} +101 -101
  11. package/dist/{chunk-LZ6NOVXX.cjs → chunk-BNTELSHZ.cjs} +103 -103
  12. package/dist/{chunk-SA7LDEVJ.cjs → chunk-CSJO7ZGN.cjs} +3 -3
  13. package/dist/{chunk-VOX4E6AX.cjs → chunk-DGFDBPO7.cjs} +7 -5
  14. package/dist/{chunk-KLI4OSRA.cjs → chunk-GAGNKWOC.cjs} +2 -2
  15. package/dist/{chunk-QEUGYHFB.cjs → chunk-IRWJKVVZ.cjs} +20 -20
  16. package/dist/{chunk-YRE3O65E.cjs → chunk-JGZEHBBD.cjs} +12 -12
  17. package/dist/{chunk-FICJS5OA.cjs → chunk-KTPR66EE.cjs} +4 -4
  18. package/dist/{chunk-YXKB5WRE.cjs → chunk-LJ46XYYP.cjs} +60 -48
  19. package/dist/{chunk-AAFW4STC.cjs → chunk-LU7TD6QS.cjs} +5 -5
  20. package/dist/{chunk-JFS6TZDX.cjs → chunk-MLZKPDPZ.cjs} +64 -64
  21. package/dist/{chunk-EKGL5K5K.cjs → chunk-MT7ELGCV.cjs} +17 -17
  22. package/dist/{chunk-HYBMADYO.cjs → chunk-NGUJVM6O.cjs} +22 -22
  23. package/dist/{chunk-3HPB4H4C.cjs → chunk-NTGIQP7O.cjs} +7 -7
  24. package/dist/{chunk-GABDE3FM.cjs → chunk-OWGLRE74.cjs} +19 -19
  25. package/dist/{chunk-IFS4AH77.cjs → chunk-QYLIHZKZ.cjs} +10 -10
  26. package/dist/{chunk-GVTDVS5U.cjs → chunk-R34JD6NP.cjs} +3 -3
  27. package/dist/{chunk-YQ37ZCD2.cjs → chunk-SQHTX5XP.cjs} +16 -16
  28. package/dist/{chunk-XJ36TEGE.cjs → chunk-TKASH5YC.cjs} +47 -47
  29. package/dist/{chunk-DSVNFRY5.cjs → chunk-U2O5YQRP.cjs} +38 -38
  30. package/dist/{chunk-5SVOGLNK.cjs → chunk-UL6ZZSL4.cjs} +6 -6
  31. package/dist/{chunk-O67V3HJR.cjs → chunk-URVIPSAJ.cjs} +24 -24
  32. package/dist/{chunk-GSWQZX23.cjs → chunk-UY6A6TEY.cjs} +2 -2
  33. package/dist/{chunk-DUVOQHQI.cjs → chunk-W2RM764D.cjs} +7 -7
  34. package/dist/{chunk-IK2RJUEA.cjs → chunk-WCY35GB5.cjs} +845 -810
  35. package/dist/{chunk-NTJE6SM6.cjs → chunk-WI2OTGKC.cjs} +2 -2
  36. package/dist/{chunk-ITPEFCQ2.cjs → chunk-XJO5ZHO6.cjs} +32 -32
  37. package/dist/{chunk-I6UE6YVM.cjs → chunk-Y2FN3E32.cjs} +6 -6
  38. package/dist/{chunk-4XL4YEZM.cjs → chunk-YDFKFLDQ.cjs} +8 -8
  39. package/dist/{chunk-HF7Z2E4W.cjs → chunk-YIOWV7LS.cjs} +2 -2
  40. package/dist/{chunk-B3XBJCOD.cjs → chunk-YJRMCFX3.cjs} +7 -7
  41. package/dist/{chunk-ZYOS7LVQ.cjs → chunk-YWMUZLU2.cjs} +89 -89
  42. package/dist/{chunk-ZJPDGVA6.cjs → chunk-ZP5DFF3Q.cjs} +28 -28
  43. package/dist/{cloud-tenants-MVJK52I2.cjs → cloud-tenants-DZC3ACG6.cjs} +24 -24
  44. package/dist/components/case-studies/index.cjs +37 -37
  45. package/dist/components/chat/entity-cards/onboarding-guide-card.d.ts.map +1 -1
  46. package/dist/components/chat/entity-cards/onboarding-guide-card.js +22 -12
  47. package/dist/components/chat/index.cjs +17 -17
  48. package/dist/components/chat/tool-execution-display.d.ts.map +1 -1
  49. package/dist/components/chat/tool-execution-display.js +5 -4
  50. package/dist/components/contact/index.cjs +25 -25
  51. package/dist/components/docs/index.cjs +28 -28
  52. package/dist/components/embeds/index.cjs +25 -25
  53. package/dist/components/faq/index.cjs +26 -26
  54. package/dist/components/features/index.cjs +24 -24
  55. package/dist/components/features/scripts/schedule-form/schedule-interval-input.d.ts +1 -1
  56. package/dist/components/features/scripts/schedule-form/schedule-interval-input.d.ts.map +1 -1
  57. package/dist/components/features/scripts/schedule-form/schedule-interval-input.js +15 -13
  58. package/dist/components/features/scripts/schedule-form/schedule-offline-fields.d.ts.map +1 -1
  59. package/dist/components/features/scripts/schedule-form/schedule-offline-fields.js +9 -7
  60. package/dist/components/help-center-pages/index.cjs +144 -144
  61. package/dist/components/index.cjs +87 -85
  62. package/dist/components/meeting-scheduler/booking-form.d.ts +11 -1
  63. package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
  64. package/dist/components/meeting-scheduler/booking-form.js +15 -3
  65. package/dist/components/meeting-scheduler/index.cjs +452 -158
  66. package/dist/components/meeting-scheduler/index.d.ts +16 -1
  67. package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
  68. package/dist/components/meeting-scheduler/index.js +157 -5
  69. package/dist/components/meeting-scheduler/modal-header.d.ts +27 -0
  70. package/dist/components/meeting-scheduler/modal-header.d.ts.map +1 -0
  71. package/dist/components/meeting-scheduler/modal-header.js +104 -0
  72. package/dist/components/meeting-scheduler/slot-picker.d.ts +13 -2
  73. package/dist/components/meeting-scheduler/slot-picker.d.ts.map +1 -1
  74. package/dist/components/meeting-scheduler/slot-picker.js +112 -73
  75. package/dist/components/navigation/index.cjs +27 -27
  76. package/dist/components/onboarding-guides/index.cjs +27 -27
  77. package/dist/components/product-demo/index.cjs +9 -9
  78. package/dist/components/related-content/index.cjs +12 -12
  79. package/dist/components/shared/product-release/product-release-card.d.ts.map +1 -1
  80. package/dist/components/shared/product-release/product-release-card.js +2 -0
  81. package/dist/components/tickets/index.cjs +30 -30
  82. package/dist/components/ui/index.cjs +26 -24
  83. package/dist/components/ui/radio-group.d.ts +6 -0
  84. package/dist/components/ui/radio-group.d.ts.map +1 -1
  85. package/dist/components/ui/radio-group.js +65 -58
  86. package/dist/components/ui/tab-navigation.d.ts +19 -1
  87. package/dist/components/ui/tab-navigation.d.ts.map +1 -1
  88. package/dist/components/ui/tab-navigation.js +32 -8
  89. package/dist/{devices-W3S7Q2PG.cjs → devices-MFGE2JQV.cjs} +25 -25
  90. package/dist/{embeddable-chat-6JKKFQEB.cjs → embeddable-chat-7ZEGCDVF.cjs} +92 -92
  91. package/dist/hooks/index.cjs +10 -10
  92. package/dist/index.cjs +32 -30
  93. package/dist/{knowledge-AIYQ4FC3.cjs → knowledge-7VPS2ZBU.cjs} +25 -25
  94. package/dist/{logs-7SHJ2ARE.cjs → logs-M3QPAUH7.cjs} +32 -32
  95. package/dist/{policies-EIZJ5SUP.cjs → policies-UAVE6X62.cjs} +28 -28
  96. package/dist/{remote-session-BZMNE6D2.cjs → remote-session-N4PJB5FW.cjs} +10 -10
  97. package/dist/{scripts-J2FWC7E4.cjs → scripts-EDQ3IQKW.cjs} +31 -31
  98. package/dist/{software-update-QAMNASVF.cjs → software-update-B2MZVNPK.cjs} +28 -28
  99. package/dist/{tickets-board-CEDHD3KB.cjs → tickets-board-O753S4ZB.cjs} +14 -14
  100. package/dist/utils/embed-authed-fetch.d.ts +33 -0
  101. package/dist/utils/embed-authed-fetch.d.ts.map +1 -1
  102. package/dist/utils/embed-authed-fetch.js +3 -1
  103. package/dist/utils/index.cjs +3 -1
  104. package/dist/{video-file-player-ZH2ILAPO.cjs → video-file-player-QZ3YOLHO.cjs} +2 -2
  105. package/package.json +1 -1
  106. package/src/components/chat/entity-cards/onboarding-guide-card.tsx +8 -1
  107. package/src/components/chat/tool-execution-display.tsx +21 -10
  108. package/src/components/features/scripts/schedule-form/schedule-interval-input.tsx +20 -13
  109. package/src/components/features/scripts/schedule-form/schedule-offline-fields.tsx +9 -5
  110. package/src/components/meeting-scheduler/booking-form.tsx +29 -3
  111. package/src/components/meeting-scheduler/index.tsx +224 -3
  112. package/src/components/meeting-scheduler/modal-header.tsx +145 -0
  113. package/src/components/meeting-scheduler/slot-picker.tsx +72 -8
  114. package/src/components/shared/product-release/product-release-card.tsx +2 -0
  115. package/src/components/ui/radio-group.tsx +51 -36
  116. package/src/components/ui/tab-navigation.tsx +54 -5
  117. package/src/utils/embed-authed-fetch.ts +42 -1
@@ -15,26 +15,26 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
15
15
 
16
16
 
17
17
 
18
- var _chunkIK2RJUEAcjs = require('./chunk-IK2RJUEA.cjs');
19
- require('./chunk-O67V3HJR.cjs');
20
- require('./chunk-3HPB4H4C.cjs');
18
+ var _chunkWCY35GB5cjs = require('./chunk-WCY35GB5.cjs');
19
+ require('./chunk-URVIPSAJ.cjs');
20
+ require('./chunk-NTGIQP7O.cjs');
21
21
 
22
22
 
23
- var _chunkDSVNFRY5cjs = require('./chunk-DSVNFRY5.cjs');
23
+ var _chunkU2O5YQRPcjs = require('./chunk-U2O5YQRP.cjs');
24
24
  require('./chunk-HQQE74RO.cjs');
25
25
  require('./chunk-DEY6XXGO.cjs');
26
- require('./chunk-VA7OMDZO.cjs');
27
- require('./chunk-AAFW4STC.cjs');
26
+ require('./chunk-4FWURR3W.cjs');
27
+ require('./chunk-LU7TD6QS.cjs');
28
28
  require('./chunk-24I6RFVU.cjs');
29
29
  require('./chunk-A6P6DHEZ.cjs');
30
30
  require('./chunk-MZ4KBSH7.cjs');
31
- require('./chunk-KLI4OSRA.cjs');
31
+ require('./chunk-GAGNKWOC.cjs');
32
32
  require('./chunk-YUMFVQIN.cjs');
33
- require('./chunk-CWRVTQUO.cjs');
34
- require('./chunk-BV5WZVOP.cjs');
35
- require('./chunk-GABDE3FM.cjs');
33
+ require('./chunk-BM6JZRVD.cjs');
34
+ require('./chunk-7YDF3QBN.cjs');
35
+ require('./chunk-OWGLRE74.cjs');
36
36
  require('./chunk-3RFQPQ7Z.cjs');
37
- require('./chunk-PQ2M7P2U.cjs');
37
+ require('./chunk-5TCIRWHL.cjs');
38
38
  require('./chunk-B27QEHYR.cjs');
39
39
  require('./chunk-ZOZR3QI2.cjs');
40
40
  require('./chunk-OMV5S5PI.cjs');
@@ -1824,20 +1824,20 @@ require('./chunk-LMBYZITR.cjs');
1824
1824
  require('./chunk-TMVC7S2R.cjs');
1825
1825
  require('./chunk-IYHH5EIO.cjs');
1826
1826
  require('./chunk-XIBCMGBW.cjs');
1827
- require('./chunk-DUVOQHQI.cjs');
1828
- require('./chunk-SA7LDEVJ.cjs');
1829
- require('./chunk-NTJE6SM6.cjs');
1827
+ require('./chunk-W2RM764D.cjs');
1828
+ require('./chunk-CSJO7ZGN.cjs');
1829
+ require('./chunk-WI2OTGKC.cjs');
1830
1830
  require('./chunk-JKX2C3I2.cjs');
1831
1831
  require('./chunk-7DNL734S.cjs');
1832
1832
  require('./chunk-WWUSFOJ7.cjs');
1833
1833
  require('./chunk-SKI6NKOE.cjs');
1834
1834
  require('./chunk-EWPR7662.cjs');
1835
- require('./chunk-YRE3O65E.cjs');
1836
- require('./chunk-YXKB5WRE.cjs');
1837
- require('./chunk-IFS4AH77.cjs');
1835
+ require('./chunk-JGZEHBBD.cjs');
1836
+ require('./chunk-LJ46XYYP.cjs');
1837
+ require('./chunk-QYLIHZKZ.cjs');
1838
1838
  require('./chunk-63N4FN5V.cjs');
1839
- require('./chunk-GSWQZX23.cjs');
1840
- require('./chunk-7ZFCR7UY.cjs');
1839
+ require('./chunk-UY6A6TEY.cjs');
1840
+ require('./chunk-ABLUMGCI.cjs');
1841
1841
  require('./chunk-S5C3OZCO.cjs');
1842
1842
  require('./chunk-32ASZMTV.cjs');
1843
1843
  require('./chunk-OOYBIS7D.cjs');
@@ -1847,11 +1847,11 @@ require('./chunk-ORO54HDF.cjs');
1847
1847
  require('./chunk-RUHKTWGB.cjs');
1848
1848
  require('./chunk-BLH2SFOO.cjs');
1849
1849
  require('./chunk-I5MSCD57.cjs');
1850
- require('./chunk-PX7FY655.cjs');
1850
+ require('./chunk-ASMNNSUQ.cjs');
1851
1851
  require('./chunk-CW3ML76U.cjs');
1852
- require('./chunk-GVTDVS5U.cjs');
1853
- require('./chunk-FICJS5OA.cjs');
1854
- require('./chunk-VOX4E6AX.cjs');
1852
+ require('./chunk-R34JD6NP.cjs');
1853
+ require('./chunk-KTPR66EE.cjs');
1854
+ require('./chunk-DGFDBPO7.cjs');
1855
1855
  require('./chunk-HOTM4UM6.cjs');
1856
1856
  require('./chunk-UJ7AXHRZ.cjs');
1857
1857
  require('./chunk-HTRILBJD.cjs');
@@ -1920,14 +1920,14 @@ var noop = () => {
1920
1920
  var HIDDEN_WHEN_COMPACT = ["organization"];
1921
1921
  function StaticPackageField({ value }) {
1922
1922
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1923
- _chunkDSVNFRY5cjs.Autocomplete,
1923
+ _chunkU2O5YQRPcjs.Autocomplete,
1924
1924
  {
1925
- label: _chunkIK2RJUEAcjs.PACKAGE_SEARCH_LABEL,
1925
+ label: _chunkWCY35GB5cjs.PACKAGE_SEARCH_LABEL,
1926
1926
  labelVariant: "large",
1927
1927
  options: value ? [{ value: value.id, label: value.name, description: _nullishCoalesce(value.description, () => ( void 0)) }] : [],
1928
1928
  value: _nullishCoalesce(_optionalChain([value, 'optionalAccess', _ => _.id]), () => ( null)),
1929
1929
  onChange: noop,
1930
- placeholder: _chunkIK2RJUEAcjs.PACKAGE_SEARCH_PLACEHOLDER
1930
+ placeholder: _chunkWCY35GB5cjs.PACKAGE_SEARCH_PLACEHOLDER
1931
1931
  }
1932
1932
  );
1933
1933
  }
@@ -1941,7 +1941,7 @@ function SoftwareUpdateScreen({ compact = false }) {
1941
1941
  [fixture.devices, fixture.selectedIds]
1942
1942
  );
1943
1943
  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,
1944
- _chunkIK2RJUEAcjs.SoftwareActionForm,
1944
+ _chunkWCY35GB5cjs.SoftwareActionForm,
1945
1945
  {
1946
1946
  action: fixture.action,
1947
1947
  showHeader: false,
@@ -1953,7 +1953,7 @@ function SoftwareUpdateScreen({ compact = false }) {
1953
1953
  initialValues: fixture.initialValues,
1954
1954
  renderPackageSearch,
1955
1955
  renderDevicePicker: () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1956
- _chunkIK2RJUEAcjs.DeviceSelector,
1956
+ _chunkWCY35GB5cjs.DeviceSelector,
1957
1957
  {
1958
1958
  devices: selected,
1959
1959
  loading: false,
@@ -10,9 +10,9 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
10
10
 
11
11
 
12
12
 
13
- var _chunkO67V3HJRcjs = require('./chunk-O67V3HJR.cjs');
14
- require('./chunk-AAFW4STC.cjs');
15
- require('./chunk-GABDE3FM.cjs');
13
+ var _chunkURVIPSAJcjs = require('./chunk-URVIPSAJ.cjs');
14
+ require('./chunk-LU7TD6QS.cjs');
15
+ require('./chunk-OWGLRE74.cjs');
16
16
  require('./chunk-B27QEHYR.cjs');
17
17
  require('./chunk-ZOZR3QI2.cjs');
18
18
  require('./chunk-OMV5S5PI.cjs');
@@ -1802,11 +1802,11 @@ require('./chunk-LMBYZITR.cjs');
1802
1802
  require('./chunk-TMVC7S2R.cjs');
1803
1803
  require('./chunk-IYHH5EIO.cjs');
1804
1804
  require('./chunk-XIBCMGBW.cjs');
1805
- require('./chunk-NTJE6SM6.cjs');
1805
+ require('./chunk-WI2OTGKC.cjs');
1806
1806
  require('./chunk-WWUSFOJ7.cjs');
1807
1807
  require('./chunk-SKI6NKOE.cjs');
1808
- require('./chunk-IFS4AH77.cjs');
1809
- require('./chunk-7ZFCR7UY.cjs');
1808
+ require('./chunk-QYLIHZKZ.cjs');
1809
+ require('./chunk-ABLUMGCI.cjs');
1810
1810
  require('./chunk-S5C3OZCO.cjs');
1811
1811
  require('./chunk-32ASZMTV.cjs');
1812
1812
  require('./chunk-OOYBIS7D.cjs');
@@ -1814,9 +1814,9 @@ require('./chunk-4IYNDV3G.cjs');
1814
1814
  require('./chunk-6VOOPMP5.cjs');
1815
1815
  require('./chunk-ORO54HDF.cjs');
1816
1816
  require('./chunk-RUHKTWGB.cjs');
1817
- require('./chunk-PX7FY655.cjs');
1818
- require('./chunk-FICJS5OA.cjs');
1819
- require('./chunk-VOX4E6AX.cjs');
1817
+ require('./chunk-ASMNNSUQ.cjs');
1818
+ require('./chunk-KTPR66EE.cjs');
1819
+ require('./chunk-DGFDBPO7.cjs');
1820
1820
  require('./chunk-HOTM4UM6.cjs');
1821
1821
  require('./chunk-L2RMTGOK.cjs');
1822
1822
  require('./chunk-Z74QE57T.cjs');
@@ -1839,7 +1839,7 @@ function buildTicketsBoardFixture(cast) {
1839
1839
  const dana = assignee(cast.person("dana"));
1840
1840
  const alex = assignee(cast.person("alex"));
1841
1841
  return [
1842
- _chunkO67V3HJRcjs.columnFromTicketStatus.call(void 0, "ACTIVE", [
1842
+ _chunkURVIPSAJcjs.columnFromTicketStatus.call(void 0, "ACTIVE", [
1843
1843
  ticket("tk-1051", "Printer offline at the front desk", "ACTIVE", {
1844
1844
  ticketNumber: "1051",
1845
1845
  agent: "fae",
@@ -1857,7 +1857,7 @@ function buildTicketsBoardFixture(cast) {
1857
1857
  tags: ["onboarding"]
1858
1858
  })
1859
1859
  ]),
1860
- _chunkO67V3HJRcjs.columnFromTicketStatus.call(void 0, "TECH_REQUIRED", [
1860
+ _chunkURVIPSAJcjs.columnFromTicketStatus.call(void 0, "TECH_REQUIRED", [
1861
1861
  ticket("tk-1049", "Acrobat Pro for Maya", "TECH_REQUIRED", {
1862
1862
  ticketNumber: "1049",
1863
1863
  agent: "fae",
@@ -1881,7 +1881,7 @@ function buildTicketsBoardFixture(cast) {
1881
1881
  escalatedByUser: true
1882
1882
  })
1883
1883
  ]),
1884
- _chunkO67V3HJRcjs.columnFromTicketStatus.call(void 0, "ON_HOLD", [
1884
+ _chunkURVIPSAJcjs.columnFromTicketStatus.call(void 0, "ON_HOLD", [
1885
1885
  ticket("tk-1046", "Replace the conference room display", "ON_HOLD", {
1886
1886
  ticketNumber: "1046",
1887
1887
  organizationName: _chunkDKOLQPE7cjs.DEMO_ORGANIZATIONS.acme.name,
@@ -1890,7 +1890,7 @@ function buildTicketsBoardFixture(cast) {
1890
1890
  activity: { kind: "waiting-external" }
1891
1891
  })
1892
1892
  ]),
1893
- _chunkO67V3HJRcjs.columnFromTicketStatus.call(void 0,
1893
+ _chunkURVIPSAJcjs.columnFromTicketStatus.call(void 0,
1894
1894
  "RESOLVED",
1895
1895
  [
1896
1896
  ticket("tk-1048", "Slow laptop", "RESOLVED", {
@@ -1926,7 +1926,7 @@ function TicketsBoardScreen({ compact = false }) {
1926
1926
  const cast = _chunkSTEJZPIOcjs.useProductDemoCast.call(void 0, );
1927
1927
  const board = _react.useMemo.call(void 0, () => buildTicketsBoardFixture(cast), [cast]);
1928
1928
  const columns = compact ? board.filter((column) => column.id !== "ON_HOLD") : board;
1929
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full bg-ods-bg p-[var(--spacing-system-m)]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkO67V3HJRcjs.Board, { columns, onChange: noop, initialCollapsed: compact ? void 0 : FOLDED }) });
1929
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full bg-ods-bg p-[var(--spacing-system-m)]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkURVIPSAJcjs.Board, { columns, onChange: noop, initialCollapsed: compact ? void 0 : FOLDED }) });
1930
1930
  }
1931
1931
 
1932
1932
 
@@ -58,6 +58,34 @@ export interface EmbedAuthAdapter {
58
58
  * host's own auth layer, not to this fetch wrapper.
59
59
  */
60
60
  refresh?: () => Promise<boolean>;
61
+ /**
62
+ * Optional guard, run before every request goes out — the first attempt
63
+ * and the retry after a `refresh`. Throw — or reject — to refuse the
64
+ * request: `embedAuthedFetch` rejects with that error and nothing reaches
65
+ * the network.
66
+ *
67
+ * For a host-wide state that makes every request pointless. openframe's
68
+ * mobile force-update is the case it exists for: once the gateway has
69
+ * refused this client build, every later request is refused locally, so no
70
+ * surface's retry or reconnect loop keeps hitting the gateway. Runs inside
71
+ * the returned promise (after the synchronous same-origin guard), so
72
+ * callers see a rejection, never a synchronous throw.
73
+ */
74
+ beforeRequest?: () => void | Promise<void>;
75
+ /**
76
+ * Optional response hook, run on every response (the post-refresh retry's
77
+ * too) BEFORE the 401 self-heal. Throw — or reject — to fail the request
78
+ * with that error: `embedAuthedFetch` rejects with it, and neither
79
+ * `refresh` nor a retry runs. Return to let the response continue through
80
+ * the wrapper unchanged.
81
+ *
82
+ * For a status the host handles app-wide rather than per surface — e.g.
83
+ * openframe's gateway answering `426 Upgrade Required` to a too-old mobile
84
+ * build, which swaps the whole app for an "update required" screen and
85
+ * must never be retried or read as an auth failure. Read the body from
86
+ * `response.clone()`: once the hook returns, the caller reads the original.
87
+ */
88
+ onResponse?: (response: Response) => void | Promise<void>;
61
89
  /**
62
90
  * Exact extra origins (`scheme://host[:port]`, as produced by `URL.origin`)
63
91
  * the same-origin guard additionally accepts. The guard normally rejects
@@ -166,6 +194,11 @@ export declare function needsBearerAssetFetch(url: string): boolean;
166
194
  * no longer need a host-side `window.fetch` monkey-patch to survive an
167
195
  * expired access token mid-chat. With no adapter (or no `refresh`), the
168
196
  * 401 passes straight through unchanged.
197
+ *
198
+ * **Host hooks:** an adapter's `beforeRequest` may refuse a request before it
199
+ * is sent, and its `onResponse` sees every response ahead of the 401
200
+ * self-heal and may fail the request instead (see their docs). Without them
201
+ * the wrapper behaves exactly as described above.
169
202
  */
170
203
  export declare function embedAuthedFetch(url: string, init?: RequestInit): Promise<Response>;
171
204
  //# sourceMappingURL=embed-authed-fetch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"embed-authed-fetch.d.ts","sourceRoot":"","sources":["../../src/utils/embed-authed-fetch.ts"],"names":[],"mappings":"AA4BA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;4EAMwE;IACxE,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACtD;;6EAEyE;IACzE,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CAClD;AA0BD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAS1E;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAE/E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAiB1D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkCvF"}
1
+ {"version":3,"file":"embed-authed-fetch.d.ts","sourceRoot":"","sources":["../../src/utils/embed-authed-fetch.ts"],"names":[],"mappings":"AA4BA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;4EAMwE;IACxE,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACtD;;6EAEyE;IACzE,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC;;;;;;;;;;;;OAYG;IACH,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CAClD;AA0BD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAS1E;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAE/E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAiB1D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkCvF"}
@@ -82,8 +82,9 @@ function dedupedRefresh() {
82
82
  return inFlightRefresh;
83
83
  }
84
84
  async function fetchWithRefresh(url, init, baseHeaders, isRetry) {
85
- const { url: authedUrl, headers } = applyProxyAuth(url, { ...baseHeaders });
86
85
  const adapter = getRegisteredAuthAdapter();
86
+ await adapter?.beforeRequest?.();
87
+ const { url: authedUrl, headers } = applyProxyAuth(url, { ...baseHeaders });
87
88
  if (adapter?.getHeaders) {
88
89
  for (const [k, v] of Object.entries(adapter.getHeaders())) {
89
90
  if (v !== void 0) headers[k] = v;
@@ -100,6 +101,7 @@ async function fetchWithRefresh(url, init, baseHeaders, isRetry) {
100
101
  // `SameSite=None` must be configured server-side for that to work).
101
102
  credentials
102
103
  });
104
+ await adapter?.onResponse?.(response);
103
105
  if (response.status === 401 && !isRetry && adapter?.refresh) {
104
106
  const refreshed = await dedupedRefresh();
105
107
  if (refreshed) {
@@ -83337,8 +83337,9 @@ function dedupedRefresh() {
83337
83337
  return inFlightRefresh;
83338
83338
  }
83339
83339
  async function fetchWithRefresh(url, init, baseHeaders, isRetry) {
83340
- const { url: authedUrl, headers } = applyProxyAuth(url, { ...baseHeaders });
83341
83340
  const adapter2 = getRegisteredAuthAdapter();
83341
+ await adapter2?.beforeRequest?.();
83342
+ const { url: authedUrl, headers } = applyProxyAuth(url, { ...baseHeaders });
83342
83343
  if (adapter2?.getHeaders) {
83343
83344
  for (const [k, v] of Object.entries(adapter2.getHeaders())) {
83344
83345
  if (v !== void 0) headers[k] = v;
@@ -83355,6 +83356,7 @@ async function fetchWithRefresh(url, init, baseHeaders, isRetry) {
83355
83356
  // `SameSite=None` must be configured server-side for that to work).
83356
83357
  credentials
83357
83358
  });
83359
+ await adapter2?.onResponse?.(response);
83358
83360
  if (response.status === 401 && !isRetry && adapter2?.refresh) {
83359
83361
  const refreshed = await dedupedRefresh();
83360
83362
  if (refreshed) {
@@ -19,7 +19,7 @@ require('./chunk-4IYNDV3G.cjs');
19
19
  require('./chunk-CW3ML76U.cjs');
20
20
 
21
21
 
22
- var _chunkVOX4E6AXcjs = require('./chunk-VOX4E6AX.cjs');
22
+ var _chunkDGFDBPO7cjs = require('./chunk-DGFDBPO7.cjs');
23
23
  require('./chunk-UJ7AXHRZ.cjs');
24
24
 
25
25
 
@@ -406,7 +406,7 @@ function FilePlayer({
406
406
  const hover = useHoverPlayback(mediaRef, sound, { playOnHover, playWhenHovered, mutedIntent });
407
407
  const health = usePlaybackHealth(mediaRef, url, !chromeless);
408
408
  useIosNativeVideoFullscreen(mediaRef);
409
- const captions = _chunkVOX4E6AXcjs.useAuthedAssetSrc.call(void 0, captionsUrl, "text/vtt, */*");
409
+ const captions = _chunkDGFDBPO7cjs.useAuthedAssetSrc.call(void 0, captionsUrl, "text/vtt, */*");
410
410
  const player = /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
411
411
  _muxplayerreact2.default,
412
412
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.741",
3
+ "version": "0.0.743",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -296,7 +296,14 @@ export function OnboardingGuideCard({
296
296
  (s): s is string => typeof s === 'string' && s.length > 0,
297
297
  );
298
298
  return (
299
- <Link href={href} target={target} rel={rel} prefetch={false} className={cn(COMPACT_CARD_OUTER, className)}>
299
+ <Link
300
+ href={href}
301
+ target={target}
302
+ rel={rel}
303
+ prefetch={false}
304
+ // `group`: the play mark on a video cover shows on the card's hover.
305
+ className={cn(COMPACT_CARD_OUTER, 'group', className)}
306
+ >
300
307
  <span className={COMPACT_CARD_IMAGE_SLOT}>
301
308
  {compactCover ? (
302
309
  <Image src={compactCover} alt={guide.title} fill sizes="56px" className="object-contain" unoptimized />
@@ -69,6 +69,11 @@ const ToolExecutionDisplay = forwardRef<HTMLDivElement, ToolExecutionDisplayProp
69
69
  const isConciseRemoteRead = !message.integratedToolType && !!previewText && argEntries.length === 0 && !hasResult;
70
70
  const isStaticRow = isClientView || isConciseRemoteRead;
71
71
  const hasBody = argEntries.length > 0 || hasResult || isExecuting;
72
+ // A run with no arguments and no result has nothing behind a chevron either:
73
+ // its header stays, with no chevron and no click target, so the row never
74
+ // opens onto an empty box. (A run still executing has a body: its live
75
+ // "Result:" placeholder.)
76
+ const isExpanded = expanded && hasBody;
72
77
 
73
78
  const renderStatusIcon = () => {
74
79
  if (isExecuting) return <DotsLoaderIcon size={16} className="text-ods-text-secondary" />;
@@ -96,7 +101,7 @@ const ToolExecutionDisplay = forwardRef<HTMLDivElement, ToolExecutionDisplayProp
96
101
  'min-w-0 flex-1 text-h6',
97
102
  isClientView
98
103
  ? 'whitespace-pre-wrap break-words text-ods-text-primary'
99
- : expanded
104
+ : isExpanded
100
105
  ? 'whitespace-pre-wrap break-all text-ods-text-primary'
101
106
  : 'line-clamp-2 max-h-10 break-all text-ods-text-secondary',
102
107
  )}
@@ -104,9 +109,9 @@ const ToolExecutionDisplay = forwardRef<HTMLDivElement, ToolExecutionDisplayProp
104
109
  {previewText}
105
110
  </div>
106
111
  <div className="flex h-5 w-5 shrink-0 items-center justify-center">{renderStatusIcon()}</div>
107
- {!isStaticRow && (
112
+ {!isStaticRow && hasBody && (
108
113
  <div className="flex h-5 w-5 shrink-0 items-center justify-center">
109
- <ExpandChevron expanded={expanded} />
114
+ <ExpandChevron expanded={isExpanded} />
110
115
  </div>
111
116
  )}
112
117
  </>
@@ -135,13 +140,19 @@ const ToolExecutionDisplay = forwardRef<HTMLDivElement, ToolExecutionDisplayProp
135
140
  </div>
136
141
  ) : (
137
142
  <>
138
- <button
139
- type="button"
140
- className="flex w-full cursor-pointer items-start gap-[var(--spacing-system-xs)] p-[var(--spacing-system-s)] text-left"
141
- onClick={() => setExpanded(prev => !prev)}
142
- >
143
- {headerContent}
144
- </button>
143
+ {hasBody ? (
144
+ <button
145
+ type="button"
146
+ className="flex w-full cursor-pointer items-start gap-[var(--spacing-system-xs)] p-[var(--spacing-system-s)] text-left"
147
+ onClick={() => setExpanded(prev => !prev)}
148
+ >
149
+ {headerContent}
150
+ </button>
151
+ ) : (
152
+ <div className="flex w-full items-start gap-[var(--spacing-system-xs)] p-[var(--spacing-system-s)] text-left">
153
+ {headerContent}
154
+ </div>
155
+ )}
145
156
 
146
157
  <div className="w-full" style={containerStyle}>
147
158
  <div ref={innerRef}>
@@ -55,18 +55,25 @@ interface ScheduleIntervalInputProps {
55
55
  * held until the first Save (`showErrors`) and re-checked on blur
56
56
  * (`reValidateMode`), so nothing here is judged mid-word.
57
57
  */
58
- export function ScheduleIntervalInput({
59
- value,
60
- onChange,
61
- onBlur,
62
- disabled,
63
- invalid,
64
- error,
65
- min,
66
- className,
67
- 'aria-label': ariaLabel,
68
- 'data-invalid-focus': invalidFocus,
69
- }: ScheduleIntervalInputProps) {
58
+ export function ScheduleIntervalInput(props: ScheduleIntervalInputProps) {
59
+ const {
60
+ value,
61
+ onChange,
62
+ onBlur,
63
+ disabled,
64
+ invalid,
65
+ error,
66
+ min,
67
+ className,
68
+ 'aria-label': ariaLabel,
69
+ 'data-invalid-focus': invalidFocus,
70
+ } = props;
71
+ // Only a box that shows its own error wires `Input`'s error slot (Repeat in).
72
+ // A wired slot wraps the box in a full-width column that reserves room for the
73
+ // message, and in a row that column takes the width of the control beside it:
74
+ // Stop Retry after, whose error the section carries, would squeeze its unit
75
+ // select to nothing.
76
+ const errorSlot = 'error' in props;
70
77
  const [text, setText] = useState(() => (value === null ? '' : String(value)));
71
78
  const focused = useRef(false);
72
79
 
@@ -115,7 +122,7 @@ export function ScheduleIntervalInput({
115
122
  }}
116
123
  disabled={disabled}
117
124
  invalid={invalid}
118
- error={error}
125
+ {...(errorSlot ? { error } : {})}
119
126
  />
120
127
  );
121
128
  }
@@ -160,10 +160,15 @@ export function ScheduleOfflineFields({ showErrors, disabled = false }: { showEr
160
160
 
161
161
  const options = SCHEDULE_OFFLINE_BEHAVIOR_OPTIONS.map(option =>
162
162
  isRetryOnReconnect(option.value)
163
- ? // Desktop only. Below `md` the caption plus two controls cannot share a
164
- // row with the option's own label without squeezing it to nothing, so
165
- // the same fields render full-width under the group instead.
166
- { ...option, trailing: <div className="hidden content-md:flex">{windowFieldsFor(false)}</div> }
163
+ ? {
164
+ ...option,
165
+ // Desktop: the fields end the option's row.
166
+ trailing: <div className="hidden content-md:flex">{windowFieldsFor(false)}</div>,
167
+ // Below `md` the caption plus two controls cannot share a row with the
168
+ // option's own label without squeezing it to nothing, so the same
169
+ // fields take their own full-width row under it, inside the option.
170
+ footer: <div className="content-md:hidden">{windowFieldsFor(true)}</div>,
171
+ }
167
172
  : option,
168
173
  );
169
174
 
@@ -202,7 +207,6 @@ export function ScheduleOfflineFields({ showErrors, disabled = false }: { showEr
202
207
  disabled={disabled}
203
208
  options={options}
204
209
  />
205
- <div className="pt-[var(--spacing-system-xs)] content-md:hidden">{windowFieldsFor(true)}</div>
206
210
  {intervalError && (
207
211
  <div className="absolute bottom-0 left-0 right-0 translate-y-full">
208
212
  <TruncateText variant="h6" className="text-ods-error">
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { zodResolver } from '@hookform/resolvers/zod';
4
- import { Fragment, useEffect, useMemo, useState } from 'react';
4
+ import { Fragment, useEffect, useMemo, useRef, useState } from 'react';
5
5
  import type { FormEvent, ReactNode, Ref } from 'react';
6
6
  import { useForm, Controller } from 'react-hook-form';
7
7
  import type { Control, Path, UseFormRegister } from 'react-hook-form';
@@ -397,6 +397,16 @@ export interface BookingFormProps {
397
397
  * appended full width. Both are deliberate — see `slotNode`/`unplacedFields`.
398
398
  */
399
399
  fieldRows?: BookingFieldRow[];
400
+ /** The form element's id, so a host can submit it from a button outside it
401
+ * (`<button form={id}>`): the modal layout keeps its actions in a footer
402
+ * under the card. */
403
+ formId?: string;
404
+ /** Leave the submit button out: the host draws one of its own (see `formId`). */
405
+ hideSubmit?: boolean;
406
+ /** Whether the answers would pass validation as they stand, reported on every
407
+ * change: a host drawing its own submit keeps it disabled until this says
408
+ * true. The form's own button never needs it - its click validates. */
409
+ onValidityChange?: (valid: boolean) => void;
400
410
  /** Per-field display overrides, keyed by field name — see `BookingFieldCopy`. */
401
411
  fieldCopy?: Record<string, BookingFieldCopy>;
402
412
  /** Email domains this form refuses, with the message it shows — see `DeniedEmailDomains`.
@@ -441,6 +451,9 @@ export function BookingForm({
441
451
  submitLabel,
442
452
  footerNote,
443
453
  fieldRows,
454
+ formId,
455
+ hideSubmit = false,
456
+ onValidityChange,
444
457
  fieldCopy,
445
458
  deniedEmailDomains,
446
459
  consent,
@@ -507,6 +520,19 @@ export function BookingForm({
507
520
  const [consentError, setConsentError] = useState<string | null>(null);
508
521
  const consentMissing = Boolean(consent) && !consented;
509
522
 
523
+ // Live validity for a host-drawn submit. `watch()` re-renders on every
524
+ // change; the parse is the same schema the submit runs, so the two can never
525
+ // disagree. Reported only when asked for, and only when it changes.
526
+ const watchedValues = watch();
527
+ const liveValid = onValidityChange ? schema.safeParse(watchedValues).success && !consentMissing : false;
528
+ const lastValidRef = useRef<boolean | null>(null);
529
+ useEffect(() => {
530
+ if (!onValidityChange) return;
531
+ if (lastValidRef.current === liveValid) return;
532
+ lastValidRef.current = liveValid;
533
+ onValidityChange(liveValid);
534
+ });
535
+
510
536
  // The seeded availability is refetched immediately on mount, so the link's
511
537
  // consent set can change WHILE this form is open. Reconcile rather than
512
538
  // remount: carry each `consented` across by id and default new ids to false.
@@ -685,7 +711,7 @@ export function BookingForm({
685
711
 
686
712
  // Opted out of HubSpot's collected-forms script — see HUBSPOT_DO_NOT_COLLECT_FORM_PROPS.
687
713
  return (
688
- <form onSubmit={submit} className={FORM_STACK} noValidate {...HUBSPOT_DO_NOT_COLLECT_FORM_PROPS}>
714
+ <form id={formId} onSubmit={submit} className={FORM_STACK} noValidate {...HUBSPOT_DO_NOT_COLLECT_FORM_PROPS}>
689
715
  <HoneypotField {...honeypotInputProps} />
690
716
 
691
717
  {/* Email first, name pair below — the order the desktop and mobile mocks
@@ -806,7 +832,7 @@ export function BookingForm({
806
832
  {/* Two shapes, not one with a placeholder: without a note this must stay
807
833
  the bare `flex` row it has always been, or the submit slides from the
808
834
  left edge to the right on every existing slot-first booking. */}
809
- {footerNote ? (
835
+ {hideSubmit ? null : footerNote ? (
810
836
  <div className={FOOTER_ROW_CLASS}>
811
837
  <p className="text-ods-text-secondary text-h6">{footerNote}</p>
812
838
  {submitButton}