@flamingo-stack/openframe-frontend-core 0.0.742 → 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 (91) hide show
  1. package/dist/build/export-map.json +1 -1
  2. package/dist/{chunk-WIHHA54J.cjs → chunk-4A6OF4HI.cjs} +44 -44
  3. package/dist/{chunk-OBODY7F3.cjs → chunk-4N7KGOBS.cjs} +3 -3
  4. package/dist/{chunk-L34TKFTS.cjs → chunk-6XCQXGQA.cjs} +16 -16
  5. package/dist/{chunk-32Q7K5OP.cjs → chunk-7YDF3QBN.cjs} +116 -115
  6. package/dist/{chunk-PS6T65KA.cjs → chunk-BM6JZRVD.cjs} +65 -65
  7. package/dist/{chunk-R6SCSV2I.cjs → chunk-BNTELSHZ.cjs} +81 -81
  8. package/dist/{chunk-YQGDXH3M.cjs → chunk-GAGNKWOC.cjs} +2 -2
  9. package/dist/{chunk-HIRVNBX5.cjs → chunk-IRWJKVVZ.cjs} +16 -16
  10. package/dist/{chunk-XAA5EZ5T.cjs → chunk-JGZEHBBD.cjs} +6 -6
  11. package/dist/{chunk-5MH6BRPY.cjs → chunk-LJ46XYYP.cjs} +24 -12
  12. package/dist/{chunk-HDBY2URA.cjs → chunk-MLZKPDPZ.cjs} +31 -31
  13. package/dist/{chunk-4LDU32OB.cjs → chunk-MT7ELGCV.cjs} +4 -4
  14. package/dist/{chunk-UWHCRIQQ.cjs → chunk-NGUJVM6O.cjs} +13 -13
  15. package/dist/{chunk-DNFSMVXJ.cjs → chunk-SQHTX5XP.cjs} +12 -12
  16. package/dist/{chunk-T433HSL6.cjs → chunk-TKASH5YC.cjs} +33 -33
  17. package/dist/{chunk-ZIFYSLIM.cjs → chunk-UL6ZZSL4.cjs} +4 -4
  18. package/dist/{chunk-4PKORVOX.cjs → chunk-WCY35GB5.cjs} +441 -406
  19. package/dist/{chunk-UZLRSFGG.cjs → chunk-XJO5ZHO6.cjs} +30 -30
  20. package/dist/{chunk-3LW43GIJ.cjs → chunk-Y2FN3E32.cjs} +4 -4
  21. package/dist/{chunk-54EA4RLX.cjs → chunk-YDFKFLDQ.cjs} +3 -3
  22. package/dist/{chunk-BI3XBCQX.cjs → chunk-YIOWV7LS.cjs} +2 -2
  23. package/dist/{chunk-H3UA7UY5.cjs → chunk-YJRMCFX3.cjs} +2 -2
  24. package/dist/{chunk-Z2DQYKZA.cjs → chunk-YWMUZLU2.cjs} +69 -69
  25. package/dist/{chunk-ISJXKKYW.cjs → chunk-ZP5DFF3Q.cjs} +11 -11
  26. package/dist/{cloud-tenants-6ICAL3HO.cjs → cloud-tenants-DZC3ACG6.cjs} +7 -7
  27. package/dist/components/case-studies/index.cjs +19 -19
  28. package/dist/components/chat/entity-cards/onboarding-guide-card.d.ts.map +1 -1
  29. package/dist/components/chat/entity-cards/onboarding-guide-card.js +22 -12
  30. package/dist/components/chat/index.cjs +5 -5
  31. package/dist/components/chat/tool-execution-display.d.ts.map +1 -1
  32. package/dist/components/chat/tool-execution-display.js +5 -4
  33. package/dist/components/contact/index.cjs +8 -8
  34. package/dist/components/docs/index.cjs +11 -11
  35. package/dist/components/embeds/index.cjs +8 -8
  36. package/dist/components/faq/index.cjs +9 -9
  37. package/dist/components/features/index.cjs +7 -7
  38. package/dist/components/features/scripts/schedule-form/schedule-interval-input.d.ts +1 -1
  39. package/dist/components/features/scripts/schedule-form/schedule-interval-input.d.ts.map +1 -1
  40. package/dist/components/features/scripts/schedule-form/schedule-interval-input.js +15 -13
  41. package/dist/components/features/scripts/schedule-form/schedule-offline-fields.d.ts.map +1 -1
  42. package/dist/components/features/scripts/schedule-form/schedule-offline-fields.js +9 -7
  43. package/dist/components/help-center-pages/index.cjs +101 -101
  44. package/dist/components/index.cjs +59 -57
  45. package/dist/components/meeting-scheduler/booking-form.d.ts +11 -1
  46. package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
  47. package/dist/components/meeting-scheduler/booking-form.js +15 -3
  48. package/dist/components/meeting-scheduler/index.cjs +408 -114
  49. package/dist/components/meeting-scheduler/index.d.ts +16 -1
  50. package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
  51. package/dist/components/meeting-scheduler/index.js +157 -5
  52. package/dist/components/meeting-scheduler/modal-header.d.ts +27 -0
  53. package/dist/components/meeting-scheduler/modal-header.d.ts.map +1 -0
  54. package/dist/components/meeting-scheduler/modal-header.js +104 -0
  55. package/dist/components/meeting-scheduler/slot-picker.d.ts +13 -2
  56. package/dist/components/meeting-scheduler/slot-picker.d.ts.map +1 -1
  57. package/dist/components/meeting-scheduler/slot-picker.js +112 -73
  58. package/dist/components/navigation/index.cjs +10 -10
  59. package/dist/components/onboarding-guides/index.cjs +10 -10
  60. package/dist/components/product-demo/index.cjs +7 -7
  61. package/dist/components/related-content/index.cjs +5 -5
  62. package/dist/components/shared/product-release/product-release-card.d.ts.map +1 -1
  63. package/dist/components/shared/product-release/product-release-card.js +2 -0
  64. package/dist/components/tickets/index.cjs +13 -13
  65. package/dist/components/ui/index.cjs +9 -7
  66. package/dist/components/ui/radio-group.d.ts +6 -0
  67. package/dist/components/ui/radio-group.d.ts.map +1 -1
  68. package/dist/components/ui/radio-group.js +65 -58
  69. package/dist/components/ui/tab-navigation.d.ts +19 -1
  70. package/dist/components/ui/tab-navigation.d.ts.map +1 -1
  71. package/dist/components/ui/tab-navigation.js +32 -8
  72. package/dist/{devices-OFP2IBKN.cjs → devices-MFGE2JQV.cjs} +8 -8
  73. package/dist/{embeddable-chat-4C22MGNC.cjs → embeddable-chat-7ZEGCDVF.cjs} +71 -71
  74. package/dist/index.cjs +13 -11
  75. package/dist/{knowledge-KKBCSNUA.cjs → knowledge-7VPS2ZBU.cjs} +8 -8
  76. package/dist/{logs-X2GRNO57.cjs → logs-M3QPAUH7.cjs} +15 -15
  77. package/dist/{policies-35BXKB6P.cjs → policies-UAVE6X62.cjs} +11 -11
  78. package/dist/{scripts-KQYVQOLU.cjs → scripts-EDQ3IQKW.cjs} +12 -12
  79. package/dist/{software-update-ED33WSKT.cjs → software-update-B2MZVNPK.cjs} +10 -10
  80. package/package.json +1 -1
  81. package/src/components/chat/entity-cards/onboarding-guide-card.tsx +8 -1
  82. package/src/components/chat/tool-execution-display.tsx +21 -10
  83. package/src/components/features/scripts/schedule-form/schedule-interval-input.tsx +20 -13
  84. package/src/components/features/scripts/schedule-form/schedule-offline-fields.tsx +9 -5
  85. package/src/components/meeting-scheduler/booking-form.tsx +29 -3
  86. package/src/components/meeting-scheduler/index.tsx +224 -3
  87. package/src/components/meeting-scheduler/modal-header.tsx +145 -0
  88. package/src/components/meeting-scheduler/slot-picker.tsx +72 -8
  89. package/src/components/shared/product-release/product-release-card.tsx +2 -0
  90. package/src/components/ui/radio-group.tsx +51 -36
  91. package/src/components/ui/tab-navigation.tsx +54 -5
