FolEs

November 26, 2025 · View on GitHub

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.

Demonstração online

FolEs tem uma demonstração online juntamente com LMHT: https://designliquido.github.io/foles-demo-web.

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

FolEsCSS
agrupar-palavraword-break
agrupar-vazamentooverflow-wrap
ajustar-objetoobject-fit
ajustar-tamanho-fontefont-size-adjust
ajuste-cor-forcadoforced-color-adjust
ajuste-cor-forçadoforced-color-adjust
alinhar-conteudoalign-content
alinhar-conteúdoalign-content
alinhar-encaixe-rolagem-mousescroll-snap-align
alinhar-itensalign-items
alinhar-sealign-self
alinhar-textotext-align
alinhar-verticalvertical-align
alinhar-ultimo-itemtext-align-last
alinhar-último-itemtext-align-last
alturaheight
altura-linhaline-height
altura-maximamax-height
altura-máximamax-height
altura-minimamin-height
altura-mínimamin-height
animacaoanimation
animaçãoanimation
ao-mudarwill-change
aparenciaappearance
aparênciaappearance
area-mascaramask-clip
área-máscaramask-clip
atraso-animacaoanimation-delay
atraso-animaçãoanimation-delay
atraso-transicaotransition-delay
atraso-transiçãotransition-delay
bordaborder
borda-direitaborder-right
borda-em-blocoborder-block
borda-em-linhaborder-inline
borda-esquerdaborder-left
borda-inferiorborder-bottom
borda-mascaramask-border
borda-máscaramask-border
borda-superiorborder-top
calha-barra-rolagemscrollbar-gutter
celulas-vaziasempty-cells
células-vaziasempty-cells
citacoesquotes
citaçõesquotes
coluna-em-gradegrid-column
colunascolumns
combinar-texto-verticaltext-combine-upright
comportamento-em-bloco-rolagem-mouseoverscroll-behavior-block
comportamento-em-linha-rolagem-mouseoverscroll-behavior-inline
comportamento-horizontal-rolagem-mouseoverscroll-behavior-x
comportamento-rolagemscroll-behavior
comportamento-rolagem-mouseoverscroll-behavior
comportamento-vertical-rolagem-mouseoverscroll-behavior-y
composicao-mascaramask-composite
composição-máscaramask-composite
configuracoes-variacao-fontefont-variation-settings
configurações-variação-fontefont-variation-settings
contar-colunacolumn-count
contemcontain
contémcontain
conteudocontent
conteúdocontent
contornooutline
coordenadastranslate
corcolor
cor-barra-rolagemscrollbar-color
cor-bordaborder-color
cor-borda-direitaborder-right-color
cor-borda-em-blocoborder-block-color
cor-borda-em-linhaborder-inline-color
cor-borda-esquerdaborder-left-color
cor-borda-inferiorborder-bottom-color
cor-borda-superiorborder-top-color
cor-contornooutline-color
cor-cursorcaret-color
cor-destaqueaccent-color
cor-enfase-textotext-emphasis-color
cor-ênfase-textotext-emphasis-color
cor-fim-borda-em-blocoborder-block-end-color
cor-fim-borda-em-linhaborder-inline-end-color
cor-fundobackground-color
cor-inicio-borda-em-blocoborder-block-start-color
cor-início-borda-em-blocoborder-block-start-color
cor-inicio-borda-em-linhaborder-inline-start-color
cor-início-borda-em-linhaborder-inline-start-color
cursorcursor
decoracao-cor-textotext-decoration-color
decoração-cor-textotext-decoration-color
decoracao-espessura-textotext-decoration-thickness
decoração-espessura-textotext-decoration-thickness
decoracao-estilo-textotext-decoration-style
decoração-estilo-textotext-decoration-style
decoracao-linha-textotext-decoration-line
decoração-linha-textotext-decoration-line
decoracao-textotext-decoration
decoração-textotext-decoration
decoracao-texto-sublinhadotext-decoration-skip-ink
decoração-texto-sublinhadotext-decoration-skip-ink
definir-contadorcounter-set
design-tabelatable-layout
deslocamentooffset
deslocamento-em-ancoraoffset-anchor
deslocamento-em-âncoraoffset-anchor
deslocamento-texto-sublinhadotext-underline-offset
deslocar-contornooutline-offset
deslocar-pontuacaohanging-punctuation
deslocar-pontuaçãohanging-punctuation
direcaodirection
direçãodirection
direcao-animacaoanimation-direction
direção-animaçãoanimation-direction
distancia-deslocamentooffset-distance
distância-deslocamentooffset-distance
duracao-animacaoanimation-duration
duração-animaçãoanimation-duration
duracao-transicaotransition-duration
duração-transiçãotransition-duration
enfase-textotext-emphasis
ênfase-textotext-emphasis
escalascale
espacamentogap
espaçamentogap
espacamento-colunacolumn-gap
espaçamento-colunacolumn-gap
espacamento-coluna-em-gradegrid-column-gap
espaçamento-coluna-em-gradegrid-column-gap
espacamento-em-gradegrid-gap
espaçamento-em-gradegrid-gap
espacamento-fontefont-kerning
espaçamento-fontefont-kerning
espacamento-letrasletter-spacing
espaçamento-letrasletter-spacing
espacamento-linhasrow-gap
espaçamento-linhasrow-gap
espacamento-linha-em-gradegrid-row-gap
espaçamento-linha-em-gradegrid-row-gap
espacamento-palavrasword-spacing
espaçamento-palavrasword-spacing
espaco-bordaborder-spacing
espaço-bordaborder-spacing
espaco-em-brancowhite-space
espaço-em-brancowhite-space
espessura-fontefont-weight
esquema-corcolor-scheme
estender-borda-imagemborder-image-outset
estender-colunacolumn-span
esticar-fontefont-stretch
estilo-bordaborder-style
estilo-borda-direitaborder-right-style
estilo-borda-em-blocoborder-block-style
estilo-borda-em-linhaborder-inline-style
estilo-borda-esquerdaborder-left-style
estilo-borda-inferiorborder-bottom-style
estilo-borda-superiorborder-top-style
estilo-contornooutline-style
estilo-enfase-textotext-emphasis-style
estilo-ênfase-textotext-emphasis-style
estilo-fim-borda-em-blocoborder-block-end-style
estilo-fim-borda-em-linhaborder-inline-end-style
estilo-fontefont-style
estilo-inicio-borda-em-blocoborder-block-start-style
estilo-início-borda-em-blocoborder-block-start-style
estilo-inicio-borda-em-linhaborder-inline-start-style
estilo-início-borda-em-linhaborder-inline-start-style
estilo-listalist-style
estilo-lista-imagemlist-style-image
estilo-lista-posicaolist-style-position
estilo-lista-posiçãolist-style-position
estilo-lista-tipolist-style-type
eventos-ponteiropointer-events
exibicaodisplay
exibiçãodisplay
fatiar-borda-mascaramask-border-slice
fatiar-borda-máscaramask-border-slice
fatiar-imagem-bordaborder-image-slice
filtrofilter
filtro-fundobackdrop-filter
fim-borda-em-blocoborder-block-end
fim-borda-em-linhaborder-inline-end
fim-coluna-em-gradegrid-column-end
fim-linha-em-gradegrid-row-end
fixar-fundobackground-attachment
flexflex
flex-agruparflex-wrap
flex-comprimentoflex-basis
flex-crescimentoflex-grow
flex-direcaoflex-direction
flex-direçãoflex-direction
flex-fluxoflex-flow
flex-reduzirflex-shrink
flutuarfloat
fluxoclear
fluxo-em-gradegrid-auto-flow
fontefont
fonte-textofont-family
forma-externashape-outside
forma-margemshape-margin
fundobackground
girarrotate
gradegrid
hifenshyphens
hífenshyphens
imagem-bordaborder-image
imagem-fundobackground-image
imagem-mascaramask-image
imagem-máscaramask-image
impressao-ajuste-corprint-color-adjust
impressão-ajuste-corprint-color-adjust
incrementar-contadorcounter-increment
indentacao-textotext-indent
indentação-textotext-indent
indice-zz-index
índice-zz-index
inicio-borda-em-blocoborder-block-start
início-borda-em-blocoborder-block-start
inicio-borda-em-linhaborder-inline-start
início-borda-em-linhaborder-inline-start
inicio-borda-mascaramask-border-outset
início-borda-máscaramask-border-outset
inicio-coluna-em-gradegrid-column-start
início-coluna-em-gradegrid-column-start
inicio-insercao-em-blocoinset-block-start
início-inserção-em-blocoinset-block-start
inicio-insercao-em-linhainset-inline-start
início-inserção-em-linhainset-inline-start
inicio-linha-em-gradegrid-row-start
início-linha-em-gradegrid-row-start
inicio-margem-em-blocomargin-block-start
início-margem-em-blocomargin-block-start
inicio-margem-em-linhamargin-inline-start
início-margem-em-linhamargin-inline-start
inicio-recuo-em-blocopadding-block-start
início-recuo-em-blocopadding-block-start
inicio-recuo-em-linhapadding-inline-start
início-recuo-em-linhapadding-inline-start
insercaoinset
inserçãoinset
insercao-em-blocoinset-block
inserção-em-blocoinset-block
insercao-em-bloco-fiminset-block-end
inserção-em-bloco-fiminset-block-end
insercao-em-linhainset-inline
inserção-em-linhainset-inline
insercao-em-linha-fiminset-inline-end
inserção-em-linha-fiminset-inline-end
isolamentoisolation
justificar-conteudojustify-content
justificar-conteúdojustify-content
justificar-itensjustify-items
justificar-sejustify-self
justificar-textotext-justify
largurawidth
largura-barra-rolagemscrollbar-width
largura-bordaborder-width
largura-borda-direitaborder-right-width
largura-borda-em-blocoborder-block-width
largura-borda-em-linhaborder-inline-width
largura-borda-esquerdaborder-left-width
largura-borda-inferiorborder-bottom-width
largura-borda-mascaramask-border-width
largura-borda-máscaramask-border-width
largura-borda-superiorborder-top-width
largura-colunacolumn-width
largura-contornooutline-width
largura-fim-borda-em-blocoborder-block-end-width
largura-fim-borda-em-linhaborder-inline-end-width
largura-imagem-bordaborder-image-width
largura-inicio-borda-em-blocoborder-block-start-width
largura-início-borda-em-blocoborder-block-start-width
largura-inicio-borda-em-linhaborder-inline-start-width
largura-início-borda-em-linhaborder-inline-start-width
largura-maximamax-width
largura-máximamax-width
largura-minimamin-width
largura-mínimamin-width
limite-forma-imagemshape-image-threshold
linha-em-gradegrid-row
linhas-inferioresorphans
linhas-superioreswidows
margemmargin
margem-direitamargin-right
margem-direita-rolagem-mousescroll-margin-right
margem-em-blocomargin-block
margem-em-bloco-fimmargin-block-end
margem-em-bloco-rolagem-mousescroll-margin-block
margem-em-linhamargin-inline
margem-em-linha-fimmargin-inline-end
margem-em-linha-rolagem-mousescroll-margin-inline
margem-esquerdamargin-left
margem-esquerda-rolagem-mousescroll-margin-left
margem-inferiormargin-bottom
margem-inferior-rolagem-mousescroll-margin-bottom
margem-rolagem-mousescroll-margin
margem-superiormargin-top
margem-superior-rolagem-mousescroll-margin-top
mascaramask
máscaramask
mesclar-fundobackground-blend-mode
modelo-colunas-em-gradegrid-template-columns
modelo-em-gradegrid-template
modelo-geral-em-gradegrid-template-areas
modelo-linhas-em-gradegrid-template-rows
modo-borda-mascaramask-border-mode
modo-borda-máscaramask-border-mode
modo-escritawriting-mode
modo-mascaramask-mode
modo-máscaramask-mode
modo-mesclamix-blend-mode
modo-preenchimento-animacaoanimation-fill-mode
modo-preenchimento-animaçãoanimation-fill-mode
nome-animacaoanimation-name
nome-animaçãoanimation-name
opacidadeopacity
ordem-pinturapaint-order
ordenarorder
orientacao-imagemimage-orientation
orientação-imagemimage-orientation
orientacao-textotext-orientation
orientação-textotext-orientation
origem-borda-mascaramask-border-source
origem-borda-máscaramask-border-source
origem-fundobackground-origin
origem-imagem-bordaborder-image-source
origem-mascaramask-origin
origem-máscaramask-origin
origem-perspectivaperspective-origin
parar-encaixe-rolagem-mousescroll-snap-stop
perspectivaperspective
posicaoposition
posiçãoposition
posicao-deslocamentooffset-position
posição-deslocamentooffset-position
posicao-direitaright
posição-direitaright
posicao-enfase-textotext-emphasis-position
posição-ênfase-textotext-emphasis-position
posicao-esquerdaleft
posição-esquerdaleft
posicao-fundobackground-position
posição-fundobackground-position
posicao-horizontal-fundobackground-position-x
posição-horizontal-fundobackground-position-x
posicao-inferiorbottom
posição-inferiorbottom
posicao-legendacaption-side
posição-legendacaption-side
posicao-mascaramask-position
posição-máscaramask-position
posicao-objetoobject-position
posição-objetoobject-position
posicao-superiortop
posição-superiortop
posicao-texto-sublinhadotext-underline-position
posição-texto-sublinhadotext-underline-position
posicao-vertical-fundobackground-position-y
posição-vertical-fundobackground-position-y
posicionar-conteudoplace-content
posicionar-conteúdoplace-content
posicionar-itensplace-items
posicionar-seplace-self
preencher-colunacolumn-fill
proporcao-telaaspect-ratio
proporção-telaaspect-ratio
propriedade-transicaotransition-property
propriedade-transiçãotransition-property
quebra-decoracao-caixabox-decoration-break
quebra-decoração-caixabox-decoration-break
quebrar-antesbreak-before
quebrar-aposbreak-after
quebrar-apósbreak-after
quebrar-dentrobreak-inside
quebrar-linhaline-break
quebrar-pagina-antespage-break-before
quebrar-página-antespage-break-before
quebrar-pagina-apospage-break-after
quebrar-página-apóspage-break-after
quebrar-pagina-dentropage-break-inside
quebrar-página-dentropage-break-inside
quebrar-palavraword-break
raio-bordaborder-radius
raio-direito-borda-inferior border-bottom-right-radius
raio-direito-borda-superiorborder-top-right-radius
raio-esquerdo-borda-inferiorborder-bottom-left-radius
raio-esquerdo-borda-superiorborder-top-left-radius
recolher-bordaborder-collapse
recortarclip
recortar-fundobackground-clip
recortar-margem-vazadaoverflow-clip-margin
recuopadding
recuo-direitopadding-right
recuo-direito-rolagem-mousescroll-padding-right
recuo-em-blocopadding-block
recuo-em-bloco-fimpadding-block-end
recuo-em-bloco-rolagem-mousescroll-padding-block
recuo-em-linhapadding-inline
recuo-em-linha-fimpadding-inline-end
recuo-em-linha-rolagem-mousescroll-padding-inline
recuo-esquerdopadding-left
recuo-esquerdo-rolagem-mousescroll-padding-left
recuo-inferiorpadding-bottom
recuo-inferior-rolagem-mousescroll-padding-bottom
recuo-rolagem-mousescroll-padding
recuo-superiorpadding-top
recuo-superior-rolagem-mousescroll-padding-top
recursos-fontefont-feature-settings
redimensionarresize
regras-colunacolumn-rule
regras-cor-colunacolumn-rule-color
regras-estilo-colunacolumn-rule-style
regras-largura-colunacolumn-rule-width
reiniciar-contadorcounter-reset
reiniciar-tudoall
renderizacao-imagemimage-rendering
renderização-imagemimage-rendering
renderizacao-textotext-rendering
renderização-textotext-rendering
repeticao-borda-mascaramask-border-repeat
repetição-borda-máscaramask-border-repeat
repetir-animacaoanimation-iteration-count
repetir-animaçãoanimation-iteration-count
repetir-fundobackground-repeat
repetir-imagem-bordaborder-image-repeat
repetir-mascaramask-repeat
repetir-máscaramask-repeat
rotacao-deslocamentooffset-rotate
rotação-deslocamentooffset-rotate
selecao-usuariouser-select
seleção-usuariouser-select
sintetizar-fontefont-synthesis
sombra-caixabox-shadow
sombra-textotext-shadow
status-animacaoanimation-play-state
status-animaçãoanimation-play-state
substituir-idioma-fontefont-language-override
tabulacaotab-size
tabulaçãotab-size
tamanho-caixabox-sizing
tamanho-colunas-em-gradegrid-auto-columns
tamanho-em-blocoblock-size
tamanho-em-linhainline-size
tamanho-fontefont-size
tamanho-fundobackground-size
tamanho-gradegrid-area
tamanho-linhas-em-gradegrid-auto-rows
tamanho-mascaramask-size
tamanho-máscaramask-size
tamanho-maximo-em-blocomax-block-size
tamanho-máximo-em-blocomax-block-size
tamanho-maximo-em-linhamax-inline-size
tamanho-máximo-em-linhamax-inline-size
tamanho-minimo-em-blocomin-block-size
tamanho-mínimo-em-blocomin-block-size
tamanho-minimo-em-linhamin-inline-size
tamanho-mínimo-em-linhamin-inline-size
tamanho-optico-fontefont-optical-sizing
tamanho-óptico-fontefont-optical-sizing
tempo-transicaotransition-timing-function
tempo-transiçãotransition-timing-function
texto-bidirecionalunicode-bidi
tipo-encaixe-rolagem-mousescroll-snap-type
tipo-mascaramask-type
tipo-máscaramask-type
toque-telatouch-action
trajeto-deslocamentooffset-path
transformartransform
transformar-caixatransform-box
transformar-estilotransform-style
transformar-origemtransform-origin
transformar-textotext-transform
transicaotransition
transiçãotransition
variacao-fontefont-variant
variação-fontefont-variant
variacao-fonte-alternativafont-variant-alternates
variação-fonte-alternativafont-variant-alternates
variacao-fonte-asiaticafont-variant-east-asian
variação-fonte-asiáticafont-variant-east-asian
variacao-fonte-ligacaofont-variant-ligatures
variação-fonte-ligaçãofont-variant-ligatures
variacao-fonte-maiusculafont-variant-caps
variação-fonte-maiúsculafont-variant-caps
variacao-fonte-numericafont-variant-numeric
variação-fonte-numéricafont-variant-numeric
variacao-fonte-posicaofont-variant-position
variação-fonte-posiçãofont-variant-position
vazamentooverflow
vazamento-em-ancoraoverflow-anchor
vazamento-em-âncoraoverflow-anchor
vazamento-em-blocooverflow-block
vazamento-em-linhaoverflow-inline
vazamento-horizontaloverflow-x
vazamento-textotext-overflow
vazamento-verticaloverflow-y
velocidade-animacaoanimation-timing-function
velocidade-animaçãoanimation-timing-function
visibilidadevisibility
visibilidade-conteudocontent-visibility
visibilidade-conteúdocontent-visibility
visibilidade-fundobackface-visibility

Recursos para desenvolvedores

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

Quem já Contribuiu