HashScripts commited on
Commit
b293d47
1 Parent(s): cb2634e

Upload 167 files

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 +28 -0
  18. CHANGES.txt +20 -0
  19. Dockerfile +38 -0
  20. LICENSE +35 -0
  21. README-Docker.md +21 -0
  22. README.md +131 -12
  23. assets/img/logo.png +0 -0
  24. docs/.gitignore +20 -0
  25. docs/README.md +10 -0
  26. docs/babel.config.js +3 -0
  27. docs/docs/api-key-manager.mdx +52 -0
  28. docs/docs/asset-database.mdx +88 -0
  29. docs/docs/content-translation-engine.mdx +69 -0
  30. docs/docs/content-video-engine.mdx +77 -0
  31. docs/docs/facts-short-engine.mdx +84 -0
  32. docs/docs/getting-started.mdx +59 -0
  33. docs/docs/how-to-install.mdx +121 -0
  34. docs/docusaurus.config.js +135 -0
  35. docs/package.json +51 -0
  36. docs/plugins/my-loaders/index.js +18 -0
  37. docs/plugins/tailwind-loader/index.js +19 -0
  38. docs/sidebars.js +33 -0
  39. docs/src/components/Home.js +356 -0
  40. docs/src/css/custom.css +198 -0
  41. docs/src/css/fragments.css +2275 -0
  42. docs/src/pages/index.js +17 -0
  43. docs/static/img/assets/configuration.svg +0 -0
  44. docs/static/img/assets/implementation.svg +1 -0
  45. docs/static/img/assets/scraping.svg +1 -0
  46. docs/static/img/favicon.ico +0 -0
  47. docs/static/img/logo.png +0 -0
  48. docs/tailwind.config.js +12 -0
  49. docs/yarn.lock +0 -0
  50. gui/__pycache__/content_automation_ui.cpython-39.pyc.1849492106672 +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,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use an official Python runtime as the parent image
