@storybook/vue3 7.1.0-alpha.9 → 7.1.0-beta.1

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 (28) hide show
  1. package/dist/chunk-SRVBJOBI.mjs +6 -0
  2. package/dist/config.d.ts +4 -15
  3. package/dist/config.js +3 -44
  4. package/dist/config.mjs +11 -43
  5. package/dist/index.d.ts +8 -9
  6. package/dist/index.js +1 -1
  7. package/dist/index.mjs +8 -1
  8. package/package.json +19 -15
  9. package/src/typings.d.ts +1 -0
  10. package/template/cli/js/Header.vue +1 -1
  11. package/template/cli/js/Page.vue +1 -1
  12. package/template/cli/ts-3-8/Header.vue +1 -1
  13. package/template/cli/ts-3-8/Page.vue +8 -5
  14. package/template/cli/ts-4-9/Header.vue +1 -1
  15. package/template/cli/ts-4-9/Page.vue +8 -5
  16. package/template/components/Form.vue +1 -4
  17. package/template/stories/{preview.ts → preview.js} +7 -20
  18. package/template/stories_vue3-vite-default-ts/CustomRenderFunctionalComponent.stories.ts +0 -2
  19. package/template/stories_vue3-vite-default-ts/CustomRenderOptionsArgsFromData.stories.ts +0 -2
  20. package/template/{stories → stories_vue3-vite-default-ts}/GlobalSetup.stories.ts +4 -1
  21. package/template/stories_vue3-vite-default-ts/ReactiveArgs.stories.ts +5 -3
  22. package/template/stories_vue3-vite-default-ts/ReactiveDecorators.stories.ts +2 -26
  23. package/template/stories_vue3-vite-default-ts/ScopedSlots.stories.ts +2 -2
  24. package/template/stories_vue3-vite-default-ts/SourceDecorator.stories.ts +46 -0
  25. package/template/stories_vue3-vite-default-ts/preview.ts +12 -0
  26. package/dist/chunk-3MGVBGQN.mjs +0 -1
  27. package/template/stories_vue3-vite-default-ts/CustomRenderOptionsArgsFromProps.stories.ts +0 -33
  28. /package/template/{stories → stories_vue3-vite-default-ts}/GlobalSetup.vue +0 -0
package/dist/index.js CHANGED
@@ -1 +1 @@
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,raw:()=>raw,setup:()=>setup,storiesOf:()=>storiesOf});module.exports=__toCommonJS(src_exports);var import_global=require("@storybook/global"),{window:globalWindow}=import_global.global;globalWindow.STORYBOOK_ENV="vue3";var import_preview_api2=require("@storybook/preview-api");var import_vue=require("vue"),import_preview_api=require("@storybook/preview-api");function makeMap(str,expectsLowerCase){let map2=Object.create(null),list=str.split(",");for(let i=0;i<list.length;i++)map2[list[i]]=!0;return expectsLowerCase?val=>!!map2[val.toLowerCase()]:val=>!!map2[val]}var specialBooleanAttrs="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly";var isBooleanAttr=makeMap(specialBooleanAttrs+",async,autofocus,autoplay,controls,default,defer,disabled,hidden,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected");function looseCompareArrays(a,b){if(a.length!==b.length)return!1;let equal=!0;for(let i=0;equal&&i<a.length;i++)equal=looseEqual(a[i],b[i]);return equal}function looseEqual(a,b){if(a===b)return!0;let aValidType=isDate(a),bValidType=isDate(b);if(aValidType||bValidType)return aValidType&&bValidType?a.getTime()===b.getTime():!1;if(aValidType=isSymbol(a),bValidType=isSymbol(b),aValidType||bValidType)return a===b;if(aValidType=isArray(a),bValidType=isArray(b),aValidType||bValidType)return aValidType&&bValidType?looseCompareArrays(a,b):!1;if(aValidType=isObject(a),bValidType=isObject(b),aValidType||bValidType){if(!aValidType||!bValidType)return!1;let aKeysCount=Object.keys(a).length,bKeysCount=Object.keys(b).length;if(aKeysCount!==bKeysCount)return!1;for(let key in a){let aHasKey=a.hasOwnProperty(key),bHasKey=b.hasOwnProperty(key);if(aHasKey&&!bHasKey||!aHasKey&&bHasKey||!looseEqual(a[key],b[key]))return!1}}return String(a)===String(b)}var EMPTY_OBJ=process.env.NODE_ENV!=="production"?Object.freeze({}):{},EMPTY_ARR=process.env.NODE_ENV!=="production"?Object.freeze([]):[];var isArray=Array.isArray;var isDate=val=>toTypeString(val)==="[object Date]";var isSymbol=val=>typeof val=="symbol",isObject=val=>val!==null&&typeof val=="object";var objectToString=Object.prototype.toString,toTypeString=value=>objectToString.call(value);var cacheStringFunction=fn=>{let cache=Object.create(null);return str=>cache[str]||(cache[str]=fn(str))},camelizeRE=/-(\w)/g,camelize=cacheStringFunction(str=>str.replace(camelizeRE,(_,c)=>c?c.toUpperCase():"")),hyphenateRE=/\B([A-Z])/g,hyphenate=cacheStringFunction(str=>str.replace(hyphenateRE,"-$1").toLowerCase()),capitalize=cacheStringFunction(str=>str.charAt(0).toUpperCase()+str.slice(1)),toHandlerKey=cacheStringFunction(str=>str?`on${capitalize(str)}`:"");function normalizeFunctionalComponent(options){return typeof options=="function"?{render:options,name:options.name}:options}function prepare(rawStory,innerStory){let story=rawStory;return story===null?null:typeof story=="function"?story:innerStory?{...normalizeFunctionalComponent(story),components:{...story.components||{},story:innerStory}}:{render(){return(0,import_vue.h)(story)}}}function decorateStory(storyFn,decorators){let updatedArgs;return decorators.reduce((decorated,decorator)=>context=>{let story,decoratedStory=decorator(update=>(story=decorated({...context,...(0,import_preview_api.sanitizeStoryContextUpdate)(update)}),update&&update.args&&!looseEqual(update.args,context.args)&&(updatedArgs??=update.args),story),context);return context.args=updatedArgs??context.args,story||(story=decorated(context)),decoratedStory===story?story:prepare(decoratedStory,()=>(0,import_vue.h)(story,context.args))},context=>prepare(storyFn(context)))}var import_vue2=require("vue"),slotsMap=new Map,render=(props,context)=>{let{id,component:Component}=context;if(!Component)throw new Error(`Unable to render story ${id} as the component annotation is missing from the default export`);return(0,import_vue2.h)(Component,props,createOrUpdateSlots(context))},setupFunctions=new Set,setup=fn=>{setupFunctions.add(fn)},runSetupFunctions=(app,storyContext)=>{setupFunctions.forEach(fn=>fn(app,storyContext))},map=new Map;function renderToCanvas({storyFn,forceRemount,showMain,showException,storyContext,id},canvasElement){let existingApp=map.get(canvasElement);if(existingApp&&!forceRemount){let element=storyFn(),args=getArgs(element,storyContext);return updateArgs(existingApp.reactiveArgs,args),()=>{teardown(existingApp.vueApp,canvasElement)}}existingApp&&forceRemount&&teardown(existingApp.vueApp,canvasElement);let vueApp=(0,import_vue2.createApp)({setup(){storyContext.args=(0,import_vue2.reactive)(storyContext.args);let rootElement=storyFn(),args=getArgs(rootElement,storyContext),appState={vueApp,reactiveArgs:(0,import_vue2.reactive)(args)};return map.set(canvasElement,appState),()=>(0,import_vue2.h)(rootElement,appState.reactiveArgs)}});return vueApp.config.errorHandler=e=>showException(e),runSetupFunctions(vueApp,storyContext),vueApp.mount(canvasElement),showMain(),()=>{teardown(vueApp,canvasElement)}}function generateSlots(context){let{argTypes}=context,slots=Object.entries(argTypes).filter(([key,value])=>{var _a2,_b;return((_b=(_a2=argTypes[key])==null?void 0:_a2.table)==null?void 0:_b.category)==="slots"}).map(([key,value])=>{let slotValue=context.args[key];return[key,typeof slotValue=="function"?slotValue:()=>slotValue]});return(0,import_vue2.reactive)(Object.fromEntries(slots))}function getArgs(element,storyContext){return element.props&&(0,import_vue2.isVNode)(element)?element.props:storyContext.args}function updateArgs(reactiveArgs,nextArgs){if(Object.keys(nextArgs).length===0)return;let currentArgs=(0,import_vue2.isReactive)(reactiveArgs)?reactiveArgs:(0,import_vue2.reactive)(reactiveArgs);Object.keys(currentArgs).forEach(key=>{key in nextArgs||delete currentArgs[key]}),Object.assign(currentArgs,nextArgs)}function teardown(storybookApp,canvasElement){storybookApp==null||storybookApp.unmount(),map.has(canvasElement)&&map.delete(canvasElement)}function createOrUpdateSlots(context){let{id:storyID,component}=context,slots=generateSlots(context);if(slotsMap.has(storyID)){let app=slotsMap.get(storyID);return app!=null&&app.reactiveSlots&&updateArgs(app.reactiveSlots,slots),app==null?void 0:app.reactiveSlots}return slotsMap.set(storyID,{component,reactiveSlots:slots}),slots}var RENDERER="vue3",api=(0,import_preview_api2.start)(renderToCanvas,{decorateStory,render}),storiesOf=(kind,m)=>api.clientApi.storiesOf(kind,m).addParameters({renderer:RENDERER}),configure=(...args)=>api.configure(RENDERER,...args),{forceReRender}=api,{raw}=api.clientApi;var _a;typeof module<"u"&&((_a=module==null?void 0:module.hot)==null||_a.decline());0&&(module.exports={configure,forceReRender,raw,setup,storiesOf});
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,raw:()=>raw,setup:()=>setup,storiesOf:()=>storiesOf});module.exports=__toCommonJS(src_exports);var import_global=require("@storybook/global"),{window:globalWindow}=import_global.global;globalWindow.STORYBOOK_ENV="vue3";var import_preview_api2=require("@storybook/preview-api");var import_vue=require("vue"),import_preview_api=require("@storybook/preview-api");function normalizeFunctionalComponent(options){return typeof options=="function"?{render:options,name:options.name}:options}function prepare(rawStory,innerStory){let story=rawStory;return story===null?null:typeof story=="function"?story:innerStory?{...normalizeFunctionalComponent(story),components:{...story.components||{},story:innerStory}}:{render(){return(0,import_vue.h)(story)}}}function decorateStory(storyFn,decorators){return decorators.reduce((decorated,decorator)=>context=>{let story,decoratedStory=decorator(update=>{let sanitizedUpdate=(0,import_preview_api.sanitizeStoryContextUpdate)(update);return update&&(sanitizedUpdate.args=Object.assign(context.args,sanitizedUpdate.args)),story=decorated({...context,...sanitizedUpdate}),story},context);return story||(story=decorated(context)),decoratedStory===story?story:prepare(decoratedStory,()=>(0,import_vue.h)(story))},context=>prepare(storyFn(context)))}var import_vue2=require("vue"),render=(props,context)=>{let{id,component:Component}=context;if(!Component)throw new Error(`Unable to render story ${id} as the component annotation is missing from the default export`);return()=>(0,import_vue2.h)(Component,props,generateSlots(context))},setupFunctions=new Set,setup=fn=>{setupFunctions.add(fn)},runSetupFunctions=(app,storyContext)=>{setupFunctions.forEach(fn=>fn(app,storyContext))},map=new Map;function renderToCanvas({storyFn,forceRemount,showMain,showException,storyContext,id},canvasElement){let existingApp=map.get(canvasElement);if(existingApp&&!forceRemount){let element=storyFn(),args=getArgs(element,storyContext);return updateArgs(existingApp.reactiveArgs,args),()=>{teardown(existingApp.vueApp,canvasElement)}}existingApp&&forceRemount&&teardown(existingApp.vueApp,canvasElement);let vueApp=(0,import_vue2.createApp)({setup(){storyContext.args=(0,import_vue2.reactive)(storyContext.args);let rootElement=storyFn(),args=getArgs(rootElement,storyContext),appState={vueApp,reactiveArgs:(0,import_vue2.reactive)(args)};return map.set(canvasElement,appState),()=>(0,import_vue2.h)(rootElement)}});return vueApp.config.errorHandler=e=>showException(e),runSetupFunctions(vueApp,storyContext),vueApp.mount(canvasElement),showMain(),()=>{teardown(vueApp,canvasElement)}}function generateSlots(context){let{argTypes}=context,slots=Object.entries(argTypes).filter(([key,value])=>{var _a2,_b;return((_b=(_a2=argTypes[key])==null?void 0:_a2.table)==null?void 0:_b.category)==="slots"}).map(([key,value])=>{let slotValue=context.args[key];return[key,typeof slotValue=="function"?slotValue:()=>slotValue]});return(0,import_vue2.reactive)(Object.fromEntries(slots))}function getArgs(element,storyContext){return element.props&&(0,import_vue2.isVNode)(element)?element.props:storyContext.args}function updateArgs(reactiveArgs,nextArgs){if(Object.keys(nextArgs).length===0)return;let currentArgs=(0,import_vue2.isReactive)(reactiveArgs)?reactiveArgs:(0,import_vue2.reactive)(reactiveArgs);Object.keys(currentArgs).forEach(key=>{key in nextArgs||delete currentArgs[key]}),Object.assign(currentArgs,nextArgs)}function teardown(storybookApp,canvasElement){storybookApp==null||storybookApp.unmount(),map.has(canvasElement)&&map.delete(canvasElement)}var RENDERER="vue3",api=(0,import_preview_api2.start)(renderToCanvas,{decorateStory,render}),storiesOf=(kind,m)=>api.clientApi.storiesOf(kind,m).addParameters({renderer:RENDERER}),configure=(...args)=>api.configure(RENDERER,...args),{forceReRender}=api,{raw}=api.clientApi;var _a;typeof module<"u"&&((_a=module==null?void 0:module.hot)==null||_a.decline());0&&(module.exports={configure,forceReRender,raw,setup,storiesOf});
package/dist/index.mjs CHANGED
@@ -1 +1,8 @@
1
- import{decorateStory,render,renderToCanvas,setup}from"./chunk-3MGVBGQN.mjs";import{global}from"@storybook/global";var{window:globalWindow}=global;globalWindow.STORYBOOK_ENV="vue3";import{start}from"@storybook/preview-api";var RENDERER="vue3",api=start(renderToCanvas,{decorateStory,render}),storiesOf=(kind,m)=>api.clientApi.storiesOf(kind,m).addParameters({renderer:RENDERER}),configure=(...args)=>api.configure(RENDERER,...args),{forceReRender}=api,{raw}=api.clientApi;typeof module<"u"&&module?.hot?.decline();export{configure,forceReRender,raw,setup,storiesOf};
1
+ import { renderToCanvas, decorateStory, render } from './chunk-SRVBJOBI.mjs';
2
+ export { setup } from './chunk-SRVBJOBI.mjs';
3
+ import { global } from '@storybook/global';
4
+ import { start } from '@storybook/preview-api';
5
+
6
+ var{window:globalWindow}=global;globalWindow.STORYBOOK_ENV="vue3";var RENDERER="vue3",api=start(renderToCanvas,{decorateStory,render}),storiesOf=(kind,m)=>api.clientApi.storiesOf(kind,m).addParameters({renderer:RENDERER}),configure=(...args)=>api.configure(RENDERER,...args),{forceReRender}=api,{raw}=api.clientApi;typeof module<"u"&&module?.hot?.decline();
7
+
8
+ export { configure, forceReRender, raw, storiesOf };
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@storybook/vue3",
3
- "version": "7.1.0-alpha.9",
3
+ "version": "7.1.0-beta.1",
4
4
  "description": "Storybook Vue 3 renderer",
