Skip to content
This repository was archived by the owner on Oct 20, 2023. It is now read-only.

Repository files navigation

cem-plugin-vs-code-custom-data-generator

This project has been moved to the Custom Element VS Code Integration project.

This is a plugin automatically generates a custom data config file for VS Code using the Custom Element Manifest Analyzer.

This config enables VS Code to display autocomplete and contextual information about your custom elements.

demo of autocomplete features for custom elements in vs code

Usage

Pre-installation

Ensure the following steps have been taken in your component library prior to using this plugin:

Install

npm i -D cem-plugin-vs-code-custom-data-generator

Import

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData()],};

Implementation

If you don't have it already, add a VS Code settings folder and file at the root of your project - .vscode/settings.json. Then add or append the following code:

{
"html.customData": [
"./vscode.html-custom-data.json"
],
"css.customData": [
"./vscode.css-custom-data.json"
]
}

If this is included in your npm package, the VS Code configuration will look something like this:

{
"html.customData": [
"./node_modules/my-component-library/vscode.html-custom-data.json"
],
"css.customData": [
"./node_modules/my-component-library/vscode.css-custom-data.json"
]
}

Note: The path is relative to the root of the project, not the settings file.

Once it has been added, you will need to restart VS Code in order for it to register the new components. After it has been restarted, you should see autocomplete information for your custom elements!

Configuration

The configuration has the following optional parameters:

{/** Path to output directory */outdir?: string;/** Name of the file with you component's custom HTML data */
htmlFileName?: string|null;/** Name of the file with you component's custom CSS data */
cssFileName?: string|null;/** Class names of any components you would like to exclude from the custom data */
exclude?: string[];/** The property name from the component object constructed by the CEM Analyzer */
descriptionSrc?: "description"|"summary"|string;/** Displays the slot section of the element description */
slotDocs?: boolean;/** Displays the event section of the element description */
eventDocs?: boolean;/** Displays the CSS custom properties section of the element description */
cssPropertiesDocs?: boolean;/** Displays the CSS parts section of the element description */
cssPartsDocs?: boolean;/** Overrides the default section labels in the component description *//** Displays the methods section of the element description */
methodDocs?: boolean;
labels?: {slots?: string;
events?: string;
cssProperties?: string;
cssParts?: string;
methods?: string;};/** Creates reusable CSS values for consistency in components */
cssSets?: CssSet[];}
// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({/** Output directory to write the React wrappers to - default is the root of the project */outdir: 'dist',/** Name of the file with you component's custom HTML data */htmlFileName: 'my-library.html-custom-data.json',/** Name of the file with you component's custom CSS data */cssFileName: 'my-library.css-custom-data.json',/** class names of any components you would like to exclude from the custom data */exclude: ['MyInternalElement'],/** The property name from the component object constructed by the CEM Analyzer */descriptionSrc: "description",/** Displays the slot section of the element description */slotDocs: true,/** Displays the event section of the element description */eventDocs: true,/** Displays the CSS custom properties section of the element description */cssPropertiesDocs: true,/** Displays the CSS parts section of the element description */cssPartsDocs: true,/** Displays the methods section of the element description */methodDocs: true,/** Overrides the default section labels in the component description */labels: {slots: "Slot Section",events: "Custom Events",cssProperties: "CSS Variables",cssParts: "Style Hooks",methods: "Functions"},/** Creates reusable CSS values for consistency in components */cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},],}),],};

Example

Here is a basic example of a component configuration using jsDoc:

/** * * Radio groups are used to group multiple radio buttons so they function as a single form control. * * Here is the [documentation](https://my-site.com/docs.md). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * * @tag radio-group * @tagname radio-group * * @attr {boolean} disabled - Disables the element * @attribute {string} value - The value of the selected radio * @attribute {1,2,3,4} size - This will control the size of radio buttons * * @csspart bar - Styles the color of bar * * @slot - add radio buttons to the `default` slot to create options to your radio group * @slot label - placeholder for the radio group label * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the color of foo * @cssproperty [--background-color=red] - Controls the color of bar * * @prop {boolean} prop1 - this toggles some unseen feature * @property {number} prop2 - this will adjust the width of the unit * * @fires custom-event - some description for custom-event * @fires {Event} typed-event - some description for typed-event * @event {CustomEvent} typed-custom-event - some description for typed-custom-event * * @reference Documentation - https://my-site.com/docs * @reference MDN - https://developer.mozilla.org/en-US/ * */classRadioGroupextendsHTMLElement{}

Omitting File Output

If you would like to exclude the HTML or CSS output, you can do so by setting the htmlFileName or cssFileName properties to null.

Tag Mapping

an example of the jsDoc tags used to create the custom data file

TagDescription
@summary / descriptionThis provides the description for the custom element when autocomplete is used or the element is hovered. If no summary is provided, it will fall back to the description if it is available.
@attr / @attributeThis will provide descriptions for each attribute. If you use union types in TypeScript or in the description, these will display as autocomplete options. Values can also be defined in the jsDoc using comma or pipe delimited values
@referenceThis is a custom tag for this plugin. It creates reference links at the bottom of the information bubble. Multiple references are supported.

The @summary and @attr / @attribute descriptions have limited markdown support and enable you to style text, create links, and add code snippets.

Descriptions

Using the descriptionSrc configuration, you can determine the source of the text that gets displayed in the editor autocomplete bubble. This is useful if you want to provide alternate descriptions for your React users.

If no value is provided, the plugin will use the summary property and then fall back to the description property if a summary is not available.

description section of autocomplete popup from vs code

Note:Descriptions support multiple lines by breaking the comment up into multiple lines whereas summaries do not and will need to be manually added using \n.

// description example/** * * Radio groups are used to group multiple radios or radio buttons so they function as a single form control. Here is its [documentation](https://my-docsite.com). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * */
// summary example/**** @summaryRadiosbuttonsallowuserstoselectasingleoptionfromagroup.Hereisits[documentation](https://my-site.com/documentation).\n\nUseitlikethis:\n```html\n<radio-button value="1" disabled>Your label</radio-button>\n```**/

Slot Documentation

Slot information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting slotDocs to false in the config.

slot section of autocomplete popup from vs code

Event Documentation

Event information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting eventDocs to false in the config.

events section of autocomplete popup from vs code

Method Documentation

Methods will display if they are public and have a description. This section can be hidden by setting methodDocs to false in the config.

CSS Documentation

Component-specific CSS Properties and CSS Parts are included in the component documentation. These can be hidden using the cssPropertiesDocs and cssPartsDocs configuration options respectively.

css properties and css parts sections of autocomplete popup from vs code

Documentation Labels

There may be instances where you may want to translate or override the default section headers. Using the labels configuration you can change one or all of the headers for the component description sections.

// custom-elements-manifest.config.jsexportdefault{plugins: [generateCustomData({
...
/** Overrides the default section labels in the component description */labels: {slots: "Placeholders",events: "事件",cssProperties: "Propiedades CSS",cssParts: "Style Hooks",methods: "Actions"},}),],};

CSS Custom Data

Adding the CSS Custom Data file to your config provides you with autocomplete for your component's CSS custom properties.

These values can be added in your component's jsDoc. The var() wrapper will be added automatically if they are prefixed with --.

/** * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the border radius of the component *  */

CSS Sets

You can define reusable CSS values to simplify your efforts and provide greater consistency from one component to another.

First, define your sets in the config. Values can be an object array with a name and optional description or they can be a simple string array.

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},{name: "spacing",values: ['2px','4px','8px','12px','16px'],},],}),],};

Once they are defined, you can reference them in your components jsDoc by prefixing it with set: and providing the name of the set.

/** * * @cssprop {set:radiuses} --border-radius - Controls the border radius of the component *  */

css custom property autocomplete from vs code

CSS Parts

Developers will also receive autocomplete for defined CSS parts.

/** * * @csspart radio-label - Applies custom styles the radio group label *  */

css custom property autocomplete from vs code

About

A custom elements manifest analyzer plugin to generate a custom data file for VS Code.

Resources

Stars

