faker_maker 4.0.0.beta1 → 4.0.0
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/.github/workflows/ruby.yml +1 -1
- data/.rubocop.yml +1 -1
- data/Gemfile +1 -1
- data/MIGRATION_NOTES.md +47 -0
- data/TODO.md +16 -0
- data/faker_maker.gemspec +1 -1
- data/hack/nested.rb +21 -0
- data/lib/faker_maker/base.rb +2 -2
- data/lib/faker_maker/definition_proxy.rb +2 -2
- data/lib/faker_maker/factory.rb +6 -4
- data/lib/faker_maker/version.rb +1 -1
- data/usefakermaker.com.site/.gitignore +2 -0
- data/usefakermaker.com.site/site/assets/favicons/android-chrome-192x192.png +0 -0
- data/usefakermaker.com.site/site/assets/favicons/android-chrome-512x512.png +0 -0
- data/usefakermaker.com.site/site/assets/favicons/apple-touch-icon.png +0 -0
- data/usefakermaker.com.site/site/assets/favicons/favicon-16x16.png +0 -0
- data/usefakermaker.com.site/site/assets/favicons/favicon-32x32.png +0 -0
- data/usefakermaker.com.site/site/assets/favicons/favicon.ico +0 -0
- data/usefakermaker.com.site/site/assets/favicons/site.webmanifest +19 -0
- data/usefakermaker.com.site/site/assets/robots.txt +2 -0
- data/usefakermaker.com.site/site/assets/styles.css +351 -0
- data/{usefakermaker.com/docs/contributing/index.md → usefakermaker.com.site/site/src/docs/contributing/index.page.md} +1 -5
- data/{usefakermaker.com/docs/installing/index.md → usefakermaker.com.site/site/src/docs/installing/index.page.md} +1 -5
- data/{usefakermaker.com/docs/usage/arrays/index.md → usefakermaker.com.site/site/src/docs/usage/arrays/index.page.md} +1 -4
- data/{usefakermaker.com/docs/usage/building-instances/index.md → usefakermaker.com.site/site/src/docs/usage/building-instances/index.page.md} +1 -4
- data/{usefakermaker.com/docs/usage/chaos/index.md → usefakermaker.com.site/site/src/docs/usage/chaos/index.page.md} +1 -4
- data/{usefakermaker.com/docs/usage/destroying-factories/index.md → usefakermaker.com.site/site/src/docs/usage/destroying-factories/index.page.md} +1 -4
- data/{usefakermaker.com/docs/usage/embedding-factories/index.md → usefakermaker.com.site/site/src/docs/usage/embedding-factories/index.page.md} +1 -4
- data/{usefakermaker.com/docs/usage/getting-started/index.md → usefakermaker.com.site/site/src/docs/usage/getting-started/index.page.md} +1 -4
- data/{usefakermaker.com/docs/usage/history-logging/index.md → usefakermaker.com.site/site/src/docs/usage/history-logging/index.page.md} +1 -6
- data/{usefakermaker.com/docs/usage/inheritance/index.md → usefakermaker.com.site/site/src/docs/usage/inheritance/index.page.md} +1 -4
- data/{usefakermaker.com/docs/usage/json-field-names/index.md → usefakermaker.com.site/site/src/docs/usage/json-field-names/index.page.md} +1 -4
- data/{usefakermaker.com/docs/usage/lifecycle-hooks/index.md → usefakermaker.com.site/site/src/docs/usage/lifecycle-hooks/index.page.md} +1 -4
- data/{usefakermaker.com/docs/usage/managing-dependencies/index.md → usefakermaker.com.site/site/src/docs/usage/managing-dependencies/index.page.md} +1 -4
- data/{usefakermaker.com/docs/usage/omitting-fields/index.md → usefakermaker.com.site/site/src/docs/usage/omitting-fields/index.page.md} +1 -4
- data/{usefakermaker.com/pages/index.markdown → usefakermaker.com.site/site/src/index.page.md} +9 -19
- data/usefakermaker.com.site/site/templates/_nav.html.erb +27 -0
- data/usefakermaker.com.site/site/templates/layout.html.erb +46 -0
- data/usefakermaker.com.site/site/templates/page.html.erb +3 -0
- metadata +38 -51
- data/usefakermaker.com/.gitignore +0 -5
- data/usefakermaker.com/404.html +0 -25
- data/usefakermaker.com/Gemfile +0 -39
- data/usefakermaker.com/README.md +0 -5
- data/usefakermaker.com/_config.yml +0 -299
- data/usefakermaker.com/_config.yml.orig +0 -55
- data/usefakermaker.com/_data/navigation.yml +0 -51
- data/usefakermaker.com/_data/ui-text.yml +0 -2132
- data/usefakermaker.com/_site/assets/css/main.css +0 -6
- data/usefakermaker.com/_site/assets/css/main.css.map +0 -1
- data/usefakermaker.com/_site/assets/js/_main.js +0 -230
- data/usefakermaker.com/_site/assets/js/lunr/lunr-en.js +0 -69
- data/usefakermaker.com/_site/assets/js/lunr/lunr-gr.js +0 -522
- data/usefakermaker.com/_site/assets/js/lunr/lunr-store.js +0 -1
- data/usefakermaker.com/_site/assets/js/lunr/lunr.js +0 -3475
- data/usefakermaker.com/_site/assets/js/lunr/lunr.min.js +0 -6
- data/usefakermaker.com/_site/assets/js/main.min.js +0 -7
- data/usefakermaker.com/_site/assets/js/main.min.js.map +0 -1
- data/usefakermaker.com/_site/assets/js/plugins/gumshoe.js +0 -484
- data/usefakermaker.com/_site/assets/js/plugins/jquery.ba-throttle-debounce.js +0 -252
- data/usefakermaker.com/_site/assets/js/plugins/jquery.fitvids.js +0 -82
- data/usefakermaker.com/_site/assets/js/plugins/jquery.greedy-navigation.js +0 -128
- data/usefakermaker.com/_site/assets/js/plugins/jquery.magnific-popup.js +0 -1860
- data/usefakermaker.com/_site/assets/js/plugins/smooth-scroll.js +0 -650
- data/usefakermaker.com/_site/assets/js/vendor/jquery/jquery-3.6.0.js +0 -10881
- data/usefakermaker.com/_site/feed.xml +0 -1
- data/usefakermaker.com/_site/robots.txt +0 -1
- data/usefakermaker.com/_site/sitemap.xml +0 -3
- data/usefakermaker.com/about.markdown +0 -18
- /data/{usefakermaker.com → usefakermaker.com.site/site}/assets/images/pug.png +0 -0
- /data/{usefakermaker.com → usefakermaker.com.site/site}/assets/images/unipug.svg +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4f341f27ec954b732dde7141c9ad532346c09dadbbed4ea469894b10cac652f8
|
|
4
|
+
data.tar.gz: 61919d74b140d82fba2750bcf0e1c25473ebe21e02a2b213bd1109d94f22d9e2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: de3ae09ed6b848612d3fc23533d04f4633eaa4be42f7f7be9fc3f3938f8b86afa2a495f6928a66f38207d63233e2b37ce88897178688a4f3aa2c6c5f524b51e4
|
|
7
|
+
data.tar.gz: cdc3c4509819316bc389d2bf1857883ddfa62b14b93a8f794a043af70bd603dec46f7e0a0c37d29d8814ff447ac2762cd3d56a92fc917338bc3458b4113263c9
|
data/.github/workflows/ruby.yml
CHANGED
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
data/MIGRATION_NOTES.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Jekyll to Jackdaw Migration Notes
|
|
2
|
+
|
|
3
|
+
## 1. Project Initialization
|
|
4
|
+
* Run `jackdaw new <project_name>` to generate the standard directory structure:
|
|
5
|
+
* `site/src`: Content
|
|
6
|
+
* `site/templates`: ERB Templates
|
|
7
|
+
* `site/assets`: Static files (images, css, favicons)
|
|
8
|
+
|
|
9
|
+
## 2. Template Conversion
|
|
10
|
+
* **Layouts**: Consolidate Jekyll layouts (default, page, etc.) into `site/templates/layout.html.erb`.
|
|
11
|
+
* Replace `{{ content }}` with `<%= content %>`.
|
|
12
|
+
* Replace `{{ page.title }}` with `<%= title %>`.
|
|
13
|
+
* **Partials**: Convert `{% include file.html %}` to `<%= render 'file' %>`.
|
|
14
|
+
* Rename partial files to start with an underscore (e.g., `_nav.html.erb`).
|
|
15
|
+
* **Assets**:
|
|
16
|
+
* Move CSS/JS/Images to `site/assets/`.
|
|
17
|
+
* **Important**: When referencing in HTML, omit `assets/`.
|
|
18
|
+
* `site/assets/styles.css` -> `<link href="/styles.css">`
|
|
19
|
+
* `site/assets/img/logo.png` -> `<img src="/img/logo.png">`
|
|
20
|
+
|
|
21
|
+
## 3. Content Migration Strategies
|
|
22
|
+
* **File Extensions**:
|
|
23
|
+
* Regular pages: `.md` -> `.page.md`
|
|
24
|
+
* Blog posts: `.md` -> `.blog.md` (Filename must start with `YYYY-MM-DD-`)
|
|
25
|
+
* **Frontmatter Handling**:
|
|
26
|
+
* Jackdaw renders the *first H1* as the page title.
|
|
27
|
+
* **Task**: Strip YAML frontmatter (`--- ... ---`) and ensure the file starts with `# Page Title`.
|
|
28
|
+
* **Directory Structure**:
|
|
29
|
+
* Keep the same folder structure in `site/src` to maintain URLs.
|
|
30
|
+
* **Conflict Warning**: Do not create `topic.page.md` if you also have a folder named `topic/`. Instead, create `topic/index.page.md`.
|
|
31
|
+
|
|
32
|
+
## 4. Automation (Ruby Script)
|
|
33
|
+
For bulk migration of documentation, use a script to:
|
|
34
|
+
1. Iterate through source directories.
|
|
35
|
+
2. Read file content.
|
|
36
|
+
3. specific YAML frontmatter values (Title).
|
|
37
|
+
4. Rewrite file to destination with new header and `.page.md` extension.
|
|
38
|
+
|
|
39
|
+
## 5. Navigation & Indices
|
|
40
|
+
* Jackdaw does not automatically build navigation menus from folder structure.
|
|
41
|
+
* **Manual**: Edit `site/templates/_nav.html.erb`.
|
|
42
|
+
* **Auto-generated Indices**: Write scripts to generate index markdown files (e.g., "List of all Rules") if the content changes frequently.
|
|
43
|
+
|
|
44
|
+
## 6. Styling
|
|
45
|
+
* Jackdaw provides no default styling.
|
|
46
|
+
* Create a robust `styles.css` using CSS Variables for theming.
|
|
47
|
+
* Link fonts and stylesheets in the `<head>` of `layout.html.erb`.
|
data/TODO.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
-- DONE - sorta
|
|
2
|
+
2. get attributes including embedded attr -- THIS WORKS IF USING THE FACTORY PARAMETER, NOT PROC EMBEDDED FACTORIES -- NEED A CHANGE TO OSL FACTORIES
|
|
3
|
+
3. What the hell is going on with @embedded factories -- why is this always nil CHECK -- FOR THE LOVE OF GOD, WRITE DOCUMENTATION FOR THIS
|
|
4
|
+
4. Factory#attribute_names line ~ 110
|
|
5
|
+
|
|
6
|
+
-- TODO
|
|
7
|
+
|
|
8
|
+
1. nested builds using the build method -- this is hidden at the moment, it sets the value of the key to a hash rather than recursively calling the field#field method
|
|
9
|
+
5. FM[:foo].build( attributes: { does_not_exist: 1 }, raise_on_error: false ) # RAISE_ON_ERROR
|
|
10
|
+
5. FM[:foo].build( attributes: { does_not_exist: 1 }, strict: false ) # RAISE_ON_ERROR
|
|
11
|
+
5. FM[:foo].build( attributes: { does_not_exist: 1 }, very_strict: false ) # RAISE_ON_ERROR
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
building embedded factories need to know the build options passed in to the top level build call -- e.g. is chaos on or not
|
|
15
|
+
|
|
16
|
+
check naming strategies still work
|
data/faker_maker.gemspec
CHANGED
|
@@ -43,7 +43,7 @@ Gem::Specification.new do |spec|
|
|
|
43
43
|
|
|
44
44
|
spec.add_dependency 'activesupport', '>= 5.2', '< 9'
|
|
45
45
|
|
|
46
|
-
spec.add_development_dependency 'bundler', '
|
|
46
|
+
spec.add_development_dependency 'bundler', '>= 2'
|
|
47
47
|
spec.add_development_dependency 'faker', '~> 3.2'
|
|
48
48
|
spec.add_development_dependency 'guard', '~> 2.16'
|
|
49
49
|
spec.add_development_dependency 'guard-bundler', '~> 3.0'
|
data/hack/nested.rb
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require 'faker_maker'
|
|
2
|
+
require 'awesome_print'
|
|
3
|
+
|
|
4
|
+
FM.factory :random do
|
|
5
|
+
flavour { 'blue' }
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
FM.factory :item do
|
|
9
|
+
name { 'toothpaste' }
|
|
10
|
+
price { 0.99 }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
FM.factory :coupon do
|
|
14
|
+
discount { 0.10 }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
FM.factory :basket do
|
|
18
|
+
items( factory: %i[item random] )
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# { a: 1, b: { x: 2 } }
|
data/lib/faker_maker/base.rb
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
module FakerMaker
|
|
4
4
|
# Base module for defining the DSL
|
|
5
5
|
module Base
|
|
6
|
-
def factory(name, options = {}, &
|
|
6
|
+
def factory(name, options = {}, &)
|
|
7
7
|
factory = FakerMaker.find_factory(name)
|
|
8
8
|
if factory.nil?
|
|
9
9
|
factory = FakerMaker::Factory.new name, options
|
|
10
10
|
proxy = DefinitionProxy.new factory
|
|
11
|
-
proxy.instance_eval( &
|
|
11
|
+
proxy.instance_eval( & ) if block_given?
|
|
12
12
|
FakerMaker.register_factory factory
|
|
13
13
|
else
|
|
14
14
|
factory
|
|
@@ -13,8 +13,8 @@ module FakerMaker
|
|
|
13
13
|
@factory
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
-
def method_missing(name,
|
|
17
|
-
attribute = FakerMaker::Attribute.new
|
|
16
|
+
def method_missing(name, *, &block)
|
|
17
|
+
attribute = FakerMaker::Attribute.new(name, block, *)
|
|
18
18
|
@factory.attach_attribute attribute
|
|
19
19
|
end
|
|
20
20
|
|
data/lib/faker_maker/factory.rb
CHANGED
|
@@ -155,9 +155,10 @@ module FakerMaker
|
|
|
155
155
|
# @param include_embeddings [Boolean] whether to include attributes from embedded factories (default: true)
|
|
156
156
|
# @return [Array] the collection of attributes, possibly including embedded factory attributes as hashes
|
|
157
157
|
#
|
|
158
|
-
# If the factory has a parent, its attributes are merged in. Attributes without embedded factories are added
|
|
159
|
-
# If `include_embeddings` is true, attributes with embedded factories are added as hashes mapping
|
|
160
|
-
# flattened attributes of its embedded factories. If false, only the attribute itself
|
|
158
|
+
# If the factory has a parent, its attributes are merged in. Attributes without embedded factories are added
|
|
159
|
+
# directly. If `include_embeddings` is true, attributes with embedded factories are added as hashes mapping
|
|
160
|
+
# the attribute to the flattened attributes of its embedded factories. If false, only the attribute itself
|
|
161
|
+
# is added.
|
|
161
162
|
def attributes( collection = [], include_embeddings: true )
|
|
162
163
|
collection |= FakerMaker[parent].attributes( collection ) if parent?
|
|
163
164
|
collection |= @attributes.reject { |attr| attr.embedded_factories.any? }
|
|
@@ -196,7 +197,8 @@ module FakerMaker
|
|
|
196
197
|
#
|
|
197
198
|
# @param instance [Object] The object instance to populate with attribute values.
|
|
198
199
|
# @param attr_override_values [Hash] A hash of attribute names and their override values.
|
|
199
|
-
# @param chaos [Boolean, Integer, nil] If truthy, enables chaos mode which may randomize or select a subset
|
|
200
|
+
# @param chaos [Boolean, Integer, nil] If truthy, enables chaos mode which may randomize or select a subset
|
|
201
|
+
# of attributes.
|
|
200
202
|
# @return [void]
|
|
201
203
|
#
|
|
202
204
|
# If the factory has a parent, its attributes are populated first.
|
data/lib/faker_maker/version.rb
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "FakerMaker",
|
|
3
|
+
"short_name": "FakerMaker",
|
|
4
|
+
"icons": [
|
|
5
|
+
{
|
|
6
|
+
"src": "/favicons/android-chrome-192x192.png",
|
|
7
|
+
"sizes": "192x192",
|
|
8
|
+
"type": "image/png"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"src": "/favicons/android-chrome-512x512.png",
|
|
12
|
+
"sizes": "512x512",
|
|
13
|
+
"type": "image/png"
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"theme_color": "#ffffff",
|
|
17
|
+
"background_color": "#ffffff",
|
|
18
|
+
"display": "standalone"
|
|
19
|
+
}
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--font-sans: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
3
|
+
--font-mono: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
|
|
4
|
+
|
|
5
|
+
--color-bg: #ffffff;
|
|
6
|
+
--color-text: #1a202c;
|
|
7
|
+
--color-primary: #3182ce;
|
|
8
|
+
--color-primary-hover: #2c5282;
|
|
9
|
+
--color-sidebar-bg: #f7fafc;
|
|
10
|
+
--color-border: #e2e8f0;
|
|
11
|
+
--color-code-bg: #edf2f7;
|
|
12
|
+
|
|
13
|
+
--spacing-unit: 1rem;
|
|
14
|
+
--sidebar-width: 280px;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@media (prefers-color-scheme: dark) {
|
|
18
|
+
:root {
|
|
19
|
+
--color-bg: #1a202c;
|
|
20
|
+
--color-text: #e2e8f0;
|
|
21
|
+
--color-primary: #63b3ed;
|
|
22
|
+
--color-primary-hover: #4299e1;
|
|
23
|
+
--color-sidebar-bg: #2d3748;
|
|
24
|
+
--color-border: #4a5568;
|
|
25
|
+
--color-code-bg: #2d3748;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
* {
|
|
30
|
+
box-sizing: border-box;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
body {
|
|
34
|
+
margin: 0;
|
|
35
|
+
font-family: var(--font-sans);
|
|
36
|
+
color: var(--color-text);
|
|
37
|
+
background-color: var(--color-bg);
|
|
38
|
+
line-height: 1.6;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.layout {
|
|
42
|
+
display: flex;
|
|
43
|
+
min-height: 100vh;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.sidebar {
|
|
47
|
+
width: var(--sidebar-width);
|
|
48
|
+
background: var(--color-sidebar-bg);
|
|
49
|
+
border-right: 1px solid var(--color-border);
|
|
50
|
+
padding: 2rem;
|
|
51
|
+
overflow-y: auto;
|
|
52
|
+
position: sticky;
|
|
53
|
+
top: 0;
|
|
54
|
+
height: 100vh;
|
|
55
|
+
flex-shrink: 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.page-container {
|
|
59
|
+
flex: 1;
|
|
60
|
+
display: flex;
|
|
61
|
+
flex-direction: column;
|
|
62
|
+
min-height: 100vh;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.main-content {
|
|
66
|
+
flex: 1;
|
|
67
|
+
padding: 2rem 4rem;
|
|
68
|
+
max-width: 1000px;
|
|
69
|
+
width: 100%;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.site-footer {
|
|
73
|
+
padding: 2rem 4rem;
|
|
74
|
+
border-top: 1px solid var(--color-border);
|
|
75
|
+
margin-top: 4rem;
|
|
76
|
+
display: flex;
|
|
77
|
+
justify-content: space-between;
|
|
78
|
+
align-items: center;
|
|
79
|
+
font-size: 0.9rem;
|
|
80
|
+
color: var(--color-text);
|
|
81
|
+
opacity: 0.7;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.site-footer p {
|
|
85
|
+
margin: 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.site-footer a {
|
|
89
|
+
color: inherit;
|
|
90
|
+
font-weight: 500;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* Typography */
|
|
94
|
+
h1 {
|
|
95
|
+
font-size: 2.5rem;
|
|
96
|
+
margin-bottom: 1rem;
|
|
97
|
+
line-height: 1.2;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
h2 {
|
|
101
|
+
font-size: 1.75rem;
|
|
102
|
+
margin-top: 2.5rem;
|
|
103
|
+
margin-bottom: 1rem;
|
|
104
|
+
padding-bottom: 0.5rem;
|
|
105
|
+
border-bottom: 1px solid var(--color-border);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
h3 {
|
|
109
|
+
font-size: 1.25rem;
|
|
110
|
+
margin-top: 2rem;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
a {
|
|
114
|
+
color: var(--color-primary);
|
|
115
|
+
text-decoration: none;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
a:hover {
|
|
119
|
+
text-decoration: underline;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/* Navigation */
|
|
123
|
+
.nav-section {
|
|
124
|
+
margin-bottom: 2rem;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.nav-title {
|
|
128
|
+
font-weight: bold;
|
|
129
|
+
text-transform: uppercase;
|
|
130
|
+
font-size: 0.85rem;
|
|
131
|
+
color: var(--color-text);
|
|
132
|
+
letter-spacing: 0.05em;
|
|
133
|
+
margin-bottom: 0.5rem;
|
|
134
|
+
opacity: 0.7;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.nav-links {
|
|
138
|
+
display: flex;
|
|
139
|
+
flex-direction: column;
|
|
140
|
+
gap: 0.5rem;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.nav-link {
|
|
144
|
+
color: var(--color-text);
|
|
145
|
+
font-size: 0.95rem;
|
|
146
|
+
opacity: 0.8;
|
|
147
|
+
transition: opacity 0.2s;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.nav-link:hover {
|
|
151
|
+
opacity: 1;
|
|
152
|
+
color: var(--color-primary);
|
|
153
|
+
text-decoration: none;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.logo {
|
|
157
|
+
font-size: 1.5rem;
|
|
158
|
+
font-weight: bold;
|
|
159
|
+
display: block;
|
|
160
|
+
margin-bottom: 2rem;
|
|
161
|
+
color: var(--color-text);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/* Code Blocks */
|
|
165
|
+
pre {
|
|
166
|
+
background: var(--color-code-bg);
|
|
167
|
+
padding: 1rem;
|
|
168
|
+
border-radius: 0.5rem;
|
|
169
|
+
overflow-x: auto;
|
|
170
|
+
font-family: var(--font-mono);
|
|
171
|
+
font-size: 0.9em;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
code {
|
|
175
|
+
font-family: var(--font-mono);
|
|
176
|
+
background: var(--color-code-bg);
|
|
177
|
+
padding: 0.2em 0.4em;
|
|
178
|
+
border-radius: 0.25rem;
|
|
179
|
+
font-size: 0.85em;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
pre code {
|
|
183
|
+
background: transparent;
|
|
184
|
+
padding: 0;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/* Components */
|
|
188
|
+
.btn {
|
|
189
|
+
display: inline-block;
|
|
190
|
+
background: var(--color-primary);
|
|
191
|
+
color: white;
|
|
192
|
+
padding: 0.75rem 1.5rem;
|
|
193
|
+
border-radius: 0.375rem;
|
|
194
|
+
font-weight: 600;
|
|
195
|
+
transition: background-color 0.2s;
|
|
196
|
+
text-decoration: none !important;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.btn:hover {
|
|
200
|
+
background: var(--color-primary-hover);
|
|
201
|
+
color: white;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.hero {
|
|
205
|
+
text-align: center;
|
|
206
|
+
padding: 4rem 2rem;
|
|
207
|
+
background: var(--color-sidebar-bg);
|
|
208
|
+
border-radius: 1rem;
|
|
209
|
+
margin-bottom: 2rem;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.hero h2 {
|
|
213
|
+
border-bottom: none;
|
|
214
|
+
font-size: 2rem;
|
|
215
|
+
margin-top: 0;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* Mobile Navigation */
|
|
219
|
+
.menu-toggle {
|
|
220
|
+
display: none;
|
|
221
|
+
position: fixed;
|
|
222
|
+
bottom: 1.5rem;
|
|
223
|
+
right: 1.5rem;
|
|
224
|
+
width: 3.5rem;
|
|
225
|
+
height: 3.5rem;
|
|
226
|
+
border-radius: 50%;
|
|
227
|
+
background: var(--color-primary);
|
|
228
|
+
border: none;
|
|
229
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
230
|
+
cursor: pointer;
|
|
231
|
+
z-index: 100;
|
|
232
|
+
padding: 0;
|
|
233
|
+
align-items: center;
|
|
234
|
+
justify-content: center;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.hamburger {
|
|
238
|
+
width: 24px;
|
|
239
|
+
height: 2px;
|
|
240
|
+
background: white;
|
|
241
|
+
position: relative;
|
|
242
|
+
transition: all 0.3s;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.hamburger::before,
|
|
246
|
+
.hamburger::after {
|
|
247
|
+
content: '';
|
|
248
|
+
position: absolute;
|
|
249
|
+
width: 24px;
|
|
250
|
+
height: 2px;
|
|
251
|
+
background: white;
|
|
252
|
+
left: 0;
|
|
253
|
+
transition: all 0.3s;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.hamburger::before {
|
|
257
|
+
top: -8px;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.hamburger::after {
|
|
261
|
+
top: 8px;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.sidebar-open .hamburger {
|
|
265
|
+
background: transparent;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.sidebar-open .hamburger::before {
|
|
269
|
+
top: 0;
|
|
270
|
+
transform: rotate(45deg);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.sidebar-open .hamburger::after {
|
|
274
|
+
top: 0;
|
|
275
|
+
transform: rotate(-45deg);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.sidebar-overlay {
|
|
279
|
+
position: fixed;
|
|
280
|
+
top: 0;
|
|
281
|
+
left: 0;
|
|
282
|
+
right: 0;
|
|
283
|
+
bottom: 0;
|
|
284
|
+
background: rgba(0, 0, 0, 0.5);
|
|
285
|
+
z-index: 40;
|
|
286
|
+
display: none;
|
|
287
|
+
opacity: 0;
|
|
288
|
+
transition: opacity 0.3s;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.sidebar-open .sidebar-overlay {
|
|
292
|
+
display: block;
|
|
293
|
+
opacity: 1;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/* Responsive */
|
|
297
|
+
@media (max-width: 768px) {
|
|
298
|
+
.menu-toggle {
|
|
299
|
+
display: flex;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.layout {
|
|
303
|
+
display: block;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.sidebar {
|
|
307
|
+
position: fixed;
|
|
308
|
+
top: 0;
|
|
309
|
+
left: 0;
|
|
310
|
+
bottom: 0;
|
|
311
|
+
width: 280px;
|
|
312
|
+
z-index: 50;
|
|
313
|
+
transform: translateX(-100%);
|
|
314
|
+
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
315
|
+
box-shadow: 0 0 20px rgba(0, 0, 0, 0.2);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
.sidebar-open .sidebar {
|
|
319
|
+
transform: translateX(0);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
.sidebar-open {
|
|
323
|
+
overflow: hidden;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/* Update main-content selector usage if needed or ensure page-container behaves on mobile */
|
|
327
|
+
.page-container {
|
|
328
|
+
width: 100%;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.main-content {
|
|
332
|
+
padding: 1.5rem;
|
|
333
|
+
width: 100%;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
.site-footer {
|
|
337
|
+
padding: 1.5rem;
|
|
338
|
+
flex-direction: column;
|
|
339
|
+
gap: 1rem;
|
|
340
|
+
text-align: center;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/* Adjust typography for mobile */
|
|
344
|
+
h1 {
|
|
345
|
+
font-size: 2rem;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.logo {
|
|
349
|
+
margin-bottom: 2rem;
|
|
350
|
+
}
|
|
351
|
+
}
|