@etchteam/storybook-addon-css-variables-theme
Version:
Switch CSS files to change themes
1 lines • 4.61 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.js","../src/constants.js","../src/cookie.js"],"names":["addons","makeDecorator","ADDON_ID","CLEAR_LABEL","EVENT_NAME","getCookie","cname","name","ca","i","c","setCookie","cvalue","exdays","d","expires","currentCSS","addBrandStyles","id","files","file","handleStyleSwitch","save","customEvent","src_default","getStory","context","parameters","theme","defaultTheme","globalsTheme","channel","cookieId","savedTheme","themeToLoad"],"mappings":"AAAA,OAAS,UAAAA,EAAQ,iBAAAC,MAAqB,yBCA/B,IAAMC,EAAW,eACXC,EAAc,WACdC,EAAa,qCCFnB,SAASC,EAAUC,EAAO,CAC/B,IAAMC,EAAO,GAAGD,CAAK,IAEfE,EADgB,mBAAmB,SAAS,MAAM,EAC/B,MAAM,GAAG,EAElC,QAASC,EAAI,EAAGA,EAAID,EAAG,OAAQC,IAAK,CAClC,IAAIC,EAAIF,EAAGC,CAAC,EACZ,KAAOC,EAAE,WAAW,GAAG,GACrBA,EAAIA,EAAE,UAAU,CAAC,EAEnB,GAAIA,EAAE,WAAWH,CAAI,EACnB,OAAOG,EAAE,UAAUH,EAAK,OAAQG,EAAE,MAAM,CAE5C,CACA,OAAO,IACT,CAEO,SAASC,EAAUL,EAAOM,EAAQC,EAAQ,CAC/C,IAAMC,EAAI,IAAI,KACdA,EAAE,QAAQA,EAAE,QAAQ,EAAID,EAAS,GAAK,GAAK,GAAK,GAAI,EACpD,IAAME,EAAU,WAAWD,EAAE,YAAY,CAAC,GAC1C,SAAS,OAAS,GAAGR,CAAK,IAAIM,CAAM,IAAIG,CAAO,SACjD,CFjBA,IAAIC,EAAa,KAEjB,eAAeC,EAAeC,EAAIC,EAAO,CACvC,IAAMC,EAAOD,EAAMD,CAAE,EAEjBE,IACFA,EAAK,IAAI,EAGLJ,GACFA,EAAW,MAAM,EAGnBA,EAAaI,GAGXJ,GAAcE,IAAOf,IACvBa,EAAW,MAAM,EACjBA,EAAa,KAEjB,CAEA,SAASK,EAAkB,CAAE,GAAAH,EAAI,MAAAC,EAAO,KAAAG,CAAK,EAAG,CAC9CL,EAAeC,EAAIC,CAAK,EAEpBG,GACFX,EAAUT,EAAUgB,EAAI,EAAE,EAG5B,IAAMK,EAAc,IAAI,YAAYnB,EAAY,CAAE,OAAQ,CAAE,MAAOc,CAAG,CAAE,CAAC,EACzE,UAAU,cAAcK,CAAW,CACrC,CAEA,IAAOC,EAAQvB,EAAc,CAC3B,KAAM,sBACN,cAAeC,EACf,QAAS,CAACuB,EAAUC,EAAS,CAAE,WAAAC,CAAW,IAAM,CAC9C,GAAM,CAAE,MAAAR,EAAO,MAAAS,EAAO,aAAAC,CAAa,EAAIF,EACjCG,EAAeJ,EAAQ,QAAQxB,CAAQ,EACvC6B,EAAU/B,EAAO,WAAW,EAC5BgC,EAAW3B,EAAUH,CAAQ,EAG7B+B,EADJ,OAAO,OAAOd,EAAOa,CAAQ,GAAKA,IAAa7B,EACd6B,EAAW,KACxCE,EAAcJ,GAAgBF,GAASK,GAAcJ,EAE3D,OAAAH,EAAQ,QAAQxB,CAAQ,EAAIgC,EAE5Bb,EAAkB,CAChB,GAAIa,EACJ,MAAAf,EACA,KAAM,CAACS,GAAS,CAACK,CACnB,CAAC,EAEDF,EAAQ,GAAG,GAAG7B,CAAQ,SAAU,CAAC,CAAE,GAAAgB,CAAG,IACpCG,EAAkB,CAAE,GAAAH,EAAI,MAAAC,EAAO,KAAM,EAAK,CAAC,CAC7C,EAEOM,EAASC,CAAO,CACzB,CACF,CAAC","sourcesContent":["import { addons, makeDecorator } from '@storybook/preview-api';\n\nimport { ADDON_ID, CLEAR_LABEL, EVENT_NAME } from './constants';\nimport { getCookie, setCookie } from './cookie';\n\nlet currentCSS = null;\n\nasync function addBrandStyles(id, files) {\n const file = files[id];\n\n if (file) {\n file.use();\n\n // If we've got a CSS file in use, turn it off\n if (currentCSS) {\n currentCSS.unuse();\n }\n\n currentCSS = file;\n }\n\n if (currentCSS && id === CLEAR_LABEL) {\n currentCSS.unuse();\n currentCSS = null;\n }\n}\n\nfunction handleStyleSwitch({ id, files, save }) {\n addBrandStyles(id, files);\n\n if (save) {\n setCookie(ADDON_ID, id, 10);\n }\n\n const customEvent = new CustomEvent(EVENT_NAME, { detail: { theme: id } });\n document?.dispatchEvent(customEvent);\n}\n\nexport default makeDecorator({\n name: 'CSS Variables Theme',\n parameterName: ADDON_ID,\n wrapper: (getStory, context, { parameters }) => {\n const { files, theme, defaultTheme } = parameters;\n const globalsTheme = context.globals[ADDON_ID];\n const channel = addons.getChannel();\n const cookieId = getCookie(ADDON_ID);\n const hasSavedTheme =\n Object.hasOwn(files, cookieId) || cookieId === CLEAR_LABEL;\n const savedTheme = hasSavedTheme ? cookieId : null;\n const themeToLoad = globalsTheme || theme || savedTheme || defaultTheme;\n\n context.globals[ADDON_ID] = themeToLoad;\n\n handleStyleSwitch({\n id: themeToLoad,\n files,\n save: !theme || !savedTheme,\n });\n\n channel.on(`${ADDON_ID}Change`, ({ id }) =>\n handleStyleSwitch({ id, files, save: true }),\n );\n\n return getStory(context);\n },\n});\n","export const ADDON_ID = 'cssVariables';\nexport const CLEAR_LABEL = 'No Theme';\nexport const EVENT_NAME = 'storybookcssvariables:theme:change';\n","export function getCookie(cname) {\n const name = `${cname}=`;\n const decodedCookie = decodeURIComponent(document.cookie);\n const ca = decodedCookie.split(';');\n\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.startsWith(' ')) {\n c = c.substring(1);\n }\n if (c.startsWith(name)) {\n return c.substring(name.length, c.length);\n }\n }\n return null;\n}\n\nexport function setCookie(cname, cvalue, exdays) {\n const d = new Date();\n d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);\n const expires = `expires=${d.toUTCString()}`;\n document.cookie = `${cname}=${cvalue};${expires};path=/`;\n}\n"]}