@levo-so/studio 0.1.59 → 0.1.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/{Beams-0Cg_3upg.js → Beams-sKsW_tr4.js} +46 -55
  2. package/dist/{Dots-turX9wMO.js → Dots-BEIutbKS.js} +44 -40
  3. package/dist/{Gradient-Be4Kqh_1.js → Gradient-DAR7R3Mz.js} +2 -2
  4. package/dist/Grid-BuKIXWMJ.js +174 -0
  5. package/dist/MessageCard-C8v6oHmf.js +45 -0
  6. package/dist/{Waves-DL4kuojY.js → Waves-C8qlIS1W.js} +29 -80
  7. package/dist/bridge/Highlighter.d.ts +3 -5
  8. package/dist/bridge/StudioBlockPreview.d.ts +1 -0
  9. package/dist/bridge/StudioPagePreview.d.ts +2 -2
  10. package/dist/bridge/StudioPreview.d.ts +1 -1
  11. package/dist/bridge/constants.d.ts +2 -0
  12. package/dist/bridge/hooks/useElementTracker.d.ts +9 -0
  13. package/dist/bridge/index.d.ts +3 -3
  14. package/dist/bridge/utils.d.ts +1 -4
  15. package/dist/components/AnimatedBlock.d.ts +50 -0
  16. package/dist/components/backgroundPresets/exports.d.ts +1 -1
  17. package/dist/components/backgroundPresets/presetSystem.d.ts +2 -2
  18. package/dist/components/bookingCard/BookingCard.d.ts +65 -0
  19. package/dist/components/bookingCard/index.d.ts +2 -0
  20. package/dist/components/bookingModal/BookingConfirmation.d.ts +48 -0
  21. package/dist/components/bookingModal/BookingModal.d.ts +19 -0
  22. package/dist/components/bookingModal/BookingSummary.d.ts +34 -0
  23. package/dist/components/bookingModal/index.d.ts +4 -0
  24. package/dist/components/index.d.ts +1 -0
  25. package/dist/components/integrationFilters/FieldRenderer.d.ts +3 -0
  26. package/dist/components/integrationFilters/IntegrationFilters.d.ts +1 -1
  27. package/dist/components/integrationFilters/fields/DropdownField.d.ts +1 -1
  28. package/dist/components/integrationFilters/fields/TextField.d.ts +1 -1
  29. package/dist/components/registerModal/AttendeeForm.d.ts +27 -0
  30. package/dist/components/registerModal/CouponView.d.ts +14 -0
  31. package/dist/components/registerModal/RegisterModal.d.ts +2 -1
  32. package/dist/components/registerModal/TicketSelectionStep.d.ts +15 -0
  33. package/dist/components/registerModal/utils.d.ts +85 -1
  34. package/dist/components/stripePaymentModal/StripePaymentModal.d.ts +22 -0
  35. package/dist/components/stripePaymentModal/index.d.ts +3 -0
  36. package/dist/components/ui/Calendar.d.ts +1 -1
  37. package/dist/components/ui/base/avatar.d.ts +13 -0
  38. package/dist/components/ui/base/index.d.ts +3 -0
  39. package/dist/components/ui/base/input.d.ts +1 -1
  40. package/dist/components/ui/base/skeleton.d.ts +3 -0
  41. package/dist/components/ui/base/textarea.d.ts +4 -0
  42. package/dist/components/ui/base/tooltip.d.ts +17 -0
  43. package/dist/components/ui/form/FormTextarea.d.ts +15 -0
  44. package/dist/components/ui/index.d.ts +3 -0
  45. package/dist/components/withBlockProps.d.ts +6 -14
  46. package/dist/constants/animation.d.ts +10 -0
  47. package/dist/contentEngine/content.d.ts +8 -3
  48. package/dist/contentEngine/index.d.ts +3 -3
  49. package/dist/contentEngine/sourceFetcher.d.ts +1 -1
  50. package/dist/contentEngine/themeUtils.d.ts +13 -0
  51. package/dist/contentEngine/types.d.ts +1 -0
  52. package/dist/contentEngine/useContextEngine.d.ts +11 -0
  53. package/dist/context/ForumContext.d.ts +48 -0
  54. package/dist/core/AccessManager/index.d.ts +1 -1
  55. package/dist/core/LevoBlock.d.ts +3 -2
  56. package/dist/core/LevoPage.d.ts +2 -2
  57. package/dist/core/index.d.ts +1 -1
  58. package/dist/elements/AlertDialog/index.d.ts +23 -0
  59. package/dist/elements/Carousel.d.ts +10 -2
  60. package/dist/elements/Tabs.d.ts +1 -1
  61. package/dist/elements/UserMenu.d.ts +1 -1
  62. package/dist/elements/accordion/index.d.ts +1 -1
  63. package/dist/elements/dialog/index.d.ts +1 -1
  64. package/dist/elements/forum/ForumPost.d.ts +18 -0
  65. package/dist/elements/forum/ForumPostContentRenderer.d.ts +8 -0
  66. package/dist/elements/forum/SearchInput.d.ts +5 -0
  67. package/dist/elements/forum/categoryFilter/CategoryFilter.d.ts +16 -0
  68. package/dist/elements/forum/categoryFilter/index.d.ts +2 -0
  69. package/dist/elements/forum/comments/Comment.d.ts +14 -0
  70. package/dist/elements/forum/comments/Comments.d.ts +9 -0
  71. package/dist/elements/forum/comments/ReplyBox.d.ts +11 -0
  72. package/dist/elements/forum/comments/commentUtility.d.ts +25 -0
  73. package/dist/elements/forum/comments/index.d.ts +2 -0
  74. package/dist/elements/forum/createForumPost/CreateForumPost.d.ts +9 -0
  75. package/dist/elements/forum/createForumPost/CreateForumPostModal.d.ts +87 -0
  76. package/dist/elements/forum/createForumPost/index.d.ts +2 -0
  77. package/dist/elements/forum/index.d.ts +8 -0
  78. package/dist/elements/forum/restrictionOverlays/CommentsRestrictionOverlay.d.ts +16 -0
  79. package/dist/elements/forum/restrictionOverlays/JoinRequestForm.d.ts +14 -0
  80. package/dist/elements/forum/restrictionOverlays/PendingRequestState.d.ts +11 -0
  81. package/dist/elements/forum/restrictionOverlays/PostsRestrictionOverlay.d.ts +16 -0
  82. package/dist/elements/forum/restrictionOverlays/index.d.ts +5 -0
  83. package/dist/elements/forum/utility/Video.d.ts +16 -0
  84. package/dist/elements/forum/utility/index.d.ts +49 -0
  85. package/dist/elements/index.d.ts +10 -9
  86. package/dist/elements-BxhlsyhI.js +9 -0
  87. package/dist/hooks/index.d.ts +3 -0
  88. package/dist/hooks/useLogin.d.ts +1 -1
  89. package/dist/hooks/useStripePayment.d.ts +49 -0
  90. package/dist/index-BJrh8CwF.js +16197 -0
  91. package/dist/{index-BdswdesP.js → index-BYXw6aHi.js} +3 -4
  92. package/dist/index-CV5mr-8e.js +365 -0
  93. package/dist/index-CXtfbmpx.js +23 -0
  94. package/dist/index-CgUU2EbC.js +765 -0
  95. package/dist/index-DsAqikcl.js +29 -0
  96. package/dist/index-DxsNKR4p.js +56 -0
  97. package/dist/{index-DHHPZcEh.js → index-IcG2wuuE.js} +1 -8
  98. package/dist/index.d.ts +16 -13
  99. package/dist/index.js +159 -107
  100. package/dist/interfaces/block.d.ts +2 -2
  101. package/dist/interfaces/levoBlock.d.ts +64 -10
  102. package/dist/interfaces/site.d.ts +1 -193
  103. package/dist/interfaces/sites.d.ts +201 -3
  104. package/dist/interfaces/theme.d.ts +2 -0
  105. package/dist/pixel/parserUtil.d.ts +1 -0
  106. package/dist/providers/AuthProvider.d.ts +1 -0
  107. package/dist/providers/BlockContext.d.ts +2 -1
  108. package/dist/providers/LazyMotionProvider.d.ts +15 -0
  109. package/dist/providers/index.d.ts +1 -0
  110. package/dist/studio.css +1 -1
  111. package/dist/utils/colorUtils.d.ts +7 -0
  112. package/dist/utils/getKeysWithValue.d.ts +1 -1
  113. package/dist/utils/string.d.ts +7 -0
  114. package/dist/utils/withBlockPropsUtils.d.ts +6 -55
  115. package/package.json +13 -16
  116. package/dist/Grid-B0vqOT42.js +0 -184
  117. package/dist/MessageCard-CCngWCHS.js +0 -53
  118. package/dist/components/withBlockProps copy.d.ts +0 -61
  119. package/dist/index-CPJI9a7D.js +0 -13503
  120. package/dist/index-CmNhuPZp.js +0 -34
  121. package/dist/index-kVKDoWCh.js +0 -57
@@ -0,0 +1,15 @@
1
+ import { IBaseInputProps } from '../../../interfaces/form';
2
+ import * as React from "react";
3
+ export interface ITextareaProps extends IBaseInputProps {
4
+ label?: string;
5
+ isRequired?: boolean;
6
+ labelStyles?: string;
7
+ containerStyles?: string;
8
+ textAreaProps?: React.TextareaHTMLAttributes<HTMLTextAreaElement>;
9
+ textAreaStyles?: string;
10
+ onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
11
+ onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;
12
+ }
13
+ declare const FormTextarea: React.ForwardRefExoticComponent<ITextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
14
+ export { FormTextarea };
15
+ //# sourceMappingURL=FormTextarea.d.ts.map
@@ -1,2 +1,5 @@
1
+ export * from './base';
1
2
  export * from './Calendar';
3
+ export * from './form/FormInput';
4
+ export * from './form/FormTextarea';
2
5
  //# sourceMappingURL=index.d.ts.map
@@ -1,7 +1,6 @@
1
- import { ComponentType, ForwardRefExoticComponent, ReactElement, RefAttributes, ReactNode } from 'react';
1
+ import { ComponentType, ForwardRefExoticComponent, ReactElement, ReactNode, RefAttributes } from 'react';
2
2
  import { IFieldConfig, IStyles } from '../interfaces';