5
5
  "keywords": [
6
6
  "storybook"
7
7
  ],
8
- "homepage": "https://github.com/storybookjs/storybook/tree/main/renderers/vue3",
8
+ "homepage": "https://github.com/storybookjs/storybook/tree/next/code/renderers/vue3",
9
9
  "bugs": {
10
10
  "url": "https://github.com/storybookjs/storybook/issues"
11
11
  },
12
12
  "repository": {
13
13
  "type": "git",
14
14
  "url": "https://github.com/storybookjs/storybook.git",
15
- "directory": "renderers/vue3"
15
+ "directory": "code/renderers/vue3"
16
16
  },
17
17
  "funding": {
18
18
  "type": "opencollective",
@@ -21,15 +21,15 @@
21
21
  "license": "MIT",
22
22
  "exports": {
23
23
  ".": {
24
+ "types": "./dist/index.d.ts",
24
25
  "node": "./dist/index.js",
25
26
  "require": "./dist/index.js",
26
- "import": "./dist/index.mjs",
27
- "types": "./dist/index.d.ts"
27
+ "import": "./dist/index.mjs"
28
28
  },
29
29
  "./preview": {
30
+ "types": "./dist/config.d.ts",
30
31
  "require": "./dist/config.js",
31
- "import": "./dist/config.mjs",
32
- "types": "./dist/config.d.ts"
32
+ "import": "./dist/config.mjs"
33
33
  },
34
34
  "./package.json": "./package.json"
35
35
  },
@@ -48,23 +48,27 @@
48
48
  "prep": "../../../scripts/prepare/bundle.ts"
49
49
  },