19 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all \x3Cpre>\x3Ccode> blocks (function() { function addCopyButtons() { document.querySelectorAll('pre code').forEach(function(codeBlock) { if (codeBlock.parentElement.hasAttribute('data-copy-added')) return; codeBlock.parentElement.setAttribute('data-copy-added', 'true'); var btn = document.createElement('button'); btn.textContent = 'Copy'; btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;'; btn.onmouseover = function() { this.style.opacity = '1'; }; btn.onmouseout = function() { this.style.opacity = '0.7'; }; btn.onclick = function() { navigator.clipboard.writeText(codeBlock.textContent).then(function() { btn.textContent = 'Copied!'; setTimeout(function() { btn.textContent = 'Copy'; }, 1500); }); }; codeBlock.parentElement.style.position = 'relative'; codeBlock.parentElement.appendChild(btn); }); } addCopyButtons(); // Re-run on dynamic content var observer = new MutationObserver(addCopyButtons); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + ' GitHub - break-stuff/cem-plugin-vs-code-custom-data-generator: A custom elements manifest analyzer plugin to generate a custom data file for VS Code. · GitHub
Skip to content
This repository was archived by the owner on Oct 20, 2023. It is now read-only.

Repository files navigation

cem-plugin-vs-code-custom-data-generator

This project has been moved to the Custom Element VS Code Integration project.

This is a plugin automatically generates a custom data config file for VS Code using the Custom Element Manifest Analyzer.

This config enables VS Code to display autocomplete and contextual information about your custom elements.

demo of autocomplete features for custom elements in vs code

Usage

Pre-installation

Ensure the following steps have been taken in your component library prior to using this plugin:

Install

npm i -D cem-plugin-vs-code-custom-data-generator

Import

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData()],};

Implementation

If you don't have it already, add a VS Code settings folder and file at the root of your project - .vscode/settings.json. Then add or append the following code:

{
"html.customData": [
"./vscode.html-custom-data.json"
],
"css.customData": [
"./vscode.css-custom-data.json"
]
}

If this is included in your npm package, the VS Code configuration will look something like this:

{
"html.customData": [
"./node_modules/my-component-library/vscode.html-custom-data.json"
],
"css.customData": [
"./node_modules/my-component-library/vscode.css-custom-data.json"
]
}

Note: The path is relative to the root of the project, not the settings file.

Once it has been added, you will need to restart VS Code in order for it to register the new components. After it has been restarted, you should see autocomplete information for your custom elements!

Configuration

The configuration has the following optional parameters:

{/** Path to output directory */outdir?: string;/** Name of the file with you component's custom HTML data */
htmlFileName?: string|null;/** Name of the file with you component's custom CSS data */
cssFileName?: string|null;/** Class names of any components you would like to exclude from the custom data */
exclude?: string[];/** The property name from the component object constructed by the CEM Analyzer */
descriptionSrc?: "description"|"summary"|string;/** Displays the slot section of the element description */
slotDocs?: boolean;/** Displays the event section of the element description */
eventDocs?: boolean;/** Displays the CSS custom properties section of the element description */
cssPropertiesDocs?: boolean;/** Displays the CSS parts section of the element description */
cssPartsDocs?: boolean;/** Overrides the default section labels in the component description *//** Displays the methods section of the element description */
methodDocs?: boolean;
labels?: {slots?: string;
events?: string;
cssProperties?: string;
cssParts?: string;
methods?: string;};/** Creates reusable CSS values for consistency in components */
cssSets?: CssSet[];}
// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({/** Output directory to write the React wrappers to - default is the root of the project */outdir: 'dist',/** Name of the file with you component's custom HTML data */htmlFileName: 'my-library.html-custom-data.json',/** Name of the file with you component's custom CSS data */cssFileName: 'my-library.css-custom-data.json',/** class names of any components you would like to exclude from the custom data */exclude: ['MyInternalElement'],/** The property name from the component object constructed by the CEM Analyzer */descriptionSrc: "description",/** Displays the slot section of the element description */slotDocs: true,/** Displays the event section of the element description */eventDocs: true,/** Displays the CSS custom properties section of the element description */cssPropertiesDocs: true,/** Displays the CSS parts section of the element description */cssPartsDocs: true,/** Displays the methods section of the element description */methodDocs: true,/** Overrides the default section labels in the component description */labels: {slots: "Slot Section",events: "Custom Events",cssProperties: "CSS Variables",cssParts: "Style Hooks",methods: "Functions"},/** Creates reusable CSS values for consistency in components */cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},],}),],};

Example

Here is a basic example of a component configuration using jsDoc:

/** * * Radio groups are used to group multiple radio buttons so they function as a single form control. * * Here is the [documentation](https://my-site.com/docs.md). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * * @tag radio-group * @tagname radio-group * * @attr {boolean} disabled - Disables the element * @attribute {string} value - The value of the selected radio * @attribute {1,2,3,4} size - This will control the size of radio buttons * * @csspart bar - Styles the color of bar * * @slot - add radio buttons to the `default` slot to create options to your radio group * @slot label - placeholder for the radio group label * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the color of foo * @cssproperty [--background-color=red] - Controls the color of bar * * @prop {boolean} prop1 - this toggles some unseen feature * @property {number} prop2 - this will adjust the width of the unit * * @fires custom-event - some description for custom-event * @fires {Event} typed-event - some description for typed-event * @event {CustomEvent} typed-custom-event - some description for typed-custom-event * * @reference Documentation - https://my-site.com/docs * @reference MDN - https://developer.mozilla.org/en-US/ * */classRadioGroupextendsHTMLElement{}

Omitting File Output

If you would like to exclude the HTML or CSS output, you can do so by setting the htmlFileName or cssFileName properties to null.

Tag Mapping

an example of the jsDoc tags used to create the custom data file

TagDescription
@summary / descriptionThis provides the description for the custom element when autocomplete is used or the element is hovered. If no summary is provided, it will fall back to the description if it is available.
@attr / @attributeThis will provide descriptions for each attribute. If you use union types in TypeScript or in the description, these will display as autocomplete options. Values can also be defined in the jsDoc using comma or pipe delimited values
@referenceThis is a custom tag for this plugin. It creates reference links at the bottom of the information bubble. Multiple references are supported.

The @summary and @attr / @attribute descriptions have limited markdown support and enable you to style text, create links, and add code snippets.

Descriptions

Using the descriptionSrc configuration, you can determine the source of the text that gets displayed in the editor autocomplete bubble. This is useful if you want to provide alternate descriptions for your React users.

If no value is provided, the plugin will use the summary property and then fall back to the description property if a summary is not available.

description section of autocomplete popup from vs code

Note:Descriptions support multiple lines by breaking the comment up into multiple lines whereas summaries do not and will need to be manually added using \n.

// description example/** * * Radio groups are used to group multiple radios or radio buttons so they function as a single form control. Here is its [documentation](https://my-docsite.com). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * */
// summary example/**** @summaryRadiosbuttonsallowuserstoselectasingleoptionfromagroup.Hereisits[documentation](https://my-site.com/documentation).\n\nUseitlikethis:\n```html\n<radio-button value="1" disabled>Your label</radio-button>\n```**/

Slot Documentation

Slot information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting slotDocs to false in the config.

slot section of autocomplete popup from vs code

Event Documentation

Event information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting eventDocs to false in the config.

events section of autocomplete popup from vs code

Method Documentation

Methods will display if they are public and have a description. This section can be hidden by setting methodDocs to false in the config.

CSS Documentation

Component-specific CSS Properties and CSS Parts are included in the component documentation. These can be hidden using the cssPropertiesDocs and cssPartsDocs configuration options respectively.

css properties and css parts sections of autocomplete popup from vs code

Documentation Labels

There may be instances where you may want to translate or override the default section headers. Using the labels configuration you can change one or all of the headers for the component description sections.

// custom-elements-manifest.config.jsexportdefault{plugins: [generateCustomData({
...
/** Overrides the default section labels in the component description */labels: {slots: "Placeholders",events: "事件",cssProperties: "Propiedades CSS",cssParts: "Style Hooks",methods: "Actions"},}),],};

CSS Custom Data

Adding the CSS Custom Data file to your config provides you with autocomplete for your component's CSS custom properties.

These values can be added in your component's jsDoc. The var() wrapper will be added automatically if they are prefixed with --.

/** * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the border radius of the component *  */

CSS Sets

You can define reusable CSS values to simplify your efforts and provide greater consistency from one component to another.

First, define your sets in the config. Values can be an object array with a name and optional description or they can be a simple string array.

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},{name: "spacing",values: ['2px','4px','8px','12px','16px'],},],}),],};

Once they are defined, you can reference them in your components jsDoc by prefixing it with set: and providing the name of the set.

/** * * @cssprop {set:radiuses} --border-radius - Controls the border radius of the component *  */

css custom property autocomplete from vs code

CSS Parts

Developers will also receive autocomplete for defined CSS parts.

/** * * @csspart radio-label - Applies custom styles the radio group label *  */

css custom property autocomplete from vs code

About

A custom elements manifest analyzer plugin to generate a custom data file for VS Code.

Resources

Stars

19 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - break-stuff/cem-plugin-vs-code-custom-data-generator: A custom elements manifest analyzer plugin to generate a custom data file for VS Code. · GitHub
Skip to content
This repository was archived by the owner on Oct 20, 2023. It is now read-only.

Repository files navigation

cem-plugin-vs-code-custom-data-generator

This project has been moved to the Custom Element VS Code Integration project.

This is a plugin automatically generates a custom data config file for VS Code using the Custom Element Manifest Analyzer.

This config enables VS Code to display autocomplete and contextual information about your custom elements.

demo of autocomplete features for custom elements in vs code

Usage

Pre-installation

Ensure the following steps have been taken in your component library prior to using this plugin:

Install

npm i -D cem-plugin-vs-code-custom-data-generator

Import

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData()],};

Implementation

If you don't have it already, add a VS Code settings folder and file at the root of your project - .vscode/settings.json. Then add or append the following code:

{
"html.customData": [
"./vscode.html-custom-data.json"
],
"css.customData": [
"./vscode.css-custom-data.json"
]
}

If this is included in your npm package, the VS Code configuration will look something like this:

{
"html.customData": [
"./node_modules/my-component-library/vscode.html-custom-data.json"
],
"css.customData": [
"./node_modules/my-component-library/vscode.css-custom-data.json"
]
}

Note: The path is relative to the root of the project, not the settings file.

Once it has been added, you will need to restart VS Code in order for it to register the new components. After it has been restarted, you should see autocomplete information for your custom elements!

Configuration

The configuration has the following optional parameters:

{/** Path to output directory */outdir?: string;/** Name of the file with you component's custom HTML data */
htmlFileName?: string|null;/** Name of the file with you component's custom CSS data */
cssFileName?: string|null;/** Class names of any components you would like to exclude from the custom data */
exclude?: string[];/** The property name from the component object constructed by the CEM Analyzer */
descriptionSrc?: "description"|"summary"|string;/** Displays the slot section of the element description */
slotDocs?: boolean;/** Displays the event section of the element description */
eventDocs?: boolean;/** Displays the CSS custom properties section of the element description */
cssPropertiesDocs?: boolean;/** Displays the CSS parts section of the element description */
cssPartsDocs?: boolean;/** Overrides the default section labels in the component description *//** Displays the methods section of the element description */
methodDocs?: boolean;
labels?: {slots?: string;
events?: string;
cssProperties?: string;
cssParts?: string;
methods?: string;};/** Creates reusable CSS values for consistency in components */
cssSets?: CssSet[];}
// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({/** Output directory to write the React wrappers to - default is the root of the project */outdir: 'dist',/** Name of the file with you component's custom HTML data */htmlFileName: 'my-library.html-custom-data.json',/** Name of the file with you component's custom CSS data */cssFileName: 'my-library.css-custom-data.json',/** class names of any components you would like to exclude from the custom data */exclude: ['MyInternalElement'],/** The property name from the component object constructed by the CEM Analyzer */descriptionSrc: "description",/** Displays the slot section of the element description */slotDocs: true,/** Displays the event section of the element description */eventDocs: true,/** Displays the CSS custom properties section of the element description */cssPropertiesDocs: true,/** Displays the CSS parts section of the element description */cssPartsDocs: true,/** Displays the methods section of the element description */methodDocs: true,/** Overrides the default section labels in the component description */labels: {slots: "Slot Section",events: "Custom Events",cssProperties: "CSS Variables",cssParts: "Style Hooks",methods: "Functions"},/** Creates reusable CSS values for consistency in components */cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},],}),],};

Example

Here is a basic example of a component configuration using jsDoc:

/** * * Radio groups are used to group multiple radio buttons so they function as a single form control. * * Here is the [documentation](https://my-site.com/docs.md). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * * @tag radio-group * @tagname radio-group * * @attr {boolean} disabled - Disables the element * @attribute {string} value - The value of the selected radio * @attribute {1,2,3,4} size - This will control the size of radio buttons * * @csspart bar - Styles the color of bar * * @slot - add radio buttons to the `default` slot to create options to your radio group * @slot label - placeholder for the radio group label * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the color of foo * @cssproperty [--background-color=red] - Controls the color of bar * * @prop {boolean} prop1 - this toggles some unseen feature * @property {number} prop2 - this will adjust the width of the unit * * @fires custom-event - some description for custom-event * @fires {Event} typed-event - some description for typed-event * @event {CustomEvent} typed-custom-event - some description for typed-custom-event * * @reference Documentation - https://my-site.com/docs * @reference MDN - https://developer.mozilla.org/en-US/ * */classRadioGroupextendsHTMLElement{}

Omitting File Output

If you would like to exclude the HTML or CSS output, you can do so by setting the htmlFileName or cssFileName properties to null.

Tag Mapping

an example of the jsDoc tags used to create the custom data file

TagDescription
@summary / descriptionThis provides the description for the custom element when autocomplete is used or the element is hovered. If no summary is provided, it will fall back to the description if it is available.
@attr / @attributeThis will provide descriptions for each attribute. If you use union types in TypeScript or in the description, these will display as autocomplete options. Values can also be defined in the jsDoc using comma or pipe delimited values
@referenceThis is a custom tag for this plugin. It creates reference links at the bottom of the information bubble. Multiple references are supported.

The @summary and @attr / @attribute descriptions have limited markdown support and enable you to style text, create links, and add code snippets.

Descriptions

Using the descriptionSrc configuration, you can determine the source of the text that gets displayed in the editor autocomplete bubble. This is useful if you want to provide alternate descriptions for your React users.

If no value is provided, the plugin will use the summary property and then fall back to the description property if a summary is not available.

description section of autocomplete popup from vs code

Note:Descriptions support multiple lines by breaking the comment up into multiple lines whereas summaries do not and will need to be manually added using \n.

// description example/** * * Radio groups are used to group multiple radios or radio buttons so they function as a single form control. Here is its [documentation](https://my-docsite.com). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * */
// summary example/**** @summaryRadiosbuttonsallowuserstoselectasingleoptionfromagroup.Hereisits[documentation](https://my-site.com/documentation).\n\nUseitlikethis:\n```html\n<radio-button value="1" disabled>Your label</radio-button>\n```**/

Slot Documentation

Slot information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting slotDocs to false in the config.

slot section of autocomplete popup from vs code

Event Documentation

Event information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting eventDocs to false in the config.

events section of autocomplete popup from vs code

Method Documentation

Methods will display if they are public and have a description. This section can be hidden by setting methodDocs to false in the config.

CSS Documentation

Component-specific CSS Properties and CSS Parts are included in the component documentation. These can be hidden using the cssPropertiesDocs and cssPartsDocs configuration options respectively.

css properties and css parts sections of autocomplete popup from vs code

Documentation Labels

There may be instances where you may want to translate or override the default section headers. Using the labels configuration you can change one or all of the headers for the component description sections.

// custom-elements-manifest.config.jsexportdefault{plugins: [generateCustomData({
...
/** Overrides the default section labels in the component description */labels: {slots: "Placeholders",events: "事件",cssProperties: "Propiedades CSS",cssParts: "Style Hooks",methods: "Actions"},}),],};

CSS Custom Data

Adding the CSS Custom Data file to your config provides you with autocomplete for your component's CSS custom properties.

These values can be added in your component's jsDoc. The var() wrapper will be added automatically if they are prefixed with --.

/** * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the border radius of the component *  */

CSS Sets

You can define reusable CSS values to simplify your efforts and provide greater consistency from one component to another.

First, define your sets in the config. Values can be an object array with a name and optional description or they can be a simple string array.

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},{name: "spacing",values: ['2px','4px','8px','12px','16px'],},],}),],};

Once they are defined, you can reference them in your components jsDoc by prefixing it with set: and providing the name of the set.

/** * * @cssprop {set:radiuses} --border-radius - Controls the border radius of the component *  */

css custom property autocomplete from vs code

CSS Parts

Developers will also receive autocomplete for defined CSS parts.

