@burdenoff/fe-libs 2026.819.4 → 2026.823.1

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 (239) hide show
  1. package/README.md +66 -0
  2. package/dist/button/Button.d.ts +1 -1
  3. package/dist/chrome/AppShellLayout.d.ts +14 -0
  4. package/dist/chrome/AppShellLayout.d.ts.map +1 -1
  5. package/dist/chrome/AppShellLayout.js +13 -10
  6. package/dist/chrome/DynamicFooter.d.ts +6 -1
  7. package/dist/chrome/DynamicFooter.d.ts.map +1 -1
  8. package/dist/chrome/DynamicFooter.js +21 -20
  9. package/dist/chrome/Footer.d.ts +6 -0
  10. package/dist/chrome/Footer.d.ts.map +1 -1
  11. package/dist/chrome/Footer.js +46 -45
  12. package/dist/chrome/FooterBar.d.ts +6 -1
  13. package/dist/chrome/FooterBar.d.ts.map +1 -1
  14. package/dist/chrome/FooterBar.js +28 -26
  15. package/dist/chrome/HeaderBar.d.ts.map +1 -1
  16. package/dist/chrome/HeaderBar.js +3 -0
  17. package/dist/chrome/MobileTabBar.d.ts +26 -0
  18. package/dist/chrome/MobileTabBar.d.ts.map +1 -0
  19. package/dist/chrome/MobileTabBar.js +194 -0
  20. package/dist/chrome/NativePageTransition.d.ts +10 -0
  21. package/dist/chrome/NativePageTransition.d.ts.map +1 -0
  22. package/dist/chrome/NativePageTransition.js +19 -0
  23. package/dist/chrome/NativeTopBar.d.ts +21 -0
  24. package/dist/chrome/NativeTopBar.d.ts.map +1 -0
  25. package/dist/chrome/NativeTopBar.js +72 -0
  26. package/dist/chrome/NotificationCenter.d.ts.map +1 -1
  27. package/dist/chrome/NotificationCenter.js +70 -65
  28. package/dist/chrome/ProductSideNav.d.ts.map +1 -1
  29. package/dist/chrome/ProductSideNav.js +44 -74
  30. package/dist/chrome/SwipeNavigation.d.ts +36 -0
  31. package/dist/chrome/SwipeNavigation.d.ts.map +1 -0
  32. package/dist/chrome/SwipeNavigation.js +111 -0
  33. package/dist/chrome/index.d.ts +13 -7
  34. package/dist/chrome/index.d.ts.map +1 -1
  35. package/dist/chrome/mobileTabBar/selectTabs.d.ts +45 -0
  36. package/dist/chrome/mobileTabBar/selectTabs.d.ts.map +1 -0
  37. package/dist/chrome/mobileTabBar/selectTabs.js +28 -0
  38. package/dist/chrome/mobileTabBar/useMobileTabBarVisible.d.ts +18 -0
  39. package/dist/chrome/mobileTabBar/useMobileTabBarVisible.d.ts.map +1 -0
  40. package/dist/chrome/mobileTabBar/useMobileTabBarVisible.js +16 -0
  41. package/dist/chrome/mobileTabBar/useVisibleNavItems.d.ts +18 -0
  42. package/dist/chrome/mobileTabBar/useVisibleNavItems.d.ts.map +1 -0
  43. package/dist/chrome/mobileTabBar/useVisibleNavItems.js +41 -0
  44. package/dist/chrome/swipe/swipeMath.d.ts +25 -0
  45. package/dist/chrome/swipe/swipeMath.d.ts.map +1 -0
  46. package/dist/chrome/swipe/swipeMath.js +14 -0
  47. package/dist/chrome/swipe/swipeState.d.ts +10 -0
  48. package/dist/chrome/swipe/swipeState.d.ts.map +1 -0
  49. package/dist/chrome/swipe/swipeState.js +11 -0
  50. package/dist/chrome.js +7 -1
  51. package/dist/shared/components/DesktopUpdateToast.d.ts +9 -0
  52. package/dist/shared/components/DesktopUpdateToast.d.ts.map +1 -0
  53. package/dist/shared/components/DesktopUpdateToast.js +39 -0
  54. package/dist/shared/components/PWAInstallBanner.js +1 -1
  55. package/dist/shared/components/SSORedirectGuard.d.ts.map +1 -1
  56. package/dist/shared/components/SSORedirectGuard.js +41 -45
  57. package/dist/shared/components/index.d.ts +2 -0
  58. package/dist/shared/components/index.d.ts.map +1 -1
  59. package/dist/shared/config/authBridgeUrls.d.ts +10 -0
  60. package/dist/shared/config/authBridgeUrls.d.ts.map +1 -1
  61. package/dist/shared/config/authBridgeUrls.js +16 -12
  62. package/dist/shared/config/gatewayUrls.d.ts.map +1 -1
  63. package/dist/shared/config/gatewayUrls.js +22 -19
  64. package/dist/shared/config/index.d.ts +1 -1
  65. package/dist/shared/config/index.d.ts.map +1 -1
  66. package/dist/shared/events/index.d.ts +13 -1
  67. package/dist/shared/events/index.d.ts.map +1 -1
  68. package/dist/shared/hooks/shell/useNavRegistry.d.ts +7 -0
  69. package/dist/shared/hooks/shell/useNavRegistry.d.ts.map +1 -1
  70. package/dist/shared/hooks/usePWA.d.ts.map +1 -1
  71. package/dist/shared/hooks/usePWA.js +34 -30
  72. package/dist/shared/native/consumers.d.ts +15 -1
  73. package/dist/shared/native/consumers.d.ts.map +1 -1
  74. package/dist/shared/native/consumers.js +26 -7
  75. package/dist/shared/native/desktop.d.ts +123 -0
  76. package/dist/shared/native/desktop.d.ts.map +1 -0
  77. package/dist/shared/native/desktop.js +280 -0
  78. package/dist/shared/native/entry.d.ts +39 -0
  79. package/dist/shared/native/entry.d.ts.map +1 -0
  80. package/dist/shared/native/entry.js +13 -0
  81. package/dist/shared/native/hooks/index.d.ts +10 -0
  82. package/dist/shared/native/hooks/index.d.ts.map +1 -1
  83. package/dist/shared/native/hooks/index.js +6 -0
  84. package/dist/shared/native/hooks/useActionSheet.d.ts +63 -0
  85. package/dist/shared/native/hooks/useActionSheet.d.ts.map +1 -0
  86. package/dist/shared/native/hooks/useActionSheet.js +45 -0
  87. package/dist/shared/native/hooks/useDesktop.d.ts +15 -0
  88. package/dist/shared/native/hooks/useDesktop.d.ts.map +1 -0
  89. package/dist/shared/native/hooks/useDesktop.js +18 -0
  90. package/dist/shared/native/hooks/useDesktopUpdateState.d.ts +7 -0
  91. package/dist/shared/native/hooks/useDesktopUpdateState.d.ts.map +1 -0
  92. package/dist/shared/native/hooks/useDesktopUpdateState.js +20 -0
  93. package/dist/shared/native/hooks/useDesktopWindowState.d.ts +7 -0
  94. package/dist/shared/native/hooks/useDesktopWindowState.d.ts.map +1 -0
  95. package/dist/shared/native/hooks/useDesktopWindowState.js +9 -0
  96. package/dist/shared/native/hooks/useHaptics.d.ts +1 -0
  97. package/dist/shared/native/hooks/useHaptics.d.ts.map +1 -1
  98. package/dist/shared/native/hooks/useHaptics.js +6 -6
  99. package/dist/shared/native/hooks/useNetworkStatus.d.ts +23 -0
  100. package/dist/shared/native/hooks/useNetworkStatus.d.ts.map +1 -0
  101. package/dist/shared/native/hooks/useNetworkStatus.js +29 -0
  102. package/dist/shared/native/hooks/usePullToRefresh.d.ts +62 -0
  103. package/dist/shared/native/hooks/usePullToRefresh.d.ts.map +1 -0
  104. package/dist/shared/native/hooks/usePullToRefresh.js +84 -0
  105. package/dist/shared/native/index.d.ts +6 -1
  106. package/dist/shared/native/index.d.ts.map +1 -1
  107. package/dist/shared/native/platform.d.ts.map +1 -1
  108. package/dist/shared/native/platform.js +2 -1
  109. package/dist/shared/native/purchases.d.ts +7 -1
  110. package/dist/shared/native/purchases.d.ts.map +1 -1
  111. package/dist/shared/native/purchases.js +3 -3
  112. package/dist/shared/native/types.d.ts +136 -0
  113. package/dist/shared/native/types.d.ts.map +1 -1
  114. package/dist/shared/providers/AppShellProvider.d.ts.map +1 -1
  115. package/dist/shared/providers/AppShellProvider.js +117 -115
  116. package/dist/shared/providers/shell/ThemeProvider.d.ts.map +1 -1
  117. package/dist/shared/providers/shell/ThemeProvider.js +64 -51
  118. package/dist/shared/providers/shell/authProvider/useSsoDepositBootGuard.d.ts.map +1 -1
  119. package/dist/shared/providers/shell/authProvider/useSsoDepositBootGuard.js +25 -29
  120. package/dist/shared/utils/gatewayFetchRewrite.d.ts.map +1 -1
  121. package/dist/shared/utils/gatewayFetchRewrite.js +87 -84
  122. package/dist/shared-components.js +2 -1
  123. package/dist/shared-config.js +10 -10
  124. package/dist/shared-native.js +21 -13
  125. package/dist/shared.js +120 -111
  126. package/dist/shell-native/actionSheet.d.ts +7 -0
  127. package/dist/shell-native/actionSheet.d.ts.map +1 -0
  128. package/dist/shell-native/actionSheet.js +26 -0
  129. package/dist/shell-native/app-lifecycle.d.ts +4 -0
  130. package/dist/shell-native/app-lifecycle.d.ts.map +1 -0
  131. package/dist/shell-native/app-lifecycle.js +12 -0
  132. package/dist/shell-native/auth-navigation.d.ts +4 -0
  133. package/dist/shell-native/auth-navigation.d.ts.map +1 -0
  134. package/dist/shell-native/auth-navigation.js +95 -0
  135. package/dist/shell-native/back-button.d.ts +8 -0
  136. package/dist/shell-native/back-button.d.ts.map +1 -0
  137. package/dist/shell-native/back-button.js +49 -0
  138. package/dist/shell-native/boot.d.ts +10 -0
  139. package/dist/shell-native/boot.d.ts.map +1 -0
  140. package/dist/shell-native/boot.js +65 -0
  141. package/dist/shell-native/bridge.d.ts +7 -0
  142. package/dist/shell-native/bridge.d.ts.map +1 -0
  143. package/dist/shell-native/bridge.js +30 -0
  144. package/dist/shell-native/browser.d.ts +12 -0
  145. package/dist/shell-native/browser.d.ts.map +1 -0
  146. package/dist/shell-native/browser.js +45 -0
  147. package/dist/shell-native/capacitor-config.d.ts +21 -0
  148. package/dist/shell-native/capacitor-config.d.ts.map +1 -0
  149. package/dist/shell-native/capacitor-config.js +103 -0
  150. package/dist/shell-native/clipboard.d.ts +3 -0
  151. package/dist/shell-native/clipboard.d.ts.map +1 -0
  152. package/dist/shell-native/clipboard.js +26 -0
  153. package/dist/shell-native/deep-link.d.ts +19 -0
  154. package/dist/shell-native/deep-link.d.ts.map +1 -0
  155. package/dist/shell-native/deep-link.js +53 -0
  156. package/dist/shell-native/desktop-bridge.d.ts +14 -0
  157. package/dist/shell-native/desktop-bridge.d.ts.map +1 -0
  158. package/dist/shell-native/desktop-bridge.js +17 -0
  159. package/dist/shell-native/device.d.ts +4 -0
  160. package/dist/shell-native/device.d.ts.map +1 -0
  161. package/dist/shell-native/device.js +27 -0
  162. package/dist/shell-native/dialog.d.ts +4 -0
  163. package/dist/shell-native/dialog.d.ts.map +1 -0
  164. package/dist/shell-native/dialog.js +13 -0
  165. package/dist/shell-native/feedback.d.ts +6 -0
  166. package/dist/shell-native/feedback.d.ts.map +1 -0
  167. package/dist/shell-native/feedback.js +29 -0
  168. package/dist/shell-native/index.d.ts +54 -0
  169. package/dist/shell-native/index.d.ts.map +1 -0
  170. package/dist/shell-native/keyboard.d.ts +15 -0
  171. package/dist/shell-native/keyboard.d.ts.map +1 -0
  172. package/dist/shell-native/keyboard.js +42 -0
  173. package/dist/shell-native/network.d.ts +9 -0
  174. package/dist/shell-native/network.d.ts.map +1 -0
  175. package/dist/shell-native/network.js +40 -0
  176. package/dist/shell-native/ota.d.ts +3 -0
  177. package/dist/shell-native/ota.d.ts.map +1 -0
  178. package/dist/shell-native/ota.js +21 -0
  179. package/dist/shell-native/platform.d.ts +21 -0
  180. package/dist/shell-native/platform.d.ts.map +1 -0
  181. package/dist/shell-native/platform.js +51 -0
  182. package/dist/shell-native/preview.d.ts +18 -0
  183. package/dist/shell-native/preview.d.ts.map +1 -0
  184. package/dist/shell-native/preview.js +124 -0
  185. package/dist/shell-native/push.d.ts +14 -0
  186. package/dist/shell-native/push.d.ts.map +1 -0
  187. package/dist/shell-native/push.js +62 -0
  188. package/dist/shell-native/pwa.d.ts +14 -0
  189. package/dist/shell-native/pwa.d.ts.map +1 -0
  190. package/dist/shell-native/pwa.js +49 -0
  191. package/dist/shell-native/service-worker.d.ts +5 -0
  192. package/dist/shell-native/service-worker.d.ts.map +1 -0
  193. package/dist/shell-native/service-worker.js +144 -0
  194. package/dist/shell-native/share.d.ts +4 -0
  195. package/dist/shell-native/share.d.ts.map +1 -0
  196. package/dist/shell-native/share.js +19 -0
  197. package/dist/shell-native/splash.d.ts +16 -0
  198. package/dist/shell-native/splash.d.ts.map +1 -0
  199. package/dist/shell-native/splash.js +25 -0
  200. package/dist/shell-native/system-bars.d.ts +24 -0
  201. package/dist/shell-native/system-bars.d.ts.map +1 -0
  202. package/dist/shell-native/system-bars.js +49 -0
  203. package/dist/shell-native/toast.d.ts +4 -0
  204. package/dist/shell-native/toast.d.ts.map +1 -0
  205. package/dist/shell-native/toast.js +16 -0
  206. package/dist/shell-native/types.d.ts +292 -0
  207. package/dist/shell-native/types.d.ts.map +1 -0
  208. package/dist/shell-native/web-manifest.d.ts +36 -0
  209. package/dist/shell-native/web-manifest.d.ts.map +1 -0
  210. package/dist/shell-native/web-manifest.js +55 -0
  211. package/dist/shell-native.d.ts +2 -0
  212. package/dist/shell-native.js +29 -0
  213. package/dist/ui/action-sheet.d.ts +29 -0
  214. package/dist/ui/action-sheet.d.ts.map +1 -0
  215. package/dist/ui/action-sheet.js +53 -0
  216. package/dist/ui/badge.d.ts +1 -1
  217. package/dist/ui/button.d.ts +1 -1
  218. package/dist/ui/index.d.ts +6 -0
  219. package/dist/ui/index.d.ts.map +1 -1
  220. package/dist/ui/native-welcome.d.ts +61 -0
  221. package/dist/ui/native-welcome.d.ts.map +1 -0
  222. package/dist/ui/native-welcome.js +152 -0
  223. package/dist/ui/offline-banner.d.ts +22 -0
  224. package/dist/ui/offline-banner.d.ts.map +1 -0
  225. package/dist/ui/offline-banner.js +34 -0
  226. package/dist/ui/pull-to-refresh.d.ts +29 -0
  227. package/dist/ui/pull-to-refresh.d.ts.map +1 -0
  228. package/dist/ui/pull-to-refresh.js +44 -0
  229. package/dist/ui/pwa-update-toast.d.ts +34 -0
  230. package/dist/ui/pwa-update-toast.d.ts.map +1 -0
  231. package/dist/ui/pwa-update-toast.js +43 -0
  232. package/dist/ui/select.d.ts +38 -0
  233. package/dist/ui/select.d.ts.map +1 -1
  234. package/dist/ui/select.js +162 -61
  235. package/dist/ui.js +40 -35
  236. package/package.json +93 -4
  237. package/src/shared/styles/app-shell.css +3 -0
  238. package/src/shared/styles/native.css +577 -0
  239. package/dist/node_modules/@capacitor/core/dist/index.js +0 -268
package/README.md CHANGED
@@ -56,6 +56,72 @@ bun run sanity
56
56
 
57
57
  - **cn** - Utility for merging Tailwind classes
58
58
 
59
+ ## shell-native (app shells only)
60
+
61
+ `@burdenoff/fe-libs/shell-native` is the shell-side native runtime: Capacitor
62
+ (iOS/Android), Electron desktop and PWA wiring in one entry point. **App shells
63
+ import it; microfrontends never do** — MFEs talk to the shell through
64
+ `window.__burdenoffNativeBridge` (`@burdenoff/fe-libs/shared/native`).
65
+
66
+ Boot it once in `main.tsx`, before React mounts:
67
+
68
+ ```ts
69
+ import { bootNativeShell, registerDeepLinkNavigator } from '@burdenoff/fe-libs/shell-native';
70
+
71
+ const shell = bootNativeShell({
72
+ product: 'vibecontrols',
73
+ appName: 'VibeControls',
74
+ // Optional plugins are loaded ONLY through these loaders, so web-only shells
75
+ // never bundle them.
76
+ plugins: {
77
+ updater: () => import('@capgo/capacitor-updater'),
78
+ pushNotifications: () => import('@capacitor/push-notifications'),
79
+ },
80
+ push: { enabled: true, onToken: (token) => void registerDevice(token) },
81
+ runtimeHooks: { syncPendingOperations: refetchAll, saveState: flushDrafts },
82
+ });
83
+
84
+ // Inside the router:
85
+ registerDeepLinkNavigator((path) => navigate(path));
86
+ // After the first meaningful paint:
87
+ void shell.markAppReady();
88
+ ```
89
+
90
+ Boot order (each step is individually try/caught — boot never throws): preview →
91
+ OTA `notifyAppReady` → auth-redirect intercept → external URL opener → native
92
+ bridge + platform classes → device info → status-bar theme listener → keyboard →
93
+ Android back button → deep links → network → app-state hooks → push listeners →
94
+ splash safety timer (native) → PWA service worker (web) → desktop shell boot.
95
+
96
+ Contracts the shells and MFEs can rely on:
97
+
98
+ - **Window globals** — `__burdenoffNativeBridge`, `__burdenoffDeviceInfo`,
99
+ `__burdenoffOpenExternal(url)`, `__burdenoffPushToken`,
100
+ `__burdenoffPwaInstallPrompt`.
101
+ - **Body classes** — `platform-ios | platform-android | platform-web`,
102
+ `platform-native`, `platform-preview`, `keyboard-open`.
103
+ `<html>` carries `data-platform` and (in preview) `data-native-preview`.
104
+ - **CSS var** — `--keyboard-height` (0px when closed).
105
+ - **Window events** — `burdenoff:appReady`, `burdenoff:appStateChange`,
106
+ `burdenoff:networkStatusChange`, `burdenoff:keyboardWillShow|DidShow|WillHide|DidHide`,
107
+ `burdenoff:pushToken`, `burdenoff:pwaUpdateReady`, `burdenoff:pwaInstalled`,
108
+ `burdenoff:pwaInstallAvailable`. The shell listens for `burdenoff:statusBarTheme`.
109
+
110
+ ### Native preview flag
111
+
112
+ `?__nativePreview=ios|android|pwa|desktop` renders the installed-app chrome in a
113
+ plain browser (persisted in `sessionStorage`, cleared with `off`). It is
114
+ **presentation only** — real plugin calls stay gated on
115
+ `Capacitor.isPluginAvailable`, and the flag is ignored inside a real native app.
116
+
117
+ ### Build-time config generators
118
+
119
+ `defineCapacitorConfig(nativeConfig)`, `defineWebManifest(nativeConfig)` and
120
+ `renderServiceWorker(nativeConfig, version)` are pure functions (no
121
+ `@capacitor/*` imports) that emit each product's `capacitor.config.ts`,
122
+ `public/manifest.json` and `public/sw.js` from its `native.config.json`
123
+ (`NativeConfig`).
124
+
59
125
  ## Tech Stack
60
126
 
61
127
  - React 19
@@ -1,7 +1,7 @@
1
1
  import { VariantProps } from 'class-variance-authority';
2
2
  import * as React from 'react';
3
3
  declare const buttonVariants: (props?: ({
4
- variant?: "link" | "default" | "secondary" | "destructive" | "outline" | "ghost" | null | undefined;
4
+ variant?: "link" | "default" | "destructive" | "secondary" | "outline" | "ghost" | null | undefined;
5
5
  size?: "default" | "icon" | "sm" | "lg" | null | undefined;
6
6
  } & import('class-variance-authority/types').ClassProp) | undefined) => string;
7
7
  export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
@@ -38,6 +38,20 @@ export interface AppShellLayoutProps {
38
38
  * CSS `env(safe-area-inset-*)`, picking the larger. Default `true`.
39
39
  */
40
40
  safeArea?: boolean;
41
+ /**
42
+ * Bottom bar slot (e.g. `MobileTabBar`), rendered after the content row.
43
+ * The bar positions itself (fixed bottom); the layout only pads the main
44
+ * scroll area by `var(--mobile-tabbar-height)` so content never hides
45
+ * behind it.
46
+ */
47
+ bottomBar?: ReactNode;
48
+ /**
49
+ * Native-compact mode for installed-app phone layouts: marks the shell with
50
+ * `data-native-shell` (native.css takes over safe-areas / paddings) and
51
+ * makes the content area full-bleed (no desktop page gutters). Combine with
52
+ * `bottomBar` + `NativeTopBar`.
53
+ */
54
+ nativeCompact?: boolean;
41
55
  }
42
56
  /**
43
57
  * AppShellLayout Component
@@ -1 +1 @@
1
- {"version":3,"file":"AppShellLayout.d.ts","sourceRoot":"","sources":["../../src/chrome/AppShellLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uBAAuB;IACvB,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,wBAAwB;IACxB,OAAO,CAAC,EAAE,SAAS,CAAC;IAEpB,uBAAuB;IACvB,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,uDAAuD;IACvD,WAAW,CAAC,EAAE,SAAS,CAAC;IAExB,sDAAsD;IACtD,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,mBAAmB;IACnB,QAAQ,EAAE,SAAS,CAAC;IAEpB,gCAAgC;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,gCAAgC;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,iCAAiC;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,oGAAoG;IACpG,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAmFlD,CAAC"}
1
+ {"version":3,"file":"AppShellLayout.d.ts","sourceRoot":"","sources":["../../src/chrome/AppShellLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uBAAuB;IACvB,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,wBAAwB;IACxB,OAAO,CAAC,EAAE,SAAS,CAAC;IAEpB,uBAAuB;IACvB,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,uDAAuD;IACvD,WAAW,CAAC,EAAE,SAAS,CAAC;IAExB,sDAAsD;IACtD,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,mBAAmB;IACnB,QAAQ,EAAE,SAAS,CAAC;IAEpB,gCAAgC;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,gCAAgC;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,iCAAiC;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,oGAAoG;IACpG,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CA0GlD,CAAC"}
@@ -1,15 +1,16 @@
1
1
  import { Fragment as e, jsx as t, jsxs as n } from "react/jsx-runtime";
2
2
  //#region src/chrome/AppShellLayout.tsx
3
- var r = ({ header: r, sidebar: i, footer: a, bottomPanel: o, rightPanel: s, statusBar: c, children: l, headerVisible: u = !0, footerVisible: d = !0, sidebarVisible: f = !0, contentClassName: p, contentPadding: m = "px-6 lg:px-8 py-6", footerInContent: h = !1, safeArea: g = !0 }) => {
4
- let _ = h ? `flex-1 overflow-auto bg-bg-canvas flex flex-col ${m}` : `flex-1 overflow-auto bg-bg-canvas ${m}`;
3
+ var r = ({ header: r, sidebar: i, footer: a, bottomPanel: o, rightPanel: s, statusBar: c, children: l, headerVisible: u = !0, footerVisible: d = !0, sidebarVisible: f = !0, contentClassName: p, contentPadding: m = "px-6 lg:px-8 py-6", footerInContent: h = !1, safeArea: g = !0, bottomBar: _, nativeCompact: v = !1 }) => {
4
+ let y = v ? "p-0" : m, b = h ? `flex-1 overflow-auto bg-bg-canvas flex flex-col ${y}` : `flex-1 overflow-auto bg-bg-canvas ${y}`, x = p || b, S = g ? {
5
+ paddingTop: "max(var(--safe-top, 0px), env(safe-area-inset-top, 0px))",
6
+ paddingBottom: "max(var(--safe-bottom, 0px), env(safe-area-inset-bottom, 0px))",
7
+ paddingLeft: "max(var(--safe-left, 0px), env(safe-area-inset-left, 0px))",
8
+ paddingRight: "max(var(--safe-right, 0px), env(safe-area-inset-right, 0px))"
9
+ } : {}, C = _ ? { paddingBottom: "var(--mobile-tabbar-height, 0px)" } : void 0;
5
10
  return /* @__PURE__ */ n("div", {
6
11
  className: "flex flex-col h-screen bg-bg-canvas",
7
- style: g ? {
8
- paddingTop: "max(var(--safe-top, 0px), env(safe-area-inset-top, 0px))",
9
- paddingBottom: "max(var(--safe-bottom, 0px), env(safe-area-inset-bottom, 0px))",
10
- paddingLeft: "max(var(--safe-left, 0px), env(safe-area-inset-left, 0px))",
11
- paddingRight: "max(var(--safe-right, 0px), env(safe-area-inset-right, 0px))"
12
- } : {},
12
+ style: S,
13
+ "data-native-shell": v ? "" : void 0,
13
14
  children: [
14
15
  u && r,
15
16
  /* @__PURE__ */ n("div", {
@@ -19,7 +20,8 @@ var r = ({ header: r, sidebar: i, footer: a, bottomPanel: o, rightPanel: s, stat
19
20
  children: [/* @__PURE__ */ n("div", {
20
21
  className: "flex flex-col flex-1 overflow-hidden",
21
22
  children: [/* @__PURE__ */ t("main", {
22
- className: `scrollbar-slim ${p || _}`,
23
+ className: `scrollbar-slim ${x}`,
24
+ style: C,
23
25
  "data-shell-scroll-container": !0,
24
26
  children: h ? /* @__PURE__ */ n(e, { children: [/* @__PURE__ */ t("div", {
25
27
  className: d ? "flex-1" : "flex-1 min-h-0",
@@ -30,7 +32,8 @@ var r = ({ header: r, sidebar: i, footer: a, bottomPanel: o, rightPanel: s, stat
30
32
  })]
31
33
  }),
32
34
  !h && d && a,
33
- c
35
+ c,
36
+ _
34
37
  ]
35
38
  });
36
39
  };
@@ -16,6 +16,11 @@ export interface DynamicFooterProps {
16
16
  legalPageOrder?: string[];
17
17
  /** Skip API fetches and rely on built-in footer defaults */
18
18
  deferRemoteData?: boolean;
19
+ /**
20
+ * Hide the footer entirely inside installed apps (Capacitor native,
21
+ * Electron, standalone PWA). Forwarded to `Footer`. Default `true`.
22
+ */
23
+ hideOnInstalledApp?: boolean;
19
24
  }
20
- export declare function DynamicFooter({ productSlug, productName, tagline, version, columns: customColumns, socialLinks: customSocialLinks, legalPageOrder, deferRemoteData, }: DynamicFooterProps): import("react/jsx-runtime").JSX.Element;
25
+ export declare function DynamicFooter({ productSlug, productName, tagline, version, columns: customColumns, socialLinks: customSocialLinks, legalPageOrder, deferRemoteData, hideOnInstalledApp, }: DynamicFooterProps): import("react/jsx-runtime").JSX.Element;
21
26
  //# sourceMappingURL=DynamicFooter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DynamicFooter.d.ts","sourceRoot":"","sources":["../../src/chrome/DynamicFooter.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA4EzD,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,kDAAkD;IAClD,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,4DAA4D;IAC5D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAAC,EAC5B,WAAW,EACX,WAAW,EACX,OAAO,EACP,OAAkB,EAClB,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,iBAAiB,EAC9B,cAAiC,EACjC,eAAuB,GACxB,EAAE,kBAAkB,2CAkKpB"}
1
+ {"version":3,"file":"DynamicFooter.d.ts","sourceRoot":"","sources":["../../src/chrome/DynamicFooter.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAqFzD,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,kDAAkD;IAClD,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,4DAA4D;IAC5D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,EAC5B,WAAW,EACX,WAAW,EACX,OAAO,EACP,OAAkB,EAClB,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,iBAAiB,EAC9B,cAAiC,EACjC,eAAuB,EACvB,kBAAyB,GAC1B,EAAE,kBAAkB,2CAmLpB"}
@@ -60,12 +60,12 @@ var y = _`
60
60
  function w(e) {
61
61
  return e.trim().replace(/[^A-Za-z0-9 ]/g, "").split(/\s+/).map((e, t) => t === 0 ? e.toLowerCase() : e.charAt(0).toUpperCase() + e.slice(1).toLowerCase()).join("");
62
62
  }
63
- function T({ productSlug: u, productName: f, tagline: p, version: m = "v1.0.0", columns: h, socialLinks: _, legalPageOrder: T = C, deferRemoteData: E = !1 }) {
64
- let { workspaceId: D, projectId: O } = t(), k = e("global"), { t: A } = n(), [j, M] = l(null), [N, P] = l(null);
63
+ function T({ productSlug: u, productName: f, tagline: p, version: m = "v1.0.0", columns: h, socialLinks: _, legalPageOrder: T = C, deferRemoteData: E = !1, hideOnInstalledApp: D = !0 }) {
64
+ let { workspaceId: O, projectId: k } = t(), A = e("global"), { t: j } = n(), [M, N] = l(null), [P, F] = l(null);
65
65
  s(() => {
66
- if (!k || E) return;
66
+ if (!A || E) return;
67
67
  let e = !1;
68
- return k.query({
68
+ return A.query({
69
69
  query: y,
70
70
  variables: {
71
71
  filter: { isPublished: !0 },
@@ -80,18 +80,18 @@ function T({ productSlug: u, productName: f, tagline: p, version: m = "v1.0.0",
80
80
  label: e.title,
81
81
  href: `/legal/${x[e.slug] || e.slug}`
82
82
  }));
83
- i.length > 0 && M(i);
83
+ i.length > 0 && N(i);
84
84
  }).catch(() => {}), () => {
85
85
  e = !0;
86
86
  };
87
87
  }, [
88
88
  E,
89
- k,
89
+ A,
90
90
  T
91
91
  ]), s(() => {
92
- if (!k || _ || E) return;
92
+ if (!A || _ || E) return;
93
93
  let e = !1;
94
- return k.query({
94
+ return A.query({
95
95
  query: b,
96
96
  variables: { slug: u },
97
97
  fetchPolicy: "cache-first"
@@ -105,22 +105,22 @@ function T({ productSlug: u, productName: f, tagline: p, version: m = "v1.0.0",
105
105
  href: t,
106
106
  icon: S[e.toLowerCase()] || /* @__PURE__ */ g(d, { className: "size-5" })
107
107
  }));
108
- r.length > 0 && P(r);
108
+ r.length > 0 && F(r);
109
109
  }).catch(() => {}), () => {
110
110
  e = !0;
111
111
  };
112
112
  }, [
113
113
  _,
114
114
  E,
115
- k,
115
+ A,
116
116
  u
117
117
  ]);
118
- let F = c(() => {
119
- let e = h ?? r, t = j ? e.map((e) => e.title === "Legal" ? {
118
+ let I = c(() => {
119
+ let e = h ?? r, t = M ? e.map((e) => e.title === "Legal" ? {
120
120
  ...e,
121
- links: j
121
+ links: M
122
122
  } : e) : e, n = (e, t) => {
123
- let n = A(e);
123
+ let n = j(e);
124
124
  return n === e ? t : n;
125
125
  };
126
126
  return t.map((e) => ({
@@ -132,20 +132,21 @@ function T({ productSlug: u, productName: f, tagline: p, version: m = "v1.0.0",
132
132
  })
133
133
  }));
134
134
  }, [
135
- j,
135
+ M,
136
136
  h,
137
- A
137
+ j
138
138
  ]);
139
139
  return /* @__PURE__ */ g(a, {
140
140
  logo: /* @__PURE__ */ g(o, { size: "sidenav" }),
141
141
  productName: f,
142
142
  tagline: p,
143
- columns: F,
144
- socialLinks: _ ?? N ?? i,
143
+ columns: I,
144
+ socialLinks: _ ?? P ?? i,
145
145
  version: m,
146
+ hideOnInstalledApp: D,
146
147
  context: {
147
- workspace: D ?? void 0,
148
- project: O ?? void 0
148
+ workspace: O ?? void 0,
149
+ project: k ?? void 0
149
150
  },
150
151
  renderLink: ({ href: e, external: t, children: n, className: r }) => t ? /* @__PURE__ */ g("a", {
151
152
  href: e,
@@ -89,6 +89,12 @@ export interface FooterProps {
89
89
  children: ReactNode;
90
90
  className?: string;
91
91
  }) => ReactNode;
92
+ /**
93
+ * Hide the footer entirely inside installed apps (Capacitor native,
94
+ * Electron, standalone PWA) — footers are web chrome, replaced by the
95
+ * native tab bar. Default `true`.
96
+ */
97
+ hideOnInstalledApp?: boolean;
92
98
  }
93
99
  /**
94
100
  * Default footer columns for Burdenoff products
@@ -1 +1 @@
1
- {"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../src/chrome/Footer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAK3C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAYjE;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU;IACV,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,yBAAyB;IACzB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACnC,CAAC;IACF,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,QAAQ,EAAE,SAAS,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,KAAK,SAAS,CAAC;CACjB;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,YAAY,EAwDhD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,UAAU,EAmB5C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,CAwJlC,CAAC"}
1
+ {"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../src/chrome/Footer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAM3C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAYjE;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU;IACV,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,yBAAyB;IACzB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACnC,CAAC;IACF,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,QAAQ,EAAE,SAAS,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,KAAK,SAAS,CAAC;IAChB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,YAAY,EAwDhD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,UAAU,EAmB5C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,CAwKlC,CAAC"}
@@ -1,9 +1,10 @@
1
- import { useShellLabel as e } from "../shared/providers/shell/useShellLabel.js";
2
- import { PluginFooterStrip as t } from "./PluginFooterStrip.js";
3
- import { ExternalLink as n, Github as r, MessageCircle as i, Twitter as a } from "lucide-react";
4
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
1
+ import { isInstalledApp as e } from "../shared/native/platform.js";
2
+ import { useShellLabel as t } from "../shared/providers/shell/useShellLabel.js";
3
+ import { PluginFooterStrip as n } from "./PluginFooterStrip.js";
4
+ import { ExternalLink as r, Github as i, MessageCircle as a, Twitter as o } from "lucide-react";
5
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
5
6
  //#region src/chrome/Footer.tsx
6
- function c(e) {
7
+ function l(e) {
7
8
  return {
8
9
  0: "lg:grid-cols-2",
9
10
  1: "lg:grid-cols-3",
@@ -14,7 +15,7 @@ function c(e) {
14
15
  6: "lg:grid-cols-8"
15
16
  }[e] ?? "lg:grid-cols-6";
16
17
  }
17
- var l = [
18
+ var u = [
18
19
  {
19
20
  title: "Products",
20
21
  links: [
@@ -98,60 +99,60 @@ var l = [
98
99
  }
99
100
  ]
100
101
  }
101
- ], u = [
102
+ ], d = [
102
103
  {
103
104
  id: "twitter",
104
105
  label: "Twitter",
105
106
  href: "https://twitter.com/burdenoff",
106
- icon: /* @__PURE__ */ o(a, { className: "size-5" })
107
+ icon: /* @__PURE__ */ s(o, { className: "size-5" })
107
108
  },
108
109
  {
109
110
  id: "github",
110
111
  label: "GitHub",
111
112
  href: "https://github.com/algoshred",
112
- icon: /* @__PURE__ */ o(r, { className: "size-5" })
113
+ icon: /* @__PURE__ */ s(i, { className: "size-5" })
113
114
  },
114
115
  {
115
116
  id: "discord",
116
117
  label: "Discord",
117
118
  href: "https://discord.gg/burdenoff",
118
- icon: /* @__PURE__ */ o(i, { className: "size-5" })
119
+ icon: /* @__PURE__ */ s(a, { className: "size-5" })
119
120
  }
120
- ], d = ({ logo: r, productName: i = "Burdenoff Workspaces", tagline: a = "Enterprise collaboration made simple", columns: d = l, socialLinks: f = u, copyright: p, version: m, buildInfo: h, context: g, children: _, renderLink: v }) => {
121
- let y = e(), b = (/* @__PURE__ */ new Date()).getFullYear(), x = p ?? y("footer.copyright", `${b} Burdenoff. All rights reserved.`).replace("{year}", String(b)), S = v ?? (({ href: e, external: t, children: n, className: r }) => /* @__PURE__ */ o("a", {
121
+ ], f = ({ logo: i, productName: a = "Burdenoff Workspaces", tagline: o = "Enterprise collaboration made simple", columns: f = u, socialLinks: p = d, copyright: m, version: h, buildInfo: g, context: _, children: v, renderLink: y, hideOnInstalledApp: b = !0 }) => {
122
+ let x = t(), S = (/* @__PURE__ */ new Date()).getFullYear(), C = m ?? x("footer.copyright", `${S} Burdenoff. All rights reserved.`).replace("{year}", String(S)), w = y ?? (({ href: e, external: t, children: n, className: r }) => /* @__PURE__ */ s("a", {
122
123
  href: e,
123
124
  target: t ? "_blank" : void 0,
124
125
  rel: t ? "noopener noreferrer" : void 0,
125
126
  className: r,
126
127
  children: n
127
128
  }));
128
- return /* @__PURE__ */ s("footer", {
129
+ return b && e() ? null : /* @__PURE__ */ c("footer", {
129
130
  className: "bg-bg-elevated border-t border-border-subtle",
130
131
  children: [
131
- /* @__PURE__ */ o("div", {
132
+ /* @__PURE__ */ s("div", {
132
133
  className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12",
133
- children: /* @__PURE__ */ s("div", {
134
- className: `grid grid-cols-2 ${c(d.length)} gap-8`,
135
- children: [/* @__PURE__ */ s("div", {
134
+ children: /* @__PURE__ */ c("div", {
135
+ className: `grid grid-cols-2 ${l(f.length)} gap-8`,
136
+ children: [/* @__PURE__ */ c("div", {
136
137
  className: "col-span-2",
137
138
  children: [
138
- /* @__PURE__ */ s("div", {
139
+ /* @__PURE__ */ c("div", {
139
140
  className: "flex items-center gap-3 mb-4",
140
- children: [r ?? /* @__PURE__ */ o("div", {
141
+ children: [i ?? /* @__PURE__ */ s("div", {
141
142
  className: "size-8 rounded-md bg-action-primary-bg flex items-center justify-center text-action-primary-text font-bold text-sm",
142
143
  children: "B"
143
- }), /* @__PURE__ */ o("span", {
144
+ }), /* @__PURE__ */ s("span", {
144
145
  className: "text-lg font-semibold text-text-primary",
145
- children: i
146
+ children: a
146
147
  })]
147
148
  }),
148
- /* @__PURE__ */ o("p", {
149
+ /* @__PURE__ */ s("p", {
149
150
  className: "text-text-secondary text-sm mb-6 max-w-xs",
150
- children: a
151
+ children: o
151
152
  }),
152
- f.length > 0 && /* @__PURE__ */ o("div", {
153
+ p.length > 0 && /* @__PURE__ */ s("div", {
153
154
  className: "flex items-center gap-4",
154
- children: f.map((e) => /* @__PURE__ */ o("a", {
155
+ children: p.map((e) => /* @__PURE__ */ s("a", {
155
156
  href: e.href,
156
157
  target: "_blank",
157
158
  rel: "noopener noreferrer",
@@ -161,67 +162,67 @@ var l = [
161
162
  }, e.id))
162
163
  })
163
164
  ]
164
- }), d.map((e) => /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h3", {
165
+ }), f.map((e) => /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("h3", {
165
166
  className: "text-sm font-semibold text-text-primary mb-4",
166
167
  children: e.title
167
- }), /* @__PURE__ */ o("ul", {
168
+ }), /* @__PURE__ */ s("ul", {
168
169
  className: "space-y-3",
169
- children: e.links.map((e) => /* @__PURE__ */ o("li", { children: /* @__PURE__ */ s(S, {
170
+ children: e.links.map((e) => /* @__PURE__ */ s("li", { children: /* @__PURE__ */ c(w, {
170
171
  href: e.href,
171
172
  external: e.external,
172
173
  className: "text-sm text-text-secondary hover:text-text-primary transition-colors inline-flex items-center gap-1",
173
174
  children: [
174
175
  e.icon,
175
176
  e.label,
176
- e.external && /* @__PURE__ */ o(n, { className: "size-3" })
177
+ e.external && /* @__PURE__ */ s(r, { className: "size-3" })
177
178
  ]
178
179
  }) }, e.id))
179
180
  })] }, e.title))]
180
181
  })
181
182
  }),
182
- /* @__PURE__ */ o(t, {}),
183
- /* @__PURE__ */ o("div", {
183
+ /* @__PURE__ */ s(n, {}),
184
+ /* @__PURE__ */ s("div", {
184
185
  className: "border-t border-border-subtle",
185
- children: /* @__PURE__ */ o("div", {
186
+ children: /* @__PURE__ */ s("div", {
186
187
  className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4",
187
- children: /* @__PURE__ */ s("div", {
188
+ children: /* @__PURE__ */ c("div", {
188
189
  className: "flex flex-col sm:flex-row justify-between items-center gap-4 text-xs text-text-muted",
189
190
  children: [
190
- /* @__PURE__ */ o("div", {
191
+ /* @__PURE__ */ s("div", {
191
192
  className: "flex items-center gap-2",
192
- children: /* @__PURE__ */ s("span", { children: ["© ", x] })
193
+ children: /* @__PURE__ */ c("span", { children: ["© ", C] })
193
194
  }),
194
- g && Object.values(g).some(Boolean) && /* @__PURE__ */ o("div", {
195
+ _ && Object.values(_).some(Boolean) && /* @__PURE__ */ s("div", {
195
196
  className: "flex items-center gap-3",
196
- children: Object.entries(g).map(([e, t]) => t && /* @__PURE__ */ s("div", {
197
+ children: Object.entries(_).map(([e, t]) => t && /* @__PURE__ */ c("div", {
197
198
  className: "flex items-center gap-1",
198
- children: [/* @__PURE__ */ s("span", {
199
+ children: [/* @__PURE__ */ c("span", {
199
200
  className: "capitalize",
200
201
  children: [e, ":"]
201
- }), /* @__PURE__ */ o("span", {
202
+ }), /* @__PURE__ */ s("span", {
202
203
  className: "text-text-secondary font-medium",
203
204
  children: t
204
205
  })]
205
206
  }, e))
206
207
  }),
207
- /* @__PURE__ */ s("div", {
208
+ /* @__PURE__ */ c("div", {
208
209
  className: "flex items-center gap-3",
209
210
  children: [
210
- m && /* @__PURE__ */ o("span", { children: m }),
211
- m && h && /* @__PURE__ */ o("span", {
211
+ h && /* @__PURE__ */ s("span", { children: h }),
212
+ h && g && /* @__PURE__ */ s("span", {
212
213
  className: "text-border-subtle",
213
214
  children: "|"
214
215
  }),
215
- h && /* @__PURE__ */ s("span", { children: ["Build ", h] })
216
+ g && /* @__PURE__ */ c("span", { children: ["Build ", g] })
216
217
  ]
217
218
  })
218
219
  ]
219
220
  })
220
221
  })
221
222
  }),
222
- _
223
+ v
223
224
  ]
224
225
  });
225
226
  };
226
227
  //#endregion
227
- export { l as DEFAULT_FOOTER_COLUMNS, u as DEFAULT_SOCIAL_LINKS, d as Footer };
228
+ export { u as DEFAULT_FOOTER_COLUMNS, d as DEFAULT_SOCIAL_LINKS, f as Footer };
@@ -12,7 +12,7 @@ export interface FooterItem {
12
12
  /** Click handler */
13
13
  onClick?: () => void;
14
14
  /** Item type */
15
- type?: 'status' | 'action' | 'info';
15
+ type?: "status" | "action" | "info";
16
16
  /** Badge or indicator text */
17
17
  badge?: string;
18
18
  }
@@ -45,6 +45,11 @@ export interface FooterBarProps {
45
45
  version?: string;
46
46
  /** Additional content to render in footer */
47
47
  children?: ReactNode;
48
+ /**
49
+ * Hide the footer entirely inside installed apps (Capacitor native,
50
+ * Electron, standalone PWA) — footers are web chrome. Default `true`.
51
+ */
52
+ hideOnInstalledApp?: boolean;
48
53
  }
49
54
  /**
50
55
  * FooterBar Component
@@ -1 +1 @@
1
- {"version":3,"file":"FooterBar.d.ts","sourceRoot":"","sources":["../../src/chrome/FooterBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IAEX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IAEd,mCAAmC;IACnC,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB,oBAAoB;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,gBAAgB;IAChB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAEpC,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,QAAQ,EAAE,cAAc,CAAC;IAEzB,qDAAqD;IACrD,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACnC,CAAC;IAEF,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CA4ExC,CAAC"}
1
+ {"version":3,"file":"FooterBar.d.ts","sourceRoot":"","sources":["../../src/chrome/FooterBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG3C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IAEX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IAEd,mCAAmC;IACnC,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB,oBAAoB;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,gBAAgB;IAChB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAEpC,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,QAAQ,EAAE,cAAc,CAAC;IAEzB,qDAAqD;IACrD,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACnC,CAAC;IAEF,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CAiGxC,CAAC"}
@@ -1,7 +1,9 @@
1
- import { Fragment as e, jsx as t, jsxs as n } from "react/jsx-runtime";
1
+ import { isInstalledApp as e } from "../shared/native/platform.js";
2
+ import { Fragment as t, jsx as n, jsxs as r } from "react/jsx-runtime";
2
3
  //#region src/chrome/FooterBar.tsx
3
- var r = ({ sections: r, context: i, version: a, children: o }) => {
4
- let s = (e) => /* @__PURE__ */ n("button", {
4
+ var i = ({ sections: i, context: a, version: o, children: s, hideOnInstalledApp: c = !0 }) => {
5
+ if (c && e()) return null;
6
+ let l = (e) => /* @__PURE__ */ r("button", {
5
7
  onClick: e.onClick,
6
8
  className: `
7
9
  flex items-center gap-icon-gap px-2 py-1 rounded-button
@@ -10,14 +12,14 @@ var r = ({ sections: r, context: i, version: a, children: o }) => {
10
12
  `,
11
13
  disabled: !e.onClick,
12
14
  children: [
13
- e.icon && /* @__PURE__ */ t("div", {
15
+ e.icon && /* @__PURE__ */ n("div", {
14
16
  className: "w-icon-sm h-icon-sm",
15
- children: typeof e.icon == "string" ? /* @__PURE__ */ t("svg", {
17
+ children: typeof e.icon == "string" ? /* @__PURE__ */ n("svg", {
16
18
  className: "w-full h-full",
17
19
  fill: "none",
18
20
  stroke: "currentColor",
19
21
  viewBox: "0 0 24 24",
20
- children: /* @__PURE__ */ t("path", {
22
+ children: /* @__PURE__ */ n("path", {
21
23
  strokeLinecap: "round",
22
24
  strokeLinejoin: "round",
23
25
  strokeWidth: 2,
@@ -25,60 +27,60 @@ var r = ({ sections: r, context: i, version: a, children: o }) => {
25
27
  })
26
28
  }) : e.icon
27
29
  }),
28
- /* @__PURE__ */ t("span", { children: e.label }),
29
- e.badge && /* @__PURE__ */ t("span", {
30
+ /* @__PURE__ */ n("span", { children: e.label }),
31
+ e.badge && /* @__PURE__ */ n("span", {
30
32
  className: "text-xs bg-status-success-bg-subtle text-status-success-text px-1.5 py-0.5 rounded",
31
33
  children: e.badge
32
34
  })
33
35
  ]
34
36
  }, e.id);
35
- return /* @__PURE__ */ n("footer", {
37
+ return /* @__PURE__ */ r("footer", {
36
38
  className: "h-8 bg-[var(--color-surface-glass)] backdrop-blur-[var(--blur-glass)] border-t border-[var(--color-border-glass)] flex items-center px-card-padding text-body-sm text-text-secondary",
37
39
  children: [
38
- /* @__PURE__ */ n("div", {
40
+ /* @__PURE__ */ r("div", {
39
41
  className: "flex items-center gap-form-gap",
40
- children: [i && Object.entries(i).map(([e, r]) => r && /* @__PURE__ */ n("div", {
42
+ children: [a && Object.entries(a).map(([e, t]) => t && /* @__PURE__ */ r("div", {
41
43
  className: "flex items-center gap-icon-gap",
42
44
  children: [
43
- e !== Object.keys(i)[0] && /* @__PURE__ */ t("span", {
45
+ e !== Object.keys(a)[0] && /* @__PURE__ */ n("span", {
44
46
  className: "text-border-subtle",
45
47
  children: "|"
46
48
  }),
47
- /* @__PURE__ */ n("span", {
49
+ /* @__PURE__ */ r("span", {
48
50
  className: "text-text-muted capitalize",
49
51
  children: [e, ":"]
50
52
  }),
51
- /* @__PURE__ */ t("span", {
53
+ /* @__PURE__ */ n("span", {
52
54
  className: "text-text-primary font-medium",
53
- children: r
55
+ children: t
54
56
  })
55
57
  ]
56
- }, e)), r.left.length > 0 && /* @__PURE__ */ n(e, { children: [/* @__PURE__ */ t("span", {
58
+ }, e)), i.left.length > 0 && /* @__PURE__ */ r(t, { children: [/* @__PURE__ */ n("span", {
57
59
  className: "text-border-subtle",
58
60
  children: "|"
59
- }), r.left.map(s)] })]
61
+ }), i.left.map(l)] })]
60
62
  }),
61
- /* @__PURE__ */ t("div", {
63
+ /* @__PURE__ */ n("div", {
62
64
  className: "flex-1 flex items-center justify-center gap-form-gap",
63
- children: r.center.map(s)
65
+ children: i.center.map(l)
64
66
  }),
65
- /* @__PURE__ */ n("div", {
67
+ /* @__PURE__ */ r("div", {
66
68
  className: "flex items-center gap-form-gap",
67
69
  children: [
68
- r.right.map(s),
69
- r.right.length > 0 && a && /* @__PURE__ */ t("span", {
70
+ i.right.map(l),
71
+ i.right.length > 0 && o && /* @__PURE__ */ n("span", {
70
72
  className: "text-border-subtle",
71
73
  children: "|"
72
74
  }),
73
- a && /* @__PURE__ */ t("span", {
75
+ o && /* @__PURE__ */ n("span", {
74
76
  className: "text-text-muted text-xs",
75
- children: a
77
+ children: o
76
78
  })
77
79
  ]
78
80
  }),
79
- o
81
+ s
80
82
  ]
81
83
  });
82
84
  };
83
85
  //#endregion
84
- export { r as FooterBar };
86
+ export { i as FooterBar };