@yak/react 0.0.0-stage → 10.0.0-rc.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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +114 -2
  3. package/dist/context/baseContext.d.ts +5 -0
  4. package/dist/context/baseContext.js +8 -0
  5. package/dist/context/baseContext.js.map +1 -0
  6. package/dist/context/index.d.ts +20 -0
  7. package/dist/context/index.js +15 -0
  8. package/dist/context/index.js.map +1 -0
  9. package/dist/context/index.server.d.ts +9 -0
  10. package/dist/context/index.server.js +17 -0
  11. package/dist/context/index.server.js.map +1 -0
  12. package/dist/cross-file-resolver/index.d.ts +199 -0
  13. package/dist/cross-file-resolver/index.js +569 -0
  14. package/dist/cross-file-resolver/index.js.map +1 -0
  15. package/dist/index.d.ts +320 -0
  16. package/dist/index.js +2 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/internal.d.ts +452 -0
  19. package/dist/internal.js +363 -0
  20. package/dist/internal.js.map +1 -0
  21. package/dist/isolated-source-eval/index.d.ts +30 -0
  22. package/dist/isolated-source-eval/index.js +317 -0
  23. package/dist/isolated-source-eval/index.js.map +1 -0
  24. package/dist/isolated-source-eval/worker.js +59 -0
  25. package/dist/isolated-source-eval/worker.js.map +1 -0
  26. package/dist/jsx-dev-runtime.d.ts +7 -0
  27. package/dist/jsx-dev-runtime.js +2 -0
  28. package/dist/jsx-dev-runtime.js.map +1 -0
  29. package/dist/jsx-runtime.d.ts +38 -0
  30. package/dist/jsx-runtime.js +2 -0
  31. package/dist/jsx-runtime.js.map +1 -0
  32. package/dist/loaders/turbo-loader.d.ts +15 -0
  33. package/dist/loaders/turbo-loader.js +816 -0
  34. package/dist/loaders/turbo-loader.js.map +1 -0
  35. package/dist/loaders/vite-plugin.d.ts +103 -0
  36. package/dist/loaders/vite-plugin.js +885 -0
  37. package/dist/loaders/vite-plugin.js.map +1 -0
  38. package/dist/loaders/webpack-loader.d.ts +12 -0
  39. package/dist/loaders/webpack-loader.js +710 -0
  40. package/dist/loaders/webpack-loader.js.map +1 -0
  41. package/dist/rsbuild/index.d.ts +29 -0
  42. package/dist/rsbuild/index.js +51 -0
  43. package/dist/rsbuild/index.js.map +1 -0
  44. package/dist/static/chunk-DK3Fl9T5.js +1 -0
  45. package/dist/static/index.d.ts +28 -0
  46. package/dist/static/index.js +2 -0
  47. package/dist/static/index.js.map +1 -0
  48. package/dist/withYak/index.d.ts +112 -0
  49. package/dist/withYak/index.js +171 -0
  50. package/dist/withYak/index.js.map +1 -0
  51. package/loaders/lib/resolveCrossFileSelectors.ts +161 -0
  52. package/loaders/turbo-evaluator.ts +134 -0
  53. package/loaders/turbo-loader.ts +184 -0
  54. package/loaders/vite-plugin.ts +28 -0
  55. package/loaders/webpack-loader.ts +41 -0
  56. package/package.json +155 -3
  57. package/rsbuild/index.ts +91 -0
  58. package/runtime/__tests__/atoms.test.tsx +48 -0
  59. package/runtime/__tests__/attrs.test.tsx +490 -0
  60. package/runtime/__tests__/cssLiteral.test.tsx +503 -0
  61. package/runtime/__tests__/cssProp.test.tsx +392 -0
  62. package/runtime/__tests__/cssPropTest.tsx +227 -0
  63. package/runtime/__tests__/foldedJsxParity.test.tsx +117 -0
  64. package/runtime/__tests__/styled.test.tsx +653 -0
  65. package/runtime/__tests__/tsconfig.json +18 -0
  66. package/runtime/__tests__/typeTest.tsx +374 -0
  67. package/runtime/atoms.tsx +36 -0
  68. package/runtime/context/README.md +84 -0
  69. package/runtime/context/baseContext.tsx +5 -0
  70. package/runtime/context/index.server.tsx +22 -0
  71. package/runtime/context/index.tsx +36 -0
  72. package/runtime/cssLiteral.tsx +214 -0
  73. package/runtime/globalStyle.tsx +54 -0
  74. package/runtime/index.ts +37 -0
  75. package/runtime/internal.ts +42 -0
  76. package/runtime/internals/mergeClassNames.ts +23 -0
  77. package/runtime/internals/mergeCssProp.ts +69 -0
  78. package/runtime/internals/propMarkers.ts +20 -0
  79. package/runtime/internals/unitPostFix.ts +34 -0
  80. package/runtime/jsx-dev-runtime.ts +6 -0
  81. package/runtime/jsx-runtime.ts +48 -0
  82. package/runtime/keyframes.tsx +30 -0
  83. package/runtime/mocks/cssLiteral.ts +74 -0
  84. package/runtime/mocks/globalStyle.ts +14 -0
  85. package/runtime/mocks/keyframes.ts +29 -0
  86. package/runtime/mocks/styled.ts +8 -0
  87. package/runtime/publicStyledApi.ts +159 -0
  88. package/runtime/styled.tsx +372 -0
  89. package/runtime/styledDom.tsx +139 -0
  90. package/withYak/allow-global-css.ts +94 -0
  91. package/withYak/index.ts +268 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../yak-internals/cross-file-resolver/parseModule.ts","../../../yak-internals/cross-file-resolver/Errors.ts","../../../yak-internals/cross-file-resolver/resolveCrossFileConstant.ts","../../../yak-internals/packageNames.ts","../../../yak-internals/loaders/lib/parseExports.ts"],"sourcesContent":["import { type Cache } from \"./types.js\";\n\nexport async function parseModule(\n context: ParseContext,\n modulePath: string,\n): Promise<ParsedModule> {\n try {\n const isYak =\n modulePath.endsWith(\".yak.ts\") ||\n modulePath.endsWith(\".yak.tsx\") ||\n modulePath.endsWith(\".yak.js\") ||\n modulePath.endsWith(\".yak.jsx\");\n\n // handle yak file by evaluating and mapping exported value to the\n // `ModuleExport` format. This operation is not cached to always get a fresh\n // value from those modules\n if (isYak && context.evaluateYakModule) {\n const yakModule = await context.evaluateYakModule(modulePath);\n const yakExports = objectToModuleExport(yakModule);\n\n return {\n type: \"yak\",\n exports: { importYak: false, named: yakExports, all: [] },\n path: modulePath,\n };\n }\n\n if (context.cache?.parse === undefined) {\n return await uncachedParseModule(context, modulePath);\n }\n\n const cached = context.cache.parse.get(modulePath);\n if (cached === undefined) {\n // We cache the parsed file to avoid re-parsing it.\n // It's ok, that initial parallel requests to the same file will parse it multiple times.\n // This avoid deadlocks do to the fact that we load multiple modules in the chain for cross file references.\n const parsedModule = await uncachedParseModule(context, modulePath);\n\n context.cache.parse.set(modulePath, parsedModule);\n if (context.cache.parse.addDependency) {\n context.cache.parse.addDependency(modulePath, modulePath);\n }\n return parsedModule;\n }\n\n return cached;\n } catch (error) {\n const causeMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Error parsing file \"${modulePath}\"\\n Caused by: ${causeMessage}`);\n }\n}\n\nexport async function uncachedParseModule(\n context: ParseContext,\n modulePath: string,\n): Promise<ParsedModule> {\n const exports = await context.extractExports(modulePath);\n\n // early exit if no yak import was found\n if (!exports.importYak) {\n return {\n type: \"regular\",\n path: modulePath,\n exports,\n };\n }\n\n const transformed = await context.getTransformed(modulePath);\n const mixins = parseMixins(transformed.code);\n const styledComponents = parseStyledComponents(transformed.code);\n\n return {\n type: \"regular\",\n path: modulePath,\n js: transformed,\n exports,\n styledComponents,\n mixins,\n };\n}\n\nfunction parseMixins(sourceContents: string): Record<string, Mixin> {\n // Mixins are always in the following format:\n // /*YAK EXPORTED MIXIN:fancy:aspectRatio:16:9\n // css\n // */\n const mixinParts = sourceContents.split(\"/*YAK EXPORTED MIXIN:\");\n let mixins: Record<string, { type: \"mixin\"; value: string; nameParts: string[] }> = {};\n\n for (let i = 1; i < mixinParts.length; i++) {\n const [comment] = mixinParts[i].split(\"*/\", 1);\n const position = comment.indexOf(\"\\n\");\n const name = comment.slice(0, position);\n const value = comment.slice(position + 1);\n mixins[name] = {\n type: \"mixin\",\n value,\n nameParts: name.split(\":\").map((part) => decodeURIComponent(part)),\n };\n }\n return mixins;\n}\n\nfunction parseStyledComponents(sourceContents: string): Record<string, StyledComponent> {\n // cross-file Styled Components are always in the following format:\n // /*YAK EXPORTED STYLED:ComponentName:ClassName*/\n const styledParts = sourceContents.split(\"/*YAK EXPORTED STYLED:\");\n let styledComponents: Record<string, StyledComponent> = {};\n\n for (let i = 1; i < styledParts.length; i++) {\n const [comment] = styledParts[i].split(\"*/\", 1);\n const [componentName, className] = comment.split(\":\");\n styledComponents[componentName] = {\n type: \"styled-component\",\n nameParts: componentName.split(\".\"),\n value: `.${className}`,\n };\n }\n\n return styledComponents;\n}\n\nfunction objectToModuleExport(object: object) {\n return Object.fromEntries(\n Object.entries(object).map(([key, value]): [string, ModuleExport] => {\n if (typeof value === \"string\" || typeof value === \"number\") {\n return [key, { type: \"constant\" as const, value }];\n } else if (value && (typeof value === \"object\" || Array.isArray(value))) {\n return [key, { type: \"record\" as const, value: objectToModuleExport(value) }];\n } else {\n return [key, { type: \"unsupported\" as const, hint: String(value) }];\n }\n }),\n );\n}\n\nexport type ParseContext = {\n cache?: { parse?: Cache<ParsedModule> };\n evaluateYakModule?: (\n modulePath: string,\n ) => Promise<Record<string, unknown>> | Record<string, unknown>;\n extractExports: (modulePath: string) => Promise<ModuleExports> | ModuleExports;\n getTransformed: (\n modulePath: string,\n ) => Promise<{ code: string; map?: string }> | { code: string; map?: string };\n};\n\nexport type ModuleExports = {\n importYak: boolean;\n named: Record<string, ModuleExport>;\n all: string[];\n};\n\nexport type ConstantExport = { type: \"constant\"; value: string | number };\nexport type RecordExport = {\n type: \"record\";\n value: Record<string, ModuleExport>;\n};\nexport type UnsupportedExport = {\n type: \"unsupported\";\n hint?: string;\n /**\n * Source location of the offending expression. Populated by the parser\n * when it has access to source text; left undefined for runtime-evaluated\n * yak modules. The error formatter is responsible for any rendering.\n */\n source?: UnsupportedExportSource;\n};\n\nexport type UnsupportedExportSource = {\n /** 1-based line number, 0-based column — same convention as Babel `loc`. */\n start: { line: number; column: number };\n end: { line: number; column: number };\n /** The text of `start.line` from the original source — kept so the\n * error formatter can render a snippet without re-reading the file. */\n lineText: string;\n};\nexport type ReExport = { type: \"re-export\"; name: string; from: string };\nexport type NamespaceReExport = { type: \"namespace-re-export\"; from: string };\nexport type TagTemplateExport = { type: \"tag-template\" };\n\nexport type ModuleExport =\n | ConstantExport\n | TagTemplateExport\n | RecordExport\n | UnsupportedExport\n | ReExport\n | NamespaceReExport;\n\nexport type ParsedModule = {\n path: string;\n exports: ModuleExports;\n} & (\n | {\n type: \"regular\";\n js?: { code: string; map?: string };\n styledComponents?: Record<string, StyledComponent>;\n mixins?: Record<string, Mixin>;\n }\n | {\n type: \"yak\";\n }\n);\n\nexport type StyledComponent = {\n type: \"styled-component\";\n value: string;\n nameParts: string[];\n};\n\nexport type Mixin = { type: \"mixin\"; value: string; nameParts: string[] };\n","export class CauseError extends Error {\n circular?: boolean;\n constructor(message: string, options?: { cause?: unknown }) {\n super(\n `${message}${options?.cause ? `\\n Caused by: ${typeof options.cause === \"object\" && options.cause !== null && \"message\" in options.cause ? options.cause.message : String(options.cause)}` : \"\"}`,\n );\n\n if (options?.cause instanceof CauseError && options.cause.circular) {\n this.circular = true;\n }\n }\n}\n\nexport class ResolveError extends CauseError {}\n\n/**\n * Thrown for `unsupported` exports. Subclassed so the surrounding\n * `resolveModuleExport` catch can recognise that the error already\n * carries its own \"Unable to resolve … in module …\" wrapper and\n * doesn't need another one stacked on top.\n */\nexport class UnsupportedExportError extends ResolveError {}\n\nexport class CircularDependencyError extends CauseError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.circular = true;\n }\n}\n","import type {\n ConstantExport,\n ModuleExport,\n ParsedModule,\n RecordExport,\n UnsupportedExportSource,\n} from \"./parseModule.js\";\nimport { Cache } from \"./types.js\";\nimport {\n CauseError,\n CircularDependencyError,\n ResolveError,\n UnsupportedExportError,\n} from \"./Errors.js\";\n\nconst yakCssImportRegex =\n // Make mixin and selector non optional once we dropped support for the babel plugin\n /--yak-css-import:\\s*url\\(\"([^\"]+)\",?(|mixin|selector)\\)(;?)/g;\n\n/**\n * Resolves cross-file selectors in css files\n *\n * e.g.:\n * theme.ts:\n * ```ts\n * export const colors = {\n * primary: \"#ff0000\",\n * secondary: \"#00ff00\",\n * };\n * ```\n *\n * styles.ts:\n * ```ts\n * import { colors } from \"./theme\";\n * export const button = css`\n * background-color: ${colors.primary};\n * `;\n */\nexport async function resolveCrossFileConstant(\n context: ResolveContext,\n filePath: string,\n css: string,\n): Promise<{ resolved: string; dependencies: string[] }> {\n const resolveCrossFileConstant = context.cache?.resolveCrossFileConstant;\n if (resolveCrossFileConstant === undefined) {\n return uncachedResolveCrossFileConstant(context, filePath, css);\n }\n\n const cacheKey = await sha1(filePath + \":\" + css);\n\n const cached = resolveCrossFileConstant.get(cacheKey);\n\n if (cached === undefined) {\n const resolvedCrossFilConstantPromise = uncachedResolveCrossFileConstant(\n context,\n filePath,\n css,\n );\n resolveCrossFileConstant.set(cacheKey, resolvedCrossFilConstantPromise);\n\n if (resolveCrossFileConstant.addDependency) {\n resolveCrossFileConstant.addDependency(cacheKey, filePath);\n resolvedCrossFilConstantPromise.then((value) => {\n for (const dep of value.dependencies) {\n resolveCrossFileConstant!.addDependency!(cacheKey, dep);\n }\n });\n }\n\n return resolvedCrossFilConstantPromise;\n }\n\n return cached;\n}\n\nexport async function uncachedResolveCrossFileConstant(\n context: ResolveContext,\n filePath: string,\n css: string,\n): Promise<{ resolved: string; dependencies: string[] }> {\n const yakImports = await parseYakCssImport(context, filePath, css);\n\n if (yakImports.length === 0) {\n return { resolved: css, dependencies: [] };\n }\n\n try {\n const dependencies = new Set<string>();\n\n const resolvedValues = await Promise.all(\n yakImports.map(async ({ moduleSpecifier, specifier }) => {\n const { resolved: resolvedModule } = await resolveModule(context, moduleSpecifier);\n\n const resolvedValue = await resolveModuleSpecifierRecursively(\n context,\n resolvedModule,\n specifier,\n );\n\n for (const dependency of resolvedValue.from) {\n dependencies.add(dependency);\n }\n\n return resolvedValue;\n }),\n );\n\n // Replace the imports with the resolved values\n let result = css;\n for (let i = yakImports.length - 1; i >= 0; i--) {\n const { position, size, importKind, specifier, semicolon } = yakImports[i];\n const resolved = resolvedValues[i];\n\n let replacement: string;\n\n if (resolved.type === \"unresolved-tag\") {\n // tag that could not be resolved to styled-components or mixins are\n // interpolated to produce valid CSS with minimal impact (since we don't\n // know what the value should actually be). For mixins (CSS rules) we\n // interpolate an empty string, and for selectors we interpolate\n // \"undefined\" (a selector that would match nothing)\n replacement = importKind === \"mixin\" ? \"\" : \"undefined\";\n } else {\n if (importKind === \"selector\") {\n if (resolved.type !== \"styled-component\" && resolved.type !== \"constant\") {\n throw new Error(\n `Found \"${\n resolved.type\n }\" but expected a selector - did you forget a semicolon after \"${specifier.join(\n \".\",\n )}\"?`,\n );\n }\n }\n\n replacement =\n resolved.type === \"styled-component\"\n ? resolved.value\n : resolved.value +\n // resolved.value can be of two different types:\n // - mixin:\n // ${mixinName};\n // - constant:\n // color: ${value};\n // For mixins the semicolon is already included in the value\n // but for constants it has to be added manually\n ([\"}\", \";\"].includes(String(resolved.value).trimEnd().slice(-1)) ? \"\" : semicolon);\n }\n\n result = result.slice(0, position) + String(replacement) + result.slice(position + size);\n }\n\n return { resolved: result, dependencies: Array.from(dependencies) };\n } catch (error) {\n throw new CauseError(`Error while resolving cross-file selectors in file \"${filePath}\"`, {\n cause: error,\n });\n }\n}\n\n/**\n * Search for --yak-css-import: url(\"path/to/module\") in the css\n */\nasync function parseYakCssImport(\n context: ResolveContext,\n filePath: string,\n css: string,\n): Promise<YakCssImport[]> {\n const yakImports: YakCssImport[] = [];\n\n for (const match of css.matchAll(yakCssImportRegex)) {\n const [fullMatch, encodedArguments, importKind, semicolon] = match;\n const [moduleSpecifier, ...specifier] = encodedArguments\n .split(\":\")\n .map((entry) => decodeURIComponent(entry));\n\n yakImports.push({\n encodedArguments,\n moduleSpecifier: await context.resolve(moduleSpecifier, filePath),\n specifier,\n importKind: importKind as YakImportKind,\n semicolon,\n position: match.index,\n size: fullMatch.length,\n });\n }\n\n return yakImports;\n}\n\nasync function resolveModule(context: ResolveContext, filePath: string) {\n if (context.cache?.resolve === undefined) {\n return uncachedResolveModule(context, filePath);\n }\n\n const cached = context.cache.resolve.get(filePath);\n if (cached === undefined) {\n const resolvedPromise = uncachedResolveModule(context, filePath);\n context.cache.resolve.set(filePath, resolvedPromise);\n\n if (context.cache.resolve.addDependency) {\n context.cache.resolve.addDependency(filePath, filePath);\n resolvedPromise.then((value) => {\n for (const dep of value.dependencies) {\n context.cache!.resolve!.addDependency!(filePath, dep);\n }\n });\n }\n\n return resolvedPromise;\n }\n\n return cached;\n}\n\nasync function uncachedResolveModule(\n context: ResolveContext,\n filePath: string,\n): Promise<{ resolved: ResolvedModule; dependencies: string[] }> {\n const parsedModule = await context.parse(filePath);\n\n const exports = parsedModule.exports as ResolvedExports;\n\n if (parsedModule.type !== \"regular\") {\n return {\n resolved: {\n path: parsedModule.path,\n exports,\n },\n dependencies: [],\n };\n }\n\n const dependencies = new Set<string>();\n\n // Reconcile styled-component \"name\" structure with export structure\n if (parsedModule.styledComponents) {\n Object.values(parsedModule.styledComponents).map((styledComponent) => {\n if (styledComponent.nameParts.length === 1) {\n exports.named[styledComponent.nameParts[0]] = {\n type: \"styled-component\",\n className: styledComponent.value,\n };\n } else {\n let exportEntry = exports.named[styledComponent.nameParts[0]];\n\n if (!exportEntry) {\n exportEntry = { type: \"record\", value: {} };\n exports.named[styledComponent.nameParts[0]] = exportEntry;\n } else if (exportEntry.type !== \"record\") {\n throw new CauseError(`Error parsing file \"${parsedModule.path}\"`, {\n cause: `\"${styledComponent.nameParts[0]}\" is not a record`,\n });\n }\n\n let current = exportEntry.value;\n for (let i = 1; i < styledComponent.nameParts.length - 1; i++) {\n let next = current[styledComponent.nameParts[i]];\n if (!next) {\n next = { type: \"record\", value: {} };\n current[styledComponent.nameParts[i]] = next;\n } else if (next.type !== \"record\") {\n throw new CauseError(`Error parsing file \"${parsedModule.path}\"`, {\n cause: `\"${styledComponent.nameParts.slice(0, i + 1).join(\".\")}\" is not a record`,\n });\n }\n current = next.value;\n }\n current[styledComponent.nameParts[styledComponent.nameParts.length - 1]] = {\n type: \"styled-component\",\n className: styledComponent.value,\n };\n }\n });\n }\n\n // Recursively resolve cross-file constants in mixins\n // e.g. cross file mixins inside a cross file mixin\n // or a cross file selector inside a cross file mixin\n if (parsedModule.mixins) {\n await Promise.all(\n Object.values(parsedModule.mixins).map(async (mixin) => {\n const { resolved, dependencies: deps } = await resolveCrossFileConstant(\n context,\n parsedModule.path,\n mixin.value,\n );\n\n for (const dep of deps) {\n dependencies.add(dep);\n }\n\n if (mixin.nameParts.length === 1) {\n exports.named[mixin.nameParts[0]] = {\n type: \"mixin\",\n value: resolved,\n };\n } else {\n let exportEntry = exports.named[mixin.nameParts[0]];\n\n if (!exportEntry) {\n exportEntry = { type: \"record\", value: {} };\n exports.named[mixin.nameParts[0]] = exportEntry;\n } else if (exportEntry.type !== \"record\") {\n throw new CauseError(`Error parsing file \"${parsedModule.path}\"`, {\n cause: `\"${mixin.nameParts[0]}\" is not a record`,\n });\n }\n\n let current = exportEntry.value;\n for (let i = 1; i < mixin.nameParts.length - 1; i++) {\n let next = current[mixin.nameParts[i]];\n if (!next) {\n next = { type: \"record\", value: {} };\n current[mixin.nameParts[i]] = next;\n } else if (next.type !== \"record\") {\n throw new CauseError(`Error parsing file \"${parsedModule.path}\"`, {\n cause: `\"${mixin.nameParts.slice(0, i + 1).join(\".\")}\" is not a record`,\n });\n }\n current = next.value;\n }\n current[mixin.nameParts[mixin.nameParts.length - 1]] = {\n type: \"mixin\",\n value: resolved,\n };\n }\n }),\n );\n }\n return {\n resolved: {\n path: parsedModule.path,\n exports,\n },\n dependencies: Array.from(dependencies),\n };\n}\n\nasync function resolveModuleSpecifierRecursively(\n context: ResolveContext,\n resolvedModule: ResolvedModule,\n specifiers: string[],\n seen = new Set<string>(),\n): Promise<ResolvedCssImport> {\n const exportName = specifiers[0];\n const exportValue = resolvedModule.exports.named[exportName];\n if (exportValue !== undefined) {\n if (seen.has(resolvedModule.path + \":\" + exportName)) {\n throw new CircularDependencyError(\n `Unable to resolve \"${specifiers.join(\".\")}\" in module \"${resolvedModule.path}\"`,\n { cause: \"Circular dependency detected\" },\n );\n }\n\n seen.add(resolvedModule.path + \":\" + exportName);\n return resolveModuleExport(context, resolvedModule.path, exportValue, specifiers, seen);\n }\n\n let i = 1;\n for (const from of resolvedModule.exports.all) {\n if (context.exportAllLimit && i++ > context.exportAllLimit) {\n throw new ResolveError(\n `Unable to resolve \"${specifiers.join(\".\")}\" in module \"${resolvedModule.path}\"`,\n {\n cause: `More than ${context.exportAllLimit} star exports are not supported for performance reasons`,\n },\n );\n }\n\n try {\n const resolved = await resolveModuleExport(\n context,\n resolvedModule.path,\n {\n type: \"re-export\",\n from,\n name: exportName,\n },\n specifiers,\n seen,\n );\n\n if (seen.has(resolvedModule.path + \":*\")) {\n throw new CircularDependencyError(\n `Unable to resolve \"${specifiers.join(\".\")}\" in module \"${resolvedModule.path}\"`,\n { cause: \"Circular dependency detected\" },\n );\n }\n\n seen.add(resolvedModule.path + \":*\");\n\n return resolved;\n } catch (error) {\n // ignore resolve error, it means the specifier was not found in the\n // current module, we just have to continue the loop.\n if (!(error instanceof ResolveError)) {\n throw error;\n }\n // if the cause of the error is a circular dependency down the road do not\n // ignore the error\n if (error.circular) {\n throw error;\n }\n }\n }\n\n throw new ResolveError(`Unable to resolve \"${specifiers.join(\".\")}\"`, {\n cause: `no matching export found in module \"${resolvedModule.path}\"`,\n });\n}\n\nasync function resolveModuleExport(\n context: ResolveContext,\n filePath: string,\n moduleExport: ResolvedExport,\n specifiers: string[],\n seen: Set<string>,\n): Promise<ResolvedCssImport> {\n const failureMessage = `Unable to resolve \"${specifiers.join(\".\")}\" in module \"${filePath}\"`;\n try {\n switch (moduleExport.type) {\n case \"re-export\": {\n const { resolved: reExportedModule } = await resolveModule(\n context,\n await context.resolve(moduleExport.from, filePath),\n );\n const resolved = await resolveModuleSpecifierRecursively(\n context,\n reExportedModule,\n [moduleExport.name, ...specifiers.slice(1)],\n seen,\n );\n if (resolved) {\n resolved.from.push(filePath);\n }\n return resolved;\n }\n case \"namespace-re-export\": {\n const { resolved: reExportedModule } = await resolveModule(\n context,\n await context.resolve(moduleExport.from, filePath),\n );\n const resolved = await resolveModuleSpecifierRecursively(\n context,\n reExportedModule,\n specifiers.slice(1),\n seen,\n );\n if (resolved) {\n resolved.from.push(filePath);\n }\n return resolved;\n }\n case \"styled-component\": {\n return {\n type: \"styled-component\",\n from: [filePath],\n source: filePath,\n name: specifiers[specifiers.length - 1],\n value: moduleExport.className,\n };\n }\n // usually at this point `tag-template` exports where already resolved to\n // styled-components if a matching styled-component comment was generated\n // by yak-swc. So resolving a value to a `tag-template` at this stage\n // would mean that the user tried to use the result of a call to a\n // different tag-template than yak's styled in a template. This is usually\n // invalid.\n //\n // But there is an issue with Nextjs. Next build in two passes, once for\n // the server bundle, once for the client bundle. During the server-side\n // build, each module with the `\"use client\"` directive is transformed to\n // throw errors if the exported symbol are used. This transformation\n // removes the comments generated by `@yak/swc`, so instead of the expected\n // `styled-component`, calls to `styled` resolve to a `tag-template`\n // (because no classname was found in the now absent comments).\n //\n // To summarize, if a \"use client\" bundle exports a styled component that\n // is used in a \"standard\" module, the resolve logic would throw with\n // \"unknown type tag-template\".\n //\n // To avoid this error, the resolve logic must handle those `tag-template`\n // with a special type `unresolved-tag`. Those will be interpolated to\n // valid CSS with minimal effect (to avoid CSS syntax error in the case of\n // Nextjs server build)\n case \"tag-template\": {\n return {\n type: \"unresolved-tag\",\n from: [filePath],\n source: filePath,\n name: specifiers[specifiers.length - 1],\n };\n }\n case \"constant\": {\n return {\n type: \"constant\",\n from: [filePath],\n source: filePath,\n value: moduleExport.value,\n };\n }\n case \"record\": {\n const resolvedInRecord = resolveSpecifierInRecord(\n moduleExport,\n specifiers[0],\n specifiers.slice(1),\n );\n return resolveModuleExport(context, filePath, resolvedInRecord, specifiers, seen);\n }\n case \"mixin\": {\n return {\n type: \"mixin\",\n from: [filePath],\n source: filePath,\n value: moduleExport.value,\n };\n }\n case \"unsupported\": {\n throw new UnsupportedExportError(failureMessage, {\n cause: explainUnsupported(\n filePath,\n specifiers.join(\".\"),\n moduleExport.hint,\n moduleExport.source,\n ),\n });\n }\n }\n } catch (error) {\n // UnsupportedExportError already carries this frame's \"Unable to resolve …\"\n // wrapper, so it bubbles up unchanged to avoid duplicating the line.\n if (error instanceof UnsupportedExportError) {\n throw error;\n }\n throw new ResolveError(failureMessage, { cause: error });\n }\n}\n\nfunction explainUnsupported(\n filePath: string,\n specifier: string,\n hint: string | undefined,\n source: UnsupportedExportSource | undefined,\n): string {\n const isYakFile = /\\.yak\\.(?:ts|tsx|js|jsx)$/.test(filePath);\n const docs =\n \"https://yak.js.org/docs/migration-from-styled-components#move-some-code-to-yak-files\";\n const snippet = source ? renderSourceSnippet(filePath, source, hint ?? \"\") : undefined;\n\n const lines: string[] = [];\n if (isYakFile) {\n const got = hint ? ` (got \\`${hint}\\`)` : \"\";\n lines.push(`\\`${specifier}\\` evaluated to a value that cannot be inlined into CSS${got}.`);\n if (snippet) lines.push(snippet);\n lines.push(\n ` help: replace it with a string, number, or plain object/array of those`,\n ` see: ${docs}`,\n );\n return lines.join(\"\\n\");\n }\n\n const got = hint ? ` (got a ${hint})` : \"\";\n lines.push(`\\`${specifier}\\` is not a string or number literal${got}.`);\n if (snippet) lines.push(snippet);\n lines.push(\n ` help: rename \"${filePath}\" to \"${suggestYakFileName(filePath)}\" so its exports run at build time`,\n ` (or replace \\`${specifier}\\` with a literal value)`,\n ` see: ${docs}`,\n );\n return lines.join(\"\\n\");\n}\n\nfunction suggestYakFileName(filePath: string): string {\n const match = filePath.match(/^(.*)\\.(ts|tsx|js|jsx)$/);\n if (!match) return filePath;\n return `${match[1]}.yak.${match[2]}`;\n}\n\n/**\n * Render a Rust-compiler-style snippet from a structural source location:\n *\n * --> /foo/colors.ts:5:18\n * |\n * 5 | export const bg = `var(${v})`;\n * | ^^^^^^^^^^^^ TemplateLiteral\n */\nfunction renderSourceSnippet(\n filePath: string,\n source: UnsupportedExportSource,\n label: string,\n): string {\n const startLine = source.start.line;\n const startCol = source.start.column;\n const sameLine = source.end.line === startLine;\n const caretLen = sameLine\n ? Math.max(1, source.end.column - startCol)\n : Math.max(1, source.lineText.length - startCol);\n\n const lineNumStr = String(startLine);\n const gutterPad = \" \".repeat(lineNumStr.length);\n\n return [\n ` --> ${filePath}:${startLine}:${startCol + 1}`,\n ` ${gutterPad} |`,\n ` ${lineNumStr} | ${source.lineText}`,\n ` ${gutterPad} | ${\" \".repeat(startCol)}${\"^\".repeat(caretLen)} ${label}`,\n ].join(\"\\n\");\n}\n\nfunction resolveSpecifierInRecord(\n record: ExtendedRecordExport,\n name: string,\n specifiers: string[],\n): ConstantExport | ResolvedStyledComponent | ResolvedMixin {\n if (specifiers.length === 0) {\n throw new ResolveError(\"did not expect an object\");\n }\n let depth = 0;\n let current: ResolvedExport = record;\n while (current && current.type === \"record\" && depth < specifiers.length) {\n current = current.value[specifiers[depth]];\n depth += 1;\n }\n\n if (current === undefined || depth !== specifiers.length) {\n throw new ResolveError(\n `Unable to resolve \"${specifiers.join(\".\")}\" in object/array \"${name}\"`,\n { cause: \"path not found\" },\n );\n }\n\n if (\n current.type === \"constant\" ||\n current.type === \"styled-component\" ||\n current.type === \"mixin\"\n ) {\n return current;\n }\n\n // mixins in .yak files are wrapped inside an object with a __yak key\n if (\n current.type === \"record\" &&\n \"__yak\" in current.value &&\n current.value.__yak.type === \"constant\"\n ) {\n return { type: \"mixin\", value: String(current.value.__yak.value) };\n }\n\n throw new ResolveError(`Unable to resolve \"${specifiers.join(\".\")}\" in object/array \"${name}\"`, {\n cause: \"only string and numbers are supported\",\n });\n}\n\n/**\n * hex SHA-1 hash of a message using webcrypto\n * Keeps yak independent from node api (therefore executable in browser)\n */\nasync function sha1(message: string) {\n const resultBuffer = await globalThis.crypto.subtle.digest(\n \"SHA-1\",\n new TextEncoder().encode(message),\n );\n return Array.from(new Uint8Array(resultBuffer), (byte) =>\n byte.toString(16).padStart(2, \"0\"),\n ).join(\"\");\n}\n\ntype ResolvedCssImport =\n | {\n type: \"styled-component\";\n source: string;\n from: string[];\n name: string;\n value: string;\n }\n | {\n type: \"unresolved-tag\";\n source: string;\n from: string[];\n name: string;\n }\n | { type: \"mixin\"; source: string; from: string[]; value: string | number }\n | {\n type: \"constant\";\n source: string;\n from: string[];\n value: string | number;\n };\n\nexport type ResolveContext = {\n parse: (modulePath: string) => Promise<ParsedModule> | ParsedModule;\n cache?: {\n resolve?: Cache<Promise<{ resolved: ResolvedModule; dependencies: string[] }>>;\n resolveCrossFileConstant?: Cache<Promise<{ resolved: string; dependencies: string[] }>>;\n };\n exportAllLimit?: number;\n resolve: (specifier: string, importer: string) => Promise<string> | string;\n};\n\ntype YakImportKind = \"mixin\" | \"selector\";\n\ntype YakCssImport = {\n encodedArguments: string;\n moduleSpecifier: string;\n specifier: string[];\n importKind: YakImportKind;\n semicolon: string;\n position: number;\n size: number;\n};\n\nexport type ExtendedRecordExport = {\n type: \"record\";\n value: Record<string, ResolvedExport>;\n};\n\nexport type ResolvedMixin = { type: \"mixin\"; value: string };\nexport type ResolvedStyledComponent = {\n type: \"styled-component\";\n className: string;\n};\n\nexport type ResolvedExport =\n | Exclude<ModuleExport, RecordExport>\n | ExtendedRecordExport\n | ResolvedStyledComponent\n | ResolvedMixin;\n\nexport type ResolvedExports = {\n named: Record<string, ResolvedExport>;\n all: string[];\n};\n\nexport type ResolvedModule = {\n path: string;\n exports: ResolvedExports;\n};\n","/**\n * Import sources of all yak runtime packages, for code that must detect any of them.\n * Mirrors YakPackage in yak-swc's yak_imports.rs\n */\nexport const yakPackageNames = [\"@yak/react\", \"@yak/solid\"] as const;\n","import { parse } from \"@babel/parser\";\nimport type { Expression, ObjectExpression, TSAsExpression } from \"@babel/types\";\nimport {\n ModuleExport,\n ModuleExports,\n UnsupportedExportSource,\n} from \"../../cross-file-resolver/parseModule.js\";\nimport { yakPackageNames } from \"../../packageNames.js\";\n\n/**\n * Extracts a module's exports for the cross-file resolver by parsing with babel. Nothing is executed.\n *\n * Handles `export const`, export lists (`export { x }`), re-exports with a `from`,\n * `export *`, and `export default`.\n * Anything else becomes an `unsupported` entry with its source location, or is skipped.\n *\n * Throws if the source doesn't parse.\n */\nexport async function parseExports(sourceContents: string): Promise<ModuleExports> {\n try {\n const ast = parse(sourceContents, {\n sourceType: \"module\",\n plugins: [\"jsx\", \"typescript\"] as const,\n });\n\n // Derive importYak from top-level imports (no traverse needed)\n const importYak = ast.program.body.some(\n (node) =>\n node.type === \"ImportDeclaration\" &&\n (yakPackageNames as readonly string[]).includes(node.source.value),\n );\n\n const moduleExports: ModuleExports = {\n importYak,\n named: {},\n all: [],\n };\n\n // Track variable declarations for default export lookup\n const variableDeclarations: Record<string, Expression> = {};\n // Track top-level import bindings so exported imports become re-exports\n const importBindings: Record<string, ModuleExport> = {};\n // Local export lists (`export { x }`), resolved after the loop\n // because the list can come before the declaration\n const localExportSpecifiers: { local: string; exported: string }[] = [];\n let defaultIdentifier: string | null = null;\n\n for (const node of ast.program.body) {\n if (node.type === \"ImportDeclaration\") {\n for (const specifier of node.specifiers) {\n if (specifier.type === \"ImportSpecifier\") {\n importBindings[specifier.local.name] = {\n type: \"re-export\",\n from: node.source.value,\n name:\n specifier.imported.type === \"Identifier\"\n ? specifier.imported.name\n : specifier.imported.value,\n };\n } else if (specifier.type === \"ImportDefaultSpecifier\") {\n importBindings[specifier.local.name] = {\n type: \"re-export\",\n from: node.source.value,\n name: \"default\",\n };\n } else if (specifier.type === \"ImportNamespaceSpecifier\") {\n importBindings[specifier.local.name] = {\n type: \"namespace-re-export\",\n from: node.source.value,\n };\n }\n }\n }\n\n // Track top-level variable declarations for default export lookup\n if (node.type === \"VariableDeclaration\") {\n for (const decl of node.declarations) {\n if (decl.id.type === \"Identifier\" && decl.init) {\n variableDeclarations[decl.id.name] = decl.init;\n }\n }\n }\n\n if (node.type === \"ExportNamedDeclaration\") {\n if (node.source) {\n // export { x } from \"./file\", export { x as y } from \"./file\"\n for (const specifier of node.specifiers) {\n if (\n specifier.type === \"ExportSpecifier\" &&\n specifier.exported.type === \"Identifier\" &&\n specifier.local.type === \"Identifier\"\n ) {\n moduleExports.named[specifier.exported.name] = {\n type: \"re-export\",\n from: node.source.value,\n name: specifier.local.name,\n };\n }\n // export * as ns from \"./file\"\n if (\n specifier.type === \"ExportNamespaceSpecifier\" &&\n specifier.exported.type === \"Identifier\"\n ) {\n moduleExports.named[specifier.exported.name] = {\n type: \"namespace-re-export\",\n from: node.source.value,\n };\n }\n }\n } else if (!node.declaration) {\n // export { x }, export { x as y }\n for (const specifier of node.specifiers) {\n if (\n specifier.type === \"ExportSpecifier\" &&\n specifier.exported.type === \"Identifier\" &&\n specifier.local.type === \"Identifier\"\n ) {\n localExportSpecifiers.push({\n local: specifier.local.name,\n exported: specifier.exported.name,\n });\n }\n }\n } else if (node.declaration.type === \"VariableDeclaration\") {\n // export const x = ...\n for (const declaration of node.declaration.declarations) {\n if (declaration.id.type === \"Identifier\" && declaration.init) {\n variableDeclarations[declaration.id.name] = declaration.init;\n const parsed = parseExportValueExpression(declaration.init, sourceContents);\n if (parsed) {\n moduleExports.named[declaration.id.name] = parsed;\n }\n }\n }\n }\n }\n\n if (node.type === \"ExportDefaultDeclaration\") {\n if (node.declaration.type === \"Identifier\") {\n // e.g. export default variableName;\n // Save the identifier name to look up later\n defaultIdentifier = node.declaration.name;\n } else if (\n node.declaration.type === \"FunctionDeclaration\" ||\n node.declaration.type === \"ClassDeclaration\"\n ) {\n // e.g. export default function() {...} or export default class {...}\n moduleExports.named[\"default\"] = {\n type: \"unsupported\",\n hint: node.declaration.type,\n source: extractUnsupportedSource(node.declaration.loc, sourceContents),\n };\n } else {\n // e.g. export default { ... } or export default \"value\"\n moduleExports.named[\"default\"] = parseExportValueExpression(\n node.declaration as Expression,\n sourceContents,\n );\n }\n }\n\n // export * from \"./file\"\n if (node.type === \"ExportAllDeclaration\") {\n moduleExports.all.push(node.source.value);\n }\n }\n\n // Look up the value of an exported identifier from local declarations or imports\n const resolveIdentifier = (name: string): ModuleExport | undefined => {\n if (variableDeclarations[name]) {\n return parseExportValueExpression(variableDeclarations[name], sourceContents);\n }\n return importBindings[name];\n };\n\n for (const { local, exported } of localExportSpecifiers) {\n const resolved = resolveIdentifier(local);\n if (resolved) {\n moduleExports.named[exported] = resolved;\n }\n }\n\n // If we found a default export that's an identifier, look up its value\n if (defaultIdentifier) {\n const resolved = resolveIdentifier(defaultIdentifier);\n if (resolved) {\n moduleExports.named[\"default\"] = resolved;\n }\n }\n\n return moduleExports;\n } catch (error) {\n throw new Error(`Error parsing exports: ${(error as Error).message}`);\n }\n}\n\n/**\n * Unpacks TS type assertions (as, satisfies) to the underlying expression\n */\nfunction unpackTSAsExpression(node: TSAsExpression | Expression): Expression {\n if (node.type === \"TSAsExpression\" || node.type === \"TSSatisfiesExpression\") {\n return unpackTSAsExpression((node as TSAsExpression).expression);\n }\n return node;\n}\n\nfunction parseExportValueExpression(node: Expression, code?: string): ModuleExport {\n // ignores `as` casts so it doesn't interfere with the ast node type detection\n const expression = unpackTSAsExpression(node);\n if (expression.type === \"CallExpression\" || expression.type === \"TaggedTemplateExpression\") {\n return { type: \"tag-template\" };\n } else if (expression.type === \"StringLiteral\" || expression.type === \"NumericLiteral\") {\n return { type: \"constant\", value: expression.value };\n } else if (\n expression.type === \"UnaryExpression\" &&\n expression.operator === \"-\" &&\n expression.argument.type === \"NumericLiteral\"\n ) {\n return { type: \"constant\", value: -expression.argument.value };\n } else if (expression.type === \"TemplateLiteral\" && expression.quasis.length === 1) {\n return { type: \"constant\", value: expression.quasis[0].value.raw };\n } else if (expression.type === \"ObjectExpression\") {\n return {\n type: \"record\",\n value: parseObjectExpression(expression, code),\n };\n }\n return {\n type: \"unsupported\",\n hint: expression.type,\n source: extractUnsupportedSource(expression.loc, code),\n };\n}\n\nfunction parseObjectExpression(\n node: ObjectExpression,\n code?: string,\n): Record<string, ModuleExport> {\n let result: Record<string, ModuleExport> = {};\n for (const property of node.properties) {\n if (property.type === \"ObjectProperty\" && property.key.type === \"Identifier\") {\n const key = property.key.name;\n const parsed = parseExportValueExpression(property.value as Expression, code);\n if (parsed) {\n result[key] = parsed;\n }\n }\n }\n return result;\n}\n\n/**\n * Pull the structural source-location data the error formatter needs to\n * render a snippet — the formatter (not this parser) is responsible for\n * any presentation. Returns undefined if loc or source text is missing.\n */\nfunction extractUnsupportedSource(\n loc:\n | {\n start: { line: number; column: number };\n end: { line: number; column: number };\n }\n | null\n | undefined,\n code: string | undefined,\n): UnsupportedExportSource | undefined {\n if (!loc || !code) return undefined;\n const lineText = code.split(/\\r?\\n/)[loc.start.line - 1];\n if (lineText === undefined) return undefined;\n return {\n start: { line: loc.start.line, column: loc.start.column },\n end: { line: loc.end.line, column: loc.end.column },\n lineText,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,320 @@
