dars-framework 1.1.2__tar.gz → 1.1.3__tar.gz
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.
- {dars_framework-1.1.2/dars_framework.egg-info → dars_framework-1.1.3}/PKG-INFO +1 -1
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/cli/main.py +0 -1
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/cli/translations.py +4 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/core/app.py +9 -5
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/docs/app.md +112 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/docs/components.md +29 -30
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/exporters/web/html_css_js.py +28 -24
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/advanced/SimpleDashboard/dashboard.py +1 -4
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/HelloWorld/hello_world.py +1 -1
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/version.py +2 -2
- {dars_framework-1.1.2 → dars_framework-1.1.3/dars_framework.egg-info}/PKG-INFO +1 -1
- {dars_framework-1.1.2 → dars_framework-1.1.3}/pyproject.toml +1 -1
- {dars_framework-1.1.2 → dars_framework-1.1.3}/LICENSE +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/MANIFEST.in +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/README.md +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/all.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/cli/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/cli/hot_reload.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/cli/preview.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/advanced/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/advanced/accordion.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/advanced/card.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/advanced/modal.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/advanced/navbar.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/advanced/table.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/advanced/tabs.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/button.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/checkbox.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/container.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/datepicker.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/image.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/input.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/link.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/markdown.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/page.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/progressbar.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/radiobutton.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/select.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/slider.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/spinner.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/text.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/textarea.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/basic/tooltip.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/layout/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/layout/anchor.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/layout/flex.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/components/layout/grid.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/core/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/core/component.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/core/events.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/core/properties.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/docs/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/docs/cli.md +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/docs/custom_components.md +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/docs/events.md +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/docs/exporters.md +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/docs/getting_started.md +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/docs/index.md +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/docs/scripts.md +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/exporters/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/exporters/base.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/exporters/web/OLD/html_css_js_OLD4.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/exporters/web/OLD/html_css_js_old.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/exporters/web/OLD/html_css_js_old2.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/exporters/web/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/scripts/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/scripts/dscript.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/scripts/script.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/__pycache__/__init__.cpython-311.pyc +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/README.md +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/__pycache__/dynamic_event_demo.cpython-311.pyc +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/advanced/Modal_Demo/advanced_modal_demo.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/advanced/SimpleModermWeb/modern_web_app.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/advanced/VariousComponents/all_components_demo.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/advanced/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/Forms/form_components.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/Forms/simple_form.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/Layouts/flex_layout_responsive.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/Layouts/grid_layout_responsive.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/Layouts/layout_multipage_demo.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/Multipage/multipage_example.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/PWA/icon-192x192.png +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/PWA/icon-512x512.png +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/PWA/pwa_custom_icons.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/demo/__pycache__/complete_app.cpython-311.pyc +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/demo/complete_app.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/markdown/MarkdownTemplate/README.md +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/markdown/MarkdownTemplate/markdown_template.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/markdown/MarkdownTemplate/other_docs.md +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/markdown/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/html/__init__.py +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars_framework.egg-info/SOURCES.txt +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars_framework.egg-info/dependency_links.txt +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars_framework.egg-info/entry_points.txt +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars_framework.egg-info/requires.txt +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/dars_framework.egg-info/top_level.txt +0 -0
- {dars_framework-1.1.2 → dars_framework-1.1.3}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dars-framework
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.3
|
|
4
4
|
Summary: Dars is a Python UI framework for building modern, interactive web apps with only Python code. Write your interface in Python, export it to static HTML/CSS/JS, and deploy anywhere.
|
|
5
5
|
Author-email: ztamdev <zondax2009@gmail.com>
|
|
6
6
|
License: MIT License
|
|
@@ -368,7 +368,6 @@ class DarsExporter:
|
|
|
368
368
|
info_table.add_row(translator.get('scripts'), str(stats['scripts_count']))
|
|
369
369
|
info_table.add_row(translator.get('global_styles'), str(stats['global_styles_count']))
|
|
370
370
|
info_table.add_row(translator.get('theme'), app.config.get('theme', 'light'))
|
|
371
|
-
info_table.add_row(translator.get('responsive'), str(app.config.get('responsive', True)))
|
|
372
371
|
|
|
373
372
|
console.print(info_table)
|
|
374
373
|
|
|
@@ -17,6 +17,8 @@ translations = {
|
|
|
17
17
|
'info_help': "Show application information",
|
|
18
18
|
'formats_help': "Show supported formats",
|
|
19
19
|
'preview_help': "Preview information",
|
|
20
|
+
'property_column': "Property",
|
|
21
|
+
'value_column': "Value",
|
|
20
22
|
'preview_cmd_help': "Preview exported application",
|
|
21
23
|
'init_help': "Create a Dars project",
|
|
22
24
|
'template_not_found': "Template '{template}' not found",
|
|
@@ -171,6 +173,8 @@ translations = {
|
|
|
171
173
|
'preview_help': "Información de preview",
|
|
172
174
|
'preview_cmd_help': "Previsualizar aplicación exportada",
|
|
173
175
|
'init_help': "Crea un proyecto Dars",
|
|
176
|
+
'property_column': "Propiedad",
|
|
177
|
+
'value_column': "Valor",
|
|
174
178
|
|
|
175
179
|
# Export command
|
|
176
180
|
'file_help': "Archivo Python con la aplicación Dars",
|
|
@@ -127,7 +127,7 @@ class Page:
|
|
|
127
127
|
class App:
|
|
128
128
|
"""Main class that represents a Dars application"""
|
|
129
129
|
|
|
130
|
-
def rTimeCompile(self, exporter=None, port=None, add_file_types=".py, .js, .css"):
|
|
130
|
+
def rTimeCompile(self, exporter=None, port=None, add_file_types=".py, .js, .css", watchfiledialog=False):
|
|
131
131
|
"""
|
|
132
132
|
Generates a quick preview of the app on a local server using an exporter
|
|
133
133
|
(default: HTMLCSSJSExporter) and serving the files from a temporary directory.
|
|
@@ -145,6 +145,8 @@ class App:
|
|
|
145
145
|
import shutil
|
|
146
146
|
import traceback
|
|
147
147
|
|
|
148
|
+
self.watchfiledialog = watchfiledialog
|
|
149
|
+
|
|
148
150
|
@contextmanager
|
|
149
151
|
def pushd(path):
|
|
150
152
|
"""Cambia temporalmente el cwd y lo restaura al salir."""
|
|
@@ -425,11 +427,13 @@ class App:
|
|
|
425
427
|
subtitle=f"Project root: {os.path.basename(project_root)}",
|
|
426
428
|
border_style="magenta"
|
|
427
429
|
)
|
|
428
|
-
|
|
430
|
+
if self.watchfiledialog:
|
|
431
|
+
console.print(panel)
|
|
429
432
|
else:
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
+
if self.watchfiledialog:
|
|
434
|
+
print(f"[Dars] Watching {len(files_to_watch)} files in {project_root}:")
|
|
435
|
+
for f in files_to_watch:
|
|
436
|
+
print(" -", os.path.relpath(f, project_root))
|
|
433
437
|
|
|
434
438
|
# Loop principal: espera a Ctrl+C
|
|
435
439
|
while not shutdown_event.is_set():
|
|
@@ -27,6 +27,118 @@ class App:
|
|
|
27
27
|
):
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
+
## Global Styles Management
|
|
31
|
+
|
|
32
|
+
### Enhanced add_global_style() Method
|
|
33
|
+
|
|
34
|
+
The `App` class now includes an enhanced `add_global_style()` method that supports both inline style definitions and external CSS file imports.
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
#### Usage Examples
|
|
38
|
+
|
|
39
|
+
**1. Inline Style Definition (Traditional)**
|
|
40
|
+
```python
|
|
41
|
+
app.add_global_style(
|
|
42
|
+
selector=".my-button",
|
|
43
|
+
styles={
|
|
44
|
+
"background-color": "#4CAF50",
|
|
45
|
+
"color": "white",
|
|
46
|
+
"padding": "10px 20px",
|
|
47
|
+
"border-radius": "5px"
|
|
48
|
+
}
|
|
49
|
+
)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**2. External CSS File Import (New in v1.1.2)**
|
|
53
|
+
```python
|
|
54
|
+
app.add_global_style(file_path="styles.css")
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**3. Combined Usage**
|
|
58
|
+
```python
|
|
59
|
+
# Add inline styles
|
|
60
|
+
app.add_global_style(
|
|
61
|
+
selector=".primary-btn",
|
|
62
|
+
styles={
|
|
63
|
+
"background-color": "#007bff",
|
|
64
|
+
"color": "white"
|
|
65
|
+
}
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
# Import external CSS file
|
|
69
|
+
app.add_global_style(file_path="components.css")
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
#### Practical Example with External CSS
|
|
73
|
+
|
|
74
|
+
**main.py:**
|
|
75
|
+
```python
|
|
76
|
+
from dars.all import *
|
|
77
|
+
|
|
78
|
+
app = App(title="Dars Styling Test")
|
|
79
|
+
|
|
80
|
+
index = Page(
|
|
81
|
+
Container(
|
|
82
|
+
Button("Styled Button", class_name="button-styling-test"),
|
|
83
|
+
id="page_sub_container"
|
|
84
|
+
)
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
app.add_page(name="index", root=index, title="index", index=True)
|
|
88
|
+
app.add_global_style(file_path="styles.css")
|
|
89
|
+
|
|
90
|
+
if __name__ == "__main__":
|
|
91
|
+
app.rTimeCompile(add_file_types=".py, .css")
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**styles.css:**
|
|
95
|
+
```css
|
|
96
|
+
.button-styling-test {
|
|
97
|
+
background-color: rgb(51, 255, 0);
|
|
98
|
+
padding: 15px 30px;
|
|
99
|
+
border-radius: 8px;
|
|
100
|
+
border: none;
|
|
101
|
+
font-weight: bold;
|
|
102
|
+
cursor: pointer;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.button-styling-test:hover {
|
|
106
|
+
background-color: rgb(30, 200, 0);
|
|
107
|
+
transform: scale(1.05);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
#page_sub_container {
|
|
111
|
+
padding: 20px;
|
|
112
|
+
background-color: #f5f5f5;
|
|
113
|
+
min-height: 100vh;
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Hot Reload for CSS Files
|
|
118
|
+
|
|
119
|
+
When using `app.rTimeCompile()` with the `add_file_types=".css"` parameter, the development server automatically watches for changes in CSS files and reloads the application when modifications are detected.
|
|
120
|
+
|
|
121
|
+
```python
|
|
122
|
+
# Watch for both Python and CSS file changes
|
|
123
|
+
app.rTimeCompile(add_file_types=".py, .css")
|
|
124
|
+
|
|
125
|
+
# Or watch for CSS files only
|
|
126
|
+
app.rTimeCompile(add_file_types=".css")
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Benefits of External CSS Import
|
|
130
|
+
|
|
131
|
+
1. **Separation of Concerns**: Keep styles separate from application logic
|
|
132
|
+
2. **Better Organization**: Maintain complex stylesheets in dedicated files
|
|
133
|
+
3. **Team Collaboration**: Designers and developers can work simultaneously
|
|
134
|
+
4. **CSS Preprocessors**: Use SASS, LESS, or other preprocessors
|
|
135
|
+
5. **Performance**: Browser caching for external CSS files
|
|
136
|
+
|
|
137
|
+
### Backward Compatibility
|
|
138
|
+
|
|
139
|
+
The enhanced method maintains full backward compatibility - existing code using `add_global_style(selector, styles)` will continue to work without modification.
|
|
140
|
+
|
|
141
|
+
|
|
30
142
|
## PWA Configuration Properties
|
|
31
143
|
|
|
32
144
|
The App class includes these PWA-specific properties:
|
|
@@ -19,13 +19,13 @@ This simplifies integration and improves the developer experience.
|
|
|
19
19
|
|
|
20
20
|
Components are the fundamental elements of Dars that represent UI elements. Each component encapsulates its appearance, behavior, and state, allowing you to create complex interfaces by composing simple elements.
|
|
21
21
|
|
|
22
|
-
To learn how to create your own custom components, refer to the documentation in [Custom Components](
|
|
22
|
+
To learn how to create your own custom components, refer to the documentation in [Custom Components](#custom-components-in-dars-framework).
|
|
23
23
|
|
|
24
24
|
## Event Handling with dScript
|
|
25
25
|
|
|
26
26
|
Dars provides a powerful way to handle user interactions through the `dScript` class. You can attach event handlers to interactive components like `Button` and `Input` to create dynamic and responsive user interfaces.
|
|
27
27
|
|
|
28
|
-
For a complete list of available event types and how to use them, refer to the documentation in [Events](events
|
|
28
|
+
For a complete list of available event types and how to use them, refer to the documentation in [Events](#events-in-dars).
|
|
29
29
|
|
|
30
30
|
### Basic Usage
|
|
31
31
|
|
|
@@ -87,34 +87,34 @@ input_field = Input(
|
|
|
87
87
|
### Quick Access
|
|
88
88
|
|
|
89
89
|
- [Base Component Class](#base-component-class)
|
|
90
|
-
- [Component Search](#
|
|
91
|
-
- [Page](#
|
|
92
|
-
- [Text](#
|
|
93
|
-
- [Button](#
|
|
94
|
-
- [Input](#
|
|
95
|
-
- [Container](#
|
|
96
|
-
- [Markdown](#
|
|
97
|
-
- [Image](#
|
|
98
|
-
- [Link](#
|
|
99
|
-
- [Textarea](#
|
|
100
|
-
- [Checkbox](#
|
|
101
|
-
- [RadioButton](#
|
|
102
|
-
- [Select](#
|
|
103
|
-
- [Slider](#
|
|
104
|
-
- [ProgressBar](#
|
|
105
|
-
- [Tooltip](#
|
|
106
|
-
- [DatePicker](#
|
|
107
|
-
- [Card](#
|
|
108
|
-
- [Modal](#
|
|
109
|
-
- [Navbar](#
|
|
110
|
-
- [Accordion](#
|
|
111
|
-
- [Tabs](#
|
|
112
|
-
- [Table](#
|
|
90
|
+
- [Component Search](#component-search-and-modification)
|
|
91
|
+
- [Page](#page)
|
|
92
|
+
- [Text](#text)
|
|
93
|
+
- [Button](#button)
|
|
94
|
+
- [Input](#input)
|
|
95
|
+
- [Container](#container)
|
|
96
|
+
- [Markdown](#markdown)
|
|
97
|
+
- [Image](#image)
|
|
98
|
+
- [Link](#link)
|
|
99
|
+
- [Textarea](#textarea)
|
|
100
|
+
- [Checkbox](#checkbox)
|
|
101
|
+
- [RadioButton](#radiobutton)
|
|
102
|
+
- [Select](#select)
|
|
103
|
+
- [Slider](#slider)
|
|
104
|
+
- [ProgressBar](#progressBar)
|
|
105
|
+
- [Tooltip](#tooltip)
|
|
106
|
+
- [DatePicker](#datepicker)
|
|
107
|
+
- [Card](#card)
|
|
108
|
+
- [Modal](#modal)
|
|
109
|
+
- [Navbar](#navbar)
|
|
110
|
+
- [Accordion](#accordion)
|
|
111
|
+
- [Tabs](#tabs)
|
|
112
|
+
- [Table](#table)
|
|
113
113
|
- [Layout Components](#layout-components)
|
|
114
|
-
- [GridLayout](#
|
|
115
|
-
- [FlexLayout](#
|
|
116
|
-
- [LayoutBase](#
|
|
117
|
-
- [AnchorPoint](#
|
|
114
|
+
- [GridLayout](#gridlayout)
|
|
115
|
+
- [FlexLayout](#flexlayout)
|
|
116
|
+
- [LayoutBase](#layoutbase)
|
|
117
|
+
- [AnchorPoint](#anchorpoint)
|
|
118
118
|
|
|
119
119
|
---
|
|
120
120
|
|
|
@@ -1675,4 +1675,3 @@ save_button = Button("Guardar", style=PRIMARY_BUTTON_STYLES)
|
|
|
1675
1675
|
|
|
1676
1676
|
Components provide a solid foundation for creating modern and responsive user interfaces that can be exported to multiple platforms while maintaining consistency and functionality.
|
|
1677
1677
|
|
|
1678
|
-
|
|
@@ -80,9 +80,11 @@ class HTMLCSSJSExporter(Exporter):
|
|
|
80
80
|
shutil.copy2(os.path.join(project_root, src), os.path.join(output_path, os.path.basename(src)))
|
|
81
81
|
# NOTA: No copiar ejecutables ni nada fuera del proyecto
|
|
82
82
|
|
|
83
|
-
#
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
base_css_content = self.generate_base_css() # Nuevo método para estilos base
|
|
84
|
+
custom_css_content = self.generate_custom_css(app) # Nuevo método para estilos personalizados
|
|
85
|
+
|
|
86
|
+
self.write_file(os.path.join(output_path, "runtime_css.css"), base_css_content)
|
|
87
|
+
self.write_file(os.path.join(output_path, "styles.css"), custom_css_content)
|
|
86
88
|
|
|
87
89
|
# Multipágina: exportar un HTML, CSS y JS por cada página registrada
|
|
88
90
|
if hasattr(app, "is_multipage") and app.is_multipage():
|
|
@@ -493,7 +495,7 @@ self.addEventListener('fetch', event => {
|
|
|
493
495
|
{links_html}
|
|
494
496
|
{og_tags_html}
|
|
495
497
|
{twitter_tags_html}
|
|
496
|
-
<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css\">\n <link rel=\"stylesheet\" href=\"{css_file}\">
|
|
498
|
+
<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css\">\n <link rel=\"stylesheet\" href=\"runtime_css.css\">\n <link rel=\"stylesheet\" href=\"{css_file}\">
|
|
497
499
|
</head>
|
|
498
500
|
<body>
|
|
499
501
|
{body_content}
|
|
@@ -548,6 +550,25 @@ if ('serviceWorker' in navigator) {
|
|
|
548
550
|
</script>
|
|
549
551
|
""")
|
|
550
552
|
return "\n ".join(links)
|
|
553
|
+
def generate_custom_css(self, app: App) -> str:
|
|
554
|
+
"""Genera solo los estilos personalizados de la aplicación"""
|
|
555
|
+
css_content = ""
|
|
556
|
+
|
|
557
|
+
# Agregar estilos globales de la aplicación definidos por el usuario
|
|
558
|
+
for selector, styles in app.global_styles.items():
|
|
559
|
+
css_content += f"{selector} {{\n"
|
|
560
|
+
css_content += f" {self.render_styles(styles)}\n"
|
|
561
|
+
css_content += "}\n\n"
|
|
562
|
+
|
|
563
|
+
# Agregar contenido de archivos CSS globales
|
|
564
|
+
for file_path in app.global_style_files:
|
|
565
|
+
try:
|
|
566
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
567
|
+
css_content += f.read() + "\n\n"
|
|
568
|
+
except Exception as e:
|
|
569
|
+
print(f"[Dars] Warning: could not read CSS file '{file_path}': {e}")
|
|
570
|
+
|
|
571
|
+
return css_content
|
|
551
572
|
|
|
552
573
|
def _generate_open_graph_tags(self, app: App) -> str:
|
|
553
574
|
"""Genera todos los tags Open Graph para redes sociales"""
|
|
@@ -571,9 +592,9 @@ if ('serviceWorker' in navigator) {
|
|
|
571
592
|
|
|
572
593
|
return '\n'.join(twitter_html)
|
|
573
594
|
|
|
574
|
-
def
|
|
575
|
-
"""Genera el contenido CSS"""
|
|
576
|
-
|
|
595
|
+
def generate_base_css(self) -> str:
|
|
596
|
+
"""Genera el contenido CSS base"""
|
|
597
|
+
return """/* Estilos base de Dars */
|
|
577
598
|
* {
|
|
578
599
|
box-sizing: border-box;
|
|
579
600
|
}
|
|
@@ -1250,24 +1271,7 @@ body {
|
|
|
1250
1271
|
background-color: #444;
|
|
1251
1272
|
}
|
|
1252
1273
|
"""
|
|
1253
|
-
|
|
1254
|
-
# Agregar estilos globales de la aplicación definidos por el usuario
|
|
1255
|
-
for selector, styles in app.global_styles.items():
|
|
1256
|
-
css_content += f"{selector} {{\n"
|
|
1257
|
-
css_content += f" {self.render_styles(styles)}\n"
|
|
1258
|
-
css_content += "}\n\n"
|
|
1259
1274
|
|
|
1260
|
-
# Agregar contenido de archivos CSS globales
|
|
1261
|
-
for file_path in app.global_style_files:
|
|
1262
|
-
try:
|
|
1263
|
-
with open(file_path, "r", encoding="utf-8") as f:
|
|
1264
|
-
css_content += f.read() + "\n\n"
|
|
1265
|
-
except Exception as e:
|
|
1266
|
-
print(f"[Dars] Warning: could not read CSS file '{file_path}': {e}")
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
return css_content
|
|
1270
|
-
|
|
1271
1275
|
def generate_javascript(self, app: App, page_root: Component) -> str:
|
|
1272
1276
|
"""Genera el contenido JavaScript específico para una página"""
|
|
1273
1277
|
js_content = """// Dars Runtime - Página específica
|
|
@@ -432,9 +432,6 @@ main_container.add_child(content_area)
|
|
|
432
432
|
app.set_root(main_container)
|
|
433
433
|
app.add_script(script)
|
|
434
434
|
|
|
435
|
-
# Para exportar esta aplicación, ejecuta:
|
|
436
|
-
# ./dars_exporter export examples/advanced/dashboard.py --format html --output ./dashboard_output
|
|
437
|
-
|
|
438
435
|
if __name__ == "__main__":
|
|
439
|
-
app.rTimeCompile() # Preview/compilación rápida
|
|
436
|
+
app.rTimeCompile(watchfiledialog=True) # Preview/compilación rápida
|
|
440
437
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
__version__ = "1.1.
|
|
2
|
-
__release_url__ = "https://github.com/ZtaMDev/Dars-Framework/releases/tag/1.1.
|
|
1
|
+
__version__ = "1.1.3"
|
|
2
|
+
__release_url__ = "https://github.com/ZtaMDev/Dars-Framework/releases/tag/1.1.3"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dars-framework
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.3
|
|
4
4
|
Summary: Dars is a Python UI framework for building modern, interactive web apps with only Python code. Write your interface in Python, export it to static HTML/CSS/JS, and deploy anywhere.
|
|
5
5
|
Author-email: ztamdev <zondax2009@gmail.com>
|
|
6
6
|
License: MIT License
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "dars-framework"
|
|
3
|
-
version = "1.1.
|
|
3
|
+
version = "1.1.3"
|
|
4
4
|
description = "Dars is a Python UI framework for building modern, interactive web apps with only Python code. Write your interface in Python, export it to static HTML/CSS/JS, and deploy anywhere."
|
|
5
5
|
authors = [
|
|
6
6
|
{ name="ztamdev", email="zondax2009@gmail.com" }
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/__pycache__/__init__.cpython-311.pyc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/Forms/form_components.py
RENAMED
|
File without changes
|
{dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/Forms/simple_form.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/PWA/icon-192x192.png
RENAMED
|
File without changes
|
{dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/PWA/icon-512x512.png
RENAMED
|
File without changes
|
{dars_framework-1.1.2 → dars_framework-1.1.3}/dars/templates/examples/basic/PWA/pwa_custom_icons.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|