3
- type RenderFunction = (item: unknown, index: number) => ReactNode;
4
- type BlockChildren = ReactNode | RenderFunction;
3
+ type BlockChildren = ReactNode;
5
4
  /**
6
5
  * Base props interface for all studio elements
7
6
  *
@@ -15,11 +14,9 @@ export interface BaseElementProps {
15
14
  content?: any;
16
15
  generatedClassName?: string;
17
16
  }
18
- export interface WithBlockPropsComponent<P = {}> {
19
- (props: P & {
20
- children?: BlockChildren;
21
- }): ReactElement | null;
22
- }
17
+ export type WithBlockPropsComponent<P = {}> = (props: P & {
18
+ children?: BlockChildren;
19
+ }) => ReactElement | null;
23
20
  /**
24
21
  * withBlockProps - Higher-Order Component for Studio Elements
25
22
  *
@@ -32,17 +29,12 @@ export interface WithBlockPropsComponent<P = {}> {
32
29
  * 2. Generates CSS classes for element targeting and theme variants
33
30
  * 3. Handles nested data access via dot-notation element keys
34
31
  * 4. Provides consistent interface for all studio elements
35
- * 5. Added support for Framer Motion animations driven by studio config
32
+ * 5. Supports Framer Motion animations via whileInView for entry animations
36
33
  *
37
34
  * CSS Class Generation:
38
35
  * - Base class: `levo-{blockId}-{elementKey}` for unique element targeting
39
36
  * - Variant classes: `levo-variant-{groupId}-{variantId}` for theme variants
40
37
  *
41
- * The generated classes enable:
42
- * - Element-specific styling in CSS
43
- * - Theme variant styling via class selectors
44
- * - CSS cascade integration with theme system
45
- *
46
38
  * @example
47
39
  * // Element with theme variants selected
48
40
  * <Button elementKey="hero.button" />
@@ -0,0 +1,10 @@
1
+ import { AnimationProperties, TransitionConfig, ViewportConfig } from '../interfaces';
2
+ /** Default visible state - target for all animations */
3
+ export declare const DEFAULT_VISIBLE_STATE: AnimationProperties;
4
+ /** Default "from" state for entry/scroll animations */
5
+ export declare const DEFAULT_FROM_STATE: AnimationProperties;
6
+ /** Default transition config */
7
+ export declare const DEFAULT_TRANSITION: TransitionConfig;
8
+ /** Default viewport config for entry animations */
9
+ export declare const DEFAULT_VIEWPORT: ViewportConfig;
10
+ //# sourceMappingURL=animation.d.ts.map
@@ -1,13 +1,16 @@
1
1
  import { ILevoClient, IResponseMultiple } from '@levo-so/core';
2
2
  import { IBlockInstance, IPageExpanded, ISite, IStudioSource } from '../interfaces';
3
3
  import { IPageContext, IPageDataContext } from './types';
