@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.
- package/dist/build/export-map.json +1 -1
- package/dist/{chunk-SFY4UYPY.cjs → chunk-4A6OF4HI.cjs} +44 -44
- package/dist/{chunk-VA7OMDZO.cjs → chunk-4FWURR3W.cjs} +50 -50
- package/dist/{chunk-WBANGORJ.cjs → chunk-4N7KGOBS.cjs} +3 -3
- package/dist/{chunk-PQ2M7P2U.cjs → chunk-5TCIRWHL.cjs} +9 -9
- package/dist/{chunk-FQN6STIM.cjs → chunk-6XCQXGQA.cjs} +20 -20
- package/dist/{chunk-BV5WZVOP.cjs → chunk-7YDF3QBN.cjs} +258 -257
- package/dist/{chunk-7ZFCR7UY.cjs → chunk-ABLUMGCI.cjs} +3 -3
- package/dist/{chunk-PX7FY655.cjs → chunk-ASMNNSUQ.cjs} +3 -3
- package/dist/{chunk-CWRVTQUO.cjs → chunk-BM6JZRVD.cjs} +101 -101
- package/dist/{chunk-LZ6NOVXX.cjs → chunk-BNTELSHZ.cjs} +103 -103
- package/dist/{chunk-SA7LDEVJ.cjs → chunk-CSJO7ZGN.cjs} +3 -3
- package/dist/{chunk-VOX4E6AX.cjs → chunk-DGFDBPO7.cjs} +7 -5
- package/dist/{chunk-KLI4OSRA.cjs → chunk-GAGNKWOC.cjs} +2 -2
- package/dist/{chunk-QEUGYHFB.cjs → chunk-IRWJKVVZ.cjs} +20 -20
- package/dist/{chunk-YRE3O65E.cjs → chunk-JGZEHBBD.cjs} +12 -12
- package/dist/{chunk-FICJS5OA.cjs → chunk-KTPR66EE.cjs} +4 -4
- package/dist/{chunk-YXKB5WRE.cjs → chunk-LJ46XYYP.cjs} +60 -48
- package/dist/{chunk-AAFW4STC.cjs → chunk-LU7TD6QS.cjs} +5 -5
- package/dist/{chunk-JFS6TZDX.cjs → chunk-MLZKPDPZ.cjs} +64 -64
- package/dist/{chunk-EKGL5K5K.cjs → chunk-MT7ELGCV.cjs} +17 -17
- package/dist/{chunk-HYBMADYO.cjs → chunk-NGUJVM6O.cjs} +22 -22
- package/dist/{chunk-3HPB4H4C.cjs → chunk-NTGIQP7O.cjs} +7 -7
- package/dist/{chunk-GABDE3FM.cjs → chunk-OWGLRE74.cjs} +19 -19
- package/dist/{chunk-IFS4AH77.cjs → chunk-QYLIHZKZ.cjs} +10 -10
- package/dist/{chunk-GVTDVS5U.cjs → chunk-R34JD6NP.cjs} +3 -3
- package/dist/{chunk-YQ37ZCD2.cjs → chunk-SQHTX5XP.cjs} +16 -16
- package/dist/{chunk-XJ36TEGE.cjs → chunk-TKASH5YC.cjs} +47 -47
- package/dist/{chunk-DSVNFRY5.cjs → chunk-U2O5YQRP.cjs} +38 -38
- package/dist/{chunk-5SVOGLNK.cjs → chunk-UL6ZZSL4.cjs} +6 -6
- package/dist/{chunk-O67V3HJR.cjs → chunk-URVIPSAJ.cjs} +24 -24
- package/dist/{chunk-GSWQZX23.cjs → chunk-UY6A6TEY.cjs} +2 -2
- package/dist/{chunk-DUVOQHQI.cjs → chunk-W2RM764D.cjs} +7 -7
- package/dist/{chunk-IK2RJUEA.cjs → chunk-WCY35GB5.cjs} +845 -810
- package/dist/{chunk-NTJE6SM6.cjs → chunk-WI2OTGKC.cjs} +2 -2
- package/dist/{chunk-ITPEFCQ2.cjs → chunk-XJO5ZHO6.cjs} +32 -32
- package/dist/{chunk-I6UE6YVM.cjs → chunk-Y2FN3E32.cjs} +6 -6
- package/dist/{chunk-4XL4YEZM.cjs → chunk-YDFKFLDQ.cjs} +8 -8
- package/dist/{chunk-HF7Z2E4W.cjs → chunk-YIOWV7LS.cjs} +2 -2
- package/dist/{chunk-B3XBJCOD.cjs → chunk-YJRMCFX3.cjs} +7 -7
- package/dist/{chunk-ZYOS7LVQ.cjs → chunk-YWMUZLU2.cjs} +89 -89
- package/dist/{chunk-ZJPDGVA6.cjs → chunk-ZP5DFF3Q.cjs} +28 -28
- package/dist/{cloud-tenants-MVJK52I2.cjs → cloud-tenants-DZC3ACG6.cjs} +24 -24
- package/dist/components/case-studies/index.cjs +37 -37
- package/dist/components/chat/entity-cards/onboarding-guide-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/onboarding-guide-card.js +22 -12
- package/dist/components/chat/index.cjs +17 -17
- package/dist/components/chat/tool-execution-display.d.ts.map +1 -1
- package/dist/components/chat/tool-execution-display.js +5 -4
- package/dist/components/contact/index.cjs +25 -25
- package/dist/components/docs/index.cjs +28 -28
- package/dist/components/embeds/index.cjs +25 -25
- package/dist/components/faq/index.cjs +26 -26
- package/dist/components/features/index.cjs +24 -24
- package/dist/components/features/scripts/schedule-form/schedule-interval-input.d.ts +1 -1
- package/dist/components/features/scripts/schedule-form/schedule-interval-input.d.ts.map +1 -1
- package/dist/components/features/scripts/schedule-form/schedule-interval-input.js +15 -13
- package/dist/components/features/scripts/schedule-form/schedule-offline-fields.d.ts.map +1 -1
- package/dist/components/features/scripts/schedule-form/schedule-offline-fields.js +9 -7
- package/dist/components/help-center-pages/index.cjs +144 -144
- package/dist/components/index.cjs +87 -85
- package/dist/components/meeting-scheduler/booking-form.d.ts +11 -1
- package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/booking-form.js +15 -3
- package/dist/components/meeting-scheduler/index.cjs +452 -158
- package/dist/components/meeting-scheduler/index.d.ts +16 -1
- package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/index.js +157 -5
- package/dist/components/meeting-scheduler/modal-header.d.ts +27 -0
- package/dist/components/meeting-scheduler/modal-header.d.ts.map +1 -0
- package/dist/components/meeting-scheduler/modal-header.js +104 -0
- package/dist/components/meeting-scheduler/slot-picker.d.ts +13 -2
- package/dist/components/meeting-scheduler/slot-picker.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/slot-picker.js +112 -73
- package/dist/components/navigation/index.cjs +27 -27
- package/dist/components/onboarding-guides/index.cjs +27 -27
- package/dist/components/product-demo/index.cjs +9 -9
- package/dist/components/related-content/index.cjs +12 -12
- package/dist/components/shared/product-release/product-release-card.d.ts.map +1 -1
- package/dist/components/shared/product-release/product-release-card.js +2 -0
- package/dist/components/tickets/index.cjs +30 -30
- package/dist/components/ui/index.cjs +26 -24
- package/dist/components/ui/radio-group.d.ts +6 -0
- package/dist/components/ui/radio-group.d.ts.map +1 -1
- package/dist/components/ui/radio-group.js +65 -58
- package/dist/components/ui/tab-navigation.d.ts +19 -1
- package/dist/components/ui/tab-navigation.d.ts.map +1 -1
- package/dist/components/ui/tab-navigation.js +32 -8
- package/dist/{devices-W3S7Q2PG.cjs → devices-MFGE2JQV.cjs} +25 -25
- package/dist/{embeddable-chat-6JKKFQEB.cjs → embeddable-chat-7ZEGCDVF.cjs} +92 -92
- package/dist/hooks/index.cjs +10 -10
- package/dist/index.cjs +32 -30
- package/dist/{knowledge-AIYQ4FC3.cjs → knowledge-7VPS2ZBU.cjs} +25 -25
- package/dist/{logs-7SHJ2ARE.cjs → logs-M3QPAUH7.cjs} +32 -32
- package/dist/{policies-EIZJ5SUP.cjs → policies-UAVE6X62.cjs} +28 -28
- package/dist/{remote-session-BZMNE6D2.cjs → remote-session-N4PJB5FW.cjs} +10 -10
- package/dist/{scripts-J2FWC7E4.cjs → scripts-EDQ3IQKW.cjs} +31 -31
- package/dist/{software-update-QAMNASVF.cjs → software-update-B2MZVNPK.cjs} +28 -28
- package/dist/{tickets-board-CEDHD3KB.cjs → tickets-board-O753S4ZB.cjs} +14 -14
- package/dist/utils/embed-authed-fetch.d.ts +33 -0
- package/dist/utils/embed-authed-fetch.d.ts.map +1 -1
- package/dist/utils/embed-authed-fetch.js +3 -1
- package/dist/utils/index.cjs +3 -1
- package/dist/{video-file-player-ZH2ILAPO.cjs → video-file-player-QZ3YOLHO.cjs} +2 -2
- package/package.json +1 -1
- package/src/components/chat/entity-cards/onboarding-guide-card.tsx +8 -1
- package/src/components/chat/tool-execution-display.tsx +21 -10
- package/src/components/features/scripts/schedule-form/schedule-interval-input.tsx +20 -13
- package/src/components/features/scripts/schedule-form/schedule-offline-fields.tsx +9 -5
- package/src/components/meeting-scheduler/booking-form.tsx +29 -3
- package/src/components/meeting-scheduler/index.tsx +224 -3
- package/src/components/meeting-scheduler/modal-header.tsx +145 -0
- package/src/components/meeting-scheduler/slot-picker.tsx +72 -8
- package/src/components/shared/product-release/product-release-card.tsx +2 -0
- package/src/components/ui/radio-group.tsx +51 -36
- package/src/components/ui/tab-navigation.tsx +54 -5
- 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
|
|
19
|
-
require('./chunk-
|
|
20
|
-
require('./chunk-
|
|
18
|
+
var _chunkWCY35GB5cjs = require('./chunk-WCY35GB5.cjs');
|
|
19
|
+
require('./chunk-URVIPSAJ.cjs');
|
|
20
|
+
require('./chunk-NTGIQP7O.cjs');
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
var
|
|
23
|
+
var _chunkU2O5YQRPcjs = require('./chunk-U2O5YQRP.cjs');
|
|
24
24
|
require('./chunk-HQQE74RO.cjs');
|
|
25
25
|
require('./chunk-DEY6XXGO.cjs');
|
|
26
|
-
require('./chunk-
|
|
27
|
-
require('./chunk-
|
|
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-
|
|
31
|
+
require('./chunk-GAGNKWOC.cjs');
|
|
32
32
|
require('./chunk-YUMFVQIN.cjs');
|
|
33
|
-
require('./chunk-
|
|
34
|
-
require('./chunk-
|
|
35
|
-
require('./chunk-
|
|
33
|
+
require('./chunk-BM6JZRVD.cjs');
|
|
34
|
+
require('./chunk-7YDF3QBN.cjs');
|
|
35
|
+
require('./chunk-OWGLRE74.cjs');
|
|
36
36
|
require('./chunk-3RFQPQ7Z.cjs');
|
|
37
|
-
require('./chunk-
|
|
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-
|
|
1828
|
-
require('./chunk-
|
|
1829
|
-
require('./chunk-
|
|
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-
|
|
1836
|
-
require('./chunk-
|
|
1837
|
-
require('./chunk-
|
|
1835
|
+
require('./chunk-JGZEHBBD.cjs');
|
|
1836
|
+
require('./chunk-LJ46XYYP.cjs');
|
|
1837
|
+
require('./chunk-QYLIHZKZ.cjs');
|
|
1838
1838
|
require('./chunk-63N4FN5V.cjs');
|
|
1839
|
-
require('./chunk-
|
|
1840
|
-
require('./chunk-
|
|
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-
|
|
1850
|
+
require('./chunk-ASMNNSUQ.cjs');
|
|
1851
1851
|
require('./chunk-CW3ML76U.cjs');
|
|
1852
|
-
require('./chunk-
|
|
1853
|
-
require('./chunk-
|
|
1854
|
-
require('./chunk-
|
|
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
|
-
|
|
1923
|
+
_chunkU2O5YQRPcjs.Autocomplete,
|
|
1924
1924
|
{
|
|
1925
|
-
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
14
|
-
require('./chunk-
|
|
15
|
-
require('./chunk-
|
|
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-
|
|
1805
|
+
require('./chunk-WI2OTGKC.cjs');
|
|
1806
1806
|
require('./chunk-WWUSFOJ7.cjs');
|
|
1807
1807
|
require('./chunk-SKI6NKOE.cjs');
|
|
1808
|
-
require('./chunk-
|
|
1809
|
-
require('./chunk-
|
|
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-
|
|
1818
|
-
require('./chunk-
|
|
1819
|
-
require('./chunk-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
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) {
|
package/dist/utils/index.cjs
CHANGED
|
@@ -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
|
|
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 =
|
|
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
|
@@ -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
|
|
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
|
-
:
|
|
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={
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
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
|
-
?
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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}
|