@awesomeness-js/server 1.1.7 → 1.1.9
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/package.json +1 -1
- package/src/componentDependencies.js +24 -0
- package/src/koa/routeRequest.js +87 -26
- package/example-site/example.awesomenessjs.com/components/example/index.js +0 -3
- package/example-site/example.awesomenessjs.com/components/notCommonExample/_.css +0 -1
- package/example-site/example.awesomenessjs.com/components/notCommonExample/index.js +0 -3
- package/ui/README.md +0 -438
- package/ui/awesomeness-ui.instructions.md +0 -156
- package/ui/build.js +0 -119
- package/ui/commonComponent.test.js +0 -27
- package/ui/components/blogPost/all.css +0 -371
- package/ui/components/blogPost/headerImage.js +0 -153
- package/ui/components/blogPost/index.js +0 -45
- package/ui/components/blogPost/marked.js +0 -74
- package/ui/components/blogPost/md.js +0 -73
- package/ui/components/blogPost/parseAwesomeness.jQuery.js +0 -47
- package/ui/components/blogPost/readme.md +0 -8
- package/ui/components/colors/README.md +0 -65
- package/ui/components/colors/dynamic.css +0 -1884
- package/ui/components/colors/dynamic.css.js +0 -135
- package/ui/components/colors/dynamic.css.php +0 -79
- package/ui/components/colors/example.js +0 -133
- package/ui/components/colors/index.js +0 -65
- package/ui/components/colors/map.js +0 -13
- package/ui/components/colors/random.js +0 -17
- package/ui/components/colors/tailwind-colors.css +0 -247
- package/ui/components/insertIntoList/insertIntoList.jquery.js +0 -150
- package/ui/components/statusPage/index.css +0 -120
- package/ui/components/statusPage/index.js +0 -39
- package/ui/components/tag/category.js +0 -8
- package/ui/components/tag/index.js +0 -33
- package/ui/components/tag/list.js +0 -42
- package/ui/components/tag/map.js +0 -64
- package/ui/components/tag/tagMap.css +0 -60
- package/ui/components/tag/tags.css +0 -20
- package/ui/core/css/_normalize.css +0 -57
- package/ui/core/css/dynamic/flex.js +0 -36
- package/ui/core/css/dynamic/grid.js +0 -185
- package/ui/core/css/dynamic/shortcuts.js +0 -48
- package/ui/core/css/dynamic/spacing.js +0 -61
- package/ui/core/css/dynamic/text.js +0 -80
- package/ui/core/css/dynamic/width.js +0 -75
- package/ui/core/css/dynamic.js +0 -40
- package/ui/core/js/app/api.js +0 -143
- package/ui/core/js/app/init.js +0 -88
- package/ui/core/js/app/initDarkMode.js +0 -26
- package/ui/core/js/app/initialScroll.js +0 -28
- package/ui/core/js/app/meta/update/components.js +0 -65
- package/ui/core/js/app/meta/update/pages.js +0 -86
- package/ui/core/js/app/metaUpdates.js +0 -10
- package/ui/core/js/app/page.js +0 -319
- package/ui/core/js/app/resize.js +0 -52
- package/ui/core/js/app/state/back.js +0 -16
- package/ui/core/js/app/state/create.js +0 -50
- package/ui/core/js/app/state/get.js +0 -5
- package/ui/core/js/app/state/init.js +0 -25
- package/ui/core/js/app.js +0 -41
- package/ui/core/js/jquery-3.7.1.min.js +0 -2
- package/ui/core/public/app.css +0 -1
- package/ui/core/public/app.js +0 -975
- package/ui/core/public/favicon.ico +0 -0
- package/ui/core/public/index.html +0 -40
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "Awesomeness UI HTML Instructions"
|
|
3
|
-
description: "Instructions for generating HTML using the Awesomeness UI utility-first CSS system."
|
|
4
|
-
applyTo: "awesomeness-ui/components/**/*.js"
|
|
5
|
-
---
|
|
6
|
-
# HTML Generation with Custom Utility Classes
|
|
7
|
-
|
|
8
|
-
You are generating HTML using a custom utility-first CSS system (similar to Tailwind CSS). The system provides classes for layout, spacing, positioning, text, alignment, and responsive design.
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## 📦 General Guidelines
|
|
13
|
-
|
|
14
|
-
- **Class Structure:** Use utility classes directly in `class` attributes. Do **not** write raw CSS or `<style>` tags.
|
|
15
|
-
- **Responsiveness:** Wrap responsive styles in containers with `.app-size-{size}`:
|
|
16
|
-
- `xl` = extra-large
|
|
17
|
-
- `d` = desktop
|
|
18
|
-
- `t` = tablet
|
|
19
|
-
- `p` = phone
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## 🧱 Utility Class Reference (Quick)
|
|
24
|
-
|
|
25
|
-
### ✅ Grid & Layout
|
|
26
|
-
- `.grid`, `.grid-{n}`, `.grid-rows-{n}`
|
|
27
|
-
- `.span-{n}`, `.row-span-{n}`, `.start-{n}`, `.end-{n}`
|
|
28
|
-
- `.gap-{px}`, `.gap-x-{px}`, `.gap-y-{px}`
|
|
29
|
-
|
|
30
|
-
### ✅ Alignment
|
|
31
|
-
- Justify: `.justify-center`, `.justify-between`, etc.
|
|
32
|
-
- Align: `.align-start`, `.align-stretch`, etc.
|
|
33
|
-
- Self: `.justify-self-center`, `.grid.center`, etc.
|
|
34
|
-
|
|
35
|
-
### ✅ Spacing
|
|
36
|
-
- Margin: `.m{px}`, `.mt{px}`, `.mlr{px}`, etc.
|
|
37
|
-
- Padding: `.p{px}`, `.ptb{px}`, `.pr{px}`, etc.
|
|
38
|
-
|
|
39
|
-
### ✅ Sizing
|
|
40
|
-
- `.width{percent}`, `.height{percent}`
|
|
41
|
-
- `.width-{px}`, `.max-height-{px}`, `.span{1-12}`
|
|
42
|
-
|
|
43
|
-
### ✅ Text
|
|
44
|
-
- Align: `.text-center`, `.text-right`
|
|
45
|
-
- Weight: `.text-300`, `.text-900`
|
|
46
|
-
- Size: `.text-xs`, `.text-xl`, `.text-xxxl`
|
|
47
|
-
|
|
48
|
-
### ✅ Position
|
|
49
|
-
- `.absolute`, `.relative`, `.sticky`, `.fl`, `.fr`
|
|
50
|
-
|
|
51
|
-
### ✅ Responsive Variants
|
|
52
|
-
All classes may have a `-{size}` variant scoped under `.app-size-{size}` container:
|
|
53
|
-
```html
|
|
54
|
-
<div class="app-size-p">
|
|
55
|
-
<div class="text-center-p p20-p">Mobile Friendly</div>
|
|
56
|
-
</div>
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
## 🎨 Dynamic Color Utilities
|
|
62
|
-
|
|
63
|
-
This system auto-generates utility classes for applying color styles using predefined CSS variables (`--colorName-shade`), supporting background, border, and text colors.
|
|
64
|
-
|
|
65
|
-
### ✅ Class Patterns
|
|
66
|
-
|
|
67
|
-
Each utility follows this pattern:
|
|
68
|
-
|
|
69
|
-
```
|
|
70
|
-
.{prefix}-{color}-{shade}
|
|
71
|
-
.{prefix}-{color}-{shade}--hover:hover
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
Where:
|
|
75
|
-
- `{prefix}` = `bg`, `border`, or `text`
|
|
76
|
-
- `{color}` = one of the supported color names (see below)
|
|
77
|
-
- `{shade}` = one of the supported shades (e.g., `100`, `500`, `950`)
|
|
78
|
-
|
|
79
|
-
### ✨ Examples
|
|
80
|
-
|
|
81
|
-
```html
|
|
82
|
-
<div class="bg-blue-500 text-white border-blue-700">Primary</div>
|
|
83
|
-
<div class="bg-gray-100--hover hoverable-box">Hover Me</div>
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
### 🎨 Available Color Names
|
|
87
|
-
|
|
88
|
-
```
|
|
89
|
-
red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky,
|
|
90
|
-
blue, indigo, violet, purple, fuchsia, pink, rose,
|
|
91
|
-
slate, gray, zinc, neutral, stone
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### 🌗 Shades
|
|
95
|
-
|
|
96
|
-
```
|
|
97
|
-
50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### 🖤 Black and White
|
|
101
|
-
|
|
102
|
-
```html
|
|
103
|
-
<div class="bg-black text-white border-white">Dark Card</div>
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
### 🧠 Notes
|
|
107
|
-
|
|
108
|
-
- All colors use CSS variables, such as `--blue-500`, so you can theme or dark-mode easily.
|
|
109
|
-
- `--hover` suffix variants enable hover state styling directly via class names.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
### Example Prompt
|
|
113
|
-
|
|
114
|
-
Generate HTML for a responsive product grid. It should:
|
|
115
|
-
|
|
116
|
-
Display as 4 cards per row on desktop, 2 per row on tablet, and 1 per row on phone
|
|
117
|
-
|
|
118
|
-
Each card includes:
|
|
119
|
-
|
|
120
|
-
Product image
|
|
121
|
-
|
|
122
|
-
Title (bold, large text)
|
|
123
|
-
|
|
124
|
-
Description (smaller gray text)
|
|
125
|
-
|
|
126
|
-
Price (medium weight, prominent color)
|
|
127
|
-
|
|
128
|
-
“Add to Cart” button with hover effect
|
|
129
|
-
|
|
130
|
-
Apply appropriate spacing, alignment, and sizing
|
|
131
|
-
|
|
132
|
-
### Example Response
|
|
133
|
-
|
|
134
|
-
```html
|
|
135
|
-
<div class="grid grid-1-p grid-2-t grid-4-d gap-20 p40">
|
|
136
|
-
<!-- Card -->
|
|
137
|
-
<div class="bg-white border-gray-200 p20">
|
|
138
|
-
<img src="https://via.placeholder.com/300x200" class="width-100 mb10" alt="Product">
|
|
139
|
-
<div class="text-xl text-900 mb5">Product Title</div>
|
|
140
|
-
<div class="text-sm text-gray-600 mb10">Short product description goes here.</div>
|
|
141
|
-
<div class="text-md text-blue-700 text-500 mb15">$29.99</div>
|
|
142
|
-
<button class="bg-blue-500 text-white p10 bg-blue-600--hover">Add to Cart</button>
|
|
143
|
-
</div>
|
|
144
|
-
|
|
145
|
-
<!-- Repeat as needed -->
|
|
146
|
-
<div class="bg-white border-gray-200 p20">
|
|
147
|
-
<img src="https://via.placeholder.com/300x200" class="width-100 mb10" alt="Product">
|
|
148
|
-
<div class="text-xl text-900 mb5">Another Product</div>
|
|
149
|
-
<div class="text-sm text-gray-600 mb10">Another short description.</div>
|
|
150
|
-
<div class="text-md text-blue-700 text-500 mb15">$39.99</div>
|
|
151
|
-
<button class="bg-blue-500 text-white p10 bg-blue-600--hover">Add to Cart</button>
|
|
152
|
-
</div>
|
|
153
|
-
|
|
154
|
-
<!-- Add more cards as needed -->
|
|
155
|
-
</div>
|
|
156
|
-
```
|
package/ui/build.js
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { writeFileSync, readFileSync } from 'fs';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { build, getAllFiles, combineFiles } from '@awesomeness-js/utils';
|
|
4
|
-
import { dynamicCSS } from './core/css/dynamic.js';
|
|
5
|
-
import { fileURLToPath } from 'url';
|
|
6
|
-
import { dirname } from 'path';
|
|
7
|
-
import cssnano from 'cssnano';
|
|
8
|
-
import postcss from 'postcss';
|
|
9
|
-
|
|
10
|
-
async function minifyCSS(cssString) {
|
|
11
|
-
|
|
12
|
-
try {
|
|
13
|
-
|
|
14
|
-
// Process the CSS using PostCSS and cssnano plugin
|
|
15
|
-
const result = await postcss([ cssnano ]).process(cssString, { from: undefined });
|
|
16
|
-
|
|
17
|
-
return result.css; // The minified CSS
|
|
18
|
-
|
|
19
|
-
} catch (error) {
|
|
20
|
-
|
|
21
|
-
console.error('Error minifying CSS:', error);
|
|
22
|
-
|
|
23
|
-
return null;
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
async function buildUI(){
|
|
31
|
-
|
|
32
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
33
|
-
const __dirname = dirname(__filename);
|
|
34
|
-
const coreDir = join(__dirname, 'core');
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
await build({
|
|
38
|
-
src: './awesomeness-ui/components',
|
|
39
|
-
dest: './ui-intellisense.js',
|
|
40
|
-
dts: false,
|
|
41
|
-
fileTypes: [ 'js' ],
|
|
42
|
-
ignore: [
|
|
43
|
-
'*.iif.js',
|
|
44
|
-
'*.jquery.js',
|
|
45
|
-
'*.jQuery.js',
|
|
46
|
-
'*.test.js',
|
|
47
|
-
'*.css',
|
|
48
|
-
'*.css.js'
|
|
49
|
-
]
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const cssBuilds = getAllFiles('.', {
|
|
54
|
-
dir: './awesomeness-ui/components',
|
|
55
|
-
fileTypes: [
|
|
56
|
-
'css.js'
|
|
57
|
-
]
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
if(cssBuilds.length > 0){
|
|
62
|
-
|
|
63
|
-
await Promise.all(cssBuilds.map(async (file) => {
|
|
64
|
-
|
|
65
|
-
try {
|
|
66
|
-
|
|
67
|
-
const { cssBuild } = await import(`../${file}`);
|
|
68
|
-
|
|
69
|
-
await cssBuild();
|
|
70
|
-
|
|
71
|
-
} catch (e) {
|
|
72
|
-
|
|
73
|
-
console.error(`Error importing CSS build file: ${file}`, e);
|
|
74
|
-
|
|
75
|
-
return;
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}));
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
// must be done in order
|
|
86
|
-
let js = `
|
|
87
|
-
/**
|
|
88
|
-
* This file is auto-generated by Awesomeness UI build script.
|
|
89
|
-
* It consolidates UI functions for use in the application.
|
|
90
|
-
* Do not edit manually.
|
|
91
|
-
*/
|
|
92
|
-
window.ui = {};
|
|
93
|
-
|
|
94
|
-
`;
|
|
95
|
-
|
|
96
|
-
js += readFileSync(join(coreDir, 'js', 'jquery-3.7.1.min.js'), 'utf8');
|
|
97
|
-
js += "\n " + readFileSync(join(coreDir, 'js', 'app.js'), 'utf8');
|
|
98
|
-
js += "\n " + combineFiles(join(coreDir, 'js', 'app'), 'js');
|
|
99
|
-
|
|
100
|
-
writeFileSync(join(coreDir, 'public', 'app.js'), js);
|
|
101
|
-
|
|
102
|
-
let css = "";
|
|
103
|
-
|
|
104
|
-
css += combineFiles(join(coreDir, 'css'), 'css');
|
|
105
|
-
|
|
106
|
-
css += "\n";
|
|
107
|
-
|
|
108
|
-
// dynamic css
|
|
109
|
-
css += dynamicCSS();
|
|
110
|
-
|
|
111
|
-
const cssMini = await minifyCSS(css);
|
|
112
|
-
|
|
113
|
-
writeFileSync(join(coreDir, 'public', 'app.css'), cssMini);
|
|
114
|
-
|
|
115
|
-
return true;
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export default buildUI;
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import componentDependencies from '../src/componentDependencies.js';
|
|
2
|
-
import { expect, test } from 'vitest';
|
|
3
|
-
|
|
4
|
-
test('component test', () => {
|
|
5
|
-
|
|
6
|
-
const test = componentDependencies([ '_example' ],{
|
|
7
|
-
showDetails: true
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
expect(test._example.js).toBeDefined();
|
|
11
|
-
expect(test._example.js).toContain('ui._example');
|
|
12
|
-
expect(test._example.css).toBeDefined();
|
|
13
|
-
expect(test._example.js_details).toBeDefined();
|
|
14
|
-
expect(test._example.css_details).toBeDefined();
|
|
15
|
-
|
|
16
|
-
const test2 = componentDependencies([ 'notCommonExample' ],{
|
|
17
|
-
showDetails: false,
|
|
18
|
-
customLocation: `./sites/demo.awesomenessjs.com/components`,
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
expect(test2.notCommonExample.js).toBeDefined();
|
|
22
|
-
expect(test2.notCommonExample.js).toContain('ui.notCommonExample');
|
|
23
|
-
expect(test2.notCommonExample.css).toBeDefined();
|
|
24
|
-
expect(test2.notCommonExample.js_details).toBeUndefined();
|
|
25
|
-
expect(test2.notCommonExample.css_details).toBeUndefined();
|
|
26
|
-
|
|
27
|
-
});
|
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
.blogPost {
|
|
2
|
-
display: grid;
|
|
3
|
-
grid-template-columns: 1fr; /* single column */
|
|
4
|
-
justify-items: stretch; /* <— critical */
|
|
5
|
-
align-items: stretch; /* optional */
|
|
6
|
-
width: 100%;
|
|
7
|
-
margin-inline: auto; /* center the 800px box */
|
|
8
|
-
min-width: 0; /* avoid overflow issues */
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
.blogPost h2 {
|
|
12
|
-
text-transform: inherit;
|
|
13
|
-
font-size: 1.5em;
|
|
14
|
-
margin-top: 50px;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
.blogPost .break {
|
|
18
|
-
width: 100%;
|
|
19
|
-
display: block;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
.blogPost h3 {
|
|
24
|
-
font-weight: 300;
|
|
25
|
-
text-transform: inherit;
|
|
26
|
-
letter-spacing: 1.3px;
|
|
27
|
-
text-align: left;
|
|
28
|
-
color: #777;
|
|
29
|
-
margin-top: 0px;
|
|
30
|
-
font-size: 1.1em;
|
|
31
|
-
margin-bottom: 20px;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
.blogPost p {
|
|
35
|
-
font-size: 1.2em;
|
|
36
|
-
line-height: 2em;
|
|
37
|
-
color: #404040;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.blogPost blockquote {
|
|
41
|
-
background-color: #e6e6e6;
|
|
42
|
-
margin: 0;
|
|
43
|
-
padding: 15px 25px;
|
|
44
|
-
color: #343434;
|
|
45
|
-
border-radius: 10px;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
.blogPost blockquote p {
|
|
50
|
-
font-size: 1.1em;
|
|
51
|
-
line-height: 1.8 em;
|
|
52
|
-
margin: 5px;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
.blogPost a {
|
|
56
|
-
color: #0a99ff;
|
|
57
|
-
text-decoration: none;
|
|
58
|
-
font-weight: 500;
|
|
59
|
-
cursor: pointer;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
.blogPost a:hover {
|
|
63
|
-
text-decoration: underline;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
.blogPost table {
|
|
67
|
-
width: 100%;
|
|
68
|
-
border-collapse: collapse;
|
|
69
|
-
margin: 25px 0;
|
|
70
|
-
font-size: 1em;
|
|
71
|
-
box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
.blogPost tr {
|
|
75
|
-
margin-bottom: 15px;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
.blogPost th {
|
|
79
|
-
text-align: left;
|
|
80
|
-
padding: 13px 15px;
|
|
81
|
-
background-color: #dedede;
|
|
82
|
-
color: #333;
|
|
83
|
-
font-weight: 600;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
.blogPost th:first-child {
|
|
87
|
-
border-top-left-radius: 6px;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
.blogPost th:last-child {
|
|
91
|
-
border-top-right-radius: 6px;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
.blogPost td {
|
|
95
|
-
padding: 13px 15px;
|
|
96
|
-
border-bottom: 1px solid #e6e6e6;
|
|
97
|
-
color: #555;
|
|
98
|
-
font-weight: 400;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
.blogPost ol,
|
|
102
|
-
.blogPost ul {
|
|
103
|
-
margin: 20px 0;
|
|
104
|
-
padding-left: 1.5em;
|
|
105
|
-
font-size: 1em;
|
|
106
|
-
color: #555;
|
|
107
|
-
line-height: 1.6;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/* Ordered list numbers */
|
|
111
|
-
.blogPost ol {
|
|
112
|
-
list-style-type: decimal;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/* Unordered list bullets */
|
|
116
|
-
.blogPost ul {
|
|
117
|
-
list-style-type: disc;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/* List items */
|
|
121
|
-
.blogPost li {
|
|
122
|
-
margin-bottom: 8px;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/* List items */
|
|
126
|
-
.blogPost ul li ul {
|
|
127
|
-
margin-top: 5px;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/* List items */
|
|
131
|
-
.blogPost ul li ul li {
|
|
132
|
-
margin-bottom: 8px;
|
|
133
|
-
list-style: circle;
|
|
134
|
-
font-size: 0.9em;
|
|
135
|
-
margin-top: 0px;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/* Nested lists get lighter style */
|
|
139
|
-
.blogPost ol ol,
|
|
140
|
-
.blogPost ul ul {
|
|
141
|
-
margin: 20px 0;
|
|
142
|
-
font-size: 1em;
|
|
143
|
-
color: #555;
|
|
144
|
-
line-height: 1.6;
|
|
145
|
-
font-size: 1.1em;
|
|
146
|
-
padding-left: 30px;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
.blogPost ol li::marker {
|
|
150
|
-
font-weight: 600;
|
|
151
|
-
/* optional: make numbers bolder */
|
|
152
|
-
padding-right: 10px;
|
|
153
|
-
/* adds space after number */
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
.blogPost-header-image {
|
|
157
|
-
position: relative;
|
|
158
|
-
min-height: 500px;
|
|
159
|
-
display: flex;
|
|
160
|
-
justify-content: center;
|
|
161
|
-
align-items: center;
|
|
162
|
-
flex-direction: column;
|
|
163
|
-
text-align: center;
|
|
164
|
-
color: var(--white);
|
|
165
|
-
background-size: cover;
|
|
166
|
-
background-position: center;
|
|
167
|
-
overflow: hidden; /* ensures overlay stays contained */
|
|
168
|
-
padding-bottom: 5%;
|
|
169
|
-
margin-bottom: 25px;
|
|
170
|
-
min-height: 700px;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
.app-size-p .blogPost-header-image { min-height: 400px; }
|
|
174
|
-
|
|
175
|
-
.app-size-d .blogPost-header-image { min-height: 800px; }
|
|
176
|
-
.app-size-xl .blogPost-header-image { min-height: 800px; }
|
|
177
|
-
|
|
178
|
-
.blogPost-header-image::before {
|
|
179
|
-
content: "";
|
|
180
|
-
position: absolute;
|
|
181
|
-
top: 0;
|
|
182
|
-
left: 0;
|
|
183
|
-
width: 100%;
|
|
184
|
-
height: 100%;
|
|
185
|
-
background: linear-gradient(
|
|
186
|
-
rgba(0, 0, 0, 0.0) 0%,
|
|
187
|
-
rgba(0, 0, 0, 0.4) 35%,
|
|
188
|
-
rgba(0, 0, 0, 0.4) 65%,
|
|
189
|
-
rgba(0, 0, 0, 0.0) 100%
|
|
190
|
-
);
|
|
191
|
-
z-index: 0;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
.blogPost-header-image > * {
|
|
196
|
-
position: relative;
|
|
197
|
-
z-index: 1; /* keeps text above the dark overlay */
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
.blogPost-title{
|
|
201
|
-
font-weight: 700;
|
|
202
|
-
font-size: 3em;
|
|
203
|
-
margin-bottom: 10px;
|
|
204
|
-
padding: 0px 50px;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
.blogPost-subTitle{
|
|
208
|
-
font-weight: 300;
|
|
209
|
-
font-size: 1.6em;
|
|
210
|
-
margin-bottom: 15px;
|
|
211
|
-
text-transform: none;
|
|
212
|
-
color: var(--white);
|
|
213
|
-
padding: 0px 50px;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
.app-size-p .blogPost-subTitle{
|
|
217
|
-
font-size: 1.2em;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
.blogPost-catDateTime {
|
|
222
|
-
display: flex;
|
|
223
|
-
align-items: center;
|
|
224
|
-
justify-content: flex-start;
|
|
225
|
-
gap: 10px;
|
|
226
|
-
font-size: 1.05em;
|
|
227
|
-
color: var(--stone-100);
|
|
228
|
-
margin-bottom: 20px;
|
|
229
|
-
letter-spacing: 1px;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
.blogPost-catDateTime > * {
|
|
233
|
-
display: inline;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
.blogPost-category {
|
|
237
|
-
cursor: pointer;
|
|
238
|
-
text-transform: capitalize;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
.app-size-p .blogPost-catDateTime {
|
|
242
|
-
flex-direction: column;
|
|
243
|
-
margin-top: 45px;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
.app-size-p .blogPost-catDateTime > * {
|
|
248
|
-
display: flex;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
.blogPost-category:hover {
|
|
252
|
-
font-weight: 500;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
.blogPost-catDateTime-separator {
|
|
256
|
-
width: 7px;
|
|
257
|
-
height: 7px;
|
|
258
|
-
border-radius: 50%;
|
|
259
|
-
background-color: var(--stone-100);
|
|
260
|
-
flex-shrink: 0;
|
|
261
|
-
margin: 0px 5px;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
.app-size-p .blogPost-catDateTime-separator {
|
|
265
|
-
display: none;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
.blogPost-author {
|
|
269
|
-
display: flex;
|
|
270
|
-
align-items: center; /* vertically centers image and text */
|
|
271
|
-
gap: 10px; /* replaces margin-right for cleaner spacing */
|
|
272
|
-
font-size: 1em;
|
|
273
|
-
color: var(--white);
|
|
274
|
-
font-weight: 300;
|
|
275
|
-
margin-top: 25px;
|
|
276
|
-
padding-bottom: 40px;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
.app-size-p .blogPost-author {
|
|
280
|
-
flex-direction: column;
|
|
281
|
-
padding-bottom: 100px;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
.app-size-p .blogPost-author-name {
|
|
285
|
-
display: block;
|
|
286
|
-
margin-bottom: 10px;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
.blogPost-author-name {
|
|
290
|
-
font-weight: 500;
|
|
291
|
-
margin-right: 10px;
|
|
292
|
-
font-size: 1.1em;
|
|
293
|
-
letter-spacing: 0.03em;
|
|
294
|
-
}
|
|
295
|
-
.blogPost-author-image {
|
|
296
|
-
margin-right: 10px;
|
|
297
|
-
width: 40px;
|
|
298
|
-
height: 40px;
|
|
299
|
-
border-radius: 50%;
|
|
300
|
-
background-color: var(--white);
|
|
301
|
-
background-size: cover;
|
|
302
|
-
background-position: center;
|
|
303
|
-
flex-shrink: 0; /* keeps it from squishing */
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
.blogPost-next-reads h2,
|
|
307
|
-
.blogPost-next-reads h3 {
|
|
308
|
-
margin-bottom: 10px;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
.blogPost-next-reads li {
|
|
312
|
-
border: solid 1px var(--stone-200);
|
|
313
|
-
border-radius: 5px;
|
|
314
|
-
cursor: pointer;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
.blogPost-next-reads li:hover {
|
|
318
|
-
background-color: var(--blue-100);
|
|
319
|
-
border-color: var(--blue-300);
|
|
320
|
-
font-weight: 500;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
.blogPost-next-reads li a {
|
|
324
|
-
font-weight: 400;
|
|
325
|
-
display: block;
|
|
326
|
-
padding: 10px;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
.blogPost-next-reads li a:hover,
|
|
330
|
-
.blogPost-tags-list .blogPost-tag:hover a {
|
|
331
|
-
text-decoration: none;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
.blogPost-next-reads ul {
|
|
335
|
-
list-style: none;
|
|
336
|
-
margin: 0px;
|
|
337
|
-
padding: 0px;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
.blogPost-tags-list {
|
|
342
|
-
position: absolute;
|
|
343
|
-
bottom: 25px;
|
|
344
|
-
font-size: 0.8em;
|
|
345
|
-
display: flex;
|
|
346
|
-
align-items: center;
|
|
347
|
-
gap: 8px;
|
|
348
|
-
flex-wrap: wrap;
|
|
349
|
-
justify-content: center;
|
|
350
|
-
padding: 0px 20px;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
.blogPost-tag {
|
|
354
|
-
border: solid 1px var(--stone-200);
|
|
355
|
-
cursor: pointer;
|
|
356
|
-
padding: 5px 10px;
|
|
357
|
-
white-space: nowrap;
|
|
358
|
-
transition: all 200ms;
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
.blogPost-tag:hover {
|
|
362
|
-
color: var(--black);
|
|
363
|
-
background-color: var(--white);
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
.blogPost img {
|
|
367
|
-
max-width: 100%;
|
|
368
|
-
min-width: 100%;
|
|
369
|
-
border-radius: 8px;
|
|
370
|
-
margin: 20px 0px;
|
|
371
|
-
}
|