Provides a twig editor field with Twig & Craft API autocomplete

Related tags

CMS craft-twigfield
Overview

Scrutinizer Code Quality Code Coverage Build Status Code Intelligence Status

Twigfield for Craft CMS 3.x & 4.x

Provides a twig editor field with Twig & Craft API autocomplete

Demo

Requirements

Twigfield requires Craft CMS 3.0 or 4.0.

Installation

To install Twigfield, follow these steps:

  1. Open your terminal and go to your Craft project:

     cd /path/to/project
    
  2. Then tell Composer to require the package:

     composer require nystudio107/craft-twigfield
    

About Twigfield

Twigfield provides a full-featured Twig editor with syntax highlighting via the powerful Monaco Editor (the same editor that is the basis for VS Code).

Twigfield provides full autocompletion for Twig filters/functions/tags, and the full Craft CMS API, including installed plugins:

Autocomplete

And it adds hover documentation when you hover the cursor over an expression:

Hovers

You can also add your own custom Autocompletes, and customize the behavior of the editor.

Twigfield also provides a Yii2 Validator for Twig templates and object templates.

Using Twigfield

Once you've added the nystudio107/craft-twigfield package to your plugin, module, or project, no further setup is needed. This is because it operates as an auto-bootstrapping Yii2 Module.

Twigfield is not a Craft CMS plugin, rather a package to be utilized by a plugin, module, or project.

It can be very easy to add to an existing project, as you can see from the Preparse field pull request that adds it the Preparse plugin.

In the Craft CP

Twigfield works just like the Craft CMS forms macros that should be familiar to plugin and module developers.

Import Macros

Simply import the macros:

{% import "twigfield/twigfield" as twigfield %}

Multi-line Editor

Then to create a textarea multi-line editor, do the following:

{{ twigfield.textarea( {
    id: 'myTwigfield',
    name: 'myTwigfield',
    value: textAreaText,
} }}

...where textAreaText is a variable containing the initial text that should be in the editor field. This will create the Twig editor.

To create a textareaField multi-line editor, do the following:

{{ twigfield.textareaField( {
    label: "Twig Editor"|t,
    instructions: "Enter any Twig code below, with full API autocompletion."|t,
    id: 'myTwigfield',
    name: 'myTwigfield',
    value: textAreaText,
} }}

...where textAreaText is a variable containing the initial text that should be in the editor field. This will create the label and instructions, along with the Twig editor.

Single-line Editor

Then to create a text single-line editor, do the following:

{{ twigfield.text( {
    id: 'myTwigfield',
    name: 'myTwigfield',
    value: text,
} }}

...where text is a variable containing the initial text that should be in the editor field. This will create the Twig editor that is restricted to a single line, for simple Twig expressions.

To create a textField single-line editor, do the following:

{{ twigfield.textField( {
    label: "Twig Editor"|t,
    instructions: "Enter any Twig code below, with full API autocompletion."|t,
    id: 'myTwigfield',
    name: 'myTwigfield',
    value: text,
} }}

...where text is a variable containing the initial text that should be in the editor field. This will create the label and instructions, along with the Twig editor that is restricted to a single line, for simple Twig expressions.

Regardless of the macro used, an Asset Bundle containing the necessary CSS & JavaScript for the editor to function will be included, and the editor initialized.

In Frontend Templates

By default, Twigfield will not work in frontend templates, unless you specifically enable it.

Do so by copying the config.php file to the Craft CMS config/ directory, renaming the file to twigfield.php in the process, then set the allowFrontendAccess setting to true:

return [
    // Whether to allow anonymous access be allowed to the twigfield/autocomplete/index endpoint
    'allowFrontendAccess' => true,
    // The default autcompletes to use for the default `Twigfield` field type
    'defaultTwigfieldAutocompletes' => [
        CraftApiAutocomplete::class,
        TwigLanguageAutocomplete::class,
    ]
];

Then import the macros:

{% import "twigfield/twigfield" as twigfield %}

Create your own <textarea> element and include the necessary JavaScript, passing in the id of your textarea element:

<textarea id="myTwigfield">
</textarea>
{{ twigfield.includeJs("myTwigfield") }}

Enabling the allowFrontendAccess setting allows access to the twigfield/autocomplete/index endpoint, and add the twigfield/templates directory to the template roots.

Additional Options

The textarea, textareaField, text, textField, and includeJs macros all take three additional optional parameters:

{{ textarea(config, fieldType, wrapperClass, editorOptions) }}

{{ textareaField(config, fieldType, wrapperClass, editorOptions }}

{{ text(config, fieldType, wrapperClass, editorOptions) }}

{{ textField(config, fieldType, wrapperClass, editorOptions }}

{{ includeJs(fieldId, fieldType, wrapperClass, editorOptions }}

fieldType

fieldType - by default this is set to Twigfield. You only need to change it to something else if you're using a custom Autocomplete (see below)

e.g.:

{{ twigfield.textarea({
    id: 'myTwigfield',
    name: 'myTwigfield',
    value: textAreaText,
}, "MyCustomFieldType" }}

wrapperClass

wrapperClass - an additional class that is added to the Twigfield editor wrapper div. By default, this is an empty string.

e.g.:

{{ twigfield.textareaField({
    label: "Twig Editor"|t,
    instructions: "Enter any Twig code below, with full API autocompletion."|t,
    id: 'myTwigfield',
    name: 'myTwigfield',
    value: textAreaText,
}, "Twigfield", "monaco-editor-background-frame" }}

The monaco-editor-background-frame class is bundled, and will cause the field to look like a Craft CMS editor field, but you can use your own class as well.

editorOptions

editorOptions - an optional EditorOption passed in to configure the Monaco editor. By default, this is an empty object.

e.g.:

<textarea id="myTwigfield">
</textarea>
{{ twigfield.includeJs("myTwigfield", "Twigfield", "monaco-editor-background-frame", {
    lineNumbers: 'on',
}) }}

Using Additional Autocompletes

By default, Twigfield uses the CraftApiAutocomplete & TwigLanguageAutocomplete, but it also includes an optional EnvironmentVariableAutocomplete which provides autocompletion of any Craft CMS Environment Variables and Aliases.

If you want to use the EnvironmentVariableAutocomplete or a custom Autocomplete you write, you'll need to add a little PHP code to your plugin, module, or project:

use nystudio107\twigfield\autocompletes\EnvironmentVariableAutocomplete;
use nystudio107\twigfield\events\RegisterTwigfieldAutocompletesEvent;
use nystudio107\twigfield\services\AutocompleteService;

Event::on(
    AutocompleteService::class,
    AutocompleteService::EVENT_REGISTER_TWIGFIELD_AUTOCOMPLETES,
    function (RegisterTwigfieldAutocompletesEvent $event) {
        $event->types[] = EnvironmentVariableAutocomplete::class;
    }
);

The above code will add Environment Variable & Alias autocompletes to all of your Twigfield editors.

However, because you might have several instances of a Twigfield on the same page, and they each may provide separate Autocompletes, you may want to selectively add a custom Autocomplete only when the fieldType matches a specific.

Here's an example from the Sprig plugin:

use nystudio107\twigfield\events\RegisterTwigfieldAutocompletesEvent;
use nystudio107\twigfield\services\AutocompleteService;
use putyourlightson\sprig\plugin\autocompletes\SprigApiAutocomplete;

public const SPRIG_TWIG_FIELD_TYPE = 'SprigField';

Event::on(
    AutocompleteService::class,
    AutocompleteService::EVENT_REGISTER_TWIGFIELD_AUTOCOMPLETES,
    function (RegisterTwigfieldAutocompletesEvent $event) {
        if ($event->fieldType === self::SPRIG_TWIG_FIELD_TYPE) {
            $event->types[] = SprigApiAutocomplete::class;
        }
    }
);

This ensures that the SprigApiAutocomplete Autocomplete will only be added when the fieldType passed into the Twigfield macros is set to SprigField.

Writing a Custom Autocomplete

Autocompletes extend from the base Autocomplete class, and implement the AutocompleteInterface

A simple Autocomplete would look like this:

<?php
namespace myvendor\myname\autocompletes;

use nystudio107\twigfield\base\Autocomplete;
use nystudio107\twigfield\models\CompleteItem;
use nystudio107\twigfield\types\AutocompleteTypes;
use nystudio107\twigfield\types\CompleteItemKind;

class MyCustomAutocomplete extends Autocomplete
{
    public $name = 'EnvironmentVariableAutocomplete';

    public $type = AutocompleteTypes::GeneralAutocomplete;

    public function generateCompleteItems(): void
    {
    CompleteItem::create()
        ->label('MyAutocomplete')
        ->insertText('MyAutocomplete')
        ->detail('This is my autocomplete')
        ->documentation('This detailed documentation of my autocomplete')
        ->kind(CompleteItemKind::ConstantKind)
        ->add($this);
    }
}

The $name is the name of your Autocomplete, and it is used for the autocomplete cache.

The $type is either AutocompleteTypes::TwigExpressionAutocomplete (which only autocompletes inside of a Twig expression) or AutocompleteTypes::GeneralAutocomplete (which autocompletes everywhere).

CompleteItem::create() is a factory method that creates a CompleteItem object. You can use the Fluent Model setters as shown above, or you can set properties directly on the model as well. The CompleteItem::add() method adds it to the list of generated Autocompletes.

See the following examples for custom Autocompletes that you can use as a guide when creating your own:

Twig Template Validators

Twigfield also includes two Twig template Validators that you can use to validate Twig templates that are saved as part of a model:

You just add them as a rule on your model, and it will propagate the model with any errors that were encountered when rendering the template:

use nystudio107\twigfield\validators\TwigTemplateValidator;

public function defineRules()
{
    return [
        ['myTwigCode', TwigTemplateValidator::class],
    ];
}

You can also add in any variables that should be presents in the Twig environment:

use nystudio107\twigfield\validators\TwigTemplateValidator;

public function defineRules()
{
    return [
        [
            'myTwigCode', TwigTemplateValidator::class,
            'variables' => [
               'foo' => 'bar',
           ]
        ],
    ];
}

For the TwigObjectTemplateValidator, you can also pass in the object that should be used when rendering the object template:

use nystudio107\twigfield\validators\TwigObjectTemplateValidator;

public function defineRules()
{
    return [
        [
            'myTwigCode', TwigObjectTemplateValidator::class, 
            'object' => $object,
            'variables' => [
               'foo' => 'bar',
           ]
        ],
    ];
}

Twigfield Roadmap

Some things to do, and ideas for potential features:

  • Smarter Twig expression detection
  • Hovers for TwigExpressionAutocompletes should only be added if they are inside of a Twig expression
  • Perhaps a general code editor as an offshoot?

Brought to you by nystudio107

You might also like...
Monet Plugin for Craft CMS

A Monet field can be added to asset elements which will generate and store an efficient placeholder image to be displayed inline, whilst the full asset is loading.

Create WordPress themes with beautiful OOP code and the Twig Template Engine
Create WordPress themes with beautiful OOP code and the Twig Template Engine

Timber helps you create fully-customized WordPress themes faster with more sustainable code. With Timber, you write your HTML using the Twig Template Engine separate from your PHP files.

True Multisite, Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS powered by PHP, Markdown, Twig, and Symfony

True Multisite, Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS powered by PHP, Markdown, Twig, and Symfony

BookStack is an opinionated wiki system that provides a pleasant and simple out of the box experience.

BookStack is an opinionated wiki system that provides a pleasant and simple out of the box experience. New users to an instance should find the experience intuitive and only basic word-processing skills should be required to get involved in creating content on BookStack. The platform should provide advanced power features to those that desire it but they should not interfere with the core simple user experience.

Registry Component provides a fluent, object-oriented interface for storing data globally in a well managed fashion, helping to prevent global meltdown.

Registry Component Registry Component provides a fluent, object-oriented interface for storing data globally in a well managed fashion, helping to pre

Csrf Component provides Cross Site Request Forgery protection by comparing provided token with session token to ensure request validity.

Csrf Component Csrf Component provides Cross Site Request Forgery protection by comparing provided token with session token to ensure request validity

Twill GraphQL provides easy access to query-specific fields from Twill CMS modules and user-defined modules with GraphQL

Twill CMS GraphQL đź”­ WIP - not stable Twill GraphQL provides easy access to query-specific fields from Twill CMS modules and user-defined modules with

PHPVibe Open source video CMS / Video Sharing CMS / Youtube Api v3 / Video Embeds
PHPVibe Open source video CMS / Video Sharing CMS / Youtube Api v3 / Video Embeds

PHPVibe Video CMS Free Video Sharing CMS The modern choice of design inspired by Youtube and a social videos sharing module that may just cut it for y

A module allowing you to write your Processwire template using MJML and get a converted HTML output using MJML API.
A module allowing you to write your Processwire template using MJML and get a converted HTML output using MJML API.

PageMjmlToHtml A module allowing you to write your Processwire template using MJML and get a converted HTML output using MJML API. This is considered

Comments
  • Cannot use ::class with dynamic class name

    Cannot use ::class with dynamic class name

    Description

    I just updated my website which is running on php 7.4. With this update, craft-twigfield was updated from 1.0.11 to 1.0.14. This causes a intern server error whenever I tried to access the cms:

    Screenshot at Oct 14 12-10-39

    The logs are showing:

    PHP Fatal error: Cannot use ::class with dynamic class name in /projects/veluwseon_88/vendor/nystudio107/craft-twigfield/src/services/AutocompleteService.php on line 138

    Fix

    Updating to php 8.1.4 fixed it for me. I just thought I'd mention it..

    Versions

    • Plugin version: 1.0.14
    • Craft version: 3.7.56
    bug 
    opened by SamLNL 15
  • Possible issue with Twig Field and Sprig (and maybe Envoyer?)

    Possible issue with Twig Field and Sprig (and maybe Envoyer?)

    Question

    I have been getting Server Errors on my staging environment since updating to the latest version of Sprig. That new version requires Twig Field, and the stack trace does mention Twig Field. So I wonder if you could have a quick look through that stacktrace (below) and see if you can see anything there (sorry, that's not one of my skills).

    One thing to note is that the staging and production environments are deployed with Envoyer, so there are a few symbolic links and stuff, and the working directory is down in a "releases" directory. Could that perhaps be causing issues?

    Thanks in advance for any help or advice you may be able to give!

    Additional context

    Here's the stack trace:

    yii\base\InvalidConfigException: The directory does not exist:  in /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/yiisoft/yii2/web/AssetManager.php:232
    Stack trace:
    #0 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/yiisoft/yii2/web/AssetManager.php(542): yii\web\AssetManager->checkBasePathPermission()
    #1 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/craftcms/cms/src/web/AssetManager.php(124): yii\web\AssetManager->publishDirectory()
    #2 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/yiisoft/yii2/web/AssetManager.php(474): craft\web\AssetManager->publishDirectory()
    #3 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/craftcms/cms/src/web/AssetManager.php(38): yii\web\AssetManager->publish()
    #4 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/craftcms/cms/src/web/AssetManager.php(52): craft\web\AssetManager->publish()
    #5 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/nystudio107/craft-twigfield/src/services/AutocompleteService.php(94): craft\web\AssetManager->getPublishedUrl()
    #6 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/nystudio107/craft-twigfield/src/Twigfield.php(98): nystudio107\twigfield\services\AutocompleteService::getTwigfieldPublishUrl()
    #7 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/nystudio107/craft-twigfield/src/Twigfield.php(78): nystudio107\twigfield\Twigfield->configureModule()
    #8 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/yiisoft/yii2/base/Application.php(295): nystudio107\twigfield\Twigfield->bootstrap()
    #9 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/craftcms/cms/src/web/Application.php(122): yii\base\Application->bootstrap()
    #10 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/yiisoft/yii2/base/Application.php(271): craft\web\Application->bootstrap()
    #11 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/craftcms/cms/src/web/Application.php(99): yii\base\Application->init()
    #12 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/yiisoft/yii2/base/BaseObject.php(109): craft\web\Application->init()
    #13 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/yiisoft/yii2/base/Application.php(204): yii\base\BaseObject->__construct()
    #14 [internal function]: yii\base\Application->__construct()
    #15 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/yiisoft/yii2/di/Container.php(419): ReflectionClass->newInstanceArgs()
    #16 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/yiisoft/yii2/di/Container.php(170): yii\di\Container->build()
    #17 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/yiisoft/yii2/BaseYii.php(365): yii\di\Container->get()
    #18 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/craftcms/cms/src/Craft.php(53): yii\BaseYii::createObject()
    #19 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/craftcms/cms/bootstrap/bootstrap.php(239): Craft::createObject()
    #20 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/vendor/craftcms/cms/bootstrap/web.php(40): require('...')
    #21 /home/forge/staging.spmcommercial.co.th/releases/20220624015126/web/index.php(11): require('...')
    #22 {main}
    
    question 
    opened by AndrewMac-UTS 6
  • Better Twig indicator icon

    Better Twig indicator icon

    Description

    Replaces the Twig logo-icon with a generic {} icon, in the same style as fields’ translatable and searchable indicator icons on Settings → Fields:

    The “Title Format” field for an entry type, sporting the new icon

    Accessibility has been improved as well:

    • The icon is now displayed with an inline SVG, with a title attribute set to “Twig code is supported.”, so it gets a tooltip for sighted users, but aria-hidden="true" so it’s ignored by screen readers.
    • Monaco is now configured with ariaLabel set to “Twig code is supported.” (appended to the existing ariaLabel value, if any).
    opened by brandonkelly 2
  • Fix 404 error due to `?` in `urlParams`

    Fix 404 error due to `?` in `urlParams`

    This is a quick (and dirty?) fix to the urlParams adding a second ? to the endpoint URL, instead of a &, causing a 404 error. I'll leave it to you to figure out how you want to implement it.

    Screenshot 2022-06-22 at 20 32 04
    opened by bencroker 1
Releases(1.0.19)
  • 1.0.19(Oct 28, 2022)

  • 1.0.18(Oct 26, 2022)

  • 1.0.17(Oct 23, 2022)

    Added

    • Added a better Twig indicator icon, along with a title attribute for a tooltip indicator, and #a11y improvements (#5)

    Changed

    • Set both alwaysConsumeMouseWheel & handleMouseWheel to false in the default Monaco Editor config to avoid it consuming mouse wheel events that prevent scrolling pages with Twigfield fields ref: (#1853)
    Source code(tar.gz)
    Source code(zip)
  • 1.0.16(Oct 18, 2022)

  • 1.0.15(Oct 18, 2022)

  • 1.0.14(Oct 13, 2022)

  • 1.0.13(Oct 13, 2022)

    Added

    • Added monaco-editor-inline-frame built-in style for an inline editor in a table cell (or elsewhere that no chrome is desired)
    • Added SectionShorthandFieldsAutocomplete to provide shorthand autocomplete items for Craft sections
    • Added conditionals to the ObjectParserAutocomplete abstract class so that child classes can determine exactly what gets parsed by overriding properties
    • Added the ability to have placeholder text for the Twigfield editor
    • Allow the Twig environment to be passed down to the TwigLanguageAutocomplete Autocomplete via DI
    • Change constants to properties for the sort prefixes in ObjectParserAutocomplete to allow child classes to override the settings

    Changed

    • Invalidate SectionShorthandFieldsAutocomplete caches whenever any field layout is edited
    • Add in magic getter properties that are defined only in the @property docblock annotation
    Source code(tar.gz)
    Source code(zip)
  • 1.0.12(Oct 5, 2022)

    Added

    • Add ObjectAutocomplete class to allow for easily adding all of the properties of an object as autocomplete items
    • Add missing Twig tags else, elseif, endblock & endif
    • Allow the twigfieldOptions config object to be passed into the Twig macros
    • Include a hash of the twigfieldOptions in the cache key used for the autocomplete

    Changed

    • Refactor to ObjectParserAutocomplete & ObjectParserInterface
    Source code(tar.gz)
    Source code(zip)
  • 1.0.11(Jul 24, 2022)

  • 1.0.10(Jul 23, 2022)

    Changed

    • Add allow-plugins to composer.json so CI can work

    Fixed

    • Fixed an issue where an exception could be thrown during the bootstrap process in earlier versions of Yii2 due to $id not being set
    Source code(tar.gz)
    Source code(zip)
  • 1.0.9(Jun 25, 2022)

  • 1.0.8(Jun 24, 2022)

    Fixed

    • Fixed an issue that could cause an exception to be thrown after first install/update to a plugin that uses Twigfield, which prevented the module from loading (#2) (#1161)
    Source code(tar.gz)
    Source code(zip)
  • 1.0.7(Jun 22, 2022)

  • 1.0.6(Jun 21, 2022)

    Changed

    • Better handling of object property docblocks in the CraftApiAutocomplete
    • The CraftApiAutocomplete now typecasts properties to string to ensure they validate
    Source code(tar.gz)
    Source code(zip)
  • 1.0.5(Jun 21, 2022)

    Changed

    • Only issue an XHR for autocomplete items of the specified fieldType if they haven't been added already, for better performance with multiple Twigfield instances on a single page
    Source code(tar.gz)
    Source code(zip)
  • 1.0.4(Jun 21, 2022)

    Changed

    • Handle cases where there is no space between the {{ opening brackets of a Twig expression so nested properties autocomplete there, too
    • Sort environment variables below other autocompletes
    • Tweak the CSS to allow it to fit into the encompassing <div> better
    Source code(tar.gz)
    Source code(zip)
  • 1.0.3(Jun 18, 2022)

    Added

    • Added the ability to pass in a config array to autocomplete classes via the AutocompleteService::EVENT_REGISTER_TWIGFIELD_AUTOCOMPLETES event
    • Added the $hasSubProperties property to the Autocomplete model, to indicate whether the autocomplete returns nested sub-properties such as foo.bar.baz
    • Added the ability to pass in the twigGlobals & elementRouteGlobals properties via dependency injection to the CraftApiAutocomplete autocomplete

    Changed

    • Removed errant logging
    Source code(tar.gz)
    Source code(zip)
  • 1.0.2(Jun 15, 2022)

    Fixed

    • Fixed an issue where autocomplete of nested properties wouldn't work if there was no space after a { in Twig
    • Fixed an issue where GeneralAutocompletes were applied when we were in a sub-property, which resulted in JS errors
    Source code(tar.gz)
    Source code(zip)
  • 1.0.1(Jun 13, 2022)

    Added

    • Added text() and textField() macros that create a single-line Twig editor for simple Twig expressions
    • Added $additionalGlobals to the CraftApiAutocomplete class so that classes extending it can add their own global variables to be parsed for autocomplete items
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(Jun 13, 2022)

Owner
nystudio107
Consulting, Branding, Design, Development
nystudio107
Returns a list of Craft/Vue/React route rules and element URLs for ServiceWorkers from Craft entries

Route Map plugin for Craft CMS 3.x Returns a list of Craft/Vue/React route rules and element URLs for ServiceWorkers from Craft entries Related: Route

nystudio107 30 Mar 14, 2022
Provides autocompletion for Craft CMS and plugins in Twig templates.

Autocomplete for Craft CMS Provides autocompletion for Craft CMS and plugins in Twig templates. Currently works with PhpStorm only, as VSCode does not

PutYourLightsOn 12 Nov 23, 2021
Plugin for Craft CMS that makes it easy to interact with the Instagram Basic Display API and Instagram oEmbed.

Instagram Basic Display plugin for Craft CMS 3.x This plugin creates endpoints in your Craft install for you to consume the Instagram Basic Display AP

Jonathan Melville 5 Dec 20, 2022
Craft is a flexible, user-friendly CMS for creating custom digital experiences on the web and beyond.

About Craft CMS Craft is a flexible, user-friendly CMS for creating custom digital experiences on the web and beyond. It features: An intuitive, user-

Craft CMS 2.9k Jan 1, 2023
Allows the use of the Vite.js next generation frontend tooling with Craft CMS

Vite plugin for Craft CMS 3.x Allows the use of the Vite.js next generation frontend tooling with Craft CMS Related Article: Vite.js Next Generation F

nystudio107 38 Dec 30, 2022
Plugin Vite is the conduit between Craft CMS plugins and Vite, with manifest.json & HMR support

Plugin Vite Related Articles: Vite.js Next Generation Frontend Tooling + Craft CMS A Vite Buildchain for Craft CMS Plugins Requirements Craft CMS 3.0.

nystudio107 8 Dec 30, 2022
A BlurHash implementation for Craft CMS.

BlurHash plugin for Craft CMS 3.x Render a BlurHash from a given asset in Craft CMS. A BlurHash is a compact representation of a placeholder for an im

Dodeca Studio 8 Nov 12, 2022
Edit richt text content in Craft CMS using Article by Imperavi.

Article Editor About the plugin This plugin brings the powerful Article Editor from Imperavi to Craft CMS, allowing you to make create beautiful rich

Creativeorange 6 Mar 30, 2022
A plugin for Craft CMS 3.X that allows for GraphQL search functionality for matching on fields of nested entries.

Nested Entry GraphQL Plugin This Craft CMS plugin allows for performing graphQL search queries that match on fields on nested entries-as-a-field. What

Rubin EPO 2 Sep 10, 2021
Element Relations Plugin for Craft CMS 3.x

Element Relations Plugin for Craft CMS 3.x This plugin shows all relations of an element. For example, where an asset, entry or any other element is l

Frederic Köberl 2 Jul 18, 2022