/** * * @csspart radio-label - Applies custom styles the radio group label *  */

css custom property autocomplete from vs code

About

A custom elements manifest analyzer plugin to generate a custom data file for VS Code.

Resources

Stars

19 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - break-stuff/cem-plugin-vs-code-custom-data-generator: A custom elements manifest analyzer plugin to generate a custom data file for VS Code. · GitHub
Skip to content
This repository was archived by the owner on Oct 20, 2023. It is now read-only.

Repository files navigation

cem-plugin-vs-code-custom-data-generator

This project has been moved to the Custom Element VS Code Integration project.

This is a plugin automatically generates a custom data config file for VS Code using the Custom Element Manifest Analyzer.

This config enables VS Code to display autocomplete and contextual information about your custom elements.

demo of autocomplete features for custom elements in vs code

Usage

Pre-installation

Ensure the following steps have been taken in your component library prior to using this plugin:

Install

npm i -D cem-plugin-vs-code-custom-data-generator

Import

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData()],};

Implementation

If you don't have it already, add a VS Code settings folder and file at the root of your project - .vscode/settings.json. Then add or append the following code:

{
"html.customData": [
"./vscode.html-custom-data.json"
],
"css.customData": [
"./vscode.css-custom-data.json"
]
}

If this is included in your npm package, the VS Code configuration will look something like this:

{
"html.customData": [
"./node_modules/my-component-library/vscode.html-custom-data.json"
],
"css.customData": [
"./node_modules/my-component-library/vscode.css-custom-data.json"
]
}

Note: The path is relative to the root of the project, not the settings file.

Once it has been added, you will need to restart VS Code in order for it to register the new components. After it has been restarted, you should see autocomplete information for your custom elements!

Configuration

The configuration has the following optional parameters:

{/** Path to output directory */outdir?: string;/** Name of the file with you component's custom HTML data */
htmlFileName?: string|null;/** Name of the file with you component's custom CSS data */
cssFileName?: string|null;/** Class names of any components you would like to exclude from the custom data */
exclude?: string[];/** The property name from the component object constructed by the CEM Analyzer */
descriptionSrc?: "description"|"summary"|string;/** Displays the slot section of the element description */
slotDocs?: boolean;/** Displays the event section of the element description */
eventDocs?: boolean;/** Displays the CSS custom properties section of the element description */
cssPropertiesDocs?: boolean;/** Displays the CSS parts section of the element description */
cssPartsDocs?: boolean;/** Overrides the default section labels in the component description *//** Displays the methods section of the element description */
methodDocs?: boolean;
labels?: {slots?: string;
events?: string;
cssProperties?: string;
cssParts?: string;
methods?: string;};/** Creates reusable CSS values for consistency in components */
cssSets?: CssSet[];}
// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({/** Output directory to write the React wrappers to - default is the root of the project */outdir: 'dist',/** Name of the file with you component's custom HTML data */htmlFileName: 'my-library.html-custom-data.json',/** Name of the file with you component's custom CSS data */cssFileName: 'my-library.css-custom-data.json',/** class names of any components you would like to exclude from the custom data */exclude: ['MyInternalElement'],/** The property name from the component object constructed by the CEM Analyzer */descriptionSrc: "description",/** Displays the slot section of the element description */slotDocs: true,/** Displays the event section of the element description */eventDocs: true,/** Displays the CSS custom properties section of the element description */cssPropertiesDocs: true,/** Displays the CSS parts section of the element description */cssPartsDocs: true,/** Displays the methods section of the element description */methodDocs: true,/** Overrides the default section labels in the component description */labels: {slots: "Slot Section",events: "Custom Events",cssProperties: "CSS Variables",cssParts: "Style Hooks",methods: "Functions"},/** Creates reusable CSS values for consistency in components */cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},],}),],};

Example

Here is a basic example of a component configuration using jsDoc:

/** * * Radio groups are used to group multiple radio buttons so they function as a single form control. * * Here is the [documentation](https://my-site.com/docs.md). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * * @tag radio-group * @tagname radio-group * * @attr {boolean} disabled - Disables the element * @attribute {string} value - The value of the selected radio * @attribute {1,2,3,4} size - This will control the size of radio buttons * * @csspart bar - Styles the color of bar * * @slot - add radio buttons to the `default` slot to create options to your radio group * @slot label - placeholder for the radio group label * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the color of foo * @cssproperty [--background-color=red] - Controls the color of bar * * @prop {boolean} prop1 - this toggles some unseen feature * @property {number} prop2 - this will adjust the width of the unit * * @fires custom-event - some description for custom-event * @fires {Event} typed-event - some description for typed-event * @event {CustomEvent} typed-custom-event - some description for typed-custom-event * * @reference Documentation - https://my-site.com/docs * @reference MDN - https://developer.mozilla.org/en-US/ * */classRadioGroupextendsHTMLElement{}

Omitting File Output

If you would like to exclude the HTML or CSS output, you can do so by setting the htmlFileName or cssFileName properties to null.

Tag Mapping

an example of the jsDoc tags used to create the custom data file

TagDescription
@summary / descriptionThis provides the description for the custom element when autocomplete is used or the element is hovered. If no summary is provided, it will fall back to the description if it is available.
@attr / @attributeThis will provide descriptions for each attribute. If you use union types in TypeScript or in the description, these will display as autocomplete options. Values can also be defined in the jsDoc using comma or pipe delimited values
@referenceThis is a custom tag for this plugin. It creates reference links at the bottom of the information bubble. Multiple references are supported.

The @summary and @attr / @attribute descriptions have limited markdown support and enable you to style text, create links, and add code snippets.

Descriptions

Using the descriptionSrc configuration, you can determine the source of the text that gets displayed in the editor autocomplete bubble. This is useful if you want to provide alternate descriptions for your React users.

If no value is provided, the plugin will use the summary property and then fall back to the description property if a summary is not available.

description section of autocomplete popup from vs code

Note:Descriptions support multiple lines by breaking the comment up into multiple lines whereas summaries do not and will need to be manually added using \n.

// description example/** * * Radio groups are used to group multiple radios or radio buttons so they function as a single form control. Here is its [documentation](https://my-docsite.com). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * */
// summary example/**** @summaryRadiosbuttonsallowuserstoselectasingleoptionfromagroup.Hereisits[documentation](https://my-site.com/documentation).\n\nUseitlikethis:\n```html\n<radio-button value="1" disabled>Your label</radio-button>\n```**/

Slot Documentation

Slot information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting slotDocs to false in the config.

slot section of autocomplete popup from vs code

Event Documentation

Event information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting eventDocs to false in the config.

events section of autocomplete popup from vs code

Method Documentation

Methods will display if they are public and have a description. This section can be hidden by setting methodDocs to false in the config.

CSS Documentation

Component-specific CSS Properties and CSS Parts are included in the component documentation. These can be hidden using the cssPropertiesDocs and cssPartsDocs configuration options respectively.

css properties and css parts sections of autocomplete popup from vs code

Documentation Labels

There may be instances where you may want to translate or override the default section headers. Using the labels configuration you can change one or all of the headers for the component description sections.

// custom-elements-manifest.config.jsexportdefault{plugins: [generateCustomData({
...
/** Overrides the default section labels in the component description */labels: {slots: "Placeholders",events: "事件",cssProperties: "Propiedades CSS",cssParts: "Style Hooks",methods: "Actions"},}),],};

CSS Custom Data

Adding the CSS Custom Data file to your config provides you with autocomplete for your component's CSS custom properties.

These values can be added in your component's jsDoc. The var() wrapper will be added automatically if they are prefixed with --.

/** * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the border radius of the component *  */

CSS Sets

You can define reusable CSS values to simplify your efforts and provide greater consistency from one component to another.

First, define your sets in the config. Values can be an object array with a name and optional description or they can be a simple string array.

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},{name: "spacing",values: ['2px','4px','8px','12px','16px'],},],}),],};

Once they are defined, you can reference them in your components jsDoc by prefixing it with set: and providing the name of the set.

/** * * @cssprop {set:radiuses} --border-radius - Controls the border radius of the component *  */

css custom property autocomplete from vs code

CSS Parts

Developers will also receive autocomplete for defined CSS parts.

/** * * @csspart radio-label - Applies custom styles the radio group label *  */

css custom property autocomplete from vs code

About

A custom elements manifest analyzer plugin to generate a custom data file for VS Code.

Resources

