@ohhwells/bridge 0.1.38 → 0.1.39-next.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.
package/dist/index.d.cts CHANGED
@@ -27,6 +27,7 @@ type LinkModalProps = {
27
27
  onClose: () => void;
28
28
  onSubmit: (target: string) => void;
29
29
  };
30
+ type LinkModalStep = 'input' | 'sectionPicker' | 'confirmed';
30
31
  type SelectedPage = {
31
32
  path: string;
32
33
  title: string;
@@ -42,10 +43,55 @@ type LinkPopoverProps = LinkModalProps & {
42
43
  portalContainer?: HTMLElement | null;
43
44
  };
44
45
  /** Centered link editor dialog (shadcn Dialog + Radix). */
45
- declare function LinkPopover({ open, panelRef, portalContainer, onClose, ...editorProps }: LinkPopoverProps): react_jsx_runtime.JSX.Element;
46
+ declare function LinkPopover({ open, panelRef, portalContainer, onClose, mode, pages, sections, sectionsByPath, initialTarget, existingTargets, onSubmit, }: LinkPopoverProps): react_jsx_runtime.JSX.Element;
46
47
 
48
+ type UseLinkModalStateParams = {
49
+ open: boolean;
50
+ mode: LinkModalMode;
51
+ pages: LinkPage[];
52
+ sections: LinkSection[];
53
+ sectionsByPath?: Record<string, LinkSection[]>;
54
+ initialTarget?: string;
55
+ existingTargets: string[];
56
+ onClose: () => void;
57
+ onSubmit: (target: string) => void;
58
+ };
59
+ declare function useLinkModalState({ open, mode, pages, sections: _sections, sectionsByPath, initialTarget, existingTargets: _existingTargets, onClose, onSubmit, }: UseLinkModalStateParams): {
60
+ title: string;
61
+ submitLabel: string;
62
+ secondaryLabel: string;
63
+ searchValue: string;
64
+ selectedPage: SelectedPage | null;
65
+ selectedSection: SelectedSection | null;
66
+ step: LinkModalStep;
67
+ dropdownOpen: boolean;
68
+ setDropdownOpen: React.Dispatch<React.SetStateAction<boolean>>;
69
+ urlError: string;
70
+ filteredPages: LinkPage[];
71
+ showBreadcrumb: false | SelectedSection | null;
72
+ showSectionPicker: false | SelectedPage | null;
73
+ showChooseSection: boolean | null;
74
+ showSectionRow: boolean | null;
75
+ isValid: boolean;
76
+ activeSections: LinkSection[];
77
+ handleInputChange: (value: string) => void;
78
+ handlePageSelect: (page: LinkPage) => void;
79
+ handleChooseSection: () => void;
80
+ handleSectionSelect: (section: LinkSection) => void;
81
+ handleBackToSections: () => void;
82
+ handleSectionPickerBack: () => void;
83
+ handleClose: () => void;
84
+ handleSecondary: () => void;
85
+ handleSubmit: () => void;
86
+ };
87
+
88
+ type LinkModalState = ReturnType<typeof useLinkModalState>;
89
+ type LinkEditorPanelProps = {
90
+ state: LinkModalState;
91
+ onClose: () => void;
92
+ };
47
93
  /** Link destination editor body — Figma node 8365:7616 / 8382:4161 */
48
- declare function LinkEditorPanel({ open, mode, pages, sections, sectionsByPath, initialTarget, existingTargets, onClose, onSubmit, }: LinkModalProps): react_jsx_runtime.JSX.Element;
94
+ declare function LinkEditorPanel({ state, onClose }: LinkEditorPanelProps): react_jsx_runtime.JSX.Element;
49
95
 
50
96
  declare function parseTarget(target: string | null | undefined): {
51
97
  pageRoute: string;
@@ -86,6 +132,26 @@ declare function SchedulingWidget({ notifyOnConnect, initialScheduleId, insertAf
86
132
 
87
133
  declare const DragHandle: React.ForwardRefExoticComponent<React.ButtonHTMLAttributes<HTMLButtonElement> & React.RefAttributes<HTMLButtonElement>>;
88
134
 
135
+ /**
136
+ * Visual drop-gap line for navbar / footer / repeater reorder.
137
+ * Figma: Custom/Drop Indicator (8140:1731) — CSS class `.ov-gap-line`
138
+ *
139
+ * Opacity (Figma docs):
140
+ * - default: 0 (hidden)
141
+ * - hover: 1
142
+ * - dragIdle: 0.4
143
+ * - dragActive: 1
144
+ */
145
+ declare const dropIndicatorVariants: (props?: ({
146
+ direction?: "horizontal" | "vertical" | null | undefined;
147
+ state?: "default" | "hover" | "dragIdle" | "dragActive" | null | undefined;
148
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
149
+ type DropIndicatorProps = React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof dropIndicatorVariants>;
150
+ declare const DropIndicator: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
151
+ direction?: "horizontal" | "vertical" | null | undefined;
152
+ state?: "default" | "hover" | "dragIdle" | "dragActive" | null | undefined;
153
+ } & class_variance_authority_types.ClassProp) | undefined) => string> & React.RefAttributes<HTMLDivElement>>;
154
+
89
155
  declare const CustomToolbar: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
90
156
  declare function CustomToolbarDivider({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>): react_jsx_runtime.JSX.Element;
91
157
  declare const CustomToolbarButton: React.ForwardRefExoticComponent<React.ButtonHTMLAttributes<HTMLButtonElement> & {
@@ -96,30 +162,35 @@ type ItemActionToolbarProps = {
96
162
  onEditLink?: () => void;
97
163
  onAddItem?: () => void;
98
164
  onMore?: () => void;
165
+ editLinkDisabled?: boolean;
99
166
  addItemDisabled?: boolean;
100
167
  moreDisabled?: boolean;
101
168
  /** Tooltip placement relative to each icon — Figma uses bottom. */
102
169
  tooltipSide?: 'top' | 'bottom' | 'left' | 'right';
103
170
  };
104
171
  /** Item-action fill for Custom/Toolbar — Edit link / Add item / More. */
105
- declare function ItemActionToolbar({ onEditLink, onAddItem, onMore, addItemDisabled, moreDisabled, tooltipSide, }: ItemActionToolbarProps): react_jsx_runtime.JSX.Element;
172
+ declare function ItemActionToolbar({ onEditLink, onAddItem, onMore, editLinkDisabled, addItemDisabled, moreDisabled, tooltipSide, }: ItemActionToolbarProps): react_jsx_runtime.JSX.Element;
106
173
 
107
174
  type ItemInteractionState = 'default' | 'hover' | 'sibling-hint' | 'active-top' | 'active-bottom' | 'dragging';
108
175
  type ItemInteractionLayerProps = {
109
176
  rect: DOMRect;
110
177
  state: ItemInteractionState;
111
178
  elRef?: React.Ref<HTMLDivElement>;
112
- /** Slotted Custom/Toolbar instance (item-action or other fill). */
179
+ /** Slotted Custom/Toolbar instance (item-action or other fill). */
113
180
  toolbar?: React.ReactNode;
114
181
  showHandle?: boolean;
115
182
  dragDisabled?: boolean;
116
183
  dragHandleLabel?: string;
117
184
  onDragHandleDragStart?: (e: React.DragEvent<HTMLButtonElement>) => void;
118
185
  onDragHandleDragEnd?: (e: React.DragEvent<HTMLButtonElement>) => void;
186
+ /** Press on the item chrome (not handle/toolbar) — starts press-to-drag. */
187
+ onItemPointerDown?: (e: React.PointerEvent<HTMLDivElement>) => void;
188
+ /** Click on chrome without a drag — typically enter text edit. */
189
+ onItemClick?: (clientX: number, clientY: number) => void;
119
190
  chromeGap?: number;
120
191
  className?: string;
121
192
  };
122
- declare function ItemInteractionLayer({ rect, state, elRef, toolbar, showHandle, dragDisabled, dragHandleLabel, onDragHandleDragStart, onDragHandleDragEnd, chromeGap, className, }: ItemInteractionLayerProps): react_jsx_runtime.JSX.Element | null;
193
+ declare function ItemInteractionLayer({ rect, state, elRef, toolbar, showHandle, dragDisabled, dragHandleLabel, onDragHandleDragStart, onDragHandleDragEnd, onItemPointerDown, onItemClick, chromeGap, className, }: ItemInteractionLayerProps): react_jsx_runtime.JSX.Element | null;
123
194
 
124
195
  declare function TooltipProvider({ delayDuration, ...props }: React.ComponentProps<typeof Tooltip$1.Provider>): react_jsx_runtime.JSX.Element;
125
196
  declare function Tooltip({ ...props }: React.ComponentProps<typeof Tooltip$1.Root>): react_jsx_runtime.JSX.Element;
@@ -128,4 +199,25 @@ declare function TooltipContent({ className, sideOffset, side, children, ...prop
128
199
 
129
200
  declare function isEditSessionActive(): boolean;
130
201
 
131
- export { CustomToolbar, CustomToolbarButton, CustomToolbarDivider, DragHandle, ItemActionToolbar, type ItemActionToolbarProps, ItemInteractionLayer, type ItemInteractionLayerProps, type ItemInteractionState, LinkEditorPanel, type LinkModalMode, type LinkModalProps, type LinkPage, LinkPopover, type LinkSection, OhhwellsBridge, SchedulingWidget, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, buildTarget, filterAvailablePages, getEditModeInitialState, isEditSessionActive, isValidUrl, parseTarget, toggleVariants, validateUrlInput };
202
+ type CarouselSlide = {
203
+ src: string;
204
+ alt: string;
205
+ };
206
+ /**
207
+ * Template hook. Owns the slide array in React state, stamps the DOM contract via `bind`, and
208
+ * listens for the bridge's change event so replace/add/delete re-render the component.
209
+ *
210
+ * `bind` is plain data attributes (no ref), so it spreads onto any element type without type
211
+ * friction; the hook finds its own container by key. Slides inside still need
212
+ * `data-ohw-carousel-slide={i}`.
213
+ *
214
+ * const { images, bind } = useOhwCarousel('hero-carousel', content.images)
215
+ * <div {...bind}>{images.map((img, i) => <Slide data-ohw-carousel-slide={i} … />)}</div>
216
+ */
217
+ declare function useOhwCarousel(key: string, initial: CarouselSlide[]): {
218
+ images: CarouselSlide[];
219
+ setImages: React.Dispatch<React.SetStateAction<CarouselSlide[]>>;
220
+ bind: Record<string, string>;
221
+ };
222
+
223
+ export { type CarouselSlide, CustomToolbar, CustomToolbarButton, CustomToolbarDivider, DragHandle, DropIndicator, type DropIndicatorProps, ItemActionToolbar, type ItemActionToolbarProps, ItemInteractionLayer, type ItemInteractionLayerProps, type ItemInteractionState, LinkEditorPanel, type LinkModalMode, type LinkModalProps, type LinkPage, LinkPopover, type LinkSection, OhhwellsBridge, SchedulingWidget, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, buildTarget, dropIndicatorVariants, filterAvailablePages, getEditModeInitialState, isEditSessionActive, isValidUrl, parseTarget, toggleVariants, useOhwCarousel, validateUrlInput };
package/dist/index.d.ts CHANGED
@@ -27,6 +27,7 @@ type LinkModalProps = {
27
27
  onClose: () => void;
28
28
  onSubmit: (target: string) => void;
29
29
  };
30
+ type LinkModalStep = 'input' | 'sectionPicker' | 'confirmed';
30
31
  type SelectedPage = {
31
32
  path: string;
32
33
  title: string;
@@ -42,10 +43,55 @@ type LinkPopoverProps = LinkModalProps & {
42
43
  portalContainer?: HTMLElement | null;
43
44
  };
44
45
  /** Centered link editor dialog (shadcn Dialog + Radix). */
45
- declare function LinkPopover({ open, panelRef, portalContainer, onClose, ...editorProps }: LinkPopoverProps): react_jsx_runtime.JSX.Element;
46
+ declare function LinkPopover({ open, panelRef, portalContainer, onClose, mode, pages, sections, sectionsByPath, initialTarget, existingTargets, onSubmit, }: LinkPopoverProps): react_jsx_runtime.JSX.Element;
46
47
 
48
+ type UseLinkModalStateParams = {
49
+ open: boolean;
50
+ mode: LinkModalMode;
51
+ pages: LinkPage[];
52
+ sections: LinkSection[];
53
+ sectionsByPath?: Record<string, LinkSection[]>;
54
+ initialTarget?: string;
55
+ existingTargets: string[];
56
+ onClose: () => void;
57
+ onSubmit: (target: string) => void;
58
+ };
59
+ declare function useLinkModalState({ open, mode, pages, sections: _sections, sectionsByPath, initialTarget, existingTargets: _existingTargets, onClose, onSubmit, }: UseLinkModalStateParams): {
60
+ title: string;
61
+ submitLabel: string;
62
+ secondaryLabel: string;
63
+ searchValue: string;
64
+ selectedPage: SelectedPage | null;
65
+ selectedSection: SelectedSection | null;
66
+ step: LinkModalStep;
67
+ dropdownOpen: boolean;
68
+ setDropdownOpen: React.Dispatch<React.SetStateAction<boolean>>;
69
+ urlError: string;
70
+ filteredPages: LinkPage[];
71
+ showBreadcrumb: false | SelectedSection | null;
72
+ showSectionPicker: false | SelectedPage | null;
73
+ showChooseSection: boolean | null;
74
+ showSectionRow: boolean | null;
75
+ isValid: boolean;
76
+ activeSections: LinkSection[];
77
+ handleInputChange: (value: string) => void;
78
+ handlePageSelect: (page: LinkPage) => void;
79
+ handleChooseSection: () => void;
80
+ handleSectionSelect: (section: LinkSection) => void;
81
+ handleBackToSections: () => void;
82
+ handleSectionPickerBack: () => void;
83
+ handleClose: () => void;
84
+ handleSecondary: () => void;
85
+ handleSubmit: () => void;
86
+ };
87
+
88
+ type LinkModalState = ReturnType<typeof useLinkModalState>;
89
+ type LinkEditorPanelProps = {
90
+ state: LinkModalState;
91
+ onClose: () => void;
92
+ };
47
93
  /** Link destination editor body — Figma node 8365:7616 / 8382:4161 */
48
- declare function LinkEditorPanel({ open, mode, pages, sections, sectionsByPath, initialTarget, existingTargets, onClose, onSubmit, }: LinkModalProps): react_jsx_runtime.JSX.Element;
94
+ declare function LinkEditorPanel({ state, onClose }: LinkEditorPanelProps): react_jsx_runtime.JSX.Element;
49
95
 
50
96
  declare function parseTarget(target: string | null | undefined): {
51
97
  pageRoute: string;
@@ -86,6 +132,26 @@ declare function SchedulingWidget({ notifyOnConnect, initialScheduleId, insertAf
86
132
 
87
133
  declare const DragHandle: React.ForwardRefExoticComponent<React.ButtonHTMLAttributes<HTMLButtonElement> & React.RefAttributes<HTMLButtonElement>>;
88
134
 
135
+ /**
136
+ * Visual drop-gap line for navbar / footer / repeater reorder.
137
+ * Figma: Custom/Drop Indicator (8140:1731) — CSS class `.ov-gap-line`
138
+ *
139
+ * Opacity (Figma docs):
140
+ * - default: 0 (hidden)
141
+ * - hover: 1
142
+ * - dragIdle: 0.4
143
+ * - dragActive: 1
144
+ */
145
+ declare const dropIndicatorVariants: (props?: ({
146
+ direction?: "horizontal" | "vertical" | null | undefined;
147
+ state?: "default" | "hover" | "dragIdle" | "dragActive" | null | undefined;
148
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
149
+ type DropIndicatorProps = React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof dropIndicatorVariants>;
150
+ declare const DropIndicator: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
151
+ direction?: "horizontal" | "vertical" | null | undefined;
152
+ state?: "default" | "hover" | "dragIdle" | "dragActive" | null | undefined;
153
+ } & class_variance_authority_types.ClassProp) | undefined) => string> & React.RefAttributes<HTMLDivElement>>;
154
+
89
155
  declare const CustomToolbar: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
90
156
  declare function CustomToolbarDivider({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>): react_jsx_runtime.JSX.Element;
91
157
  declare const CustomToolbarButton: React.ForwardRefExoticComponent<React.ButtonHTMLAttributes<HTMLButtonElement> & {
@@ -96,30 +162,35 @@ type ItemActionToolbarProps = {
96
162
  onEditLink?: () => void;
97
163
  onAddItem?: () => void;
98
164
  onMore?: () => void;
165
+ editLinkDisabled?: boolean;
99
166
  addItemDisabled?: boolean;
100
167
  moreDisabled?: boolean;
101
168
  /** Tooltip placement relative to each icon — Figma uses bottom. */
102
169
  tooltipSide?: 'top' | 'bottom' | 'left' | 'right';
103
170
  };
104
171
  /** Item-action fill for Custom/Toolbar — Edit link / Add item / More. */
105
- declare function ItemActionToolbar({ onEditLink, onAddItem, onMore, addItemDisabled, moreDisabled, tooltipSide, }: ItemActionToolbarProps): react_jsx_runtime.JSX.Element;
172
+ declare function ItemActionToolbar({ onEditLink, onAddItem, onMore, editLinkDisabled, addItemDisabled, moreDisabled, tooltipSide, }: ItemActionToolbarProps): react_jsx_runtime.JSX.Element;
106
173
 
107
174
  type ItemInteractionState = 'default' | 'hover' | 'sibling-hint' | 'active-top' | 'active-bottom' | 'dragging';
108
175
  type ItemInteractionLayerProps = {
109
176
  rect: DOMRect;
110
177
  state: ItemInteractionState;
111
178
  elRef?: React.Ref<HTMLDivElement>;
112
- /** Slotted Custom/Toolbar instance (item-action or other fill). */
179
+ /** Slotted Custom/Toolbar instance (item-action or other fill). */
113
180
  toolbar?: React.ReactNode;
114
181
  showHandle?: boolean;
115
182
  dragDisabled?: boolean;
116
183
  dragHandleLabel?: string;
117
184
  onDragHandleDragStart?: (e: React.DragEvent<HTMLButtonElement>) => void;
118
185
  onDragHandleDragEnd?: (e: React.DragEvent<HTMLButtonElement>) => void;
186
+ /** Press on the item chrome (not handle/toolbar) — starts press-to-drag. */
187
+ onItemPointerDown?: (e: React.PointerEvent<HTMLDivElement>) => void;
188
+ /** Click on chrome without a drag — typically enter text edit. */
189
+ onItemClick?: (clientX: number, clientY: number) => void;
119
190
  chromeGap?: number;
120
191
  className?: string;
121
192
  };
122
- declare function ItemInteractionLayer({ rect, state, elRef, toolbar, showHandle, dragDisabled, dragHandleLabel, onDragHandleDragStart, onDragHandleDragEnd, chromeGap, className, }: ItemInteractionLayerProps): react_jsx_runtime.JSX.Element | null;
193
+ declare function ItemInteractionLayer({ rect, state, elRef, toolbar, showHandle, dragDisabled, dragHandleLabel, onDragHandleDragStart, onDragHandleDragEnd, onItemPointerDown, onItemClick, chromeGap, className, }: ItemInteractionLayerProps): react_jsx_runtime.JSX.Element | null;
123
194
 
124
195
  declare function TooltipProvider({ delayDuration, ...props }: React.ComponentProps<typeof Tooltip$1.Provider>): react_jsx_runtime.JSX.Element;
125
196
  declare function Tooltip({ ...props }: React.ComponentProps<typeof Tooltip$1.Root>): react_jsx_runtime.JSX.Element;
@@ -128,4 +199,25 @@ declare function TooltipContent({ className, sideOffset, side, children, ...prop
128
199
 
129
200
  declare function isEditSessionActive(): boolean;
130
201
 
131
- export { CustomToolbar, CustomToolbarButton, CustomToolbarDivider, DragHandle, ItemActionToolbar, type ItemActionToolbarProps, ItemInteractionLayer, type ItemInteractionLayerProps, type ItemInteractionState, LinkEditorPanel, type LinkModalMode, type LinkModalProps, type LinkPage, LinkPopover, type LinkSection, OhhwellsBridge, SchedulingWidget, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, buildTarget, filterAvailablePages, getEditModeInitialState, isEditSessionActive, isValidUrl, parseTarget, toggleVariants, validateUrlInput };
202
+ type CarouselSlide = {
203
+ src: string;
204
+ alt: string;
205
+ };
206
+ /**
207
+ * Template hook. Owns the slide array in React state, stamps the DOM contract via `bind`, and
208
+ * listens for the bridge's change event so replace/add/delete re-render the component.
209
+ *
210
+ * `bind` is plain data attributes (no ref), so it spreads onto any element type without type
211
+ * friction; the hook finds its own container by key. Slides inside still need
212
+ * `data-ohw-carousel-slide={i}`.
213
+ *
214
+ * const { images, bind } = useOhwCarousel('hero-carousel', content.images)
215
+ * <div {...bind}>{images.map((img, i) => <Slide data-ohw-carousel-slide={i} … />)}</div>
216
+ */
217
+ declare function useOhwCarousel(key: string, initial: CarouselSlide[]): {
218
+ images: CarouselSlide[];
219
+ setImages: React.Dispatch<React.SetStateAction<CarouselSlide[]>>;
220
+ bind: Record<string, string>;
221
+ };
222
+
223
+ export { type CarouselSlide, CustomToolbar, CustomToolbarButton, CustomToolbarDivider, DragHandle, DropIndicator, type DropIndicatorProps, ItemActionToolbar, type ItemActionToolbarProps, ItemInteractionLayer, type ItemInteractionLayerProps, type ItemInteractionState, LinkEditorPanel, type LinkModalMode, type LinkModalProps, type LinkPage, LinkPopover, type LinkSection, OhhwellsBridge, SchedulingWidget, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, buildTarget, dropIndicatorVariants, filterAvailablePages, getEditModeInitialState, isEditSessionActive, isValidUrl, parseTarget, toggleVariants, useOhwCarousel, validateUrlInput };