FolEs icon indicating copy to clipboard operation
FolEs copied to clipboard

Folhas de Estilo em Português, para geração de CSS.

FolEs

FolEs

Linguagem de Folhas de Estilo em Português, para geração de CSS.

Acompanhe a Design Líquido nas redes sociais:

Motivação

Assim como linguagens de programação e de marcação, linguagens de estilo como CSS podem ser difíceis de aprender em português.

FolEs começa do mesmo ponto que SASS, como uma linguagem de extensão que gera CSS. A base de CSS é HTML. A base de FolEs é LMHT.

Adicionalmente, FolEs possui um recurso de tradução reversa. Em outras palavras, FolEs pode ingerir um arquivo CSS e devolver seu correspondente em FolEs.

Exemplos

Se queremos definir estilos para um documento inteiro, podemos usar:

lmht {
    tamanho-fonte: 12px;
}

Isso traduz para o seguinte CSS:

html {
    font-size: 12px;
}

Instalação

Para instalar FolEs globalmente, use o seguinte comando:

npm i -g @designliquido/foles

Execução

Após instalar globalmente pelo npm, para executar FolEs traduzindo um arquivo chamado exemplo.foles, use:

foles exemplo.foles

Para tradução reversa:

foles exemplo.css

VSCode

No Visual Studio Code, adicione no seu launch.json o seguinte:

    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "FolEs",
            "skipFiles": ["<node_internals>/**", "node_modules/**"],
            "cwd": "${workspaceRoot}",
            "console": "integratedTerminal",
            "args": [
                "${workspaceFolder}${pathSeparator}execucao.ts",
                "${workspaceFolder}${pathSeparator}exemplos${pathSeparator}exemplo.foles"
            ],
            "runtimeExecutable": "node",
            "runtimeArgs": ["--nolazy", "-r", "ts-node/register/transpile-only"]
        },
    ]

Arquitetura

FolEs copia vários elementos de Delégua, como um Lexador e um Avaliador Sintático, mas contém um elemento original (um Tradutor, que usa o retorno do Avaliador Sintático para gerar uma folha de estilo em CSS).

Seletores

Um seletor é uma expressão que encontra N elementos em um documento LMHT que possuem certas características, como por exemplo o nome de uma estrutura, um id, uma classe e atributos dessa estrutura. Por exemplo:

ligacao {

}

Encontra todas as estruturas de um documento LMHT cujo nome da estrutura seja ligação:

<lmht>
    <cabeça>
    </cabeça>
    <corpo>
        <ligacao destino="https://github.com/DesignLiquido">GitHub da Design Líquido</ligacao>
        <ligacao destino="https://github.com/DesignLiquido/delegua">Linguagem Delégua</ligacao>
        <ligacao destino="https://github.com/DesignLiquido/FolEs">Linguagem FolEs</ligacao>
    </corpo>
</lmht>

Neste exemplo, portanto, irá encontrar três estruturas.

Podemos ainda selecionar por um identificador único:

#ligacao1 {

}

Para o exemplo modificado:

<lmht>
    <cabeça>
    </cabeça>
    <corpo>
        <ligacao id="ligacao1" destino="https://github.com/DesignLiquido">GitHub da Design Líquido</ligacao>
        <ligacao id="ligacao2" destino="https://github.com/DesignLiquido/delegua">Linguagem Delégua</ligacao>
        <ligacao id="ligacao3" destino="https://github.com/DesignLiquido/FolEs">Linguagem FolEs</ligacao>
    </corpo>
</lmht>

Iremos encontrar uma estrutura. Ainda, podemos usar algo assim:

.minhaligacao {

}

E modificar o exemplo mais uma vez:

<lmht>
    <cabeça>
    </cabeça>
    <corpo>
        <ligacao classe="minhaligacao" destino="https://github.com/DesignLiquido">GitHub da Design Líquido</ligacao>
        <ligacao classe="outraligacao" destino="https://github.com/DesignLiquido/delegua">Linguagem Delégua</ligacao>
        <ligacao classe="minhaligacao" destino="https://github.com/DesignLiquido/FolEs">Linguagem FolEs</ligacao>
    </corpo>
