@typestyles/props 0.3.0 → 0.4.0
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.
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/defineProperties.ts","../src/utils.ts","../src/generate.ts","../src/runtime.ts","../src/createProps.ts"],"names":["insertRules"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions,\n DefinePropertiesConfig,\n PropertyCollection,\n} from './types.js';\n\n/**\n * Define a collection of CSS properties with their allowed values and optional conditions.\n *\n * @example\n * ```ts\n * const responsiveProps = defineProperties({\n * conditions: {\n * mobile: { '@media': '(min-width: 768px)' },\n * desktop: { '@media': '(min-width: 1024px)' },\n * },\n * defaultCondition: false,\n * properties: {\n * display: ['flex', 'block', 'grid', 'none'],\n * paddingTop: { 0: '0', 1: '4px', 2: '8px', 3: '16px' },\n * },\n * shorthands: {\n * padding: ['paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft'],\n * },\n * });\n * ```\n */\nexport function defineProperties<\n P extends PropertyDefinitions,\n C extends ConditionDefinitions = ConditionDefinitions,\n S extends ShorthandDefinitions<P> = Record<string, Array<keyof P>>,\n>(config: DefinePropertiesConfig<P, C, S>): PropertyCollection<P, C, S> {\n const conditions = (config.conditions || {}) as C;\n const shorthands = (config.shorthands || {}) as S;\n const defaultCondition = config.defaultCondition ?? false;\n\n return {\n properties: config.properties,\n conditions,\n defaultCondition,\n shorthands,\n };\n}\n","/**\n * Sanitize a value for use in a class name.\n * Replaces spaces with hyphens and removes special characters.\n */\nexport function sanitizeValue(value: string | number): string {\n return String(value)\n .replace(/\\s+/g, '-')\n .replace(/[^a-zA-Z0-9-_]/g, '');\n}\n\n/**\n * Convert camelCase to kebab-case for CSS property names.\n */\nexport function toKebabCase(str: string): string {\n // Handle vendor prefixes (ms, webkit, moz)\n if (str.startsWith('ms')) {\n return '-' + str.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n }\n return str.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n}\n\n/**\n * Check if a value is a conditional object (has condition keys).\n */\nexport function isConditionalValue(\n value: unknown,\n conditionKeys: Set<string>,\n): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n\n // Check if any key is a known condition\n for (const key in value) {\n if (conditionKeys.has(key)) {\n return true;\n }\n }\n\n return false;\n}\n","import type {\n PropertyDefinitions,\n ConditionDefinitions,\n PropertyCollection,\n ConditionDefinition,\n PropertyValues,\n ShorthandDefinitions,\n} from './types.js';\nimport { sanitizeValue, toKebabCase } from './utils.js';\n\n/**\n * Generate a single atomic CSS class.\n */\nfunction generateAtomicClass(\n namespace: string,\n property: string,\n valueKey: string,\n cssValue: string | number,\n condition?: ConditionDefinition & { name: string },\n): { key: string; css: string } {\n const sanitizedValue = sanitizeValue(valueKey);\n const className = condition\n ? `${namespace}-${property}-${condition.name}-${sanitizedValue}`\n : `${namespace}-${property}-${sanitizedValue}`;\n\n const kebabProp = toKebabCase(property);\n const declaration = `${kebabProp}: ${cssValue}`;\n\n if (!condition) {\n return {\n key: `.${className}`,\n css: `.${className} { ${declaration}; }`,\n };\n }\n\n // Handle media queries\n if (condition['@media']) {\n const mediaQuery = `@media ${condition['@media']}`;\n return {\n key: `${mediaQuery}:.${className}`,\n css: `${mediaQuery} { .${className} { ${declaration}; } }`,\n };\n }\n\n // Handle container queries\n if (condition['@container']) {\n const containerQuery = `@container ${condition['@container']}`;\n return {\n key: `${containerQuery}:.${className}`,\n css: `${containerQuery} { .${className} { ${declaration}; } }`,\n };\n }\n\n // Handle @supports\n if (condition['@supports']) {\n const supportsQuery = `@supports ${condition['@supports']}`;\n return {\n key: `${supportsQuery}:.${className}`,\n css: `${supportsQuery} { .${className} { ${declaration}; } }`,\n };\n }\n\n // Handle custom selectors\n if (condition.selector) {\n const wrappedSelector = condition.selector.replace(/&/g, `.${className}`);\n return {\n key: wrappedSelector,\n css: `${wrappedSelector} { ${declaration}; }`,\n };\n }\n\n // Fallback to no condition\n return {\n key: `.${className}`,\n css: `.${className} { ${declaration}; }`,\n };\n}\n\n/**\n * Get CSS value entries from PropertyValues.\n */\nfunction getValueEntries(values: PropertyValues): Array<[string, string | number]> {\n if (Array.isArray(values)) {\n // Array format: ['flex', 'block'] -> [['flex', 'flex'], ['block', 'block']]\n return values.map((v) => [v, v]);\n } else {\n // Object format: { 0: '0', 1: '4px' } -> [['0', '0'], ['1', '4px']]\n return Object.entries(values);\n }\n}\n\n/**\n * Generate all atomic CSS classes for a property collection.\n */\nexport function generateAllAtomicClasses<\n P extends PropertyDefinitions,\n C extends ConditionDefinitions,\n>(\n namespace: string,\n properties: P,\n conditions: C,\n defaultCondition: keyof C | false,\n): Array<{ key: string; css: string }> {\n const rules: Array<{ key: string; css: string }> = [];\n\n for (const [property, values] of Object.entries(properties)) {\n const valueEntries = getValueEntries(values);\n\n for (const [valueKey, cssValue] of valueEntries) {\n // Generate base class (no condition or with default condition)\n if (defaultCondition === false) {\n rules.push(generateAtomicClass(namespace, property, valueKey, cssValue));\n } else {\n const condition = conditions[defaultCondition as string];\n if (condition) {\n rules.push(\n generateAtomicClass(namespace, property, valueKey, cssValue, {\n ...condition,\n name: defaultCondition as string,\n }),\n );\n }\n }\n\n // Generate conditional variants\n for (const [condName, condDef] of Object.entries(conditions)) {\n // Skip if this is the default condition and we already generated it\n if (defaultCondition !== false && condName === defaultCondition) {\n continue;\n }\n\n rules.push(\n generateAtomicClass(namespace, property, valueKey, cssValue, {\n ...condDef,\n name: condName,\n }),\n );\n }\n }\n }\n\n return rules;\n}\n\n/**\n * Generate all atomic CSS classes from multiple property collections.\n */\nexport function generateFromCollections(\n namespace: string,\n collections: PropertyCollection<\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions<PropertyDefinitions>\n >[],\n): Array<{ key: string; css: string }> {\n const allRules: Array<{ key: string; css: string }> = [];\n\n for (const collection of collections) {\n const rules = generateAllAtomicClasses(\n namespace,\n collection.properties,\n collection.conditions,\n collection.defaultCondition,\n );\n allRules.push(...rules);\n }\n\n return allRules;\n}\n","import type {\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions,\n PropertyCollection,\n} from './types.js';\nimport { sanitizeValue, isConditionalValue } from './utils.js';\n\n/**\n * Build a lookup map for runtime class name resolution.\n */\nexport function buildLookupMap<\n P extends PropertyDefinitions,\n C extends ConditionDefinitions,\n S extends ShorthandDefinitions<P>,\n>(\n _namespace: string,\n collections: PropertyCollection<P, C, S>[],\n): {\n propertyMap: Map<string, Set<string>>;\n conditionKeys: Set<string>;\n shorthands: Map<string, string[]>;\n} {\n const propertyMap = new Map<string, Set<string>>();\n const conditionKeys = new Set<string>();\n const shorthands = new Map<string, string[]>();\n\n for (const collection of collections) {\n // Collect properties\n for (const property of Object.keys(collection.properties)) {\n if (!propertyMap.has(property)) {\n propertyMap.set(property, new Set());\n }\n }\n\n // Collect conditions\n for (const condition of Object.keys(collection.conditions)) {\n conditionKeys.add(condition);\n }\n\n // Collect shorthands\n for (const [shorthand, props] of Object.entries(collection.shorthands)) {\n shorthands.set(shorthand, props as string[]);\n }\n }\n\n return { propertyMap, conditionKeys, shorthands };\n}\n\n/**\n * Expand shorthands in props object.\n */\nexport function expandShorthands(\n props: Record<string, unknown>,\n shorthands: Map<string, string[]>,\n): Record<string, unknown> {\n const expanded: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (shorthands.has(key)) {\n // Expand shorthand\n const properties = shorthands.get(key)!;\n for (const prop of properties) {\n expanded[prop] = value;\n }\n } else {\n // Regular property\n expanded[key] = value;\n }\n }\n\n return expanded;\n}\n\n/**\n * Resolve a single property value to class names.\n */\nfunction resolveValue(\n namespace: string,\n property: string,\n value: unknown,\n conditionKeys: Set<string>,\n): string[] {\n const classNames: string[] = [];\n\n if (isConditionalValue(value, conditionKeys)) {\n // Conditional value: { mobile: 'flex', desktop: 'block' }\n for (const [condition, condValue] of Object.entries(value)) {\n if (conditionKeys.has(condition)) {\n const sanitized = sanitizeValue(String(condValue));\n classNames.push(`${namespace}-${property}-${condition}-${sanitized}`);\n }\n }\n } else {\n // Direct value: 'flex' or 2\n const sanitized = sanitizeValue(String(value));\n classNames.push(`${namespace}-${property}-${sanitized}`);\n }\n\n return classNames;\n}\n\n/**\n * Create a runtime resolver function.\n */\nexport function createResolver(\n namespace: string,\n _propertyMap: Map<string, Set<string>>,\n conditionKeys: Set<string>,\n shorthands: Map<string, string[]>,\n): (props: Record<string, unknown>) => string {\n return (props: Record<string, unknown>): string => {\n // Expand shorthands\n const expanded = expandShorthands(props, shorthands);\n\n const classNames: string[] = [];\n\n for (const [property, value] of Object.entries(expanded)) {\n if (value == null) continue;\n\n const resolved = resolveValue(namespace, property, value, conditionKeys);\n classNames.push(...resolved);\n }\n\n return classNames.join(' ');\n };\n}\n","import type {\n PropertyCollection,\n PropsFunction,\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions,\n} from './types.js';\nimport { insertRules } from 'typestyles';\nimport { generateFromCollections } from './generate.js';\nimport { buildLookupMap, createResolver } from './runtime.js';\n\n/**\n * Combine property collections into a typed props function with pre-generated CSS.\n *\n * @example\n * ```ts\n * const props = createProps('atoms', responsiveProps, colorProps);\n *\n * // Type-safe usage\n * props({\n * display: 'flex',\n * padding: 2,\n * paddingTop: { mobile: 3 },\n * });\n * // Returns: \"atoms-display-flex atoms-padding-2 atoms-paddingTop-mobile-3\"\n * ```\n */\nexport function createProps<\n Collections extends PropertyCollection<\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions<PropertyDefinitions>\n >[],\n>(namespace: string, ...collections: Collections): PropsFunction<Collections> {\n // Generate all CSS rules upfront\n const cssRules = generateFromCollections(namespace, collections);\n\n // Inject CSS\n insertRules(cssRules);\n\n // Build runtime lookup\n const { propertyMap, conditionKeys, shorthands } = buildLookupMap(namespace, collections);\n\n // Create resolver function\n const resolver = createResolver(namespace, propertyMap, conditionKeys, shorthands);\n\n // Create properties set for inspection\n const properties = new Set<string>();\n for (const collection of collections) {\n for (const prop of Object.keys(collection.properties)) {\n properties.add(prop);\n }\n for (const shorthand of Object.keys(collection.shorthands)) {\n properties.add(shorthand);\n }\n }\n\n // Attach properties to the function\n const propsFunction = Object.assign(resolver, { properties });\n\n return propsFunction as PropsFunction<Collections>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/defineProperties.ts","../src/utils.ts","../src/generate.ts","../src/runtime.ts","../src/createProps.ts"],"names":["insertRules"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions,\n DefinePropertiesConfig,\n PropertyCollection,\n} from './types';\n\n/**\n * Define a collection of CSS properties with their allowed values and optional conditions.\n *\n * @example\n * ```ts\n * const responsiveProps = defineProperties({\n * conditions: {\n * mobile: { '@media': '(min-width: 768px)' },\n * desktop: { '@media': '(min-width: 1024px)' },\n * },\n * defaultCondition: false,\n * properties: {\n * display: ['flex', 'block', 'grid', 'none'],\n * paddingTop: { 0: '0', 1: '4px', 2: '8px', 3: '16px' },\n * },\n * shorthands: {\n * padding: ['paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft'],\n * },\n * });\n * ```\n */\nexport function defineProperties<\n P extends PropertyDefinitions,\n C extends ConditionDefinitions = ConditionDefinitions,\n S extends ShorthandDefinitions<P> = Record<string, Array<keyof P>>,\n>(config: DefinePropertiesConfig<P, C, S>): PropertyCollection<P, C, S> {\n const conditions = (config.conditions || {}) as C;\n const shorthands = (config.shorthands || {}) as S;\n const defaultCondition = config.defaultCondition ?? false;\n\n return {\n properties: config.properties,\n conditions,\n defaultCondition,\n shorthands,\n };\n}\n","/**\n * Sanitize a value for use in a class name.\n * Replaces spaces with hyphens and removes special characters.\n */\nexport function sanitizeValue(value: string | number): string {\n return String(value)\n .replace(/\\s+/g, '-')\n .replace(/[^a-zA-Z0-9-_]/g, '');\n}\n\n/**\n * Convert camelCase to kebab-case for CSS property names.\n */\nexport function toKebabCase(str: string): string {\n // Handle vendor prefixes (ms, webkit, moz)\n if (str.startsWith('ms')) {\n return '-' + str.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n }\n return str.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n}\n\n/**\n * Check if a value is a conditional object (has condition keys).\n */\nexport function isConditionalValue(\n value: unknown,\n conditionKeys: Set<string>,\n): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n\n // Check if any key is a known condition\n for (const key in value) {\n if (conditionKeys.has(key)) {\n return true;\n }\n }\n\n return false;\n}\n","import type {\n PropertyDefinitions,\n ConditionDefinitions,\n PropertyCollection,\n ConditionDefinition,\n PropertyValues,\n ShorthandDefinitions,\n} from './types';\nimport { sanitizeValue, toKebabCase } from './utils';\n\n/**\n * Generate a single atomic CSS class.\n */\nfunction generateAtomicClass(\n namespace: string,\n property: string,\n valueKey: string,\n cssValue: string | number,\n condition?: ConditionDefinition & { name: string },\n): { key: string; css: string } {\n const sanitizedValue = sanitizeValue(valueKey);\n const className = condition\n ? `${namespace}-${property}-${condition.name}-${sanitizedValue}`\n : `${namespace}-${property}-${sanitizedValue}`;\n\n const kebabProp = toKebabCase(property);\n const declaration = `${kebabProp}: ${cssValue}`;\n\n if (!condition) {\n return {\n key: `.${className}`,\n css: `.${className} { ${declaration}; }`,\n };\n }\n\n // Handle media queries\n if (condition['@media']) {\n const mediaQuery = `@media ${condition['@media']}`;\n return {\n key: `${mediaQuery}:.${className}`,\n css: `${mediaQuery} { .${className} { ${declaration}; } }`,\n };\n }\n\n // Handle container queries\n if (condition['@container']) {\n const containerQuery = `@container ${condition['@container']}`;\n return {\n key: `${containerQuery}:.${className}`,\n css: `${containerQuery} { .${className} { ${declaration}; } }`,\n };\n }\n\n // Handle @supports\n if (condition['@supports']) {\n const supportsQuery = `@supports ${condition['@supports']}`;\n return {\n key: `${supportsQuery}:.${className}`,\n css: `${supportsQuery} { .${className} { ${declaration}; } }`,\n };\n }\n\n // Handle custom selectors\n if (condition.selector) {\n const wrappedSelector = condition.selector.replace(/&/g, `.${className}`);\n return {\n key: wrappedSelector,\n css: `${wrappedSelector} { ${declaration}; }`,\n };\n }\n\n // Fallback to no condition\n return {\n key: `.${className}`,\n css: `.${className} { ${declaration}; }`,\n };\n}\n\n/**\n * Get CSS value entries from PropertyValues.\n */\nfunction getValueEntries(values: PropertyValues): Array<[string, string | number]> {\n if (Array.isArray(values)) {\n // Array format: ['flex', 'block'] -> [['flex', 'flex'], ['block', 'block']]\n return values.map((v) => [v, v]);\n } else {\n // Object format: { 0: '0', 1: '4px' } -> [['0', '0'], ['1', '4px']]\n return Object.entries(values);\n }\n}\n\n/**\n * Generate all atomic CSS classes for a property collection.\n */\nexport function generateAllAtomicClasses<\n P extends PropertyDefinitions,\n C extends ConditionDefinitions,\n>(\n namespace: string,\n properties: P,\n conditions: C,\n defaultCondition: keyof C | false,\n): Array<{ key: string; css: string }> {\n const rules: Array<{ key: string; css: string }> = [];\n\n for (const [property, values] of Object.entries(properties)) {\n const valueEntries = getValueEntries(values);\n\n for (const [valueKey, cssValue] of valueEntries) {\n // Generate base class (no condition or with default condition)\n if (defaultCondition === false) {\n rules.push(generateAtomicClass(namespace, property, valueKey, cssValue));\n } else {\n const condition = conditions[defaultCondition as string];\n if (condition) {\n rules.push(\n generateAtomicClass(namespace, property, valueKey, cssValue, {\n ...condition,\n name: defaultCondition as string,\n }),\n );\n }\n }\n\n // Generate conditional variants\n for (const [condName, condDef] of Object.entries(conditions)) {\n // Skip if this is the default condition and we already generated it\n if (defaultCondition !== false && condName === defaultCondition) {\n continue;\n }\n\n rules.push(\n generateAtomicClass(namespace, property, valueKey, cssValue, {\n ...condDef,\n name: condName,\n }),\n );\n }\n }\n }\n\n return rules;\n}\n\n/**\n * Generate all atomic CSS classes from multiple property collections.\n */\nexport function generateFromCollections(\n namespace: string,\n collections: PropertyCollection<\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions<PropertyDefinitions>\n >[],\n): Array<{ key: string; css: string }> {\n const allRules: Array<{ key: string; css: string }> = [];\n\n for (const collection of collections) {\n const rules = generateAllAtomicClasses(\n namespace,\n collection.properties,\n collection.conditions,\n collection.defaultCondition,\n );\n allRules.push(...rules);\n }\n\n return allRules;\n}\n","import type {\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions,\n PropertyCollection,\n} from './types';\nimport { sanitizeValue, isConditionalValue } from './utils';\n\n/**\n * Build a lookup map for runtime class name resolution.\n */\nexport function buildLookupMap<\n P extends PropertyDefinitions,\n C extends ConditionDefinitions,\n S extends ShorthandDefinitions<P>,\n>(\n _namespace: string,\n collections: PropertyCollection<P, C, S>[],\n): {\n propertyMap: Map<string, Set<string>>;\n conditionKeys: Set<string>;\n shorthands: Map<string, string[]>;\n} {\n const propertyMap = new Map<string, Set<string>>();\n const conditionKeys = new Set<string>();\n const shorthands = new Map<string, string[]>();\n\n for (const collection of collections) {\n // Collect properties\n for (const property of Object.keys(collection.properties)) {\n if (!propertyMap.has(property)) {\n propertyMap.set(property, new Set());\n }\n }\n\n // Collect conditions\n for (const condition of Object.keys(collection.conditions)) {\n conditionKeys.add(condition);\n }\n\n // Collect shorthands\n for (const [shorthand, props] of Object.entries(collection.shorthands)) {\n shorthands.set(shorthand, props as string[]);\n }\n }\n\n return { propertyMap, conditionKeys, shorthands };\n}\n\n/**\n * Expand shorthands in props object.\n */\nexport function expandShorthands(\n props: Record<string, unknown>,\n shorthands: Map<string, string[]>,\n): Record<string, unknown> {\n const expanded: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (shorthands.has(key)) {\n // Expand shorthand\n const properties = shorthands.get(key)!;\n for (const prop of properties) {\n expanded[prop] = value;\n }\n } else {\n // Regular property\n expanded[key] = value;\n }\n }\n\n return expanded;\n}\n\n/**\n * Resolve a single property value to class names.\n */\nfunction resolveValue(\n namespace: string,\n property: string,\n value: unknown,\n conditionKeys: Set<string>,\n): string[] {\n const classNames: string[] = [];\n\n if (isConditionalValue(value, conditionKeys)) {\n // Conditional value: { mobile: 'flex', desktop: 'block' }\n for (const [condition, condValue] of Object.entries(value)) {\n if (conditionKeys.has(condition)) {\n const sanitized = sanitizeValue(String(condValue));\n classNames.push(`${namespace}-${property}-${condition}-${sanitized}`);\n }\n }\n } else {\n // Direct value: 'flex' or 2\n const sanitized = sanitizeValue(String(value));\n classNames.push(`${namespace}-${property}-${sanitized}`);\n }\n\n return classNames;\n}\n\n/**\n * Create a runtime resolver function.\n */\nexport function createResolver(\n namespace: string,\n _propertyMap: Map<string, Set<string>>,\n conditionKeys: Set<string>,\n shorthands: Map<string, string[]>,\n): (props: Record<string, unknown>) => string {\n return (props: Record<string, unknown>): string => {\n // Expand shorthands\n const expanded = expandShorthands(props, shorthands);\n\n const classNames: string[] = [];\n\n for (const [property, value] of Object.entries(expanded)) {\n if (value == null) continue;\n\n const resolved = resolveValue(namespace, property, value, conditionKeys);\n classNames.push(...resolved);\n }\n\n return classNames.join(' ');\n };\n}\n","import type {\n PropertyCollection,\n PropsFunction,\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions,\n} from './types';\nimport { insertRules } from 'typestyles';\nimport { generateFromCollections } from './generate';\nimport { buildLookupMap, createResolver } from './runtime';\n\n/**\n * Combine property collections into a typed props function with pre-generated CSS.\n *\n * @example\n * ```ts\n * const props = createProps('atoms', responsiveProps, colorProps);\n *\n * // Type-safe usage\n * props({\n * display: 'flex',\n * padding: 2,\n * paddingTop: { mobile: 3 },\n * });\n * // Returns: \"atoms-display-flex atoms-padding-2 atoms-paddingTop-mobile-3\"\n * ```\n */\nexport function createProps<\n Collections extends PropertyCollection<\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions<PropertyDefinitions>\n >[],\n>(namespace: string, ...collections: Collections): PropsFunction<Collections> {\n // Generate all CSS rules upfront\n const cssRules = generateFromCollections(namespace, collections);\n\n // Inject CSS\n insertRules(cssRules);\n\n // Build runtime lookup\n const { propertyMap, conditionKeys, shorthands } = buildLookupMap(namespace, collections);\n\n // Create resolver function\n const resolver = createResolver(namespace, propertyMap, conditionKeys, shorthands);\n\n // Create properties set for inspection\n const properties = new Set<string>();\n for (const collection of collections) {\n for (const prop of Object.keys(collection.properties)) {\n properties.add(prop);\n }\n for (const shorthand of Object.keys(collection.shorthands)) {\n properties.add(shorthand);\n }\n }\n\n // Attach properties to the function\n const propsFunction = Object.assign(resolver, { properties });\n\n return propsFunction as PropsFunction<Collections>;\n}\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/defineProperties.ts","../src/utils.ts","../src/generate.ts","../src/runtime.ts","../src/createProps.ts"],"names":[],"mappings":";;;AA6BO,SAAS,iBAId,MAAA,EAAsE;AACtE,EAAA,MAAM,UAAA,GAAc,MAAA,CAAO,UAAA,IAAc,EAAC;AAC1C,EAAA,MAAM,UAAA,GAAc,MAAA,CAAO,UAAA,IAAc,EAAC;AAC1C,EAAA,MAAM,gBAAA,GAAmB,OAAO,gBAAA,IAAoB,KAAA;AAEpD,EAAA,OAAO;AAAA,IACL,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,UAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACxCO,SAAS,cAAc,KAAA,EAAgC;AAC5D,EAAA,OAAO,MAAA,CAAO,KAAK,CAAA,CAChB,OAAA,CAAQ,QAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA;AAClC;AAKO,SAAS,YAAY,GAAA,EAAqB;AAE/C,EAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AACxB,IAAA,OAAO,GAAA,GAAM,IAAI,OAAA,CAAQ,QAAA,EAAU,CAAC,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,WAAA,EAAa,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,GAAA,CAAI,QAAQ,QAAA,EAAU,CAAC,MAAM,GAAA,GAAM,CAAA,CAAE,aAAa,CAAA;AAC3D;AAKO,SAAS,kBAAA,CACd,OACA,aAAA,EACkC;AAClC,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,IAAI,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;;;AC3BA,SAAS,mBAAA,CACP,SAAA,EACA,QAAA,EACA,QAAA,EACA,UACA,SAAA,EAC8B;AAC9B,EAAA,MAAM,cAAA,GAAiB,cAAc,QAAQ,CAAA;AAC7C,EAAA,MAAM,YAAY,SAAA,GACd,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,SAAA,CAAU,IAAI,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA,GAC5D,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,IAAI,cAAc,CAAA,CAAA;AAE9C,EAAA,MAAM,SAAA,GAAY,YAAY,QAAQ,CAAA;AACtC,EAAA,MAAM,WAAA,GAAc,CAAA,EAAG,SAAS,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA;AAE7C,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,IAAI,SAAS,CAAA,CAAA;AAAA,MAClB,GAAA,EAAK,CAAA,CAAA,EAAI,SAAS,CAAA,GAAA,EAAM,WAAW,CAAA,GAAA;AAAA,KACrC;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,QAAQ,CAAA,EAAG;AACvB,IAAA,MAAM,UAAA,GAAa,CAAA,OAAA,EAAU,SAAA,CAAU,QAAQ,CAAC,CAAA,CAAA;AAChD,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,CAAA,EAAG,UAAU,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAAA,MAChC,KAAK,CAAA,EAAG,UAAU,CAAA,IAAA,EAAO,SAAS,MAAM,WAAW,CAAA,KAAA;AAAA,KACrD;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,YAAY,CAAA,EAAG;AAC3B,IAAA,MAAM,cAAA,GAAiB,CAAA,WAAA,EAAc,SAAA,CAAU,YAAY,CAAC,CAAA,CAAA;AAC5D,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,CAAA,EAAG,cAAc,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAAA,MACpC,KAAK,CAAA,EAAG,cAAc,CAAA,IAAA,EAAO,SAAS,MAAM,WAAW,CAAA,KAAA;AAAA,KACzD;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,aAAA,GAAgB,CAAA,UAAA,EAAa,SAAA,CAAU,WAAW,CAAC,CAAA,CAAA;AACzD,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,CAAA,EAAG,aAAa,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAAA,MACnC,KAAK,CAAA,EAAG,aAAa,CAAA,IAAA,EAAO,SAAS,MAAM,WAAW,CAAA,KAAA;AAAA,KACxD;AAAA,EACF;AAGA,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,MAAM,kBAAkB,SAAA,CAAU,QAAA,CAAS,QAAQ,IAAA,EAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AACxE,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,eAAA;AAAA,MACL,GAAA,EAAK,CAAA,EAAG,eAAe,CAAA,GAAA,EAAM,WAAW,CAAA,GAAA;AAAA,KAC1C;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,IAAI,SAAS,CAAA,CAAA;AAAA,IAClB,GAAA,EAAK,CAAA,CAAA,EAAI,SAAS,CAAA,GAAA,EAAM,WAAW,CAAA,GAAA;AAAA,GACrC;AACF;AAKA,SAAS,gBAAgB,MAAA,EAA0D;AACjF,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAEzB,IAAA,OAAO,OAAO,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EACjC,CAAA,MAAO;AAEL,IAAA,OAAO,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,EAC9B;AACF;AAKO,SAAS,wBAAA,CAId,SAAA,EACA,UAAA,EACA,UAAA,EACA,gBAAA,EACqC;AACrC,EAAA,MAAM,QAA6C,EAAC;AAEpD,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC3D,IAAA,MAAM,YAAA,GAAe,gBAAgB,MAAM,CAAA;AAE3C,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,QAAQ,CAAA,IAAK,YAAA,EAAc;AAE/C,MAAA,IAAI,qBAAqB,KAAA,EAAO;AAC9B,QAAA,KAAA,CAAM,KAAK,mBAAA,CAAoB,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,MACzE,CAAA,MAAO;AACL,QAAA,MAAM,SAAA,GAAY,WAAW,gBAA0B,CAAA;AACvD,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,KAAA,CAAM,IAAA;AAAA,YACJ,mBAAA,CAAoB,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU;AAAA,cAC3D,GAAG,SAAA;AAAA,cACH,IAAA,EAAM;AAAA,aACP;AAAA,WACH;AAAA,QACF;AAAA,MACF;AAGA,MAAA,KAAA,MAAW,CAAC,QAAA,EAAU,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AAE5D,QAAA,IAAI,gBAAA,KAAqB,KAAA,IAAS,QAAA,KAAa,gBAAA,EAAkB;AAC/D,UAAA;AAAA,QACF;AAEA,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ,mBAAA,CAAoB,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU;AAAA,YAC3D,GAAG,OAAA;AAAA,YACH,IAAA,EAAM;AAAA,WACP;AAAA,SACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,uBAAA,CACd,WACA,WAAA,EAKqC;AACrC,EAAA,MAAM,WAAgD,EAAC;AAEvD,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,MAAM,KAAA,GAAQ,wBAAA;AAAA,MACZ,SAAA;AAAA,MACA,UAAA,CAAW,UAAA;AAAA,MACX,UAAA,CAAW,UAAA;AAAA,MACX,UAAA,CAAW;AAAA,KACb;AACA,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,EACxB;AAEA,EAAA,OAAO,QAAA;AACT;;;AC7JO,SAAS,cAAA,CAKd,YACA,WAAA,EAKA;AACA,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAyB;AACjD,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAsB;AAE7C,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AAEpC,IAAA,KAAA,MAAW,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AACzD,MAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,QAAA,WAAA,CAAY,GAAA,CAAI,QAAA,kBAAU,IAAI,GAAA,EAAK,CAAA;AAAA,MACrC;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,SAAA,IAAa,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AAC1D,MAAA,aAAA,CAAc,IAAI,SAAS,CAAA;AAAA,IAC7B;AAGA,IAAA,KAAA,MAAW,CAAC,WAAW,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,EAAG;AACtE,MAAA,UAAA,CAAW,GAAA,CAAI,WAAW,KAAiB,CAAA;AAAA,IAC7C;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,WAAA,EAAa,aAAA,EAAe,UAAA,EAAW;AAClD;AAKO,SAAS,gBAAA,CACd,OACA,UAAA,EACyB;AACzB,EAAA,MAAM,WAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AAEvB,MAAA,MAAM,UAAA,GAAa,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AACrC,MAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,QAAA,QAAA,CAAS,IAAI,CAAA,GAAI,KAAA;AAAA,MACnB;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,YAAA,CACP,SAAA,EACA,QAAA,EACA,KAAA,EACA,aAAA,EACU;AACV,EAAA,MAAM,aAAuB,EAAC;AAE9B,EAAA,IAAI,kBAAA,CAAmB,KAAA,EAAO,aAAa,CAAA,EAAG;AAE5C,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1D,MAAA,IAAI,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA,EAAG;AAChC,QAAA,MAAM,SAAA,GAAY,aAAA,CAAc,MAAA,CAAO,SAAS,CAAC,CAAA;AACjD,QAAA,UAAA,CAAW,IAAA,CAAK,GAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAAA,MACtE;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,SAAA,GAAY,aAAA,CAAc,MAAA,CAAO,KAAK,CAAC,CAAA;AAC7C,IAAA,UAAA,CAAW,KAAK,CAAA,EAAG,SAAS,IAAI,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,UAAA;AACT;AAKO,SAAS,cAAA,CACd,SAAA,EACA,YAAA,EACA,aAAA,EACA,UAAA,EAC4C;AAC5C,EAAA,OAAO,CAAC,KAAA,KAA2C;AAEjD,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,KAAA,EAAO,UAAU,CAAA;AAEnD,IAAA,MAAM,aAAuB,EAAC;AAE9B,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACxD,MAAA,IAAI,SAAS,IAAA,EAAM;AAEnB,MAAA,MAAM,QAAA,GAAW,YAAA,CAAa,SAAA,EAAW,QAAA,EAAU,OAAO,aAAa,CAAA;AACvE,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,EAC5B,CAAA;AACF;;;ACnGO,SAAS,WAAA,CAMd,cAAsB,WAAA,EAAsD;AAE5E,EAAA,MAAM,QAAA,GAAW,uBAAA,CAAwB,SAAA,EAAW,WAAW,CAAA;AAG/D,EAAA,WAAA,CAAY,QAAQ,CAAA;AAGpB,EAAA,MAAM,EAAE,WAAA,EAAa,aAAA,EAAe,YAAW,GAAI,cAAA,CAAe,WAAW,WAAW,CAAA;AAGxF,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,SAAA,EAAW,WAAA,EAAa,eAAe,UAAU,CAAA;AAGjF,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AACrD,MAAA,UAAA,CAAW,IAAI,IAAI,CAAA;AAAA,IACrB;AACA,IAAA,KAAA,MAAW,SAAA,IAAa,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AAC1D,MAAA,UAAA,CAAW,IAAI,SAAS,CAAA;AAAA,IAC1B;AAAA,EACF;AAGA,EAAA,MAAM,gBAAgB,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,EAAE,YAAY,CAAA;AAE5D,EAAA,OAAO,aAAA;AACT","file":"index.js","sourcesContent":["import type {\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions,\n DefinePropertiesConfig,\n PropertyCollection,\n} from './types.js';\n\n/**\n * Define a collection of CSS properties with their allowed values and optional conditions.\n *\n * @example\n * ```ts\n * const responsiveProps = defineProperties({\n * conditions: {\n * mobile: { '@media': '(min-width: 768px)' },\n * desktop: { '@media': '(min-width: 1024px)' },\n * },\n * defaultCondition: false,\n * properties: {\n * display: ['flex', 'block', 'grid', 'none'],\n * paddingTop: { 0: '0', 1: '4px', 2: '8px', 3: '16px' },\n * },\n * shorthands: {\n * padding: ['paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft'],\n * },\n * });\n * ```\n */\nexport function defineProperties<\n P extends PropertyDefinitions,\n C extends ConditionDefinitions = ConditionDefinitions,\n S extends ShorthandDefinitions<P> = Record<string, Array<keyof P>>,\n>(config: DefinePropertiesConfig<P, C, S>): PropertyCollection<P, C, S> {\n const conditions = (config.conditions || {}) as C;\n const shorthands = (config.shorthands || {}) as S;\n const defaultCondition = config.defaultCondition ?? false;\n\n return {\n properties: config.properties,\n conditions,\n defaultCondition,\n shorthands,\n };\n}\n","/**\n * Sanitize a value for use in a class name.\n * Replaces spaces with hyphens and removes special characters.\n */\nexport function sanitizeValue(value: string | number): string {\n return String(value)\n .replace(/\\s+/g, '-')\n .replace(/[^a-zA-Z0-9-_]/g, '');\n}\n\n/**\n * Convert camelCase to kebab-case for CSS property names.\n */\nexport function toKebabCase(str: string): string {\n // Handle vendor prefixes (ms, webkit, moz)\n if (str.startsWith('ms')) {\n return '-' + str.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n }\n return str.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n}\n\n/**\n * Check if a value is a conditional object (has condition keys).\n */\nexport function isConditionalValue(\n value: unknown,\n conditionKeys: Set<string>,\n): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n\n // Check if any key is a known condition\n for (const key in value) {\n if (conditionKeys.has(key)) {\n return true;\n }\n }\n\n return false;\n}\n","import type {\n PropertyDefinitions,\n ConditionDefinitions,\n PropertyCollection,\n ConditionDefinition,\n PropertyValues,\n ShorthandDefinitions,\n} from './types.js';\nimport { sanitizeValue, toKebabCase } from './utils.js';\n\n/**\n * Generate a single atomic CSS class.\n */\nfunction generateAtomicClass(\n namespace: string,\n property: string,\n valueKey: string,\n cssValue: string | number,\n condition?: ConditionDefinition & { name: string },\n): { key: string; css: string } {\n const sanitizedValue = sanitizeValue(valueKey);\n const className = condition\n ? `${namespace}-${property}-${condition.name}-${sanitizedValue}`\n : `${namespace}-${property}-${sanitizedValue}`;\n\n const kebabProp = toKebabCase(property);\n const declaration = `${kebabProp}: ${cssValue}`;\n\n if (!condition) {\n return {\n key: `.${className}`,\n css: `.${className} { ${declaration}; }`,\n };\n }\n\n // Handle media queries\n if (condition['@media']) {\n const mediaQuery = `@media ${condition['@media']}`;\n return {\n key: `${mediaQuery}:.${className}`,\n css: `${mediaQuery} { .${className} { ${declaration}; } }`,\n };\n }\n\n // Handle container queries\n if (condition['@container']) {\n const containerQuery = `@container ${condition['@container']}`;\n return {\n key: `${containerQuery}:.${className}`,\n css: `${containerQuery} { .${className} { ${declaration}; } }`,\n };\n }\n\n // Handle @supports\n if (condition['@supports']) {\n const supportsQuery = `@supports ${condition['@supports']}`;\n return {\n key: `${supportsQuery}:.${className}`,\n css: `${supportsQuery} { .${className} { ${declaration}; } }`,\n };\n }\n\n // Handle custom selectors\n if (condition.selector) {\n const wrappedSelector = condition.selector.replace(/&/g, `.${className}`);\n return {\n key: wrappedSelector,\n css: `${wrappedSelector} { ${declaration}; }`,\n };\n }\n\n // Fallback to no condition\n return {\n key: `.${className}`,\n css: `.${className} { ${declaration}; }`,\n };\n}\n\n/**\n * Get CSS value entries from PropertyValues.\n */\nfunction getValueEntries(values: PropertyValues): Array<[string, string | number]> {\n if (Array.isArray(values)) {\n // Array format: ['flex', 'block'] -> [['flex', 'flex'], ['block', 'block']]\n return values.map((v) => [v, v]);\n } else {\n // Object format: { 0: '0', 1: '4px' } -> [['0', '0'], ['1', '4px']]\n return Object.entries(values);\n }\n}\n\n/**\n * Generate all atomic CSS classes for a property collection.\n */\nexport function generateAllAtomicClasses<\n P extends PropertyDefinitions,\n C extends ConditionDefinitions,\n>(\n namespace: string,\n properties: P,\n conditions: C,\n defaultCondition: keyof C | false,\n): Array<{ key: string; css: string }> {\n const rules: Array<{ key: string; css: string }> = [];\n\n for (const [property, values] of Object.entries(properties)) {\n const valueEntries = getValueEntries(values);\n\n for (const [valueKey, cssValue] of valueEntries) {\n // Generate base class (no condition or with default condition)\n if (defaultCondition === false) {\n rules.push(generateAtomicClass(namespace, property, valueKey, cssValue));\n } else {\n const condition = conditions[defaultCondition as string];\n if (condition) {\n rules.push(\n generateAtomicClass(namespace, property, valueKey, cssValue, {\n ...condition,\n name: defaultCondition as string,\n }),\n );\n }\n }\n\n // Generate conditional variants\n for (const [condName, condDef] of Object.entries(conditions)) {\n // Skip if this is the default condition and we already generated it\n if (defaultCondition !== false && condName === defaultCondition) {\n continue;\n }\n\n rules.push(\n generateAtomicClass(namespace, property, valueKey, cssValue, {\n ...condDef,\n name: condName,\n }),\n );\n }\n }\n }\n\n return rules;\n}\n\n/**\n * Generate all atomic CSS classes from multiple property collections.\n */\nexport function generateFromCollections(\n namespace: string,\n collections: PropertyCollection<\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions<PropertyDefinitions>\n >[],\n): Array<{ key: string; css: string }> {\n const allRules: Array<{ key: string; css: string }> = [];\n\n for (const collection of collections) {\n const rules = generateAllAtomicClasses(\n namespace,\n collection.properties,\n collection.conditions,\n collection.defaultCondition,\n );\n allRules.push(...rules);\n }\n\n return allRules;\n}\n","import type {\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions,\n PropertyCollection,\n} from './types.js';\nimport { sanitizeValue, isConditionalValue } from './utils.js';\n\n/**\n * Build a lookup map for runtime class name resolution.\n */\nexport function buildLookupMap<\n P extends PropertyDefinitions,\n C extends ConditionDefinitions,\n S extends ShorthandDefinitions<P>,\n>(\n _namespace: string,\n collections: PropertyCollection<P, C, S>[],\n): {\n propertyMap: Map<string, Set<string>>;\n conditionKeys: Set<string>;\n shorthands: Map<string, string[]>;\n} {\n const propertyMap = new Map<string, Set<string>>();\n const conditionKeys = new Set<string>();\n const shorthands = new Map<string, string[]>();\n\n for (const collection of collections) {\n // Collect properties\n for (const property of Object.keys(collection.properties)) {\n if (!propertyMap.has(property)) {\n propertyMap.set(property, new Set());\n }\n }\n\n // Collect conditions\n for (const condition of Object.keys(collection.conditions)) {\n conditionKeys.add(condition);\n }\n\n // Collect shorthands\n for (const [shorthand, props] of Object.entries(collection.shorthands)) {\n shorthands.set(shorthand, props as string[]);\n }\n }\n\n return { propertyMap, conditionKeys, shorthands };\n}\n\n/**\n * Expand shorthands in props object.\n */\nexport function expandShorthands(\n props: Record<string, unknown>,\n shorthands: Map<string, string[]>,\n): Record<string, unknown> {\n const expanded: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (shorthands.has(key)) {\n // Expand shorthand\n const properties = shorthands.get(key)!;\n for (const prop of properties) {\n expanded[prop] = value;\n }\n } else {\n // Regular property\n expanded[key] = value;\n }\n }\n\n return expanded;\n}\n\n/**\n * Resolve a single property value to class names.\n */\nfunction resolveValue(\n namespace: string,\n property: string,\n value: unknown,\n conditionKeys: Set<string>,\n): string[] {\n const classNames: string[] = [];\n\n if (isConditionalValue(value, conditionKeys)) {\n // Conditional value: { mobile: 'flex', desktop: 'block' }\n for (const [condition, condValue] of Object.entries(value)) {\n if (conditionKeys.has(condition)) {\n const sanitized = sanitizeValue(String(condValue));\n classNames.push(`${namespace}-${property}-${condition}-${sanitized}`);\n }\n }\n } else {\n // Direct value: 'flex' or 2\n const sanitized = sanitizeValue(String(value));\n classNames.push(`${namespace}-${property}-${sanitized}`);\n }\n\n return classNames;\n}\n\n/**\n * Create a runtime resolver function.\n */\nexport function createResolver(\n namespace: string,\n _propertyMap: Map<string, Set<string>>,\n conditionKeys: Set<string>,\n shorthands: Map<string, string[]>,\n): (props: Record<string, unknown>) => string {\n return (props: Record<string, unknown>): string => {\n // Expand shorthands\n const expanded = expandShorthands(props, shorthands);\n\n const classNames: string[] = [];\n\n for (const [property, value] of Object.entries(expanded)) {\n if (value == null) continue;\n\n const resolved = resolveValue(namespace, property, value, conditionKeys);\n classNames.push(...resolved);\n }\n\n return classNames.join(' ');\n };\n}\n","import type {\n PropertyCollection,\n PropsFunction,\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions,\n} from './types.js';\nimport { insertRules } from 'typestyles';\nimport { generateFromCollections } from './generate.js';\nimport { buildLookupMap, createResolver } from './runtime.js';\n\n/**\n * Combine property collections into a typed props function with pre-generated CSS.\n *\n * @example\n * ```ts\n * const props = createProps('atoms', responsiveProps, colorProps);\n *\n * // Type-safe usage\n * props({\n * display: 'flex',\n * padding: 2,\n * paddingTop: { mobile: 3 },\n * });\n * // Returns: \"atoms-display-flex atoms-padding-2 atoms-paddingTop-mobile-3\"\n * ```\n */\nexport function createProps<\n Collections extends PropertyCollection<\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions<PropertyDefinitions>\n >[],\n>(namespace: string, ...collections: Collections): PropsFunction<Collections> {\n // Generate all CSS rules upfront\n const cssRules = generateFromCollections(namespace, collections);\n\n // Inject CSS\n insertRules(cssRules);\n\n // Build runtime lookup\n const { propertyMap, conditionKeys, shorthands } = buildLookupMap(namespace, collections);\n\n // Create resolver function\n const resolver = createResolver(namespace, propertyMap, conditionKeys, shorthands);\n\n // Create properties set for inspection\n const properties = new Set<string>();\n for (const collection of collections) {\n for (const prop of Object.keys(collection.properties)) {\n properties.add(prop);\n }\n for (const shorthand of Object.keys(collection.shorthands)) {\n properties.add(shorthand);\n }\n }\n\n // Attach properties to the function\n const propsFunction = Object.assign(resolver, { properties });\n\n return propsFunction as PropsFunction<Collections>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/defineProperties.ts","../src/utils.ts","../src/generate.ts","../src/runtime.ts","../src/createProps.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type {\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions,\n DefinePropertiesConfig,\n PropertyCollection,\n} from './types';\n\n/**\n * Define a collection of CSS properties with their allowed values and optional conditions.\n *\n * @example\n * ```ts\n * const responsiveProps = defineProperties({\n * conditions: {\n * mobile: { '@media': '(min-width: 768px)' },\n * desktop: { '@media': '(min-width: 1024px)' },\n * },\n * defaultCondition: false,\n * properties: {\n * display: ['flex', 'block', 'grid', 'none'],\n * paddingTop: { 0: '0', 1: '4px', 2: '8px', 3: '16px' },\n * },\n * shorthands: {\n * padding: ['paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft'],\n * },\n * });\n * ```\n */\nexport function defineProperties<\n P extends PropertyDefinitions,\n C extends ConditionDefinitions = ConditionDefinitions,\n S extends ShorthandDefinitions<P> = Record<string, Array<keyof P>>,\n>(config: DefinePropertiesConfig<P, C, S>): PropertyCollection<P, C, S> {\n const conditions = (config.conditions || {}) as C;\n const shorthands = (config.shorthands || {}) as S;\n const defaultCondition = config.defaultCondition ?? false;\n\n return {\n properties: config.properties,\n conditions,\n defaultCondition,\n shorthands,\n };\n}\n","/**\n * Sanitize a value for use in a class name.\n * Replaces spaces with hyphens and removes special characters.\n */\nexport function sanitizeValue(value: string | number): string {\n return String(value)\n .replace(/\\s+/g, '-')\n .replace(/[^a-zA-Z0-9-_]/g, '');\n}\n\n/**\n * Convert camelCase to kebab-case for CSS property names.\n */\nexport function toKebabCase(str: string): string {\n // Handle vendor prefixes (ms, webkit, moz)\n if (str.startsWith('ms')) {\n return '-' + str.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n }\n return str.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n}\n\n/**\n * Check if a value is a conditional object (has condition keys).\n */\nexport function isConditionalValue(\n value: unknown,\n conditionKeys: Set<string>,\n): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n\n // Check if any key is a known condition\n for (const key in value) {\n if (conditionKeys.has(key)) {\n return true;\n }\n }\n\n return false;\n}\n","import type {\n PropertyDefinitions,\n ConditionDefinitions,\n PropertyCollection,\n ConditionDefinition,\n PropertyValues,\n ShorthandDefinitions,\n} from './types';\nimport { sanitizeValue, toKebabCase } from './utils';\n\n/**\n * Generate a single atomic CSS class.\n */\nfunction generateAtomicClass(\n namespace: string,\n property: string,\n valueKey: string,\n cssValue: string | number,\n condition?: ConditionDefinition & { name: string },\n): { key: string; css: string } {\n const sanitizedValue = sanitizeValue(valueKey);\n const className = condition\n ? `${namespace}-${property}-${condition.name}-${sanitizedValue}`\n : `${namespace}-${property}-${sanitizedValue}`;\n\n const kebabProp = toKebabCase(property);\n const declaration = `${kebabProp}: ${cssValue}`;\n\n if (!condition) {\n return {\n key: `.${className}`,\n css: `.${className} { ${declaration}; }`,\n };\n }\n\n // Handle media queries\n if (condition['@media']) {\n const mediaQuery = `@media ${condition['@media']}`;\n return {\n key: `${mediaQuery}:.${className}`,\n css: `${mediaQuery} { .${className} { ${declaration}; } }`,\n };\n }\n\n // Handle container queries\n if (condition['@container']) {\n const containerQuery = `@container ${condition['@container']}`;\n return {\n key: `${containerQuery}:.${className}`,\n css: `${containerQuery} { .${className} { ${declaration}; } }`,\n };\n }\n\n // Handle @supports\n if (condition['@supports']) {\n const supportsQuery = `@supports ${condition['@supports']}`;\n return {\n key: `${supportsQuery}:.${className}`,\n css: `${supportsQuery} { .${className} { ${declaration}; } }`,\n };\n }\n\n // Handle custom selectors\n if (condition.selector) {\n const wrappedSelector = condition.selector.replace(/&/g, `.${className}`);\n return {\n key: wrappedSelector,\n css: `${wrappedSelector} { ${declaration}; }`,\n };\n }\n\n // Fallback to no condition\n return {\n key: `.${className}`,\n css: `.${className} { ${declaration}; }`,\n };\n}\n\n/**\n * Get CSS value entries from PropertyValues.\n */\nfunction getValueEntries(values: PropertyValues): Array<[string, string | number]> {\n if (Array.isArray(values)) {\n // Array format: ['flex', 'block'] -> [['flex', 'flex'], ['block', 'block']]\n return values.map((v) => [v, v]);\n } else {\n // Object format: { 0: '0', 1: '4px' } -> [['0', '0'], ['1', '4px']]\n return Object.entries(values);\n }\n}\n\n/**\n * Generate all atomic CSS classes for a property collection.\n */\nexport function generateAllAtomicClasses<\n P extends PropertyDefinitions,\n C extends ConditionDefinitions,\n>(\n namespace: string,\n properties: P,\n conditions: C,\n defaultCondition: keyof C | false,\n): Array<{ key: string; css: string }> {\n const rules: Array<{ key: string; css: string }> = [];\n\n for (const [property, values] of Object.entries(properties)) {\n const valueEntries = getValueEntries(values);\n\n for (const [valueKey, cssValue] of valueEntries) {\n // Generate base class (no condition or with default condition)\n if (defaultCondition === false) {\n rules.push(generateAtomicClass(namespace, property, valueKey, cssValue));\n } else {\n const condition = conditions[defaultCondition as string];\n if (condition) {\n rules.push(\n generateAtomicClass(namespace, property, valueKey, cssValue, {\n ...condition,\n name: defaultCondition as string,\n }),\n );\n }\n }\n\n // Generate conditional variants\n for (const [condName, condDef] of Object.entries(conditions)) {\n // Skip if this is the default condition and we already generated it\n if (defaultCondition !== false && condName === defaultCondition) {\n continue;\n }\n\n rules.push(\n generateAtomicClass(namespace, property, valueKey, cssValue, {\n ...condDef,\n name: condName,\n }),\n );\n }\n }\n }\n\n return rules;\n}\n\n/**\n * Generate all atomic CSS classes from multiple property collections.\n */\nexport function generateFromCollections(\n namespace: string,\n collections: PropertyCollection<\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions<PropertyDefinitions>\n >[],\n): Array<{ key: string; css: string }> {\n const allRules: Array<{ key: string; css: string }> = [];\n\n for (const collection of collections) {\n const rules = generateAllAtomicClasses(\n namespace,\n collection.properties,\n collection.conditions,\n collection.defaultCondition,\n );\n allRules.push(...rules);\n }\n\n return allRules;\n}\n","import type {\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions,\n PropertyCollection,\n} from './types';\nimport { sanitizeValue, isConditionalValue } from './utils';\n\n/**\n * Build a lookup map for runtime class name resolution.\n */\nexport function buildLookupMap<\n P extends PropertyDefinitions,\n C extends ConditionDefinitions,\n S extends ShorthandDefinitions<P>,\n>(\n _namespace: string,\n collections: PropertyCollection<P, C, S>[],\n): {\n propertyMap: Map<string, Set<string>>;\n conditionKeys: Set<string>;\n shorthands: Map<string, string[]>;\n} {\n const propertyMap = new Map<string, Set<string>>();\n const conditionKeys = new Set<string>();\n const shorthands = new Map<string, string[]>();\n\n for (const collection of collections) {\n // Collect properties\n for (const property of Object.keys(collection.properties)) {\n if (!propertyMap.has(property)) {\n propertyMap.set(property, new Set());\n }\n }\n\n // Collect conditions\n for (const condition of Object.keys(collection.conditions)) {\n conditionKeys.add(condition);\n }\n\n // Collect shorthands\n for (const [shorthand, props] of Object.entries(collection.shorthands)) {\n shorthands.set(shorthand, props as string[]);\n }\n }\n\n return { propertyMap, conditionKeys, shorthands };\n}\n\n/**\n * Expand shorthands in props object.\n */\nexport function expandShorthands(\n props: Record<string, unknown>,\n shorthands: Map<string, string[]>,\n): Record<string, unknown> {\n const expanded: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (shorthands.has(key)) {\n // Expand shorthand\n const properties = shorthands.get(key)!;\n for (const prop of properties) {\n expanded[prop] = value;\n }\n } else {\n // Regular property\n expanded[key] = value;\n }\n }\n\n return expanded;\n}\n\n/**\n * Resolve a single property value to class names.\n */\nfunction resolveValue(\n namespace: string,\n property: string,\n value: unknown,\n conditionKeys: Set<string>,\n): string[] {\n const classNames: string[] = [];\n\n if (isConditionalValue(value, conditionKeys)) {\n // Conditional value: { mobile: 'flex', desktop: 'block' }\n for (const [condition, condValue] of Object.entries(value)) {\n if (conditionKeys.has(condition)) {\n const sanitized = sanitizeValue(String(condValue));\n classNames.push(`${namespace}-${property}-${condition}-${sanitized}`);\n }\n }\n } else {\n // Direct value: 'flex' or 2\n const sanitized = sanitizeValue(String(value));\n classNames.push(`${namespace}-${property}-${sanitized}`);\n }\n\n return classNames;\n}\n\n/**\n * Create a runtime resolver function.\n */\nexport function createResolver(\n namespace: string,\n _propertyMap: Map<string, Set<string>>,\n conditionKeys: Set<string>,\n shorthands: Map<string, string[]>,\n): (props: Record<string, unknown>) => string {\n return (props: Record<string, unknown>): string => {\n // Expand shorthands\n const expanded = expandShorthands(props, shorthands);\n\n const classNames: string[] = [];\n\n for (const [property, value] of Object.entries(expanded)) {\n if (value == null) continue;\n\n const resolved = resolveValue(namespace, property, value, conditionKeys);\n classNames.push(...resolved);\n }\n\n return classNames.join(' ');\n };\n}\n","import type {\n PropertyCollection,\n PropsFunction,\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions,\n} from './types';\nimport { insertRules } from 'typestyles';\nimport { generateFromCollections } from './generate';\nimport { buildLookupMap, createResolver } from './runtime';\n\n/**\n * Combine property collections into a typed props function with pre-generated CSS.\n *\n * @example\n * ```ts\n * const props = createProps('atoms', responsiveProps, colorProps);\n *\n * // Type-safe usage\n * props({\n * display: 'flex',\n * padding: 2,\n * paddingTop: { mobile: 3 },\n * });\n * // Returns: \"atoms-display-flex atoms-padding-2 atoms-paddingTop-mobile-3\"\n * ```\n */\nexport function createProps<\n Collections extends PropertyCollection<\n PropertyDefinitions,\n ConditionDefinitions,\n ShorthandDefinitions<PropertyDefinitions>\n >[],\n>(namespace: string, ...collections: Collections): PropsFunction<Collections> {\n // Generate all CSS rules upfront\n const cssRules = generateFromCollections(namespace, collections);\n\n // Inject CSS\n insertRules(cssRules);\n\n // Build runtime lookup\n const { propertyMap, conditionKeys, shorthands } = buildLookupMap(namespace, collections);\n\n // Create resolver function\n const resolver = createResolver(namespace, propertyMap, conditionKeys, shorthands);\n\n // Create properties set for inspection\n const properties = new Set<string>();\n for (const collection of collections) {\n for (const prop of Object.keys(collection.properties)) {\n properties.add(prop);\n }\n for (const shorthand of Object.keys(collection.shorthands)) {\n properties.add(shorthand);\n }\n }\n\n // Attach properties to the function\n const propsFunction = Object.assign(resolver, { properties });\n\n return propsFunction as PropsFunction<Collections>;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typestyles/props",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Type-safe atomic CSS utility generator for typestyles",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -22,9 +22,10 @@
|
|
|
22
22
|
"dist"
|
|
23
23
|
],
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"typestyles": "0.
|
|
25
|
+
"typestyles": "0.5.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
+
"eslint": "^9.39.2",
|
|
28
29
|
"tsup": "^8.0.0",
|
|
29
30
|
"typescript": "^5.9.3",
|
|
30
31
|
"vitest": "^3.0.0"
|
|
@@ -38,6 +39,7 @@
|
|
|
38
39
|
"scripts": {
|
|
39
40
|
"build": "tsup",
|
|
40
41
|
"test": "vitest run",
|
|
42
|
+
"lint": "eslint .",
|
|
41
43
|
"typecheck": "tsc --noEmit"
|
|
42
44
|
}
|
|
43
45
|
}
|