@arbidocs/blocks 0.4.71 → 0.4.72

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 (122) hide show
  1. package/dist/agents/index.cjs +223 -224
  2. package/dist/agents/index.js +7 -8
  3. package/dist/calendar/CalendarGrid.d.ts +2 -0
  4. package/dist/calendar/CalendarList.d.ts +2 -0
  5. package/dist/calendar/CalendarSettingsForm.d.ts +2 -0
  6. package/dist/calendar/EventDetails.d.ts +2 -0
  7. package/dist/calendar/EventEditor.d.ts +2 -0
  8. package/dist/calendar/MiniMonth.d.ts +2 -0
  9. package/dist/calendar/RecurrenceEditor.d.ts +13 -0
  10. package/dist/calendar/RoomFinder.d.ts +2 -0
  11. package/dist/calendar/SchedulingAssistant.d.ts +2 -0
  12. package/dist/calendar/ScopeDialog.d.ts +2 -0
  13. package/dist/calendar/TimeZonePicker.d.ts +2 -0
  14. package/dist/calendar/colors.d.ts +4 -0
  15. package/dist/calendar/draft.d.ts +43 -0
  16. package/dist/calendar/format.d.ts +14 -0
  17. package/dist/calendar/grid-model.d.ts +24 -0
  18. package/dist/calendar/index.cjs +4122 -0
  19. package/dist/calendar/index.cjs.map +1 -0
  20. package/dist/calendar/index.d.ts +30 -0
  21. package/dist/calendar/index.js +4043 -0
  22. package/dist/calendar/index.js.map +1 -0
  23. package/dist/calendar/labels.d.ts +4 -0
  24. package/dist/calendar/recurrence-labels.d.ts +22 -0
  25. package/dist/calendar/recurrence.d.ts +66 -0
  26. package/dist/calendar/reminders.d.ts +26 -0
  27. package/dist/calendar/scheduling.d.ts +27 -0
  28. package/dist/calendar/types.d.ts +605 -0
  29. package/dist/calendar/ui.d.ts +16 -0
  30. package/dist/calendar/zone.d.ts +56 -0
  31. package/dist/chat/index.cjs +123 -123
  32. package/dist/chat/index.js +3 -3
  33. package/dist/{chunk-XNRGCQPZ.cjs → chunk-3SFFTSOI.cjs} +5 -5
  34. package/dist/{chunk-XNRGCQPZ.cjs.map → chunk-3SFFTSOI.cjs.map} +1 -1
  35. package/dist/{chunk-7WM62NMM.cjs → chunk-6OL5S7MJ.cjs} +5 -2
  36. package/dist/chunk-6OL5S7MJ.cjs.map +1 -0
  37. package/dist/{chunk-VUEZARW5.cjs → chunk-B3WCKBJ7.cjs} +278 -5
  38. package/dist/chunk-B3WCKBJ7.cjs.map +1 -0
  39. package/dist/{chunk-L5UPP2HC.js → chunk-D46ZAPEE.js} +5 -2
  40. package/dist/chunk-D46ZAPEE.js.map +1 -0
  41. package/dist/{chunk-7M22KND4.cjs → chunk-DH7C2UJO.cjs} +10 -10
  42. package/dist/{chunk-7M22KND4.cjs.map → chunk-DH7C2UJO.cjs.map} +1 -1
  43. package/dist/{chunk-CXWESDIZ.cjs → chunk-F4RUCUXF.cjs} +6 -6
  44. package/dist/{chunk-CXWESDIZ.cjs.map → chunk-F4RUCUXF.cjs.map} +1 -1
  45. package/dist/{chunk-DABEWNL2.js → chunk-G5DP27DU.js} +3 -3
  46. package/dist/{chunk-DABEWNL2.js.map → chunk-G5DP27DU.js.map} +1 -1
  47. package/dist/{chunk-LTA2IAQB.cjs → chunk-G5QTGKDJ.cjs} +4 -4
  48. package/dist/{chunk-LTA2IAQB.cjs.map → chunk-G5QTGKDJ.cjs.map} +1 -1
  49. package/dist/{chunk-VZGBCBYB.js → chunk-GJV2G4FC.js} +276 -7
  50. package/dist/chunk-GJV2G4FC.js.map +1 -0
  51. package/dist/{chunk-HLMFU7L2.js → chunk-IMC2Z32C.js} +8 -8
  52. package/dist/{chunk-HLMFU7L2.js.map → chunk-IMC2Z32C.js.map} +1 -1
  53. package/dist/{chunk-5DM6VU4L.cjs → chunk-KJ3QEKOJ.cjs} +3 -3
  54. package/dist/{chunk-5DM6VU4L.cjs.map → chunk-KJ3QEKOJ.cjs.map} +1 -1
  55. package/dist/{chunk-3TVTG7FK.js → chunk-KOXUBCLL.js} +3 -3
  56. package/dist/{chunk-3TVTG7FK.js.map → chunk-KOXUBCLL.js.map} +1 -1
  57. package/dist/{chunk-ILGHS6ZV.js → chunk-SB5ZKOYN.js} +3 -3
  58. package/dist/{chunk-ILGHS6ZV.js.map → chunk-SB5ZKOYN.js.map} +1 -1
  59. package/dist/{chunk-CPMNAJLF.js → chunk-TX2ZICS7.js} +24 -4
  60. package/dist/chunk-TX2ZICS7.js.map +1 -0
  61. package/dist/{chunk-2ZTONLT5.cjs → chunk-ULWRNGGE.cjs} +25 -4
  62. package/dist/chunk-ULWRNGGE.cjs.map +1 -0
  63. package/dist/{chunk-BMWZTNZB.js → chunk-VRPRAU3J.js} +3 -3
  64. package/dist/{chunk-BMWZTNZB.js.map → chunk-VRPRAU3J.js.map} +1 -1
  65. package/dist/collaboration/index.cjs +44 -45
  66. package/dist/collaboration/index.js +2 -3
  67. package/dist/connect/index.cjs +64 -35
  68. package/dist/connect/index.cjs.map +1 -1
  69. package/dist/connect/index.d.ts +1 -1
  70. package/dist/connect/index.js +36 -9
  71. package/dist/connect/index.js.map +1 -1
  72. package/dist/connection/ConnectedSettings.d.ts +13 -0
  73. package/dist/document-tools/index.cjs +4 -5
  74. package/dist/document-tools/index.cjs.map +1 -1
  75. package/dist/document-tools/index.js +1 -2
  76. package/dist/document-tools/index.js.map +1 -1
  77. package/dist/facts/index.cjs +2 -2
  78. package/dist/facts/index.js +2 -2
  79. package/dist/files/import/index.d.ts +0 -1
  80. package/dist/files/index.cjs +24 -88
  81. package/dist/files/index.cjs.map +1 -1
  82. package/dist/files/index.js +6 -68
  83. package/dist/files/index.js.map +1 -1
  84. package/dist/home/index.cjs +1 -1
  85. package/dist/home/index.js +1 -1
  86. package/dist/index.cjs +536 -537
  87. package/dist/index.cjs.map +1 -1
  88. package/dist/index.js +13 -14
  89. package/dist/index.js.map +1 -1
  90. package/dist/settings/Billing.d.ts +4 -0
  91. package/dist/settings/IdentityVerification.d.ts +83 -0
  92. package/dist/settings/PlanBadge.d.ts +2 -2
  93. package/dist/settings/PlanCard.d.ts +6 -1
  94. package/dist/settings/ProfileCard.d.ts +5 -1
  95. package/dist/settings/SubscriptionParts.d.ts +6 -2
  96. package/dist/settings/index.cjs +128 -95
  97. package/dist/settings/index.cjs.map +1 -1
  98. package/dist/settings/index.d.ts +1 -0
  99. package/dist/settings/index.js +64 -47
  100. package/dist/settings/index.js.map +1 -1
  101. package/dist/shell/ActionCluster.d.ts +3 -1
  102. package/dist/shell/index.cjs +55 -55
  103. package/dist/shell/index.js +3 -3
  104. package/dist/studio/index.cjs +6 -6
  105. package/dist/studio/index.js +5 -5
  106. package/dist/workspaces/index.cjs +2 -3
  107. package/dist/workspaces/index.cjs.map +1 -1
  108. package/dist/workspaces/index.js +1 -2
  109. package/dist/workspaces/index.js.map +1 -1
  110. package/package.json +23 -5
  111. package/src/calendar/calendar.css +316 -0
  112. package/dist/chunk-2ZTONLT5.cjs.map +0 -1
  113. package/dist/chunk-7WM62NMM.cjs.map +0 -1
  114. package/dist/chunk-CPMNAJLF.js.map +0 -1
  115. package/dist/chunk-DCDVWPMB.cjs +0 -29
  116. package/dist/chunk-DCDVWPMB.cjs.map +0 -1
  117. package/dist/chunk-L5UPP2HC.js.map +0 -1
  118. package/dist/chunk-TJMKFY5P.js +0 -27
  119. package/dist/chunk-TJMKFY5P.js.map +0 -1
  120. package/dist/chunk-VUEZARW5.cjs.map +0 -1
  121. package/dist/chunk-VZGBCBYB.js.map +0 -1
  122. package/dist/files/import/CalendarImportRow.d.ts +0 -26
