swl-core 1.2.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.
@@ -0,0 +1,46 @@
1
+ const path = require("path");
2
+
3
+ class GraphEngine {
4
+ constructor() {
5
+ this.forward = new Map();
6
+ this.reverse = new Map();
7
+ }
8
+
9
+ update(filePath, source) {
10
+ const abs = path.resolve(filePath);
11
+ const dir = path.dirname(abs);
12
+ const imports = [...source.matchAll(/@importar\s+"([^"]+)"/g)]
13
+ .map(m => path.resolve(dir, m[1]));
14
+
15
+ this.removeRefs(abs);
16
+ this.forward.set(abs, imports);
17
+ imports.forEach(imp => {
18
+ if (!this.reverse.has(imp)) this.reverse.set(imp, new Set());
19
+ this.reverse.get(imp).add(abs);
20
+ });
21
+ }
22
+
23
+ getAffected(filePath) {
24
+ const root = path.resolve(filePath);
25
+ const visited = new Set();
26
+ const queue = [root];
27
+ const affected = [];
28
+ while (queue.length) {
29
+ const cur = queue.shift();
30
+ if (visited.has(cur)) continue;
31
+ visited.add(cur);
32
+ affected.push(cur);
33
+ (this.reverse.get(cur) || []).forEach(dep => queue.push(dep));
34
+ }
35
+ return affected;
36
+ }
37
+
38
+ removeRefs(abs) {
39
+ (this.forward.get(abs) || []).forEach(imp => {
40
+ const deps = this.reverse.get(imp);
41
+ if (deps) { deps.delete(abs); if (!deps.size) this.reverse.delete(imp); }
42
+ });
43
+ }
44
+ }
45
+
46
+ module.exports = GraphEngine;
package/package.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "swl-core",
3
+ "version": "1.2.0",
4
+ "description": "SWLS — Stellar Web Language Styling. Linguagem de estilização em português que compila para CSS.",
5
+ "main": "index.js",
6
+ "bin": {
7
+ "swls": "./bin/swls.js"
8
+ },
9
+ "scripts": {
10
+ "test": "node tests/compiler.test.js",
11
+ "postinstall": "node system/install-assets.js"
12
+ },
13
+ "keywords": ["css", "compiler", "swls", "stylesheet", "portuguese"],
14
+ "author": "",
15
+ "license": "MIT",
16
+ "dependencies": {
17
+ "ws": "^8.18.0"
18
+ },
19
+ "engines": {
20
+ "node": ">=16"
21
+ }
22
+ }
@@ -0,0 +1,44 @@
1
+ const { execSync } = require("child_process");
2
+ const fs = require("fs");
3
+ const path = require("path");
4
+
5
+ const root = path.resolve(__dirname, "..");
6
+ const xml = path.join(__dirname, "swls.xml");
7
+ const png = path.join(root, "icons", "swls.png");
8
+
9
+ function linux() {
10
+ const mimeDir = path.join(process.env.HOME, ".local/share/mime/packages");
11
+ const iconDir = path.join(process.env.HOME, ".local/share/icons/hicolor/512x512/mimetypes");
12
+ fs.mkdirSync(mimeDir, { recursive: true });
13
+ fs.mkdirSync(iconDir, { recursive: true });
14
+
15
+ fs.copyFileSync(xml, path.join(mimeDir, "swls.xml"));
16
+ if (fs.existsSync(png)) fs.copyFileSync(png, path.join(iconDir, "text-x-swls.png"));
17
+
18
+ try { execSync("update-mime-database ~/.local/share/mime", { stdio: "ignore" }); } catch {}
19
+ try { execSync("gtk-update-icon-cache ~/.local/share/icons/hicolor -f", { stdio: "ignore" }); } catch {}
20
+
21
+ console.log("✅ SWLS registrado no sistema (Linux).");
22
+ }
23
+
24
+ function windows() {
25
+ // Associação de extensão no registry via reg.exe
26
+ try {
27
+ execSync(`reg add "HKCU\\Software\\Classes\\.swls" /ve /d "swls_file" /f`, { stdio: "ignore" });
28
+ execSync(`reg add "HKCU\\Software\\Classes\\swls_file" /ve /d "SWLS Stylesheet" /f`, { stdio: "ignore" });
29
+ console.log("✅ SWLS registrado no sistema (Windows).");
30
+ } catch {
31
+ console.warn("⚠️ Registro Windows falhou. Tente executar como Administrador.");
32
+ }
33
+ }
34
+
35
+ function macos() {
36
+ // macOS reconhece via Info.plist em apps; para CLI apenas informa
37
+ console.log("✅ SWLS instalado (macOS). Use a extensão VS Code para reconhecimento visual.");
38
+ }
39
+
40
+ switch (process.platform) {
41
+ case "linux": linux(); break;
42
+ case "win32": windows(); break;
43
+ case "darwin": macos(); break;
44
+ }
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
3
+ <mime-type type="text/x-swls">
4
+ <comment>SWLS Stylesheet</comment>
5
+ <comment xml:lang="pt_BR">Arquivo de Estilização SWLS</comment>
6
+ <glob pattern="*.swls"/>
7
+ <icon name="text-x-swls"/>
8
+ </mime-type>
9
+ </mime-info>
@@ -0,0 +1,3 @@
1
+ node_modules/**
2
+ .vscode/**
3
+ *.swls
@@ -0,0 +1,14 @@
1
+ {
2
+ "iconDefinitions": {
3
+ "swls_file": {
4
+ "iconPath": "../icons/swls-icon.svg"
5
+ }
6
+ },
7
+ "file": "swls_file",
8
+ "fileExtensions": {
9
+ "swls": "swls_file"
10
+ },
11
+ "languageIds": {
12
+ "swls": "swls_file"
13
+ }
14
+ }
@@ -0,0 +1,11 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" style="stop-color:#0044cc"/>
5
+ <stop offset="100%" style="stop-color:#0066FF"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="64" height="64" rx="10" fill="url(#bg)"/>
9
+ <text x="32" y="42" font-family="monospace" font-weight="bold" font-size="22" fill="white" text-anchor="middle">SW</text>
10
+ <rect x="8" y="48" width="48" height="3" rx="1.5" fill="rgba(255,255,255,0.4)"/>
11
+ </svg>
@@ -0,0 +1,26 @@
1
+ {
2
+ "comments": {
3
+ "lineComment": "//",
4
+ "blockComment": ["/*", "*/"]
5
+ },
6
+ "brackets": [["(", ")"]],
7
+ "autoClosingPairs": [
8
+ { "open": "(", "close": ")" },
9
+ { "open": "\"", "close": "\"" },
10
+ { "open": "'", "close": "'" }
11
+ ],
12
+ "surroundingPairs": [
13
+ { "open": "(", "close": ")" },
14
+ { "open": "\"", "close": "\"" }
15
+ ],
16
+ "onEnterRules": [
17
+ {
18
+ "beforeText": "^\\s*\\(.+:\\s*$",
19
+ "action": { "indent": "indent" }
20
+ }
21
+ ],
22
+ "indentationRules": {
23
+ "increaseIndentPattern": "^\\s*\\(.+:$",
24
+ "decreaseIndentPattern": "^\\s*\\)$"
25
+ }
26
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "swls-language-support",
3
+ "displayName": "SWLS Language Support",
4
+ "description": "Suporte completo à linguagem SWLS: sintaxe, autocomplete, ícone e snippets.",
5
+ "version": "1.2.0",
6
+ "publisher": "swls-lang",
7
+ "icon": "icons/swls-icon.png",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/swls-lang/swls-core"
11
+ },
12
+ "engines": { "vscode": "^1.75.0" },
13
+ "categories": ["Programming Languages", "Snippets"],
14
+ "activationEvents": ["onLanguage:swls"],
15
+ "main": "./src/extension.js",
16
+ "contributes": {
17
+ "languages": [{
18
+ "id": "swls",
19
+ "aliases": ["SWLS", "swls", "Stellar Web Language Styling"],
20
+ "extensions": [".swls"],
21
+ "configuration": "./language-configuration.json",
22
+ "icon": {
23
+ "light": "./icons/swls-icon.png",
24
+ "dark": "./icons/swls-icon.png"
25
+ }
26
+ }],
27
+ "grammars": [{
28
+ "language": "swls",
29
+ "scopeName": "source.swls",
30
+ "path": "./syntaxes/swls.tmLanguage.json"
31
+ }],
32
+ "snippets": [{
33
+ "language": "swls",
34
+ "path": "./snippets/swls.json"
35
+ }],
36
+ "iconThemes": [{
37
+ "id": "swls-icons",
38
+ "label": "SWLS File Icons",
39
+ "path": "./icons/icon-theme.json"
40
+ }]
41
+ }
42
+ }
@@ -0,0 +1,120 @@
1
+ {
2
+ "Regra de Seletor": {
3
+ "prefix": ["regra", "selector", "("],
4
+ "body": ["(${1:seletor}:", "\t$0", ")"],
5
+ "description": "Bloco de regra SWLS"
6
+ },
7
+ "Componente": {
8
+ "prefix": ["componente", "@comp"],
9
+ "body": ["@componente ${1:nome}", "\t${2:propriedade} ${3:valor}", ")"],
10
+ "description": "Define um componente reutilizável"
11
+ },
12
+ "Componente com Herança": {
13
+ "prefix": ["componente-herda", "@herda"],
14
+ "body": ["@componente ${1:filho} herda ${2:pai}", "\t${3:propriedade} ${4:valor}", ")"],
15
+ "description": "Componente que herda de outro"
16
+ },
17
+ "Tema": {
18
+ "prefix": ["tema", "@tema"],
19
+ "body": ["@tema ${1:escuro}", "\t@${2:cor-fundo}: ${3:#121212}", ")"],
20
+ "description": "Bloco de tema com variáveis"
21
+ },
22
+ "Variável": {
23
+ "prefix": ["var", "@var"],
24
+ "body": ["@${1:nome}: ${2:valor}"],
25
+ "description": "Declara uma variável"
26
+ },
27
+ "Importar": {
28
+ "prefix": ["importar", "@importar"],
29
+ "body": ["@importar \"${1:caminho/arquivo.swls}\""],
30
+ "description": "Importa outro arquivo SWLS"
31
+ },
32
+ "Animação": {
33
+ "prefix": ["animar", "@animar"],
34
+ "body": [
35
+ "@animar ${1:nome-animacao}",
36
+ "de:",
37
+ "\t${2:propriedade} ${3:valor-inicio}",
38
+ "para:",
39
+ "\t${2:propriedade} ${4:valor-fim}"
40
+ ],
41
+ "description": "Define uma animação @keyframes"
42
+ },
43
+ "Media Query": {
44
+ "prefix": ["media", "@media"],
45
+ "body": [
46
+ "@media (max-width: ${1:768px})",
47
+ "\t(${2:seletor}:",
48
+ "\t\t${3:propriedade} ${4:valor}",
49
+ "\t)"
50
+ ],
51
+ "description": "Media query responsiva"
52
+ },
53
+ "Pseudo-estado Hover": {
54
+ "prefix": ["pairado", "&:hover"],
55
+ "body": ["&:pairado", "\t${1:propriedade} ${2:valor}"],
56
+ "description": "Estado :hover"
57
+ },
58
+ "Pseudo-estado Focus": {
59
+ "prefix": ["focado", "&:focus"],
60
+ "body": ["&:focado", "\t${1:propriedade} ${2:valor}"],
61
+ "description": "Estado :focus"
62
+ },
63
+ "Pseudo-estado Active": {
64
+ "prefix": ["ativo", "&:active"],
65
+ "body": ["&:ativo", "\t${1:propriedade} ${2:valor}"],
66
+ "description": "Estado :active"
67
+ },
68
+ "Display Flex": {
69
+ "prefix": ["dflex", "flex-container"],
70
+ "body": [
71
+ "exibicao flex",
72
+ "direcao ${1:linha}",
73
+ "justificacao ${2:centro}",
74
+ "alinhamento-item ${3:centro}"
75
+ ],
76
+ "description": "Container flexbox"
77
+ },
78
+ "Display Grid": {
79
+ "prefix": ["dgrid", "grid-container"],
80
+ "body": [
81
+ "exibicao grid",
82
+ "colunas ${1:repeat(3, 1fr)}",
83
+ "gap ${2:1rem}"
84
+ ],
85
+ "description": "Container grid"
86
+ },
87
+ "Centralizar": {
88
+ "prefix": ["centralizar", "center"],
89
+ "body": [
90
+ "exibicao flex",
91
+ "justificacao centro",
92
+ "alinhamento-item centro"
93
+ ],
94
+ "description": "Centralização flex"
95
+ },
96
+ "Reset Box": {
97
+ "prefix": ["reset", "box-reset"],
98
+ "body": [
99
+ "margem 0",
100
+ "padding 0",
101
+ "conteudo-caixa borda"
102
+ ],
103
+ "description": "Reset de box model"
104
+ },
105
+ "Transição suave": {
106
+ "prefix": ["transicao", "transition"],
107
+ "body": ["transicao ${1:all} ${2:0.3s} ${3:suave}"],
108
+ "description": "Transição CSS"
109
+ },
110
+ "Sombra de caixa": {
111
+ "prefix": ["sombra", "shadow"],
112
+ "body": ["sombra ${1:0 4px 12px rgba(0,0,0,0.15)}"],
113
+ "description": "Box shadow"
114
+ },
115
+ "Borda arredondada": {
116
+ "prefix": ["raio", "border-radius"],
117
+ "body": ["borda-raio ${1:8px}"],
118
+ "description": "Border radius"
119
+ }
120
+ }
@@ -0,0 +1,147 @@
1
+ const vscode = require("vscode");
2
+
3
+ // Propriedades da linguagem para autocomplete
4
+ const PROPERTIES = [
5
+ "fundo","bg","cor","text-cor","fonte","tamanho","peso","estilo",
6
+ "altura-linha","espacamento-letras","familia","decoracao","transformacao-texto","alinhamento-texto",
7
+ "largura","w","altura","h","max-largura","max-w","min-largura","min-w",
8
+ "max-altura","max-h","min-altura","min-h","proporcao-aspecto","aspecto",
9
+ "margem","m","margem-topo","mt","margem-direita","mr","margem-inferior","mb","margem-esquerda","ml",
10
+ "padding","p","padding-topo","pt","padding-direita","pr","padding-inferior","pb","padding-esquerda","pl",
11
+ "gap","alinhamento","alinhamento-vertical","alinhamento-item","alinhamento-conteudo","alinhamento-self",
12
+ "justificacao","exibicao","display","direcao","envolvimento",
13
+ "flex-crescimento","flex-encolhimento","flex-base","espacamento-item","flex",
14
+ "colunas","linhas","lacuna","auto-coloca","coluna-inicial","coluna-final","linha-inicial","linha-final",
15
+ "borda","borda-topo","borda-direita","borda-inferior","borda-esquerda",
16
+ "borda-raio","borda-cor","borda-estilo","borda-largura",
17
+ "posicao","pos","topo","top","direita","right","inferior","bottom","esquerda","left","indice-z","z",
18
+ "opacidade","sombra","sombra-texto","filtro","transformacao",
19
+ "backtamanho","backposicao","overflow","overflow-x","overflow-y",
20
+ "cursor","pointer-eventos","transicao","transicao-funcao","transicao-atraso","animar",
21
+ "outline","visibilidade","clip","objeto-fit","objeto-posicao","list-estilo",
22
+ "white-space","word-wrap","word-break","hifens","quebra-texto",
23
+ "mistura-modo","perspectiva","transformacao-origem","backface-visibilidade",
24
+ "conteudo-caixa","box-sizing","fundo-imagem","fundo-repetir","fundo-anexar",
25
+ "resize","coluna-conta","coluna-gap","coluna-regra","aparencia","user-select",
26
+ "scroll-comportamento","scroll-margem","scroll-padding",
27
+ ];
28
+
29
+ const DIRECTIVES = [
30
+ "@componente","@tema","@animar","@importar","@media",
31
+ ];
32
+
33
+ const PSEUDOS = [
34
+ "pairado","ativo","focado","visitado","desabilitado","marcado",
35
+ "primeiro-filho","ultimo-filho","primeiro","ultimo",
36
+ "preenchido","invalido","modo-escuro","modo-claro",
37
+ "focado-visivel","placeholder","antes","depois","selecao","sem-filhos","raiz",
38
+ ];
39
+
40
+ const VALUES = [
41
+ "nenhum","nenhuma","auto","herdado","inicial",
42
+ "bloco","inline","inline-bloco","flex","grid",
43
+ "linha","coluna","linha-reversa","coluna-reversa",
44
+ "envolver","envolver-reverso",
45
+ "centro","inicio","fim","distribuido","espacado","distribuido-uniformemente","esticado",
46
+ "esquerda","direita","justificado",
47
+ "relativa","absoluta","fixa","pegajosa","estatica",
48
+ "visivel","escondido","oculta",
49
+ "ponteiro","mao","nao-permitido","texto","movimento","normal",
50
+ "suave","suave-entrada","suave-saida","suave-entrada-saida","linear","infinito",
51
+ "solida","pontilhada","tracejada","dupla","redonda",
52
+ "cover","contain","fill","scale-down",
53
+ "underline","overline","line-through","maiuscula","minuscula","capitalizar",
54
+ "nowrap","pre","pre-wrap","break-word","break-all",
55
+ // cores
56
+ "branco","preto","cinza","cinza-claro","cinza-escuro",
57
+ "vermelho","azul","azul-claro","azul-escuro","verde","verde-claro",
58
+ "amarelo","laranja","roxo","violeta","rosa","marrom","ouro","prata",
59
+ "transparente","ciano","magenta",
60
+ ];
61
+
62
+ function makeItem(label, kind, detail) {
63
+ const item = new vscode.CompletionItem(label, kind);
64
+ item.detail = detail;
65
+ return item;
66
+ }
67
+
68
+ function activate(context) {
69
+ // Provider de propriedades e valores
70
+ const propProvider = vscode.languages.registerCompletionItemProvider(
71
+ "swls",
72
+ {
73
+ provideCompletionItems(doc, pos) {
74
+ const line = doc.lineAt(pos).text.trimStart();
75
+ const items = [];
76
+
77
+ // Se a linha está vazia ou tem apenas uma palavra → sugerir propriedades
78
+ if (!line.includes(" ") || pos.character <= line.indexOf(" ") + 1) {
79
+ PROPERTIES.forEach(p => {
80
+ items.push(makeItem(p, vscode.CompletionItemKind.Property, "Propriedade SWLS"));
81
+ });
82
+ DIRECTIVES.forEach(d => {
83
+ items.push(makeItem(d, vscode.CompletionItemKind.Keyword, "Diretiva SWLS"));
84
+ });
85
+ }
86
+
87
+ // Se já tem uma propriedade → sugerir valores
88
+ if (line.includes(" ")) {
89
+ VALUES.forEach(v => {
90
+ items.push(makeItem(v, vscode.CompletionItemKind.Value, "Valor SWLS"));
91
+ });
92
+ }
93
+
94
+ return items;
95
+ },
96
+ },
97
+ " ", "\t"
98
+ );
99
+
100
+ // Provider de pseudo-estados
101
+ const pseudoProvider = vscode.languages.registerCompletionItemProvider(
102
+ "swls",
103
+ {
104
+ provideCompletionItems(doc, pos) {
105
+ const line = doc.lineAt(pos).text;
106
+ if (!line.includes("&:")) return [];
107
+ return PSEUDOS.map(p =>
108
+ makeItem(p, vscode.CompletionItemKind.Event, "Pseudo-estado SWLS")
109
+ );
110
+ },
111
+ },
112
+ ":"
113
+ );
114
+
115
+ // Hover para mostrar o equivalente CSS
116
+ const CSS_MAP = {
117
+ fundo:"background-color", bg:"background-color", cor:"color",
118
+ largura:"width", altura:"height", margem:"margin", padding:"padding",
119
+ posicao:"position", exibicao:"display", opacidade:"opacity",
120
+ sombra:"box-shadow", transicao:"transition", transformacao:"transform",
121
+ borda:"border", "borda-raio":"border-radius", cursor:"cursor",
122
+ fonte:"font", tamanho:"font-size", peso:"font-weight", familia:"font-family",
123
+ gap:"gap", colunas:"grid-template-columns", justificacao:"justify-content",
124
+ "alinhamento-item":"align-items", direcao:"flex-direction",
125
+ };
126
+
127
+ const hoverProvider = vscode.languages.registerHoverProvider("swls", {
128
+ provideHover(doc, pos) {
129
+ const range = doc.getWordRangeAtPosition(pos, /[\w-]+/);
130
+ if (!range) return;
131
+ const word = doc.getText(range);
132
+ const css = CSS_MAP[word];
133
+ if (css) {
134
+ return new vscode.Hover([
135
+ `**SWLS** \`${word}\``,
136
+ `→ CSS: \`${css}\``,
137
+ ]);
138
+ }
139
+ },
140
+ });
141
+
142
+ context.subscriptions.push(propProvider, pseudoProvider, hoverProvider);
143
+ }
144
+
145
+ function deactivate() {}
146
+
147
+ module.exports = { activate, deactivate };
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "SWLS",
3
+ "scopeName": "source.swls",
4
+ "fileTypes": ["swls"],
5
+ "patterns": [
6
+ { "include": "#comment-line" },
7
+ { "include": "#comment-block" },
8
+ { "include": "#directive-structural" },
9
+ { "include": "#directive-variable" },
10
+ { "include": "#pseudo-element" },
11
+ { "include": "#rule-selector" },
12
+ { "include": "#frame-keyframe" },
13
+ { "include": "#property-line" },
14
+ { "include": "#block-delimiters" }
15
+ ],
16
+ "repository": {
17
+ "comment-line": {
18
+ "match": "//.*$",
19
+ "name": "comment.line.double-slash.swls"
20
+ },
21
+ "comment-block": {
22
+ "begin": "/\\*",
23
+ "end": "\\*/",
24
+ "name": "comment.block.swls"
25
+ },
26
+ "directive-structural": {
27
+ "match": "^\\s*@(componente|tema|animar|importar|media)\\b",
28
+ "captures": {
29
+ "1": { "name": "keyword.control.directive.swls" }
30
+ }
31
+ },
32
+ "directive-variable": {
33
+ "match": "^\\s*(@[\\w-]+)\\s*(:)\\s*(.+)$",
34
+ "captures": {
35
+ "1": { "name": "variable.other.swls" },
36
+ "2": { "name": "punctuation.separator.swls" },
37
+ "3": { "name": "string.unquoted.swls" }
38
+ }
39
+ },
40
+ "pseudo-element": {
41
+ "match": "(&:)(pairado|ativo|focado|visitado|desabilitado|marcado|primeiro-filho|ultimo-filho|primeiro|ultimo|preenchido|invalido|modo-escuro|modo-claro|focado-visivel|placeholder|antes|depois|selecao|sem-filhos|raiz|[\\w-]+)",
42
+ "captures": {
43
+ "1": { "name": "punctuation.definition.entity.swls" },
44
+ "2": { "name": "entity.other.attribute-name.pseudo.swls" }
45
+ }
46
+ },
47
+ "rule-selector": {
48
+ "match": "^\\s*\\((.+):$",
49
+ "captures": {
50
+ "1": { "name": "entity.name.tag.selector.swls" }
51
+ }
52
+ },
53
+ "frame-keyframe": {
54
+ "match": "^\\s*(de|para|\\d+%)(:)$",
55
+ "captures": {
56
+ "1": { "name": "keyword.other.frame.swls" },
57
+ "2": { "name": "punctuation.swls" }
58
+ }
59
+ },
60
+ "property-line": {
61
+ "match": "^\\s*(fundo|bg|cor|text-cor|fonte|tamanho|peso|estilo|altura-linha|espacamento-letras|familia|decoracao|transformacao-texto|alinhamento-texto|largura|w|altura|h|max-largura|max-w|min-largura|min-w|max-altura|max-h|min-altura|min-h|proporcao-aspecto|aspecto|margem|m|margem-topo|mt|margem-direita|mr|margem-inferior|mb|margem-esquerda|ml|padding|p|padding-topo|pt|padding-direita|pr|padding-inferior|pb|padding-esquerda|pl|gap|alinhamento|alinhamento-vertical|alinhamento-item|alinhamento-conteudo|alinhamento-self|justificacao|exibicao|display|direcao|envolvimento|flex-crescimento|flex-encolhimento|flex-base|espacamento-item|flex|colunas|linhas|lacuna|auto-coloca|coluna-inicial|coluna-final|linha-inicial|linha-final|borda|borda-topo|borda-direita|borda-inferior|borda-esquerda|borda-raio|borda-cor|borda-estilo|borda-largura|posicao|pos|topo|top|direita|right|inferior|bottom|esquerda|left|indice-z|z|opacidade|sombra|sombra-texto|filtro|transformacao|backtamanho|backposicao|overflow|overflow-x|overflow-y|cursor|pointer-eventos|transicao|transicao-funcao|transicao-atraso|animar|outline|visibilidade|clip|objeto-fit|objeto-posicao|list-estilo|white-space|word-wrap|word-break|hifens|quebra-texto|mistura-modo|perspectiva|transformacao-origem|backface-visibilidade|conteudo-caixa|box-sizing|fundo-imagem|fundo-repetir|fundo-anexar|fundo-origem|fundo-clip|resize|coluna-conta|coluna-gap|coluna-regra|linha-clamp|aparencia|user-select|scroll-comportamento|scroll-margem|scroll-padding)\\s+(.+)$",
62
+ "captures": {
63
+ "1": { "name": "support.type.property-name.swls" },
64
+ "2": { "name": "string.unquoted.value.swls" }
65
+ }
66
+ },
67
+ "block-delimiters": {
68
+ "match": "^\\s*[()]$",
69
+ "name": "punctuation.section.block.swls"
70
+ }
71
+ }
72
+ }