Stars

19 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - break-stuff/cem-plugin-vs-code-custom-data-generator: A custom elements manifest analyzer plugin to generate a custom data file for VS Code. · GitHub
Skip to content
This repository was archived by the owner on Oct 20, 2023. It is now read-only.

Repository files navigation

cem-plugin-vs-code-custom-data-generator

This project has been moved to the Custom Element VS Code Integration project.

This is a plugin automatically generates a custom data config file for VS Code using the Custom Element Manifest Analyzer.

This config enables VS Code to display autocomplete and contextual information about your custom elements.

demo of autocomplete features for custom elements in vs code

Usage

Pre-installation

Ensure the following steps have been taken in your component library prior to using this plugin:

Install

npm i -D cem-plugin-vs-code-custom-data-generator

Import

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData()],};

Implementation

If you don't have it already, add a VS Code settings folder and file at the root of your project - .vscode/settings.json. Then add or append the following code:

{
"html.customData": [
"./vscode.html-custom-data.json"
],
"css.customData": [
"./vscode.css-custom-data.json"
]
}

If this is included in your npm package, the VS Code configuration will look something like this:

{
"html.customData": [
"./node_modules/my-component-library/vscode.html-custom-data.json"
],
"css.customData": [
"./node_modules/my-component-library/vscode.css-custom-data.json"
]
}

Note: The path is relative to the root of the project, not the settings file.

Once it has been added, you will need to restart VS Code in order for it to register the new components. After it has been restarted, you should see autocomplete information for your custom elements!

Configuration

The configuration has the following optional parameters:

{/** Path to output directory */outdir?: string;/** Name of the file with you component's custom HTML data */
htmlFileName?: string|null;/** Name of the file with you component's custom CSS data */
cssFileName?: string|null;/** Class names of any components you would like to exclude from the custom data */
exclude?: string[];/** The property name from the component object constructed by the CEM Analyzer */
descriptionSrc?: "description"|"summary"|string;/** Displays the slot section of the element description */
slotDocs?: boolean;/** Displays the event section of the element description */
eventDocs?: boolean;/** Displays the CSS custom properties section of the element description */
cssPropertiesDocs?: boolean;/** Displays the CSS parts section of the element description */
cssPartsDocs?: boolean;/** Overrides the default section labels in the component description *//** Displays the methods section of the element description */
methodDocs?: boolean;
labels?: {slots?: string;
events?: string;
cssProperties?: string;
cssParts?: string;
methods?: string;};/** Creates reusable CSS values for consistency in components */
cssSets?: CssSet[];}
// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({/** Output directory to write the React wrappers to - default is the root of the project */outdir: 'dist',/** Name of the file with you component's custom HTML data */htmlFileName: 'my-library.html-custom-data.json',/** Name of the file with you component's custom CSS data */cssFileName: 'my-library.css-custom-data.json',/** class names of any components you would like to exclude from the custom data */exclude: ['MyInternalElement'],/** The property name from the component object constructed by the CEM Analyzer */descriptionSrc: "description",/** Displays the slot section of the element description */slotDocs: true,/** Displays the event section of the element description */eventDocs: true,/** Displays the CSS custom properties section of the element description */cssPropertiesDocs: true,/** Displays the CSS parts section of the element description */cssPartsDocs: true,/** Displays the methods section of the element description */methodDocs: true,/** Overrides the default section labels in the component description */labels: {slots: "Slot Section",events: "Custom Events",cssProperties: "CSS Variables",cssParts: "Style Hooks",methods: "Functions"},/** Creates reusable CSS values for consistency in components */cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},],}),],};

Example

Here is a basic example of a component configuration using jsDoc:

/** * * Radio groups are used to group multiple radio buttons so they function as a single form control. * * Here is the [documentation](https://my-site.com/docs.md). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * * @tag radio-group * @tagname radio-group * * @attr {boolean} disabled - Disables the element * @attribute {string} value - The value of the selected radio * @attribute {1,2,3,4} size - This will control the size of radio buttons * * @csspart bar - Styles the color of bar * * @slot - add radio buttons to the `default` slot to create options to your radio group * @slot label - placeholder for the radio group label * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the color of foo * @cssproperty [--background-color=red] - Controls the color of bar * * @prop {boolean} prop1 - this toggles some unseen feature * @property {number} prop2 - this will adjust the width of the unit * * @fires custom-event - some description for custom-event * @fires {Event} typed-event - some description for typed-event * @event {CustomEvent} typed-custom-event - some description for typed-custom-event * * @reference Documentation - https://my-site.com/docs * @reference MDN - https://developer.mozilla.org/en-US/ * */classRadioGroupextendsHTMLElement{}

Omitting File Output

If you would like to exclude the HTML or CSS output, you can do so by setting the htmlFileName or cssFileName properties to null.

Tag Mapping

an example of the jsDoc tags used to create the custom data file

TagDescription
@summary / descriptionThis provides the description for the custom element when autocomplete is used or the element is hovered. If no summary is provided, it will fall back to the description if it is available.
@attr / @attributeThis will provide descriptions for each attribute. If you use union types in TypeScript or in the description, these will display as autocomplete options. Values can also be defined in the jsDoc using comma or pipe delimited values
@referenceThis is a custom tag for this plugin. It creates reference links at the bottom of the information bubble. Multiple references are supported.

The @summary and @attr / @attribute descriptions have limited markdown support and enable you to style text, create links, and add code snippets.

Descriptions

Using the descriptionSrc configuration, you can determine the source of the text that gets displayed in the editor autocomplete bubble. This is useful if you want to provide alternate descriptions for your React users.

If no value is provided, the plugin will use the summary property and then fall back to the description property if a summary is not available.

description section of autocomplete popup from vs code

Note:Descriptions support multiple lines by breaking the comment up into multiple lines whereas summaries do not and will need to be manually added using \n.

// description example/** * * Radio groups are used to group multiple radios or radio buttons so they function as a single form control. Here is its [documentation](https://my-docsite.com). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * */
// summary example/**** @summaryRadiosbuttonsallowuserstoselectasingleoptionfromagroup.Hereisits[documentation](https://my-site.com/documentation).\n\nUseitlikethis:\n```html\n<radio-button value="1" disabled>Your label</radio-button>\n```**/

Slot Documentation

Slot information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting slotDocs to false in the config.

slot section of autocomplete popup from vs code

Event Documentation

Event information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting eventDocs to false in the config.

events section of autocomplete popup from vs code

Method Documentation

Methods will display if they are public and have a description. This section can be hidden by setting methodDocs to false in the config.

CSS Documentation

Component-specific CSS Properties and CSS Parts are included in the component documentation. These can be hidden using the cssPropertiesDocs and cssPartsDocs configuration options respectively.

css properties and css parts sections of autocomplete popup from vs code

Documentation Labels

There may be instances where you may want to translate or override the default section headers. Using the labels configuration you can change one or all of the headers for the component description sections.

// custom-elements-manifest.config.jsexportdefault{plugins: [generateCustomData({
...
/** Overrides the default section labels in the component description */labels: {slots: "Placeholders",events: "事件",cssProperties: "Propiedades CSS",cssParts: "Style Hooks",methods: "Actions"},}),],};

CSS Custom Data

Adding the CSS Custom Data file to your config provides you with autocomplete for your component's CSS custom properties.

These values can be added in your component's jsDoc. The var() wrapper will be added automatically if they are prefixed with --.

/** * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the border radius of the component *  */

CSS Sets

You can define reusable CSS values to simplify your efforts and provide greater consistency from one component to another.

First, define your sets in the config. Values can be an object array with a name and optional description or they can be a simple string array.

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},{name: "spacing",values: ['2px','4px','8px','12px','16px'],},],}),],};

Once they are defined, you can reference them in your components jsDoc by prefixing it with set: and providing the name of the set.

/** * * @cssprop {set:radiuses} --border-radius - Controls the border radius of the component *  */

css custom property autocomplete from vs code

CSS Parts

Developers will also receive autocomplete for defined CSS parts.

/** * * @csspart radio-label - Applies custom styles the radio group label *  */

css custom property autocomplete from vs code

About

A custom elements manifest analyzer plugin to generate a custom data file for VS Code.

Resources

Stars

19 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - break-stuff/cem-plugin-vs-code-custom-data-generator: A custom elements manifest analyzer plugin to generate a custom data file for VS Code. · GitHub
Skip to content
This repository was archived by the owner on Oct 20, 2023. It is now read-only.

