dune-react 0.0.21 → 0.0.22

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 (180) hide show
  1. package/dist/components/index.d.ts +1 -0
  2. package/dist/components/puck-base/button.d.ts +1 -1
  3. package/dist/components/puck-base/button.js +5 -6
  4. package/dist/components/puck-base/card.d.ts +1 -1
  5. package/dist/components/puck-base/container.js +1 -1
  6. package/dist/components/puck-base/content.d.ts +1 -1
  7. package/dist/components/puck-base/image.js +16 -16
  8. package/dist/components/puck-base/index.d.ts +1 -13
  9. package/dist/components/puck-block/banner-sections/dismissible-banner/index.d.ts +3 -25
  10. package/dist/components/puck-block/contact-sections/centered-form/index.d.ts +1 -1
  11. package/dist/components/puck-block/contact-sections/contact-modal/contact-modal.js +1 -1
  12. package/dist/components/puck-block/contact-sections/contact-modal/index.d.ts +1 -1
  13. package/dist/components/puck-block/contact-sections/form-with-media/index.d.ts +1 -1
  14. package/dist/components/puck-block/contact-sections/header-form-cards/index.d.ts +1 -1
  15. package/dist/components/puck-block/contact-sections/location-cards-grid/index.d.ts +1 -1
  16. package/dist/components/puck-block/contact-sections/split-info-form/index.d.ts +1 -1
  17. package/dist/components/puck-block/cta-sections/feature-card-cta/index.d.ts +1 -1
  18. package/dist/components/puck-block/cta-sections/index.d.ts +2 -0
  19. package/dist/components/puck-block/cta-sections/mouse-track-cta/index.d.ts +1 -1
  20. package/dist/components/puck-block/cta-sections/mouse-track-cta/mouse-track-cta.js +88 -59
  21. package/dist/components/puck-block/cta-sections/props.js +46 -0
  22. package/dist/components/puck-block/cta-sections/side-media-cta/index.d.ts +1 -73
  23. package/dist/components/puck-block/cta-sections/side-media-cta/index.js +35 -0
  24. package/dist/components/puck-block/cta-sections/side-media-cta/side-media-cta.js +84 -0
  25. package/dist/components/puck-block/cta-sections/text-block-cta/index.d.ts +2 -74
  26. package/dist/components/puck-block/cta-sections/text-block-cta/index.js +38 -0
  27. package/dist/components/puck-block/cta-sections/text-block-cta/text-block-cta.d.ts +1 -1
  28. package/dist/components/puck-block/cta-sections/text-block-cta/text-block-cta.js +165 -0
  29. package/dist/components/puck-block/faq-sections/dual-column-accordion-faq/index.d.ts +1 -1
  30. package/dist/components/puck-block/faq-sections/icon-card-faq/index.d.ts +1 -1
  31. package/dist/components/puck-block/faq-sections/stacked-accordion-faq/index.d.ts +1 -1
  32. package/dist/components/puck-block/faq-sections/stacked-static-faq/index.d.ts +1 -1
  33. package/dist/components/puck-block/faq-sections/two-column-accordion-faq/index.d.ts +1 -1
  34. package/dist/components/puck-block/faq-sections/two-column-static-faq/index.d.ts +1 -1
  35. package/dist/components/puck-block/feature-sections/feature-cards-grid/index.d.ts +2 -2
  36. package/dist/components/puck-block/feature-sections/feature-list-split/index.d.ts +2 -2
  37. package/dist/components/puck-block/feature-sections/tab-feature/component.js +77 -61
  38. package/dist/components/puck-block/feature-sections/text-media-split/index.d.ts +1 -1
  39. package/dist/components/puck-block/feature-sections/text-only-section/index.d.ts +1 -1
  40. package/dist/components/puck-block/footer-sections/compact-newsletter-footer/index.d.ts +1 -1
  41. package/dist/components/puck-block/footer-sections/cta-links-footer/index.d.ts +1 -1
  42. package/dist/components/puck-block/footer-sections/links-newsletter-footer/index.d.ts +1 -1
  43. package/dist/components/puck-block/footer-sections/newsletter-links-footer/index.d.ts +1 -1
  44. package/dist/components/puck-block/footer-sections/newsletter-top-links-footer/index.d.ts +1 -1
  45. package/dist/components/puck-block/gallery-sections/fullscreen-portfolio/index.d.ts +25 -28
  46. package/dist/components/puck-block/gallery-sections/fullscreen-portfolio/index.js +3 -2
  47. package/dist/components/puck-block/gallery-sections/portfolio-cards/index.d.ts +2 -2
  48. package/dist/components/puck-block/gallery-sections/portfolio-divider/index.d.ts +2 -2
  49. package/dist/components/puck-block/gallery-sections/portfolio-divider/portfolio-divider.js +67 -64
  50. package/dist/components/puck-block/gallery-sections/scroll-parallax-portfolio/index.d.ts +24 -27
  51. package/dist/components/puck-block/gallery-sections/scroll-parallax-portfolio/index.js +3 -2
  52. package/dist/components/puck-block/header-sections/centered-navbar/index.d.ts +1 -1
  53. package/dist/components/puck-block/header-sections/drawer-navbar/drawer-navbar.js +118 -17
  54. package/dist/components/puck-block/header-sections/drawer-navbar/index.d.ts +1 -1
  55. package/dist/components/puck-block/header-sections/floating-bordered-navbar/floating-bordered-navbar.js +161 -22
  56. package/dist/components/puck-block/header-sections/floating-bordered-navbar/index.d.ts +1 -1
  57. package/dist/components/puck-block/header-sections/fullscreen-overlay-navbar/fullscreen-overlay-navbar.js +142 -19
  58. package/dist/components/puck-block/header-sections/fullscreen-overlay-navbar/index.d.ts +1 -1
  59. package/dist/components/puck-block/header-sections/mega-menu-navbar/index.d.ts +1 -1
  60. package/dist/components/puck-block/header-sections/standard-navbar/index.d.ts +1 -1
  61. package/dist/components/puck-block/hero-sections/carousel-hero/component.js +50 -9
  62. package/dist/components/puck-block/hero-sections/carousel-hero/index.d.ts +1 -1
  63. package/dist/components/puck-block/hero-sections/centered-hero/index.d.ts +2 -2
  64. package/dist/components/puck-block/hero-sections/column-scroll-hero/index.d.ts +1 -1
  65. package/dist/components/puck-block/hero-sections/dual-marquee-hero/index.d.ts +1 -1
  66. package/dist/components/puck-block/hero-sections/fullscreen-hero/index.d.ts +2 -2
  67. package/dist/components/puck-block/hero-sections/fullscreen-video-hero/component.js +4 -2
  68. package/dist/components/puck-block/hero-sections/fullscreen-video-hero/index.d.ts +1 -1
  69. package/dist/components/puck-block/hero-sections/grid-expand-hero/index.d.ts +1 -1
  70. package/dist/components/puck-block/hero-sections/horizontal-marquee-hero/index.d.ts +1 -1
  71. package/dist/components/puck-block/hero-sections/inline-image-hero/index.d.ts +1 -1
  72. package/dist/components/puck-block/hero-sections/media-text-hero/index.d.ts +26 -29
  73. package/dist/components/puck-block/hero-sections/mouse-track-hero/index.d.ts +1 -1
  74. package/dist/components/puck-block/hero-sections/multi-image-grid-hero/index.d.ts +25 -28
  75. package/dist/components/puck-block/hero-sections/multi-image-grid-hero/index.js +3 -2
  76. package/dist/components/puck-block/hero-sections/overlapping-image-hero/index.d.ts +1 -1
  77. package/dist/components/puck-block/hero-sections/parallax-images-hero/index.d.ts +1 -1
  78. package/dist/components/puck-block/hero-sections/scatter-parallax-hero/index.d.ts +1 -1
  79. package/dist/components/puck-block/hero-sections/scroll-expand-video-hero/index.d.ts +1 -1
  80. package/dist/components/puck-block/hero-sections/scroll-zoom-hero/component.js +91 -44
  81. package/dist/components/puck-block/hero-sections/scroll-zoom-hero/index.d.ts +1 -1
  82. package/dist/components/puck-block/hero-sections/split-hero/index.d.ts +2 -2
  83. package/dist/components/puck-block/hero-sections/stacked-hero/index.d.ts +2 -2
  84. package/dist/components/puck-block/hero-sections/sticky-expand-hero/index.d.ts +1 -1
  85. package/dist/components/puck-block/hero-sections/sticky-video-hero/index.d.ts +1 -1
  86. package/dist/components/puck-block/hero-sections/tab-hero/index.d.ts +28 -44
  87. package/dist/components/puck-block/hero-sections/tab-hero/index.js +7 -2
  88. package/dist/components/puck-block/hero-sections/three-image-parallax-hero/component.js +93 -43
  89. package/dist/components/puck-block/hero-sections/three-image-parallax-hero/index.d.ts +1 -1
  90. package/dist/components/puck-block/hero-sections/vertical-gallery-hero/component.js +27 -4
  91. package/dist/components/puck-block/hero-sections/vertical-gallery-hero/index.d.ts +1 -1
  92. package/dist/components/puck-block/hero-sections/zoom-grid-hero/index.d.ts +1 -1
  93. package/dist/components/puck-block/index.d.ts +2 -0
  94. package/dist/components/puck-block/location-sections/location-1/location.d.ts +1 -1
  95. package/dist/components/puck-block/location-sections/location-2/location.d.ts +1 -1
  96. package/dist/components/puck-block/location-sections/location-3/location.d.ts +2 -2
  97. package/dist/components/puck-block/location-sections/props.d.ts +1 -1
  98. package/dist/components/puck-block/metrics-sections/header-stats-row/index.d.ts +1 -1
  99. package/dist/components/puck-block/metrics-sections/mixed-grid-stats/index.d.ts +1 -1
  100. package/dist/components/puck-block/metrics-sections/split-stats/index.d.ts +1 -1
  101. package/dist/components/puck-block/metrics-sections/tab-stats/index.d.ts +0 -22
  102. package/dist/components/puck-block/metrics-sections/tab-stats/index.js +1 -1
  103. package/dist/components/puck-block/metrics-sections/tab-stats/tab-stats.js +36 -23
  104. package/dist/components/puck-block/pricing-sections/single-pricing-card/index.d.ts +0 -22
  105. package/dist/components/puck-block/pricing-sections/single-pricing-card/index.js +1 -1
  106. package/dist/components/puck-block/pricing-sections/split-pricing/index.d.ts +28 -22
  107. package/dist/components/puck-block/pricing-sections/split-pricing/index.js +8 -1
  108. package/dist/components/puck-block/registry.generated.d.ts +13141 -0
  109. package/dist/components/puck-block/registry.generated.js +558 -0
  110. package/dist/components/puck-block/showcase-sections/compact-timeline/index.d.ts +1 -1
  111. package/dist/components/puck-block/showcase-sections/horizontal-timeline/index.d.ts +1 -1
  112. package/dist/components/puck-block/showcase-sections/single-column-timeline/index.d.ts +2 -2
  113. package/dist/components/puck-block/showcase-sections/sticky-scroll-timeline/index.d.ts +2 -2
  114. package/dist/components/puck-block/showcase-sections/tab-timeline/index.d.ts +1 -23
  115. package/dist/components/puck-block/showcase-sections/tab-timeline/index.js +1 -1
  116. package/dist/components/puck-block/showcase-sections/zigzag-timeline/index.d.ts +2 -2
  117. package/dist/components/puck-block/team-sections/team-carousel/index.d.ts +1 -23
  118. package/dist/components/puck-block/team-sections/team-carousel/index.js +1 -2
  119. package/dist/components/puck-block/team-sections/team-grid/index.d.ts +1 -23
  120. package/dist/components/puck-block/team-sections/team-grid/index.js +1 -2
  121. package/dist/components/puck-block/team-sections/team-inline-card/index.d.ts +1 -23
  122. package/dist/components/puck-block/team-sections/team-inline-card/index.js +1 -2
  123. package/dist/components/puck-block/team-sections/team-two-column/index.d.ts +1 -1
  124. package/dist/components/puck-block/testimonial-sections/sticky-testimonial/index.d.ts +1 -1
  125. package/dist/components/puck-block/text-sections/aside-nav-content/index.d.ts +0 -22
  126. package/dist/components/puck-block/text-sections/aside-nav-content/index.js +1 -1
  127. package/dist/components/puck-block/text-sections/blog-article/index.d.ts +0 -22
  128. package/dist/components/puck-block/text-sections/blog-article/index.js +1 -1
  129. package/dist/components/puck-block/text-sections/prose-sidebar/index.d.ts +1 -23
  130. package/dist/components/puck-block/text-sections/text-header/index.d.ts +2 -2
  131. package/dist/components/puck-core/core/props/content.js +41 -1
  132. package/dist/components/puck-core/core/props/form.js +76 -0
  133. package/dist/components/puck-core/core/props/index.js +34 -0
  134. package/dist/components/puck-core/core/props/interactive.js +17 -0
  135. package/dist/components/puck-core/core/props/media.js +8 -4
  136. package/dist/components/puck-core/core/styles.d.ts +1 -1
  137. package/dist/components/{puck-base → puck-core}/core/styles.js +3 -1
  138. package/dist/components/{puck-base → puck-core}/core/with-editable.js +1 -1
  139. package/dist/components/puck-core/fields/action-field.js +1 -1
  140. package/dist/components/{puck-base → puck-core/fields}/image-upload-field.js +4 -4
  141. package/dist/components/{puck-base → puck-core}/fields/location-field.js +1 -1
  142. package/dist/components/puck-core/index.d.ts +1 -0
  143. package/dist/components/{puck-base → puck-core}/inline-editable.js +1 -1
  144. package/dist/index.js +121 -104
  145. package/package.json +1 -1
  146. package/dist/components/puck-base/core/fields.d.ts +0 -827
  147. package/dist/components/puck-base/core/fields.js +0 -267
  148. package/dist/components/puck-base/core/hooks.d.ts +0 -19
  149. package/dist/components/puck-base/core/icon-catalog.d.ts +0 -14
  150. package/dist/components/puck-base/core/icon-catalog.js +0 -193
  151. package/dist/components/puck-base/core/styles.d.ts +0 -1942
  152. package/dist/components/puck-base/core/types.d.ts +0 -20
  153. package/dist/components/puck-base/core/types.js +0 -26
  154. package/dist/components/puck-base/core/utils.d.ts +0 -5
  155. package/dist/components/puck-base/core/with-editable.d.ts +0 -16
  156. package/dist/components/puck-base/error-boundary.d.ts +0 -4
  157. package/dist/components/puck-base/fields/action-field.d.ts +0 -30
  158. package/dist/components/puck-base/fields/action-field.js +0 -265
  159. package/dist/components/puck-base/fields/auto-field.d.ts +0 -2
  160. package/dist/components/puck-base/fields/color-field.d.ts +0 -6
  161. package/dist/components/puck-base/fields/index.d.ts +0 -8
  162. package/dist/components/puck-base/fields/location-field.d.ts +0 -44
  163. package/dist/components/puck-base/fields/object-field.d.ts +0 -8
  164. package/dist/components/puck-base/fields/radio-toggle-field.d.ts +0 -10
  165. package/dist/components/puck-base/fields/types.d.ts +0 -29
  166. package/dist/components/puck-base/fields/virtualized-select-field.d.ts +0 -13
  167. package/dist/components/puck-base/icon-picker-field.d.ts +0 -8
  168. package/dist/components/puck-base/icon-picker-field.js +0 -153
  169. package/dist/components/puck-base/image-upload-field.d.ts +0 -7
  170. package/dist/components/puck-base/inline-editable.d.ts +0 -14
  171. package/dist/components/puck-base/use-upload.d.ts +0 -42
  172. /package/dist/components/{puck-base → puck-core}/core/hooks.js +0 -0
  173. /package/dist/components/{puck-base → puck-core}/core/utils.js +0 -0
  174. /package/dist/components/{puck-base → puck-core}/error-boundary.js +0 -0
  175. /package/dist/components/{puck-base → puck-core}/fields/auto-field.js +0 -0
  176. /package/dist/components/{puck-base → puck-core}/fields/color-field.js +0 -0
  177. /package/dist/components/{puck-base → puck-core}/fields/object-field.js +0 -0
  178. /package/dist/components/{puck-base → puck-core}/fields/radio-toggle-field.js +0 -0
  179. /package/dist/components/{puck-base → puck-core}/fields/virtualized-select-field.js +0 -0
  180. /package/dist/components/{puck-base → puck-core}/use-upload.js +0 -0
