@ohhwells/bridge 0.1.139-next.376 → 0.1.140

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
@@ -340,140 +340,6 @@ interface AiFooterRendererProps {
340
340
  */
341
341
  declare function AiFooterRenderer({ tree, brand, resolveMedia, editKeyPrefix, logoUrl, resolvePageHref, legal, surface, }: AiFooterRendererProps): react_jsx_runtime.JSX.Element | null;
342
342
 
343
- declare const SECTION_BACKGROUNDS: readonly ["default", "surface", "accent", "accent-soft"];
344
- declare const TEXT_DISTRIBUTIONS: readonly ["top", "center", "space-between"];
345
- declare const HEADLINE_SCALES: readonly ["md", "lg", "xl", "display"];
346
- /** @deprecated OHH-789 folds this into STYLE_VERTICAL_PADDINGS — kept so an override saved before
347
- * the fold still renders; see legacyVerticalPaddingAlias below. */
348
- declare const STYLE_SPACINGS: readonly ["tight", "balanced", "airy"];
349
- declare const STYLE_VERTICAL_PADDINGS: readonly ["none", "xs", "s", "m", "l", "xl"];
350
- declare const STYLE_MIN_HEIGHTS: readonly ["auto", "half", "full"];
351
- declare const CORNER_STYLES: readonly ["rounded", "sharp"];
352
- interface SectionStyleOverride {
353
- sectionBackground?: (typeof SECTION_BACKGROUNDS)[number];
354
- /** Arbitrary background colour — wins over the tone when both are set. */
355
- sectionBackgroundColor?: string;
356
- /** Section-wide text colour. The backend also expands it to per-node overrides for the nodes
357
- * it saw; this section-level copy covers text the section gains LATER (owner-added nav/social
358
- * items, reconciled elements) so "make this section's text red" survives additions. */
359
- textColor?: string;
360
- /** Section-wide text font — same future-proofing as textColor. */
361
- fontFamily?: string;
362
- /** Section-wide heading colour — painted onto the section's h1-h6 editables, over textColor. */
363
- headingColor?: string;
364
- textDistribution?: (typeof TEXT_DISTRIBUTIONS)[number];
365
- headlineScale?: (typeof HEADLINE_SCALES)[number];
366
- imageAspect?: string;
367
- /** @deprecated OHH-789 folds this into verticalPadding — a store saved before the fold may
368
- * still carry it; legacyVerticalPaddingAlias resolves it at apply time. */
369
- spacing?: (typeof STYLE_SPACINGS)[number];
370
- /** Section vertical-padding scale (OHH-789), template sections. Best-effort mobile scaling via
371
- * the same clamp() technique the AI-tree renderer uses for generated sections. */
372
- verticalPadding?: (typeof STYLE_VERTICAL_PADDINGS)[number];
373
- /** Section minimum-height floor (OHH-789), template sections — a floor, never a fixed height,
374
- * so content taller than 'half'/'full' always extends the section. Applied as a direct inline
375
- * style (not a stylesheet rule) so the editor's existing literal-"100vh" edit-mode rewrite
376
- * (which only scans inline `style` attributes) picks up 'full' for free. */
377
- minHeight?: (typeof STYLE_MIN_HEIGHTS)[number];
378
- /** Corner treatment for the section's cards and images — best-effort square on template + generated. */
379
- cornerStyle?: (typeof CORNER_STYLES)[number];
380
- /** Background colour of the section's cards / repeated items (template `.card`, generated
381
- * `[data-ohw-card]`, and the detected top-level item wrappers) — never the section band. */
382
- cardBackgroundColor?: string;
383
- /** Horizontal alignment of the whole section's content. Best-effort on template sections
384
- * (text-align cascade); generated sections fold it into the tree instead. */
385
- align?: 'left' | 'center' | 'right';
386
- /** navbar-only: the mobile hamburger drawer's own background, as a brand-kit token name (one of
387
- * NAVBAR_COLOR_TOKENS) — never a raw colour. Fully independent of sectionBackgroundColor: absent
388
- * means the drawer keeps its own template default, never the header's live colour. */
389
- navbarMobileBackground?: (typeof NAVBAR_COLOR_TOKENS)[number];
390
- /** navbar-only: the mobile drawer's own text colour token — same independence from textColor as
391
- * navbarMobileBackground has from sectionBackgroundColor. */
392
- navbarMobileTextColor?: (typeof NAVBAR_COLOR_TOKENS)[number];
393
- }
394
- interface NodeStyleOverride {
395
- color?: string;
396
- /** A Google Fonts family (canonical name); loaded via the managed fonts link. */
397
- fontFamily?: string;
398
- fontSize?: number;
399
- /** Horizontal alignment of the element's content (left/center/right). Best-effort:
400
- * written as both text-align (text nodes) and justify-content (flex rows like a button-row). */
401
- align?: 'left' | 'center' | 'right';
402
- }
403
- /** Overrides for ONE repeated item (a single card of a group) — see item-instances.ts. */
404
- interface ItemStyleOverride {
405
- backgroundColor?: string;
406
- }
407
- interface StyleStore {
408
- v: 1;
409
- sections: Record<string, SectionStyleOverride>;
410
- nodes: Record<string, NodeStyleOverride>;
411
- /** Keyed `<sectionId>|<group>:<index>` — the section plus the item's `data-ohw-item` stamp.
412
- * Absent on stores written before per-item colours existed. */
413
- items?: Record<string, ItemStyleOverride>;
414
- }
415
- /** The brand-kit palette's four keys — the only colour vocabulary navbar/mobileMenu props accept
416
- * (a token reference, never a raw hex), per OHH-790's node-vs-kit rule for this one node. */
417
- declare const NAVBAR_COLOR_TOKENS: readonly ["dark", "primary", "accent", "light"];
418
-
419
- /**
420
- * Persistence model for AI-generated sections.
421
- *
422
- * All AI sections on a page live in ONE structural content node under the
423
- * `__ohw_ai_sections` key — the same guarded namespace as the sections tracker,
424
- * so prompts can never see or edit it (Tier 1). The value is JSON:
425
- *
426
- * {v: 1, sections: [{id, label, afterSection, replaces, tree, media}]}
427
- *
428
- * - `afterSection`: template section id this section is inserted after
429
- * (null = top of page). Ignored when `replaces` is set.
430
- * - `replaces`: template section id whose place this section takes — the
431
- * original DOM section is hidden, not removed, so undo is a pure restore.
432
- * - `media`: ref -> URL map resolved at apply time by the editor, so published
433
- * sites render without any lookup dependency.
434
- */
435
-
436
- interface AiSectionEntry {
437
- id: string;
438
- label: string;
439
- /** Page the section was generated on (pathname). Absent = legacy entry, mounted everywhere.
440
- * Same convention as the scheduling tracker's pagePath. */
441
- path?: string;
442
- afterSection: string | null;
443
- /** Insert-above anchor ("add a section above X"); takes precedence over afterSection. */
444
- beforeSection?: string;
445
- replaces?: string;
446
- tree: AiLayoutTree;
447
- media: Record<string, string>;
448
- /** Site brand kit resolved by the editor at apply time; absent = renderer default. */
449
- brand?: AiBrandKit;
450
- }
451
- interface AiSectionsState {
452
- v: 1;
453
- sections: AiSectionEntry[];
454
- /** Template section ids removed by AI delete — hidden in the DOM, restored by replaying a prior state. */
455
- removed?: string[];
456
- /**
457
- * Set by the homepage generation run: the generated sections ARE the page, so every template
458
- * body section hides — navbar and footer chrome stay. Cleared (or absent) restores them all.
459
- */
460
- hideTemplate?: boolean;
461
- }
462
- /** Parse a persisted value defensively — malformed state renders nothing, never throws. */
463
- declare function parseAiSectionsState(raw: string | null | undefined): AiSectionsState;
464
- /**
465
- * Fold alignment overrides that target GENERATED sections into their trees, where alignment is
466
- * first-class data (block.align) that persists with the rest of the tree. A node override
467
- * (`ai.<id>.r<r>.b<b>...`) sets that block's align; a section override sets every top-level
468
- * block in the tree. Folded overrides leave the store — the tree becomes the single source of
469
- * truth. Template-section overrides and orphaned keys pass through untouched.
470
- */
471
- declare function foldAlignIntoTrees(state: AiSectionsState, store: StyleStore): {
472
- state: AiSectionsState;
473
- store: StyleStore;
474
- changed: boolean;
475
- };
476
-
477
343
  /**
478
344
  * Site-wide AI footer persistence .
479
345
  *
@@ -859,4 +725,4 @@ declare function useOhwCarousel(key: string, initial: CarouselSlide[]): {
859
725
  bind: Record<string, string>;
860
726
  };
861
727
 
862
- export { AI_DEFAULT_BRAND, AI_FOOTER_KEY, AI_TREE_SCHEMA_VERSIONS, AI_TREE_TOKENS, type AiBlockNode, type AiBrandKit, type AiFooterBottomBar, type AiFooterColumn, type AiFooterLayoutTree, AiFooterRenderer, type AiFooterRendererProps, type AiLayoutTree, AiTreeRenderer, type AiTreeRendererProps, type CarouselSlide, CustomToolbar, CustomToolbarButton, CustomToolbarDivider, DragHandle, DropIndicator, type DropIndicatorProps, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, EmptySection, type EmptySectionProps, FOOTER_COLUMN_BLOCKS, FOOTER_COLUMN_SPANS, FOOTER_SOCIAL_PLATFORMS, ItemActionToolbar, type ItemActionToolbarProps, ItemInteractionLayer, type ItemInteractionLayerProps, type ItemInteractionState, LinkEditorPanel, type LinkModalMode, type LinkModalProps, type LinkPage, LinkPopover, type LinkSection, OhhwellsBridge, SchedulingWidget, type SectionScaffold, type SiteLegalLinks, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, addFooterLinkColumn, appendFooterSocial, buildDefaultFooterTree, buildTarget, dropIndicatorVariants, ensureFooterTree, filterAvailablePages, foldAlignIntoTrees, getEditModeInitialState, insertFooterHours, isEditSessionActive, isRenderableFooterTree, isRenderableTree, isValidUrl, nextViableSlide, parseAiFooterState, parseAiSectionsState, parseTarget, removeFooterBlock, resolveFooterCopyright, serializeAiFooterState, stepViableSlide, toggleVariants, useOhwCarousel, validateUrlInput, viableSlides };
728
+ export { AI_DEFAULT_BRAND, AI_FOOTER_KEY, AI_TREE_SCHEMA_VERSIONS, AI_TREE_TOKENS, type AiBlockNode, type AiBrandKit, type AiFooterBottomBar, type AiFooterColumn, type AiFooterLayoutTree, AiFooterRenderer, type AiFooterRendererProps, type AiLayoutTree, AiTreeRenderer, type AiTreeRendererProps, type CarouselSlide, CustomToolbar, CustomToolbarButton, CustomToolbarDivider, DragHandle, DropIndicator, type DropIndicatorProps, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, EmptySection, type EmptySectionProps, FOOTER_COLUMN_BLOCKS, FOOTER_COLUMN_SPANS, FOOTER_SOCIAL_PLATFORMS, ItemActionToolbar, type ItemActionToolbarProps, ItemInteractionLayer, type ItemInteractionLayerProps, type ItemInteractionState, LinkEditorPanel, type LinkModalMode, type LinkModalProps, type LinkPage, LinkPopover, type LinkSection, OhhwellsBridge, SchedulingWidget, type SectionScaffold, type SiteLegalLinks, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, addFooterLinkColumn, appendFooterSocial, buildDefaultFooterTree, buildTarget, dropIndicatorVariants, ensureFooterTree, filterAvailablePages, getEditModeInitialState, insertFooterHours, isEditSessionActive, isRenderableFooterTree, isRenderableTree, isValidUrl, nextViableSlide, parseAiFooterState, parseTarget, removeFooterBlock, resolveFooterCopyright, serializeAiFooterState, stepViableSlide, toggleVariants, useOhwCarousel, validateUrlInput, viableSlides };
package/dist/index.d.ts CHANGED
@@ -340,140 +340,6 @@ interface AiFooterRendererProps {
340
340
  */
341
341
  declare function AiFooterRenderer({ tree, brand, resolveMedia, editKeyPrefix, logoUrl, resolvePageHref, legal, surface, }: AiFooterRendererProps): react_jsx_runtime.JSX.Element | null;
342
342
 
343
- declare const SECTION_BACKGROUNDS: readonly ["default", "surface", "accent", "accent-soft"];
344
- declare const TEXT_DISTRIBUTIONS: readonly ["top", "center", "space-between"];
345
- declare const HEADLINE_SCALES: readonly ["md", "lg", "xl", "display"];
346
- /** @deprecated OHH-789 folds this into STYLE_VERTICAL_PADDINGS — kept so an override saved before
347
- * the fold still renders; see legacyVerticalPaddingAlias below. */
348
- declare const STYLE_SPACINGS: readonly ["tight", "balanced", "airy"];
349
- declare const STYLE_VERTICAL_PADDINGS: readonly ["none", "xs", "s", "m", "l", "xl"];
350
- declare const STYLE_MIN_HEIGHTS: readonly ["auto", "half", "full"];
351
- declare const CORNER_STYLES: readonly ["rounded", "sharp"];
352
- interface SectionStyleOverride {
353
- sectionBackground?: (typeof SECTION_BACKGROUNDS)[number];
354
- /** Arbitrary background colour — wins over the tone when both are set. */
355
- sectionBackgroundColor?: string;
356
- /** Section-wide text colour. The backend also expands it to per-node overrides for the nodes
357
- * it saw; this section-level copy covers text the section gains LATER (owner-added nav/social
358
- * items, reconciled elements) so "make this section's text red" survives additions. */
359
- textColor?: string;
360
- /** Section-wide text font — same future-proofing as textColor. */
361
- fontFamily?: string;
362
- /** Section-wide heading colour — painted onto the section's h1-h6 editables, over textColor. */
363
- headingColor?: string;
364
- textDistribution?: (typeof TEXT_DISTRIBUTIONS)[number];
365
- headlineScale?: (typeof HEADLINE_SCALES)[number];
366
- imageAspect?: string;
367
- /** @deprecated OHH-789 folds this into verticalPadding — a store saved before the fold may
368
- * still carry it; legacyVerticalPaddingAlias resolves it at apply time. */
369
- spacing?: (typeof STYLE_SPACINGS)[number];
370
- /** Section vertical-padding scale (OHH-789), template sections. Best-effort mobile scaling via
371
- * the same clamp() technique the AI-tree renderer uses for generated sections. */
372
- verticalPadding?: (typeof STYLE_VERTICAL_PADDINGS)[number];
373
- /** Section minimum-height floor (OHH-789), template sections — a floor, never a fixed height,
374
- * so content taller than 'half'/'full' always extends the section. Applied as a direct inline
375
- * style (not a stylesheet rule) so the editor's existing literal-"100vh" edit-mode rewrite
376
- * (which only scans inline `style` attributes) picks up 'full' for free. */
377
- minHeight?: (typeof STYLE_MIN_HEIGHTS)[number];
378
- /** Corner treatment for the section's cards and images — best-effort square on template + generated. */
379
- cornerStyle?: (typeof CORNER_STYLES)[number];
380
- /** Background colour of the section's cards / repeated items (template `.card`, generated
381
- * `[data-ohw-card]`, and the detected top-level item wrappers) — never the section band. */
382
- cardBackgroundColor?: string;
383
- /** Horizontal alignment of the whole section's content. Best-effort on template sections
384
- * (text-align cascade); generated sections fold it into the tree instead. */
385
- align?: 'left' | 'center' | 'right';
386
- /** navbar-only: the mobile hamburger drawer's own background, as a brand-kit token name (one of
387
- * NAVBAR_COLOR_TOKENS) — never a raw colour. Fully independent of sectionBackgroundColor: absent
388
- * means the drawer keeps its own template default, never the header's live colour. */
389
- navbarMobileBackground?: (typeof NAVBAR_COLOR_TOKENS)[number];
390
- /** navbar-only: the mobile drawer's own text colour token — same independence from textColor as
391
- * navbarMobileBackground has from sectionBackgroundColor. */
392
- navbarMobileTextColor?: (typeof NAVBAR_COLOR_TOKENS)[number];
393
- }
394
- interface NodeStyleOverride {
395
- color?: string;
396
- /** A Google Fonts family (canonical name); loaded via the managed fonts link. */
397
- fontFamily?: string;
398
- fontSize?: number;
399
- /** Horizontal alignment of the element's content (left/center/right). Best-effort:
400
- * written as both text-align (text nodes) and justify-content (flex rows like a button-row). */
401
- align?: 'left' | 'center' | 'right';
402
- }
403
- /** Overrides for ONE repeated item (a single card of a group) — see item-instances.ts. */
404
- interface ItemStyleOverride {
405
- backgroundColor?: string;
406
- }
407
- interface StyleStore {
408
- v: 1;
409
- sections: Record<string, SectionStyleOverride>;
410
- nodes: Record<string, NodeStyleOverride>;
411
- /** Keyed `<sectionId>|<group>:<index>` — the section plus the item's `data-ohw-item` stamp.
412
- * Absent on stores written before per-item colours existed. */
413
- items?: Record<string, ItemStyleOverride>;
414
- }
415
- /** The brand-kit palette's four keys — the only colour vocabulary navbar/mobileMenu props accept
416
- * (a token reference, never a raw hex), per OHH-790's node-vs-kit rule for this one node. */
417
- declare const NAVBAR_COLOR_TOKENS: readonly ["dark", "primary", "accent", "light"];
418
-
419
- /**
420
- * Persistence model for AI-generated sections.
421
- *
422
- * All AI sections on a page live in ONE structural content node under the
423
- * `__ohw_ai_sections` key — the same guarded namespace as the sections tracker,
424
- * so prompts can never see or edit it (Tier 1). The value is JSON:
425
- *
426
- * {v: 1, sections: [{id, label, afterSection, replaces, tree, media}]}
427
- *
428
- * - `afterSection`: template section id this section is inserted after
429
- * (null = top of page). Ignored when `replaces` is set.
430
- * - `replaces`: template section id whose place this section takes — the
431
- * original DOM section is hidden, not removed, so undo is a pure restore.
432
- * - `media`: ref -> URL map resolved at apply time by the editor, so published
433
- * sites render without any lookup dependency.
434
- */
435
-
436
- interface AiSectionEntry {
437
- id: string;
438
- label: string;
439
- /** Page the section was generated on (pathname). Absent = legacy entry, mounted everywhere.
440
- * Same convention as the scheduling tracker's pagePath. */
441
- path?: string;
442
- afterSection: string | null;
443
- /** Insert-above anchor ("add a section above X"); takes precedence over afterSection. */
444
- beforeSection?: string;
445
- replaces?: string;
446
- tree: AiLayoutTree;
447
- media: Record<string, string>;
448
- /** Site brand kit resolved by the editor at apply time; absent = renderer default. */
449
- brand?: AiBrandKit;
450
- }
451
- interface AiSectionsState {
452
- v: 1;
453
- sections: AiSectionEntry[];
454
- /** Template section ids removed by AI delete — hidden in the DOM, restored by replaying a prior state. */
455
- removed?: string[];
456
- /**
457
- * Set by the homepage generation run: the generated sections ARE the page, so every template
458
- * body section hides — navbar and footer chrome stay. Cleared (or absent) restores them all.
459
- */
460
- hideTemplate?: boolean;
461
- }
462
- /** Parse a persisted value defensively — malformed state renders nothing, never throws. */
463
- declare function parseAiSectionsState(raw: string | null | undefined): AiSectionsState;
464
- /**
465
- * Fold alignment overrides that target GENERATED sections into their trees, where alignment is
466
- * first-class data (block.align) that persists with the rest of the tree. A node override
467
- * (`ai.<id>.r<r>.b<b>...`) sets that block's align; a section override sets every top-level
468
- * block in the tree. Folded overrides leave the store — the tree becomes the single source of
469
- * truth. Template-section overrides and orphaned keys pass through untouched.
470
- */
471
- declare function foldAlignIntoTrees(state: AiSectionsState, store: StyleStore): {
472
- state: AiSectionsState;
473
- store: StyleStore;
474
- changed: boolean;
475
- };
476
-
477
343
  /**
478
344
  * Site-wide AI footer persistence .
479
345
  *
@@ -859,4 +725,4 @@ declare function useOhwCarousel(key: string, initial: CarouselSlide[]): {
859
725
  bind: Record<string, string>;
860
726
  };
861
727
 
862
- export { AI_DEFAULT_BRAND, AI_FOOTER_KEY, AI_TREE_SCHEMA_VERSIONS, AI_TREE_TOKENS, type AiBlockNode, type AiBrandKit, type AiFooterBottomBar, type AiFooterColumn, type AiFooterLayoutTree, AiFooterRenderer, type AiFooterRendererProps, type AiLayoutTree, AiTreeRenderer, type AiTreeRendererProps, type CarouselSlide, CustomToolbar, CustomToolbarButton, CustomToolbarDivider, DragHandle, DropIndicator, type DropIndicatorProps, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, EmptySection, type EmptySectionProps, FOOTER_COLUMN_BLOCKS, FOOTER_COLUMN_SPANS, FOOTER_SOCIAL_PLATFORMS, ItemActionToolbar, type ItemActionToolbarProps, ItemInteractionLayer, type ItemInteractionLayerProps, type ItemInteractionState, LinkEditorPanel, type LinkModalMode, type LinkModalProps, type LinkPage, LinkPopover, type LinkSection, OhhwellsBridge, SchedulingWidget, type SectionScaffold, type SiteLegalLinks, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, addFooterLinkColumn, appendFooterSocial, buildDefaultFooterTree, buildTarget, dropIndicatorVariants, ensureFooterTree, filterAvailablePages, foldAlignIntoTrees, getEditModeInitialState, insertFooterHours, isEditSessionActive, isRenderableFooterTree, isRenderableTree, isValidUrl, nextViableSlide, parseAiFooterState, parseAiSectionsState, parseTarget, removeFooterBlock, resolveFooterCopyright, serializeAiFooterState, stepViableSlide, toggleVariants, useOhwCarousel, validateUrlInput, viableSlides };
728
+ export { AI_DEFAULT_BRAND, AI_FOOTER_KEY, AI_TREE_SCHEMA_VERSIONS, AI_TREE_TOKENS, type AiBlockNode, type AiBrandKit, type AiFooterBottomBar, type AiFooterColumn, type AiFooterLayoutTree, AiFooterRenderer, type AiFooterRendererProps, type AiLayoutTree, AiTreeRenderer, type AiTreeRendererProps, type CarouselSlide, CustomToolbar, CustomToolbarButton, CustomToolbarDivider, DragHandle, DropIndicator, type DropIndicatorProps, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, EmptySection, type EmptySectionProps, FOOTER_COLUMN_BLOCKS, FOOTER_COLUMN_SPANS, FOOTER_SOCIAL_PLATFORMS, ItemActionToolbar, type ItemActionToolbarProps, ItemInteractionLayer, type ItemInteractionLayerProps, type ItemInteractionState, LinkEditorPanel, type LinkModalMode, type LinkModalProps, type LinkPage, LinkPopover, type LinkSection, OhhwellsBridge, SchedulingWidget, type SectionScaffold, type SiteLegalLinks, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, addFooterLinkColumn, appendFooterSocial, buildDefaultFooterTree, buildTarget, dropIndicatorVariants, ensureFooterTree, filterAvailablePages, getEditModeInitialState, insertFooterHours, isEditSessionActive, isRenderableFooterTree, isRenderableTree, isValidUrl, nextViableSlide, parseAiFooterState, parseTarget, removeFooterBlock, resolveFooterCopyright, serializeAiFooterState, stepViableSlide, toggleVariants, useOhwCarousel, validateUrlInput, viableSlides };