mirror of https://github.com/abpframework/eventhub
217 changed files with 32115 additions and 13091 deletions
@ -0,0 +1,32 @@ |
|||||
|
# UI Design Notes |
||||
|
|
||||
|
## Implementing the Design |
||||
|
|
||||
|
### Overall / Layout |
||||
|
|
||||
|
* Home & Events are separated, so we should create a separation in the solution |
||||
|
|
||||
|
### Home Page |
||||
|
|
||||
|
* Search area: |
||||
|
* Language selection |
||||
|
* Location (country / city) search / with online option |
||||
|
* When (date range selection) |
||||
|
|
||||
|
### Events Page |
||||
|
|
||||
|
* Search area: |
||||
|
* Language selection |
||||
|
* Location (country / city) search / with online option |
||||
|
* When (date range selection) |
||||
|
|
||||
|
## Features |
||||
|
|
||||
|
### Should Implement for the Design |
||||
|
|
||||
|
* ... |
||||
|
|
||||
|
### Plan for Future |
||||
|
|
||||
|
* Event & Organization Categories |
||||
|
* Event & Organization Tags (use the tagging system of CMS Kit) |
||||
@ -0,0 +1,10 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
|
||||
|
namespace EventHub.Organizations.Memberships |
||||
|
{ |
||||
|
public class OrganizationMemberListFilterDto : PagedResultRequestDto |
||||
|
{ |
||||
|
public Guid OrganizationId { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,10 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
|
||||
|
namespace EventHub.Organizations |
||||
|
{ |
||||
|
public class OrganizationListFilterDto : PagedResultRequestDto |
||||
|
{ |
||||
|
public Guid? RegisteredUserId { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using EventHub.Members; |
||||
|
using Volo.Abp.Application.Services; |
||||
|
|
||||
|
namespace EventHub.Users |
||||
|
{ |
||||
|
public interface IUserAppService : IApplicationService |
||||
|
{ |
||||
|
Task<UserDto> FindByUserNameAsync(string username); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
using Volo.Abp.Auditing; |
||||
|
|
||||
|
namespace EventHub.Members |
||||
|
{ |
||||
|
public class UserDto : EntityDto<Guid>, IHasCreationTime |
||||
|
{ |
||||
|
public string UserName { get; set; } |
||||
|
|
||||
|
public string Name { get; set; } |
||||
|
|
||||
|
public string Surname { get; set; } |
||||
|
|
||||
|
public string Email { get; set; } |
||||
|
|
||||
|
public DateTime CreationTime { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,24 @@ |
|||||
|
using System; |
||||
|
using System.Threading.Tasks; |
||||
|
using EventHub.Members; |
||||
|
using Volo.Abp.Domain.Repositories; |
||||
|
|
||||
|
namespace EventHub.Users |
||||
|
{ |
||||
|
public class UserAppService : EventHubAppService, IUserAppService |
||||
|
{ |
||||
|
private readonly IRepository<AppUser, Guid> _userRepository; |
||||
|
|
||||
|
public UserAppService(IRepository<AppUser, Guid> userRepository) |
||||
|
{ |
||||
|
_userRepository = userRepository; |
||||
|
} |
||||
|
|
||||
|
public async Task<UserDto> FindByUserNameAsync(string username) |
||||
|
{ |
||||
|
var user = await _userRepository.FindAsync(x => x.UserName == username); |
||||
|
|
||||
|
return ObjectMapper.Map<AppUser, UserDto>(user); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
namespace EventHub.Web |
||||
|
{ |
||||
|
public static class EventHubExternalUrls |
||||
|
{ |
||||
|
#if DEBUG
|
||||
|
public const string EhAccount = "https://localhost:44313"; |
||||
|
public const string EhApi = "https://localhost:44362"; |
||||
|
public const string EhAdmin = "https://localhost:44307"; |
||||
|
public const string EhWww = "https://localhost:44308"; |
||||
|
#else
|
||||
|
public const string EhAccount = "https://localhost:44313"; |
||||
|
public const string EhApi = "https://localhost:44362"; |
||||
|
public const string EhAdmin = "https://localhost:44307"; |
||||
|
public const string EhWww = "https://localhost:44308"; |
||||
|
#endif
|
||||
|
} |
||||
|
} |
||||
File diff suppressed because it is too large
@ -0,0 +1,23 @@ |
|||||
|
using Microsoft.EntityFrameworkCore.Migrations; |
||||
|
|
||||
|
namespace EventHub.Migrations |
||||
|
{ |
||||
|
public partial class Added_CountryName_To_Event : Migration |
||||
|
{ |
||||
|
protected override void Up(MigrationBuilder migrationBuilder) |
||||
|
{ |
||||
|
migrationBuilder.AddColumn<string>( |
||||
|
name: "CountryName", |
||||
|
table: "EhEvents", |
||||
|
type: "text", |
||||
|
nullable: true); |
||||
|
} |
||||
|
|
||||
|
protected override void Down(MigrationBuilder migrationBuilder) |
||||
|
{ |
||||
|
migrationBuilder.DropColumn( |
||||
|
name: "CountryName", |
||||
|
table: "EhEvents"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
File diff suppressed because it is too large
@ -1,11 +1,12 @@ |
|||||
module.exports = { |
module.exports = { |
||||
aliases: { |
aliases: { |
||||
|
"@node_modules": "./node_modules", |
||||
|
"@libs": "./wwwroot/libs" |
||||
}, |
}, |
||||
clean: [ |
clean: [ |
||||
|
"@libs" |
||||
], |
], |
||||
mappings: { |
mappings: { |
||||
|
"@node_modules/owl.carousel/dist/**": "@libs/owl.carousel/", |
||||
} |
} |
||||
}; |
}; |
||||
|
After Width: | Height: | Size: 480 B |
|
After Width: | Height: | Size: 147 B |
|
After Width: | Height: | Size: 161 B |
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
File diff suppressed because it is too large
@ -1,37 +1,37 @@ |
|||||
{ |
{ |
||||
"name": "malihu-custom-scrollbar-plugin", |
"name": "malihu-custom-scrollbar-plugin", |
||||
"version": "3.1.5", |
"version": "3.1.5", |
||||
"author": "malihu (http://manos.malihu.gr)", |
"author": "malihu (http://manos.malihu.gr)", |
||||
"description": "Highly customizable custom scrollbar jQuery plugin, featuring vertical/horizontal scrollbars, scrolling momentum, mouse-wheel, keyboard and touch support user defined callbacks etc.", |
"description": "Highly customizable custom scrollbar jQuery plugin, featuring vertical/horizontal scrollbars, scrolling momentum, mouse-wheel, keyboard and touch support user defined callbacks etc.", |
||||
"license": "MIT", |
"license": "MIT", |
||||
"homepage": "http://manos.malihu.gr/jquery-custom-content-scroller", |
"homepage": "http://manos.malihu.gr/jquery-custom-content-scroller", |
||||
"main": "./jquery.mCustomScrollbar.js", |
"main": "./jquery.mCustomScrollbar.js", |
||||
"repository": { |
"repository": { |
||||
"type": "git", |
"type": "git", |
||||
"url": "https://github.com/malihu/malihu-custom-scrollbar-plugin.git" |
"url": "https://github.com/malihu/malihu-custom-scrollbar-plugin.git" |
||||
}, |
}, |
||||
"bugs": { |
"bugs": { |
||||
"url": "https://github.com/malihu/malihu-custom-scrollbar-plugin/issues" |
"url": "https://github.com/malihu/malihu-custom-scrollbar-plugin/issues" |
||||
}, |
}, |
||||
"keywords": [ |
"keywords": [ |
||||
"jquery-plugin", |
"jquery-plugin", |
||||
"custom-scrollbar", |
"custom-scrollbar", |
||||
"scrollbar" |
"scrollbar" |
||||
], |
], |
||||
"files": [ |
"files": [ |
||||
"jquery.mCustomScrollbar.js", |
"jquery.mCustomScrollbar.js", |
||||
"jquery.mCustomScrollbar.concat.min.js", |
"jquery.mCustomScrollbar.concat.min.js", |
||||
"jquery.mCustomScrollbar.css", |
"jquery.mCustomScrollbar.css", |
||||
"mCSB_buttons.png", |
"mCSB_buttons.png", |
||||
"readme.md" |
"readme.md" |
||||
], |
], |
||||
"jam": { |
"jam": { |
||||
"dependencies": { |
"dependencies": { |
||||
"jquery": ">=1.6", |
"jquery": ">=1.6", |
||||
"jquery-mousewheel": ">=3.0.6" |
"jquery-mousewheel": ">=3.0.6" |
||||
} |
} |
||||
}, |
}, |
||||
"dependencies": { |
"dependencies": { |
||||
"jquery-mousewheel": ">=3.0.6" |
"jquery-mousewheel": ">=3.0.6" |
||||
} |
} |
||||
} |
} |
||||
@ -1,82 +1,82 @@ |
|||||
malihu custom scrollbar plugin |
malihu custom scrollbar plugin |
||||
================================ |
================================ |
||||
|
|
||||
Highly customizable custom scrollbar jQuery plugin ([Demo](http://manos.malihu.gr/repository/custom-scrollbar/demo/examples/complete_examples.html)). Features include: |
Highly customizable custom scrollbar jQuery plugin ([Demo](http://manos.malihu.gr/repository/custom-scrollbar/demo/examples/complete_examples.html)). Features include: |
||||
|
|
||||
* Vertical and/or horizontal scrollbar(s) |
* Vertical and/or horizontal scrollbar(s) |
||||
* Adjustable scrolling momentum |
* Adjustable scrolling momentum |
||||
* Mouse-wheel, keyboard and touch support |
* Mouse-wheel, keyboard and touch support |
||||
* Ready-to-use themes and customization via CSS |
* Ready-to-use themes and customization via CSS |
||||
* RTL direction support |
* RTL direction support |
||||
* Option parameters for full control of scrollbar functionality |
* Option parameters for full control of scrollbar functionality |
||||
* Methods for triggering actions like scroll-to, update, destroy etc. |
* Methods for triggering actions like scroll-to, update, destroy etc. |
||||
* User-defined callbacks |
* User-defined callbacks |
||||
* Selectable/searchable content |
* Selectable/searchable content |
||||
|
|
||||
**[Plugin homepage and documentation](http://manos.malihu.gr/jquery-custom-content-scroller/)** ([Changelog](http://manos.malihu.gr/jquery-custom-content-scroller/2/)) |
**[Plugin homepage and documentation](http://manos.malihu.gr/jquery-custom-content-scroller/)** ([Changelog](http://manos.malihu.gr/jquery-custom-content-scroller/2/)) |
||||
|
|
||||
#### Installation |
#### Installation |
||||
|
|
||||
npm: `npm install malihu-custom-scrollbar-plugin` |
npm: `npm install malihu-custom-scrollbar-plugin` |
||||
|
|
||||
Bower: `bower install malihu-custom-scrollbar-plugin` |
Bower: `bower install malihu-custom-scrollbar-plugin` |
||||
|
|
||||
[Manual](http://manos.malihu.gr/jquery-custom-content-scroller/#get-started-section) |
[Manual](http://manos.malihu.gr/jquery-custom-content-scroller/#get-started-section) |
||||
|
|
||||
#### Usage |
#### Usage |
||||
|
|
||||
Manual: `$(selector).mCustomScrollbar();` |
Manual: `$(selector).mCustomScrollbar();` |
||||
|
|
||||
[Browserify](http://browserify.org/): |
[Browserify](http://browserify.org/): |
||||
|
|
||||
var $ = require('jquery'); |
var $ = require('jquery'); |
||||
require('malihu-custom-scrollbar-plugin')($); |
require('malihu-custom-scrollbar-plugin')($); |
||||
|
|
||||
[webpack](https://webpack.github.io/): |
[webpack](https://webpack.github.io/): |
||||
|
|
||||
npm install imports-loader |
npm install imports-loader |
||||
npm install jquery-mousewheel |
npm install jquery-mousewheel |
||||
npm install malihu-custom-scrollbar-plugin |
npm install malihu-custom-scrollbar-plugin |
||||
|
|
||||
module.exports = { |
module.exports = { |
||||
module: { |
module: { |
||||
loaders: [ |
loaders: [ |
||||
{ test: /jquery-mousewheel/, loader: "imports?define=>false&this=>window" }, |
{ test: /jquery-mousewheel/, loader: "imports?define=>false&this=>window" }, |
||||
{ test: /malihu-custom-scrollbar-plugin/, loader: "imports?define=>false&this=>window" } |
{ test: /malihu-custom-scrollbar-plugin/, loader: "imports?define=>false&this=>window" } |
||||
] |
] |
||||
} |
} |
||||
}; |
}; |
||||
|
|
||||
var $ = require('jquery'); |
var $ = require('jquery'); |
||||
require("jquery-mousewheel")($); |
require("jquery-mousewheel")($); |
||||
require('malihu-custom-scrollbar-plugin')($); |
require('malihu-custom-scrollbar-plugin')($); |
||||
|
|
||||
|
|
||||
Requirements |
Requirements |
||||
------------------------- |
------------------------- |
||||
|
|
||||
jQuery version **1.6.0** or higher |
jQuery version **1.6.0** or higher |
||||
|
|
||||
Browser compatibility |
Browser compatibility |
||||
------------------------- |
------------------------- |
||||
|
|
||||
* Internet Explorer 8+ |
* Internet Explorer 8+ |
||||
* Firefox |
* Firefox |
||||
* Chrome |
* Chrome |
||||
* Opera |
* Opera |
||||
* Safari |
* Safari |
||||
* iOS |
* iOS |
||||
* Android |
* Android |
||||
* Windows Phone |
* Windows Phone |
||||
|
|
||||
License |
License |
||||
------------------------- |
------------------------- |
||||
|
|
||||
MIT License (MIT) |
MIT License (MIT) |
||||
|
|
||||
http://opensource.org/licenses/MIT |
http://opensource.org/licenses/MIT |
||||
|
|
||||
Donate |
Donate |
||||
------------------------- |
------------------------- |
||||
|
|
||||
https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=UYJ5G65M6ZA28 |
https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=UYJ5G65M6ZA28 |
||||
@ -0,0 +1,23 @@ |
|||||
|
Copyright (c) 2014 Owl |
||||
|
Modified work Copyright 2016-2018 David Deutsch |
||||
|
|
||||
|
Permission is hereby granted, free of charge, to any person |
||||
|
obtaining a copy of this software and associated documentation |
||||
|
files (the "Software"), to deal in the Software without |
||||
|
restriction, including without limitation the rights to use, |
||||
|
copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
|
copies of the Software, and to permit persons to whom the |
||||
|
Software is furnished to do so, subject to the following |
||||
|
conditions: |
||||
|
|
||||
|
The above copyright notice and this permission notice shall be |
||||
|
included in all copies or substantial portions of the Software. |
||||
|
|
||||
|
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 |
||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS 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. |
||||
@ -0,0 +1,122 @@ |
|||||
|
# Owl Carousel 2 |
||||
|
|
||||
|
Touch enabled [jQuery](https://jquery.com/) plugin that lets you create a beautiful, responsive carousel slider. **To get started, check out https://owlcarousel2.github.io/OwlCarousel2/.** |
||||
|
|
||||
|
**Notice:** The old Owl Carousel site (owlgraphic [dot] com) is no longer in use. Please delete all references to this in bookmarks and your own products' documentation as it's being used for malicious purposes. |
||||
|
|
||||
|
## Quick start |
||||
|
|
||||
|
### Install |
||||
|
|
||||
|
This package can be installed with: |
||||
|
|
||||
|
- [npm](https://www.npmjs.com/package/owl.carousel): `npm install --save owl.carousel` or `yarn add owl.carousel jquery` |
||||
|
- [bower](http://bower.io/search/?q=owl.carousel): `bower install --save owl.carousel` |
||||
|
|
||||
|
Or download the [latest release](https://github.com/OwlCarousel2/OwlCarousel2/releases). |
||||
|
|
||||
|
### Load |
||||
|
|
||||
|
#### Webpack |
||||
|
|
||||
|
Add jQuery via the "webpack.ProvidePlugin" to your webpack configuration: |
||||
|
|
||||
|
const webpack = require('webpack'); |
||||
|
|
||||
|
//... |
||||
|
plugins: [ |
||||
|
new webpack.ProvidePlugin({ |
||||
|
$: 'jquery', |
||||
|
jQuery: 'jquery', |
||||
|
'window.jQuery': 'jquery' |
||||
|
}), |
||||
|
], |
||||
|
//... |
||||
|
|
||||
|
Load the required stylesheet and JS: |
||||
|
|
||||
|
```js |
||||
|
import 'owl.carousel/dist/assets/owl.carousel.css'; |
||||
|
import 'owl.carousel'; |
||||
|
``` |
||||
|
|
||||
|
#### Static HTML |
||||
|
|
||||
|
Put the required stylesheet at the [top](https://developer.yahoo.com/performance/rules.html#css_top) of your markup: |
||||
|
|
||||
|
```html |
||||
|
<link rel="stylesheet" href="/node_modules/owl.carousel/dist/assets/owl.carousel.min.css" /> |
||||
|
``` |
||||
|
|
||||
|
```html |
||||
|
<link rel="stylesheet" href="/bower_components/owl.carousel/dist/assets/owl.carousel.min.css" /> |
||||
|
``` |
||||
|
|
||||
|
**NOTE:** If you want to use the default navigation styles, you will also need to include `owl.theme.default.css`. |
||||
|
|
||||
|
|
||||
|
Put the script at the [bottom](https://developer.yahoo.com/performance/rules.html#js_bottom) of your markup right after jQuery: |
||||
|
|
||||
|
```html |
||||
|
<script src="/node_modules/jquery/dist/jquery.js"></script> |
||||
|
<script src="/node_modules/owl.carousel/dist/owl.carousel.min.js"></script> |
||||
|
``` |
||||
|
|
||||
|
```html |
||||
|
<script src="/bower_components/jquery/dist/jquery.js"></script> |
||||
|
<script src="/bower_components/owl.carousel/dist/owl.carousel.min.js"></script> |
||||
|
``` |
||||
|
|
||||
|
### Usage |
||||
|
|
||||
|
Wrap your items (`div`, `a`, `img`, `span`, `li` etc.) with a container element (`div`, `ul` etc.). Only the class `owl-carousel` is mandatory to apply proper styles: |
||||
|
|
||||
|
```html |
||||
|
<div class="owl-carousel owl-theme"> |
||||
|
<div> Your Content </div> |
||||
|
<div> Your Content </div> |
||||
|
<div> Your Content </div> |
||||
|
<div> Your Content </div> |
||||
|
<div> Your Content </div> |
||||
|
<div> Your Content </div> |
||||
|
<div> Your Content </div> |
||||
|
</div> |
||||
|
``` |
||||
|
**NOTE:** The `owl-theme` class is optional, but without it, you will need to style navigation features on your own. |
||||
|
|
||||
|
|
||||
|
Call the [plugin](https://learn.jquery.com/plugins/) function and your carousel is ready. |
||||
|
|
||||
|
```javascript |
||||
|
$(document).ready(function(){ |
||||
|
$('.owl-carousel').owlCarousel(); |
||||
|
}); |
||||
|
``` |
||||
|
|
||||
|
## Documentation |
||||
|
|
||||
|
The documentation, included in this repo in the root directory, is built with [Assemble](http://assemble.io/) and publicly available at https://owlcarousel2.github.io/OwlCarousel2/. The documentation may also be run locally. |
||||
|
|
||||
|
## Building |
||||
|
|
||||
|
This package comes with [Grunt](http://gruntjs.com/) and [Bower](http://bower.io/). The following tasks are available: |
||||
|
|
||||
|
* `default` compiles the CSS and JS into `/dist` and builds the doc. |
||||
|
* `dist` compiles the CSS and JS into `/dist` only. |
||||
|
* `watch` watches source files and builds them automatically whenever you save. |
||||
|
* `test` runs [JSHint](http://www.jshint.com/) and [QUnit](http://qunitjs.com/) tests headlessly in [PhantomJS](http://phantomjs.org/). |
||||
|
|
||||
|
To define which plugins are build into the distribution just edit `/_config.json` to fit your needs. |
||||
|
|
||||
|
## Contributing |
||||
|
|
||||
|
Please read [CONTRIBUTING.md](CONTRIBUTING.md). |
||||
|
|
||||
|
## Roadmap |
||||
|
|
||||
|
Please make sure to check out our [Roadmap Discussion](https://github.com/OwlCarousel2/OwlCarousel2/issues/1756). |
||||
|
|
||||
|
|
||||
|
## License |
||||
|
|
||||
|
The code and the documentation are released under the [MIT License](LICENSE). |
||||
|
After Width: | Height: | Size: 3.1 KiB |
@ -0,0 +1,186 @@ |
|||||
|
/** |
||||
|
* Owl Carousel v2.3.4 |
||||
|
* Copyright 2013-2018 David Deutsch |
||||
|
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE |
||||
|
*/ |
||||
|
/* |
||||
|
* Owl Carousel - Core |
||||
|
*/ |
||||
|
.owl-carousel { |
||||
|
display: none; |
||||
|
width: 100%; |
||||
|
-webkit-tap-highlight-color: transparent; |
||||
|
/* position relative and z-index fix webkit rendering fonts issue */ |
||||
|
position: relative; |
||||
|
z-index: 1; } |
||||
|
.owl-carousel .owl-stage { |
||||
|
position: relative; |
||||
|
-ms-touch-action: pan-Y; |
||||
|
touch-action: manipulation; |
||||
|
-moz-backface-visibility: hidden; |
||||
|
/* fix firefox animation glitch */ } |
||||
|
.owl-carousel .owl-stage:after { |
||||
|
content: "."; |
||||
|
display: block; |
||||
|
clear: both; |
||||
|
visibility: hidden; |
||||
|
line-height: 0; |
||||
|
height: 0; } |
||||
|
.owl-carousel .owl-stage-outer { |
||||
|
position: relative; |
||||
|
overflow: hidden; |
||||
|
/* fix for flashing background */ |
||||
|
-webkit-transform: translate3d(0px, 0px, 0px); } |
||||
|
.owl-carousel .owl-wrapper, |
||||
|
.owl-carousel .owl-item { |
||||
|
-webkit-backface-visibility: hidden; |
||||
|
-moz-backface-visibility: hidden; |
||||
|
-ms-backface-visibility: hidden; |
||||
|
-webkit-transform: translate3d(0, 0, 0); |
||||
|
-moz-transform: translate3d(0, 0, 0); |
||||
|
-ms-transform: translate3d(0, 0, 0); } |
||||
|
.owl-carousel .owl-item { |
||||
|
position: relative; |
||||
|
min-height: 1px; |
||||
|
float: left; |
||||
|
-webkit-backface-visibility: hidden; |
||||
|
-webkit-tap-highlight-color: transparent; |
||||
|
-webkit-touch-callout: none; } |
||||
|
.owl-carousel .owl-item img { |
||||
|
display: block; |
||||
|
width: 100%; } |
||||
|
.owl-carousel .owl-nav.disabled, |
||||
|
.owl-carousel .owl-dots.disabled { |
||||
|
display: none; } |
||||
|
.owl-carousel .owl-nav .owl-prev, |
||||
|
.owl-carousel .owl-nav .owl-next, |
||||
|
.owl-carousel .owl-dot { |
||||
|
cursor: pointer; |
||||
|
-webkit-user-select: none; |
||||
|
-khtml-user-select: none; |
||||
|
-moz-user-select: none; |
||||
|
-ms-user-select: none; |
||||
|
user-select: none; } |
||||
|
.owl-carousel .owl-nav button.owl-prev, |
||||
|
.owl-carousel .owl-nav button.owl-next, |
||||
|
.owl-carousel button.owl-dot { |
||||
|
background: none; |
||||
|
color: inherit; |
||||
|
border: none; |
||||
|
padding: 0 !important; |
||||
|
font: inherit; } |
||||
|
.owl-carousel.owl-loaded { |
||||
|
display: block; } |
||||
|
.owl-carousel.owl-loading { |
||||
|
opacity: 0; |
||||
|
display: block; } |
||||
|
.owl-carousel.owl-hidden { |
||||
|
opacity: 0; } |
||||
|
.owl-carousel.owl-refresh .owl-item { |
||||
|
visibility: hidden; } |
||||
|
.owl-carousel.owl-drag .owl-item { |
||||
|
-ms-touch-action: pan-y; |
||||
|
touch-action: pan-y; |
||||
|
-webkit-user-select: none; |
||||
|
-moz-user-select: none; |
||||
|
-ms-user-select: none; |
||||
|
user-select: none; } |
||||
|
.owl-carousel.owl-grab { |
||||
|
cursor: move; |
||||
|
cursor: grab; } |
||||
|
.owl-carousel.owl-rtl { |
||||
|
direction: rtl; } |
||||
|
.owl-carousel.owl-rtl .owl-item { |
||||
|
float: right; } |
||||
|
|
||||
|
/* No Js */ |
||||
|
.no-js .owl-carousel { |
||||
|
display: block; } |
||||
|
|
||||
|
/* |
||||
|
* Owl Carousel - Animate Plugin |
||||
|
*/ |
||||
|
.owl-carousel .animated { |
||||
|
animation-duration: 1000ms; |
||||
|
animation-fill-mode: both; } |
||||
|
|
||||
|
.owl-carousel .owl-animated-in { |
||||
|
z-index: 0; } |
||||
|
|
||||
|
.owl-carousel .owl-animated-out { |
||||
|
z-index: 1; } |
||||
|
|
||||
|
.owl-carousel .fadeOut { |
||||
|
animation-name: fadeOut; } |
||||
|
|
||||
|
@keyframes fadeOut { |
||||
|
0% { |
||||
|
opacity: 1; } |
||||
|
100% { |
||||
|
opacity: 0; } } |
||||
|
|
||||
|
/* |
||||
|
* Owl Carousel - Auto Height Plugin |
||||
|
*/ |
||||
|
.owl-height { |
||||
|
transition: height 500ms ease-in-out; } |
||||
|
|
||||
|
/* |
||||
|
* Owl Carousel - Lazy Load Plugin |
||||
|
*/ |
||||
|
.owl-carousel .owl-item { |
||||
|
/** |
||||
|
This is introduced due to a bug in IE11 where lazy loading combined with autoheight plugin causes a wrong |
||||
|
calculation of the height of the owl-item that breaks page layouts |
||||
|
*/ } |
||||
|
.owl-carousel .owl-item .owl-lazy { |
||||
|
opacity: 0; |
||||
|
transition: opacity 400ms ease; } |
||||
|
.owl-carousel .owl-item .owl-lazy[src^=""], .owl-carousel .owl-item .owl-lazy:not([src]) { |
||||
|
max-height: 0; } |
||||
|
.owl-carousel .owl-item img.owl-lazy { |
||||
|
transform-style: preserve-3d; } |
||||
|
|
||||
|
/* |
||||
|
* Owl Carousel - Video Plugin |
||||
|
*/ |
||||
|
.owl-carousel .owl-video-wrapper { |
||||
|
position: relative; |
||||
|
height: 100%; |
||||
|
background: #000; } |
||||
|
|
||||
|
.owl-carousel .owl-video-play-icon { |
||||
|
position: absolute; |
||||
|
height: 80px; |
||||
|
width: 80px; |
||||
|
left: 50%; |
||||
|
top: 50%; |
||||
|
margin-left: -40px; |
||||
|
margin-top: -40px; |
||||
|
background: url("owl.video.play.png") no-repeat; |
||||
|
cursor: pointer; |
||||
|
z-index: 1; |
||||
|
-webkit-backface-visibility: hidden; |
||||
|
transition: transform 100ms ease; } |
||||
|
|
||||
|
.owl-carousel .owl-video-play-icon:hover { |
||||
|
-ms-transform: scale(1.3, 1.3); |
||||
|
transform: scale(1.3, 1.3); } |
||||
|
|
||||
|
.owl-carousel .owl-video-playing .owl-video-tn, |
||||
|
.owl-carousel .owl-video-playing .owl-video-play-icon { |
||||
|
display: none; } |
||||
|
|
||||
|
.owl-carousel .owl-video-tn { |
||||
|
opacity: 0; |
||||
|
height: 100%; |
||||
|
background-position: center center; |
||||
|
background-repeat: no-repeat; |
||||
|
background-size: contain; |
||||
|
transition: opacity 400ms ease; } |
||||
|
|
||||
|
.owl-carousel .owl-video-frame { |
||||
|
position: relative; |
||||
|
z-index: 1; |
||||
|
height: 100%; |
||||
|
width: 100%; } |
||||
@ -0,0 +1,6 @@ |
|||||
|
/** |
||||
|
* Owl Carousel v2.3.4 |
||||
|
* Copyright 2013-2018 David Deutsch |
||||
|
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE |
||||
|
*/ |
||||
|
.owl-carousel,.owl-carousel .owl-item{-webkit-tap-highlight-color:transparent;position:relative}.owl-carousel{display:none;width:100%;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y;touch-action:manipulation;-moz-backface-visibility:hidden}.owl-carousel .owl-stage:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0)}.owl-carousel .owl-item,.owl-carousel .owl-wrapper{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0)}.owl-carousel .owl-item{min-height:1px;float:left;-webkit-backface-visibility:hidden;-webkit-touch-callout:none}.owl-carousel .owl-item img{display:block;width:100%}.owl-carousel .owl-dots.disabled,.owl-carousel .owl-nav.disabled{display:none}.no-js .owl-carousel,.owl-carousel.owl-loaded{display:block}.owl-carousel .owl-dot,.owl-carousel .owl-nav .owl-next,.owl-carousel .owl-nav .owl-prev{cursor:pointer;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel .owl-nav button.owl-next,.owl-carousel .owl-nav button.owl-prev,.owl-carousel button.owl-dot{background:0 0;color:inherit;border:none;padding:0!important;font:inherit}.owl-carousel.owl-loading{opacity:0;display:block}.owl-carousel.owl-hidden{opacity:0}.owl-carousel.owl-refresh .owl-item{visibility:hidden}.owl-carousel.owl-drag .owl-item{-ms-touch-action:pan-y;touch-action:pan-y;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-grab{cursor:move;cursor:grab}.owl-carousel.owl-rtl{direction:rtl}.owl-carousel.owl-rtl .owl-item{float:right}.owl-carousel .animated{animation-duration:1s;animation-fill-mode:both}.owl-carousel .owl-animated-in{z-index:0}.owl-carousel .owl-animated-out{z-index:1}.owl-carousel .fadeOut{animation-name:fadeOut}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.owl-height{transition:height .5s ease-in-out}.owl-carousel .owl-item .owl-lazy{opacity:0;transition:opacity .4s ease}.owl-carousel .owl-item .owl-lazy:not([src]),.owl-carousel .owl-item .owl-lazy[src^=""]{max-height:0}.owl-carousel .owl-item img.owl-lazy{transform-style:preserve-3d}.owl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.owl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(owl.video.play.png) no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;transition:transform .1s ease}.owl-carousel .owl-video-play-icon:hover{-ms-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.owl-carousel .owl-video-playing .owl-video-play-icon,.owl-carousel .owl-video-playing .owl-video-tn{display:none}.owl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;background-size:contain;transition:opacity .4s ease}.owl-carousel .owl-video-frame{position:relative;z-index:1;height:100%;width:100%} |
||||
@ -0,0 +1,50 @@ |
|||||
|
/** |
||||
|
* Owl Carousel v2.3.4 |
||||
|
* Copyright 2013-2018 David Deutsch |
||||
|
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE |
||||
|
*/ |
||||
|
/* |
||||
|
* Default theme - Owl Carousel CSS File |
||||
|
*/ |
||||
|
.owl-theme .owl-nav { |
||||
|
margin-top: 10px; |
||||
|
text-align: center; |
||||
|
-webkit-tap-highlight-color: transparent; } |
||||
|
.owl-theme .owl-nav [class*='owl-'] { |
||||
|
color: #FFF; |
||||
|
font-size: 14px; |
||||
|
margin: 5px; |
||||
|
padding: 4px 7px; |
||||
|
background: #D6D6D6; |
||||
|
display: inline-block; |
||||
|
cursor: pointer; |
||||
|
border-radius: 3px; } |
||||
|
.owl-theme .owl-nav [class*='owl-']:hover { |
||||
|
background: #869791; |
||||
|
color: #FFF; |
||||
|
text-decoration: none; } |
||||
|
.owl-theme .owl-nav .disabled { |
||||
|
opacity: 0.5; |
||||
|
cursor: default; } |
||||
|
|
||||
|
.owl-theme .owl-nav.disabled + .owl-dots { |
||||
|
margin-top: 10px; } |
||||
|
|
||||
|
.owl-theme .owl-dots { |
||||
|
text-align: center; |
||||
|
-webkit-tap-highlight-color: transparent; } |
||||
|
.owl-theme .owl-dots .owl-dot { |
||||
|
display: inline-block; |
||||
|
zoom: 1; |
||||
|
*display: inline; } |
||||
|
.owl-theme .owl-dots .owl-dot span { |
||||
|
width: 10px; |
||||
|
height: 10px; |
||||
|
margin: 5px 7px; |
||||
|
background: #D6D6D6; |
||||
|
display: block; |
||||
|
-webkit-backface-visibility: visible; |
||||
|
transition: opacity 200ms ease; |
||||
|
border-radius: 30px; } |
||||
|
.owl-theme .owl-dots .owl-dot.active span, .owl-theme .owl-dots .owl-dot:hover span { |
||||
|
background: #869791; } |
||||
@ -0,0 +1,6 @@ |
|||||
|
/** |
||||
|
* Owl Carousel v2.3.4 |
||||
|
* Copyright 2013-2018 David Deutsch |
||||
|
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE |
||||
|
*/ |
||||
|
.owl-theme .owl-dots,.owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav{margin-top:10px}.owl-theme .owl-nav [class*=owl-]{color:#FFF;font-size:14px;margin:5px;padding:4px 7px;background:#D6D6D6;display:inline-block;cursor:pointer;border-radius:3px}.owl-theme .owl-nav [class*=owl-]:hover{background:#869791;color:#FFF;text-decoration:none}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#D6D6D6;display:block;-webkit-backface-visibility:visible;transition:opacity .2s ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#869791} |
||||
@ -0,0 +1,50 @@ |
|||||
|
/** |
||||
|
* Owl Carousel v2.3.4 |
||||
|
* Copyright 2013-2018 David Deutsch |
||||
|
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE |
||||
|
*/ |
||||
|
/* |
||||
|
* Green theme - Owl Carousel CSS File |
||||
|
*/ |
||||
|
.owl-theme .owl-nav { |
||||
|
margin-top: 10px; |
||||
|
text-align: center; |
||||
|
-webkit-tap-highlight-color: transparent; } |
||||
|
.owl-theme .owl-nav [class*='owl-'] { |
||||
|
color: #FFF; |
||||
|
font-size: 14px; |
||||
|
margin: 5px; |
||||
|
padding: 4px 7px; |
||||
|
background: #D6D6D6; |
||||
|
display: inline-block; |
||||
|
cursor: pointer; |
||||
|
border-radius: 3px; } |
||||
|
.owl-theme .owl-nav [class*='owl-']:hover { |
||||
|
background: #4DC7A0; |
||||
|
color: #FFF; |
||||
|
text-decoration: none; } |
||||
|
.owl-theme .owl-nav .disabled { |
||||
|
opacity: 0.5; |
||||
|
cursor: default; } |
||||
|
|
||||
|
.owl-theme .owl-nav.disabled + .owl-dots { |
||||
|
margin-top: 10px; } |
||||
|
|
||||
|
.owl-theme .owl-dots { |
||||
|
text-align: center; |
||||
|
-webkit-tap-highlight-color: transparent; } |
||||
|
.owl-theme .owl-dots .owl-dot { |
||||
|
display: inline-block; |
||||
|
zoom: 1; |
||||
|
*display: inline; } |
||||
|
.owl-theme .owl-dots .owl-dot span { |
||||
|
width: 10px; |
||||
|
height: 10px; |
||||
|
margin: 5px 7px; |
||||
|
background: #D6D6D6; |
||||
|
display: block; |
||||
|
-webkit-backface-visibility: visible; |
||||
|
transition: opacity 200ms ease; |
||||
|
border-radius: 30px; } |
||||
|
.owl-theme .owl-dots .owl-dot.active span, .owl-theme .owl-dots .owl-dot:hover span { |
||||
|
background: #4DC7A0; } |
||||
@ -0,0 +1,6 @@ |
|||||
|
/** |
||||
|
* Owl Carousel v2.3.4 |
||||
|
* Copyright 2013-2018 David Deutsch |
||||
|
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE |
||||
|
*/ |
||||
|
.owl-theme .owl-dots,.owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav{margin-top:10px}.owl-theme .owl-nav [class*=owl-]{color:#FFF;font-size:14px;margin:5px;padding:4px 7px;background:#D6D6D6;display:inline-block;cursor:pointer;border-radius:3px}.owl-theme .owl-nav [class*=owl-]:hover{background:#4DC7A0;color:#FFF;text-decoration:none}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#D6D6D6;display:block;-webkit-backface-visibility:visible;transition:opacity .2s ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#4DC7A0} |
||||
|
After Width: | Height: | Size: 4.9 KiB |
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
@ -0,0 +1,206 @@ |
|||||
|
using System; |
||||
|
using System.ComponentModel; |
||||
|
using System.Linq; |
||||
|
using System.Security.Cryptography; |
||||
|
using System.Text; |
||||
|
using Microsoft.AspNetCore.Http; |
||||
|
using Microsoft.AspNetCore.Razor.TagHelpers; |
||||
|
|
||||
|
namespace EventHub.Web.Theme.Helpers.TagHelpers |
||||
|
{ |
||||
|
/// <inheritdoc />
|
||||
|
/// <summary>
|
||||
|
/// Returns a Globally Recognised Avatar https://en.gravatar.com
|
||||
|
/// </summary>
|
||||
|
[HtmlTargetElement("img", Attributes = "gravatar-email")] |
||||
|
public class GravatarTagHelper : TagHelper |
||||
|
{ |
||||
|
private readonly IHttpContextAccessor _contextAccessor; |
||||
|
|
||||
|
public GravatarTagHelper(IHttpContextAccessor contextAccessor) |
||||
|
{ |
||||
|
_contextAccessor = contextAccessor; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Email Address for the Gravatar
|
||||
|
/// </summary>
|
||||
|
[HtmlAttributeName("gravatar-email")] |
||||
|
public string Email { get; set; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gravatar content rating (note that Gravatars are self-rated)
|
||||
|
/// </summary>
|
||||
|
[HtmlAttributeName("gravatar-rating")] |
||||
|
public GravatarRating Rating { get; set; } = GravatarRating.GeneralAudiences; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Size in pixels (default: 80)
|
||||
|
/// </summary>
|
||||
|
[HtmlAttributeName("gravatar-size")] |
||||
|
public int Size { get; set; } = 80; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// URL to a custom default image (e.g: 'Url.Content("~/images/no-grvatar.png")' )
|
||||
|
/// </summary>
|
||||
|
[HtmlAttributeName("default-image-url")] |
||||
|
public string DefaultImageUrl { get; set; } = ""; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Prefer the default image over the users own Gravatar
|
||||
|
/// </summary>
|
||||
|
[HtmlAttributeName("force-default-image")] |
||||
|
public bool ForceDefaultImage { get; set; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Default image if user hasn't created a Gravatar
|
||||
|
/// </summary>
|
||||
|
[HtmlAttributeName("default-image")] |
||||
|
public GravatarDefaultImage DefaultImage { get; set; } = GravatarDefaultImage.Default; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Always do secure (https) requests
|
||||
|
/// </summary>
|
||||
|
[HtmlAttributeName("force-secure-request")] |
||||
|
public bool ForceSecureRequest { get; set; } = true; |
||||
|
|
||||
|
|
||||
|
public override void Process(TagHelperContext context, TagHelperOutput output) |
||||
|
{ |
||||
|
var emailAddress = Email == null ? string.Empty : Email.Trim().ToLower(); |
||||
|
|
||||
|
var url = string.Format("{0}://{1}.gravatar.com/avatar/{2}?s={3}{4}{5}{6}", |
||||
|
GetUrlScheme(), |
||||
|
GetUrlPrefix(), |
||||
|
GetMd5Hash(emailAddress), |
||||
|
Size, |
||||
|
GetDefaultImageParameter(), |
||||
|
GetForceDefaultImageParameter(), |
||||
|
GetRatingParameter() |
||||
|
); |
||||
|
|
||||
|
output.Attributes.SetAttribute("src", url); |
||||
|
} |
||||
|
|
||||
|
private string GetUrlScheme() |
||||
|
{ |
||||
|
return ForceSecureRequest || _contextAccessor.HttpContext.Request.IsHttps |
||||
|
? "https" |
||||
|
: "http"; |
||||
|
} |
||||
|
|
||||
|
private string GetUrlPrefix() |
||||
|
{ |
||||
|
return ForceSecureRequest || _contextAccessor.HttpContext.Request.IsHttps ? "secure" : "www"; |
||||
|
} |
||||
|
|
||||
|
private string GetDefaultImageParameter() |
||||
|
{ |
||||
|
return "&d=" + (!string.IsNullOrEmpty(DefaultImageUrl) |
||||
|
? System.Net.WebUtility.UrlEncode(DefaultImageUrl) |
||||
|
: GetEnumDescription(DefaultImage)); |
||||
|
} |
||||
|
|
||||
|
private string GetForceDefaultImageParameter() |
||||
|
{ |
||||
|
return ForceDefaultImage ? "&f=y" : ""; |
||||
|
} |
||||
|
|
||||
|
private string GetRatingParameter() |
||||
|
{ |
||||
|
return "&r=" + GetEnumDescription(Rating); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Generates an MD5 hash of the given string
|
||||
|
/// </summary>
|
||||
|
/// <remarks>Source: http://msdn.microsoft.com/en-us/library/system.security.cryptography.md5.aspx </remarks>
|
||||
|
private static string GetMd5Hash(string input) |
||||
|
{ |
||||
|
// Convert the input string to a byte array and compute the hash.
|
||||
|
var data = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(input)); |
||||
|
|
||||
|
// Create a new Stringbuilder to collect the bytes
|
||||
|
// and create a string.
|
||||
|
var sBuilder = new StringBuilder(); |
||||
|
|
||||
|
// Loop through each byte of the hashed data
|
||||
|
// and format each one as a hexadecimal string.
|
||||
|
foreach (var t in data) |
||||
|
{ |
||||
|
sBuilder.Append(t.ToString("x2")); |
||||
|
} |
||||
|
|
||||
|
// Return the hexadecimal string.
|
||||
|
return sBuilder.ToString(); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns the value of a Description for a given Enum value
|
||||
|
/// </summary>
|
||||
|
/// <remarks>Source: http://blogs.msdn.com/b/abhinaba/archive/2005/10/21/483337.aspx </remarks>
|
||||
|
/// <param name="en"></param>
|
||||
|
/// <returns></returns>
|
||||
|
private static string GetEnumDescription(Enum en) |
||||
|
{ |
||||
|
var type = en.GetType(); |
||||
|
var memInfo = type.GetMember(en.ToString()); |
||||
|
|
||||
|
if (memInfo == null || memInfo.Length <= 0) |
||||
|
{ |
||||
|
return en.ToString(); |
||||
|
} |
||||
|
|
||||
|
var attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false); |
||||
|
|
||||
|
if (attrs != null && attrs.Any()) |
||||
|
{ |
||||
|
return ((DescriptionAttribute) attrs.First()).Description; |
||||
|
} |
||||
|
|
||||
|
return en.ToString(); |
||||
|
} |
||||
|
|
||||
|
public enum GravatarDefaultImage |
||||
|
{ |
||||
|
/// <summary>Default Gravatar logo</summary>
|
||||
|
[Description("")] Default, |
||||
|
|
||||
|
/// <summary>404 - do not load any image if none is associated with the email hash, instead return an HTTP 404 (File Not Found) response</summary>
|
||||
|
[Description("404")] Http404, |
||||
|
|
||||
|
/// <summary>Mystery-Man - a simple, cartoon-style silhouetted outline of a person (does not vary by email hash)</summary>
|
||||
|
[Description("mm")] MysteryMan, |
||||
|
|
||||
|
/// <summary>Identicon - a geometric pattern based on an email hash</summary>
|
||||
|
[Description("identicon")] Identicon, |
||||
|
|
||||
|
/// <summary>MonsterId - a generated 'monster' with different colors, faces, etc</summary>
|
||||
|
[Description("monsterid")] MonsterId, |
||||
|
|
||||
|
/// <summary>Wavatar - generated faces with differing features and backgrounds</summary>
|
||||
|
[Description("wavatar")] Wavatar, |
||||
|
|
||||
|
/// <summary>Retro - awesome generated, 8-bit arcade-style pixelated faces</summary>
|
||||
|
[Description("retro")] Retro |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gravatar allows users to self-rate their images so that they can indicate if an image is appropriate for a certain audience. By default, only 'G' rated images are displayed unless you indicate that you would like to see higher ratings
|
||||
|
/// </summary>
|
||||
|
public enum GravatarRating |
||||
|
{ |
||||
|
/// <summary>Suitable for display on all websites with any audience type</summary>
|
||||
|
[Description("g")] GeneralAudiences, |
||||
|
|
||||
|
/// <summary>May contain rude gestures, provocatively dressed individuals, the lesser swear words, or mild violence</summary>
|
||||
|
[Description("pg")] ParentalGuidance, |
||||
|
|
||||
|
/// <summary>May contain such things as harsh profanity, intense violence, nudity, or hard drug use</summary>
|
||||
|
[Description("r")] Restricted, |
||||
|
|
||||
|
/// <summary>May contain hardcore sexual imagery or extremely disturbing violence</summary>
|
||||
|
[Description("x")] OnlyMature |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,66 @@ |
|||||
|
@using EventHub.Web |
||||
|
@using Microsoft.AspNetCore.Http.Extensions |
||||
|
@using Volo.Abp.Users |
||||
|
@inject ICurrentUser CurrentUser |
||||
|
|
||||
|
<footer class="mt-5"> |
||||
|
<div class="container"> |
||||
|
<div class="row"> |
||||
|
<div class="col-md"> |
||||
|
<a href="@Url.Page("/index")" class="footer-logo"> |
||||
|
EventHub |
||||
|
</a> |
||||
|
</div> |
||||
|
|
||||
|
<div class="col-md"> |
||||
|
@if (!CurrentUser.IsAuthenticated) |
||||
|
{ |
||||
|
<h5>Account</h5> |
||||
|
<div class="footer-links"> |
||||
|
|
||||
|
<a href="@EventHubExternalUrls.EhAccount/account/register?returnUrl=@EventHubExternalUrls.EhWww@(System.Net.WebUtility.UrlEncode(Context.Request.GetEncodedPathAndQuery()))" class="d-block">Sign Up</a> |
||||
|
<a href="/account/login?returnUrl=@(System.Net.WebUtility.UrlEncode(Context.Request.GetEncodedPathAndQuery()))" class="d-block">Log In</a> |
||||
|
|
||||
|
</div> |
||||
|
} |
||||
|
</div> |
||||
|
<div class="col-md"> |
||||
|
<h5>Follow Us</h5> |
||||
|
<div class="footer-links"> |
||||
|
<a href="https://www.facebook.com/openeventhub"> |
||||
|
<i class="fab fa-facebook"></i> |
||||
|
</a> |
||||
|
<a href="https://twitter.com/openeventhub"> |
||||
|
<i class="fab fa-twitter"></i> |
||||
|
</a> |
||||
|
<a href="https://www.instagram.com/openeventhub/"> |
||||
|
<i class="fab fa-instagram"></i> |
||||
|
</a> |
||||
|
<a href="https://github.com/openeventhub"> |
||||
|
<i class="fab fa-github"></i> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</footer> |
||||
|
<footer class="footer-bottom"> |
||||
|
<div class="container"> |
||||
|
<div class="row"> |
||||
|
<div class="col-md-auto"> |
||||
|
<span class="copyright">© 2021 EventHub</span> |
||||
|
</div> |
||||
|
<div class="col-md text-center text-md-right"> |
||||
|
<a href="@EventHubExternalUrls.EhWww/terms-service"> |
||||
|
Terms of Service |
||||
|
</a> |
||||
|
<span> |
||||
|
<img src="/assets/seperator2.svg" class="mx-3"> |
||||
|
</span> |
||||
|
<a href="@EventHubExternalUrls.EhWww/privacy-policy"> |
||||
|
Privacy Policy |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</footer> |
||||
@ -0,0 +1,13 @@ |
|||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Volo.Abp.AspNetCore.Mvc; |
||||
|
|
||||
|
namespace EventHub.Web.Theme.Themes.EventHub.Components.Footer |
||||
|
{ |
||||
|
public class FooterViewComponent : AbpViewComponent |
||||
|
{ |
||||
|
public IViewComponentResult Invoke() |
||||
|
{ |
||||
|
return View("~/Themes/EventHub/Components/Footer/Default.cshtml"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,21 +1,131 @@ |
|||||
@using EventHub.Web.Theme.Themes.EventHub.Components.Brand |
@using EventHub.Web |
||||
@using EventHub.Web.Theme.Themes.EventHub.Components.Menu |
@using Microsoft.Extensions.Localization |
||||
@using EventHub.Web.Theme.Themes.EventHub.Components.Toolbar |
@using Volo.Abp.Users |
||||
<nav class="navbar navbar-expand-md navbar-dark bg-dark shadow-sm flex-column flex-md-row mb-4" id="main-navbar" style="min-height: 4rem;"> |
@using EventHub.Localization |
||||
|
@using Microsoft.AspNetCore.Http.Extensions |
||||
|
@using Volo.Abp.Localization |
||||
|
@inject ICurrentUser CurrentUser |
||||
|
@inject ILanguageProvider LanguageProvider |
||||
|
@inject IStringLocalizer<EventHubResource> L |
||||
|
|
||||
|
@{ |
||||
|
var returnUrl = System.Net.WebUtility.UrlEncode(Context.Request.GetEncodedPathAndQuery()); |
||||
|
if (returnUrl.IsNullOrWhiteSpace()) |
||||
|
{ |
||||
|
returnUrl = "/"; |
||||
|
} |
||||
|
} |
||||
|
<nav class="navbar navbar-expand-lg navbar-light bg-light static-top"> |
||||
<div class="container"> |
<div class="container"> |
||||
@(await Component.InvokeAsync<MainNavbarBrandViewComponent>()) |
<a class="navbar-brand font-weight-bold" href="@Url.Page("/index")">EventHub</a> |
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" |
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation"> |
||||
data-target="#main-navbar-collapse" aria-controls="main-navbar-collapse" |
|
||||
aria-expanded="false" aria-label="Toggle navigation"> |
|
||||
<span class="navbar-toggler-icon"></span> |
<span class="navbar-toggler-icon"></span> |
||||
</button> |
</button> |
||||
<div class="collapse navbar-collapse" id="main-navbar-collapse"> |
<div class="collapse navbar-collapse" id="navbarResponsive"> |
||||
<ul class="navbar-nav mx-auto"> |
<ul class="navbar-nav mx-auto"> |
||||
@(await Component.InvokeAsync<MainNavbarMenuViewComponent>()) |
<li class="nav-item @(GetPageActiveClassOrEmpty(ViewContext, "/index"))"> |
||||
</ul> |
<a class="nav-link" href="@EventHubExternalUrls.EhWww@Url.Page("/index")"> |
||||
<ul class="navbar-nav"> |
Home |
||||
@(await Component.InvokeAsync<MainNavbarToolbarViewComponent>()) |
</a> |
||||
|
</li> |
||||
|
<li class="nav-item @(GetPageActiveClassOrEmpty(ViewContext, "/events/index"))"> |
||||
|
<a class="nav-link" href="@EventHubExternalUrls.EhWww/events">Events</a> |
||||
|
</li> |
||||
|
<li class="nav-item @(GetPageActiveClassOrEmpty(ViewContext, "/organizations/index"))"> |
||||
|
<a class="nav-link" href="@EventHubExternalUrls.EhWww/organizations">Organizations</a> |
||||
|
</li> |
||||
|
</ul> |
||||
|
@if (EventHubExternalUrls.EhWww.Contains(Context.Request.Host.ToString())) |
||||
|
{ |
||||
|
<ul class="navbar-nav"> |
||||
|
<li class="nav-item"> |
||||
|
<a class="nav-link event-link" href="@EventHubExternalUrls.EhWww@Url.Page("/events/new")">+ Create an Event</a> |
||||
|
</li> |
||||
|
</ul> |
||||
|
} |
||||
|
<ul class="navbar-nav"> |
||||
|
|
||||
|
@if (CurrentUser.IsAuthenticated) |
||||
|
{ |
||||
|
<li class="nav-item dropdown"> |
||||
|
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
||||
|
<span class="user-avatar"> |
||||
|
<img gravatar-email="@CurrentUser.Email" default-image="Wavatar" gravatar-size="40" width="40" height="40" class="nav-avatar avatar rounded-circle"/> |
||||
|
</span> |
||||
|
<span class="ml-2"> |
||||
|
@if (!string.IsNullOrWhiteSpace(CurrentUser.Name) && !string.IsNullOrWhiteSpace(CurrentUser.SurName)) |
||||
|
{ |
||||
|
@(CurrentUser.Name + " " + CurrentUser.SurName) |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
{ |
||||
|
@CurrentUser.UserName |
||||
|
} |
||||
|
} |
||||
|
</span> |
||||
|
</a> |
||||
|
<div class="dropdown-menu dropdown-menu-right"> |
||||
|
<a class="dropdown-item" href="@(EventHubExternalUrls.EhAccount.EnsureEndsWith('/') + "account/manage")" title="@L["Account"]"> |
||||
|
<i class="fas fa-cog"></i> @L["Account"] |
||||
|
</a> |
||||
|
<a class="dropdown-item" href="@EventHubExternalUrls.EhWww/users/@CurrentUser.UserName" title="@L["Profile"]"> |
||||
|
<i class="fas fa-user"></i> @L["Profile"] |
||||
|
</a> |
||||
|
<a class="dropdown-item" href="/account/logout?returnUrl=@returnUrl" title="@L["Logout"]"> |
||||
|
<i class="fas fa-sign-out-alt"></i> @L["Logout"] |
||||
|
</a> |
||||
|
</div> |
||||
|
</li> |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
<li class="nav-item"> |
||||
|
<a class="nav-link" href="/account/login?returnUrl=@returnUrl">Log In</a> |
||||
|
</li> |
||||
|
<li class="nav-item"> |
||||
|
<a class="btn btn-primary ml-lg-2" href="@EventHubExternalUrls.EhAccount/account/register?returnUrl=@returnUrl">Sign Up</a> |
||||
|
</li> |
||||
|
} |
||||
</ul> |
</ul> |
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
</nav> |
</nav> |
||||
|
|
||||
|
@functions{ |
||||
|
public string GetPageActiveClassOrEmpty(ViewContext viewContext, string pageUrl) |
||||
|
{ |
||||
|
if (!EventHubExternalUrls.EhWww.Contains(Context.Request.Host.ToString())) |
||||
|
{ |
||||
|
return ""; |
||||
|
} |
||||
|
|
||||
|
var activeRoute = viewContext?.RouteData.Values["page"]?.ToString()?.ToLowerInvariant(); |
||||
|
pageUrl = pageUrl.ToLowerInvariant(); |
||||
|
|
||||
|
if (activeRoute is null) |
||||
|
{ |
||||
|
return ""; |
||||
|
} |
||||
|
|
||||
|
switch (pageUrl) |
||||
|
{ |
||||
|
case "/index" when activeRoute == "/index": |
||||
|
return activeRoute == pageUrl ? "active" : activeRoute; |
||||
|
case "/index": |
||||
|
return ""; |
||||
|
} |
||||
|
|
||||
|
pageUrl = pageUrl.Replace("/index", ""); |
||||
|
var highLevelActiveRoute = GetHighLevelRoute(activeRoute); // "/organizations/ng-coders" => "organizations" |
||||
|
|
||||
|
return highLevelActiveRoute.Contains(pageUrl) ? "active" : highLevelActiveRoute; |
||||
|
} |
||||
|
|
||||
|
private string GetHighLevelRoute(string route) |
||||
|
{ |
||||
|
route.EnsureStartsWith('/'); |
||||
|
return route.Split("/")[1].EnsureStartsWith('/').EnsureEndsWith('/'); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -1,4 +1,5 @@ |
|||||
@using System.Globalization |
@using System.Globalization |
||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers |
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers |
||||
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap |
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap |
||||
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling |
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling |
||||
|
@addTagHelper *, EventHub.Web.Theme |
||||
@ -0,0 +1,70 @@ |
|||||
|
|
||||
|
|
||||
|
.form-label-group input::-webkit-input-placeholder { |
||||
|
color: transparent; |
||||
|
} |
||||
|
.form-label-group input:-moz-placeholder { |
||||
|
color: transparent; |
||||
|
} |
||||
|
.form-label-group input::-moz-placeholder { |
||||
|
color: transparent; |
||||
|
} |
||||
|
.form-label-group input:-ms-input-placeholder { |
||||
|
color: transparent; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.form-signin { |
||||
|
width: 100%; |
||||
|
max-width: 420px; |
||||
|
padding: 15px; |
||||
|
margin: auto; |
||||
|
} |
||||
|
|
||||
|
.form-label-group { |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.form-label-group > input { |
||||
|
padding: 14px 20px; |
||||
|
} |
||||
|
.form-label-group > label { |
||||
|
padding: 14px 20px; |
||||
|
} |
||||
|
|
||||
|
.form-label-group > label { |
||||
|
position: absolute; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
display: block; |
||||
|
width: 100%; |
||||
|
margin-bottom: 0; /* Override default `<label>` margin */ |
||||
|
line-height: 1.5; |
||||
|
cursor: text; /* Match the input under the label */ |
||||
|
border: 1px solid transparent; |
||||
|
border-radius: 0.25em; |
||||
|
transition: all 0.1s ease-in-out; |
||||
|
} |
||||
|
|
||||
|
.form-label-group input:not(:placeholder-shown) { |
||||
|
padding: 17px 20px 0; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
.form-label-group input:not(:placeholder-shown) ~ label { |
||||
|
padding: 7px 20px; |
||||
|
font-size: 0.72em; |
||||
|
opacity: .75; |
||||
|
} |
||||
|
|
||||
|
.search-event |
||||
|
.form-label-group > label { |
||||
|
color: white; |
||||
|
} |
||||
|
label { |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
select option { |
||||
|
background:#EFEFF4; |
||||
|
color: #00044A; |
||||
|
} |
||||
@ -1,90 +0,0 @@ |
|||||
|
|
||||
#main-navbar-tools a.dropdown-toggle { |
|
||||
text-decoration: none; |
|
||||
color: #fff; |
|
||||
} |
|
||||
|
|
||||
.navbar .dropdown-submenu { |
|
||||
position: relative; |
|
||||
} |
|
||||
.navbar .dropdown-menu { |
|
||||
margin: 0; |
|
||||
padding: 0; |
|
||||
} |
|
||||
.navbar .dropdown-menu a { |
|
||||
font-size: .9em; |
|
||||
padding: 10px 15px; |
|
||||
display: block; |
|
||||
min-width: 210px; |
|
||||
text-align: left; |
|
||||
border-radius: 0.25rem; |
|
||||
min-height: 44px; |
|
||||
} |
|
||||
.navbar .dropdown-submenu a::after { |
|
||||
transform: rotate(-90deg); |
|
||||
position: absolute; |
|
||||
right: 16px; |
|
||||
top: 18px; |
|
||||
} |
|
||||
.navbar .dropdown-submenu .dropdown-menu { |
|
||||
top: 0; |
|
||||
left: 100%; |
|
||||
} |
|
||||
|
|
||||
.card-header .btn { |
|
||||
padding: 2px 6px; |
|
||||
} |
|
||||
.card-header h5 { |
|
||||
margin: 0; |
|
||||
} |
|
||||
.container > .card { |
|
||||
box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; |
|
||||
} |
|
||||
|
|
||||
@media screen and (min-width: 768px) { |
|
||||
.navbar .dropdown:hover > .dropdown-menu { |
|
||||
display: block; |
|
||||
} |
|
||||
|
|
||||
.navbar .dropdown-submenu:hover > .dropdown-menu { |
|
||||
display: block; |
|
||||
} |
|
||||
} |
|
||||
.input-validation-error { |
|
||||
border-color: #dc3545; |
|
||||
} |
|
||||
.field-validation-error { |
|
||||
font-size: 0.8em; |
|
||||
} |
|
||||
|
|
||||
.dataTables_scrollBody { |
|
||||
min-height: 248px; |
|
||||
} |
|
||||
|
|
||||
div.dataTables_wrapper div.dataTables_info { |
|
||||
padding-top: 11px; |
|
||||
white-space: nowrap; |
|
||||
} |
|
||||
|
|
||||
div.dataTables_wrapper div.dataTables_length label { |
|
||||
padding-top: 10px; |
|
||||
margin-bottom: 0; |
|
||||
} |
|
||||
|
|
||||
.rtl .dropdown-menu-right { |
|
||||
right: auto; |
|
||||
left: 0; |
|
||||
} |
|
||||
|
|
||||
.rtl .dropdown-menu-right a { |
|
||||
text-align: right; |
|
||||
} |
|
||||
|
|
||||
.rtl .navbar .dropdown-menu a { |
|
||||
text-align: right; |
|
||||
} |
|
||||
.rtl .navbar .dropdown-submenu .dropdown-menu { |
|
||||
top: 0; |
|
||||
left: auto; |
|
||||
right: 100%; |
|
||||
} |
|
||||
@ -1,16 +0,0 @@ |
|||||
$(function () { |
|
||||
$('.dropdown-menu a.dropdown-toggle').on('click', function (e) { |
|
||||
if (!$(this).next().hasClass('show')) { |
|
||||
$(this).parents('.dropdown-menu').first().find('.show').removeClass("show"); |
|
||||
} |
|
||||
|
|
||||
var $subMenu = $(this).next(".dropdown-menu"); |
|
||||
$subMenu.toggleClass('show'); |
|
||||
|
|
||||
$(this).parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function (e) { |
|
||||
$('.dropdown-submenu .show').removeClass("show"); |
|
||||
}); |
|
||||
|
|
||||
return false; |
|
||||
}); |
|
||||
}); |
|
||||
@ -0,0 +1,130 @@ |
|||||
|
.main-slider |
||||
|
.owl-theme .owl-nav { |
||||
|
margin-top: 0 !important; |
||||
|
position: absolute; |
||||
|
top: 45%; |
||||
|
left: 0; |
||||
|
width: 100%; |
||||
|
} |
||||
|
.main-slider .owl-carousel .owl-nav button.owl-prev, |
||||
|
.main-slider .owl-carousel .owl-nav button.owl-next { |
||||
|
width: 40px; |
||||
|
height: 40px; |
||||
|
background: rgb(255 255 255 / 22%); |
||||
|
transition: background-color .3s ease; |
||||
|
position: absolute; |
||||
|
display: inline-block; |
||||
|
left: 8%; |
||||
|
border-radius: 40px; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
.main-slider .owl-carousel .owl-nav button.owl-next { |
||||
|
right: 8%; |
||||
|
left: auto; |
||||
|
} |
||||
|
.main-slider .owl-carousel .owl-nav button.owl-prev:hover, |
||||
|
.main-slider .owl-carousel .owl-nav button.owl-next:hover { |
||||
|
background: rgb(255 255 255 / 35%); |
||||
|
} |
||||
|
.main-slider .owl-carousel .owl-nav button span { |
||||
|
font-size: 40px; |
||||
|
color: transparent; |
||||
|
line-height: 37px; |
||||
|
} |
||||
|
.owl-theme .owl-dots .owl-dot span:focus, |
||||
|
.owl-carousel .owl-nav button:focus { |
||||
|
outline: none; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.main-slider .owl-carousel .owl-nav button.owl-next::before { |
||||
|
content: ""; |
||||
|
position: absolute; |
||||
|
width: 40px; |
||||
|
height: 40px; |
||||
|
top:0; |
||||
|
left: 0; |
||||
|
background-image: url(../../../../assets/slider-right.svg); |
||||
|
background-position: center; |
||||
|
background-repeat: no-repeat; |
||||
|
} |
||||
|
|
||||
|
.main-slider .owl-carousel .owl-nav button.owl-prev::before { |
||||
|
content: ""; |
||||
|
position: absolute; |
||||
|
width: 40px; |
||||
|
height: 40px; |
||||
|
top:0; |
||||
|
left: 0; |
||||
|
background-image: url(../../../../assets/slider-left.svg); |
||||
|
background-position: center; |
||||
|
background-repeat: no-repeat; |
||||
|
} |
||||
|
|
||||
|
.card-slider .owl-carousel .owl-nav button.owl-prev, |
||||
|
.card-slider .owl-carousel .owl-nav button.owl-next { |
||||
|
width: 9px; |
||||
|
height: 15px; |
||||
|
background: rgb(255 255 255 / 22%); |
||||
|
transition: background-color .3s ease; |
||||
|
display: inline-block; |
||||
|
overflow: hidden; |
||||
|
position: relative; |
||||
|
color: transparent; |
||||
|
} |
||||
|
.card-slider .owl-carousel .owl-nav button.owl-next::before { |
||||
|
content: ""; |
||||
|
position: absolute; |
||||
|
width: 9px; |
||||
|
height: 15px; |
||||
|
top:0; |
||||
|
left: 0; |
||||
|
background-image: url(../../../../assets/owl-2-right.svg); |
||||
|
background-position: center; |
||||
|
background-repeat: no-repeat; |
||||
|
} |
||||
|
|
||||
|
.card-slider .owl-carousel .owl-nav button.owl-prev::before { |
||||
|
content: ""; |
||||
|
position: absolute; |
||||
|
width: 9px; |
||||
|
height: 15px; |
||||
|
top:0; |
||||
|
left: 0; |
||||
|
background-image: url(../../../../assets/owl-2-left.svg); |
||||
|
background-position: center; |
||||
|
background-repeat: no-repeat; |
||||
|
} |
||||
|
|
||||
|
.card-slider .owl-theme .owl-dots .owl-dot span { |
||||
|
background: rgba(108, 127, 147, 0.2); |
||||
|
margin: 5px; |
||||
|
} |
||||
|
.card-slider .owl-theme .owl-dots .owl-dot.active span, |
||||
|
.card-slider .owl-theme .owl-dots .owl-dot:hover span { |
||||
|
background: #00044A; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.card-slider .owl-theme .owl-dots { |
||||
|
text-align: center; |
||||
|
position: absolute; |
||||
|
top: -50px; |
||||
|
right: 20px; |
||||
|
width: 100px; |
||||
|
} |
||||
|
.card-slider .owl-theme .owl-nav { |
||||
|
margin-top: 0px; |
||||
|
position: absolute; |
||||
|
text-align: center; |
||||
|
top: -52px; |
||||
|
right: 0; |
||||
|
width: 140px; |
||||
|
} |
||||
|
.card-slider .owl-prev { |
||||
|
float: left; |
||||
|
} |
||||
|
.card-slider .owl-next { |
||||
|
float: right; |
||||
|
} |
||||
|
|
||||
@ -0,0 +1,832 @@ |
|||||
|
body { |
||||
|
font-family: 'Poppins', sans-serif; |
||||
|
line-height: 1.5; |
||||
|
background-color: #F8F9FA; |
||||
|
color: #6B7E92; |
||||
|
font-size: 14px; |
||||
|
font-weight: 400; |
||||
|
|
||||
|
} |
||||
|
.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { |
||||
|
margin-bottom: .5rem; |
||||
|
font-weight: 700; |
||||
|
line-height: 1.2; |
||||
|
color: #00044A; |
||||
|
} |
||||
|
.h1, h1 { |
||||
|
font-size: 36px; |
||||
|
} |
||||
|
.h2, h2 { |
||||
|
font-size: 30px; |
||||
|
color: #00044A; |
||||
|
margin-top: .5rem; |
||||
|
} |
||||
|
.h3, h3 { |
||||
|
font-size: 24px; |
||||
|
margin-bottom: 1rem; |
||||
|
} |
||||
|
.h4, h4 { |
||||
|
font-size: 18px; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
p.lead { |
||||
|
font-size: 14px; |
||||
|
font-weight: 500; |
||||
|
color: #00044A; |
||||
|
} |
||||
|
p { |
||||
|
color: #6B7E92; |
||||
|
font-size: 14px; |
||||
|
font-weight: 400; |
||||
|
} |
||||
|
/*NAVBAR*/ |
||||
|
.navbar { |
||||
|
box-shadow: 0 5px 10px rgba(0, 4, 74, 0.05) !important; |
||||
|
} |
||||
|
.navbar .nav-link { |
||||
|
font-size: 14px; |
||||
|
color: #00044A !important; |
||||
|
} |
||||
|
.navbar .nav-item .btn { |
||||
|
margin: -3px 0; |
||||
|
} |
||||
|
.navbar-brand { |
||||
|
color: #00044A !important; |
||||
|
} |
||||
|
.navbar .nav-link.event-link { |
||||
|
color: #65D6A0 !important; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
.navbar-light.navbar { |
||||
|
background-color: #fff !important; |
||||
|
} |
||||
|
.navbar-expand-lg { |
||||
|
min-height: 74px; |
||||
|
padding: 17px; |
||||
|
} |
||||
|
.user-avatar { |
||||
|
width: 40px; |
||||
|
height: 10px; |
||||
|
display: inline-block; |
||||
|
position: relative; |
||||
|
} |
||||
|
.nav-avatar { |
||||
|
position: absolute; |
||||
|
top: -14px; |
||||
|
left: 0; |
||||
|
} |
||||
|
|
||||
|
@media (min-width: 992px) { |
||||
|
.navbar-expand-lg .navbar-nav .nav-link { |
||||
|
padding-right: 4px; |
||||
|
padding-left: 4px; |
||||
|
margin-right: 12px; |
||||
|
margin-left: 12px; |
||||
|
transition: color 0.3s ease; |
||||
|
} |
||||
|
.active .nav-link { |
||||
|
background-image: url(../../../../assets/underline.svg); |
||||
|
background-repeat: no-repeat; |
||||
|
background-size: inherit; |
||||
|
background-position: center 28px; |
||||
|
color: #df2751 !important; |
||||
|
} |
||||
|
.nav-link:hover { |
||||
|
color: #df2751 !important; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
.btn { |
||||
|
border-radius: 10px !important; |
||||
|
font-weight: 600; |
||||
|
font-size: 14px; |
||||
|
padding: 10px 20px; |
||||
|
} |
||||
|
.btn-primary { |
||||
|
background-color: #E8345D !important; |
||||
|
border-color: #E8345D !important; |
||||
|
} |
||||
|
.btn-primary:hover { |
||||
|
background-color: #df2751 !important; |
||||
|
border-color: #df2751 !important; |
||||
|
} |
||||
|
.btn-secondary { |
||||
|
background-color: rgba(221, 203, 247,.4) !important; |
||||
|
border: 0; |
||||
|
color: #2E1777; |
||||
|
} |
||||
|
.btn-secondary:hover { |
||||
|
background-color: rgba(221, 203, 247,.6) !important; |
||||
|
border: 0; |
||||
|
color: #2E1777; |
||||
|
} |
||||
|
.btn-success { |
||||
|
background-color: #65D6A0 !important; |
||||
|
border-color: #65D6A0 !important; |
||||
|
} |
||||
|
.btn-success:hover { |
||||
|
background-color: #4dbb86 !important; |
||||
|
border-color: #4dbb86 !important; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.btn-link { |
||||
|
font-weight: 600; |
||||
|
color: #00044A; |
||||
|
font-size: 12px; |
||||
|
} |
||||
|
.btn-link img{ |
||||
|
width: 6px !important; |
||||
|
display: inline-block !important; |
||||
|
} |
||||
|
.btn-link:hover { |
||||
|
text-decoration: none; |
||||
|
color: #df2751; |
||||
|
} |
||||
|
.btn-link.btn-lg { |
||||
|
color: #E8345D; |
||||
|
font-weight: 700; |
||||
|
font-size: 16px; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
.current-language-name {display: none;} |
||||
|
|
||||
|
@media (min-width: 1200px){ |
||||
|
.container, .container-lg, .container-md, .container-sm, .container-xl { |
||||
|
max-width: 996px; |
||||
|
} |
||||
|
.navbar .container { |
||||
|
max-width: 1200px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@media (max-width: 768px){ |
||||
|
.current-language-name {display: inline-block;} |
||||
|
.main-slider .owl-nav {display: none;} |
||||
|
} |
||||
|
.card { |
||||
|
border: 1px solid rgba(107, 126, 146, 0.09); |
||||
|
border-radius: 10px; |
||||
|
margin-bottom: 34px; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
.card-img-top { |
||||
|
width: 100%; |
||||
|
} |
||||
|
.card-img-left { |
||||
|
position: inherit; |
||||
|
} |
||||
|
.event-small-image { |
||||
|
width: 60px; |
||||
|
border-radius: 10px; |
||||
|
} |
||||
|
.event-info h5 { |
||||
|
font-size: 18px; |
||||
|
font-weight: 700; |
||||
|
color: #00044A; |
||||
|
margin-bottom: 5px !important; |
||||
|
} |
||||
|
|
||||
|
.event-info small { |
||||
|
font-size: 10px; |
||||
|
font-weight: 500; |
||||
|
color: #6F32E2; |
||||
|
margin-bottom: 15px; |
||||
|
display: block; |
||||
|
} |
||||
|
.event-info { |
||||
|
height: 154px; |
||||
|
margin-bottom: 15px; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
.online-event .event-info { |
||||
|
height: 135px; |
||||
|
margin-bottom: 19px; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
.event-info p { |
||||
|
font-size: 13px; |
||||
|
font-weight: 400; |
||||
|
color: #6B7E92; |
||||
|
} |
||||
|
.event-date small{ |
||||
|
color: #E8345D; |
||||
|
font-size: 10px; |
||||
|
font-weight: 500; |
||||
|
display: block; |
||||
|
} |
||||
|
.event-date span{ |
||||
|
color: #00044A; |
||||
|
font-size: 22px; |
||||
|
font-weight: 700; |
||||
|
display: block; |
||||
|
line-height: 1.2; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.bg-primary { |
||||
|
background: #00044A !important; |
||||
|
} |
||||
|
.form-control, .form-select { |
||||
|
display: block; |
||||
|
width: 100%; |
||||
|
height: calc(1.5em + .75rem + 2px); |
||||
|
height: 52px; |
||||
|
padding: .375rem 1rem; |
||||
|
font-size: 14px !important; |
||||
|
font-weight: 500; |
||||
|
line-height: 1.5; |
||||
|
color: #00044A; |
||||
|
background-color: #EFEFF4; |
||||
|
border: 1px solid #EFEFF4; |
||||
|
border-radius: 10px; |
||||
|
} |
||||
|
|
||||
|
.search-event .form-control, .search-event .form-select { |
||||
|
color: #ffffff; |
||||
|
background-color: rgba(255,255,255,.2); |
||||
|
border: 1px solid rgba(255,255,255,.4); |
||||
|
} |
||||
|
.search-event .btn-group-lg > .search-event .btn, .search-event .btn-lg { |
||||
|
height: 52px; |
||||
|
padding: 14px 20px; |
||||
|
} |
||||
|
.border-left { |
||||
|
border-color: #00044A !important; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.slider-container { |
||||
|
height: 530px; |
||||
|
background-size: cover; |
||||
|
padding: 0 20px; |
||||
|
} |
||||
|
.slider-container h1 { |
||||
|
font-size: 60px; |
||||
|
color: white; |
||||
|
font-weight: 700; |
||||
|
} |
||||
|
.slider-container p.lead { |
||||
|
font-size: 20px; |
||||
|
color: white; |
||||
|
} |
||||
|
.search-event { |
||||
|
position: relative; |
||||
|
top:-59px; |
||||
|
z-index: 99; |
||||
|
} |
||||
|
.search-event .card-body, |
||||
|
.profile-content .card-body{ |
||||
|
padding: 32px; |
||||
|
} |
||||
|
|
||||
|
.profile-content .form-control , |
||||
|
.profile-content .form-select { |
||||
|
border: 1px solid rgba(107, 126, 146, 0.20); |
||||
|
background-color: white; |
||||
|
margin-bottom: 30px; |
||||
|
color: #6B7E92; |
||||
|
} |
||||
|
|
||||
|
.profile-content label, |
||||
|
.profile-content label { |
||||
|
color: #6B7E92; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
.form-row>.col, .form-row>[class*=col-] { |
||||
|
padding-right: 10px; |
||||
|
padding-left: 10px; |
||||
|
} |
||||
|
.form-select{ |
||||
|
background-color: #EFEFF4; |
||||
|
border: 1px solid #EFEFF4; |
||||
|
background-image: url("../../../../assets/select-arrow.svg"); |
||||
|
background-position: right 20px center; |
||||
|
background-repeat: no-repeat; |
||||
|
background-size: 10px; |
||||
|
padding: 10px 30px 10px 20px; |
||||
|
outline: none; |
||||
|
-moz-appearance: none; |
||||
|
-webkit-appearance: none; |
||||
|
appearance: none; |
||||
|
} |
||||
|
.form-select::-ms-expand { |
||||
|
display: none; |
||||
|
} |
||||
|
|
||||
|
@media (min-width: 768px){ |
||||
|
.filter-select select { |
||||
|
min-width: 140px; |
||||
|
} |
||||
|
} |
||||
|
@media (max-width: 768px){ |
||||
|
.filter-select select { |
||||
|
width: 100%; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.dropdown-toggle::after { |
||||
|
display: inline-block; |
||||
|
margin-left: .255em; |
||||
|
vertical-align: .255em; |
||||
|
content: ""; |
||||
|
border: 0; |
||||
|
width: 6px; |
||||
|
height: 4px; |
||||
|
background: url(../../../../assets/dropdown-arrow.svg) center center no-repeat; |
||||
|
background-size: contain; |
||||
|
top: 2px; |
||||
|
position: relative; |
||||
|
} |
||||
|
.dropdown-menu { |
||||
|
border-radius: 10px; |
||||
|
min-width: 130px; |
||||
|
border-color: rgba(142, 160, 178, 0.2); |
||||
|
box-shadow: 0 0 8px rgba(0, 4, 74, 0.1); |
||||
|
} |
||||
|
.dropdown-menu::before { |
||||
|
position: absolute; |
||||
|
top: -7px; |
||||
|
left: 10px; |
||||
|
display: inline-block; |
||||
|
border-right: 7px solid transparent; |
||||
|
border-bottom: 7px solid rgba(142, 160, 178, 0.3); |
||||
|
border-left: 7px solid transparent; |
||||
|
border-bottom-color: rgba(142, 160, 178, 0.3); |
||||
|
content: ''; |
||||
|
} |
||||
|
|
||||
|
.dropdown-menu::after { |
||||
|
position: absolute; |
||||
|
top: -6px; |
||||
|
left: 11px; |
||||
|
display: inline-block; |
||||
|
border-right: 6px solid transparent; |
||||
|
border-bottom: 6px solid white; |
||||
|
border-left: 6px solid transparent; |
||||
|
content: ''; |
||||
|
} |
||||
|
|
||||
|
.dropdown-menu.dropdown-menu-right::before { |
||||
|
left: auto; |
||||
|
right: 10px; |
||||
|
} |
||||
|
|
||||
|
.dropdown-menu.dropdown-menu-right::after { |
||||
|
left: auto; |
||||
|
right: 11px; |
||||
|
} |
||||
|
.dropdown-item { |
||||
|
font-size: 13px; |
||||
|
padding: .5rem 1.5rem; |
||||
|
color: #00044A; |
||||
|
} |
||||
|
.dropdown-divider { |
||||
|
margin: 5px 24px; |
||||
|
border-top: 1px solid rgba(142, 160, 178, 0.2); |
||||
|
} |
||||
|
.dropdown-icon { |
||||
|
width: 15px; |
||||
|
height: 15px; |
||||
|
margin-right: 4px; |
||||
|
} |
||||
|
footer { |
||||
|
background: #00044A; |
||||
|
padding: 3.5em 0 2em; |
||||
|
} |
||||
|
.footer-logo { |
||||
|
color: white; |
||||
|
font-size: 20px; |
||||
|
font-weight: 600; |
||||
|
margin-bottom: 32px; |
||||
|
margin-top: 16px; |
||||
|
display: block; |
||||
|
} |
||||
|
.footer-logo:hover { |
||||
|
text-decoration: none; |
||||
|
color: white; |
||||
|
} |
||||
|
footer h5{ |
||||
|
color: white; |
||||
|
font-size: 16px; |
||||
|
font-weight: 500; |
||||
|
margin-top: 24px; |
||||
|
margin-bottom: 16px; |
||||
|
} |
||||
|
footer .footer-links a{ |
||||
|
color: white; |
||||
|
opacity: .65; |
||||
|
transition: opacity .25s; |
||||
|
font-size: 14px; |
||||
|
margin: 16px 16px 16px 0; |
||||
|
} |
||||
|
footer .footer-links a:hover{ |
||||
|
text-decoration: none; |
||||
|
color: white; |
||||
|
opacity: 1; |
||||
|
} |
||||
|
.footer-bottom { |
||||
|
margin-top: 0; |
||||
|
padding: 2em 0; |
||||
|
border-top: 1px solid rgba(255,255,255,.2); |
||||
|
} |
||||
|
.footer-bottom span,.footer-bottom a { |
||||
|
color: rgba(255,255,255,.5); |
||||
|
font-size: 12px; |
||||
|
} |
||||
|
.footer-bottom a:hover { |
||||
|
text-decoration: none; |
||||
|
transition: color .25s; |
||||
|
color: white; |
||||
|
} |
||||
|
.flag-icon { |
||||
|
border-radius: 4px; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
.inner-banner { |
||||
|
text-align: center; |
||||
|
height: 250px; |
||||
|
background: url(../../../../assets/inner-banner.png) center center no-repeat; |
||||
|
background-size: cover; |
||||
|
margin-bottom: 30px; |
||||
|
} |
||||
|
|
||||
|
.inner-banner.inner-banner-2 { |
||||
|
background-image: url(../../../../assets/inner-banner-2.png); |
||||
|
} |
||||
|
|
||||
|
.inner-banner h1 { |
||||
|
color: white; |
||||
|
font-size: 30px; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
|
||||
|
.inner-banner nav.breadcrumb-container { |
||||
|
display: inline-block; |
||||
|
} |
||||
|
|
||||
|
nav.breadcrumb-container .breadcrumb { |
||||
|
background: none; |
||||
|
margin: 0; |
||||
|
font-size: 12px; |
||||
|
opacity: .7; |
||||
|
} |
||||
|
nav.breadcrumb-container .breadcrumb a,nav.breadcrumb-container .breadcrumb li{ |
||||
|
color: white; |
||||
|
} |
||||
|
.breadcrumb-item+.breadcrumb-item::before { |
||||
|
padding-right: 1.25rem; |
||||
|
padding-left: .75rem; |
||||
|
color: white; |
||||
|
content: ">"; |
||||
|
} |
||||
|
.list-style { |
||||
|
background: #efeff4; |
||||
|
border-radius: 10px; |
||||
|
padding: 8px; |
||||
|
width: 100%; |
||||
|
display: flex; |
||||
|
} |
||||
|
|
||||
|
.list-style a{ |
||||
|
background: #efeff4; |
||||
|
color: #00044A; |
||||
|
opacity: .6; |
||||
|
padding: 8px 15px; |
||||
|
display: block; |
||||
|
border-radius: 8px; |
||||
|
height: 36px; |
||||
|
font-size: 14px; |
||||
|
transition: opacity .2s, background-color .2s; |
||||
|
} |
||||
|
.list-style a img{ position: relative; |
||||
|
top: -1px; |
||||
|
margin-right: 4px; |
||||
|
} |
||||
|
.list-style a.selected { |
||||
|
background: #fff; |
||||
|
box-shadow: 0 0 10px rgba(0, 4, 74, 0.15); |
||||
|
opacity:1; |
||||
|
z-index: 4; |
||||
|
} |
||||
|
.list-style a:hover{ |
||||
|
opacity:1; |
||||
|
text-decoration: none; |
||||
|
} |
||||
|
@media (max-width: 768px){ |
||||
|
.list-style { |
||||
|
margin-top: 15px; |
||||
|
} |
||||
|
.list-style a{ |
||||
|
width: 50%; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
footer { |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
footer .footer-links a{ |
||||
|
margin: 16px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.detail-image img{ |
||||
|
width: 100%; |
||||
|
border-radius: 10px; |
||||
|
} |
||||
|
.detail-page h1 { |
||||
|
font-size: 30px; |
||||
|
color:#00044A; |
||||
|
} |
||||
|
.detail-pin { |
||||
|
color:#6F32E2; |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
.detail-page p { |
||||
|
color: #6B7E92; |
||||
|
font-size: 16px; |
||||
|
} |
||||
|
p .text-primary { |
||||
|
color: #00044A !important; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
.org-avatar { |
||||
|
margin: 5px 10px 5px 0; |
||||
|
width: 40px; |
||||
|
height: 40px; |
||||
|
} |
||||
|
|
||||
|
.list-span { |
||||
|
line-height: 168px; } |
||||
|
.list-span span { |
||||
|
font-size: 1em; |
||||
|
color: #fff; |
||||
|
opacity: 0.5; |
||||
|
line-height: 1; |
||||
|
font-weight: 100; |
||||
|
text-shadow: 0 0 35px rgba(0, 0, 0, 0.5); } |
||||
|
@media screen and (max-width: 767px) { |
||||
|
.list-span { |
||||
|
width: 100%; |
||||
|
height: 150px; |
||||
|
line-height: 150px; |
||||
|
margin-bottom: 1em; } |
||||
|
.list-span span { |
||||
|
font-size: 1em; |
||||
|
line-height: 150px; } } |
||||
|
|
||||
|
.carousel-list-span { |
||||
|
line-height: 215px; } |
||||
|
.carousel-list-span span { |
||||
|
font-size: 1em; |
||||
|
color: #fff; |
||||
|
opacity: 0.5; |
||||
|
line-height: 1; |
||||
|
font-weight: 100; |
||||
|
text-shadow: 0 0 35px rgba(0, 0, 0, 0.5); } |
||||
|
@media screen and (max-width: 767px) { |
||||
|
.carousel-list-span { |
||||
|
width: 100%; |
||||
|
height: 150px; |
||||
|
line-height: 150px; |
||||
|
margin-bottom: 1em; } |
||||
|
.carousel-list-spann span { |
||||
|
font-size: 1em; |
||||
|
line-height: 150px; } } |
||||
|
|
||||
|
.detail-span { |
||||
|
line-height: 112px; } |
||||
|
.detail-span span { |
||||
|
font-size: 1em; |
||||
|
color: #fff; |
||||
|
opacity: 0.5; |
||||
|
line-height: 1; |
||||
|
font-weight: 100; |
||||
|
text-shadow: 0 0 35px rgba(0, 0, 0, 0.5); } |
||||
|
@media screen and (max-width: 767px) { |
||||
|
.detail-span { |
||||
|
width: 100%; |
||||
|
height: 150px; |
||||
|
line-height: 150px; |
||||
|
margin-bottom: 1em; } |
||||
|
.detail-span span { |
||||
|
font-size: 1em; |
||||
|
line-height: 150px; } } |
||||
|
|
||||
|
.detail-head { |
||||
|
font-weight: normal; |
||||
|
font-size: 18px; |
||||
|
} |
||||
|
.map-container { |
||||
|
border-radius: 10px; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
.tag-container a { |
||||
|
display: inline-block; |
||||
|
background: #EFEFF4; |
||||
|
color: #00044a; |
||||
|
padding: 6px 18px; |
||||
|
margin: 10px 10px 10px 0; |
||||
|
font-size: 14px; |
||||
|
border-radius: 10px; |
||||
|
} |
||||
|
.tag-container a:hover { |
||||
|
text-decoration: none; |
||||
|
background: #dddde7; |
||||
|
} |
||||
|
.share-container a { |
||||
|
margin: 10px 10px 10px 0; |
||||
|
display: inline-block; |
||||
|
} |
||||
|
|
||||
|
/* detail pages */ |
||||
|
@media screen and (max-width: 768px) { |
||||
|
.profile-nav { |
||||
|
display: block; |
||||
|
text-align: center; |
||||
|
} |
||||
|
.nav-tabs.profile-nav .nav-item .nav-link { |
||||
|
font-size: 14px !important; |
||||
|
} |
||||
|
} |
||||
|
.nav-tabs.profile-nav .nav-item .nav-link { |
||||
|
border: 0; |
||||
|
color: #00044A; |
||||
|
font-size: 16px; |
||||
|
border-bottom: 2px solid transparent; |
||||
|
} |
||||
|
.nav-tabs.profile-nav .nav-item.show .nav-link, |
||||
|
.nav-tabs.profile-nav .nav-link.active { |
||||
|
color: #00044A; |
||||
|
background: none; |
||||
|
border:0; |
||||
|
border-bottom: 2px solid #00044A; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
.nav-tabs.profile-nav .nav-item .nav-link:hover { |
||||
|
border: 0; |
||||
|
color: #00044A !important; |
||||
|
border-bottom: 2px solid #00044a28; |
||||
|
} |
||||
|
.nav-tabs.profile-nav .nav-item.show .nav-link.active:hover { |
||||
|
border-bottom: 2px solid #00044A; |
||||
|
} |
||||
|
.nav-tabs.profile-nav { |
||||
|
border:0; |
||||
|
border-bottom: 2px solid transparent; |
||||
|
} |
||||
|
|
||||
|
div.checkbox.switcher label, div.radio.switcher label { |
||||
|
padding: 0; |
||||
|
} |
||||
|
div.checkbox.switcher label *, div.radio.switcher label * { |
||||
|
vertical-align: middle; |
||||
|
} |
||||
|
div.checkbox.switcher label input, div.radio.switcher label input { |
||||
|
display: none; |
||||
|
} |
||||
|
div.checkbox.switcher label input + span, div.radio.switcher label input + span { |
||||
|
position: relative; |
||||
|
display: inline-block; |
||||
|
margin-right: 10px; |
||||
|
width: 56px; |
||||
|
height: 30px; |
||||
|
background: rgb(107 126 146 / 20%); |
||||
|
border: 3px solid #e1e5e9; |
||||
|
border-radius: 50px; |
||||
|
transition: all 0.3s ease-in-out; |
||||
|
} |
||||
|
div.checkbox.switcher label input + span small, div.radio.switcher label input + span small { |
||||
|
position: absolute; |
||||
|
display: block; |
||||
|
width: 50%; |
||||
|
height: 100%; |
||||
|
background: #fff; |
||||
|
border-radius: 50%; |
||||
|
transition: all 0.3s ease-in-out; |
||||
|
left: 0; |
||||
|
} |
||||
|
div.checkbox.switcher label input:checked + span, div.radio.switcher label input:checked + span { |
||||
|
background: #E8345D ; |
||||
|
border-color: #E8345D ; |
||||
|
} |
||||
|
div.checkbox.switcher label input:checked + span small, div.radio.switcher label input:checked + span small { |
||||
|
left: 50%; |
||||
|
} |
||||
|
.past-events { |
||||
|
-webkit-filter: grayscale(100%); /* Safari 6.0 - 9.0 */ |
||||
|
filter: grayscale(100%); |
||||
|
opacity: .6; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/* image upload */ |
||||
|
|
||||
|
#upload { |
||||
|
opacity: 0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.image-area { |
||||
|
border: 2px dashed rgb(218 224 229); |
||||
|
padding: 1em; |
||||
|
position: relative; |
||||
|
border-radius: 10px; |
||||
|
min-height: 160px; |
||||
|
text-align: center; |
||||
|
margin-bottom: 30px; |
||||
|
} |
||||
|
|
||||
|
.image-area::before { |
||||
|
content: 'Uploaded image result'; |
||||
|
color: rgb(218 224 229); |
||||
|
font-weight: bold; |
||||
|
text-transform: uppercase; |
||||
|
position: absolute; |
||||
|
top: 50%; |
||||
|
left: 50%; |
||||
|
transform: translate(-50%, -50%); |
||||
|
font-size: 0.8rem; |
||||
|
z-index: 1; |
||||
|
} |
||||
|
|
||||
|
.image-area img { |
||||
|
z-index: 2; |
||||
|
position: relative; |
||||
|
} |
||||
|
.badge { |
||||
|
padding-left: .8em; |
||||
|
padding-right: .8em; |
||||
|
border-radius: 30px; |
||||
|
} |
||||
|
.badge.badge-primary { |
||||
|
color: #fff; |
||||
|
background-color: #df2751; |
||||
|
} |
||||
|
.member-container { |
||||
|
margin-bottom: 30px; |
||||
|
} |
||||
|
.member-container span{ |
||||
|
font-size: 13px; |
||||
|
} |
||||
|
.member-container .member-name { |
||||
|
font-size: 16px; |
||||
|
font-weight: 600; |
||||
|
display: block; |
||||
|
color: #00044A; |
||||
|
white-space: nowrap; |
||||
|
overflow: hidden; |
||||
|
text-overflow: ellipsis; |
||||
|
} |
||||
|
.modal-backdrop { |
||||
|
background-color: #354052; |
||||
|
} |
||||
|
.modal-content { |
||||
|
border: 0; |
||||
|
border-radius: 10px; |
||||
|
} |
||||
|
.modal-title { |
||||
|
font-size: 20px; |
||||
|
line-height: 1.75; |
||||
|
} |
||||
|
|
||||
|
/*This area was made to be able to navigate between pages. It should be removed from the project*/ |
||||
|
.page-links { |
||||
|
position: fixed; |
||||
|
width: 180px; |
||||
|
background: #00044a; |
||||
|
left: -150px; |
||||
|
top: 50%; |
||||
|
margin-top: -100px; |
||||
|
padding: 1em; |
||||
|
border-radius: 0 10px 10px 0; |
||||
|
z-index: 1000; |
||||
|
opacity: .5; |
||||
|
transition: opacity .3s, left .2s; |
||||
|
} |
||||
|
.page-links:hover { |
||||
|
opacity: .95; |
||||
|
left: 0px; |
||||
|
} |
||||
|
.page-links a{ |
||||
|
display: block; |
||||
|
font-size: 12px; |
||||
|
color: #cbcdf1; |
||||
|
padding: 2px 0; |
||||
|
} |
||||
|
.page-links small{ |
||||
|
font-size: 10px; |
||||
|
color: #999cdf; |
||||
|
} |
||||
|
/*This area was made to be able to navigate between pages. It should be removed from the project*/ |
||||
@ -0,0 +1,31 @@ |
|||||
|
using System; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using Volo.Abp; |
||||
|
|
||||
|
namespace EventHub.Web.Helpers |
||||
|
{ |
||||
|
public class CoverImageHelper |
||||
|
{ |
||||
|
private static readonly string[] ImageColors = |
||||
|
{ |
||||
|
"linear-gradient(135deg, #41003d 0%, #a10097 100%)", |
||||
|
"linear-gradient(135deg, #163e4b 0%, #297791 100%)", |
||||
|
"linear-gradient(135deg, #660040 0%, #aa006b 100%)", |
||||
|
"linear-gradient(135deg, #240d88 0%, #571fff 100%)", |
||||
|
}; |
||||
|
|
||||
|
public static string GetRandomColor(string articleTitle) |
||||
|
{ |
||||
|
long total = articleTitle.Truncate(32).ToCharArray().Sum(c => c); |
||||
|
return ImageColors[total % ImageColors.Length]; |
||||
|
} |
||||
|
|
||||
|
public static string GetContentOfImage(string content) |
||||
|
{ |
||||
|
content = Check.NotNullOrWhiteSpace(content, nameof(content)); |
||||
|
|
||||
|
return content.ToUpper(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,14 +1,17 @@ |
|||||
@model EventHub.Web.Pages.Events.Components.AttendeesArea.AttendeesAreaViewComponent.AttendeesAreaViewComponentModel |
@model EventHub.Web.Pages.Events.Components.AttendeesArea.AttendeesAreaViewComponent.AttendeesAreaViewComponentModel |
||||
<abp-card class="mb-3" data-event-id="@Model.EventId"> |
<h5 class="detail-head mt-5 font-weight-bold" data-event-id="@Model.EventId">Attendees (@Model.TotalCount)</h5> |
||||
<abp-card-body> |
@if (Model.TotalCount > 0) |
||||
<abp-card-title>Attendees (@Model.TotalCount)</abp-card-title> |
{ |
||||
<abp-card-text> |
<div> |
||||
<ul id="EventAttendeeList"> |
@foreach (var attendee in Model.Attendees) |
||||
@foreach (var attendee in Model.Attendees) |
{ |
||||
{ |
<a href="/users/@attendee.UserName"> |
||||
<li class="border p-2 mb-2"><i class="fas fa-user"></i> @Model.GetAttendeeName(attendee)</li> |
<img gravatar-email="@attendee.Email" default-image="Wavatar" gravatar-size="40" class="org-avatar rounded-circle" data-toggle="tooltip" title="@attendee.UserName" /> |
||||
} |
</a> |
||||
</ul> |
} |
||||
</abp-card-text> |
</div> |
||||
</abp-card-body> |
} |
||||
</abp-card> |
else |
||||
|
{ |
||||
|
<p>There is no attendee</p> |
||||
|
} |
||||
|
|||||
@ -1,10 +1 @@ |
|||||
#EventAttendeeList |
|
||||
{ |
|
||||
list-style: none; |
|
||||
padding: 0; |
|
||||
} |
|
||||
|
|
||||
#EventAttendeeList li |
|
||||
{ |
|
||||
|
|
||||
} |
|
||||
@ -0,0 +1,36 @@ |
|||||
|
@model EventHub.Web.Pages.Events.Components.EventsArea.EventsAreaViewComponent.ListAreaViewComponentModel |
||||
|
|
||||
|
@if (Model.Events != null && Model.Events.Count > 0) |
||||
|
{ |
||||
|
<div id="EventList" class="row" data-hash-code="@Model.GetHashCode()" data-total-count="@Model.TotalCount" data-skip-count="@Model.SkipCount" data-max-result-count="@Model.MaxResultCount"> |
||||
|
<partial name="~/Pages/Events/Components/EventsArea/_eventListSection.cshtml" model="@Model.Events"/> |
||||
|
</div> |
||||
|
|
||||
|
@if (Model.IsPagination && Model.TotalCount > Model.MaxResultCount && Model.TotalCount > Model.Events.Count) |
||||
|
{ |
||||
|
<div id="load-more-section-@Model.GetHashCode()" class="row"> |
||||
|
<div class="col text-center"> |
||||
|
<button |
||||
|
id="LoadMoreButton-@Model.GetHashCode()" |
||||
|
class="btn btn-secondary btn-lg" |
||||
|
data-url="@Url.Action("GetList","Event", |
||||
|
new { |
||||
|
minDate = Model.MinDate, |
||||
|
maxDate = Model.MaxDate, |
||||
|
organizationId = Model.OrganizationId, |
||||
|
registeredUserId = Model.RegisteredUserId, |
||||
|
isOnline = Model.IsOnline, |
||||
|
language = Model.Language, |
||||
|
countryId = Model.CountryId, |
||||
|
maxResultCount = Model.MaxResultCount |
||||
|
})"> |
||||
|
Load More |
||||
|
</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
<p>There is no Event</p> |
||||
|
} |
||||
@ -0,0 +1,97 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Threading.Tasks; |
||||
|
using EventHub.Events; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Volo.Abp.AspNetCore.Mvc; |
||||
|
using Volo.Abp.AspNetCore.Mvc.UI.Widgets; |
||||
|
|
||||
|
namespace EventHub.Web.Pages.Events.Components.EventsArea |
||||
|
{ |
||||
|
[Widget( |
||||
|
AutoInitialize = true, |
||||
|
ScriptFiles = new[] {"/Pages/Events/Components/EventsArea/events-area.js"})] |
||||
|
public class EventsAreaViewComponent : AbpViewComponent |
||||
|
{ |
||||
|
private readonly IEventAppService _eventAppService; |
||||
|
|
||||
|
public EventsAreaViewComponent(IEventAppService eventAppService) |
||||
|
{ |
||||
|
_eventAppService = eventAppService; |
||||
|
} |
||||
|
|
||||
|
public async Task<IViewComponentResult> InvokeAsync( |
||||
|
Guid? organizationId, |
||||
|
Guid? registeredUserId, |
||||
|
DateTime? minDate, |
||||
|
DateTime? maxDate, |
||||
|
bool? isOnline, |
||||
|
string language, |
||||
|
Guid? countryId, |
||||
|
int? skipCount, |
||||
|
int maxResultCount = 15, |
||||
|
bool isPagination = true) |
||||
|
{ |
||||
|
var result = await _eventAppService.GetListAsync( |
||||
|
new EventListFilterDto |
||||
|
{ |
||||
|
OrganizationId = organizationId, |
||||
|
RegisteredUserId = registeredUserId, |
||||
|
MinDate = minDate, |
||||
|
MaxDate = maxDate, |
||||
|
IsOnline = isOnline, |
||||
|
Language = language, |
||||
|
CountryId = countryId, |
||||
|
SkipCount = skipCount.GetValueOrDefault(), |
||||
|
MaxResultCount = maxResultCount |
||||
|
} |
||||
|
); |
||||
|
|
||||
|
return View( |
||||
|
"~/Pages/Events/Components/EventsArea/Default.cshtml", |
||||
|
new ListAreaViewComponentModel |
||||
|
{ |
||||
|
Events = result.Items, |
||||
|
TotalCount = result.TotalCount, |
||||
|
OrganizationId = organizationId, |
||||
|
RegisteredUserId = registeredUserId, |
||||
|
MinDate = minDate, |
||||
|
MaxDate = maxDate, |
||||
|
IsOnline = isOnline, |
||||
|
Language = language, |
||||
|
CountryId = countryId, |
||||
|
SkipCount = skipCount.GetValueOrDefault(), |
||||
|
MaxResultCount = maxResultCount, |
||||
|
IsPagination = isPagination |
||||
|
} |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
public class ListAreaViewComponentModel |
||||
|
{ |
||||
|
public IReadOnlyList<EventInListDto> Events { get; set; } |
||||
|
|
||||
|
public long TotalCount { get; set; } |
||||
|
|
||||
|
public Guid? OrganizationId { get; set; } |
||||
|
|
||||
|
public Guid? RegisteredUserId { get; set; } |
||||
|
|
||||
|
public DateTime? MinDate { get; set; } |
||||
|
|
||||
|
public DateTime? MaxDate { get; set; } |
||||
|
|
||||
|
public bool? IsOnline { get; set; } |
||||
|
|
||||
|
public string Language { get; set; } |
||||
|
|
||||
|
public Guid? CountryId { get; set; } |
||||
|
|
||||
|
public int SkipCount { get; set; } |
||||
|
|
||||
|
public int MaxResultCount { get; set; } |
||||
|
|
||||
|
public bool IsPagination { get; set; } |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,42 @@ |
|||||
|
@using System.Globalization |
||||
|
@using EventHub.Web.Helpers |
||||
|
@using EventHub.Web.Pages.Events |
||||
|
@model List<EventHub.Events.EventInListDto> |
||||
|
|
||||
|
@foreach (var eventDto in Model) |
||||
|
{ |
||||
|
<div class="col-lg-4 col-md-6 event"> |
||||
|
<div class="card"> |
||||
|
@if (eventDto.CoverImageContent is null) |
||||
|
{ |
||||
|
<div class="rounded list-span text-center" style="background: @(CoverImageHelper.GetRandomColor(eventDto.Title))"> |
||||
|
<span>@CoverImageHelper.GetContentOfImage(eventDto.Title).TruncateWithPostfix(30)</span> |
||||
|
</div> |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
<img abp-card-image="Top" style="max-height: 400px; min-height: 160px;" src="@($"data:image/png;base64,{Convert.ToBase64String(eventDto.CoverImageContent)}")" alt="@eventDto.Title"/> |
||||
|
} |
||||
|
<div class="card-body"> |
||||
|
<div class="event-container"> |
||||
|
<div class="form-row"> |
||||
|
<div class="col-3"> |
||||
|
<div class="event-date text-center"> |
||||
|
<small>@eventDto.StartTime.ToString("MMM")</small> |
||||
|
<span>@eventDto.StartTime.Day</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-9"> |
||||
|
<div class="event-info"> |
||||
|
<h5>@eventDto.Title</h5> |
||||
|
<small>@eventDto.StartTime.ToString("hh tt", CultureInfo.InvariantCulture) - @eventDto.EndTime.ToString("hh tt", CultureInfo.InvariantCulture) | @EventDateHelper.GetLocationInfo(eventDto)</small> |
||||
|
<p>@eventDto.Description</p> |
||||
|
</div> |
||||
|
<a href="@Url.Page("/Events/Detail", new {url = eventDto.Url})" class="btn btn-link p-0">Learn More <img src="/assets/more-btn.svg"></a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
} |
||||
@ -0,0 +1,36 @@ |
|||||
|
(function () { |
||||
|
abp.widgets.EventsArea = function ($wrapper) { |
||||
|
var totalCount = Number($wrapper.find('[data-total-count]').attr('data-total-count')) |
||||
|
var skipCount = Number($wrapper.find('[data-skip-count]').attr('data-skip-count')) |
||||
|
var maxResultCount = Number($wrapper.find('[data-max-result-count]').attr('data-max-result-count')) |
||||
|
var hashCode = Number($wrapper.find('[data-hash-code]').attr('data-hash-code')) |
||||
|
skipCount += maxResultCount; |
||||
|
|
||||
|
function init() { |
||||
|
var loadMoreButton = $wrapper.find('#LoadMoreButton-' + hashCode); |
||||
|
loadMoreButton.click(function (e) { |
||||
|
e.preventDefault(); |
||||
|
loadMoreButton.buttonBusy(true); |
||||
|
abp.ajax({ |
||||
|
type: 'GET', |
||||
|
dataType: 'html', |
||||
|
contentType: 'text/html; charset=utf-8', |
||||
|
url: (loadMoreButton.attr('data-url') + '&skipCount=' + skipCount) |
||||
|
}).then(function (response) { |
||||
|
var eventList = $wrapper.find('#EventList') |
||||
|
eventList.append(response); |
||||
|
skipCount += maxResultCount; |
||||
|
}).always(function () { |
||||
|
if (skipCount >= totalCount) { |
||||
|
$('#load-more-section-' + hashCode).hide(); |
||||
|
} |
||||
|
loadMoreButton.buttonBusy(false); |
||||
|
}); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
return { |
||||
|
init: init |
||||
|
}; |
||||
|
}; |
||||
|
})(); |
||||
@ -1,45 +1,42 @@ |
|||||
@using EventHub.Localization |
@using EventHub.Localization |
||||
|
@using EventHub.Web.Pages.Events |
||||
@using Microsoft.AspNetCore.Mvc.Localization |
@using Microsoft.AspNetCore.Mvc.Localization |
||||
@inject IHtmlLocalizer<EventHubResource> L |
@inject IHtmlLocalizer<EventHubResource> L |
||||
@model EventHub.Web.Pages.Events.Components.LocationArea.LocationAreaViewComponent.LocationAreaViewComponentModel |
@model EventHub.Web.Pages.Events.Components.LocationArea.LocationAreaViewComponent.LocationAreaViewComponentModel |
||||
<abp-card class="mb-3" data-event-id="@Model.EventId"> |
<div data-event-id="@Model.EventId"> |
||||
<abp-card-body> |
@if (Model.IsRegistered) |
||||
<abp-card-title>@L["Location"] <i class="fas fa-map-marker-alt"></i></abp-card-title> |
{ |
||||
|
if (Model.IsOnline) |
||||
@if (Model.IsRegistered) |
|
||||
{ |
{ |
||||
if (Model.IsOnline) |
if (Model.OnlineLink != null) |
||||
{ |
{ |
||||
if (Model.OnlineLink != null) |
<a class="detail-pin" href="@Model.OnlineLink"><img src="/assets/pin.svg"> @L["GoToOnlineAddress"]</a> |
||||
{ |
} |
||||
<a href="@Model.OnlineLink">@L["GoToEventAddress"]</a> |
else |
||||
} |
|
||||
else |
|
||||
{ |
|
||||
<p>@L["LocationHasNotSpecifiedYet", "URL"]</p> |
|
||||
} |
|
||||
}else |
|
||||
{ |
{ |
||||
if (Model.Country != null && Model.City != null) |
<span>@L["LocationHasNotSpecifiedYet", "URL"]</span> |
||||
{ |
|
||||
<p>@Model.Country/@Model.City</p> |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
<p>@L["LocationHasNotSpecifiedYet", "location"]</p> |
|
||||
} |
|
||||
} |
} |
||||
} |
}else |
||||
else |
|
||||
{ |
{ |
||||
if (Model.IsOnline) |
if (Model.Country != null && Model.City != null) |
||||
{ |
{ |
||||
<p>@L["AttendeesCanSeeEventLocation", "URL"]</p> |
<span class="detail-pin"><img src="/assets/pin.svg"> @EventDateHelper.GetLocationInfo(Model.IsOnline, Model.City, Model.Country, ", ")</span> |
||||
} |
} |
||||
else |
else |
||||
{ |
{ |
||||
<p>@L["AttendeesCanSeeEventLocation", "location"]</p> |
<span class="detail-pin">@L["LocationHasNotSpecifiedYet", "location"]</span> |
||||
} |
} |
||||
} |
} |
||||
</abp-card-body> |
} |
||||
</abp-card> |
else |
||||
|
{ |
||||
|
if (Model.IsOnline) |
||||
|
{ |
||||
|
<span class="detail-pin">@L["AttendeesCanSeeEventLocation", "URL"]</span> |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
<span class="detail-pin">@L["AttendeesCanSeeEventLocation", "location"]</span> |
||||
|
} |
||||
|
} |
||||
|
</div> |
||||
|
|||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue