diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..d70aa68 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @ff4j/ff4j-docs-champions diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..744db36 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,11 @@ +# Description + + + +Closes : + +# Checklist: + +- [ ] I have performed a self-review of my documentation changes +- [ ] I have checked the preview site of PR and confirm the changes +- [ ] My commits follow [conventional commit message guidelines](https://www.conventionalcommits.org/en/v1.0.0/) diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..662cbea --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,22 @@ +version: 2 +updates: + - package-ecosystem: uv + schedule: + interval: daily + time: "23:30" + open-pull-requests-limit: 10 + commit-message: + prefix: "build: " + labels: + - dependencies + - automated + - package-ecosystem: github-actions + directory: "/.github/" + schedule: + interval: weekly + open-pull-requests-limit: 5 + commit-message: + prefix: "ci: " + labels: + - ci + - automated diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index 21ebf09..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Build and deploy mkdocs to github pages -on: - push: - branches: - - main -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - submodules: "recursive" - fetch-depth: 0 - - name: Setup Python - uses: actions/setup-python@v1 - with: - python-version: "3.7" - architecture: "x64" - - name: Install dependencies - run: | - python3 -m pip install --upgrade pip # install pip - python3 -m pip install mkdocs # install mkdocs - python3 -m pip install mkdocs-material # install material theme - python3 -m pip install mkdocs-video # install video - python3 -m pip install https://github.com/bmcorser/fontawesome-markdown/archive/master.zip - python3 -m pip install mkdocs-git-revision-date-plugin # install git revision date - - name: Build site - run: mkdocs build - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.TOKEN }} - publish_dir: ./site diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..ff8a46c --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,99 @@ +name: PR Preview & GitHub Pages Publish +on: + pull_request: + types: [opened, synchronize, reopened, closed] + push: + branches: + - main +permissions: + contents: write # gh-pages + cleanup + pull-requests: write # PR comments + pages: write # deploy-pages + id-token: write # required by deploy-pages +jobs: + build: + if: github.event.action != 'closed' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: "Set up Python" + uses: actions/setup-python@v6 + with: + python-version-file: "pyproject.toml" + + - name: Install uv + uses: astral-sh/setup-uv@v7 + + - name: Sync dependencies + run: uv sync + + - name: Build site + run: uv run zensical build --clean + + - name: Deploy PR preview + if: github.event_name == 'pull_request' + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: site + destination_dir: pr-${{ github.event.pull_request.number }} + + - name: Comment PR with preview URL + if: github.event_name == 'pull_request' + uses: actions/github-script@v7 + with: + script: | + const pr = context.payload.pull_request.number; + const { owner, repo } = context.repo; + + const url = `https://ff4j.github.io/docs/pr-${pr}/`; + + await github.rest.issues.createComment({ + owner, + repo, + issue_number: pr, + body: `📘 **Site preview available**:\n\n${url}` + }); + + - name: Upload Pages artifact + if: github.event_name == 'push' + uses: actions/upload-pages-artifact@v3 + with: + path: site + + publish: + if: github.event_name == 'push' + runs-on: ubuntu-latest + needs: build + environment: + name: github-pages + url: https://paulwilliams.dev + steps: + - name: Deploy to GitHub Pages + uses: actions/deploy-pages@v4 + + cleanup: + if: github.event_name == 'pull_request' && + github.event.action == 'closed' && + github.event.pull_request.merged == false + runs-on: ubuntu-latest + + steps: + - name: Checkout gh-pages branch + uses: actions/checkout@v4 + with: + ref: gh-pages + + - name: Remove PR preview folder + run: | + rm -rf pr-${{ github.event.pull_request.number }} + + - name: Commit cleanup + run: | + git config user.name "github-actions" + git config user.email "github-actions@github.com" + git commit -am "chore: remove preview for PR #${{ github.event.pull_request.number }}" || exit 0 + git push \ No newline at end of file diff --git a/.gitignore b/.gitignore index aa9fc8e..5b56267 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,19 @@ -# IntelliJ files -.idea - -# Virtual environment files -venv +# VSCode +.vscode/ +*.code-workspace + +# IntelliJ +.idea/ +*.iml + +# MacOS +.DS_Store + +# UV +.venv/ +__pycache__/ +*.pyc +.cache/ + +# mkdocs +/site/ diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..c47b345 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.14.2 \ No newline at end of file diff --git a/README.md b/README.md index 68ccb4f..55a3664 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,18 @@ # FF4j Documentation - [![Awesome](https://awesome.re/badge-flat.svg)](https://awesome.re) +This is the documentation of FF4j, a Java library to manage feature toggles in your application. -Static site is generated on branch `gh-pages` using a github actions. +## Prerequisites -## Run the website locally +- [zensical](https://zensical.org/docs/get-started/) -### 1. Installation +## Run locally -```bash -python3 -m pip install --upgrade pip # install pip -python3 -m pip install mkdocs # install mkdocs -python3 -m pip install mkdocs-material # install material theme -#python3 -m pip install https://github.com/bmcorser/fontawesome-markdown/archive/master.zip # install font-awesome -python3 -m pip install mkdocs-git-revision-date-plugin # install git revision date -python3 -m pip install mkdocs-video # install git revision date +```shell +sh ./serve.sh ``` -Or use this one-liner :) +## Contributing -``` -python3 -m pip install --upgrade pip && python3 -m pip install mkdocs mkdocs-material https://github.com/bmcorser/fontawesome-markdown/archive/master.zip mkdocs-git-revision-date-plugin -``` - -### 2. Run - -``` -mkdocs serve -``` - -You should be able to access it on http://localhost:8000 - -**Known Issue:** - -If you get an `mkdocs not found error`, launch it this way: - -``` -python3 -m mkdocs serve -``` - -### 3. Instructions - -#### Images - -**Caution**: when running locally, the site is served at `http://127.0.0.1:8000/pages/[...]` -while when deployed, it is at `https://ff4j.github.io/docs/pages/[...]`. - -This means that if you use "absolute" image URLs such as `/img/ETC ETC` one will work -and the other won't. Unfortunately you have to always use relative paths and climb up -the ladder with `../../../../img/ETC ETC` ! - -In other words, **if you use `"/img/tile-java.png"` it will render OK locally and -then screw up once deployed**. - -Also, when calculating the number of `..` to insert, count ONE LESS for `index.md` files as opposed to all other `md` files: -`index.md` renders as the page for the path containing it (`a/b/c/index.md` renders the URL `a/b/c`). - -For company logo files, SVG format is preferred to PNG. +If you want to contribute to the documentation, please fork the repository and create a pull request +with your changes. We will review your changes and merge them if they are appropriate. \ No newline at end of file diff --git a/docs/cheat.md b/docs/cheat.md deleted file mode 100644 index 6cce828..0000000 --- a/docs/cheat.md +++ /dev/null @@ -1,442 +0,0 @@ - - -## Executable Code (REPLIT) - -Change values `ASTRA_DB_TOKEN`, `ASTRA_DB_ID`, `ASTRA_DB_REGION`, `ASTRA_DB_KEYSPACE` in the code below and execute with - -[![dl](https://dabuttonfactory.com/button.png?t=Download+Project&f=Open+Sans-Bold&ts=14&tc=fff&hp=15&vp=15&w=180&h=50&c=11&bgt=pyramid&bgc=666&ebgc=000&bs=1&bc=444)](https://replit.com/@CLU2/ConnectToAstra.zip) - - - -## Mermaids - -### 1️⃣ Flow - -**Cassandra** - -=== "Graph" - - ```mermaid - graph LR - user>fa:fa-user Developer]-- Create Database --> cassandra[(fa:fa-database Cassandra)] - - user-- Design -->usecase{{fa:fa-cube Use Case}} - usecase-- Workflow -->queries[fa:fa-bezier-curve queries] - usecase-- MCD -->entities[fa:fa-grip-vertical entities] - queries-- Chebotko modelization -->schema[fa:fa-list schema] - entities-- Chebotko modelization -->schema[fa:fa-list schema] - schema[fa:fa-list schema]-- Inject -->cassandra[(fa:fa-database Cassandra)] - - user-- prepare -->dataset{{fa:fa-coings DataSet}} - dataset-- input -->dsbulk-- load data -->cassandra - - user-- Create Token -->token{{fa:fa-key Token}} - usecase-->API - - API-->Request - token-->Request - schema-->Request - Request-- invoke -->cassandra - ``` - -=== "Code" - - ```bash - graph LR - user>fa:fa-user Developer]-- Create Database --> cassandra[(fa:fa-database Cassandra)] - - user-- Design -->usecase{{fa:fa-cube Use Case}} - usecase-- Workflow -->queries[fa:fa-bezier-curve queries] - usecase-- MCD -->entities[fa:fa-grip-vertical entities] - queries-- Chebotko modelization -->schema[fa:fa-list schema] - entities-- Chebotko modelization -->schema[fa:fa-list schema] - schema[fa:fa-list schema]-- Inject -->cassandra[(fa:fa-database Cassandra)] - - user-- prepare -->dataset{{fa:fa-coings DataSet}} - dataset-- input -->dsbulk-- load data -->cassandra - - user-- Create Token -->token{{fa:fa-key Token}} - usecase-->API - - API-->Request - token-->Request - schema-->Request - Request-- invoke -->cassandra - ``` - -**Example #1** - -=== "Output" - - ```mermaid - graph TD; - A-->B; - A-->C; - B-->D; - C-->D; - ``` - -=== "Markdown" - - ``` - ```mermaid - graph TD; - A-->B; - A-->C; - B-->D; - C-->D; - ``` - ``` - -**Example3** - -=== "Output" - - ```mermaid - graph TD - A[Hard] -->|Text| B(Round) - B --> C{Decision} - C -->|One| D[Result 1] - C -->|Two| E[Result 2] - ``` - -=== "Markdown" - - ``` - ```mermaid - graph TD - A[Hard] -->|Text| B(Round) - B --> C{Decision} - C -->|One| D[Result 1] - C -->|Two| E[Result 2] - ``` - ``` - -### 2️⃣ Sequence - -=== "Output" - - ```mermaid - sequenceDiagram - Alice->>John: Hello John, how are you? - loop Healthcheck - John->>John: Fight against hypochondria - end - Note right of John: Rational thoughts! - John-->>Alice: Great! - John->>Bob: How about you? - Bob-->>John: Jolly good! - ``` - -=== "Markdown" - - ``` - ```mermaid - sequenceDiagram - Alice->>John: Hello John, how are you? - loop Healthcheck - John->>John: Fight against hypochondria - end - Note right of John: Rational thoughts! - John-->>Alice: Great! - John->>Bob: How about you? - Bob-->>John: Jolly good! - - ``` - ``` - -### 3️⃣ Gantt - -=== "Output" - - ```mermaid - gantt - section Section - Completed :done, des1, 2014-01-06,2014-01-08 - Active :active, des2, 2014-01-07, 3d - Parallel 1 : des3, after des1, 1d - Parallel 2 : des4, after des1, 1d - Parallel 3 : des5, after des3, 1d - Parallel 4 : des6, after des4, 1d - ``` - -=== "Markdown" - - ``` - ```mermaid - gantt - section Section - Completed :done, des1, 2014-01-06,2014-01-08 - Active :active, des2, 2014-01-07, 3d - Parallel 1 : des3, after des1, 1d - Parallel 2 : des4, after des1, 1d - Parallel 3 : des5, after des3, 1d - Parallel 4 : des6, after des4, 1d - - ``` - ``` - -### 4️⃣ Class - -=== "Output" - - ```mermaid - classDiagram - Class01 <|-- AveryLongClass : Cool - <> Class01 - Class09 --> C2 : Where am i? - Class09 --* C3 - Class09 --|> Class07 - Class07 : equals() - Class07 : Object[] elementData - Class01 : size() - Class01 : int chimp - Class01 : int gorilla - class Class10 { - <> - int id - size() - } - ``` - -=== "Markdown" - - ``` - ```mermaid - classDiagram - Class01 <|-- AveryLongClass : Cool - <> Class01 - Class09 --> C2 : Where am i? - Class09 --* C3 - Class09 --|> Class07 - Class07 : equals() - Class07 : Object[] elementData - Class01 : size() - Class01 : int chimp - Class01 : int gorilla - class Class10 { - <> - int id - size() - } - - ``` - ``` - -### 5️⃣ State - -=== "Output" - - ```mermaid - stateDiagram-v2 - [*] --> Still - Still --> [*] - Still --> Moving - Moving --> Still - Moving --> Crash - Crash --> [*] - ``` - -=== "Markdown" - - ``` - ```mermaid - stateDiagram-v2 - [*] --> Still - Still --> [*] - Still --> Moving - Moving --> Still - Moving --> Crash - Crash --> [*] - - ``` - ``` - -### 6️⃣ Pie - -=== "Output" - - ```mermaid - pie - "Dogs" : 386 - "Cats" : 85 - "Rats" : 15 - ``` - -=== "Markdown" - - ``` - ```mermaid - pie - "Dogs" : 386 - "Cats" : 85 - "Rats" : 15 - - ``` - ``` - -### 7️⃣ Journey - -=== "Output" - - ```mermaid - journey - title My working day - section Go to work - Make tea: 5: Me - Go upstairs: 3: Me - Do work: 1: Me, Cat - section Go home - Go downstairs: 5: Me - Sit down: 3: Me - ``` - -=== "Markdown" - - ``` - ```mermaid - journey - title My working day - section Go to work - Make tea: 5: Me - Go upstairs: 3: Me - Do work: 1: Me, Cat - section Go home - Go downstairs: 5: Me - Sit down: 3: Me - - ``` - ``` - -### 8️⃣ ER - -=== "Output" - - ```mermaid - erDiagram - CUSTOMER ||--o{ ORDER : places - ORDER ||--|{ LINE-ITEM : contains - CUSTOMER }|..|{ DELIVERY-ADDRESS : uses - ``` - -=== "Markdown" - - ``` - ```mermaid - erDiagram - CUSTOMER ||--o{ ORDER : places - ORDER ||--|{ LINE-ITEM : contains - CUSTOMER }|..|{ DELIVERY-ADDRESS : uses - ``` - ``` - -## Sample Blocs - -!!! note "THis is a note" - - my note - -!!! abstract "abstract" - - my note - -!!! info "info" - - info - -???+ tip "Sample tip " - - tip - -??? question "How to add plugins to the Docker image?" - - Import Stuff - -!!! success "Success" - - my note - -!!! warning "Sample warning" - - This is so cool. - -!!! failure "failure" - - my note - -!!! danger "danger" - - danger - -!!! bug "bug" - - bug - -??? example "Sample example" - - example - -!!! warning "Sample warning" - - warning - -??? quote "Sample wuote" - - quote - -## Tooltip - -```sh -wanna a tooltip ? # (1)! -``` - -1. Cedrick rock - - ``` - mkdocs serve - ``` - -## Icons - -### Material - -:material-home: - -[HERE is the full list](https://fonts.google.com/icons) - -### Font Awesome - -HTML - -
  • = fa-camera-retro
  • - -MARKDOWN -:fontawesome-brands-git-alt: - -[HERE is the full list](https://fontawesome.com/v5/cheatsheet) - -### Opticons - -:octicons-tag-24: Sample - -### Adding buttons - -In order to render a link as a button, suffix it with curly braces and add the -`.md-button` class selector to it. The button will receive the selected -[primary color] and [accent color] if active. - -```markdown title="Button" -[Subscribe to our newsletter](#){ .md-button } -``` - -
    - -[Subscribe to our newsletter][demo]{ .md-button } - -
    - -
    - -[Subscribe to our newsletter][demo]{ .md-button .md-button--primary } - -
    diff --git a/docs/home/img/canaryrelease.svg b/docs/home/img/canaryrelease.svg new file mode 100644 index 0000000..d85253e --- /dev/null +++ b/docs/home/img/canaryrelease.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Feature + + + + + + + Enable ? + + + + + « no » + + + + « yes » + + + + Permissions + + + + + « unauthorized » + + + + + « granted » + + + + OFF + + + + ON + + + + + + + + + + + users ACL + + diff --git a/docs/img/home/feature_09_cli.png b/docs/home/img/cli.png similarity index 100% rename from docs/img/home/feature_09_cli.png rename to docs/home/img/cli.png diff --git a/docs/img/home/console-restapi.png b/docs/home/img/console-restapi.png similarity index 100% rename from docs/img/home/console-restapi.png rename to docs/home/img/console-restapi.png diff --git a/docs/home/img/featuretoggle.svg b/docs/home/img/featuretoggle.svg new file mode 100644 index 0000000..b2ee6de --- /dev/null +++ b/docs/home/img/featuretoggle.svg @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Feature + + + + + + + check + + + + + + + + + + « false » + « true » + + + + OFF + + + + ON + + + diff --git a/docs/home/img/strategy.svg b/docs/home/img/strategy.svg new file mode 100644 index 0000000..ee68e13 --- /dev/null +++ b/docs/home/img/strategy.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Feature + + + + + + + Enable ? + + + + + « no » + + + + « yes » + + + + Permissions + + + + Predicate + + + + « unauthorized » + + + + « false » + + + + « granted » + + + + « true » + + + + OFF + + + + ON + + + + + + + + + + + users ACL + + + + Custom strategy + + diff --git a/docs/home/img/upcoming.svg b/docs/home/img/upcoming.svg new file mode 100644 index 0000000..c3387cc --- /dev/null +++ b/docs/home/img/upcoming.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + Upcoming Image + + + + Stay tuned + + diff --git a/docs/home/img/webconsole.png b/docs/home/img/webconsole.png new file mode 100644 index 0000000..1bada03 Binary files /dev/null and b/docs/home/img/webconsole.png differ diff --git a/docs/img/db/db-arangodb.png b/docs/img/db/db-arangodb.png deleted file mode 100644 index a8b8775..0000000 Binary files a/docs/img/db/db-arangodb.png and /dev/null differ diff --git a/docs/img/db/db-archaius.png b/docs/img/db/db-archaius.png deleted file mode 100644 index 884bbbb..0000000 Binary files a/docs/img/db/db-archaius.png and /dev/null differ diff --git a/docs/img/db/db-aws-ssm.png b/docs/img/db/db-aws-ssm.png deleted file mode 100644 index 4ce5f81..0000000 Binary files a/docs/img/db/db-aws-ssm.png and /dev/null differ diff --git a/docs/img/db/db-cassandra.png b/docs/img/db/db-cassandra.png deleted file mode 100644 index 2b85a66..0000000 Binary files a/docs/img/db/db-cassandra.png and /dev/null differ diff --git a/docs/img/db/db-commonsconfig.png b/docs/img/db/db-commonsconfig.png deleted file mode 100644 index 0d135d2..0000000 Binary files a/docs/img/db/db-commonsconfig.png and /dev/null differ diff --git a/docs/img/db/db-consul.png b/docs/img/db/db-consul.png deleted file mode 100644 index c6d2c57..0000000 Binary files a/docs/img/db/db-consul.png and /dev/null differ diff --git a/docs/img/db/db-couchbase.png b/docs/img/db/db-couchbase.png deleted file mode 100644 index 9502aa6..0000000 Binary files a/docs/img/db/db-couchbase.png and /dev/null differ diff --git a/docs/img/db/db-couchdb.png b/docs/img/db/db-couchdb.png deleted file mode 100644 index 6d817aa..0000000 Binary files a/docs/img/db/db-couchdb.png and /dev/null differ diff --git a/docs/img/db/db-dynamodb.png b/docs/img/db/db-dynamodb.png deleted file mode 100644 index c35d6cb..0000000 Binary files a/docs/img/db/db-dynamodb.png and /dev/null differ diff --git a/docs/img/db/db-ehcache.png b/docs/img/db/db-ehcache.png deleted file mode 100644 index 2bb6c78..0000000 Binary files a/docs/img/db/db-ehcache.png and /dev/null differ diff --git a/docs/img/db/db-elastic.png b/docs/img/db/db-elastic.png deleted file mode 100644 index 1bbe9ae..0000000 Binary files a/docs/img/db/db-elastic.png and /dev/null differ diff --git a/docs/img/db/db-eureka.png b/docs/img/db/db-eureka.png deleted file mode 100644 index 884bbbb..0000000 Binary files a/docs/img/db/db-eureka.png and /dev/null differ diff --git a/docs/img/db/db-eventstorearangodb.png b/docs/img/db/db-eventstorearangodb.png deleted file mode 100644 index a8b8775..0000000 Binary files a/docs/img/db/db-eventstorearangodb.png and /dev/null differ diff --git a/docs/img/db/db-hazelcast.png b/docs/img/db/db-hazelcast.png deleted file mode 100644 index d202077..0000000 Binary files a/docs/img/db/db-hazelcast.png and /dev/null differ diff --git a/docs/img/db/db-hbase.png b/docs/img/db/db-hbase.png deleted file mode 100644 index 3869f30..0000000 Binary files a/docs/img/db/db-hbase.png and /dev/null differ diff --git a/docs/img/db/db-ignite.png b/docs/img/db/db-ignite.png deleted file mode 100644 index a376081..0000000 Binary files a/docs/img/db/db-ignite.png and /dev/null differ diff --git a/docs/img/db/db-inmemory.png b/docs/img/db/db-inmemory.png deleted file mode 100644 index 542f8f9..0000000 Binary files a/docs/img/db/db-inmemory.png and /dev/null differ diff --git a/docs/img/db/db-jdbc.png b/docs/img/db/db-jdbc.png deleted file mode 100644 index 542f8f9..0000000 Binary files a/docs/img/db/db-jdbc.png and /dev/null differ diff --git a/docs/img/db/db-jhipster.png b/docs/img/db/db-jhipster.png deleted file mode 100644 index 81d43c6..0000000 Binary files a/docs/img/db/db-jhipster.png and /dev/null differ diff --git a/docs/img/db/db-maria.png b/docs/img/db/db-maria.png deleted file mode 100644 index c9ef976..0000000 Binary files a/docs/img/db/db-maria.png and /dev/null differ diff --git a/docs/img/db/db-mongo.png b/docs/img/db/db-mongo.png deleted file mode 100644 index 653e280..0000000 Binary files a/docs/img/db/db-mongo.png and /dev/null differ diff --git a/docs/img/db/db-neo4j.png b/docs/img/db/db-neo4j.png deleted file mode 100644 index 3cc5f7e..0000000 Binary files a/docs/img/db/db-neo4j.png and /dev/null differ diff --git a/docs/img/db/db-oracle.png b/docs/img/db/db-oracle.png deleted file mode 100644 index 430213a..0000000 Binary files a/docs/img/db/db-oracle.png and /dev/null differ diff --git a/docs/img/db/db-postgres.png b/docs/img/db/db-postgres.png deleted file mode 100644 index 1223df9..0000000 Binary files a/docs/img/db/db-postgres.png and /dev/null differ diff --git a/docs/img/db/db-redis.png b/docs/img/db/db-redis.png deleted file mode 100644 index b313994..0000000 Binary files a/docs/img/db/db-redis.png and /dev/null differ diff --git a/docs/img/db/db-redislettuce.png b/docs/img/db/db-redislettuce.png deleted file mode 100644 index b313994..0000000 Binary files a/docs/img/db/db-redislettuce.png and /dev/null differ diff --git a/docs/img/db/db-springboot.png b/docs/img/db/db-springboot.png deleted file mode 100644 index cc0df85..0000000 Binary files a/docs/img/db/db-springboot.png and /dev/null differ diff --git a/docs/img/db/db-springjdbc.png b/docs/img/db/db-springjdbc.png deleted file mode 100644 index 82987e2..0000000 Binary files a/docs/img/db/db-springjdbc.png and /dev/null differ diff --git a/docs/img/db/db-sqlserver.png b/docs/img/db/db-sqlserver.png deleted file mode 100644 index e879862..0000000 Binary files a/docs/img/db/db-sqlserver.png and /dev/null differ diff --git a/docs/img/db/db-terracotta.png b/docs/img/db/db-terracotta.png deleted file mode 100644 index 0de4a97..0000000 Binary files a/docs/img/db/db-terracotta.png and /dev/null differ diff --git a/docs/img/demo/demo-01.png b/docs/img/demo/demo-01.png deleted file mode 100644 index 5eaa702..0000000 Binary files a/docs/img/demo/demo-01.png and /dev/null differ diff --git a/docs/img/demo/demo-02.png b/docs/img/demo/demo-02.png deleted file mode 100644 index 1b7bb18..0000000 Binary files a/docs/img/demo/demo-02.png and /dev/null differ diff --git a/docs/img/demo/demo-03.png b/docs/img/demo/demo-03.png deleted file mode 100644 index fb16fc3..0000000 Binary files a/docs/img/demo/demo-03.png and /dev/null differ diff --git a/docs/img/demo/demo-04.png b/docs/img/demo/demo-04.png deleted file mode 100644 index 0730f0a..0000000 Binary files a/docs/img/demo/demo-04.png and /dev/null differ diff --git a/docs/img/demo/demo-05.png b/docs/img/demo/demo-05.png deleted file mode 100644 index dc68c37..0000000 Binary files a/docs/img/demo/demo-05.png and /dev/null differ diff --git a/docs/img/demo/demo-06.png b/docs/img/demo/demo-06.png deleted file mode 100644 index e861608..0000000 Binary files a/docs/img/demo/demo-06.png and /dev/null differ diff --git a/docs/img/demo/demo-07.png b/docs/img/demo/demo-07.png deleted file mode 100644 index 550d8cc..0000000 Binary files a/docs/img/demo/demo-07.png and /dev/null differ diff --git a/docs/img/demo/demo-08.png b/docs/img/demo/demo-08.png deleted file mode 100644 index 5265765..0000000 Binary files a/docs/img/demo/demo-08.png and /dev/null differ diff --git a/docs/img/favicon.ico b/docs/img/favicon.ico deleted file mode 100644 index 023cbab..0000000 Binary files a/docs/img/favicon.ico and /dev/null differ diff --git a/docs/img/favicon.svg b/docs/img/favicon.svg deleted file mode 100644 index 023cbab..0000000 Binary files a/docs/img/favicon.svg and /dev/null differ diff --git a/docs/img/ff4j-logo.png b/docs/img/ff4j-logo.png deleted file mode 100644 index 023cbab..0000000 Binary files a/docs/img/ff4j-logo.png and /dev/null differ diff --git a/docs/img/ff4j-logo.svg b/docs/img/ff4j-logo.svg new file mode 100644 index 0000000..c20ebce --- /dev/null +++ b/docs/img/ff4j-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/img/fig-01-feature.png b/docs/img/fig-01-feature.png deleted file mode 100644 index 094f52e..0000000 Binary files a/docs/img/fig-01-feature.png and /dev/null differ diff --git a/docs/img/fig-02-feature.png b/docs/img/fig-02-feature.png deleted file mode 100644 index a3dcb9d..0000000 Binary files a/docs/img/fig-02-feature.png and /dev/null differ diff --git a/docs/img/home/feature_01_featuretoggle.png b/docs/img/home/feature_01_featuretoggle.png deleted file mode 100644 index 119937c..0000000 Binary files a/docs/img/home/feature_01_featuretoggle.png and /dev/null differ diff --git a/docs/img/home/feature_02_permissions.png b/docs/img/home/feature_02_permissions.png deleted file mode 100644 index be74e69..0000000 Binary files a/docs/img/home/feature_02_permissions.png and /dev/null differ diff --git a/docs/img/home/feature_03_strategy.png b/docs/img/home/feature_03_strategy.png deleted file mode 100644 index 451de3d..0000000 Binary files a/docs/img/home/feature_03_strategy.png and /dev/null differ diff --git a/docs/img/home/feature_04_aop.png b/docs/img/home/feature_04_aop.png deleted file mode 100644 index d854b9e..0000000 Binary files a/docs/img/home/feature_04_aop.png and /dev/null differ diff --git a/docs/img/home/feature_05_audit_mini.png b/docs/img/home/feature_05_audit_mini.png deleted file mode 100644 index 62e6e00..0000000 Binary files a/docs/img/home/feature_05_audit_mini.png and /dev/null differ diff --git a/docs/img/home/feature_06_monitoring.png b/docs/img/home/feature_06_monitoring.png deleted file mode 100644 index 43135bf..0000000 Binary files a/docs/img/home/feature_06_monitoring.png and /dev/null differ diff --git a/docs/img/home/feature_07_webconsole.png b/docs/img/home/feature_07_webconsole.png deleted file mode 100644 index a187cdf..0000000 Binary files a/docs/img/home/feature_07_webconsole.png and /dev/null differ diff --git a/docs/img/home/feature_08_technos.png b/docs/img/home/feature_08_technos.png deleted file mode 100644 index 92a3210..0000000 Binary files a/docs/img/home/feature_08_technos.png and /dev/null differ diff --git a/docs/img/home/feature_10_jmx.png b/docs/img/home/feature_10_jmx.png deleted file mode 100644 index ff2af22..0000000 Binary files a/docs/img/home/feature_10_jmx.png and /dev/null differ diff --git a/docs/img/home/feature_11_properties.png b/docs/img/home/feature_11_properties.png deleted file mode 100644 index 3526276..0000000 Binary files a/docs/img/home/feature_11_properties.png and /dev/null differ diff --git a/docs/img/home/feature_12_caching.png b/docs/img/home/feature_12_caching.png deleted file mode 100644 index 3836681..0000000 Binary files a/docs/img/home/feature_12_caching.png and /dev/null differ diff --git a/docs/img/home/gallery.png b/docs/img/home/gallery.png deleted file mode 100644 index f89a963..0000000 Binary files a/docs/img/home/gallery.png and /dev/null differ diff --git a/docs/img/home/spring-boot.png b/docs/img/home/spring-boot.png deleted file mode 100644 index c8c94f4..0000000 Binary files a/docs/img/home/spring-boot.png and /dev/null differ diff --git a/docs/img/secu/apacheshiro.png b/docs/img/secu/apacheshiro.png deleted file mode 100644 index 1dd6924..0000000 Binary files a/docs/img/secu/apacheshiro.png and /dev/null differ diff --git a/docs/img/secu/jhipster.png b/docs/img/secu/jhipster.png deleted file mode 100644 index 81d43c6..0000000 Binary files a/docs/img/secu/jhipster.png and /dev/null differ diff --git a/docs/img/secu/springsecurity.png b/docs/img/secu/springsecurity.png deleted file mode 100644 index 4e7d2b9..0000000 Binary files a/docs/img/secu/springsecurity.png and /dev/null differ diff --git a/docs/img/use-cases/usecase-abtesting.png b/docs/img/use-cases/usecase-abtesting.png deleted file mode 100644 index 219fc3e..0000000 Binary files a/docs/img/use-cases/usecase-abtesting.png and /dev/null differ diff --git a/docs/img/use-cases/usecase-bluegreen.png b/docs/img/use-cases/usecase-bluegreen.png deleted file mode 100644 index 2eb0931..0000000 Binary files a/docs/img/use-cases/usecase-bluegreen.png and /dev/null differ diff --git a/docs/img/use-cases/usecase-businesstoggle.png b/docs/img/use-cases/usecase-businesstoggle.png deleted file mode 100644 index 4ce53bc..0000000 Binary files a/docs/img/use-cases/usecase-businesstoggle.png and /dev/null differ diff --git a/docs/img/use-cases/usecase-canary.png b/docs/img/use-cases/usecase-canary.png deleted file mode 100644 index 118e4ef..0000000 Binary files a/docs/img/use-cases/usecase-canary.png and /dev/null differ diff --git a/docs/img/use-cases/usecase-circuitbreaker.png b/docs/img/use-cases/usecase-circuitbreaker.png deleted file mode 100644 index 9d70bd1..0000000 Binary files a/docs/img/use-cases/usecase-circuitbreaker.png and /dev/null differ diff --git a/docs/img/use-cases/usecase-darklaunch.png b/docs/img/use-cases/usecase-darklaunch.png deleted file mode 100644 index 3c4bb79..0000000 Binary files a/docs/img/use-cases/usecase-darklaunch.png and /dev/null differ diff --git a/docs/img/use-cases/usecase-featurebranching.png b/docs/img/use-cases/usecase-featurebranching.png deleted file mode 100644 index 808d9a3..0000000 Binary files a/docs/img/use-cases/usecase-featurebranching.png and /dev/null differ diff --git a/docs/img/use-cases/usecase-graceful.png b/docs/img/use-cases/usecase-graceful.png deleted file mode 100644 index 1f75cfc..0000000 Binary files a/docs/img/use-cases/usecase-graceful.png and /dev/null differ diff --git a/docs/img/use-cases/usecase-thinclient.png b/docs/img/use-cases/usecase-thinclient.png deleted file mode 100644 index 3112a7a..0000000 Binary files a/docs/img/use-cases/usecase-thinclient.png and /dev/null differ diff --git a/docs/img/vosTimbres.pdf b/docs/img/vosTimbres.pdf deleted file mode 100644 index 4627d29..0000000 Binary files a/docs/img/vosTimbres.pdf and /dev/null differ diff --git a/docs/index.md b/docs/index.md index 2d3373a..a572d90 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,3 @@ --- -title: FF4j Home Documentation template: home.html --- - -Welcome to FF4j documentation diff --git a/docs/overrides/home.html b/docs/overrides/home.html index f37f3ca..67d0700 100644 --- a/docs/overrides/home.html +++ b/docs/overrides/home.html @@ -1,283 +1,101 @@ {% extends "main.html" %} {% block tabs %} {{ super() }} - - - -
    -
    -
    -
    - -
    -
    -

    FF4j, Feature Flipping for Java

    -

    Feature Toggle made easy.

    - - 🎓 Documentation - - - Getting Started 🚀 - -
    +
    +
    +
    +
    +

    Feature Flipping for Java

    +

    Make feature management effortless by turning functionality + on or off at any time. Reduce risk, support gradual rollouts, and empower both business + and engineering teams to respond quickly to user feedback and changing needs.

    + + Get started + + + Learn more +
    +
    - - - -
    -
    -

     Feature Toggle

    -

    Enable. and disable features at runtime - no deployments. In your code implement multiple paths protected by dynamic predicates (if/then/else).

    -

    - +
    +
    +
    +
    +

    Feature toggle

    +

    Enable and disable features at runtime - no deployments.

    +

    In your code implement multiple paths protected by dynamic predicates + (if/then/else). +

    +
    +
    +

    +
    -
    -

     Canary Releases

    -

    Enable features not only with flag values but also drive access with roles and groups (Canary Release). Different frameworks supported starting by Spring Security.

    -

    +
    +
    +

    +
    +
    +

    Canary releases

    +

    Enable features not only with flag values but also drive access with roles and groups. + Different + frameworks supported starting by spring security.

    +
    -
    -

     Custom Rules

    -

    Create custom predicates to evaluate if features are enabled. Some provided like White listing,Time-based, expression-based or connect systems like Drools.

    -

    +
    +
    +

    Custom rules

    +

    Create custom predicates to evaluate if features are enabled or disabled. Some provided + like white + listing, time-based, expression-based or connect systems like drools.

    +
    +
    +

    +
    -
    - -
    -
    -

     Web Console

    -

    Administrate FF4j (including features and properties) with the web UI. Packaged as a servlet in the library you will expose it in your backend applications. Almost 10 languages available..

    -

    - +
    +
    +

    +
    +
    +

    Web console

    +

    Administrate FF4j (including features and properties) with the web UI. Packaged as a + servlet in the + library you will expose it in your backend applications. Almost 10 languages + available.

    +
    -
    -

     Rest API

    -

    Operate FF4j through a WEB API. This is the way to go to use ff4j with others languages, specially javascript frontends.(also: leverage on FeatureStoreHttp to avoid microservices to directly connect to the DB.

    -

    +
    +
    +

    RESTful API

    +

    Operate FF4j through a WEB API. This is the way to go to use ff4j with others languages, + specially + javascript frontends.(also: leverage on FeatureStoreHttp to avoid microservices to + directly connect + to the DB.

    +
    +
    +

    +
    -
    -

     Command Line Interface

    -

    To automate things or because web ports may be blocked (you know, production...) you can work through SSH using our Command Line Interface (cli), our Shell #devOps. It will interact directly with storages..

    -

    +
    +
    +

    +
    +
    +

    Command-line interface

    +

    To automate things or because web ports may be blocked (you know, production...) you can + work through + SSH using our Command Line Interface (cli), our Shell #devOps. It will interact directly + with + storages.

    +
    -
    - - +
    +
    {% endblock %} {% block content %}{% endblock %} -{% block footer %}{% endblock %} +{% block footer %}{% endblock %} \ No newline at end of file diff --git a/docs/overrides/main.html b/docs/overrides/main.html index 5a838b8..63913c1 100644 --- a/docs/overrides/main.html +++ b/docs/overrides/main.html @@ -1,29 +1 @@ - -{% extends "base.html" %} - - -{% block footer %} -
    - -
    -{% endblock %} +{% extends "base.html" %} \ No newline at end of file diff --git a/docs/pages/advanced/aop.md b/docs/pages/advanced/aop.md deleted file mode 100644 index 770441a..0000000 --- a/docs/pages/advanced/aop.md +++ /dev/null @@ -1 +0,0 @@ -This is aop.md \ No newline at end of file diff --git a/docs/pages/advanced/caching.md b/docs/pages/advanced/caching.md deleted file mode 100644 index 40482c5..0000000 --- a/docs/pages/advanced/caching.md +++ /dev/null @@ -1 +0,0 @@ -This is caching.md \ No newline at end of file diff --git a/docs/pages/advanced/cli.md b/docs/pages/advanced/cli.md deleted file mode 100644 index 2d96e34..0000000 --- a/docs/pages/advanced/cli.md +++ /dev/null @@ -1 +0,0 @@ -This is cli.md \ No newline at end of file diff --git a/docs/pages/advanced/feature-groups.md b/docs/pages/advanced/feature-groups.md deleted file mode 100644 index 643d637..0000000 --- a/docs/pages/advanced/feature-groups.md +++ /dev/null @@ -1 +0,0 @@ -This is feature groups \ No newline at end of file diff --git a/docs/pages/advanced/jmx.md b/docs/pages/advanced/jmx.md deleted file mode 100644 index 2427da0..0000000 --- a/docs/pages/advanced/jmx.md +++ /dev/null @@ -1 +0,0 @@ -This is jmx.md \ No newline at end of file diff --git a/docs/pages/advanced/spring-boot.md b/docs/pages/advanced/spring-boot.md deleted file mode 100644 index 7290e7c..0000000 --- a/docs/pages/advanced/spring-boot.md +++ /dev/null @@ -1 +0,0 @@ -This is spring-boot.md \ No newline at end of file diff --git a/docs/pages/basics/architecture.md b/docs/pages/basics/architecture.md deleted file mode 100644 index 95fdcdf..0000000 --- a/docs/pages/basics/architecture.md +++ /dev/null @@ -1 +0,0 @@ -This is architecture. \ No newline at end of file diff --git a/docs/pages/basics/feature-store.md b/docs/pages/basics/feature-store.md deleted file mode 100644 index 0d20616..0000000 --- a/docs/pages/basics/feature-store.md +++ /dev/null @@ -1 +0,0 @@ -This is feature Store \ No newline at end of file diff --git a/docs/pages/basics/feature.md b/docs/pages/basics/feature.md deleted file mode 100644 index 0cf44ca..0000000 --- a/docs/pages/basics/feature.md +++ /dev/null @@ -1,108 +0,0 @@ - - -### Overview - -The [`Feature`](https://github.com/clun/ff4j/blob/master/ff4j-core/src/main/java/org/ff4j/core/Feature.java) term is used to represent functionality or treatment in an application. -It is identified by an unique identifier (uid). - -A Feature represents a business logic that can potentially crosses every layer -of applications from user interfaces to data access. Therefore, to implement -a feature toggle mechanism, we must help you in each layer as shown with the -picture on the right. - -![pic](../../img/fig-01-feature.png) - -Feature toggle,_or feature flag_, purpose is to evaluate the state of features at runtime to drive the execution of your code. You can change the state of features at runtime (enable and disable, toggle `ON/OFF`). - -Each feature is associated as a flag. -Given a feature with identifier `f1` we want to write in the code: - -```java -if (ff4j.check("f1")) { - System.out.println("The feature 'f1' is 'ON'"); -} else { - System.out.println("The feature 'f1' is 'OFF'"); -} -``` - -### `Feature` object - -With the library `FF4J`, a feature is an object with multiple attributes (not only identifier and state): - -- A text **description** to explain the purpose -- An _optional_ **groupName** to toggle multiple features at once (see [`FeatureGroup`](#group)) -- An _optional_ **set of permissions** to implement RBAC access. (see [`Permissions`](#permissions-and-security)) -- An _optional_ **flipping strategy** to implement your predicates (see [`FlippingStrategy`](#flipping-strategy)) -- A **key/value map** named `customProperties` to create some context - - ```mermaid - classDiagram - Feature --* FlippingStrategy - Feature --* Property - - Feature : enable() - Feature : disable() - Feature : toJson() - Feature : fromJson(...) - Feature : getters() - Feature : setters() - Feature : String uid - Feature : boolean enable - Feature : String description - Feature : String group - Feature : Set permissions - Feature : Map customProperties - FlippingStrategy : getInitParams() - FlippingStrategy : evaluate() - Property : name - Property : value - ``` - -### Sample codes - -You can interact with the `Feature` object programmatically : - -```java -Feature f1 = new Feature("f1"); -Feature f2 = new Feature("f2", false, "sample description"); -``` - -- Feature with **Permissions**: - -```java -Set < String > permission = new HashSet(); -permission.add("BETA-TESTER"); -permission.add("VIP"); -Feature f3 = new Feature("f3", false, "desc", "GROUP_1", permission); -``` - -- Feature with **Custom Properties**: - -```java -Feature f4 = new Feature("f4"); -f4.addProperty(new PropertyString("p1", "v1")); -f4.addProperty(new PropertyDouble("pie", Math.PI)); -f4.addProperty(new PropertyInt("myAge", 12)); -``` - -- Feature with `FlippingStrategy` - -```java -Feature f5 = new Feature("f5"); -Calendar nextReleaseDate = Calendar.getInstance(); -nextReleaseDate.set(Calendar.MONTH, Calendar.SEPTEMBER); -nextReleaseDate.set(Calendar.DAY_OF_MONTH, 1); -f5.setFlippingStrategy(new ReleaseDateFlipStrategy(nextReleaseDate.getTime())); - -// Working with DarkLaunch Flipping Strategy -Feature f6 = new Feature("f6"); -f6.setFlippingStrategy(new DarkLaunchStrategy(0.2d)); - -// Working with White List Flipping Strategy -Feature f7 = new Feature("f7"); -f7.setFlippingStrategy(new WhiteListStrategy("localhost")); -``` - -It is not likely that you do have to create the `Features` objects on your own (except for tests). They will be stored in the FeatureStore and purpose is really to `check` the status at runtime. You may want to create them through the webUI or configuration files. Attributes mentionned before are available in the `edit` modal: - -![pic](../../img/fig-02-feature.png) diff --git a/docs/pages/basics/flipping-strategy.md b/docs/pages/basics/flipping-strategy.md deleted file mode 100644 index cb8fcfe..0000000 --- a/docs/pages/basics/flipping-strategy.md +++ /dev/null @@ -1 +0,0 @@ -this is flipping strategy \ No newline at end of file diff --git a/docs/pages/basics/index.md b/docs/pages/basics/index.md deleted file mode 100644 index ef12bc3..0000000 --- a/docs/pages/basics/index.md +++ /dev/null @@ -1,109 +0,0 @@ -## Introductory Video - -A 15-min video going over the main use cases and a demo with microservices. The associated [source code can be found here](https://github.com/ff4j/ff4j-samples/tree/master/spring-boot-1x/ff4j-voxxeddays-ticino-2018) - -![type:video](https://www.youtube.com/embed/P6PtQtOYhus) - -## Test with Docker - -!!! abstract "Prerequisites" - - - Having [docker](https://docs.docker.com/engine/install/) installed - -**✅ Step A.** - Having a `docker` engine on your machine, start a container with the following - -``` -docker run -p 8080:8080 ff4j/ff4j-sample-springboot2x:1.8.5 -``` - -> `👁️ Expected Console` -> -> ```bash -> _____ _____ _____ __ -> _/ ____\/ ____\/ | | |__| -> \ __\\ __\/ | |_ | | -> | | | | / ^ / | | -> |__| |__| \____ /\__| | -> |__\______| -> -> Brought to you by FF4j Developments team -> If you like us, consider to give a ⭐ on github, that helps s! https://github.com/ff4j/ff4j/stargazers -> The application should be available on http://localhost:8080 -> 15:30:17.803 INFO org.ff4j.sample.Application : Starting Application v1.8.5 on 9a94abfcef56 with PID 1 (/app.jar started by root in /) -> 15:30:17.810 INFO org.ff4j.sample.Application : No active profile set, falling back to default profiles: default -> 15:30:21.827 INFO org.ff4j.sample.HomeController : + Features and properties have been created for the sample. -> 15:30:24.181 INFO org.ff4j.sample.Application : Started Application in 7.275 seconds (JVM running for 8.759) -> ``` - -**✅ Step B.** - Access: [http://localhost:8080](http://localhost:8080). In the basic web page you can see 3 bullets. -Each is also a feature of the application that we will enable / disable. - -**✅ Step C.** - Click [web console link](http://localhost:8080/ff4j-web-console/home) - -![pic](../../img/demo/demo-01.png) - -**✅ Step D.** - Click `Features` in the menu or `FeatureStore` in the General Tab to list features - -![pic](../../img/demo/demo-02.png) - -**✅ Step E.** - Disable feature `showRestApiUrl` by clicking the toggle icon - -![pic](../../img/demo/demo-03.png) - -**✅ Step F.** - Back, now select the `Properties` item in the menu. - -![pic](../../img/demo/demo-04.png) - -**✅ Step G.** - Edit value of property `username` by click the pencil icon - -![pic](../../img/demo/demo-05.png) - -**✅ Step H.** - Edit value of property `username` by click the pencil icon - -![pic](../../img/demo/demo-06.png) - -**✅ Step I.** - Going back to the home page you see that only 2 lines are shown (one is disabled) and the property got a new value - -![pic](../../img/demo/demo-07.png) - -_Your are done !_ - -## Spring-Boot Application - -!!! abstract "Prerequisites" - - - Java 8+ installed - - Maven Installed - - Git installed (optional) - -**✅ Step A.** - Download the code of the demo - -- Execute the following `git` or [download as a zip](https://github.com/ff4j/ff4j-demo/archive/refs/heads/master.zip) - -``` -git clone https://github.com/ff4j/ff4j-demo.git -``` - -**✅ Step B.** - Start the demo - -```bash -cd ff4j-demo -mvn spring-boot:run -``` - -**✅ Step C.** - Access the demo - -- Test the running application on [localhost:8080](localhost:8080). - -![pic](../../img/demo/demo-08.png) - -- You should import the code in your IDE as a starting project. It is a spring boot application, it leverages the `spring-boot-starter`. The following dependency has been added to the `pom.xml` - -```xml - - org.ff4j - ff4j-spring-boot-starter - ${ff4j.version} - -``` - diff --git a/docs/pages/basics/property-store.md b/docs/pages/basics/property-store.md deleted file mode 100644 index 96d8c0d..0000000 --- a/docs/pages/basics/property-store.md +++ /dev/null @@ -1 +0,0 @@ -This is property Store \ No newline at end of file diff --git a/docs/pages/basics/security.md b/docs/pages/basics/security.md deleted file mode 100644 index bca9dd7..0000000 --- a/docs/pages/basics/security.md +++ /dev/null @@ -1 +0,0 @@ -This is security \ No newline at end of file diff --git a/docs/pages/configuration.md b/docs/pages/configuration.md deleted file mode 100644 index 1c48766..0000000 --- a/docs/pages/configuration.md +++ /dev/null @@ -1 +0,0 @@ -Configuration Home \ No newline at end of file diff --git a/docs/pages/samples/index.md b/docs/pages/samples/index.md deleted file mode 100644 index a2256aa..0000000 --- a/docs/pages/samples/index.md +++ /dev/null @@ -1 +0,0 @@ -Sample Codes \ No newline at end of file diff --git a/docs/pages/spring/index.md b/docs/pages/spring/index.md deleted file mode 100644 index 595d28c..0000000 --- a/docs/pages/spring/index.md +++ /dev/null @@ -1 +0,0 @@ -Spring diff --git a/docs/pages/stores/index.md b/docs/pages/stores/index.md deleted file mode 100644 index f02df36..0000000 --- a/docs/pages/stores/index.md +++ /dev/null @@ -1 +0,0 @@ -INDEX stores diff --git a/docs/pages/strategy/index.md b/docs/pages/strategy/index.md deleted file mode 100644 index 5195413..0000000 --- a/docs/pages/strategy/index.md +++ /dev/null @@ -1 +0,0 @@ -INDEX strategy \ No newline at end of file diff --git a/docs/pages/v2/index.md b/docs/pages/v2/index.md deleted file mode 100644 index f4984c1..0000000 --- a/docs/pages/v2/index.md +++ /dev/null @@ -1,58 +0,0 @@ - -After 10 years of existence it is now time to think about a new major version for ff4j. The idea is to fix the misconceptions of v1 and to extends the capabilities. - -## V1 Limitations and issues - -### V1 Inaccuracy - -- **Monolithic**: There is no clear definition of what should be embedded in your application and what would be a shared backend. The code needs to reflect that distinction, - -- **Flipping Strategy**: The term `FlipStrategy` is not really accurate and should be renamed `ToggleStrategy` - -- FF4j should embrace the java languages improvements with `Predicate`, `Optional`, `Lambda`... - -- We should enforce authentication for any operations, to track and secure - -### V1 Limitations - -- A feature should have a list of `ToggleStrategies` - -- The backend REST API was a single point of failure, you needed a load balancer, you want to do client-side load balancing - -- The persistence should allow multi-tenancy and or at least multiple applications. - -- The authentication manager does not need to be at FF4j level - -- Each entity should come with an access control list to define who's doing what. - -## V2 Design - -- FF4j is the `client` part handling connectivity - -```java -FF4j ff4j = FF4j.Builder(). - - // Connectivity - .withCredentials("admin", "admin") - .withBackends(new BackendRest("http://localhost:8080:")) - .withSSLPolicy() - .withRetryPolicy() - .withLoadBalancingPolicy() - .withFailoverPolicy() - - // Applications - .withNamespace("applicationX") - .withCaching(ttl, activePolling polling interface) - - // Request settings - .withPageSize() - .withTimeout() - .withRequestTracking() - .build(); - -ff4j.feature("f1").find(); -ff4j.feature("f1").isToggled(); - -``` - -- FF4j Backend \ No newline at end of file diff --git a/docs/pages/web/apis.md b/docs/pages/web/apis.md deleted file mode 100644 index 3391767..0000000 --- a/docs/pages/web/apis.md +++ /dev/null @@ -1 +0,0 @@ -This is apis \ No newline at end of file diff --git a/docs/pages/web/console.md b/docs/pages/web/console.md deleted file mode 100644 index b1565bf..0000000 --- a/docs/pages/web/console.md +++ /dev/null @@ -1 +0,0 @@ -This is console \ No newline at end of file diff --git a/docs/pages/web/index.md b/docs/pages/web/index.md deleted file mode 100644 index 98d0f34..0000000 --- a/docs/pages/web/index.md +++ /dev/null @@ -1 +0,0 @@ -INDEX web \ No newline at end of file diff --git a/docs/pages/web/taglib.md b/docs/pages/web/taglib.md deleted file mode 100644 index 677a9da..0000000 --- a/docs/pages/web/taglib.md +++ /dev/null @@ -1 +0,0 @@ -This is taglib \ No newline at end of file diff --git a/docs/pages/web/thymeleaf.md b/docs/pages/web/thymeleaf.md deleted file mode 100644 index 02e8638..0000000 --- a/docs/pages/web/thymeleaf.md +++ /dev/null @@ -1 +0,0 @@ -This is thymeleaf \ No newline at end of file diff --git a/docs/stylesheets/bootstrap-grid.min.css b/docs/stylesheets/bootstrap-grid.min.css new file mode 100644 index 0000000..f4f50ae --- /dev/null +++ b/docs/stylesheets/bootstrap-grid.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap Grid v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}@media (min-width:576px){.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}}@media (min-width:768px){.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}}@media (min-width:992px){.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}}@media (min-width:1200px){.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}}@media (min-width:1400px){.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} +/*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file diff --git a/docs/stylesheets/theme.css b/docs/stylesheets/theme.css new file mode 100644 index 0000000..ef72347 --- /dev/null +++ b/docs/stylesheets/theme.css @@ -0,0 +1,139 @@ +:root { + /* Primary color palette - Material for MkDocs variables */ + --md-primary-fg-color: #2E8B57; + --md-primary-fg-color--light: #5EC47E; + --md-primary-fg-color--dark: #1F6C4F; + --md-primary-bg-color: #ffffff; + --md-primary-bg-color--light: #f5f5f5; + + /* Text colors */ + --md-typeset-color: rgba(0, 0, 0, 0.87); + --md-typeset-a-color: #2FBF71; + --md-typeset-mark-color: rgba(47, 191, 113, 0.2); + + /* Code colors */ + --md-code-fg-color: #37474f; + --md-code-bg-color: #f5f5f5; + --md-code-hl-color: rgba(47, 191, 113, 0.15); + --md-code-hl-number-color: #2FBF71; + --md-code-hl-keyword-color: #616161; + + /* Admonition colors */ + --md-admonition-fg-color: rgba(0, 0, 0, 0.87); + --md-admonition-bg-color: #ffffff; + + /* Default text color */ + --md-default-fg-color: rgba(0, 0, 0, 0.87); + --md-default-fg-color--light: rgba(0, 0, 0, 0.54); + --md-default-fg-color--lighter: rgba(0, 0, 0, 0.32); + --md-default-fg-color--lightest: rgba(0, 0, 0, 0.07); + --md-default-bg-color: #ffffff; + --md-default-bg-color--light: #f5f5f5; + --md-default-bg-color--lighter: rgba(0, 0, 0, 0.03); + --md-default-bg-color--lightest: rgba(0, 0, 0, 0.01); + + /* Shadow and elevation */ + --md-shadow-z1: 0 2px 2px 0 rgba(0, 0, 0, 0.14), + 0 1px 5px 0 rgba(0, 0, 0, 0.12), + 0 3px 1px -2px rgba(0, 0, 0, 0.2); + --md-shadow-z2: 0 4px 5px 0 rgba(0, 0, 0, 0.14), + 0 1px 10px 0 rgba(0, 0, 0, 0.12), + 0 2px 4px -1px rgba(0, 0, 0, 0.3); + --md-shadow-z3: 0 6px 10px 0 rgba(0, 0, 0, 0.14), + 0 1px 18px 0 rgba(0, 0, 0, 0.12), + 0 3px 5px -1px rgba(0, 0, 0, 0.3); +} + +/* Home page header section styling */ +.home-header { + padding: 4rem 0; +} + +.home-header h1 { + background: linear-gradient(80deg, #2E8B57 0%, #064E3B 85%, #064E3B 100%); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + font-weight: 700; + font-size: 3rem; + margin-bottom: 1.5rem; +} + +.home-header p { + color: rgba(255, 255, 255, 0.9); + font-size: 1.125rem; + line-height: 1.7; +} + +.home-header .md-button { + margin-right: 1rem; + margin-bottom: 0.5rem; + font-weight: 500; + text-transform: uppercase; + letter-spacing: 0.5px; + padding: 0.75rem 2rem; + border-radius: 4px; + transition: all 0.28s cubic-bezier(0.4, 0, 0.2, 1); +} + +.home-header .md-button--primary { + background-color: #ffffff; + color: var(--md-primary-fg-color); + box-shadow: var(--md-shadow-z2); +} + +.home-header .md-button--primary:hover { + background-color: #f5f5f5; + box-shadow: var(--md-shadow-z3); + transform: translateY(-2px); + color: #2E8B57; +} + +.home-header .md-button.link-color { + background-color: transparent; + color: #ffffff; + border: 2px solid #ffffff; +} + +.home-header .md-button.link-color:hover { + background-color: rgba(255, 255, 255, 0.1); + border-color: #ffffff; +} + +/* Features section styling */ +.features .row { + margin-bottom: 4rem; + align-items: center; +} + +.features h2 { + background: linear-gradient(80deg, #2E8B57 0%, #064E3B 50%, #2E8B57 100%); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + font-size: 2rem; + margin: 0; +} + +.features p { + font-size: 1rem; + line-height: 1.6; +} + +.features img { + max-width: 100%; + height: auto; + border-radius: 8px; + box-shadow: var(--md-shadow-z2); +} + +/* Prevent layout shift when system scrollbars appear */ +html { + scrollbar-gutter: stable both-edges; +} + +@supports (scrollbar-gutter: stable both-edges) { + :root { + min-height: 100%; + } +} diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index 72ac2cb..0000000 --- a/mkdocs.yml +++ /dev/null @@ -1,151 +0,0 @@ -# ------------------------------------------------------ -# Page tree -# ------------------------------------------------------ -nav: - - index.md - - Getting Started: - - Getting Started: pages/basics/index.md - - Basics: - - ‣ Feature Flag: pages/basics/feature.md - - ‣ Feature Store: pages/basics/feature-store.md - - ‣ Property Store: pages/basics/property-store.md - - ‣ Architecture: pages/basics/architecture.md - - ‣ Security: pages/basics/security.md - - ‣ Flipping Strategy: pages/basics/flipping-strategy.md - - Advanced: - - ‣ Features Groups: pages/advanced/feature-groups.md - - ‣ Aspect Oriented Programming: pages/advanced/aop.md - - ‣ Caching: pages/advanced/caching.md - - ‣ Spring Boot: pages/advanced/spring-boot.md - - ‣ Command line interface: pages/advanced/cli.md - - ‣ JMX Support: pages/advanced/jmx.md - - Web: - - ‣ Web Console: pages/web/console.md - - ‣ Taglib: pages/web/taglib.md - - ‣ Thymeleaf tags: pages/web/thymeleaf.md - - ‣ REST Api: pages/web/apis.md - - - Store Configurations: - - Architecture: pages/configuration.md - - Stores: pages/stores/index.md - - Flipping Strategies: pages/strategy/index.md - - v2: pages/v2/index.md - - web: pages/web/index.md - - - Spring applications: - - Home: pages/spring/index.md - - - Sample Codes: - - Home: pages/samples/index.md - - Cheat: cheat.md - -# ------------------------------------------------------ -# Settings -# ------------------------------------------------------ - -# Project information -site_name: FF4j -site_url: https://ff4j.github.io -site_author: Cedrick Lunven -site_description: >- - Documentation for FF4j - -# Repository -repo_name: ff4j/ff4j-docs -repo_url: https://github.com/ff4j/ff4j-docs -edit_uri: "" - -# Theme -theme: - name: material - language: en - - favicon: img/favicon.svg - logo: img/favicon.ico - custom_dir: docs/overrides - - features: - - content.code.annotate - - navigation.indexes - - navigation.sections - - navigation.tabs - - navigation.top - - navigation.tracking - - search.highlight - - search.share - - search.suggest - - toc.follow - palette: - - - scheme: default - primary: teal - accent: teal - toggle: - icon: material/weather-sunny - name: Switch to light mode - - scheme: slate - primary: indigo - accent: indigo - toggle: - icon: material/weather-night - name: Switch to dark mode - - include_search_page: false - search_index_only: true - -# Markdown Support -markdown_extensions: - - abbr - - admonition - - attr_list - - def_list - - footnotes - - meta - - md_in_html - - toc: - permalink: true - - pymdownx.arithmatex: - generic: true - - pymdownx.betterem: - smart_enable: all - #- pymdownx.caret - - pymdownx.details - - pymdownx.emoji: - emoji_generator: !!python/name:materialx.emoji.to_svg - emoji_index: !!python/name:materialx.emoji.twemoji - - pymdownx.highlight: - anchor_linenums: true - - pymdownx.inlinehilite - - pymdownx.keys - - pymdownx.mark - - pymdownx.smartsymbols - - pymdownx.superfences: - custom_fences: - - name: mermaid - class: mermaid - format: !!python/name:pymdownx.superfences.fence_code_format - - pymdownx.tabbed: - alternate_style: true - - pymdownx.tasklist: - custom_checkbox: true - - pymdownx.tilde - -# Plugins -plugins: - - search - - git-revision-date - - mkdocs-video - #- render_swagger - -# Customization -extra: - analytics: - provider: google - property: UA-99337757-1 - social: - - icon: fontawesome/brands/github - link: https://github.com/ff4j - - icon: fontawesome/brands/twitter - link: https://twitter.com/clunven - - icon: fontawesome/brands/discord - link: https://discord.gg/WUQxSNmZ9h diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..8907b0b --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,9 @@ +[project] +name = "ff4j-docs" +version = "0.0.1" +description = "Documentation for Feature Flipping for Java (ff4j)" +readme = "README.md" +requires-python = ">=3.14.2" +dependencies = [ + "zensical>=0.0.16", +] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 9a57153..0000000 Binary files a/requirements.txt and /dev/null differ diff --git a/serve.sh b/serve.sh new file mode 100644 index 0000000..d247c9c --- /dev/null +++ b/serve.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +uv run zensical serve -o \ No newline at end of file diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..1adb4b0 --- /dev/null +++ b/uv.lock @@ -0,0 +1,129 @@ +version = 1 +revision = 2 +requires-python = ">=3.14.2" + +[[package]] +name = "click" +version = "8.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "deepmerge" +version = "2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/3a/b0ba594708f1ad0bc735884b3ad854d3ca3bdc1d741e56e40bbda6263499/deepmerge-2.0.tar.gz", hash = "sha256:5c3d86081fbebd04dd5de03626a0607b809a98fb6ccba5770b62466fe940ff20", size = 19890, upload-time = "2024-08-30T05:31:50.308Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/82/e5d2c1c67d19841e9edc74954c827444ae826978499bde3dfc1d007c8c11/deepmerge-2.0-py3-none-any.whl", hash = "sha256:6de9ce507115cff0bed95ff0ce9ecc31088ef50cbdf09bc90a09349a318b3d00", size = 13475, upload-time = "2024-08-30T05:31:48.659Z" }, +] + +[[package]] +name = "ff4j-docs" +version = "0.0.1" +source = { virtual = "." } +dependencies = [ + { name = "zensical" }, +] + +[package.metadata] +requires-dist = [{ name = "zensical", specifier = ">=0.0.16" }] + +[[package]] +name = "markdown" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/ab/7dd27d9d863b3376fcf23a5a13cb5d024aed1db46f963f1b5735ae43b3be/markdown-3.10.tar.gz", hash = "sha256:37062d4f2aa4b2b6b32aefb80faa300f82cc790cb949a35b8caede34f2b68c0e", size = 364931, upload-time = "2025-11-03T19:51:15.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/81/54e3ce63502cd085a0c556652a4e1b919c45a446bd1e5300e10c44c8c521/markdown-3.10-py3-none-any.whl", hash = "sha256:b5b99d6951e2e4948d939255596523444c0e677c669700b1d17aa4a8a464cb7c", size = 107678, upload-time = "2025-11-03T19:51:13.887Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pymdown-extensions" +version = "10.20" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3e/35/e3814a5b7df295df69d035cfb8aab78b2967cdf11fcfae7faed726b66664/pymdown_extensions-10.20.tar.gz", hash = "sha256:5c73566ab0cf38c6ba084cb7c5ea64a119ae0500cce754ccb682761dfea13a52", size = 852774, upload-time = "2025-12-31T19:59:42.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/10/47caf89cbb52e5bb764696fd52a8c591a2f0e851a93270c05a17f36000b5/pymdown_extensions-10.20-py3-none-any.whl", hash = "sha256:ea9e62add865da80a271d00bfa1c0fa085b20d133fb3fc97afdc88e682f60b2f", size = 268733, upload-time = "2025-12-31T19:59:40.652Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "zensical" +version = "0.0.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "deepmerge" }, + { name = "markdown" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/7a/6966350364f2b44cdea3de0fb9489d951fc280e90e622794139af0d773b7/zensical-0.0.16.tar.gz", hash = "sha256:0b759dba2454197bdbf1b133dc4ea64e8202e6757036a6ebaad7e45ec0a09db8", size = 3813582, upload-time = "2026-01-15T15:14:11.047Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/9b/de0eaac4775b53d0f7b48b99200cee59992075ff4879badcec7e8c3ee035/zensical-0.0.16-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:381f5b484128fda20f535e85a4c2acebc52d56787c872b84df577897c23e5641", size = 12041072, upload-time = "2026-01-15T15:13:38.007Z" }, + { url = "https://files.pythonhosted.org/packages/58/bd/305f0a3b2579c26969d647ae6ddef4c4c26dc73a117085d292368c52f888/zensical-0.0.16-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:5478aa0ad7e717cf6e090b485dac093429b4c47cc60051aad186485d356b99f5", size = 11926168, upload-time = "2026-01-15T15:13:40.717Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ee/df946f961389d2e6c86c20d851bc1d3d993635257572c00cdfa9beda4ded/zensical-0.0.16-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f2eddecf88baf1afa8bef7eb4a0ef3215505e9edd8283ee263ad88e76d2348c", size = 12233362, upload-time = "2026-01-15T15:13:43.25Z" }, + { url = "https://files.pythonhosted.org/packages/92/87/151dc25e592d835f299fbe6b4dec6f045ad989e2f6e9838a91624f800ea3/zensical-0.0.16-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:41929282c728a201858e9ebdc0d2c375140558c276ff0a00c57e8eaaf73ce481", size = 12203330, upload-time = "2026-01-15T15:13:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/38/37/e025bc2a118c7141419188347ddf493954332c4f77c76c6c3f23f98c85e3/zensical-0.0.16-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7628f79dbb7f26c48d4ae627dd242f6ca0c7c20d20b92c6f9a14047648802a1b", size = 12524901, upload-time = "2026-01-15T15:13:48.508Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fd/700ef889f743c691a45647dc70df4b6c2fd0040aedf0a9aec65db0d4f22d/zensical-0.0.16-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8296ea27812aa2b090d40aa70f6649b3d00246104417219d5bfaf10ae6ca6e9", size = 12294794, upload-time = "2026-01-15T15:13:51.21Z" }, + { url = "https://files.pythonhosted.org/packages/31/84/5fd15ff6241615413b23b20e7930dad61233a0cab9bc271ad43d795ba467/zensical-0.0.16-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:02807e5b7d21c8f4eb7674dfd19a50a8edaf37a8fe930c3a6e1855f89b6321df", size = 12412340, upload-time = "2026-01-15T15:13:54.361Z" }, + { url = "https://files.pythonhosted.org/packages/9b/6c/03df0daa5315119d6918c86eb042c371e7137f007e8a007dfd4b719d3a7b/zensical-0.0.16-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:349bdcf546de16732867398fa6a041dc5b4b047d4c43036ef8039a8f608c47af", size = 12471067, upload-time = "2026-01-15T15:13:57.164Z" }, + { url = "https://files.pythonhosted.org/packages/4b/53/1149dc5fb0ea29f734679fd46d43f9a6026701c933092e76f805a88ef725/zensical-0.0.16-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:32463c802ea0513d3d3bd086b1eb52ddb75c38531bb5e090efd95e0661e8160f", size = 12598360, upload-time = "2026-01-15T15:14:00.377Z" }, + { url = "https://files.pythonhosted.org/packages/4c/0c/958b07ec75ecb772998c66bcd04c2ff03eb1c331703f652280c7ef1535eb/zensical-0.0.16-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:14ad8170e0186b19f2bcfca5c422c42dbc87ff005a26388f7eca97dc1a38c1b7", size = 12530241, upload-time = "2026-01-15T15:14:03.121Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c0/4513b02227429f1be2222f9eb945229536d5e57efbc819d8588ae0825926/zensical-0.0.16-cp310-abi3-win32.whl", hash = "sha256:4fbf7d5f497f8ba95f17ebf2b39c79f53cc6d96c3b586d7b23a9c88a93d42faa", size = 11665313, upload-time = "2026-01-15T15:14:05.686Z" }, + { url = "https://files.pythonhosted.org/packages/f3/cf/890500f64ba3abe9d7a1a3d66bd353ef78ef0baba6634eafe24fa6fe6f4e/zensical-0.0.16-cp310-abi3-win_amd64.whl", hash = "sha256:fc0a0bf8231ebf6000b24853c07054b653f2a520935c7ca93a2d44b9a6a74eea", size = 11848036, upload-time = "2026-01-15T15:14:08.177Z" }, +] diff --git a/zensical.toml b/zensical.toml new file mode 100644 index 0000000..35afbff --- /dev/null +++ b/zensical.toml @@ -0,0 +1,45 @@ +[project] +site_name = "FF4j Documentation" +site_description = "Documentation for Feature Flipping for Java (ff4j)" +site_author = "Paul WILLIAMS" +site_url = "https://ff4j.github.io/docs/" +copyright = """ +Copyright © 2026 ff4j. All rights reserved. +""" + +nav = [ + { "Home" = "index.md" } + ] + +extra_css = ["stylesheets/bootstrap-grid.min.css", "stylesheets/theme.css"] + +[project.theme] +logo = "img/ff4j-logo.svg" +favicon = "img/ff4j-logo.svg" +custom_dir = "docs/overrides" +language = "en" +features = [ + "announce.dismiss", + "content.code.annotate", + "content.code.copy", + "content.code.select", + "content.footnote.tooltips", + "content.tabs.link", + "content.tooltips", + "navigation.footer", + "navigation.instant", + "navigation.instant.prefetch", + "navigation.prune", + "navigation.sections", + "navigation.tabs", + "navigation.tabs.sticky", + "navigation.top", + "navigation.tracking", + "search.highlight", + "toc.follow" +] + +[[project.theme.palette]] +scheme = "slate" +primary = "custom" +accent = "custom"