@delmaredigital/payload-puck 0.1.2 → 0.2.0

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/LICENSE CHANGED
@@ -1,73 +1,21 @@
1
- # PolyForm Noncommercial License 1.0.0
2
-
3
- <https://polyformproject.org/licenses/noncommercial/1.0.0>
4
-
5
- ## Acceptance
6
-
7
- In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses.
8
-
9
- ## Copyright License
10
-
11
- The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose. However, you may only distribute the software according to [Distribution License](#distribution-license) and make changes or new works based on the software according to [Changes and New Works License](#changes-and-new-works-license).
12
-
13
- ## Distribution License
14
-
15
- The licensor grants you an additional copyright license to distribute copies of the software. Your license to distribute covers distributing the software with changes and new works permitted by [Changes and New Works License](#changes-and-new-works-license).
16
-
17
- ## Notices
18
-
19
- You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms or the URL for them above, as well as copies of any plain-text lines beginning with `Required Notice:` that the licensor provided with the software. For example:
20
-
21
- > Required Notice: Copyright Delmare Digital LLC (https://delmaredigital.com)
22
-
23
- ## Changes and New Works License
24
-
25
- The licensor grants you an additional copyright license to make changes and new works based on the software for any permitted purpose.
26
-
27
- ## Patent License
28
-
29
- The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software.
30
-
31
- ## Noncommercial Purposes
32
-
33
- Any noncommercial purpose is a permitted purpose.
34
-
35
- ## Personal Uses
36
-
37
- Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, is use for a permitted purpose.
38
-
39
- ## Noncommercial Organizations
40
-
41
- Use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization, or government institution is use for a permitted purpose regardless of the source of funding or obligations resulting from the funding.
42
-
43
- ## Fair Use
44
-
45
- You may have "fair use" rights for the software under the law. These terms do not limit them.
46
-
47
- ## No Other Rights
48
-
49
- These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses.
50
-
51
- ## Patent Defense
52
-
53
- If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
54
-
55
- ## Violations
56
-
57
- The first time you are notified in writing that you have violated any of these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately.
58
-
59
- ## No Liability
60
-
61
- ***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.***
62
-
63
- ## Definitions
64
-
65
- The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms.
66
-
67
- **You** refers to the individual or entity agreeing to these terms.
68
-
69
- **Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
70
-
71
- **Your licenses** are all the licenses granted to you for the software under these terms.
72
-
73
- **Use** means anything you do with the software requiring one of your licenses.
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Delmare Digital
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -17,6 +17,7 @@ A PayloadCMS plugin for integrating [Puck](https://puckeditor.com) visual page b
17
17
  - [Theming](#theming)
18
18
  - [Layouts](#layouts)
19
19
  - [API Routes](#api-routes)
20
+ - [SEO Fields](#seo-fields)
20
21
  - [Plugin Options](#plugin-options)
21
22
  - [Hybrid Integration](#hybrid-integration)
22
23
  - [License](#license)
@@ -1363,6 +1364,82 @@ createPuckApiRoutesWithId({
1363
1364
 
1364
1365
  ---
1365
1366
 
1367
+ <details>
1368
+ <summary><strong>SEO Fields</strong> — Robots meta, sitemap integration</summary>
1369
+
1370
+ The plugin adds SEO-related fields to each page in the `meta` group:
1371
+
1372
+ | Field | Type | Description |
1373
+ |-------|------|-------------|
1374
+ | `meta.title` | text | Page title for search engines |
1375
+ | `meta.description` | textarea | Meta description |
1376
+ | `meta.image` | upload | Social sharing image |
1377
+ | `meta.noindex` | checkbox | Prevent search engine indexing |
1378
+ | `meta.nofollow` | checkbox | Prevent search engines from following links |
1379
+ | `meta.excludeFromSitemap` | checkbox | Exclude page from XML sitemap |
1380
+
1381
+ **These fields are not automatically wired to your frontend.** You need to implement them based on your setup.
1382
+
1383
+ ### Robots Meta (Next.js App Router)
1384
+
1385
+ In your page's `generateMetadata` function:
1386
+
1387
+ ```typescript
1388
+ // app/(frontend)/[...slug]/page.tsx
1389
+ export async function generateMetadata({ params }): Promise<Metadata> {
1390
+ const page = await getPage(params.slug)
1391
+
1392
+ return {
1393
+ title: page.meta?.title || page.title,
1394
+ description: page.meta?.description,
1395
+ robots: {
1396
+ index: !page.meta?.noindex,
1397
+ follow: !page.meta?.nofollow,
1398
+ },
1399
+ }
1400
+ }
1401
+ ```
1402
+
1403
+ ### Dynamic Sitemap
1404
+
1405
+ Filter out pages marked as excluded in your `sitemap.ts`:
1406
+
1407
+ ```typescript
1408
+ // app/sitemap.ts
1409
+ import type { MetadataRoute } from 'next'
1410
+ import { getPayload } from 'payload'
1411
+ import config from '@payload-config'
1412
+
1413
+ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
1414
+ const baseUrl = 'https://yoursite.com'
1415
+ const payload = await getPayload({ config })
1416
+
1417
+ const { docs: pages } = await payload.find({
1418
+ collection: 'pages',
1419
+ limit: 1000,
1420
+ where: {
1421
+ or: [
1422
+ { 'meta.excludeFromSitemap': { equals: false } },
1423
+ { 'meta.excludeFromSitemap': { exists: false } },
1424
+ ],
1425
+ },
1426
+ select: {
1427
+ slug: true,
1428
+ updatedAt: true,
1429
+ },
1430
+ })
1431
+
1432
+ return pages.map((page) => ({
1433
+ url: `${baseUrl}/${page.slug}`,
1434
+ lastModified: new Date(page.updatedAt),
1435
+ }))
1436
+ }
1437
+ ```
1438
+
1439
+ </details>
1440
+
1441
+ ---
1442
+
1366
1443
  <details>
1367
1444
  <summary><strong>Plugin Options</strong> — Collection config, access control</summary>
1368
1445
 
@@ -1584,25 +1661,4 @@ export default async function Page({ params }) {
1584
1661
 
1585
1662
  ## License
1586
1663
 
1587
- This project is licensed under the [PolyForm Noncommercial License 1.0.0](https://polyformproject.org/licenses/noncommercial/1.0.0/).
1588
-
1589
- ### What This Means
1590
-
1591
- **✅ Free for:**
1592
- - Personal projects and hobby use
1593
- - Open source projects
1594
- - Educational and research purposes
1595
- - Evaluation and testing
1596
- - Nonprofit organizations
1597
- - Government institutions
1598
-
1599
- **💼 Commercial use:**
1600
- Requires a separate commercial license. If you're using this in a commercial product or service, please contact us for licensing options.
1601
-
1602
- **📧 Commercial Licensing:** [hello@delmaredigital.com](mailto:hello@delmaredigital.com)
1603
-
1604
- ---
1605
-
1606
- ## About
1607
-
1608
- Built by [Delmare Digital](https://delmaredigital.com) — custom software solutions for growing businesses.
1664
+ MIT
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { C as ColorValue, P as PaddingValue, B as BackgroundValue, D as DimensionsValue, T as TransformValue, A as AnimationValue } from './shared-DeNKN95N.mjs';
2
+ import { C as ColorValue, P as PaddingValue, B as BackgroundValue, D as DimensionsValue, T as TransformValue, A as AnimationValue } from './shared-X9UpCJKW.mjs';
3
3
  import 'react';
4
4
  import '@measured/puck';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { C as ColorValue, P as PaddingValue, B as BackgroundValue, D as DimensionsValue, T as TransformValue, A as AnimationValue } from './shared-DeNKN95N.js';
2
+ import { C as ColorValue, P as PaddingValue, B as BackgroundValue, D as DimensionsValue, T as TransformValue, A as AnimationValue } from './shared-X9UpCJKW.js';
3
3
  import 'react';
4
4
  import '@measured/puck';
5
5
 
@@ -767,9 +767,9 @@ function AccordionClient({
767
767
  Object.assign(style, transformStyles);
768
768
  }
769
769
  if (!items || items.length === 0) {
770
- return /* @__PURE__ */ jsxRuntime.jsx(AnimatedWrapper, { animation, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4", style: Object.keys(style).length > 0 ? style : void 0, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: accordionClasses, style: accordionStyle, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4 text-center text-muted-foreground", children: "No accordion items. Add items in the editor." }) }) }) });
770
+ return /* @__PURE__ */ jsxRuntime.jsx(AnimatedWrapper, { animation, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: Object.keys(style).length > 0 ? style : void 0, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: accordionClasses, style: accordionStyle, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4 text-center text-muted-foreground", children: "No accordion items. Add items in the editor." }) }) }) });
771
771
  }
772
- return /* @__PURE__ */ jsxRuntime.jsx(AnimatedWrapper, { animation, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4", style: Object.keys(style).length > 0 ? style : void 0, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: accordionClasses, style: accordionStyle, children: items.map((item, index) => /* @__PURE__ */ jsxRuntime.jsx(
772
+ return /* @__PURE__ */ jsxRuntime.jsx(AnimatedWrapper, { animation, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: Object.keys(style).length > 0 ? style : void 0, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: accordionClasses, style: accordionStyle, children: items.map((item, index) => /* @__PURE__ */ jsxRuntime.jsx(
773
773
  AccordionItem,
774
774
  {
775
775
  item,
@@ -765,9 +765,9 @@ function AccordionClient({
765
765
  Object.assign(style, transformStyles);
766
766
  }
767
767
  if (!items || items.length === 0) {
768
- return /* @__PURE__ */ jsx(AnimatedWrapper, { animation, children: /* @__PURE__ */ jsx("div", { className: "px-4", style: Object.keys(style).length > 0 ? style : void 0, children: /* @__PURE__ */ jsx("div", { className: accordionClasses, style: accordionStyle, children: /* @__PURE__ */ jsx("div", { className: "p-4 text-center text-muted-foreground", children: "No accordion items. Add items in the editor." }) }) }) });
768
+ return /* @__PURE__ */ jsx(AnimatedWrapper, { animation, children: /* @__PURE__ */ jsx("div", { style: Object.keys(style).length > 0 ? style : void 0, children: /* @__PURE__ */ jsx("div", { className: accordionClasses, style: accordionStyle, children: /* @__PURE__ */ jsx("div", { className: "p-4 text-center text-muted-foreground", children: "No accordion items. Add items in the editor." }) }) }) });
769
769
  }
770
- return /* @__PURE__ */ jsx(AnimatedWrapper, { animation, children: /* @__PURE__ */ jsx("div", { className: "px-4", style: Object.keys(style).length > 0 ? style : void 0, children: /* @__PURE__ */ jsx("div", { className: accordionClasses, style: accordionStyle, children: items.map((item, index) => /* @__PURE__ */ jsx(
770
+ return /* @__PURE__ */ jsx(AnimatedWrapper, { animation, children: /* @__PURE__ */ jsx("div", { style: Object.keys(style).length > 0 ? style : void 0, children: /* @__PURE__ */ jsx("div", { className: accordionClasses, style: accordionStyle, children: items.map((item, index) => /* @__PURE__ */ jsx(
771
771
  AccordionItem,
772
772
  {
773
773
  item,
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ReactNode, CSSProperties, ElementType } from 'react';
3
- import { A as AnimationValue } from './shared-DeNKN95N.mjs';
3
+ import { A as AnimationValue } from './shared-X9UpCJKW.mjs';
4
4
  import '@measured/puck';
5
5
 
6
6
  interface AnimatedWrapperProps {
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ReactNode, CSSProperties, ElementType } from 'react';
3
- import { A as AnimationValue } from './shared-DeNKN95N.js';
3
+ import { A as AnimationValue } from './shared-X9UpCJKW.js';
4
4
  import '@measured/puck';
5
5
 
6
6
  interface AnimatedWrapperProps {
@@ -1,5 +1,5 @@
1
1
  import { ComponentConfig } from '@measured/puck';
2
- import { R as ResponsiveValue, D as DimensionsValue, P as PaddingValue, V as VisibilityValue } from '../shared-DeNKN95N.mjs';
2
+ import { R as ResponsiveValue, D as DimensionsValue, P as PaddingValue, V as VisibilityValue } from '../shared-X9UpCJKW.mjs';
3
3
  export { AnimatedWrapper, AnimatedWrapperProps } from '../AnimatedWrapper.mjs';
4
4
  import 'react/jsx-runtime';
5
5
  import 'react';
@@ -7,18 +7,15 @@ import 'react';
7
7
  /**
8
8
  * Container Component - Puck Configuration
9
9
  *
10
- * Content wrapper with max-width and background options.
10
+ * Simple organizational wrapper for grouping content.
11
11
  * Uses Puck's slot system for nesting other components.
12
- * Uses Tailwind classes for layout, inline styles for dynamic user values.
13
12
  *
14
- * Supports both preset options and advanced custom styling:
15
- * - Outer (Section): background, customPadding, border (applies to full-width wrapper)
16
- * - Inner (Content): innerBackground, innerPadding, innerBorder (applies to max-width container)
13
+ * For two-layer layouts (full-bleed background with constrained content),
14
+ * use the Section component instead.
17
15
  *
18
16
  * Responsive Controls:
19
- * - dimensions: Different max-width at different breakpoints
20
- * - customPadding: Different outer padding at different breakpoints
21
- * - innerPadding: Different inner padding at different breakpoints
17
+ * - dimensions: Different max-width/min-height at different breakpoints
18
+ * - padding: Different padding at different breakpoints
22
19
  * - margin: Different margins at different breakpoints
23
20
  * - visibility: Show/hide at different breakpoints
24
21
  */
@@ -65,18 +62,18 @@ declare const GridConfig: ComponentConfig;
65
62
  /**
66
63
  * Section Component - Puck Configuration
67
64
  *
68
- * Full-width section with background options and content slot.
69
- * Used as a top-level page section wrapper.
70
- * Uses Tailwind classes for layout, inline styles for dynamic user values.
65
+ * Full-width section with two-layer architecture:
66
+ * - Section layer (outer): Full-bleed background, border, padding, margin
67
+ * - Content layer (inner): Constrained content area with max-width, background, border, padding
71
68
  *
72
- * Supports both preset options and advanced custom styling:
73
- * - Background: unified BackgroundField (solid, gradient, or image)
74
- * - Advanced: customPadding, customWidth, border
69
+ * This design enables common patterns like hero sections with full-bleed backgrounds
70
+ * but centered content.
75
71
  *
76
72
  * Responsive Controls:
77
- * - dimensions: Different dimensions at different breakpoints
78
- * - customPadding: Different padding at different breakpoints
79
- * - margin: Different margins at different breakpoints
73
+ * - contentDimensions: Different max-width/min-height at different breakpoints
74
+ * - sectionPadding: Different section padding at different breakpoints
75
+ * - contentPadding: Different content padding at different breakpoints
76
+ * - sectionMargin: Different margins at different breakpoints
80
77
  * - visibility: Show/hide at different breakpoints
81
78
  */
82
79
 
@@ -1,5 +1,5 @@
1
1
  import { ComponentConfig } from '@measured/puck';
2
- import { R as ResponsiveValue, D as DimensionsValue, P as PaddingValue, V as VisibilityValue } from '../shared-DeNKN95N.js';
2
+ import { R as ResponsiveValue, D as DimensionsValue, P as PaddingValue, V as VisibilityValue } from '../shared-X9UpCJKW.js';
3
3
  export { AnimatedWrapper, AnimatedWrapperProps } from '../AnimatedWrapper.js';
4
4
  import 'react/jsx-runtime';
5
5
  import 'react';
@@ -7,18 +7,15 @@ import 'react';
7
7
  /**
8
8
  * Container Component - Puck Configuration
9
9
  *
10
- * Content wrapper with max-width and background options.
10
+ * Simple organizational wrapper for grouping content.
11
11
  * Uses Puck's slot system for nesting other components.
12
- * Uses Tailwind classes for layout, inline styles for dynamic user values.
13
12
  *
14
- * Supports both preset options and advanced custom styling:
15
- * - Outer (Section): background, customPadding, border (applies to full-width wrapper)
16
- * - Inner (Content): innerBackground, innerPadding, innerBorder (applies to max-width container)
13
+ * For two-layer layouts (full-bleed background with constrained content),
14
+ * use the Section component instead.
17
15
  *
18
16
  * Responsive Controls:
19
- * - dimensions: Different max-width at different breakpoints
20
- * - customPadding: Different outer padding at different breakpoints
21
- * - innerPadding: Different inner padding at different breakpoints
17
+ * - dimensions: Different max-width/min-height at different breakpoints
18
+ * - padding: Different padding at different breakpoints
22
19
  * - margin: Different margins at different breakpoints
23
20
  * - visibility: Show/hide at different breakpoints
24
21
  */
@@ -65,18 +62,18 @@ declare const GridConfig: ComponentConfig;
65
62
  /**
66
63
  * Section Component - Puck Configuration
67
64
  *
68
- * Full-width section with background options and content slot.
69
- * Used as a top-level page section wrapper.
70
- * Uses Tailwind classes for layout, inline styles for dynamic user values.
65
+ * Full-width section with two-layer architecture:
66
+ * - Section layer (outer): Full-bleed background, border, padding, margin
67
+ * - Content layer (inner): Constrained content area with max-width, background, border, padding
71
68
  *
72
- * Supports both preset options and advanced custom styling:
73
- * - Background: unified BackgroundField (solid, gradient, or image)
74
- * - Advanced: customPadding, customWidth, border
69
+ * This design enables common patterns like hero sections with full-bleed backgrounds
70
+ * but centered content.
75
71
  *
76
72
  * Responsive Controls:
77
- * - dimensions: Different dimensions at different breakpoints
78
- * - customPadding: Different padding at different breakpoints
79
- * - margin: Different margins at different breakpoints
73
+ * - contentDimensions: Different max-width/min-height at different breakpoints
74
+ * - sectionPadding: Different section padding at different breakpoints
75
+ * - contentPadding: Different content padding at different breakpoints
76
+ * - sectionMargin: Different margins at different breakpoints
80
77
  * - visibility: Show/hide at different breakpoints
81
78
  */
82
79