@kismet-ux/constellation 1.11.1 → 1.13.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 (73) hide show
  1. package/dist/form/Checkbox/checkbox.js +56 -4
  2. package/dist/form/Checkbox/checkbox.js.map +1 -1
  3. package/dist/form/DatePicker/date-picker.js +55 -4
  4. package/dist/form/DatePicker/date-picker.js.map +1 -1
  5. package/dist/form/Input/input.css +9 -0
  6. package/dist/form.d.ts +1 -1
  7. package/dist/hooks/index.d.ts +1 -0
  8. package/dist/hooks/index.d.ts.map +1 -1
  9. package/dist/hooks/use-keyboard-inset.d.ts +38 -0
  10. package/dist/hooks/use-keyboard-inset.d.ts.map +1 -0
  11. package/dist/hooks/use-keyboard-inset.js +76 -0
  12. package/dist/hooks/use-keyboard-inset.js.map +1 -0
  13. package/dist/index-B0d2advx.d.ts +354 -0
  14. package/dist/index-BaTZEId2.d.ts +354 -0
  15. package/dist/index-BgAs5Dmg.d.ts +354 -0
  16. package/dist/index-BhyLuP25.d.ts +354 -0
  17. package/dist/index-BnhsWXrb.d.ts +354 -0
  18. package/dist/index-CLUKMTTu.d.ts +354 -0
  19. package/dist/index-CVEb-8MV.d.ts +566 -0
  20. package/dist/index-CcD4F6q1.d.ts +633 -0
  21. package/dist/index-ClPGArR0.d.ts +633 -0
  22. package/dist/index-D2L-7_nr.d.ts +354 -0
  23. package/dist/index-D81GIX01.d.ts +566 -0
  24. package/dist/index-DHbG5cYq.d.ts +633 -0
  25. package/dist/index-DOKRFZ3I.d.ts +354 -0
  26. package/dist/index-DiR9pLJe.d.ts +566 -0
  27. package/dist/index-DxbOGj5Y.d.ts +354 -0
  28. package/dist/index-bK5ZOxgI.d.ts +633 -0
  29. package/dist/index-p7kVnzRy.d.ts +633 -0
  30. package/dist/index-xQq5cJnf.d.ts +633 -0
  31. package/dist/index.css +88 -0
  32. package/dist/index.d.ts +45 -7
  33. package/dist/index.js +32 -30
  34. package/dist/index.js.map +1 -1
  35. package/dist/layout/AppContentFooter/app-content-footer.css +18 -1
  36. package/dist/layout/AppContentMain/app-content-main.css +9 -0
  37. package/dist/layout/AppShell/app-shell.d.ts.map +1 -1
  38. package/dist/layout/AppShell/app-shell.js +10 -0
  39. package/dist/layout/AppShell/app-shell.js.map +1 -1
  40. package/dist/layout/AppSidebarHeader/app-sidebar-header.css +14 -1
  41. package/dist/layout/AppSidebarHeader/app-sidebar-header.js +30 -1
  42. package/dist/layout/AppSidebarHeader/app-sidebar-header.js.map +1 -1
  43. package/dist/layout/Sidebar/sidebar.css +32 -0
  44. package/dist/layout.d.ts +2 -2
  45. package/dist/navigation/NavUser/nav-user.js +2 -2
  46. package/dist/navigation/Sheet/sheet.css +20 -0
  47. package/dist/navigation/Sheet/sheet.js +29 -3
  48. package/dist/navigation/Sheet/sheet.js.map +1 -1
  49. package/dist/navigation.d.ts +1 -1
  50. package/dist/settings/AppearanceTabs/appearance-tabs.js +27 -1
  51. package/dist/settings/AppearanceTabs/appearance-tabs.js.map +1 -1
  52. package/dist/tokens.css +30 -0
  53. package/dist/tooltip-CZ7BC0g3.d.ts +46 -0
  54. package/dist/tooltip-Cf_wdeef.d.ts +46 -0
  55. package/dist/tooltip-D1Wex2bz.d.ts +46 -0
  56. package/dist/tooltip-X3uiRSnA.d.ts +46 -0
  57. package/dist/tooltip-zSCQCLLI.d.ts +46 -0
  58. package/dist/typography/Typography/typography.css +14 -14
  59. package/dist/ui/ChipSelect/chip-select.css +63 -0
  60. package/dist/ui/ChipSelect/chip-select.d.ts +69 -0
  61. package/dist/ui/ChipSelect/chip-select.d.ts.map +1 -0
  62. package/dist/ui/ChipSelect/chip-select.js +209 -0
  63. package/dist/ui/ChipSelect/chip-select.js.map +1 -0
  64. package/dist/ui/ChipSelect/chip-select.module.scss.js +6 -0
  65. package/dist/ui/ChipSelect/chip-select.module.scss.js.map +1 -0
  66. package/dist/ui/ChipSelect/index.d.ts +3 -0
  67. package/dist/ui/ChipSelect/index.d.ts.map +1 -0
  68. package/dist/ui/index.d.ts +1 -0
  69. package/dist/ui/index.d.ts.map +1 -1
  70. package/dist/ui.d.ts +2 -2
  71. package/dist/ui.js +1 -0
  72. package/dist/ui.js.map +1 -1
  73. package/package.json +1 -1
