Spaces:
s
Configuration error

AZILS commited on
Commit
0ff5bc0
·
verified ·
1 Parent(s): 5e40a51

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .database/template_asset_db.json +47 -0
  2. .gitattributes +1 -0
  3. .github/CHANGE_LOG.md +34 -0
  4. .github/CODEOWNERS +6 -0
  5. .github/CODE_OF_CONDUCT.md +127 -0
  6. .github/CONTRIBUTING.md +21 -0
  7. .github/FUNDING.yml +13 -0
  8. .github/ISSUE_TEMPLATE/bug_report.yaml +99 -0
  9. .github/ISSUE_TEMPLATE/feature_request.yaml +36 -0
  10. .github/ISSUE_TEMPLATE/question.yaml +17 -0
  11. .github/SECURITY.md +28 -0
  12. .github/config.yml +21 -0
  13. .github/issue_label_bot.yaml +4 -0
  14. .github/pull_request_template.md +30 -0
  15. .github/settings.yml +190 -0
  16. .github/workflows/generate_release-changelog.yaml +33 -0
  17. .gitignore +29 -0
  18. AutoCropper_26June(WIP).ipynb +0 -0
  19. CHANGES.txt +20 -0
  20. Dockerfile +48 -0
  21. LICENSE +35 -0
  22. README-Docker.md +21 -0
  23. README.md +52 -12
  24. ShortGPT.ipynb +415 -0
  25. Tips_&_Tricks +13 -0
  26. assets/img/logo.png +0 -0
  27. automate.sh +8 -0
  28. docs/.gitignore +20 -0
  29. docs/README.md +10 -0
  30. docs/babel.config.js +3 -0
  31. docs/docs/api-key-manager.mdx +52 -0
  32. docs/docs/asset-database.mdx +88 -0
  33. docs/docs/content-translation-engine.mdx +69 -0
  34. docs/docs/content-video-engine.mdx +77 -0
  35. docs/docs/facts-short-engine.mdx +84 -0
  36. docs/docs/getting-started.mdx +59 -0
  37. docs/docs/how-to-install.mdx +121 -0
  38. docs/docusaurus.config.js +135 -0
  39. docs/package.json +51 -0
  40. docs/plugins/my-loaders/index.js +18 -0
  41. docs/plugins/tailwind-loader/index.js +19 -0
  42. docs/sidebars.js +33 -0
  43. docs/src/components/Home.js +356 -0
  44. docs/src/css/custom.css +198 -0
  45. docs/src/css/fragments.css +2275 -0
  46. docs/src/pages/index.js +17 -0
  47. docs/static/img/assets/configuration.svg +0 -0
  48. docs/static/img/assets/implementation.svg +1 -0
  49. docs/static/img/assets/scraping.svg +1 -0
  50. docs/static/img/favicon.ico +0 -0
