├── .gitignore
├── README.md
├── virgo-codyframe
├── gulpfile.js
├── main
│ ├── assets
│ │ ├── css
│ │ │ ├── _base.scss
│ │ │ ├── _custom-style.scss
│ │ │ ├── components
│ │ │ │ ├── _1_3d-text-block.scss
│ │ │ │ ├── _1_accordion.scss
│ │ │ │ ├── _1_adv-gallery.scss
│ │ │ │ ├── _1_anim-menu-btn.scss
│ │ │ │ ├── _1_article-gallery-v3.scss
│ │ │ │ ├── _1_author.scss
│ │ │ │ ├── _1_background-decoration.scss
│ │ │ │ ├── _1_banner.scss
│ │ │ │ ├── _1_button-effects.scss
│ │ │ │ ├── _1_details-list.scss
│ │ │ │ ├── _1_devices.scss
│ │ │ │ ├── _1_diagonal-section.scss
│ │ │ │ ├── _1_feature-v10.scss
│ │ │ │ ├── _1_feature-v9.scss
│ │ │ │ ├── _1_google-maps.scss
│ │ │ │ ├── _1_immersive-section-transition.scss
│ │ │ │ ├── _1_link-effects.scss
│ │ │ │ ├── _1_list-v2.scss
│ │ │ │ ├── _1_list.scss
│ │ │ │ ├── _1_main-footer.scss
│ │ │ │ ├── _1_modal-window.scss
│ │ │ │ ├── _1_newsletter.scss
│ │ │ │ ├── _1_notice.scss
│ │ │ │ ├── _1_pagination.scss
│ │ │ │ ├── _1_radio-switch.scss
│ │ │ │ ├── _1_radios-checkboxes.scss
│ │ │ │ ├── _1_reading-progressbar.scss
│ │ │ │ ├── _1_reveal-effects.scss
│ │ │ │ ├── _1_search-input.scss
│ │ │ │ ├── _1_skip-link.scss
│ │ │ │ ├── _1_social-sharing.scss
│ │ │ │ ├── _1_sticky-hero.scss
│ │ │ │ ├── _1_testimonial.scss
│ │ │ │ ├── _1_text-points.scss
│ │ │ │ ├── _1_vertical-timeline.scss
│ │ │ │ ├── _2_contact.scss
│ │ │ │ ├── _2_device-group.scss
│ │ │ │ ├── _2_flexi-header.scss
│ │ │ │ ├── _2_image-interest-points.scss
│ │ │ │ ├── _2_pricing-table.scss
│ │ │ │ ├── _2_sticky-sharebar.scss
│ │ │ │ └── _3_feature-v14.scss
│ │ │ ├── custom-style
│ │ │ │ ├── _buttons.scss
│ │ │ │ ├── _colors.scss
│ │ │ │ ├── _forms.scss
│ │ │ │ ├── _icons.scss
│ │ │ │ ├── _shared-styles.scss
│ │ │ │ ├── _spacing.scss
│ │ │ │ ├── _typography.scss
│ │ │ │ └── _util.scss
│ │ │ ├── style.css
│ │ │ ├── style.min.css
│ │ │ └── style.scss
│ │ ├── img
│ │ │ ├── article-example-img-1.svg
│ │ │ ├── article-example-img-2.svg
│ │ │ ├── article-gallery-v3-author-img-1.jpg
│ │ │ ├── article-gallery-v3-img-1.jpg
│ │ │ ├── article-gallery-v3-img-2.jpg
│ │ │ ├── article-gallery-v3-img-3.jpg
│ │ │ ├── article-img-1.jpg
│ │ │ ├── favicon.svg
│ │ │ ├── feature-v10-img-1.jpg
│ │ │ ├── feature-v10-img-2.jpg
│ │ │ ├── feature-v9-img-1.jpg
│ │ │ ├── feature-v9-img-2.jpg
│ │ │ ├── hero-diagonal-img-1.jpg
│ │ │ ├── image-interest-points-img-1.jpg
│ │ │ ├── image-interest-points-img-2.jpg
│ │ │ ├── sticky-hero-img-1.jpg
│ │ │ ├── testimonial-img-1.jpg
│ │ │ └── vertical-timeline-img-1.jpg
│ │ └── js
│ │ │ ├── components
│ │ │ ├── _1_accordion.js
│ │ │ ├── _1_anim-menu-btn.js
│ │ │ ├── _1_google-maps.js
│ │ │ ├── _1_immersive-section-transition.js
│ │ │ ├── _1_modal-window.js
│ │ │ ├── _1_notice.js
│ │ │ ├── _1_reading-progressbar.js
│ │ │ ├── _1_reveal-effects.js
│ │ │ ├── _1_skip-link.js
│ │ │ ├── _1_social-sharing.js
│ │ │ ├── _1_sticky-hero.js
│ │ │ ├── _1_vertical-timeline.js
│ │ │ ├── _2_flexi-header.js
│ │ │ ├── _2_image-interest-points.js
│ │ │ ├── _2_pricing-table.js
│ │ │ └── _2_sticky-sharebar.js
│ │ │ ├── scripts.js
│ │ │ └── scripts.min.js
│ ├── blog-article.html
│ ├── blog.html
│ ├── contact.html
│ ├── index.html
│ ├── pricing.html
│ └── solutions.html
└── package.json
└── virgo-tailwind
├── assets
└── img
│ ├── article-example-img-1.svg
│ ├── article-example-img-2.svg
│ ├── article-gallery-v3-author-img-1.jpg
│ ├── article-gallery-v3-img-1.jpg
│ ├── article-gallery-v3-img-2.jpg
│ ├── article-gallery-v3-img-3.jpg
│ ├── article-img-1.jpg
│ ├── favicon.svg
│ ├── feature-v10-img-1.jpg
│ ├── feature-v10-img-2.jpg
│ ├── feature-v9-img-1.jpg
│ ├── feature-v9-img-2.jpg
│ ├── hero-diagonal-img-1.jpg
│ ├── image-interest-points-img-1.jpg
│ ├── image-interest-points-img-2.jpg
│ ├── sticky-hero-img-1.jpg
│ ├── testimonial-img-1.jpg
│ └── vertical-timeline-img-1.jpg
├── dist
└── output.css
├── src
├── blog-article.html
├── blog.html
├── contact.html
├── css
│ └── input.css
├── index.html
├── js
│ └── components.js
├── pricing.html
└── solutions.html
└── tailwind.config.js
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | *.DS_Store
3 | config.php
4 | package-lock.json
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Virgo Template by 🐞 CodyHouse
2 | Virgo is a free HTML, CSS, JS landing template built using the [CodyHouse Components](https://codyhouse.co/ds/components). It's compatible with [CodyFrame CSS](https://codyhouse.co/ds/docs/framework) and [Tailwind CSS](https://tailwindcss.com/).
3 |
4 | [View Demo](https://codyhouse.co/demo-templates/virgo/index.html)
5 |
6 | https://user-images.githubusercontent.com/5512545/142900965-b2566379-82ef-4d10-87af-d79711a39270.mp4
7 |
8 | ## Progressive enhancement
9 | The following script in the `
` of the html files:
10 |
11 | ```html
12 |
13 | ```
14 |
15 | is used in CSS to check if JavaScript is enabled and apply additional style accordingly.
16 |
17 | ## Gulp
18 | The CodyFrame version of the template includes a Gulp file with some basic configurations.
19 |
20 | To use this configuration file, once you have downloaded the template, run the following commands in your command line:
21 |
22 | ```
23 | npm install
24 | npm run gulp watch
25 | ```
26 |
27 | The first command will install the modules the framework requires for compiling SCSS into CSS; the second will launch your project on a development server.
28 |
29 | ## License
30 | Check [CodyHouse License page](https://codyhouse.co/license#templates).
31 |
32 | ## Credits
33 | 1. Images: [Unsplash](https://unsplash.com/)
34 | 2. Icons: [Nucleoapp](https://nucleoapp.com/)
35 |
--------------------------------------------------------------------------------
/virgo-codyframe/gulpfile.js:
--------------------------------------------------------------------------------
1 | var gulp = require('gulp');
2 | var sass = require('gulp-sass')(require('sass-embedded'));
3 | var sassGlob = require('gulp-sass-glob');
4 | var browserSync = require('browser-sync').create();
5 | var postcss = require('gulp-postcss');
6 | var autoprefixer = require('autoprefixer');
7 | var concat = require('gulp-concat');
8 | var rename = require('gulp-rename');
9 | var uglify = require('gulp-uglify');
10 | var cleanCSS = require('gulp-clean-css');
11 | var purgecss = require('gulp-purgecss');
12 |
13 | // js file paths
14 | var utilJsPath = 'node_modules/codyhouse-framework/main/assets/js'; // util.js path - you may need to update this if including the framework as external node module
15 | var componentsJsPath = 'main/assets/js/components/*.js'; // component js files
16 | var scriptsJsPath = 'main/assets/js'; //folder for final scripts.js/scripts.min.js files
17 |
18 | // css file paths
19 | var cssFolder = 'main/assets/css'; // folder for final style.css/style-custom-prop-fallbac.css files
20 | var scssFilesPath = 'main/assets/css/**/*.scss'; // scss files to watch
21 |
22 | function reload(done) {
23 | browserSync.reload();
24 | done();
25 | }
26 |
27 | /* Gulp watch tasks */
28 | // This task is used to convert the scss to css and compress it.
29 | gulp.task('sass', function() {
30 | return gulp.src(scssFilesPath)
31 | .pipe(sassGlob({sassModules: true}))
32 | .pipe(sass().on('error', sass.logError))
33 | .pipe(postcss([autoprefixer()]))
34 | .pipe(gulp.dest(cssFolder))
35 | .pipe(browserSync.reload({
36 | stream: true
37 | }))
38 | .pipe(rename('style.min.css'))
39 | .pipe(cleanCSS())
40 | .pipe(gulp.dest(cssFolder))
41 | .pipe(browserSync.reload({
42 | stream: true
43 | }));
44 | });
45 | // This task is used to combine all js files in a single scripts.min.js.
46 | gulp.task('scripts', function() {
47 | return gulp.src([utilJsPath+'/util.js', componentsJsPath])
48 | .pipe(concat('scripts.js'))
49 | .pipe(gulp.dest(scriptsJsPath))
50 | .pipe(browserSync.reload({
51 | stream: true
52 | }))
53 | .pipe(rename('scripts.min.js'))
54 | .pipe(uglify())
55 | .pipe(gulp.dest(scriptsJsPath))
56 | .pipe(browserSync.reload({
57 | stream: true
58 | }));
59 | });
60 | // This task is used to reload the project whan changes are made to a html/scss/js file.
61 | gulp.task('browserSync', gulp.series(function (done) {
62 | browserSync.init({
63 | server: {
64 | baseDir: 'main'
65 | },
66 | notify: false
67 | })
68 | done();
69 | }));
70 |
71 | gulp.task('watch', gulp.series(['browserSync', 'sass', 'scripts'], function () {
72 | gulp.watch('main/*.html', gulp.series(reload));
73 | gulp.watch('main/assets/css/**/*.scss', gulp.series(['sass']));
74 | gulp.watch(componentsJsPath, gulp.series(['scripts']));
75 | }));
76 |
77 |
78 | /* Gulp dist task */
79 | // create a distribution folder for production
80 | var distFolder = 'dist/';
81 | var assetsFolder = 'dist/assets/';
82 |
83 | gulp.task('dist', async function(){
84 | // remove unused classes from the style.css file with PurgeCSS and copy it to the dist folder
85 | await purgeCSS();
86 | // minify the scripts.js file and copy it to the dist folder
87 | await minifyJs();
88 | // copy any additional js files to the dist folder
89 | await moveJS();
90 | // copy all the assets inside main/assets/img folder to the dist folder
91 | await moveAssets();
92 | // copy all html files inside main folder to the dist folder
93 | await moveContent();
94 | console.log('Distribution task completed!')
95 | });
96 |
97 | function purgeCSS() {
98 | return new Promise(function(resolve, reject) {
99 | var stream = gulp.src(cssFolder+'/style.css')
100 | .pipe(purgecss({
101 | content: ['main/*.html', scriptsJsPath+'/scripts.js'],
102 | safelist: {
103 | standard: ['.is-hidden', '.is-visible'],
104 | deep: [/class$/],
105 | greedy: []
106 | },
107 | defaultExtractor: content => content.match(/[\w-/:%@]+(? * {
57 | transform-origin: 8px 8px;
58 | }
59 | }
60 | }
61 |
62 | .accordion__icon-arrow,
63 | .accordion__icon-arrow-v2 {
64 | .icon__group {
65 | > * {
66 | stroke-dasharray: 17;
67 | transform: translateY(3px);
68 | }
69 |
70 | > *:first-child {
71 | stroke-dashoffset: 8.5;
72 | }
73 |
74 | > *:last-child {
75 | stroke-dashoffset: 8.5;
76 | }
77 | }
78 | }
79 |
80 | .accordion__icon-plus {
81 | .icon__group {
82 | transform: rotate(-90deg);
83 |
84 | > *:first-child {
85 | transform: rotate(-90deg);
86 | }
87 | }
88 | }
89 |
90 | .accordion__item--is-open > .accordion__header {
91 | > .accordion__icon-arrow .icon__group { // animated arrow icon
92 | > *:first-child {
93 | transform: translateY(-3px) rotate(-90deg);
94 | }
95 |
96 | > *:last-child {
97 | transform: translateY(-3px) rotate(90deg);
98 | }
99 | }
100 |
101 | > .accordion__icon-arrow-v2 .icon__group { // animated arrow icon v2
102 | transform: rotate(-90deg);
103 |
104 | > *:first-child, *:last-child {
105 | stroke-dashoffset: 0;
106 | transform: translateY(0px);
107 | }
108 | }
109 |
110 | > .accordion__icon-plus .icon__group { // animated plus icon
111 | transform: rotate(0);
112 |
113 | > *:first-child {
114 | transform: rotate(0);
115 | }
116 | }
117 | }
118 |
119 | .js {
120 | .accordion__panel {
121 | display: none;
122 | will-change: height;
123 | transform: translateZ(0px);
124 | }
125 |
126 | .accordion__item--is-open > .accordion__panel {
127 | display: block;
128 | }
129 | }
130 |
131 | // animations
132 | .accordion[data-animation="on"] {
133 | .accordion__item--is-open .accordion__panel > * {
134 | animation: accordion-entry-animation .4s var(--ease-out);
135 | }
136 |
137 | .accordion__icon-arrow,
138 | .accordion__icon-arrow-v2,
139 | .accordion__icon-plus {
140 | .icon__group {
141 | transition: transform .3s var(--ease-out);
142 |
143 | > * {
144 | transition: transform .3s, stroke-dashoffset .3s;
145 | transition-timing-function: var(--ease-out);
146 | }
147 | }
148 | }
149 | }
150 |
151 | @keyframes accordion-entry-animation {
152 | from {
153 | opacity: 0;
154 | transform: translateY(-10px);
155 | }
156 |
157 | to {
158 | opacity: 1;
159 | transform: translateY(0px);
160 | }
161 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_adv-gallery.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_adv-gallery
6 | Title: Advanced Gallery
7 | Descr: Advanced image gallery template
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | .adv-gallery {
13 | position: relative;
14 | z-index: 1;
15 | }
16 |
17 | .adv-gallery__img {
18 | width: 100%;
19 | display: block;
20 | object-fit: cover;
21 | }
22 |
23 | // CSS Grid fallback
24 | .adv-gallery__grid {
25 | > * {
26 | margin-bottom: var(--space-md);
27 | }
28 |
29 | @include breakpoint(md) {
30 | > :nth-child(1), > :nth-child(2), > :nth-child(3) {
31 | width: 32%;
32 | float: left;
33 | }
34 |
35 | > :nth-child(1), > :nth-child(2) {
36 | margin-right: 2%;
37 | }
38 |
39 | > :nth-child(4) {
40 | clear: both;
41 | }
42 | }
43 | }
44 |
45 | // if CSS Grid = supported
46 | @supports (grid-area: auto) {
47 | .adv-gallery__grid {
48 | display: grid;
49 | grid-gap: var(--space-md);
50 |
51 | > * { // fallback reset
52 | margin: 0 !important;
53 | width: auto !important;
54 | float: none !important;
55 | }
56 | }
57 |
58 | @include breakpoint(md) {
59 | .adv-gallery__grid {
60 | grid-template-columns: repeat(12, 1fr);
61 |
62 | > :nth-child(1) {
63 | grid-column: span 5;
64 | }
65 |
66 | > :nth-child(2) {
67 | grid-column: span 7;
68 | }
69 |
70 | > :nth-child(3) {
71 | grid-column: span 9;
72 | }
73 |
74 | > :nth-child(4) {
75 | grid-column: span 3;
76 | }
77 | }
78 | }
79 |
80 | @include breakpoint(lg) {
81 | .adv-gallery__grid {
82 | grid-gap: var(--space-sm);
83 | grid-template-rows: repeat(12, 50px);
84 |
85 | > :nth-child(1) {
86 | grid-column: 1 / 4;
87 | grid-row: 1 / 7;
88 | }
89 |
90 | > :nth-child(2) {
91 | grid-column: 1 / 4;
92 | grid-row: 7 / -1;
93 | }
94 |
95 | > :nth-child(3) {
96 | grid-column: 4 / 11;
97 | grid-row: 1 / -1;
98 | }
99 |
100 | > :nth-child(4) {
101 | grid-column: 11 / 13;
102 | grid-row: 1 / -1;
103 | }
104 | }
105 |
106 | .adv-gallery__img {
107 | height: 100%;
108 | }
109 | }
110 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_anim-menu-btn.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_anim-menu-btn
6 | Title: Animated Menu Button
7 | Descr: A menu button w/ a morphing icon
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | :root {
13 | --anim-menu-btn-size: 48px;
14 | --anim-menu-btn-transition-duration: .2s;
15 |
16 | // 🍔 icon
17 | --anim-menu-btn-icon-size: 32px;
18 | --anim-menu-btn-icon-stroke: 2px;
19 | }
20 |
21 | .anim-menu-btn {
22 | display: flex;
23 | justify-content: center;
24 | align-items: center;
25 | width: var(--anim-menu-btn-size);
26 | height: var(--anim-menu-btn-size);
27 | }
28 |
29 | // icons
30 | .anim-menu-btn__icon {
31 | position: relative;
32 | display: block;
33 | font-size: var(--anim-menu-btn-icon-size);
34 | width: 1em;
35 | height: var(--anim-menu-btn-icon-stroke);
36 | color: inherit;
37 | background-image: linear-gradient(currentColor, currentColor);
38 | background-repeat: no-repeat;
39 | transform: scale(1);
40 |
41 | &::before, &::after {
42 | content: '';
43 | position: absolute;
44 | top: 0;
45 | left: 0;
46 | height: 100%;
47 | width: 100%;
48 | background-image: inherit;
49 | border-radius: inherit;
50 | }
51 | }
52 |
53 | // menu to 'X' close
54 | .anim-menu-btn__icon--close {
55 | background-size: 100% 100%;
56 | will-change: transform, background-size;
57 | transition-property: transform, background-size;
58 | transition-duration: var(--anim-menu-btn-transition-duration, 0.2s);
59 |
60 | .anim-menu-btn:active & {
61 | transform: scale(0.9);
62 | }
63 |
64 | &::before, &::after {
65 | will-change: inherit;
66 | transition: inherit;
67 | }
68 |
69 | &::before { // line top
70 | transform: translateY(-0.25em) rotate(0);
71 | }
72 |
73 | &::after { // line bottom
74 | transform: translateY(0.25em) rotate(0);
75 | }
76 | }
77 |
78 | .anim-menu-btn--state-b {
79 | .anim-menu-btn__icon--close {
80 | background-size: 0% 100%;
81 |
82 | &::before {
83 | transform: translateY(0) rotate(45deg);
84 | }
85 |
86 | &::after {
87 | transform: translateY(0) rotate(-45deg);
88 | }
89 | }
90 | }
91 |
92 | // menu to arrow
93 | .anim-menu-btn__icon--arrow-left,
94 | .anim-menu-btn__icon--arrow-right,
95 | .anim-menu-btn__icon--arrow-up,
96 | .anim-menu-btn__icon--arrow-down {
97 | border-radius: 50em;
98 | will-change: transform;
99 | transition-property: transform;
100 | transition-duration: var(--anim-menu-btn-transition-duration, 0.2s);
101 |
102 | .anim-menu-btn:active & {
103 | transform: scale(0.9);
104 | }
105 |
106 | &::before, &::after {
107 | transform-origin: calc(var(--anim-menu-btn-icon-stroke)/2) 50%;
108 | will-change: transform, width;
109 | transition-property: transform, width;
110 | transition-duration: var(--anim-menu-btn-transition-duration, 0.2s);
111 | }
112 |
113 | &::before { // line top
114 | transform: translateY(-0.25em) rotate(0);
115 | }
116 |
117 | &::after { // line bottom
118 | transform: translateY(0.25em) rotate(0);
119 | }
120 | }
121 |
122 | .anim-menu-btn__icon--arrow-right {
123 | transform: rotate(180deg);
124 |
125 | .anim-menu-btn:active & {
126 | transform: rotate(180deg) scale(0.9);
127 | }
128 | }
129 |
130 | .anim-menu-btn--state-b {
131 | .anim-menu-btn__icon--arrow-left,
132 | .anim-menu-btn__icon--arrow-right,
133 | .anim-menu-btn__icon--arrow-up,
134 | .anim-menu-btn__icon--arrow-down {
135 | &::before, &::after {
136 | width: 50%;
137 | }
138 |
139 | &::before {
140 | transform: translateY(0) rotate(-45deg);
141 | }
142 |
143 | &::after {
144 | transform: translateY(0) rotate(45deg);
145 | }
146 | }
147 |
148 | &:active .anim-menu-btn__icon--arrow-up {
149 | transform: rotate(90deg) scale(0.9);
150 | }
151 |
152 | .anim-menu-btn__icon--arrow-up {
153 | transform: rotate(90deg);
154 | }
155 |
156 | &:active .anim-menu-btn__icon--arrow-down {
157 | transform: rotate(-90deg) scale(0.9);
158 | }
159 |
160 | .anim-menu-btn__icon--arrow-down {
161 | transform: rotate(-90deg);
162 | }
163 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_article-gallery-v3.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_article-gallery-v3
6 | Title: Article Gallery v3
7 | Descr: A gallery of blog articles
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | .articles-v3 {}
13 |
14 | .articles-v3__img {
15 | display: block;
16 | transition: opacity .3s;
17 | border-radius: var(--radius-md);
18 | overflow: hidden;
19 |
20 | img {
21 | display: block;
22 | width: 100%;
23 | }
24 |
25 | &:hover {
26 | opacity: 0.85;
27 | }
28 | }
29 |
30 | .articles-v3__headline {
31 | font-size: var(--text-xl);
32 |
33 | a {
34 | color: var(--color-contrast-higher);
35 | text-decoration: none;
36 |
37 | &:hover {
38 | text-decoration: underline;
39 | }
40 | }
41 | }
42 |
43 | .articles-v3__author {
44 | display: grid;
45 | grid-template-columns: 3em 1fr;
46 | grid-gap: var(--space-xs);
47 | align-items: center;
48 | margin-top: var(--space-md);
49 | }
50 |
51 | .articles-v3__author-img {
52 | display: block;
53 | width: 3em;
54 | height: 3em;
55 | border-radius: 50%;
56 | overflow: hidden;
57 | transition: transform .3s var(--ease-out-back);
58 |
59 | img {
60 | display: block;
61 | width: inherit;
62 | height: inherit;
63 | }
64 |
65 | &:hover {
66 | transform: scale(1.1);
67 | }
68 | }
69 |
70 | .articles-v3__author-name {
71 | font-weight: bold;
72 | color: var(--color-contrast-higher);
73 | text-decoration: none;
74 |
75 | &:hover {
76 | text-decoration: underline;
77 | }
78 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_author.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_author
6 | Title: Author
7 | Descr: Author introduction card
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | :root {
13 | --author-img-size: 4em;
14 | }
15 |
16 | .author {
17 | display: grid;
18 | grid-template-columns: var(--author-img-size) 1fr;
19 | grid-gap: var(--space-sm);
20 | }
21 |
22 | .author__img-wrapper { // img link
23 | display: inline-block;
24 | border-radius: 50%;
25 | width: var(--author-img-size);
26 | height: var(--author-img-size);
27 | overflow: hidden;
28 | transition: transform .3s var(--ease-out-back);
29 |
30 | &:hover {
31 | transform: scale(1.1);
32 | }
33 |
34 | img {
35 | display: block;
36 | width: inherit;
37 | height: inherit;
38 | object-fit: cover;
39 | }
40 | }
41 |
42 | .author__content {
43 | a {
44 | color: inherit;
45 |
46 | &:hover {
47 | color: var(--color-primary);
48 | }
49 | }
50 | }
51 |
52 | // --meta -> show date + read time
53 | .author--meta {
54 | --author-img-size: 3em;
55 | align-items: center;
56 | grid-gap: var(--space-xs);
57 | }
58 |
59 | // --minimal -> show only author name
60 | .author--minimal {
61 | --author-img-size: 2.4em;
62 | align-items: center;
63 | grid-gap: var(--space-xxs);
64 | }
65 |
66 | // --featured -> expand author info
67 | .author--featured {
68 | --author-img-size: 6em;
69 | grid-template-columns: 1fr;
70 | justify-content: center;
71 | text-align: center;
72 |
73 | .author__img-wrapper {
74 | margin-left: auto;
75 | margin-right: auto;
76 | }
77 | }
78 |
79 | .author__social { // social button
80 | --size: 40px;
81 | width: var(--size);
82 | height: var(--size);
83 | display: flex;
84 |
85 | background-color: alpha(var(--color-contrast-higher), 0.1);
86 | border-radius: 50%;
87 | transition: .2s;
88 |
89 | .icon {
90 | --size: 16px;
91 | display: block;
92 | margin: auto;
93 | color: var(--color-contrast-higher);
94 | transition: color .2s;
95 | }
96 |
97 | &:hover {
98 | background-color: alpha(var(--color-contrast-higher), 0.075);
99 |
100 | .icon {
101 | color: var(--color-primary);
102 | }
103 | }
104 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_background-decoration.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_background-decoration
6 | Title: Background Decoration
7 | Descr: A collection of background effects
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | .bg-decoration {
13 | position: absolute;
14 | top: 0;
15 | left: 0;
16 | pointer-events: none;
17 | width: 100%;
18 | height: 100%;
19 | overflow: hidden;
20 | }
21 |
22 | .bg-decoration__svg {
23 | position: absolute;
24 | top: 0;
25 | left: 50%;
26 | transform: translateX(-50%);
27 | width: 134%;
28 | min-width: 1280px;
29 | max-width: 1920px;
30 | height: auto;
31 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_banner.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_banner
6 | Title: Banner
7 | Descr: A CTA banner containing text + media
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | .banner {
13 | display: block;
14 | text-decoration: none;
15 | color: inherit;
16 | overflow: hidden;
17 |
18 | background-color: var(--color-bg-light);
19 | box-shadow: var(--inner-glow), var(--shadow-sm);
20 | border-radius: var(--radius-md);
21 |
22 | transition: .3s;
23 |
24 | &:hover {
25 | background-color: var(--color-bg-lighter);
26 | box-shadow: var(--inner-glow), var(--shadow-md);
27 |
28 | .banner__link {
29 | transform: scale(1.3);
30 |
31 | i {
32 | transform: scale(0.7); // reverse parent transformation
33 | }
34 |
35 | &::after {
36 | height: 100%;
37 | }
38 | }
39 |
40 | .banner__figure {
41 | transform: scale(1.05);
42 | }
43 | }
44 | }
45 |
46 | .banner__link {
47 | position: relative;
48 | text-decoration: none;
49 | color: var(--color-primary-dark);
50 | display: inline-block;
51 | transition: .3s var(--ease-out);
52 | transform-origin: left bottom;
53 |
54 | i { // label
55 | position: relative;
56 | z-index: 2;
57 | display: inline-block;
58 | transition: .3s var(--ease-out);
59 | }
60 |
61 | &::after { // animated border
62 | content: '';
63 | background-color: currentColor;
64 | height: 2px;
65 | width: 100%;
66 | position: absolute;
67 | z-index: 1;
68 | bottom: 0;
69 | left: 0;
70 | transition: .3s var(--ease-out);
71 | opacity: 0.15;
72 | }
73 | }
74 |
75 | .banner__figure {
76 | height: 0;
77 | padding-bottom: 50%;
78 | transition: .3s var(--ease-out);
79 | background-position: center center;
80 | background-repeat: no-repeat;
81 | background-size: cover;
82 | }
83 |
84 | @include breakpoint(md) {
85 | .banner__figure {
86 | height: 100%;
87 | padding-bottom: 0;
88 | clip-path: polygon(100px 0%, 100% 0%, 100% 100%, 50px 100%);
89 | }
90 |
91 | // invert variation
92 | .banner--invert {
93 | .banner__figure {
94 | clip-path: polygon(0% 0%, calc(100% - 100px) 0%, calc(100% - 50px) 100%, 0% 100%);
95 | }
96 |
97 | .banner__link {
98 | transform-origin: right bottom;
99 | }
100 | }
101 |
102 | .banner:hover .banner__figure { // clip animation - visible on big screens
103 | clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%);
104 | }
105 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_button-effects.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_button-effects
6 | Title: Button Effects
7 | Descr: A collection of button effects
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | // v1
13 | .btn-fx-1 {
14 | --border-radius: 0.25em;
15 | --transition-duration: .3s;
16 | position: relative;
17 | display: inline-block;
18 | border-radius: var(--border-radius);
19 |
20 | line-height: 1;
21 | text-decoration: none;
22 | color: var(--color-primary); // text color
23 | transition: var(--transition-duration);
24 | @include fontSmooth;
25 |
26 | cursor: pointer;
27 |
28 | span, .btn-fx-1__icon-wrapper { // place label and icon above animated background
29 | position: relative;
30 | z-index: 2;
31 | }
32 |
33 | .icon {
34 | display: block;
35 | will-change: transform;
36 | transition: var(--transition-duration);
37 | }
38 |
39 | .icon:first-child {
40 | color: var(--color-primary); // icon color
41 | }
42 |
43 | .icon:last-child {
44 | position: absolute;
45 | top: 0;
46 | left: 0;
47 | opacity: 0;
48 | color: var(--color-white); // icon color on hover
49 | transform: translateY(100%);
50 | }
51 |
52 | &:hover {
53 | color: var(--color-white); // text color on hover
54 |
55 | .icon:first-child {
56 | opacity: 0;
57 | transform: translateY(-100%);
58 | }
59 |
60 | .icon:last-child {
61 | opacity: 1;
62 | transform: translateY(0);
63 | }
64 |
65 | & .btn-fx-1__inner::after {
66 | transform: skewY(0deg) scaleY(2);
67 | }
68 | }
69 |
70 | &:focus {
71 | outline: none;
72 | box-shadow: 0 0 0 1px var(--color-bg), 0 0 0 3px var(--color-primary);
73 | }
74 | }
75 |
76 | .btn-fx-1__inner { // trick - used to fix issue on Safari
77 | position: relative;
78 | display: inline-flex;
79 | justify-content: center;
80 | align-items: center; // vertically align label + icon
81 |
82 | background-color: alpha(var(--color-primary), 0.15); // starting bg color
83 | overflow: hidden;
84 | clip-path: inset(0% 0% 0% 0% round var(--border-radius));
85 |
86 | &::after { // animated background
87 | content: '';
88 | position: absolute;
89 | z-index: 1;
90 | top: 50%;
91 | left: -5%;
92 | width: 110%;
93 | height: 100%;
94 | background-color: var(--color-primary); // ending bg color
95 | transform-origin: center bottom;
96 | transform: skewY(10deg) scaleY(0);
97 | transition: transform var(--transition-duration);
98 | }
99 | }
100 |
101 | // v2
102 | .btn-fx-2 {
103 | position: relative;
104 |
105 | line-height: 1;
106 | letter-spacing: 0.1em;
107 | text-transform: uppercase;
108 | text-decoration: none;
109 |
110 | span {
111 | position: relative;
112 | display: inline-flex;
113 | clip-path: inset(0%);
114 | }
115 |
116 | em {
117 | display: inline-flex;
118 |
119 | * {
120 | color: var(--color-primary); // text color
121 | padding: 0.25em 0;
122 | will-change: transform;
123 | transition: transform .3s;
124 | }
125 |
126 | &:last-child {
127 | position: absolute;
128 | top: 0;
129 | left: 0;
130 |
131 | * {
132 | transform: translateY(100%);
133 | }
134 | }
135 | }
136 |
137 | &::before, &::after { // animated line
138 | content: '';
139 | position: absolute;
140 | bottom: 0;
141 | height: 2px;
142 | left: 0;
143 | width: 100%;
144 | }
145 |
146 | &::before { // bg
147 | background-color: alpha(var(--color-primary), 0.2);
148 | }
149 |
150 | &::after { // filling effect
151 | background-color: var(--color-primary);
152 | transform: scaleX(0);
153 | transition: transform .3s;
154 | transform-origin: right center;
155 | }
156 |
157 | &:hover {
158 | // :nth-child(x), where x = number of letters
159 | em {
160 | *:nth-child(2) {
161 | transition-delay: .05s;
162 | }
163 |
164 | *:nth-child(3) {
165 | transition-delay: .1s;
166 | }
167 |
168 | *:nth-child(4) {
169 | transition-delay: .15s;
170 | }
171 |
172 | *:nth-child(5) {
173 | transition-delay: .2s;
174 | }
175 |
176 | *:nth-child(6) {
177 | transition-delay: .25s;
178 | }
179 |
180 | *:nth-child(7) {
181 | transition-delay: .3s;
182 | }
183 |
184 | *:nth-child(8) {
185 | transition-delay: .35s;
186 | }
187 |
188 | *:nth-child(9) {
189 | transition-delay: .4s;
190 | }
191 |
192 | *:nth-child(10) {
193 | transition-delay: .45s;
194 | }
195 | }
196 |
197 | em:first-child {
198 | * {
199 | transform: translateY(-100%);
200 | }
201 | }
202 |
203 | em:last-child {
204 | * {
205 | transform: translateY(0);
206 | }
207 | }
208 |
209 | &::after {
210 | transform: scaleX(1);
211 | transform-origin: left center;
212 | }
213 | }
214 | }
215 |
216 | // v3
217 | .btn-fx-3 {
218 | --transition-duration: 0.3s;
219 | position: relative;
220 | display: inline-block;
221 |
222 | color: var(--color-bg);
223 | line-height: 1;
224 | text-decoration: none;
225 | @include fontSmooth;
226 |
227 | cursor: pointer;
228 |
229 | will-change: transform;
230 | transition: transform var(--transition-duration);
231 |
232 | span { // text label
233 | will-change: transform;
234 | transition: opacity var(--transition-duration), transform var(--transition-duration) var(--ease-out);
235 | }
236 |
237 | &::before { // animated background
238 | content: '';
239 | position: absolute;
240 | left: 0;
241 | top: 0;
242 | width: 100%;
243 | height: 100%;
244 | background-color: var(--color-contrast-higher);
245 | border-radius: inherit;
246 | will-change: transform;
247 | transition: transform var(--transition-duration) var(--ease-out-back), box-shadow var(--transition-duration);
248 | }
249 |
250 | &:active {
251 | transform: scale(0.9);
252 | }
253 |
254 | &:hover {
255 | span { // text label
256 | opacity: 0;
257 | transform: scale(0.5);
258 | }
259 |
260 | &::before { // bg
261 | transform: scale(1.1);
262 | }
263 |
264 | .btn-fx-3__icon-wrapper { // icon
265 | transform: translateY(0);
266 | }
267 | }
268 |
269 | &:focus {
270 | outline: none;
271 |
272 | &::before {
273 | box-shadow: var(--shadow-sm), 0 0 0 3px alpha(var(--color-contrast-higher), 0.15);
274 | }
275 | }
276 | }
277 |
278 | .btn-fx-3__inner {
279 | position: relative;
280 | z-index: 2;
281 | display: inline-flex;
282 | justify-content: center;
283 | align-items: center;
284 | overflow: hidden;
285 | clip-path: inset(0%);
286 | }
287 |
288 | .btn-fx-3__icon-wrapper {
289 | position: absolute;
290 | z-index: 2;
291 | top: 0;
292 | left: 0;
293 | width: 100%;
294 | height: 100%;
295 | display: flex;
296 | will-change: transform;
297 | transform: translateY(100%);
298 | transition: transform var(--transition-duration) var(--ease-out);
299 |
300 | .icon {
301 | margin: auto;
302 | }
303 | }
304 |
305 | // v4
306 | .btn-fx-4 {
307 | --transition-duration: .3s;
308 | position: relative;
309 | display: inline-flex;
310 | justify-content: center;
311 | align-items: center;
312 |
313 | background-color: var(--color-contrast-higher);
314 | box-shadow: var(--shadow-sm);
315 | overflow: hidden;
316 |
317 | line-height: 1;
318 | text-decoration: none;
319 | color: var(--color-bg);
320 | @include fontSmooth;
321 |
322 | transition: var(--transition-duration);
323 |
324 | span {
325 | position: relative;
326 | z-index: 2;
327 | }
328 |
329 | &::before { // shiny effect
330 | content: '';
331 | position: absolute;
332 | z-index: 1;
333 | top: 0;
334 | left: 0;
335 | height: 100%;
336 | width: 100%;
337 | background-color: alpha(var(--color-bg), 0.25);
338 | will-change: transform;
339 | transform: skewX(-15deg) translate(calc(-100% - 0.5em));
340 | pointer-events: none;
341 | }
342 |
343 | &:hover {
344 | &::before {
345 | transform: skewX(-15deg) translate(calc(100% + 0.5em));
346 | transition: transform var(--transition-duration);
347 | }
348 | }
349 |
350 | &:focus {
351 | outline: none;
352 | box-shadow: var(--shadow-sm), 0 0 0 3px alpha(var(--color-contrast-higher), 0.15);
353 | }
354 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_details-list.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_details-list
6 | Title: Details List
7 | Descr: Pairs of related information displayed in a list
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | :root {
13 | --details-list-border-width: 1px;
14 | --details-list-border-opacity: 0.15;
15 | }
16 |
17 | .details-list {}
18 |
19 | .details-list--rows {
20 | .details-list__item {
21 | border-bottom: var(--details-list-border-width) solid alpha(var(--color-contrast-higher), var(--details-list-border-opacity));
22 |
23 | &:last-child {
24 | border-bottom: none;
25 | }
26 | }
27 | }
28 |
29 | .details-list--cols {
30 | .details-list__item {
31 | border-right: var(--details-list-border-width) solid alpha(var(--color-contrast-higher), var(--details-list-border-opacity));
32 |
33 | &:last-child {
34 | border-right: none;
35 | }
36 | }
37 | }
38 |
39 | @each $breakpoint, $value in $breakpoints {
40 | @include breakpoint(#{$breakpoint}) {
41 | .details-list--rows\@#{$breakpoint} {
42 | .details-list__item {
43 | border-right: 0;
44 | border-bottom: var(--details-list-border-width) solid alpha(var(--color-contrast-higher), var(--details-list-border-opacity));
45 |
46 | &:last-child {
47 | border-bottom: none;
48 | }
49 | }
50 | }
51 |
52 | .details-list--cols\@#{$breakpoint} {
53 | .details-list__item {
54 | border-bottom: 0;
55 | border-right: var(--details-list-border-width) solid alpha(var(--color-contrast-higher), var(--details-list-border-opacity));
56 |
57 | &:last-child {
58 | border-right: none;
59 | }
60 | }
61 | }
62 | }
63 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_diagonal-section.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_diagonal-section
6 | Title: Diagonal Section
7 | Descr: Section with diagonal edges
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | :root {
13 | --diagonal-section-offset: 50px;
14 | }
15 |
16 | .diagonal-section,
17 | .diagonal-section-top,
18 | .diagonal-section-bottom {
19 | position: relative;
20 | z-index: 1;
21 | background-size: cover;
22 | background-repeat: no-repeat;
23 | background-position: center;
24 | }
25 |
26 | @supports (clip-path: inset(50%)) {
27 | .diagonal-section, .diagonal-section-top.diagonal-section-bottom {
28 | padding-top: calc(var(--diagonal-section-offset)/2);
29 | padding-bottom: calc(var(--diagonal-section-offset)/2);
30 | clip-path: polygon(0% 0%, 100% var(--diagonal-section-offset), 100% 100%, 0% calc(100% - var(--diagonal-section-offset)));
31 | }
32 |
33 | .diagonal-section--flip-x {
34 | clip-path: polygon(0% var(--diagonal-section-offset), 100% 0%, 100% calc(100% - var(--diagonal-section-offset)), 0% 100%);
35 | }
36 |
37 | .diagonal-section-top {
38 | padding-top: calc(var(--diagonal-section-offset)/2);
39 | clip-path: polygon(0% 0%, 100% var(--diagonal-section-offset), 100% 100%, 0% 100%);
40 |
41 | }
42 |
43 | .diagonal-section-top--flip-x {
44 | clip-path: polygon(0% var(--diagonal-section-offset), 100% 0%, 100% 100%, 0% 100%);
45 |
46 | &.diagonal-section-bottom {
47 | clip-path: polygon(0% var(--diagonal-section-offset), 100% 0%, 100% 100%, 0% calc(100% - var(--diagonal-section-offset)));
48 | }
49 | }
50 |
51 | .diagonal-section-bottom {
52 | padding-bottom: calc(var(--diagonal-section-offset)/2);
53 | clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% calc(100% - var(--diagonal-section-offset)));
54 | }
55 |
56 | .diagonal-section-bottom--flip-x {
57 | clip-path: polygon(0% 0%, 100% 0%, 100% calc(100% - var(--diagonal-section-offset)), 0% 100%);
58 |
59 | &.diagonal-section-top {
60 | clip-path: polygon(0% 0%, 100% var(--diagonal-section-offset), 100% calc(100% - var(--diagonal-section-offset)), 0% 100%);
61 | }
62 | }
63 |
64 | .diagonal-section-top--flip-x.diagonal-section-bottom--flip-x {
65 | clip-path: polygon(0% var(--diagonal-section-offset), 100% 0%, 100% calc(100% - var(--diagonal-section-offset)), 0% 100%);
66 | }
67 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_feature-v10.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_feature-v10
6 | Title: Feature v10
7 | Descr: A feature section containing two adjacent content blocks
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | .feature-v10 {
13 | position: relative;
14 | z-index: 1;
15 | }
16 |
17 | .feature-v10__link {
18 | position: relative;
19 | text-decoration: none;
20 | color: inherit;
21 | display: inline-block;
22 | transition: .3s var(--ease-out);
23 | transform-origin: left bottom;
24 |
25 | i { // label
26 | position: relative;
27 | z-index: 2;
28 | display: inline-block;
29 | transition: .3s var(--ease-out);
30 | }
31 |
32 | &::after { // animated border
33 | content: '';
34 | background-color: currentColor;
35 | height: 2px;
36 | width: 100%;
37 | position: absolute;
38 | z-index: 1;
39 | bottom: 0;
40 | left: 0;
41 | transition: .3s var(--ease-out);
42 | opacity: 0.15;
43 | }
44 |
45 | &:hover {
46 | transform: scale(1.3);
47 |
48 | i {
49 | transform: scale(0.7); // reverse parent transformation
50 | }
51 |
52 | &::after {
53 | height: 100%;
54 | }
55 | }
56 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_feature-v9.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_feature-v9
6 | Title: Feature v9
7 | Descr: A feature section with 2 blocks
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | .feature-v9 {
13 | &:hover .feature-v9__block:not(:hover) .feature-v9__content {
14 | opacity: 0.5;
15 | }
16 |
17 | &:hover .feature-v9__block:not(:hover)::after {
18 | background-color: alpha(var(--color-black), 0.8);
19 | backdrop-filter: grayscale(100%);
20 | }
21 | }
22 |
23 | .feature-v9__block {
24 | position: relative;
25 | display: flex;
26 | background-size: cover;
27 | background-repeat: no-repeat;
28 | background-position: center;
29 | padding: var(--space-xl) var(--space-md);
30 | min-height: 350px;
31 |
32 | &::before, &::after {
33 | content: '';
34 | position: absolute;
35 | z-index: 1;
36 | bottom: 0;
37 | left: 0;
38 | width: 100%;
39 | transition: .2s;
40 | }
41 |
42 | &::before { // gradient under the content
43 | height: 70%;
44 | background: linear-gradient(alpha(var(--color-black), 0), alpha(var(--color-black), 0.8));
45 | mix-blend-mode: multiply;
46 | }
47 |
48 | &::after { // overlay layer
49 | height: 100%;
50 | background-color: alpha(var(--color-black), 0);
51 | }
52 |
53 | &:hover .feature-v9__content {
54 | transform: translateY(-10px);
55 | }
56 |
57 | @include breakpoint(sm) {
58 | min-height: 450px;
59 | }
60 |
61 | @include breakpoint(md) {
62 | min-height: 600px;
63 | }
64 |
65 | @include breakpoint(lg) {
66 | min-height: 700px;
67 | }
68 | }
69 |
70 | .feature-v9__content {
71 | position: relative;
72 | z-index: 2;
73 | color: var(--color-white);
74 | @include fontSmooth;
75 | margin: auto auto 0;
76 | transition: .2s;
77 | }
78 |
79 | .feature-v9__link {
80 | color: var(--color-black);
81 | text-decoration: none;
82 | display: inline-block;
83 | padding: var(--space-xs) var(--space-md);
84 | background-color: alpha(var(--color-white), 0.8);
85 | border-radius: var(--radius-md);
86 | backdrop-filter: blur(5px);
87 | transition: background-color .2s;
88 |
89 | &:hover {
90 | background-color: alpha(var(--color-white), 1);
91 | }
92 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_google-maps.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_google-maps
6 | Title: Google Maps
7 | Descr: Google Maps component
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | .google-maps {
13 | width: 100%;
14 | height: 0;
15 | padding-bottom: 56.25%; // set 16:9 aspect ratio
16 | }
17 |
18 | .google-maps--ratio-4\:1 {
19 | padding-bottom: 25%;
20 | }
21 |
22 | .google-maps--ratio-3\:1 {
23 | padding-bottom: 33%;
24 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_immersive-section-transition.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_immersive-section-transition
6 | Title: Immersive Section Transition
7 | Descr: A media element that animates to a full-screen block, before transitioning to the next section of content
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | .js {
13 | .immerse-section-tr {
14 | position: relative;
15 | --immerse-section-tr-opacity: 0; // overlay layer opacity - modified using JS
16 | }
17 |
18 | .immerse-section-tr__media {
19 | position: sticky;
20 | top: 0;
21 | z-index: 1;
22 | overflow: hidden;
23 | pointer-events: none;
24 | }
25 |
26 | .immerse-section-tr--disabled .immerse-section-tr__media { // this class is added in JS if effect is deactivated
27 | position: relative;
28 | }
29 |
30 | .immerse-section-tr__figure { // asset to scale up
31 | will-change: transform;
32 | pointer-events: auto;
33 | // make asset responsive
34 | position: relative;
35 | height: 0;
36 |
37 |
38 | > * {
39 | position: absolute;
40 | top: 0;
41 | left: 0;
42 | width: 100%;
43 | height: 100%;
44 | object-fit: cover;
45 | }
46 | }
47 |
48 | .immerse-section-tr__figure--16-9 { // 16:9 aspect ratio
49 | padding-bottom: 56.25%;
50 | }
51 |
52 | .immerse-section-tr__figure--3-4 { // 3:4 aspect ratio
53 | padding-bottom: 133.33%;
54 | }
55 |
56 | .immerse-section-tr__content {
57 | position: relative;
58 | z-index: 3;
59 | transform: translateZ(0); // fix z-index issue on Safari
60 |
61 | &::after, // overlay layer
62 | &::before { // section background
63 | content: '';
64 | pointer-events: none;
65 | position: absolute;
66 | top: 0;
67 | left: 0;
68 | width: 100%;
69 | background: var(--color-bg);
70 | opacity: var(--immerse-section-tr-opacity, 0);
71 | pointer-events: none;
72 | }
73 |
74 | &::before {
75 | height: 100%;
76 | z-index: -1;
77 | }
78 |
79 | &::after {
80 | height: 100vh;
81 | transform: translateY(-100%);
82 | }
83 | }
84 |
85 | .immerse-section-tr--disabled .immerse-section-tr__content::before {
86 | opacity: 1;
87 | }
88 | }
89 |
90 | html:not(.js) .immerse-section-tr__content {
91 | background-color: var(--color-bg);
92 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_link-effects.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_link-effects
6 | Title: Link Effects
7 | Descr: A collection of link effects
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | // v1
13 | .link-fx-1 {
14 | position: relative;
15 | display: inline-flex;
16 | align-items: center;
17 | height: 32px; // !important - set fixed height
18 | padding: 0 6px;
19 | text-decoration: none;
20 | @include fontSmooth;
21 |
22 | .icon {
23 | position: absolute;
24 | right: 0;
25 | bottom: 0;
26 | transform: translateX(100%) rotate(90deg);
27 | font-size: 32px; // icon size = link size 👆
28 |
29 | circle {
30 | stroke-dasharray: 100;
31 | stroke-dashoffset: 100;
32 | transition: stroke-dashoffset .2s;
33 | }
34 |
35 | line {
36 | transition: transform .4s;
37 | transform-origin: 13px 15px;
38 | }
39 |
40 | line:last-child {
41 | transform-origin: 19px 15px;
42 | }
43 | }
44 |
45 | &::before { // border bottom
46 | content: '';
47 | position: absolute;
48 | bottom: 0;
49 | left: 0;
50 | width: 100%;
51 | height: 1px;
52 | background-color: currentColor;
53 | transform-origin: right center;
54 | transition: transform .2s .1s;
55 | }
56 |
57 | &:hover {
58 | .icon {
59 | circle {
60 | stroke-dashoffset: 200;
61 | transition: stroke-dashoffset .2s .1s;
62 | }
63 |
64 | line {
65 | transform: rotate(-180deg);
66 | }
67 |
68 | line:last-child {
69 | transform: rotate(180deg);
70 | }
71 | }
72 |
73 | &::before {
74 | transform: translateX(17px) scaleX(0);
75 | transition: transform .2s;
76 | }
77 | }
78 | }
79 |
80 | // v2
81 | .link-fx-2 {
82 | position: relative;
83 | display: inline-block;
84 | padding: 4px 6px;
85 | color: var(--color-contrast-higher);
86 | text-decoration: none;
87 | background-image: linear-gradient(var(--color-contrast-higher), var(--color-contrast-higher));
88 | background-size: 100% 1px;
89 | background-repeat: repeat-x;
90 | background-position: left bottom;
91 | will-change: background-size;
92 | transition: background-size .3s var(--ease-out);
93 | @include fontSmooth;
94 |
95 | &::after {
96 | content: attr(data-link-fx-clone);
97 | color: var(--color-bg);
98 | position: absolute;
99 | top: 0;
100 | left: 0;
101 | width: 100%;
102 | height: 100%;
103 | padding: inherit;
104 | will-change: clip-path, transform;
105 | clip-path: polygon(0% 100%, 100% 100%, 100% 100%, 0% 100%);
106 | transform: translateY(4px);
107 | transition: clip-path .3s, transform .3s;
108 | transition-timing-function: var(--ease-out);
109 | }
110 |
111 | &:hover {
112 | background-size: 100% 100%;
113 |
114 | &::after {
115 | clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%);
116 | transform: translateY(0px);
117 | }
118 | }
119 | }
120 |
121 | // v3
122 | .link-fx-3 {
123 | position: relative;
124 | display: inline-flex;
125 | padding: 4px 6px;
126 | text-decoration: none;
127 | align-items: center;
128 |
129 | .icon {
130 | display: block;
131 | font-size: 12px; // icon size
132 | margin-left: 8px;
133 | position: relative;
134 | opacity: 0;
135 | visibility: hidden;
136 | will-change: transform;
137 | transform: translateY(10px);
138 | transition: opacity .3s, transform .3s var(--ease-out), visibility 0s .3s;
139 |
140 | line {
141 | transform-origin: 9px 6px;
142 | will-change: transform;
143 | transition: transform .3s var(--ease-out);
144 | }
145 |
146 | line:first-child {
147 | transform: rotate(20deg);
148 | }
149 |
150 | line:last-child {
151 | transform: rotate(-20deg);
152 | }
153 | }
154 |
155 | &::before {
156 | content: '';
157 | position: absolute;
158 | bottom: 0;
159 | left: 0;
160 | width: calc(100% - 18px); // 18px = icon size (12px) + padding right (6px)
161 | height: 1px;
162 | background-color: currentColor;
163 | transition: .3s var(--ease-out);
164 | }
165 |
166 | &:hover {
167 | .icon {
168 | opacity: 1;
169 | visibility: visible;
170 | transform: translateY(0);
171 | transition: opacity .3s, transform .3s var(--ease-out);
172 |
173 | line:first-child, line:last-child {
174 | transform: rotate(0);
175 | }
176 | }
177 |
178 | &::before {
179 | width: 100%;
180 | }
181 | }
182 | }
183 |
184 | // v4
185 | .link-fx-4 {
186 | position: relative;
187 | display: inline-block;
188 | padding: 6px 10px;
189 | background-color: var(--color-contrast-lower);
190 | color: var(--color-contrast-higher);
191 | text-decoration: none;
192 | @include fontSmooth;
193 |
194 | &::before {
195 | content: attr(data-link-fx-clone);
196 | position: absolute;
197 | z-index: 1;
198 | top: 0;
199 | left: 0;
200 | width: 100%;
201 | height: 100%;
202 | display: flex;
203 | align-items: center;
204 | justify-content: center;
205 | background-color: var(--color-contrast-higher);
206 | color: var(--color-bg);
207 | will-change: clip-path;
208 | clip-path: polygon(0% 0%, 1px 0%, 1px 100%, 0% 100%);
209 | transition: clip-path .3s var(--ease-out);
210 | }
211 |
212 | &:hover {
213 | &::before {
214 | clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%);
215 | }
216 | }
217 | }
218 |
219 | .link-fx-5 {
220 | display: inline-block;
221 | padding: 4px 0;
222 | text-decoration: none;
223 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='4' viewBox='0 0 16 4'%3E%3Cpath d='M0,3.5c4,0,4-3,8-3s4,3,8,3' fill='none' stroke='%232a6df4' opacity='0.5' stroke-miterlimit='10'/%3E%3C/svg%3E"); // 👈 edit stroke='%232a6df4' (last 6 digits - hexadecimal color) to change the color of the SVG decoration
224 | background-repeat: repeat-x;
225 | background-position: 0px 100%;
226 | background-size: 0;
227 |
228 | &:hover {
229 | background-size: 16px 4px;
230 | animation: link-fx-5-animation .4s linear infinite;
231 | }
232 | }
233 |
234 | @keyframes link-fx-5-animation {
235 | from {
236 | background-position: 0px 100%;
237 | }
238 |
239 | to {
240 | background-position: 16px 100%;
241 | }
242 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_list-v2.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_list-v2
6 | Title: List v2
7 | Descr: Custom list component
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | :root {
13 | --list-v2-bullet-size: 40px;
14 | --list-v2-bullet-font-size: 1rem;
15 | --list-v2-bullet-margin-right: 1rem;
16 | --list-v2-gap-y: var(--space-lg); /* list points gap */
17 | }
18 |
19 | .list-v2, .text-component .list-v2 {
20 | padding-left: 0;
21 | list-style: none;
22 |
23 | > li:not(:last-child) {
24 | margin-bottom: var(--list-v2-gap-y);
25 | }
26 | }
27 |
28 | .list-v2__title {
29 | padding-left: calc(var(--list-v2-bullet-size) + var(--list-v2-bullet-margin-right));
30 | }
31 |
32 | .list-v2__bullet {
33 | display: inline-flex;
34 | align-items: center;
35 | justify-content: center;
36 | flex-shrink: 0;
37 |
38 | width: var(--list-v2-bullet-size);
39 | height: var(--list-v2-bullet-size);
40 |
41 | margin-right: var(--list-v2-bullet-margin-right);
42 | margin-left: calc(-1 * var(--list-v2-bullet-size) - var(--list-v2-bullet-margin-right));
43 |
44 | vertical-align: middle;
45 | position: relative;
46 | top: -0.1em;
47 | }
48 |
49 | .list-v2__content {
50 | margin-left: calc(var(--list-v2-bullet-size) + var(--list-v2-bullet-margin-right));
51 | }
52 |
53 | /* ordered list */
54 | .list-v2--ol, .text-component .list-v2--ol {
55 | counter-reset: list-items;
56 |
57 | > li {
58 | counter-increment: list-items;
59 | }
60 |
61 | .list-v2__bullet {
62 | border-radius: 50%;
63 | background-color: alpha(var(--color-primary), 0.2);
64 |
65 | color: var(--color-primary);
66 | font-size: var(--list-v2-bullet-font-size);
67 | font-weight: 500;
68 |
69 | &::before {
70 | content: counter(list-items);
71 | }
72 | }
73 | }
74 |
75 | /* unordered list */
76 | .list-v2--ul, .text-component .list-v2--ul {
77 | --list-v2-bullet-size: 10px;
78 |
79 | .list-v2__bullet {
80 | border-radius: 50%;
81 | background-color: var(--color-primary);
82 | }
83 | }
84 |
85 | /* icons */
86 | .list-v2--icons, .text-component .list-v2--icons {
87 | --list-v2-bullet-size: 48px;
88 |
89 | .list-v2__bullet {
90 | border-radius: 50%;
91 | background-color: alpha(var(--color-primary), 0.2);
92 | }
93 |
94 | .list-v2__icon {
95 | --size: 24px;
96 | color: var(--color-primary); /* icon color */
97 | }
98 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_list.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_list
6 | Title: List
7 | Descr: Custom list component
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | :root {
13 | --list-space-y: 0.375em; // vertical gaps
14 | --list-offset: 1em; // sublist horizontal offset
15 | --list-line-height-multiplier: 1; // line-height multiplier
16 | }
17 |
18 | .list, .text-component .list {
19 | padding-left: 0;
20 | list-style: none;
21 |
22 | ul, ol {
23 | list-style: none;
24 | margin: 0; // reset
25 | margin-top: calc((var(--list-space-y) / 2) * var(--text-space-y-multiplier, 1));
26 | padding-top: calc((var(--list-space-y) / 2) * var(--text-space-y-multiplier, 1));
27 | padding-left: var(--list-offset);
28 | }
29 |
30 | li {
31 | padding-bottom: calc((var(--list-space-y) / 2) * var(--text-space-y-multiplier, 1));
32 | margin-bottom: calc((var(--list-space-y) / 2) * var(--text-space-y-multiplier, 1));
33 | line-height: calc(var(--body-line-height) * var(--list-line-height-multiplier));
34 | }
35 |
36 | > li:last-child, ul > li:last-child, ol > li:last-child {
37 | margin-bottom: 0;
38 | }
39 |
40 | &:not(.list--border) > li:last-child, ul > li:last-child, ol > li:last-child {
41 | padding-bottom: 0;
42 | }
43 | }
44 |
45 | /* #region (ul + ol) */
46 | .list--ul, .text-component .list--ul,
47 | .list--ol, .text-component .list--ol {
48 | --list-offset: calc(var(--list-bullet-size) + var(--list-bullet-margin-right));
49 |
50 | ul, ol {
51 | padding-left: 0;
52 | }
53 |
54 | li {
55 | @supports (--css: variables) {
56 | padding-left: var(--list-offset) !important;
57 | }
58 | }
59 |
60 | li::before {
61 | display: inline-flex;
62 | justify-content: center;
63 | align-items: center;
64 | vertical-align: middle;
65 | position: relative;
66 | top: -0.1em;
67 |
68 | @supports (--css: variables) {
69 | width: var(--list-bullet-size) !important;
70 | height: var(--list-bullet-size) !important;
71 | margin-left: calc(var(--list-bullet-size) * -1) !important;
72 | left: calc(var(--list-bullet-margin-right) * -1) !important;
73 | }
74 | }
75 | }
76 |
77 | // unordered list
78 | .list--ul, .text-component .list--ul {
79 | --list-bullet-size: 7px; // dot width and height
80 | --list-bullet-margin-right: 12px; // gap between bullet and content
81 |
82 | > li {
83 | padding-left: 19px; // IE fallback
84 | }
85 |
86 | > li::before { // bullet
87 | content: '';
88 | border-radius: 50%;
89 | color: var(--color-contrast-lower); // bullet color
90 | background-color: currentColor;
91 |
92 | // IE fallback
93 | width: 7px;
94 | height: 7px;
95 | margin-left: -7px;
96 | left: -12px;
97 | // end - IE fallback
98 | }
99 |
100 | ul li::before {
101 | background-color: transparent;
102 | box-shadow: inset 0 0 0 2px currentColor;
103 | }
104 | }
105 |
106 | // ordered list
107 | .list--ol, .text-component .list--ol {
108 | --list-bullet-size: 26px; // ⚠️ use px or rem units - circle width and height
109 | --list-bullet-margin-right: 6px; // ⚠️ use px or rem units - gap between circle and content
110 | --list-bullet-font-size: 14px; // ⚠️ use px or rem units - bullet font size
111 | counter-reset: list-items;
112 |
113 | > li {
114 | counter-increment: list-items;
115 | padding-left: 32px; // IE fallback
116 | }
117 |
118 | ol {
119 | counter-reset: list-items;
120 | }
121 |
122 | > li::before {
123 | content: counter(list-items);
124 | font-size: var(--list-bullet-font-size, 14px);
125 | background-color: var(--color-contrast-lower);
126 | color: var(--color-contrast-high);
127 | line-height: 1;
128 | border-radius: 50%;
129 |
130 | // IE fallback
131 | width: 26px;
132 | height: 26px;
133 | margin-left: -26px;
134 | left: -6px;
135 | // end - IE fallback
136 | }
137 |
138 | ol > li::before {
139 | background-color: transparent;
140 | box-shadow: inset 0 0 0 2px var(--color-contrast-lower);
141 | }
142 | }
143 | /* #endregion */
144 |
145 | /* #region (border) */
146 | .list--border, .text-component .list--border { // show border divider among list items
147 | li:not(:last-child) {
148 | border-bottom: 1px solid var(--color-contrast-lower);
149 | }
150 |
151 | ul, ol {
152 | border-top: 1px solid var(--color-contrast-lower);
153 | }
154 | }
155 | /* #endregion */
156 |
157 | /* #region (icons) */
158 | .list--icons, .text-component .list--icons { // use icons as bullet points
159 | --list-bullet-size: 24px;
160 | --list-bullet-margin-right: 8px; // gap between icon and text
161 | --list-offset: calc(var(--list-bullet-size) + var(--list-bullet-margin-right));
162 |
163 | ul, ol {
164 | padding-left: 32px; // IE fallback
165 |
166 | @supports (--css: variables) {
167 | padding-left: var(--list-offset);
168 | }
169 | }
170 | }
171 |
172 | .list__icon {
173 | position: relative;
174 |
175 | // IE fallback
176 | width: 24px;
177 | height: 24px;
178 | margin-right: 8px;
179 |
180 | &:not(.top-0) {
181 | top: calc((1em * var(--body-line-height) - 24px) / 2);
182 | }
183 | // end - IE fallback
184 |
185 | @supports (--css: variables) {
186 | width: var(--list-bullet-size);
187 | height: var(--list-bullet-size);
188 | margin-right: var(--list-bullet-margin-right);
189 |
190 | &:not(.top-0) {
191 | top: calc((1em * var(--body-line-height) * var(--list-line-height-multiplier) - var(--list-bullet-size)) / 2);
192 | }
193 | }
194 | }
195 | /* #endregion */
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_main-footer.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_main-footer
6 | Title: Main Footer
7 | Descr: Footer navigation
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | .main-footer {}
13 |
14 | .main-footer__logo {
15 | display: inline-block;
16 |
17 | svg, img {
18 | display: block;
19 | }
20 | }
21 |
22 | .main-footer__link {
23 | color: var(--color-contrast-medium);
24 | text-decoration: none;
25 |
26 | &:hover {
27 | color: var(--color-contrast-high);
28 | text-decoration: underline;
29 | }
30 | }
31 |
32 | .main-footer__social {
33 | text-decoration: none;
34 | display: inline-block;
35 | color: var(--color-contrast-medium);
36 |
37 | &:hover {
38 | color: var(--color-contrast-high);
39 | }
40 |
41 | .icon {
42 | font-size: 1.2em; // icon size
43 | }
44 |
45 | @include breakpoint(md) {
46 | .icon {
47 | font-size: 1em;
48 | }
49 | }
50 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_modal-window.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_modal-window
6 | Title: Modal Window
7 | Descr: A modal dialog used to display critical information
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | .modal {
13 | position: fixed;
14 | z-index: var(--z-index-overlay, 15);
15 | width: 100%;
16 | height: 100%;
17 | left: 0;
18 | top: 0;
19 | opacity: 0;
20 | visibility: hidden;
21 |
22 | &:not(.modal--is-visible) {
23 | pointer-events: none;
24 | background-color: transparent;
25 | }
26 | }
27 |
28 | .modal--is-visible {
29 | opacity: 1;
30 | visibility: visible;
31 | }
32 |
33 | // close button
34 | .modal__close-btn {
35 | display: flex;
36 | flex-shrink: 0;
37 | border-radius: 50%;
38 | transition: .2s;
39 |
40 | .icon {
41 | display: block;
42 | margin: auto;
43 | }
44 | }
45 |
46 | .modal__close-btn--outer { // close button - outside the modal__content
47 | width: 48px;
48 | height: 48px;
49 | position: fixed;
50 | top: var(--space-sm);
51 | right: var(--space-sm);
52 | z-index: var(--z-index-fixed-element, 10);
53 | background-color: alpha(var(--color-black), 0.9);
54 | transition: .2s;
55 |
56 | .icon {
57 | color: var(--color-white); // icon color
58 | transition: transform .3s var(--ease-out-back);
59 | }
60 |
61 | &:hover {
62 | background-color: alpha(var(--color-black), 1);
63 |
64 | .icon {
65 | transform: scale(1.1);
66 | }
67 | }
68 | }
69 |
70 | .modal__close-btn--inner { // close button - inside the modal__content
71 | --size: 32px;
72 | width: var(--size);
73 | height: var(--size);
74 | background-color: var(--color-bg-light);
75 | box-shadow: var(--inner-glow), var(--shadow-sm);
76 | transition: .2s;
77 |
78 | .icon {
79 | color: inherit; // icon color
80 | }
81 |
82 | &:hover {
83 | background-color: var(--color-bg-lighter);
84 | box-shadow: var(--inner-glow), var(--shadow-md);
85 | }
86 | }
87 |
88 | // animations
89 | :root {
90 | --modal-transition-duration: 0.2s; // fallback (i.e., unless specified differently in the variations 👇)
91 | }
92 |
93 | @media (prefers-reduced-motion: no-preference) {
94 | .modal--animate-fade {
95 | --modal-transition-duration: 0.2s;
96 | transition: opacity var(--modal-transition-duration), background-color var(--modal-transition-duration), visibility 0s var(--modal-transition-duration);
97 |
98 | &.modal--is-visible {
99 | transition: opacity var(--modal-transition-duration), background-color var(--modal-transition-duration), visibility 0s;
100 | }
101 | }
102 |
103 | .modal--animate-scale,
104 | .modal--animate-translate-up,
105 | .modal--animate-translate-down,
106 | .modal--animate-translate-right,
107 | .modal--animate-translate-left {
108 | --modal-transition-duration: .2s;
109 | transition: opacity var(--modal-transition-duration), background-color var(--modal-transition-duration), visibility 0s var(--modal-transition-duration);
110 |
111 | .modal__content {
112 | will-change: transform;
113 | transition: transform var(--modal-transition-duration) var(--ease-out);
114 | }
115 |
116 | &.modal--is-visible {
117 | transition: opacity var(--modal-transition-duration), background-color var(--modal-transition-duration), visibility 0s;
118 |
119 | .modal__content {
120 | transform: scale(1); // reset all transformations
121 | }
122 | }
123 | }
124 |
125 | .modal--animate-slide-up,
126 | .modal--animate-slide-down,
127 | .modal--animate-slide-right,
128 | .modal--animate-slide-left {
129 | --modal-transition-duration: 0.3s;
130 | transition: opacity 0s var(--modal-transition-duration), background-color var(--modal-transition-duration), visibility 0s var(--modal-transition-duration);
131 |
132 | .modal__content {
133 | will-change: transform;
134 | transition: transform var(--modal-transition-duration) var(--ease-out);
135 | }
136 |
137 | &.modal--is-visible {
138 | transition: background-color var(--modal-transition-duration), visibility 0s;
139 |
140 | .modal__content {
141 | transform: scale(1); // reset all transformations
142 | }
143 | }
144 | }
145 |
146 | // scale
147 | .modal--animate-scale {
148 | .modal__content {
149 | transform: scale(0.95);
150 | }
151 | }
152 |
153 | // translate
154 | .modal--animate-translate-up {
155 | .modal__content {
156 | transform: translateY(40px);
157 | }
158 | }
159 |
160 | .modal--animate-translate-down {
161 | .modal__content {
162 | transform: translateY(-40px);
163 | }
164 | }
165 |
166 | .modal--animate-translate-right {
167 | .modal__content {
168 | transform: translateX(-40px);
169 | }
170 | }
171 |
172 | .modal--animate-translate-left {
173 | .modal__content {
174 | transform: translateX(40px);
175 | }
176 | }
177 |
178 | // slide
179 | .modal--animate-slide-up {
180 | .modal__content {
181 | transform: translateY(100%);
182 | }
183 | }
184 |
185 | .modal--animate-slide-down {
186 | .modal__content {
187 | transform: translateY(-100%);
188 | }
189 | }
190 |
191 | .modal--animate-slide-right {
192 | .modal__content {
193 | transform: translateX(-100%);
194 | }
195 | }
196 |
197 | .modal--animate-slide-left {
198 | .modal__content {
199 | transform: translateX(100%);
200 | }
201 | }
202 | }
203 |
204 | // load content - optional
205 | .modal--is-loading {
206 | .modal__content {
207 | visibility: hidden;
208 | }
209 |
210 | .modal__loader {
211 | display: flex;
212 | }
213 | }
214 |
215 | .modal__loader { // loader icon
216 | position: fixed;
217 | top: 0;
218 | left: 0;
219 | width: 100%;
220 | height: 100%;
221 | justify-content: center;
222 | align-items: center;
223 | display: none;
224 | pointer-events: none;
225 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_newsletter.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_newsletter
6 | Title: Newsletter
7 | Descr: Newsletter form template
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | .newsletter {
13 | position: relative;
14 | z-index: 1;
15 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_notice.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_notice
6 | Title: Notice
7 | Descr: Modeless notice banner, visible by default
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | .notice {
13 | position: fixed;
14 | width: 100%;
15 | pointer-events: none;
16 | z-index: var(--z-index-fixed-element, 10);
17 | }
18 |
19 | .notice__banner {
20 | pointer-events: auto;
21 | }
22 |
23 | .notice__close-btn {
24 | --size: 2em;
25 | display: flex;
26 | width: var(--size);
27 | height: var(--size);
28 | flex-shrink: 0;
29 | justify-content: center;
30 | align-items: center;
31 | border-radius: 50%;
32 | background-color: alpha(var(--color-contrast-higher), 0.85);
33 | color: var(--color-bg);
34 | transition: .2s;
35 |
36 | &:hover {
37 | background-color: var(--color-contrast-higher);
38 | }
39 |
40 | .icon {
41 | --size: 16px;
42 | }
43 | }
44 |
45 | .notice--hide {
46 | opacity: 0;
47 | visibility: hidden;
48 | }
49 |
50 | @media screen and (prefers-reduced-motion: no-preference) {
51 | .notice {
52 | transition: opacity .3s, visibility 0s .3s;
53 | }
54 |
55 | .notice__banner {
56 | transition: transform .3s;
57 | }
58 |
59 | .notice--hide {
60 | .notice__banner {
61 | transform: translateY(20px);
62 | }
63 | }
64 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_pagination.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_pagination
6 | Title: Pagination
7 | Descr: Component used to navigate through pages of related content
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | .pagination {}
13 |
14 | .pagination__list > li {
15 | display: inline-block; // flex fallback
16 | }
17 |
18 | // --split - push first + last item to sides
19 | .pagination--split {
20 | .pagination__list {
21 | width: 100%;
22 |
23 | > *:first-child {
24 | margin-right: auto;
25 | }
26 |
27 | > *:last-child {
28 | margin-left: auto;
29 | }
30 | }
31 | }
32 |
33 | .pagination__item {
34 | display: inline-block; // flex fallback
35 | display: inline-flex;
36 | height: 100%;
37 | align-items: center;
38 | padding: var(--space-xs) calc(1.355 * var(--space-xs));
39 |
40 | white-space: nowrap;
41 | line-height: 1;
42 | border-radius: var(--radius-md);
43 |
44 | text-decoration: none;
45 | color: var(--color-contrast-high);
46 | @include fontSmooth;
47 |
48 | will-change: transform;
49 | transition: .2s;
50 |
51 | &:hover:not(.pagination__item--selected):not(.pagination__item--ellipsis) {
52 | background-color: alpha(var(--color-contrast-higher), 0.1);
53 | }
54 |
55 | &:active {
56 | transform: translateY(2px);
57 | }
58 | }
59 |
60 | .pagination__item--selected {
61 | background-color: var(--color-contrast-higher);
62 | color: var(--color-bg);
63 | box-shadow: var(--shadow-sm);
64 | }
65 |
66 | .pagination__item--disabled {
67 | opacity: 0.5;
68 | pointer-events: none;
69 | }
70 |
71 | // --jumper
72 | .pagination__jumper {
73 | .form-control {
74 | width: 3em;
75 | margin-right: var(--space-xs);
76 | }
77 |
78 | em {
79 | flex-shrink: 0;
80 | white-space: nowrap;
81 | }
82 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_radio-switch.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_radio-switch
6 | Title: Radio Switch
7 | Descr: Custom radio toggle
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | :root {
13 | // style
14 | --radio-switch-width: 186px;
15 | --radio-switch-height: 46px;
16 | --radio-switch-padding: 3px;
17 | --radio-switch-radius: 50em;
18 |
19 | // animation
20 | --radio-switch-animation-duration: 0.3s;
21 | }
22 |
23 | .radio-switch {
24 | position: relative;
25 | display: inline-block; // flexbox fallback
26 | display: inline-flex;
27 | padding: var(--radio-switch-padding);
28 | border-radius: calc(var(--radio-switch-radius) * 1.4);
29 | background-color: var(--color-bg-darker);
30 |
31 | &:focus-within, &:active {
32 | box-shadow: 0 0 0 2px alpha(var(--color-contrast-higher), 0.15); // focus effect
33 | }
34 | }
35 |
36 | .radio-switch__item {
37 | position: relative;
38 | display: inline-block; // flexbox fallback
39 | height: calc(var(--radio-switch-height) - 2*var(--radio-switch-padding));
40 | width: calc(var(--radio-switch-width)*0.5 - var(--radio-switch-padding));
41 | }
42 |
43 | .radio-switch__label {
44 | position: relative;
45 | z-index: 2;
46 | display: flex;
47 | height: 100%;
48 | align-items: center;
49 | justify-content: center;
50 | border-radius: var(--radio-switch-radius);
51 | cursor: pointer;
52 | font-size: var(--text-sm);
53 | user-select: none;
54 | transition: all var(--radio-switch-animation-duration);
55 |
56 | .radio-switch__input:checked ~ & {
57 | color: var(--color-white);
58 | }
59 |
60 | .radio-switch__input:focus ~ & { // focus effect in browsers not supporting :focus-within
61 | background-color: lightness(var(--color-primary), 0.6);
62 | }
63 |
64 | :not(*):focus-within, // trick to detect :focus-within support -> https://css-tricks.com/using-feature-detection-conditionals-and-groups-with-selectors/
65 | .radio-switch__input:focus ~ & { // reset focus style for browsers supporting :focus-within
66 | background-color: transparent;
67 | }
68 | }
69 |
70 | .radio-switch__marker {
71 | position: absolute;
72 | z-index: 1;
73 | top: 0;
74 | left: -100%;
75 | border-radius: var(--radio-switch-radius);
76 | background-color: var(--color-primary);
77 | height: calc(var(--radio-switch-height) - 2*var(--radio-switch-padding));
78 | width: calc(var(--radio-switch-width)*0.5 - var(--radio-switch-padding));
79 | box-shadow: var(--shadow-md);
80 | transition: transform var(--radio-switch-animation-duration);
81 |
82 | .radio-switch__input:checked ~ & {
83 | transform: translateX(100%);
84 | }
85 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_radios-checkboxes.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_radios-checkboxes
6 | Title: Radios and Checkboxes
7 | Descr: Custom radio and checkbox buttons
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | :root {
13 | // radios and checkboxes
14 | --checkbox-radio-size: 18px;
15 | --checkbox-radio-gap: var(--space-xxs); // gap between button and label
16 | --checkbox-radio-border-width: 1px;
17 | --checkbox-radio-line-height: var(--body-line-height);
18 |
19 | // radio buttons
20 | --radio-marker-size: 8px;
21 |
22 | // checkboxes
23 | --checkbox-marker-size: 12px;
24 | --checkbox-radius: 4px;
25 | }
26 |
27 | // hide native buttons
28 | .radio,
29 | .checkbox {
30 | position: absolute;
31 | padding: 0;
32 | margin: 0;
33 | margin-top: calc((1em * var(--checkbox-radio-line-height) - var(--checkbox-radio-size)) / 2);
34 | opacity: 0;
35 | height: var(--checkbox-radio-size);
36 | width: var(--checkbox-radio-size);
37 | pointer-events: none;
38 | }
39 |
40 | // label
41 | .radio + label,
42 | .checkbox + label {
43 | display: inline-block;
44 | line-height: var(--checkbox-radio-line-height);
45 | user-select: none;
46 | cursor: pointer;
47 | padding-left: calc(var(--checkbox-radio-size) + var(--checkbox-radio-gap));
48 | }
49 |
50 | // custom inputs - basic style
51 | .radio + label::before,
52 | .checkbox + label::before {
53 | content: '';
54 | box-sizing: border-box;
55 | display: inline-block;
56 | position: relative;
57 | vertical-align: middle;
58 | top: -0.1em;
59 | margin-left: calc(-1 * (var(--checkbox-radio-size) + var(--checkbox-radio-gap)));
60 | flex-shrink: 0;
61 | width: var(--checkbox-radio-size);
62 | height: var(--checkbox-radio-size);
63 | background-color: var(--color-bg);
64 | border-width: var(--checkbox-radio-border-width);
65 | border-color: alpha(var(--color-contrast-low), 0.65);
66 | border-style: solid;
67 | box-shadow: var(--shadow-xs);
68 | background-repeat: no-repeat;
69 | background-position: center;
70 | margin-right: var(--checkbox-radio-gap);
71 | transition: transform .2s, border .2s;
72 | }
73 |
74 | // :hover
75 | .radio:not(:checked):not(:focus) + label:hover::before,
76 | .checkbox:not(:checked):not(:focus) + label:hover::before {
77 | border-color: alpha(var(--color-contrast-low), 1);
78 | }
79 |
80 | // radio only style
81 | .radio + label::before {
82 | border-radius: 50%;
83 | }
84 |
85 | // checkbox only style
86 | .checkbox + label::before {
87 | border-radius: var(--checkbox-radius);
88 | }
89 |
90 | // :checked
91 | .radio:checked + label::before,
92 | .checkbox:checked + label::before {
93 | background-color: var(--color-primary);
94 | box-shadow: var(--shadow-xs);
95 | border-color: var(--color-primary);
96 | transition: transform .2s;
97 | }
98 |
99 | // :active
100 | .radio:active + label::before,
101 | .checkbox:active + label::before {
102 | transform: scale(0.8);
103 | transition: transform .2s;
104 | }
105 |
106 | // :checked:active
107 | .radio:checked:active + label::before,
108 | .checkbox:checked:active + label::before {
109 | transform: none;
110 | transition: none;
111 | }
112 |
113 | // radio button icon
114 | .radio:checked + label::before {
115 | background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cg class='nc-icon-wrapper' fill='%23ffffff'%3E%3Ccircle cx='8' cy='8' r='8' fill='%23ffffff'%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");
116 | background-size: var(--radio-marker-size);
117 | }
118 |
119 | // checkbox button icon
120 | .checkbox:checked + label::before {
121 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpolyline points='1 6.5 4 9.5 11 2.5' fill='none' stroke='%23FFFFFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'/%3E%3C/svg%3E");
122 | background-size: var(--checkbox-marker-size);
123 | }
124 |
125 | // :focus
126 | .radio:checked:active + label::before,
127 | .checkbox:checked:active + label::before,
128 | .radio:focus + label::before,
129 | .checkbox:focus + label::before {
130 | border-color: var(--color-primary);
131 | box-shadow: 0 0 0 3px alpha(var(--color-primary), 0.2);
132 | }
133 |
134 | // --radio--bg, --checkbox--bg -> variation with background color
135 | .radio--bg + label, .checkbox--bg + label {
136 | padding: var(--space-xxxxs) var(--space-xxxs);
137 | padding-left: calc(var(--checkbox-radio-size) + var(--checkbox-radio-gap) + var(--space-xxxs));
138 | border-radius: var(--radius-md);
139 | transition: background .2s;
140 | }
141 |
142 | .radio--bg + label:hover, .checkbox--bg + label:hover {
143 | background-color: alpha(var(--color-contrast-higher), 0.075);
144 | }
145 |
146 | .radio--bg:active + label,
147 | .checkbox--bg:active + label,
148 | .radio--bg:focus + label,
149 | .checkbox--bg:focus + label {
150 | background-color: alpha(var(--color-primary), 0.1);
151 | }
--------------------------------------------------------------------------------
/virgo-codyframe/main/assets/css/components/_1_reading-progressbar.scss:
--------------------------------------------------------------------------------
1 | @use '../base' as *;
2 |
3 | /* --------------------------------
4 |
5 | File#: _1_reading-progressbar
6 | Title: Reading Progress Bar
7 | Descr: A bar indicator displaying the current reading progress
8 | Usage: codyhouse.co/license
9 |
10 | -------------------------------- */
11 |
12 | .reading-progressbar {
13 | position: fixed;
14 | z-index: var(--z-index-fixed-element, 10);
15 | top: 0;
16 | left: 0;
17 | width: 100%;
18 | height: 5px;
19 | color: var(--color-primary); // fill color
20 | pointer-events: none;
21 | display: none;
22 | transition: transform 0.2s;
23 | }
24 |
25 | .reading-progressbar--is-out {
26 | transform: translateY(-100%);
27 | }
28 |
29 | .reading-progressbar--is-active { // if JS = enabled && content is scrollable
30 | display: block;
31 | }
32 |
33 | .reading-progressbar::-webkit-progress-bar {
34 | background-color: transparent;
35 | }
36 |
37 | .reading-progressbar::-webkit-progress-value {
38 | background-color: currentColor;
39 | }
40 |
41 | .reading-progressbar::-moz-progress-bar {
42 | background-color: currentColor;
43 | }
44 |
45 | .reading-progressbar__fallback {
46 | // fallback for brawsers not supporting the