50
50
  "dependencies": {
51
- "@storybook/core-client": "7.1.0-alpha.9",
52
- "@storybook/docs-tools": "7.1.0-alpha.9",
51
+ "@storybook/core-client": "7.1.0-beta.1",
52
+ "@storybook/docs-tools": "7.1.0-beta.1",
53
53
  "@storybook/global": "^5.0.0",
54
- "@storybook/preview-api": "7.1.0-alpha.9",
55
- "@storybook/types": "7.1.0-alpha.9",
54
+ "@storybook/preview-api": "7.1.0-beta.1",
55
+ "@storybook/types": "7.1.0-beta.1",
56
+ "lodash": "^4.17.21",
56
57
  "ts-dedent": "^2.0.0",
57
- "type-fest": "2.19.0"
58
+ "type-fest": "^3.11.0",
59
+ "vue-component-type-helpers": "latest"
58
60
  },
59
61
  "devDependencies": {
60
62
  "@digitak/esrun": "^3.2.2",
61
63
  "@types/prettier": "2.7.2",
64
+ "@vue/compiler-core": "^3.3.4",
62
65
  "@vue/vue3-jest": "29",
63
66
  "typescript": "~4.9.3",
64
67
  "vue": "^3.2.47",
65
- "vue-tsc": "^1.2.0"
68
+ "vue-tsc": "latest"
66
69
  },
67
70
  "peerDependencies": {
71
+ "@vue/compiler-core": "^3.0.0",
68
72
  "vue": "^3.0.0"
69
73
  },
70
74
  "engines": {
@@ -80,5 +84,5 @@
80
84
  ],
81
85
  "platform": "browser"
82
86
  },
83
- "gitHead": "ec112401efaae6d3d4996c790a30301177570da9"
84
- }
87
+ "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae17"
88
+ }
@@ -0,0 +1 @@
1
+ declare var STORYBOOK_ENV: 'vue3';
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <header>
3
- <div class="wrapper">
3
+ <div class="storybook-header">
4
4
  <div>
5
5
  <svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
6
6
  <g fill="none" fill-rule="evenodd">
@@ -2,7 +2,7 @@
2
2
  <article>
3
3
  <my-header :user="user" @login="onLogin" @logout="onLogout" @createAccount="onCreateAccount" />
4
4
 
5
- <section>
5
+ <section class="storybook-page">
6
6
  <h2>Pages in Storybook</h2>
7
7
  <p>
8
8
  We recommend building UIs with a
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <header>
3
- <div class="wrapper">
3
+ <div class="storybook-header">
4
4
  <div>
5
5
  <svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
6
6
  <g fill="none" fill-rule="evenodd">
@@ -2,7 +2,7 @@
2
2
  <article>
3
3
  <my-header :user="user" @login="onLogin" @logout="onLogout" @create-account="onCreateAccount" />
4
4
 
5
- <section>
5
+ <section class="storybook-page">
6
6
  <h2>Pages in Storybook</h2>
7
7
  <p>
8
8
  We recommend building UIs with a
@@ -28,7 +28,9 @@
28
28
  </ul>
29
29
  <p>
30
30
  Get a guided tutorial on component-driven development at
31
- <a href="https://storybook.js.org/tutorials/" target="_blank" rel="noopener noreferrer">Storybook tutorials</a>
31
+ <a href="https://storybook.js.org/tutorials/" target="_blank" rel="noopener noreferrer"
32
+ >Storybook tutorials</a
33
+ >
32
34
  . Read more in the
33
35
  <a href="https://storybook.js.org/docs" target="_blank" rel="noopener noreferrer">docs</a>
34
36
  .
@@ -40,7 +42,9 @@
40
42
  <g fill="none" fill-rule="evenodd">
41
43
  <path
42
44
  d="M1.5 5.2h4.8c.3 0 .5.2.5.4v5.1c-.1.2-.3.3-.4.3H1.4a.5.5 0 01-.5-.4V5.7c0-.3.2-.5.5-.5zm0-2.1h6.9c.3 0 .5.2.5.4v7a.5.5 0 01-1 0V4H1.5a.5.5 0 010-1zm0-2.1h9c.3 0 .5.2.5.4v9.1a.5.5 0 01-1 0V2H1.5a.5.5 0 010-1zm4.3 5.2H2V10h3.8V6.2z"
