eksa-framework 3.5.1 → 3.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f57d87052543adcdf399ee64e7d544c31ff386d8aa248eb4436edfc4a234fb39
4
- data.tar.gz: ee730c8fa72e650afb53042818b432097a1d81922f3a4c7b406f3b10d73b6bc7
3
+ metadata.gz: 5e2b3aa79e4c4bd4ffa4b7c2cc55903fb1795d6867181af0f4482d8f81755054
4
+ data.tar.gz: 2192158838c5691c2205bd4fc35d5600afab029c5658c2e138d74f88b09ca505
5
5
  SHA512:
6
- metadata.gz: 75f1ce079637bd91c2d06d3f38bfbe617ae0b878c72c0d801ec0dab200ee006608f9d3b47cb1c328939cf23eb553fecfa5f6cb97864c1900a4bc5c7e2bc3dc3c
7
- data.tar.gz: 466ab56d0ef22b2ea3062808f88f2bb5d4416ced8109fcd96cb03449344099922421ba32160fbf4a99f64d4a0995321f6eac56e0ddfaf59d43783dd85d775f09
6
+ metadata.gz: a46b901cfc580f3a568f24211a031e595c8c8590dc7bbe7546baa59cf45271771e1e11e2e25ee75b34e53f25d4a420823bcc9c313f30c876bdc12f7c44bbba6d
7
+ data.tar.gz: 76e273fd74a3043f095f8a12ce47c753d994166ac7bde13c55ca95a2dc2982f6b0f76ca88c2b8b2f68f47ee9e7895d905773dbec783d95af834093875b0d32a0
@@ -0,0 +1,35 @@
1
+ # Kode Etik Kontributor
2
+
3
+ ## Komitmen Kami
4
+ Untuk menumbuhkan lingkungan yang terbuka dan ramah, kami sebagai kontributor dan pengelola berkomitmen untuk membuat partisipasi dalam proyek kami dan komunitas kami menjadi pengalaman yang bebas dari pelecehan bagi semua orang, tanpa memandang usia, ukuran tubuh, disabilitas, etnis, karakteristik seks, identitas dan ekspresi gender, tingkat pengalaman, pendidikan, status sosial ekonomi, kebangsaan, penampilan pribadi, ras, agama, atau identitas dan orientasi seksual.
5
+
6
+ ## Standar Kami
7
+ Contoh perilaku yang berkontribusi pada penciptaan lingkungan yang positif meliputi:
8
+ * Menggunakan bahasa yang ramah dan inklusif
9
+ * Menghargai perbedaan sudut pandang dan pengalaman
10
+ * Menerima kritik yang membangun dengan lapang dada
11
+ * Fokus pada apa yang terbaik bagi komunitas
12
+ * Menunjukkan empati terhadap anggota komunitas lainnya
13
+
14
+ Contoh perilaku yang tidak dapat diterima oleh peserta meliputi:
15
+ * Penggunaan bahasa atau citra seksual dan perhatian atau kemajuan seksual yang tidak diinginkan
16
+ * Komentar trolling, menghina/meremehkan, serta serangan pribadi atau politik
17
+ * Pelecehan publik atau pribadi
18
+ * Memublikasikan informasi pribadi orang lain, seperti alamat fisik atau elektronik, tanpa izin eksplisit
19
+ * Perilaku lain yang secara wajar dapat dianggap tidak pantas dalam lingkungan profesional
20
+
21
+ ## Tanggung Jawab Pengelola
22
+ Pengelola proyek bertanggung jawab untuk memperjelas standar perilaku yang dapat diterima dan diharapkan untuk mengambil tindakan korektif yang adil sebagai tanggapan atas setiap insiden perilaku yang tidak dapat diterima.
23
+
24
+ Pengelola proyek memiliki hak dan tanggung jawab untuk menghapus, mengedit, atau menolak komentar, commit, code, pengeditan wiki, issue, dan kontribusi lainnya yang tidak selaras dengan Kode Etik ini, atau untuk melarang sementara atau permanen setiap kontributor atas perilaku lain yang mereka anggap tidak pantas, mengancam, menyinggung, atau berbahaya.
25
+
26
+ ## Ruang Lingkup
27
+ Kode Etik ini berlaku baik di dalam ruang proyek maupun di ruang publik ketika seseorang mewakili proyek atau komunitasnya. Contoh mewakili proyek atau komunitas meliputi penggunaan alamat email resmi proyek, memposting melalui akun media sosial resmi, atau bertindak sebagai perwakilan yang ditunjuk pada acara online atau offline. Representasi suatu proyek dapat ditentukan lebih lanjut dan dijelaskan oleh pengelola proyek.
28
+
29
+ ## Penegakan
30
+ Instansi perilaku yang kasar, melecehkan, atau tidak dapat diterima dapat dilaporkan dengan menghubungi tim proyek. Semua keluhan akan ditinjau dan diselidiki serta akan menghasilkan tanggapan yang dianggap perlu dan tepat sesuai situasi. Tim proyek berkewajiban untuk menjaga kerahasiaan terkait pelapor insiden. Rincian lebih lanjut tentang kebijakan penegakan dapat diposting secara terpisah.
31
+
32
+ Pengelola proyek yang tidak mengikuti atau menegakkan Kode Etik dengan itikad baik dapat menghadapi dampak sementara atau permanen seperti yang ditentukan oleh anggota kepemimpinan proyek lainnya.
33
+
34
+ ## Atribusi
35
+ Kode Etik ini diadaptasi dari [Contributor Covenant](https://www.contributor-covenant.org), versi 1.4, tersedia di [https://www.contributor-covenant.org/version/1/4/code-of-conduct.html](https://www.contributor-covenant.org/version/1/4/code-of-conduct.html).
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,92 @@
1
+ # Panduan Kontribusi Eksa Framework
2
+
3
+ Terima kasih telah tertarik untuk berkontribusi pada **Eksa Framework**! Kami sangat menghargai bantuan Anda untuk membuat micro-framework ini menjadi lebih baik, lebih cepat, dan lebih elegan.
4
+
5
+ ---
6
+
7
+ ## 🏔️ Filosofi Proyek
8
+ Eksa Framework didesain sebagai *micro-framework* MVC yang ringan namun kuat, dengan penekanan pada:
9
+ 1. **Kemudahan Penggunaan**: API yang intuitif untuk pengembang Ruby.
10
+ 2. **Keindahan Visual**: Antarmuka *Glassmorphism* yang modern secara bawaan.
11
+ 3. **Fleksibilitas**: Mendukung SQLite dan MongoDB Atlas secara transparan.
12
+
13
+ ---
14
+
15
+ ## 🚩 Cara Melaporkan Masalah (Bugs)
16
+ Jika Anda menemukan bug, silakan buat *Issue* di GitHub dengan informasi berikut:
17
+ - Penjelasan singkat tentang masalah.
18
+ - Langkah-langkah untuk mereproduksi bug.
19
+ - Hasil yang diharapkan vs hasil yang sebenarnya.
20
+ - Versi Ruby dan Eksa Framework yang digunakan.
21
+
22
+ ---
23
+
24
+ ## 💡 Mengusulkan Fitur Baru
25
+ Kami selalu terbuka untuk ide-ide baru! Untuk mengusulkan fitur:
26
+ 1. Buka *Issue* baru dan beri label `enhancement`.
27
+ 2. Jelaskan mengapa fitur tersebut berguna dan bagaimana cara kerjanya.
28
+ 3. Sertakan contoh penggunaan jika memungkinkan.
29
+
30
+ ---
31
+
32
+ ## 🛠️ Persiapan Pengembangan
33
+
34
+ ### 1. Fork & Clone
35
+ *Fork* repositori ini ke akun GitHub Anda, lalu lakukan *clone* secara lokal:
36
+ ```bash
37
+ git clone https://github.com/USERNAME/eksa_framework.git
38
+ cd eksa_framework
39
+ ```
40
+
41
+ ### 2. Instalasi Dependensi
42
+ Pastikan Anda memiliki Ruby (v3.0+) dan terinstal `bundler`.
43
+ ```bash
44
+ bundle install
45
+ ```
46
+
47
+ ### 3. Membuat Branch
48
+ Selalu buat *branch* baru untuk setiap fitur atau perbaikan bug:
49
+ ```bash
50
+ # Untuk fitur baru
51
+ git checkout -b feature/nama-fitur-anda
52
+
53
+ # Untuk perbaikan bug
54
+ git checkout -b bugfix/deskripsi-perbaikan
55
+ ```
56
+
57
+ ---
58
+
59
+ ## 🎨 Standar Kode & Dokumentasi
60
+ - Ikuti [Ruby Style Guide](https://github.com/rubocop/ruby-style-guide).
61
+ - Pastikan kode Anda bersih dan mudah dibaca.
62
+ - Tambahkan komentar jika logika kode cukup kompleks.
63
+ - Jika Anda menambahkan fitur baru, pastikan untuk memperbarui `README.md` atau dokumentasi terkait.
64
+
65
+ ---
66
+
67
+ ## 🧪 Pengujian (Testing)
68
+ Kami menggunakan **RSpec** untuk memastikan stabilitas framework. Sebelum mengirimkan *Pull Request*, pastikan semua test lulus:
69
+ ```bash
70
+ bundle exec rspec
71
+ ```
72
+ Sangat disarankan untuk menambahkan test baru jika Anda menambahkan fitur atau memperbaiki bug.
73
+
74
+ ---
75
+
76
+ ## 🚀 Proses Pull Request
77
+ 1. Pastikan kode Anda sudah di-test secara lokal.
78
+ 2. Kirimkan *Pull Request* (PR) ke *branch* `main` di repositori utama.
79
+ 3. Berikan deskripsi yang jelas tentang apa yang Anda rubah di dalam PR.
80
+ 4. Tim kami akan meninjau PR Anda sesegera mungkin.
81
+
82
+ ---
83
+
84
+ ## 🛡️ Keamanan
85
+ Keamanan adalah prioritas kami. Jika Anda menemukan kerentanan, harap baca [Kebijakan Keamanan](SECURITY.md) kami sebelum melaporkannya.
86
+
87
+ ---
88
+
89
+ ## 📜 Kode Etik
90
+ Harap bersikap sopan dan profesional dalam setiap interaksi di proyek ini. Kami ingin membangun komunitas yang inklusif dan ramah bagi semua pengembang. Dengan berpartisipasi, Anda diharapkan untuk mematuhi [Kode Etik](CODE_OF_CONDUCT.md) kami.
91
+
92
+ Terima kasih telah berkontribusi! 🚀
data/Gemfile CHANGED
@@ -15,4 +15,5 @@ gem 'bigdecimal', '~> 3.1'
15
15
  gem 'kramdown'
16
16
  gem 'kramdown-parser-gfm'
17
17
  gem 'bcrypt', '~> 3.1'
18
- gem 'rack-session', '~> 2.0'
18
+ gem 'rack-session', '~> 2.0'
19
+ gem 'eksa-mination'
data/Gemfile.lock CHANGED
@@ -7,6 +7,7 @@ GEM
7
7
  bson (5.2.0)
8
8
  diff-lcs (1.6.2)
9
9
  dotenv (2.8.1)
10
+ eksa-mination (2.0.0)
10
11
  kramdown (2.5.2)
11
12
  rexml (>= 3.4.4)
12
13
  kramdown-parser-gfm (1.1.0)
@@ -48,6 +49,7 @@ DEPENDENCIES
48
49
  bcrypt (~> 3.1)
49
50
  bigdecimal (~> 3.1)
50
51
  dotenv (~> 2.8)
52
+ eksa-mination
51
53
  kramdown
52
54
  kramdown-parser-gfm
53
55
  mongo (~> 2.19)
@@ -66,6 +68,7 @@ CHECKSUMS
66
68
  bson (5.2.0) sha256=c468c1e8a3cfa1e80531cc519a890f85586986721d8e305f83465cc36bb82608
67
69
  diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
68
70
  dotenv (2.8.1) sha256=c5944793349ae03c432e1780a2ca929d60b88c7d14d52d630db0508c3a8a17d8
71
+ eksa-mination (2.0.0) sha256=9d2717d24e8b19c7f7a1e2fdbf98d258cda6281309e3dacaac9bb4b0a9e7f750
69
72
  kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa
70
73
  kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729
71
74
  mongo (2.23.0) sha256=be2fe4cc6f7119fa6b79e82a1963b2406856b4dc92d0ccfb74db543897be3109
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # ✨ Eksa Framework v3.5.0
1
+ # ✨ Eksa Framework v3.5.3
2
2
 
3
3
  [![Ruby Version](https://img.shields.io/badge/ruby-3.0+-red.svg)](https://www.ruby-lang.org/)
4
4
  [![Rack Version](https://img.shields.io/badge/rack-3.0+-blue.svg)](https://rack.github.io/)
@@ -9,15 +9,16 @@
9
9
 
10
10
  ---
11
11
 
12
- ## 🚀 Fitur Unggulan v3.5.0
12
+ ## 🚀 Fitur Unggulan v3.5.3
13
13
 
14
14
  * 💎 **Modern Glassmorphism UI**: Tampilan transparan yang indah dengan Tailwind CSS & Lucide Icons.
15
+ * 📱 **Mobile Responsive Navigation**: Sistem navigasi adaptif dengan mobile drawer yang elegan.
15
16
  * ⚡ **Rack 3 & Middleware Support**: Mendukung standar terbaru dan pembuatan pipeline middleware kustom.
16
17
  * 🛠️ **Powerful CLI**: Inisialisasi project (`eksa init`), jalankan server (`eksa run`), generate komponen, ganti database, dan **migrasi data** otomatis.
17
18
  * 💾 **Agnostic Database Engine**: Dukungan multi-database (**SQLite** & **MongoDB Atlas**) dengan sistem adapter yang otomatis dan transparan.
18
19
  * 🛡️ **Secure Environment Variables**: Dukungan file `.env` untuk menyimpan kredensial database (MongoDB URI) secara aman.
19
20
  * ⚙️ **JIT Schema Initialization**: Inisialisasi tabel/koleksi secara otomatis tepat saat model pertama kali diakses.
20
- * 🧪 **Built-in Testing**: Lingkungan pengujian otomatis siap pakai menggunakan RSpec dan `rack-test`.
21
+ * 🧪 **Built-in Testing**: Lingkungan pengujian otomatis siap pakai menggunakan **EksaMination** dan `rack-test`.
21
22
  * 🛡️ **Built-in Authentication**: Sistem keamanan BCrypt dengan proteksi sesi Rack untuk registrasi log-in area Admin.
22
23
  * 📝 **Interactive CMS Dashboard**: Panel admin integratif untuk mengedit isi blog Markdown & transisi visibilitas via UI.
23
24
  * 🔍 **Dynamic SEO Engine**: Penanganan otomatis file `robots.txt`, `sitemap.xml`, dan dukungan **JSON-LD** (Structured Data).
@@ -116,13 +117,24 @@ Eksa secara otomatis menghasilkan:
116
117
  - **JSON-LD**: Skema `BlogPosting` dan `WebSite` disematkan otomatis pada layout untuk peringkat SEO yang lebih baik.
117
118
 
118
119
  ### 5. Menjalankan Test
119
- Gunakan RSpec yang sudah terkonfigurasi untuk memastikan aplikasi stabil:
120
+ Gunakan **EksaMination** (pendekatan pengujian yang lebih ringan dan terintegrasi) untuk memastikan aplikasi stabil:
120
121
 
121
122
  ```bash
122
- bundle exec rspec
123
+ # Menjalankan semua test dengan format dokumentasi
124
+ bundle exec eksa-mination -f documentation
123
125
  ```
124
126
 
125
127
  ---
126
128
 
129
+ ## 🤝 Kontribusi & Komunitas
130
+
131
+ Kami sangat terbuka untuk kontribusi dari siapa pun! Silakan baca panduan berikut sebelum memulai:
132
+
133
+ - **[Panduan Kontribusi](CONTRIBUTING.md)**: Langkah-langkah untuk berkontribusi kode.
134
+ - **[Kebijakan Keamanan](SECURITY.md)**: Cara melaporkan kerentanan secara privat.
135
+ - **[Kode Etik](CODE_OF_CONDUCT.md)**: Standar perilaku dalam komunitas kami.
136
+
137
+ ---
138
+
127
139
  ## 📜 Lisensi
128
- Proyek ini dilisensikan di bawah **MIT License**. Lihat file [LICENSE](https://github.com/IshikawaUta/eksa-framework/blob/main/LICENSE) untuk detail lebih lanjut.
140
+ Proyek ini dilisensikan di bawah **MIT License**. Lihat file [LICENSE](LICENSE) untuk detail lebih lanjut.
data/SECURITY.md ADDED
@@ -0,0 +1,31 @@
1
+ # Kebijakan Keamanan
2
+
3
+ ## Versi yang Didukung
4
+
5
+ Kami sangat menyarankan Anda untuk selalu menggunakan versi terbaru dari Eksa Framework untuk mendapatkan perbaikan keamanan terbaru.
6
+
7
+ | Versi | Didukung |
8
+ | ------- | ------------------ |
9
+ | 3.5.x | ✅ Ya |
10
+ | < 3.5 | ❌ Tidak |
11
+
12
+ ## Melaporkan Kerentanan
13
+
14
+ Kami menangani keamanan dengan sangat serius. Jika Anda menemukan kerentanan keamanan di Eksa Framework, harap **JANGAN** membuka *Issue* publik. Sebaliknya, harap laporkan kerentanan tersebut secara privat melalui email ke:
15
+
16
+ **security@eksa-framework.dev** (Contoh email, silakan sesuaikan jika ada yang spesifik)
17
+
18
+ Tolong sertakan detail berikut dalam laporan Anda:
19
+ - Deskripsi kerentanan.
20
+ - Langkah-langkah untuk mereproduksi masalah.
21
+ - Dampak potensial dari kerentanan tersebut.
22
+
23
+ ## Proses Respons
24
+
25
+ Setelah kami menerima laporan kerentanan:
26
+ 1. Kami akan mengonfirmasi penerimaan laporan dalam waktu 48 jam.
27
+ 2. Kami akan bekerja untuk memvalidasi dan memperbaiki masalah tersebut.
28
+ 3. Kami akan memberikan pembaruan secara berkala mengenai kemajuan perbaikan.
29
+ 4. Setelah perbaikan dirilis, kami akan memberikan kredit kepada pelapor (kecuali jika pelapor memilih untuk anonim).
30
+
31
+ Terima kasih telah membantu menjaga keamanan Eksa Framework!
@@ -7,21 +7,22 @@ category: Framework
7
7
  image: https://res.cloudinary.com/dzsqaauqn/image/upload/v1773645204/logo_ne3hy4.png
8
8
  ---
9
9
 
10
- # ✨ Eksa Framework v3.5.0
10
+ # ✨ Eksa Framework v3.5.3
11
11
 
12
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
13
 
14
14
  ---
15
15
 
16
- ## 🚀 Fitur Unggulan v3.5.0
16
+ ## 🚀 Fitur Unggulan v3.5.3
17
17
 
18
18
  * 💎 **Modern Glassmorphism UI**: Tampilan transparan yang indah dengan Tailwind CSS & Lucide Icons.
19
+ * 📱 **Mobile Responsive Navigation**: Sistem navigasi adaptif dengan mobile drawer yang elegan.
19
20
  * ⚡ **Rack 3 & Middleware Support**: Mendukung standar terbaru dan pembuatan pipeline middleware kustom.
20
21
  * 🛠️ **Powerful CLI**: Inisialisasi project (`eksa init`), jalankan server (`eksa run`), generate komponen, ganti database, dan **migrasi data** otomatis.
21
22
  * 💾 **Agnostic Database Engine**: Dukungan multi-database (**SQLite** & **MongoDB Atlas**) dengan sistem adapter yang otomatis dan transparan.
22
23
  * 🛡️ **Secure Environment Variables**: Dukungan file `.env` untuk menyimpan kredensial database (MongoDB URI) secara aman.
23
24
  * ⚙️ **JIT Schema Initialization**: Inisialisasi tabel/koleksi secara otomatis tepat saat model pertama kali diakses.
24
- * 🧪 **Built-in Testing**: Lingkungan pengujian otomatis siap pakai menggunakan RSpec dan `rack-test`.
25
+ * 🧪 **Built-in Testing**: Lingkungan pengujian otomatis siap pakai menggunakan **EksaMination** dan `rack-test`.
25
26
  * 🛡️ **Built-in Authentication**: Sistem keamanan BCrypt dengan proteksi sesi Rack untuk registrasi log-in area Admin.
26
27
  * 📝 **Interactive CMS Dashboard**: Panel admin integratif untuk mengedit isi blog Markdown & transisi visibilitas via UI.
27
28
  * 🔍 **Dynamic SEO Engine**: Penanganan otomatis file `robots.txt`, `sitemap.xml`, dan dukungan **JSON-LD** (Structured Data).
@@ -120,13 +121,24 @@ Eksa secara otomatis menghasilkan:
120
121
  - **JSON-LD**: Skema `BlogPosting` dan `WebSite` disematkan otomatis pada layout untuk peringkat SEO yang lebih baik.
121
122
 
122
123
  ### 5. Menjalankan Test
123
- Gunakan RSpec yang sudah terkonfigurasi untuk memastikan aplikasi stabil:
124
+ Gunakan **EksaMination** (pendekatan pengujian yang lebih ringan dan terintegrasi) untuk memastikan aplikasi stabil:
124
125
 
125
126
  ```bash
126
- bundle exec rspec
127
+ # Menjalankan semua test dengan format dokumentasi
128
+ bundle exec eksa-mination -f documentation
127
129
  ```
128
130
 
129
131
  ---
130
132
 
133
+ ## 🤝 Kontribusi & Komunitas
134
+
135
+ Kami sangat terbuka untuk kontribusi dari siapa pun! Silakan baca panduan berikut sebelum memulai:
136
+
137
+ - **[Panduan Kontribusi](CONTRIBUTING.md)**: Langkah-langkah untuk berkontribusi kode.
138
+ - **[Kebijakan Keamanan](SECURITY.md)**: Cara melaporkan kerentanan secara privat.
139
+ - **[Kode Etik](CODE_OF_CONDUCT.md)**: Standar perilaku dalam komunitas kami.
140
+
141
+ ---
142
+
131
143
  ## 📜 Lisensi
132
- Proyek ini dilisensikan di bawah **MIT License**. Lihat file [LICENSE](https://github.com/IshikawaUta/eksa-framework/blob/main/LICENSE) untuk detail lebih lanjut.
144
+ Proyek ini dilisensikan di bawah **MIT License**. Lihat file [LICENSE](LICENSE) untuk detail lebih lanjut.
@@ -30,6 +30,14 @@ class PagesController < Eksa::Controller
30
30
  render :kontak
31
31
  end
32
32
 
33
+ def conduct
34
+ render :conduct
35
+ end
36
+
37
+ def security
38
+ render :security
39
+ end
40
+
33
41
  def edit
34
42
  @id = params['id']
35
43
  @pesan = Pesan.cari(@id)
@@ -8,24 +8,24 @@
8
8
 
9
9
  <div class="space-y-6 text-white/80 leading-relaxed">
10
10
  <p class="text-lg text-center mx-auto max-w-2xl mb-10">
11
- <strong>Eksa Framework v3.5.0</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.
11
+ <strong>Eksa Framework v3.5.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
14
  <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mt-8">
15
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
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>
18
+ <p class="text-sm">Dibangun di atas standar industri Rack tanpa bloatware framework berlapis. Kompatibel dengan Ruby 3.4+.</p>
19
19
  </div>
20
20
  <div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
21
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">Multi-DB Engine</h3>
23
- <p class="text-sm">Mendukung peralihan dinamis & migrasi data antara SQLite dan MongoDB Atlas.</p>
22
+ <h3 class="font-bold text-white mb-2">Agnostic DB Engine</h3>
23
+ <p class="text-sm">Mendukung peralihan dinamis & migrasi data antara SQLite dan MongoDB Atlas secara JIT.</p>
24
24
  </div>
25
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>
26
+ <i data-lucide="shield-check" class="w-6 h-6 text-rose-300 mb-3"></i>
27
+ <h3 class="font-bold text-white mb-2">Security First</h3>
28
+ <p class="text-sm">Dukungan <code class="text-indigo-200">.env</code> native untuk mengamankan kredensial cloud dan rahasia aplikasi.</p>
29
29
  </div>
30
30
  <div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
31
31
  <i data-lucide="pen-tool" class="w-6 h-6 text-yellow-300 mb-3"></i>
@@ -33,23 +33,23 @@
33
33
  <p class="text-sm">Sistem artikel statis lengkap Front Matter YAML & Auto-Routing layaknya Jekyll.</p>
34
34
  </div>
35
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>
36
+ <i data-lucide="search" class="w-6 h-6 text-cyan-300 mb-3"></i>
37
+ <h3 class="font-bold text-white mb-2">SEO & JSON-LD</h3>
38
+ <p class="text-sm">Optimasi mesin pencari otomatis dengan Sitemap, Robots.txt, dan Structured Data.</p>
39
39
  </div>
40
40
  <div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
41
41
  <i data-lucide="layout-dashboard" class="w-6 h-6 text-fuchsia-300 mb-3"></i>
42
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>
43
+ <p class="text-sm">Pusat kendali admin internal untuk edit Markdown via <strong>web editor</strong> langsung.</p>
44
44
  </div>
45
45
  </div>
46
46
  </div>
47
47
 
48
48
  <div class="mt-12 pt-8 border-t border-white/10 flex justify-between items-center">
49
- <a href="/" class="flex items-center gap-2 text-indigo-300 hover:text-white transition">
49
+ <a href="/" class="flex items-center gap-2 text-indigo-300 hover:text-white transition font-bold">
50
50
  <i data-lucide="arrow-left" class="w-4 h-4"></i> Kembali ke Home
51
51
  </a>
52
- <span class="text-xs opacity-40 italic">Handcrafted with Ruby</span>
52
+ <span class="text-xs opacity-40 italic">Handcrafted with Ruby by IshikawaUta</span>
53
53
  </div>
54
54
  </div>
55
55
 
@@ -0,0 +1,52 @@
1
+ <div class="glass rounded-3xl p-10 text-white animate__animated animate__fadeIn">
2
+ <div class="flex items-center gap-4 mb-8">
3
+ <div class="p-4 bg-indigo-500 rounded-2xl shadow-xl">
4
+ <i data-lucide="shield" class="w-8 h-8"></i>
5
+ </div>
6
+ <h1 class="text-4xl font-extrabold tracking-tight">Kode Etik <span class="text-indigo-300">Kontributor</span></h1>
7
+ </div>
8
+
9
+ <div class="prose prose-invert max-w-none space-y-6 text-white/80 leading-relaxed">
10
+ <section>
11
+ <h2 class="text-2xl font-bold text-white mb-4 border-b border-white/10 pb-2">Komitmen Kami</h2>
12
+ <p>Untuk menumbuhkan lingkungan yang terbuka dan ramah, kami sebagai kontributor dan pengelola berkomitmen untuk membuat partisipasi dalam proyek kami dan komunitas kami menjadi pengalaman yang bebas dari pelecehan bagi semua orang, tanpa memandang usia, ukuran tubuh, disabilitas, etnis, karakteristik seks, identitas dan ekspresi gender, tingkat pengalaman, pendidikan, status sosial ekonomi, kebangsaan, penampilan pribadi, ras, agama, atau identitas dan orientasi seksual.</p>
13
+ </section>
14
+
15
+ <section>
16
+ <h2 class="text-2xl font-bold text-white mb-4 border-b border-white/10 pb-2">Standar Kami</h2>
17
+ <p>Contoh perilaku yang berkontribusi pada penciptaan lingkungan yang positif meliputi:</p>
18
+ <ul class="list-disc list-inside space-y-2 ml-4">
19
+ <li>Menggunakan bahasa yang ramah dan inklusif</li>
20
+ <li>Menghargai perbedaan sudut pandang dan pengalaman</li>
21
+ <li>Menerima kritik yang membangun dengan lapang dada</li>
22
+ <li>Fokus pada apa yang terbaik bagi komunitas</li>
23
+ <li>Menunjukkan empati terhadap anggota komunitas lainnya</li>
24
+ </ul>
25
+ </section>
26
+
27
+ <section>
28
+ <h2 class="text-2xl font-bold text-white mb-4 border-b border-white/10 pb-2">Perilaku Tidak Pantas</h2>
29
+ <p>Contoh perilaku yang tidak dapat diterima meliputi:</p>
30
+ <ul class="list-disc list-inside space-y-2 ml-4 text-rose-300">
31
+ <li>Pelecehan publik atau pribadi</li>
32
+ <li>Komentar menghina/meremehkan, serta serangan pribadi</li>
33
+ <li>Penggunaan bahasa atau citra seksual yang tidak diinginkan</li>
34
+ <li>Memublikasikan informasi pribadi orang lain tanpa izin</li>
35
+ </ul>
36
+ </section>
37
+
38
+ <section>
39
+ <h2 class="text-2xl font-bold text-white mb-4 border-b border-white/10 pb-2">Penegakan</h2>
40
+ <p>Instance perilaku yang kasar atau melecehkan dapat dilaporkan dengan menghubungi tim proyek. Semua keluhan akan diselidiki secara rahasia.</p>
41
+ </section>
42
+ </div>
43
+
44
+ <div class="mt-12 pt-8 border-t border-white/10 flex justify-between items-center">
45
+ <a href="/" class="flex items-center gap-2 text-indigo-300 hover:text-white transition font-bold">
46
+ <i data-lucide="arrow-left" class="w-4 h-4"></i> Kembali ke Home
47
+ </a>
48
+ <span class="text-xs opacity-40 italic">Adapted from Contributor Covenant v1.4</span>
49
+ </div>
50
+ </div>
51
+
52
+ <script>lucide.createIcons();</script>
@@ -6,16 +6,16 @@
6
6
  </div>
7
7
  <h1 class="text-4xl font-extrabold tracking-tight">Dokumentasi <span class="text-indigo-300">Eksa</span></h1>
8
8
  </div>
9
- <p class="text-white/60 text-lg">Panduan profesional instalasi dan pengembangan aplikasi menggunakan Eksa Framework v3.5.0.</p>
9
+ <p class="text-white/60 text-lg">Panduan profesional instalasi dan pengembangan aplikasi menggunakan Eksa Framework v3.5.3.</p>
10
10
  </div>
11
11
 
12
12
  <div class="grid grid-cols-1 md:grid-cols-3 gap-8 mb-12">
13
13
  <div class="space-y-4">
14
14
  <h3 class="font-bold text-indigo-300 uppercase text-xs tracking-widest">Memulai</h3>
15
15
  <ul class="space-y-2 text-sm">
16
- <li><a href="#instalasi" class="hover:text-indigo-300 transition flex items-center gap-2"><i data-lucide="download" class="w-3 h-3"></i> Instalasi Gem</a></li>
16
+ <li><a href="#instalasi" class="hover:text-indigo-300 transition flex items-center gap-2"><i data-lucide="download" class="w-3 h-3"></i> Instalasi & Run</a></li>
17
+ <li><a href="#struktur" class="hover:text-indigo-300 transition flex items-center gap-2"><i data-lucide="folder-tree" class="w-3 h-3"></i> Struktur Project</a></li>
17
18
  <li><a href="#keamanan" class="hover:text-indigo-300 transition flex items-center gap-2"><i data-lucide="shield" class="w-3 h-3"></i> Setup Keamanan</a></li>
18
- <li><a href="#struktur" class="hover:text-indigo-300 transition flex items-center gap-2"><i data-lucide="folder" class="w-3 h-3"></i> Struktur Project</a></li>
19
19
  </ul>
20
20
  </div>
21
21
  <div class="space-y-4">
@@ -38,7 +38,7 @@
38
38
 
39
39
  <section id="instalasi" class="mb-12 scroll-mt-24">
40
40
  <h2 class="text-2xl font-bold mb-4 flex items-center gap-2">
41
- <i data-lucide="terminal" class="w-6 h-6 text-indigo-400"></i> Instalasi Cepat
41
+ <i data-lucide="terminal" class="w-6 h-6 text-indigo-400"></i> Instalasi & Eksekusi
42
42
  </h2>
43
43
  <div class="bg-black/40 rounded-2xl p-6 font-mono text-sm border border-white/10 space-y-3">
44
44
  <div>
@@ -56,11 +56,44 @@
56
56
  </div>
57
57
  </section>
58
58
 
59
+ <section id="struktur" class="mb-12 scroll-mt-24">
60
+ <h2 class="text-2xl font-bold mb-4 flex items-center gap-2">
61
+ <i data-lucide="folder-tree" class="w-6 h-6 text-indigo-400"></i> Struktur Project
62
+ </h2>
63
+ <p class="text-white/60 mb-4 text-sm">Eksa mengikuti konvensi MVC yang sederhana namun powerful.</p>
64
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
65
+ <div class="bg-white/5 p-4 rounded-xl border border-white/10">
66
+ <code class="text-indigo-300 font-bold">app/</code>
67
+ <p class="text-xs text-white/50 mt-1">Folders: <code class="text-white">controllers/</code>, <code class="text-white">models/</code>, <code class="text-white">views/</code>.</p>
68
+ </div>
69
+ <div class="bg-white/5 p-4 rounded-xl border border-white/10">
70
+ <code class="text-indigo-300 font-bold">_posts/</code>
71
+ <p class="text-xs text-white/50 mt-1">Pusat konten blog berbasis Markdown (.md).</p>
72
+ </div>
73
+ <div class="bg-white/5 p-4 rounded-xl border border-white/10">
74
+ <code class="text-indigo-300 font-bold">public/</code>
75
+ <p class="text-xs text-white/50 mt-1">Asset statis: <code class="text-white">css/</code>, <code class="text-white">img/</code>, <code class="text-white">js/</code>.</p>
76
+ </div>
77
+ <div class="bg-white/5 p-4 rounded-xl border border-white/10">
78
+ <code class="text-indigo-300 font-bold">db/</code>
79
+ <p class="text-xs text-white/50 mt-1">Penyimpanan <code class="text-white">eksa_app.db</code> (SQLite) dan skrip inisialisasi.</p>
80
+ </div>
81
+ <div class="bg-white/5 p-4 rounded-xl border border-white/10">
82
+ <code class="text-indigo-300 font-bold">config.ru</code>
83
+ <p class="text-xs text-white/50 mt-1">Konfigurasi Rack, Middleware, dan Routing utama.</p>
84
+ </div>
85
+ <div class="bg-white/5 p-4 rounded-xl border border-white/10">
86
+ <code class="text-indigo-300 font-bold">.env</code>
87
+ <p class="text-xs text-white/50 mt-1">Variabel lingkungan untuk kredensial database & secret key.</p>
88
+ </div>
89
+ </div>
90
+ </section>
91
+
59
92
  <section id="keamanan" class="mb-12 scroll-mt-24">
60
93
  <h2 class="text-2xl font-bold mb-4 flex items-center gap-2">
61
94
  <i data-lucide="shield-check" class="w-6 h-6 text-indigo-400"></i> Setup Keamanan (.env)
62
95
  </h2>
63
- <p class="text-white/60 mb-4 text-sm">Gunakan file <code class="text-indigo-200">.env</code> untuk menyimpan kredensial sensitif seperti URI MongoDB Atlas dan Secret Session.</p>
96
+ <p class="text-white/60 mb-4 text-sm">Gunakan file <code class="text-indigo-200">.env</code> untuk menyimpan kredensial sensitif.</p>
64
97
  <div class="bg-black/40 rounded-2xl p-6 font-mono text-sm border border-white/10 space-y-2">
65
98
  <p class="text-white/30"># Salin template example</p>
66
99
  <p class="text-indigo-300">cp .env.example .env</p>
@@ -69,6 +102,23 @@
69
102
  </div>
70
103
  </section>
71
104
 
105
+ <section id="routing" class="mb-12 scroll-mt-24">
106
+ <h2 class="text-2xl font-bold mb-4 flex items-center gap-2">
107
+ <i data-lucide="git-branch" class="w-6 h-6 text-indigo-400"></i> Routing System
108
+ </h2>
109
+ <p class="text-white/60 mb-4 text-sm">Definisikan endpoint aplikasi Anda di <code class="text-indigo-200">config.ru</code>. Eksa mendukung parameter dinamis.</p>
110
+ <div class="bg-black/40 rounded-2xl p-6 font-mono text-sm border border-white/10 space-y-4">
111
+ <div>
112
+ <p class="text-white/30"># Struktur: add_route(path, controller, action)</p>
113
+ <p class="text-indigo-300 italic">app.add_route "/", PagesController, :index</p>
114
+ <p class="text-indigo-300 italic">app.add_route "/blog/:slug", BlogController, :show</p>
115
+ </div>
116
+ <div class="p-3 bg-white/5 rounded-lg border border-white/10">
117
+ <p class="text-xs text-white/50 italic">Eksa akan otomatis memetakan <code class="text-white">:slug</code> menjadi <code class="text-white">params['slug']</code> di dalam controller.</p>
118
+ </div>
119
+ </div>
120
+ </section>
121
+
72
122
  <section id="database" class="mb-12 scroll-mt-24">
73
123
  <h2 class="text-2xl font-bold mb-4 flex items-center gap-2">
74
124
  <i data-lucide="database" class="w-6 h-6 text-indigo-400"></i> Agnostic Database Engine
@@ -90,14 +140,14 @@
90
140
  <h2 class="text-2xl font-bold mb-4 flex items-center gap-2">
91
141
  <i data-lucide="zap" class="w-6 h-6 text-indigo-400"></i> Just-In-Time Schema Initialization
92
142
  </h2>
93
- <p class="text-white/60 mb-4 text-sm">Anda tidak perlu lagi menjalankan migrasi manual. Eksa akan mendeteksi dan membuat tabel/koleksi secara otomatis tepat saat model pertama kali diakses.</p>
143
+ <p class="text-white/60 mb-4 text-sm">Eksa mendeteksi dan membuat tabel/koleksi secara otomatis tepat saat model pertama kali diakses (JIT).</p>
94
144
  <div class="bg-black/40 rounded-2xl p-6 font-mono text-sm border border-white/10">
95
- <p class="text-white/30"># Definisikan saja di model</p>
96
- <p class="text-indigo-300">class Post < Eksa::Model</p>
145
+ <p class="text-white/30"># Contoh di Model</p>
146
+ <p class="text-indigo-300">class Message < Eksa::Model</p>
97
147
  <p class="text-indigo-300 italic ml-4">def self.setup_schema</p>
98
- <p class="text-indigo-300 italic ml-8">db.execute "CREATE TABLE IF NOT EXISTS ..."</p>
148
+ <p class="text-indigo-300 italic ml-8">db.execute "CREATE TABLE IF NOT EXISTS messages..."</p>
99
149
  <p class="text-indigo-300 italic ml-4">end</p>
100
- <p class="text-indigo-300">main</p>
150
+ <p class="text-indigo-300">end</p>
101
151
  </div>
102
152
  </section>
103
153
 
@@ -128,12 +178,12 @@
128
178
 
129
179
  <section id="seo" class="mb-12 scroll-mt-24">
130
180
  <h2 class="text-2xl font-bold mb-4 flex items-center gap-2">
131
- <i data-lucide="search" class="w-6 h-6 text-indigo-400"></i> SEO & JSON-LD (Structured Data)
181
+ <i data-lucide="search" class="w-6 h-6 text-indigo-400"></i> SEO & JSON-LD
132
182
  </h2>
133
- <p class="text-white/60 mb-4 text-sm">Eksa v3.5.0 secara otomatis menyematkan data terstruktur untuk ranking pencarian yang lebih baik.</p>
183
+ <p class="text-white/60 mb-4 text-sm">Eksa v3.5.3 menyematkan data terstruktur secara otomatis untuk ranking pencarian yang lebih baik.</p>
134
184
  <div class="bg-white/5 p-4 rounded-xl border border-white/10 flex items-center gap-3">
135
185
  <i data-lucide="check-circle-2" class="w-5 h-5 text-emerald-400"></i>
136
- <p class="text-xs text-white/70">Mendukung <code class="text-indigo-300">sitemap.xml</code>, <code class="text-indigo-300">robots.txt</code>, dan skema <code class="text-indigo-300">BlogPosting</code> secara dinamis.</p>
186
+ <p class="text-xs text-white/70">Mendukung <code class="text-indigo-300">sitemap.xml</code>, <code class="text-indigo-300">robots.txt</code> secara dinamis.</p>
137
187
  </div>
138
188
  </section>
139
189
 
@@ -142,7 +192,7 @@
142
192
  <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>
143
193
  <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">Production Ready</span>
144
194
  </div>
145
- <p class="text-white/40 text-sm italic">Eksa Framework v3.5.0 Professional Documentation</p>
195
+ <p class="text-white/40 text-sm italic">Eksa Framework v3.5.3 Professional Documentation</p>
146
196
  <a href="/" class="inline-block mt-6 text-indigo-300 hover:text-white transition font-bold flex items-center justify-center gap-2">
147
197
  <i data-lucide="arrow-left" class="w-4 h-4"></i> Kembali ke Beranda
148
198
  </a>
@@ -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.5.0 Alpha
5
+ v3.5.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>!
@@ -194,14 +194,57 @@
194
194
 
195
195
  <div class="flex items-center gap-4">
196
196
  <a href="https://github.com/IshikawaUta" target="_blank" class="p-2 hover:bg-white/10 rounded-full transition"><i data-lucide="github" class="w-5 h-5"></i></a>
197
+ <!-- Mobile Menu Button -->
198
+ <button onclick="toggleMobileMenu()" class="md:hidden p-2 hover:bg-white/10 rounded-full transition relative z-50">
199
+ <i data-lucide="menu" id="menu-icon" class="w-6 h-6"></i>
200
+ </button>
197
201
  </div>
198
202
  </nav>
199
203
 
204
+ <!-- Mobile Menu Overlay -->
205
+ <div id="mobile-menu" class="fixed inset-0 z-[60] glass hidden animate__animated">
206
+ <div class="flex flex-col h-full p-8">
207
+ <div class="flex items-center justify-between mb-12">
208
+ <div class="flex items-center gap-3">
209
+ <div class="p-2 bg-indigo-500 rounded-xl shadow-lg shadow-indigo-500/50">
210
+ <i data-lucide="layers" class="w-6 h-6"></i>
211
+ </div>
212
+ <span class="text-xl font-extrabold tracking-tight">Eksa<span class="text-indigo-300">Framework</span></span>
213
+ </div>
214
+ <button onclick="toggleMobileMenu()" class="p-2 hover:bg-white/10 rounded-full transition">
215
+ <i data-lucide="x" class="w-6 h-6 text-white"></i>
216
+ </button>
217
+ </div>
218
+
219
+ <ul class="flex flex-col gap-6 text-2xl font-bold">
220
+ <li><a href="/" class="flex items-center gap-4 hover:text-indigo-300 transition" onclick="toggleMobileMenu()"><i data-lucide="home" class="w-8 h-8"></i> Home</a></li>
221
+ <li><a href="/about" class="flex items-center gap-4 hover:text-indigo-300 transition" onclick="toggleMobileMenu()"><i data-lucide="info" class="w-8 h-8"></i> About</a></li>
222
+ <li><a href="/docs" class="flex items-center gap-4 hover:text-indigo-300 transition" onclick="toggleMobileMenu()"><i data-lucide="book-open" class="w-8 h-8"></i> Docs</a></li>
223
+ <li><a href="/posts" class="flex items-center gap-4 hover:text-indigo-300 transition" onclick="toggleMobileMenu()"><i data-lucide="book" class="w-8 h-8"></i> Blog</a></li>
224
+ <li><a href="/kontak" class="flex items-center gap-4 hover:text-indigo-300 transition" onclick="toggleMobileMenu()"><i data-lucide="message-circle" class="w-8 h-8"></i> Contact</a></li>
225
+ </ul>
226
+
227
+ <div class="mt-auto pt-8 border-t border-white/10 flex flex-col gap-4">
228
+ <div class="flex justify-center gap-8">
229
+ <a href="/conduct" class="text-sm hover:text-white transition">Kode Etik</a>
230
+ <a href="/security" class="text-sm hover:text-white transition">Keamanan</a>
231
+ </div>
232
+ <div class="text-center opacity-40 text-xs">
233
+ Handcrafted with Ruby by IshikawaUta
234
+ </div>
235
+ </div>
236
+ </div>
237
+ </div>
238
+
200
239
  <main class="max-w-6xl mx-auto py-12 px-6 flex-grow animate__animated animate__fadeInUp">
201
240
  <%= @content %>
202
241
  </main>
203
242
 
204
243
  <footer class="py-8 text-center text-white/40 text-sm border-t border-white/5">
244
+ <div class="flex justify-center gap-6 mb-4">
245
+ <a href="/conduct" class="hover:text-white transition">Kode Etik</a>
246
+ <a href="/security" class="hover:text-white transition">Keamanan</a>
247
+ </div>
205
248
  <p>&copy; <%= Time.now.year %> <span class="font-bold text-white/60">Eksa Framework</span>. Crafted for speed.</p>
206
249
  </footer>
207
250
 
@@ -211,6 +254,26 @@
211
254
  // Inisialisasi ikon Lucide
212
255
  lucide.createIcons();
213
256
 
257
+ // Mobile Menu Toggle
258
+ function toggleMobileMenu() {
259
+ const menu = document.getElementById('mobile-menu');
260
+ const body = document.body;
261
+
262
+ if (menu.classList.contains('hidden')) {
263
+ menu.classList.remove('hidden');
264
+ menu.classList.remove('animate__fadeOutRight');
265
+ menu.classList.add('animate__fadeInRight');
266
+ body.style.overflow = 'hidden'; // Prevent scrolling
267
+ } else {
268
+ menu.classList.remove('animate__fadeInRight');
269
+ menu.classList.add('animate__fadeOutRight');
270
+ body.style.overflow = ''; // Restore scrolling
271
+ setTimeout(() => {
272
+ menu.classList.add('hidden');
273
+ }, 500);
274
+ }
275
+ }
276
+
214
277
  // Setup Copy Buttons for Code Blocks
215
278
  document.querySelectorAll('pre').forEach((block) => {
216
279
  // Wrap pre in a container
@@ -0,0 +1,75 @@
1
+ <div class="glass rounded-3xl p-10 text-white animate__animated animate__fadeIn">
2
+ <div class="flex items-center gap-4 mb-8">
3
+ <div class="p-4 bg-emerald-500 rounded-2xl shadow-xl">
4
+ <i data-lucide="lock" class="w-8 h-8"></i>
5
+ </div>
6
+ <h1 class="text-4xl font-extrabold tracking-tight">Kebijakan <span class="text-emerald-300">Keamanan</span></h1>
7
+ </div>
8
+
9
+ <div class="prose prose-invert max-w-none space-y-8 text-white/80 leading-relaxed">
10
+ <section>
11
+ <h2 class="text-2xl font-bold text-white mb-4 border-b border-white/10 pb-2">Versi yang Didukung</h2>
12
+ <p>Kami menyarankan penggunaan versi terbaru untuk mendapatkan perbaikan keamanan terbaik.</p>
13
+ <div class="overflow-hidden rounded-xl border border-white/10 bg-white/5 mt-4">
14
+ <table class="w-full text-left">
15
+ <thead class="bg-white/10 border-white/10 text-white">
16
+ <tr>
17
+ <th class="px-6 py-3 font-semibold">Versi</th>
18
+ <th class="px-6 py-3 font-semibold">Status Dukungan</th>
19
+ </tr>
20
+ </thead>
21
+ <tbody class="divide-y divide-white/10">
22
+ <tr class="border-white/10">
23
+ <td class="px-6 py-4">3.5.x</td>
24
+ <td class="px-6 py-4 text-emerald-300 font-bold">✅ Didukung (Aktif)</td>
25
+ </tr>
26
+ <tr class="opacity-50">
27
+ <td class="px-6 py-4">< 3.5</td>
28
+ <td class="px-6 py-4 text-rose-300">❌ Tidak Didukung</td>
29
+ </tr>
30
+ </tbody>
31
+ </table>
32
+ </div>
33
+ </section>
34
+
35
+ <section class="bg-indigo-500/10 border border-indigo-500/20 p-6 rounded-2xl">
36
+ <h2 class="text-2xl font-bold text-white mb-4 flex items-center gap-3">
37
+ <i data-lucide="alert-triangle" class="text-indigo-300"></i>
38
+ Melaporkan Kerentanan
39
+ </h2>
40
+ <p>Jika Anda menemukan masalah keamanan, harap <strong>JANGAN</strong> membuat isu publik. Laporkan secara privat melalui email:</p>
41
+ <p class="mt-4 text-center">
42
+ <a href="mailto:komikers09@gmail.com" class="inline-block no-underline bg-indigo-600 hover:bg-indigo-700 text-white px-8 py-3 rounded-xl font-bold transition shadow-lg">
43
+ security@eksa-framework.dev
44
+ </a>
45
+ </p>
46
+ </section>
47
+
48
+ <section>
49
+ <h2 class="text-2xl font-bold text-white mb-4 border-b border-white/10 pb-2">Proses Respons</h2>
50
+ <ul class="space-y-4">
51
+ <li class="flex gap-4">
52
+ <span class="flex-shrink-0 w-8 h-8 bg-white/10 rounded-full flex items-center justify-center font-bold">1</span>
53
+ <p>Konfirmasi penerimaan laporan dalam 48 jam.</p>
54
+ </li>
55
+ <li class="flex gap-4">
56
+ <span class="flex-shrink-0 w-8 h-8 bg-white/10 rounded-full flex items-center justify-center font-bold">2</span>
57
+ <p>Validasi dan pengerjaan perbaikan secara tertutup.</p>
58
+ </li>
59
+ <li class="flex gap-4">
60
+ <span class="flex-shrink-0 w-8 h-8 bg-white/10 rounded-full flex items-center justify-center font-bold">3</span>
61
+ <p>Pembaruan berkala kepada pelapor mengenai progres.</p>
62
+ </li>
63
+ </ul>
64
+ </section>
65
+ </div>
66
+
67
+ <div class="mt-12 pt-8 border-t border-white/10 flex justify-between items-center">
68
+ <a href="/" class="flex items-center gap-2 text-indigo-300 hover:text-white transition font-bold">
69
+ <i data-lucide="arrow-left" class="w-4 h-4"></i> Kembali ke Home
70
+ </a>
71
+ <span class="text-xs opacity-40 italic">We take security seriously.</span>
72
+ </div>
73
+ </div>
74
+
75
+ <script>lucide.createIcons();</script>
data/config.ru CHANGED
@@ -15,6 +15,8 @@ app.add_route "/edit", PagesController, :edit
15
15
  app.add_route "/about", PagesController, :about
16
16
  app.add_route "/docs", PagesController, :docs
17
17
  app.add_route "/kontak", PagesController, :kontak
18
+ app.add_route "/conduct", PagesController, :conduct
19
+ app.add_route "/security", PagesController, :security
18
20
  app.add_route "/robots.txt", SeoController, :robots
19
21
  app.add_route "/sitemap.xml", SeoController, :sitemap
20
22
  app.add_route "/posts", PostsController, :index
data/db/eksa_app.db CHANGED
Binary file
data/exe/eksa CHANGED
@@ -302,7 +302,22 @@ end
302
302
 
303
303
  def start_server
304
304
  if File.exist?('config.ru')
305
+ puts "\e[1;34m"
306
+ puts " ______ _ __ _____ _____ "
307
+ puts "| ____| |/ // ____|/ ____|"
308
+ puts "| |__ | ' /| (___ | (___ "
309
+ puts "| __| | < \\___ \\ \\___ \\ "
310
+ puts "| |____| . \\ ____) |____) |"
311
+ puts "|______|_|\\_\\_____/|_____/ "
312
+ puts "\e[0m"
313
+ puts "✨ Eksa Framework ✨"
314
+ puts "-----------------------------"
305
315
  puts "🚀 Memulai Eksa Framework Server..."
316
+ puts "📂 Project: #{Dir.pwd}"
317
+ puts "🌐 Listening on http://127.0.0.1:9292"
318
+ puts "📄 Environment: development"
319
+ puts "-----------------------------"
320
+
306
321
  exec "rackup config.ru"
307
322
  else
308
323
  puts "❌ Error: config.ru tidak ditemukan. Pastikan Anda berada di root project Eksa."
data/lib/eksa/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Eksa
2
- VERSION = "3.5.1"
2
+ VERSION = "3.5.3"
3
3
  end
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require_relative 'spec_helper'
2
2
 
3
3
  describe Eksa::Application do
4
4
  let(:app) do
@@ -1,8 +1,8 @@
1
- require 'spec_helper'
1
+ require_relative 'spec_helper'
2
2
  require 'fileutils'
3
3
 
4
4
  describe Eksa::MarkdownPost do
5
- before(:all) do
5
+ before do
6
6
  FileUtils.mkdir_p("_posts")
7
7
  File.write("_posts/2026-03-15-test-post.md", <<~MARKDOWN)
8
8
  ---
@@ -14,7 +14,7 @@ describe Eksa::MarkdownPost do
14
14
  MARKDOWN
15
15
  end
16
16
 
17
- after(:all) do
17
+ after do
18
18
  File.delete("_posts/2026-03-15-test-post.md") if File.exist?("_posts/2026-03-15-test-post.md")
19
19
  end
20
20
 
data/spec/model_spec.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require_relative 'spec_helper'
2
2
 
3
3
  class RecurrentModel < Eksa::Model
4
4
  def self.setup_schema
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'rack/test'
2
- require 'rspec'
3
2
 
4
3
  # Load the framework
5
4
  require_relative '../lib/eksa'
@@ -7,16 +6,35 @@ require_relative '../lib/eksa'
7
6
  # Set environment to test
8
7
  ENV['RACK_ENV'] = 'test'
9
8
 
10
- RSpec.configure do |config|
11
- config.include Rack::Test::Methods
9
+ # EksaMination uses Object.new for its example context.
10
+ # We include Rack::Test::Methods into Object so it's available in all tests.
11
+ Object.include Rack::Test::Methods
12
12
 
13
- config.expect_with :rspec do |expectations|
14
- expectations.include_chain_clauses_in_custom_matcher_descriptions = true
13
+ # Monkeypatch EksaMination to fix a TypeError in Formatters::Documentation
14
+ # It currently fails when a description is a Class/Module (not a String)
15
+ require 'eksa-mination'
16
+ module EksaMination
17
+ class ExampleGroup
18
+ alias_method :original_description, :description
19
+ def description
20
+ original_description.to_s
21
+ end
15
22
  end
16
23
 
17
- config.mock_with :rspec do |mocks|
18
- mocks.verify_partial_doubles = true
24
+ class Example
25
+ alias_method :original_description, :description
26
+ def description
27
+ original_description.to_s
28
+ end
19
29
  end
20
30
 
21
- config.shared_context_metadata_behavior = :apply_to_host_groups
31
+ module Formatters
32
+ class Documentation
33
+ def report_failure(example, error)
34
+ super
35
+ # Ensure failure message handles classes/modules too
36
+ puts " " * @level + colorize(example.description.to_s + " (FAILED)", :red)
37
+ end
38
+ end
39
+ end
22
40
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eksa-framework
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.1
4
+ version: 3.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - IshikawaUta
@@ -163,6 +163,20 @@ dependencies:
163
163
  - - "~>"
164
164
  - !ruby/object:Gem::Version
165
165
  version: '3.1'
166
+ - !ruby/object:Gem::Dependency
167
+ name: eksa-mination
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '2.0'
173
+ type: :runtime
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '2.0'
166
180
  description: Framework MVC ringan dengan tema modern, sistem routing, dan dukungan
167
181
  multi-database (SQLite & MongoDB).
168
182
  email:
@@ -174,16 +188,20 @@ extra_rdoc_files: []
174
188
  files:
175
189
  - ".eksa.json"
176
190
  - ".env.example"
191
+ - CODE_OF_CONDUCT.md
192
+ - CONTRIBUTING.md
177
193
  - Gemfile
178
194
  - Gemfile.lock
179
195
  - LICENSE
180
196
  - README.md
197
+ - SECURITY.md
181
198
  - _posts/2026-03-15-welcome-to-eksa-framework.md
182
199
  - app/controllers/pages_controller.rb
183
200
  - app/controllers/posts_controller.rb
184
201
  - app/controllers/seo_controller.rb
185
202
  - app/models/pesan.rb
186
203
  - app/views/about.html.erb
204
+ - app/views/conduct.html.erb
187
205
  - app/views/docs.html.erb
188
206
  - app/views/edit.html.erb
189
207
  - app/views/index.html.erb
@@ -191,6 +209,7 @@ files:
191
209
  - app/views/layout.html.erb
192
210
  - app/views/posts/index.html.erb
193
211
  - app/views/posts/show.html.erb
212
+ - app/views/security.html.erb
194
213
  - config.ru
195
214
  - db/eksa_app.db
196
215
  - db/setup.rb