.database/template_asset_db.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "asset_collection": {
3
+ "1": {
4
+ "_id": "local_assets",
5
+ "white_reddit_template": {
6
+ "path": "public/white_reddit_template.png",
7
+ "type": "image",
8
+ "ts": "2023-07-03 19:41:55",
9
+ "required": true
10
+ },
11
+ "subscribe-animation": {
12
+ "path": "public/subscribe-animation.mp4",
13
+ "type": "video",
14
+ "ts": "2023-07-03 21:37:53",
15
+ "required": true
16
+ }
17
+ },
18
+ "2": {
19
+ "_id": "remote_assets",
20
+ "Music joakim karud dreams": {
21
+ "type": "background music",
22
+ "url": "https://www.youtube.com/watch?v=p56gqDhUYbU",
23
+ "ts": "2023-07-05 04:35:03"
24
+ },
25
+ "Music dj quads": {
26
+ "type": "background music",
27
+ "url": "https://www.youtube.com/watch?v=uUu1NcSHg2E",
28
+ "ts": "2023-07-05 05:03:44"
29
+ },
30
+ "Car race gameplay": {
31
+ "type": "background video",
32
+ "url": "https://www.youtube.com/watch?v=gBsJA8tCeyc",
33
+ "ts": "2023-07-04 23:07:44"
34
+ },
35
+ "Minecraft jumping circuit": {
36
+ "url": "https://www.youtube.com/watch?v=Pt5_GSKIWQM",
37
+ "type": "background video",
38
+ "ts": "2023-07-07 04:13:36"
39
+ },
40
+ "Ski gameplay": {
41
+ "url": "https://www.youtube.com/watch?v=8ao1NAOVKTU",
42
+ "type": "background video",
43
+ "ts": "2023-07-07 04:54:16"
44
+ }
45
+ }
46
+ }
47
+ }
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ public/subscribe-animation.mp4 filter=lfs diff=lfs merge=lfs -text
.github/CHANGE_LOG.md ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [Unreleased]
6
+
7
+ <!--
8
+ Notes for any unreleased changes do here. When a new release is cut, move these from
9
+ the unreleased section to the section for the new release.
10
+ -->
11
+
12
+ Upcoming changes.
13
+
14
+ ### Added
15
+
16
+ ### Changed
17
+
18
+ ### Removed
19
+
20
+ ## [0.0.1] - YYYY-MM-DD
21
+
22
+ Initial Release.
23
+
24
+ ### Added
25
+
26
+ - What was added.
27
+
28
+
29
+ <!--
30
+ These Markdown anchors provide a link to the diff for each release. They should be
31
+ updated any time a new release is cut.
32
+ -->
33
+ [Unreleased]: /
34
+ [0.0.1]: /v0.0.1
.github/CODEOWNERS ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ # These owners will be the default owners for everything in
2
+ # the repo. Unless a later match takes precedence,
3
+ # @USER will be requested for
4
+ # review when someone opens a pull request.
5
+ # if you want to add more owners just write it after the demo user @DemoUser
6
+ * @RayVentura
.github/CODE_OF_CONDUCT.md ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our
6
+ community a harassment-free experience for everyone, regardless of age, body
7
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+ identity and expression, level of experience, education, socio-economic status,
9
+ nationality, personal appearance, race, religion, or sexual identity
10
+ and orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open, welcoming,
13
+ diverse, inclusive, and healthy community.
14
+
15
+ ## Our Standards
16
+
17
+ Examples of behavior that contributes to a positive environment for our
18
+ community include:
19
+
20
+ * Demonstrating empathy and kindness toward other people
21
+ * Being respectful of differing opinions, viewpoints, and experiences
22
+ * Giving and gracefully accepting constructive feedback
23
+ * Accepting responsibility and apologizing to those affected by our mistakes,
24
+ and learning from the experience
25
+ * Focusing on what is best not just for us as individuals, but for the
26
+ overall community
27
+
28
+ Examples of unacceptable behavior include:
29
+
30
+ * The use of sexualized language or imagery, and sexual attention or
31
+ advances of any kind
32
+ * Trolling, insulting or derogatory comments, and personal or political attacks
33
+ * Public or private harassment
34
+ * Publishing others' private information, such as a physical or email
35
+ address, without their explicit permission
36
+ * Other conduct which could reasonably be considered inappropriate in a
37
+ professional setting
38
+
39
+ ## Enforcement Responsibilities
40
+
41
+ Community leaders are responsible for clarifying and enforcing our standards of
42
+ acceptable behavior and will take appropriate and fair corrective action in
43
+ response to any behavior that they deem inappropriate, threatening, offensive,
44
+ or harmful.
45
+
46
+ Community leaders have the right and responsibility to remove, edit, or reject
47
+ comments, commits, code, wiki edits, issues, and other contributions that are
48
+ not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+ decisions when appropriate.
50
+
51
+ ## Scope
52
+
53
+ This Code of Conduct applies within all community spaces, and also applies when
54
+ an individual is officially representing the community in public spaces.
55
+ Examples of representing our community include using an official e-mail address,
56
+ posting via an official social media account, or acting as an appointed
57
+ representative at an online or offline event.
58
+
59
+ ## Enforcement
60
+
61
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+ reported to the community leaders responsible for enforcement.
63
+ All complaints will be reviewed and investigated promptly and fairly.
64
+
65
+ All community leaders are obligated to respect the privacy and security of the
66
+ reporter of any incident.
67
+
68
+ ## Enforcement Guidelines
69
+
70
+ Community leaders will follow these Community Impact Guidelines in determining
71
+ the consequences for any action they deem in violation of this Code of Conduct:
72
+
73
+ ### 1. Correction
74
+
75
+ **Community Impact**: Use of inappropriate language or other behavior deemed
76
+ unprofessional or unwelcome in the community.
77
+
78
+ **Consequence**: A private, written warning from community leaders, providing
79
+ clarity around the nature of the violation and an explanation of why the
80
+ behavior was inappropriate. A public apology may be requested.
81
+
82
+ ### 2. Warning
83
+
84
+ **Community Impact**: A violation through a single incident or series
85
+ of actions.
86
+
87
+ **Consequence**: A warning with consequences for continued behavior. No
88
+ interaction with the people involved, including unsolicited interaction with
89
+ those enforcing the Code of Conduct, for a specified period of time. This
90
+ includes avoiding interactions in community spaces as well as external channels
91
+ like social media. Violating these terms may lead to a temporary or
92
+ permanent ban.
93
+
94
+ ### 3. Temporary Ban
95
+
96
+ **Community Impact**: A serious violation of community standards, including
97
+ sustained inappropriate behavior.
98
+
99
+ **Consequence**: A temporary ban from any sort of interaction or public
100
+ communication with the community for a specified period of time. No public or
101
+ private interaction with the people involved, including unsolicited interaction
102
+ with those enforcing the Code of Conduct, is allowed during this period.
103
+ Violating these terms may lead to a permanent ban.
104
+
105
+ ### 4. Permanent Ban
106
+
107
+ **Community Impact**: Demonstrating a pattern of violation of community
108
+ standards, including sustained inappropriate behavior, harassment of an
109
+ individual, or aggression toward or disparagement of classes of individuals.
110
+
111
+ **Consequence**: A permanent ban from any sort of public interaction within
112
+ the community.
113
+
114
+ ## Attribution
115
+
116
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
117
+ version 2.0, available at
118
+ https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
119
+
120
+ Community Impact Guidelines were inspired by [Mozilla's code of conduct
121
+ enforcement ladder](https://github.com/mozilla/diversity).
122
+
123
+ [homepage]: https://www.contributor-covenant.org
124
+
125
+ For answers to common questions about this code of conduct, see the FAQ at
126
+ https://www.contributor-covenant.org/faq. Translations are available at
127
+ https://www.contributor-covenant.org/translations.
.github/CONTRIBUTING.md ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 🌟💻📚
2
+
3
+ ## Contributing
4
+
5
+ There are many exciting ways to contribute to ShortGPT, our AI automated content creation framework. 👏
6
+
7
+ See below for everything you can do and the processes to follow for each contribution method. Note that no matter how you contribute, your participation is governed by our ✨[Code of Conduct](CODE_OF_CONDUCT.md)✨.
8
+
9
+ ## 🛠️ Make changes to the code or docs
10
+
11
+ - 🍴 Fork the project,
12
+ - 💡 make your changes,
13
+ - 🔀 and send a pull request! 🙌
14
+
15
+ Make sure you read and follow the instructions in the [pull request template](pull_request_template.md). And note that all participation in this project (including code submissions) is governed by our ✨[Code of Conduct](CODE_OF_CONDUCT.md)✨.
16
+
17
+ ## 🐞📝 Submit bug reports or feature requests
18
+
19
+ Just use the GitHub issue tracker to submit your bug reports and feature requests. We appreciate your feedback! 🐛🔧
20
+
21
+ Let's make ShortGPT even better together! 🚀❤️
.github/FUNDING.yml ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # These are supported funding model platforms
2
+
3
+ github: rayventura
4
+ patreon: # Replace with a single Patreon username
5
+ open_collective: # Replace with a single Open Collective username
6
+ ko_fi: rayventura
7
+ tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8
+ community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9
+ liberapay: # Replace with a single Liberapay username
10
+ issuehunt: # Replace with a single IssueHunt username
11
+ otechie: # Replace with a single Otechie username
12
+ lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
13
+ custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
.github/ISSUE_TEMPLATE/bug_report.yaml ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: 🐛 Bug Report
2
+ description: File a bug report
3
+ title: '🐛 [Bug]: '
4
+ labels: ['bug']
5
+
6
+ body:
7
+ - type: markdown
8
+ attributes:
9
+ value: |
10
+ Thanks for taking the time to fill out this bug report!
11
+
12
+ - type: textarea
13
+ id: what-happened
14
+ attributes:
15
+ label: What happened?
16
+ description: Describe the issue here.
17
+ placeholder: Tell us what you see!
18
+ validations:
19
+ required: true
20
+
21
+ - type: dropdown
22
+ id: browsers
23
+ attributes:
24
+ label: What type of browser are you seeing the problem on?
25
+ multiple: true
26
+ options:
27
+ - Firefox
28
+ - Chrome
29
+ - Safari
30
+ - Microsoft Edge
31
+ validations:
32
+ required: true
33
+
34
+ - type: dropdown
35
+ id: operating-systems
36
+ attributes:
37
+ label: What type of Operating System are you seeing the problem on?
38
+ multiple: true
39
+ options:
40
+ - Linux
41
+ - Windows
42
+ - Mac
43
+ - Google Colab
44
+ - Other
45
+ validations:
46
+ required: true
47
+
48
+ - type: input
49
+ id: python-version
50
+ attributes:
51
+ label: Python Version
52
+ description: What version of Python are you using?
53
+ placeholder: e.g. Python 3.9.0
54
+ validations:
55
+ required: true
56
+
57
+ - type: input
58
+ id: application-version
59
+ attributes:
60
+ label: Application Version
61
+ description: What version of the application are you using?
62
+ placeholder: e.g. v1.2.3
63
+ validations:
64
+ required: true
65
+
66
+ - type: textarea
67
+ id: expected-behavior
68
+ attributes:
69
+ label: Expected Behavior
70
+ description: What did you expect to happen?
71
+ placeholder: What did you expect?
72
+ validations:
73
+ required: true
74
+
75
+ - type: textarea
76
+ id: error-message
77
+ attributes:
78
+ label: Error Message
79
+ description: What error message did you receive?
80
+ placeholder:
81
+ render: shell
82
+ validations:
83
+ required: false
84
+
85
+ - type: textarea
86
+ id: logs
87
+ attributes:
88
+ label: Code to produce this issue.
89
+ description: Please copy and paste any relevant code to re-produce this issue.
90
+ render: shell
91
+
92
+ - type: textarea
93
+ id: screenshots-assets
94
+ attributes:
95
+ label: Screenshots/Assets/Relevant links
96
+ description: If applicable, add screenshots, assets or any relevant links that can help understand the issue.
97
+ placeholder: Provide any relevant material here
98
+ validations:
99
+ required: false
.github/ISSUE_TEMPLATE/feature_request.yaml ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: ✨ Feature request
2
+ description: Suggest an feature / idea for this project
3
+ title: '✨ [Feature Request / Suggestion]: '
4
+ labels: ['feature']
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ We appreciate your feedback on how to improve this project. Please be sure to include as much details & any resources if possible!
10
+
11
+ - type: textarea
12
+ id: Suggestion
13
+ attributes:
14
+ label: Suggestion / Feature Request
15
+ description: Describe the feature(s) you would like to see added.
16
+ placeholder: Tell us your suggestion
17
+ validations:
18
+ required: true
19
+
20
+ - type: textarea
21
+ id: why-usage
22
+ attributes:
23
+ label: Why would this be useful?
24
+ description: Describe why this feature would be useful.
25
+ placeholder: Tell us why this would be useful to have this feature
26
+ validations:
27
+ required: false
28
+
29
+ - type: textarea
30
+ id: screenshots-assets
31
+ attributes:
32
+ label: Screenshots/Assets/Relevant links
33
+ description: If applicable, add screenshots, assets or any relevant links that can help understand the issue.
34
+ placeholder: Provide any relevant material here
35
+ validations:
36
+ required: false
.github/ISSUE_TEMPLATE/question.yaml ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: ❓ Question
2
+ description: Ask a question about this project
3
+ title: '❓ [Question]: '
4
+ labels: ['question']
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ We appreciate your interest in this project. Please be sure to include as much detail & context about your question as possible!
10
+
11
+ - type: textarea
12
+ id: Question
13
+ attributes:
14
+ label: Your Question
15
+ description: Describe your question in detail.
16
+ validations:
17
+ required: true
.github/SECURITY.md ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Security Policy
2
+
3
+ ## Supported Versions
4
+
5
+ | Version | Supported |
6
+ | ------- | ------------------ |
7
+ | 0.0.x | :x: |
8
+
9
+ ## 🔒️ Reporting a Vulnerability
10
+
11
+ If you have identified a security vulnerability in system or product please `RayVentura` with your findings. We strongly recommend using our `PGP key` to prevent this information from falling into the wrong hands.
12
+
13
+ ### Disclosure Policy
14
+
15
+ Upon receipt of a security report the following steps will be taken:
16
+
17
+ - Acknowledge your report within 48 hours, and provide a further more detailed update within 48 hours.
18
+ - Confirm the problem and determine the affected versions
19
+ - Keep you informed of the progress towards resolving the problem and notify you when the vulnerability has been fixed.
20
+ - Audit code to find any potential similar problems.
21
+ - Prepare fixes for all releases still under maintenance. These fixes will be released as fast as possible.
22
+ - Handle your report with strict confidentiality, and not pass on your personal details to third parties without your permission.
23
+
24
+ Whilst the issue is under investigation
25
+
26
+ - **Do** provide as much information as possible.
27
+ - **Do not** exploit of the vulnerability or problem you have discovered.
28
+ - **Do not** reveal the problem to others until it has been resolved.
.github/config.yml ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome
2
+
3
+ # Comment to be posted to on first time issues
4
+ newIssueWelcomeComment: >
5
+ Thanks for opening your first issue! Reports like these help improve the project!
6
+
7
+ # Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome
8
+
9
+ # Comment to be posted to on PRs from first time contributors in your repository
10
+ newPRWelcomeComment: >
11
+ Thanks for opening this pull request!
12
+
13
+ # Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge
14
+
15
+ # Comment to be posted to on pull requests merged by a first time user
16
+ firstPRMergeComment: >
17
+ Congrats on merging your first pull request!
18
+
19
+ # The keyword to find for Todo Bot issue
20
+ todo:
21
+ keyword: '@todo'
.github/issue_label_bot.yaml ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ label-alias:
2
+ bug: 'Type: Bug'
3
+ feature_request: 'Type: Feature'
4
+ question: 'Type: Question'
.github/pull_request_template.md ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## Proposed changes
2
+
3
+ Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request. If it fixes a bug or resolves a feature request, be sure to link to that issue. 👀🔧
4
+
5
+ ## Types of changes
6
+
7
+ What types of changes does your code introduce to this project?
8
+ _Put an `x` in the boxes that apply_ 😄🚀
9
+
10
+ - [ ] Bugfix (non-breaking change which fixes an issue) 🐛
11
+ - [ ] New feature (non-breaking change which adds functionality) ✨
12
+ - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) 💥
13
+ - [ ] Documentation Update (if none of the other choices apply) 📖
14
+
15
+ ## Checklist
16
+
17
+ _Put an `x` in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your code._ ✅
18
+
19
+ - [ ] I have read the CONTRIBUTING.md 📚
20
+ - [ ] I have added tests that prove my fix is effective or that my feature works ✅✔️
21
+ - [ ] I have added necessary documentation (if appropriate) 📝
22
+
23
+ ## Further comments
24
+
25
+ If this is a relatively large or complex change, kick off the discussion by explaining why you chose the solution you did and what alternatives you considered, etc... 💡❓
26
+
27
+
28
+ ## References and related issues (e.g. #1234)
29
+
30
+ N/A 📌
.github/settings.yml ADDED
@@ -0,0 +1,190 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ repository:
2
+ # See https://developer.github.com/v3/repos/#edit for all available settings.
3
+
4
+ # The name of the repository. Changing this will rename the repository
5
+ #name: repo-name
6
+
7
+ # A short description of the repository that will show up on GitHub
8
+ #description: description of repo
9
+
10
+ # A URL with more information about the repository
11
+ #homepage: https://example.github.io/
12
+
13
+ # A comma-separated list of topics to set on the repository
14
+ #topics: project, template, project-template
15
+
16
+ # Either `true` to make the repository private, or `false` to make it public.
17
+ #private: false
18
+
19
+ # Either `true` to enable issues for this repository, `false` to disable them.
20
+ has_issues: true
21
+
22
+ # Either `true` to enable the wiki for this repository, `false` to disable it.
23
+ has_wiki: true
24
+
25
+ # Either `true` to enable downloads for this repository, `false` to disable them.
26
+ #has_downloads: true
27
+
28
+ # Updates the default branch for this repository.
29
+ default_branch: stable
30
+
31
+ # Either `true` to allow squash-merging pull requests, or `false` to prevent
32
+ # squash-merging.
33
+ #allow_squash_merge: true
34
+
35
+ # Either `true` to allow merging pull requests with a merge commit, or `false`
36
+ # to prevent merging pull requests with merge commits.
37
+ #allow_merge_commit: true
38
+
39
+ # Either `true` to allow rebase-merging pull requests, or `false` to prevent
40
+ # rebase-merging.
41
+ #allow_rebase_merge: true
42
+
43
+ # Labels: define labels for Issues and Pull Requests
44
+ labels:
45
+ - name: 'Type: Bug'
46
+ color: e80c0c
47
+ description: Something isn't working as expected.
48
+
49
+ - name: 'Type: Enhancement'
50
+ color: 54b2ff
51
+ description: Suggest an improvement for an existing feature.
52
+
53
+ - name: 'Type: Feature'
54
+ color: 54b2ff
55
+ description: Suggest a new feature.
56
+
57
+ - name: 'Type: Security'
58
+ color: fbff00
59
+ description: A problem or enhancement related to a security issue.
60
+
61
+ - name: 'Type: Question'
62
+ color: 9309ab
63
+ description: Request for information.
64
+
65
+ - name: 'Type: Test'
66
+ color: ce54e3
67
+ description: A problem or enhancement related to a test.
68
+
69
+ - name: 'Status: Awaiting Review'
70
+ color: 24d15d
71
+ description: Ready for review.
72
+
73
+ - name: 'Status: WIP'
74
+ color: 07b340
75
+ description: Currently being worked on.
76
+
77
+ - name: 'Status: Waiting'
78
+ color: 38C968
79
+ description: Waiting on something else to be ready.
80
+
81
+ - name: 'Status: Stale'
82
+ color: 66b38a
83
+ description: Has had no activity for some time.
84
+
85
+ - name: 'Duplicate'
86
+ color: EB862D
87
+ description: Duplicate of another issue.
88
+
89
+ - name: 'Invalid'
90
+ color: faef50
91
+ description: This issue doesn't seem right.
92
+
93
+ - name: 'Priority: High +'
94
+ color: ff008c
95
+ description: Task is considered higher-priority.
96
+
97
+ - name: 'Priority: Low -'
98
+ color: 690a34
99
+ description: Task is considered lower-priority.
100
+
101
+ - name: 'Documentation'
102
+ color: 2fbceb
103
+ description: An issue/change with the documentation.
104
+
105
+ - name: "Won't fix"
106
+ color: C8D9E6
107
+ description: Reported issue is working as intended.
108
+
109
+ - name: '3rd party issue'
110
+ color: e88707
111
+ description: This issue might be caused by a 3rd party script/package/other reasons
112
+
113
+ - name: 'Os: Windows'
114
+ color: AEB1C2
115
+ description: Is Windows-specific
116
+
117
+ - name: 'Os: Mac'
118
+ color: AEB1C2
119
+ description: Is Mac-specific
120
+
121
+ - name: 'Os: Linux'
122
+ color: AEB1C2
123
+ description: Is Linux-specific
124
+
125
+ - name: 'Os: Google Colab'
126
+ color: AEB1C2
127
+ description: Is Google Colab-specific
128
+ #
129
+ #
130
+ # # Collaborators: give specific users access to this repository.
131
+ # # See https://developer.github.com/v3/repos/collaborators/#add-user-as-a-collaborator for available options
132
+ # collaborators:
133
+ # # - username: bkeepers
134
+ # # permission: push
135
+ # # - username: hubot
136
+ # # permission: pull
137
+
138
+ # # Note: `permission` is only valid on organization-owned repositories.
139
+ # # The permission to grant the collaborator. Can be one of:
140
+ # # * `pull` - can pull, but not push to or administer this repository.
141
+ # # * `push` - can pull and push, but not administer this repository.
142
+ # # * `admin` - can pull, push and administer this repository.
143
+ # # * `maintain` - Recommended for project managers who need to manage the repository without access to sensitive or destructive actions.
144
+ # # * `triage` - Recommended for contributors who need to proactively manage issues and pull requests without write access.
145
+
146
+ # # See https://developer.github.com/v3/teams/#add-or-update-team-repository for available options
147
+ # teams:
148
+ # - name: core
149
+ # # The permission to grant the team. Can be one of:
150
+ # # * `pull` - can pull, but not push to or administer this repository.
151
+ # # * `push` - can pull and push, but not administer this repository.
152
+ # # * `admin` - can pull, push and administer this repository.
153
+ # # * `maintain` - Recommended for project managers who need to manage the repository without access to sensitive or destructive actions.
154
+ # # * `triage` - Recommended for contributors who need to proactively manage issues and pull requests without write access.
155
+ # permission: admin
156
+ # - name: docs
157
+ # permission: push
158
+
159
+ # branches:
160
+ # - name: master
161
+ # # https://developer.github.com/v3/repos/branches/#update-branch-protection
162
+ # # Branch Protection settings. Set to null to disable
163
+ # protection:
164
+ # # Required. Require at least one approving review on a pull request, before merging. Set to null to disable.
165
+ # required_pull_request_reviews:
166
+ # # The number of approvals required. (1-6)
167
+ # required_approving_review_count: 1
168
+ # # Dismiss approved reviews automatically when a new commit is pushed.
169
+ # dismiss_stale_reviews: true
170
+ # # Blocks merge until code owners have reviewed.
171
+ # require_code_owner_reviews: true
172
+ # # Specify which users and teams can dismiss pull request reviews. Pass an empty dismissal_restrictions object to disable. User and team dismissal_restrictions are only available for organization-owned repositories. Omit this parameter for personal repositories.
173
+ # dismissal_restrictions:
174
+ # users: []
175
+ # teams: []
176
+ # # Required. Require status checks to pass before merging. Set to null to disable
177
+ # required_status_checks:
178
+ # # Required. Require branches to be up to date before merging.
179
+ # strict: true
180
+ # # Required. The list of status checks to require in order to merge into this branch
181
+ # contexts: []
182
+ # # Required. Enforce all configured restrictions for administrators. Set to true to enforce required status checks for repository administrators. Set to null to disable.
183
+ # enforce_admins: true
184
+ # # Prevent merge commits from being pushed to matching branches
185
+ # required_linear_history: true
186
+ # # Required. Restrict who can push to this branch. Team and user restrictions are only available for organization-owned repositories. Set to null to disable.
187
+ # restrictions:
188
+ # apps: []
189
+ # users: []
190
+ # teams: []
.github/workflows/generate_release-changelog.yaml ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Create Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
7
+
8
+ jobs:
9
+ build:
10
+ name: Create Release
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - name: Checkout code
14
+ uses: actions/checkout@v2
15
+ with:
16
+ fetch-depth: 0
17
+ - name: Changelog
18
+ uses: Bullrich/generate-release-changelog@master
19
+ id: Changelog
20
+ env:
21
+ REPO: ${{ github.repository }}
22
+ - name: Create Release
23
+ id: create_release
24
+ uses: actions/create-release@latest
25
+ env:
26
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
27
+ with:
28
+ tag_name: ${{ github.ref }}
29
+ release_name: Release ${{ github.ref }}
30
+ body: |
31
+ ${{ steps.Changelog.outputs.changelog }}
32
+ draft: false
33
+ prerelease: false
.gitignore ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ !*.py
2
+ !*.json
3
+ !*.yaml
4
+ !*.template
5
+ *.pyc
6
+ **/__pycache__/
7
+ test.py
8
+ public/*
9
+ !public/white_reddit_template.png
10
+ !public/subscribe-animation.mp4
11
+ z_doc/*
12
+ z_other/*
13
+ videos/*
14
+ .logs/
15
+ .editing_assets/*
16
+ .database/api_db.json
17
+ .database/content_db.json
18
+ .database/asset_db.json
19
+ flagged/
20
+ .vscode
21
+ .env
22
+ ShortGPT.egg-info
23
+ dist
24
+ build
25
+ setup
26
+ test.ipynb
27
+ .venv/
28
+ MANIFEST.in
29
+ client_secrets.json
AutoCropper_26June(WIP).ipynb ADDED
The diff for this file is too large to render. See raw diff
 
CHANGES.txt ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # CHANGES
2
+
3
+ ## Version 0.1.31
4
+ - Fixing issue in AssetDatabase, where it was copying unexisting asset template file
5
+ ## Version 0.1.3
6
+ - Requiring a youtube url as the subscribe animation url in the EditingStep.ADD_SUBSCRIBE_ANIMATION step.
7
+ - Adding a default subscribe animation youtube link by default shipped in the AssetDatabase
8
+ - Making path imports relative for gpt prompts and editing blocks and flows.
9
+ ## Version 0.1.2
10
+ - Improving logs in content engines
11
+ ## Version 0.1.1
12
+ - Adding AssetType in AssetDatabase
13
+ - Adding ApiProvider in api_db
14
+ - Fixing pip libary missing editing_framework module, prompt_template module
15
+ ## Version 0.1.0
16
+ - Fixing the AssetDatabase when it's empty
17
+ ## Version 0.0.2
18
+ - Implemented the content_translation_engine; a multilingual video dubbing content engine. The source can be found at shortGPT/engine/content_translation_engine.py.
19
+ - Implemented the new EdgeTTS voice module; it can be found at shortgpt/audio/edge_voice_module.
20
+ - Added documentation which can be found under docs/.
Dockerfile ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use an official Python runtime as the parent image
2
+ FROM python:3.11-bullseye
3
+
4
+ RUN apt-get update && apt-get install -y \
5
+ ffmpeg \
6
+ imagemagick \
7
+ ghostscript \
8
+ fonts-roboto \
9
+ cron \
10
+ && apt-get clean && rm -rf /var/lib/apt/lists/*
11
+
12
+ # Update font cache
13
+ RUN fc-cache -f -v
14
+
15
+ RUN sed -i '/<policy domain="path" rights="none" pattern="@\*"/d' /etc/ImageMagick-6/policy.xml
16
+
17
+ # Clean up APT when done
18
+ RUN apt-get clean && rm -rf /var/lib/apt/lists/*
19
+
20
+ # Set the working directory in the container to /app
21
+ WORKDIR /app
22
+
23
+ # Install any Python packages specified in requirements.txt
24
+ # Copy requirements file
25
+ COPY requirements.txt .
26
+
27
+ # Install dependencies
28
+ RUN pip install -r requirements.txt --no-cache-dir
29
+
30
+ # Copy the local package directory content into the container at /app
31
+ COPY . /app
32
+
33
+ EXPOSE 31415
34
+
35
+ # Define any environment variables
36
+ # ENV KEY Value
37
+
38
+ # Print environment variables (for debugging purposes, you can remove this line if not needed)
39
+ RUN ["printenv"]
40
+
41
+ # Add cron job
42
+ RUN echo "0 */1 * * * /bin/bash /app/automate.sh" > /etc/cron.d/automate
43
+ RUN chmod 0644 /etc/cron.d/automate
44
+ RUN crontab /etc/cron.d/automate
45
+ RUN touch /var/log/cron.log
46
+
47
+ # Run Python script when the container launches
48
+ CMD cron && tail -f /var/log/cron.log
LICENSE ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ShortGPT License
2
+
3
+ Depending on the type of your legal entity, you are granted permission to use ShortGPT for your project. Individuals and small companies are allowed to use ShortGPT to create videos for free (even commercial), while a company license is required for for-profit organizations of a certain size. This two-tier system was designed to ensure funding for this project while still allowing the source code to be available and the program to be free for most. Read below for the exact terms of use.
4
+
5
+ Free license
6
+ Company license
7
+
8
+ Free license
9
+
10
+ Copyright © 2023 ShortGPT
11
+ Eligibility
12
+
13
+ You are eligible to use ShortGPT for free if you are:
14
+
15
+ an individual
16
+ a for-profit organization with a gross revenue up to 314 159$ a year.
17
+ a non-profit or not-for-profit organization
18
+ evaluating whether ShortGPT is a good fit, and are not yet using it in a commercial way
19
+
20
+ Allowed use cases
21
+
22
+ Permission is hereby granted, free of charge, to any person eligible for the "Free license", to use the software non-commercially or commercially for the purpose of creating videos and images and to modify the software to their own liking, for the purpose of fulfilling their custom use case or to contribute bug fixes or improvements back to ShortGPT.
23
+ Disallowed use cases
24
+
25
+ It is not allowed to copy or modify ShortGPT code for the purpose of selling, renting, licensing, relicensing, or sublicensing your own derivate of ShortGPT.
26
+ Warranty notice
27
+
28
+ The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement. In no event shall the author or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software.
29
+ Support
30
+
31
+ Support is provided on a best-we-can-do basis via GitHub Issues and Discord.
32
+ Company license
33
+
34
+ You are required to obtain a company license to use ShortGPT if you are not within the group of entities eligible for a free license. This license will enable you to use ShortGPT for the allowed use cases specified in the free license, and give you access to prioritized support.
35
+ We will deduct 10% of the revenue generated from ShortGPT as part of the payment for the company license.
README-Docker.md ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # To run ShortGPT docker:
2
+
3
+
4
+ First make a .env file with the API keys like this:
5
+
6
+ ```bash
7
+ OPENAI_API_KEY=sk-_put_your_openai_api_key_here
8
+ ELEVENLABS_API_KEY=put_your_eleven_labs_api_key_here
9
+ PEXELS_API_KEY=put_your_pexels_api_key_here
10
+ ```
11
+
12
+
13
+ To run Dockerfile do this:
14
+ ```bash
15
+ docker build -t short_gpt_docker:latest .
16
+ docker run -p 31415:31415 --env-file .env short_gpt_docker:latest
17
+ ```
18
+ Export Docker image:
19
+ ```bash
20
+ docker save short_gpt_docker > short_gpt_docker.tar
21
+ ```
README.md CHANGED
@@ -1,12 +1,52 @@
1
- ---
2
- title: S
3
- emoji: 💻
4
- colorFrom: blue
5
- colorTo: yellow
6
- sdk: gradio
7
- sdk_version: 4.36.1
8
- app_file: app.py
9
- pinned: false
10
- ---
11
-
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### Upload Automation
2
+
3
+ 1. Authentication (client-secrets.json from Google API console)
4
+ - Head to the Google API Console at https://console.cloud.google.com/ and create a project.
5
+ - In the marketplace (search bar), find 'YouTube v3 API' and enable it.
6
+ - After redirect, click on Oauth Screen and create.
7
+ - Add google.com as the authorized domain.
8
+ - Add scopes for the YouTube v3 API.
9
+ - Add the channel's email as the test user (in most cases, the email the channel was registered with).
10
+ - Create Credentials (OAuth Client ID) in the Credentials Menu and select Web App.
11
+ - For Authorized Redirect URIs, use:
12
+ 1. http://localhost:8080
13
+ 2. http://localhost:8080/
14
+ 3. http://localhost:8090
15
+ 4. http://localhost:8090/
16
+ - Finish up with downloading the .JSON file and put it inside this repository's directory.
17
+
18
+
19
+ 2. Oauth2.json (within the repo itself)
20
+
21
+ - Once a valid `client_secrets.json` is present in the directory, run `python3 upload.py` and follow further instructions. After successful authentication, an `oauth2.json` file will be created inside the directory.
22
+
23
+
24
+ > Note: You can avoid quota bottlenecks by stacking up projects in the google console and repeat steps before
25
+
26
+ 3. Automation
27
+
28
+ Once valid oauth2 credentials exist in the directory you can let this run 100% on autopilot.
29
+
30
+ - `ultra.py` is the main script to direct the video production pipeling
31
+ - `upload.py` sets the backbone for youtube's v3 api to upload to YouTube without further authentification
32
+ - `final_upload.py` combines the finsished product and uploads it to YouTube (title, description, tags get parsed automatically)
33
+
34
+ Just craft your own bash script or use `automate.sh`
35
+
36
+
37
+ ### Upgrades
38
+ - access YouTube as provider of video assets, surpassing stock footage by large
39
+ - avoids bans by using download streams with PyTube
40
+ - avoids YouTube v3 API's rate limit and auth
41
+ - avoids Pexels hard rate limit
42
+
43
+ ### Features
44
+
45
+
46
+ Inside `api_utils` functions provide utility for working with different APIs. Files: `image_api.py`, `pexels_api.py`, `youtube_api.py` and `eleven_api.py`. We added `youtube_api.py` to source video assets directly from YouTube. Feel free to modify `the _generateVideoUrls` function for the hierachy of video asset sources.
47
+
48
+ - #### `search_videos_YouTube(query_string)`
49
+
50
+ The search_videos_YouTube function takes a query string as input and searches for a video on YouTube based on that query. It returns the URL of the first search result if found, or None if no video is found.
51
+
52
+ Integration of `shortGPT.api_utils.youtube_api`, which serves as an additional source for gathering footage based on the queried keyword. This is particularly useful when dealing with niche / comedy / meme topics where stock footage is not available. If nothing matches we backtrack to the pexels API.
ShortGPT.ipynb ADDED
@@ -0,0 +1,415 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "metadata": {
7
+ "id": "zC32SDJxrOsM",
8
+ "cellView": "form"
9
+ },
10
+ "outputs": [],
11
+ "source": [
12
+ "#@markdown <center><h3><h2>ShortGPT</h2>Install Requirements. This is 1 Click Run App to create Short Videos</h3></center><br>\n",
13
+ "# 📦 Install ImageMagick and ffmpeg\n",
14
+ "!sudo apt-get install imagemagick\n",
15
+ "!sudo apt-get install ffmpeg\n",
16
+ "\n",
17
+ "# 📝 Fix Imagemagick policy.xml bug in linux using MoviePy\n",
18
+ "!sed -i '/<policy domain=\"path\" rights=\"none\" pattern=\"@\\*\"/d' /etc/ImageMagick-6/policy.xml\n",
19
+ "\n",
20
+ "import os\n",
21
+ "if not os.path.exists('/content/ShortGPT'):\n",
22
+ " # 📂 Clone the ShortGPT repository\n",
23
+ " !git clone https://github.com/enterprisium/ShortGPT.git\n",
24
+ " %cd /content/ShortGPT/\n",
25
+ "else:\n",
26
+ " %cd /content/ShortGPT/\n",
27
+ " # If the directory already exists, just pull the latest version\n",
28
+ " !git pull\n",
29
+ "# 🚀 Change directory to ShortGPT\n",
30
+ "\n",
31
+ "# 🛠️ Install required Python packages\n",
32
+ "!pip install -r requirements.txt"
33
+ ]
34
+ },
35
+ {
36
+ "cell_type": "code",
37
+ "source": [
38
+ "# Import necessary modules from ShortGPT\n",
39
+ "from shortGPT.config.api_db import ApiKeyManager, ApiProvider\n",
40
+ "from shortGPT.config.asset_db import AssetDatabase, AssetType\n",
41
+ "from shortGPT.engine.facts_short_engine import FactsShortEngine\n",
42
+ "from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule\n",
43
+ "from shortGPT.audio.coqui_voice_module import CoquiVoiceModule\n",
44
+ "from shortGPT.audio.eleven_voice_module import ElevenLabsVoiceModule # Add this line to import ElevenLabsVoiceModule\n",
45
+ "from shortGPT.config.languages import Language, EDGE_TTS_VOICENAME_MAPPING\n",
46
+ "from shortGPT.config.languages import LANGUAGE_ACRONYM_MAPPING, Language\n",
47
+ "import random\n",
48
+ "\n",
49
+ "# Load API keys from environment variables or hardcoded values\n",
50
+ "OPENAI_API = \"\" # @param {type:\"string\"}\n",
51
+ "ELEVEN_LABS_API = \"\" # @param {type:\"string\"}\n",
52
+ "PEXELS_API = \"\" # @param {type:\"string\"}\n",
53
+ "\n",
54
+ "# Configuration parameters\n",
55
+ "NUM_OF_SHORTS = 1 # @param {type:\"integer\"}\n",
56
+ "TYPE_OF_SHORTS = \"Astrophotography and Space Facts: Combine stunning visuals of the night sky with fascinating space facts, catering to the curiosity of viewers interested in astronomy.\" # @param {type:\"string\"}\n",
57
+ "TTS_ENGINE = \"ElevenLabs\" # @param [\"Edge TTS\", \"ElevenLabs\", \"Coqui TTS\"]\n",
58
+ "LANGUAGE = \"English\" # @param [\"English\", \"Spanish\", \"French\", \"Arabic\", \"German\", \"Polish\", \"Italian\", \"Portuguese\", \"Afrikaans\", \"Amharic\", \"Azerbaijani\", \"Bulgarian\", \"Bengali\", \"Bosnian\", \"Catalan\", \"Czech\", \"Welsh\", \"Danish\", \"Greek\", \"Estonian\", \"Persian\", \"Finnish\", \"Filipino\", \"Galician\", \"Gujarati\", \"Hebrew\", \"Hindi\", \"Croatian\", \"Hungarian\", \"Indonesian\", \"Icelandic\", \"Japanese\", \"Javanese\", \"Georgian\", \"Kazakh\", \"Khmer\", \"Kannada\", \"Korean\", \"Lao\", \"Lithuanian\", \"Latvian\", \"Macedonian\", \"Malayalam\", \"Mongolian\", \"Marathi\", \"Malay\", \"Maltese\", \"Myanmar\", \"Norwegian\", \"Nepali\", \"Dutch\", \"Norwegian Bokmål\", \"Norwegian Nynorsk\", \"Pashto\", \"Romanian\", \"Russian\", \"Sinhala\", \"Slovak\", \"Slovenian\", \"Somali\", \"Albanian\", \"Serbian\", \"Sundanese\", \"Swedish\", \"Swahili\", \"Tamil\", \"Telugu\", \"Thai\", \"Turkish\", \"Ukrainian\", \"Urdu\", \"Uzbek\", \"Vietnamese\", \"Chinese\", \"Zulu\"]\n",
59
+ "VOICE_NAME = \"Antoni\" # @param ['Rachel', 'Drew', 'Clyde', 'Paul', 'Domi', 'Dave', 'Fin', 'Sarah', 'Antoni', 'Thomas', 'Charlie', 'George', 'Emily', 'Elli', 'Callum', 'Patrick', 'Harry', 'Liam', 'Dorothy', 'Josh', 'Arnold', 'Charlotte', 'Matilda', 'Matthew', 'James', 'Joseph', 'Jeremy', 'Michael', 'Ethan', 'Gigi', 'Freya', 'Grace', 'Daniel', 'Lily', 'Serena', 'Adam', 'Nicole', 'Bill', 'Jessie', 'Sam', 'Glinda', 'Giovanni', 'Mimi', 'Claribel Dervla', 'Daisy Studious', 'Gracie Wise', 'Tammie Ema', 'Alison Dietlinde', 'Ana Florence', 'Annmarie Nele', 'Asya Anara', 'Brenda Stern', 'Gitta Nikolina', 'Henriette Usha', 'Sofia Hellen', 'Tammy Grit', 'Tanja Adelina', 'Vjollca Johnnie', 'Andrew Chipper', 'Badr Odhiambo', 'Dionisio Schuyler', 'Royston Min', 'Viktor Eka', 'Abrahan Mack', 'Adde Michal', 'Baldur Sanjin', 'Craig Gutsy', 'Damien Black', 'Gilberto Mathias', 'Ilkin Urbano', 'Kazuhiko Atallah', 'Ludvig Milivoj', 'Suad Qasim', 'Torcull Diarmuid', 'Viktor Menelaos', 'Zacharie Aimilios', 'Nova Hogarth', 'Maja Ruoho', 'Uta Obando', 'Barbora MacLean', 'Alexandra Hisakawa', 'Alma María', 'Rosemary Okafor', 'Ige Behringer', 'Filip Traverse', 'Damjan Chapman', 'Wulf Carlevaro', 'Aaron Dreschner', 'Kumar Dahl', 'Eugenio Mataracı', 'Ferran Simen', 'Xavier Hayasaka', 'Luis Moray', 'Marcos Rudaski']\n",
60
+ "USE_IMAGE = 10 # @param {type:\"integer\"}\n",
61
+ "WATERMARK = \"\" # @param {type:\"string\"}\n",
62
+ "BG_VIDEO = \"Ski gameplay\" # @param {type:\"string\"}\n",
63
+ "BG_MUSIC = \"Music joakim karud dreams\" # @param {type:\"string\"}\n",
64
+ "FONT_STYLE = Anta-Regular.ttf # @param [\"Arial-Bold\", \"Roboto-Regular\", \"Times New Roman\"] # New parameter for font style\n",
65
+ "\n",
66
+ "# Set the API keys for different services\n",
67
+ "ApiKeyManager.set_api_key(ApiProvider.OPENAI, OPENAI_API)\n",
68
+ "ApiKeyManager.set_api_key(ApiProvider.ELEVEN_LABS, ELEVEN_LABS_API)\n",
69
+ "ApiKeyManager.set_api_key(ApiProvider.PEXELS, PEXELS_API)\n",
70
+ "\n",
71
+ "def select_voice_module(tts_engine, language, voice):\n",
72
+ " if tts_engine == \"Edge TTS\":\n",
73
+ " voice_name = EDGE_TTS_VOICENAME_MAPPING[Language[language.upper()]]['male'] # Defaulting to male if specific voice not handled\n",
74
+ " return EdgeTTSVoiceModule(voice_name)\n",
75
+ " elif tts_engine == \"ElevenLabs\":\n",
76
+ " return ElevenLabsVoiceModule(api_key=ELEVEN_LABS_API, voiceName=voice)\n",
77
+ " elif tts_engine == \"Coqui TTS\":\n",
78
+ " language_code = LANGUAGE_ACRONYM_MAPPING.get(Language[language.upper()], 'en') # Default to 'en' if not found\n",
79
+ " return CoquiVoiceModule(voiceName=voice, language=language_code)\n",
80
+ " else:\n",
81
+ " raise ValueError(\"Unsupported TTS Engine\")\n",
82
+ "\n",
83
+ "# Correctly select the voice module based on the TTS_ENGINE parameter\n",
84
+ "try:\n",
85
+ " voice_module = select_voice_module(TTS_ENGINE, LANGUAGE, VOICE_NAME)\n",
86
+ "except ValueError as e:\n",
87
+ " print(f\"Error selecting voice module: {e}\")\n",
88
+ " # Fallback to a default voice module if error occurs\n",
89
+ " voice_module = EdgeTTSVoiceModule(EDGE_TTS_VOICENAME_MAPPING[Language.ENGLISH]['male'])\n",
90
+ "\n",
91
+ "# Configure the Content Engine with FONT_STYLE parameter\n",
92
+ "content_engine = FactsShortEngine(\n",
93
+ " voiceModule=voice_module,\n",
94
+ " facts_type=TYPE_OF_SHORTS,\n",
95
+ " background_video_name=BG_VIDEO,\n",
96
+ " background_music_name=BG_MUSIC,\n",
97
+ " num_images=USE_IMAGE,\n",
98
+ " watermark=WATERMARK,\n",
99
+ " language=Language[LANGUAGE.upper()],\n",
100
+ ")\n",
101
+ "\n",
102
+ "# Generate Content\n",
103
+ "try:\n",
104
+ " for step_num, step_logs in content_engine.makeContent():\n",
105
+ " print(f\"Step {step_num}: {step_logs}\")\n",
106
+ "except Exception as e:\n",
107
+ " print(f\"An error occurred: {e}\")\n",
108
+ "\n",
109
+ "# Get Video Output Path\n",
110
+ "print(content_engine.get_video_output_path())"
111
+ ],
112
+ "metadata": {
113
+ "cellView": "form",
114
+ "id": "JkG0Os0aJMqF"
115
+ },
116
+ "execution_count": null,
117
+ "outputs": []
118
+ },
119
+ {
120
+ "cell_type": "code",
121
+ "source": [
122
+ "#@markdown <center><h2>Script To Video</h2>Make Sure To Select ElevenLabs Or Edge TTS Only</h3></center><br>\n",
123
+ "# Import necessary modules from the ShortGPT framework\n",
124
+ "from shortGPT.config.api_db import ApiKeyManager, ApiProvider\n",
125
+ "from shortGPT.config.asset_db import AssetDatabase, AssetType\n",
126
+ "from shortGPT.engine.content_video_engine import ContentVideoEngine\n",
127
+ "from shortGPT.config.languages import Language, EDGE_TTS_VOICENAME_MAPPING\n",
128
+ "from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule\n",
129
+ "from shortGPT.audio.eleven_voice_module import ElevenLabsVoiceModule\n",
130
+ "from shortGPT.audio.coqui_voice_module import CoquiVoiceModule\n",
131
+ "\n",
132
+ "# Load API keys from hardcoded values - Consider using environment variables for better security\n",
133
+ "OPENAI_KEY = \"\" # @param {type:\"string\"}\n",
134
+ "ELEVEN_KEY = \"\" # @param {type:\"string\"}\n",
135
+ "PEXELS_KEY = \"\" # @param {type:\"string\"}\n",
136
+ "\n",
137
+ "# Set API Keys\n",
138
+ "ApiKeyManager.set_api_key(ApiProvider.OPENAI, OPENAI_KEY)\n",
139
+ "ApiKeyManager.set_api_key(ApiProvider.ELEVEN_LABS, ELEVEN_KEY)\n",
140
+ "ApiKeyManager.set_api_key(ApiProvider.PEXELS, PEXELS_KEY)\n",
141
+ "\n",
142
+ "# Add Assets\n",
143
+ "AssetDatabase.add_remote_asset('chill music', AssetType.BACKGROUND_MUSIC, \"https://www.youtube.com/watch?v=uUu1NcSHg2E\")\n",
144
+ "\n",
145
+ "# Function to select the voice module based on user preference\n",
146
+ "def select_voice_module(tts_engine, language, voice):\n",
147
+ " if tts_engine == \"Edge TTS\":\n",
148
+ " voice_name = EDGE_TTS_VOICENAME_MAPPING[Language[language.upper()]]['male'] # Defaulting to male if specific voice not handled\n",
149
+ " return EdgeTTSVoiceModule(voice_name)\n",
150
+ " elif tts_engine == \"ElevenLabs\":\n",
151
+ " if language not in eleven_labs_languages or voice not in eleven_labs_voices:\n",
152
+ " raise ValueError(f\"Selected language '{language}' or voice '{voice}' is not supported by ElevenLabs. Supported languages are: {', '.join(eleven_labs_languages)}. Supported voices are: {', '.join(eleven_labs_voices)}.\")\n",
153
+ " return ElevenLabsVoiceModule(api_key=ELEVEN_KEY, voiceName=voice)\n",
154
+ " elif tts_engine == \"Coqui TTS\":\n",
155
+ " if language not in coqui_tts_languages or voice not in coqui_tts_voices:\n",
156
+ " raise ValueError(f\"Selected language '{language}' or voice '{voice}' is not supported by Coqui TTS. Supported languages are: {', '.join(coqui_tts_languages)}. Supported voices are: {', '.join(coqui_tts_voices)}.\")\n",
157
+ " return CoquiVoiceModule(voiceName=voice, language=language)\n",
158
+ " else:\n",
159
+ " raise ValueError(\"Unsupported TTS Engine\")\n",
160
+ "\n",
161
+ "# Configure the Voice Module\n",
162
+ "TEXT_TO_SPEECH = \"Edge TTS\" # @param [\"Edge TTS\", \"ElevenLabs\", \"Coqui TTS\"]\n",
163
+ "LANGUAGE = \"English\" # @param [\"English\", \"Spanish\", \"French\", \"Arabic\", \"German\", \"Polish\", \"Italian\", \"Portuguese\"]\n",
164
+ "VOICE = \"Damjan Chapman\" # @param ['Rachel', 'Drew', 'Clyde', 'Paul', 'Domi', 'Dave', 'Fin', 'Sarah', 'Antoni', 'Thomas', 'Charlie', 'George', 'Emily', 'Elli', 'Callum', 'Patrick', 'Harry', 'Liam', 'Dorothy', 'Josh', 'Arnold', 'Charlotte', 'Matilda', 'Matthew', 'James', 'Joseph', 'Jeremy', 'Michael', 'Ethan', 'Gigi', 'Freya', 'Grace', 'Daniel', 'Lily', 'Serena', 'Adam', 'Nicole', 'Bill', 'Jessie', 'Sam', 'Glinda', 'Giovanni', 'Mimi', 'Claribel Dervla', 'Daisy Studious', 'Gracie Wise', 'Tammie Ema', 'Alison Dietlinde', 'Ana Florence', 'Annmarie Nele', 'Asya Anara', 'Brenda Stern', 'Gitta Nikolina', 'Henriette Usha', 'Sofia Hellen', 'Tammy Grit', 'Tanja Adelina', 'Vjollca Johnnie', 'Andrew Chipper', 'Badr Odhiambo', 'Dionisio Schuyler', 'Royston Min', 'Viktor Eka', 'Abrahan Mack', 'Adde Michal', 'Baldur Sanjin', 'Craig Gutsy', 'Damien Black', 'Gilberto Mathias', 'Ilkin Urbano', 'Kazuhiko Atallah', 'Ludvig Milivoj', 'Suad Qasim', 'Torcull Diarmuid', 'Viktor Menelaos', 'Zacharie Aimilios', 'Nova Hogarth', 'Maja Ruoho', 'Uta Obando', 'Barbora MacLean', 'Alexandra Hisakawa', 'Alma María', 'Rosemary Okafor', 'Ige Behringer', 'Filip Traverse', 'Damjan Chapman', 'Wulf Carlevaro', 'Aaron Dreschner', 'Kumar Dahl', 'Eugenio Mataracı', 'Ferran Simen', 'Xavier Hayasaka', 'Luis Moray', 'Marcos Rudaski']\n",
165
+ "try:\n",
166
+ " voice_module = select_voice_module(TEXT_TO_SPEECH, LANGUAGE, VOICE)\n",
167
+ "except ValueError as e:\n",
168
+ " print(f\"Error selecting voice module: {e}\")\n",
169
+ " # Fallback to a default voice module if error occurs\n",
170
+ " voice_module = EdgeTTSVoiceModule(EDGE_TTS_VOICENAME_MAPPING[Language.ENGLISH]['male'])\n",
171
+ "\n",
172
+ "# Prepare the script\n",
173
+ "SCRIPT = \"\\\"Artificial intelligence (AI) is revolutionizing our world in surprising ways. Robots and virtual assistants help us in our daily tasks and simplify our lives. In medicine, AI enables more accurate diagnoses and advances in treatments. In the automotive industry, autonomous vehicles are changing the way we get around. However, questions arise about the impact on employment and the ethics of its use. Despite the challenges, AI promises an exciting future full of possibilities. Are we ready to embrace this technological advancement?\" # @param {type:\"string\"}\n",
174
+ "\n",
175
+ "# Configure Content Engine\n",
176
+ "content_engine = ContentVideoEngine(voice_module, SCRIPT, background_music_name='chill music', language=Language[LANGUAGE.upper()])\n",
177
+ "\n",
178
+ "# Generate Content with error handling\n",
179
+ "try:\n",
180
+ " for step_num, step_logs in content_engine.makeContent():\n",
181
+ " print(f\"Step {step_num}: {step_logs}\")\n",
182
+ "except Exception as e:\n",
183
+ " print(f\"Error generating content: {e}\")\n",
184
+ "\n",
185
+ "# Get Video Output Path\n",
186
+ "print(\"Video Output Path:\", content_engine.get_video_output_path())"
187
+ ],
188
+ "metadata": {
189
+ "cellView": "form",
190
+ "id": "lBqNgUmbacdF"
191
+ },
192
+ "execution_count": null,
193
+ "outputs": []
194
+ },
195
+ {
196
+ "cell_type": "code",
197
+ "source": [
198
+ "# Import necessary modules from the ShortGPT framework\n",
199
+ "from shortGPT.config.api_db import ApiKeyManager, ApiProvider\n",
200
+ "from shortGPT.config.asset_db import AssetDatabase, AssetType\n",
201
+ "from shortGPT.engine.content_video_engine import ContentVideoEngine\n",
202
+ "from shortGPT.config.languages import Language, EDGE_TTS_VOICENAME_MAPPING, LANGUAGE_ACRONYM_MAPPING\n",
203
+ "from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule\n",
204
+ "from shortGPT.audio.eleven_voice_module import ElevenLabsVoiceModule\n",
205
+ "from shortGPT.audio.coqui_voice_module import CoquiVoiceModule\n",
206
+ "\n",
207
+ "# Load API keys from hardcoded values - Consider using environment variables for better security\n",
208
+ "OPENAI_KEY = \"\" # @param {type:\"string\"}\n",
209
+ "ELEVEN_KEY = \"\" # @param {type:\"string\"}\n",
210
+ "PEXELS_KEY = \"\" # @param {type:\"string\"}\n",
211
+ "\n",
212
+ "# Set API Keys\n",
213
+ "ApiKeyManager.set_api_key(ApiProvider.OPENAI, OPENAI_KEY)\n",
214
+ "ApiKeyManager.set_api_key(ApiProvider.ELEVEN_LABS, ELEVEN_KEY)\n",
215
+ "ApiKeyManager.set_api_key(ApiProvider.PEXELS, PEXELS_KEY)\n",
216
+ "\n",
217
+ "# Add Assets\n",
218
+ "AssetDatabase.add_remote_asset('chill music', AssetType.BACKGROUND_MUSIC, \"https://www.youtube.com/watch?v=uUu1NcSHg2E\")\n",
219
+ "\n",
220
+ "# Function to select the voice module based on user preference\n",
221
+ "def select_voice_module(tts_engine, language, voice):\n",
222
+ " if tts_engine == \"Edge TTS\":\n",
223
+ " voice_name = EDGE_TTS_VOICENAME_MAPPING[Language[language.upper()]]['male'] # Defaulting to male if specific voice not handled\n",
224
+ " return EdgeTTSVoiceModule(voice_name)\n",
225
+ " elif tts_engine == \"ElevenLabs\":\n",
226
+ " # Assuming eleven_labs_languages and eleven_labs_voices are defined elsewhere\n",
227
+ " return ElevenLabsVoiceModule(api_key=ELEVEN_KEY, voiceName=voice)\n",
228
+ " elif tts_engine == \"Coqui TTS\":\n",
229
+ " language_code = LANGUAGE_ACRONYM_MAPPING.get(Language[language.upper()], 'en') # Default to 'en' if not found\n",
230
+ " return CoquiVoiceModule(voiceName=voice, language=language_code)\n",
231
+ " else:\n",
232
+ " raise ValueError(\"Unsupported TTS Engine\")\n",
233
+ "\n",
234
+ "# Configure the Voice Module\n",
235
+ "TEXT_TO_SPEECH = \"Coqui TTS\" # @param [\"Edge TTS\", \"ElevenLabs\", \"Coqui TTS\"]\n",
236
+ "LANGUAGE = \"Hindi\" # @param [\"English\", \"Hindi\", \"French\", \"Arabic\", \"Urdu\", \"Roman Urdu\", \"Italian\", \"Portuguese\"]\n",
237
+ "VOICE = \"Damjan Chapman\" # @param ['Rachel', 'Drew', 'Clyde', 'Paul', 'Domi', 'Dave', 'Fin', 'Sarah', 'Antoni', 'Thomas', 'Charlie', 'George', 'Emily', 'Elli', 'Callum', 'Patrick', 'Harry', 'Liam', 'Dorothy', 'Josh', 'Arnold', 'Charlotte', 'Matilda', 'Matthew', 'James', 'Joseph', 'Jeremy', 'Michael', 'Ethan', 'Gigi', 'Freya', 'Grace', 'Daniel', 'Lily', 'Serena', 'Adam', 'Nicole', 'Bill', 'Jessie', 'Sam', 'Glinda', 'Giovanni', 'Mimi', 'Claribel Dervla', 'Daisy Studious', 'Gracie Wise', 'Tammie Ema', 'Alison Dietlinde', 'Ana Florence', 'Annmarie Nele', 'Asya Anara', 'Brenda Stern', 'Gitta Nikolina', 'Henriette Usha', 'Sofia Hellen', 'Tammy Grit', 'Tanja Adelina', 'Vjollca Johnnie', 'Andrew Chipper', 'Badr Odhiambo', 'Dionisio Schuyler', 'Royston Min', 'Viktor Eka', 'Abrahan Mack', 'Adde Michal', 'Baldur Sanjin', 'Craig Gutsy', 'Damien Black', 'Gilberto Mathias', 'Ilkin Urbano', 'Kazuhiko Atallah', 'Ludvig Milivoj', 'Suad Qasim', 'Torcull Diarmuid', 'Viktor Menelaos', 'Zacharie Aimilios', 'Nova Hogarth', 'Maja Ruoho', 'Uta Obando', 'Barbora MacLean', 'Alexandra Hisakawa', 'Alma María', 'Rosemary Okafor', 'Ige Behringer', 'Filip Traverse', 'Damjan Chapman', 'Wulf Carlevaro', 'Aaron Dreschner', 'Kumar Dahl', 'Eugenio Mataracı', 'Ferran Simen', 'Xavier Hayasaka', 'Luis Moray', 'Marcos Rudaski']\n",
238
+ "# Prepare the script\n",
239
+ "SCRIPT = \"SCRIPT = \\\"एक समय की बात है, जब पृथ्वी पर जीवन की शुरुआत हुई थी। इस ग्रह पर एक अनोखी प्रजाति ने अपने कदम रखे, जिसे हम मानव कहते हैं। यह कहानी है उस मानव जाति की, जिसने समय के साथ अपने जीवन को नई दिशा दी। शुरुआत में, मानव जंगलों और गुफाओं में रहते थे। उनका जीवन संघर्षों से भरा था। उन्होंने आग की खोज की, जिससे उनके जीवन में एक नई रोशनी आई। आग ने उन्हें ठंड से बचाया और खाना पकाने का तरीका सिखाया। समय के साथ, मानव ने खेती की शुरुआत की। उन्होंने अनाज उगाना शुरू किया और पशुओं को पालना सीखा। इससे उनके जीवन में स्थिरता आई और समाज का विकास हुआ। फिर आया सभ्यताओं का युग। मानव ने ��दियों के किनारे बस्तियाँ बसाईं और विशाल साम्राज्यों की नींव रखी। उन्होंने लिपि का आविष्कार किया, जिससे ज्ञान का संचार हुआ। विज्ञान, कला, और साहित्य के क्षेत्र में उन्होंने अद्भुत कार्य किए। लेकिन मानव इतिहास में संघर्ष भी रहे। युद्ध, महामारी, और प्राकृतिक आपदाओं ने मानवता की परीक्षा ली। फिर भी, मानव ने कभी हार नहीं मानी। उन्होंने हर बार उठकर एक नई शुरुआत की। आज, हम एक ऐसे युग में हैं, जहाँ तकनीकी ने हमारे जीवन को बदल दिया है। हमने चाँद पर कदम रखा है और अंतरिक्ष की गहराइयों को छूने की कोशिश की है। यह कहानी हमें याद दिलाती है कि मानव जाति का इतिहास संघर्ष और विजय की कहानी है। हमारी यात्रा अद्भुत रही है, और हमारा भविष्य अभी भी लिखा जा रहा है। हमें अपने पूर्वजों की विरासत को आगे बढ़ा\" # @param {type:\"string\"}\n",
240
+ "\n",
241
+ "try:\n",
242
+ " voice_module = select_voice_module(TEXT_TO_SPEECH, LANGUAGE, VOICE)\n",
243
+ "except ValueError as e:\n",
244
+ " print(f\"Error selecting voice module: {e}\")\n",
245
+ " # Fallback to a default voice module if error occurs\n",
246
+ " voice_module = EdgeTTSVoiceModule(EDGE_TTS_VOICENAME_MAPPING[Language.ENGLISH]['male'])\n",
247
+ "\n",
248
+ "# Prepare the script\n",
249
+ "SCRIPT = \"\\\"Artificial intelligence (AI) is revolutionizing our world in surprising ways. Robots and virtual assistants help us in our daily tasks and simplify our lives. In medicine, AI enables more accurate diagnoses and advances in treatments. In the automotive industry, autonomous vehicles are changing the way we get around. However, questions arise about the impact on employment and the ethics of its use. Despite the challenges, AI promises an exciting future full of possibilities. Are we ready to embrace this technological advancement?\"\n",
250
+ "\n",
251
+ "# Configure Content Engine\n",
252
+ "content_engine = ContentVideoEngine(voice_module, SCRIPT, background_music_name='chill music', language=Language[LANGUAGE.upper()])\n",
253
+ "\n",
254
+ "# Generate Content with error handling\n",
255
+ "try:\n",
256
+ " for step_num, step_logs in content_engine.makeContent():\n",
257
+ " print(f\"Step {step_num}: {step_logs}\")\n",
258
+ "except Exception as e:\n",
259
+ " print(f\"Error generating content: {e}\")\n",
260
+ "\n",
261
+ "# Get Video Output Path\n",
262
+ "print(\"Video Output Path:\", content_engine.get_video_output_path())"
263
+ ],
264
+ "metadata": {
265
+ "colab": {
266
+ "base_uri": "https://localhost:8080/"
267
+ },
268
+ "cellView": "form",
269
+ "id": "s8eBfDIO6Ayl",
270
+ "outputId": "b54a9d5f-aa05-47f6-c195-9e1b2812fa92"
271
+ },
272
+ "execution_count": null,
273
+ "outputs": [
274
+ {
275
+ "output_type": "stream",
276
+ "name": "stdout",
277
+ "text": [
278
+ " > tts_models/multilingual/multi-dataset/xtts_v2 is already downloaded.\n",
279
+ "Error selecting voice module: Expecting value: line 1 column 1 (char 0)\n",
280
+ "Step 1: Current step (1 / 10) : _generateTempAudio\n",
281
+ "Step 2: Current step (2 / 10) : _speedUpAudio\n",
282
+ "Step 3: Current step (3 / 10) : _timeCaptions\n",
283
+ "Importing the dtw module. When using in academic works please cite:\n",
284
+ " T. Giorgino. Computing and Visualizing Dynamic Time Warping Alignments in R: The dtw Package.\n",
285
+ " J. Stat. Soft., doi:10.18637/jss.v031.i07.\n",
286
+ "\n"
287
+ ]
288
+ },
289
+ {
290
+ "output_type": "stream",
291
+ "name": "stderr",
292
+ "text": [
293
+ "100%|███████████████████████████████████████| 139M/139M [00:03<00:00, 39.6MiB/s]\n"
294
+ ]
295
+ },
296
+ {
297
+ "output_type": "stream",
298
+ "name": "stdout",
299
+ "text": [
300
+ "Detected language: English\n"
301
+ ]
302
+ },
303
+ {
304
+ "output_type": "stream",
305
+ "name": "stderr",
306
+ "text": [
307
+ "100%|██████████| 396/396 [00:00<00:00, 858.28frames/s]\n"
308
+ ]
309
+ },
310
+ {
311
+ "output_type": "stream",
312
+ "name": "stdout",
313
+ "text": [
314
+ "Step 4: Current step (4 / 10) : _generateVideoSearchTerms\n",
315
+ "Expecting value: line 1 column 1 (char 0)\n",
316
+ "not the right format\n",
317
+ "Expecting value: line 1 column 1 (char 0)\n",
318
+ "not the right format\n",
319
+ "Expecting value: line 1 column 1 (char 0)\n",
320
+ "not the right format\n",
321
+ "Expecting value: line 1 column 1 (char 0)\n",
322
+ "not the right format\n",
323
+ "Expecting value: line 1 column 1 (char 0)\n",
324
+ "not the right format\n",
325
+ "Expecting value: line 1 column 1 (char 0)\n",
326
+ "not the right format\n",
327
+ "Expecting value: line 1 column 1 (char 0)\n",
328
+ "not the right format\n",
329
+ "Step 5: Current step (5 / 10) : _generateVideoUrls\n",
330
+ "Step 6: Current step (6 / 10) : _chooseBackgroundMusic\n",
331
+ "\u001b[KStep 7: Current step (7 / 10) : _prepareBackgroundAssets\n",
332
+ "Step 8: Current step (8 / 10) : _prepareCustomAssets\n",
333
+ "Step 9: Current step (9 / 10) : Preparing rendering assets...\n"
334
+ ]
335
+ },
336
+ {
337
+ "output_type": "stream",
338
+ "name": "stderr",
339
+ "text": [
340
+ "\n",
341
+ "\u001b[A\n",
342
+ "100%|██████████| 68.0/68.0 [09:58<00:00, 8.80s/iB]\u001b[A\n",
343
+ "\u001b[A\n",
344
+ "100%|██████████| 68.0/68.0 [09:58<00:00, 8.80s/iB]\u001b[A"
345
+ ]
346
+ },
347
+ {
348
+ "output_type": "stream",
349
+ "name": "stdout",
350
+ "text": [
351
+ "Moviepy - Building video .editing_assets/general_video_assets/d497348cbfcb418d835889a4/rendered_video.mp4.\n",
352
+ "MoviePy - Writing audio in rendered_videoTEMP_MPY_wvf_snd.mp4\n"
353
+ ]
354
+ },
355
+ {
356
+ "output_type": "stream",
357
+ "name": "stderr",
358
+ "text": [
359
+ "\n",
360
+ "\u001b[A\n",
361
+ "100%|██████████| 68.0/68.0 [09:58<00:00, 8.80s/iB]\u001b[A\n",
362
+ "\u001b[A\n",
363
+ "100%|██████████| 68.0/68.0 [09:58<00:00, 8.80s/iB]\u001b[A"
364
+ ]
365
+ },
366
+ {
367
+ "output_type": "stream",
368
+ "name": "stdout",
369
+ "text": [
370
+ "MoviePy - Done.\n",
371
+ "Moviepy - Writing video .editing_assets/general_video_assets/d497348cbfcb418d835889a4/rendered_video.mp4\n",
372
+ "\n"
373
+ ]
374
+ },
375
+ {
376
+ "output_type": "stream",
377
+ "name": "stderr",
378
+ "text": [
379
+ "\n",
380
+ "\u001b[A\n",
381
+ "100%|██████████| 68.0/68.0 [10:05<00:00, 8.90s/iB]\u001b[A\n",
382
+ "\u001b[A\n",
383
+ "100%|██████████| 68.0/68.0 [10:05<00:00, 8.90s/iB]\u001b[A"
384
+ ]
385
+ },
386
+ {
387
+ "output_type": "stream",
388
+ "name": "stdout",
389
+ "text": [
390
+ "Moviepy - Done !\n",
391
+ "Moviepy - video ready .editing_assets/general_video_assets/d497348cbfcb418d835889a4/rendered_video.mp4\n",
392
+ "Step 10: Current step (10 / 10) : _addMetadata\n",
393
+ "Video Output Path: videos/2024-02-28_21-37-54 - The Future of AI Boon or Bane .mp4\n"
394
+ ]
395
+ }
396
+ ]
397
+ }
398
+ ],
399
+ "metadata": {
400
+ "colab": {
401
+ "provenance": [],
402
+ "gpuType": "T4"
403
+ },
404
+ "kernelspec": {
405
+ "display_name": "Python 3",
406
+ "name": "python3"
407
+ },
408
+ "language_info": {
409
+ "name": "python"
410
+ },
411
+ "accelerator": "GPU"
412
+ },
413
+ "nbformat": 4,
414
+ "nbformat_minor": 0
415
+ }
Tips_&_Tricks ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ How to change the color, font and size of subtitles?
2
+
3
+ 1. Go To "\shortGPT\editing_framework\editing_steps"
4
+ 2. Look For The Following file: "-make_caption.json" & "-make_caption_landscape.json"
5
+ 3. look for"
6
+
7
+ ""color": "white",
8
+ "stroke_color": "black", "
9
+
10
+ Change them to
11
+
12
+ "color": "transparent",
13
+ "stroke_color": "transparent",
assets/img/logo.png ADDED
automate.sh ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ log=$(date +%s)
4
+ rm *.log
5
+ python ultra.py >> $log.log &&
6
+ python final_upload.py >> $log.log &&
7
+
8
+ echo "run"
docs/.gitignore ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Dependencies
2
+ /node_modules
3
+
4
+ # Production
5
+ /build
6
+
7
+ # Generated files
8
+ .docusaurus
9
+ .cache-loader
10
+
11
+ # Misc
12
+ .DS_Store
13
+ .env.local
14
+ .env.development.local
15
+ .env.test.local
16
+ .env.production.local
17
+
18
+ npm-debug.log*
19
+ yarn-debug.log*
20
+ yarn-error.log*
docs/README.md ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ # ShortGPT Documentation
2
+ # Installation
3
+
4
+ 1. `yarn install` in the root of this repository (two level above this directory).
5
+ 1. In this directory, do `yarn start`.
6
+ 1. A browser window will open up, pointing to the docs.
7
+
8
+ # Deployment
9
+
10
+ Vercel handles the deployment of this website.
docs/babel.config.js ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ module.exports = {
2
+ presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
3
+ };
docs/docs/api-key-manager.mdx ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: ApiKeyManager in ShortGPT
3
+ sidebar_label: ApiKeyManager
4
+ ---
5
+
6
+ # ApiKeyManager in ShortGPT
7
+
8
+ ApiKeyManager is a class in the ShortGPT framework that manages the API keys for different providers. It interacts with the database to get and set API keys.
9
+
10
+ ## Importing ApiKeyManager
11
+
12
+ ```python
13
+ from shortGPT.config.api_db import ApiKeyManager, ApiProvider
14
+ ```
15
+
16
+ ## Using ApiKeyManager
17
+
18
+ ApiKeyManager provides two main methods: `get_api_key` and `set_api_key`.
19
+
20
+ ### set_api_key
21
+
22
+ This method is used to set the API key for a specific provider in the database. It takes two arguments: the key (provider name) and the value (API key).
23
+
24
+ ```python
25
+ ApiKeyManager.set_api_key(ApiProvider.OPENAI, "your_openai_key")
26
+ ApiKeyManager.set_api_key(ApiProvider.ELEVEN_LABS, "your_eleven_labs_key")
27
+ ```
28
+
29
+ In the above example, we are setting the API keys for OPENAI and ELEVEN_LABS.
30
+
31
+ ### get_api_key
32
+
33
+ This method is used to retrieve the API key for a specific provider from the database. It takes one argument: the key (provider name).
34
+
35
+ ```python
36
+ openai_key = ApiKeyManager.get_api_key(ApiProvider.OPENAI)
37
+ eleven_labs_key = ApiKeyManager.get_api_key(ApiProvider.ELEVEN_LABS)
38
+ ```
39
+ In the above example, we are retrieving the API keys for OPENAI and ELEVEN_LABS.
40
+
41
+ ## Note
42
+
43
+ The `key` argument in both methods can either be a string or an instance of the `ApiProvider` enum. If it is an instance of `ApiProvider`, the `value` attribute of the enum instance will be used as the key.
44
+
45
+ ```python
46
+ ApiKeyManager.set_api_key("OPENAI", "your_openai_key")
47
+ ApiKeyManager.set_api_key("ELEVEN LABS", "your_eleven_labs_key")
48
+
49
+ openai_key = ApiKeyManager.get_api_key("OPENAI")
50
+ eleven_labs_key = ApiKeyManager.get_api_key("ELEVEN LABS")
51
+ ```
52
+ In the above example, we are setting and retrieving the API keys using string keys instead of `ApiProvider` instances.
docs/docs/asset-database.mdx ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: AssetDatabase in ShortGPT
3
+ sidebar_label: AssetDatabase
4
+ ---
5
+
6
+ # AssetDatabase in ShortGPT
7
+
8
+ The `AssetDatabase` in ShortGPT is a powerful tool that allows you to manage both local and remote assets. This guide will provide you with examples of how to use the `AssetDatabase`.
9
+
10
+ ## Importing AssetDatabase and AssetType
11
+
12
+ ```python
13
+ from shortGPT.config.asset_db import AssetDatabase, AssetType
14
+ ```
15
+
16
+ ## Adding Assets
17
+
18
+ You can add both remote and local assets to the `AssetDatabase`.
19
+
20
+ ### Adding Remote Assets
21
+
22
+ ```python
23
+ AssetDatabase.add_remote_asset("minecraft background cube", AssetType.BACKGROUND_VIDEO, "https://www.youtube.com/watch?v=Pt5_GSKIWQM")
24
+ AssetDatabase.add_remote_asset('chill music', AssetType.BACKGROUND_MUSIC, "https://www.youtube.com/watch?v=uUu1NcSHg2E")
25
+ ```
26
+
27
+ ### Adding Local Assets
28
+
29
+ ```python
30
+ AssetDatabase.add_local_asset('my_music', AssetType.AUDIO, "./my_music.wav")
31
+ ```
32
+
33
+ ## Asset Types
34
+
35
+ The `AssetType` enum is used to specify the type of asset being added to the `AssetDatabase`. The available asset types are:
36
+
37
+ - VIDEO
38
+ - AUDIO
39
+ - IMAGE
40
+ - BACKGROUND_MUSIC
41
+ - BACKGROUND_VIDEO
42
+ - OTHER
43
+
44
+ ## Getting Asset Information
45
+
46
+ You can retrieve information about an asset using the following methods:
47
+
48
+ ### Get Asset Duration
49
+
50
+ This method returns the duration in seconds of a video or audio asset. If the asset is neither video nor audio, it returns `None`.
51
+
52
+ ```python
53
+ AssetDatabase.get_asset_duration('minecraft background cube')
54
+ ```
55
+
56
+ ### Get Asset Link
57
+
58
+ This method returns a source URL, or the path of the resource. If the asset is a YouTube video or audio, it uses `yt-dlp` to extract a download URL or a direct video/audio link.
59
+
60
+ ```python
61
+ AssetDatabase.get_asset_link('minecraft background cube')
62
+ ```
63
+
64
+ ## Synchronizing Local Assets
65
+
66
+ The `sync_local_assets` method synchronizes the database with local assets found in the `/public` folder. If it doesn't find one, it doesn't do anything.
67
+
68
+ ```python
69
+ AssetDatabase.sync_local_assets()
70
+ ```
71
+
72
+ ## Removing Assets
73
+
74
+ You can remove an asset from the database by providing its name to the `remove_asset` method.
75
+
76
+ ```python
77
+ AssetDatabase.remove_asset('name')
78
+ ```
79
+
80
+ ## Getting Database State
81
+
82
+ You can get the state of the asset database as a pandas dataframe using the `get_df` method.
83
+
84
+ ```python
85
+ AssetDatabase.get_df()
86
+ ```
87
+
88
+ This method returns a dataframe that includes the name, type, link, source, and timestamp of each asset in the database.
docs/docs/content-translation-engine.mdx ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: ContentTranslationEngine
3
+ sidebar_label: ContentTranslationEngine
4
+ ---
5
+
6
+ The `ContentTranslationEngine` in ShortGPT is a powerful tool that automates the process of translating video content. This guide will provide you with an overview of how to use the `ContentTranslationEngine`.
7
+
8
+ ## Importing ContentTranslationEngine
9
+
10
+ ```python
11
+ from shortGPT.engine.content_translation_engine import ContentTranslationEngine
12
+ ```
13
+
14
+ ## Initializing ContentTranslationEngine
15
+
16
+ The `ContentTranslationEngine` requires a `VoiceModule`, a source URL (either a local video file path or a YouTube link), a target language, and an optional flag indicating whether to use captions for translation.
17
+
18
+ ```python
19
+ content_engine = ContentTranslationEngine(voice_module, src_url, target_language, use_captions=False)
20
+ ```
21
+
22
+ ## Example
23
+
24
+ ```python
25
+ from shortGPT.config.api_db import ApiKeyManager, ApiProvider
26
+ from shortGPT.engine.content_translation_engine import ContentTranslationEngine
27
+ from shortGPT.config.languages import Language
28
+ from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule, EDGE_TTS_VOICENAME_MAPPING
29
+
30
+ # Set API Keys
31
+ ApiKeyManager.set_api_key(ApiProvider.OPENAI, "your_openai_key")
32
+ ApiKeyManager.set_api_key(ApiProvider.ELEVEN_LABS, "your_eleven_labs_key")
33
+
34
+ # Configure the Voice Module
35
+ voice_name = EDGE_TTS_VOICENAME_MAPPING[Language.SPANISH]['male']
36
+ voice_module = EdgeTTSVoiceModule(voice_name)
37
+
38
+ # Configure Content Engine
39
+ src_url = "https://www.youtube.com/watch?v=QQz5hj8y1TE"
40
+ target_language = Language.SPANISH
41
+ use_captions = False
42
+ content_engine = ContentTranslationEngine(voice_module, src_url, target_language, use_captions)
43
+
44
+ # Generate Content
45
+ for step_num, step_logs in content_engine.makeContent():
46
+ print(f" {step_logs}")
47
+
48
+ # Get Video Output Path
49
+ print(content_engine.get_video_output_path())
50
+ ```
51
+
52
+ ## How ContentTranslationEngine Works
53
+
54
+ The `ContentTranslationEngine` works by executing a series of steps defined in the `stepDict` dictionary. Each step is a method that performs a specific task in the video translation process. Here's what each step does:
55
+
56
+ 1. `_transcribe_audio`: Transcribes the audio from the source video
57
+ 2. `_translate_content`: Translates the transcribed content from the source language to the target language.
58
+ 3. `_generate_translated_audio`: Generates translated audio using the translated content and the specified `VoiceModule`.
59
+ 4. `_edit_and_render_video`: Edits and renders the translated video.
60
+ 5. `_add_metadata`: Adds metadata to the translated video.
61
+
62
+ ## Providing a Source URL
63
+
64
+ The `ContentTranslationEngine` requires a source URL, which can be either a local video file path or a YouTube link for a youtube Video, or a Youtube Shorts. The engine uses this source URL to retrieve the audio and video content for translation.
65
+
66
+ ## Using Captions for Translation
67
+
68
+ Set the `use_captions` flag to `True` to see text captions on the video generated that are timed with the audio voice.
69
+
docs/docs/content-video-engine.mdx ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: ContentVideoEngine
3
+ sidebar_label: ContentVideoEngine
4
+ ---
5
+
6
+ The `ContentVideoEngine` in ShortGPT is a powerful tool that encapsulates all the automation required to create a video. This guide will provide you with an overview of how to use the `ContentVideoEngine`.
7
+
8
+ ## Importing ContentVideoEngine
9
+
10
+ ```python
11
+ from shortGPT.engine.content_video_engine import ContentVideoEngine
12
+ ```
13
+
14
+ ## Initializing ContentVideoEngine
15
+
16
+ The `ContentVideoEngine` requires a `VoiceModule`, a script, and optionally a background music name, a watermark (string with the name of your channel / brand), a flag indicating whether the video you want is in vertical format, and a language.
17
+
18
+ ```python
19
+ content_engine = ContentVideoEngine(voice_module, script, background_music_name="", watermark=None, isVerticalFormat=False, language=Language.ENGLISH)
20
+ ```
21
+ ## Example
22
+
23
+ ```python
24
+ from shortGPT.config.api_db import ApiKeyManager, ApiProvider
25
+ from shortGPT.config.asset_db import AssetDatabase, AssetType
26
+ from shortGPT.engine.content_video_engine import ContentVideoEngine
27
+ from shortGPT.config.languages import Language
28
+ from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule, EDGE_TTS_VOICENAME_MAPPING
29
+
30
+ # Set API Keys
31
+ ApiKeyManager.set_api_key(ApiProvider.OPENAI, "your_openai_key")
32
+ ApiKeyManager.set_api_key(ApiProvider.PEXELS, "your_pexels_key")
33
+
34
+ # Add Assets
35
+ AssetDatabase.add_remote_asset('chill music', AssetType.BACKGROUND_MUSIC, "https://www.youtube.com/watch?v=uUu1NcSHg2E")
36
+
37
+ # Configure the Voice Module
38
+ voice_name = EDGE_TTS_VOICENAME_MAPPING[Language.SPANISH]['male']
39
+ voice_module = EdgeTTSVoiceModule(voice_name)
40
+
41
+ # Prepare the script
42
+ script = "La inteligencia artificial (IA) está revolucionando nuestro mundo de manera sorprendente. Los robots y asistentes virtuales nos ayudan en nuestras tareas diarias y simplifican nuestra vida. En la medicina, la IA permite diagnósticos más precisos y avances en tratamientos. En la industria automotriz, los vehículos autónomos están cambiando la forma en que nos desplazamos. Sin embargo, surgen interrogantes sobre el impacto en el empleo y la ética de su uso. A pesar de los desafíos, la IA promete un futuro emocionante y lleno de posibilidades. ¿Estamos preparados para abrazar este avance tecnológico?"
43
+
44
+ # Configure Content Engine
45
+ content_engine = ContentVideoEngine(voice_module, script, background_music_name='chill music', language=Language.SPANISH)
46
+
47
+ # Generate Content
48
+ for step_num, step_logs in content_engine.makeContent():
49
+ print(f" {step_logs}")
50
+
51
+ # Get Video Output Path
52
+ print(content_engine.get_video_output_path())
53
+ ```
54
+
55
+ In this example, we first set the API keys for OpenAI, and Pexels. We then add a remote asset for background music. We configure the voice module to use EdgeTTS for voice synthesis. We prepare a script for the video and then configure the `ContentVideoEngine` with the voice module, script, and background music. We then generate the content and print the output path of the video.
56
+ ## How ContentVideoEngine Works
57
+
58
+ The `ContentVideoEngine` works by executing a series of steps defined in the `stepDict` dictionary. Each step is a method that performs a specific task in the video creation process. Here's what each step does:
59
+
60
+ 1. `_generateTempAudio`: Generates a temporary audio file from the provided script using the specified `VoiceModule`.
61
+ 2. `_speedUpAudio`: Speeds up the generated audio file to match the pace of a typical video.
62
+ 3. `_timeCaptions`: Generates timed captions for the video based on the script.
63
+ 4. `_generateVideoSearchTerms`: Generates search terms to find relevant videos on Pexels based on the script.
64
+ 5. `_generateVideoUrls`: Retrieves video URLs from Pexels using the generated search terms.
65
+ 6. `_chooseBackgroundMusic`: Chooses background music for the video.
66
+ 7. `_prepareBackgroundAssets`: Prepares the background assets for the video.
67
+ 8. `_prepareCustomAssets`: Prepares any custom assets for the video.
68
+ 9. `_editAndRenderShort`: Edits and renders the video.
69
+ 10. `_addMetadata`: Adds metadata to the video.
70
+
71
+ ## Using Pexels API
72
+
73
+ The `ContentVideoEngine` sources video assets from the Pexels API. To use it, you need to provide your Pexels API key. The engine uses this key to retrieve relevant videos based on the search terms generated from the script.
74
+
75
+ ## Providing a Script
76
+
77
+ The `ContentVideoEngine` requires a script to generate the video. The script is used to generate the audio, captions, and search terms for sourcing videos from Pexels. The script should be a string containing the narration for the video.
docs/docs/facts-short-engine.mdx ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: FactsShortEngine
3
+ sidebar_label: FactsShortEngine
4
+ ---
5
+
6
+ The `FactsShortEngine` in ShortGPT is a content engine specifically designed for generating short videos that present interesting facts. This guide will provide you with an overview of how to use the `FactsShortEngine`.
7
+
8
+ ## Importing FactsShortEngine
9
+
10
+ ```python
11
+ from shortGPT.engine.facts_short_engine import FactsShortEngine
12
+ ```
13
+
14
+ ## Initializing FactsShortEngine
15
+
16
+ The `FactsShortEngine` requires a `VoiceModule`, the type of facts you want to generate, a background video name, a background music name, the number of images to include in the video, a watermark (string with the name of your channel / brand), and a language.
17
+
18
+ ```python
19
+ content_engine = FactsShortEngine(voice_module, facts_type, background_video_name, background_music_name, num_images=None, watermark=None, language=Language.ENGLISH)
20
+ ```
21
+
22
+ ## Example
23
+
24
+ ```python
25
+ from shortGPT.config.api_db import ApiKeyManager, ApiProvider
26
+ from shortGPT.config.asset_db import AssetDatabase, AssetType
27
+ from shortGPT.engine.facts_short_engine import FactsShortEngine
28
+ from shortGPT.config.languages import Language
29
+ from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule, EDGE_TTS_VOICENAME_MAPPING
30
+
31
+ # Set API Keys
32
+ ApiKeyManager.set_api_key(ApiProvider.OPENAI, "your_openai_key")
33
+
34
+ # Add Assets
35
+ AssetDatabase.add_remote_asset("minecraft background cube", AssetType.BACKGROUND_VIDEO, "https://www.youtube.com/watch?v=Pt5_GSKIWQM")
36
+ AssetDatabase.add_remote_asset('chill music', AssetType.BACKGROUND_MUSIC, "https://www.youtube.com/watch?v=uUu1NcSHg2E")
37
+
38
+ # Configure the Voice Module
39
+ voice_name = EDGE_TTS_VOICENAME_MAPPING[Language.GERMAN]['male']
40
+ voice_module = EdgeTTSVoiceModule(voice_name)
41
+
42
+ # Configure Content Engine
43
+ facts_video_topic = "Interesting scientific facts from the 19th century"
44
+ content_engine = FactsShortEngine(voice_module=voice_module,
45
+ facts_type=facts_video_topic,
46
+ background_video_name="minecraft background cube", # <--- use the same name you saved in the AssetDatabase
47
+ background_music_name='chill music', # <--- use the same name you saved in the AssetDatabase
48
+ num_images=5, # If you don't want images in your video, put 0 or None
49
+ language=Language.GERMAN)
50
+
51
+ # Generate Content
52
+ for step_num, step_logs in content_engine.makeContent():
53
+ print(f" {step_logs}")
54
+
55
+ # Get Video Output Path
56
+ print(content_engine.get_video_output_path())
57
+ ```
58
+
59
+ In this example, we first set the API keys for OpenAI. We then add remote assets for the background video and background music. We configure the voice module to use EdgeTTS for voice synthesis. We configure the `FactsShortEngine` with the voice module, facts type, background video name, background music name, number of images, and language. We then generate the content and print the output path of the video.
60
+
61
+ ## How FactsShortEngine Works
62
+
63
+ The `FactsShortEngine` works by executing a series of steps defined in the `stepDict` dictionary. Each step is a method that performs a specific task in the video creation process. Here's what each step does:
64
+
65
+ 1. `_generateScript`: Generates the script for the facts short using the provided `facts_type`.
66
+ 2. `_generateTempAudio`: Generates a temporary audio file from the generated script using the specified `VoiceModule`.
67
+ 3. `_speedUpAudio`: Speeds up the generated audio file to match the pace of a typical video.
68
+ 4. `_timeCaptions`: Generates timed captions for the video based on the script.
69
+ 5. `_generateImageSearchTerms`: Generates search terms to find relevant images using the Bing search engine based on the script.
70
+ 6. `_generateImageUrls`: Retrieves image URLs from Bing using the generated search terms.
71
+ 7. `_chooseBackgroundMusic`: Chooses background music for the video.
72
+ 8. `_chooseBackgroundVideo`: Chooses a background video for the video.
73
+ 9. `_prepareBackgroundAssets`: Prepares the background assets for the video.
74
+ 10. `_prepareCustomAssets`: Prepares any custom assets for the video.
75
+ 11. `_editAndRenderShort`: Edits and renders the video.
76
+ 12. `_addYoutubeMetadata`: Adds metadata to the video.
77
+
78
+
79
+ ## Providing a Facts Type
80
+
81
+ The `FactsShortEngine` requires a facts type to generate the script. The facts type should be a string indicating the specific category or topic of facts you want to include in the video.
82
+
83
+
84
+ That's it! You have now successfully generated a facts short video using the FactsShortEngine in the ShortGPT framework.
docs/docs/getting-started.mdx ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: ShortGPT Hello World Example
3
+ sidebar_label: ShortGPT Hello World Example
4
+ ---
5
+ # ShortGPT Hello World Example
6
+
7
+ This guide provides a basic example of how to use the shortGPT framework. ShortGPT encapsulates the entire process of content automation into `content engines`. In this example, we'll show you how to instantiate the FactsShortEngine, which will automate the production of the "Interesting Facts" niche of Shorts.
8
+
9
+ ## Prerequisites
10
+
11
+ Before you start, make sure you have [followed the installation steps](./how-to-install) and have your API keys ready.
12
+
13
+ ## Code
14
+
15
+ ```python
16
+ from shortGPT.config.api_db import ApiKeyManager, ApiProvider
17
+ from shortGPT.config.asset_db import AssetDatabase, AssetType
18
+ from shortGPT.engine.facts_short_engine import FactsShortEngine
19
+ from shortGPT.audio.eleven_voice_module import ElevenLabsVoiceModule
20
+ from shortGPT.config.languages import Language
21
+ from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule, EDGE_TTS_VOICENAME_MAPPING
22
+
23
+ # Set API Keys
24
+ ApiKeyManager.set_api_key(ApiProvider.OPENAI, "your_openai_key")
25
+ ApiKeyManager.set_api_key(ApiProvider.ELEVEN_LABS, "your_eleven_labs_key")
26
+
27
+ # Add Assets
28
+ AssetDatabase.add_remote_asset("minecraft background cube", AssetType.BACKGROUND_VIDEO, "https://www.youtube.com/watch?v=Pt5_GSKIWQM")
29
+ AssetDatabase.add_remote_asset('chill music', AssetType.BACKGROUND_MUSIC, "https://www.youtube.com/watch?v=uUu1NcSHg2E")
30
+ AssetDatabase.add_local_asset('my_music', AssetType.AUDIO, "./my_music.wav")
31
+
32
+ USE_ELEVEN_LABS = False
33
+ # Configure the ElevenLabs Voice Module
34
+ if USE_ELEVEN_LABS:
35
+ eleven_labs_key = ApiKeyManager.get_api_key(ApiProvider.ELEVEN_LABS)
36
+ voice_module = ElevenLabsVoiceModule(api_key = eleven_labs_key, voiceName="Antoni")
37
+ else:
38
+ ## You can also use the EdgeTTS for Free voice synthesis
39
+ voice_name = EDGE_TTS_VOICENAME_MAPPING[Language.GERMAN]['male']
40
+ voice_module = EdgeTTSVoiceModule(voice_name)
41
+
42
+ # Configure Content Engine
43
+ facts_video_topic = "Interesting scientific facts from the 19th century"
44
+ content_engine = FactsShortEngine(voiceModule=voice_module,
45
+ facts_type=facts_video_topic,
46
+ background_video_name="minecraft background cube", # <--- use the same name you saved in the AssetDatabase
47
+ background_music_name='chill music', # <--- use the same name you saved in the AssetDatabase
48
+ num_images=5, # If you don't want images in your video, put 0 or None
49
+ language=Language.GERMAN)
50
+
51
+ # Generate Content
52
+ for step_num, step_logs in content_engine.makeContent():
53
+ print(f" {step_logs}")
54
+
55
+ # Get Video Output Path
56
+ print(content_engine.get_video_output_path())
57
+ ```
58
+
59
+ That's it! You have now successfully generated your first content using the shortGPT framework.
docs/docs/how-to-install.mdx ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Step-by-Step Guide to Installing ShortGPT
3
+ sidebar_label: Installation Guide
4
+ ---
5
+ import Tabs from '@theme/Tabs';
6
+ import TabItem from '@theme/TabItem';
7
+
8
+ # Launching Your ShortGPT Experience
9
+
10
+ This guide will walk you through the process of setting up your machine to run the **ShortGPT** library. The setup requires two key components, ImageMagick and FFmpeg. Follow the steps below to get these dependencies installed.
11
+
12
+ ## Before You Begin
13
+
14
+ Make sure you have the following installed on your machine:
15
+
16
+ - Python 3.x
17
+ - Pip (Python package installer)
18
+
19
+ ## Installation Process
20
+
21
+ Here are the steps to install ImageMagick, FFmpeg, and the ShortGPT library.
22
+
23
+ <Tabs groupId="operating-systems">
24
+ <TabItem value="win" label="Windows">
25
+
26
+ ### Step 1: Install ImageMagick
27
+
28
+ ImageMagick is a crucial component for ShortGPT. Download the installer from the official ImageMagick website. Click on the link below to get started.
29
+
30
+ > **[👉 Download ImageMagick Here 👈](https://imagemagick.org/script/download.php)**
31
+
32
+ After downloading, follow the installation instructions provided on the website.
33
+
34
+ ### Step 2: Install FFmpeg (Essential for ShortGPT)
35
+
36
+ FFmpeg is another key component for ShortGPT. Download the FFmpeg binaries from the link below:
37
+
38
+ > **[👉 Download FFmpeg Here (click on
39
+ FFmpeg_Full.msi ) 👈](https://github.com/icedterminal/ffmpeg-installer/releases/tag/6.0.0.20230306)**
40
+
41
+ The download will include ffmpeg and ffprobe and will add it to your path. Follow the installation instructions as guided.
42
+ <details open>
43
+ <summary><b>Step 3: Install ShortGPT Library</b></summary>
44
+
45
+ - Open a terminal or command prompt.
46
+ - Execute the following command:
47
+
48
+ ```bash
49
+ pip install --upgrade shortgpt
50
+ ```
51
+
52
+ </details>
53
+
54
+ </TabItem>
55
+
56
+ <TabItem value="mac" label="macOS">
57
+
58
+ ### Step 1: Install ImageMagick
59
+
60
+ Run the command below in your command line:
61
+
62
+ ```bash
63
+ brew install imagemagick
64
+ ```
65
+
66
+ ### Step 2: Install FFmpeg (Essential for ShortGPT)
67
+
68
+ Run the command below in your command line:
69
+
70
+ ```bash
71
+ brew install ffmpeg
72
+ ```
73
+
74
+ <details open>
75
+ <summary><b>Step 3: Install ShortGPT Library</b></summary>
76
+
77
+ - Open a terminal or command prompt.
78
+ - Execute the following command:
79
+
80
+ ```bash
81
+ pip install --upgrade shortgpt
82
+ ```
83
+
84
+ </details>
85
+
86
+ </TabItem>
87
+
88
+ <TabItem value="ubuntu" label="Ubuntu/Debian-based systems">
89
+
90
+ ### Step 1: Install ImageMagick
91
+
92
+ Execute the following command:
93
+
94
+ ```bash
95
+ sudo apt-get install imagemagick
96
+ ```
97
+
98
+ ### Step 2: Install FFmpeg
99
+
100
+ Execute the following command:
101
+
102
+ ```bash
103
+ sudo apt-get install ffmpeg
104
+ ```
105
+
106
+ <details open>
107
+ <summary><b>Step 3: Install ShortGPT Library</b></summary>
108
+
109
+ - Open a terminal or command prompt.
110
+ - Execute the following command:
111
+
112
+ ```bash
113
+ pip install --upgrade shortgpt
114
+ ```
115
+
116
+ </details>
117
+
118
+ </TabItem>
119
+ </Tabs>
120
+
121
+ And there you have it! Your machine is now ready to run ShortGPT. Dive into the world of automated video content creation with ShortGPT!
docs/docusaurus.config.js ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* eslint-disable @typescript-eslint/no-var-requires */
2
+ const darkCodeTheme = require('prism-react-renderer/themes/dracula');
3
+ const lightCodeTheme = require('prism-react-renderer/themes/github');
4
+
5
+ // With JSDoc @type annotations, IDEs can provide config autocompletion
6
+ /** @type {import('@docusaurus/types').DocusaurusConfig} */
7
+ (
8
+ module.exports = {
9
+ title: 'ShortGPT',
10
+ tagline:
11
+ 'Open-Source Framework for AI content automation',
12
+ url: 'https://dev.shortgpt.ai',
13
+ baseUrl: '/',
14
+ favicon: 'img/favicon.ico',
15
+ organizationName: 'RayVentura',
16
+ projectName: 'ShortGPT',
17
+ onBrokenLinks: 'throw',
18
+ onBrokenMarkdownLinks: 'throw',
19
+ presets: [
20
+ [
21
+ '@docusaurus/preset-classic',
22
+ /** @type {import('@docusaurus/preset-classic').Options} */
23
+ ({
24
+ docs: {
25
+ path: 'docs',
26
+ sidebarPath: 'sidebars.js',
27
+ editUrl:
28
+ 'https://github.com/RayVentura/ShortGPT/edit/stable/docs/',
29
+ versions: {
30
+ current: {
31
+ label: 'current',
32
+ },
33
+ },
34
+ lastVersion: 'current',
35
+ showLastUpdateAuthor: true,
36
+ showLastUpdateTime: true,
37
+ },
38
+ theme: {
39
+ customCss: require.resolve('./src/css/custom.css'),
40
+ },
41
+ }),
42
+ ],
43
+ ],
44
+ plugins: ['tailwind-loader'],
45
+ themeConfig:
46
+ /** @type {import('@docusaurus/preset-classic').ThemeConfig} */
47
+ ({
48
+
49
+ navbar: {
50
+ hideOnScroll: true,
51
+ logo: {
52
+ alt: 'ShortGPT',
53
+ src: 'img/logo.png',
54
+ },
55
+ items: [
56
+ // left
57
+ {
58
+ label: 'Docs',
59
+ to: 'docs/how-to-install',
60
+ position: 'right',
61
+ },
62
+ // right
63
+ {
64
+ type: 'docsVersionDropdown',
65
+ position: 'right',
66
+ },
67
+ {
68
+ href: 'https://github.com/RayVentura/ShortGPT',
69
+ position: 'right',
70
+ className: 'header-github-link',
71
+ },
72
+ ],
73
+ },
74
+ colorMode: {
75
+ defaultMode: 'light',
76
+ disableSwitch: false,
77
+ respectPrefersColorScheme: true,
78
+ },
79
+ announcementBar: {
80
+ content:
81
+ '⭐️ If you like ShortGPT, give it a star on <a target="_blank" rel="noopener noreferrer" href="https://github.com/rayventura/shortgpt">GitHub</a>! ⭐️',
82
+ },
83
+ footer: {
84
+ links: [
85
+ {
86
+ title: 'Docs',
87
+ items: [
88
+ {
89
+ label: 'Getting Started',
90
+ to: 'docs/how-to-install',
91
+ },
92
+
93
+ ],
94
+ },
95
+ {
96
+ title: 'ShortGPT',
97
+ items: [
98
+ {
99
+ label: 'Issues',
100
+ to: 'https://github.com/RayVentura/ShortGPT/issues',
101
+ },
102
+ ],
103
+ },
104
+ {
105
+ title: 'Community',
106
+ items: [
107
+ {
108
+ label: 'Discord',
109
+ to: 'https://discord.com/invite/bRTacwYrfX',
110
+ },
111
+ ],
112
+ },
113
+ {
114
+ title: 'Social',
115
+ items: [
116
+ {
117
+ label: 'GitHub',
118
+ to: 'https://github.com/RayVentura/ShortGPT',
119
+ },
120
+ {
121
+ label: 'Twitter',
122
+ to: 'https://twitter.com/RayVenturaHQ',
123
+ },
124
+ ],
125
+ },
126
+ ],
127
+ copyright: `ShortGPT ${new Date().getFullYear()}`,
128
+ },
129
+ prism: {
130
+ theme: lightCodeTheme,
131
+ darkTheme: darkCodeTheme,
132
+ },
133
+ }),
134
+ }
135
+ );
docs/package.json ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "shortgpt-documentation",
3
+ "version": "3.5.1",
4
+ "private": true,
5
+ "scripts": {
6
+ "build:clean": "rm -rf dist build .docusaurus node_modules",
7
+ "docusaurus": "docusaurus",
8
+ "start": "docusaurus start",
9
+ "build": "docusaurus build",
10
+ "swizzle": "docusaurus swizzle",
11
+ "deploy": "docusaurus deploy",
12
+ "clear": "docusaurus clear",
13
+ "serve": "docusaurus serve",
14
+ "write-translations": "docusaurus write-translations",
15
+ "write-heading-ids": "docusaurus write-heading-ids"
16
+ },
17
+ "dependencies": {
18
+ "@algolia/ui-library": "9.10.2",
19
+ "@docsearch/react": "3.5.1",
20
+ "@docusaurus/core": "2.4.1",
21
+ "@docusaurus/preset-classic": "2.4.1",
22
+ "@mdx-js/react": "^1.6.22",
23
+ "clsx": "^1.1.1",
24
+ "file-loader": "6.2.0",
25
+ "my-loaders": "file:plugins/my-loaders",
26
+ "postcss": "8.4.25",
27
+ "postcss-import": "15.0.0",
28
+ "postcss-preset-env": "7.8.2",
29
+ "prism-react-renderer": "1.2.1",
30
+ "react": "^18.2.0",
31
+ "react-dom": "^18.2.0",
32
+ "tailwind-loader": "file:plugins/tailwind-loader",
33
+ "url-loader": "4.1.1"
34
+ },
35
+ "devDependencies": {
36
+ "postcss-loader": "6.2.1",
37
+ "tailwindcss": "npm:@tailwindcss/postcss7-compat"
38
+ },
39
+ "browserslist": {
40
+ "production": [
41
+ ">0.5%",
42
+ "not dead",
43
+ "not op_mini all"
44
+ ],
45
+ "development": [
46
+ "last 1 chrome version",
47
+ "last 1 firefox version",
48
+ "last 1 safari version"
49
+ ]
50
+ }
51
+ }
docs/plugins/my-loaders/index.js ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ module.exports = function () {
2
+ return {
3
+ name: 'loaders',
4
+ configureWebpack() {
5
+ return {
6
+ module: {
7
+ rules: [
8
+ {
9
+ test: /\.(gif|png|jpe?g|svg)$/i,
10
+ exclude: /\.(mdx?)$/i,
11
+ use: ['file-loader', { loader: 'image-webpack-loader' }],
12
+ },
13
+ ],
14
+ },
15
+ };
16
+ },
17
+ };
18
+ };
docs/plugins/tailwind-loader/index.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* eslint-disable @typescript-eslint/no-var-requires */
2
+ module.exports = function () {
3
+ return {
4
+ name: 'postcss-tailwindcss-loader',
5
+ configurePostCss(postcssOptions) {
6
+ postcssOptions.plugins.push(
7
+ require('postcss-import'),
8
+ require('tailwindcss'),
9
+ require('postcss-preset-env')({
10
+ autoprefixer: {
11
+ flexbox: 'no-2009',
12
+ },
13
+ stage: 4,
14
+ })
15
+ );
16
+ return postcssOptions;
17
+ },
18
+ };
19
+ };
docs/sidebars.js ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Creating a sidebar enables you to:
3
+ * - create an ordered group of docs
4
+ * - render a sidebar for each doc of that group
5
+ * - provide next/previous navigation.
6
+ *
7
+ * The sidebars can be generated from the filesystem, or explicitly defined here.
8
+ *
9
+ * Create as many sidebars as you want.
10
+ */
11
+
12
+ module.exports = {
13
+ docs: [
14
+ {
15
+ type: 'category',
16
+ label: 'Introduction',
17
+ collapsed: false,
18
+ items: ['how-to-install', 'getting-started'],
19
+ },
20
+ {
21
+ type: 'category',
22
+ label: 'Content Engines',
23
+ collapsed: false,
24
+ items: ['content-video-engine', 'content-translation-engine', 'facts-short-engine'],
25
+ },
26
+ {
27
+ type: 'category',
28
+ label: 'API Key and Asset',
29
+ collapsed: false,
30
+ items: ['api-key-manager', 'asset-database'],
31
+ },
32
+ ],
33
+ };
docs/src/components/Home.js ADDED
@@ -0,0 +1,356 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Hero } from '@algolia/ui-library';
2
+ import { useColorMode } from '@docusaurus/theme-common';
3
+ import { useBaseUrlUtils } from '@docusaurus/useBaseUrl';
4
+ import React from 'react';
5
+ import { Link } from 'react-router-dom';
6
+
7
+ function Home() {
8
+ const { withBaseUrl } = useBaseUrlUtils();
9
+ const { colorMode } = useColorMode();
10
+
11
+ React.useEffect(() => {
12
+ if (colorMode === 'dark') {
13
+ document.querySelector('html').classList.add('dark');
14
+ } else {
15
+ document.querySelector('html').classList.remove('dark');
16
+ }
17
+ }, [colorMode]);
18
+
19
+ function Header() {
20
+ return (
21
+ <Hero
22
+ id="hero"
23
+ title={
24
+ <>
25
+
26
+ <span className="hero-title text-4xl leading-10 font-extrabold text-blue-600 md:text-4xl lg:text-4xl md:leading-11 max-w-xs inline-block">
27
+ 🚀🎬 SHORTGPT
28
+ </span>
29
+ <span className="hero-title text-3xl leading-9 font-extrabold md:text-3xl lg:text-3xl md:leading-10 max-w-xxs inline-block">
30
+ Opensource AI Content Automation Framework
31
+ </span>
32
+ </>
33
+ }
34
+ background="cubes"
35
+ cta={[
36
+ <Link
37
+ key="get-started"
38
+ to="/docs/how-to-install"
39
+ className="inline-flex items-center justify-center px-6 py-3 border border-transparent text-base font-semibold rounded-full text-white bg-gradient-to-r from-purple-500 to-indigo-500 hover:from-purple-600 hover:to-indigo-600 hover:no-underline"
40
+ >
41
+ Get started
42
+ </Link>
43
+ ]}
44
+ />
45
+ );
46
+ }
47
+
48
+ function Description() {
49
+ return (
50
+ <>
51
+ {/* Description */}
52
+ <div className="py-8 overflow-hidden">
53
+ <div className="relative max-w-xl mx-auto px-4 md:px-6 lg:px-8 lg:max-w-screen-xl">
54
+ <div className="relative">
55
+ <h3 className="text-center text-3xl leading-8 font-extrabold tracking-tight md:text-4xl md:leading-10">
56
+ Automating video and short content creation with AI
57
+ </h3>
58
+ <p className="mt-4 max-w-3xl mx-auto text-center text-xl leading-7 text-description">
59
+ ShortGPT is a powerful framework for automating content creation. It simplifies video creation, footage sourcing, voiceover synthesis, and editing tasks.
60
+ </p>
61
+ </div>
62
+
63
+ <div className="pt-16">
64
+ <ul className="lg:grid lg:grid-cols-3 lg:col-gap-8 lg:row-gap-10">
65
+ <li>
66
+ <div className="flex">
67
+ <div className="flex-shrink-0">
68
+ <div className="flex items-center justify-center h-12 w-12 rounded-md bg-indigo-500 text-white">
69
+ <svg
70
+ viewBox="0 0 20 20"
71
+ fill="currentColor"
72
+ className="search w-6 h-6"
73
+ >
74
+ <path
75
+ fillRule="evenodd"
76
+ d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z"
77
+ clipRule="evenodd"
78
+ ></path>
79
+ </svg>
80
+ </div>
81
+ </div>
82
+ <div className="ml-4">
83
+ <h4 className="text-lg leading-6 font-medium">
84
+ Automated editing framework
85
+ </h4>
86
+ <p className="mt-2 text-base leading-6 text-description">
87
+ ShortGPT streamlines the video creation process with an LLM oriented video editing language, making it easier to automate editing tasks.
88
+ </p>
89
+ </div>
90
+ </div>
91
+ </li>
92
+ <li className="mt-10 lg:mt-0">
93
+ <div className="flex">
94
+ <div className="flex-shrink-0">
95
+ <div className="flex items-center justify-center h-12 w-12 rounded-md bg-indigo-500 text-white">
96
+ <svg
97
+ fill="none"
98
+ viewBox="0 0 24 24"
99
+ stroke="currentColor"
100
+ className="user-group w-6 h-6"
101
+ >
102
+ <path
103
+ strokeLinecap="round"
104
+ strokeLinejoin="round"
105
+ strokeWidth="2"
106
+ d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"
107
+ ></path>
108
+ </svg>
109
+ </div>
110
+ </div>
111
+ <div className="ml-4">
112
+ <h4 className="text-lg leading-6 font-medium">
113
+ Voiceover / Content Creation
114
+ </h4>
115
+ <p className="mt-2 text-base leading-6 text-description">
116
+ ShortGPT supports multiple languages for voiceover synthesis, making it easy to create content in various languages.
117
+ </p>
118
+ </div>
119
+ </div>
120
+ </li>
121
+ <li className="mt-10 lg:mt-0">
122
+ <div className="flex">
123
+ <div className="flex-shrink-0">
124
+ <div className="flex items-center justify-center h-12 w-12 rounded-md bg-indigo-500 text-white">
125
+ <svg
126
+ fill="none"
127
+ viewBox="0 0 24 24"
128
+ stroke="currentColor"
129
+ className="device-mobile w-6 h-6"
130
+ >
131
+ <path
132
+ strokeLinecap="round"
133
+ strokeLinejoin="round"
134
+ strokeWidth="2"
135
+ d="M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"
136
+ ></path>
137
+ </svg>
138
+ </div>
139
+ </div>
140
+ <div className="ml-4">
141
+ <h4 className="text-lg leading-6 font-medium">
142
+ Asset Sourcing
143
+ </h4>
144
+ <p className="mt-2 text-base leading-6 text-description">
145
+ ShortGPT can source images and video footage from the internet, allowing you to easily find and use relevant visuals.
146
+ </p>
147
+ </div>
148
+ </div>
149
+ </li>
150
+ </ul>
151
+ </div>
152
+ </div>
153
+ </div>
154
+
155
+ {/* How it works */}
156
+ <div className="diagonal-box py-16 bg-gray-200 overflow-hidden">
157
+ <div className="diagonal-content max-w-xl mx-auto px-4 md:px-6 lg:px-8 lg:max-w-screen-xl">
158
+ <div className="max-w-screen-xl mx-auto pt-6 px-4 md:px-6 lg:px-8">
159
+ <div className="max-w-4xl mx-auto text-center">
160
+ <h2 className="text-3xl leading-9 font-extrabold text-gray-900 md:text-4xl md:leading-10">
161
+ How it works
162
+ </h2>
163
+ <p className="mt-4 max-w-2xl text-xl leading-7 text-gray-500 lg:mx-auto">
164
+ ShortGPT is an AI-powered framework that automates the process of content creation, from script generation to asset sourcing and video editing.
165
+ </p>
166
+ </div>
167
+ </div>
168
+
169
+ <div className="py-16">
170
+ <div className="max-w-xl mx-auto px-4 md:px-6 lg:max-w-screen-lg lg:px-8 ">
171
+ <div className="lg:grid lg:grid-cols-3 lg:gap-8">
172
+ <div>
173
+ <div className="flex items-center justify-center">
174
+ <img
175
+ className="h-200"
176
+ src={withBaseUrl('img/assets/scraping.svg')}
177
+ width="190px"
178
+ height="220px"
179
+ />
180
+ </div>
181
+ <div className="mt-10 lg:mt-0 p-4">
182
+ <h5 className="text-lg leading-6 font-medium text-gray-900">
183
+ Automated Editing Framework
184
+ </h5>
185
+ <p className="mt-2 text-base leading-6 text-gray-600">
186
+ ShortGPT employs a heavy usage of LLMs and automated video editing libraries to streamline the video creation process (Ffmpeg, moviepy, ffprobe).
187
+ </p>
188
+ </div>
189
+ </div>
190
+ <div className="mt-10 lg:mt-0 p-4">
191
+ <div className="h-200 flex items-center justify-center">
192
+ <img
193
+ src={withBaseUrl('img/assets/configuration.svg')}
194
+ width="140px"
195
+ height="220px"
196
+ alt="Configuration of your crawler"
197
+ />
198
+ </div>
199
+ <div>
200
+ <h5 className="text-lg leading-6 font-medium text-gray-900">
201
+ Voiceover / Content Creation
202
+ </h5>
203
+ <p className="mt-2 text-base leading-6 text-gray-600">
204
+ ShortGPT integrates multiple neural voice synthesis engines (ElevenLabs, EdgeTTS), to allow human-like voice quality in the audio generated.
205
+ </p>
206
+ </div>
207
+ </div>
208
+ <div className="mt-10 lg:mt-0 p-4">
209
+ <div className="h-200 flex items-center justify-center">
210
+ <img
211
+ src={withBaseUrl('img/assets/implementation.svg')}
212
+ width="220px"
213
+ height="220px"
214
+ alt="Implementation on your website"
215
+ />
216
+ </div>
217
+ <div>
218
+ <h5 className="text-lg leading-6 font-medium text-gray-900">
219
+ Asset Sourcing
220
+ </h5>
221
+ <p className="mt-2 text-base leading-6 text-gray-600">
222
+ ShortGPT is equipped with an advanced asset sourcing module that can retrieve images and video footage from the internet. This feature allows for the easy incorporation of relevant visuals into the content (Pexels, youtube, and more soon).
223
+ </p>
224
+ </div>
225
+ </div>
226
+ </div>
227
+ </div>
228
+ </div>
229
+ </div>
230
+ </div>
231
+
232
+
233
+
234
+ {/* Powered by AI */}
235
+ <div className="py-16 bg-indigo-600 overflow-hidden lg:py-24">
236
+ <div className="text-center">
237
+ <h3 className="mt-2 text-3xl leading-8 font-extrabold text-white tracking-tight md:text-4xl md:leading-10">
238
+ Powered by AI
239
+ </h3>
240
+ </div>
241
+ <div className="relative max-w-xl mx-auto px-4 md:px-6 lg:px-8 lg:max-w-screen-xl">
242
+ <div className="relative lg:grid lg:grid-cols-2 lg:gap-8 lg:items-center">
243
+ <div className="relative">
244
+ <ul className="mt-10">
245
+ <li className="mt-10">
246
+ <div className="flex">
247
+ <div className="flex-shrink-0">
248
+ <div className="flex items-center justify-center h-12 w-12 rounded-md bg-white text-indigo-500">
249
+ <svg
250
+ fill="none"
251
+ viewBox="0 0 24 24"
252
+ stroke="currentColor"
253
+ className="chip w-6 h-6"
254
+ >
255
+ <path
256
+ strokeLinecap="round"
257
+ strokeLinejoin="round"
258
+ strokeWidth="2"
259
+ d="M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z"
260
+ ></path>
261
+ </svg>
262
+ </div>
263
+ </div>
264
+ <div className="ml-4">
265
+ <h5 className="text-lg leading-6 font-medium text-white">
266
+ Automated Editing
267
+ </h5>
268
+ <p className="mt-2 text-base leading-6 text-gray-300">
269
+ ShortGPT automates the video editing process, making it faster and more efficient with the help of AI.
270
+ </p>
271
+ </div>
272
+ </div>
273
+ </li>
274
+ <li className="mt-10">
275
+ <div className="flex">
276
+ <div className="flex-shrink-0">
277
+ <div className="flex items-center justify-center h-12 w-12 rounded-md bg-white text-indigo-500">
278
+ <svg
279
+ fill="none"
280
+ viewBox="0 0 24 24"
281
+ stroke="currentColor"
282
+ className="chat w-6 h-6"
283
+ >
284
+ <path
285
+ strokeLinecap="round"
286
+ strokeLinejoin="round"
287
+ strokeWidth="2"
288
+ d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"
289
+ ></path>
290
+ </svg>
291
+ </div>
292
+ </div>
293
+ <div className="ml-4">
294
+ <h5 className="text-lg leading-6 font-medium text-white">
295
+ Voiceover / Content Creation
296
+ </h5>
297
+ <p className="mt-2 text-base leading-6 text-gray-300">
298
+ ShortGPT supports multiple languages for voiceover synthesis, making it easy to create content in various languages.
299
+ </p>
300
+ </div>
301
+ </div>
302
+ </li>
303
+ </ul>
304
+ </div>
305
+
306
+ <div className="relative">
307
+ <ul className="mt-10">
308
+ <li className="mt-10">
309
+ <div className="flex">
310
+ <div className="flex-shrink-0">
311
+ <div className="flex items-center justify-center h-12 w-12 rounded-md bg-white text-indigo-500">
312
+ <svg
313
+ fill="none"
314
+ viewBox="0 0 24 24"
315
+ stroke="currentColor"
316
+ className="backspace w-6 h-6"
317
+ >
318
+ <path
319
+ strokeLinecap="round"
320
+ strokeLinejoin="round"
321
+ strokeWidth="2"
322
+ d="M12 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2M3 12l6.414 6.414a2 2 0 001.414.586H19a2 2 0 002-2V7a2 2 0 00-2-2h-8.172a2 2 0 00-1.414.586L3 12z"
323
+ ></path>
324
+ </svg>
325
+ </div>
326
+ </div>
327
+ <div className="ml-4">
328
+ <h5 className="text-lg leading-6 font-medium text-white">
329
+ Asset Sourcing
330
+ </h5>
331
+ <p className="mt-2 text-base leading-6 text-gray-300">
332
+ ShortGPT can source images and video footage from the internet, allowing you to easily find and use relevant visuals.
333
+ </p>
334
+ </div>
335
+ </div>
336
+ </li>
337
+ </ul>
338
+ </div>
339
+ </div>
340
+ </div>
341
+ </div>
342
+ </>
343
+ )
344
+ }
345
+
346
+
347
+
348
+ return (
349
+ <div id="tailwind">
350
+ <Header />
351
+ <Description />
352
+ </div>
353
+ );
354
+ }
355
+
356
+ export default Home;
docs/src/css/custom.css ADDED
@@ -0,0 +1,198 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import url(fragments.css);
2
+ @import 'tailwindcss/tailwind.css';
3
+
4
+ :root {
5
+ --ifm-font-size-base: 16px;
6
+ --ifm-code-font-size: 90%;
7
+ --ifm-background-color: var(--white);
8
+ --ifm-color-primary: var(--nebula-500);
9
+ --ifm-footer-background-color: var(--grey-100);
10
+ --ifm-menu-color-background-active: var(--ifm-color-emphasis-200);
11
+ }
12
+
13
+ html[data-theme='dark'] {
14
+ --ifm-font-base-color: #dee0f2;
15
+ --ifm-navbar-link-hover-color: #8b9dff;
16
+ --ifm-link-color: #8b9dff;
17
+ --ifm-menu-color-active: #8b9dff;
18
+ --ifm-background-color: #0a141c;
19
+ --ifm-footer-background-color: #0a141c;
20
+ --ifm-navbar-background-color: #21243d;
21
+ --ifm-menu-color-background-active: #21243d;
22
+ }
23
+
24
+ .docusaurus-highlight-code-line {
25
+ background-color: rgba(0, 0, 0, 0.1);
26
+ display: block;
27
+ margin: 0 calc(-1 * var(--ifm-pre-padding));
28
+ padding: 0 var(--ifm-pre-padding);
29
+ }
30
+
31
+ html[data-theme='dark'] .docusaurus-highlight-code-line {
32
+ background-color: rgba(0, 0, 0, 0.3);
33
+ }
34
+
35
+ .diagonal-box {
36
+ transform: skewY(-6deg);
37
+ }
38
+
39
+ .diagonal-content {
40
+ transform: skewY(6deg);
41
+ }
42
+
43
+ [class^='announcementBar'] {
44
+ z-index: 10;
45
+ }
46
+
47
+ .showcase {
48
+ background-color: #fff;
49
+ }
50
+
51
+ html[data-theme='dark'] .showcase {
52
+ background-color: #21243d;
53
+ }
54
+
55
+ .showcase-border {
56
+ border-color: rgba(243, 244, 246, 1);
57
+ }
58
+
59
+ html[data-theme='dark'] .showcase-border {
60
+ border-color: rgba(55, 65, 81, 1);
61
+ }
62
+
63
+ .text-description {
64
+ color: rgba(107, 114, 128, 1);
65
+ }
66
+
67
+ html[data-theme='dark'] .text-description {
68
+ color: rgba(209, 213, 219, 1);
69
+ }
70
+
71
+ /* apply */
72
+ #hero-apply {
73
+ z-index: -1;
74
+ background-image: linear-gradient(
75
+ var(--ifm-footer-background-color),
76
+ var(--ifm-navbar-background-color)
77
+ );
78
+ }
79
+
80
+ html[data-theme='dark'] #hero-apply {
81
+ background-image: linear-gradient(
82
+ var(--ifm-navbar-background-color),
83
+ var(--ifm-background-color)
84
+ );
85
+ }
86
+
87
+ html[data-theme='dark'] #hero-apply > div:first-child {
88
+ opacity: 0.4;
89
+ }
90
+
91
+ .apply-form {
92
+ background-image: linear-gradient(#fff, #f5f5fa);
93
+ max-width: 600px;
94
+ }
95
+
96
+ html[data-theme='dark'] .apply-form {
97
+ background-image: radial-gradient(
98
+ circle at 50% 0px,
99
+ rgb(72, 76, 122),
100
+ rgb(35, 38, 59)
101
+ );
102
+ }
103
+
104
+ .apply-text {
105
+ color: #36395a;
106
+ }
107
+
108
+ html[data-theme='dark'] .apply-text {
109
+ color: #fff;
110
+ }
111
+
112
+ /* index */
113
+ #hero {
114
+ background-image: linear-gradient(
115
+ var(--ifm-footer-background-color),
116
+ var(--ifm-navbar-background-color)
117
+ );
118
+ }
119
+
120
+ html[data-theme='dark'] #hero {
121
+ background-image: linear-gradient(
122
+ var(--ifm-navbar-background-color),
123
+ var(--ifm-background-color)
124
+ );
125
+ }
126
+
127
+ html[data-theme='dark'] #hero > div:first-child {
128
+ opacity: 0.4;
129
+ }
130
+
131
+ /**
132
+ * Hero component title overrides to match other heading styles
133
+ */
134
+ .hero-title {
135
+ color: rgb(28, 30, 33);
136
+ font-family: var(--ifm-heading-font-family);
137
+ }
138
+
139
+ html[data-theme='dark'] .hero-title {
140
+ color: rgb(227, 227, 227);
141
+ }
142
+
143
+
144
+ .apply-button:hover {
145
+ color: #000000;
146
+ }
147
+
148
+ /* GitHub */
149
+ .header-github-link:hover {
150
+ opacity: 0.6;
151
+ }
152
+
153
+ .header-github-link:before {
154
+ content: '';
155
+ width: 24px;
156
+ height: 24px;
157
+ display: flex;
158
+ background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
159
+ no-repeat;
160
+ }
161
+
162
+ html[data-theme='dark'] .header-github-link:before {
163
+ background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
164
+ no-repeat;
165
+ }
166
+
167
+ /* Images */
168
+ .image-rendering-crisp {
169
+ image-rendering: crisp-edges;
170
+
171
+ /* alias for google chrome */
172
+ image-rendering: -webkit-optimize-contrast;
173
+ }
174
+
175
+ .image-rendering-pixel {
176
+ image-rendering: pixelated;
177
+ }
178
+
179
+ /* Tailwindcss */
180
+
181
+ #tailwind dd,
182
+ #tailwind dt {
183
+ margin: 0;
184
+ }
185
+
186
+ #tailwind *,
187
+ #tailwind ::before,
188
+ #tailwind ::after {
189
+ border-width: 0;
190
+ border-style: solid;
191
+ }
192
+
193
+ #tailwind ol,
194
+ #tailwind ul {
195
+ list-style: none;
196
+ margin: 0;
197
+ padding: 0;
198
+ }
docs/src/css/fragments.css ADDED
@@ -0,0 +1,2275 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ --transparent: transparent;
3
+ --white: #fff;
4
+ --grey-900: #23263b;
5
+ --grey-800: #36395a;
6
+ --grey-700: #484c7a;
7
+ --grey-600: #5a5e9a;
8
+ --grey-500: #777aaf;
9
+ --grey-400: #9698c3;
10
+ --grey-300: #b6b7d5;
11
+ --grey-200: #d6d6e7;
12
+ --grey-100: #f5f5fa;
13
+ --grey-050: #fcfcfd;
14
+ --grey-000: #fff;
15
+ --pink-900: #59063d;
16
+ --pink-800: #88085c;
17
+ --pink-700: #b80979;
18
+ --pink-600: #e90a96;
19
+ --pink-500: #f82caa;
20
+ --pink-400: #fb5abc;
21
+ --pink-300: #fd89ce;
22
+ --pink-200: #feb9e2;
23
+ --pink-100: #ffeaf6;
24
+ --nebula-900: #141d61;
25
+ --nebula-800: #1e2b8f;
26
+ --nebula-700: #2b3cbb;
27
+ --nebula-600: #3c4fe0;
28
+ --nebula-500: #5468ff;
29
+ --nebula-400: #7c8aff;
30
+ --nebula-300: #a3acff;
31
+ --nebula-200: #cacfff;
32
+ --nebula-100: #f2f3ff;
33
+ --cyan-900: #00526c;
34
+ --cyan-800: #00769b;
35
+ --cyan-700: #009bcb;
36
+ --cyan-600: #0db7eb;
37
+ --cyan-500: #2cc8f7;
38
+ --cyan-400: #5adaff;
39
+ --cyan-300: #89e5ff;
40
+ --cyan-200: #b9efff;
41
+ --cyan-100: #e8faff;
42
+ --green-900: #005e36;
43
+ --green-800: #028950;
44
+ --green-700: #06b66c;
45
+ --green-600: #0de589;
46
+ --green-500: #5feb9e;
47
+ --green-400: #88f0b3;
48
+ --green-300: #aaf4c8;
49
+ --green-200: #c9f8de;
50
+ --green-100: #e6fcf3;
51
+ --orange-900: #963209;
52
+ --orange-800: #bf470a;
53
+ --orange-700: #e8600a;
54
+ --orange-600: #f78125;
55
+ --orange-500: #faa04b;
56
+ --orange-400: #fcbc73;
57
+ --orange-300: #fed59a;
58
+ --orange-200: #ffe9c3;
59
+ --orange-100: #fff9ec;
60
+ --red-900: #83111e;
61
+ --red-800: #ab1325;
62
+ --red-700: #d4142a;
63
+ --red-600: #ee243c;
64
+ --red-500: #f4495d;
65
+ --red-400: #f86e7e;
66
+ --red-300: #fc95a1;
67
+ --red-200: #febdc5;
68
+ --red-100: #ffe6e9;
69
+ --current: currentColor;
70
+ }
71
+ .uil-bgc-transparent {
72
+ background-color: transparent;
73
+ }
74
+ .uil-bgc-white {
75
+ background-color: #fff;
76
+ }
77
+ .uil-bgc-grey-900 {
78
+ background-color: #23263b;
79
+ }
80
+ .uil-bgc-grey-800 {
81
+ background-color: #36395a;
82
+ }
83
+ .uil-bgc-grey-200 {
84
+ background-color: #d6d6e7;
85
+ }
86
+ .hover\:uil-bgc-grey-100:focus,
87
+ .hover\:uil-bgc-grey-100:hover,
88
+ .uil-bgc-grey-100 {
89
+ background-color: #f5f5fa;
90
+ }
91
+ .uil-bgc-pink-200 {
92
+ background-color: #feb9e2;
93
+ }
94
+ .uil-bgc-nebula-500 {
95
+ background-color: #5468ff;
96
+ }
97
+ .uil-bgc-nebula-200 {
98
+ background-color: #cacfff;
99
+ }
100
+ .uil-bgc-green-200 {
101
+ background-color: #c9f8de;
102
+ }
103
+ .uil-bgc-orange-200 {
104
+ background-color: #ffe9c3;
105
+ }
106
+ .uil-bgc-red-600 {
107
+ background-color: #ee243c;
108
+ }
109
+ .uil-bgc-red-500 {
110
+ background-color: #f4495d;
111
+ }
112
+ .uil-bgc-current {
113
+ background-color: currentColor;
114
+ }
115
+ @media (min-width: 960px) {
116
+ .md\:uil-bgc-transparent {
117
+ background-color: transparent;
118
+ }
119
+ }
120
+ @media (min-width: 960px) {
121
+ .md\:uil-bgc-white {
122
+ background-color: #fff;
123
+ }
124
+ }
125
+ @media (min-width: 960px) {
126
+ .md\:uil-bgc-grey-900 {
127
+ background-color: #23263b;
128
+ }
129
+ }
130
+ .uil-bgp-center {
131
+ background-position: 50%;
132
+ }
133
+ .uil-bgp-bottom {
134
+ background-position: bottom;
135
+ }
136
+ .uil-bgr-no-repeat {
137
+ background-repeat: no-repeat;
138
+ }
139
+ @media (min-width: 960px) {
140
+ .md\:uil-bgr-no-repeat {
141
+ background-repeat: no-repeat;
142
+ }
143
+ }
144
+ .uil-bgs-cover {
145
+ background-size: cover;
146
+ }
147
+ .uil-bgs-contain {
148
+ background-size: contain;
149
+ }
150
+ @media (min-width: 960px) {
151
+ .md\:uil-bgs-contain {
152
+ background-size: contain;
153
+ }
154
+ }
155
+ @media (min-width: 1200px) {
156
+ .lg\:uil-bgs-cover {
157
+ background-size: cover;
158
+ }
159
+ }
160
+ .uil-bd-none {
161
+ border: none;
162
+ }
163
+ .uil-bdc-transparent {
164
+ border-color: transparent;
165
+ }
166
+ .uil-bdc-grey-800 {
167
+ border-color: #36395a;
168
+ }
169
+ .uil-bdc-grey-700 {
170
+ border-color: #484c7a;
171
+ }
172
+ .uil-bdc-grey-200 {
173
+ border-color: #d6d6e7;
174
+ }
175
+ .uil-bdc-grey-100 {
176
+ border-color: #f5f5fa;
177
+ }
178
+ .uil-bdc-pink-600 {
179
+ border-color: #e90a96;
180
+ }
181
+ .uil-bdc-nebula-500 {
182
+ border-color: #5468ff;
183
+ }
184
+ .uil-bdc-green-700 {
185
+ border-color: #06b66c;
186
+ }
187
+ .uil-bdc-orange-600 {
188
+ border-color: #f78125;
189
+ }
190
+ .uil-bdc-red-600 {
191
+ border-color: #ee243c;
192
+ }
193
+ @media (min-width: 960px) {
194
+ .md\:uil-bdc-transparent {
195
+ border-color: transparent;
196
+ }
197
+ }
198
+ @media (min-width: 960px) {
199
+ .md\:uil-bdc-white {
200
+ border-color: #fff;
201
+ }
202
+ }
203
+ @media (min-width: 960px) {
204
+ .md\:uil-bdc-grey-800 {
205
+ border-color: #36395a;
206
+ }
207
+ }
208
+ @media (min-width: 960px) {
209
+ .md\:uil-bdc-grey-200 {
210
+ border-color: #d6d6e7;
211
+ }
212
+ }
213
+ @media (min-width: 960px) {
214
+ .md\:uil-bdc-pink-600 {
215
+ border-color: #e90a96;
216
+ }
217
+ }
218
+ @media (min-width: 960px) {
219
+ .md\:uil-bdc-nebula-500 {
220
+ border-color: #5468ff;
221
+ }
222
+ }
223
+ @media (min-width: 960px) {
224
+ .md\:uil-bdc-green-700 {
225
+ border-color: #06b66c;
226
+ }
227
+ }
228
+ @media (min-width: 960px) {
229
+ .md\:uil-bdc-orange-600 {
230
+ border-color: #f78125;
231
+ }
232
+ }
233
+ @media (min-width: 960px) {
234
+ .md\:uil-bdc-red-600 {
235
+ border-color: #ee243c;
236
+ }
237
+ }
238
+ .uil-bdr-0 {
239
+ border-radius: 0;
240
+ }
241
+ .uil-bdr-2 {
242
+ border-radius: 2px;
243
+ }
244
+ .uil-bdr-4 {
245
+ border-radius: 4px;
246
+ }
247
+ .uil-bdr-6 {
248
+ border-radius: 6px;
249
+ }
250
+ .uil-bdr-8 {
251
+ border-radius: 8px;
252
+ }
253
+ .uil-bdr-20 {
254
+ border-radius: 20px;
255
+ }
256
+ .uil-bdr-max {
257
+ border-radius: 9999px;
258
+ }
259
+ @media (min-width: 960px) {
260
+ .md\:uil-bdr-4 {
261
+ border-radius: 4px;
262
+ }
263
+ }
264
+ .uil-bdtlr-0 {
265
+ border-top-left-radius: 0;
266
+ }
267
+ .uil-bdtlr-2 {
268
+ border-top-left-radius: 2px;
269
+ }
270
+ .uil-bdtlr-4 {
271
+ border-top-left-radius: 4px;
272
+ }
273
+ .uil-bdtlr-6 {
274
+ border-top-left-radius: 6px;
275
+ }
276
+ .uil-bdtlr-8 {
277
+ border-top-left-radius: 8px;
278
+ }
279
+ .uil-bdtlr-20 {
280
+ border-top-left-radius: 20px;
281
+ }
282
+ .uil-bdtrr-0 {
283
+ border-top-right-radius: 0;
284
+ }
285
+ .uil-bdtrr-2 {
286
+ border-top-right-radius: 2px;
287
+ }
288
+ .uil-bdtrr-4 {
289
+ border-top-right-radius: 4px;
290
+ }
291
+ .uil-bdtrr-6 {
292
+ border-top-right-radius: 6px;
293
+ }
294
+ .uil-bdtrr-8 {
295
+ border-top-right-radius: 8px;
296
+ }
297
+ .uil-bdtrr-20 {
298
+ border-top-right-radius: 20px;
299
+ }
300
+ .uil-bdblr-0 {
301
+ border-bottom-left-radius: 0;
302
+ }
303
+ .uil-bdblr-6 {
304
+ border-bottom-left-radius: 6px;
305
+ }
306
+ .uil-bdbrr-0 {
307
+ border-bottom-right-radius: 0;
308
+ }
309
+ .uil-bdbrr-6 {
310
+ border-bottom-right-radius: 6px;
311
+ }
312
+ @media (min-width: 960px) {
313
+ .md\:uil-bdbr-6 {
314
+ border-bottom-left-radius: 6px;
315
+ border-bottom-right-radius: 6px;
316
+ }
317
+ }
318
+ .uil-bds-solid {
319
+ border-style: solid;
320
+ }
321
+ @media (min-width: 960px) {
322
+ .md\:uil-bds-solid {
323
+ border-style: solid;
324
+ }
325
+ }
326
+ .uil-bdts-solid {
327
+ border-top-style: solid;
328
+ }
329
+ .uil-bdrs-solid {
330
+ border-right-style: solid;
331
+ }
332
+ .uil-bdbs-solid {
333
+ border-bottom-style: solid;
334
+ }
335
+ @media (min-width: 960px) {
336
+ .md\:uil-bdbs-solid {
337
+ border-bottom-style: solid;
338
+ }
339
+ }
340
+ .uil-bdw-0 {
341
+ border-width: 0;
342
+ }
343
+ .uil-bdw-1 {
344
+ border-width: 1px;
345
+ }
346
+ @media (min-width: 960px) {
347
+ .md\:uil-bdw-0 {
348
+ border-width: 0;
349
+ }
350
+ }
351
+ @media (min-width: 960px) {
352
+ .md\:uil-bdw-2 {
353
+ border-width: 2px;
354
+ }
355
+ }
356
+ @media (min-width: 960px) {
357
+ .md\:uil-bdlw-1 {
358
+ border-left-width: 1px;
359
+ }
360
+ }
361
+ .uil-bdtw-1 {
362
+ border-top-width: 1px;
363
+ }
364
+ .uil-bdtw-2 {
365
+ border-top-width: 2px;
366
+ }
367
+ @media (min-width: 960px) {
368
+ .md\:uil-bdtw-1 {
369
+ border-top-width: 1px;
370
+ }
371
+ }
372
+ .uil-bdrw-1 {
373
+ border-right-width: 1px;
374
+ }
375
+ .uil-bdbw-0 {
376
+ border-bottom-width: 0;
377
+ }
378
+ .uil-bdbw-1 {
379
+ border-bottom-width: 1px;
380
+ }
381
+ @media (min-width: 960px) {
382
+ .md\:uil-bdbw-1 {
383
+ border-bottom-width: 1px;
384
+ }
385
+ }
386
+ .uil-d-none {
387
+ display: none;
388
+ }
389
+ .uil-d-block {
390
+ display: block;
391
+ }
392
+ .uil-d-inline-block {
393
+ display: inline-block;
394
+ }
395
+ .uil-d-flex {
396
+ display: flex;
397
+ }
398
+ .uil-d-inline-flex {
399
+ display: inline-flex;
400
+ }
401
+ .uil-d-grid {
402
+ display: grid;
403
+ }
404
+ @media (min-width: 500px) {
405
+ .xs\:uil-d-block {
406
+ display: block;
407
+ }
408
+ }
409
+ @media (min-width: 768px) {
410
+ .sm\:uil-d-flex {
411
+ display: flex;
412
+ }
413
+ }
414
+ @media (min-width: 768px) {
415
+ .sm\:uil-d-grid {
416
+ display: grid;
417
+ }
418
+ }
419
+ @media (min-width: 960px) {
420
+ .md\:uil-d-none {
421
+ display: none;
422
+ }
423
+ }
424
+ @media (min-width: 960px) {
425
+ .md\:uil-d-block {
426
+ display: block;
427
+ }
428
+ }
429
+ @media (min-width: 960px) {
430
+ .md\:uil-d-flex {
431
+ display: flex;
432
+ }
433
+ }
434
+ @media (min-width: 960px) {
435
+ .md\:uil-d-grid {
436
+ display: grid;
437
+ }
438
+ }
439
+ @media (min-width: 1200px) {
440
+ .lg\:uil-d-none {
441
+ display: none;
442
+ }
443
+ }
444
+ @media (min-width: 1200px) {
445
+ .lg\:uil-d-block {
446
+ display: block;
447
+ }
448
+ }
449
+ @media (min-width: 1440px) {
450
+ .xl\:uil-d-inline-block {
451
+ display: inline-block;
452
+ }
453
+ }
454
+ .uil-m-0 {
455
+ margin: 0;
456
+ }
457
+ .uil-m-8 {
458
+ margin: 8px;
459
+ }
460
+ .uil-m-auto {
461
+ margin: auto;
462
+ }
463
+ @media (min-width: 960px) {
464
+ .md\:uil-m-0 {
465
+ margin: 0;
466
+ }
467
+ }
468
+ @media (min-width: 960px) {
469
+ .md\:uil-m-auto {
470
+ margin: auto;
471
+ }
472
+ }
473
+ .uil-ml-0 {
474
+ margin-left: 0;
475
+ }
476
+ .uil-ml-8 {
477
+ margin-left: 8px;
478
+ }
479
+ .uil-ml-12 {
480
+ margin-left: 12px;
481
+ }
482
+ .uil-ml-auto {
483
+ margin-left: auto;
484
+ }
485
+ @media (min-width: 500px) {
486
+ .xs\:uil-ml-24 {
487
+ margin-left: 24px;
488
+ }
489
+ }
490
+ @media (min-width: 768px) {
491
+ .sm\:uil-ml-12 {
492
+ margin-left: 12px;
493
+ }
494
+ }
495
+ @media (min-width: 768px) {
496
+ .sm\:uil-ml-24 {
497
+ margin-left: 24px;
498
+ }
499
+ }
500
+ @media (min-width: 960px) {
501
+ .md\:uil-ml-0 {
502
+ margin-left: 0;
503
+ }
504
+ }
505
+ @media (min-width: 960px) {
506
+ .md\:uil-ml-8 {
507
+ margin-left: 8px;
508
+ }
509
+ }
510
+ @media (min-width: 960px) {
511
+ .md\:uil-ml-50p {
512
+ margin-left: 50%;
513
+ }
514
+ }
515
+ @media (min-width: 960px) {
516
+ .md\:uil-ml-auto {
517
+ margin-left: auto;
518
+ }
519
+ }
520
+ @media (min-width: 1200px) {
521
+ .lg\:uil-ml-16 {
522
+ margin-left: 16px;
523
+ }
524
+ }
525
+ @media (min-width: 1200px) {
526
+ .lg\:uil-ml-48 {
527
+ margin-left: 48px;
528
+ }
529
+ }
530
+ @media (min-width: 1440px) {
531
+ .xl\:uil-ml-16 {
532
+ margin-left: 16px;
533
+ }
534
+ }
535
+ .uil-mt-0 {
536
+ margin-top: 0;
537
+ }
538
+ .uil-mt-4 {
539
+ margin-top: 4px;
540
+ }
541
+ .uil-mt-8 {
542
+ margin-top: 8px;
543
+ }
544
+ .uil-mt-12 {
545
+ margin-top: 12px;
546
+ }
547
+ .uil-mt-16 {
548
+ margin-top: 16px;
549
+ }
550
+ .uil-mt-20 {
551
+ margin-top: 20px;
552
+ }
553
+ .uil-mt-24 {
554
+ margin-top: 24px;
555
+ }
556
+ .uil-mt-32 {
557
+ margin-top: 32px;
558
+ }
559
+ .uil-mt-48 {
560
+ margin-top: 48px;
561
+ }
562
+ .uil-mt-80 {
563
+ margin-top: 80px;
564
+ }
565
+ @media (min-width: 500px) {
566
+ .xs\:uil-mt-0 {
567
+ margin-top: 0;
568
+ }
569
+ }
570
+ @media (min-width: 768px) {
571
+ .sm\:uil-mt-0 {
572
+ margin-top: 0;
573
+ }
574
+ }
575
+ @media (min-width: 960px) {
576
+ .md\:uil-mt-0 {
577
+ margin-top: 0;
578
+ }
579
+ }
580
+ @media (min-width: 960px) {
581
+ .md\:uil-mt-8 {
582
+ margin-top: 8px;
583
+ }
584
+ }
585
+ @media (min-width: 960px) {
586
+ .md\:uil-mt-12 {
587
+ margin-top: 12px;
588
+ }
589
+ }
590
+ @media (min-width: 960px) {
591
+ .md\:uil-mt-auto {
592
+ margin-top: auto;
593
+ }
594
+ }
595
+ @media (min-width: 1200px) {
596
+ .lg\:uil-mt-8 {
597
+ margin-top: 8px;
598
+ }
599
+ }
600
+ @media (min-width: 1200px) {
601
+ .lg\:uil-mt-12 {
602
+ margin-top: 12px;
603
+ }
604
+ }
605
+ @media (min-width: 1200px) {
606
+ .lg\:uil-mt-20 {
607
+ margin-top: 20px;
608
+ }
609
+ }
610
+ @media (min-width: 1200px) {
611
+ .lg\:uil-mt-48 {
612
+ margin-top: 48px;
613
+ }
614
+ }
615
+ @media (min-width: 1200px) {
616
+ .lg\:uil-mt-120 {
617
+ margin-top: 120px;
618
+ }
619
+ }
620
+ .uil-mr-0 {
621
+ margin-right: 0;
622
+ }
623
+ .uil-mr-4 {
624
+ margin-right: 4px;
625
+ }
626
+ .uil-mr-8 {
627
+ margin-right: 8px;
628
+ }
629
+ .uil-mr-16 {
630
+ margin-right: 16px;
631
+ }
632
+ .uil-mr-32 {
633
+ margin-right: 32px;
634
+ }
635
+ .uil-mr-auto {
636
+ margin-right: auto;
637
+ }
638
+ @media (min-width: 960px) {
639
+ .md\:uil-mr-0 {
640
+ margin-right: 0;
641
+ }
642
+ }
643
+ @media (min-width: 960px) {
644
+ .md\:uil-mr-8 {
645
+ margin-right: 8px;
646
+ }
647
+ }
648
+ @media (min-width: 960px) {
649
+ .md\:uil-mr-20 {
650
+ margin-right: 20px;
651
+ }
652
+ }
653
+ @media (min-width: 1200px) {
654
+ .lg\:uil-mr-12 {
655
+ margin-right: 12px;
656
+ }
657
+ }
658
+ .uil-mb-0 {
659
+ margin-bottom: 0;
660
+ }
661
+ .uil-mb-8 {
662
+ margin-bottom: 8px;
663
+ }
664
+ .uil-mb-12 {
665
+ margin-bottom: 12px;
666
+ }
667
+ .uil-mb-16 {
668
+ margin-bottom: 16px;
669
+ }
670
+ .uil-mb-20 {
671
+ margin-bottom: 20px;
672
+ }
673
+ .uil-mb-24 {
674
+ margin-bottom: 24px;
675
+ }
676
+ .uil-mb-48 {
677
+ margin-bottom: 48px;
678
+ }
679
+ @media (min-width: 768px) {
680
+ .sm\:uil-mb-0 {
681
+ margin-bottom: 0;
682
+ }
683
+ }
684
+ @media (min-width: 960px) {
685
+ .md\:uil-mb-0 {
686
+ margin-bottom: 0;
687
+ }
688
+ }
689
+ @media (min-width: 960px) {
690
+ .md\:uil-mb-16 {
691
+ margin-bottom: 16px;
692
+ }
693
+ }
694
+ @media (min-width: 960px) {
695
+ .md\:uil-mb-24 {
696
+ margin-bottom: 24px;
697
+ }
698
+ }
699
+ @media (min-width: 1200px) {
700
+ .lg\:uil-mb-20 {
701
+ margin-bottom: 20px;
702
+ }
703
+ }
704
+ @media (min-width: 1200px) {
705
+ .lg\:uil-mb-24 {
706
+ margin-bottom: 24px;
707
+ }
708
+ }
709
+ @media (min-width: 1200px) {
710
+ .lg\:uil-mb-80 {
711
+ margin-bottom: 80px;
712
+ }
713
+ }
714
+ .uil-mv-0 {
715
+ margin-top: 0;
716
+ margin-bottom: 0;
717
+ }
718
+ .uil-mv-8 {
719
+ margin-top: 8px;
720
+ margin-bottom: 8px;
721
+ }
722
+ .uil-mh-0 {
723
+ margin-left: 0;
724
+ margin-right: 0;
725
+ }
726
+ .uil-mh-auto {
727
+ margin-left: auto;
728
+ margin-right: auto;
729
+ }
730
+ @media (min-width: 960px) {
731
+ .md\:uil-mh-12 {
732
+ margin-left: 12px;
733
+ margin-right: 12px;
734
+ }
735
+ }
736
+ .uil-ov-visible {
737
+ overflow: visible;
738
+ }
739
+ .uil-ov-hidden {
740
+ overflow: hidden;
741
+ }
742
+ .uil-ov-auto {
743
+ overflow: auto;
744
+ }
745
+ @media (min-width: 960px) {
746
+ .md\:uil-ov-hidden {
747
+ overflow: hidden;
748
+ }
749
+ }
750
+ .uil-ovx-scroll {
751
+ overflow-x: scroll;
752
+ }
753
+ .uil-ovx-auto {
754
+ overflow-x: auto;
755
+ }
756
+ .uil-ovy-hidden {
757
+ overflow-y: hidden;
758
+ }
759
+ .uil-ovy-auto {
760
+ overflow-y: auto;
761
+ }
762
+ .uil-p-0 {
763
+ padding: 0;
764
+ }
765
+ .uil-p-8 {
766
+ padding: 8px;
767
+ }
768
+ .uil-p-12 {
769
+ padding: 12px;
770
+ }
771
+ .uil-p-20 {
772
+ padding: 20px;
773
+ }
774
+ .uil-p-24 {
775
+ padding: 24px;
776
+ }
777
+ .uil-p-48 {
778
+ padding: 48px;
779
+ }
780
+ @media (min-width: 960px) {
781
+ .md\:uil-p-48 {
782
+ padding: 48px;
783
+ }
784
+ }
785
+ .uil-pl-0 {
786
+ padding-left: 0;
787
+ }
788
+ .uil-pl-8 {
789
+ padding-left: 8px;
790
+ }
791
+ .uil-pl-12 {
792
+ padding-left: 12px;
793
+ }
794
+ .uil-pl-16 {
795
+ padding-left: 16px;
796
+ }
797
+ .uil-pl-24 {
798
+ padding-left: 24px;
799
+ }
800
+ .uil-pl-48 {
801
+ padding-left: 48px;
802
+ }
803
+ @media (min-width: 960px) {
804
+ .md\:uil-pl-24 {
805
+ padding-left: 24px;
806
+ }
807
+ }
808
+ @media (min-width: 960px) {
809
+ .md\:uil-pl-48 {
810
+ padding-left: 48px;
811
+ }
812
+ }
813
+ @media (min-width: 1200px) {
814
+ .lg\:uil-pl-32 {
815
+ padding-left: 32px;
816
+ }
817
+ }
818
+ @media (min-width: 1200px) {
819
+ .lg\:uil-pl-48 {
820
+ padding-left: 48px;
821
+ }
822
+ }
823
+ .uil-pt-0 {
824
+ padding-top: 0;
825
+ }
826
+ .uil-pt-12 {
827
+ padding-top: 12px;
828
+ }
829
+ .uil-pt-16 {
830
+ padding-top: 16px;
831
+ }
832
+ .uil-pt-24 {
833
+ padding-top: 24px;
834
+ }
835
+ .uil-pt-32 {
836
+ padding-top: 32px;
837
+ }
838
+ .uil-pt-48 {
839
+ padding-top: 48px;
840
+ }
841
+ @media (min-width: 960px) {
842
+ .md\:uil-pt-0 {
843
+ padding-top: 0;
844
+ }
845
+ }
846
+ @media (min-width: 960px) {
847
+ .md\:uil-pt-24 {
848
+ padding-top: 24px;
849
+ }
850
+ }
851
+ @media (min-width: 1200px) {
852
+ .lg\:uil-pt-24 {
853
+ padding-top: 24px;
854
+ }
855
+ }
856
+ @media (min-width: 1200px) {
857
+ .lg\:uil-pt-32 {
858
+ padding-top: 32px;
859
+ }
860
+ }
861
+ @media (min-width: 1200px) {
862
+ .lg\:uil-pt-48 {
863
+ padding-top: 48px;
864
+ }
865
+ }
866
+ @media (min-width: 1200px) {
867
+ .lg\:uil-pt-80 {
868
+ padding-top: 80px;
869
+ }
870
+ }
871
+ .uil-pr-0 {
872
+ padding-right: 0;
873
+ }
874
+ .uil-pr-8 {
875
+ padding-right: 8px;
876
+ }
877
+ .uil-pr-16 {
878
+ padding-right: 16px;
879
+ }
880
+ .uil-pr-24 {
881
+ padding-right: 24px;
882
+ }
883
+ .uil-pr-32 {
884
+ padding-right: 32px;
885
+ }
886
+ .uil-pr-48 {
887
+ padding-right: 48px;
888
+ }
889
+ .uil-pr-80 {
890
+ padding-right: 80px;
891
+ }
892
+ @media (min-width: 960px) {
893
+ .md\:uil-pr-0 {
894
+ padding-right: 0;
895
+ }
896
+ }
897
+ @media (min-width: 960px) {
898
+ .md\:uil-pr-24 {
899
+ padding-right: 24px;
900
+ }
901
+ }
902
+ @media (min-width: 960px) {
903
+ .md\:uil-pr-48 {
904
+ padding-right: 48px;
905
+ }
906
+ }
907
+ @media (min-width: 1200px) {
908
+ .lg\:uil-pr-8 {
909
+ padding-right: 8px;
910
+ }
911
+ }
912
+ @media (min-width: 1200px) {
913
+ .lg\:uil-pr-48 {
914
+ padding-right: 48px;
915
+ }
916
+ }
917
+ .uil-pb-0 {
918
+ padding-bottom: 0;
919
+ }
920
+ .uil-pb-12 {
921
+ padding-bottom: 12px;
922
+ }
923
+ .uil-pb-16 {
924
+ padding-bottom: 16px;
925
+ }
926
+ .uil-pb-24 {
927
+ padding-bottom: 24px;
928
+ }
929
+ .uil-pb-48 {
930
+ padding-bottom: 48px;
931
+ }
932
+ .uil-pb-80 {
933
+ padding-bottom: 80px;
934
+ }
935
+ @media (min-width: 960px) {
936
+ .md\:uil-pb-24 {
937
+ padding-bottom: 24px;
938
+ }
939
+ }
940
+ @media (min-width: 1200px) {
941
+ .lg\:uil-pb-24 {
942
+ padding-bottom: 24px;
943
+ }
944
+ }
945
+ @media (min-width: 1200px) {
946
+ .lg\:uil-pb-48 {
947
+ padding-bottom: 48px;
948
+ }
949
+ }
950
+ @media (min-width: 1200px) {
951
+ .lg\:uil-pb-80 {
952
+ padding-bottom: 80px;
953
+ }
954
+ }
955
+ @media (min-width: 1200px) {
956
+ .lg\:uil-pb-120 {
957
+ padding-bottom: 120px;
958
+ }
959
+ }
960
+ .uil-pv-8 {
961
+ padding-top: 8px;
962
+ padding-bottom: 8px;
963
+ }
964
+ .uil-pv-16 {
965
+ padding-top: 16px;
966
+ padding-bottom: 16px;
967
+ }
968
+ .uil-pv-20 {
969
+ padding-top: 20px;
970
+ padding-bottom: 20px;
971
+ }
972
+ .uil-pv-24 {
973
+ padding-top: 24px;
974
+ padding-bottom: 24px;
975
+ }
976
+ .uil-pv-32 {
977
+ padding-top: 32px;
978
+ padding-bottom: 32px;
979
+ }
980
+ .uil-pv-48 {
981
+ padding-top: 48px;
982
+ padding-bottom: 48px;
983
+ }
984
+ .uil-pv-80 {
985
+ padding-top: 80px;
986
+ padding-bottom: 80px;
987
+ }
988
+ @media (min-width: 960px) {
989
+ .md\:uil-pv-120 {
990
+ padding-top: 120px;
991
+ padding-bottom: 120px;
992
+ }
993
+ }
994
+ @media (min-width: 1200px) {
995
+ .lg\:uil-pv-32 {
996
+ padding-top: 32px;
997
+ padding-bottom: 32px;
998
+ }
999
+ }
1000
+ @media (min-width: 1200px) {
1001
+ .lg\:uil-pv-48 {
1002
+ padding-top: 48px;
1003
+ padding-bottom: 48px;
1004
+ }
1005
+ }
1006
+ @media (min-width: 1200px) {
1007
+ .lg\:uil-pv-120 {
1008
+ padding-top: 120px;
1009
+ padding-bottom: 120px;
1010
+ }
1011
+ }
1012
+ .uil-ph-0 {
1013
+ padding-left: 0;
1014
+ padding-right: 0;
1015
+ }
1016
+ .uil-ph-4 {
1017
+ padding-left: 4px;
1018
+ padding-right: 4px;
1019
+ }
1020
+ .uil-ph-8 {
1021
+ padding-left: 8px;
1022
+ padding-right: 8px;
1023
+ }
1024
+ .uil-ph-12 {
1025
+ padding-left: 12px;
1026
+ padding-right: 12px;
1027
+ }
1028
+ .uil-ph-16 {
1029
+ padding-left: 16px;
1030
+ padding-right: 16px;
1031
+ }
1032
+ .uil-ph-20 {
1033
+ padding-left: 20px;
1034
+ padding-right: 20px;
1035
+ }
1036
+ .uil-ph-24 {
1037
+ padding-left: 24px;
1038
+ padding-right: 24px;
1039
+ }
1040
+ .uil-ph-32 {
1041
+ padding-left: 32px;
1042
+ padding-right: 32px;
1043
+ }
1044
+ @media (min-width: 768px) {
1045
+ .sm\:uil-ph-16 {
1046
+ padding-left: 16px;
1047
+ padding-right: 16px;
1048
+ }
1049
+ }
1050
+ @media (min-width: 960px) {
1051
+ .md\:uil-ph-0 {
1052
+ padding-left: 0;
1053
+ padding-right: 0;
1054
+ }
1055
+ }
1056
+ @media (min-width: 960px) {
1057
+ .md\:uil-ph-20 {
1058
+ padding-left: 20px;
1059
+ padding-right: 20px;
1060
+ }
1061
+ }
1062
+ @media (min-width: 960px) {
1063
+ .md\:uil-ph-48 {
1064
+ padding-left: 48px;
1065
+ padding-right: 48px;
1066
+ }
1067
+ }
1068
+ @media (min-width: 1200px) {
1069
+ .lg\:uil-ph-20 {
1070
+ padding-left: 20px;
1071
+ padding-right: 20px;
1072
+ }
1073
+ }
1074
+ @media (min-width: 1200px) {
1075
+ .lg\:uil-ph-32 {
1076
+ padding-left: 32px;
1077
+ padding-right: 32px;
1078
+ }
1079
+ }
1080
+ @media (min-width: 1200px) {
1081
+ .lg\:uil-ph-48 {
1082
+ padding-left: 48px;
1083
+ padding-right: 48px;
1084
+ }
1085
+ }
1086
+ .uil-v-visible {
1087
+ visibility: visible;
1088
+ }
1089
+ .uil-v-hidden {
1090
+ visibility: hidden;
1091
+ }
1092
+ @media (min-width: 960px) {
1093
+ .md\:uil-v-visible {
1094
+ visibility: visible;
1095
+ }
1096
+ }
1097
+ @media (min-width: 960px) {
1098
+ .md\:uil-v-hidden {
1099
+ visibility: hidden;
1100
+ }
1101
+ }
1102
+ .hover\:uil-color-white:focus,
1103
+ .hover\:uil-color-white:hover,
1104
+ .uil-color-white {
1105
+ color: #fff;
1106
+ }
1107
+ .hover\:uil-color-grey-900:focus,
1108
+ .hover\:uil-color-grey-900:hover,
1109
+ .uil-color-grey-900 {
1110
+ color: #23263b;
1111
+ }
1112
+ .uil-color-grey-800 {
1113
+ color: #36395a;
1114
+ }
1115
+ .hover\:uil-color-grey-700:focus,
1116
+ .hover\:uil-color-grey-700:hover,
1117
+ .uil-color-grey-700 {
1118
+ color: #484c7a;
1119
+ }
1120
+ .hover\:uil-color-grey-600:focus,
1121
+ .hover\:uil-color-grey-600:hover,
1122
+ .uil-color-grey-600 {
1123
+ color: #5a5e9a;
1124
+ }
1125
+ .uil-color-grey-500 {
1126
+ color: #777aaf;
1127
+ }
1128
+ .hover\:uil-color-grey-400:focus,
1129
+ .hover\:uil-color-grey-400:hover,
1130
+ .uil-color-grey-400 {
1131
+ color: #9698c3;
1132
+ }
1133
+ .uil-color-grey-300 {
1134
+ color: #b6b7d5;
1135
+ }
1136
+ .hover\:uil-color-grey-200:focus,
1137
+ .hover\:uil-color-grey-200:hover,
1138
+ .uil-color-grey-200 {
1139
+ color: #d6d6e7;
1140
+ }
1141
+ .hover\:uil-color-grey-100:focus,
1142
+ .hover\:uil-color-grey-100:hover,
1143
+ .uil-color-grey-100 {
1144
+ color: #f5f5fa;
1145
+ }
1146
+ .uil-color-pink-600 {
1147
+ color: #e90a96;
1148
+ }
1149
+ .uil-color-nebula-500 {
1150
+ color: #5468ff;
1151
+ }
1152
+ .uil-color-green-700 {
1153
+ color: #06b66c;
1154
+ }
1155
+ .uil-color-orange-600 {
1156
+ color: #f78125;
1157
+ }
1158
+ .uil-color-red-600 {
1159
+ color: #ee243c;
1160
+ }
1161
+ .uil-color-red-500 {
1162
+ color: #f4495d;
1163
+ }
1164
+ .uil-color-current {
1165
+ color: currentColor;
1166
+ }
1167
+ .uil-fill-white {
1168
+ fill: #fff;
1169
+ }
1170
+ .uil-ai-center {
1171
+ align-items: center;
1172
+ }
1173
+ .uil-ai-end {
1174
+ align-items: flex-end;
1175
+ }
1176
+ @media (min-width: 768px) {
1177
+ .sm\:uil-ai-start {
1178
+ align-items: flex-start;
1179
+ }
1180
+ }
1181
+ @media (min-width: 960px) {
1182
+ .md\:uil-ai-start {
1183
+ align-items: flex-start;
1184
+ }
1185
+ }
1186
+ @media (min-width: 960px) {
1187
+ .md\:uil-ai-center {
1188
+ align-items: center;
1189
+ }
1190
+ }
1191
+ @media (min-width: 960px) {
1192
+ .md\:uil-ai-end {
1193
+ align-items: flex-end;
1194
+ }
1195
+ }
1196
+ @media (min-width: 1200px) {
1197
+ .lg\:uil-ai-end {
1198
+ align-items: flex-end;
1199
+ }
1200
+ }
1201
+ .uil-as-end {
1202
+ align-self: flex-end;
1203
+ }
1204
+ .uil-fxd-column {
1205
+ flex-direction: column;
1206
+ }
1207
+ .uil-fxd-row {
1208
+ flex-direction: row;
1209
+ }
1210
+ @media (min-width: 500px) {
1211
+ .xs\:uil-fxd-row {
1212
+ flex-direction: row;
1213
+ }
1214
+ }
1215
+ @media (min-width: 768px) {
1216
+ .sm\:uil-fxd-row {
1217
+ flex-direction: row;
1218
+ }
1219
+ }
1220
+ @media (min-width: 960px) {
1221
+ .md\:uil-fxd-column {
1222
+ flex-direction: column;
1223
+ }
1224
+ }
1225
+ @media (min-width: 960px) {
1226
+ .md\:uil-fxd-row {
1227
+ flex-direction: row;
1228
+ }
1229
+ }
1230
+ @media (min-width: 960px) {
1231
+ .md\:uil-fxd-row-reverse {
1232
+ flex-direction: row-reverse;
1233
+ }
1234
+ }
1235
+ .uil-fxg-0 {
1236
+ flex-grow: 0;
1237
+ }
1238
+ .uil-fxg-1 {
1239
+ flex-grow: 1;
1240
+ }
1241
+ @media (min-width: 960px) {
1242
+ .md\:uil-fxg-1 {
1243
+ flex-grow: 1;
1244
+ }
1245
+ }
1246
+ .uil-fxs-0 {
1247
+ flex-shrink: 0;
1248
+ }
1249
+ .uil-fxs-1 {
1250
+ flex-shrink: 1;
1251
+ }
1252
+ .uil-fx-1 {
1253
+ flex: 0 1 8.333333%;
1254
+ }
1255
+ .uil-fx-4 {
1256
+ flex: 0 1 33.333333%;
1257
+ }
1258
+ .uil-fx-5 {
1259
+ flex: 0 1 41.666667%;
1260
+ }
1261
+ .uil-fx-6 {
1262
+ flex: 0 1 50%;
1263
+ }
1264
+ .uil-fx-12 {
1265
+ flex: 0 1 100%;
1266
+ }
1267
+ @media (min-width: 960px) {
1268
+ .md\:uil-fx-5 {
1269
+ flex: 0 1 41.666667%;
1270
+ }
1271
+ }
1272
+ @media (min-width: 960px) {
1273
+ .md\:uil-fx-6 {
1274
+ flex: 0 1 50%;
1275
+ }
1276
+ }
1277
+ @media (min-width: 960px) {
1278
+ .md\:uil-fx-7 {
1279
+ flex: 0 1 58.333333%;
1280
+ }
1281
+ }
1282
+ @media (min-width: 960px) {
1283
+ .md\:uil-fx-9 {
1284
+ flex: 0 1 75%;
1285
+ }
1286
+ }
1287
+ .uil-jc-center {
1288
+ justify-content: center;
1289
+ }
1290
+ .uil-jc-end {
1291
+ justify-content: flex-end;
1292
+ }
1293
+ .uil-jc-between {
1294
+ justify-content: space-between;
1295
+ }
1296
+ .uil-jc-around {
1297
+ justify-content: space-around;
1298
+ }
1299
+ @media (min-width: 500px) {
1300
+ .xs\:uil-jc-center {
1301
+ justify-content: center;
1302
+ }
1303
+ }
1304
+ @media (min-width: 768px) {
1305
+ .sm\:uil-jc-start {
1306
+ justify-content: flex-start;
1307
+ }
1308
+ }
1309
+ @media (min-width: 768px) {
1310
+ .sm\:uil-jc-center {
1311
+ justify-content: center;
1312
+ }
1313
+ }
1314
+ @media (min-width: 960px) {
1315
+ .md\:uil-jc-start {
1316
+ justify-content: flex-start;
1317
+ }
1318
+ }
1319
+ @media (min-width: 960px) {
1320
+ .md\:uil-jc-center {
1321
+ justify-content: center;
1322
+ }
1323
+ }
1324
+ @media (min-width: 960px) {
1325
+ .md\:uil-jc-end {
1326
+ justify-content: flex-end;
1327
+ }
1328
+ }
1329
+ @media (min-width: 960px) {
1330
+ .md\:uil-jc-between {
1331
+ justify-content: space-between;
1332
+ }
1333
+ }
1334
+ @media (min-width: 960px) {
1335
+ .md\:uil-jc-around {
1336
+ justify-content: space-around;
1337
+ }
1338
+ }
1339
+ @media (min-width: 1200px) {
1340
+ .lg\:uil-jc-end {
1341
+ justify-content: flex-end;
1342
+ }
1343
+ }
1344
+ @media (min-width: 960px) {
1345
+ .md\:uil-gcstart-1 {
1346
+ grid-column-start: 1;
1347
+ }
1348
+ }
1349
+ @media (min-width: 960px) {
1350
+ .md\:uil-gcstart-2 {
1351
+ grid-column-start: 2;
1352
+ }
1353
+ }
1354
+ @media (min-width: 960px) {
1355
+ .md\:uil-gcend-3 {
1356
+ grid-column-end: 3;
1357
+ }
1358
+ }
1359
+ @media (min-width: 960px) {
1360
+ .md\:uil-grstart-1 {
1361
+ grid-row-start: 1;
1362
+ }
1363
+ }
1364
+ @media (min-width: 960px) {
1365
+ .md\:uil-grstart-2 {
1366
+ grid-row-start: 2;
1367
+ }
1368
+ }
1369
+ @media (min-width: 960px) {
1370
+ .md\:uil-grend-3 {
1371
+ grid-row-end: 3;
1372
+ }
1373
+ }
1374
+ @media (min-width: 960px) {
1375
+ .md\:uil-grend-4 {
1376
+ grid-row-end: 4;
1377
+ }
1378
+ }
1379
+ .uil-g-2 {
1380
+ grid-template-columns: repeat(2, 1fr);
1381
+ }
1382
+ @media (min-width: 768px) {
1383
+ .sm\:uil-g-2 {
1384
+ grid-template-columns: repeat(2, 1fr);
1385
+ }
1386
+ }
1387
+ @media (min-width: 768px) {
1388
+ .sm\:uil-g-3 {
1389
+ grid-template-columns: repeat(3, 1fr);
1390
+ }
1391
+ }
1392
+ @media (min-width: 768px) {
1393
+ .sm\:uil-g-4 {
1394
+ grid-template-columns: repeat(4, 1fr);
1395
+ }
1396
+ }
1397
+ @media (min-width: 768px) {
1398
+ .sm\:uil-g-5 {
1399
+ grid-template-columns: repeat(5, 1fr);
1400
+ }
1401
+ }
1402
+ @media (min-width: 768px) {
1403
+ .sm\:uil-g-6 {
1404
+ grid-template-columns: repeat(6, 1fr);
1405
+ }
1406
+ }
1407
+ @media (min-width: 960px) {
1408
+ .md\:uil-g-2 {
1409
+ grid-template-columns: repeat(2, 1fr);
1410
+ }
1411
+ }
1412
+ @media (min-width: 960px) {
1413
+ .md\:uil-g-3 {
1414
+ grid-template-columns: repeat(3, 1fr);
1415
+ }
1416
+ }
1417
+ @media (min-width: 960px) {
1418
+ .md\:uil-g-4 {
1419
+ grid-template-columns: repeat(4, 1fr);
1420
+ }
1421
+ }
1422
+ @media (min-width: 960px) {
1423
+ .md\:uil-g-5 {
1424
+ grid-template-columns: repeat(5, 1fr);
1425
+ }
1426
+ }
1427
+ @media (min-width: 960px) {
1428
+ .md\:uil-g-6 {
1429
+ grid-template-columns: repeat(6, 1fr);
1430
+ }
1431
+ }
1432
+ .uil-ggap-24 {
1433
+ grid-gap: 24px;
1434
+ }
1435
+ .uil-ggap-48 {
1436
+ grid-gap: 48px;
1437
+ }
1438
+ @media (min-width: 1200px) {
1439
+ .lg\:uil-ggap-24 {
1440
+ grid-gap: 24px;
1441
+ }
1442
+ }
1443
+ @media (min-width: 1200px) {
1444
+ .lg\:uil-ggap-32 {
1445
+ grid-gap: 32px;
1446
+ }
1447
+ }
1448
+ @media (min-width: 1200px) {
1449
+ .lg\:uil-ggap-48 {
1450
+ grid-gap: 48px;
1451
+ }
1452
+ }
1453
+ @media (min-width: 1200px) {
1454
+ .lg\:uil-ggap-80 {
1455
+ grid-gap: 80px;
1456
+ }
1457
+ }
1458
+ .uil-gvgap-8 {
1459
+ grid-column-gap: 8px;
1460
+ }
1461
+ @media (min-width: 768px) {
1462
+ .sm\:uil-gvgap-48 {
1463
+ grid-column-gap: 48px;
1464
+ }
1465
+ }
1466
+ .uil-ghgap-48 {
1467
+ grid-row-gap: 48px;
1468
+ }
1469
+ .uil-obf-contain {
1470
+ -o-object-fit: contain;
1471
+ object-fit: contain;
1472
+ }
1473
+ .uil-obf-cover {
1474
+ -o-object-fit: cover;
1475
+ object-fit: cover;
1476
+ }
1477
+ .uil-obp-center {
1478
+ -o-object-position: center;
1479
+ object-position: center;
1480
+ }
1481
+ .uil-bot-0 {
1482
+ bottom: 0;
1483
+ }
1484
+ .uil-bot-70 {
1485
+ bottom: 70px;
1486
+ }
1487
+ @media (min-width: 960px) {
1488
+ .md\:uil-bot-0 {
1489
+ bottom: 0;
1490
+ }
1491
+ }
1492
+ @media (min-width: 960px) {
1493
+ .md\:uil-fl-right {
1494
+ float: right;
1495
+ }
1496
+ }
1497
+ .uil-left-0 {
1498
+ left: 0;
1499
+ }
1500
+ .uil-left-50p {
1501
+ left: 50%;
1502
+ }
1503
+ @media (min-width: 960px) {
1504
+ .md\:uil-left-0 {
1505
+ left: 0;
1506
+ }
1507
+ }
1508
+ @media (min-width: 960px) {
1509
+ .md\:uil-left-50p {
1510
+ left: 50%;
1511
+ }
1512
+ }
1513
+ .uil-pos-relative {
1514
+ position: relative;
1515
+ }
1516
+ .uil-pos-absolute {
1517
+ position: absolute;
1518
+ }
1519
+ .uil-pos-fixed {
1520
+ position: fixed;
1521
+ }
1522
+ .uil-pos-sticky {
1523
+ position: sticky;
1524
+ }
1525
+ @media (min-width: 768px) {
1526
+ .sm\:uil-pos-absolute {
1527
+ position: absolute;
1528
+ }
1529
+ }
1530
+ @media (min-width: 960px) {
1531
+ .md\:uil-pos-relative {
1532
+ position: relative;
1533
+ }
1534
+ }
1535
+ @media (min-width: 960px) {
1536
+ .md\:uil-pos-absolute {
1537
+ position: absolute;
1538
+ }
1539
+ }
1540
+ @media (min-width: 960px) {
1541
+ .md\:uil-pos-fixed {
1542
+ position: fixed;
1543
+ }
1544
+ }
1545
+ @media (min-width: 960px) {
1546
+ .md\:uil-pos-sticky {
1547
+ position: sticky;
1548
+ }
1549
+ }
1550
+ .uil-right-0 {
1551
+ right: 0;
1552
+ }
1553
+ @media (min-width: 960px) {
1554
+ .md\:uil-right-0 {
1555
+ right: 0;
1556
+ }
1557
+ }
1558
+ @media (min-width: 960px) {
1559
+ .md\:uil-right-50p {
1560
+ right: 50%;
1561
+ }
1562
+ }
1563
+ .uil-top-0 {
1564
+ top: 0;
1565
+ }
1566
+ .uil-top-32 {
1567
+ top: 32px;
1568
+ }
1569
+ .uil-top-50p {
1570
+ top: 50%;
1571
+ }
1572
+ @media (min-width: 768px) {
1573
+ .sm\:uil-top-0 {
1574
+ top: 0;
1575
+ }
1576
+ }
1577
+ @media (min-width: 960px) {
1578
+ .md\:uil-top-0 {
1579
+ top: 0;
1580
+ }
1581
+ }
1582
+ @media (min-width: 960px) {
1583
+ .md\:uil-top-50p {
1584
+ top: 50%;
1585
+ }
1586
+ }
1587
+ .uil-va-middle {
1588
+ vertical-align: middle;
1589
+ }
1590
+ .uil-z-1 {
1591
+ z-index: 1;
1592
+ }
1593
+ .uil-z-2 {
1594
+ z-index: 2;
1595
+ }
1596
+ .uil-z-3 {
1597
+ z-index: 3;
1598
+ }
1599
+ .uil-z-4 {
1600
+ z-index: 4;
1601
+ }
1602
+ .uil-z-5 {
1603
+ z-index: 5;
1604
+ }
1605
+ .uil-z-max {
1606
+ z-index: 100;
1607
+ }
1608
+ @media (min-width: 960px) {
1609
+ .md\:uil-z-5 {
1610
+ z-index: 5;
1611
+ }
1612
+ }
1613
+ @media (min-width: 960px) {
1614
+ .md\:uil-z-max {
1615
+ z-index: 100;
1616
+ }
1617
+ }
1618
+ .uil-app-none {
1619
+ -webkit-appearance: none;
1620
+ -moz-appearance: none;
1621
+ appearance: none;
1622
+ }
1623
+ .uil-bxs-default {
1624
+ box-shadow: 0 5px 15px 0 rgba(37, 44, 97, 0.15),
1625
+ 0 2px 4px 0 rgba(93, 100, 148, 0.2);
1626
+ }
1627
+ .uil-bxs-large {
1628
+ box-shadow: 0 24px 41px 0 rgba(37, 44, 97, 0.13);
1629
+ }
1630
+ .uil-bxs-none {
1631
+ box-shadow: none;
1632
+ }
1633
+ @media (min-width: 960px) {
1634
+ .md\:uil-bxs-default {
1635
+ box-shadow: 0 5px 15px 0 rgba(37, 44, 97, 0.15),
1636
+ 0 2px 4px 0 rgba(93, 100, 148, 0.2);
1637
+ }
1638
+ }
1639
+ .uil-cursor-auto {
1640
+ cursor: auto;
1641
+ }
1642
+ .uil-cursor-pointer {
1643
+ cursor: pointer;
1644
+ }
1645
+ .uil-cursor-not-allowed {
1646
+ cursor: not-allowed;
1647
+ }
1648
+ .uil-op-0 {
1649
+ opacity: 0;
1650
+ }
1651
+ .uil-op-50p {
1652
+ opacity: 0.5;
1653
+ }
1654
+ .uil-op-40p {
1655
+ opacity: 0.4;
1656
+ }
1657
+ .uil-op-75p {
1658
+ opacity: 0.75;
1659
+ }
1660
+ .uil-op-100p {
1661
+ opacity: 1;
1662
+ }
1663
+ @media (min-width: 960px) {
1664
+ .md\:uil-op-0 {
1665
+ opacity: 0;
1666
+ }
1667
+ }
1668
+ @media (min-width: 960px) {
1669
+ .md\:uil-op-25p {
1670
+ opacity: 0.25;
1671
+ }
1672
+ }
1673
+ @media (min-width: 960px) {
1674
+ .md\:uil-op-100p {
1675
+ opacity: 1;
1676
+ }
1677
+ }
1678
+ .uil-pe-auto {
1679
+ pointer-events: auto;
1680
+ }
1681
+ .uil-pe-none {
1682
+ pointer-events: none;
1683
+ }
1684
+ @media (min-width: 960px) {
1685
+ .md\:uil-pe-none {
1686
+ pointer-events: none;
1687
+ }
1688
+ }
1689
+ .uil-us-none {
1690
+ -webkit-user-select: none;
1691
+ -moz-user-select: none;
1692
+ -ms-user-select: none;
1693
+ user-select: none;
1694
+ }
1695
+ .uil-h-0 {
1696
+ height: 0;
1697
+ }
1698
+ .uil-h-10 {
1699
+ height: 10px;
1700
+ }
1701
+ .uil-h-14 {
1702
+ height: 14px;
1703
+ }
1704
+ .uil-h-16 {
1705
+ height: 16px;
1706
+ }
1707
+ .uil-h-18 {
1708
+ height: 18px;
1709
+ }
1710
+ .uil-h-20 {
1711
+ height: 20px;
1712
+ }
1713
+ .uil-h-24 {
1714
+ height: 24px;
1715
+ }
1716
+ .uil-h-25 {
1717
+ height: 25px;
1718
+ }
1719
+ .uil-h-30 {
1720
+ height: 30px;
1721
+ }
1722
+ .uil-h-40 {
1723
+ height: 40px;
1724
+ }
1725
+ .uil-h-50 {
1726
+ height: 50px;
1727
+ }
1728
+ .uil-h-60 {
1729
+ height: 60px;
1730
+ }
1731
+ .uil-h-70 {
1732
+ height: 70px;
1733
+ }
1734
+ .uil-h-80 {
1735
+ height: 80px;
1736
+ }
1737
+ .uil-h-200 {
1738
+ height: 200px;
1739
+ }
1740
+ .uil-h-10p {
1741
+ height: 10%;
1742
+ }
1743
+ .uil-h-20p {
1744
+ height: 20%;
1745
+ }
1746
+ .uil-h-25p {
1747
+ height: 25%;
1748
+ }
1749
+ .uil-h-30p {
1750
+ height: 30%;
1751
+ }
1752
+ .uil-h-40p {
1753
+ height: 40%;
1754
+ }
1755
+ .uil-h-50p {
1756
+ height: 50%;
1757
+ }
1758
+ .uil-h-60p {
1759
+ height: 60%;
1760
+ }
1761
+ .uil-h-70p {
1762
+ height: 70%;
1763
+ }
1764
+ .uil-h-80p {
1765
+ height: 80%;
1766
+ }
1767
+ .uil-h-90p {
1768
+ height: 90%;
1769
+ }
1770
+ .uil-h-100p {
1771
+ height: 100%;
1772
+ }
1773
+ .uil-h-100vh {
1774
+ height: 100vh;
1775
+ }
1776
+ .uil-h-auto {
1777
+ height: auto;
1778
+ }
1779
+ @media (min-width: 960px) {
1780
+ .md\:uil-h-10 {
1781
+ height: 10px;
1782
+ }
1783
+ }
1784
+ @media (min-width: 960px) {
1785
+ .md\:uil-h-30 {
1786
+ height: 30px;
1787
+ }
1788
+ }
1789
+ @media (min-width: 960px) {
1790
+ .md\:uil-h-60p {
1791
+ height: 60%;
1792
+ }
1793
+ }
1794
+ @media (min-width: 960px) {
1795
+ .md\:uil-h-100p {
1796
+ height: 100%;
1797
+ }
1798
+ }
1799
+ @media (min-width: 960px) {
1800
+ .md\:uil-h-100vh {
1801
+ height: 100vh;
1802
+ }
1803
+ }
1804
+ @media (min-width: 960px) {
1805
+ .md\:uil-h-auto {
1806
+ height: auto;
1807
+ }
1808
+ }
1809
+ @media (min-width: 1200px) {
1810
+ .lg\:uil-h-18 {
1811
+ height: 18px;
1812
+ }
1813
+ }
1814
+ @media (min-width: 1200px) {
1815
+ .lg\:uil-h-20 {
1816
+ height: 20px;
1817
+ }
1818
+ }
1819
+ @media (min-width: 1200px) {
1820
+ .lg\:uil-h-24 {
1821
+ height: 24px;
1822
+ }
1823
+ }
1824
+ @media (min-width: 1200px) {
1825
+ .lg\:uil-h-30 {
1826
+ height: 30px;
1827
+ }
1828
+ }
1829
+ @media (min-width: 1200px) {
1830
+ .lg\:uil-h-40 {
1831
+ height: 40px;
1832
+ }
1833
+ }
1834
+ @media (min-width: 1200px) {
1835
+ .lg\:uil-h-70 {
1836
+ height: 70px;
1837
+ }
1838
+ }
1839
+ @media (min-width: 1200px) {
1840
+ .lg\:uil-h-80 {
1841
+ height: 80px;
1842
+ }
1843
+ }
1844
+ @media (min-width: 1200px) {
1845
+ .lg\:uil-h-100 {
1846
+ height: 100px;
1847
+ }
1848
+ }
1849
+ @media (min-width: 1200px) {
1850
+ .lg\:uil-h-100p {
1851
+ height: 100%;
1852
+ }
1853
+ }
1854
+ .uil-mah-100p {
1855
+ max-height: 100%;
1856
+ }
1857
+ .uil-mah-100vh {
1858
+ max-height: 100vh;
1859
+ }
1860
+ @media (min-width: 960px) {
1861
+ .md\:uil-mah-100p {
1862
+ max-height: 100%;
1863
+ }
1864
+ }
1865
+ .uil-maw-500 {
1866
+ max-width: 500px;
1867
+ }
1868
+ .uil-maw-700 {
1869
+ max-width: 700px;
1870
+ }
1871
+ .uil-maw-800 {
1872
+ max-width: 800px;
1873
+ }
1874
+ .uil-maw-1200 {
1875
+ max-width: 1200px;
1876
+ }
1877
+ .uil-maw-1440 {
1878
+ max-width: 1440px;
1879
+ }
1880
+ .uil-maw-35ch {
1881
+ max-width: 35ch;
1882
+ }
1883
+ .uil-maw-100p {
1884
+ max-width: 100%;
1885
+ }
1886
+ @media (min-width: 960px) {
1887
+ .md\:uil-maw-600 {
1888
+ max-width: 600px;
1889
+ }
1890
+ }
1891
+ @media (min-width: 960px) {
1892
+ .md\:uil-maw-900 {
1893
+ max-width: 900px;
1894
+ }
1895
+ }
1896
+ @media (min-width: 960px) {
1897
+ .md\:uil-maw-1200 {
1898
+ max-width: 1200px;
1899
+ }
1900
+ }
1901
+ @media (min-width: 960px) {
1902
+ .md\:uil-maw-100p {
1903
+ max-width: 100%;
1904
+ }
1905
+ }
1906
+ @media (min-width: 1200px) {
1907
+ .lg\:uil-maw-1200 {
1908
+ max-width: 1200px;
1909
+ }
1910
+ }
1911
+ .uil-miw-200 {
1912
+ min-width: 200px;
1913
+ }
1914
+ @media (min-width: 960px) {
1915
+ .md\:uil-miw-300 {
1916
+ min-width: 300px;
1917
+ }
1918
+ }
1919
+ .uil-w-10 {
1920
+ width: 10px;
1921
+ }
1922
+ .uil-w-14 {
1923
+ width: 14px;
1924
+ }
1925
+ .uil-w-16 {
1926
+ width: 16px;
1927
+ }
1928
+ .uil-w-18 {
1929
+ width: 18px;
1930
+ }
1931
+ .uil-w-20 {
1932
+ width: 20px;
1933
+ }
1934
+ .uil-w-25 {
1935
+ width: 25px;
1936
+ }
1937
+ .uil-w-30 {
1938
+ width: 30px;
1939
+ }
1940
+ .uil-w-40 {
1941
+ width: 40px;
1942
+ }
1943
+ .uil-w-50 {
1944
+ width: 50px;
1945
+ }
1946
+ .uil-w-60 {
1947
+ width: 60px;
1948
+ }
1949
+ .uil-w-100 {
1950
+ width: 100px;
1951
+ }
1952
+ .uil-w-200 {
1953
+ width: 200px;
1954
+ }
1955
+ .uil-w-50p {
1956
+ width: 50%;
1957
+ }
1958
+ .uil-w-70p {
1959
+ width: 70%;
1960
+ }
1961
+ .uil-w-80p {
1962
+ width: 80%;
1963
+ }
1964
+ .uil-w-100p {
1965
+ width: 100%;
1966
+ }
1967
+ .uil-w-auto {
1968
+ width: auto;
1969
+ }
1970
+ @media (min-width: 500px) {
1971
+ .xs\:uil-w-60p {
1972
+ width: 60%;
1973
+ }
1974
+ }
1975
+ @media (min-width: 500px) {
1976
+ .xs\:uil-w-70p {
1977
+ width: 70%;
1978
+ }
1979
+ }
1980
+ @media (min-width: 960px) {
1981
+ .md\:uil-w-10 {
1982
+ width: 10px;
1983
+ }
1984
+ }
1985
+ @media (min-width: 960px) {
1986
+ .md\:uil-w-30 {
1987
+ width: 30px;
1988
+ }
1989
+ }
1990
+ @media (min-width: 960px) {
1991
+ .md\:uil-w-400 {
1992
+ width: 400px;
1993
+ }
1994
+ }
1995
+ @media (min-width: 960px) {
1996
+ .md\:uil-w-40p {
1997
+ width: 40%;
1998
+ }
1999
+ }
2000
+ @media (min-width: 960px) {
2001
+ .md\:uil-w-50p {
2002
+ width: 50%;
2003
+ }
2004
+ }
2005
+ @media (min-width: 960px) {
2006
+ .md\:uil-w-60p {
2007
+ width: 60%;
2008
+ }
2009
+ }
2010
+ @media (min-width: 960px) {
2011
+ .md\:uil-w-70p {
2012
+ width: 70%;
2013
+ }
2014
+ }
2015
+ @media (min-width: 960px) {
2016
+ .md\:uil-w-100p {
2017
+ width: 100%;
2018
+ }
2019
+ }
2020
+ @media (min-width: 960px) {
2021
+ .md\:uil-w-auto {
2022
+ width: auto;
2023
+ }
2024
+ }
2025
+ @media (min-width: 1200px) {
2026
+ .lg\:uil-w-18 {
2027
+ width: 18px;
2028
+ }
2029
+ }
2030
+ @media (min-width: 1200px) {
2031
+ .lg\:uil-w-20 {
2032
+ width: 20px;
2033
+ }
2034
+ }
2035
+ @media (min-width: 1200px) {
2036
+ .lg\:uil-w-24 {
2037
+ width: 24px;
2038
+ }
2039
+ }
2040
+ @media (min-width: 1200px) {
2041
+ .lg\:uil-w-30 {
2042
+ width: 30px;
2043
+ }
2044
+ }
2045
+ @media (min-width: 1200px) {
2046
+ .lg\:uil-w-40 {
2047
+ width: 40px;
2048
+ }
2049
+ }
2050
+ @media (min-width: 1200px) {
2051
+ .lg\:uil-w-50 {
2052
+ width: 50px;
2053
+ }
2054
+ }
2055
+ @media (min-width: 1200px) {
2056
+ .lg\:uil-w-80 {
2057
+ width: 80px;
2058
+ }
2059
+ }
2060
+ @media (min-width: 1200px) {
2061
+ .lg\:uil-w-200 {
2062
+ width: 200px;
2063
+ }
2064
+ }
2065
+ @media (min-width: 1200px) {
2066
+ .lg\:uil-w-50p {
2067
+ width: 50%;
2068
+ }
2069
+ }
2070
+ @media (min-width: 1200px) {
2071
+ .lg\:uil-w-70p {
2072
+ width: 70%;
2073
+ }
2074
+ }
2075
+ @media (min-width: 1200px) {
2076
+ .lg\:uil-w-80p {
2077
+ width: 80%;
2078
+ }
2079
+ }
2080
+ @media (min-width: 1200px) {
2081
+ .lg\:uil-w-90p {
2082
+ width: 90%;
2083
+ }
2084
+ }
2085
+ @media (min-width: 1200px) {
2086
+ .lg\:uil-w-100p {
2087
+ width: 100%;
2088
+ }
2089
+ }
2090
+ .uil-ff-hind {
2091
+ font-family: Hind, Arial, sans-serif;
2092
+ }
2093
+ .uil-ff-poppins {
2094
+ font-family: Poppins, Arial, sans-serif;
2095
+ }
2096
+ .uil-ff-mono {
2097
+ font-family: SFMono-Regular, Consolas, Andale Mono WT, Andale Mono,
2098
+ Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono,
2099
+ Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Monaco,
2100
+ Courier New, Courier, monospace;
2101
+ }
2102
+ @media (min-width: 1200px) {
2103
+ .lg\:uil-ff-hind {
2104
+ font-family: Hind, Arial, sans-serif;
2105
+ }
2106
+ }
2107
+ .uil-fsz-10 {
2108
+ font-size: 10px;
2109
+ }
2110
+ .uil-fsz-11 {
2111
+ font-size: 11px;
2112
+ }
2113
+ .uil-fsz-12 {
2114
+ font-size: 12px;
2115
+ }
2116
+ .uil-fsz-14 {
2117
+ font-size: 14px;
2118
+ }
2119
+ .uil-fsz-16 {
2120
+ font-size: 16px;
2121
+ }
2122
+ .uil-fsz-18 {
2123
+ font-size: 18px;
2124
+ }
2125
+ .uil-fsz-24 {
2126
+ font-size: 24px;
2127
+ }
2128
+ .uil-fsz-36 {
2129
+ font-size: 36px;
2130
+ }
2131
+ @media (min-width: 960px) {
2132
+ .md\:uil-fsz-16 {
2133
+ font-size: 16px;
2134
+ }
2135
+ }
2136
+ @media (min-width: 1200px) {
2137
+ .lg\:uil-fsz-12 {
2138
+ font-size: 12px;
2139
+ }
2140
+ }
2141
+ @media (min-width: 1200px) {
2142
+ .lg\:uil-fsz-14 {
2143
+ font-size: 14px;
2144
+ }
2145
+ }
2146
+ @media (min-width: 1200px) {
2147
+ .lg\:uil-fsz-16 {
2148
+ font-size: 16px;
2149
+ }
2150
+ }
2151
+ @media (min-width: 1200px) {
2152
+ .lg\:uil-fsz-18 {
2153
+ font-size: 18px;
2154
+ }
2155
+ }
2156
+ @media (min-width: 1200px) {
2157
+ .lg\:uil-fsz-24 {
2158
+ font-size: 24px;
2159
+ }
2160
+ }
2161
+ @media (min-width: 1200px) {
2162
+ .lg\:uil-fsz-36 {
2163
+ font-size: 36px;
2164
+ }
2165
+ }
2166
+ @media (min-width: 1200px) {
2167
+ .lg\:uil-fsz-56 {
2168
+ font-size: 56px;
2169
+ }
2170
+ }
2171
+ .uil-fst-normal {
2172
+ font-style: normal;
2173
+ }
2174
+ .uil-fw-light {
2175
+ font-weight: 300;
2176
+ }
2177
+ .uil-fw-normal {
2178
+ font-weight: 400;
2179
+ }
2180
+ .uil-fw-semibold {
2181
+ font-weight: 600;
2182
+ }
2183
+ .uil-fw-bold {
2184
+ font-weight: 700;
2185
+ }
2186
+ .uil-lsp-small {
2187
+ letter-spacing: -1px;
2188
+ }
2189
+ .uil-lsp-big {
2190
+ letter-spacing: 1.5px;
2191
+ }
2192
+ .uil-lsp-normal {
2193
+ letter-spacing: normal;
2194
+ }
2195
+ @media (min-width: 1200px) {
2196
+ .lg\:uil-lsp-medium {
2197
+ letter-spacing: 0.7px;
2198
+ }
2199
+ }
2200
+ .uil-lh-small {
2201
+ line-height: 1;
2202
+ }
2203
+ .uil-lh-big {
2204
+ line-height: 1.33;
2205
+ }
2206
+ .uil-lh-bigger {
2207
+ line-height: 1.78;
2208
+ }
2209
+ .uil-lis-none {
2210
+ list-style: none;
2211
+ }
2212
+ .uil-ta-left {
2213
+ text-align: left;
2214
+ }
2215
+ .uil-ta-center {
2216
+ text-align: center;
2217
+ }
2218
+ .uil-ta-right {
2219
+ text-align: right;
2220
+ }
2221
+ @media (min-width: 768px) {
2222
+ .sm\:uil-ta-left {
2223
+ text-align: left;
2224
+ }
2225
+ }
2226
+ @media (min-width: 960px) {
2227
+ .md\:uil-ta-left {
2228
+ text-align: left;
2229
+ }
2230
+ }
2231
+ @media (min-width: 960px) {
2232
+ .md\:uil-ta-center {
2233
+ text-align: center;
2234
+ }
2235
+ }
2236
+ @media (min-width: 960px) {
2237
+ .md\:uil-ta-right {
2238
+ text-align: right;
2239
+ }
2240
+ }
2241
+ .hover\:uil-td-none:focus,
2242
+ .hover\:uil-td-none:hover,
2243
+ .uil-td-none {
2244
+ text-decoration: none;
2245
+ }
2246
+ @media (min-width: 960px) {
2247
+ .md\:uil-td-none {
2248
+ text-decoration: none;
2249
+ }
2250
+ }
2251
+ .uil-to-ellipsis {
2252
+ text-overflow: ellipsis;
2253
+ }
2254
+ @media (min-width: 1200px) {
2255
+ .lg\:uil-to-ellipsis {
2256
+ text-overflow: ellipsis;
2257
+ }
2258
+ }
2259
+ .uil-tt-upper {
2260
+ text-transform: uppercase;
2261
+ }
2262
+ .uil-tt-lower {
2263
+ text-transform: lowercase;
2264
+ }
2265
+ .uil-ws-nowrap {
2266
+ white-space: nowrap;
2267
+ }
2268
+ @media (min-width: 1200px) {
2269
+ .lg\:uil-ws-nowrap {
2270
+ white-space: nowrap;
2271
+ }
2272
+ }
2273
+ .uil-wb-break {
2274
+ word-break: break-word;
2275
+ }
docs/src/pages/index.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import Layout from '@theme/Layout';
2
+ import React from 'react';
3
+
4
+ import Home from '../components/Home';
5
+
6
+ function HomePage() {
7
+ return (
8
+ <Layout
9
+ title="ShortGPT: Automate Content Creation with AI"
10
+ description="Automating video and short content creation with AI "
11
+ >
12
+ <Home />
13
+ </Layout>
14
+ );
15
+ }
16
+
17
+ export default HomePage;
docs/static/img/assets/configuration.svg ADDED
docs/static/img/assets/implementation.svg ADDED
docs/static/img/assets/scraping.svg ADDED
docs/static/img/favicon.ico ADDED