UNPKG

@wix/css-property-parser

Version:

A comprehensive TypeScript library for parsing and serializing CSS property values with full MDN specification compliance

63 lines (62 loc) 2.31 kB
// CSS visibility property evaluator // Handles CSS visibility property values according to MDN specification // https://developer.mozilla.org/en-US/docs/Web/CSS/visibility import { isCssVariable, isGlobalKeyword, getValidKeyword, isKeywordInArray } from '../utils/shared-utils.js'; import { parse as parseCSSVariable, toCSSValue as cssVariableToCSSValue } from './css-variable.js'; import { VISIBILITY_KEYWORDS } from '../types.js'; /** * Parses a CSS visibility property value according to MDN specification * * Supports: * - visible: Element is visible (default) * - hidden: Element is invisible but still takes up space in layout * - collapse: Element is removed from layout (mainly for table elements) * - Global keywords: inherit, initial, unset, revert, revert-layer * - CSS variables: var(--custom-visibility) * * @param value - The CSS value to parse * @returns Parsed VisibilityValue or null if invalid */ export function parse(value) { if (!value || typeof value !== 'string') return null; const trimmed = value.trim(); if (trimmed === '') return null; // CSS variables - parse and return directly if (isCssVariable(trimmed)) { return parseCSSVariable(trimmed); } // Global keywords if (isGlobalKeyword(trimmed)) { return { type: 'keyword', keyword: trimmed.toLowerCase() }; } // Visibility-specific keywords const visibilityKeyword = getValidKeyword(trimmed, VISIBILITY_KEYWORDS); if (visibilityKeyword) { return { type: 'keyword', keyword: visibilityKeyword }; } return null; } /** * Converts a parsed VisibilityValue back to CSS string representation * * @param parsed - The parsed visibility value * @returns CSS string or null if invalid */ export function toCSSValue(parsed) { if (!parsed) return null; if (parsed.type === 'variable') { return cssVariableToCSSValue(parsed); } if (parsed.type === 'keyword') { // Runtime validation: ensure keyword is actually valid for visibility if (isGlobalKeyword(parsed.keyword) || isKeywordInArray(parsed.keyword, VISIBILITY_KEYWORDS)) { return parsed.keyword; } // Invalid keyword - return null instead of invalid CSS return null; } return null; }