16 | {{tag.description}} Subscribe to this tag’s RSS feed to get new {{tag.name}} posts as they’re written.
17 |
18 |
19 |
20 | {{plural pagination.total empty='There are no articles with this tag … how did you find it?!' singular='A % post collection:' plural='A % post collection:'}}
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | {{> "loop"}}
30 |
31 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2017-2021 Curiositry - Released under The MIT License.
2 |
3 | Permission is hereby granted, free of charge, to any person
4 | obtaining a copy of this software and associated documentation
5 | files (the "Software"), to deal in the Software without
6 | restriction, including without limitation the rights to use,
7 | copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the
9 | Software is furnished to do so, subject to the following
10 | conditions:
11 |
12 | The above copyright notice and this permission notice shall be
13 | included in all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 | OTHER DEALINGS IN THE SOFTWARE.
23 |
--------------------------------------------------------------------------------
/partials/main-header.hbs:
--------------------------------------------------------------------------------
1 |
2 |
You don't have access to this post on {{@site.title}} at the moment, but if you upgrade your account you'll be able to see the whole thing, as well as all the other posts in the archive! Subscribing only takes a few seconds and will give you immediate access.
20 | Your subscription will expire on {{date current_period_end format="DD MMM YYYY"}}. If you change your mind in the mean time you can turn auto-renew back on to continue your subscription.
21 |
22 | {{else}}
23 |
24 | Hey! You have an active {{@site.title}} account with access to all areas. Get in touch if have any problems or need some help getting things updated, and thanks for subscribing.
25 |
81 |
82 | {{else}}
83 |
84 | {{!-- Not logged in: Redirect to signin --}}
85 |
86 |
87 | {{/if}}
88 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | Undefined — A starting point for Ghost theme developers
4 | =======================================================
5 |
6 | ## !!! THIS PROJECT HAS MOVED TO https://git.sr.ht/~curiositry/undefined-ghost-theme !!!
7 |
8 | **This starter theme has everything you need to get started making themes for the Ghost blogging platform.**
9 |
10 | *Looking for a nice theme that’s ready to go? Check out my other themes, [Mnml](http://github.com/curiositry/mnml-ghost-theme) (free), [Laminim](https://creativemarket.com/Curiositry/1037280-Laminim-%E2%80%94-Ghost-Theme-for-Bloggers) (premium), and [Weblog]() (premium). If you would like to support my work developing free Ghost themes, use this referral link to **[sign up for Ghost(Pro) hosting for your blog](https://ghost.org/?via=curiositry)** and use my code `nFFYMCxS` for a 10% discount.*
11 |
12 | ## Features
13 |
14 | - **Bring your own CSS**. Front end developers are persnickety about their CSS frameworks: Some write everything from scratch, some roll their own framework that they use in all their projects (in my case, Sassify), and some use Bootstrap or Foundation or the current *framework-de-jour*. Undefined leaves all the styling to you: just drop your styles in `main.css` and you’re ready to go.
15 |
16 | - **Responsive!** Because plain HTML is responsive *by default*.
17 |
18 | - **Ready for Ghost 6 and beyond.** With undefined as a starting point, your theme is ready for the future.
19 |
20 | - **Super modular.** Undefined makes use of handlebar partials to break things into neat, self-contained modules. Don’t want a subscribe form? Remove the `subscribe-widget` module without code-surgery.
21 |
22 | - **Ready-to-roll**. Everything you’d expect from a Ghost theme is built in: A homepage with post teasers, author pages, tag pages, navigation menu, subscribe form, metadata, and more. Free cars don’t often come with gas in tank and air in the tires!
23 |
24 | - **Smart defaults.** You can customize undefined in a thousand different ways, and it makes the job easier by being as close to neutral as possible. It’s like a dark grey suit — it’s not flashy, but it can go anywhere. You get a menu with a list of links, a little author bio below each post, reasonable metadata below the title. You get a footer with copyright date and theme attribution. You get all the files that Ghost requires (post page, index, etc) to run, plus all the files a blog needs to be complete (tag and author pages, etc). Nothing fancy, but very respectable.
25 |
26 | - **Cleanly coded and comprehensively commented**. The code is nice and clean, W3C valid, and scores "A" on Google pagespeed.
27 |
28 | ## Getting started
29 |
30 | Getting started building on Undefined is as easy as one, two.
31 |
32 | - { 1 }: **Download this starter theme by [clicking here](https://github.com/curiositry/undefined-ghost-theme/archive/master.zip), or clone it with Git**:
33 |
34 | ```
35 | git clone https://github.com/curiositry/undefined-ghost-theme.git
36 | ```
37 |
38 | - { 2 }: **Add your custom styles.** Open up main.css and add your styles. Or, fire up your CSS pre- or post-processor of choice and replace `main.css` with your compiled stylesheet.
39 |
40 |
41 | *If you plan on using the enabling memberships and subscriptions, you will also need to upload the included `routes.yaml` from the "Labs" tab of your blog’s admin panel.*
42 |
43 | ## Screenshot
44 |
45 | Undefined is completely unstyled: no custom fonts, no fancy colours, no nothing. The beauty of undefined is in the code, not the design. But unstyled HTML has a rugged beauty of its own — in fact, to my eyes it looks *better* than many ~~of the digital junkyards piled high with CSS + JavaScript~~ “modern” websites!
46 |
47 | 
48 |
--------------------------------------------------------------------------------
/default.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{! Document Settings }}
5 |
6 |
7 |
8 | {{! Makes IE support useful HTML5/CSS3 features }}
9 |
10 |
11 | {{! Page Meta }}
12 | {{meta_title}}{{#is "post, page"}} — {{@site.title}}{{/is}}
13 |
14 | {{! Styles }}
15 |
16 |
17 | {{! Ghost outputs important stuff with this tag }}
18 | {{ghost_head}}
19 |
20 |
21 |
22 | {{! Everything else gets inserted here }}
23 | {{{body}}}
24 |
25 | {{! Site Footer }}
26 | {{> footer}}
27 |
28 | {{!-- Scripts for Members subscription --}}
29 |
90 |
91 | {{! Ghost outputs important scripts with this, including the the content for the code injection pane }}
92 | {{ghost_foot}}
93 |
94 |
95 |
96 |
--------------------------------------------------------------------------------
/assets/css/main.css:
--------------------------------------------------------------------------------
1 | /* Put your styles (or personal collection of CSS frameworks) here */
2 |
3 | :root {
4 | --serif-font-stack: serif;
5 | --sans-font-stack: sans;
6 | --mono-font-stack: monospace;
7 | }
8 |
9 | body {
10 | max-width: 800px;
11 | margin-right: auto;
12 | margin-left: auto;
13 | line-height: 1.5;
14 | }
15 |
16 | .has-serif-text p {
17 | font-family: var(--gh-font-body, var(--serif-font-stack));
18 | }
19 |
20 | .has-sans-text p {
21 | font-family: var(--gh-font-body, var(--sans-font-stack));
22 | }
23 |
24 | .has-mono-text p {
25 | font-family: var(--gh-font-body, var(--mono-font-stack));
26 | }
27 |
28 | .has-serif-header * {
29 | font-family: var(--gh-font-heading, var(--serif-font-stack));
30 | }
31 |
32 | .has-sans-header * {
33 | font-family: var(--gh-font-heading, var(--sans-font-stack));
34 | }
35 |
36 | .has-mono-header * {
37 | font-family: var(--gh-font-heading, var(--mono-font-stack));
38 | }
39 |
40 | /* .has-serif-header h1,
41 | .has-serif-header h2,
42 | .has-serif-header h3,
43 | .has-serif-header h4,
44 | .has-serif-header h5,
45 | .has-serif-header h6 {
46 | font-family: var(--serif-font-stack);
47 | }
48 |
49 | .has-sans-header h1,
50 | .has-sans-header h2,
51 | .has-sans-header h3,
52 | .has-sans-header h4,
53 | .has-sans-header h5,
54 | .has-sans-header h6 {
55 | font-family: var(--sans-font-stack);
56 | }
57 |
58 | .has-mono-header h1,
59 | .has-mono-header h2,
60 | .has-mono-header h3,
61 | .has-mono-header h4,
62 | .has-mono-header h5,
63 | .has-mono-header h6 {
64 | font-family: var(--mono-font-stack);
65 | } */
66 |
67 | img {
68 | max-width: 100%;
69 | height: auto;
70 | }
71 |
72 | figure {
73 | margin-left: auto;
74 | margin-right: auto;
75 | }
76 |
77 | figcaption {
78 | text-align: center;
79 | }
80 |
81 | .inline-block {
82 | display: inline-block;
83 | }
84 |
85 | /* Remove vertical whitespace on initial, final, & stacked full-width cards, per recommendation. */
86 | .page--no-header .kg-width-full:not(.kg-card-hascaption):first-child,
87 | .kg-width-full+.kg-width-full {
88 | margin-top: 0;
89 | }
90 |
91 | .page__content .kg-width-full:not(.kg-card-hascaption):last-child,
92 | .kg-width-full+.kg-width-full {
93 | margin-bottom: 0;
94 | }
95 |
96 |
97 | /* IMAGE WIDTH STYLES */
98 | /* ================== */
99 |
100 | /* Style at will... */
101 | /* figure.kg-width-full { } */
102 | /* figure.kg-width-wide { } */
103 | /*
104 | PROTIP:
105 | Try something like as a starting point for centering images that are wider than their parent container's width:
106 |
107 | .full-bleed {
108 | width: 100vw;
109 | position: relative;
110 | left: 50%;
111 | right: 50%;
112 | margin-left: -50vw;
113 | margin-right: -50vw;
114 | }
115 |
116 | For large images that aren't full width, but are larger than their parent, just replace 100vw with your max width (say, 1000px), and then replace the -50vw margins with -{NUM}px / 2 (in this case, -500px). You can see a version of this techinique in action in the stylesheet of my MNML Ghost theme:
117 | https://github.com/curiositry/mnml-ghost-theme
118 | */
119 |
120 | /* IMAGE GALLERY STYLES */
121 | /* ==================== */
122 |
123 | /* Style at will... */
124 | .kg-gallery-card {}
125 |
126 | .kg-gallery-container {}
127 |
128 | .kg-gallery-row {}
129 |
130 | .kg-gallery-image {}
131 |
132 | /*
133 | Docs can be found here: http://themes.ghost.org/docs/ghost-editor#section-gallery-card
134 |
135 | The implementation that Ghost recommends is pretty robust, with one caveat: it needs a few lines of JavaScrpt. Example can be found here:
136 | https://github.com/TryGhost/Casper/pull/475/files#diff-ce5e030f2e2e2a50f18199464f07ea70
137 | */
138 |
139 |
140 | /* BOOKMARK CARD STYLES */
141 | /* ==================== */
142 |
143 | /* Style at will... */
144 | .kg-bookmark-card {}
145 |
146 | .kg-bookmark-container {}
147 |
148 | .kg-bookmark-content {}
149 |
150 | .kg-bookmark-title {}
151 |
152 | .kg-bookmark-description,
153 | .kg-bookmark-metadata {}
154 |
155 | .kg-bookmark-thumbnail {}
156 |
157 | .kg-bookmark-thumbnail img {}
158 |
159 | .kg-bookmark-icon {}
160 |
161 | .kg-bookmark-author:after {}
162 |
163 | .kg-bookmark-publisher {}
164 |
165 |
166 | /*
167 | Docs can be found here: https://ghost.org/docs/api/v2/handlebars-themes/editor/#bookmark-card
168 |
169 | The example implementation in the Ghost docs isn't bad, although you may want to adjust the image styles a bit.
170 |
171 | Want something a bit leaner? You can drop the snippet I used in my premium Weblog theme that right in here! Here it is: https://gist.github.com/curiositry/511c84204f136a97d65cf77a39b230bf
172 | */
173 |
174 |
175 | /* SUBSCRIPTION & MEMBERSHIP STYLES */
176 | /* ================================= */
177 |
178 | .notification-area {
179 | display: none;
180 | margin-left: auto;
181 | margin-right: auto;
182 | text-align: center;
183 | background-color: #99ea02;
184 | padding: 1rem;
185 | box-sizing: border-box;
186 | }
187 |
188 | .billing-cancel .notification-area {
189 | background-color: #ccc;
190 | }
191 |
192 | .message-success,
193 | .message-error {
194 | display: none;
195 | }
196 |
197 | .message-error,
198 | [data-members-error] {
199 | color: red;
200 | }
201 |
202 | .message-success {
203 | color: green;
204 | }
205 |
206 | .loading button span,
207 | .error button span,
208 | .success button span {
209 | display: none;
210 | }
211 |
212 | .loading button::after {
213 | content: "Loading...";
214 | }
215 |
216 | .error button::after {
217 | content: "Error :(";
218 | }
219 |
220 | .success button::after {
221 | content: "Success :)";
222 | }
223 |
224 | .success~.message-success,
225 | .invalid~.message-error,
226 | .error~.message-error {
227 | display: block;
228 | }
229 |
230 | .email-optin-widget--welcome-mat {
231 | height: 100vh;
232 | width: 100vw;
233 | display: flex;
234 | align-items: center;
235 | justify-content: center;
236 | max-width: 100%;
237 | }
238 |
--------------------------------------------------------------------------------