Repository files navigation

cem-plugin-vs-code-custom-data-generator

This project has been moved to the Custom Element VS Code Integration project.

This is a plugin automatically generates a custom data config file for VS Code using the Custom Element Manifest Analyzer.

This config enables VS Code to display autocomplete and contextual information about your custom elements.

demo of autocomplete features for custom elements in vs code

Usage

Pre-installation

Ensure the following steps have been taken in your component library prior to using this plugin:

Install

npm i -D cem-plugin-vs-code-custom-data-generator

Import

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData()],};

Implementation

If you don't have it already, add a VS Code settings folder and file at the root of your project - .vscode/settings.json. Then add or append the following code:

{
"html.customData": [
"./vscode.html-custom-data.json"
],
"css.customData": [
"./vscode.css-custom-data.json"
]
}

If this is included in your npm package, the VS Code configuration will look something like this:

{
"html.customData": [
"./node_modules/my-component-library/vscode.html-custom-data.json"
],
"css.customData": [
"./node_modules/my-component-library/vscode.css-custom-data.json"
]
}

Note: The path is relative to the root of the project, not the settings file.

Once it has been added, you will need to restart VS Code in order for it to register the new components. After it has been restarted, you should see autocomplete information for your custom elements!

Configuration

The configuration has the following optional parameters:

{/** Path to output directory */outdir?: string;/** Name of the file with you component's custom HTML data */
htmlFileName?: string|null;/** Name of the file with you component's custom CSS data */
cssFileName?: string|null;/** Class names of any components you would like to exclude from the custom data */
exclude?: string[];/** The property name from the component object constructed by the CEM Analyzer */
descriptionSrc?: "description"|"summary"|string;/** Displays the slot section of the element description */
slotDocs?: boolean;/** Displays the event section of the element description */
eventDocs?: boolean;/** Displays the CSS custom properties section of the element description */
cssPropertiesDocs?: boolean;/** Displays the CSS parts section of the element description */
cssPartsDocs?: boolean;/** Overrides the default section labels in the component description *//** Displays the methods section of the element description */
methodDocs?: boolean;
labels?: {slots?: string;
events?: string;
cssProperties?: string;
cssParts?: string;
methods?: string;};/** Creates reusable CSS values for consistency in components */
cssSets?: CssSet[];}
// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({/** Output directory to write the React wrappers to - default is the root of the project */outdir: 'dist',/** Name of the file with you component's custom HTML data */htmlFileName: 'my-library.html-custom-data.json',/** Name of the file with you component's custom CSS data */cssFileName: 'my-library.css-custom-data.json',/** class names of any components you would like to exclude from the custom data */exclude: ['MyInternalElement'],/** The property name from the component object constructed by the CEM Analyzer */descriptionSrc: "description",/** Displays the slot section of the element description */slotDocs: true,/** Displays the event section of the element description */eventDocs: true,/** Displays the CSS custom properties section of the element description */cssPropertiesDocs: true,/** Displays the CSS parts section of the element description */cssPartsDocs: true,/** Displays the methods section of the element description */methodDocs: true,/** Overrides the default section labels in the component description */labels: {slots: "Slot Section",events: "Custom Events",cssProperties: "CSS Variables",cssParts: "Style Hooks",methods: "Functions"},/** Creates reusable CSS values for consistency in components */cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},],}),],};

Example

Here is a basic example of a component configuration using jsDoc:

/** * * Radio groups are used to group multiple radio buttons so they function as a single form control. * * Here is the [documentation](https://my-site.com/docs.md). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * * @tag radio-group * @tagname radio-group * * @attr {boolean} disabled - Disables the element * @attribute {string} value - The value of the selected radio * @attribute {1,2,3,4} size - This will control the size of radio buttons * * @csspart bar - Styles the color of bar * * @slot - add radio buttons to the `default` slot to create options to your radio group * @slot label - placeholder for the radio group label * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the color of foo * @cssproperty [--background-color=red] - Controls the color of bar * * @prop {boolean} prop1 - this toggles some unseen feature * @property {number} prop2 - this will adjust the width of the unit * * @fires custom-event - some description for custom-event * @fires {Event} typed-event - some description for typed-event * @event {CustomEvent} typed-custom-event - some description for typed-custom-event * * @reference Documentation - https://my-site.com/docs * @reference MDN - https://developer.mozilla.org/en-US/ * */classRadioGroupextendsHTMLElement{}

Omitting File Output

If you would like to exclude the HTML or CSS output, you can do so by setting the htmlFileName or cssFileName properties to null.

Tag Mapping

an example of the jsDoc tags used to create the custom data file

TagDescription
@summary / descriptionThis provides the description for the custom element when autocomplete is used or the element is hovered. If no summary is provided, it will fall back to the description if it is available.
@attr / @attributeThis will provide descriptions for each attribute. If you use union types in TypeScript or in the description, these will display as autocomplete options. Values can also be defined in the jsDoc using comma or pipe delimited values
@referenceThis is a custom tag for this plugin. It creates reference links at the bottom of the information bubble. Multiple references are supported.

The @summary and @attr / @attribute descriptions have limited markdown support and enable you to style text, create links, and add code snippets.

Descriptions

Using the descriptionSrc configuration, you can determine the source of the text that gets displayed in the editor autocomplete bubble. This is useful if you want to provide alternate descriptions for your React users.

If no value is provided, the plugin will use the summary property and then fall back to the description property if a summary is not available.

description section of autocomplete popup from vs code

Note:Descriptions support multiple lines by breaking the comment up into multiple lines whereas summaries do not and will need to be manually added using \n.

// description example/** * * Radio groups are used to group multiple radios or radio buttons so they function as a single form control. Here is its [documentation](https://my-docsite.com). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * */
// summary example/**** @summaryRadiosbuttonsallowuserstoselectasingleoptionfromagroup.Hereisits[documentation](https://my-site.com/documentation).\n\nUseitlikethis:\n```html\n<radio-button value="1" disabled>Your label</radio-button>\n```**/

Slot Documentation

Slot information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting slotDocs to false in the config.

slot section of autocomplete popup from vs code

Event Documentation

Event information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting eventDocs to false in the config.

events section of autocomplete popup from vs code

Method Documentation

Methods will display if they are public and have a description. This section can be hidden by setting methodDocs to false in the config.

CSS Documentation

Component-specific CSS Properties and CSS Parts are included in the component documentation. These can be hidden using the cssPropertiesDocs and cssPartsDocs configuration options respectively.

css properties and css parts sections of autocomplete popup from vs code

Documentation Labels

There may be instances where you may want to translate or override the default section headers. Using the labels configuration you can change one or all of the headers for the component description sections.

// custom-elements-manifest.config.jsexportdefault{plugins: [generateCustomData({
...
/** Overrides the default section labels in the component description */labels: {slots: "Placeholders",events: "事件",cssProperties: "Propiedades CSS",cssParts: "Style Hooks",methods: "Actions"},}),],};

CSS Custom Data

Adding the CSS Custom Data file to your config provides you with autocomplete for your component's CSS custom properties.

These values can be added in your component's jsDoc. The var() wrapper will be added automatically if they are prefixed with --.

/** * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the border radius of the component *  */

CSS Sets

You can define reusable CSS values to simplify your efforts and provide greater consistency from one component to another.

First, define your sets in the config. Values can be an object array with a name and optional description or they can be a simple string array.

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},{name: "spacing",values: ['2px','4px','8px','12px','16px'],},],}),],};

Once they are defined, you can reference them in your components jsDoc by prefixing it with set: and providing the name of the set.

/** * * @cssprop {set:radiuses} --border-radius - Controls the border radius of the component *  */

css custom property autocomplete from vs code

CSS Parts

Developers will also receive autocomplete for defined CSS parts.

/** * * @csspart radio-label - Applies custom styles the radio group label *  */

css custom property autocomplete from vs code

About

A custom elements manifest analyzer plugin to generate a custom data file for VS Code.

Resources

Stars

19 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - break-stuff/cem-plugin-vs-code-custom-data-generator: A custom elements manifest analyzer plugin to generate a custom data file for VS Code. · GitHub
Skip to content
This repository was archived by the owner on Oct 20, 2023. It is now read-only.

Repository files navigation

cem-plugin-vs-code-custom-data-generator

This project has been moved to the Custom Element VS Code Integration project.

