@flamingo-stack/openframe-frontend-core 0.0.538 → 0.0.539-snapshot.20260814140351

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 (101) hide show
  1. package/dist/{chunk-C6NKOHFW.js → chunk-2BKR65LQ.js} +2 -2
  2. package/dist/{chunk-PFGRHRBO.cjs → chunk-4PZEGH6E.cjs} +5 -5
  3. package/dist/{chunk-PFGRHRBO.cjs.map → chunk-4PZEGH6E.cjs.map} +1 -1
  4. package/dist/{chunk-F4QOOHZL.cjs → chunk-4RXV54PY.cjs} +11 -11
  5. package/dist/{chunk-F4QOOHZL.cjs.map → chunk-4RXV54PY.cjs.map} +1 -1
  6. package/dist/{chunk-ZBRKTF6S.js → chunk-5W4R3BUR.js} +2 -2
  7. package/dist/{chunk-LJW7B6GY.cjs → chunk-5ZRO72K4.cjs} +9 -9
  8. package/dist/{chunk-LJW7B6GY.cjs.map → chunk-5ZRO72K4.cjs.map} +1 -1
  9. package/dist/{chunk-YO5BWF4L.cjs → chunk-6PBD57IZ.cjs} +14 -14
  10. package/dist/{chunk-YO5BWF4L.cjs.map → chunk-6PBD57IZ.cjs.map} +1 -1
  11. package/dist/{chunk-56QT3JBZ.js → chunk-6WUUZ43M.js} +2 -2
  12. package/dist/{chunk-QQ3HUSDJ.cjs → chunk-75W6ETMW.cjs} +408 -404
  13. package/dist/chunk-75W6ETMW.cjs.map +1 -0
  14. package/dist/{chunk-73W4L656.js → chunk-AQO2DWL2.js} +2 -2
  15. package/dist/{chunk-C6776X43.cjs → chunk-DC23N4XW.cjs} +26 -26
  16. package/dist/{chunk-C6776X43.cjs.map → chunk-DC23N4XW.cjs.map} +1 -1
  17. package/dist/{chunk-ZHW5VLHY.js → chunk-F5R4IMRF.js} +2 -2
  18. package/dist/{chunk-ZNWW4WAT.cjs → chunk-GRU75FOX.cjs} +26 -26
  19. package/dist/{chunk-ZNWW4WAT.cjs.map → chunk-GRU75FOX.cjs.map} +1 -1
  20. package/dist/{chunk-TWVRCPWY.cjs → chunk-IHGRWAUC.cjs} +61 -61
  21. package/dist/{chunk-TWVRCPWY.cjs.map → chunk-IHGRWAUC.cjs.map} +1 -1
  22. package/dist/{chunk-EH6LNTOT.js → chunk-IP4IZ4PB.js} +5 -5
  23. package/dist/{chunk-QU6P2U2Q.cjs → chunk-IRTAZKWK.cjs} +3 -3
  24. package/dist/{chunk-QU6P2U2Q.cjs.map → chunk-IRTAZKWK.cjs.map} +1 -1
  25. package/dist/{chunk-4BK5Z763.js → chunk-MKDOZF4C.js} +2 -2
  26. package/dist/{chunk-NUHDE7CB.cjs → chunk-MXKY67SV.cjs} +37 -37
  27. package/dist/{chunk-NUHDE7CB.cjs.map → chunk-MXKY67SV.cjs.map} +1 -1
  28. package/dist/{chunk-MGYNZ7SA.cjs → chunk-N24ZUZZZ.cjs} +31 -31
  29. package/dist/{chunk-MGYNZ7SA.cjs.map → chunk-N24ZUZZZ.cjs.map} +1 -1
  30. package/dist/{chunk-RBBWKSRC.js → chunk-NQSGY5HW.js} +20 -16
  31. package/dist/{chunk-RBBWKSRC.js.map → chunk-NQSGY5HW.js.map} +1 -1
  32. package/dist/{chunk-BUKQ6B65.cjs → chunk-PV6L6F3T.cjs} +87 -87
  33. package/dist/{chunk-BUKQ6B65.cjs.map → chunk-PV6L6F3T.cjs.map} +1 -1
  34. package/dist/{chunk-NE67LT3B.cjs → chunk-TBMMC4GS.cjs} +7 -7
  35. package/dist/{chunk-NE67LT3B.cjs.map → chunk-TBMMC4GS.cjs.map} +1 -1
  36. package/dist/{chunk-BNF6FZLP.js → chunk-VUVKZBDO.js} +4 -4
  37. package/dist/{chunk-7CBQWZAH.js → chunk-VYQLCGFR.js} +4 -4
  38. package/dist/{chunk-67CKAX7Z.js → chunk-WA3IEPEY.js} +2 -2
  39. package/dist/{chunk-KUKHUECE.js → chunk-X5VMEFIA.js} +2 -2
  40. package/dist/{chunk-QK4SQAYG.js → chunk-XPGB6J75.js} +6 -6
  41. package/dist/{chunk-UBEVU6LS.js → chunk-Y5TDZNWA.js} +2 -2
  42. package/dist/{chunk-R3XO2KO4.cjs → chunk-YPTOQDCY.cjs} +4 -4
  43. package/dist/{chunk-R3XO2KO4.cjs.map → chunk-YPTOQDCY.cjs.map} +1 -1
  44. package/dist/components/case-studies/index.cjs +8 -8
  45. package/dist/components/case-studies/index.js +2 -2
  46. package/dist/components/chat/index.cjs +2 -2
  47. package/dist/components/chat/index.js +1 -1
  48. package/dist/components/contact/index.cjs +3 -3
  49. package/dist/components/contact/index.js +2 -2
  50. package/dist/components/docs/index.cjs +5 -5
  51. package/dist/components/docs/index.js +4 -4
  52. package/dist/components/embeds/index.cjs +3 -3
  53. package/dist/components/embeds/index.js +2 -2
  54. package/dist/components/faq/index.cjs +3 -3
  55. package/dist/components/faq/index.js +2 -2
  56. package/dist/components/features/index.cjs +2 -2
  57. package/dist/components/features/index.js +1 -1
  58. package/dist/components/help-center-pages/index.cjs +22 -22
  59. package/dist/components/help-center-pages/index.js +13 -13
  60. package/dist/components/index.cjs +132 -132
  61. package/dist/components/index.js +11 -11
  62. package/dist/components/meeting-scheduler/index.cjs +34 -34
  63. package/dist/components/meeting-scheduler/index.js +3 -3
  64. package/dist/components/navigation/index.cjs +2 -2
  65. package/dist/components/navigation/index.js +1 -1
  66. package/dist/components/navigation/mobile-burger-menu.d.ts.map +1 -1
  67. package/dist/components/navigation/navigation-sidebar.d.ts.map +1 -1
  68. package/dist/components/onboarding-guides/index.cjs +5 -5
  69. package/dist/components/onboarding-guides/index.js +4 -4
  70. package/dist/components/related-content/index.cjs +3 -3
  71. package/dist/components/related-content/index.js +2 -2
  72. package/dist/components/tickets/index.cjs +6 -6
  73. package/dist/components/tickets/index.js +5 -5
  74. package/dist/components/ui/index.cjs +2 -2
  75. package/dist/components/ui/index.js +1 -1
  76. package/dist/components/ui/reopen-ticket-modal.d.ts +6 -5
  77. package/dist/components/ui/reopen-ticket-modal.d.ts.map +1 -1
  78. package/dist/index.cjs +2 -2
  79. package/dist/index.js +1 -1
  80. package/dist/types/navigation.d.ts +25 -0
  81. package/dist/types/navigation.d.ts.map +1 -1
  82. package/package.json +1 -1
  83. package/src/components/navigation/mobile-burger-menu.tsx +5 -0
  84. package/src/components/navigation/navigation-sidebar.tsx +26 -19
  85. package/src/components/ui/reopen-ticket-modal.tsx +9 -8
  86. package/src/stories/ReopenTicketModal.stories.tsx +8 -8
  87. package/src/types/navigation.ts +23 -0
  88. package/dist/chunk-QQ3HUSDJ.cjs.map +0 -1
  89. /package/dist/{chunk-C6NKOHFW.js.map → chunk-2BKR65LQ.js.map} +0 -0
  90. /package/dist/{chunk-ZBRKTF6S.js.map → chunk-5W4R3BUR.js.map} +0 -0
  91. /package/dist/{chunk-56QT3JBZ.js.map → chunk-6WUUZ43M.js.map} +0 -0
  92. /package/dist/{chunk-73W4L656.js.map → chunk-AQO2DWL2.js.map} +0 -0
  93. /package/dist/{chunk-ZHW5VLHY.js.map → chunk-F5R4IMRF.js.map} +0 -0
  94. /package/dist/{chunk-EH6LNTOT.js.map → chunk-IP4IZ4PB.js.map} +0 -0
  95. /package/dist/{chunk-4BK5Z763.js.map → chunk-MKDOZF4C.js.map} +0 -0
  96. /package/dist/{chunk-BNF6FZLP.js.map → chunk-VUVKZBDO.js.map} +0 -0
  97. /package/dist/{chunk-7CBQWZAH.js.map → chunk-VYQLCGFR.js.map} +0 -0
  98. /package/dist/{chunk-67CKAX7Z.js.map → chunk-WA3IEPEY.js.map} +0 -0
  99. /package/dist/{chunk-KUKHUECE.js.map → chunk-X5VMEFIA.js.map} +0 -0
  100. /package/dist/{chunk-QK4SQAYG.js.map → chunk-XPGB6J75.js.map} +0 -0
  101. /package/dist/{chunk-UBEVU6LS.js.map → chunk-Y5TDZNWA.js.map} +0 -0
