pyfrontkit 1.0.56__py3-none-any.whl

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.
Files changed (32) hide show
  1. pyfrontkit/__init__.py +87 -0
  2. pyfrontkit/block.py +280 -0
  3. pyfrontkit/content.py +67 -0
  4. pyfrontkit/css/__init__.py +30 -0
  5. pyfrontkit/css/create_color/__init__.py +11 -0
  6. pyfrontkit/css/create_color/colors_templates/__init__.py +28 -0
  7. pyfrontkit/css/create_color/colors_templates/asimetric_template.py +19 -0
  8. pyfrontkit/css/create_color/colors_templates/classic_reverse_template.py +19 -0
  9. pyfrontkit/css/create_color/colors_templates/classic_template.py +22 -0
  10. pyfrontkit/css/create_color/colors_templates/dark_reverse_template.py +19 -0
  11. pyfrontkit/css/create_color/colors_templates/darkness_template.py +26 -0
  12. pyfrontkit/css/create_color/colors_templates/enfasis_main_template.py +19 -0
  13. pyfrontkit/css/create_color/colors_templates/mono_accent_template.py +28 -0
  14. pyfrontkit/css/create_color/colors_templates/mono_template.py +19 -0
  15. pyfrontkit/css/create_color/colors_templates/simple_template.py +23 -0
  16. pyfrontkit/css/create_color/colors_templates/soft_template.py +20 -0
  17. pyfrontkit/css/create_color/colors_templates/total_template.py +24 -0
  18. pyfrontkit/css/create_color/colors_templates/total_v2_template.py +26 -0
  19. pyfrontkit/css/create_color/create_colors.py +243 -0
  20. pyfrontkit/css/create_color/palettes.py +254 -0
  21. pyfrontkit/css/fonts.py +160 -0
  22. pyfrontkit/css_register.py +172 -0
  23. pyfrontkit/dom.py +102 -0
  24. pyfrontkit/html_doc.py +202 -0
  25. pyfrontkit/special.py +192 -0
  26. pyfrontkit/style_manager.py +63 -0
  27. pyfrontkit/tags.py +115 -0
  28. pyfrontkit/void_element.py +114 -0
  29. pyfrontkit-1.0.56.dist-info/METADATA +238 -0
  30. pyfrontkit-1.0.56.dist-info/RECORD +32 -0
  31. pyfrontkit-1.0.56.dist-info/WHEEL +5 -0
  32. pyfrontkit-1.0.56.dist-info/top_level.txt +1 -0
