@payload-onpage/plugin 0.0.0-stage → 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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -2
  3. package/dist/access.d.ts +20 -0
  4. package/dist/access.d.ts.map +1 -0
  5. package/dist/access.js +51 -0
  6. package/dist/access.js.map +1 -0
  7. package/dist/admin/OnPageAdminControls.d.ts +9 -0
  8. package/dist/admin/OnPageAdminControls.d.ts.map +1 -0
  9. package/dist/admin/OnPageAdminControls.js +59 -0
  10. package/dist/admin/OnPageAdminControls.js.map +1 -0
  11. package/dist/admin/index.d.ts +3 -0
  12. package/dist/admin/index.d.ts.map +1 -0
  13. package/dist/admin/index.js +2 -0
  14. package/dist/admin/index.js.map +1 -0
  15. package/dist/endpoints.d.ts +11 -0
  16. package/dist/endpoints.d.ts.map +1 -0
  17. package/dist/endpoints.js +223 -0
  18. package/dist/endpoints.js.map +1 -0
  19. package/dist/hooks.d.ts +38 -0
  20. package/dist/hooks.d.ts.map +1 -0
  21. package/dist/hooks.js +42 -0
  22. package/dist/hooks.js.map +1 -0
  23. package/dist/http.d.ts +23 -0
  24. package/dist/http.d.ts.map +1 -0
  25. package/dist/http.js +53 -0
  26. package/dist/http.js.map +1 -0
  27. package/dist/index.d.ts +10 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +148 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/options.d.ts +59 -0
  32. package/dist/options.d.ts.map +1 -0
  33. package/dist/options.js +4 -0
  34. package/dist/options.js.map +1 -0
  35. package/dist/paths.d.ts +11 -0
  36. package/dist/paths.d.ts.map +1 -0
  37. package/dist/paths.js +58 -0
  38. package/dist/paths.js.map +1 -0
  39. package/dist/schema.d.ts +34 -0
  40. package/dist/schema.d.ts.map +1 -0
  41. package/dist/schema.js +209 -0
  42. package/dist/schema.js.map +1 -0
  43. package/dist/tokens.d.ts +18 -0
  44. package/dist/tokens.d.ts.map +1 -0
  45. package/dist/tokens.js +24 -0
  46. package/dist/tokens.js.map +1 -0
  47. package/dist/translations.d.ts +45 -0
  48. package/dist/translations.d.ts.map +1 -0
  49. package/dist/translations.js +44 -0
  50. package/dist/translations.js.map +1 -0
  51. package/package.json +65 -4
  52. package/src/access.ts +65 -0
  53. package/src/admin/OnPageAdminControls.tsx +99 -0
  54. package/src/admin/index.ts +2 -0
  55. package/src/endpoints.ts +269 -0
  56. package/src/hooks.ts +79 -0
  57. package/src/http.ts +57 -0
  58. package/src/index.ts +167 -0
  59. package/src/options.ts +65 -0
  60. package/src/paths.ts +59 -0
  61. package/src/schema.ts +251 -0
  62. package/src/tokens.ts +46 -0
  63. package/src/translations.ts +45 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface PreviewTokenPayload {
2
+ /** refKey of the shared document */
3
+ ref: string;
4
+ /** Site path the link opens. */
5
+ path: string;
6
+ locale?: string;
7
+ /** Issued at / expires at, seconds since epoch. */
8
+ iat: number;
9
+ exp: number;
10
+ /** Unique id, for audit logs and revocation lists. */
11
+ jti: string;
12
+ }
13
+ export declare function createPreviewToken(payload: Pick<PreviewTokenPayload, 'ref' | 'path' | 'locale'>, secret: string, ttlSeconds: number, now?: number): Promise<{
14
+ token: string;
15
+ payload: PreviewTokenPayload;
16
+ }>;
17
+ export declare function verifyPreviewToken(token: string, secret: string, now?: number): Promise<PreviewTokenPayload | null>;
18
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAA;IACX,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC,EAC7D,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,GAAG,SAAa,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAS1D;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,GAAG,SAAa,GACf,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAMrC"}
package/dist/tokens.js ADDED
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Preview-link tokens: sealed (AES-GCM) and expiring, bound to one document
3
+ * and path. Opaque to the holder, so the link reveals nothing about the draft.
4
+ */
5
+ import { SEAL_PURPOSE, seal, unseal } from '@payload-onpage/core';
6
+ export async function createPreviewToken(payload, secret, ttlSeconds, now = Date.now()) {
7
+ const iat = Math.floor(now / 1000);
8
+ const full = {
9
+ ...payload,
10
+ iat,
11
+ exp: iat + ttlSeconds,
12
+ jti: crypto.randomUUID(),
13
+ };
14
+ return { token: await seal(full, secret, SEAL_PURPOSE.previewLink), payload: full };
15
+ }
16
+ export async function verifyPreviewToken(token, secret, now = Date.now()) {
17
+ const p = await unseal(token, secret, SEAL_PURPOSE.previewLink);
18
+ if (!p || typeof p.exp !== 'number' || p.exp * 1000 <= now)
19
+ return null;
20
+ if (typeof p.path !== 'string' || typeof p.ref !== 'string' || typeof p.jti !== 'string')
21
+ return null;
22
+ return p;
23
+ }
24
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAejE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA6D,EAC7D,MAAc,EACd,UAAkB,EAClB,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;IAClC,MAAM,IAAI,GAAwB;QAChC,GAAG,OAAO;QACV,GAAG;QACH,GAAG,EAAE,GAAG,GAAG,UAAU;QACrB,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE;KACzB,CAAA;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AACrF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAa,EACb,MAAc,EACd,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,CAAC,GAAG,MAAM,MAAM,CAAsB,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC,CAAA;IACpF,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG;QAAE,OAAO,IAAI,CAAA;IACvE,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;QACtF,OAAO,IAAI,CAAA;IACb,OAAO,CAAC,CAAA;AACV,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Admin UI strings, registered with Payload's i18n under the `onpage` namespace
3
+ * (so the admin language applies). Add or override languages with
4
+ * `i18n.translations` in your Payload config.
5
+ */
6
+ export declare const translations: {
7
+ en: {
8
+ onpage: {
9
+ editOnPage: string;
10
+ copyPreviewLink: string;
11
+ copyPreviewLinkHint: string;
12
+ linkCopied: string;
13
+ linkFailed: string;
14
+ };
15
+ };
16
+ es: {
17
+ onpage: {
18
+ editOnPage: string;
19
+ copyPreviewLink: string;
20
+ copyPreviewLinkHint: string;
21
+ linkCopied: string;
22
+ linkFailed: string;
23
+ };
24
+ };
25
+ fr: {
26
+ onpage: {
27
+ editOnPage: string;
28
+ copyPreviewLink: string;
29
+ copyPreviewLinkHint: string;
30
+ linkCopied: string;
31
+ linkFailed: string;
32
+ };
33
+ };
34
+ de: {
35
+ onpage: {
36
+ editOnPage: string;
37
+ copyPreviewLink: string;
38
+ copyPreviewLinkHint: string;
39
+ linkCopied: string;
40
+ linkFailed: string;
41
+ };
42
+ };
43
+ };
44
+ export type OnPageTranslationKey = `onpage:${keyof (typeof translations)['en']['onpage']}`;
45
+ //# sourceMappingURL=translations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../src/translations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCxB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG,UAAU,MAAM,CAAC,OAAO,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAA"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Admin UI strings, registered with Payload's i18n under the `onpage` namespace
3
+ * (so the admin language applies). Add or override languages with
4
+ * `i18n.translations` in your Payload config.
5
+ */
6
+ export const translations = {
7
+ en: {
8
+ onpage: {
9
+ editOnPage: 'Edit on page',
10
+ copyPreviewLink: 'Copy preview link',
11
+ copyPreviewLinkHint: 'Copy a read-only link to this draft',
12
+ linkCopied: 'Preview link copied — valid until {{date}}',
13
+ linkFailed: "Couldn't create a preview link: {{message}}",
14
+ },
15
+ },
16
+ es: {
17
+ onpage: {
18
+ editOnPage: 'Editar en la página',
19
+ copyPreviewLink: 'Copiar enlace de vista previa',
20
+ copyPreviewLinkHint: 'Copiar un enlace de solo lectura a este borrador',
21
+ linkCopied: 'Enlace copiado: válido hasta {{date}}',
22
+ linkFailed: 'No se pudo crear el enlace: {{message}}',
23
+ },
24
+ },
25
+ fr: {
26
+ onpage: {
27
+ editOnPage: 'Modifier sur la page',
28
+ copyPreviewLink: 'Copier le lien d’aperçu',
29
+ copyPreviewLinkHint: 'Copier un lien en lecture seule vers ce brouillon',
30
+ linkCopied: 'Lien copié — valide jusqu’au {{date}}',
31
+ linkFailed: 'Impossible de créer le lien : {{message}}',
32
+ },
33
+ },
34
+ de: {
35
+ onpage: {
36
+ editOnPage: 'Auf der Seite bearbeiten',
37
+ copyPreviewLink: 'Vorschaulink kopieren',
38
+ copyPreviewLinkHint: 'Einen schreibgeschützten Link zu diesem Entwurf kopieren',
39
+ linkCopied: 'Vorschaulink kopiert – gültig bis {{date}}',
40
+ linkFailed: 'Vorschaulink konnte nicht erstellt werden: {{message}}',
41
+ },
42
+ },
43
+ };
44
+ //# sourceMappingURL=translations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translations.js","sourceRoot":"","sources":["../src/translations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,EAAE,EAAE;QACF,MAAM,EAAE;YACN,UAAU,EAAE,cAAc;YAC1B,eAAe,EAAE,mBAAmB;YACpC,mBAAmB,EAAE,qCAAqC;YAC1D,UAAU,EAAE,4CAA4C;YACxD,UAAU,EAAE,6CAA6C;SAC1D;KACF;IACD,EAAE,EAAE;QACF,MAAM,EAAE;YACN,UAAU,EAAE,qBAAqB;YACjC,eAAe,EAAE,+BAA+B;YAChD,mBAAmB,EAAE,kDAAkD;YACvE,UAAU,EAAE,uCAAuC;YACnD,UAAU,EAAE,yCAAyC;SACtD;KACF;IACD,EAAE,EAAE;QACF,MAAM,EAAE;YACN,UAAU,EAAE,sBAAsB;YAClC,eAAe,EAAE,yBAAyB;YAC1C,mBAAmB,EAAE,mDAAmD;YACxE,UAAU,EAAE,uCAAuC;YACnD,UAAU,EAAE,2CAA2C;SACxD;KACF;IACD,EAAE,EAAE;QACF,MAAM,EAAE;YACN,UAAU,EAAE,0BAA0B;YACtC,eAAe,EAAE,uBAAuB;YACxC,mBAAmB,EAAE,0DAA0D;YAC/E,UAAU,EAAE,4CAA4C;YACxD,UAAU,EAAE,wDAAwD;SACrE;KACF;CACF,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,67 @@
1
1
  {
2
2
  "name": "@payload-onpage/plugin",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.0",
4
+ "description": "payload-onpage for Payload CMS: on-page editing endpoints, auto-mapping, preview links and admin controls.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/jellologic/payload-onpage.git",
11
+ "directory": "packages/plugin"
12
+ },
13
+ "homepage": "https://github.com/jellologic/payload-onpage#readme",
14
+ "bugs": "https://github.com/jellologic/payload-onpage/issues",
15
+ "keywords": [
16
+ "payload",
17
+ "payloadcms",
18
+ "payload-plugin",
19
+ "nextjs",
20
+ "visual-editing",
21
+ "live-preview",
22
+ "inline-editing",
23
+ "cms"
24
+ ],
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "default": "./dist/index.js"
29
+ },
30
+ "./admin": {
31
+ "types": "./dist/admin/index.d.ts",
32
+ "default": "./dist/admin/index.js"
33
+ }
34
+ },
35
+ "main": "./dist/index.js",
36
+ "types": "./dist/index.d.ts",
37
+ "files": [
38
+ "dist",
39
+ "!dist/.tsbuildinfo",
40
+ "src",
41
+ "!src/**/__tests__",
42
+ "README.md",
43
+ "LICENSE"
44
+ ],
45
+ "scripts": {
46
+ "build": "tsc -b",
47
+ "typecheck": "tsc -b",
48
+ "test": "bun test src",
49
+ "clean": "rm -rf dist tsconfig.tsbuildinfo"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public",
53
+ "provenance": true
54
+ },
55
+ "dependencies": {
56
+ "@payload-onpage/core": "0.1.0"
57
+ },
58
+ "peerDependencies": {
59
+ "payload": "^3.90.2",
60
+ "@payloadcms/ui": "^3.90.2",
61
+ "@payloadcms/translations": "^3.90.2",
62
+ "react": "^19.0.0"
63
+ },
64
+ "engines": {
65
+ "node": ">=20.9.0"
66
+ }
67
+ }
package/src/access.ts ADDED
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Who may use on-page editing, and edit which documents. Document access is
3
+ * evaluated by Payload itself (`docAccessOperation`), so row-level rules
4
+ * (access functions that return a query) and field permissions behave exactly
5
+ * as in the admin.
6
+ */
7
+ import type { DocRef } from '@payload-onpage/core'
8
+ import {
9
+ docAccessOperation,
10
+ docAccessOperationGlobal,
11
+ type PayloadRequest,
12
+ type SanitizedCollectionPermission,
13
+ type SanitizedGlobalPermission,
14
+ } from 'payload'
15
+ import type { OnPageOptions } from './options.ts'
16
+
17
+ /** Signed in as an admin user (or allowed by the `access` option). */
18
+ export async function canUseOnPage(req: PayloadRequest, options: OnPageOptions): Promise<boolean> {
19
+ if (!req.user) return false
20
+ if (options.access) return Boolean(await options.access({ req }))
21
+ return req.user.collection === req.payload.config.admin.user
22
+ }
23
+
24
+ /** Payload's sanitized permissions for one document (or the collection, without an id). */
25
+ export async function documentPermissions(
26
+ req: PayloadRequest,
27
+ ref: DocRef | { kind: 'collection'; slug: string; id?: undefined },
28
+ ): Promise<SanitizedCollectionPermission | SanitizedGlobalPermission | null> {
29
+ try {
30
+ if (ref.kind === 'global') {
31
+ const globalConfig = req.payload.globals.config.find((g) => g.slug === ref.slug)
32
+ return globalConfig ? await docAccessOperationGlobal({ globalConfig, req }) : null
33
+ }
34
+ const collection = req.payload.collections[ref.slug]
35
+ if (!collection) return null
36
+ return await docAccessOperation({ collection, id: ref.id, req })
37
+ } catch {
38
+ return null
39
+ }
40
+ }
41
+
42
+ /** May this user edit this document on the page? */
43
+ export async function canEditDocument(
44
+ req: PayloadRequest,
45
+ ref: DocRef,
46
+ options: OnPageOptions,
47
+ ): Promise<boolean> {
48
+ if (!req.user) return false
49
+ if (options.access) return Boolean(await options.access({ req, ref }))
50
+ if (!(await canUseOnPage(req, options))) return false
51
+ const perms = await documentPermissions(req, ref)
52
+ const update = perms?.update as
53
+ true | { permission?: boolean; where?: Record<string, unknown> } | undefined
54
+ if (update === true) return true
55
+ if (!update?.permission) return false
56
+ // A row-level rule comes back as a query: check that this document matches it.
57
+ if (!update.where || ref.kind !== 'collection') return !update.where
58
+ const { totalDocs } = await req.payload.count({
59
+ collection: ref.slug as never,
60
+ where: { and: [{ id: { equals: ref.id } }, update.where] } as never,
61
+ overrideAccess: true,
62
+ req,
63
+ })
64
+ return totalDocs > 0
65
+ }
@@ -0,0 +1,99 @@
1
+ 'use client'
2
+
3
+ /**
4
+ * Document controls added by payload-onpage: open this document's page in edit
5
+ * mode, or copy a sealed read-only preview link. Hidden for users who can't
6
+ * update the document.
7
+ */
8
+ import { payloadRest } from '@payload-onpage/core/payload'
9
+ import {
10
+ Button,
11
+ toast,
12
+ useConfig,
13
+ useDocumentInfo,
14
+ useLocale,
15
+ useTranslation,
16
+ } from '@payloadcms/ui'
17
+ import type { OnPageTranslationKey } from '../translations.ts'
18
+ import { useMemo, useState } from 'react'
19
+
20
+ export interface OnPageAdminControlsProps {
21
+ kind: 'collection' | 'global'
22
+ slug: string
23
+ /** Plugin endpoint prefix (`routePrefix`). */
24
+ prefix: string
25
+ }
26
+
27
+ /**
28
+ * Same-origin POST (the endpoint refuses cross-site requests) opened in a new tab.
29
+ * A detached form: these controls render inside the admin's document <form>, and forms can't nest.
30
+ */
31
+ function postInNewTab(action: string) {
32
+ const form = document.createElement('form')
33
+ form.method = 'post'
34
+ form.action = action
35
+ form.target = '_blank'
36
+ document.body.appendChild(form)
37
+ form.submit()
38
+ form.remove()
39
+ }
40
+
41
+ export function OnPageAdminControls({ kind, slug, prefix }: OnPageAdminControlsProps) {
42
+ const { id, hasSavePermission } = useDocumentInfo()
43
+ const { config } = useConfig()
44
+ const locale = useLocale()
45
+ const { t: translate } = useTranslation()
46
+ const t = (key: OnPageTranslationKey, vars?: Record<string, string>) =>
47
+ (translate as (k: string, v?: Record<string, string>) => string)(key, vars)
48
+ const [busy, setBusy] = useState(false)
49
+ const apiBase = `${config.serverURL ?? ''}${config.routes.api}`
50
+ const dataSource = useMemo(() => payloadRest({ apiBase, prefix }), [apiBase, prefix])
51
+
52
+ if ((kind === 'collection' && !id) || hasSavePermission === false) return null
53
+
54
+ const ref = kind === 'global' ? ({ kind, slug } as const) : ({ kind, slug, id: id! } as const)
55
+ const params = new URLSearchParams({ kind, slug, mode: 'edit' })
56
+ if (kind === 'collection') params.set('id', String(id))
57
+ if (locale?.code) params.set('locale', locale.code)
58
+
59
+ const copyLink = async () => {
60
+ setBusy(true)
61
+ try {
62
+ const link = await dataSource.createPreviewLink!(ref, { locale: locale?.code })
63
+ await navigator.clipboard.writeText(link.url)
64
+ toast.success(
65
+ `Preview link copied — valid until ${new Date(link.expiresAt).toLocaleString()}`,
66
+ )
67
+ } catch (e) {
68
+ toast.error(t('onpage:linkFailed', { message: (e as Error).message }))
69
+ } finally {
70
+ setBusy(false)
71
+ }
72
+ }
73
+
74
+ const style = { whiteSpace: 'nowrap' as const, flexShrink: 0 }
75
+ return (
76
+ <div style={{ display: 'flex', gap: 6 }} data-testid="onpage-admin-controls">
77
+ <Button
78
+ buttonStyle="secondary"
79
+ size="medium"
80
+ onClick={() => postInNewTab(`${apiBase}${prefix}/enter?${params}`)}
81
+ extraButtonProps={{ style, 'data-testid': 'onpage-edit-on-page' }}
82
+ >
83
+ {t('onpage:editOnPage')}
84
+ </Button>
85
+ <Button
86
+ buttonStyle="subtle"
87
+ size="medium"
88
+ onClick={() => void copyLink()}
89
+ disabled={busy}
90
+ tooltip={t('onpage:copyPreviewLinkHint')}
91
+ extraButtonProps={{ style, 'data-testid': 'onpage-copy-preview-link' }}
92
+ >
93
+ {t('onpage:copyPreviewLink')}
94
+ </Button>
95
+ </div>
96
+ )
97
+ }
98
+
99
+ export default OnPageAdminControls
@@ -0,0 +1,2 @@
1
+ export { OnPageAdminControls } from './OnPageAdminControls.tsx'
2
+ export type { OnPageAdminControlsProps } from './OnPageAdminControls.tsx'