structables 0.2.0__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.
@@ -0,0 +1,323 @@
1
+ :root {
2
+ --main-font: "DejaVu Sans Mono", monospace;
3
+ --main-color: #bbc2cf;
4
+ --link-color: #ff6c6b;
5
+ --heading-color: #51afef;
6
+ --code-bg: #20232a;
7
+ --code-color: #969ba6;
8
+ --border-color: lightgrey;
9
+ }
10
+
11
+ body {
12
+ font-family: var(--main-font);
13
+ margin: 20px auto;
14
+ line-height: 1.5;
15
+ font-size: 1.1em;
16
+ max-width: 100vw;
17
+ color: var(--main-color);
18
+ padding: 0 10px;
19
+ hyphens: auto;
20
+ }
21
+
22
+ a {
23
+ color: var(--link-color);
24
+ text-decoration: none;
25
+ }
26
+
27
+ a:hover {
28
+ text-decoration: underline;
29
+ }
30
+
31
+ h1,
32
+ h2,
33
+ h3 {
34
+ line-height: 1.2;
35
+ color: var(--heading-color);
36
+ }
37
+
38
+ h1 {
39
+ font-size: 1.5em;
40
+ }
41
+
42
+ h2 {
43
+ font-size: 1.3em;
44
+ }
45
+
46
+ h3 {
47
+ font-size: 1.2em;
48
+ }
49
+
50
+ pre,
51
+ code {
52
+ background: var(--code-bg);
53
+ color: var(--code-color);
54
+ border: 1px solid var(--border-color);
55
+ padding: 5px;
56
+ tab-size: 4;
57
+ overflow-x: auto;
58
+ }
59
+
60
+ blockquote {
61
+ border-left: 10px solid var(--code-color);
62
+ padding-left: 10px;
63
+ margin-right: 10px;
64
+ }
65
+
66
+ .navbar-logo {
67
+ height: 64px;
68
+ }
69
+
70
+ .card {
71
+ background-color: #fff;
72
+ border: 1px solid #ddd;
73
+ border-radius: 8px;
74
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
75
+ overflow: hidden;
76
+ display: flex;
77
+ flex-direction: column;
78
+ }
79
+
80
+ .card-body {
81
+ flex: 1;
82
+ padding: 1rem;
83
+ }
84
+
85
+ .card-footer {
86
+ padding: 1rem;
87
+ background-color: #f8f9fa;
88
+ border-top: 1px solid #ddd;
89
+ margin-top: auto;
90
+ }
91
+
92
+ .card-img-top {
93
+ max-width: 100%;
94
+ height: auto;
95
+ object-fit: cover;
96
+ }
97
+
98
+ .navbar-collapse {
99
+ display: flex;
100
+ justify-content: space-between;
101
+ }
102
+
103
+ .navbar-nav {
104
+ flex-direction: row;
105
+ }
106
+
107
+ .nav-item {
108
+ margin-left: 1rem;
109
+ }
110
+
111
+ @media (max-width: 768px) {
112
+ .navbar-nav {
113
+ flex-direction: column;
114
+ align-items: center;
115
+ }
116
+
117
+ .nav-item {
118
+ margin-left: 0;
119
+ margin-bottom: 0.5rem;
120
+ }
121
+
122
+ .navbar-collapse {
123
+ flex-direction: column;
124
+ align-items: center;
125
+ }
126
+
127
+ .form-control {
128
+ width: 100%;
129
+ margin-bottom: 0.5rem;
130
+ }
131
+ }
132
+
133
+ .ibles {
134
+ display: inline-block;
135
+ vertical-align: top;
136
+ }
137
+
138
+ .ible-small {
139
+ font-size: 0.7em;
140
+ font-weight: thin;
141
+ line-height: 1em;
142
+ }
143
+
144
+ .step-section {
145
+ background-color: var(--primary-bg);
146
+ border: 1px solid var(--border-color);
147
+ border-radius: 8px;
148
+ box-shadow: 0 2px 4px var(--shadow-color);
149
+ padding: 1.5rem;
150
+ }
151
+
152
+ .step-header h2 {
153
+ font-size: 2em;
154
+ color: var(--heading-color);
155
+ }
156
+
157
+ .step-images img,
158
+ .step-videos video,
159
+ .step-iframes iframe {
160
+ border-radius: 8px;
161
+ box-shadow: 0 2px 4px var(--shadow-color);
162
+ }
163
+
164
+ .step-text {
165
+ font-size: 1.1em;
166
+ }
167
+
168
+ .reply-button,
169
+ .replies {
170
+ display: none;
171
+ }
172
+
173
+ .reply-button+label {
174
+ position: relative;
175
+ display: block;
176
+ cursor: pointer;
177
+ }
178
+
179
+ input.reply-button:checked+label+.replies {
180
+ display: flex;
181
+ flex-direction: column;
182
+ gap: 1rem;
183
+ margin-top: 1rem;
184
+ }
185
+
186
+ .member-list {
187
+ display: inline-block;
188
+ max-width: 200px;
189
+ vertical-align: top;
190
+ }
191
+
192
+ .ible-list-item {
193
+ display: inline-block;
194
+ max-width: 350px;
195
+ vertical-align: top;
196
+ margin-bottom: 2rem;
197
+ }
198
+
199
+ .contest-list-item {
200
+ display: inline-block;
201
+ max-width: 500px;
202
+ vertical-align: top;
203
+ margin-bottom: 2rem;
204
+ }
205
+
206
+ .archive-month-wrapper {
207
+ display: inline-block;
208
+ width: 30vw;
209
+ vertical-align: top;
210
+ }
211
+
212
+ .archive-month {
213
+ display: flex;
214
+ flex-direction: column;
215
+ gap: -10px;
216
+ margin-bottom: 1rem;
217
+ justify-content: space-between;
218
+ }
219
+
220
+ .archive {
221
+ margin-bottom: -20px;
222
+ }
223
+
224
+ ul.pagination {
225
+ display: flex;
226
+ justify-content: space-around;
227
+ padding: 0 33vw;
228
+ list-style-type: none;
229
+ align-items: center;
230
+ }
231
+
232
+ ul.pagination li.active a,
233
+ ul.pagination li.disabled a,
234
+ ul.pagination li.active a:hover,
235
+ ul.pagination li.disabled a:hover {
236
+ color: #bbc2cf;
237
+ text-decoration: none;
238
+ }
239
+
240
+ .closed-contest-contest {
241
+ object-fit: cover;
242
+ width: 33vw;
243
+ height: 15vw;
244
+ display: inline-block;
245
+ vertical-align: top;
246
+ padding: 0 10px;
247
+ }
248
+
249
+ .closed-contest-winner,
250
+ .closed-contest-winner-img {
251
+ width: 15vw;
252
+ display: inline-block;
253
+ vertical-align: top;
254
+ padding: 0 10px;
255
+ font-size: 0.8em;
256
+ text-overflow: ellipsis;
257
+ white-space: nowrap;
258
+ overflow: hidden;
259
+ }
260
+
261
+ .sitemap-group {
262
+ margin-top: 2em;
263
+ display: inline-block;
264
+ width: 30vw;
265
+ text-align: left;
266
+ vertical-align: top;
267
+ }
268
+
269
+ .sitemap-group h2 {
270
+ text-align: center;
271
+ }
272
+
273
+ .container {
274
+ margin-top: 20px !important;
275
+ }
276
+
277
+ header {
278
+ margin-bottom: 50px;
279
+ }
280
+
281
+ .go_here_link {
282
+ background-color: #4caf50;
283
+ /* Green */
284
+ border: none;
285
+ color: white;
286
+ padding: 15px 32px;
287
+ text-align: center;
288
+ text-decoration: none;
289
+ display: inline-block;
290
+ font-size: 16px;
291
+ }
292
+
293
+ .go_here_link:hover {
294
+ color: black;
295
+ }
296
+
297
+ .wrap {
298
+ word-wrap: break-word;
299
+ overflow-wrap: break-word;
300
+ }
301
+
302
+ .navbar-logo {
303
+ height: 64px;
304
+ }
305
+
306
+ .img-fluid {
307
+ border-radius: 8px;
308
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
309
+ }
310
+
311
+ video {
312
+ border-radius: 8px;
313
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
314
+ }
315
+
316
+ iframe {
317
+ border-radius: 8px;
318
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
319
+ }
320
+
321
+ .text-muted {
322
+ color: #6c757d !important;
323
+ }
Binary file
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 0 512 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z"/></svg>
@@ -0,0 +1,8 @@
1
+ {% extends "base.html" %}
2
+
3
+ {% block content %}
4
+ <center>
5
+ <h1>400</h1>
6
+ <p>The request was malformed</p>
7
+ </center>
8
+ {% endblock %}
@@ -0,0 +1,13 @@
1
+ {% extends "base.html" %}
2
+
3
+ {% block content %}
4
+ <center>
5
+ <h1>404</h1>
6
+ <p>This resource cannot be found</p>
7
+ <br>
8
+ <p>Why don't you try one of these instead?</p>
9
+ <a href="/" class="go_here_link">Featured</a>
10
+ <a href="/contest" class="go_here_link">Contests</a>
11
+ <br><br>
12
+ </center>
13
+ {% endblock %}
@@ -0,0 +1,9 @@
1
+ {% extends "base.html" %}
2
+
3
+ {% block content %}
4
+ {% include "header.html" %}
5
+ <center>
6
+ <h1>429</h1>
7
+ <p>This instance is being rate-limited</p>
8
+ </center>
9
+ {% endblock %}
@@ -0,0 +1,8 @@
1
+ {% extends "base.html" %}
2
+
3
+ {% block content %}
4
+ <center>
5
+ <h1>500</h1>
6
+ <p>An internal server error has occurred. Please try again later, or notify the administrator if this keeps happening.</p>
7
+ </center>
8
+ {% endblock %}
@@ -0,0 +1,31 @@
1
+ {% extends "base.html" %}
2
+
3
+ {% block content %}
4
+ <center>
5
+ <h1>Past Contests</h1>
6
+ <p>{{ contest_count }}</p>
7
+ <p><a href="/contest/">See running contests</a></p>
8
+ </center>
9
+ {% for year in contest_list %}
10
+ <div class="archive-year">
11
+ <hr>
12
+ <h2>{{ year[0] }}</h2>
13
+ <hr>
14
+ {% for month in year[1] %}
15
+ <div class="archive-month-wrapper">
16
+ <div class="archive-month">
17
+ <h3>{{ month[0] }}</h3>
18
+ {% for contest in month[1] %}
19
+ <div class="archive">
20
+ <p>{{ contest[0] }}<a href="{{ contest[1] }}">{{ contest[2] }}</a></p>
21
+ </div>
22
+ {% endfor %}
23
+ </div>
24
+ </div>
25
+ {% endfor %}
26
+ <br>
27
+ </div>
28
+ {% endfor %}
29
+ <hr>
30
+ {{ pagination|safe }}
31
+ {% endblock %}
@@ -0,0 +1,7 @@
1
+ {% extends "base.html" %}
2
+ {% block content %}
3
+ <center>
4
+ <h1>This content is being reviewed</h1>
5
+ <p>This Instructable was just published and is still pending review.</p>
6
+ </center>
7
+ {% endblock %}
@@ -0,0 +1,87 @@
1
+ {% extends "base.html" %} {% block content %}
2
+ <div class="container my-5">
3
+ <div class="header-section text-center mb-5">
4
+ <h1 class="display-4">{{ title }}</h1>
5
+ <p class="text-muted">
6
+ by
7
+ <a href="{{ author_link }}" class="text-decoration-none">{{ author }}</a>
8
+ in
9
+ <a href="{{ category_link }}" class="text-decoration-none"
10
+ >{{ category }}</a
11
+ >
12
+ &gt;
13
+ <a href="{{ channel_link }}" class="text-decoration-none"
14
+ >{{ channel }}</a
15
+ >
16
+ </p>
17
+ <p class="text-muted">
18
+ {{ views }} Views, {{ favorites }} Favorites, {{ comment_count }} Comments
19
+ </p>
20
+ </div>
21
+
22
+ {% for step in steps %}
23
+ <section class="step-section mb-5 p-4 rounded shadow-sm">
24
+ <div class="step-header mb-4">
25
+ <h2>{{ step.title }}</h2>
26
+ </div>
27
+
28
+ {% if step.imgs %}
29
+ <div class="step-images row mb-4">
30
+ {% for step_img in step.imgs %}
31
+ <div class="col-md-4 mb-3">
32
+ <img
33
+ src="{{ step_img.src }}"
34
+ alt="{{ step_img.alt }}"
35
+ class="img-fluid rounded shadow-sm"
36
+ />
37
+ </div>
38
+ {% endfor %}
39
+ </div>
40
+ {% endif %} {% if step.videos %}
41
+ <div class="step-videos row mb-4">
42
+ {% for step_video in step.videos %}
43
+ <div class="col-md-6 mb-3">
44
+ <video
45
+ src="{{ step_video }}"
46
+ controls
47
+ class="w-100 rounded shadow-sm"
48
+ ></video>
49
+ </div>
50
+ {% endfor %}
51
+ </div>
52
+ {% endif %} {% if step.iframes %}
53
+ <div class="step-iframes row mb-4">
54
+ {% for step_iframe in step.iframes %}
55
+ <div class="col-md-8 mb-3">
56
+ <iframe
57
+ src="{{ step_iframe.src }}"
58
+ width="100%"
59
+ height="{{ step_iframe.height }}"
60
+ frameborder="0"
61
+ class="rounded shadow-sm"
62
+ ></iframe>
63
+ </div>
64
+ {% endfor %}
65
+ </div>
66
+ {% endif %}
67
+
68
+ <div class="step-text mb-3">{{ step.text|safe }}</div>
69
+
70
+ {% if step.downloads %}
71
+ <div class="step-downloads row mb-4">
72
+ <div class="col-12">
73
+ <h3>Downloads</h3>
74
+ </div>
75
+ {% for step_download in step.downloads %}
76
+ <div class="col-md-2 mb-3">
77
+ <a href="{{ step_download.src }}" class="btn btn-primary w-100"
78
+ >{{ step_download.name }}</a
79
+ >
80
+ </div>
81
+ {% endfor %}
82
+ </div>
83
+ {% endif %}
84
+ </section>
85
+ {% endfor %}
86
+ </div>
87
+ {% endblock %}
@@ -0,0 +1,27 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>{% if title %}{{ title }} - {% endif %}Structables</title>
7
+ <link
8
+ rel="stylesheet"
9
+ href="{{ url_for('static', filename='css/style.css') }}"
10
+ />
11
+ <link
12
+ rel="stylesheet"
13
+ href="{{ url_for('static', filename='dist/css/bootstrap.min.css') }}"
14
+ />
15
+ <link
16
+ rel="icon"
17
+ type="image/png"
18
+ href="{{ url_for('static', filename='img/logo.png') }}"
19
+ />
20
+ </head>
21
+
22
+ <body>
23
+ {% include "header.html" %}
24
+ <main>{% block content %} {% endblock %}</main>
25
+ {% include "footer.html" %}
26
+ </body>
27
+ </html>
@@ -0,0 +1,68 @@
1
+ {% extends "base.html" %} {% block content %}
2
+ <div class="container">
3
+ <h1 class="text-center">{{ title }}</h1>
4
+ <div class="row">
5
+ {% for channel in channels %}
6
+ <div class="col-6 col-md-4 col-lg-3 text-center mb-3">
7
+ <a
8
+ href="/{{ channel }}"
9
+ class="btn btn-primary d-block position-relative"
10
+ >
11
+ {{ channel }}
12
+ </a>
13
+ </div>
14
+ {% endfor %}
15
+ </div>
16
+
17
+ <h2 class="text-center">
18
+ <a href="{{ path }}projects/">Featured Projects</a>
19
+ </h2>
20
+ <div class="row">
21
+ {% for ible in ibles %}
22
+ <div class="col-xs-12 col-sm-6 col-lg-4 mb-4">
23
+ <div class="card h-100 d-flex flex-column">
24
+ <a href="{{ ible.link }}">
25
+ <img
26
+ class="card-img-top"
27
+ src="{{ ible.img }}"
28
+ alt="{{ ible.alt }}"
29
+ style="max-width: 100%"
30
+ />
31
+ <div class="card-body">
32
+ <h5 class="card-title">{{ ible.title }}</h5>
33
+ </div>
34
+ </a>
35
+ <div class="card-footer mt-auto">
36
+ <p class="card-text">
37
+ by <a href="{{ ible.author_link }}">{{ ible.author }}</a>
38
+ </p>
39
+ <p class="card-text">
40
+ in <a href="{{ ible.channel_link }}">{{ ible.channel }}</a>
41
+ </p>
42
+ <p class="card-text">
43
+ {{ ible.favorites }} Favorites, {{ ible.views }} Views
44
+ </p>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ {% endfor %}
49
+ </div>
50
+
51
+ <!-- Doesn't seem to be current
52
+ <h2 class="text-center"><a href="/contest/">Contests</a></h2>
53
+ <div class="row">
54
+ <div class="col">
55
+ {% for contest in contests %}
56
+ <a href="{{ contest.link }}">
57
+ <img
58
+ src="{{ contest.img }}"
59
+ alt="{{ contest.title }}"
60
+ class="img-fluid"
61
+ />
62
+ </a>
63
+ {% endfor %}
64
+ </div>
65
+ </div>
66
+ -->
67
+ </div>
68
+ {% endblock %}
@@ -0,0 +1,34 @@
1
+ {% extends "base.html" %} {% block content %}
2
+ <div class="container text-center">
3
+ <h1>{{ title }}</h1>
4
+ <p>
5
+ by <a href="{{ author_link }}">{{ author }}</a> in
6
+ <a href="{{ category_link }}">{{ category }}</a> &gt;
7
+ <a href="{{ channel_link }}">{{ channel }}</a>
8
+ </p>
9
+ <p>{{ views }} Views, {{ favorites }} Favorites</p>
10
+
11
+ <div class="row justify-content-center">
12
+ {% for thumbnail in thumbnails %}
13
+ <div class="col-md-4 mb-3">
14
+ <div class="ible-list-item">
15
+ <a href="{{ thumbnail.link }}" style="color: #bbc2cf">
16
+ <img
17
+ class="img-fluid"
18
+ src="{{ thumbnail.img }}"
19
+ alt="{{ thumbnail.title }}"
20
+ style="max-width: 350px"
21
+ />
22
+ <p>{{ thumbnail.author }}</p>
23
+ </a>
24
+ <p>
25
+ by <a href="{{ thumbnail.author_link }}">{{ thumbnail.author }}</a> in
26
+ <a href="{{ thumbnail.channel_link }}">{{ thumbnail.channel }}</a>
27
+ </p>
28
+ </div>
29
+ </div>
30
+ {% endfor %}
31
+ </div>
32
+ </div>
33
+
34
+ {% endblock %}
@@ -0,0 +1,23 @@
1
+
2
+ {% extends "base.html" %}
3
+
4
+ {% block content %}
5
+ <center>
6
+ <img src="{{ img }}" alt="{{ title }}" style="max-width:98vw;">
7
+ <p>{{ entry_count }} Entries, {{ prizes }} Prizes</p>
8
+ <br>
9
+ {{ info|safe }}
10
+ <div class="ible-list">
11
+ {% for ible in entries %}
12
+ <div class="ible-list-item">
13
+ <a href="{{ ible.link }}" style="color:#bbc2cf;">
14
+ <img style="max-width:350px;" src="{{ ible.entry_img }}" alt="{{ ible.entry_title }}">
15
+ <p>{{ ible.entry_title }}</p>
16
+ </a>
17
+ <p>by <a href="{{ ible.author_link }}">{{ ible.author }}</a> in <a href="{{ ible.channel_link }}">{{ ible.channel }}</a></p>
18
+ <p>{{ ible.views }} Views</p>
19
+ </div>
20
+ {% endfor %}
21
+ </div>
22
+ </center>
23
+ {% endblock %}
@@ -0,0 +1,40 @@
1
+ {% extends "base.html" %}
2
+
3
+ {% block content %}
4
+ <center>
5
+ <h1>{{ title }}</h1>
6
+ {{ contest_count|safe }}
7
+ <br>
8
+ <div class="contest-list">
9
+ {% for contest in contests %}
10
+ <div class="contest-list-item">
11
+ <a href="{{ contest.link }}">
12
+ <img src="{{ contest.img }}" alt="{{ contest.alt }}" style="max-width:500px;">
13
+ </a>
14
+ <p>Closes {{ contest.deadline }}</p>
15
+ <p class="ible-small">{{ contest.prizes }} Prizes, {{ contest.entries }} Entries</p>
16
+ </div>
17
+ {% endfor %}
18
+ </div>
19
+ <div class="closed-contests" id="contest-winners">
20
+ <h2>Winner's Circle</h2>
21
+ {% for closed in closed %}
22
+ <div class="closed-contest">
23
+ <a href="{{ closed.link }}"><img class="closed-contest-contest" src="{{ closed.img }}"
24
+ alt="{{ closed.alt }}"></a>
25
+ {% for featured_items in closed.featured_items %}
26
+ <div class="closed-contest-winner">
27
+ <a href="{{ featured_items.link }}">
28
+ <img class="closed-contest-winner-img" src="{{ featured_items.img }}"
29
+ alt="{{ featured_items.title}}">
30
+ <br>
31
+ <b>{{ featured_items.title }}</b>
32
+ </a>
33
+ <p>by <a href="{{ featured_items.author_link }}">{{ featured_items.author }}</a></p>
34
+ </div>
35
+ {% endfor %}
36
+ </div>
37
+ {% endfor %}
38
+ </div>
39
+ </center>
40
+ {% endblock %}