@dash-ui/compound
Version:
A utility for creating compound styles with dash-ui
1 lines • 5.07 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../src/index.ts"],"sourcesContent":["import type {\n ResponsiveLazy,\n ResponsiveOne,\n ResponsiveStyle,\n ResponsiveStyles,\n} from \"@dash-ui/responsive\";\nimport type {\n DashThemes,\n DashTokens,\n Style,\n Styles,\n StylesLazy,\n StylesOne,\n} from \"@dash-ui/styles\";\n\n/**\n * A factory function that creates a compound styles utility\n *\n * @param styles\n */\nfunction compound<Tokens extends DashTokens, Themes extends DashThemes>(\n styles: Styles<Tokens, Themes> | ResponsiveStyles<Tokens, Themes, any>\n) {\n /**\n * A function for creating compound/multi-variant styles\n *\n * @param styleMap\n * @param options\n */\n return function compoundStyles<\n Keys extends string,\n T extends Record<\n Keys,\n | ResponsiveStyle<any, any, any, any>\n | Style<any>\n | StylesOne\n | ResponsiveOne<any>\n | StylesLazy<any>\n | ResponsiveLazy<any, any>\n >,\n StyleMap extends { [Name in keyof T]: T[Name] }\n >(\n styleMap: StyleMap,\n options: CompoundStylesOptions = emptyObj\n ): CompoundStyle<Keys, T, StyleMap> {\n const cache: Record<string, string[]> = {};\n const mapKeys: string[] = Object.keys(styleMap);\n\n function atomicCss(compoundMap: {\n [Name in keyof StyleMap]?: Parameters<StyleMap[Name]>[0];\n }): string[] {\n const key = JSON.stringify(compoundMap);\n const cached = cache[key];\n if (cached) return cached;\n\n const output: string[] =\n // @ts-expect-error\n typeof styleMap.default === \"function\"\n ? [\n // @ts-expect-error\n styleMap.default.css(),\n ]\n : [];\n\n for (let i = 0; i < mapKeys.length; i++) {\n const key = mapKeys[i];\n if (key === \"default\") continue;\n const value = (compoundMap as any)[key];\n if (value === void 0 || value === null) continue;\n output.push((styleMap as any)[key]?.css(value));\n }\n\n return (cache[key] = output);\n }\n\n function css(compoundMap: {\n [Name in keyof StyleMap]?: Parameters<StyleMap[Name]>[0];\n }): string {\n return \"\".concat(...atomicCss(compoundMap));\n }\n\n function compoundStyle(\n compoundMap: {\n [Name in keyof StyleMap]?: Parameters<StyleMap[Name]>[0];\n } = {},\n compoundOptions: CompoundStylesOptions = emptyObj\n ): string {\n if (compoundOptions.atomic ?? options.atomic) {\n const css = atomicCss(compoundMap);\n let classes = \"\";\n\n for (let i = 0; i < css.length; i++) {\n classes += styles.cls(css[i]) + (i === css.length - 1 ? \"\" : \" \");\n }\n\n return classes;\n }\n\n return styles.cls(css(compoundMap));\n }\n\n return Object.assign(compoundStyle, {\n css,\n atomicCss,\n styles: styleMap,\n });\n };\n}\n\nconst emptyObj = {};\n\nexport type CompoundStyle<\n Keys extends string,\n T extends Record<\n Keys,\n | ResponsiveStyle<any, any, any, any>\n | Style<any>\n | StylesOne\n | ResponsiveOne<any>\n | StylesLazy<any>\n | ResponsiveLazy<any, any>\n >,\n StyleMap extends { [Name in keyof T]: T[Name] }\n> = {\n (\n compoundMap?: {\n [Name in keyof StyleMap]?: Parameters<StyleMap[Name]>[0] | undefined;\n },\n compoundOptions?: CompoundStylesOptions\n ): string;\n\n atomicCss(compoundMap: {\n [Name in keyof StyleMap]?: Parameters<StyleMap[Name]>[0];\n }): string[];\n\n css(compoundMap: {\n [Name in keyof StyleMap]?: Parameters<StyleMap[Name]>[0];\n }): string;\n\n styles: StyleMap;\n};\n\nexport type CompoundStylesOptions = {\n atomic?: boolean;\n};\n\nexport default compound;\n"],"names":["compound","styles","styleMap","options","atomicCss","compoundMap","key","JSON","stringify","cached","cache","output","default","css","i","mapKeys","length","_key2","value","push","concat","emptyObj","Object","keys","assign","compoundOptions","_compoundOptions$atom","atomic","classes","cls"],"mappings":"AAoBA,SAASA,EACPC,GAQA,OAAO,SAaLC,EACAC,GAKA,SAASC,EAAUC,GAGjB,IAAMC,EAAMC,KAAKC,UAAUH,GACrBI,EAASC,EAAMJ,GACrB,GAAIG,EAAQ,OAAOA,EAWnB,IATA,IAAME,EAEwB,mBAArBT,EAASU,QACZ,CAEEV,EAASU,QAAQC,OAEnB,GAEGC,EAAI,EAAGA,EAAIC,EAAQC,OAAQF,IAAK,CAAA,IAAAG,EACjCX,EAAMS,EAAQD,GACpB,GAAY,YAARR,EAAJ,CACA,IAAMY,EAASb,EAAoBC,GAC/BY,SACJP,EAAOQ,KAAP,QAAajB,EAAAA,EAAiBI,UAA9B,IAAAW,OAAA,EAAYA,EAAwBJ,IAAIK,GAHjB,CAIxB,CAED,OAAQR,EAAMJ,GAAOK,CACtB,CAED,SAASE,EAAIR,GAGX,MAAO,GAAGe,UAAUhB,EAAUC,GAC/B,MAnCiC,IADlCF,IAAAA,EAAiCkB,GAEjC,IAAMX,EAAkC,CAAA,EAClCK,EAAoBO,OAAOC,KAAKrB,GAuDtC,OAAOoB,OAAOE,QApBd,SACEnB,EAGAoB,GACQ,IAAAC,EACR,QADQ,IAJRrB,IAAAA,EAEI,CAAA,QAEI,IADRoB,IAAAA,EAAyCJ,WAEzCK,EAAID,EAAgBE,sBAAUxB,EAAQwB,OAAQ,CAI5C,IAHA,IAAMd,EAAMT,EAAUC,GAClBuB,EAAU,GAELd,EAAI,EAAGA,EAAID,EAAIG,OAAQF,IAC9Bc,GAAW3B,EAAO4B,IAAIhB,EAAIC,KAAOA,IAAMD,EAAIG,OAAS,EAAI,GAAK,KAG/D,OAAOY,CACR,CAED,OAAO3B,EAAO4B,IAAIhB,EAAIR,GACvB,GAEmC,CAClCQ,MACAT,YACAH,OAAQC,IAGb,CAED,IAAMmB,EAAW,CAAjB"}