@flamingo-stack/openframe-frontend-core 0.0.355 → 0.0.357-snapshot.20260702003231

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 (108) hide show
  1. package/dist/{chunk-PLSEMEEM.cjs → chunk-2J56P3HL.cjs} +40 -40
  2. package/dist/{chunk-PLSEMEEM.cjs.map → chunk-2J56P3HL.cjs.map} +1 -1
  3. package/dist/{chunk-426BLQES.cjs → chunk-2LLPPZB2.cjs} +19 -19
  4. package/dist/{chunk-426BLQES.cjs.map → chunk-2LLPPZB2.cjs.map} +1 -1
  5. package/dist/{chunk-RYJTVPOQ.js → chunk-2NV6UIY3.js} +2 -2
  6. package/dist/{chunk-U5MQW3PH.js → chunk-7RQM23VH.js} +2 -2
  7. package/dist/{chunk-SFETWAWG.cjs → chunk-AVCR5TCA.cjs} +5 -5
  8. package/dist/{chunk-SFETWAWG.cjs.map → chunk-AVCR5TCA.cjs.map} +1 -1
  9. package/dist/{chunk-GPX5I7FT.cjs → chunk-B7NOIJR3.cjs} +2 -2
  10. package/dist/chunk-B7NOIJR3.cjs.map +1 -0
  11. package/dist/{chunk-XIZR45OD.js → chunk-BJ6J6WLA.js} +5 -5
  12. package/dist/{chunk-MYLWEYWT.cjs → chunk-C6XEJALZ.cjs} +252 -214
  13. package/dist/chunk-C6XEJALZ.cjs.map +1 -0
  14. package/dist/{chunk-URBSUHOU.js → chunk-CX4NZ56E.js} +3 -3
  15. package/dist/{chunk-KTTCJ7NX.js → chunk-DDCTJIWD.js} +2 -2
  16. package/dist/{chunk-P4YC4V7T.js → chunk-DZHIM646.js} +6 -6
  17. package/dist/{chunk-KAWIGFO2.cjs → chunk-EASJYKEA.cjs} +29 -29
  18. package/dist/{chunk-KAWIGFO2.cjs.map → chunk-EASJYKEA.cjs.map} +1 -1
  19. package/dist/{chunk-7CEEJGCF.cjs → chunk-EOXJ73JE.cjs} +15 -15
  20. package/dist/{chunk-7CEEJGCF.cjs.map → chunk-EOXJ73JE.cjs.map} +1 -1
  21. package/dist/{chunk-2IJSLRZZ.cjs → chunk-F5NAL32B.cjs} +7 -7
  22. package/dist/{chunk-2IJSLRZZ.cjs.map → chunk-F5NAL32B.cjs.map} +1 -1
  23. package/dist/{chunk-SGZM3LF6.js → chunk-FPWI7T6Z.js} +6 -6
  24. package/dist/{chunk-GO2AEBG7.js → chunk-IBYCZG6S.js} +3 -3
  25. package/dist/{chunk-IDQJJEYE.js → chunk-IFL7IRAW.js} +5 -5
  26. package/dist/{chunk-266IXS6E.js → chunk-IL33PEQB.js} +2 -2
  27. package/dist/{chunk-V5QI32ZA.cjs → chunk-LQONASYT.cjs} +70 -70
  28. package/dist/{chunk-V5QI32ZA.cjs.map → chunk-LQONASYT.cjs.map} +1 -1
  29. package/dist/{chunk-GSW23VUI.js → chunk-O6ZTFST3.js} +4 -4
  30. package/dist/{chunk-RYROZ7HM.cjs → chunk-QCG3MBP6.cjs} +3 -3
  31. package/dist/{chunk-RYROZ7HM.cjs.map → chunk-QCG3MBP6.cjs.map} +1 -1
  32. package/dist/{chunk-O7T2VECL.cjs → chunk-SAIKHQTP.cjs} +39 -39
  33. package/dist/{chunk-O7T2VECL.cjs.map → chunk-SAIKHQTP.cjs.map} +1 -1
  34. package/dist/{chunk-RE3KBUNB.js → chunk-TRAJG5JZ.js} +201 -163
  35. package/dist/chunk-TRAJG5JZ.js.map +1 -0
  36. package/dist/{chunk-5FYSQ3GW.cjs → chunk-TRON4VRV.cjs} +73 -73
  37. package/dist/{chunk-5FYSQ3GW.cjs.map → chunk-TRON4VRV.cjs.map} +1 -1
  38. package/dist/{chunk-JGAAUUD7.js → chunk-UJ4ENR2O.js} +2 -2
  39. package/dist/chunk-UJ4ENR2O.js.map +1 -0
  40. package/dist/{chunk-QD6ANQN5.cjs → chunk-WLU4IOM6.cjs} +31 -31
  41. package/dist/{chunk-QD6ANQN5.cjs.map → chunk-WLU4IOM6.cjs.map} +1 -1
  42. package/dist/{chunk-KNIXUH6G.cjs → chunk-XX42KS3W.cjs} +12 -12
  43. package/dist/{chunk-KNIXUH6G.cjs.map → chunk-XX42KS3W.cjs.map} +1 -1
  44. package/dist/{chunk-GMMVBLAD.js → chunk-XZGZH5GG.js} +3 -3
  45. package/dist/components/case-studies/index.cjs +9 -9
  46. package/dist/components/case-studies/index.js +3 -3
  47. package/dist/components/chat/index.cjs +3 -3
  48. package/dist/components/chat/index.js +2 -2
  49. package/dist/components/contact/index.cjs +4 -4
  50. package/dist/components/contact/index.js +3 -3
  51. package/dist/components/docs/index.cjs +6 -6
  52. package/dist/components/docs/index.js +5 -5
  53. package/dist/components/embeds/index.cjs +4 -4
  54. package/dist/components/embeds/index.js +3 -3
  55. package/dist/components/faq/index.cjs +5 -5
  56. package/dist/components/faq/index.js +4 -4
  57. package/dist/components/features/index.cjs +3 -3
  58. package/dist/components/features/index.js +2 -2
  59. package/dist/components/help-center-pages/index.cjs +22 -22
  60. package/dist/components/help-center-pages/index.js +13 -13
  61. package/dist/components/index.cjs +124 -124
  62. package/dist/components/index.js +11 -11
  63. package/dist/components/navigation/index.cjs +3 -3
  64. package/dist/components/navigation/index.js +2 -2
  65. package/dist/components/onboarding-guides/index.cjs +7 -7
  66. package/dist/components/onboarding-guides/index.js +6 -6
  67. package/dist/components/related-content/index.cjs +5 -5
  68. package/dist/components/related-content/index.js +4 -4
  69. package/dist/components/tickets/index.cjs +6 -6
  70. package/dist/components/tickets/index.js +5 -5
  71. package/dist/components/ui/floating-tooltip.d.ts.map +1 -1
  72. package/dist/components/ui/index.cjs +3 -3
  73. package/dist/components/ui/index.js +2 -2
  74. package/dist/components/ui/tab-navigation.d.ts.map +1 -1
  75. package/dist/components/ui/tooltip.d.ts.map +1 -1
  76. package/dist/hooks/index.cjs +2 -2
  77. package/dist/hooks/index.js +1 -1
  78. package/dist/index.cjs +3 -3
  79. package/dist/index.js +2 -2
  80. package/dist/types/index.cjs +1 -1
  81. package/dist/types/index.cjs.map +1 -1
  82. package/dist/types/index.js +1 -1
  83. package/dist/types/index.js.map +1 -1
  84. package/dist/utils/index.cjs +1 -1
  85. package/dist/utils/index.cjs.map +1 -1
  86. package/dist/utils/index.js +1 -1
  87. package/dist/utils/index.js.map +1 -1
  88. package/package.json +1 -1
  89. package/src/components/ui/floating-tooltip.tsx +19 -5
  90. package/src/components/ui/tab-navigation.tsx +45 -2
  91. package/src/components/ui/tooltip.tsx +3 -1
  92. package/src/types/tool.types.ts +1 -1
  93. package/dist/chunk-GPX5I7FT.cjs.map +0 -1
  94. package/dist/chunk-JGAAUUD7.js.map +0 -1
  95. package/dist/chunk-MYLWEYWT.cjs.map +0 -1
  96. package/dist/chunk-RE3KBUNB.js.map +0 -1
  97. /package/dist/{chunk-RYJTVPOQ.js.map → chunk-2NV6UIY3.js.map} +0 -0
  98. /package/dist/{chunk-U5MQW3PH.js.map → chunk-7RQM23VH.js.map} +0 -0
  99. /package/dist/{chunk-XIZR45OD.js.map → chunk-BJ6J6WLA.js.map} +0 -0
  100. /package/dist/{chunk-URBSUHOU.js.map → chunk-CX4NZ56E.js.map} +0 -0
  101. /package/dist/{chunk-KTTCJ7NX.js.map → chunk-DDCTJIWD.js.map} +0 -0
  102. /package/dist/{chunk-P4YC4V7T.js.map → chunk-DZHIM646.js.map} +0 -0
  103. /package/dist/{chunk-SGZM3LF6.js.map → chunk-FPWI7T6Z.js.map} +0 -0
  104. /package/dist/{chunk-GO2AEBG7.js.map → chunk-IBYCZG6S.js.map} +0 -0
  105. /package/dist/{chunk-IDQJJEYE.js.map → chunk-IFL7IRAW.js.map} +0 -0
  106. /package/dist/{chunk-266IXS6E.js.map → chunk-IL33PEQB.js.map} +0 -0
  107. /package/dist/{chunk-GSW23VUI.js.map → chunk-O6ZTFST3.js.map} +0 -0
  108. /package/dist/{chunk-GMMVBLAD.js.map → chunk-XZGZH5GG.js.map} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.355",