@@ -8,7 +8,7 @@ var _chunkSTEJZPIOcjs = require('./chunk-STEJZPIO.cjs');
8
8
  var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
9
9
 
10
10
 
11
- var _chunk4PKORVOXcjs = require('./chunk-4PKORVOX.cjs');
11
+ var _chunkWCY35GB5cjs = require('./chunk-WCY35GB5.cjs');
12
12
  require('./chunk-URVIPSAJ.cjs');
13
13
  require('./chunk-NTGIQP7O.cjs');
14
14
  require('./chunk-U2O5YQRP.cjs');
@@ -19,12 +19,12 @@ require('./chunk-LU7TD6QS.cjs');
19
19
  require('./chunk-24I6RFVU.cjs');
20
20
  require('./chunk-A6P6DHEZ.cjs');
21
21
  require('./chunk-MZ4KBSH7.cjs');
22
- require('./chunk-YQGDXH3M.cjs');
22
+ require('./chunk-GAGNKWOC.cjs');
23
23
  require('./chunk-YUMFVQIN.cjs');
24
- require('./chunk-PS6T65KA.cjs');
24
+ require('./chunk-BM6JZRVD.cjs');
25
25
 
26
26
 
27
- var _chunk32Q7K5OPcjs = require('./chunk-32Q7K5OP.cjs');
27
+ var _chunk7YDF3QBNcjs = require('./chunk-7YDF3QBN.cjs');
28
28
  require('./chunk-OWGLRE74.cjs');
