@multiplatform.one/components 7.79.0 → 7.80.0

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 (268) hide show
  1. package/dist/cjs/appShell/AppShell.cjs +432 -0
  2. package/dist/cjs/appShell/AppShell.native.js +499 -0
  3. package/dist/cjs/appShell/AppShell.native.js.map +1 -0
  4. package/dist/cjs/appShell/index.cjs +1 -0
  5. package/dist/cjs/appShell/index.native.js +1 -0
  6. package/dist/cjs/appShell/index.native.js.map +1 -1
  7. package/dist/cjs/layouts/page.cjs +3 -0
  8. package/dist/cjs/layouts/page.native.js +3 -0
  9. package/dist/cjs/layouts/page.native.js.map +1 -1
  10. package/dist/cjs/layouts/screenScroll.cjs +55 -0
  11. package/dist/cjs/layouts/screenScroll.native.js +59 -0
  12. package/dist/cjs/layouts/screenScroll.native.js.map +1 -1
  13. package/dist/cjs/layouts/sidebar.cjs +46 -9
  14. package/dist/cjs/layouts/sidebar.native.js +49 -9
  15. package/dist/cjs/layouts/sidebar.native.js.map +1 -1
  16. package/dist/esm/Accordion/index.native.js.map +1 -1
  17. package/dist/esm/AnimateHeight/index.native.js.map +1 -1
  18. package/dist/esm/Avatar/getInitials.native.js.map +1 -1
  19. package/dist/esm/Avatar/index.native.js.map +1 -1
  20. package/dist/esm/Badge/index.native.js.map +1 -1
  21. package/dist/esm/Button.native.js.map +1 -1
  22. package/dist/esm/Carousel/index.native.js.map +1 -1
  23. package/dist/esm/Chip/index.native.js.map +1 -1
  24. package/dist/esm/Collapsible.native.js.map +1 -1
  25. package/dist/esm/ContextMenu/index.native.js.map +1 -1
  26. package/dist/esm/CopyField/CopyMenuButton.native.js.map +1 -1
  27. package/dist/esm/CopyField/index.native.js.map +1 -1
  28. package/dist/esm/Dialog.native.js.map +1 -1
  29. package/dist/esm/Diff/diff.native.js.map +1 -1
  30. package/dist/esm/Diff/index.native.js.map +1 -1
  31. package/dist/esm/DotIndicator/index.native.js.map +1 -1
  32. package/dist/esm/DropdownMenu/index.native.js.map +1 -1
  33. package/dist/esm/DropdownMenu/menuSettle.native.js.map +1 -1
  34. package/dist/esm/ElapsedProgress/index.native.js.map +1 -1
  35. package/dist/esm/ErrorBoundary/index.native.js.map +1 -1
  36. package/dist/esm/Heading.native.js.map +1 -1
  37. package/dist/esm/Kbd/index.native.js.map +1 -1
  38. package/dist/esm/Kbd/keys.native.js.map +1 -1
  39. package/dist/esm/Lightbox/MediaControl.native.js.map +1 -1
  40. package/dist/esm/Lightbox/index.gnome.native.js.map +1 -1
  41. package/dist/esm/Lightbox/shared.native.js.map +1 -1
  42. package/dist/esm/Lightbox/useLightbox.native.js.map +1 -1
  43. package/dist/esm/MachineLiteral/index.native.js.map +1 -1
  44. package/dist/esm/Material/index.native.js.map +1 -1
  45. package/dist/esm/Meter/index.native.js.map +1 -1
  46. package/dist/esm/Meter/meter.native.js.map +1 -1
  47. package/dist/esm/OverflowRow/index.native.js.map +1 -1
  48. package/dist/esm/Pagination.native.js.map +1 -1
  49. package/dist/esm/Popover.native.js.map +1 -1
  50. package/dist/esm/ProgressSteps/index.native.js.map +1 -1
  51. package/dist/esm/Quote/index.native.js.map +1 -1
  52. package/dist/esm/SchemeToggle/index.native.js.map +1 -1
  53. package/dist/esm/ScrollView/revealFocusedField.native.js.map +1 -1
  54. package/dist/esm/Separator/index.native.js.map +1 -1
  55. package/dist/esm/Sheet.native.js.map +1 -1
  56. package/dist/esm/SheetModal/SheetHeader.native.js.map +1 -1
  57. package/dist/esm/SheetModal/SheetNavigation.native.js.map +1 -1
  58. package/dist/esm/SheetModal/detents.native.js.map +1 -1
  59. package/dist/esm/SheetModal/useSheetFrameFocus.native.js.map +1 -1
  60. package/dist/esm/Skeleton/index.native.js.map +1 -1
  61. package/dist/esm/SkipLink/index.native.js.map +1 -1
  62. package/dist/esm/SortableList/SortableHandle.native.js.map +1 -1
  63. package/dist/esm/SortableList/index.native.js.map +1 -1
  64. package/dist/esm/SortableList/useSortableRows.native.js.map +1 -1
  65. package/dist/esm/SortableList/useUserOrder.native.js.map +1 -1
  66. package/dist/esm/Tabs/index.native.js.map +1 -1
  67. package/dist/esm/Text.native.js.map +1 -1
  68. package/dist/esm/ThemePresetPicker/index.native.js.map +1 -1
  69. package/dist/esm/Toast/index.native.js.map +1 -1
  70. package/dist/esm/Toast/store.native.js.map +1 -1
  71. package/dist/esm/Tooltip/nativePress.native.js.map +1 -1
  72. package/dist/esm/Tooltip/tooltipShared.native.js.map +1 -1
  73. package/dist/esm/TreeSelect/index.native.js.map +1 -1
  74. package/dist/esm/TreeSelect/treeSelectModel.native.js.map +1 -1
  75. package/dist/esm/Video/PlayerChrome.native.js.map +1 -1
  76. package/dist/esm/Video/VideoFrame.native.js.map +1 -1
  77. package/dist/esm/Video/types.native.js.map +1 -1
  78. package/dist/esm/Wheel/index.native.js.map +1 -1
  79. package/dist/esm/Wizard/index.native.js.map +1 -1
  80. package/dist/esm/actions/ActionBar.native.js.map +1 -1
  81. package/dist/esm/actions/DangerSection.native.js.map +1 -1
  82. package/dist/esm/actions/DestructiveAction.native.js.map +1 -1
  83. package/dist/esm/actions/HeaderActions.native.js.map +1 -1
  84. package/dist/esm/actions/StandardAction.native.js.map +1 -1
  85. package/dist/esm/actions/devWarn.native.js.map +1 -1
  86. package/dist/esm/actions/index.native.js.map +1 -1
  87. package/dist/esm/actions/severity.native.js.map +1 -1
  88. package/dist/esm/appShell/AppShell.mjs +406 -0
  89. package/dist/esm/appShell/AppShell.mjs.map +1 -0
  90. package/dist/esm/appShell/AppShell.native.js +470 -0
  91. package/dist/esm/appShell/AppShell.native.js.map +1 -0
  92. package/dist/esm/appShell/Dock.native.js.map +1 -1
  93. package/dist/esm/appShell/MpoTabHost.native.js.map +1 -1
  94. package/dist/esm/appShell/ScopeMenu.native.js.map +1 -1
  95. package/dist/esm/appShell/SettingsSplit.native.js.map +1 -1
  96. package/dist/esm/appShell/Springboard.native.js.map +1 -1
  97. package/dist/esm/appShell/SystemBar.native.js.map +1 -1
  98. package/dist/esm/appShell/TabBar.native.js.map +1 -1
  99. package/dist/esm/appShell/appTile.native.js.map +1 -1
  100. package/dist/esm/appShell/bottomChrome.native.js.map +1 -1
  101. package/dist/esm/appShell/index.mjs +1 -0
  102. package/dist/esm/appShell/index.mjs.map +1 -1
  103. package/dist/esm/appShell/index.native.js +1 -0
  104. package/dist/esm/appShell/index.native.js.map +1 -1
  105. package/dist/esm/charts/Axis.native.js.map +1 -1
  106. package/dist/esm/charts/BarChart.native.js.map +1 -1
  107. package/dist/esm/charts/ChartDataView.native.js.map +1 -1
  108. package/dist/esm/charts/ChartSurface.native.js.map +1 -1
  109. package/dist/esm/charts/LineChart.native.js.map +1 -1
  110. package/dist/esm/charts/PieChart.native.js.map +1 -1
  111. package/dist/esm/charts/Sparkline.native.js.map +1 -1
  112. package/dist/esm/charts/accessibility.native.js.map +1 -1
  113. package/dist/esm/charts/chartHeight.native.js.map +1 -1
  114. package/dist/esm/charts/composeChart.native.js.map +1 -1
  115. package/dist/esm/charts/index.native.js.map +1 -1
  116. package/dist/esm/charts/math.native.js.map +1 -1
  117. package/dist/esm/charts/series.native.js.map +1 -1
  118. package/dist/esm/charts/svg.native.js.map +1 -1
  119. package/dist/esm/charts/types.native.js.map +1 -1
  120. package/dist/esm/charts/useChartTheme.native.js.map +1 -1
  121. package/dist/esm/code/Code/index.native.js.map +1 -1
  122. package/dist/esm/code/CodeBlock/index.native.js.map +1 -1
  123. package/dist/esm/code/HighlightedCode/index.native.js.map +1 -1
  124. package/dist/esm/code/Highlighter/houseSyntaxTheme.native.js.map +1 -1
  125. package/dist/esm/code/Highlighter/index.native.js.map +1 -1
  126. package/dist/esm/code/Highlighter/namedGroupMatchAll.native.js.map +1 -1
  127. package/dist/esm/code/Pre/index.native.js.map +1 -1
  128. package/dist/esm/code/index.native.js.map +1 -1
  129. package/dist/esm/componentColors.native.js.map +1 -1
  130. package/dist/esm/feedback/ConfirmDialog.native.js.map +1 -1
  131. package/dist/esm/feedback/NotifyHost.native.js.map +1 -1
  132. package/dist/esm/feedback/copy.native.js.map +1 -1
  133. package/dist/esm/feedback/index.native.js.map +1 -1
  134. package/dist/esm/feedback/notify.native.js.map +1 -1
  135. package/dist/esm/feedback/route.native.js.map +1 -1
  136. package/dist/esm/feedback/store.native.js.map +1 -1
  137. package/dist/esm/formLayouts/FormLayouts.native.js.map +1 -1
  138. package/dist/esm/formLayouts/PreferencePanel.native.js.map +1 -1
  139. package/dist/esm/formLayouts/index.native.js.map +1 -1
  140. package/dist/esm/hooks/index.native.js.map +1 -1
  141. package/dist/esm/hooks/useClipboard.native.js.map +1 -1
  142. package/dist/esm/hooks/useDocumentTitle.native.js.map +1 -1
  143. package/dist/esm/hooks/useHoldCue.native.js.map +1 -1
  144. package/dist/esm/icons/CheckRegular.native.js.map +1 -1
  145. package/dist/esm/icons/MinusRegular.native.js.map +1 -1
  146. package/dist/esm/icons/index.native.js.map +1 -1
  147. package/dist/esm/icons/lucide.native.js.map +1 -1
  148. package/dist/esm/icons/themed.native.js.map +1 -1
  149. package/dist/esm/images/Image/ImageFrame.native.js.map +1 -1
  150. package/dist/esm/images/Image/framing.native.js.map +1 -1
  151. package/dist/esm/images/Image/mediaRadius.native.js.map +1 -1
  152. package/dist/esm/images/Image/shared.native.js.map +1 -1
  153. package/dist/esm/images/Image/types.native.js.map +1 -1
  154. package/dist/esm/images/index.native.js.map +1 -1
  155. package/dist/esm/index.native.js.map +1 -1
  156. package/dist/esm/knobImmuneExports.native.js.map +1 -1
  157. package/dist/esm/layouts/AsyncBoundary.native.js.map +1 -1
  158. package/dist/esm/layouts/Debug/index.native.js.map +1 -1
  159. package/dist/esm/layouts/EmptyState.native.js.map +1 -1
  160. package/dist/esm/layouts/IdentityPlate.native.js.map +1 -1
  161. package/dist/esm/layouts/KeyboardAvoidingWrapper/behavior.native.js.map +1 -1
  162. package/dist/esm/layouts/PageTemplates.native.js.map +1 -1
  163. package/dist/esm/layouts/PaneScaffold.native.js.map +1 -1
  164. package/dist/esm/layouts/SafeAreaWrapper/insets.native.js.map +1 -1
  165. package/dist/esm/layouts/StatusDot.native.js.map +1 -1
  166. package/dist/esm/layouts/StatusGlyphStrip.native.js.map +1 -1
  167. package/dist/esm/layouts/ViewSwitcher.native.js.map +1 -1
  168. package/dist/esm/layouts/attachments.native.js.map +1 -1
  169. package/dist/esm/layouts/bottomAccessory.native.js.map +1 -1
  170. package/dist/esm/layouts/breadcrumbs.native.js.map +1 -1
  171. package/dist/esm/layouts/index.native.js.map +1 -1
  172. package/dist/esm/layouts/page.mjs +4 -2
  173. package/dist/esm/layouts/page.mjs.map +1 -1
  174. package/dist/esm/layouts/page.native.js +4 -2
  175. package/dist/esm/layouts/page.native.js.map +1 -1
  176. package/dist/esm/layouts/pageHeadingScope.native.js.map +1 -1
  177. package/dist/esm/layouts/screenScroll.mjs +53 -1
  178. package/dist/esm/layouts/screenScroll.mjs.map +1 -1
  179. package/dist/esm/layouts/screenScroll.native.js +57 -1
  180. package/dist/esm/layouts/screenScroll.native.js.map +1 -1
  181. package/dist/esm/layouts/shellSidebarSlot.native.js.map +1 -1
  182. package/dist/esm/layouts/sidebar.mjs +45 -11
  183. package/dist/esm/layouts/sidebar.mjs.map +1 -1
  184. package/dist/esm/layouts/sidebar.native.js +48 -11
  185. package/dist/esm/layouts/sidebar.native.js.map +1 -1
  186. package/dist/esm/layouts/tags.native.js.map +1 -1
  187. package/dist/esm/layouts/timeline.native.js.map +1 -1
  188. package/dist/esm/layouts/toolbar.native.js.map +1 -1
  189. package/dist/esm/shared/actionScan.native.js.map +1 -1
  190. package/dist/esm/shared/i18n.native.js.map +1 -1
  191. package/dist/esm/shared/restoreRetries.native.js.map +1 -1
  192. package/dist/esm/shared/t.native.js.map +1 -1
  193. package/dist/esm/shared/textRidesText.native.js.map +1 -1
  194. package/dist/esm/shared/useReturnFocusOnClose.native.js.map +1 -1
  195. package/dist/esm/surfaces.native.js.map +1 -1
  196. package/dist/esm/tamagui.native.js.map +1 -1
  197. package/dist/esm/testSetup.native.js.map +1 -1
  198. package/dist/esm/utils/setTinted.native.js.map +1 -1
  199. package/dist/esm/utils/unwrapText.native.js.map +1 -1
  200. package/dist/esm/views/Calendar.native.js.map +1 -1
  201. package/dist/esm/views/Dashboard.native.js.map +1 -1
  202. package/dist/esm/views/Gantt.native.js.map +1 -1
  203. package/dist/esm/views/GanttDateGrip.native.js.map +1 -1
  204. package/dist/esm/views/ImageGrid.native.js.map +1 -1
  205. package/dist/esm/views/List.native.js.map +1 -1
  206. package/dist/esm/views/ListGroup.native.js.map +1 -1
  207. package/dist/esm/views/ListRow.native.js.map +1 -1
  208. package/dist/esm/views/Matrix.native.js.map +1 -1
  209. package/dist/esm/views/ReportBuilder.native.js.map +1 -1
  210. package/dist/esm/views/ShortcutCard.native.js.map +1 -1
  211. package/dist/esm/views/TreeView.native.js.map +1 -1
  212. package/dist/esm/views/calendarMath.native.js.map +1 -1
  213. package/dist/esm/views/ganttIntervals.native.js.map +1 -1
  214. package/dist/esm/views/ganttMath.native.js.map +1 -1
  215. package/dist/esm/views/index.native.js.map +1 -1
  216. package/dist/esm/views/kanbanDnd.native.js.map +1 -1
  217. package/dist/esm/views/matrixMath.native.js.map +1 -1
  218. package/dist/esm/views/sameNameScope.native.js.map +1 -1
  219. package/dist/esm/views/treeViewDnd.native.js.map +1 -1
  220. package/dist/esm/views/treeViewLayout.native.js.map +1 -1
  221. package/dist/esm/views/treeViewMotion.native.js.map +1 -1
  222. package/dist/esm/views/treeViewReveal.native.js.map +1 -1
  223. package/dist/esm/views/usePageFlowLoadMore.native.js.map +1 -1
  224. package/dist/esm/views/widgetChrome.native.js.map +1 -1
  225. package/dist/jsx/appShell/AppShell.mjs +406 -0
  226. package/dist/jsx/appShell/AppShell.mjs.map +1 -0
  227. package/dist/jsx/appShell/AppShell.native.js +499 -0
  228. package/dist/jsx/appShell/AppShell.native.js.map +1 -0
  229. package/dist/jsx/appShell/index.mjs +1 -0
  230. package/dist/jsx/appShell/index.mjs.map +1 -1
  231. package/dist/jsx/appShell/index.native.js +1 -0
  232. package/dist/jsx/appShell/index.native.js.map +1 -1
  233. package/dist/jsx/feedback/NotifyHost.native.js +1 -1
  234. package/dist/jsx/formLayouts/PreferencePanel.native.js +1 -1
  235. package/dist/jsx/index.native.js +1 -1
  236. package/dist/jsx/layouts/AsyncBoundary.native.js +1 -1
  237. package/dist/jsx/layouts/AsyncBoundary.native.js.map +1 -1
  238. package/dist/jsx/layouts/page.mjs +4 -2
  239. package/dist/jsx/layouts/page.mjs.map +1 -1
  240. package/dist/jsx/layouts/page.native.js +3 -0
  241. package/dist/jsx/layouts/page.native.js.map +1 -1
  242. package/dist/jsx/layouts/screenScroll.mjs +53 -1
  243. package/dist/jsx/layouts/screenScroll.mjs.map +1 -1
  244. package/dist/jsx/layouts/screenScroll.native.js +59 -0
  245. package/dist/jsx/layouts/screenScroll.native.js.map +1 -1
  246. package/dist/jsx/layouts/sidebar.mjs +45 -11
  247. package/dist/jsx/layouts/sidebar.mjs.map +1 -1
  248. package/dist/jsx/layouts/sidebar.native.js +49 -9
  249. package/dist/jsx/layouts/sidebar.native.js.map +1 -1
  250. package/package.json +9 -9
  251. package/src/appShell/AppShell.spec.tsx +259 -0
  252. package/src/appShell/AppShell.stories.tsx +112 -0
  253. package/src/appShell/AppShell.tsx +526 -0
  254. package/src/appShell/index.ts +1 -0
  255. package/src/layouts/Sidebar.spec.tsx +31 -0
  256. package/src/layouts/page.tsx +8 -0
  257. package/src/layouts/screenScroll.tsx +71 -0
  258. package/src/layouts/sidebar.tsx +83 -5
  259. package/types/appShell/AppShell.d.ts +47 -0
  260. package/types/appShell/AppShell.d.ts.map +1 -0
  261. package/types/appShell/index.d.ts +1 -0
  262. package/types/appShell/index.d.ts.map +1 -1
  263. package/types/layouts/page.d.ts +5 -0
  264. package/types/layouts/page.d.ts.map +1 -1
  265. package/types/layouts/screenScroll.d.ts +24 -0
  266. package/types/layouts/screenScroll.d.ts.map +1 -1
  267. package/types/layouts/sidebar.d.ts +31 -1
  268. package/types/layouts/sidebar.d.ts.map +1 -1