@@ -19,8 +19,7 @@ const REASON_MAX_LENGTH = 1000;
19
19
 
20
20
  export interface ReopenTicketSelection {
21
21
  statusId: string;
22
- /** `null` — reopen without an assignee (the ticket stays unassigned). */
23
- assigneeId: string | null;
22
+ assigneeId: string;
24
23
  /** Trimmed; `null` when the field was left blank. */
25
24
  reason: string | null;
26
25
  }
@@ -39,8 +38,9 @@ export interface ReopenTicketModalProps {
39
38
  assigneesLoading?: boolean;
40
39
  /** Pre-selected status; falls back to the first status option. */
41
40
  initialStatusId?: string | null;
42
- /** Pre-selected assignee. Unlike Take Over, the assignee is OPTIONAL —
43
- * a reopened ticket may stay unassigned (it is flagged for triage). */
41
+ /** Pre-selected assignee (the design default restores the ticket's previous
42
+ * assignee). No fallback — with none selected the CTA stays locked, same
43
+ * as Take Over: both Status and Assigned are required to confirm. */
44
44
  initialAssigneeId?: string | null;
45
45
  /** Confirm in-flight: buttons lock and the modal refuses to close. */
46
46
  isPending?: boolean;
@@ -50,7 +50,8 @@ export interface ReopenTicketModalProps {
50
50
  /**
51
51
  * Reopen Ticket dialog (Figma openframe---tickets 8456-17581): shown when a
52
52
  * technician reopens a Resolved/Archived ticket. Same Status + Assigned pair
53
- * as {@link TakeOverTicketModal} plus an optional free-text reason.
53
+ * as {@link TakeOverTicketModal} — both REQUIRED before the CTA unlocks —
54
+ * plus an optional free-text reason.
54
55
  * Presentational — the consumer supplies the option lists, their ordering and
55
56
  * default selections, and performs the actual reopen in `onConfirm`.
56
57
  *
@@ -86,11 +87,11 @@ export function ReopenTicketModal({
86
87
  const selectedAssignee = assigneeOptions.find(o => o.value === assigneeId);
87
88
 
88
89
  const handleConfirm = () => {
89
- if (!selectedStatusId || isPending) return;
90
+ if (!selectedStatusId || !assigneeId || isPending) return;
90
91
  const trimmedReason = reason.trim();
91
92
  onConfirm({
92
93
  statusId: selectedStatusId,
93
- assigneeId: assigneeId ?? null,
94
+ assigneeId,
94
95
  reason: trimmedReason ? trimmedReason.slice(0, REASON_MAX_LENGTH) : null,
95
96
  });
96
97
  };
@@ -163,7 +164,7 @@ export function ReopenTicketModal({
163
164
  variant="accent"
164
165
  onClick={handleConfirm}
165
166
  loading={isPending}
166
- disabled={!selectedStatusId}
167
+ disabled={!selectedStatusId || !assigneeId}
167
168
  className="flex-1"
168
169
  >
169
170
  Reopen Ticket
@@ -17,10 +17,10 @@ const meta = {
17
17
  description: {
18
18
  component:
19
19
  'Reopen Ticket dialog (Figma openframe---tickets 8456-17581): shown when a technician reopens a ' +
20
- 'Resolved/Archived ticket. Same Status + Assigned pair as TakeOverTicketModal plus an optional free-text ' +
21
- 'reason. Unlike Take Over, the assignee is optional - a reopened ticket may stay unassigned. ' +
22
- 'Presentational - the consumer supplies option lists (design default pre-selects Tech Required), ' +
23
- 'default selections, and performs the actual reopen in onConfirm.',
20
+ 'Resolved/Archived ticket. Same Status + Assigned pair as TakeOverTicketModal - both required before ' +
21
+ 'the CTA unlocks - plus an optional free-text reason. Presentational - the consumer supplies option ' +
22
+ 'lists (design default pre-selects Tech Required), default selections, and performs the actual reopen ' +
23
+ 'in onConfirm.',
24
24
  },
25
25
  },
26
26
  },
@@ -98,11 +98,11 @@ export const Default: Story = {
98
98
  };
99
99
 
100
100
  /**
101
- * No assignee - the reopen still confirms and the ticket stays unassigned
102
- * (flagged for triage). This is the deliberate difference from Take Over,
103
- * where the CTA locks until a technician is picked.
101
+ * No assignee pre-selected (e.g. the ticket was unassigned): the CTA stays
102
+ * locked until a technician is chosen - both fields are required, matching
103
+ * Take Over.
104
104
  */
105
- export const NoAssignee: Story = {
105
+ export const NoDefaultAssignee: Story = {
106
106
  args: { ...Default.args, initialAssigneeId: null },
107
107
  render: args => <ControlledModal {...args} />,
108
108
  };
@@ -126,6 +126,29 @@ export interface NavigationSidebarConfig {
126
126
  * expects so the placeholder and the loaded nav are the same height.
127
127
  */
128
128
  loadingRows?: { primary?: number; secondary?: number }
129
+ /**
130
+ * Host-owned content rendered above the primary navigation — an action that
131
+ * belongs in the nav's position but is not a nav entry, such as the desktop
132
+ * shell's "an update is ready" button.
133
+ *
134
+ * Kept out of `items` deliberately: an entry there is a row in the primary
135
+ * `<nav>` landmark, styled as one and announced as one, and none of that is
136
+ * true of an action that navigates nowhere. It also renders in every surface
137
+ * that takes this config — the sidebar AND the mobile burger menu — so a host
138
+ * passes it once and gets both.
139
+ *
140
+ * A render prop rather than a node because the two surfaces are different
141
+ * widths and only this component knows which: the 56px rail has room for a
142
+ * glyph and nothing else, while the burger menu is always full width. A host
143
+ * cannot derive `minimized` itself — it is the sidebar's own state, resolved
144
+ * from a persisted preference, the tablet breakpoint and any open overlay —
145
+ * and a container query would have to be authored in the HOST's Tailwind
146
+ * scan to emit anything.
147
+ *
148
+ * Rendered regardless of `loading`: it comes from host state that has nothing
149
+ * to do with whether the nav entries have resolved.
150
+ */
151
+ topSlot?: (state: { minimized: boolean }) => React.ReactNode
129
152
  minimized?: boolean
130
153
  onNavigate?: (path: string) => void
131
154
  onToggleMinimized?: () => void