1
+ import React$1, { ReactNode } from "react";
2
+ //#region runtime/context/index.d.ts
3
+ interface YakTheme {}
4
+ /**
5
+ * Returns the current yak theme context
6
+ *
7
+ * @see https://github.com/DigitecGalaxus/next-yak/blob/main/packages/yak-react/runtime/context/README.md
8
+ */
9
+ export declare const useTheme: () => YakTheme;
10
+ /**
11
+ * Yak theme context provider
12
+ *
13
+ * @see https://github.com/DigitecGalaxus/next-yak/blob/main/packages/yak-react/runtime/context/README.md
14
+ */
15
+ export declare const YakThemeProvider: ({ children, theme }: {
16
+ children: ReactNode;
17
+ theme?: YakTheme;
18
+ }) => React$1.JSX.Element;
19
+ //#endregion
20
+ //#region runtime/cssLiteral.d.ts
21
+ declare const yakComponentSymbol: unique symbol;
22
+ type ComponentStyles<TProps> = (props: TProps) => {
23
+ className: string;
24
+ style?: {
25
+ [key: string]: string;
26
+ };
27
+ };
28
+ type CSSInterpolation<TProps> = string | number | undefined | null | false | ComponentStyles<TProps> | {
29
+ [yakComponentSymbol]: any;
30
+ } | ((props: TProps) => CSSInterpolation<TProps>);
31
+ /**
32
+ * css() runtime factory of css``
33
+ *
34
+ * /!\ @yak/react transpiles css`` and styled``
35
+ *
36
+ * This changes the typings of the css`` and styled`` functions.
37
+ * During development the user of @yak/react wants to work with the
38
+ * typings BEFORE compilation.
39
+ *
40
+ * Therefore this is only an internal function only and it must be cast to any
41
+ * before exported to the user.
42
+ *
43
+ * The internal functioning of css`` is to return a single callback function that runs all functions
44
+ * (or creates new ones if needed) that are passed as arguments. These functions receive the props, classNames, and style object as arguments
45
+ * and operate directly on the classNames and style objects.
46
+ */
47
+ declare function css$1<TProps>(styles: TemplateStringsArray, ...values: CSSInterpolation<NoInfer<TProps> & {
48
+ theme: YakTheme;
49
+ }>[]): ComponentStyles<TProps>;
50
+ //#endregion
51
+ //#region runtime/publicStyledApi.d.ts
52
+ /**
53
+ * Main styled interface that combines HTML tag mappings with the styled function.
54
+ * This is the primary entry point for creating styled components.
55
+ */
56
+ interface Styled extends MappedHtmlTags, StyledFn {}
57
+ /**
58
+ * Function interface for creating styled components from any component or HTML tag.
59
+ * Supports React components, HTML tags, and custom web components.
60
+ */
61
+ interface StyledFn {
62
+ <TProps extends object = React$1.DOMAttributes<Element> & React$1.RefAttributes<Element>>(Component: HtmlTags | React$1.FunctionComponent<TProps> | CustomWebComponentTag): LiteralWithAttrs<TProps>;
63
+ }
64
+ /**
65
+ * A yak component with a special symbol that allows component targeting
66
+ * and proper attrs function handling.
67
+ * @example styled.svg`${Button}:hover & { fill: red; }` or styled(Button)`color: red;`
68
+ */
69
+ interface YakComponent<T> extends React$1.FunctionComponent<T> {
70
+ [yakComponentSymbol]: [unknown, unknown, unknown, unknown];
71
+ }
72
+ /**
73
+ * Styled component with attrs method for adding default props.
74
+ * Extends StyledLiteral with the ability to specify default attributes.
75
+ */
76
+ interface LiteralWithAttrs<T extends object> extends StyledLiteral<T> {
77
+ attrs: <TAttrsIn extends object = {}, TAttrsOut extends AttrsMerged<T, TAttrsIn> = AttrsMerged<T, TAttrsIn>>(attrs: Attrs<T, TAttrsIn, TAttrsOut>) => StyledLiteral<Substitute<T, TAttrsIn>>;
78
+ }
79
+ /**
80
+ * Template literal function for defining CSS styles with interpolation support.
81
+ * Accepts CSS template strings and interpolated values with proper typing.
82
+ */
83
+ interface StyledLiteral<T> {
84
+ <TCSSProps>(styles: TemplateStringsArray, ...values: Array<CSSInterpolation<T & NoInfer<TCSSProps> & {
85
+ theme: YakTheme;
86
+ }>>): YakComponent<TCSSProps & T>;
87
+ }
88
+ /**
89
+ * Function variant of attrs that receives current props and returns additional props.
90
+ * Allows for dynamic prop generation based on component state.
91
+ */
92
+ interface AttrsFunction<TBaseProps, TIn extends object = {}, TOut extends AttrsMerged<TBaseProps, TIn> = AttrsMerged<TBaseProps, TIn>> {
93
+ (p: Substitute<TBaseProps & {
94
+ theme: YakTheme;
95
+ }, TIn>): Partial<TOut>;
96
+ }
97
+ /**
98
+ * Merges provided props with initial props, making specified props optional.
99
+ * Includes theme support for styled components.
100
+ */
101
+ type AttrsMerged<TBaseProps, TIn extends object = {}> = Substitute<TBaseProps & {
102
+ theme?: YakTheme;
103
+ }, TIn>;
104
+ /**
105
+ * Maps all HTML tag names to their corresponding styled component types with attributes support.
106
+ * Provides typed access to all standard HTML elements through the styled interface.
107
+ */
108
+ type MappedHtmlTags = { [Tag in HtmlTags]: LiteralWithAttrs<React$1.JSX.IntrinsicElements[Tag]>; };
109
+ /**
110
+ * The attrs function allows adding additional props to a styled component.
111
+ * Props can be specified as an object or as a function that receives current props.
112
+ */
113
+ type Attrs<TBaseProps, TIn extends object = {}, TOut extends AttrsMerged<TBaseProps, TIn> = AttrsMerged<TBaseProps, TIn>> = Partial<TOut> | AttrsFunction<TBaseProps, TIn, TOut>;
114
+ /**
115
+ * Utility type to merge two object types, with properties from B taking precedence.
116
+ * If a property exists in both A and B, the property from B is used.
117
+ */
118
+ type Substitute<A extends object, B extends object> = FastOmit<A, keyof B> & B;
119
+ /**
120
+ * Union type of all valid HTML element tag names.
121
+ * Derived from React's JSX intrinsic elements.
122
+ */
123
+ type HtmlTags = keyof React$1.JSX.IntrinsicElements;
124
+ /**
125
+ * Custom web component tag pattern that must contain at least one hyphen.
126
+ * Follows the web component naming convention.
127
+ */
128
+ type CustomWebComponentTag = `${string}-${string}`;
129
+ /**
130
+ * Utility type to efficiently remove properties from an object type.
131
+ * More performant than the built-in Omit type for large object types.
132
+ */
133
+ type FastOmit<T extends object, U extends string | number | symbol> = { [K in keyof T as K extends U ? never : K]: T[K]; };
134
+ /**
135
+ * Set-like collector for class names
136
+ *
137
+ * The runtime implements this as a string builder, a real `Set<string>`
138
+ * satisfies it as well
139
+ */
140
+ type ClassNameCollector = {
141
+ add(className: string): void;
142
+ has(className: string): boolean;
143
+ delete(className: string): void;
144
+ };
145
+ /**
146
+ * Type of all functions that can be passed to manipulate styles
147
+ *
148
+ * `$dynamic` marks processors that execute user functions or write style
149
+ * values at render time; purely static processors (class names only) can
150
+ * skip theme lookup and style-object allocation.
151
+ */
152
+ type RuntimeStyleProcessor<T> = ((props: T, classNames: ClassNameCollector, style: React$1.CSSProperties) => void) & {
153
+ $dynamic?: boolean;
154
+ };
155
+ /**
156
+ * Utility type to keep the generic API of a component while still being able to use it in a selector
157
+ */
158
+ type GenericYakComponentOf<T, P = {}> = T & YakComponent<P> & {
159
+ <G = {}>(props: P & G): React$1.ReactElement | null;
160
+ };
161
+ //#endregion
162
+ //#region runtime/atoms.d.ts
163
+ /**
164
+ * Allows to use atomic CSS classes in a styled or css block
165
+ *
166
+ * @usage
167
+ *
168
+ * ```tsx
169
+ * import { styled, atoms } from "@yak/react";
170
+ *
171
+ * const Button = styled.button<{ $primary?: boolean }>`
172
+ * ${atoms("text-teal-600", "text-base", "rounded-md")}
173
+ * ${props => props.$primary && atoms("shadow-md")}
174
+ * `;
175
+ * ```
176
+ */
177
+ export declare const atoms: <T>(...atoms: (string | RuntimeStyleProcessor<T> | false)[]) => ComponentStyles<T>;
178
+ //#endregion
179
+ //#region runtime/mocks/cssLiteral.d.ts
180
+ /**
181
+ * Allows to use CSS styles in a styled or css block
182
+ *
183
+ * e.g.
184
+ *
185
+ * ```tsx
186
+ * const Component = styled.div`
187
+ * color: black;
188
+ * ${({$active}) => $active && css`color: red;`}
189
+ * `;
190
+ * ```
191
+ */
192
+ export declare const css: typeof css$1;
193
+ //#endregion
194
+ //#region runtime/keyframes.d.ts
195
+ /**
196
+ * Allows to use CSS keyframe animations in a styled or css block
197
+ *
198
+ * @usage
199
+ *
200
+ * ```tsx
201
+ * import { styled, keyframes } from "@yak/react";
202
+ *
203
+ * const rotate = keyframes`
204
+ * from {
205
+ * transform: rotate(0deg);
206
+ * }
207
+ * to {
208
+ * transform: rotate(360deg);
209
+ * }
210
+ * `;
211
+ *
212
+ * const Spinner = styled.div`
213
+ * animation: ${rotate} 1s linear infinite;
214
+ * `;
215
+ * ```
216
+ */
217
+ declare const keyframes$1: <T extends (string | number | bigint)[] = never>(styles: TemplateStringsArray, ..._dynamic: T) => string;
218
+ //#endregion
219
+ //#region runtime/mocks/keyframes.d.ts
220
+ /**
221
+ * Allows to use CSS keyframe animations in a styled or css block
222
+ *
223
+ * @usage
224
+ *
225
+ * ```tsx
226
+ * import { styled, keyframes } from "@yak/react";
227
+ *
228
+ * const rotate = keyframes`
229
+ * from {
230
+ * transform: rotate(0deg);
231
+ * }
232
+ * to {
233
+ * transform: rotate(360deg);
234
+ * }
235
+ * `;
236
+ *
237
+ * const Spinner = styled.div`
238
+ * animation: ${rotate} 1s linear infinite;
239
+ * `;
240
+ * ```
241
+ */
242
+ export declare const keyframes: typeof keyframes$1;
243
+ //#endregion
244
+ //#region runtime/styled.d.ts
245
+ /**
246
+ * The `styled` method works perfectly on all of your own or any third-party component,
247
+ * as long as they attach the passed className prop to a DOM element.
248
+ *
249
+ * @usage
250
+ *
251
+ * ```tsx
252
+ * const StyledLink = styled(Link)`
253
+ * color: #BF4F74;
254
+ * font-weight: bold;
255
+ * `;
256
+ * ```
257
+ */
258
+ declare const styled$1: Styled;
259
+ //#endregion
260
+ //#region runtime/mocks/styled.d.ts
261
+ export declare const styled: typeof styled$1;
262
+ //#endregion
263
+ //#region runtime/globalStyle.d.ts
264
+ /**
265
+ * Values that may be interpolated into a `globalStyle` template.
266
+ *
267
+ * Only build-time values are allowed — constants, `keyframes` animation names,
268
+ * static `css` mixins and styled-component selectors. Runtime functions
269
+ * (`${(props) => ...}`) are intentionally excluded: a global rule has no element
270
+ * to attach a CSS variable to. Declare a CSS custom property instead and toggle
271
+ * it via an attribute/class on the root element.
272
+ */
273
+ type GlobalStyleInterpolation = string | number | ComponentStyles<{}> | YakComponent<any>;
274
+ /**
275
+ * Declares global, unscoped styles that ride the same zero-runtime extraction
276
+ * pipeline as `styled` and `keyframes`.
277
+ *
278
+ * Global styles are **part of the stylesheet, not part of the render tree**.
279
+ * They apply exactly when the module declaring them is included in the bundle —
280
+ * typically by importing it from a layout or entry point. They cannot be
281
+ * conditionally mounted; express conditions in CSS (`@media`, `@supports`,
282
+ * `:root[data-theme]`, `:has()`) or through CSS custom properties.
283
+ *
284
+ * @usage
285
+ *
286
+ * ```tsx
287
+ * import { globalStyle, keyframes } from "@yak/react";
288
+ *
289
+ * const fadeIn = keyframes`
290
+ * from { opacity: 0; }
291
+ * `;
292
+ *
293
+ * globalStyle`
294
+ * :root {
295
+ * --spacing: 4px;
296
+ * }
297
+ *
298
+ * body {
299
+ * margin: 0;
300
+ * }
301
+ *
302
+ * ::view-transition-new(root) {
303
+ * animation: ${fadeIn} 200ms ease;
304
+ * }
305
+ * `;
306
+ * ```
307
+ */
308
+ declare const globalStyle$1: (_styles: TemplateStringsArray, ..._values: Array<GlobalStyleInterpolation>) => void;
309
+ //#endregion
310
+ //#region runtime/mocks/globalStyle.d.ts
311
+ /**
312
+ * Test-friendly mock of `globalStyle`.
313
+ *
314
+ * `globalStyle` has no runtime behaviour — the SWC plugin extracts its CSS at
315
+ * build time and replaces the call with a no-op. The mock mirrors that: it does
316
+ * nothing so yak files can be imported in Jest/Vitest without the compiler.
317
+ */
318
+ export declare const globalStyle: typeof globalStyle$1;
319
+ //#endregion
320
+ export type { GenericYakComponentOf, GlobalStyleInterpolation, YakComponent, YakTheme };
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import{YakThemeProvider as e,useTheme as t,useTheme as n}from"@yak/react/context";import r from"react";const i=Symbol(`yak`);var a=class{constructor(e){this.value=e||``}add(e){this.value+=(this.value&&` `)+e}has(e){return(` `+this.value+` `).includes(` `+e+` `)}delete(e){this.has(e)&&(this.value=this.value.split(` `).filter(t=>t!==e).join(` `))}};function o(...e){let t,n=[];for(let r of e)typeof r==`string`?t=r:typeof r==`function`?n.push(r):typeof r==`object`&&`style`in r&&n.push((e,t,n)=>{for(let t in r.style){let i=r.style[t];n[t]=String(typeof i==`function`?c(e,i):i)}});return n.length===0?Object.assign((e,n)=>{t&&n.add(t)},{$dynamic:!1}):Object.assign((e,r,i)=>{t&&r.add(t);for(let t=0;t<n.length;t++)s(e,n[t],r,i)},{$dynamic:!0})}const s=(e,t,n,r)=>{let i=t(e,n,r);for(;i;)if(typeof i==`function`)i=i(e,n,r);else{if(typeof i==`object`&&(`className`in i&&i.className&&n.add(i.className),`style`in i&&i.style))for(let e in i.style)r[e]=i.style[e];break}},c=(e,t)=>{let n=t(e);if(typeof n==`function`)return c(e,n);if(typeof n!=`string`&&typeof n!=`number`&&!(n instanceof String)&&process.env.NODE_ENV===`development`)throw Error(`Dynamic CSS functions must return a string or number but returned ${JSON.stringify(n)}\n\nDynamic CSS function: ${t.toString()}\n`);return n},l=(...e)=>{let t=new a,n=[];for(let r of e)typeof r==`string`?t.add(r):typeof r==`function`&&n.push(r);return o(t.value,...n)},u=(e,...t)=>{if(Array.isArray(e)&&`raw`in e){let n=e[0];for(let r=0;r<t.length;r++){let i=t[r];n+=i&&typeof i==`object`&&`__yak`in i?i.__yak:String(i),n+=e[r+1]}return{__yak:n}}let n=[];for(let e of t)typeof e==`function`&&n.push(e);return n.length===0?{className:``,style:void 0}:(e=>{for(let t=0;t<n.length;t++)d(e,n[t]);return{className:``,style:void 0}})};function d(e,t){let n=/* @__PURE__ */ new Set,r={},i=t(e,n,r);for(;typeof i==`function`;)i=i(e,n,r);return i}const f=(e,...t)=>``,p=`$__a`,m=(e,t)=>e?t?e+` `+t:e:t||void 0,h=e=>Object.assign(g(e),{attrs:t=>g(e,t)}),g=(e,t)=>{let s=typeof e!=`string`&&i in e,[,c,l,u]=s?e[i]:[],d=s?u:e,f=y(t,c),m=f?.$sa;return(e,...t)=>{let s=o(e,...t),c=b(s,l),u=e=>{if((!f||m)&&!c.$dynamic){let t=m&&!(`$__a`in e)?v({...e,[p]:!0},m):e,n=_(t);if(!(`$__r`in t)){let e=new a(t.className);c(t,e,void 0),n.className=e.value||void 0}let i=d;return/* @__PURE__ */ r.createElement(i,n)}let t=n(),i=`$__a`in e?{theme:t,...e}:v({theme:t,...e,[p]:!0},f?.({theme:t,...e}));if(!(`$__r`in i)){let e=new a(i.className),t=c.$dynamic?{...i.style}:i.style;c(i,e,t),i.$__r=!0,i.className=e.value||void 0,t!==i.style&&(i.style=t)}let{theme:o,...s}=i,l=_(o===t?s:i),u=d;return/* @__PURE__ */ r.createElement(u,l)},h=u;return h[i]=[u,f,c,d],h}},_=e=>{let t={};for(let n in e)!n.startsWith(`$`)&&e[n]!==void 0&&(t[n]=e[n]);return t},v=(e,t)=>t?(e.className===t.className||!t.className)&&(e.style===t.style||!t.style)?{...e,...t}:{...e,...t,className:m(e.className,t.className),style:{...e.style,...t.style}}:e,y=(e,t)=>{let n=e&&(typeof e==`function`?e:()=>e);return n&&t?e=>{let r=t(e);return v(r,n(v(e,r)))}:n&&typeof e!=`function`?Object.assign(n,{$sa:e}):n||t},b=(e,t)=>e&&t?Object.assign((n,r,i)=>{t(n,r,i),e(n,r,i)},{$dynamic:e.$dynamic||t.$dynamic}):e||t,x=new Proxy(h,{get(e,t){return e(t)}}),S=(e,...t)=>{};export{e as YakThemeProvider,l as atoms,u as css,S as globalStyle,f as keyframes,x as styled,t as useTheme};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["css","css","styled","css","INTERNAL.ATTRS_MERGED","useTheme","INTERNAL.RUNTIME_STYLES_DONE","StyledFactory","useTheme$1","React","yakComponentSymbol","ClassNames","initial","className","existing","css$1","args","dynamicCssFunctions","arg","key","value","style","recursivePropExecution","props","classNames","i","unwrapProps","allStyles","result","fn","atoms","staticClasses","dynamicFunctions","atom","css","styles","rawCss","interpolation","executeDynamicExpressionRecursively","expression","keyframes","_dynamic","ATTRS_MERGED","mergeClassNames","a","b","styled$1","yakStyled","Component","attrs","isYakComponent","parentAttrsFn","parentRuntimeStylesFn","parentTarget","targetComponent","mergedAttrsFn","buildRuntimeAttrsProcessor","staticAttrs","\"$sa\"","values","runtimeStylesFn","runtimeStyleProcessor","buildRuntimeStylesProcessor","Yak","source","combineProps","filteredProps","removeNonDomProperties","Target","theme","combinedProps","RUNTIME_STYLES_DONE","themeAfterAttr","combinedPropsWithoutTheme","taggedYak","obj","newProps","ownAttrsFn","parentProps","styled","target","TagName","globalStyle","_values","YakThemeProvider","useTheme"],"sources":["../runtime/cssLiteral.tsx","../runtime/atoms.tsx","../runtime/mocks/cssLiteral.ts","../runtime/mocks/keyframes.ts","../runtime/internals/propMarkers.ts","../runtime/internals/mergeClassNames.ts","../runtime/styled.tsx","../runtime/mocks/styled.ts","../runtime/mocks/globalStyle.ts"],"sourcesContent":["import type { YakTheme } from \"./index.ts\";\nimport { ClassNameCollector, RuntimeStyleProcessor } from \"./publicStyledApi.js\";\n\nexport const yakComponentSymbol = Symbol(\"yak\");\n\n/**\n * String-backed ClassNameCollector used by the render path\n *\n * `add` is a plain string append and does not deduplicate, so the collector is\n * a multiset - the same class may appear twice, e.g. `atoms(\"a b\", \"a\")` → `\"a b a\"`.\n * `has`/`delete` cover the rare path where a runtime function inspects or\n * removes classes; `delete` removes every occurrence\n */\nexport class ClassNames implements ClassNameCollector {\n value: string;\n constructor(initial?: string) {\n this.value = initial || \"\";\n }\n add(className: string) {\n this.value += (this.value && \" \") + className;\n }\n has(className: string) {\n return (\" \" + this.value + \" \").includes(\" \" + className + \" \");\n }\n delete(className: string) {\n if (this.has(className)) {\n this.value = this.value\n .split(\" \")\n .filter((existing) => existing !== className)\n .join(\" \");\n }\n }\n}\n\nexport type ComponentStyles<TProps> = (props: TProps) => {\n className: string;\n style?: {\n [key: string]: string;\n };\n};\n\nexport type CSSInterpolation<TProps> =\n | string\n | number\n | undefined\n | null\n | false\n | ComponentStyles<TProps>\n | {\n // type only identifier to allow targeting components\n // e.g. styled.svg`${Button}:hover & { fill: red; }`\n [yakComponentSymbol]: any;\n }\n | ((props: TProps) => CSSInterpolation<TProps>);\n\ntype CSSStyles<TProps = {}> = {\n style: { [key: string]: string | ((props: TProps) => string) };\n};\n\ntype CSSFunction = <TProps = {}>(\n styles: TemplateStringsArray,\n ...values: CSSInterpolation<TProps & { theme: YakTheme }>[]\n) => ComponentStyles<TProps>;\n\nexport type NestedRuntimeStyleProcessor = (\n props: unknown,\n classNames: ClassNameCollector,\n style: React.CSSProperties,\n) =>\n | {\n className?: string;\n style?: React.CSSProperties;\n }\n | void\n | NestedRuntimeStyleProcessor;\n\n/**\n * css() runtime factory of css``\n *\n * /!\\ @yak/react transpiles css`` and styled``\n *\n * This changes the typings of the css`` and styled`` functions.\n * During development the user of @yak/react wants to work with the\n * typings BEFORE compilation.\n *\n * Therefore this is only an internal function only and it must be cast to any\n * before exported to the user.\n *\n * The internal functioning of css`` is to return a single callback function that runs all functions\n * (or creates new ones if needed) that are passed as arguments. These functions receive the props, classNames, and style object as arguments\n * and operate directly on the classNames and style objects.\n */\nexport function css<TProps>(\n styles: TemplateStringsArray,\n ...values: CSSInterpolation<NoInfer<TProps> & { theme: YakTheme }>[]\n): ComponentStyles<TProps>;\nexport function css<TProps>(...args: Array<any>): RuntimeStyleProcessor<TProps> {\n // Normally this could be an array of strings passed, but as we transpile the usage of css`` ourselves, we control the arguments\n // and ensure that only the first argument is a string (class name of the non-dynamic styles)\n let className: string | undefined;\n const dynamicCssFunctions: NestedRuntimeStyleProcessor[] = [];\n for (const arg of args as Array<string | CSSFunction | CSSStyles<any>>) {\n // A CSS-module class name which got auto generated during build from static css\n // e.g. css`color: red;`\n // compiled -> css(\"yak31e4\")\n if (typeof arg === \"string\") {\n className = arg;\n }\n // Dynamic CSS e.g.\n // css`${props => props.active && css`color: red;`}`\n // compiled -> css((props: { active: boolean }) => props.active && css(\"yak31e4\"))\n else if (typeof arg === \"function\") {\n dynamicCssFunctions.push(arg as unknown as NestedRuntimeStyleProcessor);\n }\n // Dynamic CSS with css variables e.g.\n // css`transform: translate(${props => props.x}, ${props => props.y});`\n // compiled -> css(\"yak31e4\", { style: { \"--yakVarX\": props => props.x }, \"--yakVarY\": props => props.y }})\n else if (typeof arg === \"object\" && \"style\" in arg) {\n dynamicCssFunctions.push((props, _, style) => {\n for (const key in arg.style) {\n const value = arg.style[key];\n if (typeof value === \"function\") {\n // @ts-expect-error CSSProperties don't allow css variables\n style[key] = String(\n // The value for a css value can be a theme dependent function e.g.:\n // const borderColor = (props: { theme: { mode: \"dark\" | \"light\" } }) => props.theme === \"dark\" ? \"black\" : \"white\";\n // css`border-color: ${borderColor};`\n // Therefore the value has to be extracted recursively\n recursivePropExecution(props, value),\n );\n } else {\n // @ts-expect-error CSSProperties don't allow css variables\n style[key] = String(value);\n }\n }\n });\n }\n }\n\n // Non Dynamic CSS\n // This is just an optimization for the common case where there are no dynamic css functions\n // `$dynamic: false` lets the styled runtime skip theme lookup and\n // style-object allocation entirely for static components\n if (dynamicCssFunctions.length === 0) {\n return Object.assign(\n (_: unknown, classNames: ClassNameCollector) => {\n if (className) {\n classNames.add(className);\n }\n },\n { $dynamic: false },\n );\n }\n\n return Object.assign(\n (props: TProps, classNames: ClassNameCollector, allStyles: React.CSSProperties) => {\n if (className) {\n classNames.add(className);\n }\n for (let i = 0; i < dynamicCssFunctions.length; i++) {\n unwrapProps(props, dynamicCssFunctions[i], classNames, allStyles);\n }\n },\n { $dynamic: true },\n );\n}\n\n// Dynamic CSS with runtime logic\nconst unwrapProps = (\n props: unknown,\n fn: NestedRuntimeStyleProcessor,\n classNames: ClassNameCollector,\n style: React.CSSProperties,\n) => {\n let result = fn(props, classNames, style);\n while (result) {\n if (typeof result === \"function\") {\n result = result(props, classNames, style);\n continue;\n } else if (typeof result === \"object\") {\n if (\"className\" in result && result.className) {\n classNames.add(result.className);\n }\n if (\"style\" in result && result.style) {\n for (const key in result.style) {\n // This is hard for typescript to infer\n style[key as keyof React.CSSProperties] = result.style[\n key as keyof React.CSSProperties\n ] as any;\n }\n }\n }\n break;\n }\n};\n\nconst recursivePropExecution = (props: unknown, fn: (props: unknown) => any): string | number => {\n const result = fn(props);\n if (typeof result === \"function\") {\n return recursivePropExecution(props, result);\n }\n // the `process.env` lookup is a real per-call cost for unbundled Node\n // consumers, so it must stay behind the typeof guards on the invalid path\n if (typeof result !== \"string\" && typeof result !== \"number\" && !(result instanceof String)) {\n if (process.env.NODE_ENV === \"development\") {\n throw new Error(\n `Dynamic CSS functions must return a string or number but returned ${JSON.stringify(\n result,\n )}\\n\\nDynamic CSS function: ${fn.toString()}\\n`,\n );\n }\n }\n return result;\n};\n","import { ClassNames, ComponentStyles, css } from \"./cssLiteral.js\";\nimport { RuntimeStyleProcessor } from \"./publicStyledApi.js\";\n\n/**\n * Allows to use atomic CSS classes in a styled or css block\n *\n * @usage\n *\n * ```tsx\n * import { styled, atoms } from \"@yak/react\";\n *\n * const Button = styled.button<{ $primary?: boolean }>`\n * ${atoms(\"text-teal-600\", \"text-base\", \"rounded-md\")}\n * ${props => props.$primary && atoms(\"shadow-md\")}\n * `;\n * ```\n */\nexport const atoms = <T,>(\n ...atoms: (string | RuntimeStyleProcessor<T> | false)[]\n): ComponentStyles<T> => {\n const staticClasses = new ClassNames();\n const dynamicFunctions: RuntimeStyleProcessor<T>[] = [];\n\n for (const atom of atoms) {\n if (typeof atom === \"string\") {\n staticClasses.add(atom);\n } else if (typeof atom === \"function\") {\n dynamicFunctions.push(atom);\n }\n }\n\n // the collected classes are passed as css()'s static class name,\n // only the dynamic atoms stay functions\n // @ts-expect-error the internal implementation of css is not typed\n return css(staticClasses.value, ...dynamicFunctions);\n};\n","import type { css as cssInternal, NestedRuntimeStyleProcessor } from \"../cssLiteral.js\";\n\nexport type { ComponentStyles } from \"../cssLiteral.js\";\n\n/**\n * Allows to use CSS styles in a styled or css block\n *\n * e.g.\n *\n * ```tsx\n * const Component = styled.div`\n * color: black;\n * ${({$active}) => $active && css`color: red;`}\n * `;\n * ```\n */\nexport const css: typeof cssInternal = (styles: TemplateStringsArray, ...args: unknown[]) => {\n // When called in yak files as a template tag (without SWC transformation),\n // return { __yak: rawCss } so the cross-file resolver can\n // extract the mixin value from evaluated .yak files.\n if (Array.isArray(styles) && \"raw\" in styles) {\n let rawCss = styles[0];\n for (let i = 0; i < args.length; i++) {\n const interpolation = args[i];\n rawCss +=\n interpolation && typeof interpolation === \"object\" && \"__yak\" in interpolation\n ? (interpolation as { __yak: string }).__yak\n : String(interpolation);\n rawCss += styles[i + 1];\n }\n return { __yak: rawCss } as any;\n }\n\n const dynamicCssFunctions: NestedRuntimeStyleProcessor[] = [];\n for (const arg of args as Array<string | Function | object>) {\n // Dynamic CSS e.g.\n // css`${props => props.active && css`color: red;`}`\n // compiled -> css((props: { active: boolean }) => props.active && css(\"yak31e4\"))\n if (typeof arg === \"function\") {\n dynamicCssFunctions.push(arg as unknown as NestedRuntimeStyleProcessor);\n }\n }\n if (dynamicCssFunctions.length === 0) {\n return {\n className: \"\",\n style: undefined,\n };\n }\n return ((props: unknown) => {\n for (let i = 0; i < dynamicCssFunctions.length; i++) {\n // run the dynamic expressions and ignore the return value\n // the execution is important to ensure that the user code is executed\n // the same way as in the real runtime\n executeDynamicExpressionRecursively(props, dynamicCssFunctions[i]);\n }\n return {\n className: \"\",\n style: undefined,\n };\n }) as any;\n};\n\nfunction executeDynamicExpressionRecursively(\n props: unknown,\n expression: NestedRuntimeStyleProcessor,\n) {\n const classNames = new Set<string>();\n const style = {};\n let result = expression(props, classNames, style);\n while (typeof result === \"function\") {\n result = result(props, classNames, style);\n }\n return result;\n}\n","import type { keyframes as keyframesInternal } from \"../keyframes.js\";\n\n/**\n * Allows to use CSS keyframe animations in a styled or css block\n *\n * @usage\n *\n * ```tsx\n * import { styled, keyframes } from \"@yak/react\";\n *\n * const rotate = keyframes`\n * from {\n * transform: rotate(0deg);\n * }\n * to {\n * transform: rotate(360deg);\n * }\n * `;\n *\n * const Spinner = styled.div`\n * animation: ${rotate} 1s linear infinite;\n * `;\n * ```\n */\nexport const keyframes: typeof keyframesInternal = (_styles, ..._dynamic) => {\n // the keyframes function is a no-op in the mock\n // as it has no dynamic runtime behavior but only css\n return \"\";\n};\n","/** Internal markers used by the render path */\n\n/**\n * Set on props once the attrs functions have been folded in, so a nested yak\n * wrapper further out the chain does not merge the same attrs twice\n */\nexport const ATTRS_MERGED = \"$__a\" as const;\n\n/**\n * Set on props once the runtime style processor has run, so an outer yak\n * component that receives already-processed props skips the collector entirely\n */\nexport const RUNTIME_STYLES_DONE = \"$__r\" as const;\n\n/**\n * Carries the constant `.attrs({...})` object on the merged attrs function,\n * marking it theme-independent so the fast render path can apply it without\n * executing anything. Lives on the function, never on props\n */\nexport const STATIC_ATTRS = \"$sa\" as const;\n","/**\n * Merges two optional class name values with a space.\n *\n * Used by the styled runtime to combine incoming and generated class names,\n * and injected by the compiler (as `__yak_mergeClassNames`) when it replaces\n * a JSX usage of a fully static styled component with a plain DOM element:\n * ```tsx\n * const Card = styled.div`color: red;`;\n * <Card className={active && \"active\"} />\n * ```\n * becomes\n * ```tsx\n * <div className={__yak_mergeClassNames(\"yX\", active && \"active\")} />\n * ```\n */\nexport const mergeClassNames = (\n a: string | false | null | undefined,\n b: string | false | null | undefined,\n) => {\n if (!a) return b || undefined;\n if (!b) return a;\n return a + \" \" + b;\n};\n","import { css, CSSInterpolation, ClassNames, yakComponentSymbol } from \"./cssLiteral.js\";\nimport * as INTERNAL from \"./internals/propMarkers.js\";\nimport React from \"react\";\nimport type {\n Attrs,\n AttrsMerged,\n Styled,\n YakComponent,\n AttrsFunction,\n StyledFn,\n HtmlTags,\n Substitute,\n StyledLiteral,\n RuntimeStyleProcessor,\n} from \"./publicStyledApi.js\";\n\n// the following export is not relative as \"@yak/react/context\"\n// links to one file for react server components and\n// to another file for classic react components\nimport { useTheme } from \"@yak/react/context\";\nimport type { YakTheme } from \"./context/index.tsx\";\nimport { mergeClassNames } from \"./internals/mergeClassNames.js\";\n\n//\n// The `styled()` API without `styled.` syntax\n//\n// The API design is inspired by styled-components:\n// https://github.com/styled-components/styled-components/blob/main/packages/styled-components/src/constructors/styled.tsx\n// https://github.com/styled-components/styled-components/blob/main/packages/styled-components/src/models/StyledComponent.ts\n//\nconst styledFactory: StyledFn = (Component) =>\n Object.assign(yakStyled(Component), {\n attrs: (attrs: Attrs<any>) => yakStyled(Component, attrs),\n });\n\n/**\n * The `styled` method works perfectly on all of your own or any third-party component,\n * as long as they attach the passed className prop to a DOM element.\n *\n * @usage\n *\n * ```tsx\n * const StyledLink = styled(Link)`\n * color: #BF4F74;\n * font-weight: bold;\n * `;\n * ```\n */\nexport const styled = styledFactory as Styled;\n\n/**\n * Real shape of the yakComponentSymbol tuple, which the public `YakComponent`\n * keeps opaque as `[unknown, ...]`\n */\ntype YakComponentInternals = [\n self: React.FunctionComponent,\n attrsFn: AttrsFunction<any, any, any> | undefined,\n styleProcessor: RuntimeStyleProcessor<unknown>,\n target: React.FunctionComponent | string,\n];\n\nconst yakStyled: StyledInternal = (Component, attrs) => {\n const isYakComponent = typeof Component !== \"string\" && yakComponentSymbol in Component;\n\n // if the component that is wrapped is a yak component, we can extract it to render the underlying component directly\n // and we can also extract the attrs function and the dynamic style function to merge it with the current attrs function (or dynamic style function)\n // so that the sequence of the attrs functions is preserved\n const [, parentAttrsFn, parentRuntimeStylesFn, parentTarget] = isYakComponent\n ? (Component[yakComponentSymbol] as [\n YakComponent<unknown>,\n ExtractAttrsFunction<typeof attrs>,\n RuntimeStyleProcessor<unknown>,\n React.FunctionComponent | string,\n ])\n : [];\n\n // the ultimate render target of the whole styled(styled(...)) chain:\n // attrs and style processors are already merged at construction time, so\n // a chain of N levels renders the target directly in ONE wrapper instead\n // of re-entering every parent wrapper per element per render\n const targetComponent = (isYakComponent ? parentTarget : Component) as\n | React.FunctionComponent\n | string;\n\n const mergedAttrsFn = buildRuntimeAttrsProcessor(attrs, parentAttrsFn);\n const staticAttrs = (mergedAttrsFn as StaticAttrsCarrier | undefined)?.[INTERNAL.STATIC_ATTRS];\n\n return (styles, ...values) => {\n // combine all interpolated logic into a single function\n // e.g. styled.button`color: ${props => props.color}; margin: ${props => props.margin};`\n const runtimeStylesFn = css(\n styles,\n ...(values as CSSInterpolation<unknown>[]),\n ) as RuntimeStyleProcessor<unknown>;\n const runtimeStyleProcessor = buildRuntimeStylesProcessor(\n runtimeStylesFn,\n parentRuntimeStylesFn,\n );\n const Yak: React.FunctionComponent = (props) => {\n // fast path for components that contribute the same thing on every\n // render — no attrs at all, or a constant `.attrs({...})` which cannot\n // read the theme — and no dynamic styles. Contributes the chain's class\n // names and strips $-props; skips theme lookup, prop spreading and style\n // cloning entirely (this is NOT against the rule of hooks — the condition\n // is constant for the lifetime of the component)\n if ((!mergedAttrsFn || staticAttrs) && !runtimeStyleProcessor.$dynamic) {\n // props that already went through a yak wrapper keep their processed\n // className, and `source` then aliases `props` — so the class names are\n // written to the fresh, filtered object rather than back into props\n const source = (\n staticAttrs && !(INTERNAL.ATTRS_MERGED in props)\n ? combineProps(\n {\n ...(props as { className?: string; style?: React.CSSProperties }),\n // mark the props as processed\n [INTERNAL.ATTRS_MERGED]: true,\n },\n staticAttrs,\n )\n : props\n ) as { className?: string; style?: React.CSSProperties };\n const filteredProps = removeNonDomProperties(source) as {\n className?: string;\n };\n if (!(INTERNAL.RUNTIME_STYLES_DONE in source)) {\n const classNames = new ClassNames(source.className);\n runtimeStyleProcessor(source, classNames, undefined as unknown as React.CSSProperties);\n filteredProps.className = classNames.value || undefined;\n }\n const Target = targetComponent as React.ElementType;\n return <Target {...(filteredProps as React.ComponentProps<typeof Target>)} />;\n }\n\n // attrs functions and dynamic style functions receive the theme —\n // fully static components take the fast path above and never read the\n // theme context\n const theme = useTheme();\n\n // The first components which is not wrapped in a yak component will execute all attrs functions\n // starting from the innermost yak component to the outermost yak component (itself)\n const combinedProps =\n INTERNAL.ATTRS_MERGED in props\n ? ({\n theme,\n ...props,\n } as {\n theme: YakTheme;\n className?: string;\n style?: React.CSSProperties;\n })\n : // overwrite and merge the current props with the processed attrs\n combineProps(\n {\n theme,\n ...(props as {\n className?: string;\n style?: React.CSSProperties;\n }),\n // mark the props as processed\n [INTERNAL.ATTRS_MERGED]: true,\n },\n mergedAttrsFn?.({ theme, ...(props as any) }),\n );\n\n // execute all functions inside the style literal if not already executed\n // e.g. styled.button`color: ${props => props.color};`\n //\n // inner levels of a styled(Component) chain receive already-processed\n // props and skip this entirely — no collector, no style clone\n if (!(INTERNAL.RUNTIME_STYLES_DONE in combinedProps)) {\n const classNames = new ClassNames(combinedProps.className);\n // static processors never write style values, so the incoming style\n // object can be passed through without a defensive copy\n const styles = runtimeStyleProcessor.$dynamic\n ? { ...combinedProps.style }\n : combinedProps.style;\n runtimeStyleProcessor(combinedProps, classNames, styles as React.CSSProperties);\n // @ts-expect-error this is not typed correctly\n combinedProps[INTERNAL.RUNTIME_STYLES_DONE] = true;\n\n combinedProps.className = classNames.value || undefined;\n if (styles !== combinedProps.style) {\n combinedProps.style = styles;\n }\n }\n\n // delete the yak theme from the props\n // this must happen after the runtimeStyles are calculated\n // prevents passing the theme prop to the DOM element of a styled component\n const { theme: themeAfterAttr, ...combinedPropsWithoutTheme } = combinedProps;\n const propsBeforeFiltering =\n themeAfterAttr === theme ? combinedPropsWithoutTheme : combinedProps;\n\n // remove all props that start with a $ sign so they reach neither DOM\n // elements nor custom components — this also strips the internal\n // INTERNAL.ATTRS_MERGED/INTERNAL.RUNTIME_STYLES_DONE markers, which must not cross a\n // custom component boundary (a custom component may render another yak\n // component that has to process its own attrs/styles)\n const filteredProps = removeNonDomProperties(propsBeforeFiltering);\n\n // render the chain's target directly — parent wrappers contribute only\n // their (already merged) attrs and style processors\n const Target = targetComponent as React.ElementType;\n return <Target {...(filteredProps as React.ComponentProps<typeof Target>)} />;\n };\n\n // Direct write instead of Object.assign (faster & smaller)\n const taggedYak = Yak as React.FunctionComponent & {\n [yakComponentSymbol]: YakComponentInternals;\n };\n taggedYak[yakComponentSymbol] = [Yak, mergedAttrsFn, runtimeStyleProcessor, targetComponent];\n return taggedYak;\n };\n};\n\n/**\n * Remove all entries that start with a $ sign\n *\n * This allows to have props that are used for internal styling purposes\n * but are not be passed to the DOM element\n */\nconst removeNonDomProperties = <T extends Record<string, unknown>>(obj: T): T => {\n const result = {} as T;\n for (const key in obj) {\n if (!key.startsWith(\"$\") && obj[key] !== undefined) {\n result[key] = obj[key];\n }\n }\n return result;\n};\n\n/**\n * merge props and processed props (including class names and styles)\n * e.g.:\\\n * `{ className: \"a\", foo: 1 }` and `{ className: \"b\", bar: 2 }` \\\n * => `{ className: \"a b\", foo: 1, bar: 2 }`\n */\nconst combineProps = <\n T extends {\n className?: string;\n style?: React.CSSProperties;\n },\n TOther extends\n | {\n className?: string;\n style?: React.CSSProperties;\n }\n | null\n | undefined,\n>(\n props: T,\n newProps: TOther,\n) =>\n newProps\n ? (props.className === newProps.className || !newProps.className) &&\n (props.style === newProps.style || !newProps.style)\n ? // shortcut if no style and class merging is necessary\n {\n ...props,\n ...newProps,\n }\n : // merge class names and styles\n {\n ...props,\n ...newProps,\n className: mergeClassNames(props.className, newProps.className),\n style: { ...props.style, ...newProps.style },\n }\n : // if no new props are provided, no merging is necessary\n props;\n\n/**\n * Merges the attrs function of the current component with the attrs function of the parent component\n * in order to preserve the sequence of the attrs functions.\n * Note: In theory, the parentAttrsFn can have different types for TAttrsIn and TAttrsOut\n * but as this is only used internally, we can ignore and simplify this case\n * @param attrs The attrs object or function of the current component (if any)\n * @param parentAttrsFn The attrs function of the parent/wrapped component (if any)\n * @returns A function that receives the props and returns the transformed props\n */\nconst buildRuntimeAttrsProcessor = <\n T,\n TAttrsIn extends object,\n TAttrsOut extends AttrsMerged<T, TAttrsIn>,\n>(\n attrs?: Attrs<T, TAttrsIn, TAttrsOut>,\n parentAttrsFn?: AttrsFunction<T, TAttrsIn, TAttrsOut>,\n): AttrsFunction<T, TAttrsIn, TAttrsOut> | undefined => {\n const ownAttrsFn = attrs && (typeof attrs === \"function\" ? attrs : () => attrs);\n\n if (ownAttrsFn && parentAttrsFn) {\n return (props) => {\n const parentProps = parentAttrsFn(props);\n\n // overwrite and merge the parent props with the props received from the attrs function\n // after they went through the parent attrs function.\n //\n // This makes sure the linearity of the attrs functions is preserved and all attrs function receive\n // the whole props object calculated from the previous attrs functions\n return combineProps(parentProps, ownAttrsFn(combineProps(props, parentProps)));\n };\n }\n\n // A constant `.attrs({...})` is wrapped into `() => attrs`, which makes it\n // indistinguishable from `.attrs(props => ...)` at render time — so record the\n // object it will always return. Only the wrapper closure is tagged, never a\n // user-supplied attrs function.\n //\n // A `styled(StyledWithAttrs).attrs({...})` chain merges its levels per render\n // and is not tagged, which keeps a mutation of an attrs object observable\n if (ownAttrsFn && typeof attrs !== \"function\") {\n return Object.assign(ownAttrsFn, {\n [INTERNAL.STATIC_ATTRS]: attrs,\n } as StaticAttrsCarrier);\n }\n\n return ownAttrsFn || parentAttrsFn;\n};\n\n/**\n * The constant object a `.attrs({...})` processor always returns\n *\n * Kept local to this module — like the `yakComponentSymbol` tuple, it is an\n * implementation detail and must not reach the public `AttrsFunction` type\n */\ntype StaticAttrsCarrier = { [K in typeof INTERNAL.STATIC_ATTRS]?: object };\n\n/**\n * Merges the runtime style function of the current component with the runtime style function of the parent component\n * in order to preserve the sequence of the attrs functions.\n * @param runtimeStylesFn The current runtime styles function\n * @param parentRuntimeStylesFn The parent runtime styles function\n * @returns The merged runtime styles function\n */\nconst buildRuntimeStylesProcessor = <T,>(\n runtimeStylesFn: RuntimeStyleProcessor<T>,\n parentRuntimeStylesFn?: RuntimeStyleProcessor<T>,\n) => {\n if (runtimeStylesFn && parentRuntimeStylesFn) {\n const combined: RuntimeStyleProcessor<T> = Object.assign(\n (\n props: T,\n classNames: Parameters<RuntimeStyleProcessor<T>>[1],\n style: React.CSSProperties,\n ) => {\n parentRuntimeStylesFn(props, classNames, style);\n runtimeStylesFn(props, classNames, style);\n },\n // the chain is dynamic if any level is dynamic\n { $dynamic: runtimeStylesFn.$dynamic || parentRuntimeStylesFn.$dynamic },\n );\n return combined;\n }\n return runtimeStylesFn || parentRuntimeStylesFn;\n};\n\n/**\n * Internal function where attrs are passed to be processed\n */\nexport type StyledInternal = <\n T extends object,\n TAttrsIn extends object = {},\n TAttrsOut extends AttrsMerged<T, TAttrsIn> = AttrsMerged<T, TAttrsIn>,\n>(\n Component: React.FunctionComponent<T> | YakComponent<T> | HtmlTags | string,\n attrs?: Attrs<T, TAttrsIn, TAttrsOut>,\n) => StyledLiteral<Substitute<T, TAttrsIn>>;\n\n/**\n * Utility type to extract the AttrsFunction from the Attrs type\n */\nexport type ExtractAttrsFunction<T> = T extends (p: any) => any ? T : never;\n","import React from \"react\";\nimport { styled as StyledFactory } from \"../styled.js\";\n\nexport const styled = new Proxy(StyledFactory, {\n get(target, TagName: keyof React.JSX.IntrinsicElements) {\n return target(TagName);\n },\n}) as typeof StyledFactory;\n","import type { globalStyle as globalStyleInternal } from \"../globalStyle.js\";\n\nexport type { GlobalStyleInterpolation } from \"../globalStyle.js\";\n\n/**\n * Test-friendly mock of `globalStyle`.\n *\n * `globalStyle` has no runtime behaviour — the SWC plugin extracts its CSS at\n * build time and replaces the call with a no-op. The mock mirrors that: it does\n * nothing so yak files can be imported in Jest/Vitest without the compiler.\n */\nexport const globalStyle: typeof globalStyleInternal = (_styles, ..._values) => {\n // no-op in the mock\n};\n"],"mappings":"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"}