</lmht>

E encontraremos apenas duas das três estruturas.

Modificadores

Um modificador é toda e qualquer propriedade declarada no escopo de um seletor que irá causar uma modificação em estruturas de um documento. Voltando ao exemplo da seção anterior:

ligacao {
    tamanho-fonte: 16px;
}

Se aplicamos este estilo ao documento do primeiro exemplo, todas as três estruturas receberão uma modificação de estilo, ou seja o tamanho da fonte (texto) passa a ter o tamanho de 16 pixels.

Atributos de Modificadores: Valores, Quantificadores e Qualitativos

FolEs trabalha com três conceitos de atributos em todas as etapas dos ciclos de ingestão de arquivos:

  • Valores: são os atributos que acompanham modificadores. No exemplo tamanho-fonte: 16px;, tamanho-fonte é o modificador, e 16px é o valor. Valores podem ser formados por números absolutos, números acompanhados de quantificadores, quantitativos ou ainda uma combinação de todos esses;
  • Quantificadores: são complementos de valores. No exemplo anterior, px é o quantificador, e acompanha o número 16, a parte numérica do valor;
  • Qualitativos: são valores adjetivos. Nem todo valor é expresso por um número e uma unidade de medida. Explorando um outro exemplo:
ligacao {
    estilo-contorno: pontilhado;
}

estilo-contorno é um modificador que pede um qualitativo. pontihado é um qualitativo.

Mapeamentos