This is a plugin automatically generates a custom data config file for VS Code using the Custom Element Manifest Analyzer.

This config enables VS Code to display autocomplete and contextual information about your custom elements.

demo of autocomplete features for custom elements in vs code

Usage

Pre-installation

Ensure the following steps have been taken in your component library prior to using this plugin:

Install

npm i -D cem-plugin-vs-code-custom-data-generator

Import

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData()],};

Implementation

If you don't have it already, add a VS Code settings folder and file at the root of your project - .vscode/settings.json. Then add or append the following code:

{
"html.customData": [
"./vscode.html-custom-data.json"
],
"css.customData": [
"./vscode.css-custom-data.json"
]
}

If this is included in your npm package, the VS Code configuration will look something like this:

{
"html.customData": [
"./node_modules/my-component-library/vscode.html-custom-data.json"
],
"css.customData": [
"./node_modules/my-component-library/vscode.css-custom-data.json"
]
}

Note: The path is relative to the root of the project, not the settings file.

Once it has been added, you will need to restart VS Code in order for it to register the new components. After it has been restarted, you should see autocomplete information for your custom elements!

Configuration

The configuration has the following optional parameters:

{/** Path to output directory */outdir?: string;/** Name of the file with you component's custom HTML data */
htmlFileName?: string|null;/** Name of the file with you component's custom CSS data */
cssFileName?: string|null;/** Class names of any components you would like to exclude from the custom data */
exclude?: string[];/** The property name from the component object constructed by the CEM Analyzer */
descriptionSrc?: "description"|"summary"|string;/** Displays the slot section of the element description */
slotDocs?: boolean;/** Displays the event section of the element description */
eventDocs?: boolean;/** Displays the CSS custom properties section of the element description */
cssPropertiesDocs?: boolean;/** Displays the CSS parts section of the element description */
cssPartsDocs?: boolean;/** Overrides the default section labels in the component description *//** Displays the methods section of the element description */
methodDocs?: boolean;
labels?: {slots?: string;
events?: string;
cssProperties?: string;
cssParts?: string;
methods?: string;};/** Creates reusable CSS values for consistency in components */
cssSets?: CssSet[];}
// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({/** Output directory to write the React wrappers to - default is the root of the project */outdir: 'dist',/** Name of the file with you component's custom HTML data */htmlFileName: 'my-library.html-custom-data.json',/** Name of the file with you component's custom CSS data */cssFileName: 'my-library.css-custom-data.json',/** class names of any components you would like to exclude from the custom data */exclude: ['MyInternalElement'],/** The property name from the component object constructed by the CEM Analyzer */descriptionSrc: "description",/** Displays the slot section of the element description */slotDocs: true,/** Displays the event section of the element description */eventDocs: true,/** Displays the CSS custom properties section of the element description */cssPropertiesDocs: true,/** Displays the CSS parts section of the element description */cssPartsDocs: true,/** Displays the methods section of the element description */methodDocs: true,/** Overrides the default section labels in the component description */labels: {slots: "Slot Section",events: "Custom Events",cssProperties: "CSS Variables",cssParts: "Style Hooks",methods: "Functions"},/** Creates reusable CSS values for consistency in components */cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},],}),],};

Example

Here is a basic example of a component configuration using jsDoc:

/** * * Radio groups are used to group multiple radio buttons so they function as a single form control. * * Here is the [documentation](https://my-site.com/docs.md). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * * @tag radio-group * @tagname radio-group * * @attr {boolean} disabled - Disables the element * @attribute {string} value - The value of the selected radio * @attribute {1,2,3,4} size - This will control the size of radio buttons * * @csspart bar - Styles the color of bar * * @slot - add radio buttons to the `default` slot to create options to your radio group * @slot label - placeholder for the radio group label * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the color of foo * @cssproperty [--background-color=red] - Controls the color of bar * * @prop {boolean} prop1 - this toggles some unseen feature * @property {number} prop2 - this will adjust the width of the unit * * @fires custom-event - some description for custom-event * @fires {Event} typed-event - some description for typed-event * @event {CustomEvent} typed-custom-event - some description for typed-custom-event * * @reference Documentation - https://my-site.com/docs * @reference MDN - https://developer.mozilla.org/en-US/ * */classRadioGroupextendsHTMLElement{}

Omitting File Output

If you would like to exclude the HTML or CSS output, you can do so by setting the htmlFileName or cssFileName properties to null.

Tag Mapping

an example of the jsDoc tags used to create the custom data file

TagDescription
@summary / descriptionThis provides the description for the custom element when autocomplete is used or the element is hovered. If no summary is provided, it will fall back to the description if it is available.
@attr / @attributeThis will provide descriptions for each attribute. If you use union types in TypeScript or in the description, these will display as autocomplete options. Values can also be defined in the jsDoc using comma or pipe delimited values
@referenceThis is a custom tag for this plugin. It creates reference links at the bottom of the information bubble. Multiple references are supported.

The @summary and @attr / @attribute descriptions have limited markdown support and enable you to style text, create links, and add code snippets.

Descriptions

Using the descriptionSrc configuration, you can determine the source of the text that gets displayed in the editor autocomplete bubble. This is useful if you want to provide alternate descriptions for your React users.

If no value is provided, the plugin will use the summary property and then fall back to the description property if a summary is not available.

description section of autocomplete popup from vs code

Note:Descriptions support multiple lines by breaking the comment up into multiple lines whereas summaries do not and will need to be manually added using \n.

// description example/** * * Radio groups are used to group multiple radios or radio buttons so they function as a single form control. Here is its [documentation](https://my-docsite.com). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * */
// summary example/**** @summaryRadiosbuttonsallowuserstoselectasingleoptionfromagroup.Hereisits[documentation](https://my-site.com/documentation).\n\nUseitlikethis:\n```html\n<radio-button value="1" disabled>Your label</radio-button>\n```**/

Slot Documentation

Slot information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting slotDocs to false in the config.

slot section of autocomplete popup from vs code

Event Documentation

Event information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting eventDocs to false in the config.

events section of autocomplete popup from vs code

Method Documentation

Methods will display if they are public and have a description. This section can be hidden by setting methodDocs to false in the config.

CSS Documentation

Component-specific CSS Properties and CSS Parts are included in the component documentation. These can be hidden using the cssPropertiesDocs and cssPartsDocs configuration options respectively.

css properties and css parts sections of autocomplete popup from vs code

Documentation Labels

There may be instances where you may want to translate or override the default section headers. Using the labels configuration you can change one or all of the headers for the component description sections.

// custom-elements-manifest.config.jsexportdefault{plugins: [generateCustomData({
...
/** Overrides the default section labels in the component description */labels: {slots: "Placeholders",events: "事件",cssProperties: "Propiedades CSS",cssParts: "Style Hooks",methods: "Actions"},}),],};

CSS Custom Data

Adding the CSS Custom Data file to your config provides you with autocomplete for your component's CSS custom properties.

These values can be added in your component's jsDoc. The var() wrapper will be added automatically if they are prefixed with --.

/** * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the border radius of the component *  */

CSS Sets

You can define reusable CSS values to simplify your efforts and provide greater consistency from one component to another.

First, define your sets in the config. Values can be an object array with a name and optional description or they can be a simple string array.

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},{name: "spacing",values: ['2px','4px','8px','12px','16px'],},],}),],};

Once they are defined, you can reference them in your components jsDoc by prefixing it with set: and providing the name of the set.

/** * * @cssprop {set:radiuses} --border-radius - Controls the border radius of the component *  */

css custom property autocomplete from vs code

CSS Parts

Developers will also receive autocomplete for defined CSS parts.

/** * * @csspart radio-label - Applies custom styles the radio group label *  */

css custom property autocomplete from vs code

About

A custom elements manifest analyzer plugin to generate a custom data file for VS Code.

Resources

Stars

19 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - break-stuff/cem-plugin-vs-code-custom-data-generator: A custom elements manifest analyzer plugin to generate a custom data file for VS Code. · GitHub
Skip to content
This repository was archived by the owner on Oct 20, 2023. It is now read-only.

Repository files navigation

cem-plugin-vs-code-custom-data-generator

This project has been moved to the Custom Element VS Code Integration project.

This is a plugin automatically generates a custom data config file for VS Code using the Custom Element Manifest Analyzer.

This config enables VS Code to display autocomplete and contextual information about your custom elements.

demo of autocomplete features for custom elements in vs code

