@flamingo-stack/openframe-frontend-core 0.0.732 → 0.0.733

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 (74) hide show
  1. package/dist/{chunk-MEDDKM3A.cjs → chunk-3HPB4H4C.cjs} +2 -2
  2. package/dist/{chunk-22ZK7BA3.cjs → chunk-3KGICRH7.cjs} +1127 -1072
  3. package/dist/{chunk-6KDGIOLP.cjs → chunk-3UTPZW36.cjs} +89 -89
  4. package/dist/{chunk-GID62YEN.cjs → chunk-AAFW4STC.cjs} +3 -3
  5. package/dist/{chunk-6HHUU56Y.cjs → chunk-ATMBJBOI.cjs} +14 -14
  6. package/dist/{chunk-BS4EZZCN.cjs → chunk-AV5533DH.cjs} +15 -15
  7. package/dist/{chunk-SJRR745G.cjs → chunk-BP6R5WDW.cjs} +44 -44
  8. package/dist/{chunk-BDTX2OEE.cjs → chunk-CJVAA7KL.cjs} +32 -32
  9. package/dist/{chunk-RIXGLS5Y.cjs → chunk-DUVOQHQI.cjs} +4 -4
  10. package/dist/{chunk-E3N24573.cjs → chunk-DUXLZPMJ.cjs} +9 -9
  11. package/dist/{chunk-N466AJGN.cjs → chunk-E26I4XH6.cjs} +17 -17
  12. package/dist/{chunk-3BLBWZ6A.cjs → chunk-EMG3T55N.cjs} +7 -7
  13. package/dist/{chunk-PRWBVIWW.cjs → chunk-EQORT7NK.cjs} +59 -59
  14. package/dist/{chunk-AEVGCB3Y.cjs → chunk-FCGLSWKR.cjs} +4 -4
  15. package/dist/{chunk-MANNIJ42.cjs → chunk-FICJS5OA.cjs} +6 -0
  16. package/dist/{chunk-OI7VCXYU.cjs → chunk-FNRMDDVN.cjs} +40 -40
  17. package/dist/{chunk-KLXHCNDC.cjs → chunk-FTTLBMHU.cjs} +3 -3
  18. package/dist/{chunk-C5NERNE6.cjs → chunk-GB3CHAW7.cjs} +93 -93
  19. package/dist/{chunk-7DUXR4HL.cjs → chunk-GVTDVS5U.cjs} +3 -3
  20. package/dist/{chunk-5HMGK3N6.cjs → chunk-HSWHOCZ3.cjs} +20 -20
  21. package/dist/{chunk-CUF3IYIB.cjs → chunk-IC4FT3A6.cjs} +28 -28
  22. package/dist/{chunk-TLDCSTTQ.cjs → chunk-J7JKPTGO.cjs} +10 -10
  23. package/dist/{chunk-G37LT2ID.cjs → chunk-L4ZNR5V7.cjs} +38 -38
  24. package/dist/{chunk-NYY25425.cjs → chunk-MYBTNOS6.cjs} +2 -2
  25. package/dist/{chunk-HELVKMRG.cjs → chunk-NTJE6SM6.cjs} +2 -2
  26. package/dist/{chunk-XOQ2UUVS.cjs → chunk-P3R23TOE.cjs} +35 -35
  27. package/dist/{chunk-CC3LINHF.cjs → chunk-SA7LDEVJ.cjs} +3 -3
  28. package/dist/{chunk-YGKVHSNQ.cjs → chunk-TIMCHP4X.cjs} +42 -42
  29. package/dist/{chunk-MVZ6XFPK.cjs → chunk-U4T5NLZD.cjs} +8 -8
  30. package/dist/{chunk-5HSMTSHU.cjs → chunk-XDWY6HAW.cjs} +24 -24
  31. package/dist/{chunk-OJ3XU3YZ.cjs → chunk-XY632BCH.cjs} +4 -4
  32. package/dist/{chunk-ZWMPAFGB.cjs → chunk-YIXKH2JO.cjs} +236 -236
  33. package/dist/{chunk-I46MQ4R5.cjs → chunk-ZBNA6TCW.cjs} +73 -73
  34. package/dist/{chunk-QMTC3BK3.cjs → chunk-ZJNYWNCB.cjs} +21 -21
  35. package/dist/{chunk-HH4BMYDX.cjs → chunk-ZRYKDN2J.cjs} +19 -19
  36. package/dist/{cloud-tenants-ILRE74JY.cjs → cloud-tenants-3GOGR3EN.cjs} +21 -21
  37. package/dist/components/case-studies/index.cjs +34 -34
  38. package/dist/components/chat/embeddable-chat.d.ts +16 -0
  39. package/dist/components/chat/embeddable-chat.d.ts.map +1 -1
  40. package/dist/components/chat/embeddable-chat.js +5 -2
  41. package/dist/components/chat/index.cjs +15 -15
  42. package/dist/components/chat/utils/icon-library.d.ts.map +1 -1
  43. package/dist/components/chat/utils/icon-library.js +6 -0
  44. package/dist/components/contact/index.cjs +22 -22
  45. package/dist/components/docs/index.cjs +25 -25
  46. package/dist/components/embeds/index.cjs +22 -22
  47. package/dist/components/faq/index.cjs +22 -22
  48. package/dist/components/features/index.cjs +21 -21
  49. package/dist/components/help-center-pages/index.cjs +137 -137
  50. package/dist/components/index.cjs +76 -76
  51. package/dist/components/meeting-scheduler/index.cjs +63 -63
  52. package/dist/components/navigation/index.cjs +24 -24
  53. package/dist/components/onboarding-guides/index.cjs +24 -24
  54. package/dist/components/product-demo/index.cjs +8 -8
  55. package/dist/components/related-content/index.cjs +9 -9
  56. package/dist/components/tickets/index.cjs +25 -25
  57. package/dist/components/ui/index.cjs +21 -21
  58. package/dist/components/ui/searchable-select.d.ts +29 -3
  59. package/dist/components/ui/searchable-select.d.ts.map +1 -1
  60. package/dist/components/ui/searchable-select.js +101 -45
  61. package/dist/{devices-A6SFNGE4.cjs → devices-POZXTP7X.cjs} +22 -22
  62. package/dist/{embeddable-chat-BKPYNOIM.cjs → embeddable-chat-I3Y5GCCR.cjs} +95 -92
  63. package/dist/hooks/index.cjs +8 -8
  64. package/dist/index.cjs +27 -27
  65. package/dist/{knowledge-5ZCVKUYV.cjs → knowledge-AP34IMXN.cjs} +22 -22
  66. package/dist/{logs-CL4OJASB.cjs → logs-CEVMIOPW.cjs} +29 -29
  67. package/dist/{policies-7D44ZVS5.cjs → policies-AMBMRCGB.cjs} +25 -25
  68. package/dist/{remote-session-QB3CIZRM.cjs → remote-session-Z4YZFG5E.cjs} +9 -9
  69. package/dist/{software-update-AX6TZL26.cjs → software-update-Z3MWMSHI.cjs} +25 -25
  70. package/dist/{tickets-board-7FAV2YWF.cjs → tickets-board-JOSYLOS7.cjs} +12 -12
  71. package/package.json +1 -1
  72. package/src/components/chat/embeddable-chat.tsx +29 -2
  73. package/src/components/chat/utils/icon-library.tsx +7 -0
  74. package/src/components/ui/searchable-select.tsx +124 -32