29
29
  require('./chunk-3RFQPQ7Z.cjs');
30
30
  require('./chunk-5TCIRWHL.cjs');
@@ -1825,8 +1825,8 @@ require('./chunk-7DNL734S.cjs');
1825
1825
  require('./chunk-WWUSFOJ7.cjs');
1826
1826
  require('./chunk-SKI6NKOE.cjs');
1827
1827
  require('./chunk-EWPR7662.cjs');
1828
- require('./chunk-XAA5EZ5T.cjs');
1829
- require('./chunk-5MH6BRPY.cjs');
1828
+ require('./chunk-JGZEHBBD.cjs');
1829
+ require('./chunk-LJ46XYYP.cjs');
1830
1830
  require('./chunk-QYLIHZKZ.cjs');
1831
1831
  require('./chunk-63N4FN5V.cjs');
1832
1832
  require('./chunk-UY6A6TEY.cjs');
@@ -1905,10 +1905,10 @@ function KnowledgeScreen(_props) {
1905
1905
  const cast = _chunkSTEJZPIOcjs.useProductDemoCast.call(void 0, );
1906
1906
  const fixture = _react.useMemo.call(void 0, () => buildKnowledgeFixture(cast), [cast]);
1907
1907
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full bg-ods-bg", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1908
- _chunk4PKORVOXcjs.KnowledgeBaseArticleView,
1908
+ _chunkWCY35GB5cjs.KnowledgeBaseArticleView,
1909
1909
  {
1910
1910
  ...fixture.article,
1911
- content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk32Q7K5OPcjs.SimpleMarkdownRenderer, { content: fixture.content, textSize: "compact" })
1911
+ content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk7YDF3QBNcjs.SimpleMarkdownRenderer, { content: fixture.content, textSize: "compact" })
1912
1912
  }
1913
1913
  ) });
1914
1914
  }
@@ -16,7 +16,7 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
16
16
 
17
17
 
18
18
 
19
- var _chunk4PKORVOXcjs = require('./chunk-4PKORVOX.cjs');
19
+ var _chunkWCY35GB5cjs = require('./chunk-WCY35GB5.cjs');
20
20
  require('./chunk-URVIPSAJ.cjs');
21
21
  require('./chunk-NTGIQP7O.cjs');
22
22
  require('./chunk-U2O5YQRP.cjs');
@@ -27,12 +27,12 @@ require('./chunk-LU7TD6QS.cjs');
27
27
  require('./chunk-24I6RFVU.cjs');
28
28
  require('./chunk-A6P6DHEZ.cjs');
29
29
  require('./chunk-MZ4KBSH7.cjs');
30
- require('./chunk-YQGDXH3M.cjs');
30
+ require('./chunk-GAGNKWOC.cjs');
31
31
  require('./chunk-YUMFVQIN.cjs');
32
32
 
33
33
 
34
- var _chunkPS6T65KAcjs = require('./chunk-PS6T65KA.cjs');
35
- require('./chunk-32Q7K5OP.cjs');
34
+ var _chunkBM6JZRVDcjs = require('./chunk-BM6JZRVD.cjs');
35
+ require('./chunk-7YDF3QBN.cjs');
36
36
  require('./chunk-OWGLRE74.cjs');
37
37
  require('./chunk-3RFQPQ7Z.cjs');
38
38
  require('./chunk-5TCIRWHL.cjs');
@@ -1833,8 +1833,8 @@ require('./chunk-7DNL734S.cjs');
1833
1833
  require('./chunk-WWUSFOJ7.cjs');
1834
1834
  require('./chunk-SKI6NKOE.cjs');
1835
1835
  require('./chunk-EWPR7662.cjs');
1836
- require('./chunk-XAA5EZ5T.cjs');
1837
- require('./chunk-5MH6BRPY.cjs');
1836
+ require('./chunk-JGZEHBBD.cjs');
1837
+ require('./chunk-LJ46XYYP.cjs');
1838
1838
  require('./chunk-QYLIHZKZ.cjs');
1839
1839
  require('./chunk-63N4FN5V.cjs');
1840
1840
  require('./chunk-UY6A6TEY.cjs');
@@ -1886,7 +1886,7 @@ function entry(logId, minutesAgo, severity, toolType, device2, summary) {
1886
1886
  id: logId,
1887
1887
  logId,
1888
1888
  timestamp: displayTime(_chunkDKOLQPE7cjs.demoMinutesAgo.call(void 0, minutesAgo)),
1889
- status: { label: severity, variant: _chunk4PKORVOXcjs.logSeverityVariant.call(void 0, severity) },
1889
+ status: { label: severity, variant: _chunkWCY35GB5cjs.logSeverityVariant.call(void 0, severity) },
1890
1890
  source: { name: toolType, toolType },
1891
1891
  device: device2,
1892
1892
  description: { title: summary }
@@ -1958,13 +1958,13 @@ var NO_FILTERS = {};
1958
1958
  var ACTION_COLUMNS = ["copy", "quickView", "open"];
1959
1959
  var BESIDE_DRAWER_HIDDEN = [...ACTION_COLUMNS, "tool", "source"];
1960
1960
  var logHref = () => "#";
1961
- var copyAction = () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4PKORVOXcjs.LogCopyIconButton, {});
1961
+ var copyAction = () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWCY35GB5cjs.LogCopyIconButton, {});
1962
1962
  function LogsScreen({ compact = false }) {
1963
1963
  const [dock, setDock] = _react.useState.call(void 0, null);
1964
1964
  const selected = LOGS_FIXTURE_SELECTED;
1965
1965
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex h-full bg-ods-bg", children: [
1966
1966
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "min-w-0 flex-1 overflow-clip", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1967
- _chunk4PKORVOXcjs.LogsPageView,
1967
+ _chunkWCY35GB5cjs.LogsPageView,
1968
1968
  {
1969
1969
  showHeader: false,
1970
1970
  className: "p-[var(--spacing-system-l)]",
@@ -1972,7 +1972,7 @@ function LogsScreen({ compact = false }) {
1972
1972
  onSearchChange: noop,
1973
1973
  onOpenFilters: noop,
1974
1974
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1975
- _chunk4PKORVOXcjs.LogsTableView,
1975
+ _chunkWCY35GB5cjs.LogsTableView,
1976
1976
  {
1977
1977
  logs: LOGS_FIXTURE_ENTRIES,
1978
1978
  facets: LOGS_FIXTURE_FACETS,
@@ -1986,8 +1986,8 @@ function LogsScreen({ compact = false }) {
1986
1986
  )
1987
1987
  }
1988
1988
  ) }),
1989
- !compact && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { ref: setDock, className: "relative w-[calc(400px+var(--spacing-system-m))] shrink-0", children: dock && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4PKORVOXcjs.AppLayoutDrawerContainerContext.Provider, { value: dock, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1990
- _chunk4PKORVOXcjs.LogDrawer,
1989
+ !compact && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { ref: setDock, className: "relative w-[calc(400px+var(--spacing-system-m))] shrink-0", children: dock && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWCY35GB5cjs.AppLayoutDrawerContainerContext.Provider, { value: dock, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1990
+ _chunkWCY35GB5cjs.LogDrawer,
1991
1991
  {
1992
1992
  docked: true,
1993
1993
  isOpen: true,
@@ -1999,12 +1999,12 @@ function LogsScreen({ compact = false }) {
1999
1999
  { label: "Log ID", value: selected.logId },
2000
2000
  {
2001
2001
  label: "Source",
2002
- value: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4PKORVOXcjs.ToolBadge, { toolType: _chunkPS6T65KAcjs.normalizeToolTypeWithFallback.call(void 0, selected.source.toolType) })
2002
+ value: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWCY35GB5cjs.ToolBadge, { toolType: _chunkBM6JZRVDcjs.normalizeToolTypeWithFallback.call(void 0, selected.source.toolType) })
2003
2003
  },
2004
- { label: "Device", value: _chunk4PKORVOXcjs.logSourceLabels.call(void 0, selected.device).deviceName }
2004
+ { label: "Device", value: _chunkWCY35GB5cjs.logSourceLabels.call(void 0, selected.device).deviceName }
2005
2005
  ],
2006
2006
  deviceCard: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2007
- _chunk4PKORVOXcjs.DeviceCard,
2007
+ _chunkWCY35GB5cjs.DeviceCard,
2008
2008
  {
2009
2009
  ...LOGS_FIXTURE_DEVICE,
2010
2010
  actions: {
@@ -10,7 +10,7 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
10
10
 
11
11
 
12
12
 
13
- var _chunk4PKORVOXcjs = require('./chunk-4PKORVOX.cjs');
13
+ var _chunkWCY35GB5cjs = require('./chunk-WCY35GB5.cjs');
14
14
  require('./chunk-URVIPSAJ.cjs');
15
15
  require('./chunk-NTGIQP7O.cjs');
16
16
  require('./chunk-U2O5YQRP.cjs');
@@ -21,10 +21,10 @@ require('./chunk-LU7TD6QS.cjs');
21
21
  require('./chunk-24I6RFVU.cjs');
22
22
  require('./chunk-A6P6DHEZ.cjs');
23
23
  require('./chunk-MZ4KBSH7.cjs');
24
- require('./chunk-YQGDXH3M.cjs');
24
+ require('./chunk-GAGNKWOC.cjs');
25
25
  require('./chunk-YUMFVQIN.cjs');
26
- require('./chunk-PS6T65KA.cjs');
27
- require('./chunk-32Q7K5OP.cjs');
26
+ require('./chunk-BM6JZRVD.cjs');
27
+ require('./chunk-7YDF3QBN.cjs');
28
28
  require('./chunk-OWGLRE74.cjs');
29
29
  require('./chunk-3RFQPQ7Z.cjs');
30
30
  require('./chunk-5TCIRWHL.cjs');
@@ -1825,8 +1825,8 @@ require('./chunk-7DNL734S.cjs');
1825
1825
  require('./chunk-WWUSFOJ7.cjs');
1826
1826
  require('./chunk-SKI6NKOE.cjs');
1827
1827
  require('./chunk-EWPR7662.cjs');
1828
- require('./chunk-XAA5EZ5T.cjs');
1829
- require('./chunk-5MH6BRPY.cjs');
1828
+ require('./chunk-JGZEHBBD.cjs');
1829
+ require('./chunk-LJ46XYYP.cjs');
1830
1830
  require('./chunk-QYLIHZKZ.cjs');
1831
1831
  require('./chunk-63N4FN5V.cjs');
1832
1832
  require('./chunk-UY6A6TEY.cjs');
@@ -1891,14 +1891,14 @@ var POLICIES = [
1891
1891
  policy("policy-local-admins", "No local admins", "No everyday account is a local administrator.", false, 0)
1892
1892
  ];
1893
1893
  var POLICIES_FIXTURE = {
1894
- summary: _chunk4PKORVOXcjs.computePolicySummary.call(void 0, POLICIES),
1894
+ summary: _chunkWCY35GB5cjs.computePolicySummary.call(void 0, POLICIES),
1895
1895
  rows: POLICIES.map((item) => ({
1896
1896
  id: item.id,
1897
1897
  name: item.name,
1898
1898
  description: item.description,
1899
1899
  critical: item.critical,
1900
1900
  severityLabel: item.critical ? "Critical" : "Low",
1901
- status: _chunk4PKORVOXcjs.getPolicyTableStatus.call(void 0, item),
1901
+ status: _chunkWCY35GB5cjs.getPolicyTableStatus.call(void 0, item),
1902
1902
  actions: [
1903
1903
  { label: "Policy Details", onClick: noop },
1904
1904
  { label: "Delete Policy", onClick: noop }
@@ -1912,16 +1912,16 @@ var POLICIES_FIXTURE = {
1912
1912
  var _jsxruntime = require('react/jsx-runtime');
1913
1913
  function PoliciesScreen({ compact = false }) {
1914
1914
  const table = /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1915
- _chunk4PKORVOXcjs.PoliciesTable,
1915
+ _chunkWCY35GB5cjs.PoliciesTable,
1916
1916
  {
1917
1917
  rows: POLICIES_FIXTURE.rows,
1918
1918
  rowAsLink: true,
1919
- rightSlot: compact ? void 0 : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4PKORVOXcjs.DataTable.RowCount, {}),
1919
+ rightSlot: compact ? void 0 : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWCY35GB5cjs.DataTable.RowCount, {}),
1920
1920
  emptyMessage: "No policies found."
1921
1921
  }
1922
1922
  );
1923
1923
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex h-full flex-col gap-[var(--spacing-system-l)] bg-ods-bg p-[var(--spacing-system-l)]", children: [
1924
- !compact && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4PKORVOXcjs.PolicySummaryCards, { summary: POLICIES_FIXTURE.summary, now: POLICIES_FIXTURE.now }),
1924
+ !compact && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWCY35GB5cjs.PolicySummaryCards, { summary: POLICIES_FIXTURE.summary, now: POLICIES_FIXTURE.now }),
1925
1925
  table
1926
1926
  ] });
1927
1927
  }
@@ -13,7 +13,7 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
13
13
 
14
14
 
15
15
 
16
- var _chunk4PKORVOXcjs = require('./chunk-4PKORVOX.cjs');
16
+ var _chunkWCY35GB5cjs = require('./chunk-WCY35GB5.cjs');
17
17
  require('./chunk-URVIPSAJ.cjs');
18
18
  require('./chunk-NTGIQP7O.cjs');
19
19
 
@@ -26,10 +26,10 @@ require('./chunk-LU7TD6QS.cjs');
26
26
  require('./chunk-24I6RFVU.cjs');
27
27
  require('./chunk-A6P6DHEZ.cjs');
28
28
  require('./chunk-MZ4KBSH7.cjs');
29
- require('./chunk-YQGDXH3M.cjs');
29
+ require('./chunk-GAGNKWOC.cjs');
30
30
  require('./chunk-YUMFVQIN.cjs');
31
- require('./chunk-PS6T65KA.cjs');
32
- require('./chunk-32Q7K5OP.cjs');
31
+ require('./chunk-BM6JZRVD.cjs');
32
+ require('./chunk-7YDF3QBN.cjs');
33
33
  require('./chunk-OWGLRE74.cjs');
34
34
  require('./chunk-3RFQPQ7Z.cjs');
35
35
  require('./chunk-5TCIRWHL.cjs');
@@ -1832,8 +1832,8 @@ 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-XAA5EZ5T.cjs');
1836
- require('./chunk-5MH6BRPY.cjs');
1835
+ require('./chunk-JGZEHBBD.cjs');
1836
+ require('./chunk-LJ46XYYP.cjs');
1837
1837
  require('./chunk-QYLIHZKZ.cjs');
1838
1838
  require('./chunk-63N4FN5V.cjs');
1839
1839
  require('./chunk-UY6A6TEY.cjs');
@@ -1995,8 +1995,8 @@ function buildScriptsFixture(cast) {
1995
1995
  var _jsxruntime = require('react/jsx-runtime');
1996
1996
  var WIDE_HIDDEN_COLUMNS = ["result", "open"];
1997
1997
  var COMPACT_COLUMNS = [
1998
- { ..._chunk4PKORVOXcjs.EXECUTION_COLUMNS.machineId, width: "flex-1 min-w-0", hideAt: void 0 },
1999
- _chunk4PKORVOXcjs.EXECUTION_COLUMNS.status
1998
+ { ..._chunkWCY35GB5cjs.EXECUTION_COLUMNS.machineId, width: "flex-1 min-w-0", hideAt: void 0 },
1999
+ _chunkWCY35GB5cjs.EXECUTION_COLUMNS.status
2000
2000
  ];
2001
2001
  var COMPACT_ROWS = 4;
2002
2002
  var TOKEN_CLASS = {
@@ -2055,7 +2055,7 @@ function ScriptCodePicture({ script }) {
2055
2055
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex min-w-0 items-center justify-between gap-[var(--spacing-system-m)]", children: [
2056
2056
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkU2O5YQRPcjs.TruncateText, { variant: "h6", tone: "secondary", children: `Written by ${provenance.author} \xB7 approved by ${provenance.approver}` }),
2057
2057
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2058
- _chunk4PKORVOXcjs.ScriptShellBadge,
2058
+ _chunkWCY35GB5cjs.ScriptShellBadge,
2059
2059
  {
2060
2060
  value: script.shellType,
2061
2061
  className: "shrink-0 text-ods-text-secondary text-h6",
@@ -2079,7 +2079,7 @@ function ScriptsScreen({ compact = false }) {
2079
2079
  return (
2080
2080
  // Four runs of the card's row height fill the frame; the padding is what is left round them.
2081
2081
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full overflow-hidden bg-ods-bg p-[var(--spacing-system-xsf)]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2082
- _chunk4PKORVOXcjs.ScriptExecutionsTable,
2082
+ _chunkWCY35GB5cjs.ScriptExecutionsTable,
2083
2083
  {
2084
2084
  rows: fixture.executions.slice(0, COMPACT_ROWS),
2085
2085
  columns: COMPACT_COLUMNS,
@@ -2089,13 +2089,13 @@ function ScriptsScreen({ compact = false }) {
2089
2089
  ) })
2090
2090
  );
2091
2091
  }
2092
- const renderOutput = (row) => row.id === fixture.openExecutionId ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4PKORVOXcjs.ScriptExecutionResult, { result: row.result, empty: "\u2014" }) : null;
2092
+ const renderOutput = (row) => row.id === fixture.openExecutionId ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWCY35GB5cjs.ScriptExecutionResult, { result: row.result, empty: "\u2014" }) : null;
2093
2093
  return (
2094
2094
  // The frame's tighter padding and no header row: the output opened under a run needs the height.
2095
2095
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex h-full gap-[var(--spacing-system-m)] overflow-hidden bg-ods-bg p-[var(--spacing-system-m)]", children: [
2096
2096
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-[39%] shrink-0", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ScriptCodePicture, { script: fixture.script }) }),
2097
2097
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "min-w-0 flex-1 overflow-hidden", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2098
- _chunk4PKORVOXcjs.ScriptExecutionsTable,
2098
+ _chunkWCY35GB5cjs.ScriptExecutionsTable,
2099
2099
  {
2100
2100
  rows: fixture.executions,
2101
2101
  hideColumns: WIDE_HIDDEN_COLUMNS,
@@ -15,7 +15,7 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
15
15
 
16
16
 
17
17
 
18
- var _chunk4PKORVOXcjs = require('./chunk-4PKORVOX.cjs');
18
+ var _chunkWCY35GB5cjs = require('./chunk-WCY35GB5.cjs');
19
19
  require('./chunk-URVIPSAJ.cjs');
20
20
  require('./chunk-NTGIQP7O.cjs');
21
21
 
@@ -28,10 +28,10 @@ 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-YQGDXH3M.cjs');
31
+ require('./chunk-GAGNKWOC.cjs');
32
32
  require('./chunk-YUMFVQIN.cjs');
33
- require('./chunk-PS6T65KA.cjs');
34
- require('./chunk-32Q7K5OP.cjs');
33
+ require('./chunk-BM6JZRVD.cjs');
34
+ require('./chunk-7YDF3QBN.cjs');
35
35
  require('./chunk-OWGLRE74.cjs');
36
36
  require('./chunk-3RFQPQ7Z.cjs');
37
37
  require('./chunk-5TCIRWHL.cjs');
@@ -1832,8 +1832,8 @@ 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-XAA5EZ5T.cjs');
1836
- require('./chunk-5MH6BRPY.cjs');
1835
+ require('./chunk-JGZEHBBD.cjs');
1836
+ require('./chunk-LJ46XYYP.cjs');
1837
1837
  require('./chunk-QYLIHZKZ.cjs');
1838
1838
  require('./chunk-63N4FN5V.cjs');
1839
1839
  require('./chunk-UY6A6TEY.cjs');
@@ -1922,12 +1922,12 @@ function StaticPackageField({ value }) {
1922
1922
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1923
1923
  _chunkU2O5YQRPcjs.Autocomplete,
1924
1924
  {
1925
- label: _chunk4PKORVOXcjs.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: _chunk4PKORVOXcjs.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
- _chunk4PKORVOXcjs.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
- _chunk4PKORVOXcjs.DeviceSelector,
1956
+ _chunkWCY35GB5cjs.DeviceSelector,
1957
1957
  {
1958
1958
  devices: selected,
1959
1959
  loading: false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.742",
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}