package/dist/index.css CHANGED
@@ -428,6 +428,36 @@ svg {
428
428
  */
429
429
  --size-0-5: 0.25rem;
430
430
  --size-1-5: 0.75rem;
431
+ /*
432
+ * ── Type steps ─────────────────────────────────────────────────────────
433
+ *
434
+ * The sizes `Typography` sets per variant, exposed so an app can align its
435
+ * OWN rules to the same scale instead of copying the numbers into a
436
+ * stylesheet where they immediately start to drift.
437
+ *
438
+ * A component should still reach for the variant — `<Typography
439
+ * variant={'caption'}>` says what the text IS, where a raw size only says
440
+ * how big. These are for the CSS an app cannot express as a component:
441
+ * a badge's label, a table cell, a chip's count.
442
+ *
443
+ * ⚠️ `caption` is the FLOOR, and deliberately: 12px is about as small as
444
+ * sustained UI text can be and still be read at arm's length on a phone.
445
+ * The scale does not offer anything below it, and an app that wants
446
+ * something smaller is telling you its density is wrong.
447
+ *
448
+ * Headings keep their responsive overrides in the component — those are a
449
+ * breakpoint's business rather than the scale's.
450
+ */
451
+ --font-size-caption: 0.75rem;
452
+ --font-size-body2: 0.875rem;
453
+ --font-size-body1: 1rem;
454
+ --font-size-subtitle1: 1.0625rem;
455
+ --font-size-h6: 1.35rem;
456
+ --font-size-h5: 1.5rem;
457
+ --font-size-h4: 1.65rem;
458
+ --font-size-h3: 1.85rem;
459
+ --font-size-h2: 2.25rem;
460
+ --font-size-h1: 2.75rem;
431
461
  /*
432
462
  * ── Measure ────────────────────────────────────────────────────────────
433
463
  *
@@ -705,6 +735,27 @@ main.no-padding {
705
735
  padding: 0;
706
736
  }
707
737
 
738
+ /*
739
+ * ── Text and flex helpers ─────────────────────────────────────────────────
740
+ *
741
+ * The two that consumers kept writing for themselves. `--font-mono` is a token
742
+ * this library owns, so the utility that applies it belongs here rather than
743
+ * in every app that wants a figure to line up in a column; `Typography` still
744
+ * takes `mono` as a prop, and that is the better answer wherever the element
745
+ * is already a `Typography`. This is for the spans and cells that are not.
746
+ *
747
+ * `.grow` is `flex: 1` — the other half of `Column`'s `flex` prop, for a child
748
+ * that is not one of the layout primitives (a `Button` sharing a row, say).
749
+ */
750
+ .mono {
751
+ font-family: var(--font-mono);
752
+ font-variant-numeric: tabular-nums;
753
+ }
754
+
755
+ .grow {
756
+ flex: 1;
757
+ }
758
+
708
759
  .srOnly {
709
760
  border: 0;
710
761
  clip: rect(0, 0, 0, 0);
@@ -900,6 +951,43 @@ img {
900
951
  animation: pulse 1.5s ease-in-out infinite;
901
952
  }
902
953
 
954
+ /*
955
+ * Two more of the arrive family, both lifted out of an app that had written
956
+ * them itself. They differ from `fade-in` only in axis and distance, which is
957
+ * the whole vocabulary: a row slides in from the lead edge, a flash drops in.
958
+ *
959
+ * ⚠️ Shorter than `fade-in` on purpose. These play on things that arrive in
960
+ * NUMBERS — a list re-ordering, a count changing — where 280ms each reads as
961
+ * the page lurching rather than as a row appearing.
962
+ */
963
+ .row-in {
964
+ animation: row-in 180ms var(--easing-default) both;
965
+ }
966
+
967
+ @keyframes row-in {
968
+ from {
969
+ opacity: 0;
970
+ transform: translateX(-4px);
971
+ }
972
+ to {
973
+ opacity: 1;
974
+ transform: none;
975
+ }
976
+ }
977
+ .pulse-in {
978
+ animation: pulse-in 220ms var(--easing-default);
979
+ }
980
+
981
+ @keyframes pulse-in {
982
+ from {
983
+ opacity: 0;
984
+ transform: translateY(-3px);
985
+ }
986
+ to {
987
+ opacity: 1;
988
+ transform: none;
989
+ }
990
+ }
903
991
  /**
904
992
  * Chrome has a bug with transitions on load since 2012!
905
993
  *
package/dist/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  export { Logo, LogoProps } from './brand.js';
2
- export { C as Checkbox, a as CheckboxProps, b as Combobox, c as ComboboxOption, d as ComboboxProps, D as DatePicker, e as DatePickerProps, F as FormTheme, L as Label, f as LabelProps, S as Select, g as SelectAlign, h as SelectContent, i as SelectContentProps, j as SelectField, k as SelectFieldProps, l as SelectGroup, m as SelectItem, n as SelectPosition, o as SelectProps, p as SelectSeparator, q as SelectSide, r as SelectTrigger, s as SelectValue, t as __Surface } from './index-CIK_SmBm.js';
2
+ export { C as Checkbox, a as CheckboxProps, b as Combobox, c as ComboboxOption, d as ComboboxProps, D as DatePicker, e as DatePickerProps, F as FormTheme, L as Label, f as LabelProps, S as Select, g as SelectAlign, h as SelectContent, i as SelectContentProps, j as SelectField, k as SelectFieldProps, l as SelectGroup, m as SelectItem, n as SelectPosition, o as SelectProps, p as SelectSeparator, q as SelectSide, r as SelectTrigger, s as SelectValue, t as __Surface } from './index-DhS2nQjt.js';
3
3
  export { I as Input, a as InputBaseProps } from './input-Cp5LET5i.js';
4
4
  import * as React from 'react';
5
- import { S as SidebarContextValue } from './index-BxBAq63A.js';
6
- export { A as AppContent, a as AppContentFooter, b as AppContentFooterProps, c as AppContentMain, d as AppContentMainProps, e as AppFooter, f as AppFooterProps, g as AppShell, h as AppShellProps, i as AppSidebar, j as AppSidebarHeader, k as AppSidebarHeaderProps, l as AppSidebarProps, C as Collapse, m as CollapseProps, n as Column, o as ColumnProps, p as Container, q as ContainerProps, G as Grid, r as GridColumns, s as GridProps, R as Row, t as Sidebar, u as SidebarContent, v as SidebarFooter, w as SidebarGroup, x as SidebarGroupAction, y as SidebarGroupContent, z as SidebarGroupLabel, B as SidebarHeader, D as SidebarInput, E as SidebarInset, F as SidebarMenu, H as SidebarMenuAction, I as SidebarMenuBadge, J as SidebarMenuButton, K as SidebarMenuItem, L as SidebarMenuSkeleton, M as SidebarMenuSub, N as SidebarMenuSubButton, O as SidebarMenuSubItem, P as SidebarProvider, Q as SidebarRail, T as SidebarTrigger, U as SidebarVariant, V as Skeleton } from './index-BxBAq63A.js';
7
- import { A as AlertContextValue, S as SortState } from './index-D3J_UMR7.js';
8
- export { a as Alert, b as AlertBanner, c as AlertBannerProps, d as AlertDescription, e as AlertMessage, f as AlertProps, g as AlertProvider, h as AlertTheme, i as AlertTitle, j as Avatar, k as AvatarFallback, l as AvatarFallbackProps, m as AvatarImage, n as AvatarImageProps, o as AvatarProps, C as Chip, p as ChipProps, q as CodeBlock, r as CodeBlockProps, D as DevIndicator, s as DevIndicatorProps, t as Dialog, u as DialogClose, v as DialogCloseProps, w as DialogContent, x as DialogContentProps, y as DialogDescription, z as DialogFooter, B as DialogHeader, E as DialogOverlay, F as DialogPortal, G as DialogProps, H as DialogTitle, I as DialogTrigger, J as DialogTriggerProps, K as EmptyState, L as EmptyStateProps, M as Icon, N as IconProps, O as List, P as ListItem, Q as ListItemProps, R as ListProps, T as Pagination, U as PaginationProps, V as ProgressBar, W as ProgressBarProps, X as PushAlertInput, Y as Separator, Z as SeparatorProps, _ as SortContextValue, $ as SortDirection, a0 as StatCard, a1 as StatCardDirection, a2 as StatCardProps, a3 as StatCardSize, a4 as StatCardTheme, a5 as StatCardVariant, a6 as StatusDot, a7 as StatusDotProps, a8 as Step, a9 as StepProgress, aa as StepProgressProps, ab as Switch, ac as SwitchProps, ad as Table, ae as TableActionCell, af as TableActionCellProps, ag as TableActionItem, ah as TableBody, ai as TableBodyProps, aj as TableCard, ak as TableCell, al as TableFooter, am as TableHead, an as TableHeader, ao as TableRow, ap as TableSortableHeader, aq as TableSortableHeaderProps, ar as TableToolbar, as as TableToolbarProps, at as Toggle, au as ToggleGroup, av as ToggleGroupProps, aw as ToggleProps, ax as TrendDirection, ay as persistAlert, az as statusDotVariants } from './index-D3J_UMR7.js';
5
+ import { S as SidebarContextValue } from './index-DxbOGj5Y.js';
6
+ export { A as AppContent, a as AppContentFooter, b as AppContentFooterProps, c as AppContentMain, d as AppContentMainProps, e as AppFooter, f as AppFooterProps, g as AppShell, h as AppShellProps, i as AppSidebar, j as AppSidebarHeader, k as AppSidebarHeaderProps, l as AppSidebarProps, C as Collapse, m as CollapseProps, n as Column, o as ColumnProps, p as Container, q as ContainerProps, G as Grid, r as GridColumns, s as GridProps, R as Row, t as Sidebar, u as SidebarContent, v as SidebarFooter, w as SidebarGroup, x as SidebarGroupAction, y as SidebarGroupContent, z as SidebarGroupLabel, B as SidebarHeader, D as SidebarInput, E as SidebarInset, F as SidebarMenu, H as SidebarMenuAction, I as SidebarMenuBadge, J as SidebarMenuButton, K as SidebarMenuItem, L as SidebarMenuSkeleton, M as SidebarMenuSub, N as SidebarMenuSubButton, O as SidebarMenuSubItem, P as SidebarProvider, Q as SidebarRail, T as SidebarTrigger, U as SidebarVariant, V as Skeleton } from './index-DxbOGj5Y.js';
7
+ import { A as AlertContextValue, S as SortState } from './index-p7kVnzRy.js';
8
+ export { a as Alert, b as AlertBanner, c as AlertBannerProps, d as AlertDescription, e as AlertMessage, f as AlertProps, g as AlertProvider, h as AlertTheme, i as AlertTitle, j as Avatar, k as AvatarFallback, l as AvatarFallbackProps, m as AvatarImage, n as AvatarImageProps, o as AvatarProps, C as Chip, p as ChipProps, q as ChipSelect, r as ChipSelectOption, s as ChipSelectProps, t as CodeBlock, u as CodeBlockProps, D as DevIndicator, v as DevIndicatorProps, w as Dialog, x as DialogClose, y as DialogCloseProps, z as DialogContent, B as DialogContentProps, E as DialogDescription, F as DialogFooter, G as DialogHeader, H as DialogOverlay, I as DialogPortal, J as DialogProps, K as DialogTitle, L as DialogTrigger, M as DialogTriggerProps, N as EmptyState, O as EmptyStateProps, P as Icon, Q as IconProps, R as List, T as ListItem, U as ListItemProps, V as ListProps, W as Pagination, X as PaginationProps, Y as ProgressBar, Z as ProgressBarProps, _ as PushAlertInput, $ as Separator, a0 as SeparatorProps, a1 as SortContextValue, a2 as SortDirection, a3 as StatCard, a4 as StatCardDirection, a5 as StatCardProps, a6 as StatCardSize, a7 as StatCardTheme, a8 as StatCardVariant, a9 as StatusDot, aa as StatusDotProps, ab as Step, ac as StepProgress, ad as StepProgressProps, ae as Switch, af as SwitchProps, ag as Table, ah as TableActionCell, ai as TableActionCellProps, aj as TableActionItem, ak as TableBody, al as TableBodyProps, am as TableCard, an as TableCell, ao as TableFooter, ap as TableHead, aq as TableHeader, ar as TableRow, as as TableSortableHeader, at as TableSortableHeaderProps, au as TableToolbar, av as TableToolbarProps, aw as Toggle, ax as ToggleGroup, ay as ToggleGroupProps, az as ToggleProps, aA as TrendDirection, aB as persistAlert, aC as statusDotVariants } from './index-p7kVnzRy.js';
9
9
  export { R as RowProps } from './row-CuhTBQhK.js';
10
10
  export { Breadcrumbs, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuContentProps, DropdownMenuGroup, DropdownMenuItem, DropdownMenuItemProps, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuProps, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, DropdownMenuTriggerProps, Link, LinkProps, RouterAdapter, RouterProvider, Sheet, SheetBody, SheetClose, SheetCloseProps, SheetContent, SheetContentProps, SheetDescription, SheetFooter, SheetHeader, SheetProps, SheetTitle, SheetTrigger, SheetTriggerProps, useRouterAdapter } from './navigation.js';
11
11
  export { B as BreadcrumbItemData, N as NavGroup, a as NavItem, b as NavUser, c as NavUserProps, S as SidebarNavItem, d as SidebarSection } from './nav-user-CilmWvtr.js';
@@ -13,7 +13,7 @@ export { AppearanceTabs, AppearanceToggleDropdown } from './settings.js';
13
13
  export { a as User, b as UserMenuContent, U as UserMenuContentProps, c as UserMenuItem } from './user-menu-content-D0Ldzigm.js';
14
14
  export { Heading, TruncatedText, TruncatedTextProps } from './typography.js';
15
15
  export { T as Typography, a as TypographyAlign, b as TypographyProps, c as TypographySize, d as TypographyTheme, e as TypographyTransform, f as TypographyVariant, g as TypographyWeight } from './typography-CTGVc_Gg.js';
16
- export { B as Button, a as ButtonProps, T as Tooltip, b as TooltipContent, c as TooltipContentProps, d as TooltipProps, e as TooltipProvider, f as TooltipTrigger, g as TooltipTriggerProps } from './tooltip-DxO_DWMO.js';
16
+ export { B as Button, a as ButtonProps, T as Tooltip, b as TooltipContent, c as TooltipContentProps, d as TooltipProps, e as TooltipProvider, f as TooltipTrigger, g as TooltipTriggerProps } from './tooltip-DXoSckt9.js';
17
17
  export { UserInfo } from './user.js';
18
18
  export { CONSTELLATION_PORTAL_SELECTOR, getCsrfToken, isInConstellationPortal } from './utils.js';
19
19
  import 'class-variance-authority';
@@ -81,6 +81,44 @@ declare function useAppearance(): {
81
81
 
82
82
  declare function useInitials(): (fullName: string) => string;
83
83
 
84
+ /**
85
+ * Publishes how far an on-screen keyboard reaches up the screen as `--kb`, on
86
+ * the document element. 0 whenever the keyboard is down.
87
+ *
88
+ * ⚠️ THERE IS NO CSS ANSWER TO THIS ON AN IPHONE, and that is why a hook
89
+ * exists for it rather than a stylesheet rule:
90
+ *
91
+ * · `interactive-widget=resizes-content` in the viewport meta is the proper
92
+ * fix — it shrinks the LAYOUT viewport with the keyboard, which keeps a
93
+ * docked band above it with no JavaScript at all. Chrome 108+ and Firefox
94
+ * 132+ implement it; **Safari does not, on any version through iOS 27.1**
95
+ * (checked 2026-09-15). Declare it anyway; it costs nothing where it works.
96
+ * · `env(keyboard-inset-height)` belongs to the VirtualKeyboard API, which is
97
+ * Chromium-only and needs an explicit opt-in.
98
+ *
99
+ * What Safari does instead: the layout viewport keeps its full height and only
100
+ * the VISUAL viewport shrinks. Everything pinned to the bottom therefore stays
101
+ * pinned to a bottom that is now behind the keyboard. So the overlap is
102
+ * measured here, and `AppContentFooter` and `AppContentMain` consume it.
103
+ *
104
+ * --kb = layout height − (what can be seen + how far it has been scrolled)
105
+ *
106
+ * ⚠️ `offsetTop` is in the formula on purpose. iOS scrolls the visual viewport
107
+ * to reveal a focused field, and without that term a band lifts by the whole
108
+ * keyboard while the page has already lifted part of the way — it overshoots on
109
+ * the way in and lands late on the way out.
110
+ *
111
+ * ⚠️ Rounded, and compared before writing. `visualViewport` fires `resize` and
112
+ * `scroll` continuously through the keyboard animation — roughly 60 events a
113
+ * second — and writing the variable on each one re-styles every consumer of it
114
+ * for differences of a fraction of a pixel.
115
+ *
116
+ * `AppShell` calls this once, so an app gets the behaviour by mounting the
117
+ * shell. Calling it again is harmless — the second instance writes the same
118
+ * number — but there is no reason to.
119
+ */
120
+ declare function useKeyboardInset(): void;
121
+
84
122
  declare function useBreakpoint(): {
85
123
  width: number | undefined;
86
124
  isBelow: (value?: number) => boolean;
@@ -117,5 +155,5 @@ declare function useReducedMotion(): boolean;
117
155
  /** For the non-React paths — animation helpers that run outside a component. */
118
156
  declare function prefersReducedMotion(): boolean;
119
157
 
120
- export { AlertContextValue, SidebarContextValue, SortState, initializeMotion, initializeTheme, prefersReducedMotion, useAlerts, useAppearance, useBreakpoint, useFlip, useInitials, useIsMobile, useMotion, useReducedMotion, useSidebar, useTableSorting };
158
+ export { AlertContextValue, SidebarContextValue, SortState, initializeMotion, initializeTheme, prefersReducedMotion, useAlerts, useAppearance, useBreakpoint, useFlip, useInitials, useIsMobile, useKeyboardInset, useMotion, useReducedMotion, useSidebar, useTableSorting };
121
159
  export type { Appearance, DragDropRef, Motion, ResolvedAppearance, UseFlipOptions };
package/dist/index.js CHANGED
@@ -1,14 +1,19 @@
1
+ export { Logo } from './brand/Logo/logo.js';
2
+ export { Checkbox } from './form/Checkbox/checkbox.js';
3
+ export { Combobox } from './form/Combobox/combobox.js';
4
+ export { DatePicker } from './form/DatePicker/date-picker.js';
5
+ export { Input } from './form/Input/input.js';
6
+ export { Label } from './form/Label/label.js';
7
+ export { Select, SelectContent, SelectField, SelectGroup, SelectItem, SelectSeparator, SelectTrigger, SelectValue, __Surface } from './form/Select/select.js';
1
8
  export { useFlip } from './hooks/layout/use-flip.js';
2
9
  export { useSidebar } from './hooks/layout/use-sidebar.js';
3
10
  export { useAlerts } from './hooks/ui/use-alerts.js';
4
11
  export { useTableSorting } from './hooks/ui/use-table-sorting.js';
5
12
  export { initializeTheme, useAppearance } from './hooks/use-appearance.js';
6
13
  export { useInitials } from './hooks/use-initials.js';
14
+ export { useKeyboardInset } from './hooks/use-keyboard-inset.js';
7
15
  export { useBreakpoint, useIsMobile } from './hooks/use-mobile.js';
8
16
  export { initializeMotion, prefersReducedMotion, useMotion, useReducedMotion } from './hooks/use-motion.js';
9
- import './index.css';
10
- export { Alert, AlertBanner, AlertDescription, AlertTitle } from './ui/Alert/alert.js';
11
- export { AlertProvider } from './ui/Alert/alert-provider.js';
12
17
  export { AppContent } from './layout/AppContent/app-content.js';
13
18
  export { AppContentFooter } from './layout/AppContentFooter/app-content-footer.js';
14
19
  export { AppContentMain } from './layout/AppContentMain/app-content-main.js';
@@ -16,44 +21,44 @@ export { AppFooter } from './layout/AppFooter/app-footer.js';
16
21
  export { AppShell } from './layout/AppShell/app-shell.js';
17
22
  export { AppSidebar } from './layout/AppSidebar/app-sidebar.js';
18
23
  export { AppSidebarHeader } from './layout/AppSidebarHeader/app-sidebar-header.js';
19
- export { AppearanceTabs } from './settings/AppearanceTabs/appearance-tabs.js';
24
+ export { Collapse } from './layout/Collapse/collapse.js';
25
+ export { Column } from './layout/Column/column.js';
26
+ export { Container } from './layout/Container/container.js';
27
+ export { Grid } from './layout/Grid/grid.js';
28
+ export { Row } from './layout/Row/row.js';
29
+ export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarTrigger } from './layout/Sidebar/sidebar.js';
30
+ export { Skeleton } from './layout/Skeleton/skeleton.js';
31
+ export { Breadcrumbs } from './navigation/Breadcrumbs/breadcrumbs.js';
32
+ export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from './navigation/DropdownMenu/dropdown-menu.js';
33
+ export { Link } from './navigation/Link/link.js';
34
+ export { NavUser } from './navigation/NavUser/nav-user.js';
35
+ export { RouterProvider, useRouterAdapter } from './navigation/Router/router-context.js';
36
+ export { Sheet, SheetBody, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from './navigation/Sheet/sheet.js';
20
37
  export { AppearanceToggleDropdown } from './settings/AppearanceDropdown/appearance-dropdown.js';
38
+ export { AppearanceTabs } from './settings/AppearanceTabs/appearance-tabs.js';
39
+ import './index.css';
40
+ export { Heading } from './typography/Heading/heading.js';
41
+ export { TruncatedText } from './typography/TruncatedText/truncated-text.js';
42
+ export { Typography } from './typography/Typography/typography.js';
43
+ export { Alert, AlertBanner, AlertDescription, AlertTitle } from './ui/Alert/alert.js';
44
+ export { persistAlert } from './ui/Alert/alert-persist.js';
45
+ export { AlertProvider } from './ui/Alert/alert-provider.js';
21
46
  export { Avatar, AvatarFallback, AvatarImage } from './ui/Avatar/avatar.js';
22
- export { Breadcrumbs } from './navigation/Breadcrumbs/breadcrumbs.js';
23
47
  export { Button } from './ui/Button/button.js';
24
- export { CONSTELLATION_PORTAL_SELECTOR, isInConstellationPortal } from './utils/portal.js';
25
- export { Checkbox } from './form/Checkbox/checkbox.js';
26
48
  export { Chip } from './ui/Chip/chip.js';
49
+ export { ChipSelect } from './ui/ChipSelect/chip-select.js';
27
50
  export { CodeBlock } from './ui/CodeBlock/code-block.js';
28
- export { Collapse } from './layout/Collapse/collapse.js';
29
- export { Column } from './layout/Column/column.js';
30
- export { Combobox } from './form/Combobox/combobox.js';
31
- export { Container } from './layout/Container/container.js';
32
- export { DatePicker } from './form/DatePicker/date-picker.js';
33
51
  export { DevIndicator } from './ui/DevIndicator/dev-indicator.js';
34
52
  export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger } from './ui/Dialog/dialog.js';
35
- export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from './navigation/DropdownMenu/dropdown-menu.js';
36
53
  export { EmptyState } from './ui/EmptyState/empty-state.js';
37
- export { Grid } from './layout/Grid/grid.js';
38
- export { Heading } from './typography/Heading/heading.js';
39
54
  export { Icon } from './ui/Icon/icon.js';
40
- export { Input } from './form/Input/input.js';
41
- export { Label } from './form/Label/label.js';
42
- export { Link } from './navigation/Link/link.js';
43
55
  export { List, ListItem } from './ui/List/list.js';
44
- export { Logo } from './brand/Logo/logo.js';
45
- export { NavUser } from './navigation/NavUser/nav-user.js';
46
56
  export { Pagination } from './ui/Pagination/pagination.js';
47
57
  export { ProgressBar } from './ui/ProgressBar/progress-bar.js';
48
- export { RouterProvider, useRouterAdapter } from './navigation/Router/router-context.js';
49
- export { Row } from './layout/Row/row.js';
50
- export { Select, SelectContent, SelectField, SelectGroup, SelectItem, SelectSeparator, SelectTrigger, SelectValue, __Surface } from './form/Select/select.js';
51
58
  export { Separator } from './ui/Separator/separator.js';
52
- export { Sheet, SheetBody, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from './navigation/Sheet/sheet.js';
53
- export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarTrigger } from './layout/Sidebar/sidebar.js';
54
- export { Skeleton } from './layout/Skeleton/skeleton.js';
55
59
  export { StatCard } from './ui/StatCard/stat-card.js';
56
60
  export { StatusDot } from './ui/StatusDot/status-dot.js';
61
+ export { statusDotVariants } from './ui/StatusDot/status-dot-variants.js';
57
62
  export { StepProgress } from './ui/StepProgress/step-progress.js';
58
63
  export { Switch } from './ui/Switch/switch.js';
59
64
  export { Table, TableBody, TableCard, TableCell, TableFooter, TableHead, TableHeader, TableRow, TableSortableHeader } from './ui/Table/table.js';
@@ -62,11 +67,8 @@ export { TableToolbar } from './ui/TableToolbar/table-toolbar.js';
62
67
  export { Toggle } from './ui/Toggle/toggle.js';
63
68
  export { ToggleGroup } from './ui/ToggleGroup/toggle-group.js';
64
69
  export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './ui/Tooltip/tooltip.js';
65
- export { TruncatedText } from './typography/TruncatedText/truncated-text.js';
66
- export { Typography } from './typography/Typography/typography.js';
67
70
  export { UserInfo } from './user/UserInfo/user-info.js';
68
71
  export { UserMenuContent } from './user/UserMenuContent/user-menu-content.js';
69
72
  export { getCsrfToken } from './utils/csrf.js';
70
- export { persistAlert } from './ui/Alert/alert-persist.js';
71
- export { statusDotVariants } from './ui/StatusDot/status-dot-variants.js';
73
+ export { CONSTELLATION_PORTAL_SELECTOR, isInConstellationPortal } from './utils/portal.js';
72
74
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,9 +1,26 @@
1
+ @charset "UTF-8";
1
2
  .app-content-footer-module_app-content-footer__B1kjp {
2
3
  backdrop-filter: blur(12px);
3
4
  background-color: color-mix(in srgb, var(--background-default) 88%, transparent);
4
5
  border-top: 1px solid var(--divider);
5
6
  flex: 0 0 auto;
6
7
  margin-top: auto;
7
- padding-bottom: env(safe-area-inset-bottom);
8
+ /*
9
+ * Clear of the home indicator, and clear of the keyboard.
10
+ *
11
+ * `--kb` is how far an on-screen keyboard reaches up the screen, published
12
+ * by `useKeyboardInset` (mounted by `AppShell`, so every app gets it). It is
13
+ * 0 whenever the keyboard is down.
14
+ *
15
+ * ⚠️ `max()`, never a sum: while the keyboard is up it covers the home
16
+ * indicator, so the two insets describe the same strip of screen and adding
17
+ * them lifts the band a thumb's width too high.
18
+ *
19
+ * The band grows UPWARD as this grows — it is the last row of a column whose
20
+ * middle row takes the slack — so its contents come to rest exactly on top
21
+ * of the keyboard and the scrolling band keeps what is left.
22
+ */
23
+ padding-bottom: max(env(safe-area-inset-bottom), var(--kb, 0px));
24
+ transition: padding-bottom 180ms ease-out;
8
25
  z-index: var(--z-sticky);
9
26
  }
@@ -1,6 +1,15 @@
1
+ @charset "UTF-8";
1
2
  .app-content-main-module_app-content-main__5IeB4 {
2
3
  flex: 1 1 auto;
3
4
  min-height: 0;
4
5
  overflow-x: hidden;
5
6
  overflow-y: auto;
7
+ /*
8
+ * Room at the foot of the scroll for whatever the keyboard is covering.
9
+ * A browser scrolls a focused field into view against the LAYOUT viewport,
10
+ * which on iOS does not shrink for the keyboard — so a field low in a long
11
+ * page is scrolled to a position that is behind it. `--kb` is 0 with the
12
+ * keyboard down, which makes this a no-op on a desktop.
13
+ */
14
+ scroll-padding-bottom: var(--kb, 0px);
6
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../src/layout/AppShell/app-shell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,kBAAyB,EAAE,EAAE,aAAa,qBAM9E"}
1
+ {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../src/layout/AppShell/app-shell.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,kBAAyB,EAAE,EAAE,aAAa,qBAgB9E"}
@@ -1,7 +1,17 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
+ import { useKeyboardInset } from '../../hooks/use-keyboard-inset.js';
2
3
  import { SidebarProvider } from '../Sidebar/sidebar.js';
3
4
 
4
5
  function AppShell({ children, defaultSidebarOpen = true }) {
6
+ /*
7
+ * Publishes `--kb` — how far an on-screen keyboard reaches up the screen —
8
+ * so the footer band can sit on top of it and the scrolling band can leave
9
+ * room for it. Mounted here because the shell is the one component every app
10
+ * renders exactly once, and because a phone keyboard is a fact about the
11
+ * platform rather than a decision an app should have to re-make. It is inert
12
+ * where `visualViewport` does not exist, which includes the server.
13
+ */
14
+ useKeyboardInset();
5
15
  return (jsx(SidebarProvider, { "data-slot": 'app-shell', defaultOpen: defaultSidebarOpen, children: children }));
6
16
  }
7
17
 
@@ -1 +1 @@
1
- {"version":3,"file":"app-shell.js","sources":["../../../src/layout/AppShell/app-shell.tsx"],"sourcesContent":["import * as React from 'react';\nimport { SidebarProvider } from '../Sidebar';\n\nexport interface AppShellProps {\n children: React.ReactNode;\n /**\n * Initial sidebar state. Persist this server-side (cookie, session) or in\n * localStorage and pass it in, so the sidebar doesn't flash open on load.\n */\n defaultSidebarOpen?: boolean;\n}\n\nexport function AppShell({ children, defaultSidebarOpen = true }: AppShellProps) {\n return (\n <SidebarProvider data-slot={'app-shell'} defaultOpen={defaultSidebarOpen}>\n {children}\n </SidebarProvider>\n );\n}\n"],"names":["_jsx"],"mappings":";;;AAYM,SAAU,QAAQ,CAAC,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,EAAiB,EAAA;AAC7E,IAAA,QACEA,GAAA,CAAC,eAAe,EAAA,EAAA,WAAA,EAAY,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAA,QAAA,EACrE,QAAQ,EAAA,CACO;AAEtB;;"}
1
+ {"version":3,"file":"app-shell.js","sources":["../../../src/layout/AppShell/app-shell.tsx"],"sourcesContent":["import { useKeyboardInset } from '@constellation/hooks/use-keyboard-inset';\nimport * as React from 'react';\nimport { SidebarProvider } from '../Sidebar';\n\nexport interface AppShellProps {\n children: React.ReactNode;\n /**\n * Initial sidebar state. Persist this server-side (cookie, session) or in\n * localStorage and pass it in, so the sidebar doesn't flash open on load.\n */\n defaultSidebarOpen?: boolean;\n}\n\nexport function AppShell({ children, defaultSidebarOpen = true }: AppShellProps) {\n /*\n * Publishes `--kb` — how far an on-screen keyboard reaches up the screen —\n * so the footer band can sit on top of it and the scrolling band can leave\n * room for it. Mounted here because the shell is the one component every app\n * renders exactly once, and because a phone keyboard is a fact about the\n * platform rather than a decision an app should have to re-make. It is inert\n * where `visualViewport` does not exist, which includes the server.\n */\n useKeyboardInset();\n\n return (\n <SidebarProvider data-slot={'app-shell'} defaultOpen={defaultSidebarOpen}>\n {children}\n </SidebarProvider>\n );\n}\n"],"names":["_jsx"],"mappings":";;;;AAaM,SAAU,QAAQ,CAAC,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,EAAiB,EAAA;AAC7E;;;;;;;AAOG;AACH,IAAA,gBAAgB,EAAE;AAElB,IAAA,QACEA,GAAA,CAAC,eAAe,EAAA,EAAA,WAAA,EAAY,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAA,QAAA,EACrE,QAAQ,EAAA,CACO;AAEtB;;"}
@@ -1,12 +1,25 @@
1
+ @charset "UTF-8";
1
2
  .app-sidebar-header-module_app-sidebar-header__h-3UU {
2
3
  border-bottom: 1px solid var(--sidebar-border);
3
4
  flex-shrink: 0;
4
5
  padding: 0 var(--size-0-5);
6
+ /*
7
+ * THE TOP BAND MEETS THE NOTCH, SO THE TOP BAND PAYS FOR IT.
8
+ *
9
+ * On a phone with `viewport-fit=cover` — which an installed web app needs,
10
+ * or every inset reads 0 and iOS letterboxes it in landscape — the page owns
11
+ * the strip behind the status bar. Padding rather than a margin so the
12
+ * header's ground runs up behind the clock the way a native navigation bar
13
+ * does, while its CONTENT clears it. Zero everywhere there is no inset.
14
+ */
15
+ padding-top: env(safe-area-inset-top);
5
16
  transition: all var(--sidebar-transition-duration) var(--sidebar-transition-ease);
6
17
  }
7
18
  @media (min-width: 769px) {
8
19
  .app-sidebar-header-module_app-sidebar-header__h-3UU {
9
- padding: 0 var(--size-1);
20
+ /* ⚠️ Inline only. The shorthand here used to reset `padding-top` to 0 and
21
+ take the safe-area inset with it. */
22
+ padding-inline: var(--size-1);
10
23
  }
11
24
  }
12
25
  .app-sidebar-header-module_app-sidebar-header__h-3UU {
@@ -7,9 +7,38 @@ import { Row } from '../Row/row.js';
7
7
  import { SidebarTrigger } from '../Sidebar/sidebar.js';
8
8
  import { Breadcrumbs } from '../../navigation/Breadcrumbs/breadcrumbs.js';
9
9
  import { NavUser } from '../../navigation/NavUser/nav-user.js';
10
+ import { AppearanceToggleDropdown } from '../../settings/AppearanceDropdown/appearance-dropdown.js';
11
+ import '../../ui/Alert/alert.js';
12
+ import 'react-dom';
13
+ import '../../ui/Alert/alert.css';
14
+ import '../../ui/Avatar/avatar.js';
15
+ import '../../ui/Button/button.js';
16
+ import '../../ui/Chip/chip.js';
17
+ import '../../ui/ChipSelect/chip-select.js';
18
+ import '../../ui/CodeBlock/code-block.js';
10
19
  import cn from 'clsx';
20
+ import '../../ui/DevIndicator/dev-indicator.css';
21
+ import '../../ui/Dialog/dialog.js';
22
+ import '../../ui/EmptyState/empty-state.js';
23
+ import '../../ui/Icon/icon.js';
24
+ import '../../ui/List/list.js';
25
+ import '../../ui/Pagination/pagination.js';
26
+ import '../../ui/ProgressBar/progress-bar.js';
27
+ import '../../ui/Separator/separator.js';
28
+ import '../../ui/StatCard/stat-card.js';
29
+ import '../../ui/StatusDot/status-dot.js';
30
+ import '../../ui/StatusDot/status-dot-variants.js';
31
+ import '../../ui/StepProgress/step-progress.js';
32
+ import '../../ui/Switch/switch.js';
33
+ import '../../ui/Table/table.js';
34
+ import '../../ui/TableActionCell/table-action-cell.js';
35
+ import '../../ui/TableToolbar/table-toolbar.js';
36
+ import '../../ui/Toggle/toggle.js';
37
+ import '../../ui/ToggleGroup/toggle-group.js';
38
+ import '../../ui/Tooltip/tooltip.js';
39
+ import 'lucide-react';
40
+ import '../../settings/AppearanceTabs/appearance-tabs.css';
11
41
  import s from './app-sidebar-header.module.scss.js';
12
- import { AppearanceToggleDropdown } from '../../settings/AppearanceDropdown/appearance-dropdown.js';
13
42
 
14
43
  /**
15
44
  * The header band of a content area.
@@ -1 +1 @@
1
- {"version":3,"file":"app-sidebar-header.js","sources":["../../../src/layout/AppSidebarHeader/app-sidebar-header.tsx"],"sourcesContent":["import { useSidebar } from '@constellation/hooks';\nimport { Row } from '@constellation/layout/Row';\nimport { SidebarTrigger } from '@constellation/layout/Sidebar';\nimport { Breadcrumbs } from '@constellation/navigation/Breadcrumbs';\nimport { NavUser, type NavUserProps } from '@constellation/navigation/NavUser';\nimport { AppearanceToggleDropdown } from '@constellation/settings';\nimport { type BreadcrumbItemData } from '@constellation/types';\nimport cn from 'clsx';\nimport * as React from 'react';\nimport s from './app-sidebar-header.module.scss';\n\nexport interface AppSidebarHeaderProps extends React.HTMLAttributes<HTMLElement> {\n breadcrumbs?: BreadcrumbItemData[];\n /** Omit to hide the account menu (e.g. on signed-out chrome). */\n user?: NavUserProps['user'];\n userMenu?: Omit<NavUserProps, 'user'>;\n /** Extra controls between the appearance toggle and the account menu. */\n actions?: React.ReactNode;\n}\n\n/**\n * The header band of a content area.\n *\n * `className` and any other DOM props reach the `header` element. They used to\n * be dropped on the floor — the component took four named props and spread\n * nothing — so a caller passing `className` got no error and no class, and\n * spent the difference looking at its own stylesheet.\n */\nexport function AppSidebarHeader({\n breadcrumbs = [],\n user,\n userMenu,\n actions,\n className,\n ...props\n}: AppSidebarHeaderProps) {\n const { state } = useSidebar();\n\n return (\n <Row\n data-slot={'app-sidebar-header'}\n el={'header'}\n align={'center'}\n gap={1}\n justify={'space-between'}\n className={cn(\n s['app-sidebar-header'],\n state === 'collapsed' && s['sidebar-header-collapsed'],\n className,\n )}\n {...props}\n >\n <Row gap={1}>\n <SidebarTrigger />\n <Breadcrumbs breadcrumbs={breadcrumbs} />\n </Row>\n <Row gap={1} align={'center'}>\n {actions}\n <AppearanceToggleDropdown />\n {user && <NavUser user={user} {...userMenu} />}\n </Row>\n </Row>\n );\n}\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;AAoBA;;;;;;;AAOG;SACa,gBAAgB,CAAC,EAC/B,WAAW,GAAG,EAAE,EAChB,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,SAAS,EACT,GAAG,KAAK,EACc,EAAA;AACtB,IAAA,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE;IAE9B,QACEA,KAAC,GAAG,EAAA,EAAA,WAAA,EACS,oBAAoB,EAC/B,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,CAAC,EACN,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,EAAE,CACX,CAAC,CAAC,oBAAoB,CAAC,EACvB,KAAK,KAAK,WAAW,IAAI,CAAC,CAAC,0BAA0B,CAAC,EACtD,SAAS,CACV,EAAA,GACG,KAAK,EAAA,QAAA,EAAA,CAETA,IAAA,CAAC,GAAG,EAAA,EAAC,GAAG,EAAE,CAAC,aACTC,GAAA,CAAC,cAAc,KAAG,EAClBA,GAAA,CAAC,WAAW,EAAA,EAAC,WAAW,EAAE,WAAW,EAAA,CAAI,IACrC,EACND,IAAA,CAAC,GAAG,EAAA,EAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAA,QAAA,EAAA,CACzB,OAAO,EACRC,GAAA,CAAC,wBAAwB,EAAA,EAAA,CAAG,EAC3B,IAAI,IAAIA,GAAA,CAAC,OAAO,EAAA,EAAC,IAAI,EAAE,IAAI,EAAA,GAAM,QAAQ,EAAA,CAAI,CAAA,EAAA,CAC1C,CAAA,EAAA,CACF;AAEV;;"}
1
+ {"version":3,"file":"app-sidebar-header.js","sources":["../../../src/layout/AppSidebarHeader/app-sidebar-header.tsx"],"sourcesContent":["import { useSidebar } from '@constellation/hooks';\nimport { Row } from '@constellation/layout/Row';\nimport { SidebarTrigger } from '@constellation/layout/Sidebar';\nimport { Breadcrumbs } from '@constellation/navigation/Breadcrumbs';\nimport { NavUser, type NavUserProps } from '@constellation/navigation/NavUser';\nimport { AppearanceToggleDropdown } from '@constellation/settings';\nimport { type BreadcrumbItemData } from '@constellation/types';\nimport cn from 'clsx';\nimport * as React from 'react';\nimport s from './app-sidebar-header.module.scss';\n\nexport interface AppSidebarHeaderProps extends React.HTMLAttributes<HTMLElement> {\n breadcrumbs?: BreadcrumbItemData[];\n /** Omit to hide the account menu (e.g. on signed-out chrome). */\n user?: NavUserProps['user'];\n userMenu?: Omit<NavUserProps, 'user'>;\n /** Extra controls between the appearance toggle and the account menu. */\n actions?: React.ReactNode;\n}\n\n/**\n * The header band of a content area.\n *\n * `className` and any other DOM props reach the `header` element. They used to\n * be dropped on the floor — the component took four named props and spread\n * nothing — so a caller passing `className` got no error and no class, and\n * spent the difference looking at its own stylesheet.\n */\nexport function AppSidebarHeader({\n breadcrumbs = [],\n user,\n userMenu,\n actions,\n className,\n ...props\n}: AppSidebarHeaderProps) {\n const { state } = useSidebar();\n\n return (\n <Row\n data-slot={'app-sidebar-header'}\n el={'header'}\n align={'center'}\n gap={1}\n justify={'space-between'}\n className={cn(\n s['app-sidebar-header'],\n state === 'collapsed' && s['sidebar-header-collapsed'],\n className,\n )}\n {...props}\n >\n <Row gap={1}>\n <SidebarTrigger />\n <Breadcrumbs breadcrumbs={breadcrumbs} />\n </Row>\n <Row gap={1} align={'center'}>\n {actions}\n <AppearanceToggleDropdown />\n {user && <NavUser user={user} {...userMenu} />}\n </Row>\n </Row>\n );\n}\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA;;;;;;;AAOG;SACa,gBAAgB,CAAC,EAC/B,WAAW,GAAG,EAAE,EAChB,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,SAAS,EACT,GAAG,KAAK,EACc,EAAA;AACtB,IAAA,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE;IAE9B,QACEA,KAAC,GAAG,EAAA,EAAA,WAAA,EACS,oBAAoB,EAC/B,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,CAAC,EACN,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,EAAE,CACX,CAAC,CAAC,oBAAoB,CAAC,EACvB,KAAK,KAAK,WAAW,IAAI,CAAC,CAAC,0BAA0B,CAAC,EACtD,SAAS,CACV,EAAA,GACG,KAAK,EAAA,QAAA,EAAA,CAETA,IAAA,CAAC,GAAG,EAAA,EAAC,GAAG,EAAE,CAAC,aACTC,GAAA,CAAC,cAAc,KAAG,EAClBA,GAAA,CAAC,WAAW,EAAA,EAAC,WAAW,EAAE,WAAW,EAAA,CAAI,IACrC,EACND,IAAA,CAAC,GAAG,EAAA,EAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAA,QAAA,EAAA,CACzB,OAAO,EACRC,GAAA,CAAC,wBAAwB,EAAA,EAAA,CAAG,EAC3B,IAAI,IAAIA,GAAA,CAAC,OAAO,EAAA,EAAC,IAAI,EAAE,IAAI,EAAA,GAAM,QAAQ,EAAA,CAAI,CAAA,EAAA,CAC1C,CAAA,EAAA,CACF;AAEV;;"}
@@ -1,3 +1,4 @@
1
+ @charset "UTF-8";
1
2
  :root {
2
3
  --sidebar-collapsed-gap: 0.5rem;
3
4
  --sidebar-transition-duration: 200ms;
@@ -8,6 +9,28 @@
8
9
  display: flex;
9
10
  min-height: 100svh;
10
11
  width: 100%;
12
+ /*
13
+ * INSTALLED, THE SHELL IS PINNED RATHER THAN SIZED.
14
+ *
15
+ * WebKit in iOS 26 undercounts `100dvh`, `innerHeight` and
16
+ * `visualViewport.height` by exactly the top safe-area inset when a site is
17
+ * running as a home-screen app — so a shell sized in viewport units comes up
18
+ * 47-59px short and everything anchored to the bottom (a docked search band,
19
+ * a toolbar) sits above the real edge of the screen. A box pinned by both
20
+ * edges has no height to get wrong.
21
+ *
22
+ * Scoped to `display-mode` on purpose. In a browser tab the shell stays in
23
+ * normal flow, because a consumer may well have page chrome above or below
24
+ * it and `position: fixed` would take the whole document out from under
25
+ * them; installed, there is nothing else on the screen by definition.
26
+ */
27
+ }
28
+ @media (display-mode: standalone), (display-mode: fullscreen) {
29
+ .sidebar-module_sidebar-wrapper__vmUud {
30
+ inset: 0;
31
+ min-height: 0;
32
+ position: fixed;
33
+ }
11
34
  }
12
35
  .sidebar-module_sidebar-wrapper__vmUud.sidebar-module_inset__I909E {
13
36
  background: var(--sidebar);
@@ -99,6 +122,15 @@
99
122
  flex: 1 1 auto;
100
123
  flex-direction: column;
101
124
  height: 100svh;
125
+ /* Fills the pinned wrapper above rather than measuring the viewport a second
126
+ time — `100svh` is the measurement iOS 26 gets wrong. */
127
+ }
128
+ @media (display-mode: standalone), (display-mode: fullscreen) {
129
+ .sidebar-module_sidebar-inset__DVzuf {
130
+ height: 100%;
131
+ }
132
+ }
133
+ .sidebar-module_sidebar-inset__DVzuf {
102
134
  max-width: 100%;
103
135
  min-width: 0;
104
136
  position: relative;
package/dist/layout.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- export { A as AppContent, a as AppContentFooter, b as AppContentFooterProps, c as AppContentMain, d as AppContentMainProps, e as AppFooter, f as AppFooterProps, g as AppShell, h as AppShellProps, i as AppSidebar, j as AppSidebarHeader, k as AppSidebarHeaderProps, l as AppSidebarProps, C as Collapse, m as CollapseProps, n as Column, o as ColumnProps, p as Container, G as Grid, R as Row, t as Sidebar, u as SidebarContent, v as SidebarFooter, w as SidebarGroup, x as SidebarGroupAction, y as SidebarGroupContent, z as SidebarGroupLabel, B as SidebarHeader, D as SidebarInput, E as SidebarInset, F as SidebarMenu, H as SidebarMenuAction, I as SidebarMenuBadge, J as SidebarMenuButton, K as SidebarMenuItem, L as SidebarMenuSkeleton, M as SidebarMenuSub, N as SidebarMenuSubButton, O as SidebarMenuSubItem, P as SidebarProvider, Q as SidebarRail, T as SidebarTrigger, V as Skeleton } from './index-BxBAq63A.js';
1
+ export { A as AppContent, a as AppContentFooter, b as AppContentFooterProps, c as AppContentMain, d as AppContentMainProps, e as AppFooter, f as AppFooterProps, g as AppShell, h as AppShellProps, i as AppSidebar, j as AppSidebarHeader, k as AppSidebarHeaderProps, l as AppSidebarProps, C as Collapse, m as CollapseProps, n as Column, o as ColumnProps, p as Container, G as Grid, R as Row, t as Sidebar, u as SidebarContent, v as SidebarFooter, w as SidebarGroup, x as SidebarGroupAction, y as SidebarGroupContent, z as SidebarGroupLabel, B as SidebarHeader, D as SidebarInput, E as SidebarInset, F as SidebarMenu, H as SidebarMenuAction, I as SidebarMenuBadge, J as SidebarMenuButton, K as SidebarMenuItem, L as SidebarMenuSkeleton, M as SidebarMenuSub, N as SidebarMenuSubButton, O as SidebarMenuSubItem, P as SidebarProvider, Q as SidebarRail, T as SidebarTrigger, V as Skeleton } from './index-DxbOGj5Y.js';
2
2
  export { R as RowProps } from './row-CuhTBQhK.js';
3
3
  import 'react';
4
4
  import './nav-user-CilmWvtr.js';
5
5
  import 'lucide-react';
6
6
  import './user-menu-content-D0Ldzigm.js';
7
7
  import './input-Cp5LET5i.js';
8
- import './tooltip-DxO_DWMO.js';
8
+ import './tooltip-DXoSckt9.js';
9
9
  import 'class-variance-authority';
10
10
  import 'class-variance-authority/types';
@@ -1,10 +1,10 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { SidebarMenuButton } from '../../layout/Sidebar/sidebar.js';
3
3
  import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent } from '../DropdownMenu/dropdown-menu.js';
4
- import { ChevronsUpDownIcon } from 'lucide-react';
5
- import s from './nav-user.module.scss.js';
6
4
  import { UserInfo } from '../../user/UserInfo/user-info.js';
7
5
  import { UserMenuContent } from '../../user/UserMenuContent/user-menu-content.js';
6
+ import { ChevronsUpDownIcon } from 'lucide-react';
7
+ import s from './nav-user.module.scss.js';
8
8
 
9
9
  /** Sidebar footer control: the signed-in user plus their account menu. */
10
10
  function NavUser({ user, ...menuProps }) {
@@ -128,6 +128,17 @@
128
128
  display: flex;
129
129
  flex-direction: column;
130
130
  overflow: hidden;
131
+ /*
132
+ * A sheet is its own layer over the whole page, pinned edge to edge, so it
133
+ * meets the notch and the home indicator itself — nothing above it in the
134
+ * tree can pay for them on its behalf. Without this the title of a
135
+ * full-height sheet sits under the status bar on a phone.
136
+ *
137
+ * Padding, so the sheet's ground still runs all the way to the edge of the
138
+ * screen. Zero everywhere there is no inset, which is every desktop.
139
+ */
140
+ padding-bottom: env(safe-area-inset-bottom);
141
+ padding-top: env(safe-area-inset-top);
131
142
  position: fixed;
132
143
  z-index: var(--z-modal);
133
144
  }
@@ -137,6 +148,15 @@
137
148
  min-height: 0;
138
149
  overflow-y: auto;
139
150
  padding: 0 1rem 1rem;
151
+ /*
152
+ * Room for the keyboard, for the same reason `AppContentMain` has it: a
153
+ * browser scrolls a focused field into view against the LAYOUT viewport,
154
+ * which on iOS does not shrink for the keyboard — so a field low in a long
155
+ * sheet is scrolled to a position behind it. `--kb` is 0 with the keyboard
156
+ * down, so this is a no-op on a desktop.
157
+ */
158
+ padding-bottom: calc(1rem + var(--kb, 0px));
159
+ scroll-padding-bottom: var(--kb, 0px);
140
160
  }
141
161
 
142
162
  .sheet-module_content-right__pLrfN {