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.
- pyfrontkit/__init__.py +87 -0
- pyfrontkit/block.py +280 -0
- pyfrontkit/content.py +67 -0
- pyfrontkit/css/__init__.py +30 -0
- pyfrontkit/css/create_color/__init__.py +11 -0
- pyfrontkit/css/create_color/colors_templates/__init__.py +28 -0
- pyfrontkit/css/create_color/colors_templates/asimetric_template.py +19 -0
- pyfrontkit/css/create_color/colors_templates/classic_reverse_template.py +19 -0
- pyfrontkit/css/create_color/colors_templates/classic_template.py +22 -0
- pyfrontkit/css/create_color/colors_templates/dark_reverse_template.py +19 -0
- pyfrontkit/css/create_color/colors_templates/darkness_template.py +26 -0
- pyfrontkit/css/create_color/colors_templates/enfasis_main_template.py +19 -0
- pyfrontkit/css/create_color/colors_templates/mono_accent_template.py +28 -0
- pyfrontkit/css/create_color/colors_templates/mono_template.py +19 -0
- pyfrontkit/css/create_color/colors_templates/simple_template.py +23 -0
- pyfrontkit/css/create_color/colors_templates/soft_template.py +20 -0
- pyfrontkit/css/create_color/colors_templates/total_template.py +24 -0
- pyfrontkit/css/create_color/colors_templates/total_v2_template.py +26 -0
- pyfrontkit/css/create_color/create_colors.py +243 -0
- pyfrontkit/css/create_color/palettes.py +254 -0
- pyfrontkit/css/fonts.py +160 -0
- pyfrontkit/css_register.py +172 -0
- pyfrontkit/dom.py +102 -0
- pyfrontkit/html_doc.py +202 -0
- pyfrontkit/special.py +192 -0
- pyfrontkit/style_manager.py +63 -0
- pyfrontkit/tags.py +115 -0
- pyfrontkit/void_element.py +114 -0
- pyfrontkit-1.0.56.dist-info/METADATA +238 -0
- pyfrontkit-1.0.56.dist-info/RECORD +32 -0
- pyfrontkit-1.0.56.dist-info/WHEEL +5 -0
- 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,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
|
+
}
|