@flamingo-stack/openframe-frontend-core 0.0.424 → 0.0.425

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 (110) hide show
  1. package/dist/{chunk-5TCOKIAS.js → chunk-2NHRQU5S.js} +3 -3
  2. package/dist/{chunk-H2ECFX4G.js → chunk-3RVXNWM4.js} +9 -3
  3. package/dist/{chunk-H2ECFX4G.js.map → chunk-3RVXNWM4.js.map} +1 -1
  4. package/dist/{chunk-XMCURSQ7.js → chunk-7DLIR4M3.js} +7 -7
  5. package/dist/{chunk-4XLJWX2N.js → chunk-7EUIW46X.js} +2 -2
  6. package/dist/{chunk-FVL25VKT.cjs → chunk-AXQ6VG3I.cjs} +14 -14
  7. package/dist/{chunk-FVL25VKT.cjs.map → chunk-AXQ6VG3I.cjs.map} +1 -1
  8. package/dist/{chunk-C7AAFHP5.cjs → chunk-BOL6YTLK.cjs} +40 -40
  9. package/dist/{chunk-C7AAFHP5.cjs.map → chunk-BOL6YTLK.cjs.map} +1 -1
  10. package/dist/{chunk-OXE2PNKV.js → chunk-BZE76SU7.js} +6 -6
  11. package/dist/{chunk-VFKQMAUF.cjs → chunk-C5RS3QLV.cjs} +3 -3
  12. package/dist/{chunk-VFKQMAUF.cjs.map → chunk-C5RS3QLV.cjs.map} +1 -1
  13. package/dist/{chunk-ZKIYCRVQ.cjs → chunk-EE5NH5SH.cjs} +3 -3
  14. package/dist/{chunk-ZKIYCRVQ.cjs.map → chunk-EE5NH5SH.cjs.map} +1 -1
  15. package/dist/{chunk-LYO2FUKU.cjs → chunk-EOKZ25ZX.cjs} +21 -21
  16. package/dist/{chunk-LYO2FUKU.cjs.map → chunk-EOKZ25ZX.cjs.map} +1 -1
  17. package/dist/{chunk-JSO2EOOV.cjs → chunk-F5NW3B2W.cjs} +36 -36
  18. package/dist/{chunk-JSO2EOOV.cjs.map → chunk-F5NW3B2W.cjs.map} +1 -1
  19. package/dist/{chunk-X3IHSMPD.cjs → chunk-GS5QSGGP.cjs} +91 -85
  20. package/dist/{chunk-X3IHSMPD.cjs.map → chunk-GS5QSGGP.cjs.map} +1 -1
  21. package/dist/{chunk-NMKIS3JX.cjs → chunk-JUICPZB2.cjs} +43 -43
  22. package/dist/{chunk-NMKIS3JX.cjs.map → chunk-JUICPZB2.cjs.map} +1 -1
  23. package/dist/{chunk-6PB5HGFM.js → chunk-KJKLNI4T.js} +5 -5
  24. package/dist/{chunk-BM5RER5N.cjs → chunk-LC47IZTB.cjs} +86 -86
  25. package/dist/{chunk-BM5RER5N.cjs.map → chunk-LC47IZTB.cjs.map} +1 -1
  26. package/dist/{chunk-M3ROXRUZ.cjs → chunk-LMJ6E6EL.cjs} +27 -27
  27. package/dist/{chunk-M3ROXRUZ.cjs.map → chunk-LMJ6E6EL.cjs.map} +1 -1
  28. package/dist/{chunk-RUQ4MVBN.js → chunk-LRSJJVYR.js} +6 -6
  29. package/dist/{chunk-SR6LEWCF.cjs → chunk-N2TJ3HAM.cjs} +10 -10
  30. package/dist/{chunk-SR6LEWCF.cjs.map → chunk-N2TJ3HAM.cjs.map} +1 -1
  31. package/dist/{chunk-Y4WY2AF6.js → chunk-NAASWINZ.js} +2 -2
  32. package/dist/{chunk-445ZGRPE.cjs → chunk-QA3KNB3D.cjs} +29 -29
  33. package/dist/{chunk-445ZGRPE.cjs.map → chunk-QA3KNB3D.cjs.map} +1 -1
  34. package/dist/{chunk-APWAFTFL.js → chunk-QQOR52ER.js} +3 -3
  35. package/dist/{chunk-FFCGB73K.js → chunk-QXYOGJQJ.js} +2 -2
  36. package/dist/{chunk-OMUCATVA.js → chunk-RVWC4P3H.js} +2 -2
  37. package/dist/{chunk-G7UE6RKV.cjs → chunk-SSJNN5BS.cjs} +20 -3
  38. package/dist/chunk-SSJNN5BS.cjs.map +1 -0
  39. package/dist/{chunk-TMITO43G.cjs → chunk-T6MEF4BK.cjs} +7 -7
  40. package/dist/{chunk-TMITO43G.cjs.map → chunk-T6MEF4BK.cjs.map} +1 -1
  41. package/dist/{chunk-56NEIHTC.js → chunk-UVDVZB6I.js} +3 -3
  42. package/dist/{chunk-ORKNKKOH.js → chunk-UYC52F32.js} +4 -4
  43. package/dist/{chunk-X7UBB6F6.js → chunk-XDBFXCLE.js} +7 -7
  44. package/dist/{chunk-AD4A44US.js → chunk-XRZSYFLR.js} +2 -2
  45. package/dist/{chunk-AEUFBPB3.cjs → chunk-Z7HY7C7P.cjs} +77 -77
  46. package/dist/{chunk-AEUFBPB3.cjs.map → chunk-Z7HY7C7P.cjs.map} +1 -1
  47. package/dist/{chunk-PLJLE4A4.js → chunk-ZJJERZUA.js} +20 -3
  48. package/dist/chunk-ZJJERZUA.js.map +1 -0
  49. package/dist/{chunk-J2WSWXJN.cjs → chunk-ZKN4UR2X.cjs} +5 -5
  50. package/dist/{chunk-J2WSWXJN.cjs.map → chunk-ZKN4UR2X.cjs.map} +1 -1
  51. package/dist/components/case-studies/index.cjs +11 -11
  52. package/dist/components/case-studies/index.js +5 -5
  53. package/dist/components/chat/index.cjs +5 -5
  54. package/dist/components/chat/index.js +4 -4
  55. package/dist/components/contact/index.cjs +6 -6
  56. package/dist/components/contact/index.js +5 -5
  57. package/dist/components/docs/index.cjs +8 -8
  58. package/dist/components/docs/index.js +7 -7
  59. package/dist/components/embeds/index.cjs +6 -6
  60. package/dist/components/embeds/index.js +5 -5
  61. package/dist/components/faq/index.cjs +7 -7
  62. package/dist/components/faq/index.js +6 -6
  63. package/dist/components/features/index.cjs +5 -5
  64. package/dist/components/features/index.js +4 -4
  65. package/dist/components/help-center-pages/index.cjs +24 -24
  66. package/dist/components/help-center-pages/index.js +15 -15
  67. package/dist/components/index.cjs +141 -141
  68. package/dist/components/index.js +13 -13
  69. package/dist/components/navigation/index.cjs +5 -5
  70. package/dist/components/navigation/index.js +4 -4
  71. package/dist/components/onboarding-guides/index.cjs +9 -9
  72. package/dist/components/onboarding-guides/index.js +8 -8
  73. package/dist/components/related-content/index.cjs +7 -7
  74. package/dist/components/related-content/index.js +6 -6
  75. package/dist/components/tickets/index.cjs +8 -8
  76. package/dist/components/tickets/index.js +7 -7
  77. package/dist/components/ui/index.cjs +5 -5
  78. package/dist/components/ui/index.js +4 -4
  79. package/dist/components/ui/stacked-rows-panel.d.ts +3 -0
  80. package/dist/components/ui/stacked-rows-panel.d.ts.map +1 -1
  81. package/dist/embed-shims/index.cjs +3 -3
  82. package/dist/embed-shims/index.js +2 -2
  83. package/dist/embed-shims/next-navigation.cjs +3 -3
  84. package/dist/embed-shims/next-navigation.d.ts.map +1 -1
  85. package/dist/embed-shims/next-navigation.js +1 -1
  86. package/dist/hooks/index.cjs +3 -3
  87. package/dist/hooks/index.js +2 -2
  88. package/dist/index.cjs +5 -5
  89. package/dist/index.js +4 -4
  90. package/package.json +1 -1
  91. package/src/components/ui/stacked-rows-panel.tsx +14 -0
  92. package/src/embed-shims/__tests__/next-navigation.test.ts +165 -0
  93. package/src/embed-shims/next-navigation.tsx +46 -9
  94. package/src/stories/StackedRowsPanel.stories.tsx +21 -0
  95. package/dist/chunk-G7UE6RKV.cjs.map +0 -1
  96. package/dist/chunk-PLJLE4A4.js.map +0 -1
  97. /package/dist/{chunk-5TCOKIAS.js.map → chunk-2NHRQU5S.js.map} +0 -0
  98. /package/dist/{chunk-XMCURSQ7.js.map → chunk-7DLIR4M3.js.map} +0 -0
  99. /package/dist/{chunk-4XLJWX2N.js.map → chunk-7EUIW46X.js.map} +0 -0
  100. /package/dist/{chunk-OXE2PNKV.js.map → chunk-BZE76SU7.js.map} +0 -0
  101. /package/dist/{chunk-6PB5HGFM.js.map → chunk-KJKLNI4T.js.map} +0 -0
  102. /package/dist/{chunk-RUQ4MVBN.js.map → chunk-LRSJJVYR.js.map} +0 -0
  103. /package/dist/{chunk-Y4WY2AF6.js.map → chunk-NAASWINZ.js.map} +0 -0
  104. /package/dist/{chunk-APWAFTFL.js.map → chunk-QQOR52ER.js.map} +0 -0
  105. /package/dist/{chunk-FFCGB73K.js.map → chunk-QXYOGJQJ.js.map} +0 -0
  106. /package/dist/{chunk-OMUCATVA.js.map → chunk-RVWC4P3H.js.map} +0 -0
  107. /package/dist/{chunk-56NEIHTC.js.map → chunk-UVDVZB6I.js.map} +0 -0
  108. /package/dist/{chunk-ORKNKKOH.js.map → chunk-UYC52F32.js.map} +0 -0
  109. /package/dist/{chunk-X7UBB6F6.js.map → chunk-XDBFXCLE.js.map} +0 -0
  110. /package/dist/{chunk-AD4A44US.js.map → chunk-XRZSYFLR.js.map} +0 -0
