cubed-cli 0.1.0 → 0.1.2
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.
- package/README.md +1 -1
- package/dist/commands/create.js +89 -18
- package/dist/index.js +7 -1
- package/dist/scripts/copy-templates.js +38 -0
- package/dist/templates/global/fonts.css +0 -0
- package/dist/templates/global/global-styles.css +373 -0
- package/dist/templates/global/reset.css +91 -0
- package/dist/templates/global/sizes/space.css +36 -0
- package/dist/templates/global/sizes/text.css +17 -0
- package/dist/templates/global/theme.css +32 -0
- package/dist/templates/root.css +18 -0
- package/dist/utils/common.js +81 -1
- package/package.json +4 -3
- package/src/commands/create.ts +73 -22
- package/src/index.ts +5 -1
- package/src/scripts/copy-templates.ts +4 -0
- package/src/templates/global/fonts.css +0 -0
- package/src/templates/global/global-styles.css +373 -0
- package/src/templates/global/reset.css +91 -0
- package/src/templates/global/sizes/space.css +36 -0
- package/src/templates/global/sizes/text.css +17 -0
- package/src/templates/global/theme.css +32 -0
- package/src/templates/root.css +18 -0
- package/src/utils/common.ts +39 -1
package/README.md
CHANGED
package/dist/commands/create.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
36
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
37
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -14,24 +47,62 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
14
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
48
|
exports.create = void 0;
|
|
16
49
|
const commander_1 = require("commander");
|
|
17
|
-
const
|
|
50
|
+
const p = __importStar(require("@clack/prompts"));
|
|
51
|
+
const common_1 = require("../utils/common");
|
|
52
|
+
const fs = __importStar(require("node:fs"));
|
|
53
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
18
54
|
exports.create = new commander_1.Command("create")
|
|
19
55
|
.description("scaffolds a new project")
|
|
20
|
-
.action(() =>
|
|
21
|
-
|
|
22
|
-
directory
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
},
|
|
56
|
+
.action(() => {
|
|
57
|
+
(0, common_1.runCommand)(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
58
|
+
const { directory } = yield createProject();
|
|
59
|
+
// In the future, here is where additional steps can be introduced.
|
|
60
|
+
// TODO: detect if the base dirs are already created
|
|
61
|
+
// TODO: use a spinner and highlighting to indicate what is happening
|
|
62
|
+
// TODO: how to cleanup files if something fails mid process
|
|
63
|
+
const templatesPath = node_path_1.default.join(__dirname, "../templates");
|
|
64
|
+
copyTemplateFiles(templatesPath, directory);
|
|
65
|
+
}));
|
|
66
|
+
});
|
|
67
|
+
function makeDirs() {
|
|
68
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
+
yield p.text({ message: "making dirs" });
|
|
35
70
|
});
|
|
36
|
-
|
|
37
|
-
|
|
71
|
+
}
|
|
72
|
+
// recursively generate base directories and files
|
|
73
|
+
function copyTemplateFiles(sourcePath, destPath) {
|
|
74
|
+
const entries = fs.readdirSync(sourcePath);
|
|
75
|
+
entries.forEach((entry) => {
|
|
76
|
+
const sourceEntryPath = node_path_1.default.join(sourcePath, entry);
|
|
77
|
+
const relativeEntryPath = node_path_1.default.relative(node_path_1.default.join(__dirname, "../templates"), sourceEntryPath);
|
|
78
|
+
if ((0, common_1.isDir)(sourceEntryPath)) {
|
|
79
|
+
// Recursively process subdirectories
|
|
80
|
+
copyTemplateFiles(sourceEntryPath, destPath);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Copy file
|
|
84
|
+
const content = (0, common_1.readFile)(node_path_1.default.join(__dirname, "../templates"), relativeEntryPath);
|
|
85
|
+
(0, common_1.writeFile)(destPath, relativeEntryPath, content);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function createProject() {
|
|
90
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
const { directory } = yield p.group({
|
|
92
|
+
directory: () => {
|
|
93
|
+
const defaultPath = "./styles";
|
|
94
|
+
return p.text({
|
|
95
|
+
message: "Where would you like to generate the styles?",
|
|
96
|
+
placeholder: `(hit Enter to use '${defaultPath}')`,
|
|
97
|
+
defaultValue: defaultPath,
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
}, {
|
|
101
|
+
onCancel: () => {
|
|
102
|
+
p.cancel("operation cancelled");
|
|
103
|
+
process.exit(0);
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
return { directory };
|
|
107
|
+
});
|
|
108
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const package_json_1 = __importDefault(require("../package.json"));
|
|
3
7
|
const commander_1 = require("commander");
|
|
4
8
|
const create_1 = require("./commands/create");
|
|
5
|
-
|
|
9
|
+
// adds a gap of spacing between the executing command and the output
|
|
10
|
+
console.log();
|
|
11
|
+
commander_1.program.name("cubed-cli").version(package_json_1.default.version);
|
|
6
12
|
commander_1.program.addCommand(create_1.create);
|
|
7
13
|
commander_1.program.parse();
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const fs = __importStar(require("fs"));
|
|
37
|
+
fs.cpSync('src/templates', 'dist/templates', { recursive: true });
|
|
38
|
+
console.log('✓ Templates copied');
|
|
File without changes
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Global styles
|
|
3
|
+
|
|
4
|
+
Low-specificity, global styles that apply to the whole
|
|
5
|
+
project: https://cube.fyi/css.html
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
body {
|
|
9
|
+
/* color: var(--text-color); */
|
|
10
|
+
color: var(--color-dark);
|
|
11
|
+
/* background: var(--background); */
|
|
12
|
+
background: var(--color-light);
|
|
13
|
+
font-size: var(--text-step-1);
|
|
14
|
+
font-family: var(--font-base);
|
|
15
|
+
line-height: var(--leading-standard);
|
|
16
|
+
font-size-adjust: from-font;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
:is(h1, h2, h3, h4) {
|
|
20
|
+
line-height: var(--leading-fine);
|
|
21
|
+
text-wrap: balance;
|
|
22
|
+
font-family: var(--font-heading);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
:is(h1, h2, h3, h4):where(
|
|
26
|
+
[class*="text-step-8"],
|
|
27
|
+
[class*="text-step-9"],
|
|
28
|
+
[class*="text-step-10"]
|
|
29
|
+
) {
|
|
30
|
+
line-height: var(--leading-micro);
|
|
31
|
+
font-weight: var(--font-black);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
h1 {
|
|
35
|
+
font-size: var(--text-step-6);
|
|
36
|
+
max-width: 20ch;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
h2 {
|
|
40
|
+
font-size: var(--text-step-5);
|
|
41
|
+
max-width: 35ch;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
h3 {
|
|
45
|
+
font-size: var(--text-step-4);
|
|
46
|
+
max-width: 35ch;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
:is(h4, h5, h6) {
|
|
50
|
+
font-size: var(--text-step-3);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
small {
|
|
54
|
+
font-size: var(--text-step-0);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
ins {
|
|
58
|
+
text-decoration: none;
|
|
59
|
+
background: var(--color-primary);
|
|
60
|
+
color: var(--color-dark);
|
|
61
|
+
padding-inline: 0.3em;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
:is(code, kbd, samp) {
|
|
65
|
+
font-family: var(--font-mono);
|
|
66
|
+
padding: 0.2em 0.2em 0.05em 0.2em;
|
|
67
|
+
hyphens: none;
|
|
68
|
+
tab-size: 2;
|
|
69
|
+
text-align: left;
|
|
70
|
+
word-spacing: normal;
|
|
71
|
+
word-break: normal;
|
|
72
|
+
word-wrap: normal;
|
|
73
|
+
box-decoration-break: clone;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* This is quite a new property, so we want code styles to at least, not be huge or tiny */
|
|
77
|
+
@supports not (font-size-adjust: from-font) {
|
|
78
|
+
:is(code, kbd, samp) {
|
|
79
|
+
font-size: 0.8em;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
pre:has(code) {
|
|
84
|
+
width: max-content;
|
|
85
|
+
max-width: 100%;
|
|
86
|
+
overflow-x: auto;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
pre code {
|
|
90
|
+
border: none;
|
|
91
|
+
background: none;
|
|
92
|
+
padding: 0;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
kbd {
|
|
96
|
+
border: 1px solid;
|
|
97
|
+
padding-block-end: 0.1em;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
var {
|
|
101
|
+
font-style: normal;
|
|
102
|
+
font-weight: var(--font-medium);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
q {
|
|
106
|
+
font-style: italic;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
ul:not(.navigation, .list-override) {
|
|
110
|
+
padding-inline-start: 1.7ch;
|
|
111
|
+
list-style-type: disc;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
ul:not(.navigation, .list-override) > li {
|
|
115
|
+
padding-inline-start: var(--space-xs);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
:is(ol, ul):not(.navigation, .list-override) li + * {
|
|
119
|
+
margin-block-start: var(--space-3xs);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
ul ::marker {
|
|
123
|
+
font-size: 0.8lh;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
ol ::marker {
|
|
127
|
+
font-size: 1em;
|
|
128
|
+
font-weight: var(--font-bold);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* Lists with classes and roles will be out of standard flow, so remove the default spacing */
|
|
132
|
+
[role="list"][class],
|
|
133
|
+
[role="tablist"][class] {
|
|
134
|
+
margin-block: 0;
|
|
135
|
+
padding: 0;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
dt {
|
|
139
|
+
font-weight: var(--font-medium);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
dt + dd {
|
|
143
|
+
margin-block-start: var(--space-xs);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
dd + dt {
|
|
147
|
+
margin-block-start: var(--space-s);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
dd {
|
|
151
|
+
margin-inline-start: 1.5ch;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
blockquote {
|
|
155
|
+
display: inline-block;
|
|
156
|
+
margin-inline: var(--space-s);
|
|
157
|
+
padding: var(--space-m);
|
|
158
|
+
color: var(--background);
|
|
159
|
+
background-color: var(--text-color);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
blockquote footer {
|
|
163
|
+
margin-block-start: var(--space-xs);
|
|
164
|
+
color: var(--color-primary);
|
|
165
|
+
font-size: var(--text-step-0);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
blockquote q {
|
|
169
|
+
font-style: normal;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
:is(video, iframe[src*="youtube"], iframe[src*="vimeo"]) {
|
|
173
|
+
display: block;
|
|
174
|
+
width: 100%;
|
|
175
|
+
height: auto;
|
|
176
|
+
aspect-ratio: 16/9;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
img {
|
|
180
|
+
height: auto;
|
|
181
|
+
max-width: 100%;
|
|
182
|
+
display: block;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
figcaption {
|
|
186
|
+
padding-block-start: 0.5em;
|
|
187
|
+
font-size: var(--text-step-0);
|
|
188
|
+
font-family: monospace;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
table {
|
|
192
|
+
border: var(--stroke);
|
|
193
|
+
border-collapse: collapse;
|
|
194
|
+
width: 100%;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
th {
|
|
198
|
+
text-align: left;
|
|
199
|
+
font-weight: var(--font-bold);
|
|
200
|
+
line-height: var(--leading-fine);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
thead th {
|
|
204
|
+
padding-block: var(--space-s);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
td,
|
|
208
|
+
th {
|
|
209
|
+
padding: var(--space-xs) var(--space-s);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
th:not(:only-of-type) {
|
|
213
|
+
border-block-end: var(--stroke);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
th:only-of-type {
|
|
217
|
+
border-inline-end: var(--stroke);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
:is(th, td) ~ :is(th, td) {
|
|
221
|
+
border-inline-start: var(--stroke);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
tr + tr :is(th, td) {
|
|
225
|
+
border-block-start: var(--stroke);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
caption {
|
|
229
|
+
caption-side: bottom;
|
|
230
|
+
margin-block-start: var(--space-s);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
a:not([class]):hover {
|
|
234
|
+
text-underline-offset: 0.2lh;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
:is(h1, h2, h3, h4) a:not([class]) {
|
|
238
|
+
text-decoration-thickness: 0.1ex;
|
|
239
|
+
text-underline-offset: 0.2ex;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
:is(h1, h2, h3, h4) a:not([class]):hover {
|
|
243
|
+
text-underline-offset: 0.3ex;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
:focus {
|
|
247
|
+
outline: none;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
:focus-visible {
|
|
251
|
+
outline: 2px solid var(--focus-color, currentColor);
|
|
252
|
+
outline-offset: var(--focus-offset, 0.2lh);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/* Firefox is the only browser that doesn't outline the whole element unless you make it display: inline-block. That in itself causes multiple flow issues so we can detect it, using its own vendor prefix and reduce focus offset
|
|
256
|
+
*/
|
|
257
|
+
@supports (-moz-appearance: none) {
|
|
258
|
+
:root {
|
|
259
|
+
--focus-offset: 0.08em;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
:target {
|
|
264
|
+
scroll-margin-block: 5lh;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
::selection {
|
|
268
|
+
color: var(--color-light);
|
|
269
|
+
background: var(--color-dark);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
hr {
|
|
273
|
+
border: none;
|
|
274
|
+
border-block-start: var(--hr-stroke, var(--stroke));
|
|
275
|
+
margin-block: var(--flow-space, var(--space-xl));
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
svg:not([class]) {
|
|
279
|
+
width: auto;
|
|
280
|
+
height: 1lh;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
svg {
|
|
284
|
+
flex-shrink: 0;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
svg[role="img"][width][height] {
|
|
288
|
+
width: revert;
|
|
289
|
+
height: revert;
|
|
290
|
+
background: var(--color-light);
|
|
291
|
+
padding: var(--space-xs);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/* There's a .flow composition, but this prevents forms from having to have that applied where markup is harder to control in certain systems. It still uses the --flow-space variables though to make managing space easier */
|
|
295
|
+
form > * + * {
|
|
296
|
+
margin-top: var(--flow-space, 1rem);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
:is(input, select, textarea) {
|
|
300
|
+
accent-color: var(--color-primary);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
:is(
|
|
304
|
+
input:not([type="checkbox"], [type="radio"], [type="color"]),
|
|
305
|
+
select,
|
|
306
|
+
textarea
|
|
307
|
+
) {
|
|
308
|
+
padding: 0.5em 0.8em;
|
|
309
|
+
border-radius: var(--radius-s);
|
|
310
|
+
border: var(--stroke-solid);
|
|
311
|
+
background: var(--color-dark-glare);
|
|
312
|
+
color: var(--color-light);
|
|
313
|
+
width: 100%;
|
|
314
|
+
|
|
315
|
+
&::placeholder {
|
|
316
|
+
color: var(--color-mid);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
label {
|
|
321
|
+
line-height: var(--leading-fine);
|
|
322
|
+
font-weight: var(--font-medium);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
label::after {
|
|
326
|
+
content: "\A";
|
|
327
|
+
white-space: pre;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/* Usually label wraps checkbox and radio buttons, so we give ourselves more layout and text-flow control with flex */
|
|
331
|
+
label:has(input) {
|
|
332
|
+
display: flex;
|
|
333
|
+
align-items: baseline;
|
|
334
|
+
gap: var(--space-s);
|
|
335
|
+
font-weight: var(--font-normal);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
label:has(input) + label:has(input) {
|
|
339
|
+
--flow-space: var(--space-s-m);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/* Slightly adjusts the vertical position of the check/radio */
|
|
343
|
+
label:has(input) input {
|
|
344
|
+
transform: translateY(-0.1ex);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
input:disabled {
|
|
348
|
+
background: var(--color-mid);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
input:disabled,
|
|
352
|
+
label input:disabled + * {
|
|
353
|
+
cursor: not-allowed;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
fieldset {
|
|
357
|
+
border: var(--stroke);
|
|
358
|
+
padding: var(--space-s);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
legend {
|
|
362
|
+
font-weight: var(--font-medium);
|
|
363
|
+
padding-inline: var(--space-xs);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
summary {
|
|
367
|
+
font-weight: var(--font-bold);
|
|
368
|
+
cursor: pointer;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
details[open] summary {
|
|
372
|
+
margin-block-end: var(--space-s);
|
|
373
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/* Modern reset: https://piccalil.li/blog/a-more-modern-css-reset/ */
|
|
2
|
+
|
|
3
|
+
/* Box sizing rules */
|
|
4
|
+
*,
|
|
5
|
+
*::before,
|
|
6
|
+
*::after {
|
|
7
|
+
box-sizing: border-box;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/* Prevent font size inflation */
|
|
11
|
+
html {
|
|
12
|
+
-moz-text-size-adjust: none;
|
|
13
|
+
-webkit-text-size-adjust: none;
|
|
14
|
+
text-size-adjust: none;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* Remove default margin in favour of better control in authored CSS */
|
|
18
|
+
body,
|
|
19
|
+
h1,
|
|
20
|
+
h2,
|
|
21
|
+
h3,
|
|
22
|
+
h4,
|
|
23
|
+
p,
|
|
24
|
+
figure,
|
|
25
|
+
blockquote,
|
|
26
|
+
dl,
|
|
27
|
+
dd {
|
|
28
|
+
margin-block: 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */
|
|
32
|
+
ul[role="list"],
|
|
33
|
+
ol[role="list"] {
|
|
34
|
+
list-style: none;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* Set core body defaults */
|
|
38
|
+
body {
|
|
39
|
+
min-height: 100vh;
|
|
40
|
+
line-height: 1.5;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* Set shorter line heights on headings and interactive elements */
|
|
44
|
+
h1,
|
|
45
|
+
h2,
|
|
46
|
+
h3,
|
|
47
|
+
h4,
|
|
48
|
+
button,
|
|
49
|
+
input,
|
|
50
|
+
label {
|
|
51
|
+
line-height: 1.1;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* Balance text wrapping on headings */
|
|
55
|
+
h1,
|
|
56
|
+
h2,
|
|
57
|
+
h3,
|
|
58
|
+
h4 {
|
|
59
|
+
text-wrap: balance;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* A elements that don't have a class get default styles */
|
|
63
|
+
a:not([class]) {
|
|
64
|
+
text-decoration-skip-ink: auto;
|
|
65
|
+
color: currentColor;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* Make images easier to work with */
|
|
69
|
+
img,
|
|
70
|
+
picture {
|
|
71
|
+
max-width: 100%;
|
|
72
|
+
display: block;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* Inherit fonts for inputs and buttons */
|
|
76
|
+
input,
|
|
77
|
+
button,
|
|
78
|
+
textarea,
|
|
79
|
+
select {
|
|
80
|
+
font: inherit;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* Make sure textareas without a rows attribute are not tiny */
|
|
84
|
+
textarea:not([rows]) {
|
|
85
|
+
min-height: 10em;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* Anything that has been anchored to should have extra scroll margin */
|
|
89
|
+
:target {
|
|
90
|
+
scroll-margin-block: 5ex;
|
|
91
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
/* spacing */
|
|
3
|
+
/* https://utopia.fyi/space/calculator/?c=360,18,1.2,1240,20,1.25,8,2,&s=0.75|0.5|0.25,1.5|2|3|4|6,s-l&g=s,l,xl,12 */
|
|
4
|
+
--space-3xs: clamp(0.3125rem, 0.3125rem + 0vw, 0.3125rem);
|
|
5
|
+
--space-2xs: clamp(0.5625rem, 0.5369rem + 0.1136vw, 0.625rem);
|
|
6
|
+
--space-xs: clamp(0.875rem, 0.8494rem + 0.1136vw, 0.9375rem);
|
|
7
|
+
--space-s: clamp(1.125rem, 1.0739rem + 0.2273vw, 1.25rem);
|
|
8
|
+
--space-m: clamp(1.6875rem, 1.6108rem + 0.3409vw, 1.875rem);
|
|
9
|
+
--space-l: clamp(2.25rem, 2.1477rem + 0.4545vw, 2.5rem);
|
|
10
|
+
--space-xl: clamp(3.375rem, 3.2216rem + 0.6818vw, 3.75rem);
|
|
11
|
+
--space-2xl: clamp(4.5rem, 4.2955rem + 0.9091vw, 5rem);
|
|
12
|
+
--space-3xl: clamp(6.75rem, 6.4432rem + 1.3636vw, 7.5rem);
|
|
13
|
+
|
|
14
|
+
/* One-up pairs */
|
|
15
|
+
--space-3xs-2xs: clamp(0.3125rem, 0.1847rem + 0.5682vw, 0.625rem);
|
|
16
|
+
--space-2xs-xs: clamp(0.5625rem, 0.4091rem + 0.6818vw, 0.9375rem);
|
|
17
|
+
--space-xs-s: clamp(0.875rem, 0.7216rem + 0.6818vw, 1.25rem);
|
|
18
|
+
--space-s-m: clamp(1.125rem, 0.8182rem + 1.3636vw, 1.875rem);
|
|
19
|
+
--space-m-l: clamp(1.6875rem, 1.3551rem + 1.4773vw, 2.5rem);
|
|
20
|
+
--space-l-xl: clamp(2.25rem, 1.6364rem + 2.7273vw, 3.75rem);
|
|
21
|
+
--space-xl-2xl: clamp(3.375rem, 2.7102rem + 2.9545vw, 5rem);
|
|
22
|
+
--space-2xl-3xl: clamp(4.5rem, 3.2727rem + 5.4545vw, 7.5rem);
|
|
23
|
+
|
|
24
|
+
/* Custom pairs */
|
|
25
|
+
--space-s-l: clamp(1.125rem, 0.5625rem + 2.5vw, 2.5rem);
|
|
26
|
+
|
|
27
|
+
--gutter: var(--space-xl-2xl);
|
|
28
|
+
|
|
29
|
+
--leading-micro: 0.85;
|
|
30
|
+
--leading-flat: 1;
|
|
31
|
+
--leading-fine: 1.2;
|
|
32
|
+
--leading-standard: 1.4;
|
|
33
|
+
--leading-loose: 1.7;
|
|
34
|
+
|
|
35
|
+
--measure: 60ch;
|
|
36
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/* typography sizes */
|
|
2
|
+
:root {
|
|
3
|
+
/* https://utopia.fyi/type/calculator?c=360,18,1.2,1240,20,1.25,10,2,&s=0.75|0.5|0.25,1.5|2|3|4|6,s-l&g=s,l,xl,12 */
|
|
4
|
+
--text-step--2: clamp(0.7813rem, 0.7736rem + 0.0341vw, 0.8rem);
|
|
5
|
+
--text-step--1: clamp(0.9375rem, 0.9119rem + 0.1136vw, 1rem);
|
|
6
|
+
--text-step-0: clamp(1.125rem, 1.0739rem + 0.2273vw, 1.25rem);
|
|
7
|
+
--text-step-1: clamp(1.35rem, 1.2631rem + 0.3864vw, 1.5625rem);
|
|
8
|
+
--text-step-2: clamp(1.62rem, 1.4837rem + 0.6057vw, 1.9531rem);
|
|
9
|
+
--text-step-3: clamp(1.944rem, 1.7405rem + 0.9044vw, 2.4414rem);
|
|
10
|
+
--text-step-4: clamp(2.3328rem, 2.0387rem + 1.3072vw, 3.0518rem);
|
|
11
|
+
--text-step-5: clamp(2.7994rem, 2.384rem + 1.8461vw, 3.8147rem);
|
|
12
|
+
--text-step-6: clamp(3.3592rem, 2.7828rem + 2.5621vw, 4.7684rem);
|
|
13
|
+
--text-step-7: clamp(4.0311rem, 3.2418rem + 3.508vw, 5.9605rem);
|
|
14
|
+
--text-step-8: clamp(4.8373rem, 3.7682rem + 4.7514vw, 7.4506rem);
|
|
15
|
+
--text-step-9: clamp(5.8048rem, 4.3695rem + 6.379vw, 9.3132rem);
|
|
16
|
+
--text-step-10: clamp(6.9657rem, 5.0529rem + 8.5015vw, 11.6415rem);
|
|
17
|
+
}
|