@k2b/ui 0.25.0 → 0.27.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 (111) hide show
  1. package/dist/browser/actions/GestureMenu.js +2 -2
  2. package/dist/browser/actions/GestureMenu.js.map +1 -1
  3. package/dist/browser/chat/ChatComposer.js +811 -406
  4. package/dist/browser/chat/ChatComposer.js.map +1 -1
  5. package/dist/browser/chat/chat-behavior.js +4 -0
  6. package/dist/browser/chat/chat-behavior.js.map +1 -1
  7. package/dist/browser/chat/chat-messages.js +14 -0
  8. package/dist/browser/chat/chat-messages.js.map +1 -1
  9. package/dist/browser/chat/command-search.js +170 -0
  10. package/dist/browser/chat/command-search.js.map +1 -0
  11. package/dist/browser/chat/composer-document.js +1 -1
  12. package/dist/browser/chat/composer-document.js.map +1 -1
  13. package/dist/browser/chat/index.js.map +1 -1
  14. package/dist/browser/content/Calendar.js +8 -7
  15. package/dist/browser/content/Calendar.js.map +1 -1
  16. package/dist/browser/content/CalendarDayView.js +32 -6
  17. package/dist/browser/content/CalendarDayView.js.map +1 -1
  18. package/dist/browser/content/CalendarWeekView.js +4 -3
  19. package/dist/browser/content/CalendarWeekView.js.map +1 -1
  20. package/dist/browser/content/Timeline.js +3 -3
  21. package/dist/browser/content/Timeline.js.map +1 -1
  22. package/dist/browser/content/calendar-time-view.js +0 -1
  23. package/dist/browser/content/calendar-time-view.js.map +1 -1
  24. package/dist/browser/index.js +1 -0
  25. package/dist/browser/index.js.map +1 -1
  26. package/dist/browser/inputs/Combobox.js +26 -5
  27. package/dist/browser/inputs/Combobox.js.map +1 -1
  28. package/dist/browser/inputs/QrScanner.js +2 -1
  29. package/dist/browser/inputs/QrScanner.js.map +1 -1
  30. package/dist/browser/inputs/SelectChip.js +43 -12
  31. package/dist/browser/inputs/SelectChip.js.map +1 -1
  32. package/dist/browser/layout/AppWorkspace.js +720 -528
  33. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  34. package/dist/browser/layout/BottomSheet.js +8 -0
  35. package/dist/browser/layout/BottomSheet.js.map +1 -1
  36. package/dist/browser/layout/app-workspace-controller.js +159 -27
  37. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  38. package/dist/browser/layout/app-workspace-state.js +5 -1
  39. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  40. package/dist/browser/layout/index.js +1 -1
  41. package/dist/browser/layout/index.js.map +1 -1
  42. package/dist/browser/layout/scroll-fade.js +14 -9
  43. package/dist/browser/layout/scroll-fade.js.map +1 -1
  44. package/dist/browser/layout/sidebar-scroll-memory.js +38 -0
  45. package/dist/browser/layout/sidebar-scroll-memory.js.map +1 -0
  46. package/dist/browser/motion.js +7 -0
  47. package/dist/browser/motion.js.map +1 -0
  48. package/dist/ssr/actions/GestureMenu.js +2 -2
  49. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  50. package/dist/ssr/chat/ChatComposer.js +410 -93
  51. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  52. package/dist/ssr/chat/chat-behavior.js +4 -0
  53. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  54. package/dist/ssr/chat/chat-messages.js +14 -0
  55. package/dist/ssr/chat/chat-messages.js.map +1 -1
  56. package/dist/ssr/chat/command-search.js +170 -0
  57. package/dist/ssr/chat/command-search.js.map +1 -0
  58. package/dist/ssr/chat/composer-document.js +1 -1
  59. package/dist/ssr/chat/composer-document.js.map +1 -1
  60. package/dist/ssr/chat/index.js.map +1 -1
  61. package/dist/ssr/content/Calendar.js +8 -7
  62. package/dist/ssr/content/Calendar.js.map +1 -1
  63. package/dist/ssr/content/CalendarDayView.js +32 -6
  64. package/dist/ssr/content/CalendarDayView.js.map +1 -1
  65. package/dist/ssr/content/CalendarWeekView.js +4 -3
  66. package/dist/ssr/content/CalendarWeekView.js.map +1 -1
  67. package/dist/ssr/content/Timeline.js +3 -3
  68. package/dist/ssr/content/Timeline.js.map +1 -1
  69. package/dist/ssr/content/calendar-time-view.js +0 -1
  70. package/dist/ssr/content/calendar-time-view.js.map +1 -1
  71. package/dist/ssr/index.js +1 -0
  72. package/dist/ssr/index.js.map +1 -1
  73. package/dist/ssr/inputs/Combobox.js +22 -5
  74. package/dist/ssr/inputs/Combobox.js.map +1 -1
  75. package/dist/ssr/inputs/QrScanner.js +2 -1
  76. package/dist/ssr/inputs/QrScanner.js.map +1 -1
  77. package/dist/ssr/inputs/SelectChip.js +35 -11
  78. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  79. package/dist/ssr/layout/AppWorkspace.js +254 -118
  80. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  81. package/dist/ssr/layout/BottomSheet.js +8 -0
  82. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  83. package/dist/ssr/layout/app-workspace-controller.js +159 -27
  84. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  85. package/dist/ssr/layout/app-workspace-state.js +5 -1
  86. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  87. package/dist/ssr/layout/index.js +1 -1
  88. package/dist/ssr/layout/index.js.map +1 -1
  89. package/dist/ssr/layout/scroll-fade.js +14 -9
  90. package/dist/ssr/layout/scroll-fade.js.map +1 -1
  91. package/dist/ssr/layout/sidebar-scroll-memory.js +38 -0
  92. package/dist/ssr/layout/sidebar-scroll-memory.js.map +1 -0
  93. package/dist/ssr/motion.js +7 -0
  94. package/dist/ssr/motion.js.map +1 -0
  95. package/dist/styles.css +1 -1
  96. package/dist/types/chat/ChatComposer.d.ts +44 -2
  97. package/dist/types/chat/chat-behavior.d.ts +4 -0
  98. package/dist/types/chat/chat-messages.d.ts +7 -0
  99. package/dist/types/chat/command-search.d.ts +39 -0
  100. package/dist/types/chat/index.d.ts +1 -1
  101. package/dist/types/content/calendar-time-view.d.ts +0 -1
  102. package/dist/types/index.d.ts +1 -0
  103. package/dist/types/inputs/Combobox.d.ts +1 -0
  104. package/dist/types/inputs/SelectChip.d.ts +4 -0
  105. package/dist/types/layout/AppWorkspace.d.ts +13 -1
  106. package/dist/types/layout/BottomSheet.d.ts +8 -0
  107. package/dist/types/layout/index.d.ts +1 -1
  108. package/dist/types/layout/scroll-fade.d.ts +2 -0
  109. package/dist/types/layout/sidebar-scroll-memory.d.ts +6 -0
  110. package/dist/types/motion.d.ts +6 -0
  111. package/package.json +4 -4
@@ -18,6 +18,10 @@ export const APP_WORKSPACE_MAIN_MIN_HEIGHT = 240;
18
18
  export const APP_WORKSPACE_PANE_DEFAULT = 320;
19
19
  export const APP_WORKSPACE_PANE_MIN = 240;
20
20
  export const APP_WORKSPACE_PANE_MAX = 640;