2
+ FROM python:3.11-bullseye
3
+ RUN apt-get update && apt-get install -y \
4
+ ffmpeg \
5
+ imagemagick \
6
+ ghostscript \
7
+ fonts-roboto \
8
+ && apt-get clean && rm -rf /var/lib/apt/lists/*
9
+ # Update font cache
10
+ RUN fc-cache -f -v
11
+
12
+ RUN sed -i '/<policy domain="path" rights="none" pattern="@\*"/d' /etc/ImageMagick-6/policy.xml
13
+ # Clean up APT when done
14
+ RUN apt-get clean && rm -rf /var/lib/apt/lists/*
15
+
16
+ # Set the working directory in the container to /app
17
+ WORKDIR /app
18
+
19
+ # Install any Python packages specified in requirements.txt
20
+ # Copy requirements file
21
+ COPY requirements.txt .
22
+
23
+ # Install dependencies
24
+ RUN pip install -r requirements.txt
25
+
26
+ # Copy the local package directory content into the container at /app
27
+ COPY . /app
28
+
29
+ EXPOSE 31415
30
+
31
+ # Define any environment variables
32
+ # ENV KEY Value
33
+
34
+ # Print environment variables (for debugging purposes, you can remove this line if not needed)
35
+ RUN ["printenv"]
36
+
37
+ # Run Python script when the container launches
38
+ CMD ["python", "./runShortGPT.py"]
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,131 @@
1
- ---
2
- title: Shorts
3
- emoji: 🐠
4
- colorFrom: purple
5
- colorTo: pink
6
- sdk: gradio
7
- sdk_version: 4.22.0
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
+ # 🚀🎬 ShortGPT
2
+ ## (Note: ShortX is out, a paid premium automation factory with more capabilities than ShortGPT, check it out at [shortx.ai](https://shortx.ai?ref=sgpt))
3
+ <p align="center">
4
+ <a href="https://discord.gg/uERx39ru3R">
5
+ <img src="https://dcbadge.vercel.app/api/server/uERx39ru3R?compact=true&style=flat">
6
+ </a>
7
+ <a href="https://star-history.com/#rayventura/shortgpt)">
8
+ <img src="https://img.shields.io/github/stars/rayventura/shortgpt?style=social">
9
+ </a>
10
+ <a href="https://pypi.org/project/shortgpt/">
11
+ <img src="https://static.pepy.tech/personalized-badge/shortgpt?period=month&units=international_system&left_color=blue&right_color=green&left_text=Downloads/month">
12
+ </a>
13
+ <a href="https://docs.shortgpt.ai/">
14
+ <img src="https://img.shields.io/badge/docs-visit-blue">
15
+ </a>
16
+ </p>
17
+
18
+ <div align="center" style="border-radius: 20px;" width="18%">
19
+ <img src="https://github.com/RayVentura/ShortGPT/assets/121462835/083c8dc3-bac5-42c1-a08d-3ff9686d18c5" alt="ShortGPT-logo" style="border-radius: 20px;" width="18%"/>
20
+ </div>
21
+ <div align="center">
22
+ <a href="https://discord.gg/uERx39ru3R">
23
+ <img src="https://img.shields.io/discord/1126042224979886160?color=7289da&logo=discord&logoColor=blue&labelColor=white&color=cyan" alt="Join our Discord" height="34">
24
+ </a>
25
+ </div>
26
+
27
+ <div align="center">
28
+ ⚡ Automating video and short content creation with AI ⚡
29
+ </div>
30
+ </br>
31
+
32
+ Follow the installation steps below for running the web app locally (running the google Colab is highly recommanded).
33
+ Please read "installation-notes.md" for more details.
34
+ ## 🎥 Showcase ([Full video on YouTube](https://youtu.be/hpoSHq-ER8U))
35
+
36
+ https://github.com/RayVentura/ShortGPT/assets/121462835/a802faad-0fd7-4fcb-aa82-6365c27ea5fe
37
+ ## 🎥 Voice Dubbing
38
+
39
+
40
+ https://github.com/RayVentura/ShortGPT/assets/121462835/06f51b2d-f8b1-4a23-b299-55e0e18902ef
41
+
42
+ ## 🌟 Show Your Support
43
+ We hope you find ShortGPT helpful! If you do, let us know by giving us a star ⭐ on the repo. It's easy, just click on the 'Star' button at the top right of the page. Your support means a lot to us and keeps us motivated to improve and expand ShortGPT. Thank you and happy content creating! 🎉
44
+
45
+ [![GitHub star chart](https://img.shields.io/github/stars/rayventura/shortgpt?style=social)](https://github.com/RayVentura/ShortGPT/stargazers)
46
+ ## 🛠️ How it works
47
+ ![alt text](https://github.com/RayVentura/ShortGPT/assets/121462835/fcee74d4-f856-4481-949f-244558bf3bfa)
48
+ ## 📝 Introduction to ShortGPT
49
+ ShortGPT is a powerful framework for automating content creation. It simplifies video creation, footage sourcing, voiceover synthesis, and editing tasks. Of the most popular use-cases of ShortGPT is youtube automation and Tiktok creativity program automation.
50
+
51
+ - 🎞️ **Automated editing framework**: Streamlines the video creation process with an LLM oriented video editing language.
52
+
53
+ - 📃 **Scripts and Prompts**: Provides ready-to-use scripts and prompts for various LLM automated editing processes.
54
+
55
+ - 🗣️ **Voiceover / Content Creation**: Supports multiple languages including English 🇺🇸, Spanish 🇪🇸, Arabic 🇦🇪, French 🇫🇷, Polish 🇵🇱, German 🇩🇪, Italian 🇮🇹, Portuguese 🇵🇹, Russian 🇷🇺, Mandarin Chinese 🇨🇳, Japanese 🇯🇵, Hindi 🇮🇳,Korean 🇰🇷, and way over 30 more languages (with EdgeTTS)
56
+
57
+ - 🔗 **Caption Generation**: Automates the generation of video captions.
58
+
59
+ - 🌐🎥 **Asset Sourcing**: Sources images and video footage from the internet, connecting with the web and Pexels API as necessary.
60
+
61
+ - 🧠 **Memory and persistency**: Ensures long-term persistency of automated editing variables with TinyDB.
62
+
63
+ ## 🚀 Quick Start: Run ShortGPT on Google Colab (https://colab.research.google.com/drive/1_2UKdpF6lqxCqWaAcZb3rwMVQqtbisdE?usp=sharing)
64
+
65
+ If you prefer not to install the prerequisites on your local system, you can use the Google Colab notebook. This option is free and requires no installation setup.
66
+
67
+ 1. Click on the link to the Google Colab notebook: [https://colab.research.google.com/drive/1_2UKdpF6lqxCqWaAcZb3rwMVQqtbisdE?usp=sharing](https://colab.research.google.com/drive/1_2UKdpF6lqxCqWaAcZb3rwMVQqtbisdE?usp=sharing)
68
+
69
+ 2. Once you're in the notebook, simply run the cells in order from top to bottom. You can do this by clicking on each cell and pressing the 'Play' button, or by using the keyboard . Enjoy using ShortGPT!
70
+
71
+ # Instructions for running shortGPT locally
72
+ This guide provides step-by-step instructions for installing shortGPT and its dependencies.
73
+ To run ShortGPT locally, you need Docker.
74
+
75
+ ## Installation Steps
76
+
77
+ To run ShortGPT, you need to have docker. Follow the instructions "installation-notes.md" for more details.
78
+
79
+ 1. For running the Dockerfile, do this:
80
+ ```bash
81
+ docker build -t short_gpt_docker:latest .
82
+ docker run -p 31415:31415 --env-file .env short_gpt_docker:latest
83
+ ```
84
+ ## Running runShortGPT.py Web Interface
85
+
86
+ 2. After running the script, a Gradio interface should open at your local host on port 31415 (http://localhost:31415)
87
+
88
+
89
+ ## Framework overview
90
+
91
+ - 🎬 The `ContentShortEngine` is designed for creating shorts, handling tasks from script generation to final rendering, including adding YouTube metadata.
92
+
93
+ - 🎥 The `ContentVideoEngine` is ideal for longer videos, taking care of tasks like generating audio, automatically sourcing background video footage, timing captions, and preparing background assets.
94
+
95
+ - 🗣️ The `ContentTranslationEngine` is designed to dub and translate entire videos, from mainstream languages to more specific target languages. It takes a video file, or youtube link, transcribe it's audio, translates the content, voices it in a target language, adds captions , and gives back a new video, in a totally different language.
96
+
97
+ - 🎞️ The automated `EditingEngine`, using Editing Markup Language and JSON, breaks down the editing process into manageable and customizable blocks, comprehensible to Large Language Models.
98
+
99
+ 💡 ShortGPT offers customization options to suit your needs, from language selection to watermark addition.
100
+
101
+ 🔧 As a framework, ShortGPT is adaptable and flexible, offering the potential for efficient, creative content creation.
102
+
103
+ More documentation incomming, please be patient.
104
+
105
+
106
+ ## Technologies Used
107
+
108
+ ShortGPT utilizes the following technologies to power its functionality:
109
+
110
+ - **Moviepy**: Moviepy is used for video editing, allowing ShortGPT to make video editing and rendering
111
+
112
+ - **Openai**: Openai is used for automating the entire process, including generating scripts and prompts for LLM automated editing processes.
113
+
114
+ - **ElevenLabs**: ElevenLabs is used for voice synthesis, supporting multiple languages for voiceover creation.
115
+
116
+ - **EdgeTTS**: Microsoft's FREE EdgeTTS is used for voice synthesis, supporting way many more language than ElevenLabs currently.
117
+
118
+ - **Pexels**: Pexels is used for sourcing background footage, allowing ShortGPT to connect with the web and access a wide range of images and videos.
119
+
120
+ - **Bing Image**: Bing Image is used for sourcing images, providing a comprehensive database for ShortGPT to retrieve relevant visuals.
121
+
122
+ These technologies work together to provide a seamless and efficient experience in automating video and short content creation with AI.
123
+
124
+ ## 💁 Contributing
125
+
126
+ As an open-source project in a rapidly developing field, we are extremely open to contributions, whether it would be in the form of a new feature, improved infrastructure, or better documentation.
127
+ <p align="center">
128
+ <a href="https://star-history.com/#RayVentura/ShortGPT&Date">
129
+ <img src="https://api.star-history.com/svg?repos=RayVentura/ShortGPT&type=Date" alt="Star History Chart">
130
+ </a>
131
+ </p>
assets/img/logo.png ADDED
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
docs/static/img/logo.png ADDED
docs/tailwind.config.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ module.exports = {
2
+ purge: ['./src/**/*.html', './src/**/*.js', './src/**/*.tsx'],
3
+ corePlugins: { preflight: false, container: false },
4
+ important: '#tailwind',
5
+ theme: {
6
+ extend: {
7
+ maxWidth: {
8
+ xxs: '18rem',
9
+ },
10
+ },
11
+ },
12
+ };
docs/yarn.lock ADDED
The diff for this file is too large to render. See raw diff
 
gui/__pycache__/content_automation_ui.cpython-39.pyc.1849492106672 ADDED
File without changes