Merge branch 'master' into localize-datetime-admin

This commit is contained in:
Moriz Wahl 2022-02-01 12:49:20 +01:00
commit 900105de05
181 changed files with 3341 additions and 7598 deletions

View File

@ -4,6 +4,175 @@ All notable changes to this project will be documented in this file. Dates are d
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
#### [1.6.1](https://github.com/gradido/gradido/compare/1.6.0...1.6.1)
- Check if user email is activated to make a creation. [`#1356`](https://github.com/gradido/gradido/pull/1356)
- fix: Creation Confirmation User Ids [`#1345`](https://github.com/gradido/gradido/pull/1345)
- fix and improve test [`1c833d3`](https://github.com/gradido/gradido/commit/1c833d394f502a7aed2b5a648c0171a2fe4ee1e6)
- rewrote elopage hook to handle actual elopage hook [`65bc347`](https://github.com/gradido/gradido/commit/65bc3479fa169920eff57b5a2fa662a4090d7364)
- simple test for mass creation, improved test for single creation [`ffc4727`](https://github.com/gradido/gradido/commit/ffc4727e7a7105ac5dc97515b901be8dbe415627)
#### [1.6.0](https://github.com/gradido/gradido/compare/1.5.1...1.6.0)
> 27 January 2022
- v1.6.0 [`#1357`](https://github.com/gradido/gradido/pull/1357)
- fix updatePendingCreation method [`#1346`](https://github.com/gradido/gradido/pull/1346)
- klicktipp_config [`#1348`](https://github.com/gradido/gradido/pull/1348)
- 1351 form to create incorrect due to change of bootstrap version [`#1352`](https://github.com/gradido/gradido/pull/1352)
- first draft of releaseplan [`#1349`](https://github.com/gradido/gradido/pull/1349)
- Rechtschreibfehler behoben, entgültig zu endgültig [`#1354`](https://github.com/gradido/gradido/pull/1354)
- production_deployment [`#1341`](https://github.com/gradido/gradido/pull/1341)
- import_production_data [`#1324`](https://github.com/gradido/gradido/pull/1324)
- remove division / 100 for GDT [`#1339`](https://github.com/gradido/gradido/pull/1339)
- fix: Language Set Correctly after Page Reload in Admin Interface [`#1334`](https://github.com/gradido/gradido/pull/1334)
- fix: Set Locale after Login [`#1328`](https://github.com/gradido/gradido/pull/1328)
- deployment_community_parameters [`#1331`](https://github.com/gradido/gradido/pull/1331)
- bold text if acive page [`#1337`](https://github.com/gradido/gradido/pull/1337)
- 1303 thanks page after set password [`#1335`](https://github.com/gradido/gradido/pull/1335)
- Changed the toasted message for successful creating a creation. [`#1332`](https://github.com/gradido/gradido/pull/1332)
- Added a required to the password repeat field, errors are shown immed… [`#1333`](https://github.com/gradido/gradido/pull/1333)
- fix_rejected_login [`#1329`](https://github.com/gradido/gradido/pull/1329)
- defined fields for Transactionlist in UserSearch in Adminarea, add Lo… [`#1322`](https://github.com/gradido/gradido/pull/1322)
- fix: Render Localized Balance in NavBar [`#1321`](https://github.com/gradido/gradido/pull/1321)
- 1227 vergaenglichkeit besser darstellen [`#1312`](https://github.com/gradido/gradido/pull/1312)
- 1300 gray out register button further when disabled [`#1316`](https://github.com/gradido/gradido/pull/1316)
- change Admin Gradido-Logo font color to white [`#1315`](https://github.com/gradido/gradido/pull/1315)
- 1299 remove text from register publisher [`#1317`](https://github.com/gradido/gradido/pull/1317)
- 1249 gdd gdt values look displaced or cut off [`#1318`](https://github.com/gradido/gradido/pull/1318)
- 1307 admin rename wallet to my account [`#1314`](https://github.com/gradido/gradido/pull/1314)
- 1011 visualize and refine the register process [`#1136`](https://github.com/gradido/gradido/pull/1136)
- New roadmap [`#1219`](https://github.com/gradido/gradido/pull/1219)
- fix: Redirect after Email Confirmation [`#1308`](https://github.com/gradido/gradido/pull/1308)
- fix_docker_logging [`#1309`](https://github.com/gradido/gradido/pull/1309)
- feat: Paginate User Table [`#1293`](https://github.com/gradido/gradido/pull/1293)
- Adding button, to link back to the login page from the error not activated page. [`#1297`](https://github.com/gradido/gradido/pull/1297)
- [WIP] new_deployment_stage2 [`#1290`](https://github.com/gradido/gradido/pull/1290)
- add icons in menu and navbarmenu [`#1298`](https://github.com/gradido/gradido/pull/1298)
- Withdrew horrizontal scrollbar [`#1295`](https://github.com/gradido/gradido/pull/1295)
- transactionCount false or transactionCount error text hide [`#1259`](https://github.com/gradido/gradido/pull/1259)
- 1265 mouse hovering over pencil in settings [`#1270`](https://github.com/gradido/gradido/pull/1270)
- Fix redirect to /logout, now redirects to the wallet login. [`#1285`](https://github.com/gradido/gradido/pull/1285)
- feat: Test and Refactor Send Email [`#1224`](https://github.com/gradido/gradido/pull/1224)
- new_deployment [`#1220`](https://github.com/gradido/gradido/pull/1220)
- Withdrew space at the end of an locale definition. [`#1283`](https://github.com/gradido/gradido/pull/1283)
- Fix removing from masscreationlist now gives right item to the left l… [`#1284`](https://github.com/gradido/gradido/pull/1284)
- onboarding process document [`#1148`](https://github.com/gradido/gradido/pull/1148)
- Don't show the language-switch on the /register page. [`#1282`](https://github.com/gradido/gradido/pull/1282)
- language_updates_bernd [`#1260`](https://github.com/gradido/gradido/pull/1260)
- Admin Logout redirectes to the wallet login page. [`#1271`](https://github.com/gradido/gradido/pull/1271)
- fix: Admin Creation List [`#1276`](https://github.com/gradido/gradido/pull/1276)
- fix: Override Existing Token in Response Header [`#1278`](https://github.com/gradido/gradido/pull/1278)
- fix: Pass Language to Admin Interface [`#1280`](https://github.com/gradido/gradido/pull/1280)
- feat: Seed Garrick Ollivander [`#1277`](https://github.com/gradido/gradido/pull/1277)
- fix: Fix Update of Open Creations [`#1273`](https://github.com/gradido/gradido/pull/1273)
- fix: Change Password in User Profile [`#1266`](https://github.com/gradido/gradido/pull/1266)
- Wallet shows the wrong gdt sum (gdtSum * 100) [`#1269`](https://github.com/gradido/gradido/pull/1269)
- 1240 account not activated needs a button to login page [`#1261`](https://github.com/gradido/gradido/pull/1261)
- reverse filter for unregistered emails [`#1256`](https://github.com/gradido/gradido/pull/1256)
- close row-details automatically when switching to multiple creation page [`#1245`](https://github.com/gradido/gradido/pull/1245)
- change creationdatas if change pending creation [`#1244`](https://github.com/gradido/gradido/pull/1244)
- 1230 details für wiederholte email bestaetigen versenden [`#1255`](https://github.com/gradido/gradido/pull/1255)
- 1221 month names of the open creation in multiple creation [`#1222`](https://github.com/gradido/gradido/pull/1222)
- Documentation Template-Overview-2021 PDF [`#1194`](https://github.com/gradido/gradido/pull/1194)
- Admin create multiple pending creations [`#1203`](https://github.com/gradido/gradido/pull/1203)
- feat: Catch No Cookies Allowed [`#1187`](https://github.com/gradido/gradido/pull/1187)
- Remove confirmation of own pending creation [`#1215`](https://github.com/gradido/gradido/pull/1215)
- feat: Test Create User Mutation [`#1217`](https://github.com/gradido/gradido/pull/1217)
- #751 Änderungen auf Federation und Community-Erstellprozess [`#969`](https://github.com/gradido/gradido/pull/969)
- 1055 concept of operations requirements [`#1129`](https://github.com/gradido/gradido/pull/1129)
- Admin Translations German English [`#1218`](https://github.com/gradido/gradido/pull/1218)
- Roadmap [`#1213`](https://github.com/gradido/gradido/pull/1213)
- pr_admin_refactor [`#1214`](https://github.com/gradido/gradido/pull/1214)
- 1197 admin interface created transactions list [`#1202`](https://github.com/gradido/gradido/pull/1202)
- migration_0006_login_users_collation [`#1207`](https://github.com/gradido/gradido/pull/1207)
- wrong_login_is_not_password_reset [`#1179`](https://github.com/gradido/gradido/pull/1179)
- Moved reverse of the getPendingCreations to the AdminResolver instead… [`#1185`](https://github.com/gradido/gradido/pull/1185)
- Withdrew password argument of createUser. [`#1206`](https://github.com/gradido/gradido/pull/1206)
- fix_optin_code_regeneration [`#1195`](https://github.com/gradido/gradido/pull/1195)
- 1057 display gdd balance when sending [`#1149`](https://github.com/gradido/gradido/pull/1149)
- 1145 refactor admin resolver from master [`#1164`](https://github.com/gradido/gradido/pull/1164)
- Error handling in GddTransactionList.vue [`#1183`](https://github.com/gradido/gradido/pull/1183)
- state-balance balanceDate can't get the date of the last transaction [`#1182`](https://github.com/gradido/gradido/pull/1182)
- feat: Frontend Refactor and Tests [`#1186`](https://github.com/gradido/gradido/pull/1186)
- fix: No Nodemon in Database Scripts [`#1167`](https://github.com/gradido/gradido/pull/1167)
- feat: Test Creation in Admin Interface [`#1172`](https://github.com/gradido/gradido/pull/1172)
- 533 refactor menu remove tim [`#1162`](https://github.com/gradido/gradido/pull/1162)
- database_docker_fixes [`#1176`](https://github.com/gradido/gradido/pull/1176)
- naming_conventions_pending_tasks [`#1184`](https://github.com/gradido/gradido/pull/1184)
- fix_i18n [`#1180`](https://github.com/gradido/gradido/pull/1180)
- fix_corrupted_sender_balance [`#1178`](https://github.com/gradido/gradido/pull/1178)
- Withdrew * 10000 and / 10000 since we need to store the full value. [`#1181`](https://github.com/gradido/gradido/pull/1181)
- catch error Client certificate revoked and pass error.session-expired… [`#1152`](https://github.com/gradido/gradido/pull/1152)
- feat: Test Apollo Provider in Frontend [`#1161`](https://github.com/gradido/gradido/pull/1161)
- fix: Pending Creations are Updated Without Page Reload [`#1160`](https://github.com/gradido/gradido/pull/1160)
- Error on upgrade database after downgrade [`#1119`](https://github.com/gradido/gradido/pull/1119)
- Login fix creation validation [`#1159`](https://github.com/gradido/gradido/pull/1159)
- login_call_resetPassword [`#1130`](https://github.com/gradido/gradido/pull/1130)
- register add tabindex-1 on password show [`#1158`](https://github.com/gradido/gradido/pull/1158)
- feat: Seed Transaction Creations [`#1146`](https://github.com/gradido/gradido/pull/1146)
- Admin confirm pending creation [`#1153`](https://github.com/gradido/gradido/pull/1153)
- Admin delete pending creation query [`#1141`](https://github.com/gradido/gradido/pull/1141)
- fix: Catch Expired Session when Coming from Admin Interface [`#1151`](https://github.com/gradido/gradido/pull/1151)
- docu_release [`#1138`](https://github.com/gradido/gradido/pull/1138)
- feat: Verify Login in Admin Interface [`#1150`](https://github.com/gradido/gradido/pull/1150)
- Admin pending creation queries [`#1140`](https://github.com/gradido/gradido/pull/1140)
- 1137 publisher id as input field on register [`#1147`](https://github.com/gradido/gradido/pull/1147)
- Admin pending creation [`#1135`](https://github.com/gradido/gradido/pull/1135)
- feat: Setup Data Seeding [`#1121`](https://github.com/gradido/gradido/pull/1121)
- fix_admin_token_renewal [`#1139`](https://github.com/gradido/gradido/pull/1139)
- backend_rights [`#1126`](https://github.com/gradido/gradido/pull/1126)
- Login admin interface [`#1125`](https://github.com/gradido/gradido/pull/1125)
- Adminbereich first step [`#1116`](https://github.com/gradido/gradido/pull/1116)
- Login hook elopage [`#1112`](https://github.com/gradido/gradido/pull/1112)
- Since we don't make a request to the login_server we need to catch if… [`#1131`](https://github.com/gradido/gradido/pull/1131)
- feat: Add Server Users Entity [`#1127`](https://github.com/gradido/gradido/pull/1127)
- Stale: 1002-language-selection-register [`#1113`](https://github.com/gradido/gradido/pull/1113)
- Error for removing coin animation [`#1120`](https://github.com/gradido/gradido/pull/1120)
- Adding a check that the user is activated before letting them login. [`#1099`](https://github.com/gradido/gradido/pull/1099)
- Changed the Auto increment so that it is done after the rollback and … [`#1128`](https://github.com/gradido/gradido/pull/1128)
- Login call unsecure login [`#1095`](https://github.com/gradido/gradido/pull/1095)
- feat: Setup Admin Interface [`#1045`](https://github.com/gradido/gradido/pull/1045)
- login_call_updateUserInfos [`#1084`](https://github.com/gradido/gradido/pull/1084)
- fix: Await Resolved Promises in Backend Unit Tests [`#1079`](https://github.com/gradido/gradido/pull/1079)
- feat: Raise Test Coverage Frontend [`#1102`](https://github.com/gradido/gradido/pull/1102)
- login_call_logout [`#1096`](https://github.com/gradido/gradido/pull/1096)
- login_call_hasElopage [`#1083`](https://github.com/gradido/gradido/pull/1083)
- login_call_create_user [`#1070`](https://github.com/gradido/gradido/pull/1070)
- 1036 register page breaks without community [`#1043`](https://github.com/gradido/gradido/pull/1043)
- Apollo create transactions without signation [`#1044`](https://github.com/gradido/gradido/pull/1044)
- change getCustomRepository to createUser function [`#1046`](https://github.com/gradido/gradido/pull/1046)
- fresh_install_instructions [`#1065`](https://github.com/gradido/gradido/pull/1065)
- login_call_check_username [`#1037`](https://github.com/gradido/gradido/pull/1037)
- feat: Setup Unit Tests for Resolvers in Backend [`#951`](https://github.com/gradido/gradido/pull/951)
- Login hotfixes 1.5.1 [`#1075`](https://github.com/gradido/gradido/pull/1075)
- vscode_suggest_extensions [`#1073`](https://github.com/gradido/gradido/pull/1073)
- Documentation on the coin creation and the steps to have the accounts… [`#1052`](https://github.com/gradido/gradido/pull/1052)
- fix open community server user account creation [`#1072`](https://github.com/gradido/gradido/pull/1072)
- when creating the register page, everything in the form is set to blank [`#1025`](https://github.com/gradido/gradido/pull/1025)
- Spelling error fixed 'Berechnungsformel' [`#1048`](https://github.com/gradido/gradido/pull/1048)
- checkEmail.vue page text is displayed correctly now [`#1051`](https://github.com/gradido/gradido/pull/1051)
- Adminarea old [`#1058`](https://github.com/gradido/gradido/pull/1058)
- migrate_login_database [`#1031`](https://github.com/gradido/gradido/pull/1031)
- Text changes for german and english. [`#1041`](https://github.com/gradido/gradido/pull/1041)
- refactor: Transaction Component [`#1026`](https://github.com/gradido/gradido/pull/1026)
- 1017 fixe dashboard layout safari [`#1038`](https://github.com/gradido/gradido/pull/1038)
- 707 separate account overview and send [`#970`](https://github.com/gradido/gradido/pull/970)
- Link to the funding contributions of gradido.net memberships [`#984`](https://github.com/gradido/gradido/pull/984)
- fix: Decay Rounded to Ceil [`#1021`](https://github.com/gradido/gradido/pull/1021)
- fix: Flaky Dashboard Layout Test on Logout [`#1024`](https://github.com/gradido/gradido/pull/1024)
- Move Entity models into database [`#956`](https://github.com/gradido/gradido/pull/956)
- Text 'No decay' replaced by the number 0.00 [`#1023`](https://github.com/gradido/gradido/pull/1023)
- change text 'eingetraten' to 'eingetragen' [`#1022`](https://github.com/gradido/gradido/pull/1022)
- fix: Test Default Publisher ID in Sidebar Menu [`#987`](https://github.com/gradido/gradido/pull/987)
- increase_frontend_coverage [`#1020`](https://github.com/gradido/gradido/pull/1020)
- analyse_bundle [`#1019`](https://github.com/gradido/gradido/pull/1019)
- release_issue_template [`#1013`](https://github.com/gradido/gradido/pull/1013)
- fix_changelog [`#1014`](https://github.com/gradido/gradido/pull/1014)
- removed incorrect mnemonic lists [`08200f4`](https://github.com/gradido/gradido/commit/08200f49f2ceb5ac121534a19ad2a8347c900145)
- update jest, install transform-require-context [`165ed18`](https://github.com/gradido/gradido/commit/165ed1801ba1aba862d0b0006d8c17e322c4b7ff)
- rework roadmap [`b337bcd`](https://github.com/gradido/gradido/commit/b337bcd850423e67b2119c562575b0ec692dddf2)
#### [1.5.1](https://github.com/gradido/gradido/compare/1.5.0...1.5.1)
> 15 October 2021

View File

@ -3,7 +3,7 @@
"description": "Administraion Interface for Gradido",
"main": "index.js",
"author": "Moriz Wahl",
"version": "0.1.0",
"version": "1.6.1",
"license": "MIT",
"private": false,
"scripts": {
@ -28,7 +28,7 @@
"babel-plugin-component": "^1.1.1",
"babel-preset-env": "^1.7.0",
"babel-preset-vue": "^2.0.2",
"bootstrap": "^5.1.3",
"bootstrap": "4.3.1",
"bootstrap-vue": "^2.21.2",
"core-js": "^3.6.5",
"dotenv-webpack": "^7.0.3",

View File

@ -1,5 +1,7 @@
import { mount } from '@vue/test-utils'
import CreationFormular from './CreationFormular.vue'
import { createPendingCreation } from '../graphql/createPendingCreation'
import { createPendingCreations } from '../graphql/createPendingCreations'
const localVue = global.localVue
@ -111,10 +113,14 @@ describe('CreationFormular', () => {
describe('with single creation', () => {
beforeEach(async () => {
jest.clearAllMocks()
await wrapper.setProps({ type: 'singleCreation', creation: [200, 400, 600] })
await wrapper.setData({ rangeMin: 180 })
await wrapper.setData({ text: 'Test create coins' })
await wrapper.setData({ value: 90 })
await wrapper.setProps({
type: 'singleCreation',
creation: [200, 400, 600],
item: { email: 'benjamin@bluemchen.de' },
})
await wrapper.findAll('input[type="radio"]').at(1).setChecked()
await wrapper.find('textarea').setValue('Test create coins')
await wrapper.find('input[type="number"]').setValue(90)
})
describe('first radio button', () => {
@ -122,12 +128,8 @@ describe('CreationFormular', () => {
await wrapper.findAll('input[type="radio"]').at(0).setChecked()
})
it('sets rangeMin to 0', () => {
expect(wrapper.vm.rangeMin).toBe(0)
})
it('sets rangeMax to 200', () => {
expect(wrapper.vm.rangeMax).toBe(200)
expect(wrapper.vm.rangeMax).toBe(400)
})
describe('sendForm', () => {
@ -136,7 +138,18 @@ describe('CreationFormular', () => {
})
it('sends ... to apollo', () => {
expect(apolloMutateMock).toBeCalled()
expect(apolloMutateMock).toBeCalledWith(
expect.objectContaining({
mutation: createPendingCreation,
variables: {
email: 'benjamin@bluemchen.de',
creationDate: 'YYYY-MM-01',
amount: 90,
memo: 'Test create coins',
moderator: 0,
},
}),
)
})
})
@ -325,6 +338,47 @@ describe('CreationFormular', () => {
})
})
})
describe('with mass creation', () => {
beforeEach(async () => {
jest.clearAllMocks()
await wrapper.setProps({
type: 'massCreation',
creation: [200, 400, 600],
items: [{ email: 'bob@baumeister.de' }, { email: 'bibi@bloxberg.de' }],
})
await wrapper.findAll('input[type="radio"]').at(1).setChecked()
await wrapper.find('textarea').setValue('Test mass create coins')
await wrapper.find('input[type="number"]').setValue(200)
await wrapper.find('.test-submit').trigger('click')
})
it('calls the API', () => {
expect(apolloMutateMock).toBeCalledWith(
expect.objectContaining({
mutation: createPendingCreations,
variables: {
pendingCreations: [
{
email: 'bob@baumeister.de',
creationDate: 'YYYY-MM-01',
amount: 200,
memo: 'Test mass create coins',
moderator: 0,
},
{
email: 'bibi@bloxberg.de',
creationDate: 'YYYY-MM-01',
amount: 200,
memo: 'Test mass create coins',
moderator: 0,
},
],
},
}),
)
})
})
})
})
})

View File

@ -3,8 +3,10 @@
{{ $t('creation_form.form') }}
<div class="shadow p-3 mb-5 bg-white rounded">
<b-form ref="creationForm">
<b-row>
<div class="ml-4">
<label>{{ $t('creation_form.select_month') }}</label>
</div>
<b-row class="ml-4">
<b-form-radio-group
v-model="selected"
:options="radioOptions"
@ -35,7 +37,7 @@
</b-input-group>
</div>
</b-row>
<b-row class="m-4">
<div class="m-4">
<label>{{ $t('creation_form.enter_text') }}</label>
<div>
<b-form-textarea
@ -46,9 +48,9 @@
rows="3"
></b-form-textarea>
</div>
</b-row>
</div>
<b-row class="m-4">
<b-col class="text-center">
<b-col class="text-left">
<b-button type="reset" variant="danger" @click="$refs.creationForm.reset()">
{{ $t('creation_form.reset') }}
</b-button>

View File

@ -2,8 +2,10 @@
<div class="component-edit-creation-formular">
<div class="shadow p-3 mb-5 bg-white rounded">
<b-form ref="updateCreationForm">
<b-row class="m-4">
<div class="ml-4">
<label>{{ $t('creation_form.select_month') }}</label>
</div>
<b-row class="m-4">
<b-form-radio-group
v-model="selected"
:options="radioOptions"
@ -12,7 +14,7 @@
name="month-selection"
></b-form-radio-group>
</b-row>
<b-row class="m-4">
<div class="m-4">
<label>{{ $t('creation_form.select_value') }}</label>
<div>
<b-input-group prepend="GDD" append=".00">
@ -23,7 +25,6 @@
:max="rangeMax"
></b-form-input>
</b-input-group>
<b-input-group prepend="0" :append="String(rangeMax)" class="mt-3">
<b-form-input
type="range"
@ -34,8 +35,8 @@
></b-form-input>
</b-input-group>
</div>
</b-row>
<b-row class="m-4">
</div>
<div class="m-4">
<label>{{ $t('creation_form.enter_text') }}</label>
<div>
<b-form-textarea
@ -46,9 +47,9 @@
rows="3"
></b-form-textarea>
</div>
</b-row>
</div>
<b-row class="m-4">
<b-col class="text-center">
<b-col class="text-left">
<b-button type="reset" variant="danger" @click="$refs.updateCreationForm.reset()">
{{ $t('creation_form.reset') }}
</b-button>

View File

@ -183,8 +183,10 @@ describe('UserTable', () => {
expect(wrapper.findAll('tr:nth-child(1) > td').length).toBe(7)
})
it('click button on fifth column', () => {
wrapper.find('tbody tr td[aria-colindex="5"] button').trigger('click')
it('find button on fifth column', () => {
expect(
wrapper.findAll('tr:nth-child(1) > td').at(5).find('button').isVisible(),
).toBeTruthy()
})
})
})

View File

@ -47,7 +47,13 @@
</template>
<template #cell(show_details)="row">
<b-button variant="info" size="md" @click="rowToogleDetails(row, 0)" class="mr-2">
<b-button
variant="info"
size="md"
v-if="row.item.emailChecked"
@click="rowToogleDetails(row, 0)"
class="mr-2"
>
<b-icon :icon="row.detailsShowing ? 'eye-slash-fill' : 'eye-fill'"></b-icon>
</b-button>
</template>

View File

@ -3,7 +3,7 @@
"bookmark": "bookmark",
"confirmed": "bestätigt",
"creation_form": {
"creation_for": "Schöpfung für",
"creation_for": "Aktives Grundeinkommen für",
"enter_text": "Text eintragen",
"form": "Schöpfungsformular",
"min_characters": "Mindestens 10 Zeichen eingeben",
@ -40,7 +40,7 @@
"overlay": {
"confirm": {
"no": "Nein, nicht speichern.",
"question": "Willst du diese vorgespeicherte Schöpfung wirklich vollziehen und entgültig speichern?",
"question": "Willst du diese vorgespeicherte Schöpfung wirklich vollziehen und endgültig speichern?",
"text": "Nach dem Speichern ist der Datensatz nicht mehr änderbar und kann auch nicht mehr gelöscht werden. Bitte überprüfe genau, dass alles stimmt.",
"title": "Schöpfung bestätigen!",
"yes": "Ja, Schöpfung bestätigen und speichern!"

View File

@ -3,7 +3,7 @@
"bookmark": "Remember",
"confirmed": "confirmed",
"creation_form": {
"creation_for": "Creation for",
"creation_for": "Active Basic Income for",
"enter_text": "Enter text",
"form": "Creation form",
"min_characters": "Enter at least 10 characters",

View File

@ -3634,16 +3634,16 @@ bootstrap-vue@^2.21.2:
portal-vue "^2.1.7"
vue-functional-data-merge "^3.1.0"
bootstrap@4.3.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.3.1.tgz#280ca8f610504d99d7b6b4bfc4b68cec601704ac"
integrity sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==
"bootstrap@>=4.5.3 <5.0.0":
version "4.6.0"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.0.tgz#97b9f29ac98f98dfa43bf7468262d84392552fd7"
integrity sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==
bootstrap@^5.1.3:
version "5.1.3"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.1.3.tgz#ba081b0c130f810fa70900acbc1c6d3c28fa8f34"
integrity sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"

View File

@ -1,8 +1,11 @@
# Server
PORT=4000
JWT_SECRET=secret123
JWT_EXPIRES_IN=10m
GRAPHIQL=false
GDT_API_URL=https://gdt.gradido.net
# Database
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
@ -10,29 +13,34 @@ DB_PASSWORD=
DB_DATABASE=gradido_community
TYPEORM_LOGGING_RELATIVE_PATH=typeorm.backend.log
#EMAIL=true
#EMAIL_USERNAME=
#EMAIL_SENDER=
#EMAIL_PASSWORD=
#EMAIL_SMTP_URL=
#EMAIL_SMTP_PORT=587
#RESEND_TIME=1 minute, 60 => 1hour, 1440 (60 minutes * 24 hours) => 24 hours
#RESEND_TIME=
RESEND_TIME=10
# Klicktipp
KLICKTIPP=false
KLICKTTIPP_API_URL=https://api.klicktipp.com
KLICKTIPP_USER=gradido_test
KLICKTIPP_PASSWORD=secret321
KLICKTIPP_APIKEY_DE=SomeFakeKeyDE
KLICKTIPP_APIKEY_EN=SomeFakeKeyEN
#EMAIL_LINK_VERIFICATION=http://localhost/checkEmail/{code}
#EMAIL_LINK_SETPASSWORD=http://localhost/reset/{code}
# Community
COMMUNITY_NAME=Gradido Entwicklung
COMMUNITY_URL=http://localhost/
COMMUNITY_REGISTER_URL=http://localhost/register
COMMUNITY_DESCRIPTION=Die lokale Entwicklungsumgebung von Gradido.
#KLICKTIPP_USER=
#KLICKTIPP_PASSWORD=
#KLICKTIPP_APIKEY_DE=
#KLICKTIPP_APIKEY_EN=
#KLICKTIPP=true
COMMUNITY_NAME=
COMMUNITY_URL=
COMMUNITY_REGISTER_URL=
COMMUNITY_DESCRIPTION=
# Login Server
LOGIN_APP_SECRET=21ffbbc616fe
LOGIN_SERVER_KEY=a51ef8ac7ef1abf162fb7a65261acd7a
# EMail
EMAIL=false
EMAIL_USERNAME=gradido_email
EMAIL_SENDER=info@gradido.net
EMAIL_PASSWORD=xxx
EMAIL_SMTP_URL=gmail.com
EMAIL_SMTP_PORT=587
EMAIL_LINK_VERIFICATION=http://localhost/checkEmail/{code}
EMAIL_LINK_SETPASSWORD=http://localhost/reset/{code}
RESEND_TIME=10
# Webhook
WEBHOOK_ELOPAGE_SECRET=secret

View File

@ -1,8 +1,10 @@
PORT=4000
# Server
JWT_SECRET=$JWT_SECRET
JWT_EXPIRES_IN=10m
GRAPHIQL=false
GDT_API_URL=$GDT_API_URL
# Database
DB_HOST=localhost
DB_PORT=3306
DB_USER=$DB_USER
@ -10,26 +12,35 @@ DB_PASSWORD=$DB_PASSWORD
DB_DATABASE=gradido_community
TYPEORM_LOGGING_RELATIVE_PATH=$TYPEORM_LOGGING_RELATIVE_PATH
# Klicktipp
KLICKTIPP=$KLICKTIPP
KLICKTTIPP_API_URL=https://api.klicktipp.com
KLICKTIPP_USER=$KLICKTIPP_USER
KLICKTIPP_PASSWORD=$KLICKTIPP_PASSWORD
KLICKTIPP_APIKEY_DE=$KLICKTIPP_APIKEY_DE
KLICKTIPP_APIKEY_EN=$KLICKTIPP_APIKEY_EN
# Community
COMMUNITY_NAME=$COMMUNITY_NAME
COMMUNITY_URL=$COMMUNITY_URL
COMMUNITY_REGISTER_URL=$COMMUNITY_REGISTER_URL
COMMUNITY_DESCRIPTION=$COMMUNITY_DESCRIPTION
# Login Server
LOGIN_APP_SECRET=21ffbbc616fe
LOGIN_SERVER_KEY=a51ef8ac7ef1abf162fb7a65261acd7a
# EMail
RESEND_TIME=10
EMAIL=$EMAIL
EMAIL_USERNAME=$EMAIL_USERNAME
EMAIL_SENDER=$EMAIL_SENDER
EMAIL_PASSWORD=$EMAIL_PASSWORD
EMAIL_SMTP_URL=$EMAIL_SMTP_URL
EMAIL_SMTP_PORT=587
#RESEND_TIME=1 minute, 60 => 1hour, 1440 (60 minutes * 24 hours) => 24 hours
RESEND_TIME=10
EMAIL_LINK_VERIFICATION=$EMAIL_LINK_VERIFICATION
EMAIL_LINK_SETPASSWORD=$EMAIL_LINK_SETPASSWORD
RESEND_TIME=10
#KLICKTIPP_USER=
#KLICKTIPP_PASSWORD=
#KLICKTIPP_APIKEY_DE=
#KLICKTIPP_APIKEY_EN=
#KLICKTIPP=true
COMMUNITY_NAME=$COMMUNITY_NAME
COMMUNITY_URL=$COMMUNITY_URL
COMMUNITY_REGISTER_URL=$COMMUNITY_REGISTER_URL
COMMUNITY_DESCRIPTION=$COMMUNITY_DESCRIPTION
# Webhook
WEBHOOK_ELOPAGE_SECRET=$WEBHOOK_ELOPAGE_SECRET

View File

@ -1,6 +1,6 @@
{
"name": "gradido-backend",
"version": "1.5.1",
"version": "1.6.1",
"description": "Gradido unified backend providing an API-Service for Gradido Transactions",
"main": "src/index.ts",
"repository": "https://github.com/gradido/gradido/backend",

View File

@ -43,6 +43,7 @@ const loginServer = {
LOGIN_SERVER_KEY: process.env.LOGIN_SERVER_KEY || 'a51ef8ac7ef1abf162fb7a65261acd7a',
}
// TODO: Hannes if I find you... this looks like blasphemy
const resendTime = parseInt(process.env.RESEND_TIME ? process.env.RESEND_TIME : 'null')
const email = {
EMAIL: process.env.EMAIL === 'true' || false,

View File

@ -23,6 +23,7 @@ import { UserTransactionRepository } from '../../typeorm/repository/UserTransact
import { BalanceRepository } from '../../typeorm/repository/Balance'
import { calculateDecay } from '../../util/decay'
import { LoginUserRepository } from '../../typeorm/repository/LoginUser'
import { LoginPendingTasksAdmin } from '@entity/LoginPendingTasksAdmin'
@Resolver()
export class AdminResolver {
@ -60,7 +61,10 @@ export class AdminResolver {
): Promise<number[]> {
const userRepository = getCustomRepository(UserRepository)
const user = await userRepository.findByEmail(email)
const isActivated = await hasActivatedEmail(user.email)
if (!isActivated) {
throw new Error('Creation could not be saved, Email is not activated')
}
const creations = await getUserCreations(user.id)
const creationDateObj = new Date(creationDate)
if (isCreationValid(creations, amount, creationDateObj)) {
@ -113,22 +117,32 @@ export class AdminResolver {
const user = await userRepository.findByEmail(email)
const loginPendingTasksAdminRepository = getCustomRepository(LoginPendingTasksAdminRepository)
const updatedCreation = await loginPendingTasksAdminRepository.findOneOrFail({ id })
const pendingCreationToUpdate = await loginPendingTasksAdminRepository.findOneOrFail({ id })
if (updatedCreation.userId !== user.id)
if (pendingCreationToUpdate.userId !== user.id) {
throw new Error('user of the pending creation and send user does not correspond')
}
updatedCreation.amount = BigInt(amount * 10000)
updatedCreation.memo = memo
updatedCreation.date = new Date(creationDate)
updatedCreation.moderator = moderator
const creationDateObj = new Date(creationDate)
let creations = await getUserCreations(user.id)
if (pendingCreationToUpdate.date.getMonth() === creationDateObj.getMonth()) {
creations = updateCreations(creations, pendingCreationToUpdate)
}
await loginPendingTasksAdminRepository.save(updatedCreation)
if (!isCreationValid(creations, amount, creationDateObj)) {
throw new Error('Creation is not valid')
}
pendingCreationToUpdate.amount = BigInt(amount * 10000)
pendingCreationToUpdate.memo = memo
pendingCreationToUpdate.date = new Date(creationDate)
pendingCreationToUpdate.moderator = moderator
await loginPendingTasksAdminRepository.save(pendingCreationToUpdate)
const result = new UpdatePendingCreation()
result.amount = parseInt(amount.toString())
result.memo = updatedCreation.memo
result.date = updatedCreation.date
result.moderator = updatedCreation.moderator
result.memo = pendingCreationToUpdate.memo
result.date = pendingCreationToUpdate.date
result.moderator = pendingCreationToUpdate.moderator
result.creation = await getUserCreations(user.id)
return result
@ -322,6 +336,28 @@ async function getUserCreations(id: number): Promise<number[]> {
]
}
function updateCreations(creations: number[], pendingCreation: LoginPendingTasksAdmin): number[] {
const dateMonth = moment().format('YYYY-MM')
const dateLastMonth = moment().subtract(1, 'month').format('YYYY-MM')
const dateBeforeLastMonth = moment().subtract(2, 'month').format('YYYY-MM')
const creationDateMonth = moment(pendingCreation.date).format('YYYY-MM')
switch (creationDateMonth) {
case dateMonth:
creations[2] += parseInt(pendingCreation.amount.toString())
break
case dateLastMonth:
creations[1] += parseInt(pendingCreation.amount.toString())
break
case dateBeforeLastMonth:
creations[0] += parseInt(pendingCreation.amount.toString())
break
default:
throw new Error('UpdatedCreationDate is not in the last three months')
}
return creations
}
function isCreationValid(creations: number[], amount: number, creationDate: Date) {
const dateMonth = moment().format('YYYY-MM')
const dateLastMonth = moment().subtract(1, 'month').format('YYYY-MM')

View File

@ -55,8 +55,8 @@ const createServer = async (context: any = serverContext): Promise<any> => {
// bodyparser json
app.use(express.json())
// bodyparser text for elopage
app.use(express.text())
// bodyparser urlencoded for elopage
app.use(express.urlencoded({ extended: true }))
// Log every request
/*

View File

@ -39,65 +39,40 @@ export const elopageWebhook = async (req: any, res: any): Promise<void> => {
res.status(200).end() // Responding is important
const loginElopageBuyRepository = await getCustomRepository(LoginElopageBuysRepository)
const loginElopageBuy = new LoginElopageBuys()
let firstName = ''
let lastName = ''
const entries = req.body.split('&')
entries.forEach((entry: string) => {
const keyVal = entry.split('=')
if (keyVal.length > 2) {
throw new Error(`Error parsing entry '${entry}'`)
}
const key = keyVal[0]
const val = decodeURIComponent(keyVal[1]).replace('+', ' ').trim()
switch (key) {
case 'product[affiliate_program_id]':
loginElopageBuy.affiliateProgramId = parseInt(val)
break
case 'publisher[id]':
loginElopageBuy.publisherId = parseInt(val)
break
case 'order_id':
loginElopageBuy.orderId = parseInt(val)
break
case 'product_id':
loginElopageBuy.productId = parseInt(val)
break
case 'product[price]':
// TODO: WHAT THE ACTUAL FUK? Please save this as float in the future directly in the database
loginElopageBuy.productPrice = Math.trunc(parseFloat(val) * 100)
break
case 'payer[email]':
loginElopageBuy.payerEmail = val
break
case 'publisher[email]':
loginElopageBuy.publisherEmail = val
break
case 'payment_state':
loginElopageBuy.payed = val === 'paid'
break
case 'success_date':
loginElopageBuy.successDate = new Date(val)
break
case 'event':
loginElopageBuy.event = val
break
case 'membership[id]':
// TODO this was never set on login_server - its unclear if this is the correct value
loginElopageBuy.elopageUserId = parseInt(val)
break
case 'payer[first_name]':
firstName = val
break
case 'payer[last_name]':
lastName = val
break
default:
// this is too spammy
// eslint-disable-next-line no-console
// console.log(`Unknown Elopage Value '${entry}'`)
break
}
})
const {
payer,
product,
publisher,
// eslint-disable-next-line camelcase
order_id,
// eslint-disable-next-line camelcase
product_id,
// eslint-disable-next-line camelcase
payment_state,
// eslint-disable-next-line camelcase
success_date,
event,
membership,
} = req.body
loginElopageBuy.affiliateProgramId = parseInt(product.affiliate_program_id)
loginElopageBuy.publisherId = parseInt(publisher.id)
loginElopageBuy.orderId = parseInt(order_id)
loginElopageBuy.productId = parseInt(product_id)
// TODO: WHAT THE ACTUAL FUK? Please save this as float in the future directly in the database
loginElopageBuy.productPrice = Math.trunc(parseFloat(product.price) * 100)
loginElopageBuy.payerEmail = payer.email
loginElopageBuy.publisherEmail = publisher.email
// eslint-disable-next-line camelcase
loginElopageBuy.payed = payment_state === 'paid'
loginElopageBuy.successDate = new Date(success_date)
loginElopageBuy.event = event
// TODO this was never set on login_server - its unclear if this is the correct value
loginElopageBuy.elopageUserId = parseInt(membership.id)
const firstName = payer.first_name
const lastName = payer.last_name
// Do not process certain events
if (['lesson.viewed', 'lesson.completed', 'lesson.commented'].includes(loginElopageBuy.event)) {

View File

@ -1,6 +1,6 @@
{
"name": "gradido-database",
"version": "0.0.1",
"version": "1.6.1",
"description": "Gradido Database Tool to execute database migrations",
"main": "src/index.ts",
"repository": "https://github.com/gradido/gradido/database",

View File

@ -37,6 +37,12 @@ COMMUNITY_URL=https://stage1.gradido.net/
COMMUNITY_REGISTER_URL=https://stage1.gradido.net/register
COMMUNITY_DESCRIPTION=Gradido Development Stage1 Test Community
KLICKTIPP=false
KLICKTIPP_USER=
KLICKTIPP_PASSWORD=
KLICKTIPP_APIKEY_DE=
KLICKTIPP_APIKEY_EN=
# frontend
GRAPHQL_URI=https://stage1.gradido.net/graphql
ADMIN_AUTH_URL=https://stage1.gradido.net/admin/authenticate?token={token}

View File

@ -0,0 +1,25 @@
# Releaseplan V1.6.0
Die folgenden Schritte dienen zur Vorbereitung und Durchführung der Inbetriebnahme von Release V-1.6.0.
| LfdNr. | Aktion | verantwortlich | Status<br />(Ok / Err / Ongoing) | Startzeit | Dauer in min | Endezeit |
| ------ | ----------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -------------------------------- | --------- | ------------ | -------- |
| 1 | Finish all PRs & Finally merge everything | **@Hannes** **@ogerly** **@moriz** **@ulfgebh** | | | | |
| 2 | Make a new version 1.6.0 | **@Developer** | | | | |
| 2a | Deploy V1.6.0 on Stage 2 and make Tests to confirm a working release build | **@Developer @Bernd von Gradido** | | | | |
| 3 | Setup Klicktip settings from old production on new production (?)Make a new version 1.6.0 | ****@ulfgebhardt** **@einhornimmon**** | | | | |
| 4 | Deploy 1.6.0 on gdd.gradido.net and make sure things work as expected(rudimentary) | **@ulfgebhardt** | | | | |
| 5a | Disable Klicktipp Hook to current production gdd1.gradido.com | **@einhornimmond** | | | | |
| 5b | Disable Elopage Hook to current production gdd1.gradido.com | **@einhornimmond** | | | | |
| 6 | Deploy Maintenance page to current production & enable it | **@einhornimmond** | | | | |
| 7 | Shut down current production servers except mariadb & nginx serving the maintenance page | **@einhornimmond** | | | | |
| 8 | Create backup from production (correct format & correct data) | **@einhornimmond** | | | | |
| 9 | Shut down mariadb server | **@einhornimmond** | | | | |
| 10 | Transmit backup to new production | **@ulfgebhardt** | | | | |
| 11 | Import production data on new production | **@ulfgebhardt** | | | | |
| 12a | Enable new Klicktipp hook to new production | **@einhornimmond** **@ulfgebhard** | | | | |
| 12b | Enable new Elopage hooks to new production | **@einhornimmond** **@ulfgebhard** | | | | |
| 13 | Do extended tests on the new production | **@Team** | | | | |
| 14 | Have a permanent redirect from all old urls to the new production server:<br />Which one?<br />- URL1<br />- URL2<br />- etc. | **@einhornimmond** | | | | |
| 15 | Update links on Wordpress to the new production server | **@Bernd von Gradido** | | | | |

View File

@ -1,6 +1,6 @@
{
"name": "bootstrap-vue-gradido-wallet",
"version": "1.5.1",
"version": "1.6.1",
"private": true,
"scripts": {
"start": "node run/server.js",
@ -20,16 +20,11 @@
"@vue/cli-plugin-unit-jest": "^4.5.12",
"@vue/test-utils": "^1.1.3",
"apollo-boost": "^0.4.9",
"axios": "^0.21.1",
"babel-core": "^7.0.0-bridge.0",
"babel-jest": "^27.3.1",
"babel-preset-vue": "^2.0.2",
"bootstrap": "4.3.1",
"bootstrap-vue": "^2.5.0",
"d3": "^5.7.0",
"datamaps": "^0.5.9",
"date-fns": "^1.30.1",
"dropzone": "^5.5.1",
"bootstrap": "^4.5.3",
"bootstrap-vue": "^2.21.2",
"es6-promise": "^4.1.1",
"eslint": "^7.25.0",
"eslint-config-prettier": "^8.1.0",
@ -44,31 +39,22 @@
"express": "^4.17.1",
"flatpickr": "^4.5.7",
"flush-promises": "^1.0.2",
"fuse.js": "^3.2.0",
"google-maps": "^3.2.1",
"graphql": "^15.5.1",
"identity-obj-proxy": "^3.0.0",
"jest": "^26.6.3",
"jest-canvas-mock": "^2.3.1",
"jest-environment-jsdom-sixteen": "^2.0.0",
"nouislider": "^12.1.0",
"particles-bg-vue": "1.2.3",
"perfect-scrollbar": "^1.3.0",
"portal-vue": "^2.1.7",
"prettier": "^2.2.1",
"qrcode": "^1.4.4",
"quill": "^1.3.6",
"regenerator-runtime": "^0.13.7",
"sweetalert2": "^9.5.4",
"vee-validate": "^3.4.5",
"vue": "^2.6.11",
"vue": "2.6.12",
"vue-apollo": "^3.0.7",
"vue-bootstrap-typeahead": "^0.2.6",
"vue-cli-plugin-i18n": "^1.0.1",
"vue-clickaway": "^2.2.2",
"vue-clipboard2": "^0.3.0",
"vue-flatpickr-component": "^8.1.2",
"vue-focus": "^2.1.0",
"vue-good-table": "^2.21.3",
"vue-i18n": "^8.22.4",
"vue-jest": "^3.0.7",
"vue-loading-overlay": "^3.4.2",

View File

@ -1,126 +0,0 @@
/*!
=========================================================
* Bootstrap Vue Gradido Wallet- v0.0.1
=========================================================
* Product Page: https://www.gradido.net
* Copyright 2020 Bernd Hückstädt - Gradido (https://www.gradido.net)
* Coded by www.gradido.net
=========================================================
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
// Core
@import "custom/functions";
@import "custom/variables";
@import "custom/mixins";
// Bootstrap (4.1.3) components
@import "~bootstrap/scss/alert";
@import "~bootstrap/scss/badge";
@import "~bootstrap/scss/breadcrumb";
@import "~bootstrap/scss/button-group";
@import "~bootstrap/scss/buttons";
@import "~bootstrap/scss/card";
@import "~bootstrap/scss/carousel";
@import "~bootstrap/scss/close";
@import "~bootstrap/scss/code";
@import "~bootstrap/scss/custom-forms";
@import "~bootstrap/scss/dropdown";
@import "~bootstrap/scss/forms";
@import "~bootstrap/scss/grid";
@import "~bootstrap/scss/images";
@import "~bootstrap/scss/input-group";
@import "~bootstrap/scss/jumbotron";
@import "~bootstrap/scss/list-group";
@import "~bootstrap/scss/media";
@import "~bootstrap/scss/modal";
@import "~bootstrap/scss/nav";
@import "~bootstrap/scss/navbar";
@import "~bootstrap/scss/pagination";
@import "~bootstrap/scss/popover";
@import "~bootstrap/scss/print";
@import "~bootstrap/scss/progress";
@import "~bootstrap/scss/reboot";
@import "~bootstrap/scss/root";
@import "~bootstrap/scss/tables";
@import "~bootstrap/scss/toasts";
@import "~bootstrap/scss/tooltip";
@import "~bootstrap/scss/transitions";
@import "~bootstrap/scss/type";
@import "~bootstrap/scss/utilities";
@import "~bootstrap/scss/variables";
// Utilities
@import "~bootstrap/scss/utilities/align";
@import "~bootstrap/scss/utilities/background";
@import "~bootstrap/scss/utilities/borders";
@import "~bootstrap/scss/utilities/clearfix";
@import "~bootstrap/scss/utilities/display";
@import "~bootstrap/scss/utilities/embed";
@import "~bootstrap/scss/utilities/flex";
@import "~bootstrap/scss/utilities/float";
@import "~bootstrap/scss/utilities/overflow";
@import "~bootstrap/scss/utilities/position";
@import "~bootstrap/scss/utilities/screenreaders";
@import "~bootstrap/scss/utilities/shadows";
@import "~bootstrap/scss/utilities/sizing";
@import "~bootstrap/scss/utilities/spacing";
@import "~bootstrap/scss/utilities/stretched-link";
@import "~bootstrap/scss/utilities/text";
@import "~bootstrap/scss/utilities/visibility";
// Mixins
@import "~bootstrap/scss/mixins/alert";
@import "~bootstrap/scss/mixins/badge";
@import "~bootstrap/scss/mixins/border-radius";
@import "~bootstrap/scss/mixins/box-shadow";
@import "~bootstrap/scss/mixins/breakpoints";
@import "~bootstrap/scss/mixins/buttons";
@import "~bootstrap/scss/mixins/caret";
@import "~bootstrap/scss/mixins/clearfix";
@import "~bootstrap/scss/mixins/deprecate";
@import "~bootstrap/scss/mixins/float";
@import "~bootstrap/scss/mixins/forms";
@import "~bootstrap/scss/mixins/gradients";
@import "~bootstrap/scss/mixins/grid-framework";
@import "~bootstrap/scss/mixins/grid";
@import "~bootstrap/scss/mixins/hover";
@import "~bootstrap/scss/mixins/image";
@import "~bootstrap/scss/mixins/list-group";
@import "~bootstrap/scss/mixins/lists";
@import "~bootstrap/scss/mixins/nav-divider";
@import "~bootstrap/scss/mixins/pagination";
@import "~bootstrap/scss/mixins/reset-text";
@import "~bootstrap/scss/mixins/resize";
@import "~bootstrap/scss/mixins/screen-reader";
@import "~bootstrap/scss/mixins/size";
@import "~bootstrap/scss/mixins/table-row";
@import "~bootstrap/scss/mixins/text-emphasis";
@import "~bootstrap/scss/mixins/text-hide";
@import "~bootstrap/scss/mixins/text-truncate";
@import "~bootstrap/scss/mixins/transition";
@import "~bootstrap/scss/mixins/visibility";
// Argon utilities and components
@import "custom/reboot";
@import "custom/utilities";
@import "custom/components";
// Vendor (Plugins)
@import "custom/vendors";

View File

@ -1,39 +0,0 @@
//
// Dismissible alert
//
.alert-dismissible {
.close {
top: 50%;
right: $alert-padding-x;
padding: 0;
transform: translateY(-50%);
color: rgba($white, .6);
opacity: 1;
&:hover,
&:focus {
color: rgba($white, .9);
opacity: 1 !important;
}
@include media-breakpoint-down(xs) {
top: 1rem;
right: .5rem;
}
&>span:not(.sr-only) {
font-size: 1.5rem;
background-color: transparent;
color: rgba($white, .6);
}
&:hover,
&:focus {
&>span:not(.sr-only) {
background-color: transparent;
color: rgba($white, .9);
}
}
}
}

View File

@ -1,46 +0,0 @@
//
// Alert
//
.alert {
font-size: $font-size-sm;
}
// Alert heading
.alert-heading {
font-weight: $font-weight-bold;
font-size: $h4-font-size;
margin-top: .15rem;
}
// Alert icon
.alert-icon {
font-size: 1.25rem;
margin-right: 1.25rem;
display: inline-block;
vertical-align: middle;
i.ni {
position: relative;
top: 1px;
}
}
// Alert text next to an alert icon
.alert-text {
display: inline-block;
vertical-align: middle;
}
// Alert links
[class*="alert-"] {
.alert-link {
color: $white;
border-bottom: 1px dotted rgba($white, .5);
}
}

View File

@ -1,22 +0,0 @@
//
// Avatar group
//
// General styles
.avatar-group {
.avatar {
position: relative;
z-index: 2;
border: 2px solid $card-bg;
&:hover {
z-index: 3;
}
}
.avatar + .avatar {
margin-left: -1rem;
}
}

View File

@ -1,42 +0,0 @@
//
// Avatar
//
// General styles
.avatar {
color: $white;
background-color: $gray-500;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 1rem;
border-radius: 50%;
height: 48px;
width: 48px;
img {
width: 100%;
border-radius: 50%;
}
+ .avatar-content {
display: inline-block;
margin-left: .75rem;
}
}
// Avatar size variations
.avatar-lg {
width: 58px;
height: 58px;
font-size: $font-size-sm;
}
.avatar-sm {
width: 36px;
height: 36px;
font-size: $font-size-sm;
}

View File

@ -1,12 +0,0 @@
//
// Brand buttons
//
// Color variations
@each $color, $value in $brand-colors {
.btn-#{$color} {
@include button-variant($value, $value);
}
}

View File

@ -1,92 +0,0 @@
//
// Icon buttons
//
.btn-icon {
.btn-inner--icon {
img {
width: 20px;
}
}
.btn-inner--text:not(:first-child) {
margin-left: 0.75em;
}
.btn-inner--text:not(:last-child) {
margin-right: 0.75em;
}
}
// Button only with icon and NO text
.btn-icon-only {
width: 2.375rem;
height: 2.375rem;
padding: 0;
}
a.btn-icon-only {
line-height: 2.5;
}
.btn-icon-only.btn-sm {
width: 2rem;
height: 2rem;
}
//
// Clipboard button
// dedicated element for copying icons
//
.btn-icon-clipboard {
margin: 0;
padding: 1.5rem;
font-size: $font-size-base;
font-weight: $font-weight-normal;
line-height: 1.25;
color: $gray-800;
background-color: $gray-100;
border-radius: $border-radius;
border: 0;
text-align: left;
font-family: inherit;
display: inline-block;
vertical-align: middle;
text-decoration: none;
-moz-appearance: none;
cursor: pointer;
width: 100%;
margin: .5rem 0;
&:hover {
background-color: $white;
box-shadow: rgba(0, 0, 0, .1) 0 0 0 1px, rgba(0, 0, 0, .1) 0 4px 16px;
}
> div {
align-items: center;
display: flex;
}
i {
box-sizing: content-box;
color: theme-color("primary");
vertical-align: middle;
font-size: 1.5rem;
}
span {
display: inline-block;
font-size: 0.875rem;
line-height: 1.5;
margin-left: 16px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
vertical-align: middle;
}
}

View File

@ -1,91 +0,0 @@
//
// Icon buttons
//
// General styles
.btn {
position: relative;
text-transform: $btn-text-transform;
transition: $transition-base;
letter-spacing: $btn-letter-spacing;
font-size: $input-btn-font-size;
will-change: transform;
&:hover {
@include box-shadow($btn-hover-box-shadow);
transform: translateY($btn-hover-translate-y);
}
&:not(:last-child) {
margin-right: .5rem;
}
// Icons
i:not(:first-child),
svg:not(:first-child) {
margin-left: .5rem;
}
i:not(:last-child),
svg:not(:last-child) {
margin-right: .5rem;
}
}
// Remove translateY and margin animation when btn is included in a btn-group or input-group
.btn-group,
.input-group {
.btn {
margin-right: 0;
transform: translateY(0);
}
}
// Size variations
.btn-sm {
font-size: $input-btn-font-size-sm;
}
.btn-lg {
font-size: $input-btn-font-size-lg;
}
// Some quick fixes (to revise)
// Fixes
[class*="btn-outline-"] {
border-width: 1px;
}
.btn-outline-secondary {
color: darken(theme-color("secondary"), 50%);
}
.btn-inner--icon {
i:not(.fa) {
position: relative;
top: 2px;
}
}
.btn-link {
font-weight: $btn-font-weight;
box-shadow: none;
&:hover {
box-shadow: none;
transform: none;
}
}
.btn-neutral {
color: theme-color("primary");
}

View File

@ -1,10 +0,0 @@
//
// Card with hover animations
//
.card-lift--hover {
&:hover {
transform: translateY(-20px);
@include transition($transition-base);
}
}

View File

@ -1,17 +0,0 @@
//
// Card with blockquote
//
.card-blockquote {
padding: 2rem;
position: relative;
.svg-bg {
display: block;
width: 100%;
height: 95px;
position: absolute;
top: -94px;
left: 0;
}
}

View File

@ -1,49 +0,0 @@
//
// Profile card
//
.card-profile-image {
position: relative;
img {
max-width: 180px;
border-radius: $border-radius;
@extend .shadow;
transform: translate(-50%,-30%);
position: absolute;
left: 50%;
transition: $transition-base;
&:hover {
transform: translate(-50%, -33%);
}
}
}
.card-profile-stats {
padding: 1rem 0;
> div {
text-align: center;
margin-right: 1rem;
padding: .875rem;
&:last-child {
margin-right: 0;
}
.heading {
font-size: 1.1rem;
font-weight: bold;
display: block;
}
.description {
font-size: .875rem;
color: $gray-500;
}
}
}
.card-profile-actions {
padding: .875rem;
}

View File

@ -1,16 +0,0 @@
//
// Card stats
//
.card-stats {
.card-body {
padding: 1rem 1.5rem;
}
.card-status-bullet {
position: absolute;
top: 0;
right: 0;
transform: translate(50%, -50%);
}
}

View File

@ -1,8 +0,0 @@
//
// Card
//
.card-translucent {
background-color: rgba(18, 91, 152, 0.08);
}

View File

@ -1,69 +0,0 @@
//
// Chart
//
.chart {
position: relative;
height: $chart-height;
}
// Size variations
.chart-sm {
height: $chart-height-sm;
}
// Legend
.chart-legend {
display: flex;
justify-content: center;
margin-top: $chart-legend-margin-top;
font-size: $chart-legend-font-size;
text-align: center;
color: $chart-legend-color;
}
.chart-legend-item {
display: inline-flex;
align-items: center;
+ .chart-legend-item {
margin-left: 1rem;
}
}
.chart-legend-indicator {
display: inline-block;
width: 0.5rem;
height: 0.5rem;
margin-right: 0.375rem;
border-radius: 50%;
}
// Tooltip
#chart-tooltip {
z-index: 0;
.arrow {
top: 100%;
left: 50%;
transform: translateX(-50%) translateX(-.5rem);
}
}
// Chart info overlay
.chart-info-overlay {
position: absolute;
top: 0;
left: 5%;
max-width: 350px;
padding: 20px;
z-index: 1;
}

View File

@ -1,34 +0,0 @@
//
// Close
//
.close {
@if $enable-transitions {
transition: $transition-base;
}
&>span:not(.sr-only) {
background-color: $close-bg;
color: $close-color;
line-height: 17px;
height: 1.25rem;
width: 1.25rem;
border-radius: 50%;
font-size: 1.25rem;
display: block;
@if $enable-transitions {
transition: $transition-base;
}
}
&:hover,
&:focus {
background-color: $close-hover-bg;
color: $close-hover-color;
outline: none;
span:not(.sr-only) {
background-color: $close-hover-bg;
}
}
}

View File

@ -1,37 +0,0 @@
//
// Custom checkbox
//
.custom-checkbox {
.custom-control-input ~ .custom-control-label {
cursor: pointer;
font-size: $font-size-sm;
}
.custom-control-input {
&:checked {
~ .custom-control-label {
&::before {
border-color: $custom-control-indicator-checked-border-color;
}
&::after {
background-image: $custom-checkbox-indicator-icon-checked;
}
}
}
&:disabled {
~ .custom-control-label {
&::before {
border-color: $custom-control-indicator-disabled-bg;
}
}
&:checked {
&::before {
border-color: $custom-control-indicator-checked-disabled-bg;
}
}
}
}
}

View File

@ -1,51 +0,0 @@
//
// Custom control
// additional styles for custom checkboxes, radios and other
//
.custom-control-label {
// Background-color and (when enabled) gradient
&::before {
border: $custom-control-indicator-border-width solid $custom-control-indicator-border-color;
@if $enable-transitions {
transition: $input-transition;
}
}
span {
position: relative;
top: 2px;
}
}
.custom-control-label {
margin-bottom: 0;
}
// Alternative style
.custom-control-alternative {
.custom-control-label {
// Background-color and (when enabled) gradient
&::before {
border: 0;
box-shadow: $input-alternative-box-shadow;
}
}
.custom-control-input {
&:checked {
~ .custom-control-label {
&::before {
box-shadow: $input-focus-alternative-box-shadow;
}
}
}
&:active~.custom-control-label::before,
&:focus~.custom-control-label::before {
box-shadow: $input-alternative-box-shadow;
}
}
}

View File

@ -1,37 +0,0 @@
//
// Custom checkbox
//
.custom-checkbox {
.custom-control-input ~ .custom-control-label {
cursor: pointer;
font-size: $font-size-sm;
}
.custom-control-input {
&:checked {
~ .custom-control-label {
&::before {
border-color: $custom-control-indicator-checked-border-color;
}
&::after {
background-image: $custom-checkbox-indicator-icon-checked;
}
}
}
&:disabled {
~ .custom-control-label {
&::before {
border-color: $custom-control-indicator-disabled-bg;
}
}
&:checked {
&::before {
border-color: $custom-control-indicator-checked-disabled-bg;
}
}
}
}
}

View File

@ -1,37 +0,0 @@
//
// Custom radio
//
.custom-radio {
.custom-control-input ~ .custom-control-label {
cursor: pointer;
font-size: $font-size-sm;
}
.custom-control-input {
&:checked {
~ .custom-control-label {
&::before {
border-color: $custom-control-indicator-checked-border-color;
}
&::after {
background-image: $custom-radio-indicator-icon-checked;
}
}
}
&:disabled {
~ .custom-control-label {
&::before {
border-color: $custom-control-indicator-disabled-bg;
}
}
&:checked {
&::before {
border-color: $custom-control-indicator-checked-disabled-bg;
}
}
}
}
}

View File

@ -1,66 +0,0 @@
//
// Custom toggle
//
.custom-toggle {
position: relative;
display: inline-block;
width: $custom-toggle-width;
height: 1.5rem;
input {
display: none;
&:checked {
+ .custom-toggle-slider {
border: $custom-control-indicator-border-width solid $custom-control-indicator-checked-border-color;
&:before {
background: $custom-toggle-checked-bg;
transform: translateX(1.625rem);
}
}
}
&:disabled {
+ .custom-toggle-slider {
border: $custom-control-indicator-border-width solid $custom-control-indicator-disabled-bg;
}
&:checked {
+ .custom-toggle-slider {
border: $custom-control-indicator-border-width solid $custom-control-indicator-disabled-bg;
&:before {
background-color: lighten($custom-control-indicator-checked-bg, 10%);
}
}
}
}
}
}
.custom-toggle-slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
border: $custom-control-indicator-border-width solid $input-border-color;
border-radius: 34px !important;
background-color: transparent;
&:before {
position: absolute;
content: "";
height: 18px;
width: 18px;
left: 2px;
bottom: 2px;
border-radius: 50% !important;
background-color: $custom-toggle-slider-bg;
transition: $input-transition;
}
}

View File

@ -1,79 +0,0 @@
//
// Dropdown
//
// General styles
.dropdown,
.dropup,
.dropright,
.dropleft {
display: inline-block;
}
.dropdown-menu {
min-width: 12rem;
.dropdown-item {
padding: .5rem 1rem;
font-size: $font-size-sm;
> i,
> svg {
margin-right: 1rem;
font-size: 1rem;
vertical-align: -17%;
}
}
}
.dropdown-header {
padding-left: 1rem;
padding-right: 1rem;
color: $gray-100;
font-size: .625rem;
text-transform: uppercase;
font-weight: 700;
}
// Media components inside dropdown link
.dropdown-menu {
a.media {
> div {
&:first-child {
line-height: 1;
}
}
p {
color: $gray-600;
}
&:hover {
.heading,
p {
color: theme-color("default") !important;
}
}
}
}
// Size variations
.dropdown-menu-sm {
min-width: 100px;
border: $border-radius-lg;
}
.dropdown-menu-lg {
min-width: 260px;
border-radius: $border-radius-lg;
}
.dropdown-menu-xl {
min-width: 450px;
border-radius: $border-radius-lg;
}

View File

@ -1,98 +0,0 @@
//
// Footer
//
// General styles
.footer {
background: $footer-bg;
padding: $footer-padding-y $footer-padding-x;
.col-footer {
.heading {
color: $footer-heading-color;
letter-spacing: 0;
font-size: $footer-heading-font-size;
text-transform: uppercase;
font-weight: $font-weight-bold;
margin-bottom: 1rem;
}
}
.nav .nav-item .nav-link,
.footer-link {
color: $footer-link-color !important;
&:hover {
color: $footer-link-hover-color !important;
}
}
.list-unstyled li a {
display: inline-block;
padding: .125rem 0;
color: $footer-link-color;
font-size: $footer-link-font-size;
&:hover {
color: $footer-link-hover-color;
}
}
.copyright {
font-size: $font-size-sm;
}
}
// Dark footer
.footer-dark {
.col-footer .heading {
color: $white;
}
}
// Footer nav used for copyright and some links, but not limited to this
.nav-footer {
.nav-link {
font-size: $font-size-sm;
}
.nav-item:last-child {
.nav-link {
padding-right: 0;
}
}
}
// Footer with cards over
.footer.has-cards {
overflow: hidden;
padding-top: 500px;
margin-top: -420px;
position: relative;
background: transparent;
pointer-events: none;
&:before {
content: "";
position: absolute;
left: 0;
right: 0;
top: 600px;
height: 2000px;
background: theme-color("secondary");
transform: skew(0,-8deg);
}
.container {
pointer-events: auto;
position: relative;
}
}

View File

@ -1,71 +0,0 @@
//
// Form validation
//
// Validation
.has-success,
.has-danger {
position: relative;
&:after, {
width: 19px;
height: 19px;
line-height: 19px;
text-align: center;
font-family: 'NucleoIcons';
display: inline-block;
position: absolute;
right: 15px;
top: 2px;
transform: translateY(50%);
border-radius: 50%;
font-size: 9px;
opacity: 1;
}
}
.has-success {
&:after {
content: "\ea26";
color: daken($form-feedback-valid-color, 18%);
background-color: $form-feedback-valid-bg;
}
.form-control {
background-color: $input-focus-bg;
&:focus {
border-color: $input-focus-border-color;
}
// Placeholder
&::placeholder {
color: $form-feedback-valid-color;
}
}
}
.has-danger {
&:after {
content: "\ea53";
color: daken($form-feedback-invalid-color, 18%);
background-color: $form-feedback-invalid-bg;
}
.form-control {
background-color: $input-focus-bg;
&:focus {
border-color: $input-focus-border-color;
}
// Placeholder
&::placeholder {
color: $form-feedback-invalid-color;
}
}
}

View File

@ -1,78 +0,0 @@
//
// Forms
//
// Labels
.form-control-label {
color: $gray-700;
font-size: $font-size-sm;
font-weight: $font-weight-bold;
}
// Text inputs
.form-control {
font-size: $input-btn-font-size;
&:focus {
&::placeholder {
color: $input-focus-placeholder-color;
}
}
}
// Textarea
textarea[resize="none"] {
resize: none!important;
}
textarea[resize="both"] {
resize: both!important;
}
textarea[resize="vertical"] {
resize: vertical!important;
}
textarea[resize="horizontal"] {
resize: horizontal!important;
}
// Form input variations
// Muted input
.form-control-muted {
background-color: $input-muted-bg;
border-color: $input-muted-bg;
box-shadow: none;
&:focus {
background-color: $input-focus-muted-bg;
}
}
// Alternative input
.form-control-alternative {
box-shadow: $input-alternative-box-shadow;
border: 0;
transition: box-shadow .15s ease;
&:focus {
box-shadow: $input-focus-alternative-box-shadow;
}
}
// Size variations: Fixes to the bootstrap defaults
.form-control-lg {
font-size: $font-size-base;
}

View File

@ -1,70 +0,0 @@
//
// Input group
//
.input-group {
box-shadow: $input-box-shadow;
border-radius: $input-border-radius;
transition: $transition-base;
.form-control {
box-shadow: none;
&:not(:first-child) {
border-left: 0;
padding-left: 0;
}
&:not(:last-child) {
border-right: 0;
padding-right: 0;
}
&:focus {
box-shadow: none;
}
}
}
.input-group-text {
transition: $input-transition;
}
// Alternative input groups related to .form-control-alternative
.input-group-alternative {
box-shadow: $input-alternative-box-shadow;
border: 0;
transition: box-shadow .15s ease;
.form-control,
.input-group-text {
border: 0;
box-shadow: none;
}
}
.focused {
.input-group-alternative {
box-shadow: $input-focus-alternative-box-shadow !important;
}
}
// .focus class is applied dinamycally from theme.js
.focused {
.input-group {
box-shadow: $input-focus-box-shadow;
}
.input-group-text {
color: $input-group-addon-focus-color;
background-color: $input-group-addon-focus-bg;
border-color: $input-group-addon-focus-border-color;
}
.form-control {
border-color: $input-group-addon-focus-border-color;
}
}

View File

@ -1,7 +0,0 @@
//
// Header
//
.header {
position: relative;
}

View File

@ -1,42 +0,0 @@
//
// Icon shape
//
.icon-shape {
padding: 12px;
text-align: center;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 50%;
i, svg {
font-size: 1.25rem;
}
&.icon-lg {
i, svg {
font-size: 1.625rem;
}
}
&.icon-sm {
i, svg {
font-size: .875rem;
}
}
svg {
width: 30px;
height: 30px;
}
}
@each $color, $value in $theme-colors {
.icon-shape-#{$color} {
@include icon-shape-variant(theme-color($color));
}
}

View File

@ -1,65 +0,0 @@
//
// Icon
//
.icon {
width: $icon-size;
height: $icon-size;
i, svg {
font-size: $icon-size - .75;
}
+ .icon-text {
padding-left: 1rem;
width: calc(100% - #{$icon-size} - 1);
}
}
// Extra large icons
.icon-xl {
width: $icon-size-xl;
height: $icon-size-xl;
i, svg {
font-size: $icon-size-xl - .75;
}
+ .icon-text {
width: calc(100% - #{$icon-size-xl} - 1);
}
}
// Large icons
.icon-lg {
width: $icon-size-lg;
height: $icon-size-lg;
i, svg {
font-size: $icon-size-lg - .75;
}
+ .icon-text {
width: calc(100% - #{$icon-size-lg} - 1);
}
}
// Small icon
.icon-sm {
width: $icon-size-sm;
height: $icon-size-sm;
i, svg {
font-size: $icon-size-sm - .75;
}
+ .icon-text {
width: calc(100% - #{$icon-size-sm} - 1);
}
}

View File

@ -1,46 +0,0 @@
//
// List group
//
// Space list items
.list-group-space {
.list-group-item {
margin-bottom: 1.5rem;
@include border-radius($list-group-border-radius);
}
}
// Extended list group components
.list-group-img {
width: 3rem;
height: 3rem;
border-radius: 50%;
vertical-align: top;
margin: -.1rem 1.2rem 0 -.2rem;
}
.list-group-content {
flex: 1;
min-width: 0;
> p {
color: $gray-500;
line-height: 1.5;
margin: .2rem 0 0;
}
}
.list-group-heading {
font-size: $font-size-base;
color: $gray-800;
> small {
float: right;
color: $gray-500;
font-weight: 500;
}
}

View File

@ -1,10 +0,0 @@
//
// Map
//
.map-canvas {
position: relative;
width: 100%;
height: $map-height;
border-radius: $border-radius;
}

View File

@ -1,12 +0,0 @@
//
// Mask
//
.mask {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
@include transition($transition-base);
}

View File

@ -1,13 +0,0 @@
@mixin alert-variant($background, $border, $color) {
color: color-yiq($background);
@include gradient-bg($background);
border-color: $border;
hr {
border-top-color: darken($border, 5%);
}
.alert-link {
color: darken($color, 10%);
}
}

View File

@ -1,30 +0,0 @@
// Contextual backgrounds
@mixin bg-variant($parent, $color, $ignore-warning: true) {
#{$parent} {
background-color: $color !important;
}
a#{$parent},
button#{$parent} {
@include hover-focus {
background-color: darken($color, 10%) !important;
}
}
}
@mixin bg-gradient-variant($parent, $color, $ignore-warning: true) {
#{$parent} {
background: linear-gradient(87deg, $color 0, adjust-hue($color, 25%) 100%) !important;
}
}
@mixin bg-translucent-variant($parent, $color, $ignore-warning: true) {
#{$parent} {
background-color: darken(rgba($color, $translucent-color-opacity), 7%) !important;
}
a#{$parent},
button#{$parent} {
@include hover-focus {
background-color: darken(rgba($color, $translucent-color-opacity), 12%) !important;
}
}
}

View File

@ -1,12 +0,0 @@
@mixin badge-variant($bg) {
color: saturate(darken($bg, 10%), 10);
background-color: transparentize(lighten($bg, 25%), .5);
&[href] {
@include hover-focus {
color: color-yiq($bg);
text-decoration: none;
background-color: darken($bg, 10%);
}
}
}

View File

@ -1,105 +0,0 @@
@mixin button-variant($background, $border, $hover-background: darken($background, 0%), $hover-border: darken($border, 0%), $active-background: darken($background, 10%), $active-border: darken($border, 0%)) {
color: color-yiq($background);
@include gradient-bg($background);
border-color: $border;
@include box-shadow($btn-box-shadow);
@include hover {
color: color-yiq($hover-background);
@include gradient-bg($hover-background);
border-color: $hover-border;
}
&:focus,
&.focus {
// Avoid using mixin so we can pass custom focus shadow properly
@if $enable-shadows {
box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5);
}
@else {
box-shadow: 0 0 0 $btn-focus-width rgba($border, .5);
}
} // Disabled comes first so active can properly restyle
&.disabled,
&:disabled {
color: color-yiq($background);
background-color: $background;
border-color: $border;
}
&:not(:disabled):not(.disabled):active,
&:not(:disabled):not(.disabled).active,
.show>&.dropdown-toggle {
color: color-yiq($active-background);
background-color: $active-background;
@if $enable-gradients {
background-image: none; // Remove the gradient for the pressed/active state
}
border-color: $active-border;
&:focus {
// Avoid using mixin so we can pass custom focus shadow properly
@if $enable-shadows {
box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5);
}
@else {
box-shadow: 0 0 0 $btn-focus-width rgba($border, .5);
}
}
}
}
@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {
color: $color;
background-color: transparent;
background-image: none;
border-color: $color;
&:hover {
color: $color-hover;
background-color: $active-background;
border-color: $active-border;
}
&:focus,
&.focus {
box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);
}
&.disabled,
&:disabled {
color: $color;
background-color: transparent;
}
&:not(:disabled):not(.disabled):active,
&:not(:disabled):not(.disabled).active,
.show>&.dropdown-toggle {
color: color-yiq($active-background);
background-color: $active-background;
border-color: $active-border;
&:focus {
// Avoid using mixin so we can pass custom focus shadow properly
@if $enable-shadows and $btn-active-box-shadow !=none {
box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);
}
@else {
box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);
}
}
}
}
// Button sizes
@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {
padding: $padding-y $padding-x;
font-size: $font-size;
line-height: $line-height; // Manually declare to provide an override to the browser default
@if $enable-rounded {
border-radius: $border-radius;
}
@else {
border-radius: 0;
}
}

View File

@ -1,127 +0,0 @@
@mixin form-control-focus($ignore-warning: true) {
&:focus {
color: $input-focus-color;
background-color: $input-focus-bg;
border-color: $input-focus-border-color;
outline: 0;
// Avoid using mixin so we can pass custom focus shadow properly
@if $enable-shadows {
box-shadow: $input-box-shadow, $input-focus-box-shadow;
} @else {
box-shadow: $input-focus-box-shadow;
}
}
}
@mixin form-validation-state($state, $color, $icon) {
.#{$state}-feedback {
display: none;
width: 100%;
margin-top: $form-feedback-margin-top;
font-size: $form-feedback-font-size;
color: $color;
}
.#{$state}-tooltip {
position: absolute;
top: 100%;
z-index: 5;
display: none;
max-width: 100%; // Contain to parent when possible
padding: .5rem;
margin-top: .1rem;
font-size: .875rem;
line-height: 1;
color: #fff;
background-color: rgba($color, .8);
border-radius: .2rem;
}
.form-control,
.custom-select {
.was-validated &:#{$state},
&.is-#{$state} {
border-color: $color;
&:focus {
border-color: $color;
//box-shadow: 0 1px $input-focus-width 0 rgba($color, .75);
}
~ .#{$state}-feedback,
~ .#{$state}-tooltip {
display: block;
}
}
}
.form-check-input {
.was-validated &:#{$state},
&.is-#{$state} {
~ .form-check-label {
color: $color;
}
~ .#{$state}-feedback,
~ .#{$state}-tooltip {
display: block;
}
}
}
.custom-control-input {
.was-validated &:#{$state},
&.is-#{$state} {
~ .custom-control-label {
color: $color;
&::before {
background-color: lighten($color, 25%);
border-color: lighten($color, 25%);
}
}
~ .#{$state}-feedback,
~ .#{$state}-tooltip {
display: block;
}
&:checked {
~ .custom-control-label::before {
@include gradient-bg(lighten($color, 10%));
border-color: lighten($color, 25%);
}
}
&:focus {
~ .custom-control-label::before {
box-shadow: 0 0 0 1px $body-bg, 0 0 0 $input-focus-width rgba($color, .25);
}
}
}
}
// custom file
.custom-file-input {
.was-validated &:#{$state},
&.is-#{$state} {
~ .custom-file-label {
border-color: $color;
&::before { border-color: inherit; }
}
~ .#{$state}-feedback,
~ .#{$state}-tooltip {
display: block;
}
&:focus {
~ .custom-file-label {
box-shadow: 0 0 0 $input-focus-width rgba($color, .25);
}
}
}
}
}

View File

@ -1,4 +0,0 @@
@mixin icon-shape-variant($color) {
color: saturate(darken($color, 10%), 10);
background-color: transparentize(lighten($color, 10%), .5);
}

View File

@ -1,23 +0,0 @@
@mixin modal-variant($background) {
.modal-title {
color: color-yiq($background);
}
.modal-header,
.modal-footer {
border-color: rgba(color-yiq($background), .075);
}
.modal-content {
background-color: $background;
color: color-yiq($background);
.heading {
color: color-yiq($background);
}
}
.close {
&>span:not(.sr-only) {
color: $white;
}
}
}

View File

@ -1,36 +0,0 @@
@mixin popover-variant($background) {
background-color: $background;
.popover-header {
background-color: $background;
color: color-yiq($background);
}
.popover-body {
color: color-yiq($background);
}
.popover-header{
border-color: rgba(color-yiq($background), .2);
}
&.bs-popover-top {
.arrow::after {
border-top-color: $background;
}
}
&.bs-popover-right {
.arrow::after {
border-right-color: $background;
}
}
&.bs-popover-bottom {
.arrow::after {
border-bottom-color: $background;
}
}
&.bs-popover-left {
.arrow::after {
border-left-color: $background;
}
}
}

View File

@ -1,25 +0,0 @@
//
// Modal
//
// Fluid modal
.modal-fluid {
.modal-dialog {
margin-top: 0;
margin-bottom: 0;
}
.modal-content {
border-radius: 0;
}
}
// Background color variations
@each $color, $value in $theme-colors {
.modal-#{$color} {
@include modal-variant($value);
}
}

View File

@ -1,125 +0,0 @@
//
// Navabar collapse
//
// Collapse
.navbar-collapse-header {
display: none;
}
@include media-breakpoint-down(sm) {
.navbar-nav {
.nav-link {
padding: .625rem 0;
color: theme-color("default") !important;
}
.dropdown-menu {
box-shadow: none;
min-width: auto;
.media {
svg {
width: 30px;
}
}
}
}
.navbar-collapse {
width: calc(100% - 1.4rem);
position: absolute;
top: 0;
left: 0;
right: 0;
z-index: 1050;
margin: .7rem;
overflow-y: auto;
height: auto !important;
opacity: 0;
.navbar-toggler {
width: 20px;
height: 20px;
position: relative;
cursor: pointer;
display: inline-block;
padding: 0;
span {
display: block;
position: absolute;
width: 100%;
height: 2px;
border-radius: 2px;
opacity: 1;
background: #283448;
}
:nth-child(1) {
transform: rotate(135deg);
}
:nth-child(2) {
transform: rotate(-135deg);
}
}
.navbar-collapse-header {
display: block;
padding-bottom: 1rem;
margin-bottom: 1rem;
border-bottom: 1px solid rgba(0, 0, 0, .1);
}
.collapse-brand {
img {
height: 36px;
}
}
.collapse-close {
text-align: right;
}
}
.navbar-collapse.collapsing,
.navbar-collapse.show {
padding: 1.5rem;
border-radius: $border-radius;
background: #FFF;
box-shadow: 0 50px 100px rgba(50,50,93,.1),0 15px 35px rgba(50,50,93,.15),0 5px 15px rgba(0,0,0,.1);
animation: show-navbar-collapse .2s ease forwards;
}
.navbar-collapse.collapsing-out {
animation: hide-navbar-collapse .2s ease forwards;
}
}
@keyframes show-navbar-collapse {
0% {
opacity: 0;
transform: scale(.95);
transform-origin: 100% 0;
}
100% {
opacity: 1;
transform: scale(1);
}
}
@keyframes hide-navbar-collapse {
from {
opacity: 1;
transform: scale(1);
transform-origin: 100% 0;
}
to {
opacity: 0;
transform: scale(.95);
}
}

View File

@ -1,101 +0,0 @@
// Dropdown menu
@include media-breakpoint-up(md) {
.navbar {
.dropdown-menu {
opacity: 0;
pointer-events: none;
margin: 0;
}
.dropdown-menu-arrow {
&:before {
background: $dropdown-bg;
box-shadow: none;
content: '';
display: block;
height: 12px;
width: 12px;
left: 20px;
position: absolute;
bottom: 100%;
transform: rotate(-45deg) translateY(12px);
z-index: -5;
border-radius: 2px;
}
}
.dropdown-menu-right {
&:before {
right: 20px;
left: auto;
}
}
&:not(.navbar-nav-hover) {
.dropdown-menu {
&.show {
opacity: 1;
pointer-events: auto;
animation: show-navbar-dropdown .25s ease forwards;
}
&.close {
display: block;
animation: hide-navbar-dropdown .15s ease backwards;
}
}
}
&.navbar-nav-hover {
.dropdown-menu {
opacity: 0;
display: block;
pointer-events: none;
transform: translate(0, 10px) perspective(200px) rotateX(-2deg);
transition: visibility 0.25s, opacity 0.25s, transform 0.25s;
}
.nav-item.dropdown:hover > .dropdown-menu {
display: block;
opacity: 1;
pointer-events: auto;
visibility: visible;
transform: translate(0, 0);
animation: none;
}
}
.dropdown-menu-inner {
position: relative;
padding: 1rem;
}
// Keyframes
@keyframes show-navbar-dropdown {
0% {
opacity: 0;
transform: translate(0, 10px) perspective(200px) rotateX(-2deg);
transition: visibility 0.25s, opacity 0.25s, transform 0.25s;
}
100% {
transform: translate(0, 0);
opacity: 1;
}
}
@keyframes hide-navbar-dropdown {
from {
opacity: 1;
}
to {
opacity: 0;
transform: translate(0, 10px);
}
}
}
}

View File

@ -1,69 +0,0 @@
//
// Navbar search
//
.navbar-search {
.input-group {
border-radius: $navbar-search-border-radius;
border: $navbar-search-border-width solid;
background-color: transparent;
.input-group-text {
background-color: transparent;
padding-left: 1rem;
}
}
.form-control {
width: $navbar-search-width;
background-color: transparent;
}
}
.navbar-search-dark {
.input-group {
border-color: $navbar-search-dark-border-color;
}
.input-group-text {
color: $navbar-search-dark-color;
}
.form-control {
color: $navbar-search-dark-focus-color;
&::placeholder {
color: $navbar-search-dark-color;
}
}
.focused {
.input-group {
border-color: $navbar-search-dark-focus-border-color;
}
}
}
.navbar-search-light {
.input-group {
border-color: $navbar-search-light-border-color;
}
.input-group-text {
color: $navbar-search-light-color;
}
.form-control {
color: $navbar-search-light-focus-color;
&::placeholder {
color: $navbar-search-light-color;
}
}
.focused {
.input-group {
border-color: $navbar-search-light-focus-border-color;
}
}
}

View File

@ -1,286 +0,0 @@
//
// Vertical navbar
//
// Vertical
//
// Creates a vertically aligned version of the navbar
.navbar-vertical {
box-shadow: $navbar-vertical-box-shadow;
.navbar {
border-width: 0 0 1px 0;
border-style: solid;
}
// Navbar light
.navbar-light {
background-color: $navbar-light-bg;
border-color: $navbar-light-border-color;
}
// Navbar brand
.navbar-brand {
margin-right: 0;
}
.navbar-brand-img,
.navbar-brand > img {
max-width: 100%;
max-height: 2rem;
}
// Navbar collapse
@include media-breakpoint-up(md) {
.navbar-collapse {
margin-left: -$navbar-padding-x;
margin-right: -$navbar-padding-x;
padding-left: $navbar-padding-x;
padding-right: $navbar-padding-x;
&:before {
content: '';
display: block;
margin: $navbar-padding-y (-$navbar-padding-x);
}
}
}
// Navbar navigaton
.navbar-nav {
margin-left: -$navbar-padding-x;
margin-right: -$navbar-padding-x;
// Navbar link
.nav-link {
padding-left: $navbar-padding-x;
padding-right: $navbar-padding-x;
font-size: $navbar-nav-link-font-size;
&.active {
position: relative;
&:before {
content: '';
position: absolute;
left: 0;
top: $nav-link-padding-y;
bottom: $nav-link-padding-y;
border-left: 2px solid $primary;
}
}
// Icon
> i {
min-width: $navbar-icon-min-width;
font-size: .9375rem;
line-height: ($font-size-base * $line-height-base);
}
// Dropdown
.dropdown-menu {
border: none;
.dropdown-menu {
margin-left: $dropdown-item-padding-x / 2;
}
}
}
}
// Navbar navigation
.navbar-nav .nav-link {
display: flex;
align-items: center;
}
.navbar-nav .nav-link[data-toggle="collapse"] {
&:after {
display: inline-block;
font-style: normal;
font-variant: normal;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
font-family: 'Font Awesome 5 Free';
font-weight: 700;
content: "\f105";
margin-left: auto;
color: $text-muted;
transition: $transition-base;
} // Expanded
&[aria-expanded="true"] {
&:after {
transform: rotate(90deg);
}
}
}
// Second level
.navbar-nav .nav .nav-link {
padding-left: $navbar-padding-x + $navbar-icon-min-width;
}
// Third level
.navbar-nav .nav .nav .nav-link {
padding-left: $navbar-padding-x * 1.5 + $navbar-icon-min-width;
}
// Navbar heading
.navbar-heading {
padding-top: $nav-link-padding-y;
padding-bottom: $nav-link-padding-y;
font-size: $font-size-xs;
text-transform: uppercase;
letter-spacing: .04em;
}
// Expanded navbar specific styles
&.navbar-expand {
@each $breakpoint,
$dimension in $grid-breakpoints {
&-#{$breakpoint} {
@include media-breakpoint-up(#{$breakpoint}) {
display: block;
position: fixed;
top: 0;
bottom: 0;
width: 100%;
max-width: $navbar-vertical-width;
padding-left: $navbar-vertical-padding-x;
padding-right: $navbar-vertical-padding-x;
overflow-y: auto;
// Container
>[class*="container"] {
flex-direction: column;
align-items: stretch;
min-height: 100%;
padding-left: 0;
padding-right: 0; // Target IE 10 & 11
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
min-height: none;
height: 100%;
}
}
// Fixes the vertical navbar to the left
&.fixed-left {
left: 0;
border-width: 0 1px 0 0;
}
// Fixed the vertical navbar to the right
&.fixed-right {
right: 0;
border-width: 0 0 0 1px;
}
// Navbar collapse
.navbar-collapse {
flex: 1;
display: flex;
flex-direction: column;
align-items: stretch;
margin-left: -$navbar-vertical-padding-x;
margin-right: -$navbar-vertical-padding-x;
padding-left: $navbar-vertical-padding-x;
padding-right: $navbar-vertical-padding-x;
> * {
min-width: 100%;
}
}
// Navbar navigation
.navbar-nav {
flex-direction: column;
margin-left: -$navbar-vertical-padding-x;
margin-right: -$navbar-vertical-padding-x;
}
.navbar-nav .nav-link {
padding: $navbar-vertical-nav-link-padding-y $navbar-vertical-nav-link-padding-x;
&.active {
&:before {
top: $nav-link-padding-y;
bottom: $nav-link-padding-y;
left: 0;
right: auto;
border-left: 2px solid $primary;
border-bottom: 0;
}
}
}
// Second level
.navbar-nav .nav .nav-link {
padding-left: $navbar-vertical-padding-x + $navbar-icon-min-width;
}
// Third level
.navbar-nav .nav .nav .nav-link {
padding-left: $navbar-vertical-padding-x * 1.5 + $navbar-icon-min-width;
}
// Navbar brand
.navbar-brand {
display: block;
text-align: center;
padding-top: (2rem - $navbar-padding-y);
padding-bottom: (2rem - $navbar-padding-y);
}
.navbar-brand-img {
max-height: 2.5rem;
}
// Navbar user
.navbar-user {
margin-left: -$navbar-vertical-padding-x;
margin-right: -$navbar-vertical-padding-x;
padding-top: $spacer;
padding-bottom: $spacer - $navbar-padding-y;
padding-left: $navbar-vertical-padding-x;
padding-right: $navbar-vertical-padding-x;
border-top: 1px solid $border-color;
// Dropup menu
.dropup .dropdown-menu {
left: 50%;
transform: translateX(-50%);
}
}
}
}
}
}
}

View File

@ -1,153 +0,0 @@
//
// Navbar
//
// Navbar links
.navbar-horizontal {
.navbar-nav {
.nav-link {
font-size: $navbar-nav-link-font-size;
font-weight: $navbar-nav-link-font-weight;
text-transform: $navbar-nav-link-text-transform;
letter-spacing: $navbar-nav-link-letter-spacing;
@include transition($navbar-transition);
.nav-link-inner--text {
margin-left: .25rem;
}
}
}
// Navbar brand (logo)
.navbar-brand {
font-size: $font-size-sm;
font-weight: 600;
text-transform: uppercase;
font-size: .875rem;
letter-spacing: .05px;
img {
height: 30px;
}
}
.navbar-dark {
.navbar-brand {
color: $white;
}
}
.navbar-light {
.navbar-brand {
color: $gray-800;
}
}
.navbar-nav {
.nav-item {
.media:not(:last-child){
margin-bottom: 1.5rem;
}
}
}
@include media-breakpoint-up(lg) {
.navbar-nav {
.nav-item {
margin-right: .5rem;
[data-toggle="dropdown"]::after {
transition: $transition-base;
}
&.show {
[data-toggle="dropdown"]::after {
transform: rotate(180deg);
}
}
}
.nav-link {
padding-top: $navbar-nav-link-padding-y;
padding-bottom: $navbar-nav-link-padding-y;
border-radius: $navbar-nav-link-border-radius;
i {
margin-right: .625rem;
}
}
.nav-link-icon {
padding-left: .5rem !important;
padding-right: .5rem !important;
font-size: 1rem;
border-radius: $navbar-nav-link-border-radius;
i {
margin-right: 0;
}
}
}
}
// Transparent navbar
.navbar-transparent {
position: absolute;
top: 0;
width: 100%;
z-index: 100;
background-color: transparent;
border: 0;
box-shadow: none;
.navbar-brand {
color: rgba(255, 255, 255, 1);
}
.navbar-toggler {
color: rgba(255, 255, 255, 1);
}
.navbar-toggler-icon {
background-image: $navbar-dark-toggler-icon-bg;
}
}
@include media-breakpoint-up(md) {
.navbar-transparent {
.navbar-nav {
.nav-link {
color: $navbar-dark-color;
@include hover-focus {
color: $navbar-dark-hover-color;
}
&.disabled {
color: $navbar-dark-disabled-color;
}
}
.show > .nav-link,
.active > .nav-link,
.nav-link.show,
.nav-link.active {
color: $navbar-dark-active-color;
}
}
.navbar-brand {
color: $navbar-dark-color;
@include hover-focus {
color: $navbar-dark-color;
}
}
}
}
}

View File

@ -1,66 +0,0 @@
//
// Nav pills
//
// General styles
.nav-pills {
.nav-item:not(:last-child) {
padding-right: $nav-pills-space-x;
}
.nav-link {
padding: $nav-pills-padding-y $nav-pills-padding-x;
color: $nav-pills-link-color;
font-weight: 500;
font-size: $font-size-sm;
box-shadow: $nav-pills-box-shadow;
background-color: $nav-pills-bg;
transition: $transition-base;
&:hover {
color: $nav-pills-link-hover-color;
}
}
.nav-link.active,
.show > .nav-link {
color: $nav-pills-link-active-color;
background-color: $nav-pills-link-active-bg;
}
@include media-breakpoint-down(xs) {
.nav-item {
margin-bottom: $spacer;
}
}
}
@include media-breakpoint-down(sm) {
.nav-pills:not(.nav-pills-circle) {
.nav-item {
padding-right: 0;
}
}
}
// Rounded circle nav pills
.nav-pills-circle {
.nav-link {
text-align: center;
height: 60px;
width: 60px;
padding: 0;
line-height: 60px;
border-radius: 50%;
}
.nav-link-icon {
i, svg {
font-size: 1rem;
}
}
}

View File

@ -1,33 +0,0 @@
//
// Nav
//
// Nav wrapper (container)
// Nav wrapper
.nav-wrapper {
padding: 1rem 0;
@include border-top-radius($card-border-radius);
+ .card {
@include border-top-radius(0);
@include border-bottom-radius($card-border-radius);
}
}
// Nav links
.nav-link {
color: $nav-link-color;
&:hover {
color: $nav-link-hover-color;
}
i.ni {
position: relative;
top: 2px;
}
}

View File

@ -1,48 +0,0 @@
//
// Pagination
//
.page-item {
&.active .page-link {
box-shadow: $pagination-active-box-shadow;
}
.page-link,
span {
display: flex;
align-items: center;
justify-content: center;
padding: 0;
margin: 0 3px;
border-radius: 50% !important;
width: 36px;
height: 36px;
font-size: $font-size-sm;
}
}
// Size variations
.pagination-lg {
.page-item {
.page-link,
span {
width: 46px;
height: 46px;
line-height: 46px;
}
}
}
.pagination-sm {
.page-item {
.page-link,
span {
width: 30px;
height: 30px;
line-height: 30px;
}
}
}

View File

@ -1,21 +0,0 @@
//
// Popover
//
.popover {
border: 0;
}
.popover-header {
font-weight: $font-weight-bold;
}
// Alternative colors
@each $color, $value in $theme-colors {
.popover-#{$color} {
@include popover-variant($value);
}
}

View File

@ -1,79 +0,0 @@
//
// Progress
//
// Progress container
.progress-wrapper {
position: relative;
padding-top: 1.5rem;
}
// General styles
.progress {
height: 8px;
margin-bottom: $spacer;
overflow: hidden;
border-radius: $border-radius-sm;
background-color: $progress-bg;
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
.sr-only {
width: auto;
height: 20px;
margin: 0 0 0 30px;
left: 0;
clip: auto;
line-height: 20px;
font-size: 13px;
}
}
// Progress inner elements
.progress-heading {
font-size: 14px;
font-weight: 500;
margin: 0 0 2px;
padding: 0;
}
.progress-bar {
box-shadow: none;
border-radius: 0;
height: auto;
}
.progress-info{
margin-bottom: .5rem;
display: flex;
align-items: center;
justify-content: space-between;
}
.progress-label {
span {
display: inline-block;
color: $primary;
font-size: .625rem;
font-weight: 600;
text-transform: uppercase;
background: rgba($primary, .1);
padding: .25rem 1rem;
border-radius: 30px;
}
}
.progress-percentage {
text-align: right;
span {
display: inline-block;
color: $gray-600;
font-size: .875rem;
font-weight: 600;
}
}

View File

@ -1,54 +0,0 @@
//
// Separator
// add svg on top or bottom of a section for a more stylish visual
//
.separator {
position: absolute;
top: auto;
left: 0;
right: 0;
width: 100%;
height: 150px;
transform: translateZ(0);
overflow: hidden;
pointer-events: none;
svg {
position: absolute;
pointer-events: none;
}
}
.separator-top {
top: 0;
bottom: auto;
svg {
top: 0;
}
}
.separator-bottom {
top: auto;
bottom: 0;
svg {
bottom: 0;
}
}
.separator-inverse {
transform: rotate(180deg);
}
// Styles
.separator-skew {
height: 60px;
@include media-breakpoint-up(xl) {
height: 70px;
}
}

View File

@ -1,118 +0,0 @@
//
// Table
//
// General styles
.table {
thead th {
padding-top: $table-head-spacer-y;
padding-bottom: $table-head-spacer-y;
font-size: $table-head-font-size;
text-transform: $table-head-text-transform;
letter-spacing: $table-head-letter-spacing;
border-bottom: $table-border-width solid $table-border-color;
}
th {
font-weight: $table-head-font-weight;
}
td {
.progress {
height: 3px;
width: 120px;
margin: 0;
}
}
td,
th {
font-size: $table-body-font-size;
white-space: nowrap;
}
// Vetical align table content
&.align-items-center {
td,
th {
vertical-align: middle;
}
}
// Styles for dark table
.thead-dark {
th {
background-color: $table-dark-head-bg;
color: $table-dark-head-color;
}
}
// Styles for light table
.thead-light {
th {
background-color: $table-head-bg;
color: $table-head-color;
}
}
}
// Add transition for hover state
.table-hover {
tr {
@include transition($transition-base);
}
}
// Flush tables
.table-flush {
td,
th {
border-left: 0;
border-right: 0;
}
tbody {
tr {
&:first-child {
td,
th {
border-top: 0;
}
}
&:last-child {
td,
th {
border-bottom: 0;
}
}
}
}
}
// Tables inside cards
.card {
.table {
margin-bottom: 0;
td,
th {
padding-left: $card-spacer-x;
padding-right: $card-spacer-x;
}
}
}

View File

@ -1,22 +0,0 @@
//
// Article
//
article {
h4:not(:first-child),
h5:not(:first-child) {
margin-top: 3rem;
}
h4, h5 {
margin-bottom: 1.5rem;
}
figure {
margin: 3rem 0;
}
h5 + figure {
margin-top: 0;
}
}

View File

@ -1,14 +0,0 @@
//
// Display
//
.display-1,
.display-2,
.display-3,
.display-4 {
span {
display: block;
font-weight: $font-weight-light;
}
}

View File

@ -1,52 +0,0 @@
//
// Heading
//
// General styles
.heading {
letter-spacing: $heading-letter-spacing;
font-size: $heading-font-size;
text-transform: $heading-text-transform;
font-weight: $heading-font-weight;
}
// Heading variations
.heading-small {
padding-top: .25rem;
padding-bottom: .25rem;
font-size: .75rem;
text-transform: uppercase;
letter-spacing: .04em;
}
.heading-title {
letter-spacing: $heading-title-letter-spacing;
font-size: $heading-title-font-size;
font-weight: $heading-title-font-weight;
text-transform: $heading-title-text-transform;
}
.heading-section {
letter-spacing: $heading-section-letter-spacing;
font-size: $heading-section-font-size;
font-weight: $heading-section-font-weight;
text-transform: $heading-section-text-transform;
img {
display: block;
width: 72px;
height: 72px;
margin-bottom: 1.5rem;
}
&.text-center {
img {
margin-left: auto;
margin-right: auto;
}
}
}

View File

@ -1,27 +0,0 @@
//
// Type
//
// Paragraphs
p {
font-size: $paragraph-font-size;
font-weight: $paragraph-font-weight;
line-height: $paragraph-line-height;
}
.lead {
font-size: $lead-font-size;
font-weight: $lead-font-weight;
line-height: $paragraph-line-height;
margin-top: 1.5rem;
+ .btn-wrapper {
margin-top: 3rem;
}
}
.description {
font-size: $font-size-sm;
}

View File

@ -1,51 +0,0 @@
//
// Backgrounds
//
@each $color, $value in $colors {
@include bg-variant(".bg-#{$color}", $value, $ignore-warning: true);
}
@each $color, $value in $theme-colors {
@include bg-gradient-variant(".bg-gradient-#{$color}", $value, $ignore-warning: true);
}
@each $color, $value in $colors {
@include bg-gradient-variant(".bg-gradient-#{$color}", $value, $ignore-warning: true);
}
// Background colors with transparency
@each $color, $value in $theme-colors {
@include bg-translucent-variant(".bg-translucent-#{$color}", $value, $ignore-warning: true);
}
// Sections backgrounds
@each $color, $value in $section-colors {
@include bg-variant(".section-#{$color}", $value, $ignore-warning: true);
}
@each $color, $value in $theme-colors {
@include bg-gradient-variant(".bg-gradient-#{$color}", $value, $ignore-warning: true);
}
// Shape (svg) fill colors
@each $color, $value in $theme-colors {
.fill-#{$color} {
fill: $value;
}
.stroke-#{$color} {
stroke: $value;
}
}
.fill-opacity-8 {
fill-opacity: .8;
}

View File

@ -1,37 +0,0 @@
//
// Blurable
// add a blue effect on hover on any element with .blur--hover class
//
.blur--hover {
position: relative;
.blur-item {
transition: 1s cubic-bezier(.19,1,.22,1);
will-change: transform;
filter: blur(0);
opacity: 1;
}
.blur-hidden {
position: absolute;
top: calc(50% + 7px);
left: 50%;
transform: translate(-50%, -50%);
opacity: 0;
transition: $transition-base;
z-index: 100;
}
&:hover {
.blur-item {
opacity: .8;
filter: blur(10px);
transform: scale(.95);
z-index: 1;
}
.blur-hidden {
opacity: 1;
top: 50%;
}
}
}

View File

@ -1,64 +0,0 @@
//
// Floating
// floating animation utility class
//
.floating {
animation: floating 3s ease infinite;
will-change: transform;
&:hover {
animation-play-state: paused;
}
}
// Size variations
.floating-lg {
animation: floating-lg 3s ease infinite;
}
.floating-sm {
animation: floating-sm 3s ease infinite;
}
// Keyframes
@keyframes floating-lg {
0% {
transform: translateY(0px)
}
50% {
transform: translateY(15px)
}
100% {
transform: translateY(0px)
}
}
@keyframes floating {
0% {
transform: translateY(0px)
}
50% {
transform: translateY(10px)
}
100% {
transform: translateY(0px)
}
}
@keyframes floating-sm {
0% {
transform: translateY(0px)
}
50% {
transform: translateY(5px)
}
100% {
transform: translateY(0px)
}
}

View File

@ -1,18 +0,0 @@
//
// Helper
// helper classes for different cases
//
// Clearfix for sections that use float property
.floatfix {
&:before,
&:after {
content: '';
display: table;
}
&:after {
clear: both;
}
}

View File

@ -1,9 +0,0 @@
//
// Image
//
.img-center {
display: block;
margin-left: auto;
margin-right: auto;
}

View File

@ -1,35 +0,0 @@
//
// Opacity
// modify the transparency of an element with this quick modifier classes
//
.opacity-1 {
opacity: .1 !important;
}
.opacity-2 {
opacity: .2 !important;
}
.opacity-3 {
opacity: .3 !important;
}
.opacity-4 {
opacity: .4 !important;
}
.opacity-5 {
opacity: .5 !important;
}
.opacity-6 {
opacity: .6 !important;
}
.opacity-7 {
opacity: .7 !important;
}
.opacity-8 {
opacity: .8 !important;
}
.opacity-8 {
opacity: .9 !important;
}
.opacity-10 {
opacity: 1 !important;
}

View File

@ -1,11 +0,0 @@
//
// Overflow
//
.overflow-visible {
overflow: visible !important;
}
.overflow-hidden {
overflow: hidden !important;
}

View File

@ -1,25 +0,0 @@
//
// Position
// modifier classes to be applied on an abosolute positioned element
// use it next to .position-absolute class
//
@each $size, $value in $spacers {
.top-#{$size} {
top: $value;
}
.right-#{$size} {
right: $value;
}
.bottom-#{$size} {
bottom: $value;
}
.left-#{$size} {
left: $value;
}
}
.center {
left: 50%;
transform: translateX(-50%);
}

View File

@ -1,28 +0,0 @@
//
// Shadows
//
// General styles
[class*="shadow"] {
@if $enable-transitions {
transition: $transition-base;
}
}
// Size variations
.shadow-sm--hover:hover {
box-shadow: $box-shadow-sm !important;
}
.shadow--hover:hover {
box-shadow: $box-shadow !important;
}
.shadow-lg--hover:hover {
box-shadow: $box-shadow-lg !important;
}
.shadow-none--hover:hover {
box-shadow: none !important;
}

View File

@ -1,7 +0,0 @@
//
// Height
//
.h-100vh {
height: 100vh !important;
}

View File

@ -1,107 +0,0 @@
//
// Spacing
//
.row.row-grid > [class*="col-"] + [class*="col-"] {
margin-top: 3rem;
}
@include media-breakpoint-up(lg) {
.row.row-grid > [class*="col-lg-"] + [class*="col-lg-"] {
margin-top: 0;
}
}
@include media-breakpoint-up(md) {
.row.row-grid > [class*="col-md-"] + [class*="col-md-"] {
margin-top: 0;
}
}
@include media-breakpoint-up(sm) {
.row.row-grid > [class*="col-sm-"] + [class*="col-sm-"] {
margin-top: 0;
}
}
.row-grid + .row-grid {
margin-top: 3rem;
}
// Negative margins and paddings
@media(min-width: 992px) {
[class*="mt--"],
[class*="mr--"],
[class*="mb--"],
[class*="ml--"] {
}
// Large negative margins in pixels
.mt--100 {
margin-top: -100px !important;
}
.mr--100 {
margin-right: -100px !important;
}
.mb--100 {
margin-bottom: -100px !important;
}
.ml--100 {
margin-left: -100px !important;
}
.mt--150 {
margin-top: -150px !important;
}
.mb--150 {
margin-bottom: -150px !important;
}
.mt--200 {
margin-top: -200px !important;
}
.mb--200 {
margin-bottom: -200px !important;
}
.mt--300 {
margin-top: -300px !important;
}
.mb--300 {
margin-bottom: -300px !important;
}
// Large margins in pixels
.pt-100 {
padding-top: 100px !important;
}
.pb-100 {
padding-bottom: 100px !important;
}
.pt-150 {
padding-top: 150px !important;
}
.pb-150 {
padding-bottom: 150px !important;
}
.pt-200 {
padding-top: 200px !important;
}
.pb-200 {
padding-bottom: 200px !important;
}
.pt-250 {
padding-top: 250px !important;
}
.pb-250 {
padding-bottom: 250px !important;
}
.pt-300 {
padding-top: 300px!important;
}
.pb-300 {
padding-bottom: 300px!important;
}
}

View File

@ -1,49 +0,0 @@
// Weight and italics
.font-weight-300 { font-weight: 300 !important; }
.font-weight-400 { font-weight: 400 !important; }
.font-weight-500 { font-weight: 500 !important; }
.font-weight-600 { font-weight: 600 !important; }
.font-weight-700 { font-weight: 700 !important; }
.font-weight-800 { font-weight: 800 !important; }
.font-weight-900 { font-weight: 900 !important; }
// Text decorations
.text-underline { text-decoration: underline; }
.text-through { text-decoration: line-through; }
// Text size
.text-xs { font-size: $font-size-xs !important; }
.text-sm { font-size: $font-size-sm !important; }
.text-lg { font-size: $font-size-lg !important; }
.text-xl { font-size: $font-size-xl !important; }
// Line heights
.lh-100 { line-height: 1; }
.lh-110 { line-height: 1.1; }
.lh-120 { line-height: 1.2; }
.lh-130 { line-height: 1.3; }
.lh-140 { line-height: 1.4; }
.lh-150 { line-height: 1.5; }
.lh-160 { line-height: 1.6; }
.lh-170 { line-height: 1.7; }
.lh-180 { line-height: 1.8; }
// Letter spacings
.ls-1 { letter-spacing: .0625rem; }
.ls-15 { letter-spacing: .09375rem; }
.ls-2 { letter-spacing: 0.125rem; }
// Color variations
@each $color, $value in $colors {
@include text-emphasis-variant(".text-#{$color}", $value);
}

View File

@ -1,13 +0,0 @@
//
// Tranform
//
@include media-breakpoint-up(lg) {
.transform-perspective-right {
transform: scale(1) perspective(1040px) rotateY(-11deg) rotateX(2deg) rotate(2deg);
}
.transform-perspective-left{
transform: scale(1) perspective(2000px) rotateY(11deg) rotateX(2deg) rotate(-2deg)
}
}

View File

@ -1,72 +0,0 @@
%active-day {
background: $datepicker-active-background;
color: $datepicker-active-color;
box-shadow: $datepicker-active-box-shadow;
border: none;
}
.flatpickr-calendar {
@include box-shadow($dropdown-box-shadow);
padding: $datepicker-dropdown-padding;
width: 347px;
color: $gray-700;
.flatpickr-weekday {
text-align: center;
font-size: $font-size-sm;
color: $gray-700;
font-weight: normal;
}
.flatpickr-day {
border: none;
}
.flatpickr-day:hover {
@extend %active-day;
}
.flatpickr-day.selected {
@extend %active-day;
&:hover {
@extend %active-day;
}
}
.flatpickr-day.today {
border: 1px solid $datepicker-active-background;
&:hover {
background: $datepicker-active-background;
color: $datepicker-active-color;
}
}
.flatpickr-day.inRange {
background: $datepicker-active-background !important;
color: $datepicker-active-color;
box-shadow: -5px 0 0 $datepicker-active-background, 5px 0 0 $datepicker-active-background;
border: none !important;
}
.flatpickr-day.startRange, .flatpickr-day.endRange {
background: $datepicker-active-background;
}
.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)),
.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)),
.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)) {
box-shadow: -10px 0 0 $datepicker-active-background;
}
.flatpickr-months .flatpickr-prev-month:hover svg,
.flatpickr-months .flatpickr-next-month:hover svg{
fill: $datepicker-active-background;
}
.flatpickr-current-month span.cur-month,
.flatpickr-current-month input.cur-year{
padding: 0 10px;
color: $gray-700;
font-size: $font-size-sm;
font-weight: 500;
&:hover {
background: $gray-200;
border-radius: $datepicker-header-cell-border-radius;
}
}
}

View File

@ -1,25 +0,0 @@
//
// Headroom
//
.headroom {
will-change: transform;
background-color: inherit;
@include transition($transition-base);
}
.headroom--pinned {
@extend .position-fixed;
transform: translateY(0%);
}
.headroom--unpinned {
@extend .position-fixed;
transform: translateY(-100%);
}
.headroom--not-top {
padding-top: .5rem;
padding-bottom: .5rem;
background-color: theme-color("default") !important;
box-shadow: 0 1px 10px rgba(130, 130, 134, 0.1);
}

View File

@ -1,410 +0,0 @@
//
// NoUi Slider
//
// Original styles
.noUi-target,
.noUi-target * {
-webkit-touch-callout: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-user-select: none;
touch-action: none;
user-select: none;
box-sizing: border-box;
}
.noUi-target {
position: relative;
direction: ltr;
}
.noUi-base,
.noUi-connects {
width: 100%;
height: 100%;
position: relative;
z-index: 1;
}
// Wrapper for all connect elements
.noUi-connects {
overflow: hidden;
z-index: 0;
}
.noUi-connect,
.noUi-origin {
will-change: transform;
position: absolute;
z-index: 1;
top: 0;
left: 0;
height: 100%;
width: 100%;
transform-origin: 0 0;
}
html:not([dir="rtl"]) .noUi-horizontal .noUi-origin {
left: 100%;
width: 10%;
right: 0;
}
.noUi-vertical .noUi-origin {
width: 0;
}
.noUi-horizontal .noUi-origin {
height: 0;
}
.noUi-handle {
position: absolute;
}
.noUi-state-tap .noUi-connect,
.noUi-state-tap .noUi-origin {
transition: transform .3s;
}
.noUi-state-drag * {
cursor: inherit !important;
}
.noUi-horizontal {
height: $noui-target-thickness;
}
.noUi-horizontal .noUi-handle {
width: 34px;
height: 28px;
left: -17px;
top: -6px;
}
.noUi-vertical {
width: $noui-target-thickness;
}
.noUi-vertical .noUi-handle {
width: 28px;
height: 34px;
left: -6px;
top: -17px;
}
html:not([dir="rtl"]) .noUi-horizontal .noUi-handle {
left: auto;
}
.noUi-connects {
border-radius: 3px;
}
.noUi-connect {
background: $noui-slider-connect-bg;
}
.noUi-draggable {
cursor: ew-resize;
}
.noUi-vertical .noUi-draggable {
cursor: ns-resize;
}
.noUi-handle {
border: 1px solid #D9D9D9;
border-radius: 3px;
background: #FFF;
cursor: default;
box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB;
outline: none;
}
.noUi-active {
outline: none;
}
/* Disabled state;
*/
[disabled] .noUi-connect {
background: #B8B8B8;
}
[disabled].noUi-target,
[disabled].noUi-handle,
[disabled] .noUi-handle {
cursor: not-allowed;
}
/* Base;
*
*/
.noUi-pips,
.noUi-pips * {
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.noUi-pips {
position: absolute;
color: #999;
}
/* Values;
*
*/
.noUi-value {
position: absolute;
white-space: nowrap;
text-align: center;
}
.noUi-value-sub {
color: #ccc;
font-size: 10px;
}
/* Markings;
*
*/
.noUi-marker {
position: absolute;
background: #CCC;
}
.noUi-marker-sub {
background: #AAA;
}
.noUi-marker-large {
background: #AAA;
}
/* Horizontal layout;
*
*/
.noUi-pips-horizontal {
padding: 10px 0;
height: 80px;
top: 100%;
left: 0;
width: 100%;
}
.noUi-value-horizontal {
transform: translate(-50%, 50%);
}
.noUi-rtl .noUi-value-horizontal {
transform: translate(50%, 50%);
}
.noUi-marker-horizontal.noUi-marker {
margin-left: -1px;
width: 2px;
height: 5px;
}
.noUi-marker-horizontal.noUi-marker-sub {
height: 10px;
}
.noUi-marker-horizontal.noUi-marker-large {
height: 15px;
}
/* Vertical layout;
*
*/
.noUi-pips-vertical {
padding: 0 10px;
height: 100%;
top: 0;
left: 100%;
}
.noUi-value-vertical {
-webkit-transform: translate(0, -50%);
transform: translate(0, -50%, 0);
padding-left: 25px;
}
.noUi-rtl .noUi-value-vertical {
-webkit-transform: translate(0, 50%);
transform: translate(0, 50%);
}
.noUi-marker-vertical.noUi-marker {
width: 5px;
height: 2px;
margin-top: -1px;
}
.noUi-marker-vertical.noUi-marker-sub {
width: 10px;
}
.noUi-marker-vertical.noUi-marker-large {
width: 15px;
}
.noUi-tooltip {
display: block;
position: absolute;
border: 1px solid #D9D9D9;
border-radius: 3px;
background: #fff;
color: #000;
padding: 5px;
text-align: center;
white-space: nowrap;
}
.noUi-horizontal .noUi-tooltip {
-webkit-transform: translate(-50%, 0);
transform: translate(-50%, 0);
left: 50%;
bottom: 120%;
}
.noUi-vertical .noUi-tooltip {
-webkit-transform: translate(0, -50%);
transform: translate(0, -50%);
top: 50%;
right: 120%;
}
// Custom styles
.noUi-target {
background: $noui-target-bg;
border-radius: $noui-target-border-radius;
border: 0;
box-shadow: $noui-target-box-shadow;
margin: 15px 0;
cursor: pointer;
}
.noUi-horizontal {
height: $noui-target-thickness;
}
.noUi-vertical {
width: $noui-target-thickness;
}
.noUi-connect {
background: theme-color("primary");
box-shadow: none;
}
.noUi-handle {
}
.noUi-horizontal .noUi-handle,
.noUi-vertical .noUi-handle {
top: -$noui-target-thickness;
width: $noui-handle-width;
height: $noui-handle-width;
border-radius: 100%;
box-shadow: none;
cursor: pointer;
background-color: $noui-handle-bg;
border: $noui-handle-border;
transition: box-shadow .15s, transform .15s;
}
.noUi-horizontal .noUi-handle.noUi-active,
.noUi-vertical .noUi-handle.noUi-active {
box-shadow: 0px 0px 0px 2px rgba($noui-handle-bg, 1);
}
.input-slider--cyan .noUi-connect {
background: $cyan;
}
/* Disabled state */
[disabled] .noUi-connect,
[disabled].noUi-connect {
background: $noui-slider-connect-disabled-bg;
}
[disabled] .noUi-handle,
[disabled].noUi-origin {
cursor: not-allowed;
}
/* Range slider value labels */
.range-slider-value {
font-size: $font-size-xs;
font-weight: 500;
background-color: rgba($dark, .7);
color: color-yiq($dark);
border-radius: 10px;
padding: .4em .8em .3em .85em;
}
.range-slider-wrapper .upper-info {
font-weight: 400;
margin-bottom: 5px;
}
.input-slider-value-output {
background: #333;
color: #fff;
padding: 4px 8px;
position: relative;
top: 12px;
font-size: 11px;
border-radius: 2px;
}
.input-slider-value-output:after {
bottom: 100%;
left: 10px;
border: solid transparent;
content: " ";
height: 0;
width: 0;
position: absolute;
pointer-events: none;
border-color: rgba(136, 183, 213, 0);
border-bottom-color: #333;
border-width: 4px;
margin-left: -4px;
}
.input-slider-value-output.left:after {
left: 10px;
right: auto;
}
.input-slider-value-output.right:after {
right: 10px;
left: auto;
}

View File

@ -1,35 +0,0 @@
//
// Custom scrollbar
//
.scrollbar-inner {
height: 100%;
&:not(:hover) .scroll-element {
opacity: 0;
}
.scroll-element {
transition: opacity 300ms;
margin-right: 2px;
.scroll-bar,
.scroll-element_track {
transition: background-color 300ms;
}
.scroll-element_track {
background-color: transparent;
}
}
.scroll-element.scroll-y {
width: 3px;
right: 0;
}
.scroll-element.scroll-x {
height: 3px;
bottom: 0;
}
}

View File

@ -1,6 +0,0 @@
//
// Alert
//
@import "../core/alerts/alert";
@import "../core/alerts/alert-dismissible";

View File

@ -1,6 +0,0 @@
//
// Avatar
//
@import "../core/avatars/avatar";
@import "../core/avatars/avatar-group";

View File

@ -1,7 +0,0 @@
//
// Badge
//
@import "../core/badges/badge";
@import "../core/badges/badge-circle";
@import "../core/badges/badge-dot";

View File

@ -1,7 +0,0 @@
//
// Button
//
@import "../core/buttons/button";
@import "../core/buttons/button-icon";
@import "../core/buttons/button-brand";

View File

@ -1,9 +0,0 @@
//
// Cards
//
@import "../core/cards/card";
@import "../core/cards/card-profile";
@import "../core/cards/card-blockquote";
@import "../core/cards/card-animations";
@import "../core/cards/card-stats";

View File

@ -1,5 +0,0 @@
//
// Chart
//
@import "../core/charts/chart";

Some files were not shown because too many files have changed in this diff Show More