3
+ "version": "0.0.357-snapshot.20260702003231",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -7,6 +7,7 @@ import {
7
7
  offset,
8
8
  flip,
9
9
  shift,
10
+ size,
10
11
  useDismiss,
11
12
  useRole,
12
13
  useInteractions,
@@ -100,6 +101,16 @@ export function FloatingTooltip({
100
101
  padding: 8,
101
102
  }),
102
103
  shift({ padding: 8 }),
104
+ // Cap the tooltip to the space left in the viewport so tall content
105
+ // scrolls inside it instead of overflowing off-screen. Applied straight to
106
+ // the floating node's style (no React state → no autoUpdate re-render loop);
107
+ // the inner scroll wrapper below turns the cap into an actual scroll area.
108
+ size({
109
+ padding: 8,
110
+ apply({ availableHeight, elements }) {
111
+ elements.floating.style.maxHeight = `${Math.max(64, availableHeight)}px`
112
+ },
113
+ }),
103
114
  arrow({ element: arrowRef }),
104
115
  ],
105
116
  whileElementsMounted: autoUpdate,
@@ -153,17 +164,20 @@ export function FloatingTooltip({
153
164
  }}
154
165
  {...getFloatingProps()}
155
166
  className={cn(
156
- // ODS Design System tooltip styling
157
- "max-w-xs overflow-hidden rounded-md",
167
+ // ODS Design System tooltip styling. `flex flex-col` + `overflow-hidden`
168
+ // let the inner wrapper own the scroll while the rounded corners clip it.
169
+ "max-w-xs flex flex-col overflow-hidden rounded-md",
158
170
  "bg-ods-card border border-ods-border",
159
- "px-3 py-2.5 text-sm leading-relaxed text-ods-text-primary",
160
- "whitespace-pre-line",
161
171
  // ODS shadows for proper elevation
162
172
  "shadow-[var(--shadow-md)]",
163
173
  className
164
174
  )}