@@ -1,8 +1,28 @@
1
1
  "use client";
2
- import { useRestoreFocus } from './chunk-TJMKFY5P.js';
3
2
  import { DialogHeader, cn, Dialog, DialogContent, DialogTitle, DialogDescription, DialogFooter } from '@arbidocs/react/ui';
3
+ import { useRef, useMemo } from 'react';
4
4
  import { jsx, jsxs } from 'react/jsx-runtime';
5
5
 
6
+ // src/settings/ModalScaffold.tsx
7
+ function useRestoreFocus() {
8
+ const origin = useRef(null);
9
+ return useMemo(
10
+ () => ({
11
+ onOpenAutoFocus: () => {
12
+ origin.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;
13
+ },
14
+ onCloseAutoFocus: (event) => {
15
+ const element = origin.current;
16
+ origin.current = null;
17
+ if (element && element.isConnected && element !== document.body) {
18
+ event.preventDefault();
19
+ element.focus();
20
+ }
21
+ }
22
+ }),
23
+ []
24
+ );
25
+ }
6
26
  var MODAL_SECTION_TITLE_CLASS = "mb-2 flex items-center gap-1 text-sm font-medium text-muted-foreground";
7
27
  function ModalHeader({ className, ...props }) {
8
28
  return /* @__PURE__ */ jsx(
@@ -114,6 +134,6 @@ function ModalScaffold({
114
134
  ModalScaffold.Body = ModalBody;
115
135
  ModalScaffold.Footer = ModalFooter;
116
136
 
117
- export { MODAL_SECTION_TITLE_CLASS, ModalHeader, ModalScaffold, ModalSection, ModalSectionTitle };
118
- //# sourceMappingURL=chunk-CPMNAJLF.js.map
119
- //# sourceMappingURL=chunk-CPMNAJLF.js.map
137
+ export { MODAL_SECTION_TITLE_CLASS, ModalHeader, ModalScaffold, ModalSection, ModalSectionTitle, useRestoreFocus };
138
+ //# sourceMappingURL=chunk-TX2ZICS7.js.map
139
+ //# sourceMappingURL=chunk-TX2ZICS7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/useRestoreFocus.ts","../src/settings/ModalScaffold.tsx"],"names":[],"mappings":"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","file":"chunk-TX2ZICS7.js","sourcesContent":["import { useMemo, useRef } from 'react'\n\n/**\n * Props for a Radix `DialogContent` that put focus back where it was when the dialog opened.\n *\n * Radix Dialog returns focus to its `Trigger` on close and, when the dialog is opened from state\n * (no `DialogTrigger`, as every controlled dialog in the blocks is), drops it to `<body>`:\n * a keyboard or screen-reader user loses their place. Spread the result on `DialogContent`.\n */\nexport function useRestoreFocus(): {\n onOpenAutoFocus: (event: Event) => void\n onCloseAutoFocus: (event: Event) => void\n} {\n const origin = useRef<HTMLElement | null>(null)\n return useMemo(\n () => ({\n onOpenAutoFocus: () => {\n // Runs before the dialog moves focus inside, so this is still the opener.\n origin.current =\n document.activeElement instanceof HTMLElement ? document.activeElement : null\n },\n onCloseAutoFocus: (event: Event) => {\n const element = origin.current\n origin.current = null\n if (element && element.isConnected && element !== document.body) {\n event.preventDefault()\n element.focus()\n }\n },\n }),\n []\n )\n}\n","import type { ComponentProps, ReactNode, RefObject } from 'react'\nimport {\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n type DialogPresentation,\n} from '@arbidocs/react/ui'\nimport { useRestoreFocus } from '../lib/useRestoreFocus'\n\n/** Tailwind classes for a modal section heading (also usable on a `Label`). */\nexport const MODAL_SECTION_TITLE_CLASS =\n 'mb-2 flex items-center gap-1 text-sm font-medium text-muted-foreground'\n\n/** Header of a hand-assembled modal: no tinted band, just space. */\nexport function ModalHeader({ className, ...props }: ComponentProps<typeof DialogHeader>) {\n return (\n <DialogHeader\n data-slot=\"modal-header\"\n className={cn('flex-shrink-0 rounded-t-lg bg-transparent p-6 pb-3 pr-12', className)}\n {...props}\n />\n )\n}\n\n/** A padded group inside a modal body. */\nexport function ModalSection({ className, ...props }: ComponentProps<'div'>) {\n return <div data-slot=\"modal-section\" className={cn('pt-4', className)} {...props} />\n}\n\n/** Muted label above the content of a {@link ModalSection}. */\nexport function ModalSectionTitle({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"modal-section-title\"\n className={cn(MODAL_SECTION_TITLE_CLASS, className)}\n {...props}\n />\n )\n}\n\nexport type ModalSize = 'sm' | 'md' | 'lg' | 'xl'\n\nconst SIZE_CLASS: Record<ModalSize, string> = {\n sm: 'sm:max-w-sm',\n md: 'sm:max-w-md',\n lg: 'sm:max-w-2xl',\n xl: 'sm:max-w-4xl',\n}\n\nexport interface ModalScaffoldProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: ReactNode\n /** Accessible description; visually hidden unless `showDescription`. */\n description?: ReactNode\n showDescription?: boolean\n /** Icon shown before the title. */\n icon?: ReactNode\n size?: ModalSize\n /** Phone presentation; defaults to a bottom sheet for `lg`/`xl`, a centred box otherwise. */\n presentation?: DialogPresentation\n className?: string\n testId?: string\n /**\n * `alertdialog` for a destructive or blocking confirmation: announced as an alert, dismissed\n * only through its own buttons or Escape (not by clicking outside).\n */\n role?: 'dialog' | 'alertdialog'\n /**\n * Block dismissal by outside click AND Escape; only the dialog's own buttons close it. For a\n * dialog that shows a secret once (a new API key). Default false. An `alertdialog` already\n * ignores outside clicks.\n */\n dismissible?: boolean\n /** Called on a pointer/focus interaction outside; `preventDefault()` keeps the dialog open. */\n onInteractOutside?: (event: Event) => void\n /** Called on Escape; `preventDefault()` keeps the dialog open. */\n onEscapeKeyDown?: (event: KeyboardEvent) => void\n /** Element that receives focus when the dialog opens (an alert dialog focuses its safe action). */\n initialFocusRef?: RefObject<HTMLElement | null>\n children?: ReactNode\n}\n\nfunction ModalBody({ className, ...props }: ComponentProps<'div'>) {\n return <div data-slot=\"modal-body\" className={cn('space-y-4', className)} {...props} />\n}\n\n/**\n * Action row. Stacked full-width on phones (primary action on top), right-aligned on wider\n * screens. Sticks to the bottom of the scrolling dialog body so the actions stay reachable.\n */\nfunction ModalFooter({ className, ...props }: ComponentProps<typeof DialogFooter>) {\n return (\n <DialogFooter\n data-slot=\"modal-footer\"\n className={cn(\n 'sticky bottom-0 -mx-6 -mb-6 mt-4 border-t border-border bg-background px-6 py-3',\n className\n )}\n {...props}\n />\n )\n}\n\n/**\n * Standard dialog: icon + title + description header, then the compound\n * `ModalScaffold.Body` / `ModalScaffold.Footer` slots.\n */\nexport function ModalScaffold({\n open,\n onOpenChange,\n title,\n description,\n showDescription = false,\n icon,\n size = 'md',\n presentation,\n className,\n testId,\n role = 'dialog',\n initialFocusRef,\n dismissible = true,\n onInteractOutside,\n onEscapeKeyDown,\n children,\n}: ModalScaffoldProps) {\n const restoreFocus = useRestoreFocus()\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n role={role}\n presentation={presentation ?? (size === 'lg' || size === 'xl' ? 'sheet' : 'center')}\n className={cn(SIZE_CLASS[size], 'flex flex-col gap-0 overflow-hidden p-0', className)}\n data-testid={testId}\n onInteractOutside={(e) => {\n if (role === 'alertdialog' || !dismissible) e.preventDefault()\n onInteractOutside?.(e)\n }}\n onEscapeKeyDown={(e) => {\n if (!dismissible) e.preventDefault()\n onEscapeKeyDown?.(e)\n }}\n onOpenAutoFocus={(e) => {\n restoreFocus.onOpenAutoFocus(e)\n if (initialFocusRef?.current) {\n e.preventDefault()\n initialFocusRef.current.focus()\n }\n }}\n onCloseAutoFocus={restoreFocus.onCloseAutoFocus}\n >\n <ModalHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n {icon}\n {title}\n </DialogTitle>\n <DialogDescription className={showDescription ? undefined : 'sr-only'}>\n {description ?? title}\n </DialogDescription>\n </ModalHeader>\n <div\n data-slot=\"modal-scroll\"\n className=\"min-h-0 flex-1 space-y-4 overflow-y-auto overscroll-contain px-6 pb-6\"\n >\n {children}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\nModalScaffold.Body = ModalBody\nModalScaffold.Footer = ModalFooter\n"]}
@@ -1,10 +1,30 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkDCDVWPMB_cjs = require('./chunk-DCDVWPMB.cjs');
5
4
  var ui = require('@arbidocs/react/ui');
5
+ var react = require('react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
 
8
+ // src/settings/ModalScaffold.tsx
9
+ function useRestoreFocus() {
10
+ const origin = react.useRef(null);
11
+ return react.useMemo(
12
+ () => ({
13
+ onOpenAutoFocus: () => {
14
+ origin.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;
15
+ },
16
+ onCloseAutoFocus: (event) => {
17
+ const element = origin.current;
18
+ origin.current = null;
19
+ if (element && element.isConnected && element !== document.body) {
20
+ event.preventDefault();
21
+ element.focus();
22
+ }
23
+ }
24
+ }),
25
+ []
26
+ );
27
+ }
8
28
  var MODAL_SECTION_TITLE_CLASS = "mb-2 flex items-center gap-1 text-sm font-medium text-muted-foreground";
9
29
  function ModalHeader({ className, ...props }) {
10
30
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -69,7 +89,7 @@ function ModalScaffold({
69
89
  onEscapeKeyDown,
70
90
  children
71
91
  }) {
72
- const restoreFocus = chunkDCDVWPMB_cjs.useRestoreFocus();
92
+ const restoreFocus = useRestoreFocus();
73
93
  return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(
74
94
  ui.DialogContent,
75
95
  {
@@ -121,5 +141,6 @@ exports.ModalHeader = ModalHeader;
121
141
  exports.ModalScaffold = ModalScaffold;
122
142
  exports.ModalSection = ModalSection;
123
143
  exports.ModalSectionTitle = ModalSectionTitle;
124
- //# sourceMappingURL=chunk-2ZTONLT5.cjs.map
125
- //# sourceMappingURL=chunk-2ZTONLT5.cjs.map
144
+ exports.useRestoreFocus = useRestoreFocus;
145
+ //# sourceMappingURL=chunk-ULWRNGGE.cjs.map
146
+ //# sourceMappingURL=chunk-ULWRNGGE.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/useRestoreFocus.ts","../src/settings/ModalScaffold.tsx"],"names":["useRef","useMemo","jsx","DialogHeader","cn","DialogFooter","Dialog","jsxs","DialogContent","DialogTitle","DialogDescription"],"mappings":"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","file":"chunk-ULWRNGGE.cjs","sourcesContent":["import { useMemo, useRef } from 'react'\n\n/**\n * Props for a Radix `DialogContent` that put focus back where it was when the dialog opened.\n *\n * Radix Dialog returns focus to its `Trigger` on close and, when the dialog is opened from state\n * (no `DialogTrigger`, as every controlled dialog in the blocks is), drops it to `<body>`:\n * a keyboard or screen-reader user loses their place. Spread the result on `DialogContent`.\n */\nexport function useRestoreFocus(): {\n onOpenAutoFocus: (event: Event) => void\n onCloseAutoFocus: (event: Event) => void\n} {\n const origin = useRef<HTMLElement | null>(null)\n return useMemo(\n () => ({\n onOpenAutoFocus: () => {\n // Runs before the dialog moves focus inside, so this is still the opener.\n origin.current =\n document.activeElement instanceof HTMLElement ? document.activeElement : null\n },\n onCloseAutoFocus: (event: Event) => {\n const element = origin.current\n origin.current = null\n if (element && element.isConnected && element !== document.body) {\n event.preventDefault()\n element.focus()\n }\n },\n }),\n []\n )\n}\n","import type { ComponentProps, ReactNode, RefObject } from 'react'\nimport {\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n type DialogPresentation,\n} from '@arbidocs/react/ui'\nimport { useRestoreFocus } from '../lib/useRestoreFocus'\n\n/** Tailwind classes for a modal section heading (also usable on a `Label`). */\nexport const MODAL_SECTION_TITLE_CLASS =\n 'mb-2 flex items-center gap-1 text-sm font-medium text-muted-foreground'\n\n/** Header of a hand-assembled modal: no tinted band, just space. */\nexport function ModalHeader({ className, ...props }: ComponentProps<typeof DialogHeader>) {\n return (\n <DialogHeader\n data-slot=\"modal-header\"\n className={cn('flex-shrink-0 rounded-t-lg bg-transparent p-6 pb-3 pr-12', className)}\n {...props}\n />\n )\n}\n\n/** A padded group inside a modal body. */\nexport function ModalSection({ className, ...props }: ComponentProps<'div'>) {\n return <div data-slot=\"modal-section\" className={cn('pt-4', className)} {...props} />\n}\n\n/** Muted label above the content of a {@link ModalSection}. */\nexport function ModalSectionTitle({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"modal-section-title\"\n className={cn(MODAL_SECTION_TITLE_CLASS, className)}\n {...props}\n />\n )\n}\n\nexport type ModalSize = 'sm' | 'md' | 'lg' | 'xl'\n\nconst SIZE_CLASS: Record<ModalSize, string> = {\n sm: 'sm:max-w-sm',\n md: 'sm:max-w-md',\n lg: 'sm:max-w-2xl',\n xl: 'sm:max-w-4xl',\n}\n\nexport interface ModalScaffoldProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: ReactNode\n /** Accessible description; visually hidden unless `showDescription`. */\n description?: ReactNode\n showDescription?: boolean\n /** Icon shown before the title. */\n icon?: ReactNode\n size?: ModalSize\n /** Phone presentation; defaults to a bottom sheet for `lg`/`xl`, a centred box otherwise. */\n presentation?: DialogPresentation\n className?: string\n testId?: string\n /**\n * `alertdialog` for a destructive or blocking confirmation: announced as an alert, dismissed\n * only through its own buttons or Escape (not by clicking outside).\n */\n role?: 'dialog' | 'alertdialog'\n /**\n * Block dismissal by outside click AND Escape; only the dialog's own buttons close it. For a\n * dialog that shows a secret once (a new API key). Default false. An `alertdialog` already\n * ignores outside clicks.\n */\n dismissible?: boolean\n /** Called on a pointer/focus interaction outside; `preventDefault()` keeps the dialog open. */\n onInteractOutside?: (event: Event) => void\n /** Called on Escape; `preventDefault()` keeps the dialog open. */\n onEscapeKeyDown?: (event: KeyboardEvent) => void\n /** Element that receives focus when the dialog opens (an alert dialog focuses its safe action). */\n initialFocusRef?: RefObject<HTMLElement | null>\n children?: ReactNode\n}\n\nfunction ModalBody({ className, ...props }: ComponentProps<'div'>) {\n return <div data-slot=\"modal-body\" className={cn('space-y-4', className)} {...props} />\n}\n\n/**\n * Action row. Stacked full-width on phones (primary action on top), right-aligned on wider\n * screens. Sticks to the bottom of the scrolling dialog body so the actions stay reachable.\n */\nfunction ModalFooter({ className, ...props }: ComponentProps<typeof DialogFooter>) {\n return (\n <DialogFooter\n data-slot=\"modal-footer\"\n className={cn(\n 'sticky bottom-0 -mx-6 -mb-6 mt-4 border-t border-border bg-background px-6 py-3',\n className\n )}\n {...props}\n />\n )\n}\n\n/**\n * Standard dialog: icon + title + description header, then the compound\n * `ModalScaffold.Body` / `ModalScaffold.Footer` slots.\n */\nexport function ModalScaffold({\n open,\n onOpenChange,\n title,\n description,\n showDescription = false,\n icon,\n size = 'md',\n presentation,\n className,\n testId,\n role = 'dialog',\n initialFocusRef,\n dismissible = true,\n onInteractOutside,\n onEscapeKeyDown,\n children,\n}: ModalScaffoldProps) {\n const restoreFocus = useRestoreFocus()\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n role={role}\n presentation={presentation ?? (size === 'lg' || size === 'xl' ? 'sheet' : 'center')}\n className={cn(SIZE_CLASS[size], 'flex flex-col gap-0 overflow-hidden p-0', className)}\n data-testid={testId}\n onInteractOutside={(e) => {\n if (role === 'alertdialog' || !dismissible) e.preventDefault()\n onInteractOutside?.(e)\n }}\n onEscapeKeyDown={(e) => {\n if (!dismissible) e.preventDefault()\n onEscapeKeyDown?.(e)\n }}\n onOpenAutoFocus={(e) => {\n restoreFocus.onOpenAutoFocus(e)\n if (initialFocusRef?.current) {\n e.preventDefault()\n initialFocusRef.current.focus()\n }\n }}\n onCloseAutoFocus={restoreFocus.onCloseAutoFocus}\n >\n <ModalHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n {icon}\n {title}\n </DialogTitle>\n <DialogDescription className={showDescription ? undefined : 'sr-only'}>\n {description ?? title}\n </DialogDescription>\n </ModalHeader>\n <div\n data-slot=\"modal-scroll\"\n className=\"min-h-0 flex-1 space-y-4 overflow-y-auto overscroll-contain px-6 pb-6\"\n >\n {children}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\nModalScaffold.Body = ModalBody\nModalScaffold.Footer = ModalFooter\n"]}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { Toaster } from './chunk-BV7FEMSI.js';
3
- import { useAssistantDock, useChatSurface } from './chunk-DABEWNL2.js';
3
+ import { useAssistantDock, useChatSurface } from './chunk-G5DP27DU.js';
4
4
  import { BlocksTooltipProvider } from './chunk-KZJAG7T3.js';
5
5
  import { listOptionId } from './chunk-AA3PT6KR.js';
6
6
  import { prefixedTestId, testIdOr } from './chunk-7F6CBP3Z.js';
@@ -1640,5 +1640,5 @@ function useRecipientDraft({
1640
1640
  }
1641
1641
 
1642
1642
  export { AssistantToaster, BranchControls, ComposerAccessories, ComposerTools, ContextActionButton, ContextCheckRow, ContextPanelContent, ContextPanelFooter, ContextPanelTabs, ContextPickerList, ContextPickerRow, ContextSearchInput, ContextSelectList, ContextSelectRow, Conversation, ConversationBody, ConversationHeader, ConversationHeaderActions, ConversationHistoryPane, ConversationLoading, ConversationMain, ConversationRoot, ConversationSearchView, ConversationSettingsButton, DEFAULT_BRANCH_CONTROLS_LABELS, DEFAULT_CONVERSATION_LAYOUT_LABELS, DEFAULT_CONVERSATION_PARTS_LABELS, DEFAULT_CONVERSATION_SEARCH_LABELS, DEFAULT_LABEL_PIN_ROW_LABELS, DEFAULT_MODEL_PRICING_TIP_LABELS, DEFAULT_PENDING_ANSWER_BAR_LABELS, DEFAULT_PINNED_DOC_CHIP_LABELS, DEFAULT_SLASH_MENU_LABELS, DEFAULT_THREAD_MAP_LABELS, LabelPinRow, ModelAutoIcon, ModelConfigureButton, ModelDot, ModelMenuDivider, ModelMenuMessage, ModelOption, ModelOptionLabel, ModelPickerPopover, ModelPickerTrigger, ModelPricingTip, ModelTierIcon, ModelTierOption, ModelTriggerContent, NewChatButton, NewPaChatButton, PaModeBadge, PendingAnswerBar, PinnedDocChip, SlashMenu, ThreadMap, ThreadMapDiagram, ThreadMapError, ThreadMapLoading, getParticipantTints, hasMessageBody, isLongPastedText, useDismissibleCard, useLongPaste, useRecipientDraft };
1643
- //# sourceMappingURL=chunk-BMWZTNZB.js.map
1644
- //# sourceMappingURL=chunk-BMWZTNZB.js.map
1643
+ //# sourceMappingURL=chunk-VRPRAU3J.js.map
1644
+ //# sourceMappingURL=chunk-VRPRAU3J.js.map