pyfrontkit/__init__.py ADDED
@@ -0,0 +1,87 @@
1
+ # ----------------------------------------------------------------------
2
+ # Package Configuration
3
+ # ----------------------------------------------------------------------
4
+ __version__ = "1.0.56"
5
+ __author__ = "Eduardo Antonio Ferrera Rodriguez"
6
+ __license__ = "GPLv3"
7
+
8
+ # ----------------------------------------------------------------------
9
+ # Expose CSS submodule
10
+ # ----------------------------------------------------------------------
11
+ from . import css
12
+
13
+ # Expose CreateColor directly
14
+ from .css import CreateColor
15
+ from .css import CreateWithColor
16
+ from .css.fonts import CreateFont
17
+ from .css.fonts import FooterFont
18
+ from .css.fonts import HeaderFont
19
+ from .css.fonts import MainFont
20
+ # ----------------------------------------------------------------------
21
+ # Core modules
22
+ # ----------------------------------------------------------------------
23
+ from .html_doc import HtmlDoc
24
+ from .css_register import CSSRegistry
25
+ from .block import Block
26
+
27
+ # ----------------------------------------------------------------------
28
+ # Tags
29
+ # ----------------------------------------------------------------------
30
+ from .tags import (
31
+ Div, Section, Article, Header, Footer, Nav, Main, Aside, Button, Form, Ul, Li, A,
32
+ div, section, article, header, footer, nav, main, aside,
33
+ button, form, ul, li, a
34
+ )
35
+
36
+ # ----------------------------------------------------------------------
37
+ # Void elements
38
+ # ----------------------------------------------------------------------
39
+ from .void_element import (
40
+ VoidElement, Img, Input, Hr, Meta, Link, Source, Embed, Param, Track,
41
+ Wbr, Area, Base, Col,
42
+ img, Input, hr, meta, link, source, embed, param, track,
43
+ wbr, area, base, col
44
+ )
45
+
46
+ # ----------------------------------------------------------------------
47
+ # Special containers
48
+ # ----------------------------------------------------------------------
49
+ from .special import (
50
+ Video, Audio, Picture, ObjectElement,
51
+ video, audio, picture, Object
52
+ )
53
+
54
+ # ----------------------------------------------------------------------
55
+ # Public API
56
+ # ----------------------------------------------------------------------
57
+ __all__ = [
58
+ # CSS
59
+ "css",
60
+ "CreateColor",
61
+ "CreateWithColor",
62
+ "CreateFont",
63
+ "FooterFont",
64
+ "HeaderFont",
65
+ "MainFont",
66
+
67
+ # Core
68
+ "HtmlDoc",
69
+ "CSSRegistry",
70
+ "Block",
71
+
72
+ # Tags
73
+ "Div", "Section", "Article", "Header", "Footer", "Nav", "Main", "Aside",
74
+ "Button", "Form", "Ul", "Li", "A",
75
+ "div", "section", "article", "header", "footer", "nav", "main", "aside",
76
+ "button", "form", "ul", "li", "a",
77
+
78
+ # Void elements
79
+ "VoidElement", "Img", "Input", "Hr", "Meta", "Link", "Source",
80
+ "Embed", "Param", "Track", "Wbr", "Area", "Base", "Col",
81
+ "img", "input", "hr", "meta", "link", "source", "embed",
82
+ "param", "track", "wbr", "area", "base", "col",
83
+
84
+ # Special containers
85
+ "Video", "Audio", "Picture", "ObjectElement",
86
+ "video", "audio", "picture", "Object",
87
+ ]
pyfrontkit/block.py ADDED
@@ -0,0 +1,280 @@
1
+ # Copyright (C) [2025] Eduardo Antonio Ferrera Rodríguez
2
+ #
3
+ # This program is free software: you can redistribute it and/or modify it
4
+ # under the terms of the GNU General Public License as published by the
5
+ # Free Software Foundation, either version 3 of the License, or any later version.
6
+ #
7
+ # This program is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY. See the COPYING file for more details.
9
+
10
+
11
+ # pyfrontkit/block.py
12
+
13
+ from .content import ContentFactory
14
+ from .css_register import CSSRegistry
15
+ from typing import Any
16
+
17
+ # Global whitelist of valid HTML attributes
18
+ VALID_HTML_ATTRS = {
19
+ "id", "class", "class_", "style", "title", "alt", "src", "href", "target",
20
+ "type", "name", "value", "disabled", "checked", "readonly", "placeholder",
21
+ }
22
+
23
+ # Optional tag-specific whitelist
24
+ TAG_SPECIFIC_ATTRS = {
25
+ "a": {"href", "target", "rel", "title"},
26
+ "img": {"src", "alt", "title"},
27
+ "input": {"type", "name", "value", "placeholder", "checked", "disabled", "readonly"},
28
+ "button": {"type", "name", "value", "disabled"},
29
+ }
30
+
31
+ class Block:
32
+ """
33
+ Base element for container tags (div, section, article, etc.)
34
+ - Processes and validates HTML attributes (id, class_, style, etc.)
35
+ - Processes ctn_* into ContentItem (via ContentFactory)
36
+ - Registers in DOM if an id is present
37
+ - Allows adding children only if an id is present
38
+ - All blocks are registered globally to respect creation order
39
+ """
40
+
41
+ _registry = []
42
+
43
+ def __init__(self, tag: str, *children: Any, _parent=None, **kwargs):
44
+ self.tag = tag
45
+ self._parent = _parent
46
+
47
+ # Extract and validate attributes
48
+ self.attrs = self._extract_attributes(kwargs)
49
+
50
+ # CTN content items
51
+ self.content_items = ContentFactory.create_from_kwargs(**kwargs)
52
+
53
+ # Initial children
54
+ self.children = []
55
+ for ch in children:
56
+ self.add_child(ch)
57
+
58
+ # Register in DOM if id exists
59
+ block_id = self.attrs.get("id")
60
+ if block_id:
61
+
62
+ from .dom import DOM
63
+ DOM.register(block_id, self)
64
+
65
+
66
+ Block._registry.append(self)
67
+
68
+
69
+
70
+
71
+ # ------------------------------
72
+ # Attribute extraction and validation
73
+ # ------------------------------
74
+ def _extract_attributes(self, kwargs: dict) -> dict:
75
+ attrs = {}
76
+ for key, value in kwargs.items():
77
+ if ContentFactory.is_ctn_key(key):
78
+ continue
79
+
80
+ # Normalize class_
81
+ if key == "class_":
82
+ key = "class"
83
+
84
+ # Always allow 'style'
85
+ if key == "style":
86
+ if value not in (None, False):
87
+ attrs[key] = value
88
+ continue
89
+
90
+ # Validate against global list
91
+ if key not in VALID_HTML_ATTRS:
92
+ print(f"⚠️ Warning: '{key}' is not a valid HTML attribute for <{self.tag}>")
93
+ continue
94
+
95
+ # Validate against tag-specific list
96
+ allowed_tag_attrs = TAG_SPECIFIC_ATTRS.get(self.tag, set())
97
+ if allowed_tag_attrs and key not in allowed_tag_attrs and key not in ("id", "class"):
98
+ print(f"⚠️ Warning: '{key}' is not valid for <{self.tag}>")
99
+ continue
100
+
101
+ # Boolean attributes
102
+ if value is True:
103
+ attrs[key] = None
104
+ elif value not in (None, False):
105
+ attrs[key] = value
106
+ return attrs
107
+
108
+ # ------------------------------
109
+ # Adding children
110
+ # ------------------------------
111
+ def add_child(self, *children):
112
+ if not self.attrs.get("id"):
113
+ raise RuntimeError(f"The <{self.tag}> block does not have an id; it cannot contain children.")
114
+
115
+ for ch in children:
116
+ if isinstance(ch, (list, tuple)):
117
+ for sub in ch:
118
+ self._attach_child(sub)
119
+ else:
120
+ self._attach_child(ch)
121
+
122
+ def _attach_child(self, child):
123
+ if isinstance(child, Block):
124
+ child._parent = self
125
+
126
+
127
+ if hasattr(child, "render"):
128
+ self.children.append(child)
129
+
130
+ if isinstance(child, Block):
131
+
132
+ child_id = child.attrs.get("id")
133
+ if child_id:
134
+ from .dom import DOM
135
+ DOM.register(child_id, child)
136
+
137
+
138
+ else:
139
+
140
+ from .content import ContentItem
141
+ ci = ContentItem("p", str(child))
142
+ self.content_items.append(ci)
143
+
144
+
145
+
146
+ def _render_opening_tag(self, indent: int) -> str:
147
+ space = " " * indent
148
+ attr_text = ""
149
+ for key, value in self.attrs.items():
150
+ if value is None:
151
+ attr_text += f" {key}"
152
+ else:
153
+ attr_text += f' {key}="{value}"'
154
+ return f"{space}<{self.tag}{attr_text}>\n"
155
+
156
+ def _render_closing_tag(self, indent: int) -> str:
157
+ space = " " * indent
158
+ return f"{space}</{self.tag}>\n"
159
+
160
+ def _render_content(self, indent: int) -> str:
161
+ html = ""
162
+ for item in self.content_items:
163
+ html += item.render(indent + 2)
164
+ for child in self.children:
165
+ html += child.render(indent + 2)
166
+ return html
167
+
168
+ def render(self, indent: int = 0) -> str:
169
+ html = self._render_opening_tag(indent)
170
+ html += self._render_content(indent)
171
+ html += self._render_closing_tag(indent)
172
+ return html
173
+
174
+ def __str__(self):
175
+ return self.render(0)
176
+
177
+ def _get_main_selector(self):
178
+ """
179
+ Returns the strongest selector based on priority:
180
+ id > class > tag
181
+
182
+ Also returns the selector type for internal logic.
183
+ """
184
+ if self.attrs.get("id"):
185
+ return f"#{self.attrs['id']}", "id"
186
+
187
+ elif self.attrs.get("class"):
188
+ return f".{self.attrs['class']}", "class"
189
+
190
+ else:
191
+ return self.tag, "tag"
192
+
193
+
194
+ def align(self, orientation=None, gap=None, padding=None, grid_column=None):
195
+ if orientation is None:
196
+ print("The method align() requires the 'orientation' parameter")
197
+ return self
198
+
199
+ if orientation not in ("column", "row", "grid"):
200
+ print("align(): invalid orientation. Use 'column', 'row' or 'grid'")
201
+ return self
202
+
203
+ if orientation == "grid" and not grid_column:
204
+ print("align(): 'grid_column' is required when orientation='grid'")
205
+ return self
206
+
207
+ selector, _ = self._get_main_selector()
208
+
209
+ templates = {
210
+ "column": '''
211
+ display: flex;
212
+ flex-direction: column;
213
+ width: 100%;
214
+ {gap}
215
+ {padding}
216
+ ''',
217
+ "row": '''
218
+ display: flex;
219
+ flex-direction: row;
220
+ flex-wrap: wrap;
221
+ {padding}
222
+ {gap}
223
+ ''',
224
+ "grid": '''
225
+ display: grid;
226
+ grid-template-columns: repeat({grid_column}, 1fr);
227
+ {gap}
228
+ {padding}
229
+ '''
230
+ }
231
+
232
+ gap_text = f"gap: {gap};" if gap else ""
233
+ padding_text = f"padding: {padding};" if padding else ""
234
+
235
+ template = templates[orientation]
236
+ css_text = template.format(
237
+ gap=gap_text,
238
+ padding=padding_text,
239
+ grid_column=grid_column if grid_column else "1"
240
+ )
241
+
242
+ from .style_manager import CSS_RULES_STYLE
243
+ CSS_RULES_STYLE.append({selector: {"css": css_text}})
244
+
245
+ return self
246
+
247
+ def form(self, width=None, height=None, border_radius=None):
248
+ """
249
+ Set the size and shape of the Block container.
250
+
251
+ Parameters:
252
+ width (str): container width (e.g., '200px', '50%')
253
+ height (str): container height (e.g., '100px', 'auto')
254
+ border_radius (str): container shape (e.g., '0', '10px', '50%')
255
+ """
256
+ # ------------------------------
257
+ # Get main selector
258
+ # ------------------------------
259
+ selector, _ = self._get_main_selector()
260
+
261
+ # ------------------------------
262
+ # Build CSS lines
263
+ # ------------------------------
264
+ css_lines = []
265
+ if width:
266
+ css_lines.append(f"width: {width};")
267
+ if height:
268
+ css_lines.append(f"height: {height};")
269
+ if border_radius:
270
+ css_lines.append(f"border-radius: {border_radius};")
271
+
272
+ css_text = "\n".join(css_lines)
273
+
274
+ # ------------------------------
275
+ # Save to global style list
276
+ # ------------------------------
277
+ from .style_manager import CSS_RULES_STYLE
278
+ CSS_RULES_STYLE.append({selector: {"css": css_text}})
279
+
280
+ return self
pyfrontkit/content.py ADDED
@@ -0,0 +1,67 @@
1
+
2
+ # Copyright (C) [2025] Eduardo Antonio Ferrera Rodríguez
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify it
5
+ # under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; see the COPYING file for more details.
10
+
11
+
12
+ # pyfrontkit/content.py
13
+
14
+ class ContentItem:
15
+ """
16
+ Represents a simple content element:
17
+ <tag>text</tag>
18
+
19
+ Supports Python newline (\n) conversion into <br /> automatically.
20
+ """
21
+
22
+ def __init__(self, tag: str, text: str):
23
+ self.tag = tag
24
+ self.lines = text.split("\n") # split text by newline
25
+
26
+ def render(self, indent: int = 0):
27
+ space = " " * indent
28
+ html = f"{space}<{self.tag}>"
29
+ for i, line in enumerate(self.lines):
30
+ html += line
31
+ if i < len(self.lines) - 1:
32
+ html += "<br />"
33
+ html += f"</{self.tag}>\n"
34
+ return html
35
+
36
+
37
+ class ContentFactory:
38
+ """
39
+ Responsible for creating ContentItem objects from keys like 'ctn_p', 'ctn_h1', etc.
40
+ """
41
+
42
+ # Official list of supported tags
43
+ SUPPORTED_TAGS = {
44
+ "p", "span",
45
+ "b", "strong", "i", "u", "em", "small", "mark", "code",
46
+ "h1", "h2", "h3", "h4", "h5", "h6"
47
+ }
48
+
49
+ @classmethod
50
+ def is_ctn_key(cls, key: str) -> bool:
51
+ """Checks if the key follows the 'ctn_tag' pattern."""
52
+ return key.startswith("ctn_") and key[4:] in cls.SUPPORTED_TAGS
53
+
54
+ @classmethod
55
+ def create_from_kwargs(cls, **kwargs):
56
+ """
57
+ Processes kwargs and returns a list of ContentItem.
58
+ Example: ctn_p="hello" → ContentItem("p", "hello")
59
+ """
60
+ items = []
61
+
62
+ for key, value in kwargs.items():
63
+ if cls.is_ctn_key(key):
64
+ tag = key[4:] # remove 'ctn_'
65
+ items.append(ContentItem(tag, value))
66
+
67
+ return items
@@ -0,0 +1,30 @@
1
+ # pyfrontkit/css/__init__.py
2
+
3
+ """
4
+ CSS module for PyFrontKit.
5
+
6
+ Exports:
7
+ - CreateColor class
8
+ - palettes
9
+ - colors_templates
10
+ """
11
+
12
+ # expose the create_color package
13
+ from .create_color import CreateColor
14
+ from .create_color import CreateWithColor
15
+ from .create_color import palettes
16
+ from .create_color import colors_templates
17
+ from .fonts import CreateFont
18
+ from .fonts import FooterFont
19
+ from .fonts import HeaderFont
20
+ from .fonts import MainFont
21
+ __all__ = [
22
+ "FooterFont",
23
+ "HeaderFont",
24
+ "MainFont",
25
+ "CreateFont",
26
+ "CreateColor",
27
+ "CreateWithColor",
28
+ "palettes",
29
+ "colors_templates",
30
+ ]
@@ -0,0 +1,11 @@
1
+ # pyfrontkit/css/create_color/__init__.py
2
+
3
+ # Expose CreateColor
4
+ from .create_colors import CreateColor
5
+ from .create_colors import CreateWithColor
6
+
7
+ # Expose palettes dictionary
8
+ from .palettes import *
9
+
10
+
11
+ from .colors_templates import *
@@ -0,0 +1,28 @@
1
+ from .simple_template import simple
2
+ from .classic_template import classic
3
+ from .dark_reverse_template import dark_reverse
4
+ from .mono_template import mono
5
+ from .enfasis_main_template import enfasis_main
6
+ from .soft_template import soft
7
+ from .classic_reverse_template import classic_reverse
8
+ from .asimetric_template import asimetric
9
+ from .total_template import total
10
+ from .darkness_template import darkness
11
+ from .mono_accent_template import mono_accent
12
+ from .total_v2_template import total_v2
13
+
14
+
15
+ __all__ = [
16
+ "simple",
17
+ "classic",
18
+ "dark_reverse",
19
+ "mono",
20
+ "enfasis_main",
21
+ "soft",
22
+ "classic_reverse",
23
+ "asimetric",
24
+ "total",
25
+ "darkness",
26
+ "mono_accent",
27
+ "total_v2"
28
+ ]
@@ -0,0 +1,19 @@
1
+ asimetric = {
2
+ "simple_selector": {
3
+ "body": {"color": "black", "background-color": "quaternary"},
4
+ "header": {"color": "principal", "background-color": "quaternary"},
5
+ "footer": {"color": "white", "background-color": "secondary"},
6
+ "text_htags": {"color": "principal"},
7
+ "h3": {"color": "principal"},
8
+ "h4": {"color": "principal"},
9
+ "button": {"color": "white", "background-color": "secondary"}
10
+ },
11
+
12
+ "doble_selector": {
13
+ "header>text_tags": {"color":"black"},
14
+ "footer>text_tags": {"color": "white"},
15
+ "header>button": {"color": "white", "background-color": "principal"}
16
+ },
17
+
18
+ "triple_selector": {}
19
+ }
@@ -0,0 +1,19 @@
1
+ classic_reverse = {
2
+ "simple_selector": {
3
+ "body": {"color": "white", "background-color": "principal"},
4
+ "header": {"color": "black", "background-color": "quaternary"},
5
+ "footer": {"color": "white", "background-color": "secondary"},
6
+ "text_htags": {"color": "quaternary"},
7
+ "h3": {"color": "quaternary"},
8
+ "h4": {"color": "quaternary"},
9
+ "button": {"color": "black", "background-color": "quaternary"}
10
+ },
11
+
12
+ "doble_selector": {
13
+ "header>text_tags": {"color":"black"},
14
+ "footer>text_tags": {"color": "white"},
15
+ "header>button": {"color": "white", "background-color": "principal"}
16
+ },
17
+
18
+ "triple_selector": {}
19
+ }
@@ -0,0 +1,22 @@
1
+
2
+ classic = {
3
+ "simple_selector": {
4
+ "body": {"color": "black", "background-color": "quaternary"},
5
+ "header": {"color": "quaternary", "background-color": "principal"},
6
+ "footer": {"color": "quaternary", "background-color": "secondary"},
7
+ "text_htags": {"color": "principal"},
8
+ "h3": {"color": "secondary"},
9
+ "h4": {"color": "secondary"},
10
+ "button": {"color": "white", "background-color": "principal"}
11
+ },
12
+
13
+ "doble_selector": {
14
+ "header>text_tags": {"color":"white"},
15
+ "header>text_htags":{"color":"white"},
16
+ "header>button":{"color":"white","background-color":"secondary"},
17
+ "footer>text_tags": {"color": "white"},
18
+ "footer>text_htags": {"color": "white"}
19
+ },
20
+
21
+ "triple_selector": {}
22
+ }
@@ -0,0 +1,19 @@
1
+ dark_reverse = {
2
+ "simple_selector": {
3
+ "body": {"color": "white", "background-color": "secondary"},
4
+ "header": {"color": "white", "background-color": "principal"},
5
+ "footer": {"color": "white", "background-color": "principal"},
6
+ "text_htags": {"color": "quaternary"},
7
+ "h3": {"color": "quaternary"},
8
+ "h4": {"color": "quaternary"},
9
+ "button": {"color": "black", "background-color": "quaternary"}
10
+ },
11
+
12
+ "doble_selector": {
13
+ "header>text_tags": {"color":"white"},
14
+ "footer>text_tags": {"color": "white"},
15
+ "footer>button": {"color": "black", "background-color": "quaternary"}
16
+ },
17
+
18
+ "triple_selector": {}
19
+ }
@@ -0,0 +1,26 @@
1
+ darkness = {
2
+ "simple_selector": {
3
+ # Esqueleto totalmente oscuro (secondary)
4
+ "body": {"color": "white", "background-color": "secondary"},
5
+ "header": {"color": "white", "background-color": "secondary"},
6
+ "footer": {"color": "white", "background-color": "secondary"},
7
+
8
+ # Títulos en color claro acentuado
9
+ "text_htags": {"color": "quaternary"},
10
+ "text_tags": {"color": "white"},
11
+
12
+ # Los contenedores de bloques usan un fondo ligeramente diferente (principal)
13
+ "block_tags": {"background-color": "principal", "color": "white"},
14
+
15
+ "button": {"color": "black", "background-color": "quaternary"}
16
+ },
17
+
18
+ "doble_selector": {
19
+ "header>a": {"color":"quaternary"},
20
+ "footer>a": {"color": "quaternary"},
21
+ # El texto en los bloques mantiene el blanco, solo cambia sutilmente el fondo
22
+ "block_tags>text_tags": {"color": "white"}
23
+ },
24
+
25
+ "triple_selector": {}
26
+ }
@@ -0,0 +1,19 @@
1
+ enfasis_main = {
2
+ "simple_selector": {
3
+ "body": {"color": "black", "background-color": "secondary"},
4
+ "header": {"color": "white", "background-color": "principal"},
5
+ "footer": {"color": "white", "background-color": "principal"},
6
+ "text_htags": {"color": "principal"},
7
+ "h3": {"color": "black"},
8
+ "h4": {"color": "black"},
9
+ "button": {"color": "white", "background-color": "tertiary"}
10
+ },
11
+
12
+ "doble_selector": {
13
+ "header>text_tags": {"color":"white"},
14
+ "footer>text_tags": {"color": "white"},
15
+ "body>button": {"color": "white", "background-color": "principal"}
16
+ },
17
+
18
+ "triple_selector": {}
19
+ }
@@ -0,0 +1,28 @@
1
+ mono_accent = {
2
+ "simple_selector": {
3
+
4
+ "body": {"color": "black", "background-color": "quaternary"},
5
+ "header": {"color": "black", "background-color": "quaternary"},
6
+ "footer": {"color": "black", "background-color": "quaternary"},
7
+
8
+ "text_htags": {"color": "principal"},
9
+ "text_tags": {"color": "black"},
10
+
11
+
12
+ "block_tags": {"background-color": "tertiary", "color": "black"},
13
+
14
+ "button": {"color": "white", "background-color": "principal"}
15
+ },
16
+
17
+ "doble_selector": {
18
+ "header>text_tags": {"color":"black"},
19
+ "footer>text_tags": {"color": "black"},
20
+
21
+ "block_tags>text_htags": {"color": "secondary"}
22
+ },
23
+
24
+ "triple_selector": {
25
+
26
+ "block_tags>p": {"color": "principal"}
27
+ }
28
+ }