43
- id="a" fill="#999" />
45
+ id="a"
46
+ fill="#999"
47
+ />
44
48
  </g>
45
49
  </svg>
46
50
  Viewports addon in the toolbar
@@ -55,7 +59,7 @@ import MyHeader from './Header.vue';
55
59
 
56
60
  import { ref } from 'vue';
57
61
 
58
- const user = ref<{ name: string } | null>(null)
62
+ const user = ref<{ name: string } | null>(null);
59
63
 
60
64
  const onLogin = () => {
61
65
  user.value = { name: 'Jane Doe' };
@@ -66,5 +70,4 @@ const onLogout = () => {
66
70
  const onCreateAccount = () => {
67
71
  user.value = { name: 'Jane Doe' };
68
72
  };
69
-
70
73
  </script>
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <header>
3
- <div class="wrapper">
3
+ <div class="storybook-header">
4
4
  <div>
5
5
  <svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
6
6
  <g fill="none" fill-rule="evenodd">
@@ -2,7 +2,7 @@
2
2
  <article>
3
3
  <my-header :user="user" @login="onLogin" @logout="onLogout" @create-account="onCreateAccount" />
4
4
 
5
- <section>
5
+ <section class="storybook-page">
6
6
  <h2>Pages in Storybook</h2>
7
7
  <p>
8
8
  We recommend building UIs with a
@@ -28,7 +28,9 @@
28
28
  </ul>
29
29
  <p>
30
30
  Get a guided tutorial on component-driven development at
31
- <a href="https://storybook.js.org/tutorials/" target="_blank" rel="noopener noreferrer">Storybook tutorials</a>
31
+ <a href="https://storybook.js.org/tutorials/" target="_blank" rel="noopener noreferrer"
32
+ >Storybook tutorials</a
33
+ >
32
34
  . Read more in the
33
35
  <a href="https://storybook.js.org/docs" target="_blank" rel="noopener noreferrer">docs</a>
34
36
  .
@@ -40,7 +42,9 @@
40
42
  <g fill="none" fill-rule="evenodd">
41
43
  <path
42
44
  d="M1.5 5.2h4.8c.3 0 .5.2.5.4v5.1c-.1.2-.3.3-.4.3H1.4a.5.5 0 01-.5-.4V5.7c0-.3.2-.5.5-.5zm0-2.1h6.9c.3 0 .5.2.5.4v7a.5.5 0 01-1 0V4H1.5a.5.5 0 010-1zm0-2.1h9c.3 0 .5.2.5.4v9.1a.5.5 0 01-1 0V2H1.5a.5.5 0 010-1zm4.3 5.2H2V10h3.8V6.2z"
43
- id="a" fill="#999" />
45
+ id="a"
46
+ fill="#999"
47
+ />
44
48
  </g>
45
49
  </svg>
46
50
  Viewports addon in the toolbar
@@ -55,7 +59,7 @@ import MyHeader from './Header.vue';
55
59
 
56
60
  import { ref } from 'vue';
57
61
 
58
- const user = ref<{ name: string } | null>(null)
62
+ const user = ref<{ name: string } | null>(null);
59
63
 
60
64
  const onLogin = () => {
61
65
  user.value = { name: 'Jane Doe' };
@@ -66,5 +70,4 @@ const onLogout = () => {
66
70
  const onCreateAccount = () => {
67
71
  user.value = { name: 'Jane Doe' };
68
72
  };
69
-
70
73
  </script>
@@ -2,7 +2,7 @@
2
2
  <form id="interaction-test-form" @submit.prevent="onSubmit">
3
3
  <label>
4
4
  Enter Value
5
- <input type="text" data-testid="value" :value="value" required @click="setValue" />
5
+ <input type="text" data-testid="value" v-model="value" required />
6
6
  </label>
7
7
  <button type="submit">Submit</button>
8
8
  <p v-if="complete">Completed!!</p>
@@ -27,9 +27,6 @@ export default {
27
27
  },
28
28
 
29
29
  methods: {
30
- setValue(event) {
31
- this.value = event.target.value;
32
- },
33
30
  onSubmit() {
34
31
  this.onSuccess(this.value);
35
32
  setTimeout(() => {
@@ -1,25 +1,12 @@
1
- import type { App, Plugin } from 'vue';
2
- import type { StoryContext } from '@storybook/csf';
3
1
  import { global as globalThis } from '@storybook/global';
4
2
  // eslint-disable-next-line import/no-extraneous-dependencies
5
- import { setup, type VueRenderer } from '@storybook/vue3';
3
+ import { setup } from '@storybook/vue3';
6
4
 
7
- declare module 'vue' {
8
- interface ComponentCustomProperties {
9
- $greetingMessage: (key: string) => string;
10
- }
11
- }
12
-
13
- declare global {
14
- // eslint-disable-next-line no-var,vars-on-top
15
- var Components: Record<string, any>;
16
- }
17
-
18
- const somePlugin: Plugin = {
19
- install: (app: App, options) => {
5
+ const somePlugin = {
6
+ install: (app, options) => {
20
7
  // inject a globally available $greetingText() method
21
8
  // eslint-disable-next-line no-param-reassign
22
- app.config.globalProperties.$greetingMessage = (key: string) => {
9
+ app.config.globalProperties.$greetingMessage = (key) => {
23
10
  // retrieve a nested property in `options`
24
11
  // using `key`
25
12
  return options.greetings[key];
@@ -29,13 +16,13 @@ const somePlugin: Plugin = {
29
16
  const someColor = 'someColor';
30
17
 
31
18
  // add components to global scope
32
- setup((app: App) => {
19
+ setup((app) => {
33
20
  // This adds a component that can be used globally in stories
34
21
  app.component('GlobalButton', globalThis.Components.Button);
35
22
  });
36
23
 
37
24
  // this adds a plugin to vue app that can be used globally in stories
38
- setup((app: App, context?: StoryContext<VueRenderer>) => {
25
+ setup((app, context) => {
39
26
  app.use(somePlugin, {
40
27
  greetings: {
41
28
  hello: `Hello Story! from some plugin your name is ${context?.name}!`,
@@ -46,6 +33,6 @@ setup((app: App, context?: StoryContext<VueRenderer>) => {
46
33
  });
47
34
 
48
35
  // additonal setup to provide some propriety to the app
49
- setup((app: App, context) => {
36
+ setup((app, context) => {
50
37
  app.provide(someColor, 'green');
51
38
  });
@@ -27,8 +27,6 @@ export {
27
27
  NoDecorators,
28
28
  DecoratorFunctionalComponent,
29
29
  DecoratorFunctionalComponentArgsFromContext,
30
- DecoratorFunctionalComponentArgsFromProps,
31
30
  DecoratorComponentOptions,
32
31
  DecoratorComponentOptionsArgsFromData,
33
- DecoratorComponentOptionsArgsFromProps,
34
32
  } from './ReactiveDecorators.stories';
@@ -40,8 +40,6 @@ export {
40
40
  NoDecorators,
41
41
  DecoratorFunctionalComponent,
42
42
  DecoratorFunctionalComponentArgsFromContext,
43
- DecoratorFunctionalComponentArgsFromProps,
44
43
  DecoratorComponentOptions,
45
44
  DecoratorComponentOptionsArgsFromData,
46
- DecoratorComponentOptionsArgsFromProps,
47
45
  } from './ReactiveDecorators.stories';
@@ -1,5 +1,8 @@
1
+ /// <reference types="jest" />
2
+ /// <reference types="testing-library__jest-dom" />
3
+
1
4
  import { expect } from '@storybook/jest';
2
- import type { Meta, StoryObj } from 'renderers/vue3/src';
5
+ import type { Meta, StoryObj } from '@storybook/vue3';
3
6
  import { within } from '@storybook/testing-library';
4
7
  import { inject } from 'vue';
5
8
  import GlobalSetup from './GlobalSetup.vue';
@@ -88,10 +88,12 @@ export const ReactiveHtmlWrapper: Story = {
88
88
  };
89
89
 
90
90
  // to test that Simple html Decorators in CSF2 format are applied correctly in reactive mode
91
- const ReactiveCSF2WrapperTempl: StoryFn = (args, { argTypes }) => ({
91
+ const ReactiveCSF2WrapperTempl: StoryFn = (args) => ({
92
92
  components: { ReactiveArgs },
93
- props: Object.keys(argTypes),
94
- template: '<ReactiveArgs v-bind="$props" />',
93
+ setup() {
94
+ return { args };
95
+ },
96
+ template: '<ReactiveArgs v-bind="args" />',
95
97
  });
96
98
 
97
99
  export const ReactiveCSF2Wrapper = ReactiveCSF2WrapperTempl.bind({});
@@ -51,7 +51,7 @@ export const DecoratorFunctionalComponent: Story = {
51
51
  decorators: [
52
52
  (storyFn, context) => {
53
53
  const story = storyFn();
54
- return () => h('div', [h('h2', ['Decorator not using args']), [h(story, context.args)]]);
54
+ return () => h('div', [h('h2', ['Decorator not using args']), [h(story)]]);
55
55
  },
56
56
  ],
57
57
  };
@@ -61,20 +61,7 @@ export const DecoratorFunctionalComponentArgsFromContext: Story = {
61
61
  (storyFn, context) => {
62
62
  const story = storyFn();
63
63
  return () =>
64
- h('div', [
65
- h('h2', ['Decorator using args.label: ', context.args.label]),
66
- [h(story, context.args)],
67
- ]);
68
- },
69
- ],
70
- };
71
-
72
- export const DecoratorFunctionalComponentArgsFromProps: Story = {
73
- decorators: [
74
- (storyFn, context) => {
75
- const story = storyFn();
76
- return (args) =>
77
- h('div', [h('h2', `Decorator using args.label: ${args.label}`), h(story, context.args)]);
64
+ h('div', [h('h2', ['Decorator using args.label: ', context.args.label]), [h(story)]]);
78
65
  },
79
66
  ],
80
67
  };
@@ -99,14 +86,3 @@ export const DecoratorComponentOptionsArgsFromData: Story = {
99
86
  },
100
87
  ],
101
88
  };
102
-
103
- export const DecoratorComponentOptionsArgsFromProps: Story = {
104
- decorators: [
105
- (storyFn, context) => {
106
- return {
107
- props: ['label'],
108
- template: '<div><h2>Decorator using label: {{label}}</h2><story /></div>',
109
- };
110
- },
111
- ],
112
- };
@@ -60,7 +60,7 @@ export const CustomRender: Story = {
60
60
  setup() {
61
61
  return { args };
62
62
  },
63
- template: `<MySlotComponent :label="args.label" v-slot="slotProps">
63
+ template: `<MySlotComponent v-bind="args" v-slot="slotProps">
64
64
  {{ slotProps.text }}, {{ slotProps.year }}
65
65
  </MySlotComponent>`,
66
66
  }),
@@ -73,7 +73,7 @@ export const CustomRenderUsingFunctionSlot: Story = {
73
73
  setup() {
74
74
  return { args };
75
75
  },
76
- template: `<MySlotComponent :label="args.label" v-slot="slotProps">
76
+ template: `<MySlotComponent v-bind="args" v-slot="slotProps">
77
77
  {{args.default(slotProps)}}
78
78
  </MySlotComponent>`,
79
79
  }),
@@ -0,0 +1,46 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3';
2
+
3
+ import GlobalUsage from './GlobalUsage.vue';
4
+ import GlobalSetup from './GlobalSetup.vue';
5
+
6
+ const meta: Meta = {
7
+ component: GlobalUsage,
8
+ argTypes: {},
9
+ tags: ['autodocs'],
10
+ } satisfies Meta<typeof GlobalUsage>;
11
+
12
+ export default meta;
13
+ type Story = StoryObj<typeof meta>;
14
+
15
+ export const MultiComponents: Story = {
16
+ args: {
17
+ label: 'Button',
18
+ size: 'large',
19
+ backgroundColor: '#aa00ff',
20
+ btn1Args: { label: 'Button 10', size: 'small', backgroundColor: '#aa00ff' },
21
+ },
22
+ render(args: any) {
23
+ return {
24
+ components: { GlobalUsage, GlobalSetup },
25
+ setup() {
26
+ return { args };
27
+ },
28
+ template: `<div style="background-color:pink;opacity:0.9;padding:20px" >
29
+
30
+ <div style="display:flex;gap:10px">
31
+ <img src="https://user-images.githubusercontent.com/263385/199832481-bbbf5961-6a26-481d-8224-51258cce9b33.png" width="200" />
32
+ <GlobalUsage v-bind="args.btn1Args" />&nbsp;
33
+ </div>
34
+ <h2>Complex Story Custom template </h2> <br/> <hr/>
35
+
36
+ <GlobalSetup :label="args.label" />
37
+ <div style="margin:8px"><span style="font-size:28px;color:green">Multiple </span>
38
+ <span style="background-color:magenta;opacity:0.9;padding:8px"><i>Components</i></span></div>
39
+ <div style="display:flex;gap:10px">
40
+ <GlobalUsage v-bind="args" />
41
+ <GlobalUsage label="Static Label Dynamic color" :background-color="args.backgroundColor"/>
42
+ </div>
43
+ </div>`,
44
+ };
45
+ },
46
+ };
@@ -0,0 +1,12 @@
1
+ declare module 'vue' {
2
+ interface ComponentCustomProperties {
3
+ $greetingMessage: (key: string) => string;
4
+ }
5
+ }
6
+
7
+ declare global {
8
+ // eslint-disable-next-line no-var,vars-on-top
9
+ var Components: Record<string, any>;
10
+ }
11
+
12
+ export default {};
@@ -1 +0,0 @@
1
- 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 __commonJS=(cb,mod)=>function(){return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __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));import{h}from"vue";import{sanitizeStoryContextUpdate}from"@storybook/preview-api";function makeMap(str,expectsLowerCase){let map2=Object.create(null),list=str.split(",");for(let i=0;i<list.length;i++)map2[list[i]]=!0;return expectsLowerCase?val=>!!map2[val.toLowerCase()]:val=>!!map2[val]}var specialBooleanAttrs="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly";var isBooleanAttr=makeMap(specialBooleanAttrs+",async,autofocus,autoplay,controls,default,defer,disabled,hidden,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected");function looseCompareArrays(a,b){if(a.length!==b.length)return!1;let equal=!0;for(let i=0;equal&&i<a.length;i++)equal=looseEqual(a[i],b[i]);return equal}function looseEqual(a,b){if(a===b)return!0;let aValidType=isDate(a),bValidType=isDate(b);if(aValidType||bValidType)return aValidType&&bValidType?a.getTime()===b.getTime():!1;if(aValidType=isSymbol(a),bValidType=isSymbol(b),aValidType||bValidType)return a===b;if(aValidType=isArray(a),bValidType=isArray(b),aValidType||bValidType)return aValidType&&bValidType?looseCompareArrays(a,b):!1;if(aValidType=isObject(a),bValidType=isObject(b),aValidType||bValidType){if(!aValidType||!bValidType)return!1;let aKeysCount=Object.keys(a).length,bKeysCount=Object.keys(b).length;if(aKeysCount!==bKeysCount)return!1;for(let key in a){let aHasKey=a.hasOwnProperty(key),bHasKey=b.hasOwnProperty(key);if(aHasKey&&!bHasKey||!aHasKey&&bHasKey||!looseEqual(a[key],b[key]))return!1}}return String(a)===String(b)}var EMPTY_OBJ=Object.freeze({}),EMPTY_ARR=Object.freeze([]);var isArray=Array.isArray;var isDate=val=>toTypeString(val)==="[object Date]";var isSymbol=val=>typeof val=="symbol",isObject=val=>val!==null&&typeof val=="object";var objectToString=Object.prototype.toString,toTypeString=value=>objectToString.call(value);var cacheStringFunction=fn=>{let cache=Object.create(null);return str=>cache[str]||(cache[str]=fn(str))},camelizeRE=/-(\w)/g,camelize=cacheStringFunction(str=>str.replace(camelizeRE,(_,c)=>c?c.toUpperCase():"")),hyphenateRE=/\B([A-Z])/g,hyphenate=cacheStringFunction(str=>str.replace(hyphenateRE,"-$1").toLowerCase()),capitalize=cacheStringFunction(str=>str.charAt(0).toUpperCase()+str.slice(1)),toHandlerKey=cacheStringFunction(str=>str?`on${capitalize(str)}`:"");function normalizeFunctionalComponent(options){return typeof options=="function"?{render:options,name:options.name}:options}function prepare(rawStory,innerStory){let story=rawStory;return story===null?null:typeof story=="function"?story:innerStory?{...normalizeFunctionalComponent(story),components:{...story.components||{},story:innerStory}}:{render(){return h(story)}}}function decorateStory(storyFn,decorators){let updatedArgs;return decorators.reduce((decorated,decorator)=>context=>{let story,decoratedStory=decorator(update=>(story=decorated({...context,...sanitizeStoryContextUpdate(update)}),update&&update.args&&!looseEqual(update.args,context.args)&&(updatedArgs??=update.args),story),context);return context.args=updatedArgs??context.args,story||(story=decorated(context)),decoratedStory===story?story:prepare(decoratedStory,()=>h(story,context.args))},context=>prepare(storyFn(context)))}import{createApp,h as h2,reactive,isVNode,isReactive}from"vue";var slotsMap=new Map,render=(props,context)=>{let{id,component:Component}=context;if(!Component)throw new Error(`Unable to render story ${id} as the component annotation is missing from the default export`);return h2(Component,props,createOrUpdateSlots(context))},setupFunctions=new Set,setup=fn=>{setupFunctions.add(fn)},runSetupFunctions=(app,storyContext)=>{setupFunctions.forEach(fn=>fn(app,storyContext))},map=new Map;function renderToCanvas({storyFn,forceRemount,showMain,showException,storyContext,id},canvasElement){let existingApp=map.get(canvasElement);if(existingApp&&!forceRemount){let element=storyFn(),args=getArgs(element,storyContext);return updateArgs(existingApp.reactiveArgs,args),()=>{teardown(existingApp.vueApp,canvasElement)}}existingApp&&forceRemount&&teardown(existingApp.vueApp,canvasElement);let vueApp=createApp({setup(){storyContext.args=reactive(storyContext.args);let rootElement=storyFn(),args=getArgs(rootElement,storyContext),appState={vueApp,reactiveArgs:reactive(args)};return map.set(canvasElement,appState),()=>h2(rootElement,appState.reactiveArgs)}});return vueApp.config.errorHandler=e=>showException(e),runSetupFunctions(vueApp,storyContext),vueApp.mount(canvasElement),showMain(),()=>{teardown(vueApp,canvasElement)}}function generateSlots(context){let{argTypes}=context,slots=Object.entries(argTypes).filter(([key,value])=>argTypes[key]?.table?.category==="slots").map(([key,value])=>{let slotValue=context.args[key];return[key,typeof slotValue=="function"?slotValue:()=>slotValue]});return reactive(Object.fromEntries(slots))}function getArgs(element,storyContext){return element.props&&isVNode(element)?element.props:storyContext.args}function updateArgs(reactiveArgs,nextArgs){if(Object.keys(nextArgs).length===0)return;let currentArgs=isReactive(reactiveArgs)?reactiveArgs:reactive(reactiveArgs);Object.keys(currentArgs).forEach(key=>{key in nextArgs||delete currentArgs[key]}),Object.assign(currentArgs,nextArgs)}function teardown(storybookApp,canvasElement){storybookApp?.unmount(),map.has(canvasElement)&&map.delete(canvasElement)}function createOrUpdateSlots(context){let{id:storyID,component}=context,slots=generateSlots(context);if(slotsMap.has(storyID)){let app=slotsMap.get(storyID);return app?.reactiveSlots&&updateArgs(app.reactiveSlots,slots),app?.reactiveSlots}return slotsMap.set(storyID,{component,reactiveSlots:slots}),slots}export{__commonJS,__toESM,isArray,decorateStory,render,setup,renderToCanvas};
@@ -1,33 +0,0 @@
1
- import type { Meta } from '@storybook/vue3';
2
- import { defineComponent } from 'vue';
3
- import Reactivity from './Reactivity.vue';
4
- import * as ReactiveDecorators from './ReactiveDecorators.stories';
5
-
6
- const meta = {
7
- ...ReactiveDecorators.default,
8
- component: Reactivity,
9
- render: (args, { argTypes }) => {
10
- return defineComponent({
11
- props: Object.keys(argTypes),
12
- components: { Reactivity },
13
- template: `<div>Custom render uses options api and binds args to props: <Reactivity v-bind="$props">
14
- <template #header="{title}"><h3>{{ header }} - Title: {{ title }}</h3></template>
15
- {{ $props.default }}
16
- <template #footer>{{ footer }}</template>
17
- </Reactivity>
18
- </div>`,
19
- });
20
- },
21
- } satisfies Meta<typeof Reactivity>;
22
-
23
- export default meta;
24
-
25
- export {
26
- NoDecorators,
27
- DecoratorFunctionalComponent,
28
- DecoratorFunctionalComponentArgsFromContext,
29
- DecoratorFunctionalComponentArgsFromProps,
30
- DecoratorComponentOptions,
31
- DecoratorComponentOptionsArgsFromData,
32
- DecoratorComponentOptionsArgsFromProps,
33
- } from './ReactiveDecorators.stories';