Usage

Pre-installation

Ensure the following steps have been taken in your component library prior to using this plugin:

Install

npm i -D cem-plugin-vs-code-custom-data-generator

Import

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData()],};

Implementation

If you don't have it already, add a VS Code settings folder and file at the root of your project - .vscode/settings.json. Then add or append the following code:

{
"html.customData": [
"./vscode.html-custom-data.json"
],
"css.customData": [
"./vscode.css-custom-data.json"
]
}

If this is included in your npm package, the VS Code configuration will look something like this:

{
"html.customData": [
"./node_modules/my-component-library/vscode.html-custom-data.json"
],
"css.customData": [
"./node_modules/my-component-library/vscode.css-custom-data.json"
]
}

Note: The path is relative to the root of the project, not the settings file.

Once it has been added, you will need to restart VS Code in order for it to register the new components. After it has been restarted, you should see autocomplete information for your custom elements!

Configuration

The configuration has the following optional parameters:

{/** Path to output directory */outdir?: string;/** Name of the file with you component's custom HTML data */
htmlFileName?: string|null;/** Name of the file with you component's custom CSS data */
cssFileName?: string|null;/** Class names of any components you would like to exclude from the custom data */
exclude?: string[];/** The property name from the component object constructed by the CEM Analyzer */
descriptionSrc?: "description"|"summary"|string;/** Displays the slot section of the element description */
slotDocs?: boolean;/** Displays the event section of the element description */
eventDocs?: boolean;/** Displays the CSS custom properties section of the element description */
cssPropertiesDocs?: boolean;/** Displays the CSS parts section of the element description */
cssPartsDocs?: boolean;/** Overrides the default section labels in the component description *//** Displays the methods section of the element description */
methodDocs?: boolean;
labels?: {slots?: string;
events?: string;
cssProperties?: string;
cssParts?: string;
methods?: string;};/** Creates reusable CSS values for consistency in components */
cssSets?: CssSet[];}
// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({/** Output directory to write the React wrappers to - default is the root of the project */outdir: 'dist',/** Name of the file with you component's custom HTML data */htmlFileName: 'my-library.html-custom-data.json',/** Name of the file with you component's custom CSS data */cssFileName: 'my-library.css-custom-data.json',/** class names of any components you would like to exclude from the custom data */exclude: ['MyInternalElement'],/** The property name from the component object constructed by the CEM Analyzer */descriptionSrc: "description",/** Displays the slot section of the element description */slotDocs: true,/** Displays the event section of the element description */eventDocs: true,/** Displays the CSS custom properties section of the element description */cssPropertiesDocs: true,/** Displays the CSS parts section of the element description */cssPartsDocs: true,/** Displays the methods section of the element description */methodDocs: true,/** Overrides the default section labels in the component description */labels: {slots: "Slot Section",events: "Custom Events",cssProperties: "CSS Variables",cssParts: "Style Hooks",methods: "Functions"},/** Creates reusable CSS values for consistency in components */cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},],}),],};

Example

Here is a basic example of a component configuration using jsDoc:

/** * * Radio groups are used to group multiple radio buttons so they function as a single form control. * * Here is the [documentation](https://my-site.com/docs.md). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * * @tag radio-group * @tagname radio-group * * @attr {boolean} disabled - Disables the element * @attribute {string} value - The value of the selected radio * @attribute {1,2,3,4} size - This will control the size of radio buttons * * @csspart bar - Styles the color of bar * * @slot - add radio buttons to the `default` slot to create options to your radio group * @slot label - placeholder for the radio group label * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the color of foo * @cssproperty [--background-color=red] - Controls the color of bar * * @prop {boolean} prop1 - this toggles some unseen feature * @property {number} prop2 - this will adjust the width of the unit * * @fires custom-event - some description for custom-event * @fires {Event} typed-event - some description for typed-event * @event {CustomEvent} typed-custom-event - some description for typed-custom-event * * @reference Documentation - https://my-site.com/docs * @reference MDN - https://developer.mozilla.org/en-US/ * */classRadioGroupextendsHTMLElement{}

Omitting File Output

If you would like to exclude the HTML or CSS output, you can do so by setting the htmlFileName or cssFileName properties to null.

Tag Mapping

an example of the jsDoc tags used to create the custom data file

TagDescription
@summary / descriptionThis provides the description for the custom element when autocomplete is used or the element is hovered. If no summary is provided, it will fall back to the description if it is available.
@attr / @attributeThis will provide descriptions for each attribute. If you use union types in TypeScript or in the description, these will display as autocomplete options. Values can also be defined in the jsDoc using comma or pipe delimited values
@referenceThis is a custom tag for this plugin. It creates reference links at the bottom of the information bubble. Multiple references are supported.

The @summary and @attr / @attribute descriptions have limited markdown support and enable you to style text, create links, and add code snippets.

Descriptions

Using the descriptionSrc configuration, you can determine the source of the text that gets displayed in the editor autocomplete bubble. This is useful if you want to provide alternate descriptions for your React users.

If no value is provided, the plugin will use the summary property and then fall back to the description property if a summary is not available.

description section of autocomplete popup from vs code

Note:Descriptions support multiple lines by breaking the comment up into multiple lines whereas summaries do not and will need to be manually added using \n.

// description example/** * * Radio groups are used to group multiple radios or radio buttons so they function as a single form control. Here is its [documentation](https://my-docsite.com). * * Use it like this: * ```html * <radio-group value="2" size="3"> * <span slot="label">My Label</span> * <radio-button value="1">Option 1</radio-button> * <radio-button value="2">Option 2</radio-button> * <radio-button value="3">Option 3</radio-button> * </radio-group> * ``` * */
// summary example/**** @summaryRadiosbuttonsallowuserstoselectasingleoptionfromagroup.Hereisits[documentation](https://my-site.com/documentation).\n\nUseitlikethis:\n```html\n<radio-button value="1" disabled>Your label</radio-button>\n```**/

Slot Documentation

Slot information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting slotDocs to false in the config.

slot section of autocomplete popup from vs code

Event Documentation

Event information will display with the element description during autocompletion or when hovered over. This section can be hidden by setting eventDocs to false in the config.

events section of autocomplete popup from vs code

Method Documentation

Methods will display if they are public and have a description. This section can be hidden by setting methodDocs to false in the config.

CSS Documentation

Component-specific CSS Properties and CSS Parts are included in the component documentation. These can be hidden using the cssPropertiesDocs and cssPartsDocs configuration options respectively.

css properties and css parts sections of autocomplete popup from vs code

Documentation Labels

There may be instances where you may want to translate or override the default section headers. Using the labels configuration you can change one or all of the headers for the component description sections.

// custom-elements-manifest.config.jsexportdefault{plugins: [generateCustomData({
...
/** Overrides the default section labels in the component description */labels: {slots: "Placeholders",events: "事件",cssProperties: "Propiedades CSS",cssParts: "Style Hooks",methods: "Actions"},}),],};

CSS Custom Data

Adding the CSS Custom Data file to your config provides you with autocomplete for your component's CSS custom properties.

These values can be added in your component's jsDoc. The var() wrapper will be added automatically if they are prefixed with --.

/** * * @cssprop {--radius-sm|--radius-md|--radius-lg} --border-radius - Controls the border radius of the component *  */

CSS Sets

You can define reusable CSS values to simplify your efforts and provide greater consistency from one component to another.

First, define your sets in the config. Values can be an object array with a name and optional description or they can be a simple string array.

// custom-elements-manifest.config.jsimport{generateCustomData}from"cem-plugin-vs-code-custom-data-generator";exportdefault{plugins: [generateCustomData({cssSets: [{name: "radiuses",values: [{name: "--radius-sm",description: '2px'},{name: "--radius-md",description: '4px'},{name: "--radius-lg",description: '8px'},],},{name: "spacing",values: ['2px','4px','8px','12px','16px'],},],}),],};

Once they are defined, you can reference them in your components jsDoc by prefixing it with set: and providing the name of the set.

/** * * @cssprop {set:radiuses} --border-radius - Controls the border radius of the component *  */

css custom property autocomplete from vs code

CSS Parts

Developers will also receive autocomplete for defined CSS parts.

/** * * @csspart radio-label - Applies custom styles the radio group label *  */

css custom property autocomplete from vs code

About

A custom elements manifest analyzer plugin to generate a custom data file for VS Code.

Resources

Stars

19 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages