@storybook/web-components 0.0.0-pr-23609-sha-f47ef339

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +1 -0
  2. package/dist/chunk-757FFUVQ.mjs +13 -0
  3. package/dist/config.d.ts +13 -0
  4. package/dist/config.js +5 -0
  5. package/dist/config.mjs +11 -0
  6. package/dist/index.d.ts +58 -0
  7. package/dist/index.js +5 -0
  8. package/dist/index.mjs +1 -0
  9. package/dist/types-089d0f09.d.ts +10 -0
  10. package/jest.config.js +7 -0
  11. package/package.json +89 -0
  12. package/preview.js +1 -0
  13. package/src/docs/__testfixtures__/lit-element-demo-card/input.js +199 -0
  14. package/src/docs/__testfixtures__/lit-html-welcome/input.js +61 -0
  15. package/src/typings.d.ts +5 -0
  16. package/template/cli/.eslintrc.json +5 -0
  17. package/template/cli/js/Button.js +21 -0
  18. package/template/cli/js/Button.stories.js +44 -0
  19. package/template/cli/js/Header.js +45 -0
  20. package/template/cli/js/Header.stories.js +18 -0
  21. package/template/cli/js/Page.js +61 -0
  22. package/template/cli/js/Page.stories.js +20 -0
  23. package/template/cli/ts-3-8/Button.stories.ts +49 -0
  24. package/template/cli/ts-3-8/Button.ts +43 -0
  25. package/template/cli/ts-3-8/Header.stories.ts +23 -0
  26. package/template/cli/ts-3-8/Header.ts +56 -0
  27. package/template/cli/ts-3-8/Page.stories.ts +26 -0
  28. package/template/cli/ts-3-8/Page.ts +72 -0
  29. package/template/cli/ts-4-9/Button.stories.ts +49 -0
  30. package/template/cli/ts-4-9/Button.ts +43 -0
  31. package/template/cli/ts-4-9/Header.stories.ts +23 -0
  32. package/template/cli/ts-4-9/Header.ts +56 -0
  33. package/template/cli/ts-4-9/Page.stories.ts +26 -0
  34. package/template/cli/ts-4-9/Page.ts +72 -0
  35. package/template/components/Button.js +70 -0
  36. package/template/components/Form.js +80 -0
  37. package/template/components/Html.js +33 -0
  38. package/template/components/Pre.js +42 -0
  39. package/template/components/button.css +30 -0
  40. package/template/components/index.js +14 -0
  41. package/template/stories/custom-elements-experimental.json +95 -0
  42. package/template/stories/custom-elements.json +162 -0
  43. package/template/stories/demo-wc-card/DemoWcCard.js +101 -0
  44. package/template/stories/demo-wc-card/demoWcCardStyle.css.js +97 -0
  45. package/template/stories/demo-wc-card/index.js +4 -0
  46. package/template/stories/demo-wc-card.stories.js +24 -0
  47. package/template/stories/preview.js +6 -0
  48. package/template/stories/script.stories.js +17 -0
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # Storybook web-components renderer
@@ -0,0 +1,13 @@
1
+ import { global } from '@storybook/global';
2
+ import { start, simulatePageLoad, simulateDOMContentLoaded } from '@storybook/preview-api';
3
+ import { dedent } from 'ts-dedent';
4
+ import { render as render$1 } from 'lit';
5
+ import { isTemplateResult } from 'lit/directive-helpers.js';
6
+
7
+ var{window:globalWindow}=global;globalWindow.STORYBOOK_ENV="web-components";var {Node}=global,render=(args,context)=>{let{id,component}=context;if(!component)throw new Error(`Unable to render story ${id} as the component annotation is missing from the default export`);let element=document.createElement(component);return Object.entries(args).forEach(([key,val])=>{element[key]=val;}),element};function renderToCanvas({storyFn,kind,name,showMain,showError,forceRemount},canvasElement){let element=storyFn();if(showMain(),isTemplateResult(element)){(forceRemount||!canvasElement.querySelector('[id="root-inner"]'))&&(canvasElement.innerHTML='<div id="root-inner"></div>');let renderTo=canvasElement.querySelector('[id="root-inner"]');render$1(element,renderTo),simulatePageLoad(canvasElement);}else if(typeof element=="string")canvasElement.innerHTML=element,simulatePageLoad(canvasElement);else if(element instanceof Node){if(canvasElement.firstChild===element&&!forceRemount)return;canvasElement.innerHTML="",canvasElement.appendChild(element),simulateDOMContentLoaded();}else showError({title:`Expecting an HTML snippet or DOM node from the story: "${name}" of "${kind}".`,description:dedent`
8
+ Did you forget to return the HTML snippet from the story?
9
+ Use "() => <your snippet or node>" or when defining the story.
10
+ `});}var RENDERER="web-components",api=start(renderToCanvas),storiesOf=(kind,m)=>api.clientApi.storiesOf(kind,m).addParameters({renderer:RENDERER}),configure=(...args)=>api.configure(RENDERER,...args),forceReRender=api.forceReRender,raw=api.clientApi.raw;function isValidComponent(tagName){if(!tagName)return !1;if(typeof tagName=="string")return !0;throw new Error('Provided component needs to be a string. e.g. component: "my-element"')}function isValidMetaData(customElements){if(!customElements)return !1;if(customElements.tags&&Array.isArray(customElements.tags)||customElements.modules&&Array.isArray(customElements.modules))return !0;throw new Error(`You need to setup valid meta data in your config.js via setCustomElements().
11
+ See the readme of addon-docs for web components for more details.`)}function setCustomElements(customElements){global.__STORYBOOK_CUSTOM_ELEMENTS__=customElements;}function setCustomElementsManifest(customElements){global.__STORYBOOK_CUSTOM_ELEMENTS_MANIFEST__=customElements;}function getCustomElements(){return global.__STORYBOOK_CUSTOM_ELEMENTS__||global.__STORYBOOK_CUSTOM_ELEMENTS_MANIFEST__}var{window,EventSource}=global;typeof module<"u"&&module?.hot?.decline&&(module.hot.decline(),new EventSource("__webpack_hmr").addEventListener("message",function(event){try{let{action}=JSON.parse(event.data);action==="built"&&window.location.reload();}catch{}}));
12
+
13
+ export { configure, forceReRender, getCustomElements, isValidComponent, isValidMetaData, raw, render, renderToCanvas, setCustomElements, setCustomElementsManifest, storiesOf };
@@ -0,0 +1,13 @@
1
+ import { Addon_DecoratorFunction, ArgTypesEnhancer, ArgsStoryFn, RenderContext } from '@storybook/types';
2
+ import { S as StoryFnHtmlReturnType, W as WebComponentsRenderer } from './types-089d0f09.js';
3
+ import 'lit';
4
+
5
+ declare const decorators: Addon_DecoratorFunction<StoryFnHtmlReturnType>[];
6
+ declare const argTypesEnhancers: ArgTypesEnhancer[];
7
+
8
+ declare const render: ArgsStoryFn<WebComponentsRenderer>;
9
+ declare function renderToCanvas({ storyFn, kind, name, showMain, showError, forceRemount }: RenderContext<WebComponentsRenderer>, canvasElement: WebComponentsRenderer['canvasElement']): void;
10
+
11
+ declare const parameters: {};
12
+
13
+ export { argTypesEnhancers, decorators, parameters, render, renderToCanvas };
package/dist/config.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var config_exports={};__export(config_exports,{argTypesEnhancers:()=>argTypesEnhancers,decorators:()=>decorators,parameters:()=>parameters2,render:()=>render,renderToCanvas:()=>renderToCanvas});module.exports=__toCommonJS(config_exports);var import_docs_tools2=require("@storybook/docs-tools");var import_tiny_invariant=__toESM(require("tiny-invariant")),import_client_logger=require("@storybook/client-logger");var import_global4=require("@storybook/global");var import_global=require("@storybook/global"),{window:globalWindow}=import_global.global;globalWindow.STORYBOOK_ENV="web-components";var import_preview_api2=require("@storybook/preview-api");var import_global2=require("@storybook/global"),import_ts_dedent=require("ts-dedent"),import_lit=require("lit"),import_directive_helpers=require("lit/directive-helpers.js"),import_preview_api=require("@storybook/preview-api"),{Node}=import_global2.global,render=(args,context)=>{let{id,component}=context;if(!component)throw new Error(`Unable to render story ${id} as the component annotation is missing from the default export`);let element=document.createElement(component);return Object.entries(args).forEach(([key,val])=>{element[key]=val}),element};function renderToCanvas({storyFn,kind,name,showMain,showError,forceRemount},canvasElement){let element=storyFn();if(showMain(),(0,import_directive_helpers.isTemplateResult)(element)){(forceRemount||!canvasElement.querySelector('[id="root-inner"]'))&&(canvasElement.innerHTML='<div id="root-inner"></div>');let renderTo=canvasElement.querySelector('[id="root-inner"]');(0,import_lit.render)(element,renderTo),(0,import_preview_api.simulatePageLoad)(canvasElement)}else if(typeof element=="string")canvasElement.innerHTML=element,(0,import_preview_api.simulatePageLoad)(canvasElement);else if(element instanceof Node){if(canvasElement.firstChild===element&&!forceRemount)return;canvasElement.innerHTML="",canvasElement.appendChild(element),(0,import_preview_api.simulateDOMContentLoaded)()}else showError({title:`Expecting an HTML snippet or DOM node from the story: "${name}" of "${kind}".`,description:import_ts_dedent.dedent`
2
+ Did you forget to return the HTML snippet from the story?
3
+ Use "() => <your snippet or node>" or when defining the story.
4
+ `})}var api=(0,import_preview_api2.start)(renderToCanvas);var forceReRender=api.forceReRender,raw=api.clientApi.raw;var import_global3=require("@storybook/global");function isValidComponent(tagName){if(!tagName)return!1;if(typeof tagName=="string")return!0;throw new Error('Provided component needs to be a string. e.g. component: "my-element"')}function isValidMetaData(customElements){if(!customElements)return!1;if(customElements.tags&&Array.isArray(customElements.tags)||customElements.modules&&Array.isArray(customElements.modules))return!0;throw new Error(`You need to setup valid meta data in your config.js via setCustomElements().
5
+ See the readme of addon-docs for web components for more details.`)}function getCustomElements(){return import_global3.global.__STORYBOOK_CUSTOM_ELEMENTS__||import_global3.global.__STORYBOOK_CUSTOM_ELEMENTS_MANIFEST__}var{window:window2,EventSource}=import_global4.global,_a;typeof module<"u"&&((_a=module==null?void 0:module.hot)!=null&&_a.decline)&&(module.hot.decline(),new EventSource("__webpack_hmr").addEventListener("message",function(event){try{let{action}=JSON.parse(event.data);action==="built"&&window2.location.reload()}catch{}}));function mapItem(item,category){var _a2,_b;let type;switch(category){case"attributes":case"properties":type={name:((_a2=item.type)==null?void 0:_a2.text)||item.type};break;case"slots":type={name:"string"};break;default:type={name:"void"};break}return{name:item.name,required:!1,description:item.description,type,table:{category,type:{summary:((_b=item.type)==null?void 0:_b.text)||item.type},defaultValue:{summary:item.default!==void 0?item.default:item.defaultValue}}}}function mapEvent(item){let name=item.name.replace(/(-|_|:|\.|\s)+(.)?/g,(_match,_separator,chr)=>chr?chr.toUpperCase():"").replace(/^([A-Z])/,match=>match.toLowerCase());return name=`on${name.charAt(0).toUpperCase()+name.substr(1)}`,[{name,action:{name:item.name},table:{disable:!0}},mapItem(item,"events")]}function mapData(data,category){return data&&data.filter(item=>item&&item.name).reduce((acc,item)=>{if(item.kind==="method")return acc;switch(category){case"events":mapEvent(item).forEach(argType=>{(0,import_tiny_invariant.default)(argType.name,`${argType} should have a name property.`),acc[argType.name]=argType});break;default:acc[item.name]=mapItem(item,category);break}return acc},{})}var getMetaDataExperimental=(tagName,customElements)=>{if(!isValidComponent(tagName)||!isValidMetaData(customElements))return null;let metaData=customElements.tags.find(tag=>tag.name.toUpperCase()===tagName.toUpperCase());return metaData||import_client_logger.logger.warn(`Component not found in custom-elements.json: ${tagName}`),metaData},getMetaDataV1=(tagName,customElements)=>{var _a2;if(!isValidComponent(tagName)||!isValidMetaData(customElements))return null;let metadata;return(_a2=customElements==null?void 0:customElements.modules)==null||_a2.forEach(_module=>{var _a3;(_a3=_module==null?void 0:_module.declarations)==null||_a3.forEach(declaration=>{declaration.tagName===tagName&&(metadata=declaration)})}),metadata||import_client_logger.logger.warn(`Component not found in custom-elements.json: ${tagName}`),metadata},getMetaData=(tagName,manifest)=>(manifest==null?void 0:manifest.version)==="experimental"?getMetaDataExperimental(tagName,manifest):getMetaDataV1(tagName,manifest),extractArgTypesFromElements=(tagName,customElements)=>{let metaData=getMetaData(tagName,customElements);return metaData&&{...mapData(metaData.members??[],"properties"),...mapData(metaData.properties??[],"properties"),...mapData(metaData.attributes??[],"attributes"),...mapData(metaData.events??[],"events"),...mapData(metaData.slots??[],"slots"),...mapData(metaData.cssProperties??[],"css custom properties"),...mapData(metaData.cssParts??[],"css shadow parts")}},extractArgTypes=tagName=>{let cem=getCustomElements();return extractArgTypesFromElements(tagName,cem)},extractComponentDescription=tagName=>{let metaData=getMetaData(tagName,getCustomElements());return metaData&&metaData.description};var import_lit2=require("lit"),import_preview_api3=require("@storybook/preview-api"),import_docs_tools=require("@storybook/docs-tools"),LIT_EXPRESSION_COMMENTS=/<!--\?lit\$[0-9]+\$-->|<!--\??-->/g;function skipSourceRender(context){var _a2;let sourceParams=(_a2=context==null?void 0:context.parameters.docs)==null?void 0:_a2.source,isArgsStory=context==null?void 0:context.parameters.__isArgsStory;return(sourceParams==null?void 0:sourceParams.type)===import_docs_tools.SourceType.DYNAMIC?!1:!isArgsStory||(sourceParams==null?void 0:sourceParams.code)||(sourceParams==null?void 0:sourceParams.type)===import_docs_tools.SourceType.CODE}function sourceDecorator(storyFn,context){var _a2,_b;let story=storyFn(),renderedForSource=(_b=(_a2=context==null?void 0:context.parameters.docs)==null?void 0:_a2.source)!=null&&_b.excludeDecorators?context.originalStoryFn(context.args,context):story,source;if((0,import_preview_api3.useEffect)(()=>{let{id,unmappedArgs}=context;source&&import_preview_api3.addons.getChannel().emit(import_docs_tools.SNIPPET_RENDERED,{id,source,args:unmappedArgs})}),!skipSourceRender(context)){let container=window.document.createElement("div");renderedForSource instanceof DocumentFragment?(0,import_lit2.render)(renderedForSource.cloneNode(!0),container):(0,import_lit2.render)(renderedForSource,container),source=container.innerHTML.replace(LIT_EXPRESSION_COMMENTS,"")}return story}var decorators=[sourceDecorator],parameters={docs:{extractArgTypes,extractComponentDescription,story:{inline:!0},source:{type:import_docs_tools2.SourceType.DYNAMIC,language:"html"}}},argTypesEnhancers=[import_docs_tools2.enhanceArgTypes];var parameters2={renderer:"web-components",...parameters};0&&(module.exports={argTypesEnhancers,decorators,parameters,render,renderToCanvas});
@@ -0,0 +1,11 @@
1
+ import { getCustomElements, isValidComponent, isValidMetaData } from './chunk-757FFUVQ.mjs';
2
+ export { render, renderToCanvas } from './chunk-757FFUVQ.mjs';
3
+ import { SourceType, enhanceArgTypes, SNIPPET_RENDERED } from '@storybook/docs-tools';
4
+ import invariant from 'tiny-invariant';
5
+ import { logger } from '@storybook/client-logger';
6
+ import { render } from 'lit';
7
+ import { useEffect, addons } from '@storybook/preview-api';
8
+
9
+ function mapItem(item,category){let type;switch(category){case"attributes":case"properties":type={name:item.type?.text||item.type};break;case"slots":type={name:"string"};break;default:type={name:"void"};break}return {name:item.name,required:!1,description:item.description,type,table:{category,type:{summary:item.type?.text||item.type},defaultValue:{summary:item.default!==void 0?item.default:item.defaultValue}}}}function mapEvent(item){let name=item.name.replace(/(-|_|:|\.|\s)+(.)?/g,(_match,_separator,chr)=>chr?chr.toUpperCase():"").replace(/^([A-Z])/,match=>match.toLowerCase());return name=`on${name.charAt(0).toUpperCase()+name.substr(1)}`,[{name,action:{name:item.name},table:{disable:!0}},mapItem(item,"events")]}function mapData(data,category){return data&&data.filter(item=>item&&item.name).reduce((acc,item)=>{if(item.kind==="method")return acc;switch(category){case"events":mapEvent(item).forEach(argType=>{invariant(argType.name,`${argType} should have a name property.`),acc[argType.name]=argType;});break;default:acc[item.name]=mapItem(item,category);break}return acc},{})}var getMetaDataExperimental=(tagName,customElements)=>{if(!isValidComponent(tagName)||!isValidMetaData(customElements))return null;let metaData=customElements.tags.find(tag=>tag.name.toUpperCase()===tagName.toUpperCase());return metaData||logger.warn(`Component not found in custom-elements.json: ${tagName}`),metaData},getMetaDataV1=(tagName,customElements)=>{if(!isValidComponent(tagName)||!isValidMetaData(customElements))return null;let metadata;return customElements?.modules?.forEach(_module=>{_module?.declarations?.forEach(declaration=>{declaration.tagName===tagName&&(metadata=declaration);});}),metadata||logger.warn(`Component not found in custom-elements.json: ${tagName}`),metadata},getMetaData=(tagName,manifest)=>manifest?.version==="experimental"?getMetaDataExperimental(tagName,manifest):getMetaDataV1(tagName,manifest),extractArgTypesFromElements=(tagName,customElements)=>{let metaData=getMetaData(tagName,customElements);return metaData&&{...mapData(metaData.members??[],"properties"),...mapData(metaData.properties??[],"properties"),...mapData(metaData.attributes??[],"attributes"),...mapData(metaData.events??[],"events"),...mapData(metaData.slots??[],"slots"),...mapData(metaData.cssProperties??[],"css custom properties"),...mapData(metaData.cssParts??[],"css shadow parts")}},extractArgTypes=tagName=>{let cem=getCustomElements();return extractArgTypesFromElements(tagName,cem)},extractComponentDescription=tagName=>{let metaData=getMetaData(tagName,getCustomElements());return metaData&&metaData.description};var LIT_EXPRESSION_COMMENTS=/<!--\?lit\$[0-9]+\$-->|<!--\??-->/g;function skipSourceRender(context){let sourceParams=context?.parameters.docs?.source,isArgsStory=context?.parameters.__isArgsStory;return sourceParams?.type===SourceType.DYNAMIC?!1:!isArgsStory||sourceParams?.code||sourceParams?.type===SourceType.CODE}function sourceDecorator(storyFn,context){let story=storyFn(),renderedForSource=context?.parameters.docs?.source?.excludeDecorators?context.originalStoryFn(context.args,context):story,source;if(useEffect(()=>{let{id,unmappedArgs}=context;source&&addons.getChannel().emit(SNIPPET_RENDERED,{id,source,args:unmappedArgs});}),!skipSourceRender(context)){let container=window.document.createElement("div");renderedForSource instanceof DocumentFragment?render(renderedForSource.cloneNode(!0),container):render(renderedForSource,container),source=container.innerHTML.replace(LIT_EXPRESSION_COMMENTS,"");}return story}var decorators=[sourceDecorator],parameters={docs:{extractArgTypes,extractComponentDescription,story:{inline:!0},source:{type:SourceType.DYNAMIC,language:"html"}}},argTypesEnhancers=[enhanceArgTypes];var parameters2={renderer:"web-components",...parameters};
10
+
11
+ export { argTypesEnhancers, decorators, parameters2 as parameters };
@@ -0,0 +1,58 @@
1
+ import { Args, ComponentAnnotations, AnnotatedStoryFn, StoryAnnotations, StrictArgs, DecoratorFunction, LoaderFunction, StoryContext as StoryContext$1, ProjectAnnotations, Addon_ClientStoryApi, Addon_Loadable } from '@storybook/types';
2
+ export { ArgTypes, Args, Parameters, StrictArgs } from '@storybook/types';
3
+ import { W as WebComponentsRenderer } from './types-089d0f09.js';
4
+ import 'lit';
5
+
6
+ /**
7
+ * Metadata to configure the stories for a component.
8
+ *
9
+ * @see [Default export](https://storybook.js.org/docs/formats/component-story-format/#default-export)
10
+ */
11
+ type Meta<TArgs = Args> = ComponentAnnotations<WebComponentsRenderer, TArgs>;
12
+ /**
13
+ * Story function that represents a CSFv2 component example.
14
+ *
15
+ * @see [Named Story exports](https://storybook.js.org/docs/formats/component-story-format/#named-story-exports)
16
+ */
17
+ type StoryFn<TArgs = Args> = AnnotatedStoryFn<WebComponentsRenderer, TArgs>;
18
+ /**
19
+ * Story function that represents a CSFv3 component example.
20
+ *
21
+ * @see [Named Story exports](https://storybook.js.org/docs/formats/component-story-format/#named-story-exports)
22
+ */
23
+ type StoryObj<TArgs = Args> = StoryAnnotations<WebComponentsRenderer, TArgs>;
24
+ /**
25
+ * @deprecated Use `StoryFn` instead.
26
+ * Use `StoryObj` if you want to migrate to CSF3, which uses objects instead of functions to represent stories.
27
+ * You can read more about the CSF3 format here: https://storybook.js.org/blog/component-story-format-3-0/
28
+ *
29
+ * Story function that represents a CSFv2 component example.
30
+ *
31
+ * @see [Named Story exports](https://storybook.js.org/docs/formats/component-story-format/#named-story-exports)
32
+ */
33
+ type Story<TArgs = Args> = StoryFn<TArgs>;
34
+ type Decorator<TArgs = StrictArgs> = DecoratorFunction<WebComponentsRenderer, TArgs>;
35
+ type Loader<TArgs = StrictArgs> = LoaderFunction<WebComponentsRenderer, TArgs>;
36
+ type StoryContext<TArgs = StrictArgs> = StoryContext$1<WebComponentsRenderer, TArgs>;
37
+ type Preview = ProjectAnnotations<WebComponentsRenderer>;
38
+
39
+ interface ClientApi extends Addon_ClientStoryApi<WebComponentsRenderer['storyResult']> {
40
+ configure(loader: Addon_Loadable, module: NodeModule): void;
41
+ forceReRender(): void;
42
+ raw: () => any;
43
+ }
44
+ declare const storiesOf: ClientApi['storiesOf'];
45
+ declare const configure: ClientApi['configure'];
46
+ declare const forceReRender: ClientApi['forceReRender'];
47
+ declare const raw: ClientApi['raw'];
48
+
49
+ declare function isValidComponent(tagName: string): boolean;
50
+ declare function isValidMetaData(customElements: any): boolean;
51
+ /**
52
+ * @param customElements any for now as spec is not super stable yet
53
+ */
54
+ declare function setCustomElements(customElements: any): void;
55
+ declare function setCustomElementsManifest(customElements: any): void;
56
+ declare function getCustomElements(): any;
57
+
58
+ export { Decorator, Loader, Meta, Preview, Story, StoryContext, StoryFn, StoryObj, WebComponentsRenderer, configure, forceReRender, getCustomElements, isValidComponent, isValidMetaData, raw, setCustomElements, setCustomElementsManifest, storiesOf };
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var src_exports={};__export(src_exports,{configure:()=>configure,forceReRender:()=>forceReRender,getCustomElements:()=>getCustomElements,isValidComponent:()=>isValidComponent,isValidMetaData:()=>isValidMetaData,raw:()=>raw,setCustomElements:()=>setCustomElements,setCustomElementsManifest:()=>setCustomElementsManifest,storiesOf:()=>storiesOf});module.exports=__toCommonJS(src_exports);var import_global4=require("@storybook/global");var import_global=require("@storybook/global"),{window:globalWindow}=import_global.global;globalWindow.STORYBOOK_ENV="web-components";var import_preview_api2=require("@storybook/preview-api");var import_global2=require("@storybook/global"),import_ts_dedent=require("ts-dedent"),import_lit=require("lit"),import_directive_helpers=require("lit/directive-helpers.js"),import_preview_api=require("@storybook/preview-api"),{Node}=import_global2.global;function renderToCanvas({storyFn,kind,name,showMain,showError,forceRemount},canvasElement){let element=storyFn();if(showMain(),(0,import_directive_helpers.isTemplateResult)(element)){(forceRemount||!canvasElement.querySelector('[id="root-inner"]'))&&(canvasElement.innerHTML='<div id="root-inner"></div>');let renderTo=canvasElement.querySelector('[id="root-inner"]');(0,import_lit.render)(element,renderTo),(0,import_preview_api.simulatePageLoad)(canvasElement)}else if(typeof element=="string")canvasElement.innerHTML=element,(0,import_preview_api.simulatePageLoad)(canvasElement);else if(element instanceof Node){if(canvasElement.firstChild===element&&!forceRemount)return;canvasElement.innerHTML="",canvasElement.appendChild(element),(0,import_preview_api.simulateDOMContentLoaded)()}else showError({title:`Expecting an HTML snippet or DOM node from the story: "${name}" of "${kind}".`,description:import_ts_dedent.dedent`
2
+ Did you forget to return the HTML snippet from the story?
3
+ Use "() => <your snippet or node>" or when defining the story.
4
+ `})}var RENDERER="web-components",api=(0,import_preview_api2.start)(renderToCanvas),storiesOf=(kind,m)=>api.clientApi.storiesOf(kind,m).addParameters({renderer:RENDERER}),configure=(...args)=>api.configure(RENDERER,...args),forceReRender=api.forceReRender,raw=api.clientApi.raw;var import_global3=require("@storybook/global");function isValidComponent(tagName){if(!tagName)return!1;if(typeof tagName=="string")return!0;throw new Error('Provided component needs to be a string. e.g. component: "my-element"')}function isValidMetaData(customElements){if(!customElements)return!1;if(customElements.tags&&Array.isArray(customElements.tags)||customElements.modules&&Array.isArray(customElements.modules))return!0;throw new Error(`You need to setup valid meta data in your config.js via setCustomElements().
5
+ See the readme of addon-docs for web components for more details.`)}function setCustomElements(customElements){import_global3.global.__STORYBOOK_CUSTOM_ELEMENTS__=customElements}function setCustomElementsManifest(customElements){import_global3.global.__STORYBOOK_CUSTOM_ELEMENTS_MANIFEST__=customElements}function getCustomElements(){return import_global3.global.__STORYBOOK_CUSTOM_ELEMENTS__||import_global3.global.__STORYBOOK_CUSTOM_ELEMENTS_MANIFEST__}var{window,EventSource}=import_global4.global,_a;typeof module<"u"&&((_a=module==null?void 0:module.hot)!=null&&_a.decline)&&(module.hot.decline(),new EventSource("__webpack_hmr").addEventListener("message",function(event){try{let{action}=JSON.parse(event.data);action==="built"&&window.location.reload()}catch{}}));0&&(module.exports={configure,forceReRender,getCustomElements,isValidComponent,isValidMetaData,raw,setCustomElements,setCustomElementsManifest,storiesOf});
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ export { configure, forceReRender, getCustomElements, isValidComponent, isValidMetaData, raw, setCustomElements, setCustomElementsManifest, storiesOf } from './chunk-757FFUVQ.mjs';
@@ -0,0 +1,10 @@
1
+ import { WebRenderer } from '@storybook/types';
2
+ import { TemplateResult, SVGTemplateResult } from 'lit';
3
+
4
+ type StoryFnHtmlReturnType = string | Node | DocumentFragment | TemplateResult | SVGTemplateResult;
5
+ interface WebComponentsRenderer extends WebRenderer {
6
+ component: string;
7
+ storyResult: StoryFnHtmlReturnType;
8
+ }
9
+
10
+ export { StoryFnHtmlReturnType as S, WebComponentsRenderer as W };
package/jest.config.js ADDED
@@ -0,0 +1,7 @@
1
+ const path = require('path');
2
+ const baseConfig = require('../../jest.config.browser');
3
+
4
+ module.exports = {
5
+ ...baseConfig,
6
+ displayName: __dirname.split(path.sep).slice(-2).join(path.posix.sep),
7
+ };
package/package.json ADDED
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "@storybook/web-components",
3
+ "version": "0.0.0-pr-23609-sha-f47ef339",
4
+ "description": "Storybook web-components renderer",
5
+ "keywords": [
6
+ "lit",
7
+ "lit-html",
8
+ "storybook",
9
+ "web-components"
10
+ ],
11
+ "homepage": "https://github.com/storybookjs/storybook/tree/next/code/renderers/web-components",
12
+ "bugs": {
13
+ "url": "https://github.com/storybookjs/storybook/issues"
14
+ },
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/storybookjs/storybook.git",
18
+ "directory": "code/renderers/web-components"
19
+ },
20
+ "funding": {
21
+ "type": "opencollective",
22
+ "url": "https://opencollective.com/storybook"
23
+ },
24
+ "license": "MIT",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "node": "./dist/index.js",
29
+ "require": "./dist/index.js",
30
+ "import": "./dist/index.mjs"
31
+ },
32
+ "./preview": {
33
+ "types": "./dist/config.d.ts",
34
+ "require": "./dist/config.js",
35
+ "import": "./dist/config.mjs"
36
+ },
37
+ "./package.json": "./package.json"
38
+ },
39
+ "main": "dist/index.js",
40
+ "module": "dist/index.mjs",
41
+ "types": "dist/index.d.ts",
42
+ "files": [
43
+ "dist/**/*",
44
+ "template/**/*",
45
+ "README.md",
46
+ "*.js",
47
+ "*.d.ts"
48
+ ],
49
+ "scripts": {
50
+ "check": "../../../scripts/prepare/check.ts",
51
+ "prep": "../../../scripts/prepare/bundle.ts"
52
+ },
53
+ "dependencies": {
54
+ "@storybook/client-logger": "0.0.0-pr-23609-sha-f47ef339",
55
+ "@storybook/core-client": "0.0.0-pr-23609-sha-f47ef339",
56
+ "@storybook/docs-tools": "0.0.0-pr-23609-sha-f47ef339",
57
+ "@storybook/global": "^5.0.0",
58
+ "@storybook/manager-api": "0.0.0-pr-23609-sha-f47ef339",
59
+ "@storybook/preview-api": "0.0.0-pr-23609-sha-f47ef339",
60
+ "@storybook/types": "0.0.0-pr-23609-sha-f47ef339",
61
+ "tiny-invariant": "^1.3.1",
62
+ "ts-dedent": "^2.0.0"
63
+ },
64
+ "devDependencies": {
65
+ "@types/cross-spawn": "^6.0.2",
66
+ "@types/node": "^16.0.0",
67
+ "cross-spawn": "^7.0.3",
68
+ "lit": "2.3.1",
69
+ "typescript": "~4.9.3",
70
+ "web-component-analyzer": "^1.1.6"
71
+ },
72
+ "peerDependencies": {
73
+ "lit": "^2.0.0"
74
+ },
75
+ "engines": {
76
+ "node": ">=16.0.0"
77
+ },
78
+ "publishConfig": {
79
+ "access": "public"
80
+ },
81
+ "bundler": {
82
+ "entries": [
83
+ "./src/index.ts",
84
+ "./src/config.ts"
85
+ ],
86
+ "platform": "browser"
87
+ },
88
+ "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae17"
89
+ }
package/preview.js ADDED
@@ -0,0 +1 @@
1
+ export * from './dist/config';
@@ -0,0 +1,199 @@
1
+ import { global } from '@storybook/global';
2
+
3
+ import { LitElement, html, css } from 'lit-element';
4
+
5
+ const { CustomEvent } = global;
6
+
7
+ const demoWcCardStyle = css`
8
+ :host {
9
+ display: block;
10
+ position: relative;
11
+ width: 250px;
12
+ height: 200px;
13
+ border-radius: 10px;
14
+ transform-style: preserve-3d;
15
+ transition: all 0.8s ease;
16
+ }
17
+
18
+ .header {
19
+ font-weight: bold;
20
+ font-size: var(--demo-wc-card-header-font-size, 16px);
21
+ text-align: center;
22
+ }
23
+
24
+ .content {
25
+ padding: 20px 10px 0 10px;
26
+ flex-grow: 1;
27
+ }
28
+
29
+ .footer {
30
+ display: flex;
31
+ }
32
+
33
+ dl {
34
+ margin: 0;
35
+ text-align: left;
36
+ }
37
+
38
+ dd {
39
+ margin-left: 15px;
40
+ }
41
+
42
+ button {
43
+ border-radius: 15px;
44
+ width: 30px;
45
+ height: 30px;
46
+ background: #fff;
47
+ border: 1px solid #ccc;
48
+ color: #000;
49
+ font-size: 21px;
50
+ line-height: 27px;
51
+ font-weight: bold;
52
+ cursor: pointer;
53
+ margin: 5px;
54
+ }
55
+
56
+ .note {
57
+ flex-grow: 1;
58
+ color: #666;
59
+ font-size: 16px;
60
+ font-weight: bold;
61
+ text-align: left;
62
+ padding-top: 15px;
63
+ }
64
+
65
+ :host([back-side]) {
66
+ transform: rotateY(180deg);
67
+ }
68
+
69
+ #front,
70
+ #back {
71
+ position: absolute;
72
+ width: 250px;
73
+ box-sizing: border-box;
74
+ box-shadow: #ccc 3px 3px 2px 1px;
75
+ padding: 10px;
76
+ display: flex;
77
+ flex-flow: column;
78
+ top: 0;
79
+ left: 0;
80
+ height: 100%;
81
+ border-radius: 10px;
82
+ backface-visibility: hidden;
83
+ overflow: hidden;
84
+ }
85
+
86
+ #front {
87
+ background: linear-gradient(141deg, #aaa 25%, #eee 40%, #ddd 55%);
88
+ color: var(--demo-wc-card-front-color, #000);
89
+ }
90
+
91
+ #back {
92
+ background: linear-gradient(141deg, #333 25%, #aaa 40%, #666 55%);
93
+ color: var(--demo-wc-card-back-color, #fff);
94
+ text-align: center;
95
+ transform: rotateY(180deg) translate3d(0px, 0, 1px);
96
+ }
97
+
98
+ #back .note {
99
+ color: #fff;
100
+ }
101
+ `;
102
+
103
+ /**
104
+ * This is a container looking like a card with a back and front side you can switch
105
+ *
106
+ * @slot - This is an unnamed slot (the default slot)
107
+ * @fires side-changed - Fires whenever it switches between front/back
108
+ * @cssprop --demo-wc-card-header-font-size - Header font size
109
+ * @cssprop --demo-wc-card-front-color - Font color for front
110
+ * @cssprop --demo-wc-card-back-color - Font color for back
111
+ * @csspart front - Front of the card
112
+ * @csspart back - Back of the card
113
+ */
114
+ export class DemoWcCard extends LitElement {
115
+ static get properties() {
116
+ return {
117
+ backSide: {
118
+ type: Boolean,
119
+ reflect: true,
120
+ attribute: 'back-side',
121
+ },
122
+ header: { type: String },
123
+ rows: { type: Object },
124
+ };
125
+ }
126
+
127
+ static get styles() {
128
+ return demoWcCardStyle;
129
+ }
130
+
131
+ constructor() {
132
+ super();
133
+
134
+ /**
135
+ * Indicates that the back of the card is shown
136
+ */
137
+ this.backSide = false;
138
+
139
+ /**
140
+ * Header message
141
+ */
142
+ this.header = 'Your Message';
143
+
144
+ /**
145
+ * Data rows
146
+ */
147
+ this.rows = [];
148
+ }
149
+
150
+ toggle() {
151
+ this.backSide = !this.backSide;
152
+ }
153
+
154
+ render() {
155
+ return html`
156
+ <div id="front" part="front">
157
+ <div class="header">${this.header}</div>
158
+ <div class="content">
159
+ <slot></slot>
160
+ </div>
161
+ <div class="footer">
162
+ <div class="note">A</div>
163
+ <button @click=${this.toggle}>></button>
164
+ </div>
165
+ </div>
166
+ <div id="back" part="back">
167
+ <div class="header">${this.header}</div>
168
+
169
+ <div class="content">
170
+ ${this.rows.length === 0
171
+ ? html``
172
+ : html`
173
+ <dl>
174
+ ${this.rows.map(
175
+ (row) => html`
176
+ <dt>${row.header}</dt>
177
+ <dd>${row.value}</dd>
178
+ `
179
+ )}
180
+ </dl>
181
+ `}
182
+ </div>
183
+ <div class="footer">
184
+ <div class="note">B</div>
185
+ <button @click=${this.toggle}>></button>
186
+ </div>
187
+ </div>
188
+ `;
189
+ }
190
+
191
+ updated(changedProperties) {
192
+ if (changedProperties.has('backSide') && changedProperties.get('backSide') !== undefined) {
193
+ this.dispatchEvent(new CustomEvent('side-changed'));
194
+ }
195
+ }
196
+ }
197
+
198
+ // eslint-disable-next-line no-undef
199
+ customElements.define('input', DemoWcCard);
@@ -0,0 +1,61 @@
1
+ import { html } from 'lit';
2
+
3
+ export const Welcome = () => html`
4
+ <div class="main">
5
+ <h1>Welcome to Storybook for Web Components</h1>
6
+ <p>This is a UI component dev environment for your plain HTML snippets.</p>
7
+ <p>
8
+ We've added some basic stories inside the <code class="code">stories</code> directory.
9
+ <br />
10
+ A story is a single state of one or more UI components. You can have as many stories as you
11
+ want.
12
+ <br />
13
+ (Basically a story is like a visual test case.)
14
+ </p>
15
+ <p>
16
+ See these sample
17
+ <a class="link" href="#" data-sb-kind="Demo Card" data-sb-story="Front">stories</a>
18
+ </p>
19
+ <p>
20
+ Just like that, you can add your own snippets as stories.
21
+ <br />
22
+ You can also edit those snippets and see changes right away.
23
+ <br />
24
+ </p>
25
+ <p>
26
+ Usually we create stories with smaller UI components in the app.<br />
27
+ Have a look at the
28
+ <a class="link" href="https://storybook.js.org/basics/writing-stories" target="_blank">
29
+ Writing Stories
30
+ </a>
31
+ section in our documentation.
32
+ </p>
33
+ </div>
34
+
35
+ <style>
36
+ .main {
37
+ padding: 15px;
38
+ line-height: 1.4;
39
+ font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif;
40
+ background-color: #ffffff;
41
+ }
42
+
43
+ .logo {
44
+ width: 256px;
45
+ margin: 15px;
46
+ }
47
+
48
+ .code {
49
+ font-size: 15px;
50
+ font-weight: 600;
51
+ padding: 2px 5px;
52
+ border: 1px solid #eae9e9;
53
+ border-radius: 4px;
54
+ background-color: #f3f2f2;
55
+ color: #3a3a3a;
56
+ }
57
+ </style>
58
+ `;
59
+
60
+ // eslint-disable-next-line no-undef
61
+ customElements.define('input', Welcome);
@@ -0,0 +1,5 @@
1
+ /* eslint-disable no-underscore-dangle, @typescript-eslint/naming-convention */
2
+ declare var STORYBOOK_ENV: 'web-components';
3
+ declare var __STORYBOOK_CUSTOM_ELEMENTS_MANIFEST__: any;
4
+ declare var __STORYBOOK_CUSTOM_ELEMENTS__: any;
5
+ declare var LOGLEVEL: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent' | undefined;
@@ -0,0 +1,5 @@
1
+ {
2
+ "rules": {
3
+ "import/extensions": "off"
4
+ }
5
+ }
@@ -0,0 +1,21 @@
1
+ import { html } from 'lit';
2
+ import { styleMap } from 'lit/directives/style-map.js';
3
+ import './button.css';
4
+
5
+ /**
6
+ * Primary UI component for user interaction
7
+ */
8
+ export const Button = ({ primary, backgroundColor = null, size, label, onClick }) => {
9
+ const mode = primary ? 'storybook-button--primary' : 'storybook-button--secondary';
10
+
11
+ return html`
12
+ <button
13
+ type="button"
14
+ class=${['storybook-button', `storybook-button--${size || 'medium'}`, mode].join(' ')}
15
+ style=${styleMap({ backgroundColor })}
16
+ @click=${onClick}
17
+ >
18
+ ${label}
19
+ </button>
20
+ `;
21
+ };
@@ -0,0 +1,44 @@
1
+ import { Button } from './Button';
2
+
3
+ // More on how to set up stories at: https://storybook.js.org/docs/web-components/writing-stories/introduction
4
+ export default {
5
+ title: 'Example/Button',
6
+ tags: ['autodocs'],
7
+ render: (args) => Button(args),
8
+ argTypes: {
9
+ backgroundColor: { control: 'color' },
10
+ onClick: { action: 'onClick' },
11
+ size: {
12
+ control: { type: 'select' },
13
+ options: ['small', 'medium', 'large'],
14
+ },
15
+ },
16
+ };
17
+
18
+ // More on writing stories with args: https://storybook.js.org/docs/web-components/writing-stories/args
19
+ export const Primary = {
20
+ args: {
21
+ primary: true,
22
+ label: 'Button',
23
+ },
24
+ };
25
+
26
+ export const Secondary = {
27
+ args: {
28
+ label: 'Button',
29
+ },
30
+ };
31
+
32
+ export const Large = {
33
+ args: {
34
+ size: 'large',
35
+ label: 'Button',
36
+ },
37
+ };
38
+
39
+ export const Small = {
40
+ args: {
41
+ size: 'small',
42
+ label: 'Button',
43
+ },
44
+ };
@@ -0,0 +1,45 @@
1
+ import { html } from 'lit';
2
+
3
+ import { Button } from './Button';
4
+ import './header.css';
5
+
6
+ export const Header = ({ user, onLogin, onLogout, onCreateAccount }) => html`
7
+ <header>
8
+ <div class="storybook-header">
9
+ <div>
10
+ <svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
11
+ <g fill="none" fillRule="evenodd">
12
+ <path
13
+ d="M10 0h12a10 10 0 0110 10v12a10 10 0 01-10 10H10A10 10 0 010 22V10A10 10 0 0110 0z"
14
+ fill="#FFF"
15
+ />
16
+ <path
17
+ d="M5.3 10.6l10.4 6v11.1l-10.4-6v-11zm11.4-6.2l9.7 5.5-9.7 5.6V4.4z"
18
+ fill="#555AB9"
19
+ />
20
+ <path
21
+ d="M27.2 10.6v11.2l-10.5 6V16.5l10.5-6zM15.7 4.4v11L6 10l9.7-5.5z"
22
+ fill="#91BAF8"
23
+ />
24
+ </g>
25
+ </svg>
26
+ <h1>Acme</h1>
27
+ </div>
28
+ <div>
29
+ ${user
30
+ ? Button({ size: 'small', onClick: onLogout, label: 'Log out' })
31
+ : html`${Button({
32
+ size: 'small',
33
+ onClick: onLogin,
34
+ label: 'Log in',
35
+ })}
36
+ ${Button({
37
+ primary: true,
38
+ size: 'small',
39
+ onClick: onCreateAccount,
40
+ label: 'Sign up',
41
+ })}`}
42
+ </div>
43
+ </div>
44
+ </header>
45
+ `;