eksa-framework 3.3.2 โ 3.4.3
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.
- checksums.yaml +4 -4
- data/.eksa.json +4 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +10 -0
- data/README.md +20 -3
- data/_posts/2026-03-15-welcome-to-eksa-framework.md +145 -123
- data/app/views/about.html.erb +30 -10
- data/app/views/docs.html.erb +23 -4
- data/app/views/index.html.erb +1 -1
- data/app/views/layout.html.erb +1 -1
- data/app/views/posts/index.html.erb +26 -8
- data/app/views/posts/show.html.erb +25 -5
- data/exe/eksa +98 -3
- data/lib/eksa/auth_controller.rb +50 -0
- data/lib/eksa/cms_controller.rb +110 -0
- data/lib/eksa/controller.rb +32 -6
- data/lib/eksa/markdown_post.rb +23 -4
- data/lib/eksa/user.rb +47 -0
- data/lib/eksa/version.rb +1 -1
- data/lib/eksa/views/auth/login.html.erb +44 -0
- data/lib/eksa/views/auth/register.html.erb +53 -0
- data/lib/eksa/views/cms/edit.html.erb +63 -0
- data/lib/eksa/views/cms/index.html.erb +83 -0
- data/lib/eksa.rb +48 -3
- data/public/img/logo.jpg +0 -0
- metadata +38 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 240df13f36c40ffdbe4ca9da5ee387d88e72dcc7c9477978c55782959720badf
|
|
4
|
+
data.tar.gz: 64bada9f45b072af04bb8a126266cc1804f00800cd7bda47313e2f3e047dfb3d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 25b6d53915adb207cf3329e4c6cd865ff5d26612a6a28aebd02e6b9d6484fb74846fbd07e570a16a80bb0307d24c4361c1363a87e56cca45db6f7c2511a8148b
|
|
7
|
+
data.tar.gz: df3e0ef70c040658e0be92110bff33a39ab55a1e30af989834dd1f19f9291b3d5bdbdc545b84718d9b4aeba27f2f2cb264e0678e78ed56dabbdea575e90afaed
|
data/.eksa.json
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
GEM
|
|
2
2
|
remote: https://rubygems.org/
|
|
3
3
|
specs:
|
|
4
|
+
base64 (0.3.0)
|
|
5
|
+
bcrypt (3.1.21)
|
|
4
6
|
diff-lcs (1.6.2)
|
|
5
7
|
kramdown (2.5.2)
|
|
6
8
|
rexml (>= 3.4.4)
|
|
@@ -10,6 +12,9 @@ GEM
|
|
|
10
12
|
puma (7.2.0)
|
|
11
13
|
nio4r (~> 2.0)
|
|
12
14
|
rack (3.2.5)
|
|
15
|
+
rack-session (2.1.1)
|
|
16
|
+
base64 (>= 0.1.0)
|
|
17
|
+
rack (>= 3.0.0)
|
|
13
18
|
rack-test (2.2.0)
|
|
14
19
|
rack (>= 1.3)
|
|
15
20
|
rackup (2.3.1)
|
|
@@ -34,22 +39,27 @@ PLATFORMS
|
|
|
34
39
|
x86_64-linux-gnu
|
|
35
40
|
|
|
36
41
|
DEPENDENCIES
|
|
42
|
+
bcrypt (~> 3.1)
|
|
37
43
|
kramdown
|
|
38
44
|
kramdown-parser-gfm
|
|
39
45
|
puma
|
|
40
46
|
rack
|
|
47
|
+
rack-session (~> 2.0)
|
|
41
48
|
rack-test (~> 2.1)
|
|
42
49
|
rackup
|
|
43
50
|
rspec (~> 3.12)
|
|
44
51
|
sqlite3
|
|
45
52
|
|
|
46
53
|
CHECKSUMS
|
|
54
|
+
base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
|
|
55
|
+
bcrypt (3.1.21) sha256=5964613d750a42c7ee5dc61f7b9336fb6caca429ba4ac9f2011609946e4a2dcf
|
|
47
56
|
diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
|
|
48
57
|
kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa
|
|
49
58
|
kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729
|
|
50
59
|
nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1
|
|
51
60
|
puma (7.2.0) sha256=bf8ef4ab514a4e6d4554cb4326b2004eba5036ae05cf765cfe51aba9706a72a8
|
|
52
61
|
rack (3.2.5) sha256=4cbd0974c0b79f7a139b4812004a62e4c60b145cba76422e288ee670601ed6d3
|
|
62
|
+
rack-session (2.1.1) sha256=0b6dc07dea7e4b583f58a48e8b806d4c9f1c6c9214ebc202ec94562cbea2e4e9
|
|
53
63
|
rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463
|
|
54
64
|
rackup (2.3.1) sha256=6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868
|
|
55
65
|
rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142
|
data/README.md
CHANGED
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
* ๐ ๏ธ **Powerful CLI**: Inisialisasi project (`eksa init`), jalankan server (`eksa run`), generate komponen, dan **auto-routing** otomatis.
|
|
17
17
|
* ๐พ **Dynamic Database Engine**: Database SQLite otomatis dengan schema yang ditentukan oleh model Anda sendiri.
|
|
18
18
|
* ๐งช **Built-in Testing**: Lingkungan pengujian otomatis siap pakai menggunakan RSpec dan `rack-test`.
|
|
19
|
+
* ๐ก๏ธ **Built-in Authentication**: Sistem keamanan BCrypt dengan proteksi sesi Rack untuk registrasi log-in area Admin.
|
|
20
|
+
* ๐ **Interactive CMS Dashboard**: Panel admin integratif untuk mengedit isi blog Markdown & transisi visibilitas via UI.
|
|
19
21
|
* ๐จ **Asset Helpers**: Library bawaan untuk pengelolaan CSS dan JS yang lebih rapi.
|
|
20
22
|
* ๐ **Dynamic SEO Engine**: Penanganan otomatis file `robots.txt` dan `sitemap.xml`.
|
|
21
23
|
* ๐ **JSON-LD Support**: Dukungan data terstruktur (Structured Data) otomatis untuk SEO yang lebih optimal.
|
|
@@ -68,11 +70,26 @@ eksa g controller Blog
|
|
|
68
70
|
# Membuat model dan schema database
|
|
69
71
|
eksa g model Post
|
|
70
72
|
|
|
71
|
-
# Membuat postingan blog baru
|
|
72
|
-
eksa g post "Judul Artikel"
|
|
73
|
+
# Membuat postingan blog baru dengan meta tambahan
|
|
74
|
+
eksa g post "Judul Artikel" --category "Kategori" --author "Nama Penulis" --image "url-gambar.jpg"
|
|
75
|
+
|
|
76
|
+
# Mengaktifkan/menonaktifkan fitur bawaan Eksa (auth / cms)
|
|
77
|
+
eksa feature enable auth
|
|
78
|
+
eksa feature enable cms
|
|
79
|
+
|
|
80
|
+
# Mengatur ulang sandi akun admin CMS langsung dari CLI
|
|
81
|
+
eksa reset-password admin PasswordBaru123
|
|
73
82
|
```
|
|
74
83
|
|
|
75
|
-
### 3.
|
|
84
|
+
### 3. CMS Dashboard & Authentication
|
|
85
|
+
Eksa hadir dengan sistem manajemen konten internal bergaya Glassmorphism.
|
|
86
|
+
|
|
87
|
+
* **Aktivasi**: Pertama, jalankan `eksa feature enable auth` dan `eksa feature enable cms` dari terminal Anda lalu *restart* server.
|
|
88
|
+
* **Registrasi**: Akses `http://localhost:9292/auth/register` (Hanya akun pertama yang bisa mendaftar sebagai Administrator).
|
|
89
|
+
* **Akses Dasbor**: Masuk ke rute `/cms` untuk melihat postingan, mengubah status publikasi (*Draft* / *Aktif*), menghapus postingan, hingga melakukan edit data via editor terintegrasi.
|
|
90
|
+
* **Proteksi Taut**: Rute login dan CMS sepenuhnya difilter oleh perantara otentikasi sesi Rack. Admin yang berhasil masuk secara otomatis terlindungi dari paparan rute login berlebih.
|
|
91
|
+
|
|
92
|
+
### 4. Markdown Blog Engine
|
|
76
93
|
Eksa memiliki sistem blog bawaan yang cara kerjanya mirip Jekyll. Cukup buat file `.md` di folder `_posts/` dengan metadata YAML (Front Matter):
|
|
77
94
|
|
|
78
95
|
```markdown
|
|
@@ -1,126 +1,148 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
published: true
|
|
3
|
+
title: Welcome To Eksa Framework
|
|
4
|
+
date: 2026-03-15 21:09:58.000000000 +07:00
|
|
5
|
+
author: IshikawaUta
|
|
6
|
+
category: Framework
|
|
7
|
+
image: https://res.cloudinary.com/dzsqaauqn/image/upload/v1773645204/logo_ne3hy4.png
|
|
4
8
|
---
|
|
5
9
|
|
|
6
|
-
# โจ Eksa Framework
|
|
7
|
-
|
|
8
|
-
**Eksa Framework** adalah *micro-framework* MVC (Model-View-Controller) modern yang dibangun di atas Ruby dan Rack. Didesain untuk pengembang yang menginginkan kecepatan, kode yang bersih, dan tampilan antarmuka **Glassmorphism** yang elegan secara *out-of-the-box*.
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## ๐ Fitur Unggulan
|
|
13
|
-
|
|
14
|
-
* ๐ **Modern Glassmorphism UI**: Tampilan transparan yang indah dengan Tailwind CSS & Lucide Icons.
|
|
15
|
-
* โก **Rack 3 & Middleware Support**: Mendukung standar terbaru dan pembuatan pipeline middleware kustom.
|
|
16
|
-
* ๐ ๏ธ **Powerful CLI**: Inisialisasi project (`eksa init`), jalankan server (`eksa run`), generate komponen, dan **auto-routing** otomatis.
|
|
17
|
-
* ๐พ **Dynamic Database Engine**: Database SQLite otomatis dengan schema yang ditentukan oleh model Anda sendiri.
|
|
18
|
-
* ๐งช **Built-in Testing**: Lingkungan pengujian otomatis siap pakai menggunakan RSpec dan `rack-test`.
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
config.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
# Membuat
|
|
68
|
-
eksa g
|
|
69
|
-
|
|
70
|
-
# Membuat
|
|
71
|
-
eksa g
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
* **
|
|
88
|
-
* **
|
|
89
|
-
* **
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
10
|
+
# โจ Eksa Framework
|
|
11
|
+
|
|
12
|
+
**Eksa Framework** adalah *micro-framework* MVC (Model-View-Controller) modern yang dibangun di atas Ruby dan Rack. Didesain untuk pengembang yang menginginkan kecepatan, kode yang bersih, dan tampilan antarmuka **Glassmorphism** yang elegan secara *out-of-the-box*.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## ๐ Fitur Unggulan
|
|
17
|
+
|
|
18
|
+
* ๐ **Modern Glassmorphism UI**: Tampilan transparan yang indah dengan Tailwind CSS & Lucide Icons.
|
|
19
|
+
* โก **Rack 3 & Middleware Support**: Mendukung standar terbaru dan pembuatan pipeline middleware kustom.
|
|
20
|
+
* ๐ ๏ธ **Powerful CLI**: Inisialisasi project (`eksa init`), jalankan server (`eksa run`), generate komponen, dan **auto-routing** otomatis.
|
|
21
|
+
* ๐พ **Dynamic Database Engine**: Database SQLite otomatis dengan schema yang ditentukan oleh model Anda sendiri.
|
|
22
|
+
* ๐งช **Built-in Testing**: Lingkungan pengujian otomatis siap pakai menggunakan RSpec dan `rack-test`.
|
|
23
|
+
* ๐ก๏ธ **Built-in Authentication**: Sistem keamanan BCrypt dengan proteksi sesi Rack untuk registrasi log-in area Admin.
|
|
24
|
+
* ๐ **Interactive CMS Dashboard**: Panel admin integratif untuk mengedit isi blog Markdown & transisi visibilitas via UI.
|
|
25
|
+
* ๐จ **Asset Helpers**: Library bawaan untuk pengelolaan CSS dan JS yang lebih rapi.
|
|
26
|
+
* ๐ **Dynamic SEO Engine**: Penanganan otomatis file `robots.txt` dan `sitemap.xml`.
|
|
27
|
+
* ๐ **JSON-LD Support**: Dukungan data terstruktur (Structured Data) otomatis untuk SEO yang lebih optimal.
|
|
28
|
+
* ๐ป **Aesthetic Error Pages**: Halaman 404 dengan desain Glassmorphism yang elegan secara native.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## ๐ ๏ธ Instalasi Cepat
|
|
33
|
+
|
|
34
|
+
### 1. Install via Gem
|
|
35
|
+
```bash
|
|
36
|
+
gem install eksa-framework
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 2. Inisialisasi Project Baru
|
|
40
|
+
```bash
|
|
41
|
+
mkdir my-app && cd my-app
|
|
42
|
+
eksa init
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 3. Jalankan Server
|
|
46
|
+
```bash
|
|
47
|
+
bundle install
|
|
48
|
+
eksa run
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## ๐ป Panduan Pengembangan
|
|
54
|
+
|
|
55
|
+
### 1. Konfigurasi Aplikasi (`config.ru`)
|
|
56
|
+
Eksa kini menggunakan blok inisialisasi untuk konfigurasi yang lebih fleksibel:
|
|
57
|
+
|
|
58
|
+
```ruby
|
|
59
|
+
app = Eksa::Application.new do |config|
|
|
60
|
+
config.config[:db_path] = "./db/production.db"
|
|
61
|
+
|
|
62
|
+
config.use Rack::Static, urls: ["/css", "/img"], root: "public"
|
|
63
|
+
config.use Rack::ShowExceptions
|
|
64
|
+
end
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 2. CLI Generator
|
|
68
|
+
Hemat waktu dengan menggunakan generator bawaan:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Membuat controller dan view template
|
|
72
|
+
eksa g controller Blog
|
|
73
|
+
|
|
74
|
+
# Membuat model dan schema database
|
|
75
|
+
eksa g model Post
|
|
76
|
+
|
|
77
|
+
# Membuat postingan blog baru dengan meta tambahan
|
|
78
|
+
eksa g post "Judul Artikel" --category "Kategori" --author "Nama Penulis" --image "url-gambar.jpg"
|
|
79
|
+
|
|
80
|
+
# Mengaktifkan/menonaktifkan fitur bawaan Eksa (auth / cms)
|
|
81
|
+
eksa feature enable auth
|
|
82
|
+
eksa feature enable cms
|
|
83
|
+
|
|
84
|
+
# Mengatur ulang sandi akun admin CMS langsung dari CLI
|
|
85
|
+
eksa reset-password admin PasswordBaru123
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 3. CMS Dashboard & Authentication
|
|
89
|
+
Eksa hadir dengan sistem manajemen konten internal bergaya Glassmorphism.
|
|
90
|
+
|
|
91
|
+
* **Aktivasi**: Pertama, jalankan `eksa feature enable auth` dan `eksa feature enable cms` dari terminal Anda lalu *restart* server.
|
|
92
|
+
* **Registrasi**: Akses `http://localhost:9292/auth/register` (Hanya akun pertama yang bisa mendaftar sebagai Administrator).
|
|
93
|
+
* **Akses Dasbor**: Masuk ke rute `/cms` untuk melihat postingan, mengubah status publikasi (*Draft* / *Aktif*), menghapus postingan, hingga melakukan edit data via editor terintegrasi.
|
|
94
|
+
* **Proteksi Taut**: Rute login dan CMS sepenuhnya difilter oleh perantara otentikasi sesi Rack. Admin yang berhasil masuk secara otomatis terlindungi dari paparan rute login berlebih.
|
|
95
|
+
|
|
96
|
+
### 4. Markdown Blog Engine
|
|
97
|
+
Eksa memiliki sistem blog bawaan yang cara kerjanya mirip Jekyll. Cukup buat file `.md` di folder `_posts/` dengan metadata YAML (Front Matter):
|
|
98
|
+
|
|
99
|
+
```markdown
|
|
100
|
+
---
|
|
101
|
+
title: "Halo Eksa"
|
|
102
|
+
date: 2026-03-15 14:00:00
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
Isi konten blog menggunakan **Markdown**.
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Fitur Blog:
|
|
109
|
+
* **Dynamic Slug**: Otomatis mengenali rute `/posts/:slug`.
|
|
110
|
+
* **Syntax Highlighting**: Kode di dalam blog otomatis berwarna & punya tombol copy.
|
|
111
|
+
* **Aesthetic UI**: Template blog bawaan dengan desain Glassmorphism.
|
|
112
|
+
|
|
113
|
+
### 4. Database & Model
|
|
114
|
+
Definisikan schema tabel Anda langsung di dalam model:
|
|
115
|
+
|
|
116
|
+
```ruby
|
|
117
|
+
class Post < Eksa::Model
|
|
118
|
+
def self.setup_schema
|
|
119
|
+
db.execute <<~SQL
|
|
120
|
+
CREATE TABLE IF NOT EXISTS posts (
|
|
121
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
122
|
+
title TEXT,
|
|
123
|
+
content TEXT
|
|
124
|
+
)
|
|
125
|
+
SQL
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 4. Asset Helpers
|
|
131
|
+
Gunakan helper di dalam view untuk menyisipkan asset:
|
|
132
|
+
|
|
133
|
+
```erb
|
|
134
|
+
<%= stylesheet_tag "style" %>
|
|
135
|
+
<%= javascript_tag "app" %>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 5. Menjalankan Test
|
|
139
|
+
Pastikan aplikasi Anda berjalan dengan benar menggunakan RSpec:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
bundle exec rspec
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## ๐ Lisensi
|
|
148
|
+
Proyek ini dilisensikan di bawah **MIT License**. Lihat file [LICENSE](https://github.com/IshikawaUta/eksa-framework/blob/main/LICENSE) untuk detail lebih lanjut.
|
data/app/views/about.html.erb
CHANGED
|
@@ -7,20 +7,40 @@
|
|
|
7
7
|
</div>
|
|
8
8
|
|
|
9
9
|
<div class="space-y-6 text-white/80 leading-relaxed">
|
|
10
|
-
<p class="text-lg">
|
|
11
|
-
<strong>Eksa Framework</strong> adalah
|
|
10
|
+
<p class="text-lg text-center mx-auto max-w-2xl mb-10">
|
|
11
|
+
<strong>Eksa Framework v3.4.3</strong> adalah <strong>micro-framework</strong> Ruby yang dibangun dari nol untuk mendemonstrasikan kekuatan arsitektur MVC, kesederhanaan Ruby, dengan keindahan antarmuka-antarmuka UI masa kini.
|
|
12
12
|
</p>
|
|
13
13
|
|
|
14
|
-
<div class="grid grid-cols-1 md:grid-cols-2 gap-
|
|
15
|
-
<div class="bg-white/5 p-6 rounded-2xl border border-white/10">
|
|
14
|
+
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mt-8">
|
|
15
|
+
<div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
|
|
16
16
|
<i data-lucide="cpu" class="w-6 h-6 text-indigo-300 mb-3"></i>
|
|
17
|
-
<h3 class="font-bold text-white mb-2">Core Ruby</h3>
|
|
18
|
-
<p class="text-sm">Dibangun di atas Rack tanpa
|
|
17
|
+
<h3 class="font-bold text-white mb-2">Core Ruby & Rack 3</h3>
|
|
18
|
+
<p class="text-sm">Dibangun di atas standar industri Rack tanpa bloatware framework berlapis.</p>
|
|
19
19
|
</div>
|
|
20
|
-
<div class="bg-white/5 p-6 rounded-2xl border border-white/10">
|
|
21
|
-
<i data-lucide="database" class="w-6 h-6 text-
|
|
22
|
-
<h3 class="font-bold text-white mb-2">SQLite Engine</h3>
|
|
23
|
-
<p class="text-sm">Penyimpanan
|
|
20
|
+
<div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
|
|
21
|
+
<i data-lucide="database" class="w-6 h-6 text-emerald-300 mb-3"></i>
|
|
22
|
+
<h3 class="font-bold text-white mb-2">Auto SQLite Engine</h3>
|
|
23
|
+
<p class="text-sm">Penyimpanan otomatis via model ringan dengan performa memori memukau.</p>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
|
|
26
|
+
<i data-lucide="layout-template" class="w-6 h-6 text-cyan-300 mb-3"></i>
|
|
27
|
+
<h3 class="font-bold text-white mb-2">Glassmorphism UI</h3>
|
|
28
|
+
<p class="text-sm">Komponen estetis bergaya efek kaca bawaan <strong>frosted-glass</strong>.</p>
|
|
29
|
+
</div>
|
|
30
|
+
<div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
|
|
31
|
+
<i data-lucide="pen-tool" class="w-6 h-6 text-yellow-300 mb-3"></i>
|
|
32
|
+
<h3 class="font-bold text-white mb-2">Markdown Blog</h3>
|
|
33
|
+
<p class="text-sm">Sistem artikel statis lengkap Front Matter YAML & Auto-Routing layaknya Jekyll.</p>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
|
|
36
|
+
<i data-lucide="shield-check" class="w-6 h-6 text-rose-300 mb-3"></i>
|
|
37
|
+
<h3 class="font-bold text-white mb-2">Secure Auth</h3>
|
|
38
|
+
<p class="text-sm">Otentikasi basis sessi pintar BCrypt untuk proteksi admin panel berlapis.</p>
|
|
39
|
+
</div>
|
|
40
|
+
<div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
|
|
41
|
+
<i data-lucide="layout-dashboard" class="w-6 h-6 text-fuchsia-300 mb-3"></i>
|
|
42
|
+
<h3 class="font-bold text-white mb-2">CMS Dashboard</h3>
|
|
43
|
+
<p class="text-sm">Pusat kendali admin internal untuk edit Markdown via <strong>web page</strong> langsung.</p>
|
|
24
44
|
</div>
|
|
25
45
|
</div>
|
|
26
46
|
</div>
|
data/app/views/docs.html.erb
CHANGED
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
<li><a href="#database" class="hover:text-indigo-300 transition flex items-center gap-2"><i data-lucide="database" class="w-3 h-3"></i> Auto-Migration</a></li>
|
|
31
31
|
<li><a href="#flash" class="hover:text-indigo-300 transition flex items-center gap-2"><i data-lucide="bell" class="w-3 h-3"></i> Flash UI</a></li>
|
|
32
32
|
<li><a href="#blog" class="hover:text-indigo-300 transition flex items-center gap-2"><i data-lucide="pen-tool" class="w-3 h-3"></i> Markdown Blog</a></li>
|
|
33
|
+
<li><a href="#cms" class="hover:text-indigo-300 transition flex items-center gap-2"><i data-lucide="layout-dashboard" class="w-3 h-3"></i> CMS & Auth</a></li>
|
|
33
34
|
</ul>
|
|
34
35
|
</div>
|
|
35
36
|
</div>
|
|
@@ -136,8 +137,8 @@
|
|
|
136
137
|
</h2>
|
|
137
138
|
<p class="text-white/60 mb-4 text-sm">Kelola konten blog dengan file Markdown. Mendukung Front Matter YAML dan rute dinamis.</p>
|
|
138
139
|
<div class="bg-black/40 rounded-2xl p-6 font-mono text-sm border border-white/10">
|
|
139
|
-
<p class="text-white/30"># Buat post baru lewat CLI</p>
|
|
140
|
-
<p class="text-indigo-300">eksa g post "Judul Postingan"</p>
|
|
140
|
+
<p class="text-white/30"># Buat post baru lewat CLI (dengan opsi meta)</p>
|
|
141
|
+
<p class="text-indigo-300">eksa g post "Judul Postingan" --category "Tech" --author "Nama" --image "url.jpg"</p>
|
|
141
142
|
<p class="text-white/30 mt-4"># Akses di URL (Otomatis)</p>
|
|
142
143
|
<p class="text-white/70">/posts/:slug</p>
|
|
143
144
|
</div>
|
|
@@ -147,6 +148,24 @@
|
|
|
147
148
|
</div>
|
|
148
149
|
</section>
|
|
149
150
|
|
|
151
|
+
<section id="cms" class="mb-12 scroll-mt-24">
|
|
152
|
+
<h2 class="text-2xl font-bold mb-4 flex items-center gap-2">
|
|
153
|
+
<i data-lucide="layout-dashboard" class="w-6 h-6 text-indigo-400"></i> CMS Dashboard & Keamanan
|
|
154
|
+
</h2>
|
|
155
|
+
<p class="text-white/60 mb-4 text-sm">Eksa difasilitasi dengan area protektif yang dapat dilalui pendaftaran mandiri jika belum ada entitas pendaftar, kemudian dikunci menggunakan otentikasi Rack + enkripsi BCrypt.</p>
|
|
156
|
+
<div class="bg-black/40 rounded-2xl p-6 font-mono text-sm border border-white/10">
|
|
157
|
+
<p class="text-white/30"># Menghidupkan Engine Utama dari folder project</p>
|
|
158
|
+
<p class="text-indigo-300">eksa feature enable auth</p>
|
|
159
|
+
<p class="text-indigo-300">eksa feature enable cms</p>
|
|
160
|
+
<p class="text-white/30 mt-4"># Lupa sandi masuk halaman CMS?</p>
|
|
161
|
+
<p class="text-indigo-300">eksa reset-password usernameanda katasandibaru</p>
|
|
162
|
+
</div>
|
|
163
|
+
<div class="mt-4 p-4 bg-emerald-500/10 border border-emerald-500/20 rounded-xl flex items-center gap-3">
|
|
164
|
+
<i data-lucide="shield-check" class="w-5 h-5 text-emerald-400"></i>
|
|
165
|
+
<p class="text-xs text-emerald-200/80">Jika integrasi Auth diaktifkan, masuklah ke URL <code class="text-white">/auth/register</code> saat pertama kali start. Setelah mendaftar The Vault (Dashboard) dapat diakses lewat <code class="text-white">/cms</code></p>
|
|
166
|
+
</div>
|
|
167
|
+
</section>
|
|
168
|
+
|
|
150
169
|
<section id="build" class="mb-12 scroll-mt-24">
|
|
151
170
|
<h2 class="text-2xl font-bold mb-4 flex items-center gap-2">
|
|
152
171
|
<i data-lucide="package-check" class="w-6 h-6 text-indigo-400"></i> Build & Publish
|
|
@@ -155,7 +174,7 @@
|
|
|
155
174
|
<p class="text-white/30"># Build gem lokal</p>
|
|
156
175
|
<p class="text-indigo-300">gem build eksa-framework.gemspec</p>
|
|
157
176
|
<p class="text-white/30 mt-4"># Publish ke RubyGems / GitHub Packages</p>
|
|
158
|
-
<p class="text-indigo-300">gem push eksa-framework-3.3.
|
|
177
|
+
<p class="text-indigo-300">gem push eksa-framework-3.4.3.gem</p>
|
|
159
178
|
</div>
|
|
160
179
|
</section>
|
|
161
180
|
|
|
@@ -164,7 +183,7 @@
|
|
|
164
183
|
<span class="bg-indigo-500/20 text-indigo-300 text-[10px] px-3 py-1 rounded-full border border-indigo-500/30 uppercase tracking-tighter">Rack 3.0 Compatible</span>
|
|
165
184
|
<span class="bg-emerald-500/20 text-emerald-300 text-[10px] px-3 py-1 rounded-full border border-emerald-500/30 uppercase tracking-tighter">SQLite3 Auto-Ready</span>
|
|
166
185
|
</div>
|
|
167
|
-
<p class="text-white/40 text-sm italic">Eksa Framework v3.3
|
|
186
|
+
<p class="text-white/40 text-sm italic">Eksa Framework v3.4.3 Alpha Documentation</p>
|
|
168
187
|
<a href="/" class="inline-block mt-6 text-indigo-300 hover:text-white transition font-bold flex items-center justify-center gap-2">
|
|
169
188
|
<i data-lucide="arrow-left" class="w-4 h-4"></i> Kembali ke Beranda
|
|
170
189
|
</a>
|
data/app/views/index.html.erb
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<div class="flex flex-col md:flex-row justify-between items-start md:items-center mb-8 gap-4">
|
|
3
3
|
<div>
|
|
4
4
|
<span class="inline-block bg-indigo-500/20 text-indigo-200 text-xs font-bold px-3 py-1 rounded-full mb-3 border border-indigo-500/30">
|
|
5
|
-
v3.3
|
|
5
|
+
v3.4.3 Alpha
|
|
6
6
|
</span>
|
|
7
7
|
<h1 class="text-4xl font-extrabold tracking-tight">
|
|
8
8
|
Halo, <span class="text-indigo-300"><%= @nama %></span>!
|
data/app/views/layout.html.erb
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"datePublished": (@post.date.is_a?(Time) ? @post.date.iso8601 : @post.date),
|
|
25
25
|
"author": {
|
|
26
26
|
"@type": "Person",
|
|
27
|
-
"name":
|
|
27
|
+
"name": (@post.author && !@post.author.empty?) ? @post.author : 'IshikawaUta'
|
|
28
28
|
},
|
|
29
29
|
"url": current_url,
|
|
30
30
|
"description": @post.body_html[0..160].gsub(/<[^>]*>/, '').strip + "..."
|
|
@@ -19,14 +19,32 @@
|
|
|
19
19
|
</div>
|
|
20
20
|
<% else %>
|
|
21
21
|
<% @posts.each do |post| %>
|
|
22
|
-
<a href="/posts/<%= post.slug %>" class="group block bg-white/5 hover:bg-white/10
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
<
|
|
22
|
+
<a href="/posts/<%= post.slug %>" class="group block bg-white/5 hover:bg-white/10 overflow-hidden rounded-3xl border border-white/10 transition-all hover:scale-[1.02]">
|
|
23
|
+
<% if !post.image.empty? %>
|
|
24
|
+
<div class="h-48 overflow-hidden">
|
|
25
|
+
<img src="<%= post.image %>" alt="<%= post.title %>" class="w-full h-full object-cover group-hover:scale-110 transition-transform duration-500">
|
|
26
|
+
</div>
|
|
27
|
+
<% end %>
|
|
28
|
+
<div class="p-6">
|
|
29
|
+
<div class="flex items-center justify-between mb-4">
|
|
30
|
+
<span class="text-[10px] font-bold text-indigo-300 uppercase tracking-widest px-2 py-1 bg-indigo-500/20 rounded-md border border-indigo-500/30">
|
|
31
|
+
<%= post.category %>
|
|
32
|
+
</span>
|
|
33
|
+
<span class="text-[10px] font-medium text-white/40 uppercase tracking-widest">
|
|
34
|
+
<%= post.date.is_a?(Time) ? post.date.strftime("%d %B %Y") : post.date %>
|
|
35
|
+
</span>
|
|
36
|
+
</div>
|
|
37
|
+
<h2 class="text-2xl font-bold mb-3 group-hover:text-indigo-300 transition-colors"><%= post.title %></h2>
|
|
38
|
+
<div class="flex items-center justify-between mt-6 pt-4 border-t border-white/5">
|
|
39
|
+
<div class="flex items-center gap-2 text-white/60 text-xs">
|
|
40
|
+
<i data-lucide="user" class="w-3 h-3"></i>
|
|
41
|
+
<span><%= post.author.empty? ? "Eksa Dev" : post.author %></span>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="flex items-center gap-1 text-indigo-300 text-xs font-bold">
|
|
44
|
+
<span>Baca</span>
|
|
45
|
+
<i data-lucide="arrow-right" class="w-3 h-3 group-hover:translate-x-1 transition-transform"></i>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
30
48
|
</div>
|
|
31
49
|
</a>
|
|
32
50
|
<% end %>
|
|
@@ -3,11 +3,31 @@
|
|
|
3
3
|
<a href="/posts" class="inline-flex items-center gap-2 text-indigo-300 hover:text-white transition mb-6">
|
|
4
4
|
<i data-lucide="arrow-left" class="w-4 h-4"></i> Kembali ke Blog
|
|
5
5
|
</a>
|
|
6
|
-
<
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
<div class="mb-4 flex items-center gap-3">
|
|
7
|
+
<span class="px-3 py-1 bg-indigo-500/20 rounded-lg border border-indigo-500/30 text-xs font-bold text-indigo-300 uppercase tracking-widest">
|
|
8
|
+
<%= @post.category %>
|
|
9
|
+
</span>
|
|
10
|
+
<span class="text-xs font-medium text-white/40 uppercase tracking-widest">
|
|
11
|
+
<%= @post.date.is_a?(Time) ? @post.date.strftime("%d %B %Y") : @post.date %>
|
|
12
|
+
</span>
|
|
13
|
+
</div>
|
|
14
|
+
<h3 class="text-5xl font-extrabold tracking-tight mb-6 leading-tight"><%= @post.title %></h3>
|
|
15
|
+
|
|
16
|
+
<div class="flex items-center gap-4 mb-8 pb-8 border-b border-white/10">
|
|
17
|
+
<div class="w-10 h-10 rounded-full bg-indigo-500 flex items-center justify-center text-white shadow-lg shadow-indigo-500/30">
|
|
18
|
+
<i data-lucide="user" class="w-5 h-5"></i>
|
|
19
|
+
</div>
|
|
20
|
+
<div>
|
|
21
|
+
<p class="text-sm font-bold text-white"><%= @post.author.empty? ? "Eksa Dev" : @post.author %></p>
|
|
22
|
+
<p class="text-[10px] text-white/40 uppercase tracking-widest">Penulis Artikel</p>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
<% if !@post.image.empty? %>
|
|
27
|
+
<div class="mb-10 rounded-3xl overflow-hidden shadow-2xl border border-white/10">
|
|
28
|
+
<img src="<%= @post.image %>" alt="<%= @post.title %>" class="w-full object-cover max-h-[400px]">
|
|
29
|
+
</div>
|
|
30
|
+
<% end %>
|
|
11
31
|
</div>
|
|
12
32
|
|
|
13
33
|
<div class="prose prose-invert prose-indigo max-w-none leading-relaxed text-white/80">
|