@@ -1,28 +1,40 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as PopoverPrimitive from "@radix-ui/react-popover";
4
- import { useMemo, useState } from "react";
4
+ import { useId, useMemo, useState } from "react";
5
5
  import { useKeyboardCollisionPadding } from "../../hooks/ui/use-keyboard-collision-padding.js";
6
6
  import { cn } from "../../utils/cn.js";
7
7
  import { CheckIcon, SearchIcon } from "../icons-v2-generated/index.js";
8
8
  import { Chevron02DownIcon } from "../icons-v2-generated/arrows/chevron-02-down-icon.js";
9
+ import { FieldWrapper } from "./field-wrapper.js";
9
10
  import { Input } from "./input.js";
10
- function SearchableSelect({
11
- options,
12
- value = null,
13
- onValueChange,
14
- placeholder = "Select...",
15
- searchPlaceholder = "Search...",
16
- emptyText = "No results found",
17
- loadingText = "Loading\u2026",
18
- isLoading = false,
19
- disabled = false,
20
- trigger,
21
- renderOption,
22
- align = "start",
23
- className,
24
- contentClassName
25
- }) {
11
+ function SearchableSelect(allProps) {
12
+ const {
13
+ options,
14
+ value = null,
15
+ onValueChange,
16
+ placeholder = "Select...",
17
+ searchPlaceholder = "Search...",
18
+ emptyText = "No results found",
19
+ loadingText = "Loading\u2026",
20
+ isLoading = false,
21
+ disabled = false,
22
+ trigger,
23
+ id,
24
+ label,
25
+ labelVariant,
26
+ error,
27
+ layout = "list",
28
+ renderOption,
29
+ align = "start",
30
+ className,
31
+ contentClassName
32
+ } = allProps;
33
+ const errorSlot = "error" in allProps;
34
+ const isInvalid = !!error;
35
+ const isGrid = layout === "grid";
36
+ const generatedId = useId();
37
+ const triggerId = id ?? generatedId;
26
38
  const [isOpen, setIsOpen] = useState(false);
27
39
  const [search, setSearch] = useState("");
28
40
  const keyboardPadding = useKeyboardCollisionPadding();
@@ -30,7 +42,9 @@ function SearchableSelect({
30
42
  const filtered = useMemo(() => {
31
43
  const q = search.trim().toLowerCase();
32
44
  if (!q) return options;
33
- return options.filter((o) => o.label.toLowerCase().includes(q));
45
+ return options.filter(
46
+ (o) => o.label.toLowerCase().includes(q) || (o.keywords ?? []).some((k) => k.toLowerCase().includes(q))
47
+ );
34
48
  }, [options, search]);
35
49
  const selectedOption = useMemo(
36
50
  () => value != null ? options.find((o) => o.value === value) : void 0,
@@ -43,8 +57,10 @@ function SearchableSelect({
43
57
  const defaultTrigger = /* @__PURE__ */ jsxs(
44
58
  "button",
45
59
  {
60
+ id: triggerId,
46
61
  type: "button",
47
62
  disabled,
63
+ "data-invalid": isInvalid || void 0,
48
64
  className: cn(
49
65
  // Mirrors SelectTrigger so the closed state is indistinguishable from
50
66
  // the regular Select.
@@ -52,24 +68,36 @@ function SearchableSelect({
52
68
  "border-ods-border bg-ods-card text-h4",
53
69
  selectedOption ? "text-ods-text-primary" : "text-ods-text-secondary",
54
70
  "enabled:hover:border-ods-border-hover enabled:hover:bg-ods-bg-hover enabled:active:border-ods-border-active enabled:active:bg-ods-bg-active",
55
- "data-[state=open]:border-ods-accent data-[state=open]:hover:border-ods-accent",
71
+ !isInvalid && "data-[state=open]:border-ods-accent data-[state=open]:hover:border-ods-accent",
56
72
  "group cursor-pointer transition-colors duration-200 disabled:!cursor-not-allowed disabled:bg-ods-bg",
73
+ isInvalid && "border-ods-error enabled:hover:border-ods-error enabled:active:border-ods-error data-[state=open]:border-ods-error",
57
74
  className
58
75
  ),
59
76
  children: [
60
- /* @__PURE__ */ jsx("span", { className: "line-clamp-1", children: selectedOption ? selectedOption.label : placeholder }),
77
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
78
+ selectedOption?.icon,
79
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: selectedOption ? selectedOption.label : placeholder })
80
+ ] }),
61
81
  /* @__PURE__ */ jsx(
62
82
  Chevron02DownIcon,
63
83
  {
64
- className: "shrink-0 text-ods-text-secondary transition-all duration-200 group-data-[state=open]:rotate-180 group-data-[state=open]:text-ods-accent",
84
+ className: cn(
85
+ "shrink-0 text-ods-text-secondary transition-all duration-200 group-data-[state=open]:rotate-180",
86
+ isInvalid ? "text-ods-error" : "group-data-[state=open]:text-ods-accent"
87
+ ),
65
88
  size: 24
66
89
  }
67
90
  )
68
91
  ]
69
92
  }
70
93
  );
94
+ const triggerElement = /* @__PURE__ */ jsx(PopoverPrimitive.Trigger, { asChild: true, children: trigger ?? defaultTrigger });
95
+ const statusClass = cn(
96
+ "px-[var(--spacing-system-sf)] py-[var(--spacing-system-s)] text-ods-text-secondary text-h5",
97
+ isGrid && "col-span-full"
98
+ );
71
99
  return /* @__PURE__ */ jsxs(PopoverPrimitive.Root, { open: isOpen, onOpenChange: disabled ? void 0 : setIsOpen, modal: false, children: [
72
- /* @__PURE__ */ jsx(PopoverPrimitive.Trigger, { asChild: true, children: trigger ?? defaultTrigger }),
100
+ !trigger && (label !== void 0 || errorSlot) ? /* @__PURE__ */ jsx(FieldWrapper, { label, htmlFor: triggerId, labelVariant, error, errorSlot, children: triggerElement }) : triggerElement,
73
101
  /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
74
102
  PopoverPrimitive.Content,
75
103
  {
@@ -97,29 +125,57 @@ function SearchableSelect({
97
125
  className: "rounded-none border-0"
98
126
  }
99
127
  ) }),
100
- /* @__PURE__ */ jsx("div", { className: "max-h-80 min-h-0 overflow-y-auto py-[var(--spacing-system-xs)]", role: "listbox", children: isLoading ? /* @__PURE__ */ jsx("div", { className: "px-[var(--spacing-system-sf)] py-[var(--spacing-system-s)] text-ods-text-secondary text-h5", children: loadingText }) : filtered.length === 0 ? /* @__PURE__ */ jsx("div", { className: "px-[var(--spacing-system-sf)] py-[var(--spacing-system-s)] text-ods-text-secondary text-h5", children: emptyText }) : filtered.map((opt) => {
101
- const isSelected = value === opt.value;
102
- return /* @__PURE__ */ jsx(
103
- "button",
104
- {
105
- type: "button",
106
- role: "option",
107
- "aria-selected": isSelected,
108
- onClick: () => handleSelect(opt.value),
109
- className: cn(
110
- "flex w-full items-center gap-[var(--spacing-system-xs)] px-[var(--spacing-system-sf)] py-[var(--spacing-system-xs)] text-left",
111
- "transition-colors hover:bg-ods-bg-hover",
112
- isSelected && "bg-ods-bg-hover"
113
- ),
114
- children: renderOption ? renderOption(opt, isSelected) : /* @__PURE__ */ jsxs(Fragment, { children: [
115
- opt.icon,
116
- /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-ods-text-primary text-h4", title: opt.label, children: opt.label }),
117
- isSelected && /* @__PURE__ */ jsx(CheckIcon, { className: "size-4 shrink-0 text-ods-accent" })
118
- ] })
119
- },
120
- opt.value
121
- );
122
- }) })
128
+ /* @__PURE__ */ jsx(
129
+ "div",
130
+ {
131
+ className: cn(
132
+ "max-h-80 min-h-0 overflow-y-auto",
133
+ // Tiles grow from 7rem: the popover's own border and a classic
134
+ // always-on scrollbar both eat into the track, so 7.5rem (the
135
+ // Figma cell) dropped a 360px popover to two columns. The column
136
+ // count follows the popover width. Each tile draws its own
137
+ // bottom/right rule, so the grid needs no gap.
138
+ isGrid ? "grid grid-cols-[repeat(auto-fill,minmax(7rem,1fr))]" : "py-[var(--spacing-system-xs)]"
139
+ ),
140
+ role: "listbox",
141
+ children: isLoading ? /* @__PURE__ */ jsx("div", { className: statusClass, children: loadingText }) : filtered.length === 0 ? /* @__PURE__ */ jsx("div", { className: statusClass, children: emptyText }) : filtered.map((opt) => {
142
+ const isSelected = value === opt.value;
143
+ return /* @__PURE__ */ jsx(
144
+ "button",
145
+ {
146
+ type: "button",
147
+ role: "option",
148
+ "aria-selected": isSelected,
149
+ onClick: () => handleSelect(opt.value),
150
+ className: cn(
151
+ "transition-colors hover:bg-ods-bg-hover",
152
+ isGrid ? "flex min-w-0 flex-col items-center justify-center gap-[var(--spacing-system-xxs)] border-b border-r border-ods-border p-[var(--spacing-system-xs)]" : "flex w-full items-center gap-[var(--spacing-system-xs)] px-[var(--spacing-system-sf)] py-[var(--spacing-system-xs)] text-left",
153
+ isSelected && "bg-ods-bg-hover"
154
+ ),
155
+ children: renderOption ? renderOption(opt, isSelected) : isGrid ? /* @__PURE__ */ jsxs(Fragment, { children: [
156
+ opt.icon,
157
+ /* @__PURE__ */ jsx(
158
+ "span",
159
+ {
160
+ className: cn(
161
+ "w-full truncate text-center text-h6",
162
+ isSelected ? "text-ods-text-primary" : "text-ods-text-secondary"
163
+ ),
164
+ title: opt.label,
165
+ children: opt.label
166
+ }
167
+ )
168
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
169
+ opt.icon,
170
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-ods-text-primary text-h4", title: opt.label, children: opt.label }),
171
+ isSelected && /* @__PURE__ */ jsx(CheckIcon, { className: "size-4 shrink-0 text-ods-accent" })
172
+ ] })
173
+ },
174
+ opt.value
175
+ );
176
+ })
177
+ }
178
+ )
123
179
  ]
124
180
  }
125
181
  ) })
@@ -11,24 +11,24 @@ require('./chunk-KHXZFLIN.cjs');
11
11
 
12
12
 
13
13
 
14
- var _chunk22ZK7BA3cjs = require('./chunk-22ZK7BA3.cjs');
15
- require('./chunk-QMTC3BK3.cjs');
16
- require('./chunk-MEDDKM3A.cjs');
17
- require('./chunk-G37LT2ID.cjs');
14
+ var _chunk3KGICRH7cjs = require('./chunk-3KGICRH7.cjs');
15
+ require('./chunk-ZJNYWNCB.cjs');
16
+ require('./chunk-3HPB4H4C.cjs');
17
+ require('./chunk-L4ZNR5V7.cjs');
18
18
  require('./chunk-HQQE74RO.cjs');
19
19
  require('./chunk-DEY6XXGO.cjs');
20
- require('./chunk-SJRR745G.cjs');
21
- require('./chunk-GID62YEN.cjs');
20
+ require('./chunk-BP6R5WDW.cjs');
21
+ require('./chunk-AAFW4STC.cjs');
22
22
  require('./chunk-24I6RFVU.cjs');
23
23
  require('./chunk-A6P6DHEZ.cjs');
24
24
  require('./chunk-MZ4KBSH7.cjs');
25
25
  require('./chunk-OXJ57643.cjs');
26
26
  require('./chunk-YUMFVQIN.cjs');
27
- require('./chunk-6KDGIOLP.cjs');
28
- require('./chunk-ZWMPAFGB.cjs');
29
- require('./chunk-HH4BMYDX.cjs');
27
+ require('./chunk-3UTPZW36.cjs');
28
+ require('./chunk-YIXKH2JO.cjs');
29
+ require('./chunk-ZRYKDN2J.cjs');
30
30
  require('./chunk-HZJRERJW.cjs');
31
- require('./chunk-E3N24573.cjs');
31
+ require('./chunk-DUXLZPMJ.cjs');
32
32
  require('./chunk-MJGX357L.cjs');
33
33
  require('./chunk-ZOZR3QI2.cjs');
34
34
  require('./chunk-OMV5S5PI.cjs');
@@ -1818,20 +1818,20 @@ require('./chunk-LMBYZITR.cjs');
1818
1818
  require('./chunk-TMVC7S2R.cjs');
1819
1819
  require('./chunk-IYHH5EIO.cjs');
1820
1820
  require('./chunk-XIBCMGBW.cjs');
1821
- require('./chunk-RIXGLS5Y.cjs');
1822
- require('./chunk-CC3LINHF.cjs');
1823
- require('./chunk-HELVKMRG.cjs');
1821
+ require('./chunk-DUVOQHQI.cjs');
1822
+ require('./chunk-SA7LDEVJ.cjs');
1823
+ require('./chunk-NTJE6SM6.cjs');
1824
1824
  require('./chunk-JKX2C3I2.cjs');
1825
1825
  require('./chunk-7DNL734S.cjs');
1826
1826
  require('./chunk-WWUSFOJ7.cjs');
1827
1827
  require('./chunk-SKI6NKOE.cjs');
1828
1828
  require('./chunk-EWPR7662.cjs');
1829
- require('./chunk-TLDCSTTQ.cjs');
1830
- require('./chunk-XOQ2UUVS.cjs');
1831
- require('./chunk-AEVGCB3Y.cjs');
1829
+ require('./chunk-J7JKPTGO.cjs');
1830
+ require('./chunk-P3R23TOE.cjs');
1831
+ require('./chunk-FCGLSWKR.cjs');
1832
1832
  require('./chunk-YADG5Q7C.cjs');
1833
- require('./chunk-NYY25425.cjs');
1834
- require('./chunk-KLXHCNDC.cjs');
1833
+ require('./chunk-MYBTNOS6.cjs');
1834
+ require('./chunk-FTTLBMHU.cjs');
1835
1835
  require('./chunk-S5C3OZCO.cjs');
1836
1836
  require('./chunk-32ASZMTV.cjs');
1837
1837
  require('./chunk-OOYBIS7D.cjs');
@@ -1843,8 +1843,8 @@ require('./chunk-BLH2SFOO.cjs');
1843
1843
  require('./chunk-EAY6ZUES.cjs');
1844
1844
  require('./chunk-PX7FY655.cjs');
1845
1845
  require('./chunk-CW3ML76U.cjs');
1846
- require('./chunk-7DUXR4HL.cjs');
1847
- require('./chunk-MANNIJ42.cjs');
1846
+ require('./chunk-GVTDVS5U.cjs');
1847
+ require('./chunk-FICJS5OA.cjs');
1848
1848
  require('./chunk-VOX4E6AX.cjs');
1849
1849
  require('./chunk-UR4K2NSL.cjs');
1850
1850
  require('./chunk-UJ7AXHRZ.cjs');
@@ -1865,14 +1865,14 @@ require('./chunk-3ATAYP36.cjs');
1865
1865
  // src/components/product-demo/screens/devices.tsx
1866
1866
  var _react = require('react');
1867
1867
  var _jsxruntime = require('react/jsx-runtime');
1868
- var TOOLBAR = { ..._chunk22ZK7BA3cjs.IDLE_DEVICES_TOOLBAR, searchValue: _chunkWFPCCBOMcjs.DEVICES_SEARCH_QUERY };
1868
+ var TOOLBAR = { ..._chunk3KGICRH7cjs.IDLE_DEVICES_TOOLBAR, searchValue: _chunkWFPCCBOMcjs.DEVICES_SEARCH_QUERY };
1869
1869
  var NO_HEADER = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, {});
1870
1870
  var HIDDEN_WHEN_COMPACT = ["organization"];
1871
1871
  function DevicesScreen({ compact = false }) {
1872
1872
  const cast = _chunkII4QMH26cjs.useProductDemoCast.call(void 0, );
1873
1873
  const fixture = _react.useMemo.call(void 0, () => _chunkWFPCCBOMcjs.buildWindowsDevicesFixture.call(void 0, cast), [cast]);
1874
1874
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full bg-ods-bg", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1875
- _chunk22ZK7BA3cjs.DevicesPanelView,
1875
+ _chunk3KGICRH7cjs.DevicesPanelView,
1876
1876
  {
1877
1877
  className: "p-[var(--spacing-system-l)]",
1878
1878
  headerSlot: NO_HEADER,