@seip/blue-bird 1.1.4 → 1.1.6
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/.vscode/extensions.json +6 -6
- package/.vscode/settings.json +10 -10
- package/core/cli/doctor.js +294 -294
- package/core/cli/migrate.js +342 -342
- package/core/cli/nginx.js +138 -138
- package/core/cli/route.js +143 -143
- package/core/hash.js +201 -201
- package/core/queue.js +121 -121
- package/docker/docker-compose.mysql.yml +13 -3
- package/docker/docker-compose.sqlite.yml +69 -69
- package/docker-compose.yml +5 -3
- package/frontend/about.html +156 -156
- package/frontend/js/bluebird.d.ts +423 -423
- package/jsconfig.json +15 -15
- package/package.json +1 -1
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
services:
|
|
2
|
-
app:
|
|
3
|
-
build:
|
|
4
|
-
context: .
|
|
5
|
-
dockerfile: docker/Dockerfile
|
|
6
|
-
container_name: ${TITLE:-bluebird}-app
|
|
7
|
-
restart: unless-stopped
|
|
8
|
-
expose:
|
|
9
|
-
- "3000"
|
|
10
|
-
volumes:
|
|
11
|
-
- .:/app
|
|
12
|
-
- /app/node_modules
|
|
13
|
-
- ./database:/app/database
|
|
14
|
-
env_file:
|
|
15
|
-
- .env
|
|
16
|
-
environment:
|
|
17
|
-
- NODE_ENV=production
|
|
18
|
-
- DEBUG=false
|
|
19
|
-
- DB_TYPE=sqlite
|
|
20
|
-
- DB_FILE=${DB_FILE:-database/blue_bird.db}
|
|
21
|
-
- DATABASE_URL=${DATABASE_URL:-sqlite:database/blue_bird.db}
|
|
22
|
-
- REDIS_HOST=redis
|
|
23
|
-
- REDIS_PORT=6379
|
|
24
|
-
- PORT=3000
|
|
25
|
-
depends_on:
|
|
26
|
-
redis:
|
|
27
|
-
condition: service_healthy
|
|
28
|
-
networks:
|
|
29
|
-
- bluebird_net
|
|
30
|
-
profiles:
|
|
31
|
-
- prod
|
|
32
|
-
|
|
33
|
-
nginx:
|
|
34
|
-
image: nginx:1.27-alpine
|
|
35
|
-
container_name: ${TITLE:-bluebird}-nginx
|
|
36
|
-
restart: unless-stopped
|
|
37
|
-
ports:
|
|
38
|
-
- "${PORT:-3000}:80"
|
|
39
|
-
volumes:
|
|
40
|
-
- .:/app:ro
|
|
41
|
-
- ./docker/nginx.conf:/etc/nginx/nginx.conf:ro
|
|
42
|
-
networks:
|
|
43
|
-
- bluebird_net
|
|
44
|
-
profiles:
|
|
45
|
-
- prod
|
|
46
|
-
|
|
47
|
-
redis:
|
|
48
|
-
image: redis:7-alpine
|
|
49
|
-
container_name: ${TITLE:-bluebird}-redis
|
|
50
|
-
restart: unless-stopped
|
|
51
|
-
ports:
|
|
52
|
-
- "${REDIS_PORT:-6379}:6379"
|
|
53
|
-
volumes:
|
|
54
|
-
- redis_data:/data
|
|
55
|
-
networks:
|
|
56
|
-
- bluebird_net
|
|
57
|
-
healthcheck:
|
|
58
|
-
test: ["CMD", "redis-cli", "ping"]
|
|
59
|
-
interval: 5s
|
|
60
|
-
timeout: 3s
|
|
61
|
-
retries: 5
|
|
62
|
-
|
|
63
|
-
volumes:
|
|
64
|
-
redis_data:
|
|
65
|
-
|
|
66
|
-
networks:
|
|
67
|
-
bluebird_net:
|
|
68
|
-
name: ${TITLE:-bluebird}_network
|
|
69
|
-
driver: bridge
|
|
1
|
+
services:
|
|
2
|
+
app:
|
|
3
|
+
build:
|
|
4
|
+
context: .
|
|
5
|
+
dockerfile: docker/Dockerfile
|
|
6
|
+
container_name: ${TITLE:-bluebird}-app
|
|
7
|
+
restart: unless-stopped
|
|
8
|
+
expose:
|
|
9
|
+
- "3000"
|
|
10
|
+
volumes:
|
|
11
|
+
- .:/app
|
|
12
|
+
- /app/node_modules
|
|
13
|
+
- ./database:/app/database
|
|
14
|
+
env_file:
|
|
15
|
+
- .env
|
|
16
|
+
environment:
|
|
17
|
+
- NODE_ENV=production
|
|
18
|
+
- DEBUG=false
|
|
19
|
+
- DB_TYPE=sqlite
|
|
20
|
+
- DB_FILE=${DB_FILE:-database/blue_bird.db}
|
|
21
|
+
- DATABASE_URL=${DATABASE_URL:-sqlite:database/blue_bird.db}
|
|
22
|
+
- REDIS_HOST=redis
|
|
23
|
+
- REDIS_PORT=6379
|
|
24
|
+
- PORT=3000
|
|
25
|
+
depends_on:
|
|
26
|
+
redis:
|
|
27
|
+
condition: service_healthy
|
|
28
|
+
networks:
|
|
29
|
+
- bluebird_net
|
|
30
|
+
profiles:
|
|
31
|
+
- prod
|
|
32
|
+
|
|
33
|
+
nginx:
|
|
34
|
+
image: nginx:1.27-alpine
|
|
35
|
+
container_name: ${TITLE:-bluebird}-nginx
|
|
36
|
+
restart: unless-stopped
|
|
37
|
+
ports:
|
|
38
|
+
- "${PORT:-3000}:80"
|
|
39
|
+
volumes:
|
|
40
|
+
- .:/app:ro
|
|
41
|
+
- ./docker/nginx.conf:/etc/nginx/nginx.conf:ro
|
|
42
|
+
networks:
|
|
43
|
+
- bluebird_net
|
|
44
|
+
profiles:
|
|
45
|
+
- prod
|
|
46
|
+
|
|
47
|
+
redis:
|
|
48
|
+
image: redis:7-alpine
|
|
49
|
+
container_name: ${TITLE:-bluebird}-redis
|
|
50
|
+
restart: unless-stopped
|
|
51
|
+
ports:
|
|
52
|
+
- "${REDIS_PORT:-6379}:6379"
|
|
53
|
+
volumes:
|
|
54
|
+
- redis_data:/data
|
|
55
|
+
networks:
|
|
56
|
+
- bluebird_net
|
|
57
|
+
healthcheck:
|
|
58
|
+
test: ["CMD", "redis-cli", "ping"]
|
|
59
|
+
interval: 5s
|
|
60
|
+
timeout: 3s
|
|
61
|
+
retries: 5
|
|
62
|
+
|
|
63
|
+
volumes:
|
|
64
|
+
redis_data:
|
|
65
|
+
|
|
66
|
+
networks:
|
|
67
|
+
bluebird_net:
|
|
68
|
+
name: ${TITLE:-bluebird}_network
|
|
69
|
+
driver: bridge
|
package/docker-compose.yml
CHANGED
|
@@ -54,12 +54,14 @@ services:
|
|
|
54
54
|
- "${DB_PORT:-3306}:3306"
|
|
55
55
|
volumes:
|
|
56
56
|
- mysql_data:/var/lib/mysql
|
|
57
|
+
command: >
|
|
58
|
+
--default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --performance-schema=OFF --innodb-buffer-pool-size=64M --innodb-log-buffer-size=8M --max-connections=50 --table-open-cache=200 --skip-log-bin
|
|
57
59
|
healthcheck:
|
|
58
|
-
test: [ "CMD", "mysqladmin
|
|
60
|
+
test: [ "CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -u root -p$$MYSQL_ROOT_PASSWORD" ]
|
|
59
61
|
interval: 10s
|
|
60
62
|
timeout: 5s
|
|
61
|
-
retries:
|
|
62
|
-
start_period:
|
|
63
|
+
retries: 10
|
|
64
|
+
start_period: 60s
|
|
63
65
|
networks:
|
|
64
66
|
- bluebird_net
|
|
65
67
|
|
package/frontend/about.html
CHANGED
|
@@ -1,157 +1,157 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en" data-theme="dark">
|
|
3
|
-
|
|
4
|
-
<head>
|
|
5
|
-
<meta charset="UTF-8">
|
|
6
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
-
<title>Blue Bird - About</title>
|
|
8
|
-
<link rel="canonical" href="https://seip25.github.io/Blue-bird/" />
|
|
9
|
-
<meta name="description"
|
|
10
|
-
content="Blue Bird is a fast, structured, and opinionated Express.js framework for developers who want visual elegance and performance with raw HTML and CSS.">
|
|
11
|
-
<meta name="keywords" content="Blue Bird, Express.js, About, Semantic CSS, Architecture">
|
|
12
|
-
<meta name="author" content="Seip25">
|
|
13
|
-
<link rel="icon" href="/images/favicon.ico" />
|
|
14
|
-
<link rel="stylesheet" href="/css/bluebird.css" />
|
|
15
|
-
<script src="/js/bluebird.js"></script>
|
|
16
|
-
</head>
|
|
17
|
-
|
|
18
|
-
<body>
|
|
19
|
-
<header>
|
|
20
|
-
<nav>
|
|
21
|
-
<a href="/" class="flex items-center gap-2">
|
|
22
|
-
<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
|
|
23
|
-
stroke-linecap="round" stroke-linejoin="round" class="text-blue">
|
|
24
|
-
<path d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8" />
|
|
25
|
-
</svg>
|
|
26
|
-
<strong class="text-xl text-gradient">Blue Bird</strong>
|
|
27
|
-
</a>
|
|
28
|
-
</nav>
|
|
29
|
-
</header>
|
|
30
|
-
|
|
31
|
-
<main>
|
|
32
|
-
<aside>
|
|
33
|
-
<h4>Menu</h4>
|
|
34
|
-
<a href="/">Home</a>
|
|
35
|
-
<a href="/about" class="active badge badge-glow px-3 py-3">About</a>
|
|
36
|
-
<a href="https://seip25.github.io/Blue-bird-css/" target="_blank">Blue Bird CSS</a>
|
|
37
|
-
<a href="https://github.com/seip25/Blue-bird" target="_blank" role="button"
|
|
38
|
-
class="btn-sm outline">GitHub</a>
|
|
39
|
-
</aside>
|
|
40
|
-
|
|
41
|
-
<div>
|
|
42
|
-
<section class="hero ">
|
|
43
|
-
<h1 class="mt-3 text-gradient font-bold">About Blue Bird</h1>
|
|
44
|
-
<p class="lead">Built for performance, simplicity, and raw speed.</p>
|
|
45
|
-
</section>
|
|
46
|
-
|
|
47
|
-
<article class="mt-6 ">
|
|
48
|
-
<header>
|
|
49
|
-
<h2 class="text-gradient-blue font-semibold">Our Philosophy</h2>
|
|
50
|
-
</header>
|
|
51
|
-
<p>
|
|
52
|
-
Blue Bird was born out of a desire for a clean, performance-first approach to web development. We
|
|
53
|
-
believe in harnessing the raw power of Express.js and Nginx, stripping away unnecessary bloat, and
|
|
54
|
-
providing developers with a robust foundation that just works.
|
|
55
|
-
</p>
|
|
56
|
-
<p>
|
|
57
|
-
By separating the static frontend delivery (handled blazingly fast by Nginx) from the dynamic API
|
|
58
|
-
layer (powered by Express and Redis), Blue Bird achieves unparalleled performance out of the box.
|
|
59
|
-
</p>
|
|
60
|
-
</article>
|
|
61
|
-
|
|
62
|
-
<div class="px-4 py-4 mb-4">
|
|
63
|
-
<h2 class="text-gradient-blue font-semibold">Why Blue Bird?</h2>
|
|
64
|
-
|
|
65
|
-
<div class="grid cols-2 gap-4">
|
|
66
|
-
<div>
|
|
67
|
-
<details open>
|
|
68
|
-
<summary>Zero Config Docker</summary>
|
|
69
|
-
<p>Go from development to production seamlessly with ready-to-use
|
|
70
|
-
Docker orchestration for
|
|
71
|
-
SQLite, MySQL, PostgreSQL, and Redis.</p>
|
|
72
|
-
</details>
|
|
73
|
-
<details open>
|
|
74
|
-
<summary>Military Grade Security</summary>
|
|
75
|
-
<p>Built-in AES-256-GCM JWT encryption, secure HttpOnly cookie
|
|
76
|
-
sessions, helmet headers, and
|
|
77
|
-
route rate limiting.</p>
|
|
78
|
-
</details>
|
|
79
|
-
</div>
|
|
80
|
-
<div>
|
|
81
|
-
<details open>
|
|
82
|
-
<summary>High Performance Layer</summary>
|
|
83
|
-
<p>Redis caching for the data layer and Nginx static delivery with
|
|
84
|
-
1-month browser asset
|
|
85
|
-
caching.</p>
|
|
86
|
-
</details>
|
|
87
|
-
<details open>
|
|
88
|
-
<summary>Pure Semantic HTML & CSS</summary>
|
|
89
|
-
<p>No bloated frontend frameworks or heavy node compile steps. Write
|
|
90
|
-
clean, accessible code
|
|
91
|
-
close to the metal.</p>
|
|
92
|
-
</details>
|
|
93
|
-
</div>
|
|
94
|
-
</div>
|
|
95
|
-
</article>
|
|
96
|
-
|
|
97
|
-
<article class="">
|
|
98
|
-
<header>
|
|
99
|
-
<h2 class="text-gradient-blue font-semibold">Core Architecture Summary</h2>
|
|
100
|
-
</header>
|
|
101
|
-
<table class="table table-hover">
|
|
102
|
-
<thead>
|
|
103
|
-
<tr>
|
|
104
|
-
<th>Layer</th>
|
|
105
|
-
<th>Technology</th>
|
|
106
|
-
<th>Role</th>
|
|
107
|
-
</tr>
|
|
108
|
-
</thead>
|
|
109
|
-
<tbody>
|
|
110
|
-
<tr>
|
|
111
|
-
<td><strong>Frontend</strong></td>
|
|
112
|
-
<td>Pure Semantic HTML5 + <a href="https://seip25.github.io/Blue-bird-css/"
|
|
113
|
-
target="_blank">Blue Bird CSS</a></td>
|
|
114
|
-
<td>Static rendering served directly via Nginx</td>
|
|
115
|
-
</tr>
|
|
116
|
-
<tr>
|
|
117
|
-
<td><strong>Backend</strong></td>
|
|
118
|
-
<td>Node.js + Express + PM2</td>
|
|
119
|
-
<td>High-performance REST API services</td>
|
|
120
|
-
</tr>
|
|
121
|
-
<tr>
|
|
122
|
-
<td><strong>Cache</strong></td>
|
|
123
|
-
<td>Redis / In-Memory RAM</td>
|
|
124
|
-
<td>Sub-millisecond route & query caching</td>
|
|
125
|
-
</tr>
|
|
126
|
-
<tr>
|
|
127
|
-
<td><strong>Database</strong></td>
|
|
128
|
-
<td>SQLite (WAL) / PostgreSQL / MySQL</td>
|
|
129
|
-
<td>Unified driver with connection pooling</td>
|
|
130
|
-
</tr>
|
|
131
|
-
</tbody>
|
|
132
|
-
</table>
|
|
133
|
-
</article>
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
</div>
|
|
137
|
-
</main>
|
|
138
|
-
|
|
139
|
-
<footer>
|
|
140
|
-
<div class="footer-content">
|
|
141
|
-
<p>Powered by <strong class="text-gradient">Blue Bird Framework</strong> &
|
|
142
|
-
<strong class="text-gradient-blue">
|
|
143
|
-
<a href="https://seip25.github.io/Blue-bird-css/" target="_blank">Blue Bird
|
|
144
|
-
CSS</a>
|
|
145
|
-
</strong>.
|
|
146
|
-
</p>
|
|
147
|
-
<div class="lang-switcher">
|
|
148
|
-
<a href="/" class="lang-link">Home</a>
|
|
149
|
-
<a href="/about" class="lang-link">About</a>
|
|
150
|
-
<a href="https://github.com/seip25/Blue-bird" target="_blank" class="github-star mt-2">★
|
|
151
|
-
GitHub</a>
|
|
152
|
-
</div>
|
|
153
|
-
</div>
|
|
154
|
-
</footer>
|
|
155
|
-
</body>
|
|
156
|
-
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" data-theme="dark">
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
<title>Blue Bird - About</title>
|
|
8
|
+
<link rel="canonical" href="https://seip25.github.io/Blue-bird/" />
|
|
9
|
+
<meta name="description"
|
|
10
|
+
content="Blue Bird is a fast, structured, and opinionated Express.js framework for developers who want visual elegance and performance with raw HTML and CSS.">
|
|
11
|
+
<meta name="keywords" content="Blue Bird, Express.js, About, Semantic CSS, Architecture">
|
|
12
|
+
<meta name="author" content="Seip25">
|
|
13
|
+
<link rel="icon" href="/images/favicon.ico" />
|
|
14
|
+
<link rel="stylesheet" href="/css/bluebird.css" />
|
|
15
|
+
<script src="/js/bluebird.js"></script>
|
|
16
|
+
</head>
|
|
17
|
+
|
|
18
|
+
<body>
|
|
19
|
+
<header>
|
|
20
|
+
<nav>
|
|
21
|
+
<a href="/" class="flex items-center gap-2">
|
|
22
|
+
<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
|
|
23
|
+
stroke-linecap="round" stroke-linejoin="round" class="text-blue">
|
|
24
|
+
<path d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8" />
|
|
25
|
+
</svg>
|
|
26
|
+
<strong class="text-xl text-gradient">Blue Bird</strong>
|
|
27
|
+
</a>
|
|
28
|
+
</nav>
|
|
29
|
+
</header>
|
|
30
|
+
|
|
31
|
+
<main>
|
|
32
|
+
<aside>
|
|
33
|
+
<h4>Menu</h4>
|
|
34
|
+
<a href="/">Home</a>
|
|
35
|
+
<a href="/about" class="active badge badge-glow px-3 py-3">About</a>
|
|
36
|
+
<a href="https://seip25.github.io/Blue-bird-css/" target="_blank">Blue Bird CSS</a>
|
|
37
|
+
<a href="https://github.com/seip25/Blue-bird" target="_blank" role="button"
|
|
38
|
+
class="btn-sm outline">GitHub</a>
|
|
39
|
+
</aside>
|
|
40
|
+
|
|
41
|
+
<div>
|
|
42
|
+
<section class="hero ">
|
|
43
|
+
<h1 class="mt-3 text-gradient font-bold">About Blue Bird</h1>
|
|
44
|
+
<p class="lead">Built for performance, simplicity, and raw speed.</p>
|
|
45
|
+
</section>
|
|
46
|
+
|
|
47
|
+
<article class="mt-6 ">
|
|
48
|
+
<header>
|
|
49
|
+
<h2 class="text-gradient-blue font-semibold">Our Philosophy</h2>
|
|
50
|
+
</header>
|
|
51
|
+
<p>
|
|
52
|
+
Blue Bird was born out of a desire for a clean, performance-first approach to web development. We
|
|
53
|
+
believe in harnessing the raw power of Express.js and Nginx, stripping away unnecessary bloat, and
|
|
54
|
+
providing developers with a robust foundation that just works.
|
|
55
|
+
</p>
|
|
56
|
+
<p>
|
|
57
|
+
By separating the static frontend delivery (handled blazingly fast by Nginx) from the dynamic API
|
|
58
|
+
layer (powered by Express and Redis), Blue Bird achieves unparalleled performance out of the box.
|
|
59
|
+
</p>
|
|
60
|
+
</article>
|
|
61
|
+
|
|
62
|
+
<div class="px-4 py-4 mb-4">
|
|
63
|
+
<h2 class="text-gradient-blue font-semibold">Why Blue Bird?</h2>
|
|
64
|
+
|
|
65
|
+
<div class="grid cols-2 gap-4">
|
|
66
|
+
<div>
|
|
67
|
+
<details open>
|
|
68
|
+
<summary>Zero Config Docker</summary>
|
|
69
|
+
<p>Go from development to production seamlessly with ready-to-use
|
|
70
|
+
Docker orchestration for
|
|
71
|
+
SQLite, MySQL, PostgreSQL, and Redis.</p>
|
|
72
|
+
</details>
|
|
73
|
+
<details open>
|
|
74
|
+
<summary>Military Grade Security</summary>
|
|
75
|
+
<p>Built-in AES-256-GCM JWT encryption, secure HttpOnly cookie
|
|
76
|
+
sessions, helmet headers, and
|
|
77
|
+
route rate limiting.</p>
|
|
78
|
+
</details>
|
|
79
|
+
</div>
|
|
80
|
+
<div>
|
|
81
|
+
<details open>
|
|
82
|
+
<summary>High Performance Layer</summary>
|
|
83
|
+
<p>Redis caching for the data layer and Nginx static delivery with
|
|
84
|
+
1-month browser asset
|
|
85
|
+
caching.</p>
|
|
86
|
+
</details>
|
|
87
|
+
<details open>
|
|
88
|
+
<summary>Pure Semantic HTML & CSS</summary>
|
|
89
|
+
<p>No bloated frontend frameworks or heavy node compile steps. Write
|
|
90
|
+
clean, accessible code
|
|
91
|
+
close to the metal.</p>
|
|
92
|
+
</details>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</article>
|
|
96
|
+
|
|
97
|
+
<article class="">
|
|
98
|
+
<header>
|
|
99
|
+
<h2 class="text-gradient-blue font-semibold">Core Architecture Summary</h2>
|
|
100
|
+
</header>
|
|
101
|
+
<table class="table table-hover">
|
|
102
|
+
<thead>
|
|
103
|
+
<tr>
|
|
104
|
+
<th>Layer</th>
|
|
105
|
+
<th>Technology</th>
|
|
106
|
+
<th>Role</th>
|
|
107
|
+
</tr>
|
|
108
|
+
</thead>
|
|
109
|
+
<tbody>
|
|
110
|
+
<tr>
|
|
111
|
+
<td><strong>Frontend</strong></td>
|
|
112
|
+
<td>Pure Semantic HTML5 + <a href="https://seip25.github.io/Blue-bird-css/"
|
|
113
|
+
target="_blank">Blue Bird CSS</a></td>
|
|
114
|
+
<td>Static rendering served directly via Nginx</td>
|
|
115
|
+
</tr>
|
|
116
|
+
<tr>
|
|
117
|
+
<td><strong>Backend</strong></td>
|
|
118
|
+
<td>Node.js + Express + PM2</td>
|
|
119
|
+
<td>High-performance REST API services</td>
|
|
120
|
+
</tr>
|
|
121
|
+
<tr>
|
|
122
|
+
<td><strong>Cache</strong></td>
|
|
123
|
+
<td>Redis / In-Memory RAM</td>
|
|
124
|
+
<td>Sub-millisecond route & query caching</td>
|
|
125
|
+
</tr>
|
|
126
|
+
<tr>
|
|
127
|
+
<td><strong>Database</strong></td>
|
|
128
|
+
<td>SQLite (WAL) / PostgreSQL / MySQL</td>
|
|
129
|
+
<td>Unified driver with connection pooling</td>
|
|
130
|
+
</tr>
|
|
131
|
+
</tbody>
|
|
132
|
+
</table>
|
|
133
|
+
</article>
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
</div>
|
|
137
|
+
</main>
|
|
138
|
+
|
|
139
|
+
<footer>
|
|
140
|
+
<div class="footer-content">
|
|
141
|
+
<p>Powered by <strong class="text-gradient">Blue Bird Framework</strong> &
|
|
142
|
+
<strong class="text-gradient-blue">
|
|
143
|
+
<a href="https://seip25.github.io/Blue-bird-css/" target="_blank">Blue Bird
|
|
144
|
+
CSS</a>
|
|
145
|
+
</strong>.
|
|
146
|
+
</p>
|
|
147
|
+
<div class="lang-switcher">
|
|
148
|
+
<a href="/" class="lang-link">Home</a>
|
|
149
|
+
<a href="/about" class="lang-link">About</a>
|
|
150
|
+
<a href="https://github.com/seip25/Blue-bird" target="_blank" class="github-star mt-2">★
|
|
151
|
+
GitHub</a>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
</footer>
|
|
155
|
+
</body>
|
|
156
|
+
|
|
157
157
|
</html>
|