@@ -67,6 +67,7 @@ import {
67
67
  ScreenScrollScope,
68
68
  TopBarSlot,
69
69
  useLargeTitle,
70
+ useReportScreenScroll,
70
71
  useScreenScroll,
71
72
  useScreenScrollController,
72
73
  useTopBarSlot,
@@ -97,6 +98,12 @@ function negateSpaceToken(token: string): `$-${string}` {
97
98
  */
98
99
  export const CONTENT_MAX_WIDTH = layoutBreakpoints.xl;
99
100
 
101
+ /**
102
+ * The readable column an app shell centres its content in at regular width
103
+ * (UIKit's readableContentGuide): the two-pane budget breakpoint.
104
+ */
105
+ export const READABLE_MAX_WIDTH = layoutBreakpoints.expanded;
106
+
100
107
  export interface ScreenProps extends YStackProps {
101
108
  /** Wrap content in a ScrollView. Default: true. */
102
109
  scroll?: boolean;
@@ -271,6 +278,7 @@ function PageShell({
271
278
  }: ScreenProps) {
272
279
  const { knobProps } = useResolvedKnobs({ component: "Screen" });
273
280
  const scrollState = useScreenScrollController();
281
+ useReportScreenScroll(scrollState.state, Boolean(topBar));
274
282
  const [accessories] = useState(createBottomAccessoryStore);
275
283
  const chromeInset = useBottomChromeInset();
276
284
  const inset = noPadding ? null : (knobProps.panelPadding.padding as string);
@@ -308,6 +308,77 @@ export function useTopBarSlot(): TopBarSlotValue | null {
308
308
  return useContext(TopBarSlotContext);
309
309
  }
310
310
 
311
+ /**
312
+ * What the outermost Screen under an app shell tells the shell's nav bar
313
+ * (LC-157 under `AppShell`): its scroll state, and whether the page pins a
314
+ * top bar of its own, in which case that bar is the nav bar and the shell
315
+ * draws none.
316
+ */
317
+ export interface ShellScrollReport extends ScreenScrollState {
318
+ ownTopBar: boolean;
319
+ }
320
+
321
+ type ShellScrollReporter = (id: string, report: ShellScrollReport | null) => void;
322
+
323
+ const ShellScrollReportContext = createContext<ShellScrollReporter | null>(null);
324
+
325
+ /** The shell's half: the latest report, and the scope its content sits in. */
326
+ export function useShellScrollReports(): {
327
+ report: ShellScrollReport | null;
328
+ reporter: ShellScrollReporter;
329
+ } {
330
+ const [entry, setEntry] = useState<{ id: string; report: ShellScrollReport } | null>(null);
331
+ const reporter = useCallback<ShellScrollReporter>((id, report) => {
332
+ setEntry((prev) => {
333
+ if (!report) return prev?.id === id ? null : prev;
334
+ if (
335
+ prev?.id === id &&
336
+ prev.report.scrolled === report.scrolled &&
337
+ prev.report.collapsed === report.collapsed &&
338
+ prev.report.title === report.title &&
339
+ prev.report.ownTopBar === report.ownTopBar
340
+ ) {
341
+ return prev;
342
+ }
343
+ return { id, report };
344
+ });
345
+ }, []);
346
+ return { report: entry?.report ?? null, reporter };
347
+ }
348
+
349
+ export function ShellScrollReportScope({
350
+ reporter,
351
+ children,
352
+ }: {
353
+ reporter: ShellScrollReporter;
354
+ children: ReactNode;
355
+ }) {
356
+ return (
357
+ <ShellScrollReportContext.Provider value={reporter}>
358
+ {children}
359
+ </ShellScrollReportContext.Provider>
360
+ );
361
+ }
362
+
363
+ /**
364
+ * The Screen's half: the outermost Screen under a shell reports its state;
365
+ * a Screen nested in another stays quiet, so the page's own wins.
366
+ */
367
+ export function useReportScreenScroll(state: ScreenScrollState, ownTopBar: boolean) {
368
+ const reporter = useContext(ShellScrollReportContext);
369
+ const nested = useContext(ScreenScrollActionsContext) !== null;
370
+ const id = useId();
371
+ const live = reporter && !nested ? reporter : null;
372
+ const { scrolled, collapsed, title } = state;
373
+ useEffect(() => {
374
+ live?.(id, { scrolled, collapsed, title, ownTopBar });
375
+ }, [live, id, scrolled, collapsed, title, ownTopBar]);
376
+ useEffect(() => {
377
+ if (!live) return;
378
+ return () => live(id, null);
379
+ }, [live, id]);
380
+ }
381
+
311
382
  const inertTitle = () => () => undefined;
312
383
  const inertTitleBottom = () => undefined;
313
384
 
@@ -5,6 +5,7 @@ import {
5
5
  getGroupPosition,
6
6
  hairline,
7
7
  hairlineWidth,
8
+ normalizeToHex,
8
9
  stackRadiusProps,
9
10
  useResolvedKnobs,
10
11
  wasKeyboardFocus,
@@ -12,7 +13,16 @@ import {
12
13
  } from "@multiplatform.one/theme";
13
14
  import type React from "react";
14
15
  import { Fragment, useId, useState } from "react";
15
- import { Label, Separator, Text as TamaguiText, XStack, YStack, isWeb } from "tamagui";
16
+ import {
17
+ Label,
18
+ Separator,
19
+ Text as TamaguiText,
20
+ XStack,
21
+ YStack,
22
+ isWeb,
23
+ useTheme,
24
+ useThemeName,
25
+ } from "tamagui";
16
26
  import { ScrollView } from "../ScrollView";
17
27
  import { componentColors } from "../componentColors";
18
28
  import { Text } from "../Text";
@@ -76,6 +86,46 @@ export interface SidebarProps {
76
86
  */
77
87
  footer?: React.ReactNode;
78
88
  testID?: string;
89
+ /** Pinned above the rows, outside their scroll (an app's name in a shell rail). */
90
+ header?: React.ReactNode;
91
+ /** Stacked under the sections inside the same scroll (a page's panel, LC-101). */
92
+ children?: React.ReactNode;
93
+ /**
94
+ * Paint the column in the translucent sidebar material instead of the card
95
+ * surface (the HIG source list): an app shell's sidebar.
96
+ */
97
+ material?: boolean;
98
+ }
99
+
100
+ /**
101
+ * The ramp step the sidebar material paints: darker than the page in light,
102
+ * lighter in dark, as the HIG sidebar reads against its content. The dark
103
+ * ramp climbs slower at its low end, so it takes one step more.
104
+ */
105
+ export const sidebarMaterial = { light: "$color3", dark: "$color4" } as const;
106
+ /**
107
+ * How much of the page shows through the material. The shell's column sits
108
+ * beside its content, never over it, so the page ground is all that is
109
+ * behind it and a blur would paint nothing (LC-206).
110
+ */
111
+ export const sidebarMaterialOpacity = 0.72;
112
+ /**
113
+ * A material rail's inset from its edges. Its rows are inset pills with no
114
+ * rule between them (the HIG source list); a header or footer lines up with
115
+ * the rows by it.
116
+ */
117
+ export const sidebarRailInset = "$2";
118
+
119
+ function useSidebarMaterial(enabled: boolean) {
120
+ const theme = useTheme() as unknown as Record<string, { val?: unknown } | undefined>;
121
+ const step = useThemeName().startsWith("dark") ? sidebarMaterial.dark : sidebarMaterial.light;
122
+ if (!enabled) return null;
123
+ const base = theme[step.slice(1)]?.val;
124
+ const hex = typeof base === "string" ? normalizeToHex(base) : null;
125
+ const backgroundColor = hex
126
+ ? `rgba(${[1, 3, 5].map((i) => parseInt(hex.slice(i, i + 2), 16)).join(", ")}, ${sidebarMaterialOpacity})`
127
+ : step;
128
+ return { backgroundColor };
79
129
  }
80
130
 
81
131
  export function Sidebar({
@@ -86,8 +136,12 @@ export function Sidebar({
86
136
  divider = true,
87
137
  footer,
88
138
  testID,
139
+ header,
140
+ children,
141
+ material = false,
89
142
  }: SidebarProps) {
90
143
  const { knobProps } = useResolvedKnobs();
144
+ const materialProps = useSidebarMaterial(material);
91
145
  const headingId = useId();
92
146
  // LC-05: active row labels and metadata share the selection ink.
93
147
  // SP-EDGE: rows own the horizontal inset (the panelPadding role via the
@@ -112,6 +166,7 @@ export function Sidebar({
112
166
  // SF-CARD fill without a four-side control border (R-NONE). The end
113
167
  // hairline is the panel divider (Axiom 15), stretched to the rail height.
114
168
  {...knobProps.surface}
169
+ {...(materialProps as object)}
115
170
  borderWidth={0}
116
171
  borderColor="$borderColor"
117
172
  {...(!divider
@@ -125,8 +180,21 @@ export function Sidebar({
125
180
  : { borderEndWidth: hairlineWidth })}
126
181
  testID={testID}
127
182
  >
183
+ {header ? (
184
+ <YStack
185
+ flexShrink={0}
186
+ {...(material ? { paddingHorizontal: sidebarRailInset } : null)}
187
+ data-sidebar-header=""
188
+ >
189
+ {header}
190
+ </YStack>
191
+ ) : null}
128
192
  <ScrollView flex={1}>
129
- <YStack {...knobProps.panelPadding} paddingHorizontal={0} {...knobProps.gapLg}>
193
+ <YStack
194
+ {...knobProps.panelPadding}
195
+ paddingHorizontal={material ? sidebarRailInset : 0}
196
+ {...knobProps.gapLg}
197
+ >
130
198
  {sections.map((section, sectionIdx) => {
131
199
  const titleId = section.title ? `${headingId}-${sectionIdx}` : undefined;
132
200
  return (
@@ -183,7 +251,9 @@ export function Sidebar({
183
251
  <YStack width="100%" data-sidebar-group="">
184
252
  {section.items.map((item, itemIdx, items) => {
185
253
  const position = getGroupPosition(itemIdx, items.length);
186
- const corners = stackRadiusProps(position, knobProps.borderRadius.borderRadius);
254
+ const corners = material
255
+ ? { borderRadius: knobProps.borderRadius.borderRadius }
256
+ : stackRadiusProps(position, knobProps.borderRadius.borderRadius);
187
257
  const itemKey = `${sectionIdx}:${String(item.value ?? item.label)}`;
188
258
  const ink = item.active
189
259
  ? componentColors.selection.ink
@@ -202,7 +272,7 @@ export function Sidebar({
202
272
  : null;
203
273
  return (
204
274
  <Fragment key={itemKey}>
205
- {itemIdx > 0 ? (
275
+ {itemIdx > 0 && !material ? (
206
276
  <YStack alignSelf="stretch" paddingStart={rowPad}>
207
277
  <Separator alignSelf="stretch" {...hairline.line} />
208
278
  </YStack>
@@ -325,10 +395,18 @@ export function Sidebar({
325
395
  </YStack>
326
396
  );
327
397
  })}
398
+ {children}
328
399
  </YStack>
329
400
  </ScrollView>
330
401
  {footer != null && footer !== false ? (
331
- <YStack flexShrink={1} minHeight={0} maxHeight="50%" width="100%" data-sidebar-footer="">
402
+ <YStack
403
+ flexShrink={1}
404
+ minHeight={0}
405
+ maxHeight="50%"
406
+ width="100%"
407
+ {...(material ? { paddingHorizontal: sidebarRailInset } : null)}
408
+ data-sidebar-footer=""
409
+ >
332
410
  <Separator width="100%" alignSelf="stretch" {...hairline.line} />
333
411
  {footer}
334
412
  </YStack>
@@ -0,0 +1,47 @@
1
+ import { type ReactNode } from "react";
2
+ import type { TabBarIcon, TabBarItem } from "./TabBar";
3
+ export interface AppShellDestination {
4
+ /** The destination's route; a path under it keeps it selected. */
5
+ key: string;
6
+ /** One short word: it is the tab caption and the back label. */
7
+ label: string;
8
+ icon: TabBarIcon;
9
+ /** The SF Symbol the iOS system tab bar draws for this destination. */
10
+ nativeIcon?: TabBarItem["nativeIcon"];
11
+ /**
12
+ * `tab` (default) sits in the phone's tab bar; `more` opens from the bar's
13
+ * pull-down. Every destination sits in the regular-width sidebar.
14
+ */
15
+ placement?: "tab" | "more";
16
+ /** Runs instead of `onNavigate(key)`, e.g. an external link. */
17
+ onPress?: () => void;
18
+ }
19
+ export interface AppShellProps {
20
+ destinations: readonly AppShellDestination[];
21
+ /** The current route path. */
22
+ path: string;
23
+ onNavigate: (key: string) => void;
24
+ /** The app's name: the sidebar's title and the home control's label. */
25
+ title: string;
26
+ /** The app's mark, leading the bar on a phone and the name in the sidebar. */
27
+ logo?: ReactNode;
28
+ /** Pressing the name or mark. Default: the first destination. */
29
+ onTitlePress?: () => void;
30
+ /** Trailing bar actions (theme, account). */
31
+ actions?: ReactNode;
32
+ /** Shows a tinted back on a route pushed below its destination (its key). */
33
+ onBack?: (destinationKey: string) => void;
34
+ /** The phone's bottom accessory (LC-174), handed to the tab bar or pinned to the bottom edge. */
35
+ accessory?: ReactNode;
36
+ /** Route prefixes that mount their own chrome; the shell draws none there. */
37
+ ownChrome?: readonly string[];
38
+ children?: ReactNode;
39
+ testID?: string;
40
+ }
41
+ /** The destination that owns `path` (the longest key it sits under). */
42
+ export declare function appShellRoute(destinations: readonly AppShellDestination[], path: string): {
43
+ destination: AppShellDestination | undefined;
44
+ pushed: boolean;
45
+ };
46
+ export declare function AppShell({ destinations, path, onNavigate, title, logo, onTitlePress, actions, onBack, accessory, ownChrome, children, testID, }: AppShellProps): import("react/jsx-runtime").JSX.Element;
47
+ //# sourceMappingURL=AppShell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppShell.d.ts","sourceRoot":"","sources":["../../src/appShell/AppShell.tsx"],"names":[],"mappings":"AAiCA,OAAO,EAA+C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAepF,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAIvD,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,uEAAuE;IACvE,UAAU,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IACtC;;;OAGG;IACH,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC7C,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,iGAAiG;IACjG,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAOD,wEAAwE;AACxE,wBAAgB,aAAa,CAC3B,YAAY,EAAE,SAAS,mBAAmB,EAAE,EAC5C,IAAI,EAAE,MAAM,GACX;IAAE,WAAW,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAQnE;AAiKD,wBAAgB,QAAQ,CAAC,EACvB,YAAY,EACZ,IAAI,EACJ,UAAU,EACV,KAAK,EACL,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,MAAM,EACN,SAAS,EACT,SAAc,EACd,QAAQ,EACR,MAAoB,GACrB,EAAE,aAAa,2CAkPf"}
@@ -6,5 +6,6 @@ export { TabHost, type TabHostProps } from "./TabHost";
6
6
  export * from "./Springboard";
7
7
  export type { AppEntry } from "./appTile";
8
8
  export * from "./SettingsSplit";
9
+ export * from "./AppShell";
9
10
  export { useBottomChromeInset } from "./bottomChrome";
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/appShell/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/appShell/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -24,6 +24,11 @@ import { type PageHeadingLevel } from "./pageHeadingScope";
24
24
  * (DG-LAY-01: layout primitives consume breakpoint tokens, not raw pixels).
25
25
  */
26
26
  export declare const CONTENT_MAX_WIDTH: 1280;
27
+ /**
28
+ * The readable column an app shell centres its content in at regular width
29
+ * (UIKit's readableContentGuide): the two-pane budget breakpoint.
30
+ */
31
+ export declare const READABLE_MAX_WIDTH: 860;
27
32
  export interface ScreenProps extends YStackProps {
28
33
  /** Wrap content in a ScrollView. Default: true. */
29
34
  scroll?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/layouts/page.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/layouts/page.tsx"],"names":[],"mappings":"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"}
@@ -112,6 +112,30 @@ export declare function TopBarSlot({ children, ...value }: TopBarSlotValue & {
112
112
  }): import("react/jsx-runtime").JSX.Element;
113
113
  /** The pinned top bar's slot, or null when a toolbar sits in the page flow. */
114
114
  export declare function useTopBarSlot(): TopBarSlotValue | null;
115
+ /**
116
+ * What the outermost Screen under an app shell tells the shell's nav bar
117
+ * (LC-157 under `AppShell`): its scroll state, and whether the page pins a
118
+ * top bar of its own, in which case that bar is the nav bar and the shell
119
+ * draws none.
120
+ */
121
+ export interface ShellScrollReport extends ScreenScrollState {
122
+ ownTopBar: boolean;
123
+ }
124
+ type ShellScrollReporter = (id: string, report: ShellScrollReport | null) => void;
125
+ /** The shell's half: the latest report, and the scope its content sits in. */
126
+ export declare function useShellScrollReports(): {
127
+ report: ShellScrollReport | null;
128
+ reporter: ShellScrollReporter;
129
+ };
130
+ export declare function ShellScrollReportScope({ reporter, children, }: {
131
+ reporter: ShellScrollReporter;
132
+ children: ReactNode;
133
+ }): import("react/jsx-runtime").JSX.Element;
134
+ /**
135
+ * The Screen's half: the outermost Screen under a shell reports its state;
136
+ * a Screen nested in another stays quiet, so the page's own wins.
137
+ */
138
+ export declare function useReportScreenScroll(state: ScreenScrollState, ownTopBar: boolean): void;
115
139
  /**
116
140
  * A nested Screen's content scrolls in its parent's scroll view, so it reads
117
141
  * the parent's scroll actions, but its own large title stays a heading in the
@@ -1 +1 @@
1
- {"version":3,"file":"screenScroll.d.ts","sourceRoot":"","sources":["../../src/layouts/screenScroll.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAclD,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,QAAQ,EAAE,OAAO,CAAC;IAClB,qEAAqE;IACrE,SAAS,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,UAAU,mBAAmB;IAC3B,WAAW,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,+BAA+B;IAC/B,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7B,iDAAiD;IACjD,MAAM,EAAE,MAAM,MAAM,CAAC;IACrB,uEAAuE;IACvE,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,IAAI,CAAC;IAC7C,0EAA0E;IAC1E,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAYD,UAAU,eAAe;IACvB,WAAW,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE;YAAE,CAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IACjD,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,aAAa,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAOhE;AAED,MAAM,WAAW,sBAAsB;IACrC,yCAAyC;IACzC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC3C,wEAAwE;IACxE,WAAW,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,qEAAqE;IACrE,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7B,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,IAAI,sBAAsB,CAmDlE;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,QAAQ,GACT,EAAE;IACD,UAAU,EAAE,sBAAsB,CAAC;IACnC,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAQA;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,IAAI,iBAAiB,CAEnD;AAyBD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,UAAO;iBA+BrC,OAAO;;;;;;;EAKxC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEvE;AAOD;;;;;;;GAOG;AACH,wBAAgB,YAAY;iBAGM,OAAO;;EA6BxC;AAED,UAAU,eAAe;IACvB,uDAAuD;IACvD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAID,oDAAoD;AACpD,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAM3F;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,IAAI,eAAe,GAAG,IAAI,CAEtD;AAKD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAatE"}
1
+ {"version":3,"file":"screenScroll.d.ts","sourceRoot":"","sources":["../../src/layouts/screenScroll.tsx"],"names":[],"mappings":"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"}
@@ -56,6 +56,36 @@ export interface SidebarProps {
56
56
  */
57
57
  footer?: React.ReactNode;
58
58
  testID?: string;
59
+ /** Pinned above the rows, outside their scroll (an app's name in a shell rail). */
60
+ header?: React.ReactNode;
61
+ /** Stacked under the sections inside the same scroll (a page's panel, LC-101). */
62
+ children?: React.ReactNode;
63
+ /**
64
+ * Paint the column in the translucent sidebar material instead of the card
65
+ * surface (the HIG source list): an app shell's sidebar.
66
+ */
67
+ material?: boolean;
59
68
  }
60
- export declare function Sidebar({ sections, width, "aria-label": ariaLabel, role, divider, footer, testID, }: SidebarProps): import("react/jsx-runtime").JSX.Element;
69
+ /**
70
+ * The ramp step the sidebar material paints: darker than the page in light,
71
+ * lighter in dark, as the HIG sidebar reads against its content. The dark
72
+ * ramp climbs slower at its low end, so it takes one step more.
73
+ */
74
+ export declare const sidebarMaterial: {
75
+ readonly light: "$color3";
76
+ readonly dark: "$color4";
77
+ };
78
+ /**
79
+ * How much of the page shows through the material. The shell's column sits
80
+ * beside its content, never over it, so the page ground is all that is
81
+ * behind it and a blur would paint nothing (LC-206).
82
+ */
83
+ export declare const sidebarMaterialOpacity = 0.72;
84
+ /**
85
+ * A material rail's inset from its edges. Its rows are inset pills with no
86
+ * rule between them (the HIG source list); a header or footer lines up with
87
+ * the rows by it.
88
+ */
89
+ export declare const sidebarRailInset = "$2";
90
+ export declare function Sidebar({ sections, width, "aria-label": ariaLabel, role, divider, footer, testID, header, children, material, }: SidebarProps): import("react/jsx-runtime").JSX.Element;
61
91
  //# sourceMappingURL=sidebar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../src/layouts/sidebar.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,8DAA8D;IAC9D,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,2FAA2F;IAC3F,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,IAAI,CAAC,EAAE,YAAY,GAAG,eAAe,CAAC;IACtC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,KAAW,EACX,YAAY,EAAE,SAAqB,EACnC,IAAmB,EACnB,OAAc,EACd,MAAM,EACN,MAAM,GACP,EAAE,YAAY,2CAyPd"}
1
+ {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../src/layouts/sidebar.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAgB/B,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,8DAA8D;IAC9D,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,2FAA2F;IAC3F,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,IAAI,CAAC,EAAE,YAAY,GAAG,eAAe,CAAC;IACtC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;CAAiD,CAAC;AAC9E;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAcrC,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,KAAW,EACX,YAAY,EAAE,SAAqB,EACnC,IAAmB,EACnB,OAAc,EACd,MAAM,EACN,MAAM,EACN,MAAM,EACN,QAAQ,EACR,QAAgB,GACjB,EAAE,YAAY,2CAkRd"}