165
175
  >
166
- {parsedContent}
176
+ {/* Scroll wrapper — `min-h-0` lets it shrink below content height inside
177
+ the max-height cap set by the `size` middleware, so tall content scrolls. */}
178
+ <div className="min-h-0 overflow-y-auto px-3 py-2.5 text-sm leading-relaxed text-ods-text-primary whitespace-pre-line">
179
+ {parsedContent}
180
+ </div>
167
181
  {/* Arrow element */}
168
182
  <div
169
183
  ref={arrowRef}
@@ -115,6 +115,7 @@ export function TabNavigation({
115
115
  }
116
116
 
117
117
  const scrollRef = useRef<HTMLDivElement>(null)
118
+ const activeTabRef = useRef<HTMLButtonElement>(null)
118
119
  const [canScrollLeft, setCanScrollLeft] = useState(false)
119
120
  const [canScrollRight, setCanScrollRight] = useState(false)
120
121
 
@@ -131,16 +132,57 @@ export function TabNavigation({
131
132
 
132
133
  updateScrollShadows()
133
134
 
135
+ // Translate a vertical mouse wheel into horizontal scroll. macOS mice emit
136
+ // only deltaY, which the browser won't apply to a horizontal-only overflow
137
+ // container, so the strip is otherwise un-scrollable with a plain mouse.
138
+ // Non-passive so preventDefault() can suppress the page from scrolling.
139
+ const onWheel = (e: WheelEvent) => {
140
+ // A trackpad's horizontal gesture (deltaX) already scrolls natively; a
141
+ // pinch-zoom arrives as wheel+ctrlKey — leave both untouched.
142
+ if (e.deltaX !== 0 || e.ctrlKey) return
143
+ if (el.scrollWidth <= el.clientWidth) return
144
+ // deltaY isn't always pixels: Firefox mice report lines (deltaMode 1),
145
+ // some devices pages (mode 2). Normalize so the scroll isn't a no-op.
146
+ const delta = e.deltaMode === 1 ? e.deltaY * 40 : e.deltaMode === 2 ? e.deltaY * el.clientWidth : e.deltaY
147
+ // Only consume the event while there's room to scroll in that direction;
148
+ // at either edge, let it bubble so the page scrolls (native chaining).
149
+ const canGoRight = el.scrollLeft + el.clientWidth < el.scrollWidth - 1
150
+ const canGoLeft = el.scrollLeft > 0
151
+ if ((delta > 0 && !canGoRight) || (delta < 0 && !canGoLeft)) return
152
+ el.scrollLeft += delta
153
+ e.preventDefault()
154
+ }
155
+
134
156
  el.addEventListener('scroll', updateScrollShadows, { passive: true })
157
+ el.addEventListener('wheel', onWheel, { passive: false })
135
158
  const ro = new ResizeObserver(updateScrollShadows)
136
159
  ro.observe(el)
137
160
 
138
161
  return () => {
139
162
  el.removeEventListener('scroll', updateScrollShadows)
163
+ el.removeEventListener('wheel', onWheel)
140
164
  ro.disconnect()
141
165
  }
142
166
  }, [updateScrollShadows])
143
167
 
168
+ // Bring the active tab into view when it changes (e.g. clicking a partly
169
+ // off-screen tab, or a URL-driven change). Uses the browser's own smooth
170
+ // scroll and moves ONLY the strip — never the page — by nudging just enough
171
+ // to reveal the tab on whichever edge it's clipped. Complements the native
172
+ // trackpad / Shift+wheel / mouse-wheel scrolling rather than fighting it.
173
+ useEffect(() => {
174
+ const el = scrollRef.current
175
+ const active = activeTabRef.current
176
+ if (!el || !active) return
177
+ const elRect = el.getBoundingClientRect()
178
+ const aRect = active.getBoundingClientRect()
179
+ if (aRect.left < elRect.left) {
180
+ el.scrollBy({ left: aRect.left - elRect.left, behavior: 'smooth' })
181
+ } else if (aRect.right > elRect.right) {
182
+ el.scrollBy({ left: aRect.right - elRect.right, behavior: 'smooth' })
183
+ }
184
+ }, [activeTab])
185
+
144
186
  const leftFade = canScrollLeft || showLeftGradient
145
187
  const rightFade = canScrollRight || showRightGradient
146
188
 
@@ -168,6 +210,7 @@ export function TabNavigation({
168
210
  return (
169
211
  <button
170
212
  key={tab.id}
213
+ ref={isActive ? activeTabRef : undefined}
171
214
  type="button"
172
215
  onClick={() => handleTabChange(tab.id)}
173
216
  className={cn(
@@ -210,10 +253,10 @@ export function TabNavigation({
210
253
 
211
254
  {/* Fade shadows — visible when content overflows or when forced via props */}
212
255
  {leftFade && (
213
- <div className={cn("absolute left-0 top-0 w-10 h-14 pointer-events-none bg-gradient-to-r to-transparent", shadowClassName || "from-ods-bg")} />
256
+ <div className={cn("absolute left-0 top-0 bottom-0 w-10 pointer-events-none bg-gradient-to-r to-transparent", shadowClassName || "from-ods-bg")} />
214
257
  )}
215
258
  {rightFade && (
216
- <div className={cn("absolute right-0 top-0 w-10 h-14 pointer-events-none bg-gradient-to-l to-transparent", shadowClassName || "from-ods-bg")} />
259
+ <div className={cn("absolute right-0 top-0 bottom-0 w-10 pointer-events-none bg-gradient-to-l to-transparent", shadowClassName || "from-ods-bg")} />
217
260
  )}
218
261
 
219
262
  {/* Bottom border — a gradient-capable 1px line that fades to transparent on any edge that has an active fade shadow. */}
@@ -24,7 +24,9 @@ const TooltipContent = React.forwardRef<
24
24
  ref={ref}
25
25
  sideOffset={sideOffset}
26
26
  className={cn(
27
- "z-[1400] rounded-md bg-ods-card border border-ods-border px-3 py-2 text-sm text-ods-text-primary shadow-lg animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
27
+ // `max-h` uses Radix's available-height var so tall content scrolls inside
28
+ // the tooltip instead of overflowing off-screen (only engages on overflow).
29
+ "z-[1400] max-h-[var(--radix-popper-available-height)] overflow-y-auto rounded-md bg-ods-card border border-ods-border px-3 py-2 text-sm text-ods-text-primary shadow-lg animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
28
30
  className
29
31
  )}
30
32
  {...props}
@@ -31,7 +31,7 @@ export const toolLabels: Record<ToolType, string> = {
31
31
  OPENFRAME: 'OpenFrame',
32
32
  OPENFRAME_CHAT: 'OpenFrame Chat',
33
33
  OPENFRAME_CLIENT: 'OpenFrame Client',
34
- OPENFRAME_RMM: 'OpenFrame RMM',
34
+ OPENFRAME_RMM: 'RMM',
35
35
  OSQUERY: 'Osquery',
36
36
  SYSTEM: 'System'
37
37
  }