@@ -0,0 +1,165 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
2
+
3
+ /**
4
+ * Regression tests for the `next/navigation` shim fallback (unregistered host).
5
+ *
6
+ * The guarantee under test: an unregistered `useRouter().push/replace` must
7
+ * perform a same-origin SPA navigation via the History API and NEVER hard-load
8
+ * the document — a `?search=` write from `useApiParams` used to hard-reload via
9
+ * `window.location.replace`. The registered path must delegate to the host
10
+ * router untouched.
11
+ *
12
+ * `impl` is module-level singleton state, so each test re-imports the module
13
+ * fresh via `vi.resetModules()` to isolate registration state. We also stub
14
+ * `window.location` with a spy object so any hard navigation (assign/replace/
15
+ * reload) is observable — jsdom leaves those methods unimplemented anyway.
16
+ */
17
+
18
+ const ORIGIN = 'http://localhost:3000'
19
+
20
+ async function freshModule() {
21
+ vi.resetModules()
22
+ return import('../next-navigation')
23
+ }
24
+
25
+ let assignSpy: ReturnType<typeof vi.fn>
26
+ let replaceSpy: ReturnType<typeof vi.fn>
27
+ let reloadSpy: ReturnType<typeof vi.fn>
28
+ let pushStateSpy: ReturnType<typeof vi.spyOn>
29
+ let replaceStateSpy: ReturnType<typeof vi.spyOn>
30
+ let originalLocation: Location
31
+
32
+ beforeEach(() => {
33
+ originalLocation = window.location
34
+ assignSpy = vi.fn()
35
+ replaceSpy = vi.fn()
36
+ reloadSpy = vi.fn()
37
+ Object.defineProperty(window, 'location', {
38
+ configurable: true,
39
+ value: {
40
+ href: `${ORIGIN}/`,
41
+ origin: ORIGIN,
42
+ pathname: '/',
43
+ search: '',
44
+ assign: assignSpy,
45
+ replace: replaceSpy,
46
+ reload: reloadSpy,
47
+ },
48
+ })
49
+ // Real jsdom history — spy without changing behavior so we can assert which
50
+ // History API the fallback used (push vs replace encodes the nav semantics).
51
+ pushStateSpy = vi.spyOn(window.history, 'pushState')
52
+ replaceStateSpy = vi.spyOn(window.history, 'replaceState')
53
+ })
54
+
55
+ afterEach(() => {
56
+ Object.defineProperty(window, 'location', { configurable: true, value: originalLocation })
57
+ vi.restoreAllMocks()
58
+ })
59
+
60
+ describe('fallback useRouter (unregistered host)', () => {
61
+ it('replace() writes the URL via history.replaceState — never a hard navigation', async () => {
62
+ const { useRouter } = await freshModule()
63
+ const popstate = vi.fn()
64
+ window.addEventListener('popstate', popstate)
65
+
66
+ useRouter().replace('?search=laptop')
67
+
68
+ expect(replaceStateSpy).toHaveBeenCalledWith(null, '', `${ORIGIN}/?search=laptop`)
69
+ expect(pushStateSpy).not.toHaveBeenCalled()
70
+ // No full-document navigation of any kind — this is the reported bug.
71
+ expect(assignSpy).not.toHaveBeenCalled()
72
+ expect(replaceSpy).not.toHaveBeenCalled()
73
+ expect(reloadSpy).not.toHaveBeenCalled()
74
+ // Subscribers (usePathname/useSearchParams) get a re-render signal.
75
+ expect(popstate).toHaveBeenCalledTimes(1)
76
+
77
+ window.removeEventListener('popstate', popstate)
78
+ })
79
+
80
+ it('push() uses history.pushState (new entry) — never a hard navigation', async () => {
81
+ const { useRouter } = await freshModule()
82
+ useRouter().push('/scripts?tab=list')
83
+
84
+ expect(pushStateSpy).toHaveBeenCalledWith(null, '', `${ORIGIN}/scripts?tab=list`)
85
+ expect(replaceStateSpy).not.toHaveBeenCalled()
86
+ expect(assignSpy).not.toHaveBeenCalled()
87
+ expect(reloadSpy).not.toHaveBeenCalled()
88
+ })
89
+
90
+ it('falls back to a real navigation for cross-origin targets, honoring replace semantics', async () => {
91
+ const { useRouter } = await freshModule()
92
+ useRouter().replace('https://example.com/evil')
93
+
94
+ // replace() must use location.replace (no back-button entry), not assign.
95
+ expect(replaceSpy).toHaveBeenCalledWith('https://example.com/evil')
96
+ expect(assignSpy).not.toHaveBeenCalled()
97
+ expect(replaceStateSpy).not.toHaveBeenCalled()
98
+ expect(pushStateSpy).not.toHaveBeenCalled()
99
+ })
100
+
101
+ it('uses location.assign for a cross-origin push (new history entry)', async () => {
102
+ const { useRouter } = await freshModule()
103
+ useRouter().push('https://example.com/evil')
104
+
105
+ expect(assignSpy).toHaveBeenCalledWith('https://example.com/evil')
106
+ expect(replaceSpy).not.toHaveBeenCalled()
107
+ expect(pushStateSpy).not.toHaveBeenCalled()
108
+ })
109
+
110
+ it('falls back to a real navigation for a malformed href (push → assign)', async () => {
111
+ const { useRouter } = await freshModule()
112
+ useRouter().push('http://[invalid')
113
+
114
+ expect(assignSpy).toHaveBeenCalledWith('http://[invalid')
115
+ expect(replaceSpy).not.toHaveBeenCalled()
116
+ expect(pushStateSpy).not.toHaveBeenCalled()
117
+ })
118
+
119
+ it('falls back to a real navigation for a malformed href (replace → replace)', async () => {
120
+ const { useRouter } = await freshModule()
121
+ useRouter().replace('http://[invalid')
122
+
123
+ expect(replaceSpy).toHaveBeenCalledWith('http://[invalid')
124
+ expect(assignSpy).not.toHaveBeenCalled()
125
+ expect(replaceStateSpy).not.toHaveBeenCalled()
126
+ })
127
+
128
+ it('back/forward remain history-based (unchanged)', async () => {
129
+ const { useRouter } = await freshModule()
130
+ const backSpy = vi.spyOn(window.history, 'back').mockImplementation(() => {})
131
+ const forwardSpy = vi.spyOn(window.history, 'forward').mockImplementation(() => {})
132
+ useRouter().back()
133
+ useRouter().forward()
134
+ expect(backSpy).toHaveBeenCalledTimes(1)
135
+ expect(forwardSpy).toHaveBeenCalledTimes(1)
136
+ })
137
+ })
138
+
139
+ describe('registered useRouter (Next host)', () => {
140
+ it('delegates to the host router and never touches window.location or history', async () => {
141
+ const { useRouter, registerNavigation } = await freshModule()
142
+ const hostRouter = {
143
+ push: vi.fn(),
144
+ replace: vi.fn(),
145
+ back: vi.fn(),
146
+ forward: vi.fn(),
147
+ refresh: vi.fn(),
148
+ prefetch: vi.fn(),
149
+ }
150
+ registerNavigation({ useRouter: () => hostRouter })
151
+
152
+ const r = useRouter()
153
+ r.replace('?search=laptop', { scroll: false })
154
+ r.push('/scripts')
155
+
156
+ expect(hostRouter.replace).toHaveBeenCalledWith('?search=laptop', { scroll: false })
157
+ expect(hostRouter.push).toHaveBeenCalledWith('/scripts')
158
+ // The fallback path is completely bypassed — no navigation side effects.
159
+ expect(assignSpy).not.toHaveBeenCalled()
160
+ expect(replaceSpy).not.toHaveBeenCalled()
161
+ expect(reloadSpy).not.toHaveBeenCalled()
162
+ expect(pushStateSpy).not.toHaveBeenCalled()
163
+ expect(replaceStateSpy).not.toHaveBeenCalled()
164
+ })
165
+ })
@@ -22,9 +22,11 @@
22
22
  * After registration, every exported hook in this file delegates to