@@ -1,20 +0,0 @@
1
- import { iconNames } from "lucide-react/dynamic";
2
- export type IconName = "none" | (typeof iconNames)[number];
3
- export type Feature = {
4
- icon?: IconName;
5
- name: string;
6
- description?: string;
7
- };
8
- export type ActionType = "page" | "external" | "scroll" | "email" | "phone" | "section" | "download" | "none";
9
- export type Action = {
10
- type: ActionType;
11
- pageUrl?: string;
12
- externalUrl?: string;
13
- openInNewTab?: string;
14
- email?: string;
15
- subject?: string;
16
- phone?: string;
17
- sectionId?: string;
18
- downloadUrl?: string;
19
- };
20
- export declare function resolveActionUrl(action: Action): string | undefined;
@@ -1,26 +0,0 @@
1
- function resolveActionUrl(action) {
2
- switch (action.type) {
3
- case "page":
4
- return action.pageUrl || void 0;
5
- case "external":
6
- return action.externalUrl || void 0;
7
- case "email": {
8
- if (!action.email) return void 0;
9
- const subject = action.subject ? `?subject=${encodeURIComponent(action.subject)}` : "";
10
- return `mailto:${action.email}${subject}`;
11
- }
12
- case "phone":
13
- return action.phone ? `tel:${action.phone}` : void 0;
14
- case "section":
15
- return action.sectionId || void 0;
16
- case "download":
17
- return action.downloadUrl || void 0;
18
- case "none":
19
- return void 0;
20
- default:
21
- return void 0;
22
- }
23
- }
24
- export {
25
- resolveActionUrl
26
- };
@@ -1,5 +0,0 @@
1
- export declare function getRandomAdjective(arr?: string[]): string;
2
- /**
3
- * 在 Puck 数据树中(content + zones)查找指定 ID 的组件。
4
- */
5
- export declare function findComponentById(data: any, componentId: string): any | null;
@@ -1,16 +0,0 @@
1
- import { type ComponentType } from "react";
2
- interface EditableConfig {
3
- type: string;
4
- fields: Record<string, any>;
5
- }
6
- /**
7
- * HOC: wraps any component to be inline-editable in Puck editor mode.
8
- *
9
- * Location strategy:
10
- * 1. componentId — read from the nearest `[data-puck-component]` ancestor in the DOM.
11
- * 2. propPath — search only within that single component's props (narrow scope).
12
- */
13
- export declare function withEditable<P extends Record<string, any>>(Component: ComponentType<P>, config: EditableConfig): (props: P & {
14
- onEdit?: (props: P, onSave: (updated: Partial<P>) => void) => void;
15
- }) => import("react/jsx-runtime").JSX.Element;
16
- export {};
@@ -1,4 +0,0 @@
1
- import { ReactNode } from "react";
2
- export declare function ErrorBoundary({ children }: {
3
- children: ReactNode;
4
- }): import("react/jsx-runtime").JSX.Element;
@@ -1,30 +0,0 @@
1
- import { Action, ActionType } from "../core/types";
2
- export interface ActionTypeFieldProps {
3
- /** 表单字段名前缀,会拼到各子 input 的 name 上 */
4
- name: string;
5
- /** 当前完整的 Action 对象(子组件只读写与自己 type 相关的字段) */
6
- value: Action;
7
- /** 合并局部 patch 到 Action,由父组件负责与完整 state 合并 */
8
- onChange: (patch: Partial<Action>) => void;
9
- }
10
- /** 完整 Action 编辑器(含类型切换 + 子字段) */
11
- interface ActionFieldProps {
12
- name: string;
13
- value: Action | undefined;
14
- /** 传出合并后的完整 Action */
15
- onChange: (value: Action) => void;
16
- }
17
- /** 类型 Tab 的展示文案与值(可在外部自定义 UI 时复用) */
18
- export declare const ACTION_TYPE_OPTIONS: {
19
- label: string;
20
- value: ActionType;
21
- }[];
22
- export declare const PageActionFields: import("react").NamedExoticComponent<ActionTypeFieldProps>;
23
- export declare const ExternalActionFields: import("react").NamedExoticComponent<ActionTypeFieldProps>;
24
- export declare const EmailActionFields: import("react").NamedExoticComponent<ActionTypeFieldProps>;
25
- export declare const PhoneActionFields: import("react").NamedExoticComponent<ActionTypeFieldProps>;
26
- export declare const SectionActionFields: import("react").NamedExoticComponent<ActionTypeFieldProps>;
27
- export declare const DownloadActionFields: import("react").NamedExoticComponent<ActionTypeFieldProps>;
28
- export declare const ACTION_TYPE_FIELD_MAP: Partial<Record<ActionType, React.ComponentType<ActionTypeFieldProps>>>;
29
- export declare function ActionField({ name, value, onChange }: ActionFieldProps): import("react/jsx-runtime").JSX.Element;
30
- export {};
@@ -1,265 +0,0 @@
1
- "use client";
2
- import { jsxs, jsx, Fragment } from "react/jsx-runtime";
3
- import { memo, useCallback } from "react";
4
- import { Input } from "../../shadcn/input.js";
5
- import { Label } from "../../shadcn/label.js";
6
- import { Tabs, TabsList, TabsTrigger } from "../../shadcn/tabs.js";
7
- import { LinkIcon, XIcon, GlobeIcon } from "lucide-react";
8
- import { useEditorContext } from "../../puck-core/core/context/editor-context.js";
9
- const ACTION_TYPE_OPTIONS = [
10
- { label: "Page Link", value: "page" },
11
- { label: "External Link", value: "external" },
12
- { label: "Email", value: "email" },
13
- { label: "Phone", value: "phone" },
14
- { label: "Page Section", value: "section" },
15
- { label: "Download", value: "download" },
16
- { label: "None", value: "none" }
17
- ];
18
- const PageActionFields = memo(function PageActionFields2({
19
- name,
20
- value,
21
- onChange
22
- }) {
23
- const { sitePages } = useEditorContext();
24
- const pages = sitePages ?? [];
25
- const pageUrl = value.pageUrl ?? "";
26
- const selectedSlug = pageUrl.startsWith("/") ? pageUrl.slice(1) : null;
27
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
28
- /* @__PURE__ */ jsx(Label, { children: "Page URL" }),
29
- /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-1 items-center gap-2 rounded-lg border px-3 py-2", children: [
30
- /* @__PURE__ */ jsx(LinkIcon, { className: "text-muted-foreground size-4 shrink-0" }),
31
- /* @__PURE__ */ jsx(
32
- "input",
33
- {
34
- name: `${name}.pageUrl`,
35
- className: "w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground",
36
- placeholder: "/about",
37
- value: pageUrl,
38
- onChange: (e) => onChange({ pageUrl: e.target.value })
39
- }
40
- ),
41
- pageUrl && /* @__PURE__ */ jsx(
42
- "button",
43
- {
44
- type: "button",
45
- className: "text-muted-foreground hover:text-foreground shrink-0",
46
- onClick: () => onChange({ pageUrl: "" }),
47
- children: /* @__PURE__ */ jsx(XIcon, { className: "size-3.5" })
48
- }
49
- )
50
- ] }) }),
51
- pages.length > 0 && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
52
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Site pages" }),
53
- /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: pages.map((page) => {
54
- const isSelected = selectedSlug === page.slug;
55
- return /* @__PURE__ */ jsxs(
56
- "button",
57
- {
58
- type: "button",
59
- className: `inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-medium transition-colors ${isSelected ? "border-primary bg-primary text-primary-foreground" : "border-border bg-background text-foreground hover:bg-accent"}`,
60
- onClick: () => onChange({ pageUrl: isSelected ? "" : `${page.slug}` }),
61
- children: [
62
- /* @__PURE__ */ jsx(GlobeIcon, { className: "size-3" }),
63
- page.label
64
- ]
65
- },
66
- page.slug
67
- );
68
- }) })
69
- ] })
70
- ] });
71
- });
72
- const ExternalActionFields = memo(function ExternalActionFields2({
73
- name,
74
- value,
75
- onChange
76
- }) {
77
- return /* @__PURE__ */ jsxs(Fragment, { children: [
78
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
79
- /* @__PURE__ */ jsx(Label, { children: "External URL" }),
80
- /* @__PURE__ */ jsx(
81
- Input,
82
- {
83
- name: `${name}.externalUrl`,
84
- className: "h-8 text-sm",
85
- value: value.externalUrl ?? "",
86
- onChange: (e) => onChange({ externalUrl: e.target.value }),
87
- placeholder: "https://example.com"
88
- }
89
- )
90
- ] }),
91
- /* @__PURE__ */ jsxs("fieldset", { className: "flex flex-col gap-1.5", children: [
92
- /* @__PURE__ */ jsx(Label, { children: "Open in new tab" }),
93
- /* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [
94
- /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-1.5 text-sm", children: [
95
- /* @__PURE__ */ jsx(
96
- "input",
97
- {
98
- type: "radio",
99
- name: `${name}.openInNewTab`,
100
- value: "true",
101
- checked: value.openInNewTab === "true",
102
- onChange: () => onChange({ openInNewTab: "true" })
103
- }
104
- ),
105
- "Yes"
106
- ] }),
107
- /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-1.5 text-sm", children: [
108
- /* @__PURE__ */ jsx(
109
- "input",
110
- {
111
- type: "radio",
112
- name: `${name}.openInNewTab`,
113
- value: "false",
114
- checked: value.openInNewTab !== "true",
115
- onChange: () => onChange({ openInNewTab: "false" })
116
- }
117
- ),
118
- "No"
119
- ] })
120
- ] })
121
- ] })
122
- ] });
123
- });
124
- const EmailActionFields = memo(function EmailActionFields2({
125
- name,
126
- value,
127
- onChange
128
- }) {
129
- return /* @__PURE__ */ jsxs(Fragment, { children: [
130
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
131
- /* @__PURE__ */ jsx(Label, { children: "Email" }),
132
- /* @__PURE__ */ jsx(
133
- Input,
134
- {
135
- name: `${name}.email`,
136
- className: "h-8 text-sm",
137
- value: value.email ?? "",
138
- onChange: (e) => onChange({ email: e.target.value }),
139
- placeholder: "hello@example.com"
140
- }
141
- )
142
- ] }),
143
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
144
- /* @__PURE__ */ jsx(Label, { children: "Subject" }),
145
- /* @__PURE__ */ jsx(
146
- Input,
147
- {
148
- name: `${name}.subject`,
149
- className: "h-8 text-sm",
150
- value: value.subject ?? "",
151
- onChange: (e) => onChange({ subject: e.target.value }),
152
- placeholder: "Optional email subject"
153
- }
154
- )
155
- ] })
156
- ] });
157
- });
158
- const PhoneActionFields = memo(function PhoneActionFields2({
159
- name,
160
- value,
161
- onChange
162
- }) {
163
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
164
- /* @__PURE__ */ jsx(Label, { children: "Phone" }),
165
- /* @__PURE__ */ jsx(
166
- Input,
167
- {
168
- name: `${name}.phone`,
169
- className: "h-8 text-sm",
170
- value: value.phone ?? "",
171
- onChange: (e) => onChange({ phone: e.target.value }),
172
- placeholder: "+1 234 567 890"
173
- }
174
- )
175
- ] });
176
- });
177
- const SectionActionFields = memo(function SectionActionFields2({
178
- name,
179
- value,
180
- onChange
181
- }) {
182
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
183
- /* @__PURE__ */ jsx(Label, { children: "Section ID" }),
184
- /* @__PURE__ */ jsx(
185
- Input,
186
- {
187
- name: `${name}.sectionId`,
188
- className: "h-8 text-sm",
189
- value: value.sectionId ?? "",
190
- onChange: (e) => onChange({ sectionId: e.target.value }),
191
- placeholder: "#section-id"
192
- }
193
- )
194
- ] });
195
- });
196
- const DownloadActionFields = memo(function DownloadActionFields2({
197
- name,
198
- value,
199
- onChange
200
- }) {
201
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
202
- /* @__PURE__ */ jsx(Label, { children: "Download URL" }),
203
- /* @__PURE__ */ jsx(
204
- Input,
205
- {
206
- name: `${name}.downloadUrl`,
207
- className: "h-8 text-sm",
208
- value: value.downloadUrl ?? "",
209
- onChange: (e) => onChange({ downloadUrl: e.target.value }),
210
- placeholder: "https://example.com/file.pdf"
211
- }
212
- )
213
- ] });
214
- });
215
- const ACTION_TYPE_FIELD_MAP = {
216
- page: PageActionFields,
217
- external: ExternalActionFields,
218
- email: EmailActionFields,
219
- phone: PhoneActionFields,
220
- section: SectionActionFields,
221
- download: DownloadActionFields
222
- };
223
- function ActionField({ name, value, onChange }) {
224
- const current = value ?? { type: "none" };
225
- const update = useCallback(
226
- (patch) => {
227
- onChange({ ...current, ...patch });
228
- },
229
- [current, onChange]
230
- );
231
- const TypeFields = ACTION_TYPE_FIELD_MAP[current.type];
232
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
233
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
234
- /* @__PURE__ */ jsx(Label, { children: "Action Type" }),
235
- /* @__PURE__ */ jsx(
236
- Tabs,
237
- {
238
- value: current.type,
239
- onValueChange: (val) => update({ type: val }),
240
- children: /* @__PURE__ */ jsx(TabsList, { className: "h-auto w-full flex-wrap justify-start gap-1 p-1 group-data-[orientation=horizontal]/tabs:h-auto", children: ACTION_TYPE_OPTIONS.map((opt) => /* @__PURE__ */ jsx(
241
- TabsTrigger,
242
- {
243
- value: opt.value,
244
- className: "h-7 flex-none text-xs",
245
- children: opt.label
246
- },
247
- opt.value
248
- )) })
249
- }
250
- )
251
- ] }),
252
- TypeFields && /* @__PURE__ */ jsx(TypeFields, { name, value: current, onChange: update })
253
- ] });
254
- }
255
- export {
256
- ACTION_TYPE_FIELD_MAP,
257
- ACTION_TYPE_OPTIONS,
258
- ActionField,
259
- DownloadActionFields,
260
- EmailActionFields,
261
- ExternalActionFields,
262
- PageActionFields,
263
- PhoneActionFields,
264
- SectionActionFields
265
- };
@@ -1,2 +0,0 @@
1
- import type { AutoFieldProps } from "./types";
2
- export declare const AutoField: import("react").NamedExoticComponent<AutoFieldProps>;
@@ -1,6 +0,0 @@
1
- /** 颜色选择器:color swatch + 文本输入 */
2
- export declare const ColorField: import("react").NamedExoticComponent<{
3
- label: string;
4
- value: any;
5
- onChange: (value: any) => void;
6
- }>;
@@ -1,8 +0,0 @@
1
- export type { FieldDef, AutoFieldProps, FieldsPanelProps } from "./types";
2
- export { AutoField } from "./auto-field";
3
- export { ColorField } from "./color-field";
4
- export { RadioToggleField } from "./radio-toggle-field";
5
- export { ObjectField } from "./object-field";
6
- export { VirtualizedSelectField, LARGE_SELECT_THRESHOLD, } from "./virtualized-select-field";
7
- export { LocationField } from "./location-field";
8
- export { ActionField, ACTION_TYPE_FIELD_MAP, ACTION_TYPE_OPTIONS, PageActionFields, ExternalActionFields, EmailActionFields, PhoneActionFields, SectionActionFields, DownloadActionFields, type ActionTypeFieldProps, } from "./action-field";
@@ -1,44 +0,0 @@
1
- import type { MapLocation } from "../core/fields";
2
- interface GLatLng {
3
- lat(): number;
4
- lng(): number;
5
- }
6
- interface GGeometry {
7
- location?: GLatLng;
8
- }
9
- interface GPlaceResult {
10
- formatted_address?: string;
11
- geometry?: GGeometry;
12
- place_id?: string;
13
- address_components?: unknown[];
14
- }
15
- interface GAutocomplete {
16
- getPlace(): GPlaceResult;
17
- addListener(event: string, handler: () => void): void;
18
- }
19
- interface GAutocompleteConstructor {
20
- new (input: HTMLInputElement, opts?: Record<string, unknown>): GAutocomplete;
21
- }
22
- interface GGoogleMaps {
23
- places: {
24
- Autocomplete: GAutocompleteConstructor;
25
- };
26
- event: {
27
- clearInstanceListeners(instance: unknown): void;
28
- };
29
- }
30
- interface GGoogle {
31
- maps: GGoogleMaps;
32
- }
33
- declare global {
34
- interface Window {
35
- google?: GGoogle;
36
- }
37
- }
38
- export interface LocationFieldProps {
39
- name: string;
40
- value: MapLocation | undefined;
41
- onChange: (value: MapLocation) => void;
42
- }
43
- export declare const LocationField: import("react").NamedExoticComponent<LocationFieldProps>;
44
- export {};
@@ -1,8 +0,0 @@
1
- import type { FieldDef } from "./types";
2
- /** 嵌套对象字段:按 objectFields 递归渲染子 AutoField,onChange 合并回对象 */
3
- export declare const ObjectField: import("react").NamedExoticComponent<{
4
- field: FieldDef;
5
- name: string;
6
- value: any;
7
- onChange: (value: any) => void;
8
- }>;
@@ -1,10 +0,0 @@
1
- /** 单选/切换:若选项恰好为 true/false 两个值则渲染开关,否则为 ToggleGroup */
2
- export declare const RadioToggleField: import("react").NamedExoticComponent<{
3
- label: string;
4
- options: {
5
- label: string;
6
- value: any;
7
- }[];
8
- value: any;
9
- onChange: (value: any) => void;
10
- }>;
@@ -1,29 +0,0 @@
1
- import type React from "react";
2
- export type FieldDef = {
3
- type: string;
4
- label?: string;
5
- options?: {
6
- label: string;
7
- value: any;
8
- }[];
9
- arrayFields?: Record<string, FieldDef>;
10
- objectFields?: Record<string, FieldDef>;
11
- getItemSummary?: (item: any, index: number) => string;
12
- defaultItemProps?: Record<string, any>;
13
- min?: number;
14
- max?: number;
15
- render?: React.FC<any>;
16
- };
17
- export type AutoFieldProps = {
18
- field: FieldDef;
19
- name: string;
20
- value: any;
21
- onChange: (value: any) => void;
22
- };
23
- export interface FieldsPanelProps {
24
- open: boolean;
25
- componentType: string | null;
26
- componentData: Record<string, any> | null;
27
- onSave: (updatedProps: Record<string, any>) => void;
28
- onClose: () => void;
29
- }
@@ -1,13 +0,0 @@
1
- export declare const LARGE_SELECT_THRESHOLD = 200;
2
- type SelectOption = {
3
- label: string;
4
- value: any;
5
- };
6
- /** 超大下拉:选项超过阈值时使用虚拟列表 + 搜索,减轻 DOM 压力 */
7
- export declare const VirtualizedSelectField: import("react").NamedExoticComponent<{
8
- label: string;
9
- options: SelectOption[];
10
- value: any;
11
- onChange: (value: any) => void;
12
- }>;
13
- export {};
@@ -1,8 +0,0 @@
1
- export declare function IconPickerField({ value, onChange, }: {
2
- field: any;
3
- name: string;
4
- id: string;
5
- value: any;
6
- onChange: (value: any) => void;
7
- readOnly?: boolean;
8
- }): import("react/jsx-runtime").JSX.Element;
@@ -1,153 +0,0 @@
1
- "use client";
2
- import { jsxs, jsx } from "react/jsx-runtime";
3
- import { useState, useMemo } from "react";
4
- import { cn } from "../../utils/css-utils.js";
5
- import { Popover, PopoverTrigger, PopoverContent } from "../shadcn/popover.js";
6
- import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from "../shadcn/command.js";
7
- import { ScrollArea } from "../shadcn/scroll-area.js";
8
- import { Input } from "../shadcn/input.js";
9
- import { Label } from "../shadcn/label.js";
10
- import { ICON_MAP, ICON_CATALOG } from "./core/icon-catalog.js";
11
- import { ChevronDown } from "lucide-react";
12
- function IconPickerField({
13
- value,
14
- onChange
15
- }) {
16
- const [open, setOpen] = useState(false);
17
- const current = value ?? "none";
18
- const [search, setSearch] = useState("");
19
- const [manualInput, setManualInput] = useState("");
20
- const CurrentIcon = ICON_MAP.get(current);
21
- const filteredCatalog = useMemo(() => {
22
- const q = search.trim().toLowerCase();
23
- if (!q) return ICON_CATALOG;
24
- return ICON_CATALOG.map((cat) => ({
25
- ...cat,
26
- icons: cat.icons.filter((e) => e.name.toLowerCase().includes(q))
27
- })).filter((cat) => cat.icons.length > 0);
28
- }, [search]);
29
- const handleSelect = (name) => {
30
- onChange(name);
31
- setSearch("");
32
- setOpen(false);
33
- };
34
- const handleManualSubmit = () => {
35
- const v = manualInput.trim();
36
- if (v) {
37
- onChange(v);
38
- setManualInput("");
39
- setOpen(false);
40
- }
41
- };
42
- return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
43
- /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
44
- "button",
45
- {
46
- type: "button",
47
- className: cn(
48
- "inline-flex h-8 w-full items-center gap-2 rounded-md border bg-background px-2.5 text-sm",
49
- "text-foreground transition-colors hover:bg-accent/50",
50
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50"
51
- ),
52
- children: [
53
- CurrentIcon ? /* @__PURE__ */ jsx(CurrentIcon, { className: "size-4 shrink-0 text-muted-foreground" }) : /* @__PURE__ */ jsx("span", { className: "size-4 shrink-0 rounded-sm border border-dashed" }),
54
- /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-left", children: current === "none" ? /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "None" }) : current }),
55
- /* @__PURE__ */ jsx(ChevronDown, { className: "size-3.5 shrink-0 text-muted-foreground" })
56
- ]
57
- }
58
- ) }),
59
- /* @__PURE__ */ jsx(
60
- PopoverContent,
61
- {
62
- className: "w-72 p-0",
63
- align: "start",
64
- side: "bottom",
65
- sideOffset: 4,
66
- children: /* @__PURE__ */ jsxs(Command, { shouldFilter: false, children: [
67
- /* @__PURE__ */ jsx(
68
- CommandInput,
69
- {
70
- placeholder: "Search icons...",
71
- value: search,
72
- onValueChange: setSearch
73
- }
74
- ),
75
- /* @__PURE__ */ jsxs(CommandList, { className: "max-h-none overflow-visible", children: [
76
- /* @__PURE__ */ jsx(CommandEmpty, { children: "No icons found." }),
77
- /* @__PURE__ */ jsxs(ScrollArea, { className: "h-72", children: [
78
- /* @__PURE__ */ jsx(CommandGroup, { children: /* @__PURE__ */ jsxs(
79
- CommandItem,
80
- {
81
- value: "none",
82
- onSelect: () => handleSelect("none"),
83
- "data-checked": current === "none" ? "true" : void 0,
84
- className: "gap-2",
85
- children: [
86
- /* @__PURE__ */ jsx("span", { className: "size-4 shrink-0 rounded-sm border border-dashed" }),
87
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "None" })
88
- ]
89
- }
90
- ) }),
91
- filteredCatalog.map((cat) => /* @__PURE__ */ jsx(CommandGroup, { heading: cat.label, children: /* @__PURE__ */ jsx("div", { className: "grid grid-cols-6 gap-0.5 px-1 py-0.5", children: cat.icons.map((entry) => {
92
- const IconComp = entry.component;
93
- const isSelected = current === entry.name;
94
- return /* @__PURE__ */ jsx(
95
- "button",
96
- {
97
- type: "button",
98
- title: entry.name,
99
- onClick: () => handleSelect(entry.name),
100
- className: cn(
101
- "flex size-8 items-center justify-center rounded-md transition-colors",
102
- "hover:bg-accent hover:text-accent-foreground",
103
- isSelected && "bg-primary text-primary-foreground hover:bg-primary/90"
104
- ),
105
- "aria-label": entry.name,
106
- "aria-pressed": isSelected,
107
- children: /* @__PURE__ */ jsx(IconComp, { className: "size-4" })
108
- },
109
- entry.name
110
- );
111
- }) }) }, cat.label))
112
- ] }),
113
- /* @__PURE__ */ jsxs("div", { className: "border-t p-2", children: [
114
- /* @__PURE__ */ jsx(Label, { className: "mb-1 block text-xs text-muted-foreground", children: "Or type any Lucide icon name" }),
115
- /* @__PURE__ */ jsxs("div", { className: "flex gap-1.5", children: [
116
- /* @__PURE__ */ jsx(
117
- Input,
118
- {
119
- className: "h-7 flex-1 text-xs",
120
- placeholder: "e.g. arrow-right",
121
- value: manualInput,
122
- onChange: (e) => setManualInput(e.target.value),
123
- onKeyDown: (e) => {
124
- if (e.key === "Enter") {
125
- e.preventDefault();
126
- handleManualSubmit();
127
- }
128
- }
129
- }
130
- ),
131
- /* @__PURE__ */ jsx(
132
- "button",
133
- {
134
- type: "button",
135
- onClick: handleManualSubmit,
136
- className: cn(
137
- "inline-flex h-7 items-center rounded-md border bg-secondary px-2.5 text-xs font-medium",
138
- "text-secondary-foreground transition-colors hover:bg-secondary/80"
139
- ),
140
- children: "Set"
141
- }
142
- )
143
- ] })
144
- ] })
145
- ] })
146
- ] })
147
- }
148
- )
149
- ] });
150
- }
151
- export {
152
- IconPickerField
153
- };