A powerful DatoCMS plugin for advanced link and button management. Create fully configurable link fields with support for records, assets, URLs, telephone numbers and email addresses — including styling variants, icons, custom titles, aria-labels, nofollow and target control.

> Fork notice: This plugin is forked from Better Linking by Colin Dorr. It extends the original with additional features such as icon selection, nofollow control, a redesigned responsive grid layout, and has been migrated to Vite, React 19 and DatoCMS Plugin SDK v2. Full credit to Colin Dorr for the original plugin concept and implementation.
_blank togglerel="nofollow" toggle (appears when "Open in new window" is active)formatted summary for GraphQL queries
When querying a Button Extended field via GraphQL, the full JSON object is returned. The most useful part is the formatted object, which contains a clean summary of the link configuration:
{ "formatted": { "isValid": true, "type": "url", "text": "Made by App Bis Web", "ariaLabel": "Based on Better Linking", "url": "app-bis-web.de", "target": "_blank", "rel": "nofollow", "noFollow": true, "class": "cta", "icon": "gift" }}Button fields are optional. When no link type is selected, the field stores null instead of a JSON object. This keeps the record payload minimal — especially important for multilingual records with multiple button fields that can quickly approach the DatoCMS 300 KB record size limit.
Make sure your frontend code handles this gracefully:
const button = JSON.parse(rawButtonField);if (!button?.formatted?.isValid) return null;| Field | Type | Description |
|---|---|---|
isValid | boolean | Whether the link has both a URL and text |
type | string | Link type: record, asset, url, tel, or email |
text | string | Display text (custom title or fallback from link data) |
ariaLabel | string | Accessibility label |
url | string | The resolved URL. Omitted when not set |
target | string | _blank or _self |
rel | string | "nofollow" when enabled. Omitted otherwise |
noFollow | boolean | Whether nofollow is active |
class | string | CSS class from the selected styling variant. Omitted when not set |
icon | string | Icon identifier from the selected icon option. Omitted when not set |
{ "linkType": { "label": "URL", "value": "url" }, "stylingType": { "label": "CTA", "value": "cta", "allowIcons": true }, "iconType": { "label": "Gift", "value": "gift" }, "url": { "title": "URL", "url": "app-bis-web.de" }, "formatted": { "isValid": true, "type": "url", "text": "Made by App Bis Web", "ariaLabel": "Based on Better Linking", "url": "app-bis-web.de", "target": "_blank", "rel": "nofollow", "noFollow": true, "class": "cta", "icon": "gift" }, "custom_text": "Made by App Bis Web", "aria_label": "Based on Better Linking", "open_in_new_window": true, "nofollow": true, "isValid": true}Version 1.1.0 optimizes the stored JSON payload. This is fully backward compatible:
null the next time an editor saves the record, freeing up space.button?.formatted?.url) requires no changes. If your code checks for === null on fields like rel, class or icon, update it to use a falsy check (!button.formatted.rel) since these properties are now omitted rather than set to null.| Dependency | Version |
|---|---|
| DatoCMS Plugin SDK | v2.x |
| DatoCMS React UI | v2.x |
| React | 19.x |
| Vite | 8.x |
| TypeScript | 5.x |
| Node.js | >= 20 |
npm installnpm run devThe dev server starts at http://localhost:5173. Add this URL as the entry point in your DatoCMS private plugin settings.
npm run build # Production build (outputs to dist/)npm test # Run testsThis plugin is based on Better Linking by Colin Dorr. The original plugin provided the foundation for link type management, styling variants, custom text, aria-labels and target control within DatoCMS.
Button Extended builds on top of this by adding:
rel="nofollow") toggleJan Luther — app-bis-web.de
This project is licensed under the GNU General Public License v3.0.