FolEs CSS
agrupar-palavra word-break
agrupar-vazamento overflow-wrap
ajustar-objeto object-fit
ajustar-tamanho-fonte font-size-adjust
ajuste-cor-forcado forced-color-adjust
ajuste-cor-forçado forced-color-adjust
alinhar-conteudo align-content
alinhar-conteúdo align-content
alinhar-encaixe-rolagem-mouse scroll-snap-align
alinhar-itens align-items
alinhar-se align-self
alinhar-texto text-align
alinhar-vertical vertical-align
alinhar-ultimo-item text-align-last
alinhar-último-item text-align-last
altura height
altura-linha line-height
altura-maxima max-height
altura-máxima max-height
altura-minima min-height
altura-mínima min-height
animacao animation
animação animation
ao-mudar will-change
aparencia appearance
aparência appearance
area-mascara mask-clip
área-máscara mask-clip
atraso-animacao animation-delay
atraso-animação animation-delay
atraso-transicao transition-delay
atraso-transição transition-delay
borda border
borda-direita border-right
borda-em-bloco border-block
borda-em-linha border-inline
borda-esquerda border-left
borda-inferior border-bottom
borda-mascara mask-border
borda-máscara mask-border
borda-superior border-top
calha-barra-rolagem scrollbar-gutter
celulas-vazias empty-cells
células-vazias empty-cells
citacoes quotes
citações quotes
coluna-em-grade grid-column
colunas columns
combinar-texto-vertical text-combine-upright
comportamento-em-bloco-rolagem-mouse overscroll-behavior-block
comportamento-em-linha-rolagem-mouse overscroll-behavior-inline
comportamento-horizontal-rolagem-mouse overscroll-behavior-x
comportamento-rolagem scroll-behavior
comportamento-rolagem-mouse overscroll-behavior
comportamento-vertical-rolagem-mouse overscroll-behavior-y
composicao-mascara mask-composite
composição-máscara mask-composite
configuracoes-variacao-fonte font-variation-settings
configurações-variação-fonte font-variation-settings
contar-coluna column-count
contem contain
contém contain
conteudo content
conteúdo content
contorno outline
coordenadas translate
cor color
cor-barra-rolagem scrollbar-color
cor-borda border-color
cor-borda-direita border-right-color
cor-borda-em-bloco border-block-color
cor-borda-em-linha border-inline-color
cor-borda-esquerda border-left-color
cor-borda-inferior border-bottom-color
cor-borda-superior border-top-color
cor-contorno outline-color
cor-cursor caret-color
cor-destaque accent-color
cor-enfase-texto text-emphasis-color
cor-ênfase-texto text-emphasis-color
cor-fim-borda-em-bloco border-block-end-color
cor-fim-borda-em-linha border-inline-end-color
cor-fundo background-color
cor-inicio-borda-em-bloco border-block-start-color
cor-início-borda-em-bloco border-block-start-color
cor-inicio-borda-em-linha border-inline-start-color
cor-início-borda-em-linha border-inline-start-color
cursor cursor
decoracao-cor-texto text-decoration-color
decoração-cor-texto text-decoration-color
decoracao-espessura-texto text-decoration-thickness
decoração-espessura-texto text-decoration-thickness
decoracao-estilo-texto text-decoration-style
decoração-estilo-texto text-decoration-style
decoracao-linha-texto text-decoration-line
decoração-linha-texto text-decoration-line
decoracao-texto text-decoration
decoração-texto text-decoration
decoracao-texto-sublinhado text-decoration-skip-ink
decoração-texto-sublinhado text-decoration-skip-ink
definir-contador counter-set
design-tabela table-layout
deslocamento offset
deslocamento-em-ancora offset-anchor
deslocamento-em-âncora offset-anchor
deslocamento-texto-sublinhado text-underline-offset
deslocar-contorno outline-offset
deslocar-pontuacao hanging-punctuation
deslocar-pontuação hanging-punctuation
direcao direction
direção direction
direcao-animacao animation-direction
direção-animação animation-direction
distancia-deslocamento offset-distance
distância-deslocamento offset-distance
duracao-animacao animation-duration
duração-animação animation-duration
duracao-transicao transition-duration
duração-transição transition-duration
enfase-texto text-emphasis
ênfase-texto text-emphasis
escala scale
espacamento gap
espaçamento gap
espacamento-coluna column-gap
espaçamento-coluna column-gap
espacamento-coluna-em-grade grid-column-gap
espaçamento-coluna-em-grade grid-column-gap
espacamento-em-grade grid-gap
espaçamento-em-grade grid-gap
espacamento-fonte font-kerning
espaçamento-fonte font-kerning
espacamento-letras letter-spacing
espaçamento-letras letter-spacing
espacamento-linhas row-gap
espaçamento-linhas row-gap
espacamento-linha-em-grade grid-row-gap
espaçamento-linha-em-grade grid-row-gap
espacamento-palavras word-spacing
espaçamento-palavras word-spacing
espaco-borda border-spacing
espaço-borda border-spacing
espaco-em-branco white-space
espaço-em-branco white-space
espessura-fonte font-weight
esquema-cor color-scheme
estender-borda-imagem border-image-outset
estender-coluna column-span
esticar-fonte font-stretch
estilo-borda border-style
estilo-borda-direita border-right-style
estilo-borda-em-bloco border-block-style
estilo-borda-em-linha border-inline-style
estilo-borda-esquerda border-left-style
estilo-borda-inferior border-bottom-style
estilo-borda-superior border-top-style
estilo-contorno outline-style
estilo-enfase-texto text-emphasis-style
estilo-ênfase-texto text-emphasis-style
estilo-fim-borda-em-bloco border-block-end-style
estilo-fim-borda-em-linha border-inline-end-style
estilo-fonte font-style
estilo-inicio-borda-em-bloco border-block-start-style
estilo-início-borda-em-bloco border-block-start-style
estilo-inicio-borda-em-linha border-inline-start-style
estilo-início-borda-em-linha border-inline-start-style
estilo-lista list-style
estilo-lista-imagem list-style-image
estilo-lista-posicao list-style-position
estilo-lista-posição list-style-position
estilo-lista-tipo list-style-type
eventos-ponteiro pointer-events
exibicao display
exibição display
fatiar-borda-mascara mask-border-slice
fatiar-borda-máscara mask-border-slice
fatiar-imagem-borda border-image-slice
filtro filter
filtro-fundo backdrop-filter
fim-borda-em-bloco border-block-end
fim-borda-em-linha border-inline-end
fim-coluna-em-grade grid-column-end
fim-linha-em-grade grid-row-end
fixar-fundo background-attachment
flex flex
flex-agrupar flex-wrap
flex-comprimento flex-basis
flex-crescimento flex-grow
flex-direcao flex-direction
flex-direção flex-direction
flex-fluxo flex-flow
flex-reduzir flex-shrink
flutuar float
fluxo clear
fluxo-em-grade grid-auto-flow
fonte font
fonte-texto font-family
forma-externa shape-outside
forma-margem shape-margin
fundo background
girar rotate
grade grid
hifens hyphens
hífens hyphens
imagem-borda border-image
imagem-fundo background-image
imagem-mascara mask-image
imagem-máscara mask-image
impressao-ajuste-cor print-color-adjust
impressão-ajuste-cor print-color-adjust
incrementar-contador counter-increment
indentacao-texto text-indent
indentação-texto text-indent
indice-z z-index
índice-z z-index
inicio-borda-em-bloco border-block-start
início-borda-em-bloco border-block-start
inicio-borda-em-linha border-inline-start
início-borda-em-linha border-inline-start
inicio-borda-mascara mask-border-outset
início-borda-máscara mask-border-outset
inicio-coluna-em-grade grid-column-start
início-coluna-em-grade grid-column-start
inicio-insercao-em-bloco inset-block-start
início-inserção-em-bloco inset-block-start
inicio-insercao-em-linha inset-inline-start
início-inserção-em-linha inset-inline-start
inicio-linha-em-grade grid-row-start
início-linha-em-grade grid-row-start
inicio-margem-em-bloco margin-block-start
início-margem-em-bloco margin-block-start
inicio-margem-em-linha margin-inline-start
início-margem-em-linha margin-inline-start
inicio-recuo-em-bloco padding-block-start
início-recuo-em-bloco padding-block-start
inicio-recuo-em-linha padding-inline-start
início-recuo-em-linha padding-inline-start
insercao inset
inserção inset
insercao-em-bloco inset-block
inserção-em-bloco inset-block
insercao-em-bloco-fim inset-block-end
inserção-em-bloco-fim inset-block-end
insercao-em-linha inset-inline
inserção-em-linha inset-inline
insercao-em-linha-fim inset-inline-end
inserção-em-linha-fim inset-inline-end
isolamento isolation
justificar-conteudo justify-content
justificar-conteúdo justify-content
justificar-itens justify-items
justificar-se justify-self
justificar-texto text-justify
largura width
largura-barra-rolagem scrollbar-width
largura-borda border-width
largura-borda-direita border-right-width
largura-borda-em-bloco border-block-width
largura-borda-em-linha border-inline-width
largura-borda-esquerda border-left-width
largura-borda-inferior border-bottom-width
largura-borda-mascara mask-border-width
largura-borda-máscara mask-border-width
largura-borda-superior border-top-width
largura-coluna column-width
largura-contorno outline-width
largura-fim-borda-em-bloco border-block-end-width
largura-fim-borda-em-linha border-inline-end-width
largura-imagem-borda border-image-width
largura-inicio-borda-em-bloco border-block-start-width
largura-início-borda-em-bloco border-block-start-width
largura-inicio-borda-em-linha border-inline-start-width
largura-início-borda-em-linha border-inline-start-width
largura-maxima max-width
largura-máxima max-width
largura-minima min-width
largura-mínima min-width
limite-forma-imagem shape-image-threshold
linha-em-grade grid-row
linhas-inferiores orphans
linhas-superiores widows
margem margin
margem-direita margin-right
margem-direita-rolagem-mouse scroll-margin-right
margem-em-bloco margin-block
margem-em-bloco-fim margin-block-end
margem-em-bloco-rolagem-mouse scroll-margin-block
margem-em-linha margin-inline
margem-em-linha-fim margin-inline-end
margem-em-linha-rolagem-mouse scroll-margin-inline
margem-esquerda margin-left
margem-esquerda-rolagem-mouse scroll-margin-left
margem-inferior margin-bottom
margem-inferior-rolagem-mouse scroll-margin-bottom
margem-rolagem-mouse scroll-margin
margem-superior margin-top
margem-superior-rolagem-mouse scroll-margin-top
mascara mask
máscara mask
mesclar-fundo background-blend-mode
modelo-colunas-em-grade grid-template-columns
modelo-em-grade grid-template
modelo-geral-em-grade grid-template-areas
modelo-linhas-em-grade grid-template-rows
modo-borda-mascara mask-border-mode
modo-borda-máscara mask-border-mode
modo-escrita writing-mode
modo-mascara mask-mode
modo-máscara mask-mode
modo-mescla mix-blend-mode
modo-preenchimento-animacao animation-fill-mode
modo-preenchimento-animação animation-fill-mode
nome-animacao animation-name
nome-animação animation-name
opacidade opacity
ordem-pintura paint-order
ordenar order
orientacao-imagem image-orientation
orientação-imagem image-orientation
orientacao-texto text-orientation
orientação-texto text-orientation
origem-borda-mascara mask-border-source
origem-borda-máscara mask-border-source
origem-fundo background-origin
origem-imagem-borda border-image-source
origem-mascara mask-origin
origem-máscara mask-origin
origem-perspectiva perspective-origin
parar-encaixe-rolagem-mouse scroll-snap-stop
perspectiva perspective
posicao position
posição position
posicao-deslocamento offset-position
posição-deslocamento offset-position
posicao-direita right
posição-direita right
posicao-enfase-texto text-emphasis-position
posição-ênfase-texto text-emphasis-position
posicao-esquerda left
posição-esquerda left
posicao-fundo background-position
posição-fundo background-position
posicao-horizontal-fundo background-position-x
posição-horizontal-fundo background-position-x
posicao-inferior bottom
posição-inferior bottom
posicao-legenda caption-side
posição-legenda caption-side
posicao-mascara mask-position
posição-máscara mask-position
posicao-objeto object-position
posição-objeto object-position
posicao-superior top
posição-superior top
posicao-texto-sublinhado text-underline-position
posição-texto-sublinhado text-underline-position
posicao-vertical-fundo background-position-y
posição-vertical-fundo background-position-y
posicionar-conteudo place-content
posicionar-conteúdo place-content
posicionar-itens place-items
posicionar-se place-self
preencher-coluna column-fill
proporcao-tela aspect-ratio
proporção-tela aspect-ratio
propriedade-transicao transition-property
propriedade-transição transition-property
quebra-decoracao-caixa box-decoration-break
quebra-decoração-caixa box-decoration-break
quebrar-antes break-before
quebrar-apos break-after
quebrar-após break-after
quebrar-dentro break-inside
quebrar-linha line-break
quebrar-pagina-antes page-break-before
quebrar-página-antes page-break-before
quebrar-pagina-apos page-break-after
quebrar-página-após page-break-after
quebrar-pagina-dentro page-break-inside
quebrar-página-dentro page-break-inside
quebrar-palavra word-break
raio-borda border-radius
raio-direito-borda-inferior border-bottom-right-radius
raio-direito-borda-superior border-top-right-radius
raio-esquerdo-borda-inferior border-bottom-left-radius
raio-esquerdo-borda-superior border-top-left-radius
recolher-borda border-collapse
recortar clip
recortar-fundo background-clip
recortar-margem-vazada overflow-clip-margin
recuo padding
recuo-direito padding-right
recuo-direito-rolagem-mouse scroll-padding-right
recuo-em-bloco padding-block
recuo-em-bloco-fim padding-block-end
recuo-em-bloco-rolagem-mouse scroll-padding-block
recuo-em-linha padding-inline
recuo-em-linha-fim padding-inline-end
recuo-em-linha-rolagem-mouse scroll-padding-inline
recuo-esquerdo padding-left
recuo-esquerdo-rolagem-mouse scroll-padding-left
recuo-inferior padding-bottom
recuo-inferior-rolagem-mouse scroll-padding-bottom
recuo-rolagem-mouse scroll-padding
recuo-superior padding-top
recuo-superior-rolagem-mouse scroll-padding-top
recursos-fonte font-feature-settings
redimensionar resize
regras-coluna column-rule
regras-cor-coluna column-rule-color
regras-estilo-coluna column-rule-style
regras-largura-coluna column-rule-width
reiniciar-contador counter-reset
reiniciar-tudo all
renderizacao-imagem image-rendering
renderização-imagem image-rendering
renderizacao-texto text-rendering
renderização-texto text-rendering
repeticao-borda-mascara mask-border-repeat
repetição-borda-máscara mask-border-repeat
repetir-animacao animation-iteration-count
repetir-animação animation-iteration-count
repetir-fundo background-repeat
repetir-imagem-borda border-image-repeat
repetir-mascara mask-repeat
repetir-máscara mask-repeat
rotacao-deslocamento offset-rotate
rotação-deslocamento offset-rotate
selecao-usuario user-select
seleção-usuario user-select
sintetizar-fonte font-synthesis
sombra-caixa box-shadow
sombra-texto text-shadow
status-animacao animation-play-state
status-animação animation-play-state
substituir-idioma-fonte font-language-override
tabulacao tab-size
tabulação tab-size
tamanho-caixa box-sizing
tamanho-colunas-em-grade grid-auto-columns
tamanho-em-bloco block-size
tamanho-em-linha inline-size
tamanho-fonte font-size
tamanho-fundo background-size
tamanho-grade grid-area
tamanho-linhas-em-grade grid-auto-rows
tamanho-mascara mask-size
tamanho-máscara mask-size
tamanho-maximo-em-bloco max-block-size
tamanho-máximo-em-bloco max-block-size
tamanho-maximo-em-linha max-inline-size
tamanho-máximo-em-linha max-inline-size
tamanho-minimo-em-bloco min-block-size
tamanho-mínimo-em-bloco min-block-size
tamanho-minimo-em-linha min-inline-size
tamanho-mínimo-em-linha min-inline-size
tamanho-optico-fonte font-optical-sizing
tamanho-óptico-fonte font-optical-sizing
tempo-transicao transition-timing-function
tempo-transição transition-timing-function
texto-bidirecional unicode-bidi
tipo-encaixe-rolagem-mouse scroll-snap-type
tipo-mascara mask-type
tipo-máscara mask-type
toque-tela touch-action
trajeto-deslocamento offset-path
transformar transform
transformar-caixa transform-box
transformar-estilo transform-style
transformar-origem transform-origin
transformar-texto text-transform
transicao transition
transição transition
variacao-fonte font-variant
variação-fonte font-variant
variacao-fonte-alternativa font-variant-alternates
variação-fonte-alternativa font-variant-alternates
variacao-fonte-asiatica font-variant-east-asian
variação-fonte-asiática font-variant-east-asian
variacao-fonte-ligacao font-variant-ligatures
variação-fonte-ligação font-variant-ligatures
variacao-fonte-maiuscula font-variant-caps
variação-fonte-maiúscula font-variant-caps
variacao-fonte-numerica font-variant-numeric
variação-fonte-numérica font-variant-numeric
variacao-fonte-posicao font-variant-position
variação-fonte-posição font-variant-position
vazamento overflow
vazamento-em-ancora overflow-anchor
vazamento-em-âncora overflow-anchor
vazamento-em-bloco overflow-block
vazamento-em-linha overflow-inline
vazamento-horizontal overflow-x
vazamento-texto text-overflow
vazamento-vertical overflow-y
velocidade-animacao animation-timing-function
velocidade-animação animation-timing-function
visibilidade visibility
visibilidade-conteudo content-visibility
visibilidade-conteúdo content-visibility
visibilidade-fundo backface-visibility

Recursos para desenvolvedores

Alguns sites são fundamentais para entender a implementação feita aqui:

  • https://sokra.github.io/source-map-visualization/#custom
  • https://evanw.github.io/source-map-visualization
  • https://lachlan-miller.me/articles/decoding-variable-length-quantity-vlq-for-source-maps