decksmith 0.9.1__tar.gz → 0.9.2__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.
- {decksmith-0.9.1 → decksmith-0.9.2}/PKG-INFO +3 -1
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/gui/static/css/style.css +83 -32
- decksmith-0.9.2/decksmith/gui/static/img/decksmith.ico +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/gui/templates/index.html +184 -182
- {decksmith-0.9.1 → decksmith-0.9.2}/docs/README.md +2 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/pyproject.toml +1 -1
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/__init__.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/card_builder.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/deck_builder.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/export.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/gui/__init__.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/gui/app.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/gui/static/js/main.js +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/image_ops.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/logger.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/macro.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/main.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/project.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/renderers/__init__.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/renderers/image.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/renderers/shapes.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/renderers/text.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/templates/deck.csv +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/templates/deck.yaml +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/utils.py +0 -0
- {decksmith-0.9.1 → decksmith-0.9.2}/decksmith/validate.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: decksmith
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.2
|
|
4
4
|
Summary: A command-line application to dynamically generate decks of cards from a YAML specification and a CSV data file, inspired by nandeck.
|
|
5
5
|
License-Expression: GPL-2.0-only
|
|
6
6
|
Author: Julio Cabria
|
|
@@ -28,6 +28,8 @@ Description-Content-Type: text/markdown
|
|
|
28
28
|
|
|
29
29
|
# DeckSmith
|
|
30
30
|
|
|
31
|
+
[julynx.github.io/decksmith](https://julynx.github.io/decksmith/)
|
|
32
|
+
|
|
31
33
|
*A powerful application to dynamically generate decks of cards from a YAML specification and a CSV data file.*
|
|
32
34
|
|
|
33
35
|
<br>
|
|
@@ -3,24 +3,27 @@
|
|
|
3
3
|
--bg-primary: #1e1e1e;
|
|
4
4
|
--bg-secondary: #252526;
|
|
5
5
|
--bg-tertiary: #333333;
|
|
6
|
-
--bg-header: #1e1e1e;
|
|
6
|
+
--bg-header: #1e1e1e;
|
|
7
|
+
/* Seamless header */
|
|
7
8
|
--bg-input: #3c3c3c;
|
|
8
9
|
--bg-hover: #2a2d2e;
|
|
9
10
|
--bg-active: #37373d;
|
|
10
|
-
|
|
11
|
+
|
|
11
12
|
--text-primary: #cccccc;
|
|
12
13
|
--text-secondary: #969696;
|
|
13
14
|
--text-muted: #6e6e6e;
|
|
14
15
|
--text-inverse: #ffffff;
|
|
15
16
|
|
|
16
|
-
--accent-color: #007fd4;
|
|
17
|
+
--accent-color: #007fd4;
|
|
18
|
+
/* VS Code Blue */
|
|
17
19
|
--accent-hover: #026ec1;
|
|
18
20
|
--danger-color: #f14c4c;
|
|
19
21
|
--danger-hover: #d43b3b;
|
|
20
22
|
--success-color: #4caf50;
|
|
21
23
|
--warning-color: #cca700;
|
|
22
24
|
|
|
23
|
-
--border-color: #3e3e42;
|
|
25
|
+
--border-color: #3e3e42;
|
|
26
|
+
/* Subtle borders */
|
|
24
27
|
--border-focus: #007fd4;
|
|
25
28
|
|
|
26
29
|
/* Spacing */
|
|
@@ -35,14 +38,15 @@
|
|
|
35
38
|
--radius-sm: 3px;
|
|
36
39
|
--radius-md: 5px;
|
|
37
40
|
--radius-lg: 8px;
|
|
38
|
-
|
|
41
|
+
|
|
39
42
|
/* Shadows */
|
|
40
43
|
--shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
41
44
|
--shadow-md: 0 4px 8px rgba(0, 0, 0, 0.2);
|
|
42
45
|
--shadow-lg: 0 8px 16px rgba(0, 0, 0, 0.3);
|
|
43
46
|
}
|
|
44
47
|
|
|
45
|
-
body,
|
|
48
|
+
body,
|
|
49
|
+
html {
|
|
46
50
|
margin: 0;
|
|
47
51
|
padding: 0;
|
|
48
52
|
height: 100%;
|
|
@@ -50,7 +54,8 @@ body, html {
|
|
|
50
54
|
background-color: var(--bg-primary);
|
|
51
55
|
color: var(--text-primary);
|
|
52
56
|
overflow: hidden;
|
|
53
|
-
font-size: 13px;
|
|
57
|
+
font-size: 13px;
|
|
58
|
+
/* Slightly smaller, more dense interface */
|
|
54
59
|
line-height: 1.5;
|
|
55
60
|
}
|
|
56
61
|
|
|
@@ -67,7 +72,8 @@ body, html {
|
|
|
67
72
|
::-webkit-scrollbar-thumb {
|
|
68
73
|
background: #424242;
|
|
69
74
|
border-radius: 10px;
|
|
70
|
-
border: 2px solid var(--bg-primary);
|
|
75
|
+
border: 2px solid var(--bg-primary);
|
|
76
|
+
/* Creates padding effect */
|
|
71
77
|
}
|
|
72
78
|
|
|
73
79
|
::-webkit-scrollbar-thumb:hover {
|
|
@@ -100,8 +106,9 @@ body, html {
|
|
|
100
106
|
font-weight: 600;
|
|
101
107
|
}
|
|
102
108
|
|
|
103
|
-
.app-
|
|
104
|
-
|
|
109
|
+
.app-logo {
|
|
110
|
+
height: 24px;
|
|
111
|
+
width: auto;
|
|
105
112
|
}
|
|
106
113
|
|
|
107
114
|
.project-controls {
|
|
@@ -198,7 +205,8 @@ body, html {
|
|
|
198
205
|
width: 100vw;
|
|
199
206
|
}
|
|
200
207
|
|
|
201
|
-
#left-pane,
|
|
208
|
+
#left-pane,
|
|
209
|
+
#right-pane {
|
|
202
210
|
height: 100%;
|
|
203
211
|
display: flex;
|
|
204
212
|
flex-direction: column;
|
|
@@ -212,7 +220,8 @@ body, html {
|
|
|
212
220
|
#right-pane {
|
|
213
221
|
width: 50%;
|
|
214
222
|
background: var(--bg-primary);
|
|
215
|
-
padding: 0;
|
|
223
|
+
padding: 0;
|
|
224
|
+
/* Removed padding for cleaner split */
|
|
216
225
|
}
|
|
217
226
|
|
|
218
227
|
#editors-container {
|
|
@@ -222,7 +231,8 @@ body, html {
|
|
|
222
231
|
flex-direction: column;
|
|
223
232
|
}
|
|
224
233
|
|
|
225
|
-
#yaml-pane,
|
|
234
|
+
#yaml-pane,
|
|
235
|
+
#csv-pane {
|
|
226
236
|
display: flex;
|
|
227
237
|
flex-direction: column;
|
|
228
238
|
height: 50%;
|
|
@@ -242,7 +252,8 @@ body, html {
|
|
|
242
252
|
justify-content: space-between;
|
|
243
253
|
}
|
|
244
254
|
|
|
245
|
-
#yaml-editor,
|
|
255
|
+
#yaml-editor,
|
|
256
|
+
#csv-editor {
|
|
246
257
|
flex-grow: 1;
|
|
247
258
|
width: 100%;
|
|
248
259
|
height: 100%;
|
|
@@ -286,7 +297,8 @@ body, html {
|
|
|
286
297
|
}
|
|
287
298
|
|
|
288
299
|
.select-wrapper::after {
|
|
289
|
-
content: '\f078';
|
|
300
|
+
content: '\f078';
|
|
301
|
+
/* FontAwesome chevron-down */
|
|
290
302
|
font-family: 'Font Awesome 6 Free';
|
|
291
303
|
font-weight: 900;
|
|
292
304
|
position: absolute;
|
|
@@ -330,10 +342,10 @@ select:focus {
|
|
|
330
342
|
align-items: center;
|
|
331
343
|
background-color: #1a1a1a;
|
|
332
344
|
/* Checkered background for transparency */
|
|
333
|
-
background-image:
|
|
334
|
-
linear-gradient(45deg, #222 25%, transparent 25%),
|
|
335
|
-
linear-gradient(-45deg, #222 25%, transparent 25%),
|
|
336
|
-
linear-gradient(45deg, transparent 75%, #222 75%),
|
|
345
|
+
background-image:
|
|
346
|
+
linear-gradient(45deg, #222 25%, transparent 25%),
|
|
347
|
+
linear-gradient(-45deg, #222 25%, transparent 25%),
|
|
348
|
+
linear-gradient(45deg, transparent 75%, #222 75%),
|
|
337
349
|
linear-gradient(-45deg, transparent 75%, #222 75%);
|
|
338
350
|
background-size: 20px 20px;
|
|
339
351
|
background-position: 0 0, 0 10px, 10px -10px, -10px 0px;
|
|
@@ -378,7 +390,8 @@ select:focus {
|
|
|
378
390
|
}
|
|
379
391
|
|
|
380
392
|
#placeholder-text::before {
|
|
381
|
-
content: '\f03e';
|
|
393
|
+
content: '\f03e';
|
|
394
|
+
/* FontAwesome image icon */
|
|
382
395
|
font-family: 'Font Awesome 6 Free';
|
|
383
396
|
font-weight: 900;
|
|
384
397
|
font-size: 4em;
|
|
@@ -416,9 +429,17 @@ select:focus {
|
|
|
416
429
|
transition: background-color 0.3s ease;
|
|
417
430
|
}
|
|
418
431
|
|
|
419
|
-
.status-line.success {
|
|
420
|
-
|
|
421
|
-
|
|
432
|
+
.status-line.success {
|
|
433
|
+
background-color: var(--success-color);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
.status-line.error {
|
|
437
|
+
background-color: var(--danger-color);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
.status-line.loading {
|
|
441
|
+
background-color: var(--warning-color);
|
|
442
|
+
}
|
|
422
443
|
|
|
423
444
|
/* Toasts */
|
|
424
445
|
#toast-container {
|
|
@@ -453,9 +474,17 @@ select:focus {
|
|
|
453
474
|
transform: translateY(0);
|
|
454
475
|
}
|
|
455
476
|
|
|
456
|
-
.toast.success {
|
|
457
|
-
|
|
458
|
-
|
|
477
|
+
.toast.success {
|
|
478
|
+
border-left-color: var(--success-color);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
.toast.error {
|
|
482
|
+
border-left-color: var(--danger-color);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
.toast.info {
|
|
486
|
+
border-left-color: var(--accent-color);
|
|
487
|
+
}
|
|
459
488
|
|
|
460
489
|
/* Split.js gutters */
|
|
461
490
|
.gutter {
|
|
@@ -472,12 +501,14 @@ select:focus {
|
|
|
472
501
|
|
|
473
502
|
.gutter.gutter-horizontal {
|
|
474
503
|
cursor: col-resize;
|
|
475
|
-
width: 4px;
|
|
504
|
+
width: 4px;
|
|
505
|
+
/* Thinner gutter */
|
|
476
506
|
}
|
|
477
507
|
|
|
478
508
|
.gutter.gutter-vertical {
|
|
479
509
|
cursor: row-resize;
|
|
480
|
-
height: 4px;
|
|
510
|
+
height: 4px;
|
|
511
|
+
/* Thinner gutter */
|
|
481
512
|
}
|
|
482
513
|
|
|
483
514
|
/* Modals */
|
|
@@ -529,7 +560,8 @@ select:focus {
|
|
|
529
560
|
transform: scale(1);
|
|
530
561
|
}
|
|
531
562
|
|
|
532
|
-
.modal-content h3,
|
|
563
|
+
.modal-content h3,
|
|
564
|
+
.modal-content h1 {
|
|
533
565
|
margin-top: 0;
|
|
534
566
|
margin-bottom: var(--spacing-md);
|
|
535
567
|
color: var(--text-inverse);
|
|
@@ -598,12 +630,16 @@ input[type="text"]:focus {
|
|
|
598
630
|
border: 1px solid var(--border-color);
|
|
599
631
|
}
|
|
600
632
|
|
|
633
|
+
.welcome-logo {
|
|
634
|
+
width: 80px;
|
|
635
|
+
height: auto;
|
|
636
|
+
margin-bottom: 16px;
|
|
637
|
+
}
|
|
638
|
+
|
|
601
639
|
.welcome-content h1 {
|
|
602
640
|
font-size: 2.2em;
|
|
603
641
|
margin-bottom: 16px;
|
|
604
|
-
|
|
605
|
-
-webkit-background-clip: text;
|
|
606
|
-
-webkit-text-fill-color: transparent;
|
|
642
|
+
color: var(--text-inverse);
|
|
607
643
|
letter-spacing: -0.5px;
|
|
608
644
|
}
|
|
609
645
|
|
|
@@ -654,3 +690,18 @@ input[type="number"] {
|
|
|
654
690
|
input[type="number"]:focus {
|
|
655
691
|
border-color: var(--border-focus);
|
|
656
692
|
}
|
|
693
|
+
|
|
694
|
+
.header-btn {
|
|
695
|
+
display: inline-flex;
|
|
696
|
+
align-items: center;
|
|
697
|
+
line-height: 1;
|
|
698
|
+
gap: 6px;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
.header-btn i {
|
|
702
|
+
display: inline-flex;
|
|
703
|
+
align-items: center;
|
|
704
|
+
height: 100%;
|
|
705
|
+
vertical-align: middle;
|
|
706
|
+
margin-top: -1px;
|
|
707
|
+
}
|
|
Binary file
|
|
@@ -1,182 +1,184 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en" data-theme="dark">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>DeckSmith</title>
|
|
7
|
-
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
9
|
-
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
|
|
10
|
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
|
11
|
-
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
|
|
12
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.32.6/ace.js"></script>
|
|
13
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/split.js/1.6.0/split.min.js"></script>
|
|
14
|
-
</head>
|
|
15
|
-
<body>
|
|
16
|
-
<div id="header">
|
|
17
|
-
<div class="app-branding">
|
|
18
|
-
<
|
|
19
|
-
<div class="app-title">DeckSmith</div>
|
|
20
|
-
</div>
|
|
21
|
-
<div class="project-controls">
|
|
22
|
-
<div class="project-path-container">
|
|
23
|
-
<i class="fa-regular fa-folder"></i>
|
|
24
|
-
<span id="current-project-path" title="Current Project Path">No project open</span>
|
|
25
|
-
</div>
|
|
26
|
-
<div class="button-group">
|
|
27
|
-
<button id="open-project-btn" class="btn small" title="Open Project"><i class="fa-solid fa-folder-open"></i> Open</button>
|
|
28
|
-
<button id="new-project-btn" class="btn small" title="New Project"><i class="fa-solid fa-plus"></i> New</button>
|
|
29
|
-
<button id="close-project-btn" class="btn small" title="Close Project"><i class="fa-solid fa-xmark"></i> Close</button>
|
|
30
|
-
</div>
|
|
31
|
-
</div>
|
|
32
|
-
</div>
|
|
33
|
-
|
|
34
|
-
<div class="app-container">
|
|
35
|
-
<div id="left-pane" class="split split-horizontal">
|
|
36
|
-
<div id="editors-container">
|
|
37
|
-
<div id="yaml-pane" class="split split-vertical">
|
|
38
|
-
<div class="pane-header">
|
|
39
|
-
<span><i class="fa-solid fa-code"></i> Layout (YAML)</span>
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
<
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
<button id="
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
<div class="
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
<
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
<i id="status-
|
|
80
|
-
<
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
<div class="modal-
|
|
91
|
-
|
|
92
|
-
<
|
|
93
|
-
<
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
<
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" data-theme="dark">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>DeckSmith</title>
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
9
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
|
|
10
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
|
11
|
+
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
|
|
12
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.32.6/ace.js"></script>
|
|
13
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/split.js/1.6.0/split.min.js"></script>
|
|
14
|
+
</head>
|
|
15
|
+
<body>
|
|
16
|
+
<div id="header">
|
|
17
|
+
<div class="app-branding">
|
|
18
|
+
<img src="{{ url_for('static', filename='img/decksmith.ico') }}" alt="DeckSmith Logo" class="app-logo">
|
|
19
|
+
<div class="app-title">DeckSmith</div>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="project-controls">
|
|
22
|
+
<div class="project-path-container">
|
|
23
|
+
<i class="fa-regular fa-folder"></i>
|
|
24
|
+
<span id="current-project-path" title="Current Project Path">No project open</span>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="button-group">
|
|
27
|
+
<button id="open-project-btn" class="btn small" title="Open Project"><i class="fa-solid fa-folder-open"></i> Open</button>
|
|
28
|
+
<button id="new-project-btn" class="btn small" title="New Project"><i class="fa-solid fa-plus"></i> New</button>
|
|
29
|
+
<button id="close-project-btn" class="btn small" title="Close Project"><i class="fa-solid fa-xmark"></i> Close</button>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<div class="app-container">
|
|
35
|
+
<div id="left-pane" class="split split-horizontal">
|
|
36
|
+
<div id="editors-container">
|
|
37
|
+
<div id="yaml-pane" class="split split-vertical">
|
|
38
|
+
<div class="pane-header">
|
|
39
|
+
<span><i class="fa-solid fa-code"></i> Layout (YAML)</span>
|
|
40
|
+
<button class="btn small header-btn" title="Syntax Guide" onclick="window.open('https://julynx.github.io/decksmith/docs.html#deck-yaml-syntax', '_blank')"><i class="fa-solid fa-book"></i> Syntax Guide</button>
|
|
41
|
+
</div>
|
|
42
|
+
<div id="yaml-editor"></div>
|
|
43
|
+
</div>
|
|
44
|
+
<div id="csv-pane" class="split split-vertical">
|
|
45
|
+
<div class="pane-header">
|
|
46
|
+
<span><i class="fa-solid fa-table"></i> Data (CSV)</span>
|
|
47
|
+
</div>
|
|
48
|
+
<div id="csv-editor"></div>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
<div id="right-pane" class="split split-horizontal">
|
|
53
|
+
<div class="preview-wrapper">
|
|
54
|
+
<div class="controls">
|
|
55
|
+
<div class="control-group">
|
|
56
|
+
<label for="card-selector"><i class="fa-solid fa-list"></i> Card:</label>
|
|
57
|
+
<div class="select-wrapper">
|
|
58
|
+
<select id="card-selector">
|
|
59
|
+
<option value="-1">Select a card...</option>
|
|
60
|
+
</select>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="control-group actions">
|
|
64
|
+
<button id="build-btn" class="btn primary"><i class="fa-solid fa-hammer"></i> Build Deck</button>
|
|
65
|
+
<button id="export-btn" class="btn danger"><i class="fa-solid fa-file-pdf"></i> Export PDF</button>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
<div id="status-line" class="status-line"></div>
|
|
69
|
+
<div class="preview-area">
|
|
70
|
+
<div id="loading-indicator" class="hidden">
|
|
71
|
+
<i class="fa-solid fa-circle-notch fa-spin fa-2x"></i>
|
|
72
|
+
</div>
|
|
73
|
+
<img id="preview-image" src="" alt="Card Preview" class="hidden">
|
|
74
|
+
<div id="placeholder-text">
|
|
75
|
+
<span>Select a card to preview</span>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
<div id="status-bar">
|
|
79
|
+
<i id="status-spinner" class="fa-solid fa-circle-notch fa-spin fa-fw hidden" style="font-size: 0.9em;"></i>
|
|
80
|
+
<i id="status-icon" class="fa-solid fa-circle-info fa-fw" style="font-size: 0.9em;"></i>
|
|
81
|
+
<span id="status-text">Ready</span>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
<div id="toast-container"></div>
|
|
87
|
+
|
|
88
|
+
<!-- Welcome Screen -->
|
|
89
|
+
<div id="welcome-screen" class="modal hidden">
|
|
90
|
+
<div class="modal-overlay"></div>
|
|
91
|
+
<div class="modal-content welcome-content">
|
|
92
|
+
<img src="{{ url_for('static', filename='img/decksmith.ico') }}" alt="DeckSmith Logo" class="welcome-logo">
|
|
93
|
+
<h1>Welcome to DeckSmith</h1>
|
|
94
|
+
<p>Create and manage your card decks with ease.<br>Select a project to get started.</p>
|
|
95
|
+
<div class="welcome-actions">
|
|
96
|
+
<button id="welcome-open-btn" class="btn primary large"><i class="fa-solid fa-folder-open"></i> Open Project</button>
|
|
97
|
+
<button id="welcome-new-btn" class="btn secondary large"><i class="fa-solid fa-plus"></i> New Project</button>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
|
|
102
|
+
<!-- Shutdown Screen -->
|
|
103
|
+
<div id="shutdown-screen" class="modal hidden">
|
|
104
|
+
<div class="modal-overlay"></div>
|
|
105
|
+
<div class="modal-content welcome-content">
|
|
106
|
+
<div style="margin-bottom: 20px;">
|
|
107
|
+
<i class="fa-solid fa-power-off" style="font-size: 3em; color: var(--danger-color);"></i>
|
|
108
|
+
</div>
|
|
109
|
+
<h1>Service Stopped</h1>
|
|
110
|
+
<p id="shutdown-reason" style="font-weight: 500; color: var(--text-primary);">The DeckSmith service stopped.</p>
|
|
111
|
+
<p>You can close this window.<br>To continue working, simply launch the app again.</p>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
<!-- Modal -->
|
|
116
|
+
<div id="path-modal" class="modal hidden">
|
|
117
|
+
<div class="modal-overlay"></div>
|
|
118
|
+
<div class="modal-content">
|
|
119
|
+
<h3 id="modal-title">Select Project</h3>
|
|
120
|
+
<div class="form-group">
|
|
121
|
+
<label for="project-path-input" id="project-path-label">Folder Path:</label>
|
|
122
|
+
<div class="input-group">
|
|
123
|
+
<input type="text" id="project-path-input" placeholder="e.g. C:/Projects/MyDeck">
|
|
124
|
+
<button id="browse-btn" class="btn secondary">Browse...</button>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
<div class="form-group hidden" id="project-name-group">
|
|
128
|
+
<label for="project-name-input">Project Name:</label>
|
|
129
|
+
<input type="text" id="project-name-input" placeholder="MyNewDeck">
|
|
130
|
+
</div>
|
|
131
|
+
<div class="modal-actions">
|
|
132
|
+
<button id="modal-cancel-btn" class="btn secondary">Cancel</button>
|
|
133
|
+
<button id="modal-confirm-btn" class="btn primary">Confirm</button>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
|
|
138
|
+
<!-- Export Modal -->
|
|
139
|
+
<div id="export-modal" class="modal hidden">
|
|
140
|
+
<div class="modal-overlay"></div>
|
|
141
|
+
<div class="modal-content">
|
|
142
|
+
<h3>Export PDF</h3>
|
|
143
|
+
<div class="form-grid">
|
|
144
|
+
<div class="form-group">
|
|
145
|
+
<label for="export-filename">Filename:</label>
|
|
146
|
+
<input type="text" id="export-filename" value="deck.pdf">
|
|
147
|
+
</div>
|
|
148
|
+
<div class="form-group">
|
|
149
|
+
<label for="export-page-size">Page Size:</label>
|
|
150
|
+
<select id="export-page-size">
|
|
151
|
+
<option value="A4" selected>A4</option>
|
|
152
|
+
<option value="Letter">Letter</option>
|
|
153
|
+
</select>
|
|
154
|
+
</div>
|
|
155
|
+
<div class="form-group">
|
|
156
|
+
<label for="export-width">Width (mm):</label>
|
|
157
|
+
<input type="number" id="export-width" value="63.5" step="0.1">
|
|
158
|
+
</div>
|
|
159
|
+
<div class="form-group">
|
|
160
|
+
<label for="export-height">Height (mm):</label>
|
|
161
|
+
<input type="number" id="export-height" value="88.9" step="0.1">
|
|
162
|
+
</div>
|
|
163
|
+
<div class="form-group">
|
|
164
|
+
<label for="export-gap">Gap (mm):</label>
|
|
165
|
+
<input type="number" id="export-gap" value="0" step="0.1">
|
|
166
|
+
</div>
|
|
167
|
+
<div class="form-group">
|
|
168
|
+
<label>Margins (mm):</label>
|
|
169
|
+
<div class="input-group">
|
|
170
|
+
<input type="number" id="export-margin-x" value="2" step="0.1" placeholder="X">
|
|
171
|
+
<input type="number" id="export-margin-y" value="2" step="0.1" placeholder="Y">
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
<div class="modal-actions">
|
|
176
|
+
<button id="export-cancel-btn" class="btn secondary">Cancel</button>
|
|
177
|
+
<button id="export-confirm-btn" class="btn primary">Export</button>
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
|
|
182
|
+
<script src="{{ url_for('static', filename='js/main.js') }}"></script>
|
|
183
|
+
</body>
|
|
184
|
+
</html>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "decksmith"
|
|
3
|
-
version = "0.9.
|
|
3
|
+
version = "0.9.2"
|
|
4
4
|
description = "A command-line application to dynamically generate decks of cards from a YAML specification and a CSV data file, inspired by nandeck."
|
|
5
5
|
authors = [
|
|
6
6
|
{name = "Julio Cabria", email = "juliocabria@tutanota.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
|