@flamingo-stack/openframe-frontend-core 0.0.415 → 0.0.416

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 (88) hide show
  1. package/dist/{chunk-VENX4SF4.cjs → chunk-234A5WF2.cjs} +26 -26
  2. package/dist/{chunk-VENX4SF4.cjs.map → chunk-234A5WF2.cjs.map} +1 -1
  3. package/dist/{chunk-NG6F7TM4.cjs → chunk-3F4LKYIK.cjs} +7 -7
  4. package/dist/{chunk-NG6F7TM4.cjs.map → chunk-3F4LKYIK.cjs.map} +1 -1
  5. package/dist/{chunk-OTUNYR26.cjs → chunk-3OSTXIB6.cjs} +59 -59
  6. package/dist/{chunk-OTUNYR26.cjs.map → chunk-3OSTXIB6.cjs.map} +1 -1
  7. package/dist/{chunk-XUWZHO32.js → chunk-3RW27WRK.js} +2 -2
  8. package/dist/{chunk-EB4USXFD.js → chunk-43AKGHDL.js} +4 -4
  9. package/dist/{chunk-I6LSGR3V.js → chunk-4AFA5N5Q.js} +2 -2
  10. package/dist/{chunk-IKWWXX4V.js → chunk-BGSIZWAK.js} +2 -2
  11. package/dist/{chunk-NM4WUXPO.cjs → chunk-BIFZRCGN.cjs} +31 -31
  12. package/dist/{chunk-NM4WUXPO.cjs.map → chunk-BIFZRCGN.cjs.map} +1 -1
  13. package/dist/{chunk-VVAAUQKZ.js → chunk-CQ6MF7KT.js} +4 -4
  14. package/dist/{chunk-LAGZ56MO.cjs → chunk-CQG77HCB.cjs} +11 -11
  15. package/dist/{chunk-LAGZ56MO.cjs.map → chunk-CQG77HCB.cjs.map} +1 -1
  16. package/dist/{chunk-ZE5CY2H2.cjs → chunk-CRPIHDEI.cjs} +9 -9
  17. package/dist/{chunk-ZE5CY2H2.cjs.map → chunk-CRPIHDEI.cjs.map} +1 -1
  18. package/dist/{chunk-24IQYYNK.cjs → chunk-D4NSPERU.cjs} +26 -26
  19. package/dist/{chunk-24IQYYNK.cjs.map → chunk-D4NSPERU.cjs.map} +1 -1
  20. package/dist/{chunk-2MEM6QO4.cjs → chunk-DQMH6NAF.cjs} +15 -15
  21. package/dist/{chunk-2MEM6QO4.cjs.map → chunk-DQMH6NAF.cjs.map} +1 -1
  22. package/dist/{chunk-YQBAYZZV.js → chunk-FHAMKB5L.js} +2 -2
  23. package/dist/{chunk-2HBGX2VN.js → chunk-GEUZA4VP.js} +2 -2
  24. package/dist/{chunk-P7NC3H2Y.js → chunk-GIHNDMGI.js} +2 -2
  25. package/dist/{chunk-57IHEHW3.cjs → chunk-IVWQIWZI.cjs} +5 -5
  26. package/dist/{chunk-57IHEHW3.cjs.map → chunk-IVWQIWZI.cjs.map} +1 -1
  27. package/dist/{chunk-CCEQDC7F.js → chunk-N6T7CDEN.js} +2 -1
  28. package/dist/chunk-N6T7CDEN.js.map +1 -0
  29. package/dist/{chunk-XAVAHIZR.cjs → chunk-QMGXJEZ3.cjs} +62 -62
  30. package/dist/{chunk-XAVAHIZR.cjs.map → chunk-QMGXJEZ3.cjs.map} +1 -1
  31. package/dist/{chunk-F5US4NUC.js → chunk-QO2JZYIB.js} +4 -4
  32. package/dist/{chunk-ND4AYD6P.cjs → chunk-RQLQOH46.cjs} +37 -37
  33. package/dist/{chunk-ND4AYD6P.cjs.map → chunk-RQLQOH46.cjs.map} +1 -1
  34. package/dist/{chunk-SUOPU3OE.cjs → chunk-S3PO5NOK.cjs} +2 -1
  35. package/dist/chunk-S3PO5NOK.cjs.map +1 -0
  36. package/dist/{chunk-47FXB4DR.js → chunk-SFZ2BJST.js} +2 -2
  37. package/dist/{chunk-MHOKOUKE.js → chunk-VBJC75FT.js} +4 -4
  38. package/dist/components/case-studies/index.cjs +8 -8
  39. package/dist/components/case-studies/index.js +2 -2
  40. package/dist/components/chat/index.cjs +2 -2
  41. package/dist/components/chat/index.js +1 -1
  42. package/dist/components/chat/utils/is-cross-origin-url.d.ts.map +1 -1
  43. package/dist/components/contact/index.cjs +3 -3
  44. package/dist/components/contact/index.js +2 -2
  45. package/dist/components/docs/index.cjs +5 -5
  46. package/dist/components/docs/index.js +4 -4
  47. package/dist/components/embeds/index.cjs +3 -3
  48. package/dist/components/embeds/index.js +2 -2
  49. package/dist/components/faq/index.cjs +3 -3
  50. package/dist/components/faq/index.js +2 -2
  51. package/dist/components/features/index.cjs +2 -2
  52. package/dist/components/features/index.js +1 -1
  53. package/dist/components/help-center-pages/index.cjs +20 -20
  54. package/dist/components/help-center-pages/index.js +11 -11
  55. package/dist/components/index.cjs +128 -128
  56. package/dist/components/index.js +9 -9
  57. package/dist/components/navigation/index.cjs +2 -2
  58. package/dist/components/navigation/index.js +1 -1
  59. package/dist/components/onboarding-guides/index.cjs +5 -5
  60. package/dist/components/onboarding-guides/index.js +4 -4
  61. package/dist/components/related-content/index.cjs +3 -3
  62. package/dist/components/related-content/index.js +2 -2
  63. package/dist/components/tickets/index.cjs +5 -5
  64. package/dist/components/tickets/index.js +4 -4
  65. package/dist/components/ui/index.cjs +2 -2
  66. package/dist/components/ui/index.js +1 -1
  67. package/dist/index.cjs +2 -2
  68. package/dist/index.js +1 -1
  69. package/dist/utils/index.cjs +1 -0
  70. package/dist/utils/index.cjs.map +1 -1
  71. package/dist/utils/index.js +1 -0
  72. package/dist/utils/index.js.map +1 -1
  73. package/package.json +1 -1
  74. package/src/components/chat/utils/__tests__/is-cross-origin-url.test.ts +43 -0
  75. package/src/components/chat/utils/is-cross-origin-url.ts +4 -0
  76. package/dist/chunk-CCEQDC7F.js.map +0 -1
  77. package/dist/chunk-SUOPU3OE.cjs.map +0 -1
  78. /package/dist/{chunk-XUWZHO32.js.map → chunk-3RW27WRK.js.map} +0 -0
  79. /package/dist/{chunk-EB4USXFD.js.map → chunk-43AKGHDL.js.map} +0 -0
  80. /package/dist/{chunk-I6LSGR3V.js.map → chunk-4AFA5N5Q.js.map} +0 -0
  81. /package/dist/{chunk-IKWWXX4V.js.map → chunk-BGSIZWAK.js.map} +0 -0
  82. /package/dist/{chunk-VVAAUQKZ.js.map → chunk-CQ6MF7KT.js.map} +0 -0
  83. /package/dist/{chunk-YQBAYZZV.js.map → chunk-FHAMKB5L.js.map} +0 -0
  84. /package/dist/{chunk-2HBGX2VN.js.map → chunk-GEUZA4VP.js.map} +0 -0
  85. /package/dist/{chunk-P7NC3H2Y.js.map → chunk-GIHNDMGI.js.map} +0 -0
  86. /package/dist/{chunk-F5US4NUC.js.map → chunk-QO2JZYIB.js.map} +0 -0
  87. /package/dist/{chunk-47FXB4DR.js.map → chunk-SFZ2BJST.js.map} +0 -0
  88. /package/dist/{chunk-MHOKOUKE.js.map → chunk-VBJC75FT.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.415",
3
+ "version": "0.0.416",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -0,0 +1,43 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { isCrossOriginUrl } from '../is-cross-origin-url'
3
+ import { decideNewTab } from '../decide-new-tab'
4
+
5
+ describe('isCrossOriginUrl', () => {
6
+ it('treats falsy values as same-origin', () => {
7
+ expect(isCrossOriginUrl(null)).toBe(false)
8
+ expect(isCrossOriginUrl(undefined)).toBe(false)
9
+ expect(isCrossOriginUrl('')).toBe(false)
10
+ })
11
+
12
+ it('treats same-document references as same-origin', () => {
13
+ // Regression: bare-hash anchors ("More coming in Next Generations" on
14
+ // /pricing) were classified cross-origin and opened in a new tab.
15
+ expect(isCrossOriginUrl('#next-generations')).toBe(false)
16
+ expect(isCrossOriginUrl('?tab=pricing')).toBe(false)
17
+ })
18
+
19
+ it('treats rooted relative paths as same-origin', () => {
20
+ expect(isCrossOriginUrl('/support')).toBe(false)
21
+ expect(isCrossOriginUrl('/roadmap#top')).toBe(false)
22
+ })
23
+
24
+ it('treats explicit-host URLs as cross-origin', () => {
25
+ expect(isCrossOriginUrl('https://flamingo.run/support')).toBe(true)
26
+ expect(isCrossOriginUrl('http://example.com')).toBe(true)
27
+ expect(isCrossOriginUrl('//cdn.example.com/file.js')).toBe(true)
28
+ })
29
+ })
30
+
31
+ describe('decideNewTab fallback (no targetPlatform)', () => {
32
+ it('keeps same-page hash CTAs in the same tab', () => {
33
+ expect(
34
+ decideNewTab({ href: '#next-generations', currentSource: 'flamingo' }),
35
+ ).toBe(false)
36
+ })
37
+
38
+ it('still opens explicit-host URLs in a new tab', () => {
39
+ expect(
40
+ decideNewTab({ href: 'https://example.com', currentSource: 'flamingo' }),
41
+ ).toBe(true)
42
+ })
43
+ })
@@ -20,6 +20,10 @@
20
20
  */
21
21
  export function isCrossOriginUrl(url: string | null | undefined): boolean {
22
22
  if (!url) return false
23
+ // Same-document references — a bare fragment (`#anchor`) or query
24
+ // (`?tab=x`) resolves against the current page and can never leave
25
+ // the origin.
26
+ if (url.startsWith('#') || url.startsWith('?')) return false
23
27
  // Relative URL — by definition same origin.
24
28
  if (url.startsWith('/') && !url.startsWith('//')) return false
25
29
  // Anything else — absolute URL (http(s)://) or protocol-relative (//)