@bettercms-ai/kit 2.0.0 → 2.0.2
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.
- package/dist/adapters/lossy.d.ts +14 -6
- package/dist/adapters/lossy.js +23 -11
- package/dist/adapters/lossy.js.map +1 -1
- package/dist/adapters/prod-types.d.ts +46 -14
- package/dist/adapters/prod-types.js +37 -35
- package/dist/adapters/prod-types.js.map +1 -1
- package/dist/adapters/schema.d.ts +39 -0
- package/dist/adapters/schema.js +281 -82
- package/dist/adapters/schema.js.map +1 -1
- package/dist/context.d.ts +39 -0
- package/dist/context.js +40 -1
- package/dist/context.js.map +1 -1
- package/dist/controls/form-picker-register.d.ts +7 -1
- package/dist/controls/form-picker-register.js +1 -5
- package/dist/controls/form-picker-register.js.map +1 -1
- package/dist/controls/icon.d.ts +1 -1
- package/dist/controls/icon.js +1 -1
- package/dist/controls/icon.js.map +1 -1
- package/dist/controls/link.d.ts +11 -4
- package/dist/controls/link.js +120 -202
- package/dist/controls/link.js.map +1 -1
- package/dist/controls/location.js +3 -8
- package/dist/controls/location.js.map +1 -1
- package/dist/controls/media.d.ts +0 -14
- package/dist/controls/media.js +52 -95
- package/dist/controls/media.js.map +1 -1
- package/dist/controls/reference-services.d.ts +23 -2
- package/dist/controls/reference.d.ts +2 -2
- package/dist/controls/reference.js +79 -28
- package/dist/controls/reference.js.map +1 -1
- package/dist/controls/rich-text/article-shell.d.ts +145 -0
- package/dist/controls/rich-text/article-shell.js +514 -0
- package/dist/controls/rich-text/article-shell.js.map +1 -0
- package/dist/controls/rich-text/author.d.ts +25 -0
- package/dist/controls/rich-text/author.js +107 -0
- package/dist/controls/rich-text/author.js.map +1 -0
- package/dist/controls/rich-text/blocks.d.ts +19 -2
- package/dist/controls/rich-text/blocks.js +275 -638
- package/dist/controls/rich-text/blocks.js.map +1 -1
- package/dist/controls/rich-text/button.d.ts +23 -0
- package/dist/controls/rich-text/button.js +81 -0
- package/dist/controls/rich-text/button.js.map +1 -0
- package/dist/controls/rich-text/catalog.d.ts +2 -5
- package/dist/controls/rich-text/catalog.js +121 -7
- package/dist/controls/rich-text/catalog.js.map +1 -1
- package/dist/controls/rich-text/checklist.d.ts +24 -0
- package/dist/controls/rich-text/checklist.js +115 -0
- package/dist/controls/rich-text/checklist.js.map +1 -0
- package/dist/controls/rich-text/codec.d.ts +15 -1
- package/dist/controls/rich-text/codec.js +11 -1
- package/dist/controls/rich-text/codec.js.map +1 -1
- package/dist/controls/rich-text/columns.d.ts +41 -0
- package/dist/controls/rich-text/columns.js +181 -0
- package/dist/controls/rich-text/columns.js.map +1 -0
- package/dist/controls/rich-text/control.js +1 -0
- package/dist/controls/rich-text/control.js.map +1 -1
- package/dist/controls/rich-text/dom.d.ts +84 -4
- package/dist/controls/rich-text/dom.js +171 -10
- package/dist/controls/rich-text/dom.js.map +1 -1
- package/dist/controls/rich-text/editor.d.ts +4 -2
- package/dist/controls/rich-text/editor.js +199 -26
- package/dist/controls/rich-text/editor.js.map +1 -1
- package/dist/controls/rich-text/embed.d.ts +28 -0
- package/dist/controls/rich-text/embed.js +210 -0
- package/dist/controls/rich-text/embed.js.map +1 -0
- package/dist/controls/rich-text/footnote.d.ts +41 -0
- package/dist/controls/rich-text/footnote.js +185 -0
- package/dist/controls/rich-text/footnote.js.map +1 -0
- package/dist/controls/rich-text/gallery.d.ts +28 -0
- package/dist/controls/rich-text/gallery.js +167 -0
- package/dist/controls/rich-text/gallery.js.map +1 -0
- package/dist/controls/rich-text/link-form.d.ts +13 -1
- package/dist/controls/rich-text/link-form.js +41 -7
- package/dist/controls/rich-text/link-form.js.map +1 -1
- package/dist/controls/rich-text/ops.js +6 -0
- package/dist/controls/rich-text/ops.js.map +1 -1
- package/dist/controls/rich-text/related.d.ts +49 -0
- package/dist/controls/rich-text/related.js +233 -0
- package/dist/controls/rich-text/related.js.map +1 -0
- package/dist/controls/rich-text/toc.d.ts +47 -0
- package/dist/controls/rich-text/toc.js +160 -0
- package/dist/controls/rich-text/toc.js.map +1 -0
- package/dist/controls/slot-register.d.ts +6 -1
- package/dist/controls/slot-register.js +1 -4
- package/dist/controls/slot-register.js.map +1 -1
- package/dist/core/core.d.ts +11 -3
- package/dist/core/core.js +24 -6
- package/dist/core/core.js.map +1 -1
- package/dist/core/facets.d.ts +16 -0
- package/dist/core/facets.js +17 -1
- package/dist/core/facets.js.map +1 -1
- package/dist/core/index.js +2 -2
- package/dist/index.js +16 -5
- package/dist/index.js.map +1 -1
- package/dist/ledgers/exclusions.v1.js +141 -0
- package/dist/ledgers/exclusions.v1.js.map +1 -0
- package/dist/library/coverage.d.ts +13 -1
- package/dist/library/coverage.js +12 -1
- package/dist/library/coverage.js.map +1 -1
- package/dist/library/kit-catalog.json +158 -154
- package/dist/schema/types.d.ts +17 -0
- package/dist/schema/types.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/testing/coverage-extras.d.ts +8 -0
- package/dist/testing/coverage-extras.js +44 -0
- package/dist/testing/coverage-extras.js.map +1 -0
- package/dist/testing/exclusions.d.ts +30 -0
- package/dist/testing/exclusions.js +13 -0
- package/dist/testing/exclusions.js.map +1 -0
- package/dist/ui/autocomplete.d.ts +29 -1
- package/dist/ui/autocomplete.js +102 -47
- package/dist/ui/autocomplete.js.map +1 -1
- package/dist/ui/button.js +3 -5
- package/dist/ui/button.js.map +1 -1
- package/dist/ui/index.js +2 -2
- package/dist/ui/overlay.d.ts +4 -1
- package/dist/ui/overlay.js +2 -1
- package/dist/ui/overlay.js.map +1 -1
- package/dist/ui/toast.js +1 -1
- package/package.json +8 -2
package/dist/ui/overlay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.js","names":[],"sources":["../../src/ui/overlay.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\";\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\nimport { PreviewCard as PreviewCardPrimitive } from \"@base-ui/react/preview-card\";\nimport { Separator } from \"@base-ui/react/separator\";\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { IconCheck, IconChevronRight, IconX } from \"@tabler/icons-react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { cn } from \"../lib/cn\";\nimport { IconButton, TooltipScope } from \"./button\";\nimport { useShortcutHints } from \"./shortcut-hint\";\nimport { KIT_SCOPE } from \"./surfaces\";\nimport { MODAL_LAYER, TooltipLayer, TooltipRoot } from \"./tooltip-root\";\n\n/* Z-index scale: popover/menu 80 · modal overlay 60 / content 61 · sheet 55 · toast 100 · tooltip 90 */\n\n/** Base UI parts accept a className function; the kit takes plain strings so cn() can merge them. */\ntype Cls<P> = Omit<P, \"className\"> & { className?: string };\nconst layer = { [MODAL_LAYER]: \"\" };\n\n/* ── Dismiss guards (DESIGN.md §12) ──────────────────────────────────────────\n Every kit layer runs its close requests through keepOpen():\n - Escape owned by an inner list: an inner element that handles Escape calls event.preventDefault(); the layer\n keeps itself open. (Base UI's own nested layers already close innermost first.)\n - Floating layers portalled outside (an editor's selection toolbar, a slash menu) carry data-floating-layer:\n a press there counts as inside, so it never dismisses the layer underneath.\n - A press on a popover's anchor (the input a list hangs off) counts as inside. */\ntype CloseDetails = { reason: string; event: Event; cancel: () => void };\nexport const FLOATING_LAYER = \"[data-floating-layer]\";\nfunction keepOpen(details: CloseDetails, anchor?: Element | null) {\n const target = details.event?.target;\n const keep =\n (details.reason === \"escape-key\" && details.event.defaultPrevented) ||\n (details.reason === \"outside-press\" &&\n target instanceof Element &&\n (!!target.closest(FLOATING_LAYER) || !!anchor?.contains(target)));\n if (keep) details.cancel();\n return keep;\n}\nfunction guard<D extends CloseDetails>(onOpenChange: ((open: boolean, d: D) => void) | undefined, anchor?: () => Element | null) {\n return (open: boolean, details: D) => {\n if (!open && keepOpen(details, anchor?.())) return;\n onOpenChange?.(open, details);\n };\n}\n\n/* ── Tooltip ───────────────────────────────────────────────────────────── */\nexport const TooltipProvider = TooltipPrimitive.Provider;\nexport function Tooltip({\n content,\n children,\n side = \"top\",\n shortcut,\n delay = 350,\n disabled,\n}: {\n content: React.ReactNode;\n /** the trigger: one element that forwards its ref and spreads props */\n children: React.ReactElement;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** a key hint (D44): shown only while keyboard hints are on */\n shortcut?: string;\n delay?: number;\n disabled?: boolean;\n}) {\n const hints = useShortcutHints();\n if (disabled || !content) return <TooltipScope.Provider value>{children}</TooltipScope.Provider>;\n return (\n <TooltipScope.Provider value>\n <TooltipRoot>\n <TooltipPrimitive.Trigger delay={delay} render={children} />\n {/* Fixed max width: long text (truncated titles, help) wraps into a calm block instead of a viewport-wide strip. */}\n <TooltipLayer side={side}>\n <span className=\"line-clamp-[8] min-w-0 whitespace-normal [overflow-wrap:anywhere]\">{content}</span>\n {shortcut && hints ? (\n <kbd data-hint=\"shortcuts\" className=\"mt-px shrink-0 rounded-kit-sm bg-kit-ink-active px-1 font-kit-sans text-kit-2xs\">\n {shortcut}\n </kbd>\n ) : null}\n </TooltipLayer>\n </TooltipRoot>\n </TooltipScope.Provider>\n );\n}\n\n/* ── Popover ───────────────────────────────────────────────────────────── */\nconst AnchorContext = React.createContext<React.RefObject<HTMLElement | null> | null>(null);\n\nexport function Popover({ onOpenChange, ...props }: PopoverPrimitive.Root.Props) {\n const anchor = React.useRef<HTMLElement | null>(null);\n return (\n <AnchorContext.Provider value={anchor}>\n <PopoverPrimitive.Root {...props} onOpenChange={guard(onOpenChange, () => anchor.current)} />\n </AnchorContext.Provider>\n );\n}\nexport const PopoverTrigger = PopoverPrimitive.Trigger;\nexport const PopoverClose = PopoverPrimitive.Close;\n\n/** Positions the popover against this element instead of the trigger; presses on it count as inside. */\nexport function PopoverAnchor({ render, ...props }: useRender.ComponentProps<\"div\">) {\n const anchor = React.useContext(AnchorContext);\n return useRender({ render: render ?? <div />, ref: anchor ?? undefined, props });\n}\n\nexport function PopoverContent({\n className,\n align = \"start\",\n side,\n sideOffset = 6,\n keepFocus,\n onMouseDown,\n collisionBoundary,\n collisionPadding = 12,\n collisionAvoidance,\n ...props\n}: Cls<PopoverPrimitive.Popup.Props> & {\n align?: \"start\" | \"center\" | \"end\";\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n sideOffset?: number;\n /** keep the popup inside this area (e.g. the scrolling panel under a sticky header) instead of the viewport */\n collisionBoundary?: PopoverPrimitive.Positioner.Props[\"collisionBoundary\"];\n collisionPadding?: PopoverPrimitive.Positioner.Props[\"collisionPadding\"];\n /** e.g. `{ align: \"shift\" }`: slide along the edge to fit instead of flipping start ↔ end (V2's Radix behaviour) */\n collisionAvoidance?: PopoverPrimitive.Positioner.Props[\"collisionAvoidance\"];\n /** §12 no-focus-steal: typing stays in the input the list hangs off. The popup takes no focus on open, gives none\n * back on close, and a mouse-down inside it never blurs the input (text fields inside the popup still focus). */\n keepFocus?: boolean;\n}) {\n const anchor = React.useContext(AnchorContext);\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align={align}\n side={side}\n sideOffset={sideOffset}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n anchor={anchor?.current ? anchor : undefined}\n className=\"z-[var(--kit-z-menu,80)]\"\n {...KIT_SCOPE}\n >\n <PopoverPrimitive.Popup\n initialFocus={keepFocus ? false : undefined}\n finalFocus={keepFocus ? false : undefined}\n onMouseDown={(e) => {\n onMouseDown?.(e);\n if (keepFocus && !(e.target as Element).closest(\"input, textarea, select, [contenteditable=true]\")) e.preventDefault();\n }}\n className={cn(\"glass w-72 rounded-kit-xl border p-3 text-kit-fg outline-none data-[open]:animate-kit-pop-in\", className)}\n {...props}\n />\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n );\n}\n\n/* ── Hover card ────────────────────────────────────────────────────────── */\nexport const HoverCard = PreviewCardPrimitive.Root;\nexport const HoverCardTrigger = PreviewCardPrimitive.Trigger;\nexport function HoverCardContent({ className, ...props }: Cls<PreviewCardPrimitive.Popup.Props>) {\n return (\n <PreviewCardPrimitive.Portal>\n <PreviewCardPrimitive.Positioner sideOffset={8} collisionPadding={12} className=\"z-[var(--kit-z-menu,80)]\" {...KIT_SCOPE}>\n <PreviewCardPrimitive.Popup\n className={cn(\"glass w-72 rounded-kit-xl border p-3 data-[open]:animate-kit-pop-in\", className)}\n {...props}\n />\n </PreviewCardPrimitive.Positioner>\n </PreviewCardPrimitive.Portal>\n );\n}\n\n/* ── Dropdown menu ─────────────────────────────────────────────────────── */\n/** Arrowing past the last item stays put (loopFocus false), like V2's Radix menus. */\nexport function Menu({ onOpenChange, loopFocus = false, ...props }: MenuPrimitive.Root.Props) {\n return <MenuPrimitive.Root loopFocus={loopFocus} {...props} onOpenChange={guard(onOpenChange)} />;\n}\nexport const MenuTrigger = MenuPrimitive.Trigger;\nexport const MenuGroup = MenuPrimitive.Group;\nexport const MenuSub = MenuPrimitive.SubmenuRoot;\nexport const MenuRadioGroup = MenuPrimitive.RadioGroup;\n\nexport function MenuContent({\n className,\n align = \"start\",\n side,\n sideOffset = 6,\n positionerClassName,\n ...props\n}: Cls<MenuPrimitive.Popup.Props> & {\n align?: \"start\" | \"center\" | \"end\";\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n sideOffset?: number;\n /** The layer: a menu opened from a dashboard dialog (z --z-modal) passes `z-[var(--z-dropdown)]`, or it opens behind it. */\n positionerClassName?: string;\n}) {\n return (\n <MenuPrimitive.Portal>\n <MenuPrimitive.Positioner align={align} side={side} sideOffset={sideOffset} collisionPadding={12} className={cn(\"z-[var(--kit-z-menu,80)]\", positionerClassName)} {...KIT_SCOPE}>\n <MenuPrimitive.Popup\n {...layer}\n // capped to the room the positioner measured, so a tall menu scrolls instead of running off the window\n className={cn(\"glass max-h-[var(--available-height)] min-w-48 overflow-y-auto overflow-x-hidden rounded-kit-lg border p-1 text-kit-fg outline-none data-[open]:animate-kit-pop-in\", className)}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\n\nconst itemCls =\n \"relative flex h-8 cursor-pointer select-none items-center gap-2 rounded-kit-md px-2 text-kit-sm text-kit-fg outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-40 data-[highlighted]:bg-kit-hover [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-kit-fg-2\";\n\nexport function MenuItem({\n className,\n icon,\n shortcut,\n danger,\n children,\n ...props\n}: Cls<MenuPrimitive.Item.Props> & { icon?: React.ReactNode; shortcut?: string; danger?: boolean }) {\n return (\n <MenuPrimitive.Item\n className={cn(itemCls, danger && \"text-kit-danger-fg data-[highlighted]:bg-kit-danger-soft [&>svg]:text-kit-danger-fg\", className)}\n {...props}\n >\n {icon}\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n {/* menu shortcut columns are not hints (D44): they always show */}\n {shortcut ? <span className=\"text-kit-xs text-kit-fg-3\">{shortcut}</span> : null}\n </MenuPrimitive.Item>\n );\n}\n\n/** Checking an item closes the menu, like V2's Radix items (pass closeOnClick={false} to keep it open). */\nexport function MenuCheckItem({ className, children, closeOnClick = true, ...props }: Cls<MenuPrimitive.CheckboxItem.Props>) {\n return (\n <MenuPrimitive.CheckboxItem className={cn(itemCls, \"pr-8\", className)} closeOnClick={closeOnClick} {...props}>\n {children}\n <MenuPrimitive.CheckboxItemIndicator className=\"absolute right-2\">\n <IconCheck className=\"size-4\" />\n </MenuPrimitive.CheckboxItemIndicator>\n </MenuPrimitive.CheckboxItem>\n );\n}\n\nexport function MenuRadioItem({ className, children, closeOnClick = true, ...props }: Cls<MenuPrimitive.RadioItem.Props>) {\n return (\n <MenuPrimitive.RadioItem className={cn(itemCls, \"pr-8\", className)} closeOnClick={closeOnClick} {...props}>\n {children}\n <MenuPrimitive.RadioItemIndicator className=\"absolute right-2\">\n <IconCheck className=\"size-4\" />\n </MenuPrimitive.RadioItemIndicator>\n </MenuPrimitive.RadioItem>\n );\n}\n\nexport function MenuSubTrigger({\n className,\n icon,\n children,\n ...props\n}: Cls<MenuPrimitive.SubmenuTrigger.Props> & { icon?: React.ReactNode }) {\n return (\n <MenuPrimitive.SubmenuTrigger className={cn(itemCls, \"data-[popup-open]:bg-kit-hover\", className)} {...props}>\n {icon}\n <span className=\"flex-1\">{children}</span>\n <IconChevronRight className=\"size-3.5 text-kit-fg-3\" />\n </MenuPrimitive.SubmenuTrigger>\n );\n}\nexport function MenuSubContent({ className, ...props }: Cls<MenuPrimitive.Popup.Props>) {\n return (\n <MenuPrimitive.Portal>\n <MenuPrimitive.Positioner sideOffset={6} collisionPadding={12} className=\"z-[calc(var(--kit-z-menu,80)_+_1)]\" {...KIT_SCOPE}>\n <MenuPrimitive.Popup\n className={cn(\"glass min-w-44 rounded-kit-lg border p-1 data-[open]:animate-kit-pop-in\", className)}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\nexport function MenuLabel({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"px-2 pb-1 pt-1.5 text-kit-xs font-medium text-kit-fg-3\", className)} {...props} />;\n}\nexport function MenuSeparator({ className }: { className?: string }) {\n return <Separator className={cn(\"-mx-1 my-1 h-px bg-kit-line\", className)} />;\n}\n\n/* ── Focus return (a11y) ───────────────────────────────────────────────────\n A dialog library remembers the focused element when the dialog opens and refocuses it on close. When a field\n inside autofocuses, that element is already the field, so focus fell to <body> on close. We keep the last few\n focused elements and hand focus back to the real trigger: the newest one that is outside the popup and still\n in the document. Without one, the library's default applies. */\nconst recent: HTMLElement[] = [];\nif (typeof document !== \"undefined\") {\n document.addEventListener(\n \"focusin\",\n (e) => {\n recent.unshift(e.target as HTMLElement);\n recent.length = Math.min(recent.length, 4);\n },\n true,\n );\n}\ntype FinalFocus = DialogPrimitive.Popup.Props[\"finalFocus\"];\nexport function useFocusReturn(finalFocus?: FinalFocus): {\n ref: (el: HTMLElement | null) => void;\n finalFocus: NonNullable<FinalFocus>;\n} {\n const ret = React.useRef<HTMLElement | null>(null);\n const popup = React.useRef<HTMLElement | null>(null);\n const ref = React.useCallback((el: HTMLElement | null) => {\n // Capture once per open (per popup element). A callback ref can be called again on a re-render while open, when\n // focus is already inside the popup and the trigger may have dropped out of `recent`.\n if (el === popup.current) return;\n popup.current = el;\n if (!el) return;\n const active = document.activeElement as HTMLElement | null;\n const outside = (n: HTMLElement | null): n is HTMLElement => !!n && n !== document.body && !el.contains(n);\n ret.current = outside(active) ? active : (recent.find(outside) ?? null);\n }, []);\n return {\n ref,\n finalFocus:\n finalFocus ??\n (() => {\n const t = ret.current;\n return t && t.isConnected ? t : true;\n }),\n };\n}\n\n/** One stable callback ref for both refs, so React does not detach and re-attach them on every render. */\nfunction useMergedRef<T>(a: React.Ref<T> | undefined, b: React.Ref<T> | undefined) {\n return React.useCallback(\n (el: T | null) => {\n for (const r of [a, b]) {\n if (typeof r === \"function\") r(el);\n else if (r) (r as React.RefObject<T | null>).current = el;\n }\n },\n [a, b],\n );\n}\n\n/* ── Modal (Dialog) ────────────────────────────────────────────────────── */\nexport function Modal({ onOpenChange, ...props }: DialogPrimitive.Root.Props) {\n return <DialogPrimitive.Root {...props} onOpenChange={guard(onOpenChange)} />;\n}\nexport const ModalTrigger = DialogPrimitive.Trigger;\nexport const ModalClose = DialogPrimitive.Close;\n\nconst sizes = {\n sm: \"max-w-[400px]\",\n md: \"max-w-[480px]\",\n lg: \"max-w-[640px]\",\n xl: \"max-w-[800px]\",\n full: \"max-w-[min(1280px,calc(100vw-48px))] h-[min(860px,calc(100vh-48px))]\",\n};\n\nexport function ModalContent({\n className,\n size = \"md\",\n children,\n hideClose,\n finalFocus,\n ref,\n ...props\n}: Cls<DialogPrimitive.Popup.Props> & { size?: keyof typeof sizes; hideClose?: boolean }) {\n const focusReturn = useFocusReturn(finalFocus);\n const merged = useMergedRef(ref, focusReturn.ref);\n return (\n <DialogPrimitive.Portal>\n <DialogPrimitive.Backdrop\n {...KIT_SCOPE}\n className=\"fixed inset-0 z-[var(--kit-z-modal,60)] bg-kit-overlay backdrop-blur-[2px] data-[open]:animate-kit-fade-in\"\n />\n <div {...KIT_SCOPE} className=\"pointer-events-none fixed inset-0 z-[calc(var(--kit-z-modal,60)_+_1)] flex items-center justify-center p-4 sm:p-6\">\n <DialogPrimitive.Popup\n {...layer}\n className={cn(\n \"pointer-events-auto relative flex max-h-[calc(100vh-32px)] w-full flex-col overflow-hidden rounded-kit-xl border border-kit-floating-line bg-kit-surface-raised text-kit-fg shadow-kit-xl outline-none data-[open]:animate-kit-pop-in\",\n sizes[size],\n className,\n )}\n {...props}\n ref={merged}\n finalFocus={focusReturn.finalFocus}\n >\n {children}\n {hideClose ? null : (\n <DialogPrimitive.Close render={<IconButton label=\"Close\" size=\"sm\" className=\"absolute right-3 top-3 z-10\" />}>\n <IconX />\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Popup>\n </div>\n </DialogPrimitive.Portal>\n );\n}\n\nexport function ModalHeader({\n title,\n description,\n className,\n children,\n}: {\n title: React.ReactNode;\n description?: React.ReactNode;\n /** D15: no icon tiles in dialog headers (accepted for compatibility, intentionally not rendered) */\n icon?: React.ReactNode;\n className?: string;\n children?: React.ReactNode;\n}) {\n return (\n <div className={cn(\"flex shrink-0 items-start gap-2.5 px-5 pb-1 pt-5 pr-12\", className)}>\n <div className=\"min-w-0 flex-1\">\n <DialogPrimitive.Title className=\"text-kit-md font-semibold tracking-[-0.01em] text-kit-fg\">{title}</DialogPrimitive.Title>\n {description ? (\n <DialogPrimitive.Description className=\"mt-1 text-kit-sm text-kit-fg-2\">{description}</DialogPrimitive.Description>\n ) : (\n <DialogPrimitive.Description className=\"sr-only\">{typeof title === \"string\" ? title : \"Dialog\"}</DialogPrimitive.Description>\n )}\n {children}\n </div>\n </div>\n );\n}\nexport function ModalBody({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"min-h-0 flex-1 overflow-y-auto px-5 pb-5 pt-4\", className)} {...props} />;\n}\nexport function ModalFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"flex shrink-0 items-center justify-end gap-2 border-t border-kit-editor-tray-line bg-tray px-5 py-3\" /* action tray (Figma 61014:66265) */, className)}\n {...props}\n />\n );\n}\n\n/* ── Flow modal (V2 features/flows/parts/modal.tsx) ────────────────────────\n The shell every multi-step flow uses: a centered dialog on ≥sm, a full-screen sheet on mobile; it hugs its\n content (D15) and only caps the height. Not ModalContent: no fixed corner close, bg-kit-surface (not raised),\n a mobile sheet, `height` caps, and `locked` while a run is in progress. */\n// D15: md 480 · lg 640 · xl 800 (editors/previews) · 2xl 960 (side-by-side previews only)\nconst flowWidths = {\n md: \"sm:max-w-[480px]\",\n lg: \"sm:max-w-[640px]\",\n xl: \"sm:max-w-[800px]\",\n \"2xl\": \"sm:max-w-[960px]\",\n};\n\nexport function FlowModal({\n open,\n onOpenChange,\n size = \"lg\",\n height = \"fixed\",\n locked,\n children,\n className,\n}: {\n open: boolean;\n onOpenChange: (v: boolean) => void;\n size?: keyof typeof flowWidths;\n /** fixed = stable height for multi-step flows; auto = hug content */\n height?: \"fixed\" | \"auto\" | \"tall\";\n /** while true, outside-click / escape / the close button do nothing (a run is in progress) */\n locked?: boolean;\n children: React.ReactNode;\n className?: string;\n}) {\n // D15: dialogs hug their content — no tall empty canvases. \"fixed\"/\"tall\" only cap the height.\n const h =\n height === \"fixed\"\n ? \"sm:h-auto sm:max-h-[min(640px,calc(100dvh-48px))]\"\n : height === \"tall\"\n ? \"sm:h-auto sm:max-h-[min(760px,calc(100dvh-48px))]\"\n : \"sm:h-auto sm:max-h-[calc(100dvh-48px)]\";\n // Land focus on the dialog itself, not the close button (it showed as a bordered square on open).\n const popup = React.useRef<HTMLDivElement | null>(null);\n const focusReturn = useFocusReturn();\n const merged = useMergedRef(popup, focusReturn.ref);\n return (\n <DialogPrimitive.Root\n open={open}\n disablePointerDismissal={locked}\n onOpenChange={guard((v: boolean, details: DialogPrimitive.Root.ChangeEventDetails) => {\n if (!v && locked) return details.cancel();\n onOpenChange(v);\n })}\n >\n <DialogPrimitive.Portal>\n <DialogPrimitive.Backdrop\n {...KIT_SCOPE}\n className=\"fixed inset-0 z-[var(--kit-z-modal,60)] bg-kit-overlay backdrop-blur-[2px] data-[open]:animate-kit-fade-in\"\n />\n <div {...KIT_SCOPE} className=\"pointer-events-none fixed inset-0 z-[calc(var(--kit-z-modal,60)_+_1)] flex items-end justify-center sm:items-center sm:p-6\">\n <DialogPrimitive.Popup\n {...layer}\n ref={merged}\n tabIndex={-1}\n initialFocus={popup}\n finalFocus={focusReturn.finalFocus}\n className={cn(\n \"pointer-events-auto relative flex h-dvh w-full flex-col overflow-hidden bg-kit-surface text-kit-fg shadow-kit-xl outline-none\",\n \"max-sm:data-[open]:animate-kit-slide-up\",\n \"sm:rounded-kit-xl sm:border sm:border-kit-line sm:data-[open]:animate-kit-pop-in\",\n flowWidths[size],\n h,\n className,\n )}\n >\n {children}\n </DialogPrimitive.Popup>\n </div>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n}\n\nexport function FlowClose({ disabled }: { disabled?: boolean }) {\n return (\n <DialogPrimitive.Close disabled={disabled} render={<IconButton label=\"Close\" size=\"sm\" className=\"shrink-0\" disabled={disabled} />}>\n <IconX />\n </DialogPrimitive.Close>\n );\n}\n\nexport function FlowHeader({\n title,\n description,\n icon,\n status,\n right,\n children,\n className,\n closeDisabled,\n}: {\n title: React.ReactNode;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n status?: React.ReactNode;\n right?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n closeDisabled?: boolean;\n}) {\n return (\n <div className={cn(\"relative shrink-0 border-b border-kit-line px-5 pb-3 pt-4\", className)}>\n {/* D15: no icon tile in dialog headers (icon prop kept for compatibility, intentionally not rendered) */}\n <div className=\"flex items-start gap-3\" data-icon={icon ? \"\" : undefined}>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <DialogPrimitive.Title className=\"text-kit-md font-semibold tracking-[-0.01em] text-kit-fg\">{title}</DialogPrimitive.Title>\n {status}\n </div>\n {description ? (\n <DialogPrimitive.Description className=\"mt-0.5 text-kit-sm text-kit-fg-2\">{description}</DialogPrimitive.Description>\n ) : (\n <DialogPrimitive.Description className=\"sr-only\">{typeof title === \"string\" ? title : \"Dialog\"}</DialogPrimitive.Description>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {right}\n <FlowClose disabled={closeDisabled} />\n </div>\n </div>\n {children}\n </div>\n );\n}\n\n/** Status chip used in flow headers (\"Ready to publish\" with a green dot). */\nexport function HeaderStatus({\n tone = \"success\",\n children,\n pulse,\n}: {\n tone?: \"success\" | \"warning\" | \"danger\" | \"info\" | \"accent\" | \"neutral\";\n children: React.ReactNode;\n pulse?: boolean;\n}) {\n const dot = { success: \"bg-kit-success\", warning: \"bg-kit-warning\", danger: \"bg-kit-danger\", info: \"bg-kit-info\", accent: \"bg-kit-accent\", neutral: \"bg-kit-fg-4\" }[tone];\n const fg = {\n success: \"text-kit-success-fg\",\n warning: \"text-kit-warning-fg\",\n danger: \"text-kit-danger-fg\",\n info: \"text-kit-info-fg\",\n accent: \"text-kit-accent-fg\",\n neutral: \"text-kit-fg-2\",\n }[tone];\n return (\n <span className={cn(\"inline-flex h-6 items-center gap-1.5 rounded-full border border-kit-line bg-kit-subtle px-2 text-kit-xs font-medium\", fg)}>\n <span className=\"relative inline-flex size-1.5\">\n {pulse ? <span className={cn(\"absolute inset-0 animate-ping rounded-full opacity-60\", dot)} /> : null}\n <span className={cn(\"relative inline-flex size-1.5 rounded-full\", dot)} />\n </span>\n {children}\n </span>\n );\n}\n\nexport function FlowBody({ className, children }: { className?: string; children: React.ReactNode }) {\n return <div className={cn(\"min-h-0 flex-1 overflow-y-auto overflow-x-hidden px-4 py-4 sm:px-5\", className)}>{children}</div>;\n}\n\nexport function FlowFooter({ left, children, className }: { left?: React.ReactNode; children?: React.ReactNode; className?: string }) {\n return (\n <div\n className={cn(\n \"flex shrink-0 flex-wrap items-center gap-2 border-t border-kit-editor-tray-line bg-tray px-4 py-3 pb-[max(12px,env(safe-area-inset-bottom))] sm:px-5\", // action tray (Figma 61014:66265)\n className,\n )}\n >\n {left ? <div className=\"min-w-0 flex-1 truncate text-kit-sm text-kit-fg-3 max-sm:basis-full\">{left}</div> : <div className=\"flex-1\" />}\n <div className=\"flex flex-wrap items-center justify-end gap-2 max-sm:w-full\">{children}</div>\n </div>\n );\n}\n\n/** Small uppercase-free section label used inside flow bodies. */\nexport function FlowLabel({ children, right, className }: { children: React.ReactNode; right?: React.ReactNode; className?: string }) {\n return (\n <div className={cn(\"mb-2 flex items-center justify-between gap-2\", className)}>\n <h3 className=\"text-kit-sm font-medium text-kit-fg-2\">{children}</h3>\n {right}\n </div>\n );\n}\n\n/** Radio-like option row (Figma \"Publish scope\" / \"When\" rows). */\nexport function OptionRow({\n selected,\n onSelect,\n title,\n description,\n right,\n disabled,\n children,\n className,\n}: {\n selected: boolean;\n onSelect: () => void;\n title: React.ReactNode;\n description?: React.ReactNode;\n right?: React.ReactNode;\n disabled?: boolean;\n children?: React.ReactNode;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n \"rounded-kit-lg border bg-kit-surface transition-[border-color,box-shadow,background-color] duration-150\",\n selected ? \"border-kit-line-strong bg-kit-selected\" : \"border-kit-line hover:border-kit-line-strong hover:bg-kit-subtle-2\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n >\n <button type=\"button\" onClick={onSelect} aria-pressed={selected} disabled={disabled} className=\"flex w-full items-center gap-3 px-3 py-2.5 text-left\">\n <span\n className={cn(\n \"flex size-4 shrink-0 items-center justify-center rounded-full border transition-colors\",\n selected ? \"border-kit-inverse bg-kit-inverse\" : \"border-kit-line-strong bg-kit-surface\",\n )}\n >\n {selected ? <span className=\"size-1.5 rounded-full bg-kit-surface\" /> : null}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-kit-sm font-medium text-kit-fg\">{title}</span>\n {description ? <span className=\"block text-kit-sm text-kit-fg-2\">{description}</span> : null}\n </span>\n {right}\n </button>\n <AnimatePresence initial={false}>\n {selected && children ? (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.2, ease: [0.22, 1, 0.36, 1] }}\n className=\"overflow-hidden\"\n >\n <div className=\"px-3 pb-3 pl-[40px]\">{children}</div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n </div>\n );\n}\n\n/** Progressive disclosure: advanced choices tucked behind \"More options\" (CPO D6). */\nexport function MoreOptions({\n children,\n label = \"More options\",\n summary,\n defaultOpen = false,\n className,\n}: {\n children: React.ReactNode;\n label?: string;\n summary?: React.ReactNode;\n defaultOpen?: boolean;\n className?: string;\n}) {\n const [open, setOpen] = React.useState(defaultOpen);\n return (\n <div className={className}>\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n className=\"group flex w-full min-w-0 items-center gap-2 whitespace-nowrap rounded-kit-md py-1 text-left text-kit-sm font-medium text-kit-fg-2 hover:text-kit-fg\"\n >\n <span\n className={cn(\n \"flex size-5 items-center justify-center rounded-kit-md border border-kit-line bg-kit-surface text-kit-fg-3 transition-transform duration-200\",\n open && \"rotate-90\",\n )}\n >\n <svg viewBox=\"0 0 16 16\" className=\"size-3\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.75} aria-hidden>\n <path d=\"M6 4l4 4-4 4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n {label}\n {summary && !open ? <span className=\"ml-1 truncate text-kit-xs font-normal text-kit-fg-3\">{summary}</span> : null}\n </button>\n <AnimatePresence initial={false}>\n {open ? (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.22, ease: [0.22, 1, 0.36, 1] }}\n className=\"overflow-hidden\"\n >\n <div className=\"pt-3\">{children}</div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n </div>\n );\n}\n\n/* ── Sheet (side or bottom drawer) ─────────────────────────────────────── */\n/** A sheet is a dialog that slides in from an edge: open it with Sheet (= Modal) and its trigger. */\nexport const Sheet = Modal;\nexport const SheetTrigger = DialogPrimitive.Trigger;\nexport const SheetClose = DialogPrimitive.Close;\n/* V2 overlay.tsx:353-354. V2's cn() lets the side's later border-line win over border-floating-line: the sheet edge is\n --line in both themes. */\nconst sheetBase = \"fixed inset-y-0 z-[calc(var(--kit-z-sheet,55)_+_1)] flex flex-col bg-kit-surface-raised shadow-kit-xl outline-none transition-transform border-kit-floating-line\";\nconst sheetSides = {\n // V2: the sheet-in keyframe (24px slide + fade, 260ms ease-out-soft) on open; no exit motion\n right: \"right-0 border-l border-kit-line data-[open]:animate-[kit-sheet-in-r_260ms_var(--kit-ease-out-soft)]\",\n left: \"left-0 border-r border-kit-line data-[open]:animate-[kit-sheet-in-l_260ms_var(--kit-ease-out-soft)]\",\n // V2 TabletSheet / CommentsSheet / HistorySheet (editor.tsx:443-513): 52% tall, rounded-t-2xl, border-t, rises from\n // y 100% (V2's spring 420/42 settles in ~300ms with no overshoot; the drawer curve matches it without a motion import)\n bottom:\n \"inset-x-0 inset-y-auto bottom-0 h-[52%] overflow-hidden rounded-t-kit-2xl border-t border-kit-line data-[open]:animate-[kit-sheet-in-b_300ms_cubic-bezier(0.32,0.72,0,1)]\",\n} as const;\n/** How far a bottom sheet's grabber must be pulled down before letting go closes it (V2 editor.tsx). */\nconst SHEET_SWIPE_CLOSE_PX = 80;\n\n/**\n * A bottom sheet's grabber as a drag handle (V2 TabletSheet / CommentsSheet drag=\"y\"): pulled down past\n * SHEET_SWIPE_CLOSE_PX it closes the sheet, short of it the sheet eases back. The sheet follows the finger through a\n * transform written straight to the element (no re-render per move). Not a tab stop: Esc is the keyboard's way out.\n */\nfunction SheetGrabber({ sheet }: { sheet: React.RefObject<HTMLElement | null> }) {\n const close = React.useRef<HTMLButtonElement | null>(null);\n const drag = React.useRef<{ id: number; y: number; dy: number } | null>(null);\n const settle = (el: HTMLElement) => {\n const reduce = document.documentElement.hasAttribute(\"data-reduce-motion\") || !!window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n el.style.transition = reduce ? \"none\" : \"transform 200ms cubic-bezier(0.32, 0.72, 0, 1)\";\n el.style.transform = \"\";\n };\n return (\n <div className=\"flex shrink-0 justify-center pt-2\">\n <div\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Drag down to close\"\n data-sheet-handle=\"\"\n className=\"hit-area [--hit-size:24px] flex h-6 w-16 cursor-grab touch-none items-start justify-center active:cursor-grabbing\"\n onClick={(e) => {\n // a drag is not a tap: the click that follows the release must not close a sheet that eased back\n if (e.currentTarget.dataset.dragged !== undefined) delete e.currentTarget.dataset.dragged;\n else close.current?.click();\n }}\n onPointerDown={(e) => {\n if (e.button !== 0) return;\n drag.current = { id: e.pointerId, y: e.clientY, dy: 0 };\n e.currentTarget.setPointerCapture?.(e.pointerId);\n if (sheet.current) sheet.current.style.transition = \"none\";\n }}\n onPointerMove={(e) => {\n const d = drag.current;\n if (!d || d.id !== e.pointerId || !sheet.current) return;\n d.dy = Math.max(0, e.clientY - d.y);\n sheet.current.style.transform = `translateY(${d.dy}px)`;\n }}\n onPointerUp={(e) => {\n const d = drag.current;\n drag.current = null;\n if (!d || d.id !== e.pointerId) return;\n if (d.dy > SHEET_SWIPE_CLOSE_PX) close.current?.click();\n else if (sheet.current) settle(sheet.current);\n if (d.dy > 4) e.currentTarget.dataset.dragged = \"\";\n }}\n onPointerCancel={() => {\n drag.current = null;\n if (sheet.current) settle(sheet.current);\n }}\n >\n <span data-sheet-grabber className=\"h-1 w-10 rounded-full bg-kit-line-strong\" />\n </div>\n <DialogPrimitive.Close ref={close} hidden tabIndex={-1} aria-hidden />\n </div>\n );\n}\n\nexport function SheetContent({\n className,\n side = \"right\",\n children,\n width = 440,\n label = \"Panel\",\n noScrim = false,\n finalFocus,\n ref,\n style,\n backdropClassName,\n keepMounted = false,\n ...props\n}: Cls<DialogPrimitive.Popup.Props> & {\n side?: keyof typeof sheetSides;\n /** side sheets only: the panel width in px (a bottom sheet spans the viewport) */\n width?: number;\n /** the dialog's accessible name (V2's tablet inspector sheet is \"Inspector\") */\n label?: string;\n /** no backdrop: the page behind stays visible and, with <Sheet modal={false}>, live (V2's Comments and History sheets) */\n noScrim?: boolean;\n style?: React.CSSProperties;\n /** extra classes for the backdrop, a sibling portal: a host that themes its own scope (light/dark) passes the same class here */\n backdropClassName?: string;\n /** keep the content mounted (hidden) while closed: a host whose content holds live state, like the editor's inspector */\n keepMounted?: boolean;\n}) {\n const focusReturn = useFocusReturn(finalFocus);\n const popup = React.useRef<HTMLDivElement | null>(null);\n const merged = useMergedRef(useMergedRef(ref, focusReturn.ref), popup);\n const bottom = side === \"bottom\";\n return (\n <DialogPrimitive.Portal keepMounted={keepMounted}>\n {noScrim ? null : (\n <DialogPrimitive.Backdrop {...KIT_SCOPE} className={cn(\"fixed inset-0 z-[var(--kit-z-sheet,55)] bg-kit-overlay data-[open]:animate-kit-fade-in\", backdropClassName)} />\n )}\n <DialogPrimitive.Popup\n {...KIT_SCOPE}\n {...layer}\n style={bottom ? style : { width: `min(${width}px, 100vw)`, ...style }}\n className={cn(sheetBase, sheetSides[side], className)}\n {...props}\n ref={merged}\n finalFocus={focusReturn.finalFocus}\n >\n <DialogPrimitive.Title className=\"sr-only\">{label}</DialogPrimitive.Title>\n <DialogPrimitive.Description className=\"sr-only\">{bottom ? \"Bottom panel\" : \"Side panel\"}</DialogPrimitive.Description>\n {bottom ? <SheetGrabber sheet={popup} /> : null}\n {children}\n </DialogPrimitive.Popup>\n </DialogPrimitive.Portal>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"overlay.js","names":[],"sources":["../../src/ui/overlay.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\";\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\nimport { PreviewCard as PreviewCardPrimitive } from \"@base-ui/react/preview-card\";\nimport { Separator } from \"@base-ui/react/separator\";\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { IconCheck, IconChevronRight, IconX } from \"@tabler/icons-react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { cn } from \"../lib/cn\";\nimport { IconButton, TooltipScope } from \"./button\";\nimport { useShortcutHints } from \"./shortcut-hint\";\nimport { KIT_SCOPE } from \"./surfaces\";\nimport { MODAL_LAYER, TooltipLayer, TooltipRoot } from \"./tooltip-root\";\n\n/* Z-index scale: popover/menu 80 · modal overlay 60 / content 61 · sheet 55 · toast 100 · tooltip 90 */\n\n/** Base UI parts accept a className function; the kit takes plain strings so cn() can merge them. */\ntype Cls<P> = Omit<P, \"className\"> & { className?: string };\nconst layer = { [MODAL_LAYER]: \"\" };\n\n/* ── Dismiss guards (DESIGN.md §12) ──────────────────────────────────────────\n Every kit layer runs its close requests through keepOpen():\n - Escape owned by an inner list: an inner element that handles Escape calls event.preventDefault(); the layer\n keeps itself open. (Base UI's own nested layers already close innermost first.)\n - Floating layers portalled outside (an editor's selection toolbar, a slash menu) carry data-floating-layer:\n a press there counts as inside, so it never dismisses the layer underneath.\n - A press on a popover's anchor (the input a list hangs off) counts as inside. */\ntype CloseDetails = { reason: string; event: Event; cancel: () => void };\nexport const FLOATING_LAYER = \"[data-floating-layer]\";\nfunction keepOpen(details: CloseDetails, anchor?: Element | null) {\n const target = details.event?.target;\n const keep =\n (details.reason === \"escape-key\" && details.event.defaultPrevented) ||\n (details.reason === \"outside-press\" &&\n target instanceof Element &&\n (!!target.closest(FLOATING_LAYER) || !!anchor?.contains(target)));\n if (keep) details.cancel();\n return keep;\n}\nfunction guard<D extends CloseDetails>(onOpenChange: ((open: boolean, d: D) => void) | undefined, anchor?: () => Element | null) {\n return (open: boolean, details: D) => {\n if (!open && keepOpen(details, anchor?.())) return;\n onOpenChange?.(open, details);\n };\n}\n\n/* ── Tooltip ───────────────────────────────────────────────────────────── */\nexport const TooltipProvider = TooltipPrimitive.Provider;\nexport function Tooltip({\n content,\n children,\n side = \"top\",\n shortcut,\n delay = 350,\n disabled,\n}: {\n content: React.ReactNode;\n /** the trigger: one element that forwards its ref and spreads props */\n children: React.ReactElement;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** a key hint (D44): shown only while keyboard hints are on */\n shortcut?: string;\n delay?: number;\n disabled?: boolean;\n}) {\n const hints = useShortcutHints();\n if (disabled || !content) return <TooltipScope.Provider value>{children}</TooltipScope.Provider>;\n return (\n <TooltipScope.Provider value>\n <TooltipRoot>\n <TooltipPrimitive.Trigger delay={delay} render={children} />\n {/* Fixed max width: long text (truncated titles, help) wraps into a calm block instead of a viewport-wide strip. */}\n <TooltipLayer side={side}>\n <span className=\"line-clamp-[8] min-w-0 whitespace-normal [overflow-wrap:anywhere]\">{content}</span>\n {shortcut && hints ? (\n <kbd data-hint=\"shortcuts\" className=\"mt-px shrink-0 rounded-kit-sm bg-kit-ink-active px-1 font-kit-sans text-kit-2xs\">\n {shortcut}\n </kbd>\n ) : null}\n </TooltipLayer>\n </TooltipRoot>\n </TooltipScope.Provider>\n );\n}\n\n/* ── Popover ───────────────────────────────────────────────────────────── */\nconst AnchorContext = React.createContext<React.RefObject<HTMLElement | null> | null>(null);\n\nexport function Popover({ onOpenChange, ...props }: PopoverPrimitive.Root.Props) {\n const anchor = React.useRef<HTMLElement | null>(null);\n return (\n <AnchorContext.Provider value={anchor}>\n <PopoverPrimitive.Root {...props} onOpenChange={guard(onOpenChange, () => anchor.current)} />\n </AnchorContext.Provider>\n );\n}\nexport const PopoverTrigger = PopoverPrimitive.Trigger;\nexport const PopoverClose = PopoverPrimitive.Close;\n\n/** Positions the popover against this element instead of the trigger; presses on it count as inside. */\nexport function PopoverAnchor({ render, ...props }: useRender.ComponentProps<\"div\">) {\n const anchor = React.useContext(AnchorContext);\n return useRender({ render: render ?? <div />, ref: anchor ?? undefined, props });\n}\n\nexport function PopoverContent({\n className,\n align = \"start\",\n side,\n sideOffset = 6,\n keepFocus,\n onMouseDown,\n collisionBoundary,\n collisionPadding = 12,\n collisionAvoidance,\n arrowPadding,\n ...props\n}: Cls<PopoverPrimitive.Popup.Props> & {\n /** Base UI keeps a (here, missing) arrow this far from the popup's corner, sliding the popup off a tiny anchor at its\n * edge; 0 puts the popup's edge on the anchor, as V2's Radix popover (no arrow) does */\n arrowPadding?: number;\n align?: \"start\" | \"center\" | \"end\";\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n sideOffset?: number;\n /** keep the popup inside this area (e.g. the scrolling panel under a sticky header) instead of the viewport */\n collisionBoundary?: PopoverPrimitive.Positioner.Props[\"collisionBoundary\"];\n collisionPadding?: PopoverPrimitive.Positioner.Props[\"collisionPadding\"];\n /** e.g. `{ align: \"shift\" }`: slide along the edge to fit instead of flipping start ↔ end (V2's Radix behaviour) */\n collisionAvoidance?: PopoverPrimitive.Positioner.Props[\"collisionAvoidance\"];\n /** §12 no-focus-steal: typing stays in the input the list hangs off. The popup takes no focus on open, gives none\n * back on close, and a mouse-down inside it never blurs the input (text fields inside the popup still focus). */\n keepFocus?: boolean;\n}) {\n const anchor = React.useContext(AnchorContext);\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align={align}\n side={side}\n sideOffset={sideOffset}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n arrowPadding={arrowPadding}\n anchor={anchor?.current ? anchor : undefined}\n className=\"z-[var(--kit-z-menu,80)]\"\n {...KIT_SCOPE}\n >\n <PopoverPrimitive.Popup\n initialFocus={keepFocus ? false : undefined}\n finalFocus={keepFocus ? false : undefined}\n onMouseDown={(e) => {\n onMouseDown?.(e);\n if (keepFocus && !(e.target as Element).closest(\"input, textarea, select, [contenteditable=true]\")) e.preventDefault();\n }}\n className={cn(\"glass w-72 rounded-kit-xl border p-3 text-kit-fg outline-none data-[open]:animate-kit-pop-in\", className)}\n {...props}\n />\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n );\n}\n\n/* ── Hover card ────────────────────────────────────────────────────────── */\nexport const HoverCard = PreviewCardPrimitive.Root;\nexport const HoverCardTrigger = PreviewCardPrimitive.Trigger;\nexport function HoverCardContent({ className, ...props }: Cls<PreviewCardPrimitive.Popup.Props>) {\n return (\n <PreviewCardPrimitive.Portal>\n <PreviewCardPrimitive.Positioner sideOffset={8} collisionPadding={12} className=\"z-[var(--kit-z-menu,80)]\" {...KIT_SCOPE}>\n <PreviewCardPrimitive.Popup\n className={cn(\"glass w-72 rounded-kit-xl border p-3 data-[open]:animate-kit-pop-in\", className)}\n {...props}\n />\n </PreviewCardPrimitive.Positioner>\n </PreviewCardPrimitive.Portal>\n );\n}\n\n/* ── Dropdown menu ─────────────────────────────────────────────────────── */\n/** Arrowing past the last item stays put (loopFocus false), like V2's Radix menus. */\nexport function Menu({ onOpenChange, loopFocus = false, ...props }: MenuPrimitive.Root.Props) {\n return <MenuPrimitive.Root loopFocus={loopFocus} {...props} onOpenChange={guard(onOpenChange)} />;\n}\nexport const MenuTrigger = MenuPrimitive.Trigger;\nexport const MenuGroup = MenuPrimitive.Group;\nexport const MenuSub = MenuPrimitive.SubmenuRoot;\nexport const MenuRadioGroup = MenuPrimitive.RadioGroup;\n\nexport function MenuContent({\n className,\n align = \"start\",\n side,\n sideOffset = 6,\n positionerClassName,\n ...props\n}: Cls<MenuPrimitive.Popup.Props> & {\n align?: \"start\" | \"center\" | \"end\";\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n sideOffset?: number;\n /** The layer: a menu opened from a dashboard dialog (z --z-modal) passes `z-[var(--z-dropdown)]`, or it opens behind it. */\n positionerClassName?: string;\n}) {\n return (\n <MenuPrimitive.Portal>\n <MenuPrimitive.Positioner align={align} side={side} sideOffset={sideOffset} collisionPadding={12} className={cn(\"z-[var(--kit-z-menu,80)]\", positionerClassName)} {...KIT_SCOPE}>\n <MenuPrimitive.Popup\n {...layer}\n // capped to the room the positioner measured, so a tall menu scrolls instead of running off the window\n className={cn(\"glass max-h-[var(--available-height)] min-w-48 overflow-y-auto overflow-x-hidden rounded-kit-lg border p-1 text-kit-fg outline-none data-[open]:animate-kit-pop-in\", className)}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\n\nconst itemCls =\n \"relative flex h-8 cursor-pointer select-none items-center gap-2 rounded-kit-md px-2 text-kit-sm text-kit-fg outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-40 data-[highlighted]:bg-kit-hover [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-kit-fg-2\";\n\nexport function MenuItem({\n className,\n icon,\n shortcut,\n danger,\n children,\n ...props\n}: Cls<MenuPrimitive.Item.Props> & { icon?: React.ReactNode; shortcut?: string; danger?: boolean }) {\n return (\n <MenuPrimitive.Item\n className={cn(itemCls, danger && \"text-kit-danger-fg data-[highlighted]:bg-kit-danger-soft [&>svg]:text-kit-danger-fg\", className)}\n {...props}\n >\n {icon}\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n {/* menu shortcut columns are not hints (D44): they always show */}\n {shortcut ? <span className=\"text-kit-xs text-kit-fg-3\">{shortcut}</span> : null}\n </MenuPrimitive.Item>\n );\n}\n\n/** Checking an item closes the menu, like V2's Radix items (pass closeOnClick={false} to keep it open). */\nexport function MenuCheckItem({ className, children, closeOnClick = true, ...props }: Cls<MenuPrimitive.CheckboxItem.Props>) {\n return (\n <MenuPrimitive.CheckboxItem className={cn(itemCls, \"pr-8\", className)} closeOnClick={closeOnClick} {...props}>\n {children}\n <MenuPrimitive.CheckboxItemIndicator className=\"absolute right-2\">\n <IconCheck className=\"size-4\" />\n </MenuPrimitive.CheckboxItemIndicator>\n </MenuPrimitive.CheckboxItem>\n );\n}\n\nexport function MenuRadioItem({ className, children, closeOnClick = true, ...props }: Cls<MenuPrimitive.RadioItem.Props>) {\n return (\n <MenuPrimitive.RadioItem className={cn(itemCls, \"pr-8\", className)} closeOnClick={closeOnClick} {...props}>\n {children}\n <MenuPrimitive.RadioItemIndicator className=\"absolute right-2\">\n <IconCheck className=\"size-4\" />\n </MenuPrimitive.RadioItemIndicator>\n </MenuPrimitive.RadioItem>\n );\n}\n\nexport function MenuSubTrigger({\n className,\n icon,\n children,\n ...props\n}: Cls<MenuPrimitive.SubmenuTrigger.Props> & { icon?: React.ReactNode }) {\n return (\n <MenuPrimitive.SubmenuTrigger className={cn(itemCls, \"data-[popup-open]:bg-kit-hover\", className)} {...props}>\n {icon}\n <span className=\"flex-1\">{children}</span>\n <IconChevronRight className=\"size-3.5 text-kit-fg-3\" />\n </MenuPrimitive.SubmenuTrigger>\n );\n}\nexport function MenuSubContent({ className, ...props }: Cls<MenuPrimitive.Popup.Props>) {\n return (\n <MenuPrimitive.Portal>\n <MenuPrimitive.Positioner sideOffset={6} collisionPadding={12} className=\"z-[calc(var(--kit-z-menu,80)_+_1)]\" {...KIT_SCOPE}>\n <MenuPrimitive.Popup\n className={cn(\"glass min-w-44 rounded-kit-lg border p-1 data-[open]:animate-kit-pop-in\", className)}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\nexport function MenuLabel({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"px-2 pb-1 pt-1.5 text-kit-xs font-medium text-kit-fg-3\", className)} {...props} />;\n}\nexport function MenuSeparator({ className }: { className?: string }) {\n return <Separator className={cn(\"-mx-1 my-1 h-px bg-kit-line\", className)} />;\n}\n\n/* ── Focus return (a11y) ───────────────────────────────────────────────────\n A dialog library remembers the focused element when the dialog opens and refocuses it on close. When a field\n inside autofocuses, that element is already the field, so focus fell to <body> on close. We keep the last few\n focused elements and hand focus back to the real trigger: the newest one that is outside the popup and still\n in the document. Without one, the library's default applies. */\nconst recent: HTMLElement[] = [];\nif (typeof document !== \"undefined\") {\n document.addEventListener(\n \"focusin\",\n (e) => {\n recent.unshift(e.target as HTMLElement);\n recent.length = Math.min(recent.length, 4);\n },\n true,\n );\n}\ntype FinalFocus = DialogPrimitive.Popup.Props[\"finalFocus\"];\nexport function useFocusReturn(finalFocus?: FinalFocus): {\n ref: (el: HTMLElement | null) => void;\n finalFocus: NonNullable<FinalFocus>;\n} {\n const ret = React.useRef<HTMLElement | null>(null);\n const popup = React.useRef<HTMLElement | null>(null);\n const ref = React.useCallback((el: HTMLElement | null) => {\n // Capture once per open (per popup element). A callback ref can be called again on a re-render while open, when\n // focus is already inside the popup and the trigger may have dropped out of `recent`.\n if (el === popup.current) return;\n popup.current = el;\n if (!el) return;\n const active = document.activeElement as HTMLElement | null;\n const outside = (n: HTMLElement | null): n is HTMLElement => !!n && n !== document.body && !el.contains(n);\n ret.current = outside(active) ? active : (recent.find(outside) ?? null);\n }, []);\n return {\n ref,\n finalFocus:\n finalFocus ??\n (() => {\n const t = ret.current;\n return t && t.isConnected ? t : true;\n }),\n };\n}\n\n/** One stable callback ref for both refs, so React does not detach and re-attach them on every render. */\nfunction useMergedRef<T>(a: React.Ref<T> | undefined, b: React.Ref<T> | undefined) {\n return React.useCallback(\n (el: T | null) => {\n for (const r of [a, b]) {\n if (typeof r === \"function\") r(el);\n else if (r) (r as React.RefObject<T | null>).current = el;\n }\n },\n [a, b],\n );\n}\n\n/* ── Modal (Dialog) ────────────────────────────────────────────────────── */\nexport function Modal({ onOpenChange, ...props }: DialogPrimitive.Root.Props) {\n return <DialogPrimitive.Root {...props} onOpenChange={guard(onOpenChange)} />;\n}\nexport const ModalTrigger = DialogPrimitive.Trigger;\nexport const ModalClose = DialogPrimitive.Close;\n\nconst sizes = {\n sm: \"max-w-[400px]\",\n md: \"max-w-[480px]\",\n lg: \"max-w-[640px]\",\n xl: \"max-w-[800px]\",\n full: \"max-w-[min(1280px,calc(100vw-48px))] h-[min(860px,calc(100vh-48px))]\",\n};\n\nexport function ModalContent({\n className,\n size = \"md\",\n children,\n hideClose,\n finalFocus,\n ref,\n ...props\n}: Cls<DialogPrimitive.Popup.Props> & { size?: keyof typeof sizes; hideClose?: boolean }) {\n const focusReturn = useFocusReturn(finalFocus);\n const merged = useMergedRef(ref, focusReturn.ref);\n return (\n <DialogPrimitive.Portal>\n <DialogPrimitive.Backdrop\n {...KIT_SCOPE}\n className=\"fixed inset-0 z-[var(--kit-z-modal,60)] bg-kit-overlay backdrop-blur-[2px] data-[open]:animate-kit-fade-in\"\n />\n <div {...KIT_SCOPE} className=\"pointer-events-none fixed inset-0 z-[calc(var(--kit-z-modal,60)_+_1)] flex items-center justify-center p-4 sm:p-6\">\n <DialogPrimitive.Popup\n {...layer}\n className={cn(\n \"pointer-events-auto relative flex max-h-[calc(100vh-32px)] w-full flex-col overflow-hidden rounded-kit-xl border border-kit-floating-line bg-kit-surface-raised text-kit-fg shadow-kit-xl outline-none data-[open]:animate-kit-pop-in\",\n sizes[size],\n className,\n )}\n {...props}\n ref={merged}\n finalFocus={focusReturn.finalFocus}\n >\n {children}\n {hideClose ? null : (\n <DialogPrimitive.Close render={<IconButton label=\"Close\" size=\"sm\" className=\"absolute right-3 top-3 z-10\" />}>\n <IconX />\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Popup>\n </div>\n </DialogPrimitive.Portal>\n );\n}\n\nexport function ModalHeader({\n title,\n description,\n className,\n children,\n}: {\n title: React.ReactNode;\n description?: React.ReactNode;\n /** D15: no icon tiles in dialog headers (accepted for compatibility, intentionally not rendered) */\n icon?: React.ReactNode;\n className?: string;\n children?: React.ReactNode;\n}) {\n return (\n <div className={cn(\"flex shrink-0 items-start gap-2.5 px-5 pb-1 pt-5 pr-12\", className)}>\n <div className=\"min-w-0 flex-1\">\n <DialogPrimitive.Title className=\"text-kit-md font-semibold tracking-[-0.01em] text-kit-fg\">{title}</DialogPrimitive.Title>\n {description ? (\n <DialogPrimitive.Description className=\"mt-1 text-kit-sm text-kit-fg-2\">{description}</DialogPrimitive.Description>\n ) : (\n <DialogPrimitive.Description className=\"sr-only\">{typeof title === \"string\" ? title : \"Dialog\"}</DialogPrimitive.Description>\n )}\n {children}\n </div>\n </div>\n );\n}\nexport function ModalBody({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"min-h-0 flex-1 overflow-y-auto px-5 pb-5 pt-4\", className)} {...props} />;\n}\nexport function ModalFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"flex shrink-0 items-center justify-end gap-2 border-t border-kit-editor-tray-line bg-tray px-5 py-3\" /* action tray (Figma 61014:66265) */, className)}\n {...props}\n />\n );\n}\n\n/* ── Flow modal (V2 features/flows/parts/modal.tsx) ────────────────────────\n The shell every multi-step flow uses: a centered dialog on ≥sm, a full-screen sheet on mobile; it hugs its\n content (D15) and only caps the height. Not ModalContent: no fixed corner close, bg-kit-surface (not raised),\n a mobile sheet, `height` caps, and `locked` while a run is in progress. */\n// D15: md 480 · lg 640 · xl 800 (editors/previews) · 2xl 960 (side-by-side previews only)\nconst flowWidths = {\n md: \"sm:max-w-[480px]\",\n lg: \"sm:max-w-[640px]\",\n xl: \"sm:max-w-[800px]\",\n \"2xl\": \"sm:max-w-[960px]\",\n};\n\nexport function FlowModal({\n open,\n onOpenChange,\n size = \"lg\",\n height = \"fixed\",\n locked,\n children,\n className,\n}: {\n open: boolean;\n onOpenChange: (v: boolean) => void;\n size?: keyof typeof flowWidths;\n /** fixed = stable height for multi-step flows; auto = hug content */\n height?: \"fixed\" | \"auto\" | \"tall\";\n /** while true, outside-click / escape / the close button do nothing (a run is in progress) */\n locked?: boolean;\n children: React.ReactNode;\n className?: string;\n}) {\n // D15: dialogs hug their content — no tall empty canvases. \"fixed\"/\"tall\" only cap the height.\n const h =\n height === \"fixed\"\n ? \"sm:h-auto sm:max-h-[min(640px,calc(100dvh-48px))]\"\n : height === \"tall\"\n ? \"sm:h-auto sm:max-h-[min(760px,calc(100dvh-48px))]\"\n : \"sm:h-auto sm:max-h-[calc(100dvh-48px)]\";\n // Land focus on the dialog itself, not the close button (it showed as a bordered square on open).\n const popup = React.useRef<HTMLDivElement | null>(null);\n const focusReturn = useFocusReturn();\n const merged = useMergedRef(popup, focusReturn.ref);\n return (\n <DialogPrimitive.Root\n open={open}\n disablePointerDismissal={locked}\n onOpenChange={guard((v: boolean, details: DialogPrimitive.Root.ChangeEventDetails) => {\n if (!v && locked) return details.cancel();\n onOpenChange(v);\n })}\n >\n <DialogPrimitive.Portal>\n <DialogPrimitive.Backdrop\n {...KIT_SCOPE}\n className=\"fixed inset-0 z-[var(--kit-z-modal,60)] bg-kit-overlay backdrop-blur-[2px] data-[open]:animate-kit-fade-in\"\n />\n <div {...KIT_SCOPE} className=\"pointer-events-none fixed inset-0 z-[calc(var(--kit-z-modal,60)_+_1)] flex items-end justify-center sm:items-center sm:p-6\">\n <DialogPrimitive.Popup\n {...layer}\n ref={merged}\n tabIndex={-1}\n initialFocus={popup}\n finalFocus={focusReturn.finalFocus}\n className={cn(\n \"pointer-events-auto relative flex h-dvh w-full flex-col overflow-hidden bg-kit-surface text-kit-fg shadow-kit-xl outline-none\",\n \"max-sm:data-[open]:animate-kit-slide-up\",\n \"sm:rounded-kit-xl sm:border sm:border-kit-line sm:data-[open]:animate-kit-pop-in\",\n flowWidths[size],\n h,\n className,\n )}\n >\n {children}\n </DialogPrimitive.Popup>\n </div>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n}\n\nexport function FlowClose({ disabled }: { disabled?: boolean }) {\n return (\n <DialogPrimitive.Close disabled={disabled} render={<IconButton label=\"Close\" size=\"sm\" className=\"shrink-0\" disabled={disabled} />}>\n <IconX />\n </DialogPrimitive.Close>\n );\n}\n\nexport function FlowHeader({\n title,\n description,\n icon,\n status,\n right,\n children,\n className,\n closeDisabled,\n}: {\n title: React.ReactNode;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n status?: React.ReactNode;\n right?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n closeDisabled?: boolean;\n}) {\n return (\n <div className={cn(\"relative shrink-0 border-b border-kit-line px-5 pb-3 pt-4\", className)}>\n {/* D15: no icon tile in dialog headers (icon prop kept for compatibility, intentionally not rendered) */}\n <div className=\"flex items-start gap-3\" data-icon={icon ? \"\" : undefined}>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <DialogPrimitive.Title className=\"text-kit-md font-semibold tracking-[-0.01em] text-kit-fg\">{title}</DialogPrimitive.Title>\n {status}\n </div>\n {description ? (\n <DialogPrimitive.Description className=\"mt-0.5 text-kit-sm text-kit-fg-2\">{description}</DialogPrimitive.Description>\n ) : (\n <DialogPrimitive.Description className=\"sr-only\">{typeof title === \"string\" ? title : \"Dialog\"}</DialogPrimitive.Description>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {right}\n <FlowClose disabled={closeDisabled} />\n </div>\n </div>\n {children}\n </div>\n );\n}\n\n/** Status chip used in flow headers (\"Ready to publish\" with a green dot). */\nexport function HeaderStatus({\n tone = \"success\",\n children,\n pulse,\n}: {\n tone?: \"success\" | \"warning\" | \"danger\" | \"info\" | \"accent\" | \"neutral\";\n children: React.ReactNode;\n pulse?: boolean;\n}) {\n const dot = { success: \"bg-kit-success\", warning: \"bg-kit-warning\", danger: \"bg-kit-danger\", info: \"bg-kit-info\", accent: \"bg-kit-accent\", neutral: \"bg-kit-fg-4\" }[tone];\n const fg = {\n success: \"text-kit-success-fg\",\n warning: \"text-kit-warning-fg\",\n danger: \"text-kit-danger-fg\",\n info: \"text-kit-info-fg\",\n accent: \"text-kit-accent-fg\",\n neutral: \"text-kit-fg-2\",\n }[tone];\n return (\n <span className={cn(\"inline-flex h-6 items-center gap-1.5 rounded-full border border-kit-line bg-kit-subtle px-2 text-kit-xs font-medium\", fg)}>\n <span className=\"relative inline-flex size-1.5\">\n {pulse ? <span className={cn(\"absolute inset-0 animate-ping rounded-full opacity-60\", dot)} /> : null}\n <span className={cn(\"relative inline-flex size-1.5 rounded-full\", dot)} />\n </span>\n {children}\n </span>\n );\n}\n\nexport function FlowBody({ className, children }: { className?: string; children: React.ReactNode }) {\n return <div className={cn(\"min-h-0 flex-1 overflow-y-auto overflow-x-hidden px-4 py-4 sm:px-5\", className)}>{children}</div>;\n}\n\nexport function FlowFooter({ left, children, className }: { left?: React.ReactNode; children?: React.ReactNode; className?: string }) {\n return (\n <div\n className={cn(\n \"flex shrink-0 flex-wrap items-center gap-2 border-t border-kit-editor-tray-line bg-tray px-4 py-3 pb-[max(12px,env(safe-area-inset-bottom))] sm:px-5\", // action tray (Figma 61014:66265)\n className,\n )}\n >\n {left ? <div className=\"min-w-0 flex-1 truncate text-kit-sm text-kit-fg-3 max-sm:basis-full\">{left}</div> : <div className=\"flex-1\" />}\n <div className=\"flex flex-wrap items-center justify-end gap-2 max-sm:w-full\">{children}</div>\n </div>\n );\n}\n\n/** Small uppercase-free section label used inside flow bodies. */\nexport function FlowLabel({ children, right, className }: { children: React.ReactNode; right?: React.ReactNode; className?: string }) {\n return (\n <div className={cn(\"mb-2 flex items-center justify-between gap-2\", className)}>\n <h3 className=\"text-kit-sm font-medium text-kit-fg-2\">{children}</h3>\n {right}\n </div>\n );\n}\n\n/** Radio-like option row (Figma \"Publish scope\" / \"When\" rows). */\nexport function OptionRow({\n selected,\n onSelect,\n title,\n description,\n right,\n disabled,\n children,\n className,\n}: {\n selected: boolean;\n onSelect: () => void;\n title: React.ReactNode;\n description?: React.ReactNode;\n right?: React.ReactNode;\n disabled?: boolean;\n children?: React.ReactNode;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n \"rounded-kit-lg border bg-kit-surface transition-[border-color,box-shadow,background-color] duration-150\",\n selected ? \"border-kit-line-strong bg-kit-selected\" : \"border-kit-line hover:border-kit-line-strong hover:bg-kit-subtle-2\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n >\n <button type=\"button\" onClick={onSelect} aria-pressed={selected} disabled={disabled} className=\"flex w-full items-center gap-3 px-3 py-2.5 text-left\">\n <span\n className={cn(\n \"flex size-4 shrink-0 items-center justify-center rounded-full border transition-colors\",\n selected ? \"border-kit-inverse bg-kit-inverse\" : \"border-kit-line-strong bg-kit-surface\",\n )}\n >\n {selected ? <span className=\"size-1.5 rounded-full bg-kit-surface\" /> : null}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-kit-sm font-medium text-kit-fg\">{title}</span>\n {description ? <span className=\"block text-kit-sm text-kit-fg-2\">{description}</span> : null}\n </span>\n {right}\n </button>\n <AnimatePresence initial={false}>\n {selected && children ? (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.2, ease: [0.22, 1, 0.36, 1] }}\n className=\"overflow-hidden\"\n >\n <div className=\"px-3 pb-3 pl-[40px]\">{children}</div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n </div>\n );\n}\n\n/** Progressive disclosure: advanced choices tucked behind \"More options\" (CPO D6). */\nexport function MoreOptions({\n children,\n label = \"More options\",\n summary,\n defaultOpen = false,\n className,\n}: {\n children: React.ReactNode;\n label?: string;\n summary?: React.ReactNode;\n defaultOpen?: boolean;\n className?: string;\n}) {\n const [open, setOpen] = React.useState(defaultOpen);\n return (\n <div className={className}>\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n className=\"group flex w-full min-w-0 items-center gap-2 whitespace-nowrap rounded-kit-md py-1 text-left text-kit-sm font-medium text-kit-fg-2 hover:text-kit-fg\"\n >\n <span\n className={cn(\n \"flex size-5 items-center justify-center rounded-kit-md border border-kit-line bg-kit-surface text-kit-fg-3 transition-transform duration-200\",\n open && \"rotate-90\",\n )}\n >\n <svg viewBox=\"0 0 16 16\" className=\"size-3\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.75} aria-hidden>\n <path d=\"M6 4l4 4-4 4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n {label}\n {summary && !open ? <span className=\"ml-1 truncate text-kit-xs font-normal text-kit-fg-3\">{summary}</span> : null}\n </button>\n <AnimatePresence initial={false}>\n {open ? (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.22, ease: [0.22, 1, 0.36, 1] }}\n className=\"overflow-hidden\"\n >\n <div className=\"pt-3\">{children}</div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n </div>\n );\n}\n\n/* ── Sheet (side or bottom drawer) ─────────────────────────────────────── */\n/** A sheet is a dialog that slides in from an edge: open it with Sheet (= Modal) and its trigger. */\nexport const Sheet = Modal;\nexport const SheetTrigger = DialogPrimitive.Trigger;\nexport const SheetClose = DialogPrimitive.Close;\n/* V2 overlay.tsx:353-354. V2's cn() lets the side's later border-line win over border-floating-line: the sheet edge is\n --line in both themes. */\nconst sheetBase = \"fixed inset-y-0 z-[calc(var(--kit-z-sheet,55)_+_1)] flex flex-col bg-kit-surface-raised shadow-kit-xl outline-none transition-transform border-kit-floating-line\";\nconst sheetSides = {\n // V2: the sheet-in keyframe (24px slide + fade, 260ms ease-out-soft) on open; no exit motion\n right: \"right-0 border-l border-kit-line data-[open]:animate-[kit-sheet-in-r_260ms_var(--kit-ease-out-soft)]\",\n left: \"left-0 border-r border-kit-line data-[open]:animate-[kit-sheet-in-l_260ms_var(--kit-ease-out-soft)]\",\n // V2 TabletSheet / CommentsSheet / HistorySheet (editor.tsx:443-513): 52% tall, rounded-t-2xl, border-t, rises from\n // y 100% (V2's spring 420/42 settles in ~300ms with no overshoot; the drawer curve matches it without a motion import)\n bottom:\n \"inset-x-0 inset-y-auto bottom-0 h-[52%] overflow-hidden rounded-t-kit-2xl border-t border-kit-line data-[open]:animate-[kit-sheet-in-b_300ms_cubic-bezier(0.32,0.72,0,1)]\",\n} as const;\n/** How far a bottom sheet's grabber must be pulled down before letting go closes it (V2 editor.tsx). */\nconst SHEET_SWIPE_CLOSE_PX = 80;\n\n/**\n * A bottom sheet's grabber as a drag handle (V2 TabletSheet / CommentsSheet drag=\"y\"): pulled down past\n * SHEET_SWIPE_CLOSE_PX it closes the sheet, short of it the sheet eases back. The sheet follows the finger through a\n * transform written straight to the element (no re-render per move). Not a tab stop: Esc is the keyboard's way out.\n */\nfunction SheetGrabber({ sheet }: { sheet: React.RefObject<HTMLElement | null> }) {\n const close = React.useRef<HTMLButtonElement | null>(null);\n const drag = React.useRef<{ id: number; y: number; dy: number } | null>(null);\n const settle = (el: HTMLElement) => {\n const reduce = document.documentElement.hasAttribute(\"data-reduce-motion\") || !!window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n el.style.transition = reduce ? \"none\" : \"transform 200ms cubic-bezier(0.32, 0.72, 0, 1)\";\n el.style.transform = \"\";\n };\n return (\n <div className=\"flex shrink-0 justify-center pt-2\">\n <div\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Drag down to close\"\n data-sheet-handle=\"\"\n className=\"hit-area [--hit-size:24px] flex h-6 w-16 cursor-grab touch-none items-start justify-center active:cursor-grabbing\"\n onClick={(e) => {\n // a drag is not a tap: the click that follows the release must not close a sheet that eased back\n if (e.currentTarget.dataset.dragged !== undefined) delete e.currentTarget.dataset.dragged;\n else close.current?.click();\n }}\n onPointerDown={(e) => {\n if (e.button !== 0) return;\n drag.current = { id: e.pointerId, y: e.clientY, dy: 0 };\n e.currentTarget.setPointerCapture?.(e.pointerId);\n if (sheet.current) sheet.current.style.transition = \"none\";\n }}\n onPointerMove={(e) => {\n const d = drag.current;\n if (!d || d.id !== e.pointerId || !sheet.current) return;\n d.dy = Math.max(0, e.clientY - d.y);\n sheet.current.style.transform = `translateY(${d.dy}px)`;\n }}\n onPointerUp={(e) => {\n const d = drag.current;\n drag.current = null;\n if (!d || d.id !== e.pointerId) return;\n if (d.dy > SHEET_SWIPE_CLOSE_PX) close.current?.click();\n else if (sheet.current) settle(sheet.current);\n if (d.dy > 4) e.currentTarget.dataset.dragged = \"\";\n }}\n onPointerCancel={() => {\n drag.current = null;\n if (sheet.current) settle(sheet.current);\n }}\n >\n <span data-sheet-grabber className=\"h-1 w-10 rounded-full bg-kit-line-strong\" />\n </div>\n <DialogPrimitive.Close ref={close} hidden tabIndex={-1} aria-hidden />\n </div>\n );\n}\n\nexport function SheetContent({\n className,\n side = \"right\",\n children,\n width = 440,\n label = \"Panel\",\n noScrim = false,\n finalFocus,\n ref,\n style,\n backdropClassName,\n keepMounted = false,\n ...props\n}: Cls<DialogPrimitive.Popup.Props> & {\n side?: keyof typeof sheetSides;\n /** side sheets only: the panel width in px (a bottom sheet spans the viewport) */\n width?: number;\n /** the dialog's accessible name (V2's tablet inspector sheet is \"Inspector\") */\n label?: string;\n /** no backdrop: the page behind stays visible and, with <Sheet modal={false}>, live (V2's Comments and History sheets) */\n noScrim?: boolean;\n style?: React.CSSProperties;\n /** extra classes for the backdrop, a sibling portal: a host that themes its own scope (light/dark) passes the same class here */\n backdropClassName?: string;\n /** keep the content mounted (hidden) while closed: a host whose content holds live state, like the editor's inspector */\n keepMounted?: boolean;\n}) {\n const focusReturn = useFocusReturn(finalFocus);\n const popup = React.useRef<HTMLDivElement | null>(null);\n const merged = useMergedRef(useMergedRef(ref, focusReturn.ref), popup);\n const bottom = side === \"bottom\";\n return (\n <DialogPrimitive.Portal keepMounted={keepMounted}>\n {noScrim ? null : (\n <DialogPrimitive.Backdrop {...KIT_SCOPE} className={cn(\"fixed inset-0 z-[var(--kit-z-sheet,55)] bg-kit-overlay data-[open]:animate-kit-fade-in\", backdropClassName)} />\n )}\n <DialogPrimitive.Popup\n {...KIT_SCOPE}\n {...layer}\n style={bottom ? style : { width: `min(${width}px, 100vw)`, ...style }}\n className={cn(sheetBase, sheetSides[side], className)}\n {...props}\n ref={merged}\n finalFocus={focusReturn.finalFocus}\n >\n <DialogPrimitive.Title className=\"sr-only\">{label}</DialogPrimitive.Title>\n <DialogPrimitive.Description className=\"sr-only\">{bottom ? \"Bottom panel\" : \"Side panel\"}</DialogPrimitive.Description>\n {bottom ? <SheetGrabber sheet={popup} /> : null}\n {children}\n </DialogPrimitive.Popup>\n </DialogPrimitive.Portal>\n );\n}\n"],"mappings":"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"}
|
package/dist/ui/toast.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { cn } from "../lib/cn.js";
|
|
2
|
-
import { KIT_SCOPE } from "./surfaces.js";
|
|
3
2
|
import { Spinner } from "./spinner.js";
|
|
3
|
+
import { KIT_SCOPE } from "./surfaces.js";
|
|
4
4
|
import "react";
|
|
5
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
6
|
import { Toast } from "@base-ui/react/toast";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bettercms-ai/kit",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "The BetterCMS V2 Block Kit: schema language, form engine, controls and design tokens.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -51,7 +51,11 @@
|
|
|
51
51
|
"./dist/index.js",
|
|
52
52
|
"./dist/controls/*-register.js",
|
|
53
53
|
"./dist/controls/rich-text/index.js",
|
|
54
|
-
"./dist/controls/table/index.js"
|
|
54
|
+
"./dist/controls/table/index.js",
|
|
55
|
+
"./src/index.ts",
|
|
56
|
+
"./src/controls/*-register.ts",
|
|
57
|
+
"./src/controls/rich-text/index.ts",
|
|
58
|
+
"./src/controls/table/index.ts"
|
|
55
59
|
],
|
|
56
60
|
"files": [
|
|
57
61
|
"dist",
|
|
@@ -69,6 +73,7 @@
|
|
|
69
73
|
},
|
|
70
74
|
"peerDependencies": {
|
|
71
75
|
"@base-ui/react": "^1.4.1",
|
|
76
|
+
"@bettercms-ai/types": "^1.60.0",
|
|
72
77
|
"@tabler/icons-react": "^3.48.0",
|
|
73
78
|
"framer-motion": "^12.40.0",
|
|
74
79
|
"react": "^19.2.0",
|
|
@@ -76,6 +81,7 @@
|
|
|
76
81
|
},
|
|
77
82
|
"devDependencies": {
|
|
78
83
|
"@base-ui/react": "^1.4.1",
|
|
84
|
+
"@bettercms-ai/types": "workspace:*",
|
|
79
85
|
"@tabler/icons-react": "3.48.0",
|
|
80
86
|
"@tailwindcss/node": "^4.2.2",
|
|
81
87
|
"@tailwindcss/postcss": "^4.2.2",
|