23
23
  * the real implementation. Without registration, the stubs run:
24
24
  *
25
- * - `useRouter()` → push/replace use `window.location.assign/replace`;
26
- * back/forward use `history.back/forward`; refresh reloads; prefetch
27
- * is a no-op.
25
+ * - `useRouter()` → push/replace do a same-origin SPA navigation via the
26
+ * History API (`pushState`/`replaceState` + a synthetic `popstate`), so a
27
+ * query-param write never reloads the document; cross-origin/malformed
28
+ * hrefs fall back to `window.location`. back/forward use
29
+ * `history.back/forward`; refresh reloads; prefetch is a no-op.
28
30
  * - `usePathname()` → returns `window.location.pathname` (popstate-
29
31
  * subscribed so back/forward re-renders).
30
32
  * - `useSearchParams()` → returns `URLSearchParams` view of
@@ -34,10 +36,12 @@
34
36
  * - `notFound()` / `redirect()` / `permanentRedirect()` —
35
37
  * best-effort equivalents using `window.location`.
36
38
  *
37
- * The fallback path subscribes to `popstate` only. Programmatic
38
- * `pushState`/`replaceState` does NOT fire popstate, so the fallback
39
- * does not auto-re-render on programmatic navigation. Embedders that
40
- * need that should register a real router or supply their own.
39
+ * The fallback path subscribes to `popstate`. Native `pushState`/
40
+ * `replaceState` do NOT fire popstate, but the fallback `useRouter`'s
41
+ * push/replace dispatch a synthetic `popstate` so this file's own
42
+ * `usePathname`/`useSearchParams` subscribers re-render. A URL mutated
43
+ * through some OTHER API still won't auto-re-render here — embedders
44
+ * that need that should register a real router or supply their own.
41
45
  */
42
46
  'use client'
43
47
  import { useEffect, useState } from 'react'
@@ -95,11 +99,44 @@ const noopRouter: RouterStub = {
95
99
  prefetch: () => {},
96
100
  }
97
101
 
102
+ /**
103
+ * SPA navigation for the unregistered fallback. Uses the History API instead of
104
+ * `window.location.assign/replace` so a same-origin URL change (e.g. a table's
105
+ * `?search=` write via `useApiParams`) never triggers a full document reload —
106
+ * even if a real router was never registered, or the registration landed on a
107
+ * DIFFERENT module instance than this one (duplicate lib copy / ESM-CJS dual
108
+ * package). A synthetic `popstate` is dispatched so this file's own
109
+ * `usePathname`/`useSearchParams` subscribers re-render in response.
110
+ * Cross-origin or malformed hrefs still fall back to a real `window.location`
111
+ * navigation, which is the only correct behavior there.
112
+ */
113
+ function softNavigate(href: string, mode: 'push' | 'replace'): void {
114
+ if (typeof window === 'undefined') return
115
+ try {
116
+ const url = new URL(href, window.location.href)
117
+ if (url.origin !== window.location.origin) {
118
+ // Preserve the caller's history semantics: replace() must not leave a
119
+ // back-button entry, so it uses `location.replace`, not `location.assign`.
120
+ if (mode === 'push') window.location.assign(url.href)
121
+ else window.location.replace(url.href)
122
+ return
123
+ }
124
+ if (mode === 'push') window.history.pushState(null, '', url.href)
125
+ else window.history.replaceState(null, '', url.href)
126
+ window.dispatchEvent(new PopStateEvent('popstate'))
127
+ } catch {
128
+ // Malformed href — a real navigation is safer than swallowing it, but still
129
+ // honor push vs replace history semantics.
130
+ if (mode === 'push') window.location.assign(href)
131
+ else window.location.replace(href)
132
+ }
133
+ }
134
+
98
135
  function fallbackUseRouter(): RouterStub {
99
136
  if (typeof window === 'undefined') return noopRouter
100
137
  return {
101
- push: (href: string) => window.location.assign(href),
102
- replace: (href: string) => window.location.replace(href),
138
+ push: (href: string) => softNavigate(href, 'push'),
139
+ replace: (href: string) => softNavigate(href, 'replace'),
103
140
  back: () => window.history.back(),
104
141
  forward: () => window.history.forward(),
105
142
  refresh: () => window.location.reload(),
@@ -1,5 +1,6 @@
1
1
  import type { Meta, StoryObj } from '@storybook/nextjs-vite'
2
2
  import { useMemo } from 'react'
3
+ import { InfoCircleIcon } from '../components/icons-v2-generated/signs-and-symbols'
3
4
  import { type ColumnDef, DataTable, type Row, useDataTable } from '../components/ui/data-table'
4
5
  import { EntityImage } from '../components/ui/entity-image'
5
6
  import { StackedRowsPanel } from '../components/ui/stacked-rows-panel'
@@ -105,6 +106,26 @@ export const SingleRow: Story = {
105
106
  },
106
107
  }
107
108
 
109
+ /** Info-banner row: `leadingIcon` centers a 24px glyph against both text lines. */
110
+ export const InfoBanner: Story = {
111
+ args: {
112
+ rows: [
113
+ {
114
+ id: 'banner',
115
+ className: 'p-[var(--spacing-system-s)]',
116
+ columns: [
117
+ {
118
+ key: 'banner',
119
+ leadingIcon: <InfoCircleIcon className="size-6 text-ods-text-secondary" />,
120
+ value: 'Using OpenFrame default actions',
121
+ label: 'These quick actions are curated and approved by OpenFrame.',
122
+ },
123
+ ],
124
+ },
125
+ ],
126
+ },
127
+ }
128
+
108
129
  interface DemoDevice {
109
130
  id: string
110
131
  name: string
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-G7UE6RKV.cjs","../src/embed-shims/next-navigation.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-G7UE6RKV.cjs","sourcesContent":[null,"/**\n * `next/navigation` shim — environment-aware app-router hooks.\n *\n * Defaults to lightweight stubs backed by `window.location` and\n * `URLSearchParams` so lib components that read the URL work outside\n * a Next.js router shell. Next.js hosts can opt into the REAL\n * `next/navigation` exports (full client-router integration —\n * `router.replace(href, { scroll: false })`, etc.) by calling\n * {@link registerNavigation} ONCE at app init:\n *\n * // hub: lib/embed-shim-registration.ts\n * import {\n * useRouter, usePathname, useSearchParams, useParams,\n * redirect, permanentRedirect, notFound,\n * } from 'next/navigation'\n * import { registerNavigation } from '@flamingo-stack/openframe-frontend-core/embed-shims'\n * registerNavigation({\n * useRouter, usePathname, useSearchParams, useParams,\n * redirect, permanentRedirect, notFound,\n * })\n *\n * After registration, every exported hook in this file delegates to\n * the real implementation. Without registration, the stubs run:\n *\n * - `useRouter()` → push/replace use `window.location.assign/replace`;\n * back/forward use `history.back/forward`; refresh reloads; prefetch\n * is a no-op.\n * - `usePathname()` → returns `window.location.pathname` (popstate-\n * subscribed so back/forward re-renders).\n * - `useSearchParams()` → returns `URLSearchParams` view of\n * `window.location.search` (popstate-subscribed).\n * - `useParams()` → returns `{}` — embedders that need dynamic\n * params should parse them from `usePathname()` themselves.\n * - `notFound()` / `redirect()` / `permanentRedirect()` —\n * best-effort equivalents using `window.location`.\n *\n * The fallback path subscribes to `popstate` only. Programmatic\n * `pushState`/`replaceState` does NOT fire popstate, so the fallback\n * does not auto-re-render on programmatic navigation. Embedders that\n * need that should register a real router or supply their own.\n */\n'use client'\nimport { useEffect, useState } from 'react'\n\n// --- Router shape — matches Next's AppRouterInstance surface enough to\n// --- satisfy hub callsites that pass options like `{ scroll: false }`.\ninterface NavigateOptions {\n scroll?: boolean\n}\n\ninterface PrefetchOptions {\n kind?: unknown\n}\n\ninterface RouterStub {\n push: (href: string, options?: NavigateOptions) => void\n replace: (href: string, options?: NavigateOptions) => void\n back: () => void\n forward: () => void\n refresh: () => void\n prefetch: (href: string, options?: PrefetchOptions) => void\n}\n\n// --- Registration surface — partial so a host can register only the\n// --- hooks it needs (e.g. routes that don't use redirect()).\nexport interface NavigationImpl {\n useRouter: () => RouterStub\n usePathname: () => string\n useSearchParams: () => URLSearchParams\n useParams: <T extends Record<string, string | string[]>>() => T\n redirect: (url: string, type?: unknown) => never\n permanentRedirect: (url: string, type?: unknown) => never\n notFound: () => never\n}\n\nlet impl: Partial<NavigationImpl> = {}\n\n/**\n * Register real `next/navigation` exports. Merges with any prior\n * registration so partial-overrides are safe. Call ONCE at app init\n * in a Next.js host.\n */\nexport function registerNavigation(nav: Partial<NavigationImpl>): void {\n impl = { ...impl, ...nav }\n}\n\n// --- Fallback impls ----------------------------------------------------\n\nconst noopRouter: RouterStub = {\n push: () => {},\n replace: () => {},\n back: () => {},\n forward: () => {},\n refresh: () => {},\n prefetch: () => {},\n}\n\nfunction fallbackUseRouter(): RouterStub {\n if (typeof window === 'undefined') return noopRouter\n return {\n push: (href: string) => window.location.assign(href),\n replace: (href: string) => window.location.replace(href),\n back: () => window.history.back(),\n forward: () => window.history.forward(),\n refresh: () => window.location.reload(),\n prefetch: () => {},\n }\n}\n\nfunction readLocation<T>(read: () => T, fallback: T): T {\n return typeof window === 'undefined' ? fallback : read()\n}\n\n/** Subscribes to `popstate` only. pushState/replaceState do NOT fire\n * popstate by design — callers that mutate the URL programmatically\n * (and want their component to re-render in response) need a real\n * router. */\nfunction useLocationSubscription(): number {\n const [tick, setTick] = useState(0)\n useEffect(() => {\n if (typeof window === 'undefined') return\n const onChange = () => setTick((t) => t + 1)\n window.addEventListener('popstate', onChange)\n return () => window.removeEventListener('popstate', onChange)\n }, [])\n return tick\n}\n\nfunction fallbackUsePathname(): string {\n useLocationSubscription()\n return readLocation(() => window.location.pathname, '/')\n}\n\nfunction fallbackUseSearchParams(): URLSearchParams {\n useLocationSubscription()\n return readLocation(\n () => new URLSearchParams(window.location.search),\n new URLSearchParams(),\n )\n}\n\nfunction fallbackUseParams<T extends Record<string, string | string[]>>(): T {\n return {} as T\n}\n\nfunction fallbackRedirect(url: string): never {\n if (typeof window !== 'undefined') window.location.assign(url)\n throw new Error(`[next-navigation shim] redirect(${url})`)\n}\n\nfunction fallbackPermanentRedirect(url: string): never {\n if (typeof window !== 'undefined') window.location.replace(url)\n throw new Error(`[next-navigation shim] permanentRedirect(${url})`)\n}\n\nfunction fallbackNotFound(): never {\n throw new Error('[next-navigation shim] notFound()')\n}\n\n// --- Public surface — each export checks the registry and falls\n// --- through to the fallback. Hooks must remain hooks (no early-\n// --- return-before-hook) — the registry lookup is itself synchronous\n// --- and the registered impl is a hook in its own right.\n\nexport function useRouter(): RouterStub {\n return (impl.useRouter ?? fallbackUseRouter)()\n}\n\nexport function usePathname(): string {\n return (impl.usePathname ?? fallbackUsePathname)()\n}\n\nexport function useSearchParams(): URLSearchParams {\n return (impl.useSearchParams ?? fallbackUseSearchParams)()\n}\n\nexport function useParams<T extends Record<string, string | string[]>>(): T {\n return ((impl.useParams as (() => T) | undefined) ?? fallbackUseParams)()\n}\n\nexport function redirect(url: string, type?: unknown): never {\n return (impl.redirect ?? fallbackRedirect)(url, type)\n}\n\nexport function permanentRedirect(url: string, type?: unknown): never {\n return (impl.permanentRedirect ?? fallbackPermanentRedirect)(url, type)\n}\n\nexport function notFound(): never {\n return (impl.notFound ?? fallbackNotFound)()\n}\n\n/** Match Next's RedirectType enum surface for code that imports it. */\nexport const RedirectType = {\n push: 'push' as const,\n replace: 'replace' as const,\n}\n\n/** Match Next's ServerInsertedHTMLContext surface — non-functional in\n * the embed environment but importable so consumers don't crash. */\nexport const ServerInsertedHTMLContext = null as any\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/embed-shims/next-navigation.tsx"],"sourcesContent":["/**\n * `next/navigation` shim — environment-aware app-router hooks.\n *\n * Defaults to lightweight stubs backed by `window.location` and\n * `URLSearchParams` so lib components that read the URL work outside\n * a Next.js router shell. Next.js hosts can opt into the REAL\n * `next/navigation` exports (full client-router integration —\n * `router.replace(href, { scroll: false })`, etc.) by calling\n * {@link registerNavigation} ONCE at app init:\n *\n * // hub: lib/embed-shim-registration.ts\n * import {\n * useRouter, usePathname, useSearchParams, useParams,\n * redirect, permanentRedirect, notFound,\n * } from 'next/navigation'\n * import { registerNavigation } from '@flamingo-stack/openframe-frontend-core/embed-shims'\n * registerNavigation({\n * useRouter, usePathname, useSearchParams, useParams,\n * redirect, permanentRedirect, notFound,\n * })\n *\n * After registration, every exported hook in this file delegates to\n * the real implementation. Without registration, the stubs run:\n *\n * - `useRouter()` → push/replace use `window.location.assign/replace`;\n * back/forward use `history.back/forward`; refresh reloads; prefetch\n * is a no-op.\n * - `usePathname()` → returns `window.location.pathname` (popstate-\n * subscribed so back/forward re-renders).\n * - `useSearchParams()` → returns `URLSearchParams` view of\n * `window.location.search` (popstate-subscribed).\n * - `useParams()` → returns `{}` — embedders that need dynamic\n * params should parse them from `usePathname()` themselves.\n * - `notFound()` / `redirect()` / `permanentRedirect()` —\n * best-effort equivalents using `window.location`.\n *\n * The fallback path subscribes to `popstate` only. Programmatic\n * `pushState`/`replaceState` does NOT fire popstate, so the fallback\n * does not auto-re-render on programmatic navigation. Embedders that\n * need that should register a real router or supply their own.\n */\n'use client'\nimport { useEffect, useState } from 'react'\n\n// --- Router shape — matches Next's AppRouterInstance surface enough to\n// --- satisfy hub callsites that pass options like `{ scroll: false }`.\ninterface NavigateOptions {\n scroll?: boolean\n}\n\ninterface PrefetchOptions {\n kind?: unknown\n}\n\ninterface RouterStub {\n push: (href: string, options?: NavigateOptions) => void\n replace: (href: string, options?: NavigateOptions) => void\n back: () => void\n forward: () => void\n refresh: () => void\n prefetch: (href: string, options?: PrefetchOptions) => void\n}\n\n// --- Registration surface — partial so a host can register only the\n// --- hooks it needs (e.g. routes that don't use redirect()).\nexport interface NavigationImpl {\n useRouter: () => RouterStub\n usePathname: () => string\n useSearchParams: () => URLSearchParams\n useParams: <T extends Record<string, string | string[]>>() => T\n redirect: (url: string, type?: unknown) => never\n permanentRedirect: (url: string, type?: unknown) => never\n notFound: () => never\n}\n\nlet impl: Partial<NavigationImpl> = {}\n\n/**\n * Register real `next/navigation` exports. Merges with any prior\n * registration so partial-overrides are safe. Call ONCE at app init\n * in a Next.js host.\n */\nexport function registerNavigation(nav: Partial<NavigationImpl>): void {\n impl = { ...impl, ...nav }\n}\n\n// --- Fallback impls ----------------------------------------------------\n\nconst noopRouter: RouterStub = {\n push: () => {},\n replace: () => {},\n back: () => {},\n forward: () => {},\n refresh: () => {},\n prefetch: () => {},\n}\n\nfunction fallbackUseRouter(): RouterStub {\n if (typeof window === 'undefined') return noopRouter\n return {\n push: (href: string) => window.location.assign(href),\n replace: (href: string) => window.location.replace(href),\n back: () => window.history.back(),\n forward: () => window.history.forward(),\n refresh: () => window.location.reload(),\n prefetch: () => {},\n }\n}\n\nfunction readLocation<T>(read: () => T, fallback: T): T {\n return typeof window === 'undefined' ? fallback : read()\n}\n\n/** Subscribes to `popstate` only. pushState/replaceState do NOT fire\n * popstate by design — callers that mutate the URL programmatically\n * (and want their component to re-render in response) need a real\n * router. */\nfunction useLocationSubscription(): number {\n const [tick, setTick] = useState(0)\n useEffect(() => {\n if (typeof window === 'undefined') return\n const onChange = () => setTick((t) => t + 1)\n window.addEventListener('popstate', onChange)\n return () => window.removeEventListener('popstate', onChange)\n }, [])\n return tick\n}\n\nfunction fallbackUsePathname(): string {\n useLocationSubscription()\n return readLocation(() => window.location.pathname, '/')\n}\n\nfunction fallbackUseSearchParams(): URLSearchParams {\n useLocationSubscription()\n return readLocation(\n () => new URLSearchParams(window.location.search),\n new URLSearchParams(),\n )\n}\n\nfunction fallbackUseParams<T extends Record<string, string | string[]>>(): T {\n return {} as T\n}\n\nfunction fallbackRedirect(url: string): never {\n if (typeof window !== 'undefined') window.location.assign(url)\n throw new Error(`[next-navigation shim] redirect(${url})`)\n}\n\nfunction fallbackPermanentRedirect(url: string): never {\n if (typeof window !== 'undefined') window.location.replace(url)\n throw new Error(`[next-navigation shim] permanentRedirect(${url})`)\n}\n\nfunction fallbackNotFound(): never {\n throw new Error('[next-navigation shim] notFound()')\n}\n\n// --- Public surface — each export checks the registry and falls\n// --- through to the fallback. Hooks must remain hooks (no early-\n// --- return-before-hook) — the registry lookup is itself synchronous\n// --- and the registered impl is a hook in its own right.\n\nexport function useRouter(): RouterStub {\n return (impl.useRouter ?? fallbackUseRouter)()\n}\n\nexport function usePathname(): string {\n return (impl.usePathname ?? fallbackUsePathname)()\n}\n\nexport function useSearchParams(): URLSearchParams {\n return (impl.useSearchParams ?? fallbackUseSearchParams)()\n}\n\nexport function useParams<T extends Record<string, string | string[]>>(): T {\n return ((impl.useParams as (() => T) | undefined) ?? fallbackUseParams)()\n}\n\nexport function redirect(url: string, type?: unknown): never {\n return (impl.redirect ?? fallbackRedirect)(url, type)\n}\n\nexport function permanentRedirect(url: string, type?: unknown): never {\n return (impl.permanentRedirect ?? fallbackPermanentRedirect)(url, type)\n}\n\nexport function notFound(): never {\n return (impl.notFound ?? fallbackNotFound)()\n}\n\n/** Match Next's RedirectType enum surface for code that imports it. */\nexport const RedirectType = {\n push: 'push' as const,\n replace: 'replace' as const,\n}\n\n/** Match Next's ServerInsertedHTMLContext surface — non-functional in\n * the embed environment but importable so consumers don't crash. */\nexport const ServerInsertedHTMLContext = null as any\n"],"mappings":";;;;;;AA0CA,SAAS,WAAW,gBAAgB;AAwC7B,SAAS,mBAAmB,KAAoC;AACrE,SAAO,EAAE,GAAG,MAAM,GAAG,IAAI;AAC3B;AAaA,SAAS,oBAAgC;AACvC,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,SAAO;AAAA,IACL,MAAM,CAAC,SAAiB,OAAO,SAAS,OAAO,IAAI;AAAA,IACnD,SAAS,CAAC,SAAiB,OAAO,SAAS,QAAQ,IAAI;AAAA,IACvD,MAAM,MAAM,OAAO,QAAQ,KAAK;AAAA,IAChC,SAAS,MAAM,OAAO,QAAQ,QAAQ;AAAA,IACtC,SAAS,MAAM,OAAO,SAAS,OAAO;AAAA,IACtC,UAAU,MAAM;AAAA,IAAC;AAAA,EACnB;AACF;AAEA,SAAS,aAAgB,MAAe,UAAgB;AACtD,SAAO,OAAO,WAAW,cAAc,WAAW,KAAK;AACzD;AAMA,SAAS,0BAAkC;AACzC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,CAAC;AAClC,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,YAAa;AACnC,UAAM,WAAW,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC;AAC3C,WAAO,iBAAiB,YAAY,QAAQ;AAC5C,WAAO,MAAM,OAAO,oBAAoB,YAAY,QAAQ;AAAA,EAC9D,GAAG,CAAC,CAAC;AACL,SAAO;AACT;AAEA,SAAS,sBAA8B;AACrC,0BAAwB;AACxB,SAAO,aAAa,MAAM,OAAO,SAAS,UAAU,GAAG;AACzD;AAEA,SAAS,0BAA2C;AAClD,0BAAwB;AACxB,SAAO;AAAA,IACL,MAAM,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAAA,IAChD,IAAI,gBAAgB;AAAA,EACtB;AACF;AAEA,SAAS,oBAAoE;AAC3E,SAAO,CAAC;AACV;AAEA,SAAS,iBAAiB,KAAoB;AAC5C,MAAI,OAAO,WAAW,YAAa,QAAO,SAAS,OAAO,GAAG;AAC7D,QAAM,IAAI,MAAM,mCAAmC,GAAG,GAAG;AAC3D;AAEA,SAAS,0BAA0B,KAAoB;AACrD,MAAI,OAAO,WAAW,YAAa,QAAO,SAAS,QAAQ,GAAG;AAC9D,QAAM,IAAI,MAAM,4CAA4C,GAAG,GAAG;AACpE;AAEA,SAAS,mBAA0B;AACjC,QAAM,IAAI,MAAM,mCAAmC;AACrD;AAOO,SAAS,YAAwB;AACtC,UAAQ,KAAK,aAAa,mBAAmB;AAC/C;AAEO,SAAS,cAAsB;AACpC,UAAQ,KAAK,eAAe,qBAAqB;AACnD;AAEO,SAAS,kBAAmC;AACjD,UAAQ,KAAK,mBAAmB,yBAAyB;AAC3D;AAEO,SAAS,YAA4D;AAC1E,UAAS,KAAK,aAAuC,mBAAmB;AAC1E;AAEO,SAAS,SAAS,KAAa,MAAuB;AAC3D,UAAQ,KAAK,YAAY,kBAAkB,KAAK,IAAI;AACtD;AAEO,SAAS,kBAAkB,KAAa,MAAuB;AACpE,UAAQ,KAAK,qBAAqB,2BAA2B,KAAK,IAAI;AACxE;AAEO,SAAS,WAAkB;AAChC,UAAQ,KAAK,YAAY,kBAAkB;AAC7C;AA9LA,IA2EI,MAaE,YAyGO,cAOA;AAxMb;AAAA;AA2EA,IAAI,OAAgC,CAAC;AAarC,IAAM,aAAyB;AAAA,MAC7B,MAAM,MAAM;AAAA,MAAC;AAAA,MACb,SAAS,MAAM;AAAA,MAAC;AAAA,MAChB,MAAM,MAAM;AAAA,MAAC;AAAA,MACb,SAAS,MAAM;AAAA,MAAC;AAAA,MAChB,SAAS,MAAM;AAAA,MAAC;AAAA,MAChB,UAAU,MAAM;AAAA,MAAC;AAAA,IACnB;AAkGO,IAAM,eAAe;AAAA,MAC1B,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAIO,IAAM,4BAA4B;AAAA;AAAA;","names":[]}