Add support for copying files and folders.
This commit is contained in:
646
vendor/github.com/evanw/esbuild/internal/css_ast/css_ast.go
generated
vendored
Normal file
646
vendor/github.com/evanw/esbuild/internal/css_ast/css_ast.go
generated
vendored
Normal file
@ -0,0 +1,646 @@
|
||||
package css_ast
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
|
||||
"github.com/evanw/esbuild/internal/ast"
|
||||
"github.com/evanw/esbuild/internal/css_lexer"
|
||||
"github.com/evanw/esbuild/internal/helpers"
|
||||
"github.com/evanw/esbuild/internal/logger"
|
||||
)
|
||||
|
||||
// CSS syntax comes in two layers: a minimal syntax that generally accepts
|
||||
// anything that looks vaguely like CSS, and a large set of built-in rules
|
||||
// (the things browsers actually interpret). That way CSS parsers can read
|
||||
// unknown rules and skip over them without having to stop due to errors.
|
||||
//
|
||||
// This AST format is mostly just the minimal syntax. It parses unknown rules
|
||||
// into a tree with enough information that it can write them back out again.
|
||||
// There are some additional layers of syntax including selectors and @-rules
|
||||
// which allow for better pretty-printing and minification.
|
||||
//
|
||||
// Most of the AST just references ranges of the original file by keeping the
|
||||
// original "Token" values around from the lexer. This is a memory-efficient
|
||||
// representation that helps provide good parsing and printing performance.
|
||||
|
||||
type AST struct {
|
||||
ImportRecords []ast.ImportRecord
|
||||
Rules []Rule
|
||||
SourceMapComment logger.Span
|
||||
ApproximateLineCount int32
|
||||
}
|
||||
|
||||
// We create a lot of tokens, so make sure this layout is memory-efficient.
|
||||
// The layout here isn't optimal because it biases for convenience (e.g.
|
||||
// "string" could be shorter) but at least the ordering of fields was
|
||||
// deliberately chosen to minimize size.
|
||||
type Token struct {
|
||||
// This is the raw contents of the token most of the time. However, it
|
||||
// contains the decoded string contents for "TString" tokens.
|
||||
Text string // 16 bytes
|
||||
|
||||
// Contains the child tokens for component values that are simple blocks.
|
||||
// These are either "(", "{", "[", or function tokens. The closing token is
|
||||
// implicit and is not stored.
|
||||
Children *[]Token // 8 bytes
|
||||
|
||||
// URL tokens have an associated import record at the top-level of the AST.
|
||||
// This index points to that import record.
|
||||
ImportRecordIndex uint32 // 4 bytes
|
||||
|
||||
// The division between the number and the unit for "TDimension" tokens.
|
||||
UnitOffset uint16 // 2 bytes
|
||||
|
||||
// This will never be "TWhitespace" because whitespace isn't stored as a
|
||||
// token directly. Instead it is stored in "HasWhitespaceAfter" on the
|
||||
// previous token. This is to make it easier to pattern-match against
|
||||
// tokens when handling CSS rules, since whitespace almost always doesn't
|
||||
// matter. That way you can pattern match against e.g. "rgb(r, g, b)" and
|
||||
// not have to handle all possible combinations of embedded whitespace
|
||||
// tokens.
|
||||
//
|
||||
// There is one exception to this: when in verbatim whitespace mode and
|
||||
// the token list is non-empty and is only whitespace tokens. In that case
|
||||
// a single whitespace token is emitted. This is because otherwise there
|
||||
// would be no tokens to attach the whitespace before/after flags to.
|
||||
Kind css_lexer.T // 1 byte
|
||||
|
||||
// These flags indicate the presence of a "TWhitespace" token before or after
|
||||
// this token. There should be whitespace printed between two tokens if either
|
||||
// token indicates that there should be whitespace. Note that whitespace may
|
||||
// be altered by processing in certain situations (e.g. minification).
|
||||
Whitespace WhitespaceFlags // 1 byte
|
||||
}
|
||||
|
||||
type WhitespaceFlags uint8
|
||||
|
||||
const (
|
||||
WhitespaceBefore WhitespaceFlags = 1 << iota
|
||||
WhitespaceAfter
|
||||
)
|
||||
|
||||
func (a Token) Equal(b Token) bool {
|
||||
if a.Kind == b.Kind && a.Text == b.Text && a.ImportRecordIndex == b.ImportRecordIndex && a.Whitespace == b.Whitespace {
|
||||
if a.Children == nil && b.Children == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
if a.Children != nil && b.Children != nil && TokensEqual(*a.Children, *b.Children) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func TokensEqual(a []Token, b []Token) bool {
|
||||
if len(a) != len(b) {
|
||||
return false
|
||||
}
|
||||
for i, c := range a {
|
||||
if !c.Equal(b[i]) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func HashTokens(hash uint32, tokens []Token) uint32 {
|
||||
hash = helpers.HashCombine(hash, uint32(len(tokens)))
|
||||
|
||||
for _, t := range tokens {
|
||||
hash = helpers.HashCombine(hash, uint32(t.Kind))
|
||||
hash = helpers.HashCombineString(hash, t.Text)
|
||||
if t.Children != nil {
|
||||
hash = HashTokens(hash, *t.Children)
|
||||
}
|
||||
}
|
||||
|
||||
return hash
|
||||
}
|
||||
|
||||
func (a Token) EqualIgnoringWhitespace(b Token) bool {
|
||||
if a.Kind == b.Kind && a.Text == b.Text && a.ImportRecordIndex == b.ImportRecordIndex {
|
||||
if a.Children == nil && b.Children == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
if a.Children != nil && b.Children != nil && TokensEqualIgnoringWhitespace(*a.Children, *b.Children) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func TokensEqualIgnoringWhitespace(a []Token, b []Token) bool {
|
||||
if len(a) != len(b) {
|
||||
return false
|
||||
}
|
||||
for i, c := range a {
|
||||
if !c.EqualIgnoringWhitespace(b[i]) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func TokensAreCommaSeparated(tokens []Token) bool {
|
||||
if n := len(tokens); (n & 1) != 0 {
|
||||
for i := 1; i < n; i += 2 {
|
||||
if tokens[i].Kind != css_lexer.TComma {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (t Token) FractionForPercentage() (float64, bool) {
|
||||
if t.Kind == css_lexer.TPercentage {
|
||||
if f, err := strconv.ParseFloat(t.PercentageValue(), 64); err == nil {
|
||||
if f < 0 {
|
||||
return 0, true
|
||||
}
|
||||
if f > 100 {
|
||||
return 1, true
|
||||
}
|
||||
return f / 100.0, true
|
||||
}
|
||||
}
|
||||
return 0, false
|
||||
}
|
||||
|
||||
// https://drafts.csswg.org/css-values-3/#lengths
|
||||
// For zero lengths the unit identifier is optional
|
||||
// (i.e. can be syntactically represented as the <number> 0).
|
||||
func (t *Token) TurnLengthIntoNumberIfZero() bool {
|
||||
if t.Kind == css_lexer.TDimension && t.DimensionValue() == "0" {
|
||||
t.Kind = css_lexer.TNumber
|
||||
t.Text = "0"
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *Token) TurnLengthOrPercentageIntoNumberIfZero() bool {
|
||||
if t.Kind == css_lexer.TPercentage && t.PercentageValue() == "0" {
|
||||
t.Kind = css_lexer.TNumber
|
||||
t.Text = "0"
|
||||
return true
|
||||
}
|
||||
return t.TurnLengthIntoNumberIfZero()
|
||||
}
|
||||
|
||||
func (t Token) PercentageValue() string {
|
||||
return t.Text[:len(t.Text)-1]
|
||||
}
|
||||
|
||||
func (t Token) DimensionValue() string {
|
||||
return t.Text[:t.UnitOffset]
|
||||
}
|
||||
|
||||
func (t Token) DimensionUnit() string {
|
||||
return t.Text[t.UnitOffset:]
|
||||
}
|
||||
|
||||
func (t Token) DimensionUnitIsSafeLength() bool {
|
||||
switch t.DimensionUnit() {
|
||||
// These units can be reasonably expected to be supported everywhere.
|
||||
// Information used: https://developer.mozilla.org/en-US/docs/Web/CSS/length
|
||||
case "cm", "em", "in", "mm", "pc", "pt", "px":
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (t Token) IsZero() bool {
|
||||
return t.Kind == css_lexer.TNumber && t.Text == "0"
|
||||
}
|
||||
|
||||
func (t Token) IsOne() bool {
|
||||
return t.Kind == css_lexer.TNumber && t.Text == "1"
|
||||
}
|
||||
|
||||
func (t Token) IsAngle() bool {
|
||||
if t.Kind == css_lexer.TDimension {
|
||||
unit := t.DimensionUnit()
|
||||
return unit == "deg" || unit == "grad" || unit == "rad" || unit == "turn"
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func CloneTokensWithImportRecords(
|
||||
tokensIn []Token, importRecordsIn []ast.ImportRecord,
|
||||
tokensOut []Token, importRecordsOut []ast.ImportRecord,
|
||||
) ([]Token, []ast.ImportRecord) {
|
||||
for _, t := range tokensIn {
|
||||
// If this is a URL token, also clone the import record
|
||||
if t.Kind == css_lexer.TURL {
|
||||
importRecordIndex := uint32(len(importRecordsOut))
|
||||
importRecordsOut = append(importRecordsOut, importRecordsIn[t.ImportRecordIndex])
|
||||
t.ImportRecordIndex = importRecordIndex
|
||||
}
|
||||
|
||||
// Also search for URL tokens in this token's children
|
||||
if t.Children != nil {
|
||||
var children []Token
|
||||
children, importRecordsOut = CloneTokensWithImportRecords(*t.Children, importRecordsIn, children, importRecordsOut)
|
||||
t.Children = &children
|
||||
}
|
||||
|
||||
tokensOut = append(tokensOut, t)
|
||||
}
|
||||
|
||||
return tokensOut, importRecordsOut
|
||||
}
|
||||
|
||||
type Rule struct {
|
||||
Loc logger.Loc
|
||||
Data R
|
||||
}
|
||||
|
||||
type R interface {
|
||||
Equal(rule R) bool
|
||||
Hash() (uint32, bool)
|
||||
}
|
||||
|
||||
func RulesEqual(a []Rule, b []Rule) bool {
|
||||
if len(a) != len(b) {
|
||||
return false
|
||||
}
|
||||
for i, c := range a {
|
||||
if !c.Data.Equal(b[i].Data) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func HashRules(hash uint32, rules []Rule) uint32 {
|
||||
hash = helpers.HashCombine(hash, uint32(len(rules)))
|
||||
for _, child := range rules {
|
||||
if childHash, ok := child.Data.Hash(); ok {
|
||||
hash = helpers.HashCombine(hash, childHash)
|
||||
} else {
|
||||
hash = helpers.HashCombine(hash, 0)
|
||||
}
|
||||
}
|
||||
return hash
|
||||
}
|
||||
|
||||
type RAtCharset struct {
|
||||
Encoding string
|
||||
}
|
||||
|
||||
func (a *RAtCharset) Equal(rule R) bool {
|
||||
b, ok := rule.(*RAtCharset)
|
||||
return ok && a.Encoding == b.Encoding
|
||||
}
|
||||
|
||||
func (r *RAtCharset) Hash() (uint32, bool) {
|
||||
hash := uint32(1)
|
||||
hash = helpers.HashCombineString(hash, r.Encoding)
|
||||
return hash, true
|
||||
}
|
||||
|
||||
type RAtImport struct {
|
||||
ImportRecordIndex uint32
|
||||
ImportConditions []Token
|
||||
}
|
||||
|
||||
func (*RAtImport) Equal(rule R) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (r *RAtImport) Hash() (uint32, bool) {
|
||||
return 0, false
|
||||
}
|
||||
|
||||
type RAtKeyframes struct {
|
||||
AtToken string
|
||||
Name string
|
||||
Blocks []KeyframeBlock
|
||||
}
|
||||
|
||||
type KeyframeBlock struct {
|
||||
Selectors []string
|
||||
Rules []Rule
|
||||
}
|
||||
|
||||
func (a *RAtKeyframes) Equal(rule R) bool {
|
||||
b, ok := rule.(*RAtKeyframes)
|
||||
if ok && a.AtToken == b.AtToken && a.Name == b.Name && len(a.Blocks) == len(b.Blocks) {
|
||||
for i, ai := range a.Blocks {
|
||||
bi := b.Blocks[i]
|
||||
if len(ai.Selectors) != len(bi.Selectors) {
|
||||
return false
|
||||
}
|
||||
for j, aj := range ai.Selectors {
|
||||
if aj != bi.Selectors[j] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
if !RulesEqual(ai.Rules, bi.Rules) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (r *RAtKeyframes) Hash() (uint32, bool) {
|
||||
hash := uint32(2)
|
||||
hash = helpers.HashCombineString(hash, r.AtToken)
|
||||
hash = helpers.HashCombineString(hash, r.Name)
|
||||
hash = helpers.HashCombine(hash, uint32(len(r.Blocks)))
|
||||
for _, block := range r.Blocks {
|
||||
hash = helpers.HashCombine(hash, uint32(len(block.Selectors)))
|
||||
for _, sel := range block.Selectors {
|
||||
hash = helpers.HashCombineString(hash, sel)
|
||||
}
|
||||
hash = HashRules(hash, block.Rules)
|
||||
}
|
||||
return hash, true
|
||||
}
|
||||
|
||||
type RKnownAt struct {
|
||||
AtToken string
|
||||
Prelude []Token
|
||||
Rules []Rule
|
||||
}
|
||||
|
||||
func (a *RKnownAt) Equal(rule R) bool {
|
||||
b, ok := rule.(*RKnownAt)
|
||||
return ok && a.AtToken == b.AtToken && TokensEqual(a.Prelude, b.Prelude) && RulesEqual(a.Rules, a.Rules)
|
||||
}
|
||||
|
||||
func (r *RKnownAt) Hash() (uint32, bool) {
|
||||
hash := uint32(3)
|
||||
hash = helpers.HashCombineString(hash, r.AtToken)
|
||||
hash = HashTokens(hash, r.Prelude)
|
||||
hash = HashRules(hash, r.Rules)
|
||||
return hash, true
|
||||
}
|
||||
|
||||
type RUnknownAt struct {
|
||||
AtToken string
|
||||
Prelude []Token
|
||||
Block []Token
|
||||
}
|
||||
|
||||
func (a *RUnknownAt) Equal(rule R) bool {
|
||||
b, ok := rule.(*RUnknownAt)
|
||||
return ok && a.AtToken == b.AtToken && TokensEqual(a.Prelude, b.Prelude) && TokensEqual(a.Block, a.Block)
|
||||
}
|
||||
|
||||
func (r *RUnknownAt) Hash() (uint32, bool) {
|
||||
hash := uint32(4)
|
||||
hash = helpers.HashCombineString(hash, r.AtToken)
|
||||
hash = HashTokens(hash, r.Prelude)
|
||||
hash = HashTokens(hash, r.Block)
|
||||
return hash, true
|
||||
}
|
||||
|
||||
type RSelector struct {
|
||||
Selectors []ComplexSelector
|
||||
Rules []Rule
|
||||
}
|
||||
|
||||
func (a *RSelector) Equal(rule R) bool {
|
||||
b, ok := rule.(*RSelector)
|
||||
if ok && len(a.Selectors) == len(b.Selectors) {
|
||||
for i, sel := range a.Selectors {
|
||||
if !sel.Equal(b.Selectors[i]) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return RulesEqual(a.Rules, b.Rules)
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func (r *RSelector) Hash() (uint32, bool) {
|
||||
hash := uint32(5)
|
||||
hash = helpers.HashCombine(hash, uint32(len(r.Selectors)))
|
||||
for _, complex := range r.Selectors {
|
||||
hash = helpers.HashCombine(hash, uint32(len(complex.Selectors)))
|
||||
for _, sel := range complex.Selectors {
|
||||
if sel.TypeSelector != nil {
|
||||
hash = helpers.HashCombineString(hash, sel.TypeSelector.Name.Text)
|
||||
} else {
|
||||
hash = helpers.HashCombine(hash, 0)
|
||||
}
|
||||
hash = helpers.HashCombine(hash, uint32(len(sel.SubclassSelectors)))
|
||||
for _, sub := range sel.SubclassSelectors {
|
||||
hash = helpers.HashCombine(hash, sub.Hash())
|
||||
}
|
||||
hash = helpers.HashCombineString(hash, sel.Combinator)
|
||||
}
|
||||
}
|
||||
hash = HashRules(hash, r.Rules)
|
||||
return hash, true
|
||||
}
|
||||
|
||||
type RQualified struct {
|
||||
Prelude []Token
|
||||
Rules []Rule
|
||||
}
|
||||
|
||||
func (a *RQualified) Equal(rule R) bool {
|
||||
b, ok := rule.(*RQualified)
|
||||
return ok && TokensEqual(a.Prelude, b.Prelude) && RulesEqual(a.Rules, b.Rules)
|
||||
}
|
||||
|
||||
func (r *RQualified) Hash() (uint32, bool) {
|
||||
hash := uint32(6)
|
||||
hash = HashTokens(hash, r.Prelude)
|
||||
hash = HashRules(hash, r.Rules)
|
||||
return hash, true
|
||||
}
|
||||
|
||||
type RDeclaration struct {
|
||||
KeyText string
|
||||
Value []Token
|
||||
KeyRange logger.Range
|
||||
Key D // Compare using this instead of "Key" for speed
|
||||
Important bool
|
||||
}
|
||||
|
||||
func (a *RDeclaration) Equal(rule R) bool {
|
||||
b, ok := rule.(*RDeclaration)
|
||||
return ok && a.KeyText == b.KeyText && TokensEqual(a.Value, b.Value) && a.Important == b.Important
|
||||
}
|
||||
|
||||
func (r *RDeclaration) Hash() (uint32, bool) {
|
||||
hash := uint32(7)
|
||||
hash = helpers.HashCombine(hash, uint32(r.Key))
|
||||
hash = HashTokens(hash, r.Value)
|
||||
return hash, true
|
||||
}
|
||||
|
||||
type RBadDeclaration struct {
|
||||
Tokens []Token
|
||||
}
|
||||
|
||||
func (a *RBadDeclaration) Equal(rule R) bool {
|
||||
b, ok := rule.(*RBadDeclaration)
|
||||
return ok && TokensEqual(a.Tokens, b.Tokens)
|
||||
}
|
||||
|
||||
func (r *RBadDeclaration) Hash() (uint32, bool) {
|
||||
hash := uint32(8)
|
||||
hash = HashTokens(hash, r.Tokens)
|
||||
return hash, true
|
||||
}
|
||||
|
||||
type RComment struct {
|
||||
Text string
|
||||
}
|
||||
|
||||
func (a *RComment) Equal(rule R) bool {
|
||||
b, ok := rule.(*RComment)
|
||||
return ok && a.Text == b.Text
|
||||
}
|
||||
|
||||
func (r *RComment) Hash() (uint32, bool) {
|
||||
hash := uint32(9)
|
||||
hash = helpers.HashCombineString(hash, r.Text)
|
||||
return hash, true
|
||||
}
|
||||
|
||||
type ComplexSelector struct {
|
||||
Selectors []CompoundSelector
|
||||
}
|
||||
|
||||
func (a ComplexSelector) Equal(b ComplexSelector) bool {
|
||||
if len(a.Selectors) != len(b.Selectors) {
|
||||
return false
|
||||
}
|
||||
|
||||
for i, ai := range a.Selectors {
|
||||
bi := b.Selectors[i]
|
||||
if ai.HasNestPrefix != bi.HasNestPrefix || ai.Combinator != bi.Combinator {
|
||||
return false
|
||||
}
|
||||
|
||||
if ats, bts := ai.TypeSelector, bi.TypeSelector; (ats == nil) != (bts == nil) {
|
||||
return false
|
||||
} else if ats != nil && bts != nil && !ats.Equal(*bts) {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(ai.SubclassSelectors) != len(bi.SubclassSelectors) {
|
||||
return false
|
||||
}
|
||||
for j, aj := range ai.SubclassSelectors {
|
||||
if !aj.Equal(bi.SubclassSelectors[j]) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
type CompoundSelector struct {
|
||||
HasNestPrefix bool // "&"
|
||||
Combinator string // Optional, may be ""
|
||||
TypeSelector *NamespacedName
|
||||
SubclassSelectors []SS
|
||||
}
|
||||
|
||||
type NameToken struct {
|
||||
Kind css_lexer.T
|
||||
Text string
|
||||
}
|
||||
|
||||
type NamespacedName struct {
|
||||
// If present, this is an identifier or "*" and is followed by a "|" character
|
||||
NamespacePrefix *NameToken
|
||||
|
||||
// This is an identifier or "*"
|
||||
Name NameToken
|
||||
}
|
||||
|
||||
func (a NamespacedName) Equal(b NamespacedName) bool {
|
||||
return a.Name == b.Name && (a.NamespacePrefix == nil) == (b.NamespacePrefix == nil) &&
|
||||
(a.NamespacePrefix == nil || b.NamespacePrefix == nil || *a.NamespacePrefix == *b.NamespacePrefix)
|
||||
}
|
||||
|
||||
type SS interface {
|
||||
Equal(ss SS) bool
|
||||
Hash() uint32
|
||||
}
|
||||
|
||||
type SSHash struct {
|
||||
Name string
|
||||
}
|
||||
|
||||
func (a *SSHash) Equal(ss SS) bool {
|
||||
b, ok := ss.(*SSHash)
|
||||
return ok && a.Name == b.Name
|
||||
}
|
||||
|
||||
func (ss *SSHash) Hash() uint32 {
|
||||
hash := uint32(1)
|
||||
hash = helpers.HashCombineString(hash, ss.Name)
|
||||
return hash
|
||||
}
|
||||
|
||||
type SSClass struct {
|
||||
Name string
|
||||
}
|
||||
|
||||
func (a *SSClass) Equal(ss SS) bool {
|
||||
b, ok := ss.(*SSClass)
|
||||
return ok && a.Name == b.Name
|
||||
}
|
||||
|
||||
func (ss *SSClass) Hash() uint32 {
|
||||
hash := uint32(2)
|
||||
hash = helpers.HashCombineString(hash, ss.Name)
|
||||
return hash
|
||||
}
|
||||
|
||||
type SSAttribute struct {
|
||||
NamespacedName NamespacedName
|
||||
MatcherOp string // Either "" or one of: "=" "~=" "|=" "^=" "$=" "*="
|
||||
MatcherValue string
|
||||
MatcherModifier byte // Either 0 or one of: 'i' 'I' 's' 'S'
|
||||
}
|
||||
|
||||
func (a *SSAttribute) Equal(ss SS) bool {
|
||||
b, ok := ss.(*SSAttribute)
|
||||
return ok && a.NamespacedName.Equal(b.NamespacedName) && a.MatcherOp == b.MatcherOp &&
|
||||
a.MatcherValue == b.MatcherValue && a.MatcherModifier == b.MatcherModifier
|
||||
}
|
||||
|
||||
func (ss *SSAttribute) Hash() uint32 {
|
||||
hash := uint32(3)
|
||||
hash = helpers.HashCombineString(hash, ss.NamespacedName.Name.Text)
|
||||
hash = helpers.HashCombineString(hash, ss.MatcherOp)
|
||||
hash = helpers.HashCombineString(hash, ss.MatcherValue)
|
||||
return hash
|
||||
}
|
||||
|
||||
type SSPseudoClass struct {
|
||||
Name string
|
||||
Args []Token
|
||||
IsElement bool // If true, this is prefixed by "::" instead of ":"
|
||||
}
|
||||
|
||||
func (a *SSPseudoClass) Equal(ss SS) bool {
|
||||
b, ok := ss.(*SSPseudoClass)
|
||||
return ok && a.Name == b.Name && TokensEqual(a.Args, b.Args) && a.IsElement == b.IsElement
|
||||
}
|
||||
|
||||
func (ss *SSPseudoClass) Hash() uint32 {
|
||||
hash := uint32(4)
|
||||
hash = helpers.HashCombineString(hash, ss.Name)
|
||||
hash = HashTokens(hash, ss.Args)
|
||||
return hash
|
||||
}
|
642
vendor/github.com/evanw/esbuild/internal/css_ast/css_decl_table.go
generated
vendored
Normal file
642
vendor/github.com/evanw/esbuild/internal/css_ast/css_decl_table.go
generated
vendored
Normal file
@ -0,0 +1,642 @@
|
||||
package css_ast
|
||||
|
||||
type D uint16
|
||||
|
||||
const (
|
||||
DUnknown D = iota
|
||||
DAlignContent
|
||||
DAlignItems
|
||||
DAlignSelf
|
||||
DAlignmentBaseline
|
||||
DAll
|
||||
DAnimation
|
||||
DAnimationDelay
|
||||
DAnimationDirection
|
||||
DAnimationDuration
|
||||
DAnimationFillMode
|
||||
DAnimationIterationCount
|
||||
DAnimationName
|
||||
DAnimationPlayState
|
||||
DAnimationTimingFunction
|
||||
DBackfaceVisibility
|
||||
DBackground
|
||||
DBackgroundAttachment
|
||||
DBackgroundClip
|
||||
DBackgroundColor
|
||||
DBackgroundImage
|
||||
DBackgroundOrigin
|
||||
DBackgroundPosition
|
||||
DBackgroundPositionX
|
||||
DBackgroundPositionY
|
||||
DBackgroundRepeat
|
||||
DBackgroundSize
|
||||
DBaselineShift
|
||||
DBlockSize
|
||||
DBorder
|
||||
DBorderBlockEnd
|
||||
DBorderBlockEndColor
|
||||
DBorderBlockEndStyle
|
||||
DBorderBlockEndWidth
|
||||
DBorderBlockStart
|
||||
DBorderBlockStartColor
|
||||
DBorderBlockStartStyle
|
||||
DBorderBlockStartWidth
|
||||
DBorderBottom
|
||||
DBorderBottomColor
|
||||
DBorderBottomLeftRadius
|
||||
DBorderBottomRightRadius
|
||||
DBorderBottomStyle
|
||||
DBorderBottomWidth
|
||||
DBorderCollapse
|
||||
DBorderColor
|
||||
DBorderImage
|
||||
DBorderImageOutset
|
||||
DBorderImageRepeat
|
||||
DBorderImageSlice
|
||||
DBorderImageSource
|
||||
DBorderImageWidth
|
||||
DBorderInlineEnd
|
||||
DBorderInlineEndColor
|
||||
DBorderInlineEndStyle
|
||||
DBorderInlineEndWidth
|
||||
DBorderInlineStart
|
||||
DBorderInlineStartColor
|
||||
DBorderInlineStartStyle
|
||||
DBorderInlineStartWidth
|
||||
DBorderLeft
|
||||
DBorderLeftColor
|
||||
DBorderLeftStyle
|
||||
DBorderLeftWidth
|
||||
DBorderRadius
|
||||
DBorderRight
|
||||
DBorderRightColor
|
||||
DBorderRightStyle
|
||||
DBorderRightWidth
|
||||
DBorderSpacing
|
||||
DBorderStyle
|
||||
DBorderTop
|
||||
DBorderTopColor
|
||||
DBorderTopLeftRadius
|
||||
DBorderTopRightRadius
|
||||
DBorderTopStyle
|
||||
DBorderTopWidth
|
||||
DBorderWidth
|
||||
DBottom
|
||||
DBoxShadow
|
||||
DBoxSizing
|
||||
DBreakAfter
|
||||
DBreakBefore
|
||||
DBreakInside
|
||||
DCaptionSide
|
||||
DCaretColor
|
||||
DClear
|
||||
DClip
|
||||
DClipPath
|
||||
DClipRule
|
||||
DColor
|
||||
DColorInterpolation
|
||||
DColorInterpolationFilters
|
||||
DColumnCount
|
||||
DColumnFill
|
||||
DColumnGap
|
||||
DColumnRule
|
||||
DColumnRuleColor
|
||||
DColumnRuleStyle
|
||||
DColumnRuleWidth
|
||||
DColumnSpan
|
||||
DColumnWidth
|
||||
DColumns
|
||||
DContent
|
||||
DCounterIncrement
|
||||
DCounterReset
|
||||
DCssFloat
|
||||
DCssText
|
||||
DCursor
|
||||
DDirection
|
||||
DDisplay
|
||||
DDominantBaseline
|
||||
DEmptyCells
|
||||
DFill
|
||||
DFillOpacity
|
||||
DFillRule
|
||||
DFilter
|
||||
DFlex
|
||||
DFlexBasis
|
||||
DFlexDirection
|
||||
DFlexFlow
|
||||
DFlexGrow
|
||||
DFlexShrink
|
||||
DFlexWrap
|
||||
DFloat
|
||||
DFloodColor
|
||||
DFloodOpacity
|
||||
DFont
|
||||
DFontFamily
|
||||
DFontFeatureSettings
|
||||
DFontKerning
|
||||
DFontSize
|
||||
DFontSizeAdjust
|
||||
DFontStretch
|
||||
DFontStyle
|
||||
DFontSynthesis
|
||||
DFontVariant
|
||||
DFontVariantCaps
|
||||
DFontVariantEastAsian
|
||||
DFontVariantLigatures
|
||||
DFontVariantNumeric
|
||||
DFontVariantPosition
|
||||
DFontWeight
|
||||
DGap
|
||||
DGlyphOrientationVertical
|
||||
DGrid
|
||||
DGridArea
|
||||
DGridAutoColumns
|
||||
DGridAutoFlow
|
||||
DGridAutoRows
|
||||
DGridColumn
|
||||
DGridColumnEnd
|
||||
DGridColumnGap
|
||||
DGridColumnStart
|
||||
DGridGap
|
||||
DGridRow
|
||||
DGridRowEnd
|
||||
DGridRowGap
|
||||
DGridRowStart
|
||||
DGridTemplate
|
||||
DGridTemplateAreas
|
||||
DGridTemplateColumns
|
||||
DGridTemplateRows
|
||||
DHeight
|
||||
DHyphens
|
||||
DImageOrientation
|
||||
DImageRendering
|
||||
DInlineSize
|
||||
DInset
|
||||
DJustifyContent
|
||||
DJustifyItems
|
||||
DJustifySelf
|
||||
DLeft
|
||||
DLetterSpacing
|
||||
DLightingColor
|
||||
DLineBreak
|
||||
DLineHeight
|
||||
DListStyle
|
||||
DListStyleImage
|
||||
DListStylePosition
|
||||
DListStyleType
|
||||
DMargin
|
||||
DMarginBlockEnd
|
||||
DMarginBlockStart
|
||||
DMarginBottom
|
||||
DMarginInlineEnd
|
||||
DMarginInlineStart
|
||||
DMarginLeft
|
||||
DMarginRight
|
||||
DMarginTop
|
||||
DMarker
|
||||
DMarkerEnd
|
||||
DMarkerMid
|
||||
DMarkerStart
|
||||
DMask
|
||||
DMaskComposite
|
||||
DMaskImage
|
||||
DMaskPosition
|
||||
DMaskRepeat
|
||||
DMaskSize
|
||||
DMaskType
|
||||
DMaxBlockSize
|
||||
DMaxHeight
|
||||
DMaxInlineSize
|
||||
DMaxWidth
|
||||
DMinBlockSize
|
||||
DMinHeight
|
||||
DMinInlineSize
|
||||
DMinWidth
|
||||
DObjectFit
|
||||
DObjectPosition
|
||||
DOpacity
|
||||
DOrder
|
||||
DOrphans
|
||||
DOutline
|
||||
DOutlineColor
|
||||
DOutlineOffset
|
||||
DOutlineStyle
|
||||
DOutlineWidth
|
||||
DOverflow
|
||||
DOverflowAnchor
|
||||
DOverflowWrap
|
||||
DOverflowX
|
||||
DOverflowY
|
||||
DOverscrollBehavior
|
||||
DOverscrollBehaviorBlock
|
||||
DOverscrollBehaviorInline
|
||||
DOverscrollBehaviorX
|
||||
DOverscrollBehaviorY
|
||||
DPadding
|
||||
DPaddingBlockEnd
|
||||
DPaddingBlockStart
|
||||
DPaddingBottom
|
||||
DPaddingInlineEnd
|
||||
DPaddingInlineStart
|
||||
DPaddingLeft
|
||||
DPaddingRight
|
||||
DPaddingTop
|
||||
DPageBreakAfter
|
||||
DPageBreakBefore
|
||||
DPageBreakInside
|
||||
DPaintOrder
|
||||
DPerspective
|
||||
DPerspectiveOrigin
|
||||
DPlaceContent
|
||||
DPlaceItems
|
||||
DPlaceSelf
|
||||
DPointerEvents
|
||||
DPosition
|
||||
DQuotes
|
||||
DResize
|
||||
DRight
|
||||
DRotate
|
||||
DRowGap
|
||||
DRubyAlign
|
||||
DRubyPosition
|
||||
DScale
|
||||
DScrollBehavior
|
||||
DShapeRendering
|
||||
DStopColor
|
||||
DStopOpacity
|
||||
DStroke
|
||||
DStrokeDasharray
|
||||
DStrokeDashoffset
|
||||
DStrokeLinecap
|
||||
DStrokeLinejoin
|
||||
DStrokeMiterlimit
|
||||
DStrokeOpacity
|
||||
DStrokeWidth
|
||||
DTabSize
|
||||
DTableLayout
|
||||
DTextAlign
|
||||
DTextAlignLast
|
||||
DTextAnchor
|
||||
DTextCombineUpright
|
||||
DTextDecoration
|
||||
DTextDecorationColor
|
||||
DTextDecorationLine
|
||||
DTextDecorationStyle
|
||||
DTextEmphasis
|
||||
DTextEmphasisColor
|
||||
DTextEmphasisPosition
|
||||
DTextEmphasisStyle
|
||||
DTextIndent
|
||||
DTextJustify
|
||||
DTextOrientation
|
||||
DTextOverflow
|
||||
DTextRendering
|
||||
DTextShadow
|
||||
DTextTransform
|
||||
DTextUnderlinePosition
|
||||
DTop
|
||||
DTouchAction
|
||||
DTransform
|
||||
DTransformBox
|
||||
DTransformOrigin
|
||||
DTransformStyle
|
||||
DTransition
|
||||
DTransitionDelay
|
||||
DTransitionDuration
|
||||
DTransitionProperty
|
||||
DTransitionTimingFunction
|
||||
DTranslate
|
||||
DUnicodeBidi
|
||||
DUserSelect
|
||||
DVerticalAlign
|
||||
DVisibility
|
||||
DWhiteSpace
|
||||
DWidows
|
||||
DWidth
|
||||
DWillChange
|
||||
DWordBreak
|
||||
DWordSpacing
|
||||
DWordWrap
|
||||
DWritingMode
|
||||
DZIndex
|
||||
DZoom
|
||||
)
|
||||
|
||||
var KnownDeclarations = map[string]D{
|
||||
"align-content": DAlignContent,
|
||||
"align-items": DAlignItems,
|
||||
"align-self": DAlignSelf,
|
||||
"alignment-baseline": DAlignmentBaseline,
|
||||
"all": DAll,
|
||||
"animation": DAnimation,
|
||||
"animation-delay": DAnimationDelay,
|
||||
"animation-direction": DAnimationDirection,
|
||||
"animation-duration": DAnimationDuration,
|
||||
"animation-fill-mode": DAnimationFillMode,
|
||||
"animation-iteration-count": DAnimationIterationCount,
|
||||
"animation-name": DAnimationName,
|
||||
"animation-play-state": DAnimationPlayState,
|
||||
"animation-timing-function": DAnimationTimingFunction,
|
||||
"backface-visibility": DBackfaceVisibility,
|
||||
"background": DBackground,
|
||||
"background-attachment": DBackgroundAttachment,
|
||||
"background-clip": DBackgroundClip,
|
||||
"background-color": DBackgroundColor,
|
||||
"background-image": DBackgroundImage,
|
||||
"background-origin": DBackgroundOrigin,
|
||||
"background-position": DBackgroundPosition,
|
||||
"background-position-x": DBackgroundPositionX,
|
||||
"background-position-y": DBackgroundPositionY,
|
||||
"background-repeat": DBackgroundRepeat,
|
||||
"background-size": DBackgroundSize,
|
||||
"baseline-shift": DBaselineShift,
|
||||
"block-size": DBlockSize,
|
||||
"border": DBorder,
|
||||
"border-block-end": DBorderBlockEnd,
|
||||
"border-block-end-color": DBorderBlockEndColor,
|
||||
"border-block-end-style": DBorderBlockEndStyle,
|
||||
"border-block-end-width": DBorderBlockEndWidth,
|
||||
"border-block-start": DBorderBlockStart,
|
||||
"border-block-start-color": DBorderBlockStartColor,
|
||||
"border-block-start-style": DBorderBlockStartStyle,
|
||||
"border-block-start-width": DBorderBlockStartWidth,
|
||||
"border-bottom": DBorderBottom,
|
||||
"border-bottom-color": DBorderBottomColor,
|
||||
"border-bottom-left-radius": DBorderBottomLeftRadius,
|
||||
"border-bottom-right-radius": DBorderBottomRightRadius,
|
||||
"border-bottom-style": DBorderBottomStyle,
|
||||
"border-bottom-width": DBorderBottomWidth,
|
||||
"border-collapse": DBorderCollapse,
|
||||
"border-color": DBorderColor,
|
||||
"border-image": DBorderImage,
|
||||
"border-image-outset": DBorderImageOutset,
|
||||
"border-image-repeat": DBorderImageRepeat,
|
||||
"border-image-slice": DBorderImageSlice,
|
||||
"border-image-source": DBorderImageSource,
|
||||
"border-image-width": DBorderImageWidth,
|
||||
"border-inline-end": DBorderInlineEnd,
|
||||
"border-inline-end-color": DBorderInlineEndColor,
|
||||
"border-inline-end-style": DBorderInlineEndStyle,
|
||||
"border-inline-end-width": DBorderInlineEndWidth,
|
||||
"border-inline-start": DBorderInlineStart,
|
||||
"border-inline-start-color": DBorderInlineStartColor,
|
||||
"border-inline-start-style": DBorderInlineStartStyle,
|
||||
"border-inline-start-width": DBorderInlineStartWidth,
|
||||
"border-left": DBorderLeft,
|
||||
"border-left-color": DBorderLeftColor,
|
||||
"border-left-style": DBorderLeftStyle,
|
||||
"border-left-width": DBorderLeftWidth,
|
||||
"border-radius": DBorderRadius,
|
||||
"border-right": DBorderRight,
|
||||
"border-right-color": DBorderRightColor,
|
||||
"border-right-style": DBorderRightStyle,
|
||||
"border-right-width": DBorderRightWidth,
|
||||
"border-spacing": DBorderSpacing,
|
||||
"border-style": DBorderStyle,
|
||||
"border-top": DBorderTop,
|
||||
"border-top-color": DBorderTopColor,
|
||||
"border-top-left-radius": DBorderTopLeftRadius,
|
||||
"border-top-right-radius": DBorderTopRightRadius,
|
||||
"border-top-style": DBorderTopStyle,
|
||||
"border-top-width": DBorderTopWidth,
|
||||
"border-width": DBorderWidth,
|
||||
"bottom": DBottom,
|
||||
"box-shadow": DBoxShadow,
|
||||
"box-sizing": DBoxSizing,
|
||||
"break-after": DBreakAfter,
|
||||
"break-before": DBreakBefore,
|
||||
"break-inside": DBreakInside,
|
||||
"caption-side": DCaptionSide,
|
||||
"caret-color": DCaretColor,
|
||||
"clear": DClear,
|
||||
"clip": DClip,
|
||||
"clip-path": DClipPath,
|
||||
"clip-rule": DClipRule,
|
||||
"color": DColor,
|
||||
"color-interpolation": DColorInterpolation,
|
||||
"color-interpolation-filters": DColorInterpolationFilters,
|
||||
"column-count": DColumnCount,
|
||||
"column-fill": DColumnFill,
|
||||
"column-gap": DColumnGap,
|
||||
"column-rule": DColumnRule,
|
||||
"column-rule-color": DColumnRuleColor,
|
||||
"column-rule-style": DColumnRuleStyle,
|
||||
"column-rule-width": DColumnRuleWidth,
|
||||
"column-span": DColumnSpan,
|
||||
"column-width": DColumnWidth,
|
||||
"columns": DColumns,
|
||||
"content": DContent,
|
||||
"counter-increment": DCounterIncrement,
|
||||
"counter-reset": DCounterReset,
|
||||
"css-float": DCssFloat,
|
||||
"css-text": DCssText,
|
||||
"cursor": DCursor,
|
||||
"direction": DDirection,
|
||||
"display": DDisplay,
|
||||
"dominant-baseline": DDominantBaseline,
|
||||
"empty-cells": DEmptyCells,
|
||||
"fill": DFill,
|
||||
"fill-opacity": DFillOpacity,
|
||||
"fill-rule": DFillRule,
|
||||
"filter": DFilter,
|
||||
"flex": DFlex,
|
||||
"flex-basis": DFlexBasis,
|
||||
"flex-direction": DFlexDirection,
|
||||
"flex-flow": DFlexFlow,
|
||||
"flex-grow": DFlexGrow,
|
||||
"flex-shrink": DFlexShrink,
|
||||
"flex-wrap": DFlexWrap,
|
||||
"float": DFloat,
|
||||
"flood-color": DFloodColor,
|
||||
"flood-opacity": DFloodOpacity,
|
||||
"font": DFont,
|
||||
"font-family": DFontFamily,
|
||||
"font-feature-settings": DFontFeatureSettings,
|
||||
"font-kerning": DFontKerning,
|
||||
"font-size": DFontSize,
|
||||
"font-size-adjust": DFontSizeAdjust,
|
||||
"font-stretch": DFontStretch,
|
||||
"font-style": DFontStyle,
|
||||
"font-synthesis": DFontSynthesis,
|
||||
"font-variant": DFontVariant,
|
||||
"font-variant-caps": DFontVariantCaps,
|
||||
"font-variant-east-asian": DFontVariantEastAsian,
|
||||
"font-variant-ligatures": DFontVariantLigatures,
|
||||
"font-variant-numeric": DFontVariantNumeric,
|
||||
"font-variant-position": DFontVariantPosition,
|
||||
"font-weight": DFontWeight,
|
||||
"gap": DGap,
|
||||
"glyph-orientation-vertical": DGlyphOrientationVertical,
|
||||
"grid": DGrid,
|
||||
"grid-area": DGridArea,
|
||||
"grid-auto-columns": DGridAutoColumns,
|
||||
"grid-auto-flow": DGridAutoFlow,
|
||||
"grid-auto-rows": DGridAutoRows,
|
||||
"grid-column": DGridColumn,
|
||||
"grid-column-end": DGridColumnEnd,
|
||||
"grid-column-gap": DGridColumnGap,
|
||||
"grid-column-start": DGridColumnStart,
|
||||
"grid-gap": DGridGap,
|
||||
"grid-row": DGridRow,
|
||||
"grid-row-end": DGridRowEnd,
|
||||
"grid-row-gap": DGridRowGap,
|
||||
"grid-row-start": DGridRowStart,
|
||||
"grid-template": DGridTemplate,
|
||||
"grid-template-areas": DGridTemplateAreas,
|
||||
"grid-template-columns": DGridTemplateColumns,
|
||||
"grid-template-rows": DGridTemplateRows,
|
||||
"height": DHeight,
|
||||
"hyphens": DHyphens,
|
||||
"image-orientation": DImageOrientation,
|
||||
"image-rendering": DImageRendering,
|
||||
"inline-size": DInlineSize,
|
||||
"inset": DInset,
|
||||
"justify-content": DJustifyContent,
|
||||
"justify-items": DJustifyItems,
|
||||
"justify-self": DJustifySelf,
|
||||
"left": DLeft,
|
||||
"letter-spacing": DLetterSpacing,
|
||||
"lighting-color": DLightingColor,
|
||||
"line-break": DLineBreak,
|
||||
"line-height": DLineHeight,
|
||||
"list-style": DListStyle,
|
||||
"list-style-image": DListStyleImage,
|
||||
"list-style-position": DListStylePosition,
|
||||
"list-style-type": DListStyleType,
|
||||
"margin": DMargin,
|
||||
"margin-block-end": DMarginBlockEnd,
|
||||
"margin-block-start": DMarginBlockStart,
|
||||
"margin-bottom": DMarginBottom,
|
||||
"margin-inline-end": DMarginInlineEnd,
|
||||
"margin-inline-start": DMarginInlineStart,
|
||||
"margin-left": DMarginLeft,
|
||||
"margin-right": DMarginRight,
|
||||
"margin-top": DMarginTop,
|
||||
"marker": DMarker,
|
||||
"marker-end": DMarkerEnd,
|
||||
"marker-mid": DMarkerMid,
|
||||
"marker-start": DMarkerStart,
|
||||
"mask": DMask,
|
||||
"mask-composite": DMaskComposite,
|
||||
"mask-image": DMaskImage,
|
||||
"mask-position": DMaskPosition,
|
||||
"mask-repeat": DMaskRepeat,
|
||||
"mask-size": DMaskSize,
|
||||
"mask-type": DMaskType,
|
||||
"max-block-size": DMaxBlockSize,
|
||||
"max-height": DMaxHeight,
|
||||
"max-inline-size": DMaxInlineSize,
|
||||
"max-width": DMaxWidth,
|
||||
"min-block-size": DMinBlockSize,
|
||||
"min-height": DMinHeight,
|
||||
"min-inline-size": DMinInlineSize,
|
||||
"min-width": DMinWidth,
|
||||
"object-fit": DObjectFit,
|
||||
"object-position": DObjectPosition,
|
||||
"opacity": DOpacity,
|
||||
"order": DOrder,
|
||||
"orphans": DOrphans,
|
||||
"outline": DOutline,
|
||||
"outline-color": DOutlineColor,
|
||||
"outline-offset": DOutlineOffset,
|
||||
"outline-style": DOutlineStyle,
|
||||
"outline-width": DOutlineWidth,
|
||||
"overflow": DOverflow,
|
||||
"overflow-anchor": DOverflowAnchor,
|
||||
"overflow-wrap": DOverflowWrap,
|
||||
"overflow-x": DOverflowX,
|
||||
"overflow-y": DOverflowY,
|
||||
"overscroll-behavior": DOverscrollBehavior,
|
||||
"overscroll-behavior-block": DOverscrollBehaviorBlock,
|
||||
"overscroll-behavior-inline": DOverscrollBehaviorInline,
|
||||
"overscroll-behavior-x": DOverscrollBehaviorX,
|
||||
"overscroll-behavior-y": DOverscrollBehaviorY,
|
||||
"padding": DPadding,
|
||||
"padding-block-end": DPaddingBlockEnd,
|
||||
"padding-block-start": DPaddingBlockStart,
|
||||
"padding-bottom": DPaddingBottom,
|
||||
"padding-inline-end": DPaddingInlineEnd,
|
||||
"padding-inline-start": DPaddingInlineStart,
|
||||
"padding-left": DPaddingLeft,
|
||||
"padding-right": DPaddingRight,
|
||||
"padding-top": DPaddingTop,
|
||||
"page-break-after": DPageBreakAfter,
|
||||
"page-break-before": DPageBreakBefore,
|
||||
"page-break-inside": DPageBreakInside,
|
||||
"paint-order": DPaintOrder,
|
||||
"perspective": DPerspective,
|
||||
"perspective-origin": DPerspectiveOrigin,
|
||||
"place-content": DPlaceContent,
|
||||
"place-items": DPlaceItems,
|
||||
"place-self": DPlaceSelf,
|
||||
"pointer-events": DPointerEvents,
|
||||
"position": DPosition,
|
||||
"quotes": DQuotes,
|
||||
"resize": DResize,
|
||||
"right": DRight,
|
||||
"rotate": DRotate,
|
||||
"row-gap": DRowGap,
|
||||
"ruby-align": DRubyAlign,
|
||||
"ruby-position": DRubyPosition,
|
||||
"scale": DScale,
|
||||
"scroll-behavior": DScrollBehavior,
|
||||
"shape-rendering": DShapeRendering,
|
||||
"stop-color": DStopColor,
|
||||
"stop-opacity": DStopOpacity,
|
||||
"stroke": DStroke,
|
||||
"stroke-dasharray": DStrokeDasharray,
|
||||
"stroke-dashoffset": DStrokeDashoffset,
|
||||
"stroke-linecap": DStrokeLinecap,
|
||||
"stroke-linejoin": DStrokeLinejoin,
|
||||
"stroke-miterlimit": DStrokeMiterlimit,
|
||||
"stroke-opacity": DStrokeOpacity,
|
||||
"stroke-width": DStrokeWidth,
|
||||
"tab-size": DTabSize,
|
||||
"table-layout": DTableLayout,
|
||||
"text-align": DTextAlign,
|
||||
"text-align-last": DTextAlignLast,
|
||||
"text-anchor": DTextAnchor,
|
||||
"text-combine-upright": DTextCombineUpright,
|
||||
"text-decoration": DTextDecoration,
|
||||
"text-decoration-color": DTextDecorationColor,
|
||||
"text-decoration-line": DTextDecorationLine,
|
||||
"text-decoration-style": DTextDecorationStyle,
|
||||
"text-emphasis": DTextEmphasis,
|
||||
"text-emphasis-color": DTextEmphasisColor,
|
||||
"text-emphasis-position": DTextEmphasisPosition,
|
||||
"text-emphasis-style": DTextEmphasisStyle,
|
||||
"text-indent": DTextIndent,
|
||||
"text-justify": DTextJustify,
|
||||
"text-orientation": DTextOrientation,
|
||||
"text-overflow": DTextOverflow,
|
||||
"text-rendering": DTextRendering,
|
||||
"text-shadow": DTextShadow,
|
||||
"text-transform": DTextTransform,
|
||||
"text-underline-position": DTextUnderlinePosition,
|
||||
"top": DTop,
|
||||
"touch-action": DTouchAction,
|
||||
"transform": DTransform,
|
||||
"transform-box": DTransformBox,
|
||||
"transform-origin": DTransformOrigin,
|
||||
"transform-style": DTransformStyle,
|
||||
"transition": DTransition,
|
||||
"transition-delay": DTransitionDelay,
|
||||
"transition-duration": DTransitionDuration,
|
||||
"transition-property": DTransitionProperty,
|
||||
"transition-timing-function": DTransitionTimingFunction,
|
||||
"translate": DTranslate,
|
||||
"unicode-bidi": DUnicodeBidi,
|
||||
"user-select": DUserSelect,
|
||||
"vertical-align": DVerticalAlign,
|
||||
"visibility": DVisibility,
|
||||
"white-space": DWhiteSpace,
|
||||
"widows": DWidows,
|
||||
"width": DWidth,
|
||||
"will-change": DWillChange,
|
||||
"word-break": DWordBreak,
|
||||
"word-spacing": DWordSpacing,
|
||||
"word-wrap": DWordWrap,
|
||||
"writing-mode": DWritingMode,
|
||||
"z-index": DZIndex,
|
||||
"zoom": DZoom,
|
||||
}
|
Reference in New Issue
Block a user