21
+
22
+ /** Persistence envelope; each pane still applies its own runtime limits. */
23
+ const APP_WORKSPACE_PANE_STATE_MIN = 160;
24
+ const APP_WORKSPACE_PANE_STATE_MAX = 960;
21
25
  export const appWorkspaceResizeLimits = options => {
22
26
  const min = options.min ?? (options.kind === "sidebar" ? options.sidebarCollapsible ? APP_WORKSPACE_SIDEBAR_COLLAPSED : APP_WORKSPACE_SIDEBAR_MIN : options.kind === "detail" ? APP_WORKSPACE_DETAIL_MIN : options.kind === "pane" ? APP_WORKSPACE_PANE_MIN : APP_WORKSPACE_DRAWER_MIN);
23
27
  const configuredMax = options.max ?? (options.kind === "sidebar" ? APP_WORKSPACE_SIDEBAR_MAX : options.kind === "detail" ? APP_WORKSPACE_DETAIL_MAX : options.kind === "pane" ? APP_WORKSPACE_PANE_MAX : APP_WORKSPACE_DRAWER_MAX);
@@ -89,7 +93,7 @@ export const normalizeAppWorkspaceLayoutState = value => {
89
93
  // Keyed panel maps only exist from version 2 on; a version-1 payload that
90
94
  // carries them was not written by this component and is not trusted.
91
95
  const legacy = candidate.version === 1;
92
- const paneWidths = legacy ? undefined : normalizeSizes(candidate.paneWidths, APP_WORKSPACE_PANE_MIN, APP_WORKSPACE_PANE_MAX);
96
+ const paneWidths = legacy ? undefined : normalizeSizes(candidate.paneWidths, APP_WORKSPACE_PANE_STATE_MIN, APP_WORKSPACE_PANE_STATE_MAX);
93
97
  const detailWidths = legacy ? (() => {
94
98
  const width = finiteSize(candidate.detailWidth, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DETAIL_MAX);
95
99
  return width === undefined ? undefined : {
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["layout/app-workspace-state.ts"],"sourcesContent":["export type AppWorkspaceLayoutState = {\n version: 2;\n sidebarWidth?: number;\n sidebarCollapsed?: boolean;\n paneWidths?: Record<string, number>;\n detailWidths?: Record<string, number>;\n drawerHeights?: Record<string, number>;\n};\n\nexport const APP_WORKSPACE_SIDEBAR_DEFAULT = 208;\nexport const APP_WORKSPACE_SIDEBAR_COLLAPSED = 64;\nexport const APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD = 128;\nexport const APP_WORKSPACE_SIDEBAR_MIN = 176;\nexport const APP_WORKSPACE_SIDEBAR_MAX = 360;\n/** Absolute persistence envelope for sidebars with an app-defined wider max. */\nconst APP_WORKSPACE_SIDEBAR_STATE_MAX = 960;\n/** The floating detail panel starts at 26 rem and keeps between 20 and 40 rem. */\nexport const APP_WORKSPACE_DETAIL_DEFAULT = 416;\nexport const APP_WORKSPACE_DETAIL_MIN = 320;\nexport const APP_WORKSPACE_DETAIL_MAX = 640;\nexport const APP_WORKSPACE_DRAWER_DEFAULT = 240;\nexport const APP_WORKSPACE_DRAWER_MIN = 160;\nexport const APP_WORKSPACE_DRAWER_MAX = 560;\n/** Space `appWorkspaceResizeLimits` always reserves for the main region. */\nexport const APP_WORKSPACE_MAIN_MIN = 320;\nexport const APP_WORKSPACE_MAIN_MIN_HEIGHT = 240;\nexport const APP_WORKSPACE_PANE_DEFAULT = 320;\nexport const APP_WORKSPACE_PANE_MIN = 240;\nexport const APP_WORKSPACE_PANE_MAX = 640;\n\nexport type AppWorkspaceResizeKind = \"sidebar\" | \"pane\" | \"detail\" | \"drawer\";\n\nexport const appWorkspaceResizeLimits = (options: {\n kind: AppWorkspaceResizeKind;\n workspaceSize: number;\n reservedSize: number;\n min?: number;\n max?: number;\n sidebarCollapsible?: boolean;\n}): { min: number; max: number } => {\n const min =\n options.min ??\n (options.kind === \"sidebar\"\n ? options.sidebarCollapsible\n ? APP_WORKSPACE_SIDEBAR_COLLAPSED\n : APP_WORKSPACE_SIDEBAR_MIN\n : options.kind === \"detail\"\n ? APP_WORKSPACE_DETAIL_MIN\n : options.kind === \"pane\"\n ? APP_WORKSPACE_PANE_MIN\n : APP_WORKSPACE_DRAWER_MIN);\n const configuredMax =\n options.max ??\n (options.kind === \"sidebar\"\n ? APP_WORKSPACE_SIDEBAR_MAX\n : options.kind === \"detail\"\n ? APP_WORKSPACE_DETAIL_MAX\n : options.kind === \"pane\"\n ? APP_WORKSPACE_PANE_MAX\n : APP_WORKSPACE_DRAWER_MAX);\n const mainMinimum = options.kind === \"drawer\" ? APP_WORKSPACE_MAIN_MIN_HEIGHT : APP_WORKSPACE_MAIN_MIN;\n return { min, max: Math.max(min, Math.min(configuredMax, options.workspaceSize - options.reservedSize - mainMinimum)) };\n};\n\n/**\n * Fits preferred auxiliary pane widths into a shared budget without giving\n * DOM order priority. Minimums are reserved first; remaining space is shared\n * in proportion to how much each pane still needs to reach its preference.\n */\nexport const fitAppWorkspacePaneSizes = (panes: ReadonlyArray<{ desired: number; min: number }>, availableSize: number): number[] => {\n const sizes = panes.map((pane) => pane.min);\n const minimumTotal = sizes.reduce((total, size) => total + size, 0);\n const desiredTotal = panes.reduce((total, pane) => total + pane.desired, 0);\n const budget = Math.max(0, Math.floor(availableSize));\n if (desiredTotal <= budget) return panes.map((pane) => pane.desired);\n if (budget <= minimumTotal) return sizes;\n\n const extraBudget = budget - minimumTotal;\n const desiredExtra = desiredTotal - minimumTotal;\n const fractions = panes.map((pane, index) => {\n const raw = ((pane.desired - pane.min) * extraBudget) / desiredExtra;\n const extra = Math.floor(raw);\n sizes[index]! += extra;\n return { fraction: raw - extra, index };\n });\n let remainder = extraBudget - sizes.reduce((total, size, index) => total + size - panes[index]!.min, 0);\n fractions.sort((a, b) => b.fraction - a.fraction || a.index - b.index);\n for (const { index } of fractions) {\n if (remainder-- <= 0) break;\n sizes[index]! += 1;\n }\n return sizes;\n};\n\nexport const shouldCollapseAppWorkspaceSidebar = (width: number, collapsible: boolean): boolean =>\n collapsible && width < APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD;\n\nexport const resolveAppWorkspaceSidebarWidth = (\n width: number,\n maxWidth: number,\n collapsible: boolean,\n): { width: number; collapsed: boolean } =>\n shouldCollapseAppWorkspaceSidebar(width, collapsible)\n ? { width: APP_WORKSPACE_SIDEBAR_COLLAPSED, collapsed: true }\n : { width: Math.round(Math.min(maxWidth, Math.max(APP_WORKSPACE_SIDEBAR_MIN, width))), collapsed: false };\n\nconst finiteSize = (value: unknown, min: number, max: number) =>\n typeof value === \"number\" && Number.isFinite(value) ? Math.round(Math.min(max, Math.max(min, value))) : undefined;\n\nexport const safeAppWorkspacePanelId = (panelId: string): string => (isStableUiId(panelId) ? panelId : \"\");\n\nconst normalizeSizes = (value: unknown, min: number, max: number) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n const entries = Object.entries(value)\n .slice(0, 16)\n .flatMap(([key, size]) => {\n const normalized = finiteSize(size, min, max);\n return isStableUiId(key) && normalized !== undefined ? [[key, normalized] as const] : [];\n });\n return entries.length ? Object.fromEntries(entries) : undefined;\n};\n\nexport const appWorkspacePanelVariable = (kind: \"pane\" | \"detail\" | \"drawer\", panelId: string): string =>\n `--k2b-workspace-${kind}-${assertStableUiId(panelId, \"AppWorkspace panel id\")}-${kind === \"drawer\" ? \"height\" : \"width\"}`;\n\nexport const normalizeAppWorkspaceLayoutState = (value: unknown): AppWorkspaceLayoutState | null => {\n if (!value || typeof value !== \"object\") return null;\n const candidate = value as Record<string, unknown>;\n if (candidate.version !== 1 && candidate.version !== 2) return null;\n const sidebarWidth = finiteSize(candidate.sidebarWidth, APP_WORKSPACE_SIDEBAR_MIN, APP_WORKSPACE_SIDEBAR_STATE_MAX);\n const sidebarCollapsed = typeof candidate.sidebarCollapsed === \"boolean\" ? candidate.sidebarCollapsed : undefined;\n // Keyed panel maps only exist from version 2 on; a version-1 payload that\n // carries them was not written by this component and is not trusted.\n const legacy = candidate.version === 1;\n const paneWidths = legacy ? undefined : normalizeSizes(candidate.paneWidths, APP_WORKSPACE_PANE_MIN, APP_WORKSPACE_PANE_MAX);\n const detailWidths = legacy\n ? (() => {\n const width = finiteSize(candidate.detailWidth, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DETAIL_MAX);\n return width === undefined ? undefined : { primary: width };\n })()\n : normalizeSizes(candidate.detailWidths, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DETAIL_MAX);\n const drawerHeights = legacy ? undefined : normalizeSizes(candidate.drawerHeights, APP_WORKSPACE_DRAWER_MIN, APP_WORKSPACE_DRAWER_MAX);\n return sidebarWidth === undefined && sidebarCollapsed === undefined && !paneWidths && !detailWidths && !drawerHeights\n ? null\n : { version: 2, sidebarWidth, sidebarCollapsed, paneWidths, detailWidths, drawerHeights };\n};\n\nexport const parseAppWorkspaceLayoutState = (value: string | null | undefined): AppWorkspaceLayoutState | null => {\n if (!value) return null;\n try {\n return normalizeAppWorkspaceLayoutState(JSON.parse(decodeURIComponent(value)));\n } catch {\n return null;\n }\n};\n\nexport const serializeAppWorkspaceLayoutState = (state: AppWorkspaceLayoutState): string =>\n encodeURIComponent(JSON.stringify(normalizeAppWorkspaceLayoutState(state) ?? { version: 2 }));\n\nexport const appWorkspaceLayoutStyle = (state: AppWorkspaceLayoutState | null | undefined): string | undefined => {\n if (!state) return undefined;\n const declarations = [\n state.sidebarCollapsed\n ? `--k2b-workspace-sidebar-width:${APP_WORKSPACE_SIDEBAR_COLLAPSED}px`\n : state.sidebarWidth === undefined\n ? null\n : `--k2b-workspace-sidebar-width:${state.sidebarWidth}px`,\n ...Object.entries(state.paneWidths ?? {}).map(([id, width]) => `${appWorkspacePanelVariable(\"pane\", id)}:${width}px`),\n ...Object.entries(state.detailWidths ?? {}).map(([id, width]) => `${appWorkspacePanelVariable(\"detail\", id)}:${width}px`),\n ...Object.entries(state.drawerHeights ?? {}).map(([id, height]) => `${appWorkspacePanelVariable(\"drawer\", id)}:${height}px`),\n ].filter(Boolean);\n return declarations.length ? declarations.join(\";\") : undefined;\n};\n\nimport { assertStableUiId, isStableUiId } from \"./stable-id\";\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/app-workspace-state.ts"],"sourcesContent":["export type AppWorkspaceLayoutState = {\n version: 2;\n sidebarWidth?: number;\n sidebarCollapsed?: boolean;\n paneWidths?: Record<string, number>;\n detailWidths?: Record<string, number>;\n drawerHeights?: Record<string, number>;\n};\n\nexport const APP_WORKSPACE_SIDEBAR_DEFAULT = 208;\nexport const APP_WORKSPACE_SIDEBAR_COLLAPSED = 64;\nexport const APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD = 128;\nexport const APP_WORKSPACE_SIDEBAR_MIN = 176;\nexport const APP_WORKSPACE_SIDEBAR_MAX = 360;\n/** Absolute persistence envelope for sidebars with an app-defined wider max. */\nconst APP_WORKSPACE_SIDEBAR_STATE_MAX = 960;\n/** The floating detail panel starts at 26 rem and keeps between 20 and 40 rem. */\nexport const APP_WORKSPACE_DETAIL_DEFAULT = 416;\nexport const APP_WORKSPACE_DETAIL_MIN = 320;\nexport const APP_WORKSPACE_DETAIL_MAX = 640;\nexport const APP_WORKSPACE_DRAWER_DEFAULT = 240;\nexport const APP_WORKSPACE_DRAWER_MIN = 160;\nexport const APP_WORKSPACE_DRAWER_MAX = 560;\n/** Space `appWorkspaceResizeLimits` always reserves for the main region. */\nexport const APP_WORKSPACE_MAIN_MIN = 320;\nexport const APP_WORKSPACE_MAIN_MIN_HEIGHT = 240;\nexport const APP_WORKSPACE_PANE_DEFAULT = 320;\nexport const APP_WORKSPACE_PANE_MIN = 240;\nexport const APP_WORKSPACE_PANE_MAX = 640;\n\n/** Persistence envelope; each pane still applies its own runtime limits. */\nconst APP_WORKSPACE_PANE_STATE_MIN = 160;\nconst APP_WORKSPACE_PANE_STATE_MAX = 960;\n\nexport type AppWorkspaceResizeKind = \"sidebar\" | \"pane\" | \"detail\" | \"drawer\";\n\nexport const appWorkspaceResizeLimits = (options: {\n kind: AppWorkspaceResizeKind;\n workspaceSize: number;\n reservedSize: number;\n min?: number;\n max?: number;\n sidebarCollapsible?: boolean;\n}): { min: number; max: number } => {\n const min =\n options.min ??\n (options.kind === \"sidebar\"\n ? options.sidebarCollapsible\n ? APP_WORKSPACE_SIDEBAR_COLLAPSED\n : APP_WORKSPACE_SIDEBAR_MIN\n : options.kind === \"detail\"\n ? APP_WORKSPACE_DETAIL_MIN\n : options.kind === \"pane\"\n ? APP_WORKSPACE_PANE_MIN\n : APP_WORKSPACE_DRAWER_MIN);\n const configuredMax =\n options.max ??\n (options.kind === \"sidebar\"\n ? APP_WORKSPACE_SIDEBAR_MAX\n : options.kind === \"detail\"\n ? APP_WORKSPACE_DETAIL_MAX\n : options.kind === \"pane\"\n ? APP_WORKSPACE_PANE_MAX\n : APP_WORKSPACE_DRAWER_MAX);\n const mainMinimum = options.kind === \"drawer\" ? APP_WORKSPACE_MAIN_MIN_HEIGHT : APP_WORKSPACE_MAIN_MIN;\n return { min, max: Math.max(min, Math.min(configuredMax, options.workspaceSize - options.reservedSize - mainMinimum)) };\n};\n\n/**\n * Fits preferred auxiliary pane widths into a shared budget without giving\n * DOM order priority. Minimums are reserved first; remaining space is shared\n * in proportion to how much each pane still needs to reach its preference.\n */\nexport const fitAppWorkspacePaneSizes = (panes: ReadonlyArray<{ desired: number; min: number }>, availableSize: number): number[] => {\n const sizes = panes.map((pane) => pane.min);\n const minimumTotal = sizes.reduce((total, size) => total + size, 0);\n const desiredTotal = panes.reduce((total, pane) => total + pane.desired, 0);\n const budget = Math.max(0, Math.floor(availableSize));\n if (desiredTotal <= budget) return panes.map((pane) => pane.desired);\n if (budget <= minimumTotal) return sizes;\n\n const extraBudget = budget - minimumTotal;\n const desiredExtra = desiredTotal - minimumTotal;\n const fractions = panes.map((pane, index) => {\n const raw = ((pane.desired - pane.min) * extraBudget) / desiredExtra;\n const extra = Math.floor(raw);\n sizes[index]! += extra;\n return { fraction: raw - extra, index };\n });\n let remainder = extraBudget - sizes.reduce((total, size, index) => total + size - panes[index]!.min, 0);\n fractions.sort((a, b) => b.fraction - a.fraction || a.index - b.index);\n for (const { index } of fractions) {\n if (remainder-- <= 0) break;\n sizes[index]! += 1;\n }\n return sizes;\n};\n\nexport const shouldCollapseAppWorkspaceSidebar = (width: number, collapsible: boolean): boolean =>\n collapsible && width < APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD;\n\nexport const resolveAppWorkspaceSidebarWidth = (\n width: number,\n maxWidth: number,\n collapsible: boolean,\n): { width: number; collapsed: boolean } =>\n shouldCollapseAppWorkspaceSidebar(width, collapsible)\n ? { width: APP_WORKSPACE_SIDEBAR_COLLAPSED, collapsed: true }\n : { width: Math.round(Math.min(maxWidth, Math.max(APP_WORKSPACE_SIDEBAR_MIN, width))), collapsed: false };\n\nconst finiteSize = (value: unknown, min: number, max: number) =>\n typeof value === \"number\" && Number.isFinite(value) ? Math.round(Math.min(max, Math.max(min, value))) : undefined;\n\nexport const safeAppWorkspacePanelId = (panelId: string): string => (isStableUiId(panelId) ? panelId : \"\");\n\nconst normalizeSizes = (value: unknown, min: number, max: number) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n const entries = Object.entries(value)\n .slice(0, 16)\n .flatMap(([key, size]) => {\n const normalized = finiteSize(size, min, max);\n return isStableUiId(key) && normalized !== undefined ? [[key, normalized] as const] : [];\n });\n return entries.length ? Object.fromEntries(entries) : undefined;\n};\n\nexport const appWorkspacePanelVariable = (kind: \"pane\" | \"detail\" | \"drawer\", panelId: string): string =>\n `--k2b-workspace-${kind}-${assertStableUiId(panelId, \"AppWorkspace panel id\")}-${kind === \"drawer\" ? \"height\" : \"width\"}`;\n\nexport const normalizeAppWorkspaceLayoutState = (value: unknown): AppWorkspaceLayoutState | null => {\n if (!value || typeof value !== \"object\") return null;\n const candidate = value as Record<string, unknown>;\n if (candidate.version !== 1 && candidate.version !== 2) return null;\n const sidebarWidth = finiteSize(candidate.sidebarWidth, APP_WORKSPACE_SIDEBAR_MIN, APP_WORKSPACE_SIDEBAR_STATE_MAX);\n const sidebarCollapsed = typeof candidate.sidebarCollapsed === \"boolean\" ? candidate.sidebarCollapsed : undefined;\n // Keyed panel maps only exist from version 2 on; a version-1 payload that\n // carries them was not written by this component and is not trusted.\n const legacy = candidate.version === 1;\n const paneWidths = legacy ? undefined : normalizeSizes(candidate.paneWidths, APP_WORKSPACE_PANE_STATE_MIN, APP_WORKSPACE_PANE_STATE_MAX);\n const detailWidths = legacy\n ? (() => {\n const width = finiteSize(candidate.detailWidth, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DETAIL_MAX);\n return width === undefined ? undefined : { primary: width };\n })()\n : normalizeSizes(candidate.detailWidths, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DETAIL_MAX);\n const drawerHeights = legacy ? undefined : normalizeSizes(candidate.drawerHeights, APP_WORKSPACE_DRAWER_MIN, APP_WORKSPACE_DRAWER_MAX);\n return sidebarWidth === undefined && sidebarCollapsed === undefined && !paneWidths && !detailWidths && !drawerHeights\n ? null\n : { version: 2, sidebarWidth, sidebarCollapsed, paneWidths, detailWidths, drawerHeights };\n};\n\nexport const parseAppWorkspaceLayoutState = (value: string | null | undefined): AppWorkspaceLayoutState | null => {\n if (!value) return null;\n try {\n return normalizeAppWorkspaceLayoutState(JSON.parse(decodeURIComponent(value)));\n } catch {\n return null;\n }\n};\n\nexport const serializeAppWorkspaceLayoutState = (state: AppWorkspaceLayoutState): string =>\n encodeURIComponent(JSON.stringify(normalizeAppWorkspaceLayoutState(state) ?? { version: 2 }));\n\nexport const appWorkspaceLayoutStyle = (state: AppWorkspaceLayoutState | null | undefined): string | undefined => {\n if (!state) return undefined;\n const declarations = [\n state.sidebarCollapsed\n ? `--k2b-workspace-sidebar-width:${APP_WORKSPACE_SIDEBAR_COLLAPSED}px`\n : state.sidebarWidth === undefined\n ? null\n : `--k2b-workspace-sidebar-width:${state.sidebarWidth}px`,\n ...Object.entries(state.paneWidths ?? {}).map(([id, width]) => `${appWorkspacePanelVariable(\"pane\", id)}:${width}px`),\n ...Object.entries(state.detailWidths ?? {}).map(([id, width]) => `${appWorkspacePanelVariable(\"detail\", id)}:${width}px`),\n ...Object.entries(state.drawerHeights ?? {}).map(([id, height]) => `${appWorkspacePanelVariable(\"drawer\", id)}:${height}px`),\n ].filter(Boolean);\n return declarations.length ? declarations.join(\";\") : undefined;\n};\n\nimport { assertStableUiId, isStableUiId } from \"./stable-id\";\n"],"mappings":"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","ignoreList":[]}
@@ -2,7 +2,7 @@ export { default as AppOverview } from "./AppOverview";
2
2
  export { default as AppWorkspace } from "./AppWorkspace";
3
3
  export { installAppWorkspaceController } from "./app-workspace-controller";
4
4
  export { APP_WORKSPACE_DETAIL_DEFAULT, APP_WORKSPACE_DETAIL_MAX, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DRAWER_DEFAULT, APP_WORKSPACE_DRAWER_MAX, APP_WORKSPACE_DRAWER_MIN, APP_WORKSPACE_MAIN_MIN, APP_WORKSPACE_MAIN_MIN_HEIGHT, APP_WORKSPACE_PANE_DEFAULT, APP_WORKSPACE_PANE_MAX, APP_WORKSPACE_PANE_MIN, APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD, APP_WORKSPACE_SIDEBAR_COLLAPSED, APP_WORKSPACE_SIDEBAR_DEFAULT, APP_WORKSPACE_SIDEBAR_MAX, APP_WORKSPACE_SIDEBAR_MIN, appWorkspaceLayoutStyle, appWorkspacePanelVariable, appWorkspaceResizeLimits, normalizeAppWorkspaceLayoutState, parseAppWorkspaceLayoutState, resolveAppWorkspaceSidebarWidth, safeAppWorkspacePanelId, serializeAppWorkspaceLayoutState, shouldCollapseAppWorkspaceSidebar } from "./app-workspace-state";
5
- export { bottomSheetOptions, default as BottomSheet } from "./BottomSheet";
5
+ export { bottomSheetAdaptiveOptions, bottomSheetOptions, default as BottomSheet } from "./BottomSheet";
6
6
  export { DataPanel } from "./DataPanel";
7
7
  export { default as DetailPanel } from "./DetailPanel";
8
8
  export { default as Discussion } from "./Discussion";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["layout/index.ts"],"sourcesContent":["export type {\n AppOverviewCardsProps,\n AppOverviewEmptyStateProps,\n AppOverviewPanelProps,\n AppOverviewProps,\n} from \"./AppOverview\";\nexport { default as AppOverview } from \"./AppOverview\";\nexport type {\n AppWorkspaceBottomDrawerHeight,\n AppWorkspaceBottomDrawerProps,\n AppWorkspaceContentProps,\n AppWorkspaceDetailProps,\n AppWorkspaceDetailWidth,\n AppWorkspaceMainPaneProps,\n AppWorkspaceMainProps,\n AppWorkspaceNavTreeItemProps,\n AppWorkspaceNavTreeMove,\n AppWorkspaceNavTreeProps,\n AppWorkspaceProps,\n AppWorkspaceSidebarAccessoryVisibility,\n AppWorkspaceSidebarBodyProps,\n AppWorkspaceSidebarIconActionProps,\n AppWorkspaceSidebarIconActionTone,\n AppWorkspaceSidebarIconGridProps,\n AppWorkspaceSidebarItemActionProps,\n AppWorkspaceSidebarItemActionsProps,\n AppWorkspaceSidebarItemIconProps,\n AppWorkspaceSidebarItemLabelProps,\n AppWorkspaceSidebarItemMetaProps,\n AppWorkspaceSidebarItemProps,\n AppWorkspaceSidebarItemStatusProps,\n AppWorkspaceSidebarItemTone,\n AppWorkspaceSidebarProps,\n AppWorkspaceSidebarSectionProps,\n AppWorkspaceSidebarVisibility,\n} from \"./AppWorkspace\";\nexport { default as AppWorkspace } from \"./AppWorkspace\";\nexport type { AppWorkspaceControllerOptions } from \"./app-workspace-controller\";\nexport { installAppWorkspaceController } from \"./app-workspace-controller\";\nexport type {\n AppWorkspaceLayoutState,\n AppWorkspaceResizeKind,\n} from \"./app-workspace-state\";\nexport {\n APP_WORKSPACE_DETAIL_DEFAULT,\n APP_WORKSPACE_DETAIL_MAX,\n APP_WORKSPACE_DETAIL_MIN,\n APP_WORKSPACE_DRAWER_DEFAULT,\n APP_WORKSPACE_DRAWER_MAX,\n APP_WORKSPACE_DRAWER_MIN,\n APP_WORKSPACE_MAIN_MIN,\n APP_WORKSPACE_MAIN_MIN_HEIGHT,\n APP_WORKSPACE_PANE_DEFAULT,\n APP_WORKSPACE_PANE_MAX,\n APP_WORKSPACE_PANE_MIN,\n APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD,\n APP_WORKSPACE_SIDEBAR_COLLAPSED,\n APP_WORKSPACE_SIDEBAR_DEFAULT,\n APP_WORKSPACE_SIDEBAR_MAX,\n APP_WORKSPACE_SIDEBAR_MIN,\n appWorkspaceLayoutStyle,\n appWorkspacePanelVariable,\n appWorkspaceResizeLimits,\n normalizeAppWorkspaceLayoutState,\n parseAppWorkspaceLayoutState,\n resolveAppWorkspaceSidebarWidth,\n safeAppWorkspacePanelId,\n serializeAppWorkspaceLayoutState,\n shouldCollapseAppWorkspaceSidebar,\n} from \"./app-workspace-state\";\nexport { type BottomSheetProps, bottomSheetOptions, default as BottomSheet } from \"./BottomSheet\";\nexport type { DataPanelProps } from \"./DataPanel\";\nexport { DataPanel } from \"./DataPanel\";\nexport type {\n DetailPanelActionButtonProps,\n DetailPanelActionLinkProps,\n DetailPanelActionProps,\n DetailPanelActionSecondary,\n DetailPanelBodyProps,\n DetailPanelGroupProps,\n DetailPanelHeaderProps,\n DetailPanelProps,\n DetailPanelSectionProps,\n DetailPanelSummaryProps,\n DetailPanelTone,\n} from \"./DetailPanel\";\nexport { default as DetailPanel } from \"./DetailPanel\";\nexport type { DiscussionComposerProps, DiscussionItemProps, DiscussionListProps, DiscussionProps } from \"./Discussion\";\nexport { default as Discussion } from \"./Discussion\";\nexport type {\n FloatingWindowClose,\n FloatingWindowProps,\n OpenFloatingWindowOptions,\n} from \"./FloatingWindow\";\nexport {\n default as FloatingWindow,\n type FloatingWindowRect,\n fitFloatingWindowRect,\n openFloatingWindow,\n} from \"./FloatingWindow\";\nexport type { MobileShellHeaderProps, MobileShellProps } from \"./MobileShell\";\nexport { default as MobileShell, observeMobileShell } from \"./MobileShell\";\nexport { default as Navigation, type NavigationProps } from \"./Navigation\";\nexport {\n createNavigation,\n findNavigationItem,\n type NavigationController,\n type NavigationItem,\n type NavigationOptions,\n type NavigationStatus,\n} from \"./navigation-model\";\nexport type { PageTitleProps, PageTrailLink, PageTrailState } from \"./PageTitle\";\nexport { followPageTrail, PAGE_TRAIL_EVENT, PageTitle, PageTrailProvider, readPageTrail, setPageTrail, usePageTrail } from \"./PageTitle\";\nexport type {\n PanelDialogBodyProps,\n PanelDialogFooterProps,\n PanelDialogHeaderProps,\n PanelDialogProps,\n PanelDialogSectionProps,\n PanelDialogSurface,\n PanelDialogTabOption,\n PanelDialogTabsProps,\n} from \"./PanelDialog\";\nexport {\n confirmDiscardIfDirty,\n default as PanelDialog,\n panelDialogFixedOptions,\n panelDialogFixedPanelClass,\n panelDialogOptions,\n panelDialogPanelClass,\n panelDialogWideOptions,\n panelDialogWidePanelClass,\n panelDialogWorkspaceOptions,\n panelDialogWorkspacePanelClass,\n} from \"./PanelDialog\";\nexport type { PanelHeaderProps } from \"./PanelHeader\";\nexport { PanelHeader } from \"./PanelHeader\";\nexport type { PanesItem, PanesProps } from \"./Panes\";\nexport { default as Panes } from \"./Panes\";\nexport type { PullToRefreshProps, PullToRefreshState } from \"./PullToRefresh\";\nexport { default as PullToRefresh } from \"./PullToRefresh\";\nexport { installPageTitleController } from \"./page-title-controller\";\nexport type {\n AddPanesItemOptions,\n PanesDirection,\n PanesGroup,\n PanesIntent,\n PanesLayout,\n PanesNode,\n PanesPath,\n PanesPathSegment,\n PanesSide,\n PanesSplit,\n} from \"./panes-layout\";\nexport {\n activatePanesItem,\n addPanesItem,\n applyPanesIntent,\n createPanesLayout,\n isPanesItemVisible,\n PANES_LAYOUT_VERSION,\n parsePanesLayout,\n reconcilePanesLayout,\n removePanesItem,\n resizePanesSplit,\n} from \"./panes-layout\";\nexport type { ScrollAreaProps } from \"./ScrollArea\";\nexport { default as ScrollArea } from \"./ScrollArea\";\nexport type {\n SettingsFieldControlProps,\n SettingsFieldProps,\n SettingsGroupActionProps,\n SettingsGroupProps,\n SettingsPageProps,\n SettingsPanelFooterProps,\n SettingsSaveBarProps,\n SettingsSectionProps,\n} from \"./Settings\";\nexport {\n readSettingsError,\n SettingsField,\n SettingsGroup,\n SettingsPage,\n SettingsPanelFooter,\n SettingsSaveBar,\n SettingsSection,\n sameSettingValue,\n} from \"./Settings\";\nexport type {\n SettingsCollectionActionProps,\n SettingsCollectionItemActionsProps,\n SettingsCollectionItemProps,\n SettingsCollectionItemReorderProps,\n SettingsCollectionItemStatusProps,\n SettingsCollectionProps,\n} from \"./SettingsCollection\";\nexport { default as SettingsCollection } from \"./SettingsCollection\";\nexport type {\n SettingsModalFooterProps,\n SettingsModalGroupProps,\n SettingsModalProps,\n SettingsModalTabProps,\n SettingsModalTabTone,\n} from \"./SettingsModal\";\nexport { default as SettingsModal } from \"./SettingsModal\";\nexport {\n APP_WORKSPACE_SWITCHER_SEARCH_FROM,\n type AppWorkspaceSidebarSwitcherProps,\n type AppWorkspaceSwitcherAction,\n type AppWorkspaceSwitcherOption,\n} from \"./SidebarSwitcher\";\nexport type { TabBarItem, TabBarProps } from \"./TabBar\";\nexport { default as TabBar } from \"./TabBar\";\n\nexport type { TableOfContentsItem, TableOfContentsProps } from \"./TableOfContents\";\nexport { TableOfContents } from \"./TableOfContents\";\n"],"mappings":"AAMA,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AA8BtD,SAAS,OAAO,IAAI,YAAY,QAAQ,gBAAgB;AAExD,SAAS,6BAA6B,QAAQ,4BAA4B;AAK1E,SACE,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,6BAA6B,EAC7B,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,wCAAwC,EACxC,+BAA+B,EAC/B,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,gCAAgC,EAChC,4BAA4B,EAC5B,+BAA+B,EAC/B,uBAAuB,EACvB,gCAAgC,EAChC,iCAAiC,QAC5B,uBAAuB;AAC9B,SAAgC,kBAAkB,EAAE,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEjG,SAAS,SAAS,QAAQ,aAAa;AAcvC,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAMpD,SACE,OAAO,IAAI,cAAc,EAEzB,qBAAqB,EACrB,kBAAkB,QACb,kBAAkB;AAEzB,SAAS,OAAO,IAAI,WAAW,EAAE,kBAAkB,QAAQ,eAAe;AAC1E,SAAS,OAAO,IAAI,UAAU,QAA8B,cAAc;AAC1E,SACE,gBAAgB,EAChB,kBAAkB,QAKb,oBAAoB;AAE3B,SAAS,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,QAAQ,aAAa;AAWxI,SACE,qBAAqB,EACrB,OAAO,IAAI,WAAW,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,EAC3B,8BAA8B,QACzB,eAAe;AAEtB,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,OAAO,IAAI,KAAK,QAAQ,SAAS;AAE1C,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAC1D,SAAS,0BAA0B,QAAQ,yBAAyB;AAapE,SACE,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,QACX,gBAAgB;AAEvB,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAWpD,SACE,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,gBAAgB,QACX,YAAY;AASnB,SAAS,OAAO,IAAI,kBAAkB,QAAQ,sBAAsB;AAQpE,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAC1D,SACE,kCAAkC,QAI7B,mBAAmB;AAE1B,SAAS,OAAO,IAAI,MAAM,QAAQ,UAAU;AAG5C,SAAS,eAAe,QAAQ,mBAAmB","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/index.ts"],"sourcesContent":["export type {\n AppOverviewCardsProps,\n AppOverviewEmptyStateProps,\n AppOverviewPanelProps,\n AppOverviewProps,\n} from \"./AppOverview\";\nexport { default as AppOverview } from \"./AppOverview\";\nexport type {\n AppWorkspaceBottomDrawerHeight,\n AppWorkspaceBottomDrawerProps,\n AppWorkspaceContentProps,\n AppWorkspaceDetailProps,\n AppWorkspaceDetailWidth,\n AppWorkspaceMainPaneProps,\n AppWorkspaceMainProps,\n AppWorkspaceNavTreeItemProps,\n AppWorkspaceNavTreeMove,\n AppWorkspaceNavTreeProps,\n AppWorkspaceProps,\n AppWorkspaceSidebarAccessoryVisibility,\n AppWorkspaceSidebarBodyProps,\n AppWorkspaceSidebarIconActionProps,\n AppWorkspaceSidebarIconActionTone,\n AppWorkspaceSidebarIconGridProps,\n AppWorkspaceSidebarItemActionProps,\n AppWorkspaceSidebarItemActionsProps,\n AppWorkspaceSidebarItemIconProps,\n AppWorkspaceSidebarItemLabelProps,\n AppWorkspaceSidebarItemMetaProps,\n AppWorkspaceSidebarItemProps,\n AppWorkspaceSidebarItemStatusProps,\n AppWorkspaceSidebarItemTone,\n AppWorkspaceSidebarProps,\n AppWorkspaceSidebarSectionProps,\n AppWorkspaceSidebarVisibility,\n} from \"./AppWorkspace\";\nexport { default as AppWorkspace } from \"./AppWorkspace\";\nexport type { AppWorkspaceControllerOptions } from \"./app-workspace-controller\";\nexport { installAppWorkspaceController } from \"./app-workspace-controller\";\nexport type {\n AppWorkspaceLayoutState,\n AppWorkspaceResizeKind,\n} from \"./app-workspace-state\";\nexport {\n APP_WORKSPACE_DETAIL_DEFAULT,\n APP_WORKSPACE_DETAIL_MAX,\n APP_WORKSPACE_DETAIL_MIN,\n APP_WORKSPACE_DRAWER_DEFAULT,\n APP_WORKSPACE_DRAWER_MAX,\n APP_WORKSPACE_DRAWER_MIN,\n APP_WORKSPACE_MAIN_MIN,\n APP_WORKSPACE_MAIN_MIN_HEIGHT,\n APP_WORKSPACE_PANE_DEFAULT,\n APP_WORKSPACE_PANE_MAX,\n APP_WORKSPACE_PANE_MIN,\n APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD,\n APP_WORKSPACE_SIDEBAR_COLLAPSED,\n APP_WORKSPACE_SIDEBAR_DEFAULT,\n APP_WORKSPACE_SIDEBAR_MAX,\n APP_WORKSPACE_SIDEBAR_MIN,\n appWorkspaceLayoutStyle,\n appWorkspacePanelVariable,\n appWorkspaceResizeLimits,\n normalizeAppWorkspaceLayoutState,\n parseAppWorkspaceLayoutState,\n resolveAppWorkspaceSidebarWidth,\n safeAppWorkspacePanelId,\n serializeAppWorkspaceLayoutState,\n shouldCollapseAppWorkspaceSidebar,\n} from \"./app-workspace-state\";\nexport { type BottomSheetProps, bottomSheetAdaptiveOptions, bottomSheetOptions, default as BottomSheet } from \"./BottomSheet\";\nexport type { DataPanelProps } from \"./DataPanel\";\nexport { DataPanel } from \"./DataPanel\";\nexport type {\n DetailPanelActionButtonProps,\n DetailPanelActionLinkProps,\n DetailPanelActionProps,\n DetailPanelActionSecondary,\n DetailPanelBodyProps,\n DetailPanelGroupProps,\n DetailPanelHeaderProps,\n DetailPanelProps,\n DetailPanelSectionProps,\n DetailPanelSummaryProps,\n DetailPanelTone,\n} from \"./DetailPanel\";\nexport { default as DetailPanel } from \"./DetailPanel\";\nexport type { DiscussionComposerProps, DiscussionItemProps, DiscussionListProps, DiscussionProps } from \"./Discussion\";\nexport { default as Discussion } from \"./Discussion\";\nexport type {\n FloatingWindowClose,\n FloatingWindowProps,\n OpenFloatingWindowOptions,\n} from \"./FloatingWindow\";\nexport {\n default as FloatingWindow,\n type FloatingWindowRect,\n fitFloatingWindowRect,\n openFloatingWindow,\n} from \"./FloatingWindow\";\nexport type { MobileShellHeaderProps, MobileShellProps } from \"./MobileShell\";\nexport { default as MobileShell, observeMobileShell } from \"./MobileShell\";\nexport { default as Navigation, type NavigationProps } from \"./Navigation\";\nexport {\n createNavigation,\n findNavigationItem,\n type NavigationController,\n type NavigationItem,\n type NavigationOptions,\n type NavigationStatus,\n} from \"./navigation-model\";\nexport type { PageTitleProps, PageTrailLink, PageTrailState } from \"./PageTitle\";\nexport { followPageTrail, PAGE_TRAIL_EVENT, PageTitle, PageTrailProvider, readPageTrail, setPageTrail, usePageTrail } from \"./PageTitle\";\nexport type {\n PanelDialogBodyProps,\n PanelDialogFooterProps,\n PanelDialogHeaderProps,\n PanelDialogProps,\n PanelDialogSectionProps,\n PanelDialogSurface,\n PanelDialogTabOption,\n PanelDialogTabsProps,\n} from \"./PanelDialog\";\nexport {\n confirmDiscardIfDirty,\n default as PanelDialog,\n panelDialogFixedOptions,\n panelDialogFixedPanelClass,\n panelDialogOptions,\n panelDialogPanelClass,\n panelDialogWideOptions,\n panelDialogWidePanelClass,\n panelDialogWorkspaceOptions,\n panelDialogWorkspacePanelClass,\n} from \"./PanelDialog\";\nexport type { PanelHeaderProps } from \"./PanelHeader\";\nexport { PanelHeader } from \"./PanelHeader\";\nexport type { PanesItem, PanesProps } from \"./Panes\";\nexport { default as Panes } from \"./Panes\";\nexport type { PullToRefreshProps, PullToRefreshState } from \"./PullToRefresh\";\nexport { default as PullToRefresh } from \"./PullToRefresh\";\nexport { installPageTitleController } from \"./page-title-controller\";\nexport type {\n AddPanesItemOptions,\n PanesDirection,\n PanesGroup,\n PanesIntent,\n PanesLayout,\n PanesNode,\n PanesPath,\n PanesPathSegment,\n PanesSide,\n PanesSplit,\n} from \"./panes-layout\";\nexport {\n activatePanesItem,\n addPanesItem,\n applyPanesIntent,\n createPanesLayout,\n isPanesItemVisible,\n PANES_LAYOUT_VERSION,\n parsePanesLayout,\n reconcilePanesLayout,\n removePanesItem,\n resizePanesSplit,\n} from \"./panes-layout\";\nexport type { ScrollAreaProps } from \"./ScrollArea\";\nexport { default as ScrollArea } from \"./ScrollArea\";\nexport type {\n SettingsFieldControlProps,\n SettingsFieldProps,\n SettingsGroupActionProps,\n SettingsGroupProps,\n SettingsPageProps,\n SettingsPanelFooterProps,\n SettingsSaveBarProps,\n SettingsSectionProps,\n} from \"./Settings\";\nexport {\n readSettingsError,\n SettingsField,\n SettingsGroup,\n SettingsPage,\n SettingsPanelFooter,\n SettingsSaveBar,\n SettingsSection,\n sameSettingValue,\n} from \"./Settings\";\nexport type {\n SettingsCollectionActionProps,\n SettingsCollectionItemActionsProps,\n SettingsCollectionItemProps,\n SettingsCollectionItemReorderProps,\n SettingsCollectionItemStatusProps,\n SettingsCollectionProps,\n} from \"./SettingsCollection\";\nexport { default as SettingsCollection } from \"./SettingsCollection\";\nexport type {\n SettingsModalFooterProps,\n SettingsModalGroupProps,\n SettingsModalProps,\n SettingsModalTabProps,\n SettingsModalTabTone,\n} from \"./SettingsModal\";\nexport { default as SettingsModal } from \"./SettingsModal\";\nexport {\n APP_WORKSPACE_SWITCHER_SEARCH_FROM,\n type AppWorkspaceSidebarSwitcherProps,\n type AppWorkspaceSwitcherAction,\n type AppWorkspaceSwitcherOption,\n} from \"./SidebarSwitcher\";\nexport type { TabBarItem, TabBarProps } from \"./TabBar\";\nexport { default as TabBar } from \"./TabBar\";\n\nexport type { TableOfContentsItem, TableOfContentsProps } from \"./TableOfContents\";\nexport { TableOfContents } from \"./TableOfContents\";\n"],"mappings":"AAMA,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AA8BtD,SAAS,OAAO,IAAI,YAAY,QAAQ,gBAAgB;AAExD,SAAS,6BAA6B,QAAQ,4BAA4B;AAK1E,SACE,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,6BAA6B,EAC7B,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,wCAAwC,EACxC,+BAA+B,EAC/B,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,gCAAgC,EAChC,4BAA4B,EAC5B,+BAA+B,EAC/B,uBAAuB,EACvB,gCAAgC,EAChC,iCAAiC,QAC5B,uBAAuB;AAC9B,SAAgC,0BAA0B,EAAE,kBAAkB,EAAE,OAAO,IAAI,WAAW,QAAQ,eAAe;AAE7H,SAAS,SAAS,QAAQ,aAAa;AAcvC,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAMpD,SACE,OAAO,IAAI,cAAc,EAEzB,qBAAqB,EACrB,kBAAkB,QACb,kBAAkB;AAEzB,SAAS,OAAO,IAAI,WAAW,EAAE,kBAAkB,QAAQ,eAAe;AAC1E,SAAS,OAAO,IAAI,UAAU,QAA8B,cAAc;AAC1E,SACE,gBAAgB,EAChB,kBAAkB,QAKb,oBAAoB;AAE3B,SAAS,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,QAAQ,aAAa;AAWxI,SACE,qBAAqB,EACrB,OAAO,IAAI,WAAW,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,EAC3B,8BAA8B,QACzB,eAAe;AAEtB,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,OAAO,IAAI,KAAK,QAAQ,SAAS;AAE1C,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAC1D,SAAS,0BAA0B,QAAQ,yBAAyB;AAapE,SACE,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,QACX,gBAAgB;AAEvB,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAWpD,SACE,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,gBAAgB,QACX,YAAY;AASnB,SAAS,OAAO,IAAI,kBAAkB,QAAQ,sBAAsB;AAQpE,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAC1D,SACE,kCAAkC,QAI7B,mBAAmB;AAE1B,SAAS,OAAO,IAAI,MAAM,QAAQ,UAAU;AAG5C,SAAS,eAAe,QAAQ,mBAAmB","ignoreList":[]}
@@ -2,20 +2,25 @@ import { createEffect, onCleanup } from "solid-js";
2
2
  const selector = "[data-scroll-fade-mode]";
3
3
  const active = new WeakMap();
4
4
 
5
+ /** Self-contained because the sidebar inline script embeds its source. */
6
+ export function scrollFadeEdges(body) {
7
+ const mode = body.getAttribute("data-scroll-fade-mode");
8
+ const horizontal = body.getAttribute("data-scroll-fade-axis") === "horizontal";
9
+ const overflow = horizontal ? body.scrollWidth - body.clientWidth : body.scrollHeight - body.clientHeight;
10
+ // Horizontal RTL scrollLeft starts at zero on the right and becomes negative.
11
+ const rtl = horizontal && getComputedStyle(body).direction === "rtl";
12
+ const offset = horizontal ? rtl ? overflow + body.scrollLeft : body.scrollLeft : body.scrollTop;
13
+ const top = mode === "both" && overflow > 1 && offset > 1;
14
+ const bottom = !!mode && overflow > 1 && overflow - offset > 1;
15
+ return top && bottom ? "both" : top ? "top" : bottom ? "bottom" : undefined;
16
+ }
17
+
5
18
  /** Shared by hydrated components and the workspace's server-rendered scrollports. */
6
19
  function observeScrollFade(body) {
7
20
  let entry = active.get(body);
8
21
  if (!entry) {
9
22
  const update = () => {
10
- const mode = body.getAttribute("data-scroll-fade-mode");
11
- const horizontal = body.getAttribute("data-scroll-fade-axis") === "horizontal";
12
- const overflow = horizontal ? body.scrollWidth - body.clientWidth : body.scrollHeight - body.clientHeight;
13
- // Horizontal RTL scrollLeft starts at zero on the right and becomes negative.
14
- const rtl = horizontal && getComputedStyle(body).direction === "rtl";
15
- const offset = horizontal ? rtl ? overflow + body.scrollLeft : body.scrollLeft : body.scrollTop;
16
- const top = mode === "both" && overflow > 1 && offset > 1;
17
- const bottom = !!mode && overflow > 1 && overflow - offset > 1;
18
- const edges = top && bottom ? "both" : top ? "top" : bottom ? "bottom" : undefined;
23
+ const edges = scrollFadeEdges(body);
19
24
  if (edges) {
20
25
  if (body.getAttribute("data-scroll-fade") !== edges) body.setAttribute("data-scroll-fade", edges);
21
26
  } else if (body.hasAttribute("data-scroll-fade")) body.removeAttribute("data-scroll-fade");
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["layout/scroll-fade.ts"],"sourcesContent":["import { createEffect, onCleanup } from \"solid-js\";\n\nconst selector = \"[data-scroll-fade-mode]\";\nconst active = new WeakMap<HTMLElement, { users: number; stop: () => void }>();\n\n/** Shared by hydrated components and the workspace's server-rendered scrollports. */\nfunction observeScrollFade(body: HTMLElement) {\n let entry = active.get(body);\n if (!entry) {\n const update = () => {\n const mode = body.getAttribute(\"data-scroll-fade-mode\");\n const horizontal = body.getAttribute(\"data-scroll-fade-axis\") === \"horizontal\";\n const overflow = horizontal ? body.scrollWidth - body.clientWidth : body.scrollHeight - body.clientHeight;\n // Horizontal RTL scrollLeft starts at zero on the right and becomes negative.\n const rtl = horizontal && getComputedStyle(body).direction === \"rtl\";\n const offset = horizontal ? (rtl ? overflow + body.scrollLeft : body.scrollLeft) : body.scrollTop;\n const top = mode === \"both\" && overflow > 1 && offset > 1;\n const bottom = !!mode && overflow > 1 && overflow - offset > 1;\n const edges = top && bottom ? \"both\" : top ? \"top\" : bottom ? \"bottom\" : undefined;\n if (edges) {\n if (body.getAttribute(\"data-scroll-fade\") !== edges) body.setAttribute(\"data-scroll-fade\", edges);\n } else if (body.hasAttribute(\"data-scroll-fade\")) body.removeAttribute(\"data-scroll-fade\");\n };\n const resize = new ResizeObserver(update);\n const observe = () => {\n resize.disconnect();\n resize.observe(body);\n for (const child of Array.from(body.children)) resize.observe(child);\n update();\n };\n const mutations = new MutationObserver((records) => {\n if (records.some((record) => record.type === \"childList\" && record.target === body)) observe();\n else update();\n });\n mutations.observe(body, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"hidden\", \"open\", \"data-scroll-fade-mode\", \"data-scroll-fade-axis\", \"dir\"],\n });\n body.addEventListener(\"scroll\", update, { passive: true });\n observe();\n entry = {\n users: 0,\n stop: () => {\n resize.disconnect();\n mutations.disconnect();\n body.removeEventListener(\"scroll\", update);\n body.removeAttribute(\"data-scroll-fade\");\n },\n };\n active.set(body, entry);\n }\n entry.users++;\n return () => {\n if (--entry.users === 0) {\n entry.stop();\n active.delete(body);\n }\n };\n}\n\nexport function createScrollFade(element: () => HTMLElement | undefined, enabled: () => boolean) {\n createEffect(() => {\n if (!enabled()) return;\n const body = element();\n if (body) onCleanup(observeScrollFade(body));\n });\n}\n\n/** Enrich only explicitly marked UI scrollports, including SSR and later navigation. */\nexport function installScrollFades(root: Document | HTMLElement) {\n const owned = new Map<HTMLElement, () => void>();\n const sync = () => {\n const next = new Set(Array.from(root.querySelectorAll<HTMLElement>(selector)));\n if (root instanceof HTMLElement && root.matches(selector)) next.add(root);\n for (const [element, stop] of owned)\n if (!next.has(element)) {\n stop();\n owned.delete(element);\n }\n for (const element of next) if (!owned.has(element)) owned.set(element, observeScrollFade(element));\n };\n const containsPort = (node: Node) => node instanceof Element && (node.matches(selector) || node.querySelector(selector));\n const mutations = new MutationObserver((records) => {\n if (\n records.some(\n (record) =>\n record.type === \"attributes\" ||\n Array.from(record.addedNodes).some(containsPort) ||\n Array.from(record.removedNodes).some(containsPort),\n )\n )\n sync();\n });\n mutations.observe(root, { childList: true, subtree: true, attributes: true, attributeFilter: [\"data-scroll-fade-mode\"] });\n sync();\n return () => {\n mutations.disconnect();\n for (const stop of owned.values()) stop();\n owned.clear();\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/scroll-fade.ts"],"sourcesContent":["import { createEffect, onCleanup } from \"solid-js\";\n\nconst selector = \"[data-scroll-fade-mode]\";\nconst active = new WeakMap<HTMLElement, { users: number; stop: () => void }>();\n\n/** Self-contained because the sidebar inline script embeds its source. */\nexport function scrollFadeEdges(body: HTMLElement): \"top\" | \"bottom\" | \"both\" | undefined {\n const mode = body.getAttribute(\"data-scroll-fade-mode\");\n const horizontal = body.getAttribute(\"data-scroll-fade-axis\") === \"horizontal\";\n const overflow = horizontal ? body.scrollWidth - body.clientWidth : body.scrollHeight - body.clientHeight;\n // Horizontal RTL scrollLeft starts at zero on the right and becomes negative.\n const rtl = horizontal && getComputedStyle(body).direction === \"rtl\";\n const offset = horizontal ? (rtl ? overflow + body.scrollLeft : body.scrollLeft) : body.scrollTop;\n const top = mode === \"both\" && overflow > 1 && offset > 1;\n const bottom = !!mode && overflow > 1 && overflow - offset > 1;\n return top && bottom ? \"both\" : top ? \"top\" : bottom ? \"bottom\" : undefined;\n}\n\n/** Shared by hydrated components and the workspace's server-rendered scrollports. */\nfunction observeScrollFade(body: HTMLElement) {\n let entry = active.get(body);\n if (!entry) {\n const update = () => {\n const edges = scrollFadeEdges(body);\n if (edges) {\n if (body.getAttribute(\"data-scroll-fade\") !== edges) body.setAttribute(\"data-scroll-fade\", edges);\n } else if (body.hasAttribute(\"data-scroll-fade\")) body.removeAttribute(\"data-scroll-fade\");\n };\n const resize = new ResizeObserver(update);\n const observe = () => {\n resize.disconnect();\n resize.observe(body);\n for (const child of Array.from(body.children)) resize.observe(child);\n update();\n };\n const mutations = new MutationObserver((records) => {\n if (records.some((record) => record.type === \"childList\" && record.target === body)) observe();\n else update();\n });\n mutations.observe(body, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"hidden\", \"open\", \"data-scroll-fade-mode\", \"data-scroll-fade-axis\", \"dir\"],\n });\n body.addEventListener(\"scroll\", update, { passive: true });\n observe();\n entry = {\n users: 0,\n stop: () => {\n resize.disconnect();\n mutations.disconnect();\n body.removeEventListener(\"scroll\", update);\n body.removeAttribute(\"data-scroll-fade\");\n },\n };\n active.set(body, entry);\n }\n entry.users++;\n return () => {\n if (--entry.users === 0) {\n entry.stop();\n active.delete(body);\n }\n };\n}\n\nexport function createScrollFade(element: () => HTMLElement | undefined, enabled: () => boolean) {\n createEffect(() => {\n if (!enabled()) return;\n const body = element();\n if (body) onCleanup(observeScrollFade(body));\n });\n}\n\n/** Enrich only explicitly marked UI scrollports, including SSR and later navigation. */\nexport function installScrollFades(root: Document | HTMLElement) {\n const owned = new Map<HTMLElement, () => void>();\n const sync = () => {\n const next = new Set(Array.from(root.querySelectorAll<HTMLElement>(selector)));\n if (root instanceof HTMLElement && root.matches(selector)) next.add(root);\n for (const [element, stop] of owned)\n if (!next.has(element)) {\n stop();\n owned.delete(element);\n }\n for (const element of next) if (!owned.has(element)) owned.set(element, observeScrollFade(element));\n };\n const containsPort = (node: Node) => node instanceof Element && (node.matches(selector) || node.querySelector(selector));\n const mutations = new MutationObserver((records) => {\n if (\n records.some(\n (record) =>\n record.type === \"attributes\" ||\n Array.from(record.addedNodes).some(containsPort) ||\n Array.from(record.removedNodes).some(containsPort),\n )\n )\n sync();\n });\n mutations.observe(root, { childList: true, subtree: true, attributes: true, attributeFilter: [\"data-scroll-fade-mode\"] });\n sync();\n return () => {\n mutations.disconnect();\n for (const stop of owned.values()) stop();\n owned.clear();\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Runs at parse time and on client mount. Keep this function self-contained:
3
+ * the inline script embeds its source with String(rememberSidebarScroll).
4
+ * Memory uses the body's scroll-preserve key, or the page path, and position.
5
+ */
6
+ export function rememberSidebarScroll(body, fadeEdges) {
7
+ if (!body) return () => {};
8
+ // Read again when the page is left: an in-place navigation can change the path after mount.
9
+ const key = () => "k2b-sidebar-scroll:" + (body.getAttribute("data-scroll-preserve") || location.pathname) + ":" + (Array.from(document.querySelectorAll(".k2b-app-workspace__sidebar-body")).indexOf(body) + 1);
10
+ let storage;
11
+ let stored;
12
+ try {
13
+ storage = window.sessionStorage;
14
+ stored = storage.getItem(key());
15
+ } catch {
16
+ return () => {};
17
+ }
18
+ const restore = () => {
19
+ if (stored !== null) body.scrollTop = Number(stored);
20
+ const current = body.querySelector('[aria-current="page"]') || body.querySelector('[aria-current="true"]');
21
+ current?.scrollIntoView({
22
+ block: "nearest"
23
+ });
24
+ const edges = fadeEdges(body);
25
+ if (edges) body.setAttribute("data-scroll-fade", edges);else body.removeAttribute("data-scroll-fade");
26
+ };
27
+ restore();
28
+ requestAnimationFrame(restore);
29
+ const remember = () => {
30
+ if (!body.isConnected) return;
31
+ try {
32
+ storage.setItem(key(), String(body.scrollTop));
33
+ } catch {}
34
+ };
35
+ window.addEventListener("pagehide", remember);
36
+ return () => window.removeEventListener("pagehide", remember);
37
+ }
38
+ //# sourceMappingURL=sidebar-scroll-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["layout/sidebar-scroll-memory.ts"],"sourcesContent":["/**\n * Runs at parse time and on client mount. Keep this function self-contained:\n * the inline script embeds its source with String(rememberSidebarScroll).\n * Memory uses the body's scroll-preserve key, or the page path, and position.\n */\nexport function rememberSidebarScroll(body: HTMLElement | null, fadeEdges: (body: HTMLElement) => string | undefined): () => void {\n if (!body) return () => {};\n // Read again when the page is left: an in-place navigation can change the path after mount.\n const key = () =>\n \"k2b-sidebar-scroll:\" +\n (body.getAttribute(\"data-scroll-preserve\") || location.pathname) +\n \":\" +\n (Array.from(document.querySelectorAll(\".k2b-app-workspace__sidebar-body\")).indexOf(body) + 1);\n let storage: Storage;\n let stored: string | null;\n try {\n storage = window.sessionStorage;\n stored = storage.getItem(key());\n } catch {\n return () => {};\n }\n const restore = () => {\n if (stored !== null) body.scrollTop = Number(stored);\n const current = body.querySelector<HTMLElement>('[aria-current=\"page\"]') || body.querySelector<HTMLElement>('[aria-current=\"true\"]');\n current?.scrollIntoView({ block: \"nearest\" });\n const edges = fadeEdges(body);\n if (edges) body.setAttribute(\"data-scroll-fade\", edges);\n else body.removeAttribute(\"data-scroll-fade\");\n };\n restore();\n requestAnimationFrame(restore);\n const remember = () => {\n if (!body.isConnected) return;\n try {\n storage.setItem(key(), String(body.scrollTop));\n } catch {}\n };\n window.addEventListener(\"pagehide\", remember);\n return () => window.removeEventListener(\"pagehide\", remember);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS,qBAAqB,CAAC,IAAwB,EAAE,SAAoD,EAAc;EAChI,IAAI,CAAC,IAAI,EAAE,OAAO,MAAM,CAAC,CAAC;EAC1B;EACA,MAAM,GAAG,GAAG,MACV,qBAAqB,IACpB,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAChE,GAAG,IACF,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,kCAAkC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;EAC/F,IAAI,OAAgB;EACpB,IAAI,MAAqB;EACzB,IAAI;IACF,OAAO,GAAG,MAAM,CAAC,cAAc;IAC/B,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;EACjC,CAAC,CAAC,MAAM;IACN,OAAO,MAAM,CAAC,CAAC;EACjB;EACA,MAAM,OAAO,GAAG,MAAM;IACpB,IAAI,MAAM,KAAK,IAAI,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAc,uBAAuB,CAAC,IAAI,IAAI,CAAC,aAAa,CAAc,uBAAuB,CAAC;IACpI,OAAO,EAAE,cAAc,CAAC;MAAE,KAAK,EAAE;IAAU,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC;IAC7B,IAAI,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC,KACnD,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC;EAC/C,CAAC;EACD,OAAO,CAAC,CAAC;EACT,qBAAqB,CAAC,OAAO,CAAC;EAC9B,MAAM,QAAQ,GAAG,MAAM;IACrB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;IACvB,IAAI;MACF,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC,CAAC,MAAM,CAAC;EACX,CAAC;EACD,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC;EAC7C,OAAO,MAAM,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,QAAQ,CAAC;AAC/D","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * True when the person asked for less motion: through the operating system's
3
+ * setting or through `data-k2b-motion="reduced"` on `<html>`. Both are read at
4
+ * call time, so a change applies to the next call; on the server it is false.
5
+ */
6
+ export const prefersReducedMotion = () => typeof window !== "undefined" && (window.document.documentElement.getAttribute("data-k2b-motion") === "reduced" || typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches);
7
+ //# sourceMappingURL=motion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["motion.ts"],"sourcesContent":["/**\n * True when the person asked for less motion: through the operating system's\n * setting or through `data-k2b-motion=\"reduced\"` on `<html>`. Both are read at\n * call time, so a change applies to the next call; on the server it is false.\n */\nexport const prefersReducedMotion = (): boolean =>\n typeof window !== \"undefined\" &&\n (window.document.documentElement.getAttribute(\"data-k2b-motion\") === \"reduced\" ||\n (typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches));\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,oBAAoB,GAAG,MAClC,OAAO,MAAM,KAAK,WAAW,KAC5B,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,SAAS,IAC3E,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC,OAAQ,CAAC","ignoreList":[]}