4
- export type ILevoPageData = Pick<IPageExpanded, "id" | "workspace_id" | "blocks" | "source" | "title" | "description" | "access" | "style_config" | "access">;
5
- export declare const resolveVariables: ({ skeleton, blockFetchedContent, blockSources, pageContext, currentPath, }: {
4
+ export type ILevoPageData = Pick<IPageExpanded, "id" | "workspace_id" | "blocks" | "source" | "title" | "description" | "access" | "style_config">;
5
+ export declare const resolveVariables: ({ skeleton, blockFetchedContent, blockSources, pageContext, siteData, currentPath, _resolvedKeys, _contextKeys, }: {
6
6
  skeleton: any;
7
7
  blockFetchedContent: Record<string, any>;
8
8
  blockSources: IStudioSource[];
9
9
  pageContext: Record<string, any>;
10
+ siteData?: Record<string, any>;
10
11
  currentPath?: string;
12
+ _resolvedKeys?: Record<string, any>;
13
+ _contextKeys?: Record<string, any>;
11
14
  }) => any;
12
15
  export declare const resolveStyles: ({ skeleton, blockFetchedContent, blockSources, currentPath, }: {
13
16
  skeleton: any;
@@ -25,11 +28,13 @@ export declare const getPageSource: ({ levoClient, pageData, slugs, cookies, dra
25
28
  pageContext: IPageContext;
26
29
  pageNotFound: boolean;
27
30
  }>;
28
- export declare const parseVariablesFromResolvedSource: ({ levoClient, block, resolvedSources, pageContext, cookies, draft, }: {
31
+ export declare const parseVariablesFromResolvedSource: ({ levoClient, block, resolvedSources, pageContext, siteData, cookies, draft, workspace_id, }: {
29
32
  levoClient: ILevoClient;
30
33
  block: IBlockInstance;
31
34
  resolvedSources: IBlockInstance["source"];
35
+ workspace_id: string;
32
36
  pageContext?: IPageContext;
37
+ siteData?: Record<string, any>;
33
38
  cookies?: string;
34
39
  draft?: boolean;
35
40
  }) => Promise<[IBlockInstance, Record<string, IResponseMultiple<Record<string, unknown>>>]>;
@@ -1,7 +1,7 @@
1
1
  export * from './content';
2
- export * from './sourceFetcher';
3
- export * from './useContentEngine';
4
- export * from './types';
5
2
  export * from './getPage';
3
+ export * from './sourceFetcher';
6
4
  export * from './themeUtils';
5
+ export * from './types';
6
+ export * from './useContentEngine';
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { ILemaCollection, ILevoClient, IResponseMultiple, IResponseSingle } from '@levo-so/core';
2
2
  import { SourceFetchOptions } from './types';
3
- export declare const fetchSource: ({ levoClient, source, slugs, params, cookies, draft, }: SourceFetchOptions) => Promise<IResponseMultiple | IResponseSingle | null>;
3
+ export declare const fetchSource: ({ levoClient, source, workspace_id, slugs, params, cookies, draft, }: SourceFetchOptions) => Promise<IResponseMultiple | IResponseSingle | null>;
4
4
  export declare const fetchCollectionSchema: ({ levoClient, source, cookies, draft, }: {
5
5
  levoClient: ILevoClient;
6
6
  source: {
@@ -30,6 +30,18 @@ export declare const processFonts: (theme: ITheme) => {
30
30
  fontUrl: string;
31
31
  fontTags: string;
32
32
  };
33
+ /**
34
+ * Normalizes a custom color name to a valid CSS variable suffix
35
+ * Replaces spaces with underscores, converts to lowercase
36
+ * Example: "Primary Accent" -> "primary_accent"
37
+ */
38
+ export declare const normalizeColorName: (name: string) => string;
39
+ /**
40
+ * Normalizes a custom font name to a valid CSS variable suffix
41
+ * Replaces spaces with underscores, converts to lowercase
42
+ * Example: "Code Font" -> "code_font"
43
+ */
44
+ export declare const normalizeFontName: (name: string) => string;
33
45
  /**
34
46
  * CSS Custom Properties Generation
35
47
  *
@@ -41,6 +53,7 @@ export declare const processFonts: (theme: ITheme) => {
41
53
  * - var(--color-brand) for theme colors
42
54
  * - var(--font-heading) for theme fonts
43
55
  * - var(--base-spacing) for theme sizes
56
+ * - var(--color-custom-{name}) for custom colors
44
57
  *
45
58
  * @param theme - Theme configuration object
46
59
  * @returns Object mapping CSS property names to values
@@ -8,6 +8,7 @@ export interface SourceURL {
8
8
  export interface SourceFetchOptions {
9
9
  levoClient: ILevoClient;
10
10
  source: IStudioSource;
11
+ workspace_id: string;
11
12
  slugs?: Record<string, string>;
12
13
  params?: Record<string, unknown>;
13
14
  cookies?: string;
@@ -0,0 +1,11 @@
1
+ export declare const useContextEngine: (field_key: string) => {
2
+ query: Record<string, any>;
3
+ setQuery: (newQuery: Record<string, any>) => void;
4
+ loading: boolean;
5
+ response: {
6
+ meta: import('@levo-so/core').IMeta;
7
+ data: Record<string, unknown>[];
8
+ } | undefined;
9
+ };
10
+ export default useContextEngine;
11
+ //# sourceMappingURL=useContextEngine.d.ts.map
@@ -0,0 +1,48 @@
1
+ import { IForum, IForumJoinRequest } from '@levo-so/core';
2
+ import { default as React } from 'react';
3
+ /**
4
+ * Forum context
5
+ */
6
+ interface IForumContext {
7
+ forum: IForum | null;
8
+ isMember: boolean;
9
+ isLoadingMembership: boolean;
10
+ isInviteOnly: boolean;
11
+ /** Whether user can interact with posts (upvote/downvote) */
12
+ canInteractWithPosts: boolean;
13
+ /** Whether user can interact with comments (reply/vote) */
14
+ canInteractWithComments: boolean;
15
+ /** Current user's pending join request, if any */
16
+ joinRequest: IForumJoinRequest | null;
17
+ /** Whether user has a pending join request */
18
+ isJoinRequestPending: boolean;
19
+ /** Whether the forum allows join requests */
20
+ allowJoinRequests: boolean;
21
+ /** Submit a join request for the current user */
22
+ submitJoinRequest: (message?: string) => Promise<boolean>;
23
+ /** Refresh membership status from the server */
24
+ refreshMembershipStatus: () => Promise<void>;
25
+ }
26
+ /**
27
+ * Forum provider
28
+ */
29
+ export declare const ForumProvider: React.FC<{
30
+ children: React.ReactNode;
31
+ forum: IForum | null;
32
+ isMember: boolean;
33
+ isLoadingMembership: boolean;
34
+ isInviteOnly: boolean;
35
+ canInteractWithPosts: boolean;
36
+ canInteractWithComments: boolean;
37
+ joinRequest?: IForumJoinRequest | null;
38
+ isJoinRequestPending?: boolean;
39
+ allowJoinRequests?: boolean;
40
+ submitJoinRequest?: (message?: string) => Promise<boolean>;
41
+ refreshMembershipStatus?: () => Promise<void>;
42
+ }>;
43
+ /**
44
+ * Hook to use forum context
45
+ */
46
+ export declare const useForumContext: () => IForumContext;
47
+ export {};
48
+ //# sourceMappingURL=ForumContext.d.ts.map
@@ -1,6 +1,6 @@
1
+ import { ILevoPageData } from '../../contentEngine';
1
2
  import { ISite } from '../../interfaces';
2
3
  import { IAuthOverride } from '../../providers/AuthProvider';
3
- import { ILevoPageData } from '../../contentEngine';
4
4
  declare const AccessManager: React.FC<{
5
5
  page: ILevoPageData;
6
6
  site: ISite;
@@ -1,15 +1,16 @@
1
1
  import { default as React } from 'react';
2
- import { IBlockInstance, ILevoBlockProps } from '../interfaces';
3
2
  import { IPageContext, IPageDataContext } from '../contentEngine';
3
+ import { IBlockInstance, ILevoBlockProps } from '../interfaces';
4
4
  interface LevoBlockProps {
5
5
  html_id?: string;
6
6
  isBuilder?: boolean;
7
7
  blocks: Record<string, React.FC<ILevoBlockProps>>;
8
8
  parsedBlockData: IBlockInstance;
9
+ workspace_id: string;
9
10
  blockData?: IBlockInstance;
10
11
  pageContext?: IPageContext;
11
12
  blockContext?: IPageDataContext["blocks"][number];
12
13
  }
13
- export declare const LevoBlock: React.MemoExoticComponent<({ html_id, isBuilder, blocks, parsedBlockData, blockData, pageContext, blockContext, }: LevoBlockProps) => import("react/jsx-runtime").JSX.Element>;
14
+ export declare const LevoBlock: React.MemoExoticComponent<({ html_id, isBuilder, blocks, parsedBlockData, blockData, pageContext, blockContext, workspace_id, }: LevoBlockProps) => import("react/jsx-runtime").JSX.Element>;
14
15
  export {};
15
16
  //# sourceMappingURL=LevoBlock.d.ts.map
@@ -1,7 +1,7 @@
1
- import { default as React } from 'react';
2
1
  import { IWorkspace } from '@levo-so/core';
3
- import { ISite, BlockComponent } from '../interfaces';
2
+ import { default as React } from 'react';
4
3
  import { ILevoPageData, IPageDataContext } from '../contentEngine';
4
+ import { BlockComponent, ISite } from '../interfaces';
5
5
  import { IAuthOverride } from '../providers';
6
6
  export interface ILevoPageProps {
7
7
  pageData: ILevoPageData;
@@ -1,4 +1,4 @@
1
+ export * from './BlockRegistry';
1
2
  export * from './LevoBlock';
2
3
  export * from './LevoPage';
3
- export * from './BlockRegistry';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,23 @@
1
+ import { default as React } from 'react';
2
+ /**
3
+ * Alert dialog props
4
+ */
5
+ interface IAlertDialogProps {
6
+ isOpen: boolean;
7
+ setIsOpen: (open: boolean) => void;
8
+ title: string;
9
+ description: string;
10
+ onCancel?: () => void;
11
+ onConfirm: () => void;
12
+ isLoading?: boolean;
13
+ cancelText?: string;
14
+ confirmText?: string;
15
+ confirmButtonClassName?: string;
16
+ }
17
+ /**
18
+ * Alert dialog component using Dialog component
19
+ */
20
+ declare const AlertDialog: React.FC<IAlertDialogProps>;
21
+ export { AlertDialog };
22
+ export type { IAlertDialogProps };
23
+ //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,5 @@
1
- import { default as React } from 'react';
2
1
  import { default as useEmblaCarousel, UseEmblaCarouselType } from 'embla-carousel-react';
2
+ import { default as React } from 'react';
3
3
  import { BaseElementProps } from '../components/withBlockProps';
4
4
  import { BaseButtonProps } from './Button';
5
5
  type CarouselApi = UseEmblaCarouselType[1];
@@ -10,10 +10,18 @@ interface CarouselProps extends BaseElementProps {
10
10
  orientation?: "horizontal" | "vertical";
11
11
  setApi?: (api: CarouselApi) => void;
12
12
  }
13
+ interface IUseDotButtonType {
14
+ selectedIndex: number;
15
+ scrollSnaps: number[];
16
+ onDotButtonClick: (index: number) => void;
17
+ }
18
+ export declare const useDotButton: (emblaApi: CarouselApi | undefined) => IUseDotButtonType;
13
19
  declare const CarouselContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
14
20
  declare const CarouselItem: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
15
21
  declare const CarouselPrevious: React.ForwardRefExoticComponent<BaseButtonProps & React.RefAttributes<HTMLButtonElement>>;
16
22
  declare const CarouselNext: React.ForwardRefExoticComponent<BaseButtonProps & React.RefAttributes<HTMLButtonElement>>;
23
+ declare const CarouselDotButton: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
24
+ declare const CarouselDots: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
17
25
  export declare const Carousel: import('../components/withBlockProps').WithBlockPropsComponent<React.HTMLAttributes<HTMLDivElement> & CarouselProps & React.RefAttributes<HTMLDivElement>>;
18
- export { type CarouselApi, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext, };
26
+ export { type CarouselApi, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext, CarouselDotButton, CarouselDots, };
19
27
  //# sourceMappingURL=Carousel.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { Tabs as TabsPrimitive } from 'radix-ui';
2
2
  import { BaseElementProps } from '../components/withBlockProps';
3
- import * as React from "react";
3
+ import type * as React from "react";
4
4
  declare const TabsRoot: React.ForwardRefExoticComponent<TabsPrimitive.TabsProps & React.RefAttributes<HTMLDivElement>>;
5
5
  type TypeTabsListComponentProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>;
6
6
  interface BaseTabsListProps extends BaseElementProps, Omit<TypeTabsListComponentProps, "content"> {
@@ -1,5 +1,5 @@
1
1
  import { BaseElementProps } from '../components/withBlockProps';
2
- import * as React from "react";
2
+ import type * as React from "react";
3
3
  export interface BaseUserMenuProps extends React.HTMLAttributes<HTMLDivElement>, Omit<BaseElementProps, "content"> {
4
4
  }
5
5
  export declare const BaseUserMenu: React.FC<BaseUserMenuProps>;
@@ -1,6 +1,6 @@
1
1
  import { Accordion as AccordionPrimitive } from 'radix-ui';
2
2
  import { BaseElementProps } from '../../components/withBlockProps';
3
- import * as React from "react";
3
+ import type * as React from "react";
4
4
  type TypeAccordionComponentProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Root>;
5
5
  interface BaseAccordionRootProps extends BaseElementProps, Omit<TypeAccordionComponentProps, "content"> {
6
6
  }
@@ -1,5 +1,5 @@
1
1
  import { Dialog as DialogPrimitive } from 'radix-ui';
2
- import * as React from "react";
2
+ import type * as React from "react";
3
3
  declare function Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
4
4
  declare function DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>): import("react/jsx-runtime").JSX.Element;
5
5
  declare function DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,18 @@
1
+ import { IForumPost } from '@levo-so/core';
2
+ import { default as React } from 'react';
3
+ import { IPostActionsLoadingState } from './utility';
4
+ declare const ForumPost: React.FC<{
5
+ post: IForumPost;
6
+ postDetailPageBaseURL?: string | null;
7
+ isRenderedSolo?: boolean;
8
+ actionsLoadingState?: IPostActionsLoadingState;
9
+ forumKey?: string;
10
+ wrapperStyles?: string;
11
+ }>;
12
+ export { ForumPost };
13
+ export declare const PostLinkWrapper: React.FC<{
14
+ post: IForumPost;
15
+ postDetailPageBaseURL?: string | null;
16
+ children: React.ReactNode;
17
+ }>;
18
+ //# sourceMappingURL=ForumPost.d.ts.map
@@ -0,0 +1,8 @@
1
+ import { IForumPost } from '@levo-so/core';
2
+ import { default as React } from 'react';
3
+ declare const ForumPostContentRenderer: React.FC<{
4
+ post: IForumPost;
5
+ isRenderedSolo?: boolean;
6
+ }>;
7
+ export { ForumPostContentRenderer };
8
+ //# sourceMappingURL=ForumPostContentRenderer.d.ts.map
@@ -0,0 +1,5 @@
1
+ import { default as React } from 'react';
2
+ import { IInputProps } from '../../components/ui/form/FormInput';
3
+ declare const SearchInput: React.FC<IInputProps>;
4
+ export { SearchInput };
5
+ //# sourceMappingURL=SearchInput.d.ts.map
@@ -0,0 +1,16 @@
1
+ export interface ICategoryFilterProps {
2
+ /** The forum key/slug to fetch categories for */
3
+ forumKey: string;
4
+ /** Currently selected category IDs */
5
+ selectedCategories: string[];
6
+ /** Callback when category selection changes */
7
+ onCategoryToggle: (categoryId: string) => void;
8
+ /** Optional className for the container */
9
+ className?: string;
10
+ }
11
+ /**
12
+ * CategoryFilter displays a list of selectable category pills for filtering forum posts.
13
+ * Fetches categories from the API and renders them as toggleable buttons.
14
+ */
15
+ export declare const CategoryFilter: React.FC<ICategoryFilterProps>;
16
+ //# sourceMappingURL=CategoryFilter.d.ts.map
@@ -0,0 +1,2 @@
1
+ export * from './CategoryFilter';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,14 @@
1
+ import { IComment, ICommentsUserEngagement, IForumPost } from '@levo-so/core';
2
+ import { default as React } from 'react';
3
+ declare const Comment: React.FC<{
4
+ post: IForumPost;
5
+ comment: IComment;
6
+ isRoot?: boolean;
7
+ index?: number;
8
+ forumKey: string;
9
+ onChildReplyAdded?: () => void;
10
+ userEngagementHashMap?: Record<string, ICommentsUserEngagement>;
11
+ setUserEngagementHashMap?: React.Dispatch<React.SetStateAction<Record<string, ICommentsUserEngagement>>>;
12
+ }>;
13
+ export default Comment;
14
+ //# sourceMappingURL=Comment.d.ts.map
@@ -0,0 +1,9 @@
1
+ import { IForumPost } from '@levo-so/core';
2
+ import { default as React } from 'react';
3
+ declare const Comments: React.FC<{
4
+ forumKey: string;
5
+ post: IForumPost;
6
+ onCommentCountChange?: (delta: number) => void;
7
+ }>;
8
+ export { Comments };
9
+ //# sourceMappingURL=Comments.d.ts.map
@@ -0,0 +1,11 @@
1
+ import { IComment, IForumPost } from '@levo-so/core';
2
+ import { default as React } from 'react';
3
+ declare const ReplyBox: React.FC<{
4
+ post: IForumPost;
5
+ parentCommentId?: string | null;
6
+ isParent?: boolean;
7
+ onCommentAdded?: (comment: IComment) => void;
8
+ forumKey: string;
9
+ }>;
10
+ export default ReplyBox;
11
+ //# sourceMappingURL=ReplyBox.d.ts.map
@@ -0,0 +1,25 @@
1
+ import { IComment, ICommentsUserEngagement, IForumPost } from '@levo-so/core';
2
+ import { default as React } from 'react';
3
+ export declare const CommentAvatar: React.FC<{
4
+ comment: IComment;
5
+ avatarStyles?: string;
6
+ }>;
7
+ export declare const CommentAuthorInfo: React.FC<{
8
+ comment: IComment;
9
+ }>;
10
+ declare const CommentHeader: React.FC<{
11
+ comment: IComment;
12
+ }>;
13
+ declare const CommentAction: React.FC<{
14
+ post: IForumPost;
15
+ comment: IComment;
16
+ replyCount?: number;
17
+ onReplyAdded?: (reply: IComment) => void;
18
+ onToggleReplies?: () => void;
19
+ forumKey: string;
20
+ showReplyBox?: boolean;
21
+ userEngagementHashMap?: Record<string, ICommentsUserEngagement>;
22
+ setUserEngagementHashMap?: React.Dispatch<React.SetStateAction<Record<string, ICommentsUserEngagement>>>;
23
+ }>;
24
+ export { CommentAction, CommentHeader };
25
+ //# sourceMappingURL=commentUtility.d.ts.map
@@ -0,0 +1,2 @@
1
+ export * from './Comments';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,9 @@
1
+ import { IForumPost } from '@levo-so/core';
2
+ import { default as React } from 'react';
3
+ interface ICreateForumPostProps {
4
+ forumKey: string;
5
+ onPostCreated?: (post: IForumPost) => void;
6
+ }
7
+ declare const CreateForumPost: React.FC<ICreateForumPostProps>;
8
+ export { CreateForumPost };
9
+ //# sourceMappingURL=CreateForumPost.d.ts.map
@@ -0,0 +1,87 @@
1
+ import { IForumPost } from '@levo-so/core';
2
+ import { default as React } from 'react';
3
+ declare const CreateForumPostModal: React.FC<{
4
+ children?: React.ReactNode;
5
+ triggerContainerStyles?: string;
6
+ useCustomOpenState?: boolean;
7
+ isOpen?: boolean;
8
+ handleCreateForumPostModalOpen?: (open: boolean) => void;
9
+ isCreateForumPostModalReady?: boolean;
10
+ forumKey: string;
11
+ onSuccess?: (post: IForumPost) => void;
12
+ onClose?: () => void;
13
+ mode?: "create" | "edit";
14
+ initialValues?: IForumPost;
15
+ }>;
16
+ export default CreateForumPostModal;
17
+ /**
18
+ * PostAsSelector - Commented out for future use
19
+ * This component was previously used to select whether to post as yourself or as the workspace.
20
+ *
21
+ * interface IPostAsSelectorProps {
22
+ * postAs: "myself" | "workspace";
23
+ * setPostAs: (value: "myself" | "workspace") => void;
24
+ * isPostAsOpen: boolean;
25
+ * setIsPostAsOpen: (open: boolean) => void;
26
+ * workspace?: { name?: string };
27
+ * }
28
+ *
29
+ * const PostAsSelector: React.FC<IPostAsSelectorProps> = ({
30
+ * postAs,
31
+ * setPostAs,
32
+ * isPostAsOpen,
33
+ * setIsPostAsOpen,
34
+ * workspace,
35
+ * }) => {
36
+ * const postAsOptions = [
37
+ * { label: "Myself", value: "myself" },
38
+ * { label: workspace?.name || "Workspace", value: "workspace" },
39
+ * ];
40
+ *
41
+ * return (
42
+ * <div className="flex items-center gap-2">
43
+ * <p className="text-text-1 text-sm font-medium">Post as</p>
44
+ * <PopoverRoot open={isPostAsOpen} onOpenChange={setIsPostAsOpen}>
45
+ * <PopoverTrigger elementKey="post-as-trigger" asChild>
46
+ * <button
47
+ * autoFocus={false}
48
+ * className="flex items-center gap-1.5 rounded-md border border-[#D1D6E1] bg-white px-3 py-1.5 text-sm font-medium transition-colors hover:bg-gray-50"
49
+ * >
50
+ * <span className="text-text-1">
51
+ * {postAsOptions.find((opt) => opt.value === postAs)?.label}
52
+ * </span>
53
+ * <ChevronDown className="text-text-2 size-4" />
54
+ * </button>
55
+ * </PopoverTrigger>
56
+ * <PopoverContent
57
+ * elementKey="post-as-content"
58
+ * align="start"
59
+ * className="!w-[unset] min-w-36 rounded-lg border border-gray-200 bg-white !p-1 shadow-lg"
60
+ * >
61
+ * {postAsOptions.map((option) => (
62
+ * <button
63
+ * key={option.value}
64
+ * onClick={() => {
65
+ * setPostAs(option.value as "myself" | "workspace");
66
+ * setIsPostAsOpen(false);
67
+ * }}
68
+ * className={cn(
69
+ * "flex w-full cursor-pointer items-center justify-between rounded-md px-3 py-2 text-left text-sm transition-colors hover:bg-gray-100",
70
+ * postAs === option.value
71
+ * ? "text-text-1 font-medium"
72
+ * : "text-text-2",
73
+ * )}
74
+ * >
75
+ * <span>{option.label}</span>
76
+ * {postAs === option.value && (
77
+ * <Check className="text-brand size-4" />
78
+ * )}
79
+ * </button>
80
+ * ))}
81
+ * </PopoverContent>
82
+ * </PopoverRoot>
83
+ * </div>
84
+ * );
85
+ * };
86
+ */
87
+ //# sourceMappingURL=CreateForumPostModal.d.ts.map
@@ -0,0 +1,2 @@
1
+ export * from './CreateForumPost';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,8 @@
1
+ export * from './categoryFilter';
2
+ export * from './comments';
3
+ export * from './createForumPost';
4
+ export * from './ForumPost';
5
+ export * from './restrictionOverlays';
6
+ export * from './SearchInput';
7
+ export * from './utility';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,16 @@
1
+ import { default as React } from 'react';
2
+ /** Sample comment skeleton for background display */
3
+ declare const SampleCommentSkeleton: React.FC<{
4
+ opacity?: number;
5
+ }>;
6
+ interface ICommentsRestrictionOverlayProps {
7
+ communityName?: string;
8
+ className?: string;
9
+ }
10
+ /**
11
+ * Absolutely positioned overlay shown over comments section
12
+ * when non-member cannot view comments in invite-only community
13
+ */
14
+ declare const CommentsRestrictionOverlay: React.FC<ICommentsRestrictionOverlayProps>;
15
+ export { CommentsRestrictionOverlay, SampleCommentSkeleton };
16
+ //# sourceMappingURL=CommentsRestrictionOverlay.d.ts.map
@@ -0,0 +1,14 @@
1
+ import { default as React } from 'react';
2
+ interface IJoinRequestFormProps {
3
+ onSubmit: (message?: string) => Promise<boolean>;
4
+ isSubmitting: boolean;
5
+ error: string | null;
6
+ communityName?: string;
7
+ className?: string;
8
+ }
9
+ /**
10
+ * Form for submitting a join request to an invite-only community
11
+ */
12
+ declare const JoinRequestForm: React.FC<IJoinRequestFormProps>;
13
+ export { JoinRequestForm };
14
+ //# sourceMappingURL=JoinRequestForm.d.ts.map