@flamingo-stack/openframe-frontend-core 0.0.313 → 0.0.314-snapshot.20260624043952

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 (111) hide show
  1. package/dist/{chunk-SQQXCVZZ.cjs → chunk-2JPSWDSM.cjs} +77 -58
  2. package/dist/chunk-2JPSWDSM.cjs.map +1 -0
  3. package/dist/{chunk-SPFGSUNE.js → chunk-2MLMZAK4.js} +3 -3
  4. package/dist/{chunk-6FZD5KFP.js → chunk-47JZOP7Y.js} +3 -3
  5. package/dist/{chunk-OZYAAJHM.js → chunk-4D37W55K.js} +5 -5
  6. package/dist/{chunk-G56GYN7Z.cjs → chunk-5ATH263N.cjs} +4 -1
  7. package/dist/chunk-5ATH263N.cjs.map +1 -0
  8. package/dist/{chunk-YI2ACYRX.js → chunk-6W54MBU2.js} +2 -2
  9. package/dist/{chunk-66JU4VP2.js → chunk-7U4YFQX2.js} +27 -8
  10. package/dist/{chunk-66JU4VP2.js.map → chunk-7U4YFQX2.js.map} +1 -1
  11. package/dist/{chunk-DDLJTRF4.cjs → chunk-A2H6TFS4.cjs} +29 -29
  12. package/dist/{chunk-DDLJTRF4.cjs.map → chunk-A2H6TFS4.cjs.map} +1 -1
  13. package/dist/{chunk-YSMKPNYZ.cjs → chunk-BSAFGQVW.cjs} +7 -7
  14. package/dist/{chunk-YSMKPNYZ.cjs.map → chunk-BSAFGQVW.cjs.map} +1 -1
  15. package/dist/{chunk-JQ2EYXWR.js → chunk-E4CQ4RUG.js} +4 -1
  16. package/dist/chunk-E4CQ4RUG.js.map +1 -0
  17. package/dist/{chunk-DE2BQKQV.cjs → chunk-HATCNFQL.cjs} +12 -12
  18. package/dist/{chunk-DE2BQKQV.cjs.map → chunk-HATCNFQL.cjs.map} +1 -1
  19. package/dist/{chunk-FXTT7K3A.js → chunk-MOOV4ORG.js} +3 -3
  20. package/dist/{chunk-REHUG3RH.cjs → chunk-OSEKWT6X.cjs} +19 -19
  21. package/dist/{chunk-REHUG3RH.cjs.map → chunk-OSEKWT6X.cjs.map} +1 -1
  22. package/dist/{chunk-XHGE5XBH.cjs → chunk-QW6OL4NY.cjs} +5 -5
  23. package/dist/{chunk-XHGE5XBH.cjs.map → chunk-QW6OL4NY.cjs.map} +1 -1
  24. package/dist/{chunk-E6BHNYTA.js → chunk-TK6OABYF.js} +4 -4
  25. package/dist/{chunk-BFNTSETG.cjs → chunk-TQ7CMFSY.cjs} +14 -14
  26. package/dist/{chunk-BFNTSETG.cjs.map → chunk-TQ7CMFSY.cjs.map} +1 -1
  27. package/dist/{chunk-JQLC2FVM.js → chunk-TRSDXD23.js} +2 -2
  28. package/dist/{chunk-GHK2FCIM.cjs → chunk-TVNILN2F.cjs} +40 -40
  29. package/dist/{chunk-GHK2FCIM.cjs.map → chunk-TVNILN2F.cjs.map} +1 -1
  30. package/dist/{chunk-BVDHLEP2.js → chunk-VFIWQGJZ.js} +2 -2
  31. package/dist/{chunk-RM3M3SZ6.js → chunk-VY5YF4B7.js} +2 -2
  32. package/dist/{chunk-BFSKFC6S.cjs → chunk-WFHNXCI3.cjs} +38 -38
  33. package/dist/{chunk-BFSKFC6S.cjs.map → chunk-WFHNXCI3.cjs.map} +1 -1
  34. package/dist/{chunk-2ZHDP22R.cjs → chunk-ZPK5HW7B.cjs} +3 -3
  35. package/dist/{chunk-2ZHDP22R.cjs.map → chunk-ZPK5HW7B.cjs.map} +1 -1
  36. package/dist/components/case-studies/index.cjs +9 -9
  37. package/dist/components/case-studies/index.js +3 -3
  38. package/dist/components/chat/index.cjs +3 -3
  39. package/dist/components/chat/index.js +2 -2
  40. package/dist/components/contact/index.cjs +4 -4
  41. package/dist/components/contact/index.js +3 -3
  42. package/dist/components/docs/index.cjs +6 -6
  43. package/dist/components/docs/index.js +5 -5
  44. package/dist/components/embeds/index.cjs +4 -4
  45. package/dist/components/embeds/index.js +3 -3
  46. package/dist/components/faq/index.cjs +5 -5
  47. package/dist/components/faq/index.js +4 -4
  48. package/dist/components/features/index.cjs +3 -3
  49. package/dist/components/features/index.js +2 -2
  50. package/dist/components/features/push-button-selector.d.ts +1 -0
  51. package/dist/components/features/push-button-selector.d.ts.map +1 -1
  52. package/dist/components/index.cjs +190 -188
  53. package/dist/components/index.cjs.map +1 -1
  54. package/dist/components/index.js +12 -10
  55. package/dist/components/index.js.map +1 -1
  56. package/dist/components/layout/page-layout.d.ts +1 -1
  57. package/dist/components/layout/page-layout.d.ts.map +1 -1
  58. package/dist/components/layout/title-block.d.ts +10 -0
  59. package/dist/components/layout/title-block.d.ts.map +1 -1
  60. package/dist/components/navigation/index.cjs +3 -3
  61. package/dist/components/navigation/index.js +2 -2
  62. package/dist/components/onboarding-guides/index.cjs +29 -29
  63. package/dist/components/onboarding-guides/index.js +5 -5
  64. package/dist/components/related-content/index.cjs +5 -5
  65. package/dist/components/related-content/index.js +4 -4
  66. package/dist/components/tickets/help-center-list.d.ts +5 -1
  67. package/dist/components/tickets/help-center-list.d.ts.map +1 -1
  68. package/dist/components/tickets/index.cjs +84 -73
  69. package/dist/components/tickets/index.cjs.map +1 -1
  70. package/dist/components/tickets/index.js +21 -10
  71. package/dist/components/tickets/index.js.map +1 -1
  72. package/dist/components/tool-icon.d.ts.map +1 -1
  73. package/dist/components/ui/index.cjs +5 -3
  74. package/dist/components/ui/index.cjs.map +1 -1
  75. package/dist/components/ui/index.js +4 -2
  76. package/dist/hooks/index.cjs +2 -2
  77. package/dist/hooks/index.js +1 -1
  78. package/dist/index.cjs +5 -3
  79. package/dist/index.cjs.map +1 -1
  80. package/dist/index.js +4 -2
  81. package/dist/types/index.cjs +2 -0
  82. package/dist/types/index.cjs.map +1 -1
  83. package/dist/types/index.js +2 -0
  84. package/dist/types/index.js.map +1 -1
  85. package/dist/types/tool.types.d.ts +1 -0
  86. package/dist/types/tool.types.d.ts.map +1 -1
  87. package/dist/utils/index.cjs +11 -0
  88. package/dist/utils/index.cjs.map +1 -1
  89. package/dist/utils/index.js +11 -0
  90. package/dist/utils/index.js.map +1 -1
  91. package/dist/utils/tool-utils.d.ts.map +1 -1
  92. package/package.json +1 -1
  93. package/src/components/features/push-button-selector.tsx +21 -3
  94. package/src/components/layout/page-layout.tsx +1 -1
  95. package/src/components/layout/title-block.tsx +12 -1
  96. package/src/components/tickets/help-center-list.tsx +16 -4
  97. package/src/components/tool-icon.tsx +1 -0
  98. package/src/types/tool.types.ts +2 -0
  99. package/src/utils/tool-utils.ts +11 -0
  100. package/dist/chunk-G56GYN7Z.cjs.map +0 -1
  101. package/dist/chunk-JQ2EYXWR.js.map +0 -1
  102. package/dist/chunk-SQQXCVZZ.cjs.map +0 -1
  103. /package/dist/{chunk-SPFGSUNE.js.map → chunk-2MLMZAK4.js.map} +0 -0
  104. /package/dist/{chunk-6FZD5KFP.js.map → chunk-47JZOP7Y.js.map} +0 -0
  105. /package/dist/{chunk-OZYAAJHM.js.map → chunk-4D37W55K.js.map} +0 -0
  106. /package/dist/{chunk-YI2ACYRX.js.map → chunk-6W54MBU2.js.map} +0 -0
  107. /package/dist/{chunk-FXTT7K3A.js.map → chunk-MOOV4ORG.js.map} +0 -0
  108. /package/dist/{chunk-E6BHNYTA.js.map → chunk-TK6OABYF.js.map} +0 -0
  109. /package/dist/{chunk-JQLC2FVM.js.map → chunk-TRSDXD23.js.map} +0 -0
  110. /package/dist/{chunk-BVDHLEP2.js.map → chunk-VFIWQGJZ.js.map} +0 -0
  111. /package/dist/{chunk-RM3M3SZ6.js.map → chunk-VY5YF4B7.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"tool-utils.d.ts","sourceRoot":"","sources":["../../src/utils/tool-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAc,MAAM,qBAAqB,CAAA;AA2E1D;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAgBtE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAEtE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CASlD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAAE,CAI/D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAEvD"}
1
+ {"version":3,"file":"tool-utils.d.ts","sourceRoot":"","sources":["../../src/utils/tool-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAc,MAAM,qBAAqB,CAAA;AAsF1D;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAgBtE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAEtE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CASlD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAAE,CAI/D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAEvD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.313",
3
+ "version": "0.0.314-snapshot.20260624043952",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { Button, Badge } from "../ui";
4
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../ui/tooltip";
4
5
  import { Check } from 'lucide-react';
5
6
  import React from 'react';
6
7
 
@@ -15,6 +16,7 @@ export interface SelectableOption {
15
16
  icon?: React.ReactNode;
16
17
  color?: string;
17
18
  disabled?: boolean; // If true, option is shown grayed out and not selectable
19
+ disabledReason?: string; // Tooltip shown on hover when disabled — explains WHY it's unavailable
18
20
  section?: string; // Optional section ID to group options
19
21
  }
20
22
 
@@ -151,19 +153,21 @@ export function PushButtonSelector({
151
153
  const renderOption = (option: SelectableOption) => {
152
154
  const isSelected = validSelectedIds.includes(option.id);
153
155
 
154
- return (
156
+ const optionEl = (
155
157
  <div
156
158
  key={option.id}
157
159
  className={`
158
160
  p-4 rounded-lg border transition-all duration-200 group
159
161
  ${option.disabled
160
- ? 'cursor-not-allowed opacity-40 bg-ods-card border-ods-border'
162
+ ? `${isSelected ? 'cursor-pointer' : 'cursor-not-allowed'} opacity-40 bg-ods-card border-ods-border`
161
163
  : isSelected
162
164
  ? 'cursor-pointer bg-ods-bg-secondary border-ods-accent shadow-sm'
163
165
  : 'cursor-pointer bg-ods-bg-primary border-ods-border hover:border-ods-border-hover hover:bg-ods-bg-hover'
164
166
  }
165
167
  `}
166
- onClick={() => !option.disabled && toggleSelection(option.id)}
168
+ // Disabled options can't be newly SELECTED, but an already-selected one
169
+ // (e.g. it later became unavailable) must still be removable.
170
+ onClick={() => (!option.disabled || isSelected) && toggleSelection(option.id)}
167
171
  >
168
172
  <div className="flex items-center justify-between gap-4">
169
173
  <div className="flex items-center gap-3 flex-1 min-w-0">
@@ -199,6 +203,18 @@ export function PushButtonSelector({
199
203
  </div>
200
204
  </div>
201
205
  );
206
+
207
+ // Disabled options explain WHY on hover via the unified Tooltip.
208
+ if (option.disabled && option.disabledReason) {
209
+ return (
210
+ <Tooltip key={option.id}>
211
+ <TooltipTrigger asChild>{optionEl}</TooltipTrigger>
212
+ <TooltipContent className="max-w-xs">{option.disabledReason}</TooltipContent>
213
+ </Tooltip>
214
+ );
215
+ }
216
+
217
+ return optionEl;
202
218
  };
203
219
 
204
220
  // Group options by section if sections are provided
@@ -271,6 +287,7 @@ export function PushButtonSelector({
271
287
  };
272
288
 
273
289
  return (
290
+ <TooltipProvider delayDuration={150}>
274
291
  <div className={`space-y-4 ${className}`}>
275
292
  {title && (
276
293
  <h3 className="text-h5 text-ods-text-primary">
@@ -319,5 +336,6 @@ export function PushButtonSelector({
319
336
  </div>
320
337
  )}
321
338
  </div>
339
+ </TooltipProvider>
322
340
  );
323
341
  }
@@ -99,6 +99,6 @@ export function PageLayout({
99
99
  }
100
100
 
101
101
  export type { PageActionButton } from '../ui/page-actions'
102
- export { TitleBlock } from './title-block'
102
+ export { TitleBlock, TITLE_BLOCK_MIN_HEIGHT } from './title-block'
103
103
  export type { TitleBlockProps } from './title-block'
104
104
  export default PageLayout
@@ -31,6 +31,17 @@ import { EntityImage } from '../ui/entity-image'
31
31
  import { PageActions, type PageActionButton } from '../ui/page-actions'
32
32
  import { BackButton } from './back-button'
33
33
 
34
+ /**
35
+ * Minimum height of the title block's content column, matched to the action
36
+ * button height: the icon button on mobile (`h-11` → 44px) and the default
37
+ * button on desktop (`md:h-12` → 48px). Applied to the inner title column (which
38
+ * has no padding) rather than the root — the root's `pt`/`mb` are box-sizing
39
+ * border-box and would otherwise absorb the floor. Keeps the header a consistent
40
+ * height across pages whether or not they render action buttons, so the content
41
+ * below starts at the same baseline. Exported so other page chrome can reuse it.
42
+ */
43
+ export const TITLE_BLOCK_MIN_HEIGHT = 'min-h-11 md:min-h-12'
44
+
34
45
  export interface TitleBlockProps {
35
46
  title?: string
36
47
  subtitle?: string
@@ -83,7 +94,7 @@ export function TitleBlock({
83
94
  className,
84
95
  )}
85
96
  >
86
- <div className="flex flex-col gap-[var(--spacing-system-xs)] flex-1 min-w-0">
97
+ <div className={cn('flex flex-col justify-center gap-[var(--spacing-system-xs)] flex-1 min-w-0', TITLE_BLOCK_MIN_HEIGHT)}>
87
98
  {backButton && (
88
99
  <BackButton
89
100
  onClick={backButton.onClick}
@@ -55,9 +55,13 @@ export interface HelpCenterListProps {
55
55
  * to hide). Omit ⇒ `DevSectionPage`'s default (`Back to home` → `/`), which
56
56
  * embedders whose home isn't `/` MUST override. */
57
57
  backButton?: { label?: string; href?: string } | false
58
+ /** Override the hero title (forwarded to `DevSectionPage.title`). Defaults to
59
+ * the `tickets` section copy ("Help Center"). Set this to brand the surface
60
+ * for an embed that wants its own label (e.g. "Support Tickets"). */
61
+ title?: string
58
62
  }
59
63
 
60
- export function HelpCenterList({ toast = defaultToast, backButton }: HelpCenterListProps = {}) {
64
+ export function HelpCenterList({ toast = defaultToast, backButton, title }: HelpCenterListProps = {}) {
61
65
  const identity = useChatIdentity()
62
66
  const searchParams = useSearchParams()
63
67
  const router = useRouter()
@@ -85,14 +89,19 @@ export function HelpCenterList({ toast = defaultToast, backButton }: HelpCenterL
85
89
  // mounts in the `preControls` slot.
86
90
  if (identity.isLoading) {
87
91
  return (
88
- <DevSectionPage sectionKey="tickets" backButton={backButton} preControls={<HelpCenterCreateFormSkeleton />}>
92
+ <DevSectionPage
93
+ sectionKey="tickets"
94
+ backButton={backButton}
95
+ title={title}
96
+ preControls={<HelpCenterCreateFormSkeleton />}
97
+ >
89
98
  <DevCardRowSkeletonList />
90
99
  </DevSectionPage>
91
100
  )
92
101
  }
93
102
  if (identity.authTier === 'anon' || !identity.user?.email) {
94
103
  return (
95
- <DevSectionPage sectionKey="tickets" backButton={backButton}>
104
+ <DevSectionPage sectionKey="tickets" backButton={backButton} title={title}>
96
105
  <EmptyState
97
106
  type="generic"
98
107
  title="Sign in to manage tickets"
@@ -128,6 +137,7 @@ export function HelpCenterList({ toast = defaultToast, backButton }: HelpCenterL
128
137
  sessionName={sessionName}
129
138
  sessionEmail={sessionEmail}
130
139
  backButton={backButton}
140
+ title={title}
131
141
  />
132
142
  )
133
143
  }
@@ -145,6 +155,7 @@ interface AuthedProps {
145
155
  sessionName: string
146
156
  sessionEmail: string
147
157
  backButton?: { label?: string; href?: string } | false
158
+ title?: string
148
159
  }
149
160
 
150
161
  function HelpCenterListAuthed({
@@ -159,6 +170,7 @@ function HelpCenterListAuthed({
159
170
  sessionName,
160
171
  sessionEmail,
161
172
  backButton,
173
+ title,
162
174
  }: AuthedProps) {
163
175
  const queryClient = useQueryClient()
164
176
  const [optimisticTickets, setOptimisticTickets] = useState<OptimisticTicket[]>([])
@@ -386,7 +398,7 @@ function HelpCenterListAuthed({
386
398
  )
387
399
 
388
400
  return (
389
- <DevSectionPage sectionKey="tickets" backButton={backButton} preControls={form}>
401
+ <DevSectionPage sectionKey="tickets" backButton={backButton} title={title} preControls={form}>
390
402
  {body}
391
403
  </DevSectionPage>
392
404
  )
@@ -25,6 +25,7 @@ const toolIconMap: Record<ToolType, (size: number, className?: string) => React.
25
25
  [ToolTypeValues.OPENFRAME]: renderOpenFrameLogo,
26
26
  [ToolTypeValues.OPENFRAME_CHAT]: renderOpenFrameLogo,
27
27
  [ToolTypeValues.OPENFRAME_CLIENT]: renderOpenFrameLogo,
28
+ [ToolTypeValues.OPENFRAME_RMM]: renderOpenFrameLogo,
28
29
  [ToolTypeValues.AUTHENTIK]: (size, className) => <AuthentikLogoGreyIcon size={size} className={className} />,
29
30
  [ToolTypeValues.OSQUERY]: (size, className) => <OsqueryLogoGreyIcon size={size} className={className} />,
30
31
  [ToolTypeValues.SYSTEM]: () => null,
@@ -13,6 +13,7 @@ export const ToolTypeValues = {
13
13
  OPENFRAME: 'OPENFRAME',
14
14
  OPENFRAME_CHAT: 'OPENFRAME_CHAT',
15
15
  OPENFRAME_CLIENT: 'OPENFRAME_CLIENT',
16
+ OPENFRAME_RMM: 'OPENFRAME_RMM',
16
17
  OSQUERY: 'OSQUERY',
17
18
  SYSTEM: 'SYSTEM'
18
19
  } as const
@@ -30,6 +31,7 @@ export const toolLabels: Record<ToolType, string> = {
30
31
  OPENFRAME: 'OpenFrame',
31
32
  OPENFRAME_CHAT: 'OpenFrame Chat',
32
33
  OPENFRAME_CLIENT: 'OpenFrame Client',
34
+ OPENFRAME_RMM: 'OpenFrame RMM',
33
35
  OSQUERY: 'Osquery',
34
36
  SYSTEM: 'System'
35
37
  }
@@ -73,6 +73,17 @@ const toolAliasMap: Record<string, ToolType> = {
73
73
  'openframe-client': 'OPENFRAME_CLIENT',
74
74
  'openframeclient': 'OPENFRAME_CLIENT',
75
75
 
76
+ // OpenFrame RMM
77
+ 'RMM': 'OPENFRAME_RMM',
78
+ 'rmm': 'OPENFRAME_RMM',
79
+ 'OPENFRAME_RMM': 'OPENFRAME_RMM',
80
+ 'OPENFRAME-RMM': 'OPENFRAME_RMM',
81
+ 'OPENFRAMERMM': 'OPENFRAME_RMM',
82
+ 'openframe_rmm': 'OPENFRAME_RMM',
83
+ 'openframe-rmm': 'OPENFRAME_RMM',
84
+ 'openframermm': 'OPENFRAME_RMM',
85
+ 'openframe-rmm-agent': 'OPENFRAME_RMM',
86
+
76
87
  // OSQUERY
77
88
  'OSQUERY': 'OSQUERY',
78
89